diff --git a/bin/steps/python b/bin/steps/python index e04d66cd7a5ecbeec48dc5c3d20755c3e894f88e..ee4a8030493890861f6f67380035efed4afa336d 100755 --- a/bin/steps/python +++ b/bin/steps/python @@ -67,7 +67,7 @@ if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then rm -fr /app/.heroku/python/lib/python*/site-packages/pip-* rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-* - /app/.heroku/python/bin/python "$ROOT_DIR/vendor/get-pip.py" pip=="$PIP_UPDATE" + /app/.heroku/python/bin/python "$ROOT_DIR/vendor/pip-9.0.3/setup.py" install &> /dev/null /app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-39.0.1-py2.py3-none-any.whl" fi diff --git a/vendor/get-pip.py b/vendor/get-pip.py deleted file mode 100644 index 46a0f9c75ba9042f1239b9bb23f1621b4e3aa83b..0000000000000000000000000000000000000000 --- a/vendor/get-pip.py +++ /dev/null @@ -1,22373 +0,0 @@ -#!/usr/bin/env python -# -# Hi There! -# You may be wondering what this giant blob of binary data here is, you might -# even be worried that we're up to something nefarious (good for you for being -# paranoid!). This is a base85 encoding of a zip file, this zip file contains -# an entire copy of pip (version 9.0.2). -# -# Pip is a thing that installs packages, pip itself is a package that someone -# might want to install, especially if they're looking to run this get-pip.py -# script. Pip has a lot of code to deal with the security of installing -# packages, various edge cases on various platforms, and other such sort of -# "tribal knowledge" that has been encoded in its code base. Because of this -# we basically include an entire copy of pip inside this blob. We do this -# because the alternatives are attempt to implement a "minipip" that probably -# doesn't do things correctly and has weird edge cases, or compress pip itself -# down into a single file. -# -# If you're wondering how this is created, it is using an invoke task located -# in tasks/generate.py called "installer". It can be invoked by using -# ``invoke generate.installer``. - -import os.path -import pkgutil -import shutil -import sys -import struct -import tempfile - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -if PY3: - iterbytes = iter -else: - def iterbytes(buf): - return (ord(byte) for byte in buf) - -try: - from base64 import b85decode -except ImportError: - _b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~") - - def b85decode(b): - _b85dec = [None] * 256 - for i, c in enumerate(iterbytes(_b85alphabet)): - _b85dec[c] = i - - padding = (-len(b)) % 5 - b = b + b'~' * padding - out = [] - packI = struct.Struct('!I').pack - for i in range(0, len(b), 5): - chunk = b[i:i + 5] - acc = 0 - try: - for c in iterbytes(chunk): - acc = acc * 85 + _b85dec[c] - except TypeError: - for j, c in enumerate(iterbytes(chunk)): - if _b85dec[c] is None: - raise ValueError( - 'bad base85 character at position %d' % (i + j) - ) - raise - try: - out.append(packI(acc)) - except struct.error: - raise ValueError('base85 overflow in hunk starting at byte %d' - % i) - - result = b''.join(out) - if padding: - result = result[:-padding] - return result - - -def bootstrap(tmpdir=None): - # Import pip so we can use it to install pip and maybe setuptools too - import pip - from pip.commands.install import InstallCommand - from pip.req import InstallRequirement - - # Wrapper to provide default certificate with the lowest priority - class CertInstallCommand(InstallCommand): - def parse_args(self, args): - # If cert isn't specified in config or environment, we provide our - # own certificate through defaults. - # This allows user to specify custom cert anywhere one likes: - # config, environment variable or argv. - if not self.parser.get_default_values().cert: - self.parser.defaults["cert"] = cert_path # calculated below - return super(CertInstallCommand, self).parse_args(args) - - pip.commands_dict["install"] = CertInstallCommand - - implicit_pip = True - implicit_setuptools = True - implicit_wheel = True - - # Check if the user has requested us not to install setuptools - if "--no-setuptools" in sys.argv or os.environ.get("PIP_NO_SETUPTOOLS"): - args = [x for x in sys.argv[1:] if x != "--no-setuptools"] - implicit_setuptools = False - else: - args = sys.argv[1:] - - # Check if the user has requested us not to install wheel - if "--no-wheel" in args or os.environ.get("PIP_NO_WHEEL"): - args = [x for x in args if x != "--no-wheel"] - implicit_wheel = False - - # We only want to implicitly install setuptools and wheel if they don't - # already exist on the target platform. - if implicit_setuptools: - try: - import setuptools # noqa - implicit_setuptools = False - except ImportError: - pass - if implicit_wheel: - try: - import wheel # noqa - implicit_wheel = False - except ImportError: - pass - - # We want to support people passing things like 'pip<8' to get-pip.py which - # will let them install a specific version. However because of the dreaded - # DoubleRequirement error if any of the args look like they might be a - # specific for one of our packages, then we'll turn off the implicit - # install of them. - for arg in args: - try: - req = InstallRequirement.from_line(arg) - except: - continue - - if implicit_pip and req.name == "pip": - implicit_pip = False - elif implicit_setuptools and req.name == "setuptools": - implicit_setuptools = False - elif implicit_wheel and req.name == "wheel": - implicit_wheel = False - - # Add any implicit installations to the end of our args - if implicit_pip: - args += ["pip"] - if implicit_setuptools: - args += ["setuptools"] - if implicit_wheel: - args += ["wheel"] - - delete_tmpdir = False - try: - # Create a temporary directory to act as a working directory if we were - # not given one. - if tmpdir is None: - tmpdir = tempfile.mkdtemp() - delete_tmpdir = True - - # We need to extract the SSL certificates from requests so that they - # can be passed to --cert - cert_path = os.path.join(tmpdir, "cacert.pem") - with open(cert_path, "wb") as cert: - cert.write(pkgutil.get_data("pip._vendor.requests", "cacert.pem")) - - # Execute the included pip and use it to install the latest pip and - # setuptools from PyPI - sys.exit(pip.main(["install", "--upgrade"] + args)) - finally: - # Remove our temporary directory - if delete_tmpdir and tmpdir: - shutil.rmtree(tmpdir, ignore_errors=True) - - -def main(): - tmpdir = None - try: - # Create a temporary working directory - tmpdir = tempfile.mkdtemp() - - # Unpack the zipfile into the temporary directory - pip_zip = os.path.join(tmpdir, "pip.zip") - with open(pip_zip, "wb") as fp: - fp.write(b85decode(DATA.replace(b"\n", b""))) - - # Add the zipfile to sys.path so that we can import it - sys.path.insert(0, pip_zip) - - # Run the bootstrap - bootstrap(tmpdir=tmpdir) - finally: - # Clean up our temporary working directory - if tmpdir: - shutil.rmtree(tmpdir, ignore_errors=True) - - -DATA = b""" -P)h>@6aWAK2mnzTaZDN}?<h79005;f000jF003}la4%n9X>MtBUtcb8d7WB&Z{s!+|KFd2buN%}wbgj -<)yvgId%GzbAl(GXZhJu15M+zC*~pSgN>04J`|dY0e2B7?bXynQ$Ras29M1gaL7#l~MWf^wOHq8mi#@ -9j^|mZVYgz7ClB}D$kvvJ5*j1&hS-MnZ-qbwN-$x_!J}*~k&f9OBjVLzuYpL8*RadE0ZsKDq3z(=J9d -&SXB_EAW*sHVI-=}APpU(clmZ_A7Z!*3VX%UxlbIux>=VJL6Hj8I}Woef23^|ChNOPu|ipZ=>$yB*|P -!piGY-%RfOceX_0Vanc=CRot&!PzvAd<*)CX{M8ORapYE}5z`E+wueYCue=A^?r-Q<10390-BPzcgIc -iZ#WmEHa@*$q$BwvH}N66Jao`mSPFSc4gM&e8S-CX2T^h-3nzT0OIeq+{v?)JcZ?NE^ek@vYJ?iOTJ1 -Q#aX!qay3jg5|>R~HFd<&A_I}x&yA{Cm8YVBH${0sa`0S~atB&#RJy^PT(Ydh-94s7jpRyHuMs*`?7( -5;MG0Ia%Xr0$j2Ei|>ADit1gQZ5pn~gZb)J`xQ<4ZZSCD|7_!FS5MZ<HGTq&B-?!L;FFf-2;+i|U#Ey -z)qc&HqO<?t8yb6RK3ZH?l@`<05dLF2b%58{?GHfIs@rxhooQFhrIx1*ml|B<!RcrEgpOZzn(iw$g*k -0)%E)_haS!@RdRV(bJI@=J>5{1bO75yj7ZRg<{-*w`IkfwR4nX`!^UDaKO?<^vB^sgwXKLp{~o6xDwK -dXlfX1ZG?@v~$oKZ3Lbland&3b9N{jmV#n<p@4jbyy?BDCv00j@;w~lBL`w-0lchuS*g`*&T5q^t{Fe -_0Eo$^AWJL@wo6yncVu2TF&7267ErqeJ>1=0q0QB0$;#YtE;87~yQ{nXEPger<>7q9;A8z?<s*F{?2_ -JGNLflfrAn0=@mz7UV$DK;ix_OVhJ)X+`J9cjR6dGgjMC5~`vJP~_07dw5GeWa;`Z+H`fc*|{SW`XxM -g3lv!~hF*%|!5j?VG0tmL!!ES@<sPE`AO)}oA8yFJmd*7jH(4YSYC+vtQ{-_b+VWkp+e>zoSQ?z$XeZ -CZ&a>M}7xh0&;WfxgLK7ODmxP4T6X<aN2*ff~)X8&T0yOQfkq?$&QOvLhNiOERHQ0S&R3&|oFY%`<BO -KqO!nPM$Danh2F}Ku<)~b`5y3<A$cY;}Ui)(j2g(S%MKOBCt$9rm1v3=aw(QfGPG!OXYQ0ti|S<6mdf -%6ZXE!K#*edhOg5muhsWFuf9WQtikPDVk@ni&h}LU@1)>n!%FNRF37}AeSWe14r*J~zXzw_(CFZAb=a -|Bg*XHD0?@SMg${u0JbmC_qW=L{Zquqd;G}ox-)r#%;E}QlNaX@HPy+^Rd108KkMBhaset|tslXKR=# -e9)5SBxjOLL)g$l@rwi)LfH8@Jb8rX#c(BQQvmUx_^uLI45D0Pz$Y9bwR8DIXYEPQ?)g35fuJl&BlBm -e{5Wq*X_G)IPHL@fdBJGh;5e69C`LqMYJ&Q^nQ6p;=b0C`zy4<tRzaGEf3w%|8JiUX4NBnC^gC&28Qj -!}(v)yD&+LbO-rUgp9uznGR3G2d4qW9QW@DIm6_D<tXE8mNs<>CRXLV=Aprr@px?9n|7*|!^|vvM594 -TcbF%bVdFhvyFx`ojWP>JLBI{2ZFgqHBbs+nphvUi0fJZ~S2}!9<f91Fa#vf3^h~X!s3@~Z)po)@sx8 -K~wNP6iXm&w=PuLquR_rb@G&CqGqzL$)xWOSKoy6ayfUM2NlHlg@Ci(XLyX)lj^$#~!7w;|tGDF<IiX -k%=vMgHI1-NZwL0?y3rWu-AJMTU~BFRtJw{Px(MXah^)M0c#J72UbU;zMh*jw}(R|N~L+D_1cGnVMlb -Hnmp)0wiFCTjyHq#sXS-0Ut50(}_%Va?e+xCk9O{6#!PC?k*SAX^w|My+?<FU$$F<oa^AW8@9E?2(u~ -A_t>BI0E|W$+fsY`^}B@X}<-V8kvNF3>MS{=`z$TXv~Rz8Ad(1?XIjr98qpr!Xf}mz&uKd&RGD~S_M8 -OOihcjLvWZV<}7;oQ9y^hhChML%%W%60_2*yi?GqeUJ9U!wA&QsE%Q(21wq_`fLt1_-`GtIuc3Z<6!k -U?romBm(lU1jVL$l_)o+ME3E(tuKPV`QY;EnCBqF4ZCYYhl-^qp_NnkdGOX3H9@Wstny7aMQ)~SsPfl -KyDbv6}aP%5&}66nf*f_$+KqIig>t`ER1pRhF^!7^PvU`XphZC8`)c41#EUso?o!%rm<TX1sJ8~2TCz ->o02{EX!O$W#{I30ffd91cE&FBtg}_?zI-6`K%BYJ6Lya-;f!*ge6NuII<vNn=euK}%0yv%}}KCKl*K -?6bM+FvNH7Z*Fcc?(UNBFRpGDBhQU=K*hQk)Wr9qY!rA9IoDda7J|~@*p>G^Z^pH_SAxMOgYm&Uhyb- -{TTdM`Yq5IKQy*&YX~Omqtuv1<@DesYS-W*?7Xw=|^C7}oz!wD+|AP!497B9MV)x*?kf9Z|9L=erCAa -IkmWWmWisLz(n+X=pTd}ogF;H6T8jxCU#cE5v6hU6KQO7=F=*<RPw`B`9352_46nTZ4qAjvpP65h7O| -0`C6F;n6x;)0zxZqH5D~OOjqCNwan6nHH^<dQ6lJM=GR4tg3#*S@d*;H!LBVf_0??KTJv#`_*YIBY{a -+HKHwFeLQ@iT_cNzP+$Z-qrtgYN1nOnkc2>Vped5dU0?BD{ZU9n6;s{bbN^Bfa?!@=<a;lo{A=1Aa>$ -9zjdLIza+zkOdI*KNP1})3UD&_pjN#F_c9xY3HX|mf$uMJqRnmOTpm08Eac!!q|)DC!lG&3XvGa*yQC -h&3%q26^z)T+phZGQBKsae#1Zi*=;)VCdUv)5CO5D0QC<PV^A?A=$E0f5U8<|>R|)nLh3ZQO6x5wlPG -2Q-1l^;@GsOzn21A-6m_`T5)IrK3&>Lg$nZDRJ!*K20(Qzmw|B2VoA^Ra=;Y1V{rO)OM(z{pYGU!R;R -TnFTKOOk?<~Hz1!TN~N;>hKF!Tlu89gvDJL&8S?V+>Ua*6!&i3xw^3{xG#q>`j0e{uH09*Xi&*_~)hw -xOG{L#in;XW+V&ve|}><}R-XPDgn@&GXhFE(O7YeGY$4r?38@K>4J5F=0O&zlSG^c*oQi9b4+q1TQi! -?Y%de&=r<hXWW&(pteHFD9*bkJ(%Vj^}H=>$eGPl%$XH?!K^1%<B}`zLtUZ@WmTQh6#?A}VAR(wXWa* -(c!h;sIb>H}kGfxf;Q!c+1>?q(!?+ZiS%3jh1f`fWo|{+1=p2q?I<3WyLpC%2TQFgPP2u5jI>jm&pDy -2CzAMXI1-4wXf+aR~cL)Kch0i9T7ztB8h4>NWNlO8{G1>~~kJhzL4Gp*H)Htav!j6bpANJ}$aBNj)Aa -(pGMa{!5dPL7p1Q^Oi!4<E%lPEwqi4c1J`(OG)-Z%YP2O|P?<0l{|CTHzFF^O~EFdcMd9vyPdi*`7|! -I_r|SQQ;}8J3T_R;>*oz-k}gxq{f2WMl<)<F*{~Q~p+%O@mi4^TCd0XlZzP!cJ`nDw+bp$&qE_Q#D4s -uuIy+1rHgSbaNq~V>6jxmmZe-7GuZpa>CN0Wgc&t3edgZwuX#hYI6pl7`3nu4vd;3XT?+ji-E2xofc` -1*5bYG-<a32<hyduj}>8%%f6ks`8Mg;^3_8kRG9-@Wj>VIcfgO*1b1BH>C}#m@wmwOTOGE`Fk*D1uw# -Zdf+KO9W1l2)S1B5{6m?Hp!e;MicJR2T29{Bw&L0{8v$BzX58qwtns&3oGNj%@u-j~zZj~w%Ufi1408 -3)lCVHMV^KJ`sG|(CAsoG*q8!Y@zlD*BKE4HUq4^Ft01|`N9x3|}~=Me73U~(|GhbZmb7ZGLFh9b`Kr -W#|WzBb1^x}uvr$?@i}%rKiK1Bh%J+^oeqz}}z4c500JNiq)KcwaY$hvKz<3eAhF*U7h6SAgF^M>S@& -RZpijvP2*T7FfQem|sI#w34aXq8*uG?1f-EN#6~8<e4W9o-E`6%VrafFR__T(T@0?DqUa!AIe@dwef` -U$j@AQEeZ!Kp*8pUk&{`wFgd1mQPXcAuW(c72Ib_Be{ePX2~0va^*R5@sn-ntzsgg<)9+;Ykr%hR!o^ -FPuw3Ge9k`?Mj5S`kfcBCkR6Ji#n6_>xia{6VYHUK{!)i4TBQJp9g4kfciwAB1NWgpexBJ=>g)w*a)| -p^=8QtTf7B<0#gycjNXH~G%PzF;Oe#kzL{$#8x$uKn=m=?Y|`;fK&(E?iW4e4sf0h}|Z6)XX$GZ?ONr -Ed!--Y*amynR+t*Z57YY0D1$r2}?Qdvypk`0RqHbzyJkUUzfoUJ@S7<)2(7vOQiu*d1SR>LwlK1^7D! -T#da#Zn|xu6Q~;?z4Ic-_s4oS)!O2Jv2naBT&R`k_;lIW&im2za1S_-+}q%I*c->sSd$=62U*PzY(O; -TiADJM<Lf&_(3)f2H(}#pa@b&{U&WXnYg0Jw=wb;0<Z0Dg-0w(gCD9Fn{~C@BM|$D$_iQ?NT{gLHs%H -?!<PIVQP_0TO>QWwBONCkkYOD4@K0$12p*Ce27U1NBefAmqL@|O-))u)<syZgspX=GH&TQO3@7D~^PW -?SRv7M_l(8cuJ83kbB_&YU7#A#3`;pBw$9WrH1+acQCkLPnRANY4ZUQF1B-o}E9Cs={W*NoOuI*H`Kd -|}bQoFu36U%GpbkC?yqX=!0JtaZ23Hbb0zv&HcYsC?_y76BTP0|Uzt_fxsrhP`?SKbbC<y+sD4Ut9&= -&@#jJf}_&+47D#ToB@j?fC~c{4*Ir&*Hi7f;R_C&;DNh0Ka7Zn9UOKB+CAdl^P@*WWq9VG@aSB=e8W5 -V6wts=VD9tJG3P?kYk_9EFIvc0Q|c5@elUE^@<|9m+yEuMyZp}&7r@RTh2!}C_6nWiSU0SX7LK0&B>_ -NZ1;>+a`1$bM0mSG5!ynj;ja(QWFl1S1!PX7vPOT4}m~*Pm!84zw=VwhX3y&Y)Plh+5Y3|W8?8I1i1! -uz~pVvuCD){wO{SWb_^~>KN`a&wvl1A7KPSrQ3>V$7LbJPBNRu<p>pLa5l`1wHuBw(e}py8`b{IqXvQ -lBfG%T=<Z-@(0@JKJm%%%m2pqja;&zSX?Ru8E7A(+XlCwFOd0bgKj8xABMUPl3+n+v#G>28_hZ;P21% -G1ApW=-tDa9aEO?RSv3_rf~3N)<<Y-0H1lM0O$%~&V9;Fzt>-Bn72J#>^X;>Vj;qYF-Q|4FfH&K&W8F -*pqTonQPdnubk{a9zk_g9GZki#i~k=`O9KQH0000808trnOiM|mWitT)07wD=01p5F0B~t=FJE76VQF -q(UoLQYU6D^u!!QiR@BI{(c4&u2#~En{j$9G<D748MktQK_Rrc+%vy=^T%Afb1?O$w;Gbm*jTC!0J+? ---2&>tB6LPlNBO;hh9ZachS)9m2Y!fHTg19=I-g)>-5)UZy*_yg#11e(nC2o%NFCruN3-zSHly^kvv& -4T)DAYEvR0g_9P5B)m%Bk#ZkBv#&T8)v!gq=!%TaNnmBwC!^Pymm5=^JN<Rn{!lZ)-EX3r%TmZmyuv} -Iq2EIAVrX}O9;_Idv9nDfM$qcya`0Xv2D$IGq`vX2r{8mm$6DPhuttZLgQ^Uy%a*4?%@DN!8+)$eF#@ -6`to|>e<-@X_TBwIZv^)H;@Wb1=4di?Plpn;|NU2C%)Ny8rJE~SiK$#S29>XbnQuoOn|gWaxXKSuO9K -QH0000808trnOoAAT^+OE+0ER9A01^NI0B~t=FJfVHWn*t`ZDDR?E^v9x8f%Z+HuC%a3PMF-Ip-)%it -C33j9#*j)@ZuB*hkyLVnNUnZL5(bm6W{eEAroOh7XCNByW1?;|wG#Q8UBgyoY2E1n-&T<fPbcS)PzMV -^YotJ_??(io@TcuF{;#APA0DqSz8jS9MhjPAN&ZWg#lUma@p|ic|f5bY#Y}V!clDwS6t5eUkg;u_&vO -3CZpIBNI8`$Rj;jnU;2zc$)xlTI90%6s38>pDe%?i$Ah8KgU7Q!em9v6q<z-b&gZe8sX?J6;;hLp6^< -eq<GA;f+Y>*w7lU`0+AMmKgGQ4&<)?S#0YXm7P+igmZ_P~geb&}+`+8=;1N0SGsFz~mEgOysO9@Q&63 -kpsNrcVrzkGAC96nR_%uo5>ZHh5>AHnng3guHg@x7-muf**>I?8&CctUFKIJP`XO;YpXXSYzwydgL`3 -nB4rD7I+&3~;^!M8lGW<<?HMLXoE51^}B(zr-?D@7%eo4b>fvzwb4IlI2Tyarw_zQ4Hq>4KWq9~alRc -ke!&UHnKdE^q1i<=w@pmgUv;*^i6MyBqrcZt>xio-VEp&e61;7c4q!CQNuKxHgd)S@VjPqFB#Jjw{X5 -|8NRI-FUc>k#4*21XczE1M<-b;6;h@CxZcB=#C4tDH?Bh{PF1Mh*A(9xYeB8PmJy-4=|3CfvV<Krx9@ -ZL5+o!=4=bD2zGF!oYxvnSS)|xaWy?wQb8cVzbJC9-fIbt;tp)m1Xche=PZ+Y2qvSl5}a)%jE4b#s*Y -d32G<3(C9s@eM!I8MhyeIN+=Q<nPNaESQ5s5~t!5;J7=Z$qs~HSm_|t|+KR&`Nzjgd!qS%}q6QmHSm# -)K1P*w1K@<Ngqazb8^&?+#T&NLb>ed?jDtd;=xpp}O{CQA~!0SKx?5#X!kcu+W}WgDNp&tUDbNG$;cM -QKvRlzM<xW&mX$TZm6b&7&e=9C|+B%i+tHjg+S?+85SXB$1n<&JqI4BPPg_svy-SmFAtSArX`fDh#Rt -YAg#ipl4KSXjUG@tV}EAN8z-~FT`_{A{v)X0+A;1Em97hMa{bNb(ZiBSgtl4JU8cpWtRO00><q$Z3c< -9>?1ciq>6CZk-P(G=xV60eq0Wl57Qy7L})ji=`35W!z?kfQ>inJaT~+N4DxX$QZDD{vNKYpTMj;`-W* ->txUkkXWqB)O5N+mRFYk22U0BEn|3<$QX&zcpC|pP=ppRfvRb?=p_UNQ5(gP<PT%?UPjikELv<ozUky -7(0fxk*o(6sCn2B1p_vMi6WK-m<sl5-1NiCTgK=}}i-jxl`)&X92u10+Q6n7vxoI3S6N=4fU$XtP0Z7 -t2L;>{*8re*{rJUG24%H=qNP-rRhE`YVMzLJ%TdrI3{P;9Lrdj!%hS+zDIwfq9K7$)TCdH&O@-Haww) -o0Gm}*>6C$c^uQH0qB~^kb+c*105#>g8dViz!3NNX+O-c!Rn<P{At@h?vm+OY6?sqhWq65e##-EY@wD -$9v@*5EJyCQWz|>~fy_i$4X;p5=$Zs&55n?YJVK~Qqhld5R}!_X<OL+(vUb!Bo>Gh4Vz)s@muF0@r3p -Cr=tPt+$cn{Pfs#heA%7Kzx^0<eX|?Z@Z$q9#S<!6g+_E$uo~?;?I1X!S>GcSCx`y(Sd&cR1CG$CXbK -KKo#&<k}xq_eGU0*CNz73uw^7a4`Rcv-ipoJg6IJsWjE>7NkXpwm4%nIRSS@;AR<kPeFci+00qmYY>^ -UJ_B$6K&DQ53pU0Mj!i02Ds)Mj2!PUItYM4-Ao)bq=9Wz69HK$jFk%5UapGf>*DARDgwp<j_GTd|9uN -x~e4@S*00|T8n|HspU@n9a1Y`ch}QFv&(NF`b|&R_3yyc+~Brvx~>`|sbtHHQ~s1nbSbLkf*w9l;{~v -qN`D=QAkZ9Ub;7CbW(T1ZWH^OyL9elheqc`@aFyq3nqat543r>%fW<N<+=u?;#U+0+w%{FEPpbNxXI9 -Z~f=0O3v*Eg5gj=vEsOzV4V2RH#y-~SfjAd)QqdYgV!@nb(s+MY4K_^942&k8m8`UG}#5AfX-ADzd+I -L#3`!65Hq|_MLeczr&k*w&EX`{7g1?$R-a@<xpV6awfO}PB~MEB;8mjWhXbo|d)zm7e>fA#M<a&}!*s -_g{-=FbQK<0iH}PN@O3ur3H*Cw%uhud{3nH{luE1LCcy`5!4P-xo0~5Bs5&R~xv8N~zYBGl;&Sw*64| -I`<<YHV!_ffv!D|KsEaIl1|&Q^bsGX(}Ti*N>8T}!t%Wh&1A`CirZYqZHP{$SO;#{juT}~ULMrMECH| -qpqWINxTPu=$+D<6YLAKTAmL)^nCoVE$plxMKGGwm>bDKno`C+i;Q%HJsJWpit#jM#6tw^~ECs{fD(W -h_O^TRf`_+Db1b_Wa5c?bUGCh^CoMDm;*kIY_|3JICXh?Gir>Yj3*<$VCAf_?|zs~Z1)8WMpM3{cZj4 -DyPD2g>lo5&#)B^9UwA8`v6DsPF;wa8%fE01-Di%;Du8F%RHZeyCSiu>cY4_L{DZ)fD|X}7|%IVQq~z -U+gmeYJtM<Zbk|?&H8fb5%dqCGKoOA-LQt8#910G!M`-ur2W2r&eYhO|dT5f+d{n(e^ZAMBWj7(m)LB -q*$o~fyXq<hG-?CC@mXGtSzep{_pJjMjG(#*Qf2+Pg)G)t?2FL>E$u0#2%~LHCIg>tfYj%kM4?R2<^5 -(tT)=eaqzXUQ<xa~D#0Z%jd(z;kP**!sQ}jDZBt~4rX3A-KDO8EYO$qpKe<|5(ThvExVXBzojl-f-J8 -iEDOLJP3Jo8;9;SEp^Wx_AhQ2$wU0hyhqGZzDF6vMl?%K?;02=)6*b7yQ74!`F0nN++CPeL(BZ;(94K -!2&S+<Ah3JQnt<@avb6px+vgwuhpOog{77Af}M*>LEYoTyF-X|Et*LewR=$er5XZ|RfJay^YEpAiVqN -kL{+ICQ$<$PY};+tg6UD7IaO<%XR;dg=-GeDU)SXU7EOX3etM|21tqEC?Afggtc3F_1ZO)BtEEQ8_x5 ->TD~Ix!v5!IZrssX1|31;OnJ@5A`HKBCiG%VmB7Loan>1;Uh7^B!2hWU{9}5LWTh3ZD1NG)wqU}Gkd~ -EFl1tpgkCY3A$1i+=U7!aigEZIJBIRC5Ps%4A!*MRr~elV99)fiVEI{GP86AAJiJk}{-xZ0&-crMiDZ -#OttslVdWP4_k_){h7o*{3nND?BLQeil#-9_Zo$fQI=p3y!01((Pu=+vy#D?ETJ`q@is+0u@4iBef<! -5TPV`+wEtMC7zyIW~@UV3MuD%QB0pY9J*F0?J8jdg*_gb9Cw3P~R_4#X2oxaP>Md)zWw+gbXf0QTVG% -W)8UT(gDr_|KWY-91$<Z5ZjZjK7{}LIXbSZSk6;^X5R<IgPhx!#0u}Yvg}nbWP(ehgw8uP_;8$lr?JA -J-Y{KRiXE;lZ<mxwNe)_4qt6hKeL3HZVxc2@QkWcBS&#~@5Da;z=Yhe43FoaL4lq{Z4*P{!0kncEudU -QgA}kTwEZ*|+|3aQ{8tGEq-0kCh@fsb<O4SuhK<J3AC^Enlk!O`uDOw#<!FA;?2P2*jRYOp&4=Y^f1d -W#$)q!e+I4KoSw70z+lzgMRB!J7{g4PNWQw{RmL-sz={CH*Kwx!d2k5p)Mua^gmS>8w;q^CVZIV_PuK -p}xSo-4v8T^pw`wMgzw@04N*f7%HBvYuwQ8o~*DLPB%+KGl3_EOjP{$w|O#w&Xs_<KY(;FUu%!SL|Ex -vvFQP1LJb=KHG+lh8&&gD)Xms`!a+?UIyADl=%;v&^C5*ys(%`+n*W*C|ANu54dtW}NpLKK-H76JkZ6 -4)}0qv*&C$*b|Z`NOR5OH+%mE|9tW*4@(&}i-G5(>}z8y@jx}4{JW^hwuZ81o$esnR0KCGpl$)lx!DH -NPrtu2zsZYGU0IPN+_L>r?QoDSXMl!#J*4@3h=O8sDuZvP6Y^pVPVL8`2xdgV&wCAdyX2|Y7YrX!{!T -HBuK)zpia~O&myY+Sn(+XaM)Zvs7uS@xW>YEzmijklN`3K@YG?H?&K&g6_E$pO!|L2zuqoA!kgd7QwV -P*1uw`nn(`}h4p{QElzop|ABqxGHyag{bi!gzQu(A|IDN_7sZ(_N^Hl6!$m7}U)T8j+b;l7FOcJzV#! -`bqIVuZE`qdQChFxYsQCTFqE3!!dAA|xb7-P28G#s=FNJk#s)`p_$9JGXkfk-W9%dEdlmetv+yi$d{L -i6U#kJH!4pBFoskee8mCt`t3Y(MVZHmKBfcmS-ur;A-!)MTD^~IG8{T)=Lv!ay*!c_ug{H0Q`Gu2Xa+ -o_x7Rtxp4r`A-r{g<-<QufL$l(zPcB%{tHk`0|XQR000O8Q5kVetE>JyrVIc8;V1wA5dZ)HaA|NaVqt -S-aA9(DWpXZXd7WBqZ``;M{_bBvtPw~`*XkvQelhAp)4bdnC@#UF=@-WpxDt1lwIm88wd=j2|GhJOkw -{5vJ7)yWt~4CZ4Cm#Up;xQb->G6mbefBnbW|!PiDJ6%R;$&;R*Hrc#kSYIWJN)E(+Q~w-6&D_nicl@# -f5vWPRf4-hKAYjeRv~>XPQ0gqokePrs7KXn%64F-+n8lr4}0@>I+NN@h&e8tgVF16@LuKc)Kg~sbgx9 -FmJ?xDNkOCcFT8G+mXB$B}Fp~Wa$NgpPKDxc`EFhV#{l`b_|LQ*si4wJdl0cq6B?gF<BhA)IF_PdsrJ -5ii5EN2I?Xkw>3%+rtP|lOSL9DrVGtv!&_PxivP|oE-ngS$fanDPO>e3EF>d0V9&f1O$S_4x%&5)+b_ -jxjSp`#SW(tgDe^@!txvzOy89$#LpAVC{Q>2-AaSc%6}`@`jojb^??{KMIg@_|xfMAuxe?$odmtxUPm -iC5Gtbd=%=(IL!F_nkby1{>)!Q|BP2~>Md;R+1h@ad>_;YD_b^@%0&e-%ylMN%Z=DU_v<jD1Y;Fg=6U -`Lf#OqG%w2OfA?=66X$9}DDKc&^DknC!<NW`x{W0hpJPHSo#My_u06d8PN}-RykQ?Cytqaz)+_i=H-d -{)}Np3tB4|Hbx8U>dLLM4+AU0VfC^l_%<(=SK6;@l90c?Qa>f|0saO1omm!cxF*ek%59@>1}1nGth+J -1Msd&;{O8}SXcVHSY3LPDQ%S)rq=wKZV(YVz+mO(<A`R0Nc2fDpz~&m4HIDe25Xe<E!{w>kyVSELwP< -(vDO(ek@2*LjTy0Ubt1GJ<=sV%(6uS0XI<q@z;9%K-*1eIJDo;&bdGZDEKtT}CsVU^5O^^({>F$2ik9 -$Mpg;5C4L5&vmt8z#cklxZcE%;%!#0_ooLS_T$lo#YQBvKjqiM(0h!&^wHI(_5)AzRW*(+8#sG$%w&% -)}f2#?$%-HoxE#h<6RS`UpuZJFCd-eEf<)AQvi0lK)3=r`9a$_Ka3={?7Z|w?Jsn$~`1EHzfINWK>D4 -)v(iaZ@=_UB)R_9CbQjpMR&~YZ9bm~t&gpO3QhE$!EdgJXzLUFVx(oqn#2DarjLxZmWhchpe0)<HQEa -isx&Za1qt$NzPNd#KzEXSYri7%Yw}8gDqwk&gIr=oAyn!sKAa&wO|436vI2(L)Hc9&W{*G?XO-YdR7+ -|`51?RQ*I2Bz6g2?^AVYeh1=u50J9rr%Af7T+khi7T)>a=0`J|z|O(s5!KQ-O38m;mkb6s1hBqCw8Vo -xmkFv=0HyCh09j8vi=vg981#7e?x?T;Jkh@)#09We;izln~vMuuGq$CzX<+H;GgZ`jfJl<H{thc=gX^ -XbOcP1fj+Ex3jCr6*WE?{T5KO#N=oFL|XPEWJOc=6qt8TMF|fKr%n@F(*u&oB@~<KI7OgFLG^5I`?Y( -d~tXC>ieXO>}!QYE3e&)KveJzONJHBzJ*L@@)6=i^MSW!b*{RaYwLaY(@e1X)~;-h9ypHR_G?!GYHxQ -R*p~LSRx!+7fW9NPeGdo|K==Zb?Uj-2y@BjDr++aa?{LUJ_mCUmUyqxEewa)vCjjJHV8IA`>>wsEyTj -XN4LBA`kk7OD2u}*C_7S+iK}yL=4OtrvvUm6zff208y};ukSmuS>^Bfq2!w=Gx&F7l@3WXs)<$x$JtW -KV_3KL%LAI_5XGg$X2afg$%#}Qh4>{7y~pkUyPh&Mb`-AU1Rjyta&pXxTinzv>xBramP|BR~%Kt4)#9 -9qYr70JVDXZG;9hE`R)_cDqfY#h?6yc1!{TOe>~%BW%<&C!c_Y@hzElcEFq(_kIP4c({!_cNA>ZSXTg -bv*zF8n;GaIG1(r{8!j`Z~)y&7g|M{AP-eQo_E({EMr)4WHQ%tnsOBQi$)a3LuPZ`fpT=7S*WISf0~7 -UJoh;6dAT2AnnNg$F?}NCo|O+SoDCb>(D%{|4T$OMO%-%qI<}EeAOU-Fx`B5?{Bk8~(?{HpPZTolALx -~h4ekEGB^+nuztN+$g|ouM!EjswODsp@feAiJCS-w(0qM#=UahU@lU3FR&JVCd4rd-|Hp@%q`9dnP%W -?_8G#v@Y^>E-Axr0LUmOIMXFYdHwB2NP5(xGP5()u7+2wX#BIe<oEFK|o&L9}7krz#UQvO?#=@r8FC% -gn-W%MLvpnKAS*Ea#F}kV%m{T3k9Zj2{h7Mr9Q+3J;uYsoICoBTxw2DhMv?pLjrNf&-)XpMU*y`*ZQ> -_8%XU*}=kDMH~!^iXB?OAB$Ka>}4-8oubWfQbvx<B1hVu%t-9&$SW3y(U>lrE1_M|+59XEw}6~?)uZN -dK(>%XLM^cLMZP_Q_@SN{$e?IP^&YYj2%*y8^#bBIa{2Z%Bz*z!zZ?Js+R6?boixM_9FN9MilZlSjmQ -BfW5hJI3+y_{h2$DNlUh6h$jPuGe#)6Yt-*Zi8Q6STZrtJ}Lht!*|3ayqDUjVW^3LAkk3T?z9TzF^$I -V=G^dYY>JV;j^?^fCR?7Ha?c#$xhJ&k<VG*N*1#)<K)tYD7NvTr(*8L%^t(EYi|^K`NTfaXxla={bkQ -73q92F-KLo>V=X#?>T_rjk4tOf&i!5U?}#A&r|#y$Ckf<bj>mP?PImQ!P)6iOkKLEH^u?8di@j(__gx -JuN){Lh6rF0_LF#Y2ppQ(V-Vzy@LkK(1^0^0smK|>dmk*aseEutf2h_F0p0tfWV|W{V^QgF2VQp0Ayn -H_cdr=EaV*kk11D1X+_Lc1=0l3ZJ^F*LU`%R3i%-LEo5%3!Oc|1N*ql<NLMu~hd{7|@=dYR!3!Heo?! -tuH!vyYeU(KR6SED7xDzHh*FroPUbwdj3!+3XOT%ws!AUIy*Z=ST0=94RNV5pCD(K2E4nf#7+0|l0Yp -9U}@|gIp11|Oq7DCD_!>*|2zq10o$+cGj@NgTZ?*A-16I++$ZGH}Fen;7hC4N#sfBS^<_%zExQQm<AH -$Ae);eJ=MNAF1pS9FlP4L9dkH)GhCfN^`xn@nU};QZZSOPyv@pMZzf51jiru!U`l-77j%AH{g6PJaLx -jhd#+OTu@pY2}*^s?vm0U|)DM&tW*5;cd_2vMHij6`IvP!PGJxf8E;My;8UnBxHqS6f-4&y6Zqc`Izr -=AZV|wi^7XuPjvxkX5Zc;s>EuCkq-dvNLxKjBp~TRJ;D!wWAO_w(WfTNN;lTbr{-|_foStF!+EQWcLO -vCH)zo$E1>o<yt=X9wunygYbp9xFO6QEoA`_4G)mX_!|K^~IJ&phCOO9te!C&nyrf%-JKMWN#V0O1nQ -^}ZY6na1Um{fr$FQO0!-8BxRNxrGU)|vC$Xq~piT8NpwTg2*ce!^~C0_zXd%!V^ErM>{q!9X_OY+H-3 -;MtctH+E4yRLw_)37j)!9EMp*iLO>je7yBf{Y$$9TE?R5h`GF`9f0|pUo0#_xb3VLq{V;YkhvZ3y$pG -df3G@Pob*}=X|})2FTov^msvGbCnSxJCl1cKBqv+^BnQSLNQnqlPzN?5nS$?N?LJq_Ees1G9LI;C=<5 -NJLqA}pA-b;|F~zSl4CA6WJkP*G7w_RZ8sg1ys_Y+0}RPL?jb`25eN}MfN4=M`o-49v$(<Exnx~UOO_ -^uxlm4Ka2NA55<=yZTA}u7a&@(osw`7@`AXph1Ac}0F_(9UyulFu9y=~OqaOb7(RU_iIT9@nI7Xa-Cp -y70!(`CI9~=(GpenShpXaz@x~FPjzW|cLKT(Lvuc4i);l~MH{0N222b$Io5r6Jj%gn{QbwDg<Gq~iCf -^Bn%`Qw>Dt*KiCvy(-<0A`r~iB7H<mF3>l_qhk0IIAm?E-mXf>1t&o*k4|U*~Ht!g{;lZOBVTThe>8~ -DM$l(*^W5fD077Tbc=H)-r|5sbL!4L!uavLv=d744R-pot|KFr@b@Cnl0p&?@*$u2%m7V0DFC;ti7rz -x_PMUscvM%|V?6+B{|ni$Jw0%M{rQrIJ%cWXC4&WAHebF1@!!B_yA$AF6RN$8p{0jE{x5LwguwG0$eV -eL2gx^s3}z~Kww8m@xUwe%8OW_!M}Pjd;AG!l{m+%Cg_d|Irf$vot08v^lLIifS=a@;Ow_2|bkJ?uW& -gJj(DW)@!HP*;GoA3;HCf?xE%wXE=;HrSO9KQH0000808trnOiP(EA$}4709rr*01*HH0B~t=FJo<FZ -*X*JZ*FrgaCyx;Yj5K?lHdI+2n7w<d$xLJ7k!5dHiye5neO0bx`QM$H@M!0K+CkvjVx(JDQVwg|NGU0 -lt|gJ)7`U&4KULdAH`x-v0f}jQ8Y4ZS*wL8t45cF5wci_Rb94~8IA7ON>sHjGF|0LtW~XqHliuTLM?T -nx;bT$si~N^jrd(rHop_PFpVr4EgL18wc3nUc{!JPzD>jjm{u!k%0kSQE>_Sln-0*EZq`C(_;D7?s#3 -)w7MU#Izq;NEfZC|hTs2Qh6{3>0Q6>?UuIz8IQiZBz-ob00bOtyVjj9V=e@fdk>$1%kMcj-kX%Kq`oQ -V4pkP;cp)TU8I1H<#&Lk>QcWuBK$fHe?ep^RP?$!HV-8JBgr5ox+?o3>VID)go*>qf}ADf6~bDSwZ6+ -_EjQrYv*gh5`OSuAF;eLE4Y&{6Gl2MW#%}-Oo2Sw^w&}>AR~RZ>F|yWJf;9x&WdYy9`h!(Zxc2c96y+ -0e?S~^+q-qWzp1SJ{8MNlV(kxu7NhWN;j|rnWyS=mbVMlcNb+k*M+RNQv%{Ow??H;Yo+o@zwD-5sD67 -l+nejYFE2C6B(>c?-(B6N7v~r6uF}iv+o>>hmR2>$*ynyy+vwaRYiZW1n|F7A`{DiD^xgU0yQ{m=Xar -&@Hu6EG%(9f^c)Vi55lQRGDPfNs!+&oTu&V&6@QEzS`CnAl&;Xh&#B3%&RN4(3l!k<4p|gg?H7?{v#U -xm<6_r>#sI8&-yeiEvddA*RYk-N5vN-e688eJ2<MNT$`!r!Ll(n4+Qtk#gEI#pGhtLzbSXc^;?LQNSR -x>sH!IrAE0x^EHY<4_naj-CqrL0~G&;jnyB%N&ZxMVDNut_&)NdlSLj&9&S5gXe<6N^~3R@p;J3MbFg -d8_k9%G$=^HML{x=h^$RP`wmfY9r^M+z7Zq>?>8z3=pD9sx9apPXU0Q6wm_)9w(myTja)do(fc!%r)k -2uY^j`Rtr=x{=5Jwp6yMb-l-#|X{##NAbYT5+2#!n8L-wQfi&r5xB%*H+_=Yupu6J*?+q!tQVmMlxR~ -^ltbjn5Y?^u;z?h0+N^7tz;ar6KF=D3JQPEUH%pbqS@y|7Va+{FFcD#{rh8dYDgPlyiO`5FWcB15lIQ -5y}k8#(Ge=!RRS}YU^kVjE2ozyH^g-ioe=Q?IH+V#xQHx7Zlh5<~4ZUi=2GPt%Ro}y*S9&+`l^0VKg% -%AjsqmxczPJ;H)TIE#=6tPx?cfzvC$~&H|0d_o_;mCMud2X7s*lTch*lWU{XYt({EFk_&Vn9iQW&q({ -q^R-_EgHcF?byg$G711h!P=2&O0cF)-KuU1oq)3+WNws)RL`yGwk^mf(4^NLbb-*}M6HUlMlP!2QP*X -$0W&WiWvx*Qu=msA;f;EDASO$_YHPAt33p7UBiMSa{@QB54<Mn<1dxaJe<BdGvdFh6*}!WJ^pc{V3@( -(^xjpoWWz@_rGV8}N>$-Mo@mSbl)ps~n_T-EYlQZx#V5g6&o|onzd*hi!%#ICk3fmkyS=koN0F&>0Nq -egw6)+C;ZrL_f+az{HRA*qtbOZhD)1i|%r{f0<tnf7cK{Oh4MG}t~e}nT5;{QvBKaL&Z@3lQkPVaoU6 -%jf0SvPc6fHA5$jKp6V2^txo;J3V#fMcd0NVfSJ3i?_rW^xM9nl*R>Raq>^eJ{m-pWnW}e*bnVu5NEX -+%m9>+w1%5i}N2vUanR!E`&t-%uJ9ZKol5qL~Xzbv=a1Vw$!<DUtpfO(^Dt?_Xf-q9PP8HlFd5u$P(Q -^1EMa46KoDPa7Qp74mscjhC&xWvcqTk5~Kp$eDgrQ7)@{|w<u@y9k9_s{jE-BRhOT)hec{eV*)JvmS$ -TiM4%q59Q#5Y-Bl{n%Po+MR|M^f_707$_=qa=6oaX!#eaUH{sdYcu@U_ABqCke)S5hkLzvo81AXSVF} -8X~?BDpv{v<!^O}i0AyP2aWh7K$*uVl7HpP^7hcpD1}aA(w}YCN?sqOk=nUb!E10w%N_{8=8B4cLwy# -Yfsg=^Fzfjg88JZHL2n+snL^!;OFcCeS^gUyv`R%pMeDjA-ue1(t&&%!hDf8`H<^AcIcGO?42QhI1a6 -*+S5~p<|#xv5-NX3YDx95u3*%c0_S>fW?9hdq{kVWDXC6dC*mAZ6I2A10O30fe-HMT<{<c?nnp1PXr} -=P;Lv@G4nfSG(FhPGkAQ<)+piuV`2apD~_@Cgso%Fo9ca`6Q}LLQN@G_W>@lB$;FnzbOT{e40pzGEf) -Q5f>pg<-bc1Bb*8*#ZZKybV}ru4@qbVFzd8O-#-Dunyz`G<+aLwhcXX#^2N6E_msU2po3}0ZY#bsk&% -+y=354?5dMd_xf({~>#PQQaSNQLI0v<Rf5XN#cciL=}sruOA$0314cnw4Lcl$zA1HIdss+^KojS?5<V -%}n^hA_z>Ff1Ulc>z8&at~TPgd@U<(cMe&y}SESFl2#{^-^bmJa`AffR%-a8|^sh4yg-H1gb#&R<(Y_ -?LMe2xfIy%K|%v`bM=$pXpcxisjjrG^TUMDtd42)3`X;3wXHONd8Fwe4%zhc?T-W6V2Ud-dQ;^JC-@} -!lLQ9?W}qFq**0qs%o~s?xl-bqvU5Ayd6ERAxW{axwNzCJwvT<6T2-ad;5cl7j<B$nh0RIbT-}H_-~A -ypXJi%#L4W4?&Gkfp%9euMDX{=`l~GSF^#Z-d0E#vH2EuTk^j0%9wM;vj9nnpsa$thbh#jR905tm)LC -=YUiesOaVeVYvBFG+t{HZKsXi>$<8$-gz-ZJnGnmmdSRXk}*#2quL%M@E`)hz{>=HO%-U5>2xxj1aMo -R7H}m>xIxYkkc4nv`Hj3^AtAH80Bt%7Qdv2EKT)nB}^7Fib#9V1SZkr-EbxN2E03s5mV7AoehK<e>-l -wJh(%CKNZ8gzF`o0#qMx94e=F3$boCIccjYGSl8WkekCh-y;vQ&ejlEnM4pwK3N13W+AB4*RN?My#0t -lD*9tL-2q06BH3w82iiH{-gyPP2At{7qeKBr;Ska7#}WF27}EHe8y^j*ABEte9S%gyf#_u%h;Gg={_F -hhRW#s2c)!sd2VNX=gbsltF(YpVvuOj2{muCBzBcnTK-du<W*SUttxMA!C%qj#!_hm0_d%JL(7mJayA -OBw@6Ug_I>HkdG}RA$v4snvrm_oz6aT1C+RApd7P=9O666mP(`)&t#G}l?Pz<FOMYY(9clY-<cS+PU@ -<iOKO$pQF66h}eE%^>rT_{^eSPMFDuc&?zXP3yvFK2CszLPLec`9pbe?R@%YYQWn>ZK>IEg+-<_XhK$ -eXCpGne*sR`u{wUhxo|bekm6R8ys?R(EW{E9POh1eewpgC=jlgbfJ)7s>rr%XO8T_PMh`9*m4D1c@Fm -1DxB!5pew6}Zs!R$8f0)@`W4tT;koNB%1W@!HTc@iaZ8-BCGMx}SYi*_H=AO#heKN&U$_Nan!$h{=E8 -)PMt$VrKsGh;Zdqb-neEM}pV{018dS|-lf#qlg0m0QkJ6_OGVnNOhd@5Oe+-4L`LamR4S7!$f8lQ@i% -aAjC5d8^xbeHLyvqoEGcnMOdcDVe8+R0;6eZr^qmSekru!d=?-L*hUGH-JMR+j>JBb#UoGvRGA5ECNo -eO8-I#*7LUoP&@kpqf#n$gtR5vLtSFu6?G)|v8u&%mD>ezSiUCYS0grIBG++BZ28_N5fQe}CCIjqa|Q -0=<q_cAw~EHl-7w*iZgpK;&Ir;dMgvN4#+&+Wg0BSU1``5q(&``V{uM)9_@_@ik@(U=MbB%*y)LUw=J -C)dna_@<wXb-hjftgVpIu1C9_K#?5G4K*(<POJk*bXgcU397WhKXE+|+eGS@V6%XS*jxS4c;eLRait; -NcC14F1tuD%-44P5&4cga*#Z>L$9i7;V1iSK{L|k40aW2m9uP$-(OZf;g&DZ0wGronVljGD)x>8LV-r -tYGy=*a&%v!6j+<2?NM-|~<Te*|CGKfLFLI^5BQg$ob>ZiUsfCtgw6zt4Y(Ck4S5hW9mFlXH&+@I`S3 -#S|`x9U}@UCk|!^yOE58wTXIb+`|&>z{2W9%}pc=XTO_;;8%F2^09u>~n=;0nN_K!h)W;%pN=^*EOB( -$iS2{q2QX;dwl4ijBX4zWjvV*`e(9}mgcjDnIwknQY&yqF4zorH9ny!=Ihj9a7DLR*pFE$<7!Vj781o -1ah_$W0wu0A^w#1O_IbK5Td}Y;P-r^`=uO3Gfn`HD4KK*HoX=9t6wP0WHK6qlyp5kb;yNJ8N@nF|15u -@`-^9w$M7%GlNK`h$lpD1J%OOI=S52+62ew(|ro#L&5@#c~pjvc}?bf8Q+S*N|^v;hq?D&)xk1lEAAD -p9thl77p(F@MTZ!di8Q~c8k-vGUTyzt#P>B1p{R5wAh#{rN8*_*e1A@Dwl8%Wp?+OEW9Kud+5+>t<&# --T45M3&v`LBu$yrwx3>s2^@G_R(eF+Z6;S7P66Ot^bIQSXT+beMckum*M$*3~wdY%0!2h4P*fiaI22h -5C9rDioIz5;HY?5SU|O4D&5on#ToO6%RrnkIQjEI6T`U{@(91<*_@H5(caHKIOsn2#0K3O&qoJ)qJXw -Qq`R|6o<ALb0tcV$j$4}9DAS}B-)9}>2v2hHvYGLueY_aJeObMgy{$lLxphm}dp2FLI!4EZiWS2`(_? -rC^_YX3!2r+z(IBGj=pT;tZ=YnnYB^%(0)$Q<Tjko-BRc`}ujELx0i(vK;dA|<b}C8F{v7p9CaX0l=C -jwWsb5oA``U*F8t>21BoRLYu+AC`0s5uN^oF7v>4WkH4L3j+Biphiv(AYf>7d$IAOWcUmIK4fDbuJ{? -t0F>vY=i%Xkm@<5k3c{xB;6(FyF{!8}@o+ImGIK#pIf)r4w@}2A1`-V^q?)lE=;>Drp?{jhc>^YAdTA -9DkgigJAM#P1>*;^yMgA7ZhS($O=jYFfr^2+SCo#^xCvxBL1{>kfvdQfv&h37h_k0mDXr;x_P(_>zt% -8G_@Tmr%Mi7LOX8;^ISRUjOGPq@mc6!of&4{RI1kHLZi@ZZFUE%6Zqj)qv{R5-2#7w95X2j)mN(q$9K -tP)ZlwRg0n-^!R*bVd@Ax%F5nDrSaj*Y_IJ@lx)X8fWk77g9V@Zxk<6du)}(Fmzq&dsCI7?Ljwj4$LU -25NNH4M#&s^4}8&$7Vim!`a7A<4`fzqv#yM?J#o&zZ&nXk&zg$5JapzlvA!d}#38&_`RuJ($mIr#8XM -va~o&DqgKNaVpL-m4Du<b$}}K8fldMC|JYD*x^8G@_}u{ZL$C>JU4#p1T2_HskmdNdNuBrUuZJ7r$Wl -Rb7|$&SDB%$MLyu#$KUS0Jw83az`|1FFOfW`xkS$1dw9Bbwr&yYlgGW%v%2b&A*<?dA3kVlEmWGen^& -Y6Gt&7V@WB?;KA6lyRe85&N#aU@!lAc{Z|}_zB13RKkftvg*W*NaCjW7JF%~=_Ax2}^>0u2n7Q-u(<E -Uj8Z)C%W(l>!`W1&*$v+YAa6B(Wce$9T0o{P2+0sJ^n>xSkFAtpL@Y@y(Crwd6(-aI(wdH)EyMn?yEj -6Ab-sxlr!;*Cy^4jJ;0`89>_jE;QSU&D6xnJ<UbIUmcx&vdE70W0%Ybn6t%Mf=8$2^rr7&$v?Z7AlR# -MNhsby27LWNnGUhD3MoD!L<exR9A&X9P3|-)HP4&&z9cEU(<*>Js@Bo_n`ILarq4bxH#49X~*%Qj)En -OT{PRJ`7>CQ}I+uS#+5pR#zdk!Nn8e1!I_`E_)b<kC?zr@MGiP2@|+){E)YM4*55xD?NQY74cj9&i6y -$Yjv*IsrVS=K+--X5<E8Qn|ELG^nLb;K+s@1UgIA<&FDY#a@BvhdjGzK>f`;TsWQE9ur=E|IUg*H?i- -&eFYX5f6}ujEub9M3M5)^U>MKJ1T$K&tgS}C!hw5`K4G;M=`a3$RMcUtv*z&$-7#-G0zJT3bv7k?gpo -(z7nuSlZzQ8PC*WT-UZ%1Fg1u@p-!=euDY2iYH$?guHCz|)(SNw}diLj(*I%xOnV*-jCp2n3OdnWiDN -R$5qP)h>@6aWAK2mnzTaZLR`DN&Lm005bN000jF003}la4%$UcW!KNVPr0FdF?&@bK5qSzx%JiDw7e_ -%8Zlk?##L4?xktE@ok!9;-uX@uaBlgNMcQqT7tB#rn$fU-Uk2zASFB5`<U5VPbQW~;Njun;e7*M)YV! -f$)auAS|*9e*PE(tL^@Md(Ka&S?*|9^`Fxq1k8+*nMcg)dq0FPDY&NN~Uw>9rX+9U#a+#M)^L3rCWwY -H#+qSZwHbvSjs(Nj{*V24aD;&*!+uAOTTyGY6ArB6kdV72z;Kwvlg%A%!S^X`g$1k3qCGTFIi4*azZs -mczoy$!lPO0(px~}TupxO6np#bgz$+XEgadIuotg2&`-^T0eTB^9Miz1(y0XJ!_q)3(E#|eGEfA?Dct -(B^A0O%)n1ptbJ4o@JjN@XCNma0h$pdmb@8BN8DRIPr<)jDnFtFG(1%4A`?z1hAw?cUL<npct96nP_W -o2jVRO)ceA;QFLZqViwhOO``}bPH2$R#PJ1z|Sn5U$vVg%K@KMT~Xsi-sY-NQ_+?ic%9%9?ga4k?Xwr -BKR!>M|M}hXS7)cMU!6_G9Om7w0fjltI8p6vQ&)4T)FhZmEX#S70sC3@ZksB}Bs`R1Q$zw-3s}lDp0D -IwBV65-vJQJ_);7)aGLvPKz|*jyl1;m5s;W@Qtj&we^f-I|?){s0uV24BOU_=L{t$Ls0vpUtTl@@6)I -*}pO^fdU$)ZZLH+8kFff(PWK=Sb6*(NW&sT9>b_4w$fhBXHo6%u}})A~x*v_M^#>$z<VAA39=urw?)F -nxa~nAdTdrJF|97Us99l27>=u<*NgZ}gXaAlhbSx<7@_2!i{<r+ki&_Vo5Q#Ix70fYIJ1&tANL^{3?Q -^xvOP#apR1K%#;DY=L+?2jpQ=%BG$t>HeWrQ@3-Jz}@hGI&5WGs=Uds<#+kK*-2rR6u<4mpQp&XRoT> -4(E)~M&-mF+in<;7i$&~v-~ocs?*%+`g)Cy4zJ%{2g7(Ni)An{<)SG!SFLKyC2L}g9f?GNP34A_AG9u -grF@o1)Pe_b&l>i0CQ!$2L32bcKs`!<*EPSW8VVAU?uYj-wnEJ8|0!~hfyu1oJI1<VX1~9O3_pN(5)O -FP~8;d7D!fzKaR}>(!hN)^v62pXF(z7T@%5)8Sc>>Kcxe%>_ZI~{B2+@R9)o3)L-)}*<)TKxT@DfU+T -5f=ypdo%~R+733>Kc0;v$RQJ><<>{QO+tv)}v$bVT1_4hY>8_Xeve^dlbkCctY!$=<iALv77d2vu#$~ -Ml17}pP1Is#Ays1P{=jlMFI%N^mKqhAOz)ib0KO>J|3_ou%IcPhvQtFGvo_#aw5jh-VoIBv4yg$lOX` -~+dVykB8&Tt4Z3&h3=Ew>0RhO()>1bw7Zr$$LV{Q*<h3lQ<03E9!s&@Wy>5W!Ah`46-(J|BAo%2G!uc -eEjp9-KbCs8oH`Y1uY;-$8vqId00__jpVftyL{kL#cABblac4(ydBgkI$f3V!AbyfDb?SBX_vjb@5Oe -@&kb)#<bW)+P<*0r~zNr%WTB?DF-XoC(d`buk~0D}zlQv?DKw28m8MY^74skl8Bx95*9eCzI)d=qKPI -D!Q}=Go|Cs)vXP!-T%%vzGU|v)LyT`;qLVzY7<D;GzOZ7<+5im_S=>;_n@oI0SS~%Y+}?j&8F604+Md -r><_(yB9S}>zlkBO+;E|9doQxJ(KgJi%`rtLv<1#I=ns$Wd0DaPSAGPkOdu0{Bh6%1}&DhMH7v<34s6 -bankLNK8QYWEeAgVy6)i*V8Qf9fZ46`vNyu{XufHEAhsm~c_4Uaizo5#MOH~wjvKK`uO)h-@#{C>x}3 -dCetiBGJ($>xYurs-E?iV!Oh360--zhRRQ$e&PPG98Q5A_R3<d^b+-kNEMjxoJRq_|-Nc)SAk9yBF)Q -gYe1G@4bM=|?-k%z?z{@3jdY<YtJ#aX-FsEFPQCBYF+o2phP(P)Z1bv&BDV~{M#mE5WmbjS4$LtAHFq -)Le&U@7zOs&$%|)_{+UVGqP$`vuIR1W1)PNfLo}TucSHf$I$#J`A>_8orM0TU<x;IcNf--&A#mqV2;+ -cO3FG%{XAcJHW}+&!C6v`lEkOA0lXsUo@jIv;0vuWSfDL0LHVx-CMQbo|ao7*E5-A0B>GPbSU$*=#+w -Pf1<~X`FmWGryh;|6$t!za(?*u!X4~P4+cnxYC#`OxS^@+8yAP6q4hKdrioT9PLy#vKYn~6z7!FoHl4 -s{{o={-g-3+<7%+j+6tIUsUqC7aPgL>_LhGPe<x0=qLO{b7Ss2z`FB|RxZyC{|HkgR$RaHV`{D0yh^8 -B``(|O}zV3z@`5<?=`u?D9SfM~>B$!<^*fGv*WOZR;U1BDW2{K#A29`9gF#VVWpOpTfXC$s?ZV}%c3z -TSr)D++_mAkv*53&{G8ZO7Vo&eDMbXgJ@{0QFYpU=Uwm0RzoP57--5!FoE>+MSix+UJgQrY;K4sE@US -iP=X07RQ;POcI1X?iyxJ6R&goz%zjD#UUbhN~4iOB>Fx<ntIFqv}r)qfPc5Dsw>>EE0`Vl+Fu<#2KXG -8@ONn~m!Q?bU&J2K$TS*FdHUQxf&R`oT1P<lPUv+Ft=LnWsrcfHtDCf5s)=jF{si+W3y>TstVKFQLE< -4e#hngx0^v(54$OL!mL!0FZXK#U5P~QIG_9+4xgvVQ-fYvt0&^JzpP>oVv?{@<p7_lP4tyLegPxq)9Q -ZgRwq=E3Z=fjP!fK&&n^h$gn&4XlgN0`w4+P>XnR}pcr{aLQg_`3{fFTOU6gJe&9o%o<o`^06otK*y) -W&-Q=%E7ZPdpTX@agci`&mc)WBofCy)nB}j68h1-MJG-Bs{zz3^*TQV~3w63xeJ4&EoD&j-D8Wm4yyB -5t7<iq#0CozC_O(8<cX6E(ziemO*tRs<y@{dYtU2*;=+5ilRA`GIll}EVLffe^{qC#$3f9nDy*<fTvk -zhTTnBN8P(p;xptD;=_Ra6-KdW&<IC@X9@O%;mj;G<-lq$Gn96YMCo;lL9zk^ZR2#a;pS@7ms+NEC%X -FjlqHzvXfNghRud|De$`jlIs`IoX&qg7?Gf5BK{Gvlcn;2{L978D6Tl&vVOp|&4CmfyPHR2CtiV|P{! -9mXBPX8jn$ARiYtG`LO)-Qh)Ab3%Z1S}PIj+BfPmnLR`paC_`nf+n5PrA0RP@R-keij3Jx-)H(!&NKP -IHS1xknR!N4T>7L_9e<@?W!s>Ok%Q+Z3VsK~QMuSBjuU2F-3nohE#JM$v3c&cTyVu=kMq>gcO}6WGb{ -3cBwJy{)S(U*x0_oFuDuzQCW75upsjC2L%rDe}g0-LSXgfzr|>!CWhVvuW3Oi9sfM+|3u*n07hl`W}I -Yo0p^h1XeQ5FiUeXl%j|}^!R-Aj8Qmz2V;$nJ&gLvKHK`GESJp++S{p8va#RcWvZIPA2h|Fy&<08^kZ -PfIctGFw50(!ruA$T?mrY*MWv*XUMP;~!GPi9iXUo2o6Fk;O4&VnmM)~ts6_Tt5Ziw$D6InaCi+L%K- -{cyum-{2Q~<$fPI)a$cq7?9X+V}r4BXWqX+e03b-E>RXr#>0oWfjbjwTPRI_CS({OOVdyS(c!P(}~hf -2!Sppz-F!#^xlpFv8xR;>AoWP6l|YC37KV6Q`R4vJWsO8jz@Km>Bl80}Dul+1gCZww;wUZ|fR0y1bS1 -mO=m+=@h36kv9~sA=*${+5v?|DmqkiMh}32UO_M&S}mxT0vj%J)PkkPoj?+}*n!8x<vds)Ne?-ETv`m -WT;Uoyu&@^s0Tq5xEx`%|!XkmXA+=!|CbDTgV>^k7FNHWO6>DHof9JjP7H0fVjggOXkflBHgmWGBq0v -P2@^Gq3ds#fY6$ss#1X5@cWU+X|7TEwSXQ5=h&XuCXHUgx1bMzy15F{2D0OT(PIeDthKm~8B7Pk{SFZ -gJz#Ni9EDAHv->Psn~(Ej@Y|FR+8?#Kr_g1mJ2t*1|u<23B<aX?(LL4dDtBV!cgu02fb3H;_n57G{mD -f45uE^1Y^MMmNTmiVyRcw86YGZ<K4$+<^AYtgz#xZu2ca>aDl$~&^z=&4cUQ*rv5K1{+`0=R@Z=^<bo -FzdJAD;2VwOLp-kcjj2jJViROEbZtLz%!c|8k3(Z)D`g4oMOjIHr2Uu#f!=T%jb&#lIe4kQfOJ0ycxV -!tYOTetAEf%SN~k}-HXn3JO7aDuBZ0Tr4N=~Ta;*#gC3Pm#Z=^cc3nSo-x7A{G^e0jK1JuuIC|{kIrP -F7F?9s2(F+(qd;a!a^6K@g=i{JJnqWI+wU9>eO};skq>>|B|D+!n<h0A#(_i;CM1hNHa6kb7zlt~21| -y*K6g=#sj$N3u{f6{xWCGEa#WiJ<Ri&B`w*M0Pp1Vm7X6J6^pJWy5$S;}%6rp>HH9WgQIvm<%AMKnXd -WY1WQiE>w(2fx>288>7s{wWFw>G0GM&BPz=L80mb-sCDOK@Ik7+ta!zl9~)3d%X+c4M!GOkIwqwF-xx -!xpO6;Qu+mR`8axFcbyXOB)YxfHzbWY%h}&YpNzKMA@!qY#y5KWG1F)&;m)?BCYLag{>XHLh<QuOoDo -%VNF9j@2U9R(QjF}a0&-&a0U3q`J80XTBfDye4y{a(S@gn--y=~e+&gh7mHk04T-b5Zehz)>Pl5>jI@ -KH>y8R9fEi?+76C92dL15EWt#&(0i+ZJHXxOg4@DqU1*<TI^;%XUMZQDn7C@_cksF^lI#{x(>bWeyLp -nJJ#4h?&%5Ye<PLU_p6*yYBK3Gl+zu|*yZqO}Qq#&^~8!#3<`c!qse7vdAO-60EUd!54$HC6H&ga4U; -V3XjvPe;-ogBqae&-Z{1UUqg$4D>%l4!YN6CdCc3YHK+(S>Z_Wu^nkD#q?v<$xo#Gn4bQ<s1nso$Iv7 -G5q6YACMZLWsLmkpgZ7roGB?DtL@o!0lv_l1!{GZ{-|<QmA-H3fI}jKng<7{#C(hd!V%vQ6L*~e&?3L -})*VzRy$j>@Bsp~fFh!PnHL898lK`Fg0hBo#3P3fiG*7S~)vYXWf7a=3qIYJuL)`|BMbV4U^)Pm|?Eq -wtS6+ksGg{j1XnZ?G56{eUV~kv!cHs#J5~vlfP}fER=tau9UCT+gF_DGxh7&~a73)xsA3YN9-@XKwSU -J#cByKT9xp-`)uo<c|lZGE(<C@o3C<tJOEz63w4_2;_FmQpvaL%%qJ%SCHDf<aWx`qTmG&1N>F4KiP+ -1Z?1hnV>Je=@Ep)`n9D#i0hl=>`BU2(eFg$pl;jG?~jov#4kWYGTmJl-o{ru@+2gSKVb&u1S<L{vB<x -H!V_L1{TUdQY;|fhog^=Y*7#Pne3zxnqL}0ZGEj}v#K&}E$(wMo{}a9ca3K)bd8p^@+zuY4lE08Te&4 -&y1mI?>#rWkzsuDIPr3N%;xOsuco=<?%uI6c^mH|LSePDB<2lGw&}$$Jb(%!a%}s}lMx#H<MmrEX&4_ -}WnD1-cuNYk-M+={DXqxyAH|`W9I)Nd^#wW2U09PV1M>(bj@&w-MxH@X~w#+d@5u4~Txo(7E-)F1S99 -S1a_vASFQh3yx|3px<4VL+_(Gr=sl3Pk30_9pPVLcXOJ>Iwrx#?x3GfE&H5(R>MEkPUr3t*{!Wa~=+U -25foovAIRH}HA9tgChtJ)XqCcDN~B?Gu@{R6SkDG3mr^#d_8Y{&cV1D$6kve>@3%NhVnD5LRD(jo&hT -kRpoX`wy{tWC4a2n8FHI6`oAHNI$M?G426+D54HQ;#a>sHJou!=ADx94!v{+a(q0dl;-1$p?3HSw#cS -P=Q0}q^{;rE;nCR7m)JGLB%cDGZ<S;<9<_kQq<55U@%!`_H5k}mTJfa-JgKA%@X?6>x({)`w4(f5TQz -bR4+iP1Gt6%%TJX|fQDA}cChC!cQ<2zYk3sQ3e1H1qAD$nBDo5gxxgO|L{Lx8Ky?rR|*{i$K87g2yw5 -=01v!lV3vPqS4Nl%P<KlZ=fs0>BDDM>~x$MtMHLH)n*XJDk*iF>#%S^%@8S)@7A9JhQuoJYOa-Wflm7 -!;)w04XD8x@~kUFca|*lh_e}pEx4MnYxzLTx)S~(8(Lh@x`#CHUKNC$Nv%GKL3?e=C25Uf*S;yoK6k~ -I6UnB=!@t)J^bZj^4DK&H&z~eY$>A5t5pg{h&N!gA~RCK45rMBs=5LZkYAxn0MXzGZ`=tbxqQ^ri-O= -(`3NgMu!0iX1^fNz!jqRqOL7kYea`X@7=TEDAI#CI1w6-E&+EC0=^!R`Qs&5#lj=ui^;4Umm#!tA$n3 -Nm)za{u@|vbfNj~l7ZBObq2Fs=6lhI$QmSS&Ii$)V+=xEZRYg}2a3i=Xh_pqK|!Bba)keDKoDPc0j2g -yK*789}S_rR?Vg_U~sO!o)36H8a<iCXD`Gh%YHj$!4AE%F693z8NHtP5YMg)i5fN{1&Vm#qt4wS4lHm -820bk8?<l<>9XNp#f=W>`H-M@s6^gjSkw(&_T$gJw8s_6-hy`Na$wV93v{qUtc|=O2xGH;9abVY0Luv -O5X`fp3ZO~G956|d@&6vWT^ARPB@ec-TrjX2o7#kIz^6acZqK=QA?*@yac@|p}`Q{tkngw7A3hpTFuZ -wcX^u-0An-Qef`tVy=_hh+I!nx??L}?V}$=rg)tQMtne*HJdjI4d!um&eoK}(&#B`iY#lRrYj_$7w+9 -4|h`x&%5hjW9Lw|Lg7dl~6Ud5d#GQ(;)<Le=R7Ve<^5@k&(r%Si?`fR6*u5Lc7sv_DmH%GvmBcTIO3` -S<bhh$m@2%{MRoQ?@^R^Y2(#@xEDFQFMmaZo4HmhCd#EIlqS5z^(QSYvhqB_Inda6>DCrKvpw|4ajo# -WRc_xU*tvF7g`d8@#=Y(34I?Sp{Hbo#<l*V6>)7)ZN}DG&??5fOlkJS-#rnQ|w7zW*Dgk8v%Avjo$k% -S5!kb%?zYWpNpsIa9uO+4O6B>cM@Rr!AcrXo^?ba-lU*vC73HvJaWsV&c_<iAvYOcc$QG~V_LLQC#U` --xB8Ryw<bFWI%0ZLz$-JQmB5o}17;6TWP}buVsaTI4!WaGy1D~;JYOs@ZhS3Y;<-|A;l8owkWXKI|Jr -f0R@IFqy}cTPW>c8J9;0&aKHj9h5z$vi;tTQk=;&y&8-$f}1OZvsg>tWcuJt{P;ema{DuyMH{_aLZ)F -vSdcfM+YOR+}HU9&K|`9Pd)<UGgH;Z#>ToAiX&4qp&N6nD1djLS0nt|T#n9e?-+4GKqL7>W&Z<FTL6b -Or2q>BgHWLc9YG#k4fmC|uS^H+}v=3aqJ{Z5yzw01R-~4j?vEjB$71Lz9P=XgSkL<fKGJwb%i{V$h{p -kry~^$#E5|0#faI2LLl&x2d&a^!X@*jqC>n^gK|dgAs(`dRUyRbg3(~$nvb_^S0Jz{0;y-f01SxnhvJ -=@wvILgvE#s0_*^hkzq+0226@|RK=t*3bIAMY{44oJF(pVP@JK=$$b=~52VcJP5~ZY>p&^!bO#t=sg; -{3DkmHeULo}{B>lW_OPE7A+zS{AY$v(iG}|6s{{ETl9=yQ)ymgj-*DUscFh{C5lSvt@a0<s_`Afdp34 -<5@p7W%9j-IGJUxSHD9DN|5Wd<Sin)J$q8Hq|`WobYKcX#dqVPa@{<HESh6yz42X65|q&Yr_m**p6ku -)f{e5HlYVB*mb`9mOQpX`?fmH@gs8RU67%fofUjC8pXyGXOWQ9SNuKVw8*ocsvMZNWu<8khZxjGM3w2 -V2I6vrwyNVm(G<`9g=4aP&TbITCzh52~@M6L5KV3fXILqMXlE#n{|s*%^d2mUJqMB3QdLu3CX{`v$Sd -xYmI?62|ZRkuA4LP)E~bc3^tK<7Sl~d48+H~H+J7{L`SFpw6l^>?HfP*gc9^|=%%xQU~L0hM$f`<EQl -e?w>!@7S|Z0<Wpl0;Us>!?(6g~MaPTiMss>AX@f1lkGFL+3j(Mm=^iWMkI^E%1?-jYwCO&-!$vJTS6e -jjgJUB7h;d{cNdk|$DKLZhc<yGVizT0l~5O_}+4NY<%10VH!pnc%9%jB$GMq{@j*+m@rAG0fB@^88kV -9FZ;W*BUvgWcrtZN|=O?O$>gWXk&uf^e!0RIrQG(SpCnTysteK{W=`-eiV|sV{dMYOI~Nd9~ScY^KYR -b;&QsRmO&{2VlKE)7l9;QSiuz5*zS#vZgU#U>Eh^d8KH&PU9rJ_b!NQzca?kLw#gG#Ujclm}Q4~MK_a -tgTH4Jx=9Z{rIU14)y-Hu^Z>cn@eN=G9mhFFZEx_u8UB}!{ftqE@`-@9q39)Ac8;9gNM5&_@!*a&rwP -X2VHGEDjq&s@oc-Mn#IGeDTpeh+2cublQ6?2D5FIAs+X?r<9GFK>-;KWoP&lu4g9{0^1WvHm?5;(+qk -}<xva4hTfB3r0c$iYtZvOj-mIg$_+ev^qo9OVd-3-VPu0Ktq;zMU!?xCtHG{<LPU}yK_2`{v1u2%~}o -6g9vxI<?Z4cbnQ-o$&{g#G6y$wLJH?i@MZc8aqBzBL!0#_OvLKS$$39*(ZR%QuH(o0d4m>H<Ryj0e); -F^opgX*nwS>)bQ8|2xr(?`ru6f~DUkj$qc2K6@|~FE?`N-jQl|--I=V+l|+9aJlaOaRGfU3?25f7TON -%{mZk=gmyG`_1m3CGc7!O#Msx755Ofwhs~}l1$&$I1{b)G)ifNmBe%bQK963SV?VREVe8NA?yc1WEf% -;ANT*+P4KrW8iW|TPiP$+fNpYL3v&b|!4MWk9h^@X<g=!{wAW5X>%YQi@Bg=WN?Q-Yx$jDiXUY!n~iF -K{M2mAKy*Lv|uBYP9Yy*jiH$t9<IF79Gv*S6{~_V$#Er}hr-1PiLWEhz)laW=i=i-jY@1A%b&(kT0d` -+(>kjYjX88?Za4f9=vU{-*(*fXrY-U+0;Q{uE(8h0_9S4xJ#a2#k&zQfrPgaS+pm?dLo{BTv%F^PFNe -<X;j}R3H=_hRt`SkMzqR)zY_Loz>~<Zb#X33o{*ek<@mL&sA_deW#8fy0}IGWwR)?>Ksk7<)<zXr}V} ->X++dIJk;9ukXeLI2rm{>amn8)dn<Fweo@qMY9m(<Xr0E+ZBW<+tMJ4Rtjk{zh_CgzUaQudO84jTrJZ -O1m2UVJ8U;jCbohU^#aN#1k8Lp+VsRya6fmQ5kV8HjPL-shq8q{ak?s$>;cM8Ud@P`p&7rE=dafs8qu -$N{_HMd+`E{0OO`gtD{gZ7D5?-|Fs8sf!CdYr1$>AFgZZErTI;Hr@cFF%Al^ZHh$3p&J)3;9S18?o5v -d_fJllLk+K-)Y+Bf-5ym3Ez?EpIzsB1JDv=S!m;%j*iMO^ZcG^KGSiQwe=vWMBQn;(5G`kDY6-@{MgB -4?g|RN142Sw9Ffjk()|A;_GY=`7W(PygC0WZ@NMQy<V@XMjmqx4*uyo1c0S}eE#+?;_T(?pKw|5z`m} -@Dk`eArhBjXRzD5M(Jm%A2=W{#jVHl?Uu&INp;W+Sp!>AMd?0?pOjF*N!?LjO1@Si`#~T4ew8Etz_Aq -nD)QbUeCZ#=r0n}KvGpr~Ca%|E^K(9xjbAbMjo;?1S-&sL%ry}nuaXpxi6FsCqRFF`dXH1{t&6W#~sZ -D})6?ii{M+5MR1gxpJ2wIrSn#PB7t(W`nf<JwLWt)2JT|LJ1s0UDdi8sX`9^!*Tv;?|MaN)*W*`j#cm -UM-PnVen^zWYoEUR_m2E8hKK2lrms;7?CP9ZDc%Zn6_+S5kmqH5uNf<d$Pt(aBhlf!giDZlb%Rl<*jj -(0MBll6lgfIa|UscLMoP*F(~@>5(HndZILF;EPdhfa8Qu^c9ZXk>5Yl{r>Op^dKHtioE;&WBa@lSZ~< -=hW&cUZHs)?wYwDljo9KkPqArto`dP;CdT&NX@hHfn^5w@c(HtnENvtnH0fpWcHkcea9tSgNn#w0N+5 -UM`e!i;jx;5<h}VIlOX0$nI$&iB#&;d%!J|J@bJo}11D4FHY)c2hXO-$xz@Q(wX!T%q_mYLjsqef*ws -8*i_bO?+Yp6bq-5aLH$6`$PSHS{}Kl)xw7m4@i6N9SJM|bExV{iJOV8&^bPV{ekjavU!E`!NkW%`7sr -axe<KLwz;PP@B3)&P&3QEqzIBiN(&cmQwrwPsp&%<G(T=L5F@VSjxV_@UBC=cP`>W7@0N1ICCgYR-*m -oO|38&n9B|fq~Bp_|gGg(~S9gdS?LGk0Mz6<#eH=3h18x`0R|nIW$Dg><%}D`RhLugw+Y5u}EI6w6k$ -Ar|VL+p725#rVT1DuH7Va9Zj47m&3jN@qJ*wPP^EW4rc^72YrK?;#pBU4B<z2cUVDmjCX>sjfW|o3ih -J4(4NvYS}=>76|%qQdP5^BTqQ5KTVEK#{aaVouO-gO$o<B-ys(b9_Vd9prVjAXJ#}f^cs@AYmN+sWkv -0VO4xdC+ih(=;h^w$>>xQhsss;}yt#iCdma+zj%llFv<dxZkf&g^)fw|?wgo+-}`B9niHEme5+?`O(c -a<#T&mG0z#s;Akwh$>5w4;LA0eY{<oZU`Aj22B?cSP4g-Is5{pH8<q_lY=XLBp(zFV%WZzD3-7y4#^2 -40U_6v~RkkvAa8*^Hn?k&{n^ken+srvsi2h-7i=M4l*?cEUf4fbKJ`|mDEx~%Eml3M8kS~lb~A)>zo& -SFm|s%^%V8MaW#)%9bBJ~wpjJ)9F>(*9hTEYuFcl3SnXXC%s}+XVGh|6B&y@+3j1vNj9bDvaCby1u3^ -tg7#77*x>Y*hK(`R~sxEW4=rRsKeQL3#S5z6m689*w>=#q^fb1=<{3MJ`oTE3y-NlrHMU!`;y1QKPlZ -zy~V#wa8_bQGYE`sdC>WU&iX*OYbBV8rUH_`ARH-Kk1hy8PhKgn?&&SzC^2#Q<fNLS#j@>-WQiWk*JF -503n;n?2Y6AX&VROs+NmmBl#Js2ih<`~}7gmYPj0_5TL8ZNmd?%G!E*j&!8$Zw_V5&{TLPk&2Lb+}tq -jyIn!(8N-_e*-`^?z1q<&G(t$xl~<?hm3QDxtF4#pb+#4fPg>2HPBcck0~Nrv74&C@}+@s7(R>wIfs9 -I$1LXPW1x9Dr(zoD82s6H`uF~(|6a5IPLqF+iSKJ(2W__P@naBwc2Cog2C*k<umRRNjLk75E;cbL%6> -=N1~xg?_-Mo9g$V>!S0eTIBHkcT;f2O1*J)IJwf+ny2w#@=k8>G3GpENsbe(o%r*@_X#5q1fv1u}r(b -1hRbM4|W{Ai$aM^URoFE6Y5@^biyhkrpyDMq9rMwohO-P=d(aScmU!pgaYq$57#%X2r6#}l;8%{R@A- -uXvcVrS0p>y$FQ>j=Vq!i)qw#XG3M{&QK!OEh{=Jbb^z%eb3hM4R)ad&GZpVh_rPsF-k^ore8e4em7r -_eFq=>EIMB1^PO>&aXu5j^^90SlFiz=(|PIPNw10j=UYPP_bvI2kJ;{N@7PgZO|9!OjCX9v*!xqmcx6 -x@~TyZSBIn(3e0<6)flcPcy@M_aWrp?RkEmB`U?*F1fb%R#^g}j^r8K0m<ElZb?E0~?q3?}oUP_Pb-E -bHB28J<B9fGuCAahsp<L!r?)OBBR1KADaRr?>w#$xTQkSGn7-GYp-Pzt9z<F<wo^f6AKIFR!De-6g#` -3^n$O8`*-wB;^L?9OZn^6eFTY2c@7UO|h%-*v1TJ(=YbcHN?=zu@YpJzA-p7qCc8~+zjO9KQH000080 -8trnOul-Sn7ax90J$Fk01*HH0B~t=FJ*XRWpH$9Z*FrgaCy~PO>^5g621FZpgfh5R3&M4G9L$R<=`Z8 -?Apo4I!^X5Go^w^NWz!|H~=YG`|J001Efewa=f*tRaG2O0ve5n?$@uO%gf98W1@;uTjNFLRVvDjv(<W -It5Os)d5~*$d3kxUayA!>#i}YRrxpvL^TN7P$fdVgRjNgJz6j%Vsa$Do=Idd}Mrtz_YgjIp`>}AUP_i -Cf=wiCqDwA3__4=`%Lq_l~_ZJrzNhZA)pL8*I&bnda@@RG;@PdP{rB`H0sQNqdx}JG!d?~X`(&xcMZR -=p+oifVF>|j8omD6S|bZc_k=oh2^7qgW)XZWr5rPIrbKL23LYg?Igc(jGX5_eM5!R<E62r1ImY>`M~Y -$=vXtjLNet?)46S9^?f>aR*Wl`B)Wm%lrF?5}mEK1t_Q*xs|9Sl7FzLBb|U<vha4dD?krWiM7(LuA^h -Y1@m}%9mdiCRlToIVID5TwJ9mP;ReYZj{KaFGW>MN;^qqsl+x|5_W~vV^|CAg$$<IjIQl>{gCM!o9EJ -eYuT-KWhFCZwgOw0A_=o-6*>aOzil{LJr_5<9l7AHiHK@b+n*3}Lb`RuXtr1Q<kVK%%D=93mcG^Q*-H -&Pp%iChA+ySKQqs{a$rM7&sid@S-_5bD%yjy%jZztfjgh%}Dq!MxT2^Ho1T<sX%`jgTL<TCDeac*GY% -tlebR+$SC-|pqysxrS7l_7YcnAuUC@-9)*uV$KA!{h19Pt=d1Tef7SxMCjG^vd)7mJ}+*(zG67d=k-{ -JeN2e*5DvLly=2kH?S037?)ejRV7w_KL{);{_=+;!>xKdH6njQ2SSz%$KPYY9`dwx>Uh*J)U-%WIlT3 -7k0Hsh}TU`=EIi7v1nUbEExO6qUBNJRlO4!n{JSTqZ32aW67JHE^WFWj@TDPOLu%Z%+#wevAdj8C|O1 -fem8^ZpH`b8kLiGCtogTc_87o8cZpio-e+ereR*~!PiikPIu6OFB9i~V5-X`Q)Lo))Fqvldu31d3B?Y -N?Fm`7qYim=nfobJ~le1(i!N7E?GjU}oeuWP~%i~&wiTy&rEceLp)k-Hwhdn5>wW-8n{k<4wcBdT5O0 -dEqGlp5_UZ@BsQmecfpz>H^6tMyxv}9vSE=gcirqIS9tKw#SAR!omYrq#W0V(Kxr6{)agA!lgd~R%{i -b6=4MAO&6CRHdoJ6&$3;wpnT4=~^(V}?}a$dxS%5E(hL)t5R6AWd7SQD6czoMOTN(KGFs0ug1l$mE_j -vW4=n2-Q;K6!!wGyl+-e2X%$oQ*J=w589+*5lxGr7S6;ywj9HtRemvE;*ZnoHCQ<f(|J2n%)oo?n}rJ -LiTdEBTwzmu5{ILuvCL%f5yQqfx<uljpt1&BpBg*mzR(HpLv9guatS(A(q)>U>4YU52e*6x7xE*4gXh -8EkQ|)1y~Ln;6LLceU!jCK3NewZ4yve?aSsvmxHi3b=P)l3o+K7C#)`8?czWKWc4<-;5JSo*P6rGae| -6YsfR)a(B}ZE8%%E3f{_XQAoZZ@o&hd;n3Oh7Z*rGy;s|D!i0c5t3Th>BBfZ#k7sWmDw7j3NigfgJ_F -Z@8fh}_cheZeL7+hw6P^}_#df~i1m1ob$W4UF41b+pbC=X#8K8{&Rcqv${HaD(4oWEQ}kUZV#*Ya>(T -OUS<`VFgYB1K1c*A*mmP%8(_4$}qjwJT+)o{A=Qg$Xn`T*bw`H#;*d^?m%i3Ejq=vSF94FFr7eTl~5Q -HzegJ9lcgj@)&dO~TZJUuDUd5sD<TN&5BSQB4d!SO3MzcyqmrT-%xg%^zqRvpc=<+>l~_+g$zUsh(yO -jSui2tm`?3?;m(i6SG8Z(=d#x3B+!*t(*AR^$>)GX~)$Bwq`Nd`bH%R{Q-yliScJ}@ErxC@FeIL!jQj -w;57P09;MzFj`RfL1zfXFCy0H~dUfPnjnr6<li+TY90{suQ;OVTxAK{{AWCh=(!_ng~QF}z`0G=9+8+ -8_^Z3vT?q&AV|n6*qOGgVcql;l#H7$V>-H$$UV09|}hB1#dOUke$h_BoL%aHhPP1dbVUjZCgeMmqItB -X_U<@H^K?xDE78;$8D>puX^^VZ(^2{dBNpnDu%Z!GJx|;xfevILuK^{zdl&fuxDeMqylYf7-kZrLSL0 -O2Q`Lr9XfBbZ-imb8YwEt=uAh0(V1>#EY`M!lv&WYF1z>ZVryWij~sQ8iib#cua~Tb&^uBeIjT<pdDr -pm&k84fIH;3rG99;8L|C?-o>m;qB~w*u>NWz_@s{cO>g&h5+xz+A=IZl}5Z{TnHU)Nxc2K`iXJJ^YK- -K8Bln=dHC8OJZd<WgYkR)_N1$e&P{d!DF(66=hp|ME$wKfp57~HewNhoO3FRJkx#YvXi2$e9R_LeI4x -Nj-Qb?EQ{8Jl3nQbo$axh1yHb-R0Vt!Y=@G_W*vbXxC%B~Kfn?l&DfedHK5A_{J~L1&(yN@iyY8d%z( -qbaLGr{^tU6UXvxz;_!c{S}ey^xSM#0BZ#i(h><{CZWNYqhNICLAx>yDNf<`>V=<0p;hAqMm`c1<8vM -yy*g3*{Av9x>Xwu*u^BsEQ`*%7Oc|*}_(COmMUg_Z&ou`G7rQ#3F6$8qn~FvHxZ?cStvI)5s|${>8;d -#72UqYw`90c;EBe|et`o0bQ3FNPo?3EvHaM!TAl77a3JU(eeMK8GFNhwQp;e8lf-OYm2(4Z`Xx7hxGw -EH;nRRF!HGRQ&v#mTjHx<`>bLJFRs2$yw3(i(5pr@NaM^}9qbl|O=WEAy*b)%ds@8L$T*{jd#r|vo3- -^@SH#iy$`|G0WL|192q6dyj`i}zReZ*By>6BM8L{QB<Wdw#x~|MSc3-TeLh!~N&}NnPLmI-iPID)~UG -f-Y~<4m$ODjs<!HB8M=jZ|tB1rs5-U;tm@h0}Po{PtdkVf{`OBfnZrxsHK1JTdN5um-`rMT-@t$g0+1 -5L`_A^+8uS>$UXmbRgFXG)*;miD<GMz!I$MG=V(D7lRRW`YFQ=uFo@@M+}@~17+EU}IZ?d*bJvLJ*Q? -r%Y+BRhHkDYyG>D?mz5B`+RQk>NiXOd2DE0lXsmg~+@1HL5UDlm-+u9Q?^0z57%%rU^5}N}w?XBr{#Q -iUi8{+1D(-|LzGwO_?pkE2pBWRLhy~QIf)iFohBHm}Si@xXcdZORRmp}gkNuQ+ZxqqI70bKCI%O8LG` -MG~i8heN6h%Z`j_1r(FyLG~yVMnZ)g>^%IpferyRo6A#M|BMagF-V^NvK^M&78%*Op*;~nM0nhFL#P{ -5Q=@znxxj2bDeHG(PQ#Gpa+G}Pgf=V*5$hbB8DXY@;Usi@$--R$Isy)U_7W}ie4u!?CWlnXOEjW;fu` -XC(>a%n|e^7A6e-~7(D~r`HT19BE6a*gQSV6WiV(MY>(j9Xmmc74)^x8^QRV#KL`vuQ(NIfw^dmA{4x -z?w9uY{0|NyPdmc8h)aP(SCPzOQ9RDiyX^-~Q#Gfgj`|DJ}lbQ<>nItH#k!zzm^^;(^u2F0Ts#l`aNf -uB40Z>Z=1QY-O00;n48F5TD_$B{fDgXcuoB#j}0001RX>c!TZe(S6E^v9pJ^OnbH*&x0uR!SfNXF#KQ -ZDUPjgq>K)A*~;@n<<n`zb2B<bvX!$X#Z4X^FYV-`;uP4J;*Je0RLoS?vM?U@#cW3xmO6@V4G{WhGnD -$aUVyLUgrwvw!n)BFd_ecd{J}21m=L-iX<3x$Aa~oXteJ+15=b@_AdYcb%N^-$zI4{kp!sE~{((=i<6 -#2#b2XmW!^et5$=k@{KII-F7W?>9UheSJ&%Szi9X7u{KYQDZeQ<vfFQ^`LwOu@@|`VEB)d&Zz||cd&I -rimfLLhURFijWKc5O)bC}R?V9zvoa=6F^QM&|Zw0@e(ccfR-pHSKvh5rI>W$NdMZJMe>Kf%XFN#LCtt -|lavNm`c9SQg?^2JIPvu#sv0ZIFbXt!&?*IhReRo!gzb@_{&;m{{k{Mp;*-@g3e#q7m@zkBie;^lX*F -DByR`!{dCd;9Li*Y4Y+anNj5$ZaDRInI^t!dr<$EnZe{%I(S19~r4(JvH@aSU^KnH-oof!EL^{$=#wb -vc(PIsRTUCw)<{XSGJbCTga_PI*gL9%eHIE`3^t5uDfsQT~$oPe*mt3kWC9OpRF627yFl0+vPxh@bP8 -!9xzq>xRP@HO}UmxgN(56t9G|V;F7<3h$-sZYF+1rZvWe77qfS-0HtL+gIS&kMEtC)`49L9pNS3)h+7 -1z>vIc&-pybRZLzJ~{`U0qF26Qoy_Vg~bS<JoU24^B)}I5lO*8?vKq2K_Ot%L4*?UG(MECSCQ(q4O@T -hc=S9Mh`m<|!G2Wsj%?N%<zWeF|Ch4nBJvwv~%>P6GkO<bt}iU1@83v35GZjo>0(b3Ut27~}y>|9(9z -rkhGJ+G^-sn^4a7%n&6Y|*V}tGp`Ka<&1Mm*ey-*1JMtfj2Y&`3;hGGrR(L7cZWF|Mtb~ySFd@^X2Oc -1WUy9NWePnYG8U3v8vmS$V?EU<j?Q&8(9hJ|MM06D~GLEL+3@k6s=qUs}*%q0<Kyyx{&e==C|9P9Usr -jE?e)9PkwIp7ytEqOwdLH{MZgAV(=;dGoGjq^!K`kS;1bUKAxQZOZF81cl^85=d-hu<CD|y(-KyWZti -tmN%i58XxkMm36ZaF^L?uZlBr7Y&F>=O4|#@c0B?$UWI*k&=-p^WR5Y87q1a-bx2;g?m^jmOn4_|QU2 -9a&{{S1y`0R+<DdZA%tFkJ)*=*Fx^>Tt!fh8tFk@Q3$Mi2;866%LVGgT70qn`ZFdcmCgOJt<}JN8TKM -rd&S=ogsX$US@<xlK>JmL@)=u{*>DxU?FgGmJ*UHeHFq7inDm@#!bcpC{svC;XpN_|N#uLAIooFfvd= -gdFVE#8mV8x60d9Z~yS)$RNS1x3&{kcPrV%mAM`*@dl<J3&E7;n|YB7;Cl6$XvG(z_Mys;0`)uqD}Vk -NV9!Ia*B_;~Uq)a*3TnR$pjIEHv!4W=)ukQ469LlRsxF)c$|VRtz~|c%$-P<_=t=T-DmuLb$>HS&gwP -F0E3m<ao#!?!v8v8!!d0xv+ZilNLO38qzgq!QT*5cpT&ZB2aYOV4{%<4mszdo3*5P6$WZv#)C657ihE -6V4RSEl{fRzf|q`tvT6rKr&200P)y+DBnKW_1jfRVe!MZQJ(u_*x=u-#NQZKk`}%RRB%Gb*dp0+ey!8 -G2UV(ryaUA}A2hW!av8ldoGj@z6}auGzJK-5G8}?K$ol#FrN!_0B-vlqf4M_S{Y{5NH7TkE+g03kZew -Zw(Ws96#`%F$l%NbQkh@sh&zr0z@+O(jgZ>&~v~nU@iBjI<xe02K1V5f^MCOXTp;+1k(oW?zD4e;`^2 -rFIB<oG7uUr9@d*kG^lsYLYf&D$6{Vqd9$}~K%}e?R=ZnwD5HnqXbPDw?EE|3*9gRpqjU{~W4iisDHv -I;%o~u|TcRo5bkG!tU$B0KkzA2Du>&9yG=OGQ?K-*1#CN!wZcCVOaa*p}L~kA_Gc<w;Vy2i&G2fMIKw -?E8b)TVVi`Xoy3>KCItt|<MnyIVx9sy~|9;)GB3P+_lL*RQV?g2uMW4b`X)p{S{Q4<>C(Fk^g&(<PTu -YT3<0<<5HKleT+YhiVQY`cfi(V#uGU^G^ID(VMNcxo#D4lVmD>hIkNWNG@jTx!;Vtzp~2Mvw#fiFf<0 -B(-7`v5kSx-l4S;z`;;Xgi=}y0o%cC-4sCd*E<~bnHa=yhN>S!|J&Gdkw@Y`fUXLM?b5mfs@H%4jd{} -{8Fwr37vNkSY#K<*4vd`XQlOyD)}8XbL|o>ej%=htb=~YUaZv+v-WwZ&%QGG!Y-AOHKzNdOC8?D=Ko( -AcF*_8R+B2uBp4>u$LM9vFov`4LG0EmVcV|jnFRxd$oM6CG`~h|e=%xc^4mc>*wtv8Zt9`dZ<P#q7fi -RJazhs&10PWWniKv-fnUA!K!fPZZTgE2}7&E@j7~9yyX!w_5AVT1;lDAYJn(z%VBYZoK$^+mUZ6Mt$V -~mb8gamN>Y2d0<ETucN0vkN+rK)8g8FupqVD=BcP`DQ}-n?m*Xe9v7KCfvtb1~x0s~l!EXPXO5DQrZf --W9NIZRD!H4YV!(XxeFIHwydgZ>CTvcmeb1?XDvNGGSQWs`|R#<fu(kM{lLLg+&M?y(z7YkjR4ePvr1 -BTHxQld-vwT?-OgaGp(L$m0$l@aYi|Z^<3{Gwt%0I@J60Ygk<5rkRSvB@-2WXe>^k_B{h;TCP*3su}V -(0Joc5}^`y)OBS^lFTT=p?utdVMAGFdZ*Rfii{1i}_xKQl+Rt{mWCWeEe@r^Xrt#D3SrJ1Xz5FlCo1e -w)P)<S!u*w!7e(-PSvS`OJ7hXMv`3m`pTBguqD0E9FnNaw*W<W04aH1&fojT%8!Klq<fFopm3U*e8>? -r*D+^36kr9pe^d8>DesmG53%2wCNGGJ<wU<3B!o`x=Q3*eP@Ygi63QtZJn#IIw^oN<ao+7l2p>t5h## -2|bI*T=Q3B)6W(wK<6mnMU#+)C72*tTM9t8YmrB@J3aKXS+1A0Fx{}{ftIZdWj$<`%ubo&2C)#Je}iq -g#f=Sk(6YSV;oeUhkhX^?9-{<<gcM)^0p5-;E?yzGxRpRAEbq5#v8jvQ8fA6yhD_nu93uMwto(gmu5o -^|bfFkQ_?rW-zOkxbUKG*NRBB*2H;>?d-@N?q-@ia98M@c5>fO3PdV{_EdR@<9S&`g}Ur9*e5+rzgP+ --e~{T)`N!Whzai{dhg_AGcYO0~HdF)Te85vze!x|6BSf@)b$aB-;abPcosbGec2jLfm4GLsn#Ij=mzA -}R6!d-JJEZz@Dj35oJ+%R^sLj}=(lbXIxG+o$%#0EwX(MvBWkMN)%?9W+QXxnN(NP>ehq#CmYjpW_$v -2_`8Vfc(;FX`@yA=iggoObZsrtxcf?4mmR`WMrNuAXRQ*Y%`EZS?~9?Zu5M>&PBb%$_faE?9lB%j8Gc -|iLxCNng+;MU=PM;HsTm4IS^FYAaNmWwqisOCRkydY?i+J!lRO)e6eV|>xe4xE3rS)QJ_y1%it*Pai{ -TvZ-#Mp7{nE!isVQ9Ct!yN{@nF8aiLIhHIC8jdWW=%&m;0pp$@j_6sj+uULji?q8srTJxIftHR5o!SP -9R5Qz)avRS0Qb9Z&McF_e{^%(ElE`z;a5ns5Mv4TR;W4^SQ(oH1(PUr%JmPiMpNQHUYG74)N7F!6}O3 -h5n0br>K-pVNr)D`}r$JVez6jft{_)smtPr>tF8=^{?k8Z7JuYfE>%wQveyQ{UhmLRF;Sd%B~4ma=t| -f2ctsAg48f9H(0a0c3f2e)R7ku^Lboj|lNl&x5u20n_?mY2tez+u`GOh<ki_4H~2@&TzZLEnk*s97B$ -dJmkRcU!iT+(dq}}gbvp#V-cAKevJG5NPLG@F^~dijgnNefIXxUEJA$@-tZ8-q;QgnmxL38lB%wz#1e -4FOrvI?*EYzvu*2qBfLN&U7&MvM%I43z0u9e~NodW0ce5M0SF+I};b3q#k#BYtTX1*E)_W~0vWT#djL -^`0WW{C*ig9eSsKH#5{h2ow)lCv|NSp_Wu|fSzE@guPDbbIu|B_{O6tc-)f{IS7^nlh_XSI71B{Z*Yv -L4B*6qwT#64|E%f{VD5f079^S<0{B8jMdf1)QOwMXAg=N+MJG)r@t9jaDJ79_EtWXPLH<Yni}&d=2Uz -t*qOeg!i`OmS8^QW{wXi#{zu<eVCp4RcLS#f<04Zi<sKtG}aBeUUnVhr6`v$31p{3V=@cQ0SH=Iguom -W6N9u{l1NEkgXTfdb9xD~alTGcm&Q-E+n}pi9>5PU07I+Be+z7IM#%RU>mxF?vuQLHHRDUWq&lDTjEx -d)ELE*YQbD@Bb>~?YQU7Bu!rcl(c6zwU<5ufWx#N!DF0-hHHfW`W6QAi}ConG7Z+OjQ1Myh(eVIZE{` -~QR$OlN8j&2`F*tRw?Q;M)CTzSz2>d?VBWN6Nm7;1xhuEUj@CFbVZx3u<0Tss*!@ko3vfiG>)e2X?LL -?-SY#Orb$%mQjw)pE?9T&(h{Y&QnNJ?cG3tVUmOFv9)A_z6$VpJ=V$3A^DJ*!noM3+XT&TyV<F)JioF -=PP+-U5<<<F(igXy{kIKlQH-ZcVB_hwhE-`j3TQ*0SBraC=0T{wY$X%D-5p7?g_`qkbeq$L~%2j7`-I -5ls0IX!g9Hf%u|o3p>+;SN9}JGTV^EZ3UMI%XAOlAj)qT$6LB)WoSyg=Mt53)r)rFst({i&3OK*^GIy -({-d(S-f&*)nH^rhxCtEtmX@aA_m7w0{=(Hvoq{Io&(NpIz@kg%Nh1`E-;CvT46u?dvE^?2m$^06GZa -qm^cgK-Wz##IIa~~$^QmAo8FQMSz(}c|lZP;bClfG)wHT#rc_M-%8kT<KM=1~_CF)9iiD{W%H4I60;+ --!_bfZA0hRb)prDB!51*2dIyn%!klEeudauYrzK&C2aeJ*Jti8ve;u@+;u6Um|vcIW!cCWz0}bB~^AT ->ZZ58sid8KA7Bq7o4Wy!F^WfnUAO$*Ag&R=sbqIsH#Z@w)a&$^eS+!7n1h$FN{F8Rv4u51Y=|6+DSkk -?lU$`er0N)+=Qa7}*#53iB1l`|R|+*Sf;s_<?f-19C!$yDSFt`5TiM1Wi!^3QArFEI+@D3py1pg%ZnU -<YZ-*d-mDJkrQ7#Pw@KBu8nh2}Bq61VS%W-h%?p`{oJO;+r>ke?JjMvJkt^g&GNi2YZttwsao?!*z<a -3@ye}m<~W7=FpPOE3{^eUc@)BYKa3i2F0yu6YXg9xDeMn@i(AxzM9-F3iFK}nTHQ?i7s1PM11CIIB`t -Yr2z#%d+ay=wxZao->H_o-7m$F>Ij#!=(U#*V92wa*PZz{vPaLiB=|KuJd&G&!1JSDIhcy)q<Os-(Od -4lEESp{B9{m>mn9%B1a+lGs@)JY+K%yz^x*>Ih1nop9xT<ysX+5@0thnTvgRsK`p{fiXNNsn%%)WgzW -vAyt+9#E6p^S_2$*vq8gop`}b!8aSBD3l&g^Ay8sp?<km~MSWrsntTS-4UIPJJNtbpN@GtU*Q8kvr&B -fFDUI@RI}Duwp^*HrkFlkM?8uH5feumY+;c4cUMMz2cKgPXw*-$DhBfoEV-^t{xD9Pbh^-jgJ3-cQVd -(Kk6Mw@FcLELK=hz0p87Lgn!m10yz`&!XE_P^203tSh@^o<X2M&I7gO#`YZP{aE0~lz$*JqU2`k6AS# -SR-!HTrp1cXAXRxEOiZ4Q#28Fi-+8a#wD48@6F|<-7#>f6qkYhMZ2UFv+fq0F=Z?R&q6gUI#ER7zgwY -So7l98l*^606LEUL6)L$kJh&U&<KebkDQUQfzMr#iKav-tXL7`F~yMZO5y1XAo*_bR>u{ge^YHXd-i0 -L+Th362B78=cG|LT{B2O#Dqs#X96oy&j#B|aJk9v;69FYsoEknxOX)H}Kd!$dSOHgd)sgcYqc?2q!oB -Mal_er<%g2&2(;VXIfU*6i2(JY%Ki8q}L|x(ZMqWb$;2AWpqa)N(&l_#sL>`U+db))R*$KYA0GWco&y ->e_<^XP>4<PKUDTv{ARf4k3em!iBw=-FI>)K2@4a@SQa}~?p%jP_U2Vls30Y#lS>KW4t0}XtnLE9GEa -_xYEKkk9!(O(d3;kjQ?d>A_%ZR<3Hf8Eng(najL{uD5SO221lX^m(;3?7LE(*Uy`ZrmZ*fq6EdA0>+h -s0G8mj?I!dLfc6Tyas*o?8n_va5Xa^HX_q|2biFpYC5G(O%WE1WI9E3Pkl2mH4La<my5Dn?@^~m=E7Z -ZBI*{n6H!<~6fxz2(s5ugTJ#Yh>qILG$4N597qw(zNU0H?oN3pjnq)IcesCLkCk{pTL=!Yh&#Sut#_@ -KSu4QTc!Brf(9UqEs(7_#jW>8}Q^+G}%dzq3^3pw9ikA{z}L_BK8Rw$;f8O~HMK{PuXCXOi(L|Kiz*% -$}>-1n**2^>c4RSRVhx1XP)Z0MMEEl49>urzcYpYQD9bsV9Iq@#~hsyCxVMCT-E$2~$v_&Nv9jt^dAV -J&?Y#O0BO#o3KO^Q~})@QF6!2|6sD<{oz?b}ad^!yX7jiW3mUm&14$ccR@U0eeR1DOR=h_OvLP89y8F -v^~)QAfJGG<$;(mo>lpJ|BH?9<&(D92oVfEWs%31<Vbt$dz1|2bB3YghkEq#<Xln9YVTrfrHoeYE~eS -$2hu^BpQJarNj!1-2^dSF4+l^mjb<1Hw~?rHMl%tY2AX5V;xdU=9jR|Tb2?zjoCdE_9gbjKjRS7#@AL -N~+ZPAo$t;&Xq#(l7{gk03GHP(SwlWZ79)RCh=BUK4L#-RalW>71<56fVfPGV**@`o`55T-VbdlpcQg -k!9P__-IGpOm2cij!|)&9YL<bo2DVx~_5j`YNXaEOA&f#TwXeJZU5-b}=9d)?$kptZbf_AKV0sz4$mT -hx$IK`o1l7k8j+b}fUlO2k{+7U?Fc5hx<&AjQbsigVf^p_)N*r2G=L0Q#WYWD*LL`wpa`um+!`(&1}z -dIhDFJQ!UThytMJdoo}s0-`?7XH3zhXA&^jeP3Ay!ZjS64#$>F<&4G7cxmxoiUfx8w23d_6Oa^Rkz+t -28B0O!UgT(oiIHQ$(di5hRL9kf=7NGkFQ9|FEeWD*bC_s%7Fi%$nF1DN!pPKoC2hq}{^lBpmBUNg{(K -r1N^65b65u#Klb7smzIV<#FjC06il##V1=F3=if+((ew`W(i$IwQ{cpQ^tB$ac4ae;|N&)XnG)KnMZ{ -d+I69Xv~81ew$Runsp#+ssm7RZd9)0r*o^JpBq4leQiLL-Ma(*+riJX*er`K^1d_<)R%KD?4Du7&*cF -&OfXCH;lHnuC49Aa;;PaoKoF*WW1~iD&4znxGc}5JJ&Vj5%`b%3KBADcVM&^6D@8ut!7l@myA^wVYC2 -(7BW9zQ5znfuGrrFtkm6H%iv)(P!M>johEBtN>9^T@dtgxDzyA?nsC+!Ju0p>tZ(FyY8I8nXlQgMoyI -1BZOs;d!UCYs8J{5LdsQ5t1cL1^2n+ZX%?`nqZ*WuYMztFNQeEQqeeBwM=8{>S{1uux5dY;7{<^>qyX -4M&5zr0LPEmb_JG)wUc-sAQ{H#jdLG6?5=H_2LwfV(HeK{S|922Z&QWM70U$9SuWKu+xTnmO;S<M%5w -DL)j_GNXD8mpBP!_vi^yegHAw|XANz+&=tims8a^QS%9=A14ELOL-zJF2~)RhRv=ZsV9qG$Ck1Ngn6# -yw&`P0EWPCe<Eg79${W%FKZtwB2^v)l)(h_A_1}1kElgXF>ItccP)j#XcaM`qzvx+3UU`jzV-e6P4x( -4;(E1(xi4DVoVyBfXN;r4=0|YvVqAaG?Hjh9q2(Y`pbuCl`kJmQKM~cn*iRLV83b9J^-zj`6@n}kO?L -+dmJYttOga}cyP#!${g{4>eFK|^?(e&Z=Kn|4GB-kOO6{nv;{qce*S8NB!oUic|o%#*_Tms9ebP(r@h -Z2=jwz1Q_6MG3Nn4M>21blDcq9nIWyOma#L=%u9_d5O(n{g7{Jx0GiJ1S`cNOq*DpgWbB~1?6DK&O5Y -&M%8uuj@&GMocCG64oBm3idVB>TO2fbjMXi9qWdf<K8Bd)0?zn^W51p^c)XuOe>ToBI<HN)w4Ke{|Q{ -p{+e?5oSC(|^7CYWz<_H>jFjWCxDXx=7a+2f4OqVA<e@C#}$OGvQM&*TyP~p$!vZUO4jy!z(bsBpw`+ ->vB_8Iq|q+M-qD{+hiXAREw?5@PW+C6W7$-PZ!D`)SpO0$Bw1x!A^bOVQxys0lk_noBWy*tR(jk?6;o -<BP!8*W=jn_U0p49jhZLak~7tjfzz3AW8HL9qhW@o{<I{ni<RgnbvXXLSq(|oH`Pg-$pNA7`-LmpL5+ -*|5hD1zg8*RYGh#d{r-y?8H0kB7Cm=>t5hMgT<ea!r?2REjZvRbrvD}sd#u7kxNX;2Q5{K?6qFFS7OZ -|ZgD%+8}$O6qUK*<3j$1i2ItTDVKEa?}#>r9zD`za=U4RPXD(V2xu5zXLi!H3lPB`OR_fYCPO7(6s95 -99S19MM)SVRsa5q|z2YxChCFuDZ3e=ZB0}kIiUjN*9A(Jha0D&crsb6irc(+8v4_C87A-X8rvrg8;pf -T1EkWiw8EkPP*!(>IaS#qn{o;oK3!{+q;ve1I^ay%&a?(VfIV8O`I4%ObZ$=p6mD^YB-F!<hcp_`A5@ -eAnC(s_)`Jysq=0<2ZRrfwPZN@teJw87<JFc)#zi_J0BpUF>r7+&9N!>L4EBtny5kCHZ|sxRH<<(8eo -Jpj`H_I=*t;fYH)wu0l;4|9(A_5?i~B5K9PxsiO6qoc#fiPmZS4fw7zHxD%YHf<DN^<|8zn`g~0k|rg -Aw_NZmxaHBf?WcT$}G%hRV`@|^)&^Y7y~pY*PphoaB&8RI|rP&N~yO-;MPQXtb9RO-EHrh?{2cC!jv3 -*&OirE8an<(m&2`mb35;n3OlX1wCAc9AilIGr>m^uTI;h*D3NXH<&QUyR27K_c4{neMUNbyM%Qqmx)~ -vPF@%?Ay#V@Y&Tz*|U^y&Y7dKTGS23+1$S+M4Vn9e8uIf?he3srPQ4Q%>RRzjya#%zfDV@sh!|Lzd0b -5>Lih9uvq2F2haRpxt-go8aRk+FbF7^NX_Hn%4}6k;r%`D$3xQSnkaf`Wbd3zOnj;W=PP8MP=+A&=cy -0_C(2~k%1k_?=vxXu-g-nq!MSJmW9T7>2?)qnCfH%GGzpU<{>)V=%z_McpmdV;h&kE3^MS@;Y#3I_h_ -h#Z`|kIz-eA;|wRk9HgtH;L3Ggr>HA0S9r>o$5JalHM%VK(F>NoP-vv`ay^XV^7r~f+3uAYpi_ODN#O -yR{4)vxU3*k-<dvs<q{=Rco`-jOXYR~cbd9Jk6FtJ^-K1KKKQES|=ovk&4$cAde#Q%_H`6StZ(9InYH -LBcd*bi8L>SCj}aW3Pvka1<I=IX19*MoA-dL@-9X=N0)Z;N!f!-qpKyy;m1!sN}wu%E}wb{hXev_zRo -sv<Cd+d)Pjy2>g|~gTd+GQE)yGiwF}DJW=*IzH<frNO`$7*DYvuQ*Sr!jOu+xzv9KBI76_}_-n=b6nV -^gQppm@eKyM`G8h<Lm)!7Xvf>?j2{bd)9e1~?rx8qB^wK`^A&Jp&Ivk(zCa6MKeOUTLCzSyCOy^!lWD -nYWiJ}!91j5<(11J`hi$&Qe6mX)KMp7=t(Qt-#=IKxa_hbhY%{1mV7-xzZB_vL~O2m?jB5ygE5RcVk0 -IfK8ab^yqJ`scIz)T;0adKbjx-m=f5pju;#<nn{%r_NyJ{FboUh}0W+x=V2TGz4#vyy_%);X>@6(I^A -zJL4bP||rc&PqI^NI|qKnHPYsFe!VGqQIPaulBIPF6x4PUMvu+JqLqW6g0~bb=lY)ql)q|!ROqkDdve -LrC5FSH%`@aI)_cEC-M#2Q5V-`#tsFpHByx?eXv(?qO!qah4ngWlHtWNm@@`0ayeAhhEAXd?G&nm*e8 -DSKbvG6`a&UolQ>19=g9kF@_fv6m(KNrUyx3116!6zMlY1bJIwqa+^AwQy!o&7ES;OFb;t_XX74Q|8m -P)#NMs!(E;M`Y0#7!njrRt#AE@*~6mDua<A6keedck~fd?iXzdyq`W09mL7nM%>JkAR8h_iw`^^$_{A -#P+yKRmxsX-1S&Nu6O)q9t)IP;x1+$DFUDa58e}i<{mr%&ks8EZPgMYm3!7^%xSrEueC}#Eu5+zT%B8 -C*<Os9TJKV!&C3B5c2TJS;CGL?0vlT<FM4>V&GxC-RaCTX@5h~KOHGCNGUE|rL!uky~a}w;(~y+d0wE -#kAsVEg6mBhs6pBjjtb6!#C|TrL#DEB**E9D@3+a|kMmL*X}0YT5Wru5VnVc(IgO?W!O3)aPp(4FjNA -9M--o1s_XlRUKkL#^XDn<q>{7TpL{DgX)Ve3m_x-%R>R{=9q~kAT74sL*f6A_NMmG%e?%@wFMO)nP(X -b4s2&4x-(k9Q2k8!mrMnmZfC}2|MJ1m2E&yik`mF(ysAZM85opB<5-pOVU;<Iv`jDc!@ipH1DMHMF>U -Fz1zB2F%j-c%EQ{!agPNNnR2zw*&4%r-errf9_MjQ*)>ExIeI3$uU#FpP095#OLYY!a}RC7upwW$Zvw -V<Tk;c<MbTo)yBxlk@1nv;Guk_o5&SJ|t!5JYoLvDT(QUcrWHa(itx&xKk5}^-ve!W^2>Kqb~ixllNN -q{9|&|12$j`&cwj5mL8ME;5pvlIaN0mV2w?FH-!ap{?AXJChGk8V4w{QCnM<rh4vXHUEZ~$ctv4+w%M -}v-XijO{a$j4G0fxA>U1nPQFOK+=Q;p|=kNJ20WCt@2U}Kh>24B&oQZEuCiC2w+4BIB8)jD1)h0+{;` -?fi32kn*#XA?@zIgVvxla|%W_TVi07i*QrB=*us`^&sIAx^ymm5C6PPq(lhc#m;S$_$D)s*4JjzWdHG -Y0czN3SrUigRm_o2UeT!G1^+rD%w#Zs@Y}A$cLO*P+KjEx!9UG>7VvnF#KU4*UokPyc3fc!TM+^!kXv -JWnK7j0l%THKf0Yf4De~jJf6>QB1l*QZ~w@@G;QaP;OBdf1)Kt8QGv*kV;p9)pw94fpH819&tz0X(Q> -hc#c+pIcPeZ!VdM;Ym@PRfu{kM6qu8`IEa6P$L)Ze(u?s!`p&&jIy4ggxuOSa^hx0fX1(GY$37TagN3 -Qf;bmmw<}RnvXj**-Yqj2W4{HV&c7ayJFwb!;mnrF+5+$;lmrhXs5cI{$9llO$cJ$@kTY-)fNaE6UBJ -?F1o>-qil!>Vc;Twc;Er$jX$=$AK?T4*^L`KBtu5oQGRrwC+Dr3?(eOBxR3MM73K*CCF{;XqqbBFwyB -`M|691Zch4rGyZZAU10m@6G9GmOrPgxp?p`LBZVc+FU2iSw%zp$vzvmEV&Yki#%W`2Z0p;3R&u!I9H@ -_huVG<!=qXEePm*pr<>y{M*d<JZ~u&G&FF`)x|#k@uNH14DU?5mCEyk=R;sbqd|6jj1>pbPISlJTQzb -y7`tI(rr?!3jodmNWx*#*HR{w)uFq7#`&V^fz=_afBQJg8R}r<8*GUIhvYX)A3)CW^samWs<9$EQ@^D -Oas}9!cA2$B*Jzl;P73~qA+3JReR1bJqlTtR-)U-08h98p6a=X`;*m%7h;%UUG_P9;AeE}10b$tc*$h -;i0t63N6KYhm`xi+POIV0>k{LU?06}ZcYieq*!|CfDM|MZ(DljF00JOAq6vqz6-KmGKl>6Lb0S^J@bZ -En_2>IJm&`}~Fy_+lm@6};J!TS6J3F@YS2;Uo=Dh%&?w{@1SR+ZKaBoNU0Ia`#L)0~X))(#YGU)Y<zU -pFR~Mj_Jh}2ts@_#bjV^sP|)Jft)7`O~Co0L#Zfp$=bh`SK%pZcXOYl)D6At5fa14j~}1j4GDfR@;wM -+t#K*W08Q4t_j1#0+M9ROMXce(#y7E==kNF+aijeWyj3X+Hm9mVJ0tBLXUE5wSu10xS>0S8x0EyN_*2 -g`8eg}fHbw3IVe<p$@*B|-Rt0?PpB-1?d?2RwgId~yf)P3@*&6j4rA0n$PTQICk=ohw5affuP+mgL?x -`ir{|f>T{tqRPoDLN)adk~h$U_lyR=j!fMtt_$&(%3)zG%{x*50a^A9!%`j*q)Z&1iAt%C(taQ}X8m_ -yd&TD~zzw&!2wgpG|PA&^RsXBG_Df|N1$sma4!7)dIzP9-Qzxn4jPm3KF~MP95KTaLD)ITpV@o%(-7E -m@(o={u@5H>b<fI(OEx9Z-zeBe2_32lw^it6im~ZiD8NX9NK>g+A!)uAJuE&3eWNovY=Ux8yjitPC^L -43bqfC0lLP(@a`o?w$SVP8GiAKBR;;=qkrJF?!7mTzbc~(JkuA9hy6Fyb*^p}Hv-MQ_pATyI`c_SXV( -2!$p7s+^F>cz{t<}zq6ab8{|Ll<+0&PQ1Y*AILCh*|SG~&+KZdI}7UQ*BDg-hM^-g#(>s2;wGrGR=rr -Ct7C?XsCd)DC2yCswNm`sDzR#@9_tm53PesnqOoq{8+Mnlr`8=YMiEdVw&T(e@YpZe&L$-Wt*h&AUPE -Z>6<<Km6M@{s>ZuqVA>DMivlfGTv}*V5^g!}-nWl^&<R{+yV0rQrp0-%FPV8ljjxbByKyDllo3%64mx -@`ONtosp%Np2Fh0iYxTE&s2LPk835%J%E(bwI2QE3W}VMF8}v8SD%iD{g`y%groN(rh^uBEL%LtbUd3 -gd{5a-1V)|cL4smr{7m<a)-8Mgu#=DvkH4=oe-A_uD-XwQYYs;sexLja{y9DUE&k`T-_d_gKmTX^&*v -wnf7%qEkIyk`bcv^BpNv_8?8T4S9(vKCx^!^#{Udird72JbJkYaQYESxGb?@YZx`*b4lwD9&?PGnZ=p -X&!EB&H(w)8z>hj?Omkm~@f96ciWB3ciw1;7LVw&w0BQqSp@Z}dwpx?R2&8k87Gj2_NG>ul!vdQIDUx -wNy<`PB#cyu}NGyMaoj%l=NG?-k4`3d&^oOLj38>I9EoNIq{DCeR5!V~(m>GRi4Vyzji_VE?0UDCSXl -npJFSL6-_*yu0&lNQX1^!6S4Ct7qU@m~M}5u3#$*9%<-qYc?408F5t&4ZTj)?C9v_QYgy;S;L^K`w8D -k$Tv)Inle6!^~d2EjP-2zXZMn5UPbW!NJVb9+F=AcWy{&W*;GLHSCF-f+RONcEQ~wl_LZ3c+B||eHH~ -2iS56M%Oz;g7t+}d;+{W?_=|#tlldPv=>5njLICo&e0j(Hu%03fao?Pp=2$5*W%I9>+Hhn~P4T{*;$# -Rt+YO_Pag%z?`?+Q86H$CRfwd{PUzLK|i1PBZ0r8-f@Shf_ZA@jX0x0aY#TBrLxorAvIMBi&XHm%^fn -Znly`SJ|@(XrR6jCdkWJlDYR40DJ;Z_G_Hw?2745<jZk|8&Ktq<nKay>(Hxi@Yf~5P(-CP$jh`7HAEH -71kwI3%x>PJ_no!&8pC83gA)Q^ZV3;6Z}PaEPAsg`ziq=UyUdD=HOZ-cl0Pkr&CscM=6xK?<T(h=4!a -qhm$Af*x;3k`VTTaWByTwoH>g+Ok7~PK4f@`9O#bOet?E&^n)|($AEL__g8i-0qH|~q|Y5R^)IqQ)N< -)?jtp2mOKMgQuX57`)zL}Z%}ELeiPm?mRGV?S191nLW2A4bA5N!LJq4IkKFLhC&n2&>ckZD_R?0WgXH -H6^p?E|27AessfmOQ*uVQs4P6lJY=Z^Ze175oZPOv^dMFd>vgyHUH$1ic0)2Fd4b?T(yywyF=x7by>h -c|CIc`P4M;?rD5M`zZGt%30o9l9sLz*k#9=9aeyvpFKmbiv(Uyc()+T;81NMYpp$b<47jYD-+0bHzDr -bu^cB6_BD{lvebLz-PLajq>;NCiMSMO9KQH0000808trnOt%krnUM$p0QwaG01yBG0B~t=FKlmPVRUJ -4ZgVbhdA(TQZ{xTTe%D{YIuDY!j@-ooeQ*&J!LGLrF1tCbQ|uLKAkY$R^CF8nl8WOl_Wt&MLsGw-&2C -#1^@}BPW;p!jo8eHC$>dt)+)7m$cGw9m*g>#TsRy=En&qn6$gP<%SsBaAk{R1<HZvw{KAB9SjaGY>Wt -+w}T4WiM`&wzs_}Zwlu_E*DQ543N>7UY?+g<x=q!r!s(L~;GA+eg3rD6S)cj#n3&DDO-t0HZ^4D#W1# -#V3sx_rOPeq8>2#n>6E)UQ0OQOlaN;Y_Ra>FUGVn@=n3@u`N*#t7Yuj@;pOT}TaYqce6{*QNA0vbR!; -+$t@FiT<`)e$3unV*Tvx)kk*GDy3vM%Xz*N8Qzl#tWTye^>%r^yj^DRFF*bW&G*aI>hdp3=*4mTkLY$ -M4co|4F#Ojg&qcvp%+^P8k6DF17vzUvb|;uojm{BK4(Y~51JN{!ZmOK5$P&*V_|_RUO`Z#5HceR`Tl} -zy6ARXIRluYK%xe)9q7)VaNmG^3V@K66E%xd$m?meZX$0@1pRRt&#=CoWb-ny>`QB|0KAn4G=cIUE1Q -3s@eX=otDa3{yG>DRUv24%v12Ci&l1_TMh!}oEPWt~u3JwZ_$15_g7;vnBne((?aAbj`h^p{0kT(5A$ -*Ny*#$Mjo)R{O)sH<93No#Dz;zK-T2ur((+WSqvZYXuzO}@&AX+T6bRVAx!)>H*_9;LPoFGcm3oB;7r -AVn*7s~hYYK#CYt2+9;^iI{TM>(AIbUK+s^u+s-=1PC*<2OB$XxV1V#R$@O|@G`5l*vO}N+HXep>$)* -fLK7OP7iGV@U|V5(JCijxBG{SC29ht>j0OYF<A6)QldMwNwp43geg_j-5dzR)NPE->THK1gD^6{Sm@z -rdJazU`Yo(3jS*f-%CtJM-X?=9Xv~-0Qctb9zSL)pRc229DcdLN&j(JXurn0>%s89@Oh_{OGMbf^b>e -7Eg;%VmcBFm<pf*l5K_>{}T1rW+_I2BLZ=)X)n2VZMn8ke8r^<Ro*^i8{7$>==L<Jm4cu3!%kgRcUFS -OlowUH$xixnK`M)MSK0lphKgm`WX3A}!UwN};YZgdG*0Yl>S5Km4w(KK72k><3;zY1mGtog<F=Pr0Zq -yIC!XExn~Pb_G{Jd&i%=(OOiN9h80`u5@*V@(mSNRKSel4vclEXhrW8Fc44DCf$gm>n#lXowx$ck^AC -F<c(t^RYrHf<-8)=m#W%Aa7`+RLOSVeP3fd_fkBbVZ&vL01C|f7IsjQ~R6UJ@L<=+okMQ%1d6<pb3#1 -NKFXe+^b3$)!)x191ovP+*S<TZF(jSx+3)UEtqzdCIae;iLs=coX9m8<s-mHFx!z5*n`%+d9Ci-fCx* -X{y-JTpbSfPZeV#Ghsv2p9D;pzbyq(e|KPhvL8izssW)4pQ0u1_H%WPVRsDc8v~a>u@_C>PF3>KcUA) -$P(x`4sP4k0kyL^g&*Pw#3s0_`vKp6JV8VSz8mhM+#)_RHbw0nZ_AgH?k~LV*x*Q6~jbKP=7*)p$;f^ -O8vPl1{CbpF6d{hNxX}LO#e50rX{8$h41<7HJpk^Jfri2(j)W~XbENP1xm5y`7tv{CdBEanD&-^4TNf -NC8!1SUn`%T$In-ob#o`~`H5kL`j7DW-(W+-{|z|l{|lYAbSs^^b5ju)*}O4&PKRkpg~FvN`qZl6x(I -b?qhW+9XxqY?VCk|nRN$Pc-{#kHO+|iwt+r<F?2viau2Cs|gFBHbMT(Z)={!ntz-1tC-bJS57Ha#u#U -Jn41yF?#2g(yV0{hV2EnbKD`O5Va-OBM-@*^JaFAnu(05R2=JEu58+IN;GQ2H>@-dydZCMVoLhE{1H3 -8cRdEmU{C$_#EPdup<c&0Kg0Cw<}itr^>)mS22O6&|%x)<2HUpYA7tC+;RitLou#8ei|t`0x_gUO}BV -<0gH49i*rBlJ*wQTCN+qnRz~WeL(p6OVkFlb*vAEc(R&jZp&P63GvSp<0_<kpDftj<oq115<zjEZ?=> -BFQLP2Gx`NHUTicJ6RPoobqJrxq)lDGz2wANNRR?1hTBXA0&X50(Pqq`Bs6kRE!-&;uF#oU|B}Q3>KJ -UoscXdr^=Iw5@ZshbeUuT_bq}rzfnCG`*P^(4C$1CcVzWW#!qmna35~B81mA)+pLA$9r~x9HhPA^diK -5Y@xRDhv<v&HHYB!#=&R`)3;}V7&P2u<iTfB{NUUEYo;dW21QBU7{7J7L|2=IiCFjwPT?uOm~_YueR& -wu#Ra`p4;FO!sVo?9p0k~rX*hN|4c;s;uq(R0rYnRfk2d#mb4!h<v6pM!+M@500AX6Y%+QT}1h{kb`M -3Ue<&NRU4Wy6X?Wk_`G>hvXeZP{F#pn#3s(0+q#R12NrI>vkLs4>PsM<wl};f_+e?!J)H3leSY$S#%l -wN<0dEbp7C~&WO90(+7)0rXr=j(eekBK7f&nLeR$x^+?3Q6_wSE7PKB>7YtBo#>g~fu8EuhfuUpQL0| -Fmz>nq?`NjCgik6bkk@^#T6jK#C*#k#o2-j$7O_yfpB0@{l?m~U$=!Pz?l)1F70sgfShCY;FA3Nv#Ru -Qq+=o*>dYN*^TSK@)YF~R5a)cb@QklQ{_r>F613x*R5;9QIln6(Ivho{r7CVuZGHeg4*6C6S&zJKxbc -hY?`GaAP}^0FyJd@@WY)ajV-ripW84N)+F<8JZ8{aCI)tA@9iF7q}%N5VaY&Y#6doi;!p4hk(FhaHVU -M6DYf?~H!W?ie1MNx)`uKb_vaz8?c}D)LSE=tpipKU_!d-o0L&fH56?CJE=~zW`860|XQR000O8Q5kV -e`Y438OAY`4<SGCF5dZ)HaA|NaaAj~bGBtEzXLBxad97M|bKJHO|NlM(dKwSOF-1KsyPBvSMOGZmIF= -^18>fnf#gVu>SUi#iNlDjCzI%5U011*O*-m?z$VU)Z><hnr;HJ~*8<7jeYr%M)vim~avU^!C+12?KJK -TT4&WcsZYdMpdtk>)VUsTa_I-Sf_v0`yNZ|X*gIA(HH7OG}^Rux%Oi&#HTCT3g-`>k46_Uk=Yxy%>sb -D8maUZ|CQ&WgnX-cKgAS|3jsd^#FQk<aB~A|4V^*6f1D&y_0FF=Jb-RD7}GEH9GcPAFQs#je)%vdGzY -Y(IMGQcGo3H?_>FsHMwz<!myVhkqwp1*I&bgj8h7U8+<lk-nBm-3kVi^vXphXUSxOk_p95tccM<)Ng6 -bkK>%LK%>EA5*O7&%vG|Ck^BiLk+zbV@RjFB&x6?iE$#lofCsB4shBgM7i;e0JFa~AKhPR%Rf!)Zz<P -NnX|!P(O}1*jBo(7}1nK#rsv5zz_I6($wnVK}BmCk|f8YIM8lhEr?Ta8}KR0<TSK=2vD;V<fuE>QW1E -0+l`cmc_{=xTt)-&;yxRc<yDXKmbE0NdWsbFH%AbBZSdCr!+;&rWj5Hw_7xh~f+xJ3n1W0}tjFX&WKu -8|ff+bc^?%bo!RSQ%OOjH;Tey24Z9d!P9o-@N|w`jPeQ1l}f@^fs-M?XH#B^gc1~jk@#;M`8Gg!j1Jc -(2-F<rzW!yHW_%q)KOPnq(waqtYY(`?iPY$3`|Cnf*w0ToLxLG`drA|U-8nfY8Cd_Z*AiTLEs8(Cu|V -eSu>O!)$h*O&g89Nbpsk<U=r3;g2|kvB2lCw@Jv=O1zX9y(C{%**T_G|!fxR~DM8p}U6<AI&dvf{rkU -X(-T^1%JAey25|2=|v;XSV{_rgLL$<GXZ$j-#Ll=%#{BxngmV*5}G8x4RHu#y^tgd$7-r(NN&<HhOIJ -&2QwE-&9CIk=CcD<AUucb)jTqXm*jC!jLKL{ef?{zpb(0n-Xd=~`g8Sn&N9I`pjvKdcqLqIdw8(`z)g -K9)bfJI+B)<1$j@OA}T35Xmi@t%rWD9|5z$otFF?=KkcP@zAdh`A6c;E@R&<TzY05Vy%IQR5M5azG53 -@mbbE)E&>p$F2omAdM4%2!f+?mgdCzanI;FvP7wvH4A@wrlT2<lDHxBo>gAUO=u$`N&%*0E52sakqfn --=?o7^QYZ!5n})1q(6N+Nncq9KB;QG^_a45>f!CN5i^{Zo&3FYm1xB^PeGt6WVSqXnt0uz?hTan)|IE -m?k5XQ(gI3p70eg<M?a^8<XtB^taoo%WJxv8OCYlS_;UhGMga84(=m(t@e`s=<6sd5dMM^l>KCb$YP5 -)6k9_?MN<Jafke|+PO&pf#SU(Hf}JYWKr*G0`UCFV&1ao7tsuci~>Yc1%Q69j!XBgWH5c>Cqz!;kURu -Roo>eS3NK1qR(s{wy=3w$<Z``uOhR?DF+_{Qlyf=U-q4L9R0uZn*ofw>yW==5;NU9DXhH=o^opu@TBb -y6PW<>;S?b`)#xi{p`^deI=1IHJy_5DF8sQ|9R{gBTk2K8nQHGtB^G|VqiYg`agZ^r9??dM{nD8bh8` -E|J*Jqp`!3Tn1+$0PkFdduTTO~s6_Z)ga<A5f^KBnjBJQ$ngZpO_^535C=Cq7vWiucBcjI#`!nFl@a+ -UcaEVI(hx}oG@9^c}tAnG%mkx~C)NYJpMWfofhVoM8-OK!7ANkE>-aNz)ua4rQL(fSpM#*Bz6)fsy7X -4x*>N8<j*HKrAOaOp(D2juC$c=Ew6?68}>DlG`Pk<^{Z!drS>HOV?_`~VXZ_Yp9lKZ7hmNs16Lsm0uW -Cj65k3-yWNI{gS<RZt|&ht83vm%3n2zKRqYsj^fSFxmlIFi?}I9bYEL{20jenS?A_9fV_O}=4ByJfq8 -9LXe=X0dgy2n!-R4>a4-J7H6;_bEB?qds6i9V1hD@am|GlH{{4*|JRj3{_Y*oj5um=Ygn^U=0ZAPYn4 -_{QLeNp3Q+;sdaMJKJDGKYBRELu}_~q0m&8A!kynhCR2($6?w8Y-d;5sR+&$F)>ofF(2Au9(z%}g6}s -7C2m1`htjCqASSY??zFC1T$=T5%&3TKogJUeRS+y*h44pi4JyPZXPgzF$0tHLl)Y2({cr9|o&k6%MI4 -ZnDCvwbTbYldON9Y1BNaz^`5kRyR&(}0}FHTGY1*&!<;ugCE1~ua$afJ*sP|r5Vw8N0RTVyx~n+h&SH -u@S3dyEC6eEtUxh-jVRY$+h6#ay-ouEG8SPk+ZTTNP=OiE+2UG&8!H!)<0ok@?;0XrmH(4F%t6+=T2D -G8H*%YC+FEfA|6IS1(o3ES9V;*itkK{1nQEgv6PNthn#WWnNW%ajEap7IEwhkmvF}dx2n7nV0*~i>Oy -x_nS7+lHUnOj+jP$$S+^G^@fIO>e`6P*HxJ=BfDcc>SVACWI-!bO^NydpVR~(Am>Ter0DYt5WY0y0oq -Sn2oQB4??lery~wF7y5JI7Lz>bkGBwA!35ef=UK@YR#wYChMyrrwq+zTg!3JXCP|sLzi{chJhI54M@e -;r((Om~ahulvyVQgZKo&bA7CgBi+vwtVCrkbtWI$Gq>y}XsBNF|R7wb;R@oy+&}r>%dq<Z9ela8<cs4 -x%x3pEA@-25eT0TnbJfb_5(DoJD)P(JtF&7kRDVWF(**0Bb8r)Sq}bns{^=G7K5|pz8x`7l&+F+>1Mk -jzUj%$eGW08CGy-Z!ZWnG+BtWhzv7|uDVct^YLN>t<DtHfb$o?`8fh%YS`YiF`PW=s3P^Jh#dj3*QzM -1p23F#!o-)4P26aSH{|F9(Dx9^3WCGiytt=YSa?cUtS9%=N`k{MP=>>Jh=f*6MY@A>5OR|{cyXt@;Q% -8IWNhF{E4f(GoF{0}l9@o9z{U@-^r#+FnG)|s0%?##4SS;*StHu0fOkbLj@bu1R5Og`nD1jYfV+cJ)c -h9oLw#v<sOjnW<V{CTkrY|8%6rF;cq0l|ssKN(K#6ueBzG7xE)a4h`0j|FHBZ77vDv^A4xwdKlW1l{T -_Fy++5;a(?;X)YUUZ&WT4r=&3*cd4snZtr1^|ytGcNJ^372iGxd0Zh?@pM%w@X0&2pP!FzlPAs(}WNP -zKYJ@44uQxbWFwYEtEEJ1O}&&QuXQJ`CIfST;t<Sf1086WMEhfBEtrDvF-LmwxaikVB}n?_}A?Me>&& -biSl()9_lnYaJm}sCa*<CbGl@SX7{H7A$sRd)2aMu-ogGRa)ZrpO!ECD9rbep{OAB2VeraRzn{u)Fix -)@XhVKyI+}f>Q|@oIRi6_*V=@`P@tRy>80VQSw``G3)12(6&2M}g_D`@d58;sG+!Hc=*cN;G<p%%3=7 -d=Zg*<)xs;sKURxK(~fTC>bVO!C7kCYRUe_8JS6=`{nOOEx29X@u6L(U4p#=Z)14AF^-_v`7w0eS|w% -uOc;?2jBr1mtt6fRJV7UP7LWVTK}4iUHTg49s0lzrToFhODBFjSOqrT0HQiyG>>5qJf$nN^L0mW!HPM -x(GXdF6K-t74JikQdT59!+u09y3KkVpd~i#KDcfApLxJzte{|lzeKyo1a^!z@PM74|Lexsgz6>Boo99 -V@)m1zP@7oj1f8zcq2$7jAsUu)J|*S=Y!Fc`T6FpFu;1Ulp}hv9y7hPR*o9cvV#ZSs^LjTq$J=`y!7c -XQcpTPTCEl?XO=ao|Q;=I$y0}XTJxu}ZQ9NG=zqiFU_9eFW@c#kIw6rXm4DSUs%g-US5mW_uBRH`r0H -V-8<I6{bR5R%oGrAdwf7=D-0>bKl*nO<7caL{(kOVw*R1T0Tq%nSbV?c@ds%&w(YUXqKfa-wJNTVN)K -v@{{KwA%A@80yfs1a=94FMVVjd+^+&Kle43fVq(QXRP?YHYw{4Y`O|K9OiONVBZobMQ8=3tO0XX;|*Z -CZ`!^mDn{XhFL~WB;Cy#3boZDoPNKJ^}{xWZS3=OgMZ!DA$QP1tBIxFZzUoc^>x5<XH$r*U5V@mTeBe ->6t++@^DH(()51uHRX-RJsP+B4ZPh)K@w2LJ);ZM2E8U8F_>PVh9Vsjmp|<n&*#h<WCdGTs_J$WC?rK -iSz^F4p1c)E%?K`4ALaXD{It)tu3{EAi4*F8{8}RnCrQHYY16Z144U~JeF`)nVzdWTFN@Dsw*VYFOPU -_3JFLd5EQ|?-rw9upLI!nb1bce&;ekk3LQ3p%UOq<)FT-f%#Pp>YRPi^$}Dje{3O*X?&uaVZ_n~Vv-C -F$~FL)LEdLe0%s|820c2K2qby^n=rz?Fb9E7RNwT!|1tOpmZ)or-mM)4hJ1%|I%o#pnrP-^wnIT<;y< -3{iph!Mg@&`ze^8*$8wH?GI13L)Z5X_Rx$6yF;|W&rAt^J62z-+XG1OkOQ$Q>otPBg+sgd#$);=^=~% -86iqN4nc#8t|A@CQGUrMPNH)^~jDW1!q{Uw8UtJ75=LzmMI7YcPj^Vh3_6i*)`kY~7g7mjT!y%hB_>; -eXHxkkv^5%XzcszMz+b8|e?(D(Y^bF!`;g3od;2FI$genr4l_#pGs%`5SowJ&?KKblt%+l!BK9p#Ts) -FF#x!uh0W?e1t_m?tpPYN1LhOR@49LfRwm1b)Y$FIM_e&HkfGe<|#P4_o@#S>!M%Tr5aGHJiYlzg8I3 -c_G8A=bIaXr8GQ>GwMH^HRsJaG{$6>%{KAP)h>@6aWAK2mnzTaZKB+clLb%005i-000vJ003}la4&Oo -VRUtKUt@1%WpgfYc|D6k3c@fDMfY=x96?*RE@~4oSZ5^3#O0vSf?$cn<o*`K?%sc&H{~=dk*SuNM-la -$-zgV$e|*xbmQj8iz;oXl@6}#yz&J;4p)D|;k!~n|(?GN?a5or?f)wOPjCwg*xH=Opv6lneL5sF-t#* -JUmoD@t<JY2T;R{ep0|XQR000O8Q5kVeeVHITVkQ6p3Vi?o3;+NCaA|NacW7m0Y%XwlwSD_@+sKjd@A -@kc>RbfY6l8lhdnsMCKCf3!ROeS&cCuHpJ_IC&Bq9)C@Q}n!^1old<^_PXH+LVZY!SdrPft%zPj^pGV -=|c>U3J@SRky*is)M|2+O#P0auuXy7R<Z6$nd6Jt6*}!R;ri;^Sn&!U9e3Tx9Lh@wN2W_M-u?GtgB6s -B+IVtYLz5Gz9Gozys3(=RSDl89m(@Wwb|x{f(Ff#=1%`qbzN5aX4#dCwyKIoKUk;Dy2$7Hwy0Jsz*FB -=jr|pG({`<IYo&iR>#ogByU^>_{N9<`t=eptfT6y>PwNtzX^yz3^R!Xlf2Vud)kTvoRWkqnJ5?^KOmQ -K#N%I1bs2f%5qVMTWpltJPoZP80tLnJPA9R_kwuYuI-x+E_Ia>iqm$tgBdf38nbqLdx$g2CYsM1WAK{ -6z5l>nNvpeu3s@VBj?9u{ib=2h9~D&bK8*Cq2rimxu}x~gaJ=q@et?9a#$uYf*fx>2*>Q`s;pDSi`K* -hRHSJ<wU+v^W4w(k#{rYrnsIpZs+3`r_k7^5(^d|GM~)yt;gS@%F`=3j@Y<MQy)(_S-gvfiNu)Fdy*+ -V4XDGd|Ouw)ikp}0fNAnSq@!Tq+4XtENR-T>e^XQZ`xV`9<@rdWU=nb+h%qY^%{t~T(?neRhcx~yewU -+b17j*T{JH<RkjH{?H6oR+ii)l6Pjyg@Gm}odjIj=yVqCA)gLe43>gLK2mBv5i#p%7rsG$1`zF10ags -WQdbg{jR!!B_K$Rh6p4WiAPtrwNR%H$(&3{n|j`t|@#+&L+**aCZ%vW1s_9K!XiF#;*^I#g^uZ!u?(V -s3pTwT6<o4kDY=KYJ0mp{I~fS2LZS@0x+8c0W&HRpPM$1Byore|S7NF)gsTNG*21jKVMQ(&jCn*UWT+ -UShf00h$uKp&n5)iNL?8WMIarnJm!Vw7N1BU4L|VtJXjNfI`ySkAaUa}Eo<1UlE&RUwT?Lob1QS{0<+ -4A+W}Oo=m~MY^%T&VrACRb5prqJ~0NYV<1jO`ZiWi0;T%5AiE{_mW=)-1DHVf+FAKtpS7=3GN(*XReS -rk<kMh#F2)P7Wy|*AWjU@FdSCigywM+<V)ML0En!Dw^gZnVEnECEdPNW00NaIL`WF~SeI^Rdf}n*cc@ ->(RH{qAn%DhaH#E30w0eyIixEq3T_~Dh)vyQ3vK#&V!1$yf>S`F03YJV5l?HwYu`|t!c}eVuFoairRE -rd-ivt6tQ~3ABW!$vf1wh%LK`Af`?o|LH?k>-i+Zq9a7Mb$_(gqru(XtLVB~H$!D}YtjY3ty4kMD}Ax -<wZ0wjxLo#5!*q!SBy7mC9m=Q%B)4xyD5i?w~otOUMpzvxBAj4iGG$L;1W=!JVobSP2MD*=^=<3xiNG -9?+GnDyJkm+H?a9+bRd-ecrBhYf>I)Q&!C9U77!_Q*m$+ui_v+)e6ccU#(llBCCFZH2~+Dp7hw9V%4X -$Di486HL6(tN&F;^V=MsO0xYo@SCFxkDUYKu&0wX;fOr9P8I%$l2*ADpUJ}8eKx7Jm0+z(6(ZIxn$12 -NV1r<t<OAI^Bcq#+00OmWA3T`!IDXxLPw2UFPp+4WQ^92#K0n!$QrZRC_Y`B?z9OIzhrzOdjm4Zc&1Y -L=04?aS6g&sg(1j?=2&FpyUnt$z@R^Zj@M0h;-^x-x1gn1su!5Og%rvN-t8=5Crcv+{b4Xmd`{d*<Qg -l%xHq;pu%p=i~JKm$|~AP6jz=fO2iGe9~)W`cr=hId0{VNj?9Dws6;10W7?7|Akf(!6%xSUF@Gi_<Nr -2w6BepTvKy@-n>k0naR?n<z4fB0bN8$+1*2;37Q^7o=PgrQs#fpXNogPM<ydju;Szl1ZC4E?tqu8dw& -Jv=&&6T6A^Z?ofbiVJhS5fKm!T{r3AAaCytHQ+R}mT@7zx-azB+7T$#{O}a+F6`*D@Oclk!AFF%d^O^ -=N%a==-t0kx$GE^H-QUGqjYoC3Oj49x-i-`IH^y~mdArB`~4EX(A8v!x*JQV81tbK=36tC4omakOPhS -3NYm+(T6W9f&zZz>pac)6`{juID=H3ZK{5VX}6x_PGx&38`SdlJ|8TIAGSiG;#hpoMxR0Twm%>WaH$x -Rd*KefI2TCjGpAcJ`gU`R?p{d-MI-&5iCCXz92B$P`D*B+yDXO?7X{naK)H6y~<^4jE3s(Ru*_68Z}| -7xatqltosoD&|mU8DtZ&naqN3G|wIl*7Cs$d~oeO)3Xw1niYfnWgj8AB}wufDnxTHZy2Yq0*9rcQ~5G -ov|p^?_F;cvqg1n`IUj1-p|6NwB_<bgi&X-b8=zlXh#J#`eUkbOMH<ry+wv1anbi=iz8_&yRnNbu3Gt -Fw?<^qJ{jqUG9QdbzH3%w%2$9RP{TaNwA|n$Q6NhqutcuAcfOv-VE53O9?&9soSzzuy{&e}lQ3=O-K+ -n>=QF;KfJcE^tCf|*wuY)c&=OAx^d)+f#1TbWWgtks(N=XmLtY;q-j$2-K%I!W55dn>jl^yo_dK~;nY -6<CxMx+8W?qH=WPt$s_K2`1Fa8s5fdI1Z)W)tGL1az}7nmMG2B7df8C<nP;x6}aOFcMJ+>&>|@VvtE@ -PWkI6H`h;ZB3C5Yx$qh}((!iC??{WHTA}cyXP^uhtLl8ptKAfqJCK;S4NSfBr@`-kA3S?vReI6pL#zx -;uF4g_BtjFur0ALTs8shMf{wH;uyz(J^OD{$BzXOVZfUVa&w?O0t>@DSr^3>b5gR2;ku@D}MF<uWA#b -|TV-IQT@j3nqsZ`_@SjXKK>Fd7Z^%E_2Ce!&ecsz7<Sxajjn-v#tqc~GkV2Tc;^64~+>!z*qZ8$xjdI -K18Jwsd>FLJY>pjk9`A*)RrfM?f*X4k}`r~_**E8vab_rbTe>m^RgzyH(RgUrM3%%?1Mz)tO#ox&Iam -#XPmFr5x6PQ8^7$I7Aww3(xo_02bBp?k2*9};%cFef@Z1y&I#JjcJ`3Cg2?{F_rOcG^~_{MfZ7Kh_-? -R_K%jJ*Ej3>$F^fwV*leIQaSJpMwt<FW-ImiPZ#A?Mnr#Kj<}c74RTunt*zy<qbl0aXiS8+$EpGmU)e -CsS=kmejg));*-#4H4zi0LJZ~@C=A$IIG<{YOnV&c5dKwKG|GFa9+a%2$P#e3=-L!4POT5(Q_y9wlkg -KP3VIInHjJXZy+B-$<2CTdymo==sJ0sLByARXKJkInJZl^(I20HV_5J`+1;jn*=_)k1Mf=NO)An_3IS -2R=R$ZDUNsYY&jaq#0VGSJg|H9|*e~;aS`SgSS{X_itc@&=DEk6F7;eGTx8VpST`b<vB6Kw6@062P9< -3C+|_z@O(BaA_=C!khs!C(N{C=-d+6!a*KI#l!&Ks8rAv^8jBTCX*0HCo1CuyjQhtSa_PNE5LKl3a+( -s>sNkz&jWznv~(>1TdZ?6QgsH5sEE1%1aMZyg+|ipgeae9n-@Q0a&s@7q~2H-t;S8)l~<A5%B<aI6rs -s>**SXfxLB6<1-^<fv^7j$BT>C(};Mhr|BAQXV;TebcRLnlKDV$wE)Ae4vi!qX9d==6?S8S<9w1gCo% -|UpgeVIGTsngF3&pmJm;BpU?wM^+tj-)bR0EaQKWo>K~qOPz;Fx-IiUak&l#=}B11o-;hc+eNE^_*sz -Vh77JM*r!62sn85F66M#6Xm_cdxwb;G_Dfwxg<DIP0wiEYwd0A$BMh$YBm(g=ggx0fW^o0yz7X^R_BE -t$TEPFrcS9qA4WWt!=oI+zDJZQDV!pdf8=T|r*0GqTy)+9spUv?Q>&y`J`A2t~Tb){+ZWjuhBHZ%#R5 -@A8pbL)Q}FB*LEfCfZkM^0{=xDZOZvx(%O*8Nb+~t>o-3#2?c8mvqltYl7Ee8&|ZY^?;TQvTwSXXKBC ->&*ZNzib8t14Y4`hPE|Hlp{)L}>T-L7{_ZXMZ;}QKdjJ$prGl*Yjk|tXSXsVkL#Rn!t&uv>KIqW;7-U -AO2h}U<DO%Fr4C~2c!d)A-gcD*15yZ9no0Y~hbj8%?GzVwFy4t97bbQT7i1W|!`Mll98gq{G8FW<I@R -Q0ppn}SXhP$m5=u7m{ihtRG)IL_@laxu$04+WEUSzPl$>{F~a385t_@DF%|C2tk)nPEyKm2YA!u-d+i -VTKdwZ`EEFJ*g$vAv#3mFdlhraDp@u;bF)G_E~dLJV7EY<%L_y5f62H~46ot_3HkIT0&8`c})x51`lA -S&*qV#ce`yJQ4d4KV?!b(7twBWBL7}+UCmHeB#wxb`LU8U(oTdXC{IWHP-@=dysa8a-$YPy&-!18<s} -xZi{}8Viy@;+Iwxmp}xO!o@ZUHqaFmd25jWJOj4(7A{8vEjnY<-+v2rx*}ddxL2fo7AIud&NwznpAo* -97EHrbstD3*e^y=yCy$$Y=^-KCaqD$z=hIoORNTP519tJ9}ivpsps!h>pzACF)O^51$jq}jzCbD73%t -!veg%%Ef>vGl7ZwrQZfx(cRcdL+lfQmdUWF2~W?Uo@lk5Lipu&EayN`|YvW@DIEZaJg$IcyHf)9KWKT -@$+}X27v7j?|3!m4AT+m@jiJ%>13<H|aJ&2TXpaw0VY2k-I&2A}qX@vAYcmYM}T=+<tP)Mx0nnR^9hY -TSP^8ILfH**0r>9gB2Nsr?E;8d+sVRLenfWjX0!R6xDpL?09En=7UH?FZB%VV-Uf-9573{;vX*?w?W_ -|oIJot8*y#p#F^&hqUbU;CBoSqcYIHaSJTZ=^vz^?u^xY)7Po>{kI@k|7M}3`HTp|*v75LUib!9PQDh -zTomkv$0X(pVg&e#G$z|eZTjZ_Jlux7UCpTbtW^5`?V-)IRX7a$Vr>Q}G7itWvA(H&^Ao@Vh;WQub1s -VX;DLt{kzorL-j$X2~FLI>Wy}iW?*3V@SI%w^+IT{ZqZMmXZexTCOU*ANoE90P%Jgf`~SIoZDJ@f$61 -2^2+UC-<LEC{D>x}wduu#{ND-R-8cU>ZFBqP=b}hY21B)7h`AjTM+>G>Xw43sGL{v9--c1Fl_?S%Fh` -NSNc`>K4qQuEdQ!R4cI97<aOCAy(v{;c^e1_wtiS+`;6az@T9_wKV*~WE!b??8Ia&FscaG2CxB(^p_p -=AYHbyw@M9ghsYe9gZ4E7k1SObq;^+cD>rCm?y$k;Kb+slpi{I?M}T#uSu*0`r1Rx94d@7rKP%qdt+q -SrLWpdQs^g5F&Co=~AI~CDe#qSuAndX3N&HC45g`Z&sp0Lq;%;<k+FO$1s<)fRi4WD-d7{w%XdEK;+e -5HgE%RYfvlz3p0bQ94XzfzCm(A!61qJC4E-Zcz&__TS2-xtV?NG6$mZ{coBsj`7)?FSdEu#bTQUfIRG -HvR$mLV*<8aJ1qeF`(cc%TtbvMe`L5tw+xYr_VAjiB4|M8R-ejqB(-17>mBwl%DcvtZI8u*sg84AAJk -qy2ym2`waq4J>4ILkLBq)VN&IHaW2jbksVQXB<dHt`#id7%o(L1eW8K9_tn$n=UX`)eaOq`Z;;`UweA -@bp*o;Y?e*lG!%n-9_(M3gdDh+@ec}%j<1r-pFdrFaBu(c;k|qN?&BXv;f-Sg=q}dKfHNWvaw9`vEvl -i@UkFD!<Q`G(n2u1$QBeCOzedFuXxcy2(`-ero&{{cP#IaW?Q%VN)Qqju><U~~U71aSN9cRecH$qDgs -G?{ShN}Y8w2(?vS(nMj4d*{NzfQ!Np`)Iar@AUo#uLj06^cZDxe*09&{;NAQ5vo?0Hp>gNyew_=nptG -~qAapU55sh!zx?+D^Bou`7s=-A+Pf3~sZr(ym29PJ8W;b~HF>xUW=_lU=rm@Xz(x$#*x_$SC$hv$%f+ -%%@Mj3g`r&rG2UOB@`QVxV%HaOR~lts-0L;3-SBracIHi#!twOYUepHim(G2SFkdmq6jaHvhM6v<CFv -3yg*=4!}?FrHesdH-(=ad!yyg#HRaJ3g;%s;gPYmn8XegW5de1EcBF`OV012c#f^jQa4)odIy5A$gO5 -wxcqPV7Yw@MBVNL%V%bNel_~FWh-Ed9~glvavpQ0wyjT3!H+D}y&E~4p-+5-CSTUEwV@=B>--L~82?D -TX69N*2+`*XV8ZPU|jzC8tj->K&G>F=IAvDn1YBfyGxEWK8Z;_3vT?t;6t&QsibAr=y(<|c%iw{p^AQ -<>1yQfVEF!tmx*wj)KX8N+>^xASgstJ=7#SB$=#zThsLe*4=~rvnBXb^wM`u!o|kzq175y#v9Y89XV_ -^*(P@Ai!DcSB>crDV(Vj?>tl|el6n9T*LueUiW>{U*(%ENU<G<4zm-KEvN_92Gd1rwzhDENHMBh3O4t -!l2-RRJ`~9gf*jOjkSnmtE^cw-YVj{(|J~`oRPEbSvz8^e+%c+23)V$Qv)Pd-7<Pt_;-*_-hhgOWXkW -Z2oNRbZYN%sPB=SpB$64dff=A51z!>!VBzQpwm~e1|$q<x9NV8HLyj&VG*i$?lNkP<5<>?3{+|+1VqE -emDL0N`M>vmHd%K~ts84%GUOJxKI>KYh32%V2nePK${7LqU127w8}e0mTzxQ(Fz!r#4W6X49QP?Iwmk -N$oOBSFWG$dzIWGM&VgHi;+bKkHS)!-c)_w!}XjQ5pC71w$cwkK75>>(e><fscceZ%zUZJUI)xc6stU -d@^!Cai@<NJ_@<>kvUlPD0I3SLAe|cEb)OTTHcamljdcT$oht%FKNBH!`LW_`hc}0tf!$2?Pp+;`{)1 -oj7n4V{NK=l1OJ>#k%6KffQ*kqBw5s;^W8ZhaJ5y7JS{j}8;|Run6UbXcW^)=wr~qaHdGjh5tC?ZH63 -qzYdMWk>Ug}V0TT|}TJp}$Y^1RWT?+z?!sXHFiEmN=#8WYRP-|lFn0RV6Oh176EdF<l)P8Tnu#N+GM( -uqYe{0_ba5oE7yNH7y>F9w13V85PZqI=$GKxkKSa$2n*x1lhJ_yLhDRrvS;Vu&7(m2~rs7ea7H2B7Ze -17AeT@f59V8+FX;=<+twyt2xBh3xLYP3m6#Iw=QixxRQzyMk(-!Z`68In}+6Lb*Zs<{T%bc?k!+%5)u -z<?bow5+em69|0=#NKG=&*CT0xbEa#niuYZcUcN9u;voU43BV3=6K88ca_uW5<F-k(DG9EeILf`1KCM -X9S3iio@)`R!A-g{M?h&Y(dW0qJXZ0{g`w=}AvA>ba0voY>`e@PGR&D)$RjiXkj21y)NBzX?5Wa|<1V -k!VWi5tnE(TIN{0m^OoOaG0Tf(SGjw`kuuHXFrRZaYvGImxW{=>Y4p`$M1RRh(beA(c+*`!TNQ8F4eo -&hNVe&?%aKlktJAEAG1XS4#4m~M{L)`SBHUqZNVx|hxjLyUHnGT#S>y#sFiRmTu0-qxaGcTq_0;08UV -~E`vjA?-JFr6IR3;yz#i?>&wK3w2o=XdWvUcP&K^_RauRT!J9#6w5|jFd>^Dn6mbhqJ^#$dB~=wsv$I -^jxyKmxCtH)1sBKQX~L@_YP0=0scS7|4kzUWZh|J$O%5w^1|AYbRJGOy0^7qQ``#4(Vu6(x}g|!Ff+y -Q673VckX!91ZxvXqygs1#9AFjD=&~wnqzhg+rw8=;>EhLkPp>~ZUHIrIyK{x7gfK+V-Ok0{=`QLHyIp -nK93!_J49d5nU2wz`DrE7t+J;kj1B*26lu}6y1u%s@4R$i<ygBeu;jR}kUoYkqmRF2*Ms_~O{T~OmSI -`U*Xa+5A;;`z2|I-@nx>VW0Ded77emH{J43wlO_zmbvb`U0ek$Z$@)}v;M8mAKoetq`zX6B$A{mVFiO -<UjYY3nQ6(M5s7RH4M4<ui{~fZ`wwe14ia6b{fe3z%EiZG)jlI`Xte{KL;#_&NTZMbBBsyN#?b!PI7u -z34qvXsFk>5{u+8>mL4ei}V?Fr279A$GV_}bw^tJU-N@ETMu%^NbCRiEaLTglvg}7m}xvBe364(0O85 -!j9G~p$v_(6s9wVdS<5)QtxjODK^ggnPnW(rA!Y!n)mE|4Y=&VQQauWO2%ennr+d$<ss|z2$j*9rJ#| -L;_Ky2^=a5SRFQXevjmSj=-KPIrBnEc(eypH5gV8WB^Y0iRIz1yt&p*AlF7`4U66r^JWa9?KiLcY#9o -~Sre0%lr#p~A>A7tkN?c(Iu){Sx5<N7vQ*@xsDr!dcG6T=ZP-g5~$o}-ZbTncpAImPYh0ethb7u}}=8 -Jzb%37ud`oTxe!$yK0u6Y4NEI7G}P<JZ?3BcM57#bEG|57W==h>e^FGL;+zko1qes)J}l46>%thN>~& -gr*sPou*;YMfoPQV23dxb#<?g#EoqR!fW<_SVa;SDt<hZ*Q2}5QWNJoZ~u+&G-9!*0_hn$TIj6dKFHi -9=~;D;<@N-=7!DgYjHeN8QzL;S{Z>K~54f~}fHQ*AKL@3oHv}6A2JJ()k%Y?|_9IPo{P|!?X{O=7Cd~ -@x@d%ftIAZ_PWdDlMS=8Vg<HD7~-=y`b!E<-F_m2Cv!F(ESAg=C~KFhN#_tcb;r*fisAh00;@F@j8`l -oyJwaXP|b%J*?yUFLtNJD?Y1bz3@yE8UkR+Z!*;5-6zg(vzO*Goihz@z^Z3LQ!R9mjJ*VWS~BB6_E%{ -+ke?6a8z|t0j@B94pzh9G4WBSkx2AlyMSocZ(wjnh9XlU`=eL$eQ34fK(}%tLS#)2nzjjhNd@5FsO;3 -^%_ojQp~ovBtrS5F@6t?Ua6L79tAC|j}52&kPzx50Z?=vJt3(6iLdc|VXpuRp2Q~aLtZbsBGu`#c-VY --rHd1t(U3{BD=eX-fuWJmkv%@9rITf$v6IdOQ73K~3Z<Q)yQ?nq5huI%J=~_w0M@c}8e@Mro%QqzQkd -j9l)XMX`PScS97VU}C^n1}L}K@Xza4aWZu1!v(OYHLGTD374~LUZ$)EhmdNb3qf9!8YG^iTNFC^^pPH -(5pyu)LXy=Q?(1JU6~r-y=54G|`)&o15}f0`ShH)lLk$Xs%Bsm05@gr$imq25TfUA%#jw1xyzLXJ}n_ -$bsT_r}ZXLr$DluxaHaV&WWK!b|&z&YjxVQ;(w4o49|7&(>-?R5~~57NmMR(=UW~rm<mfN3yxuojBdW -APC<*#Rt=Lahq^5!+f3t++8RjW`Pq^Vi*Ir+8RvwP}L3kV)67r!<om7KO9*E9k~p&=<$#+$a~Oc<%np -lmb6oBJvV8O?a;wAML*~!{VVP<D~t;yFzFhzs8L=yOvi|&oQ4UTP{k{9V*e04jh{yU!Fh`SZ_2ghYS5 -f$#(3`0AGgV2xi*iuH3IlFekK5=LsI4pAUr#vk%NwHfjJe1vaSYw3g2K~X2Bb5fya>&QPBS;Q(izB4m -gn(5Qw)rO{PdrwIrFUY95<@7RWPBDRyv7&~diP?}Qq9u;qA{?wI8xLZaV}ZyaHe6>XGIiYi+)pd_cf3 -oH3dANi3p#%R-4JZOGD1j9Uq@cdV!G;R8W@TiG&8mT_tkWQdS-rsVaROIZVjaEKS2D6bRGR{_*(Pp-~ -b5!!I6t;7tJ#!A3@yQ!G;^TK`dTE)KR@D>_jDWsA?BUcmKo8*R9iVgbI*z1tWd1~@!r6mlb!wCD=88g -zy)#_05lH9E&_$2nxuQM$I5-$@$N1n0dG~<)H_siShkSOPcJ=hj=k#d1!}6wbI?wG5?ikaZf%6$NX8y -xDR3Fi)dPlnI)AdI}Km0S2%5vlow0q1*&*RZ7H9VKKs;ASV=?TSoXRHgR51Oe=QIF@GchRG}xS9-pu8 -L!_-%$1O_=_RFBOw?p7s$yUIAXx`hoTqs%^uGPp>7CpJ}gcJ<fX;hKi_W-olO%ol1`kp{#bIj0ef};W -0Fkd1o`A-5@a1oV#d0}9EmFl*K+EIUlVxs^tVrXed;R=F4pkwAkqYYSXu`e4`I-2fMPWWzdB5T@rv-` -KsB5!dm4l{enp2!FT`qT(-jKexx{Wa`dljD;)QXWVNWpiu-KIzi-ZreU^feX;mkk}Y&Cjh85r0*Q;0f -`kAAWBuw#9P98T$BE+(Gah*<yhoI3*@#To-r8_rGqz&mJ|?4WWY4W``xq)#6M4XmtO-6^xHYgRud5C( -7t3X^ei{DP!1{hcjG_*xN08R;w%WG@mV8i|^)W!x$6DMjClQu!p-owMjs#>U(=pk?Np_Q&(xBDT^h1$ -$AJ1d4rH+<N0DY+%z-$36ude<Ki?bBs|jx(^r3CJQs%mbXx$rOv{QwZe476uI^YA|>6`&~3`yKA&JL` -yu|gY$ORNQOQx3^fox<%X$9)mq^mPc~xP)-!{aT5s<2dsUsN>d@4mf9RZV{p?Tg{73jIipUbMs2M(IU -Eq8P#97_FM+oB2Jg$pPUyq<BOPQqKx&Ato>tD>5xg;&aRP(g=!4UqcbJ?TrJGLr~p{NcZp%zTokuLmc -V91oo9*``A7fe>Snj)3+d$UDg`KdkK01oJ0(_rM?5H+}`5K6nDbf527j*a*N<+0mIvI#NDf!SRmBAR~ -;<tblTXbJ{tnxtaYqTdrB#bvjK-t0&F|z=$P_eV5T$vVHOdeVyo=*IyHeH@6x7rak-<g6b}$gT#Uuxl -RM)be_6RfW02upCbo`27vYDWIOb7GZK6Zm^@Hx%q!#$$5<Xj_i~-W9uVoAQ-9_(ISx$h71RL2=@q8hC -NGWgC1Pal)Mb}(Fd~U;YlBjK*M@sxejx9KIg7z?DJwD`t;{Oi&839aEWNu%ExW=$8z%F*01Z$NeLvM0 -q1!uSQDW#zPf?~%9LTV`b1H3ALJ?&NI>YVE8fH-NH;w&7YctSKy9ug=i=M^T`<wwEZ{m+1BwKrI@FsX -nOM5sX89aMtR0s@bLvQ|5H?f1-`WSSaNNeTOHZPNnY8rHYoCnhnU0IU0t>Z}Nl;lh72M`Mq0-#TE&qf -ly=`TivE^toG!7q9#8{O0w)1RCJhJBuvL3JxL|4N5#=N|{xQwMX><1-E6CipyH>c=CZ{irXYEZN7?Vv -iv87}TN3$qCmyftnL{^ltnnMuk`J3m>5cJ_{E2*}2PQB#uTWta~-<>RvLY=#)e<Fz51j?A)NAtxRA0g -oFUXg*<Q8;e@=IlObFge0m*DU(pI<Kgr{<9Zi9FT*~@xSA4=BGcW>WY`Xv2x#CIQ!9=094&lnkjIt`d -A|^e-NFuuy4LG9D4Hl@w4aOfo8;<p;SoMZ=Y)D6kiP}aQuzG;X)E9<oe3+=Zj8NLOl^*`F6f>@#JN)P -ffAZ%Hk27<s9WmvdPXd_l8jzAKPDr1pIa89S58*Zlz=B3hvT=8F(fOE(QL!Y2quw?Y)tsS9^lz~nSEl -4RZC_J`MnjiAavZ?dh+Pj0lY=|XG1M5x)7Bk^j>8BA1HHSi3UjBGWK45Zb7xvW9oFbaAvpI<OzDi8(5 -Xy);p*3ZU=`v=kq!ubpe!PPac5FISu~WIW63R~-Y_G&Q-Hi?4w3g{igZN5UU@sklpR|fs7Ek6#ix}Px -WT%Uk6N&XzIVQm8+$P1SQbB^f%?c0y@6`B9|(Og18=a?`oVY#_+JTK1GJ*(t3dUS{^HdGzc+K|En9N2 -mj&IuI1>|}Xrhji#|%%z?M?1!6K<>3iZh*({}y<dq45SN<%1tTH|Ji*!B3THP$#Bv`68!}L+G8S6FK& -2Iy-PP58>Gy8|X@<kBO93aG%ogA8e%ClJKb&eFmpVOEr?gLSK6m!U#3`ne_Lk=0B){I8r3;<?ugP?@% -hC{Y3w&nTprM%+{gGYi6(cywvb`pa+X*H^9L;nn^fLJUOJom~QSH1uZId1fH*)i0IOVMn4c>kG$f=ne -;Pfb+W6`UaC!h^mH?J<}RwDP!y{m%-pcT?$<Oaldd%pTsf~1zw!3R^e<Yc?I-5?Df?J$Z@LA41CMXfU -D44_*Y(ZJU0v`RX?a9KS$%)xu)R?I%fiV6<M;^i&@nBH9M%NSMyp#(J{W$LqQCslj0_y-u)Y2fyqugy -UveKD{E$We>TR)3ejL;9#l3`_Gx@R&BbPBlg99_lV+U{c?5lAg)!Nt+g_k!<J<V;8fhhS*#Pl%c{vLO -Y?*jY+qd88pVbRg}Pm9uc|GX*oMIwIHyugcc`Jb7T0UIa}x_8#W(v0z8cM>Py>7o0%<CqRxQlLRm(ec -!(TdnC+M_oZ*bRrc@pU&s}iU*)=6i{&_`Ijw0Un;{b_qi&nd)duw$j?yK_z77_jzPJ`P7VOl-(t$qV@ -9h`n#pJ2_O~wzt<|!O^3_WU?s*-*IJx>p<o?f=9$I+`5^Y<*AbVzi&Vc?k!M<C<foepVlYl6jw7ykie -gu7)6C}=8=Zwi`H_6cW+Y1A`4;BmNi#Fq!FswbQBDdT~4kKd@OU|Qo1vUzFLWdIEmeqZE7zH^uUDdZf ->jTsS?AYT4)`xlG>Tt`iP|f-l90S<95-_@-=zANoaarD)Bh`nI6}7$hU7Ld_x*xr<GHXxvMZCnAcFmh -Fsnt4C(%DqipM4yY=K8W996sCyjmm5=(b$||pWGJ)iZY3vj}Dl;9Fk=J>a~A~bks$VE0`li)__wf?P{ -RjA~EVg8rQ?8S6pS;6~^;2P#~$`mvu<pysJp!6%7%U9{d_a#r1`z0L}7$8B1w<KbFV+kAa{kiFH-}Bx -qx3=D1?`>r?pYBexa$(8iOa{{c`-0|XQR000O8Q5kVePrb}Y4+a1LJ`w-`7XSbNaA|NaUv_0~WN&gWU -tei%X>?y-E^v9RS6y%0HWYo=uOQTi*`2Gj8@d4n`miD?R-o9!KG27vP-y8|Vnc}<NyYVw{`Z|rO12d{ -T@@@3iB0l;@Z59HWzsZFI@M+QEw!bwLOHR)pZHC+l_;shXKD*YPMD3rVd0JFEa8k7Em6tG;&KvC3)2c -`8uB%7(I-!~l{!n3*Gj{SYMm-+aJG-^YSZgdtVt9m9I#Xh)ik}AYfVDJ?Qq1jdWUmK-<8ti5Yo9N>lD -ny#+pX-o%5DtlO-vx7nbsT)BE01p2KHntQT_ajP5<<@q3aC>y<X^@w0JRCw)DBbvu_NkHn?fwlRP}jt -U>uy7$I9v8`26i(1|ia9j6nsga)P?G(k~8d5t0ZwLSzK;^`()IITa0D`wYW#Ug>-YTu}T~!rX90V3+s -XVSLb+iV`a0I(T_Krk=-3hI3NTg1EN(YznRw^CAbOHM0^6J%Jzg@n)x)d+PYve<Gy;nP=yOF*2E1`|K -LA_#nrLt7up1VL1DR4n#jxuK3T8mAnZA4&8A!#^6svMoOUQ?yomKgyPKpCLLDx4uB@2TlL@8bAaqIMV -V5^;bxPQtVSBG-4}OnF?4CzEOf04`~*WE<%7n!q!O6dCrda&>?Vrk*h)Wd(eRcQuiYU2sx4oR_L(K!) -;ia>=`2udd$amv4RtiUVUZu#5jL#_zzcl?^SxL*SI>%ViR%L>q<sNZ}fZBG;rl)OZ76xxOKuR;U(d68 -i*%YE0Sdm<{8K3uyEN1%NhTX@8WL0g-5pM;`*5fl_EM$z=$2-6DXOH`IpiftT9*&b_#}sFbh!byk?>0 -=q5x*^=`ATv+<MC+FQo*K2+8!}Fhh&d~Xreb`0JkT1M^kqG>ZJ2|fbru6gEFWKj3U(yUXH_`(a-pTWo -II>NGt+%`Agn#m(UGsb~@wp0p3kolm%-Ul71eMY+pDu$veJZH);!SXHWv#IXzmp($0v$5?mMH%fiGLo -6caS;I@?-BHD_}(Hp=qFi*^cDjpjjbUq0F6h4&<;<gf|;>*BxgSsvF3FVs=JBmX#L`N$8=kr5D%NgU= -(qMbCow(9P@XJKi`js1pR&py|tl{lO*^f2g)Vo6~pb-nbo_mm78JukS!B&WXElZ1e-Qqpe#-jxtv4hc -6p7Wa=yc##dvFsR$YY{#U)0cEl~XK&I4kreQEWmWA&D?(Xp&Z_tVe@Tm7K#jYU8=uw-osw&7~RJYOF- -72VCobDYfBjJ{INTng?WW^E_v)%^v4@1Hrl7$kTDX6D5o2)Vi4g`Z%PbtNMI%NEQ(itDnZpWJkHh-8n -SW5?f*Cb0AOgv=Pbz1pFnx!l8Y&i`}9u>8V;|T2OLv*#eFLac@KxQV8f$YgZAZE$Y@Pz-qTX97qcCro -Bslc9)DzkJLjXVN*I5Mk-DKn8xt=3kCf`fHig52US4>&%&iJW2OXJ(dV9H{JI9975DI1XBt>`_DuQ;w -rsg33<}-b1@i6@e&_RI?3qEbo0gup9sz9?vQ^OMD19&+n|Qggg}1I97R%+iB@pJ6)DQ^!I~2lH!s0W# -H&I!N(WZVOAkm%%1Xicr%z`VAs?P(`9fMJ9t2J4@fc+kH5Wt!AxU)%=p)S@_mFLE%sqoB7Mve)8$fpz -qd{9W*wzrz;{x`<9VD-X3HWiWKk19^VT51-A$u0{Tq3*!Bqe^&aPW?vRwN{KR<UK^WcVYJlWtU*qJr7 -1q9>%ovgR|T%1l8Hxf^&>i(T<cn^Q&gzKnK8-;VHhi<AIg9oq|XY%W;sjz#xVF^R@Tw3FE;oglbrgbL -R$%z4!AHV%%mZS2T!h>o?0K9te;t5s{GV0734t~{;rC`2AhL=P0uwYrYgYLG@&9RM7o0(XGXS$qcps6 -#?&oG(Kp~Hf);or@?RK-I=X6HKmTg;r!8~z6_uW?tNi~o<8ES=0~k@8zsQ-eVwXA+v3)yNiWc81lkGt -0tt;M5!ddavdXmybWJse|SGD-C83x>pv&bgmIIVXlo=4VixSz3>Gl{{m1;0|XQR000O8Q5kVeg^8Amh -!Fq)U{?SD761SMaA|NaUv_0~WN&gWVQ_F{X>xNeaCz-q>vG#Tvi`59z|v<*l1rw1NhT9-oL!GE6W7F- -jhsoQqLe~Wki?iGbO_S6=G5+c>>KT4ZFd7835t@H#L4c=v412I33NC5`k@JN?N9Ag#_fI(wRv>Srn6) -$qS_kUSl?j27zEL1m!-*Y;|II~*AK*W76+qo!Ww>)ZEtQq-q_yU+GP8F5?u36;w7AQ#4x$>V$Mz?->s -OlwZo1EgBiQvNgVv^pCYc+9LIT`1YwW_T(Y5v*?=cJo&*sHz`W@+416yMM6@BN+z*C<&jvv(-CC`~Ie -RuvlId={JqnU>+IM|1X&1z4!*m?{+|c!cP%<wXuvB^@?jmmx@{nJ%Gm&t)i>qg+ox?LGB6c(8u#iMBn -F#m*wAjE)JT?qMHIy;UU8d8ih!b}b__2_n0up4vhh7>ct|zCrf02GL*t_cgnMWI`{PWJ%=JwM^Yi~O* -FJJ6zJ$<yby|uNyvjzIW5Ag3MNiy;L^Uki}GT_%d6jL6%s1>ew2tS?hC?O5CPjUR)_JN3eK21_DZ2x$ -14AORHGU1bU5DoaPJ5DAcQGa{*6GNSna$ZO4w;3myfR4O)Al+fi`GCu-L`+=~kJ^1ta?mK*!uqlig1% -*<sMmVEYaUAwsTV{;(d)52*4S#XM=iG5EZoHFb+_(*6hYLOc+-YV;ub4UZZ>PRS};KkGdYvyqmZ@Q#j -iU+0xr76DepGlv%NjG1G9z<hV0hBR4k1G@M@0ZlbCMdyeY^H>z}x=<~Wfz;75)6NAKFJH`O%F&5WaKL -iQqWf~2zPI0fZyG~eyK2LaUFp&4qCe*=aPHxf9oHRkAV?Cpiq%D+8<FFb)5V){>#4N+k?LA0}7ryD$6 -zydr$lP4cqObpBn^b9r0Y0k?aN^en`P8!i<=NSCp$IfAy&Km3RB*8#U#(~6GaYCHC?J)QniG&3M?u9M -ZPr+bOIAdmg;Bp{ife<DQ&qt?)QT~|wSA0O8iQ$@zIg7!)m>AOMi5R3IXZ#jCFOdZ*>qVQcgQaIM4D1 -ae%BtlnY3nswdd<35qy!FFgK&nl!Q&n#fgbpM1Hup$zjr1g-opIgrI12n{at&c{uT=lQrc+m*aJ@5wP -Hv=uXvKi5gVpq$fjO0Mjhe`ky9b#Vcr3jq!3bdAu&QKGz)XINThxwLv9L6vxc+6-^q|E0Y9doUYw#80 -Ng;gBAy|sn55(b*W#p>>#zn{79<{E+SC?qmPLTi7Uzrr`obVUBY~HoFZBgfh{~0+%h?n@gNs<Cg2XTr -H&iwtHBP-~M!aDXk{QA*$@-pug(}v1a@nsUg*0oEn|e|*G87I4(Y!u*QIHf?uZ>H3_97;xD4rJ@qbpP -LkYjGv{5bltm{S9e)M8Mbyz$hG6uG0|5aBbpOV=k*PXfsOhL5yJ2^twwr2-0l2q+XBKE`RpF#DqrAW= -AT(eP-o7BR8N+=w&;QH`dNj`M8deH8I?_Zc`b{O{OKbdL5XJAn&8*^G>SQ9V-#T;N$yo{j}@oW2kt_o -5clwNh!l$$Zc$u$4SvmvPE-eQ@Jm7Jp3;xtd5(zKgc^KyAPS{R2LtTVZTTbXBjCTEvqZ5nmzqbV?Hp{ -b?+y_$#Fm9Tl240fcYgHmsaQew`vB6r%uq7x0QTz+jhz`(xl)LJtHK+F{U-y?EC4{U_gl|LBLOjW->4 -YqLq1;<-hQQYAX8pGtB;@P<IjluMl-bm$bMHfloP1?hJ;qo;Al+}}UiFSR`Tc~G*BLO<<iaPbU`p3C( -*3T`XN03A0JAWK`0fp0z$@2z1v2qN}B08e^{`<MH@7w4x(Eer#2k^quWMjng@Rg*Qa&S(=gk=?;=_fX ->^h4yrjlHF&xcy!F?-Qo%kK^t9^VxJPy^X~jo46h;|wkofexY+#8XRv<4Dwp{hJ-M_hqDUN9q+7A1g> -+x3u?r{@>0?5Z!EKA(aPZ176gL#O8QerIX~bNzvdR&8$O3MdWvRhg<TW}OA(qGg6|kckzQ-H_OHS_E! -LU$xAcnE{?JlTGdnS!#_kBpY30%(-4lKnv=$stB?CoD%;5r<1Uw!H2`N4jEBO^k!VGm%NOSvEN=>$JC -dLy3nK;9lGZ2(A;m;v~;MMrsTfy+xmKcPHo5368JxEnte&`ZlOX<D=Sr_;-c5KPUDVnFBaB9#EH1I?o -MHR{WAPW^86tSn=3f%zmb3ha&>b<0ufttwed9_p-MyA_4Yr<2R+>c3Eb1u}Z5BBNj&jn;rx1_}Q>K&z -k#P_iKHoro3{GkCzW4|w(uglDr*m{Z@>i(ys*fJ<Z~eY1#lD3Z3I<G>%|y3jqi2CV1>zz)2Zg@M`uo9 -K~Dj%jTr<e7Ol`!Oq@Eh038N#I);55rhYSeDcdPhNFcNpFTs3mv*ny~4`+TW^)iQJE~2B!JUj1Vq08d -oGq8mqvF>*Gsrh5n7D(_953P%=C%a?iVnrr^Rd>dqMao01vy}i&%`nbC7`YDK-uU;OW%g0PC$6(it!! -DsIyf`iZ7$Q>zw-A?$uZ98|03CI%lNKUE2kJ#ow6PQ@~Af>is57qA?f9h-2b1FGh}*?)C*a`w|MI~3# -)Sw_f{ENzmA7%gc7HG*R?^2If$BziNReLKLnDpu2o@8JCO^!zM?eE;vk+p?JbTF`Bcb{b~afF5HzW?> -*DWy*=Pzs&MD8iI_l3LZq7r4(rWY3U`Oss+58OQnD&>v<BYzc08A&ZM-z$KF*a_|}aPXG|M#4;VC?wB -B3XKhsbNT2C6e1kLxWIOH6>G=HWFmQ12Am%!$NCFFXz&CK||BsUI!Un`25nP!=TWTXv^T#)$)&{NG&) -3V1u3ntsTx@Y)J{bbnZ4TI4)?kFp!4;cIbga0uw_(M;b{(gTwWl338+K<*&=^(2NW;c)R?(xC-+40Fw -%lpUcD~t4*&CP-k3)-9B(6l$pOIq031i{~Fq}yVSLS)YSxq?*rxYB})Rw-G%5ms2#;#Qbi&F`iQ_L*h -)p%3;@gCA-zDeqhN!Ey|HKb<h0)mG?*@x*W64o1ZunCW}jMDC^YW$KaDtgmi#%?ZZL{<k34yWo9c00t -!YK;hS32(T!KDz~y_8kI$KxuEyk>sqZHRa|x6kg|9CDsg|S9@UDayYj(Ip%zsY)#|EPAbMA2T&a;#<p -f{eN-0pKc8GT5`a>(^Kh_Fa)UJSB!9N)$iD?kwH{5!Cdb0vqKH#JWob<=QNjettUPacNm{U61ROt@QD -uxzY=K$lvF)@S3vGY^vCR&PB%bH!-*7rH=W2?6GS>W9bQu1>eB$d45ksR(1aa;k2Gz#U$ewKCj1Gq0e -Y}F;9E1}9~9<$OEYsx>ebI%l{=q@rHjkqMSV1;;@es?eszEr^sn3tXrAbg~yu#qt642OTHIArv}Zc`~ -p6rjtKO|_#$BHGYfexhdiOan)lqHppZHYz??-GmPc?KE8m3zm7b5W#7h7}r6vQcSq|F~xcc@fWX?6r< -o80tH#(E$~km#rUl^nbOZIj452#?VgI?f-v;D$FR7exJAfFJ+tmJ{i(`^IC0;f@NOra@))F4_q$u}rZ -URK$=S*I*{)8HY2=eJRJ6%*a8+xYAhT)f02Lj^I(i`&1X$8=x~YE@;U9Fu{I7kEX`fvCLp;VTNUCk|D -WtSF+~;vNl_tOK0k(tvgBM3j+IDr5mg~QRt{vs0P<(pJ?u)P}FnmCw4@mR@i5A&9FU3f%21Hxx&@_aR -Q)L92Yw!0EHmat}SA(o5{wD+0Hl_mg#ED>yZjWRscJWUZzB-!4_1r6%C4%>eWr-Bw+10RY1Am{p%TDU -pKub9O77!d<qhSLYG3;)T7XnVeUP?+2@hQfzdYTDFlStXL5buJ4mS<PWNn}*>wBYAt(TqyL-AitoyZB -duk-EXSyxiKkYbk0$b<~@!a{X9%Tx<@<uKZ|nu7hSW`d+D_xCqfLL33o(C9tWw(e=&5LvQ(t;K>iMtY -X*)v22L`M~Jfgx#fX~U}F~W$cGq;(Swzbj`S~m3n)PS65lu;VzOQjR+{vB4avh{1_VFpC{x8zy6R`F_ -=jxVycb*E_L$qneUbWX56Nw(KiRj<S&i(6Klbgs*}a#Gs<O*pr!oFwKbd73vK=4i7nY;#G(X18G-)qs -$+^RVPwo{LnX9|Fw&o&v?FSLn^3IRBS9x>u+v;8@bNN`^5-pcTeWu*^r|CPTt{U~<pzSPKE>pHO=yP> -lCH8XR%qDS(XvHC)C)fh9YHJ(tr%(&-OU&UQnWV#^+Q^ogFg<)A-HZ7McVe@KFM~lyZ+OUav}x^mw3$ -*{DLnBN{4anI06=|w6$haudj6co94kroY*g0-#US6`jZ!a$y$$Dxmk4k8B1Q-XwMX9QG64LTLP6_91_ -hHP1fpJ<flC4=$})1y!_X{HXY2pVHzM|LD0i8oL8;R!k0~9ohoJ{zGJ)K^aE9H?+QsURP}Cm(_jkFT_ -4BqXJ_8~3D%^8GazFD~j+M-f7e62U+B<mt>ebQNW$$(8=v6L2?3nlAbWhDeyspNF-GdZ#8zsLePw5`r -PD2s%xZ6QZv18JdR0>r^9Ne>on?YWX>TfBJXTKo!Ji2Xwz^!>jTL^#-vQ;`AV$9xjMsRK3=je<C-GdF -iOFWF3>5Gq<gFYEi@fkLLcRMeB;)z<$1-2YFTL>k*B!OVdrWP2s*e1Ou2I;J^OK?!Y%@glRZ^FIoMJ` -lv``q^s+?Tk(-h)d`f_^uxLtRhRZv;_0<b+z&cy>VFrERO)nP?IOu2knep5+NdEmKcxz_(`J09s>*;w -Bo!-ax%WXiRUBLDAH9e8|S$HD}{sH0}op^T%FXdPuXDo#yPPBk6kdUL%R`HKN0uK=GyrcU*rI{3RId{ -qT76>C@-==6>wS9#Zci={Z!2q3q)#LF&0yu80Ttx~AuB`|;!XE@_!Cw$bJW^<(Z`6)~_i%O+~+G@GKl -i+s+T26Ok7?#*o%tlvQuqw#Ues;p6*z;E%TNbH2@9>uYUs~W&k)(V4PE7O)nXQNgNDj#E3&c~Eqp}MU -cM~yMRGGCG(x4*wTG44FRGZk+CurT}e(;<kUgmZncCcqBu>ELz4A#4k`Hn$%s9qVDZ<%Wo-u-@4&NB* -0JLi>e9ngght__MR2j-D@zoG*x)#SxQ53rJ}_l35%ncScDbA&a8}*ln+F1x?E~#udO0j@Bqg$eRWbaH -(%W+TU(5B4sZ_xdGm;6<t1?y2S54M&3fF_u^Q$da1HdQNhlrx(hSs?zwO=dmodP9WsCI$>29`l7b6$_ -K*+V)BU%-i~Y+NY@KZv9Ge7if8$V;8+E_l%H}t7xRR0TXoo&I>s;=i9USFD=Bk_WXH($J^zgj@u~g*L -z~TU;b$rpg{Pp6<;0YZT$WG-uRKl5uF6}0wLsg8-m<UzU8qKCT2jz4(o!>!3S@q|eMAY5Z$3GP}nG5` -E!pQOg&FhMwePs<I(gphVlD@>K#p1KL<!05^V$@_fE(f%B5F^T5f)R^lva+VmRdp53l$;8Z3<?r_f)u -)Hnpt-h_hk^HkYMJ9tSC)+>MB^{Zqn91FxyGu{*vLl7V#yWoNV8tq=K(g1nc*D6Ax(gv;*YLG3Rs!dm -hJJ&3a;R{XjjXbChS{CR*Yv8y%|=h38eRPLEUC5Id!gN;aW*sd9?x3*e06cHH>-6v7~BIIwzptb_-?8 -`Kof9{1Jtj=SD;vV4haFkQ|iE!;h4%iYwoFfHNo>G&n8p@9074ByFJ_MLRtcdUT}@?4J$TQsTJw8id5 -bAk(eAL8fB{+|>!6XFhWzpae<!;+N+EOw<;U-^C|{x?ud0|XQR000O8Q5kVek-@;OAR_<(&6NNE6#xJ -LaA|NaUv_0~WN&gWWNCABa&InhdF?&@ciT3Szw58SDtAwmD>I3^ZF<_eJvVk+zb1BG>~wc8$;q?`S*$ -5hOH%%5Hvjw02LOT~D9MSF-t9ZR*Ty7)!C<~H7z}_1;%T<H&6A61DRv$`{%QdK`&t|&IlQ0BdFMgrfq -0gT<-CxwSk7aai*hQ(-Xa>qKkCas{3`Pz$>w4wd?W%a&{dzh{l5T&+iWRj(XE(grC1gcKqQ5jB&ihgW --J$_NakXk%@%1A&Bsz)C*_oyQ9wcf@plCxJ1-+B9YOg8JWcF!A}R^tX<06Y4<BA%UxyJP8fN*$!;}jZ -51$=AJvcf!*al>&_^Wv;i$dh`AIl_%Zl2$YXaTs4qjSJ8jjlzOi|8Vk@U6@c*XukflljF!6xpP_j&cc -5;-o0^<a}Ay2&FND{@MkARMA{?_fEv&Nmu-^cXD_#02qHgJpK9j)v5UF-piMJN2iAeC*t^}czS%ae|U -O$d<0KFioK)1i(d|p_6I@&nV=bYv&a#DKr%rR${6W&B4rJMNyZ2j3pq|E$r$=IzgR{WQe0$LGM__t#6 -sq?q(DX%fL;tx(qxvDQAuwaoeDdhZnxVxg*Rts)Vu8LOaQ?z5o}<+D@p)Y5Dw3h`SM2WYgz#0zF6ehR -T9ghlgy#WjM@{?dA2N7b66#|s)(c%`4Vu-=D>sHcq$^m7&r(51U&1^fa%FxZs#(JiHVGfI0UKz4p&NA -t>&OFhb3|eq0Hqq@F+@4pbLDxl0;ZJlXIp8b>ziuInCxhq<eCa%%ik3T-**P%lUYCwn(EAL5C@#KC)3 -i6IcZQ8VGoUJ<;74GwjJM198%2qBJRQL$Nnsh0VDfM>8qratvY+<+t<#)r?W>d>MWvVhKVrj!^bk`3w -@k8C6hx89qT0fI!J{$-<t?S%xi^9Y7$vkSKAXI4ldmTE^5O&_Y8K9ui>Z&%`w{C`EqUb}U?q1od4tzY -~5<*dQ0uBCFwXE)^;<>R*L#*f}YaG##Lz<X`~czgaZD72^mrom6$2pm>ZCQv~D_rb-Mt(Doek9CU~@= -uEW)TCtSk@s~S0;#;&X1(=uf<wX%L=sVdLDuYG7I~$>dbdZyE8AEmH0Qa)I6j`DF0)DH%id*yYw*s+I -ucxWJ(GO{M0pfOHzAeu|ez12P06ifS3t&P+f6%?WEYPF|Jrc)Wf7lW5%cBHj<dDD|<aw3{y;t*Mxxi; -2vj#8}?;gGHh1`q42Ho#>I-^%dhkpYD_2d5GOR+0@4`n&-bw<Z0qn8KI4)#tCMqu0yj`p4(;Mc4Gl}s -h@rq}5_7>d(8ninZcaY>4bnl;C!(&TqENi>!m?svhoE8_{GJOSM%IjG<vG#pTh0f9j22Q!Yfl{~Tq2$ -T3s%s`4WG?GKCwIzO$w?px3lmdrAN-gkMy=sEsgP<v#SuWG;8jK=J+W>(H9=p!LxLy`cQL>-K7=)sz+ -NNfQ;z)HFN?zfcuyb_$^7-Dg!~Z(iM`9lC1Nq*)zYEcfiG`1K0_L(@=5re85FVCJi}R80CJe-&Lh(lv -(rTu?4G%S$jzrQ=LCt3;KPYmN7WBZ3%6yT7E>wT@h9IkXG)`r2AjAW4On-|5Q-I9~0{}ZX1+2`s>ny) -4*fb-Yd@56h^77|{XX5MdN#`znG$R)XW}cw^o8;MyK9K`82h)$xz!OqMZE?L1b!cl9n~Z#oDotorluy -Cc{lk;fm&Y~6GGDwbxEY8i;SKRYya2_3k(KB)&gRI-7GjDZm*_gkxZlwYYAXjO@buv56rO)QczFT{z1 -TZFJ$QKp=;Sg)-xdG_Y<GLX_rur!-G96FrXPe`{Wn4Xd$9%YPEMbR{`bM_H*xsIo9$@(cPJ6}>60uXK -qMDi@ICyZ-|M@WpBp4KYdjrjV6AQQYHZ(Jf6;%vJ$f4`SpQW1Q~%!>j~{An7izdpE<lulSJyC&5QU6# -bjdCV*-cP8{0X>QVR!<lF+#mqp2IX@q>$(h_$^o$Gq$K#nVdPVeB+WT3<FzfmG3~$z)_iqrUw^HmT6j -hGs1rFp5{xbhE^Qs@!ywZ0)^kL9WV17h0WuUkT+W{!OJ5sXJ<hYQzHZIyAD8BV~MZ&;9rwMC4hf{RVP -^r+ExrZRCx=ktJ-I0pqGaevE}c<7J6P2aJ?kCQ^22MnW8cf9MLo#p*Tjj>pE%FaLQ8SVTF(C1mSbKqM -j~iRn^^ITh|m+m9cDsMtTyBB~KhJKN!1?at};GOKfJK#<?c~+||KX-W1Axgq~U<4LK8Zp`#oS1e6L3$ -2ck@n%|J@6lUHmZ=!LTqI1vlIFbhK=_fR=E@<*V5C~k6E%Pxd<TRSsdgHkN@V%sVK=#QD$H`<ONjMoB -M!9V+RuFz*I}3P?m7;N;6*!$q%Vd$NE@@<7DuKYvq$j96_XMmzP6}`uWH(WWFbw;OMtjg0PJ3Z4QK+e -yMwh@BJW2tvxL@8uk09~DXGUCEI0G&sfTM6`O)W)ZYDr@e!9!FcF<;Kk0X-0~MYdR`QSPA`@Y^;M%xW -=G_-$-*w2eyQz;Af!{ZYY^cDpkm!^5<3yUD~*JowS+si%k9ASfTO!h+}pY+{Ypbln<ghr6I~1+gxn8F -`$ImpIwQDY+I__!4JQ2_8uI1#>_No-*Qv?y-%S(X^y6p^8}qh5`OlqC@5rId7QmV6RQ<ZtdqjulP~ze -FKz#c1+|Rz;~DD%Xzu%D(K=BJ@O|WLd~ardgM>&E13@{Nb%1=Z?EUu9RpXg!jygrkH;tcX(D5Apv|Wr ->5)Gb;Fek~oV+?YPy%GNaw2mu{#+qjfJlIOQ<d-$EAhu@7X6-8UD=~Y8%cCLtmgLMvDSw)TgIeuROl% -_GB&y^@&?S!d8T0;@S_dm0_k81h@a&AG^-Uz&S#?qI>47#GbncW!*lThAAkAvITwKUP{u%j_he15;P2 -vuToYE9E}=RDdF8^4>T`JJ&ohwcq@w$CdeoohG5GTO<8$?B<B0=On#xr1=Y@V$Uy~Y7UnCVz^Qc%@BK -1-|D*n;z$<$MmDaJfNm2R0{^_9Gg6QD1~ED6Mkd9*QyDa7~^BeC4fiGJj-H)vB(p!n<GK!7Uw`fxR)> -flddczYUMNwkS7NPGb!JzEV9dm2-6xDO^ajw!$Z<;V#Ew}8D+4B;}kNuo`if6`|B7VRcP)u2tFDwBoH -XLG5IVTyyaHppP67ivZhmcEo2mF8F%TVr-V6)gS$6SncC%+E&JDcgFMWtYo^m?knuWxHiFjq^I=_7=m -fEj4r`c~SD<0JuTtIiO#gVHyLhe1>Xl;NZ246}4gvMxN576rhUeDoRqKGGZ{#=G$_%C~wV>gFaGh++q -aCUle7WIFowo27ubDZxnHHLm|qy)&UV4I(G_mveZq~CV1B1?m-Z#Qh+Ci?&XZ=YsTIZXJm`0D5N{!IZ -R`rJeLy+WYS<<?+LtMC(00&OSQ+yR53OA4>&qoOtWPg(_qftE&7A=+w17IPkv!*jKIK)j2FkVEJYrcu -m$-1@KweGnkL6$xlki4$acLR#bFANZKB^|nJ==Unk>}ICN$H<p()o~Gz!ZNQxHt)J^T%@3Y=XGguDU{ -C}$;^Tk{U~WeNpONxjd16ni8xWB`mGjLO@DrhP4T;KBAJnncmO8QxUOM0T;&63cTX;~Fsy*cP!$U*ij -m|1WZRm1N5TCNY&*DriReeQ_6*_>~?rI>5>o#<BslRF=29KjK`r-7~foX`NFnrc3Cpaff+&WxK>Ut>$ -LkX*4xss}2$jg8+INiULnOS>;{^GQ0>ym;EV5soVE9Q|3$6iUx+3PeUW+i5B25;etjRXz?U`96tW)(U -&543QE=2O*IX>G2*9Iw?4>zE8A^=eTe<`QCxi#V%uY%G1{}Sf%k*>7!&Urd4CJvB3-}h0xA+rV!N3ST -gZSCv62ceULKsD{(W>G#E``}PZp>oe<URaM#K$x6TYcIWGWd=3A*2^KSxOn?V!wczty_)UDrS(1d9Gj -6u@mW(!0`BS@ubrEQLkQYGG)nDA!pqV?jQ-5i?8X9y?~t4H*~4^-1`s+xJ7QY?i5*pg)4BPi2u%3`et -+D61XOs(fKt2W8TpVCu>9C|P8E)AC6+lTIW_#hpxtIEYcO$W(DJT%k@l6C#<L=vVb!N3(RG-LsY)!c; -MWF|Jz4vHf!s4#QlQNpgcLu6dH>3G|4JV-?_tQt*TdaZ7rDkY-t-F=WCRktR~0E5K8F@lCixL%Oo}VC -nl-sBsHrY^w@Gf{%vT1Y~B>x54F*JWJUjSODcBaMpApi53GJfnmjP23;2-w(^!;uknDSpiY9U3Oq`pB -}NA|;VMZCJ<V29W>d>;62%uCp)@rO)Vb4WWW}g>I43}qdQjII-NB7U%Wwq^5du*r#~g|RxLPRFX47rO -6bDzQ4v&vUn@x4vpuFT#A2`Lapw{UFf>_w3aSU{AAYfTaftCvVsu|JdEv_6LbxW?#3?>TZJ!;uSF%^x -#3Y-*|H$!UuKx;Yp-evZ?VW@rb3eT3otUhw_nB|OWBb>h$!M%=Vp7pU=^jnq>1ZXh+bG}T{c*Nw~WPO -ZkuU%21QX|ir6t%j(I+pTPx3OIdrB=8Wj*lxT(Ij*Y{6G{cEzrNtW-W_s!gq_en(H+hZNzn|ac574-4 -@nt5N<W9E3BPWNgiy}YL0EuiO}`-_3{x~7lLJnU*fFXE+kSDLlL@)XJzCwvZ6_F!wOs8He&_W_#;_SY -hSUVkl=>I|2KHipt$CRt+gAmf+|=mY@eAEwdNHg!28H!;z7qAZ~qtap+W5`nd4HnER_QF7SUK*eZfGv -l}Lkud&k>X!7jbbFix{VrnfkX>R9EPaV){`-9?ng6iVdfNX+d-XgD1O4qgClX2c_%yP$Hq&|h7o?)1i -Luv!MNR_Y^8=;AzL^f1=DwX{@fr?B8aO1|tII;(|D`+bgc6dDPLC3wDRQSsO#5Z%N5(X+!}YOa^P5Mc -oazXk}V)_uRVGX5u+r!R}kGFwnuu1?W^$QeHIL#X+%0u)ZmS^6EWW~>k>mK!BRdKS83&D~5?tH}~$y< -U@<_mwtRa~tEQX?B_kqFQ^>tzuF~yM8mgqpXxwxY~G<^%=IAdgc-)Hn&z2A+nSJDKQ+FWm&T#)xG)V> -(SSL?uINuX2r@vdmdwE!E!uh{n0twn7~b;!YCEcKB>ZQ%c9DOp>aWVt)#WGf<rL#+x7CiRc8_UhAKR% -XGa@MjdV_oNo0vvEDSwWZGHTbkP{)Rf>j&D3s=Z@CDJ;h1l0YG@u;!PX=hF&bHp_rMOzM>$6(EAU6Z# -$<hL};71Qi`t^>-|<XOp~a_YlS&8D$u!=d0beI0ESDn(TPdP!WRiPpd9EJOJGBz)BJmHl8SQwK{$$Um -d%PG$az9s_=LLDN@z9K%ArT9Nk-GH9f*6sKOesA?8t35t?cz}{QQXNK0OU&}FYmV@z^63hTCC$L2z4J -2E`0~qa~0_md#J$68vY{%**#IHC=t9j`yvd~TwV>g7Cln9)*q*qanYe*JC{)ET16DiDJyqAo`nh=QX@ -5D#WCY$g+ZhF~(w|c&*#A5xd6Jevwt;LKA-A4*%yCbQ?%P6X@S6R6noo2^0y*6<xEu&Zub!3G$-6JZ~ -=3!deg`w4mW5XcH+icet5llOcq&F0Z^*~33oDs>^p7m~qj*sIOCkGI3UefMbWvdGhMk~qHpo(_FtC8+ -AlFJho`*4!^fB~5n%W^a7v4LDm!6u~?3HkdUKt<o`{0CFf1MJ>}&r6}Ex}rZ87^kdtW(X8hX$Wz1CbW -r0+B4?0#Cc&Xmo=gpB+t%7z`k#Ph<kN3SQjq^j5|?5s_On~`;u;Lz3#?clsAB-A~>6DdwNkXYutOP^q -CEf!%vUJxmS+2+X41vKR`47Rhj<>m`uMgIF{jF<-xbH>Hh_xE(o8|>Nf>ooJKHDA)4Fi_Ca?3n;e%8_ -h0BOD$V^{Q9IviI}13g7Na=}in`%ybi7RE_C=bVM=3zYqY<qANQ@xHBv^3dBtq912JJGbQV*m2g0@7^ -GILbw)F>58;8+>%$H~$prcfmBf46q(7eI4V!80Y<N;rMxnBqU&LK8Gg+YBXtKP{#etQ8yWhYONWhPH+ -wtq7JTv^ou<Z^B!cshNVG&Izd~iPiZCnA)JyomHBng<?_X1^52v>>9UzQX*TCluLCa#x<p?>NE*+c7V -VWHFVa(xU5ZV37ifa6W0c9P3v?F#+CDJC{E2McvRsMHyMehN#>vrUy7$r-AU$G*`-QQA$T4$U1^*aNi -iBB_eZ0kkm;luxWFvbbQ#MLK%;Guo+8$ujacpWJOL2bR;z+aO>I@x2FVdhwZp4U)r$yMLh4$rEw}+z# -VKs&@pieQ#N1=0d2^%LMwgAnF}4y+A8!8p$C7u)>9Z)j4mWS)W9#RFuFx}0;2AVkAh)*D4h0OOa2%-5 -pnh0Iz#78~4-98#7VmJ7InS~bhKZ*v<0SG(z8bN_n&F++4+v_^p=}FI3ndff_5srYX*YhPmPkO;<ha^ -8#lHn`df?K<Om%#%TqkLYDn|obSSO4lv9%ExWe;1kbBb;9G+ke9w|TQPS?`sk*>ghr0WYDDE$%bkycN -`XZ=qCX7A)OhP^@*!`#%2IX}r2Ed~oMKH6LK$(8R|Q7s4ubcx=O+SmO6XJ{emg!xY{NFQW7UQ?{lv3! -2p`^JcBHw1z+4`MSdv-gGq2G=esdJk`~pG|859en*RPaZL-<Mtps-JWpZ7@>tU0=g>tMtCzIU<>xy>w -gA;v*qDMIdTHNmg&2K$asH!v_7cw+sxuEa(aW3h@a*uIP8~WMa+>bp!(+9>jQyO(-V|X@j%X39(A!LP -KvMV=cQeK>_(?Z@+A<VOqu6Sv$Y@a%(F-y)00N4<Wr_Cp-*sT>`_X+hPcZDQvD>R@*EGUo*vz?D<0%Z -{V;sYUT8-r&c@Th|RaDLaDlI4LLbmIKZd~Z-l-PBBG-SY=nv<3lA$BGFElcKseH7Hdd(=k1-k?Y1p;6 -ykXt>wI^IMh+p3h){MP7$Ca^lSZir-(z()|`Vn2g*=YprrK4C{~qvnwmFNyrq$=-qp#2~R|_)=Epn5& -^KwjVZs%<*s|cDoTOhbuu&7_HtTHnCtj=n-k)$Tg3I(-#z+M{(c}D<$NytyT|^rE?air?X(nhS+M)=% -a)QJGVZ?nGZgN3^%-W3d4^B?o3oKNnQbZQcCM|M+qJfGo{m}K;W;yc=4N93VKqcIOGH*4TH~3V>oKO< -cxXV8B{v5pZg6&r_sA3jE}Qs|O~GFy#mHTQY_#P!g-Su{LP8wi1PN4jKTTQhsVMG895f;5%s}5aD+NQ -px7Z5+TlL-wi&TevtjQ7FoN%;E?jsa!w$w+b1WGy+bO~`3v@oT@`g3LAlQ^V}!9hO+%aulB8T3SNAbO -)-zgAaqgusSiDebn*pZ%&sc3ZAyQ$!HcJ*p;>NmXO$YuMXK_jtZl?Kfi5J;RqQAKfo9e7fB#Y<w}&d! -~pvjLpJBRqgdEp(b%>E9Kd+>&jcp#@%}pbd_k}Yns|?6DCTkaXkWPYD3nyRP=I*o3i=DbgMIICAM5)< -VAW7;#Jy(qoC^4QG_{c0JO2$q*MB*Gl_TWrc((D4PT8q$)wtd=6<tqp?|&*U~S<4s)8%0EMj?0UNsI) -k@aN9;jcw}odo-Pli(`%$A^IWS^xoFH;12wpj11rdcNVRDIfaeJYQ)q<JYt>qHR#F+oMisT<^nq#Jx| -WhutoWHuu){8jWdb+`xM4G78Vj?b*7HB375{2fWy1B1tB64D+L+I$xl<uaaCgm`pm*uqL)r?S2h)NXb -YK29;6U>BRQ=Bu&O8ulP8yOq6Lxr&Rt$(5#vFAMiqw!4nUs!H^Gys@=c_!s5MtSZqcI)t^f~Z4SDE;R -kRN`PiVaRu4l_SBR&^y=fHCV1Vbf1g3VwZeM(-%i1rkEh)Rm6TfY#xOQc}OFEI@18@?5x?4l`?>v{$W -pj+6l?(fj2*>NJH&!*W?7e&RUIgzRzwetvpv@VS4vfBQMYVBtO{m&9#)kA$m`>Uoh^1WfuC{yM*{Cwc -t4-?&D!Ahnb&hidZ3b5rymSXcav^W(r?KKetnnB9H{tj6@Au{pXYd3Dji(aLd<|Gg?*psl#vrb0HpQ- -eb0xH*YK0ehwp<iJb5vHcU<2Wi)d9t$ty8N<W^zy)hwEG3?k+_29e@5kR-T3Z4TQzb>GdI^I%Z3Wy^r -$sqqkO1Ya7Zwpr^GBb@iUMCNON$Pbb&-L;CsH>St}k*4?}5+bs7n-E*>?Kcsg%Z|&I3rSweSeLY#Z$& -3Jfbmvqy_PS1aCe0(-VbFKoVq^a|>!R6sa}SKN62$M^AG0B1^SRsFDqcT#RV|y26!HC-xy431aGX$HJ -x*|E1|a0s#K-jGy2qTvyDdR7rAWJ;8J|kH_m*eH+ikXlKQhS-(X&;$8Ehrfrph<B^ES)dwt}m9cAwf6 -92lrmT#q*y*1u}m*>yavs+1KZbQd|+>*Ggchga?lC9T|LTf)a^ywk@G6yJ@*TXxx9*ZD&Tw&BKv`_NX -m!<$ggty7WDw_x>$P;kRd3HL!kPoFm-qNkcyZE3*ZA;3*ZZYAeOY)&x1K8b!}4?aLYDNbT~&p{He%6> -v(d34gi;;gp&wrg(3K14NFQqJd^d>Z1lCBYLW_e(WTr#?^}SJKX#La@Tr{Upnl+)hIzD}~NIFu@_bGa -uh;v7dU?-;*rwqL)le;zm+nn}Kfu+=&R$QZDZC_ZL=Y-I^E8AVQ4;9ACA7=-6rvsLQ=~YNzsl()CJX& -hD+a)Cv?&2`gH7^#Uug(qk$AvAFB=W~uT}9Kr{3xyxyuEia}PVE=t$VS`TM08iP&I%0-r9-L$D;F7a~ -bWRo}c)vRRar+xi?4i{EQZ`{VmJmLbOfB+kQScpQ`c*1#C_qHF*M;<d=EML`LQZa+MI0&~UQeMBI*Da -eEYhTe`dF;$zym(n8lkB@2I|JPf^q}SuCqMGyr|-gwu%!oINl7<fH`R~uwc!iOLd4uEa|{Wy!?q7r8B -0qol-Xe>O999?;haUf6gt2JK+;fk7Qh}dUVI4Vp}q|fb^0g+y3U8ul{5EaZlgOBK=)Ts*CC<;8|n;1I ->3{AD{$OETnSF_NB=%(^o5Enx49<$qv6i&}Y%<i?Qeg87+*wX+|BuZVqCYBsaLBJ4>%rj=Tje2*Xg{d -Z`Zm##B-|{StRpkfem6rK(`7@XA56Yy#5w`q5hq#P6uPB6YH8pae)0Yd|z995dz=0`YR*gfUSkuz6uE -W0%>bq%|}=9f+H(M3{V5EI`UmCEW#^y^^;gEV5)?4oJg_sZ7&titQk^k%pM(cP=HKl>%mfcE31q&?}+ -SA60H6ZX@}}GNZjlK$i1pd|9MXF%_~HM+;0#!OaI_=`Q(L)#<vPZ8ALSC~rI>eg@LU_w*$xqBfV;q{I -#!6u89#OUiN__SLQgsp-Y5M%U`fT9+tWm0UxU$;F(yHpI8P)%7}ddF7N9>bUYGul65_fDf+0<PztS$V -SAwx7#zUYK~Z!191hMrmrDcqW~%l#AENuvn7dFe%aGM1bSuUY*|jWzws=9lSO@fsgq>hdKY}4-Ah`PQ -YY86tQkFEq2mL03ioo<T2wA6Y@6f)0c#XIJ>KVR&NC6<ktqYg_rMGUpFGl6XG^vK$#Ojuo(+VCb*9gw -4EUOwzGqw%)&an@GQx@Uv@jC9+5h5AzyHrc@TS1Ek^L`#PghN%Dw=6Herh=_nKO@Qg~PMJv8oQ~MbHc -S9u99%Z}36Y+Uq>9&V~ndjnu)%eExDo=P&zQ67^$|tOA;Et){(|nhT)oz&U5!_yNFhOP34MK~c)Wm>@ -Z7zt5aB6%0PQ9wwpWIR1AD6K&x6x9^nt3~t(ZhIwE;8;9+vBDoq3&}pl(=3kK4Uk^*pVkc_?$1u-Uzo -LwxZ@V_M!xsmQGBVHIGFFB*!5FA=fSWFc)I(n+D($SvMsa@O+FM<q)ee)3Q#Hl{f-h~~gbVG8M|DnVc -gZwPqX&(ffj7C)o)y{hre`qf->R-mt=1p!JQ<=^JXPX^DnR>ld`(#%dQ-c6?$&VUt@v(N1YZusSDq1# -uaRE4%OXHT2P8EPd-{&HuWEm1AfDV;`<u4A%k6&svF-LZn7I1*zS+!Gg`}ESwNzVpKYsq|fv(M#OPYU -~DJ(kl)D0LQnL_o+1b*73e_S)-c!XF)JB6GlZk=4tzsoBPN{#(*=DoglJBLlT6B<atE?-{tF<WS7#VE -=At8QyZF~sJUMw%sa$JJII@MYccBtnI}6(@Li*-YQoJ}Y?e+9P@22<G^P+B+^O+$qlH2}^#SSX<k^5q -B1JNN2R;MM(zffw-pap!k8#gC&*c3zcXmrn*YX97d^OVJO79EUdcO+D^+;uD{tMw&44u>$0IUyzT8u- -t5SUxiZ@RwROHO%Xlr9a%FX7Qojl|gYZCIBc!{$u<phN0_NK*1;L%o;+=fiOkVRr7I*_$mP+)GML@e; -az5SHbG5ZEc@c1}Zt4ZTT_Yg8$jtE4=DDD`Ki-Dan5(P%!|DuTM(&DrcYCV@Filr~_E*!2Sp0vD+XUX -~lrJ?MdhGRQtXeC)4UJ2|e8-SVoaD8Qgf5r=ibs{?rMgoQW-w)Ro}`%BiV3MSujNBIN^`5QzJ}O=q{P -4+lR<Lu7eP0u@O3Ezbus0@zL^qqzY&TthT)9woY(P&Gm0f<3pI8oxyY^^^)e&~v0ILFs4sTccjTDD-m -Fo(<ht9`{gX297=XWfkuim4i=0t^fd#b3d3V*$(st<hyPLhzEw)AqczXhp)B@Z-rF~Gl8cm&*s%~o0= -Oby;q!K4vVXfFBtI=+)dq=Ice=9WD`mC2?EdSL<U$qBOQ+bsm8?70kTO3yndk6*UyW{`35#L!|^K>77 -)ry)aK!@2be6HLvowaT}{_6G{I*Hqym@q(#bMoxqgzcXPkZlp!GYrwF#@W1As*!0bXJOd%5Is}XmJJe -<MTog)2;GwuzR@aP3uFYjMvBNOC;#s*5>*Kl)*s@kv|PEQ9g62IQ=10iTBbUmZ)Vdz7uk3|W6D+O<?d -hr2Kw~i=oFqY7=5ts3<`~w^wi+>aJc>WZPh~Ef?Kn(wiNXTf->9}>MmBk8}2A`=2tb7XyT2v?DgPFg^ -brXGNpDr(SRCsYm-m2jh&6!c)YHSTGZ67>$E`e4U+2(C}Ok5Rb6{f=ya5lLY?OM0o8p#Fn+7PBs1LEj -Vm>z<1F`Sc5y+=#P|oQ1Iz=T(Ys(o`?f}-zEv<R;4{p5(m<ErKltI*PqiXZ9REx!9l0rVQi4I6>9-i_ -QE?y@m?4A^3yoa3r`D6mtmJ{Umut6crL1J6gW%+4X}52ILL^3dO{$Xp-uCuy1(@1__2xJ0X)4pjZugk -uIaMmJFsZz(@7=0KG-jOWP_hx;dZ+M!#!*WZI&4+(ojz0ouS<Z(5b>$xLXnVW-uNYqm$O9?@M#oyQXM -Xl@BVo}Uib(PVdrIhZnN&<+pu~^xZEQCz32^USM*wyjY#TE_0~?ORl7fviMN_#+H72YRV5f5U*#5zJW -DP?J0kv7rWz*tW(XfDx;m;-f(L-GHqdh4XoQM28maX@*0Rq308mQ<1QY-O00;n48F5VA#HIylI{*MMI -RO9|0001RX>c!Jc4cm4Z*nhbaA9O*a%FRKE^vA6eS3Esxv}T}`V<)HdPv$7MN%>?E0(g3$4+$4#GX6j -B)jW%c$#EW>X_{2bT{?LX76X;s>1ux&88%KJh{Vr<FQGgP$(1%g+k$nJ@zVF-R8-~Wyyy9{xkN+EW23 -5>^z<JcJ>(iKAFa85zkneu^)bV!`A66&RGPt(lSpb>oUvP%ZogYmvLJ5c6N4mcVDu3RFqw|K%&<%kv{ -+7>gWLe7_nuPCad)#Dw8aQB9lDIZ&{MEA8yObECmYhFOx$5P_VUVeVWHn86T{&Pw{~w5))+>r87p<qu -DHviy|&|@T)W~ue1D9!TH+RndjM(jmPtKxz6M9m?g_qmY2|{WSY(5@ggbXJX#bxJ3HbR{G!Y<_)2_Hl -=*sE?(B@mS8-lI7l6tsYYlq+-r!kl2PF0?TdtsUlLV;UviUllVo!^m@sxfTCuun@Z&z^v_1f@{ZfB>= -Z%=j@d@9SZMV4N4cH*09yeiq-Xc@oG^DO7JR#8#-G=Nj6ExJ}w(=H2t(ziekdd()cB{1*}|2~<sN$da -gTOax#+36|kpD?y3hKwDuB8CAelW9TqXYpK7CL-f9qrZ%=K)7xATZcD~pFD=KNU^b<cu~YBcc$=x4^3 -~KuA=Fu_N4XAA6i{D=^)2*P|^u18Pxn37B{MfZUUqMU-s0Og%se+l54#wMUz{f6mpCI?XozXB~c36X) -rHjt$sq`wkF9%%jh0*(^vndzFdjUAYo0+Aea<MT9i>bjoXu}uCG`fs}gUcjsJP^f*p6*6KKK}F#HM=! -|bdWlmb;0H~}q<(~I)b@2Ss}tWm*Oy;wjQc}w{9k?ucy&*`!ktj|DB;$LT{Y{(uzW`{#tR(X^Zv6#}m -7zeby3svF^uyEPBWZ4{wq!%&Cymj8f|1P7F;f&htxbhKnr1qVI_VM<4$#`M0Js36TdoVn{599y&pWAT -`<-3Z7Gd4O>|N55oZ|2TN_D;@S&EMOsJYTLBv@*mqnlSAST9V7Ch+rOZ%Lc<*j=5Y~LS6Q-DosHB8|y -OAo@va=OX$aSmbUQE{1Z-uVec8czKrvj%p{9%lA;WlB1Nm6_~s)q+5#>sY*Cm5N*U)4u%Z@>-ZWdMWx -Hb!9F8=~lqMXSQR~;*$wmX(hUt@+G{Ha~WxP5a*i#I@V`su#BxKZ~0{!dyGJ$nH0Ud+dy5ZX-Ud&jcm -61I;B{I<dbOB`9_<dGJi+4FJ{7HK8=j0|y+u7tF@l;yj@wixIWkE|J$WDympW?*|^pVC3t6o8$%gdN$ -@JG(5S9wyv`jJ5~at8{Arc+cOj~69S#ASRuj(;AH#rJ=US#*^pGrqKvs7vH;oCyZmB%Vg#G{9J}Sr!+ -lDVIQI5o_f#^b$D9bLh+BmfglBYhRY->g3>Hvc4#KEAEqI`Ncs}6zh1<?;j02S}lmLb`dY;UEZxugE_ -Ec)KBBe`ti?em~k)^@M}-B#LJj=gO>s?$!^Fo7hI?8BJKo8VagFTlRq4S`}A*7-M<Byb=f^?$nPE%@_ -L6R64}LHgFUU0nJ9r(O-3)OJ9-aBw;6_CV!YeLHb|4mb}WH>mXW(7pM11-&VTsp(f6<4{_*{vp!vfg{ -(GeU4U43*STFf5;IGkQ%^kJ2{;TK+?NjJmMqfj7xSgP#23jexk?7IBL6ChLm&>U5bRV)QCn3n9sFT%L -wAB{>)ui4>pMaATwl=s%gKay2MUhOR5DxstEio?nNM9H;hQ3sfkLSz$!k8tZjT81#kQDv~`VL(p0gcJ -dGxj<mYfYQ1EH_5a-fh9I?iTDWE7q&kB8g|elOzkS2(SpiGX41R;gDS?i-kdFf;^{10=An=X(G0ClUv -lpXuT*!KYpYx8(n#sQb{q`*bih%{gdP(>!PtTs_Jn&L1o2mKNg*NO#3O|C83og<^qTq2>|~)GPoCYcI -1H3f7SlN&|-s8HO$;`;`@rWr?OpN-HbU%d%n8XMxUoObYQd>FKBo9UeQ||{Ap-S|JI|N7HFE{(P|Y(x -ln*8l^SR1S&y}B0^flfaGR}(KlHvLv1x7NhE~NC*s#Np<v4<sWA2cEI%1D3H0Jj$_J}E=?daYZ-PoFQ -py_#frUG@eF%U5eEnA$X)AICvzK(x+%OJShXc=VW<(D)JZ#fTgEYv@@Gz>x*+gpVmdzVWhLLRvFVV7A -^GT2HKu!KrJHrbB1VXgSgHstfR`pei7rNO^CTOv5$!j|A%%jc1n?k{gZepRl;xs;zA1LKP?W<_`t;3S -(ZyeDa1{a!OfE-Hv?78lbz;p(G&AyjABZkNe)y@<4|#r%eOP2TBkE05VEDw1imfbDREoAgPN@=!f!!3 -5lV>WrYPM;_EhnpeR`L%VkFY3S#*XrHUSdrWIJNt;gWt0NvR&Bhq9i)a4i{xM#`7cos}S)0MibHsQJV -cNi|$#tncNiOzzxV6J5lCoinr*ayCbVXxIPh<~`>0U9<P>m%W$){kE*lo^d-4s0MQ&2VpyV5ki0B)~n -UYA+MU{YMfYJ6;46zE5tR(rv5wXhv^c?{cDIWvmeW$&&)7Z%yIt7)Eo?aH|w?#i5N*U_$0n$caAW-$7 -aS~I%0)&RfF8NJ&`4n|*oC`W22#|12e<v3fR<f6q`#1#Ayl@ZvCQ4KQy!B_gQXN5~v8ppGECZ&Uv*{O -M4s2b}L>2~Wt$buho(9a!q#)g~yxZQUtEH+shGa$l%;bl@{!~}-#QNC+BP{!EccTyblB%R3^iU^Y{?? -DUW4U~c<t%!eK$9Rqa8dqdFHUu4ALno#brvXXty|mOXsLNn#fY>4_$UQPD3CBQI{$ChfHysOBLR;jRl -u?qROMs&?Px69$U$A<X#uVUcOb&!#+)-Q@)>ArlF#1eCaFVB-;3*8~P1#O_>y9dwtoV6_eGIkgjp2uH -cs2U_6E?7;cKpDA$akrj^{Z?)S?PFTWPamUSLYmSFi@0<fZ_V_KjS>Z6PKc$u9p*ZA@Lu2Kwn{buG92 -84g}WWTdRyqjVCrBJ%)~8a7cOe6Er}=s`S)vNb3Y#(3@nrUK$Ni8<>=UOw`$_=DbNio7ZrMc`hm0$42 -t_JP`+8;@`_8ZR2;{(9zX@2}<8GAz8N12Az&HFU5MfjPm54u`{QPA=88KlPnCgK^j|r^mqY=EZwBsqL -;64A`AfQZk?T-(d24ZF=NKlT7&1qUcU$bYjwJcM6cIlwVxn~!66XobedCPY;TrLVRa}^*ps*Ke*E*x@ -6Z4D>+#?IbpHPJPd~hT^;(hoVD95J&j-V&z%~p1I2axu91hH0Rg^pI9~=%_osS{)Ch?ybBT*AH6}E<C -+_NSyCm;r}Vg1Uz73JAr=8#Z%HOgdv+eiNzb(A*Q_LST_V}`+A)X2n8LYjvZPf%hJ>~hd6w-s^w`owv -(jG0IU(liX`Gep;*M$RbEx}fByobP5;+d-~GYf^TCNjU(V9PKVfz71*9sgDtL5tDlShp33fAa=0F_D0 -00u!y|!9nZN@!_sa!GF+}P_7z*Q?-I*0VyOKHE&|zIxh9E!S2wx)sG#;9>5-CZW(*cO7Ip~9{Ft`R<_ -CNlnhw?OT+6X?s?XLK6R}ojC)`;luVn?xr!n!l)42%M8u_(Gb}c_o!{mLPeoC`z3JVFUipLc##z2!dI -)+7Y3_kokxq)>>yBxU9(1paJk0KF2NXLS{=Q#<w-iuRJ)L5TIySS*;cnOM1SMqAwP2&?-5*2^@1~cIK -bZBYRoW$IbX$KmElEkR7cyLz-D%rM}6F+4GOtwnZ(rqe&;AMbAiay!P@4p|vd;9t)+nh{5p+0H%X|ae -_g<2@%f`|WLhY)gyzt6H22G8<reQ{}?c;b8%w9q>RM|HZ+bKDj}M<$DG`pH|h4V4?%nrf|cqn2?(yc$ --O938nu537pe`skEBsx13_$jhq2wIcffeZjFE;va|j$I(a7hBIRTDi`!4wG!ip@>z?^Y`vIa&<~@M(P -Dx7j)do({0^OXC?meUN+P2XpU3uxkDX0hlb7b!MDo}woTHFdQME)jtPWeJ74E7r)SJR&#>}i3{y&ec5 -LrBPR-!%jhHU9Fh7B&?e`jO*2O0?U`<%^8v7UhTp%M7M|IaWSvet<+L*@6qRkmtt?I_l;yW}O{&z}6J -QG!y(usf%+$=*ebUMMeVr((#ml;x1d_S_WJKgg;dd84|eg-PNY`q8Ga$No$b!5DTtT~lB{P_@d<;)UO -uRYHja<B;jh>CPVRQ>0G@yO1l2&J^nfaVD4LE-OAIs}+6)je)}knrd<*HhCxrwZ%kHgGb1>*=;G%D_m -}hw&^us&;aWT@5Ptq9{Wio|HZeos&krMrx2|zf@3*ha81F{cE5(UBECtny)3~?Z<1%xY>MlGtZ~K(c| -Z6`e7L($(zTui{z{;><#PWUnCJns{YsRwf)9?5?CqvPHl%JdQt1}qr`ixhRo6s%p9VIw+NjwZhmA+Pm -GQ&C4n&GbZ$K(&IbmkK0YUd%obKqcStd7V(WS?3kurm8XxTn|6n>WR4`K8^e3VI*JdkI_hs=u(PIN~L -&kFJwY1k{rm-o|ESG)!I?}z=t$KKfR$I&zK+;RE&9B#SdYt@wu8Sa*lp0skw%CPGT5!_M^tMsfaFZS2 -odn<|^6iLsN3Q4B=UPCnz$CjFME@DrJq{Ko?zcMjOjvP7CI%TMloP2l#2%D#fu`yfa3J0zNe9=)AFfw -he-*PFT0ErIm@;I~#O;bcr1=gU%QtlFgx}A1zY*dk2C>D+!Id??R;`HL1k~;&N!+kP$L7j`#Z#4?oI- -v+<L=jx5F<C;o;xYad-(vo_dGf?#`V4-7jwfX_S@3fYlnhVlF0bQQo#${RaHEJa2xXo|yD=LiNYr%>! -0+VIH#eT^bQWPIDjk8(lKDKQ%@02zhv|aHR;Xm!!LN!%qUTYw+=*;kk)gii`54fDyl&T{;4$#beH~Ek -GFir$I&>XhVJMtmcffoVOpmxuic8@}v&#tdELllSBb^1#3ocNs0j*p|w>@02@Sk|pgB54k!vq{X_>zc -CqZBXS(YNX%8=kPCAYiCYfxC+}%8HJd_#6mrO<)jCbh3l7X1lqXSlC&uVHW1uDo@Zgg*N?=ma&=v8L^ -y+HvDTIP^33TeUzF++GyO+36k?yN0*$OJDOTJxmn$*IR8NqMf&Z)6^qV^>MEWiEXB16tj)8B@yF23i~ -oTFi}Ui9>sO51jMXBWk%3ywjZWyPM^VWvy`aMgC%|Y#vLf`Ec_vFw4uR2Eo)Iou8^e}2=P{aOHRhG7S -;UYGP38?uDx!Di(mchawyJo_ajJopTV-V30*uiC4=y}{2~mT6_x2|yYSFB-8SJvSchR#=G9GxSN!v4W -!gmM5XJ9n?y}@p$=Wt|EpgX8g42mb|K34BV`6_BPY-ZT+4^C#2<CBwy4K@G2<KCn<L)PeDLuhs+STki -ARwj20DhErbgF8se0{8N*N6@{3k}uOtX-=_<r^!5tXPBke#-)kZ?i#m6Dlf7DVe`Jk^fI1)q6`ZuQGR -zK@+=3~7_~EXFMx4wcOT7I8-DA^{jfe0N7be@iAQSr+qEcE9kL^3=%h~MB<TuCbUGpK&P1Vb?9pHquP -Hu${Al+1`L&$&`faN7ar^6z98Vt!4_+4yD6CKLJ2czz_NHUnPN=j8%OTeCq*CDTnzTY9^&MACC2M1C5 -F!w0Drh&ul}Oz`%azCkGF`1gojVP(A*rnf*A%I*+T38!!nus0cQZZqJVlmY*yeiGp5jeyrDKk{m#Yx} -UEbye5*Z3IDX+1gBEv=-H#?w#AHCr;Qlh#(>7FLy1u=-Sk+D!`OQBPG9<#r*w*3Vx3cAO2^5UhqytwS -Ry!hXPi?%H)0${*yI>PGJNsCkWMI}?2Ky5(-z$d^IH9?o(cWx}c4YGHFKKKdd7p~SNPv=~M@3DYsg{M ->SpKmd}sR)ix36o<1rN^S^X<Z@=m&8_cLw{(@Eeon=sSy?llw<oYn>vgMCIY|4{?XAGom_!JRaJm(l` -Pz*12D}E9(b9C)1nQAPgZpf!O(tHa(-~Yj;-RexCF)uBb!a57;xz-idK%F{0N6aWCepAEpg+^z(nH?* -BS9vzzll!PjKX2QPpRwH8V1g5tan_zKRyfOr-+StQ7x1M>pUR<#G{;7}b@<(HSyox~`CS1yVagn{9^p -yVwlarq*Gz)`CQs3<X=Isc`cf*;;JigmSV(E<R89on|Sl6|^^#RUX_}cv5q1MsOs8_F|9GJ&na8yT)y -fm?P}T!9Mx`*YRS3|1H+g%9@|dU0)`k&*0$1U4u%I;Za?jLP>$C!0#kbFdVj|=0rr^XdnF7qu%(t*RR -h1{PO$pcjtdRfB#bt@5QgsMK9Y`Lx~@nnia}w*E1~RZN*4(be5`mBBEK9gL4N?gb3PwjOb`CUW6>p{r -kPm^mi6yb7Jv-1{|13>em5YL?bIECWLTgEY04qFsnJ`(frzHm*TWyn*9*v6#EKvZIP(EQz}!vQftMMD -0Id2IK^m*fpYcNbC;VdmZWI(=6!z4z#*Dm;y5b}fL$-f_O3BE0Y~d#@VNi@fCo^dCzZpX+^jl1gBadL -;x+@tQ(lA8EMcWwXX}D&2W%(6K<(4IO@UhY2VWOE7|=8*m6Q@i+ZVx7ohVIjHsFd1FSMy4(3f{OFXyD -G(mTcN2(Vt-ay#fh89X^)N)yB;N%Jg5`|qc=&;6zP)L1Jx$U`2_)>8@e;72zF!UI{J@wm&{Ug)gb(Gg -7}P};V`n?@+}CA)}ITDjG+wV2(MCIeq`Y9c?rureN#l;@jZ#F<;d0#~=`rP3<GiksXbR1ksKc^RIyky -9=doS*d)Nmge08Vs1K(QZpRcnV3C=pSC*rTADoTBC~G<9eo}<}j}!EUmj!1NkD>K{G^-CA!QT?#(T3r -dfR~?IoGkp9*4RuN6EJG`ndn_qN2paV35)c4S`VT{z-*GnB>z1+7ZH&;?yReiJRg#iMWc*iR~^PFIce -#j1oK_|R$O1U7VZ0Mz3%l`pD-!ZMEdArMAu>8387lnM$5Ms2$2Wlu@2cJSpL^v*+%+eY<*Rt`bQ_~d6 -#1S96`fUbOPZ0-lx#M^b1Mhx_`{V4B{0@_sJZ+M)6w%#-KwiwE4@@~zZaCEG7O)9BP_A)9iE9v5o?aT -P4ZPzymxF>O8LTzhy^MK*KmPN^oyBf-a-)5_!ec|DAtcnI4s$jrc_7ZLR{bLK>$7wXZjCmI3SE6k|{@ -~F}Q+HBRL^#+DZz5fE;)=kb-XC#D2w7I;h@n+m7nC<ZwRq%QB1t%@zJy*28w3z35C8{5tjY!)U9Jx_Q -zJPaKZx!r6AZl!2XoZ$BUOg)heQ3>Ylx<5l=gBNb$MJ1ZYZb30w9!4K4F8drs)_op6<v;Th2!s^!API -YLS54G5F<rW%P)$|L@i-utLzWrJ79X7wQ|XKbWNI94hh*EHP+MK+~<tw>k%7awB{hc^YWKiaH@t%PiW -0F&eH*5=-eigv+%#7Abf$g4pNh+G@D-)jG$1l8Y9`131U#=j(Hnn{($Tek&%OAF7>cFQYt6Ak;EN3Ct -Gpi`tf`#tXYbjr)GzJ!s{wvVJ$}isZCHsFhSq^M_sRP(m(zX?48wuzTCh{$-_AW`FltwoHTc%_;|Ck4 -1~?=(b>U96eML#5@3RLEzVy3L6){8};r!%}gcHt<U0ULFWNU39ezvn^HcE(b#t8W{bw$dEzewdtMo%j -hexEVd@TU3*ei2we#0eV>Hp>!wlDok;F(k9<+#o!SO<HrNymu&^dYq=cX#P$-9ptDxe2wo4YW-H5Kp^ -o{b4_JX}Rr3pU36^2!7(uZ}y-ZWLxL?IP%6Rm-c@vJCi5_;QsdWiQ;-3i7Yo1;o=18Q^vD!VUI61X#y -AUN`Pw-&6@qw$VsVvhah6huhr0J2_r8-BlcH*Gn`2`gH7Go4B!;q!MmT2E1$9DmJwxB~;r`)d+6Yl2W -y*rqcD&xVYu-SKlgx5w$m^LtJrdmtVUJnV}k6$o8xEC%7}J;?+?&huJ-G_D320=<z8xU1aIEVZVJTZ^ -$cLG(0up=iPGyCvcA~vs@tj6(#m`5?@AFNw$WCW}0V3VF7O{p{vfC3$t-^AW3J*RWd`EZ35~HKtzO+N -};>iG~tI?f*Q%-ez~Q-gf~qkXQt>iO^yusQH%8~u3p-HjF;I}Y=VG^oC|`Z${F1OHv$rG5I@|z3XUJF -Kj2wGY2XgTv9lw?;=_vK1Hw14imQ9VgPz+rqSOJG(zE(i_YaYJ1qjQ~g<z4NVCka+M3AW<b$l><Zru$ -R_ZAz-&B)L8MG=ymSz+MG`fkFjr5}(`xcm^xKii`G5tJWoQT`aphp(~rdcB53j{E)o$;rXtp*3873Ix -rclSYWc-nP3*cBgYqwc>KBi1#AS0L*HO$TCUSg>dWY(<tn#tmG!5Jru5cPL~|`eJDB$5BTX!ZrQ=iau -_+apWz7@Ziw5g>ZEU2H8EDVh|AdWu<@7|ja@i2Dnch4Ho5ijiHEvvXvZfWG`fQ<R)`n*GEat#Cb<x}X -E4s@?oy%~vH(rxSQuLz;ob<oMdaRSjE~|ecSl1TM>7HA&v*rn^3ks27A@`cM2vvQQ=OYjZI(4fBXVff -5t-qC1$RSR<<W8q+5<I&S`47;L+Nu1m;(b;f@4(_1GR7GN2){hZ!cc!jgK3O#*YX`54|5WKZ5`__@SF -_UL(WmMg}#F3@aOPclY?&!^wRevkOoqyu(Q8UU}T2l%w?pU3R3)jlQK8*9hpLBbawWEjeT*I7yiDozU -}7u#VB>4qSi;ep<!g1Sfehr2hz;{-_$Y-~F_?G{P~+figS6;{-i^G%6_5y5a+)xF0>alWaeWT<;}QPo -Bz)<u)N!*Eg%(*jKzHrKfoi8TgThby>=nl__GPfcHMZLj#Tpp`WO-5QGh%+Xb-=Y&qhhCmO>vi9#jLD -JuFs0N@vo2MyHnh;n`To{lKs`EHNNySvv>s`oJjN69;_NYZUyy2%?yMFJg-Qv!UN!Hz{$Z2bv}zZ5wm -`1e2H-&;-n9{a=^KS6iqTwT<ZUIJmT`hJF7V7p?CC>-~Af1o07FG4c~rpCod<<0A-crm*k#l)dzzJy@ -9z2G8(r+I|*0xDfmYp7~jb^5AHa`tc0C1l~W{;v79Jvt4APd8Sx>gZ8A+pb4)7@%IwAl^mftO}cEbI* -*5A?Mj}pC#hIspzQI3QM5EW8LF;@ifonoqTSZBf}5-y|uP{#?!a^91QMl^1In2US!v_NS$~cYIxihJc -rmHY$SKK1-XISrN-x88#)*|<=dh|RQ;?$bzNJ0(Rb3NEF6SDaFPGKPm3hNb4VNr-`X25hVc6&n306{t -A$R>D7juAjiW(%50EdE3T%Qvx)dVFE-<jGK_?_Y2%=6XLWDG$6lD*8QD_vRH?A;3nP80q!W<`=d%b)L -=*t{9&rb(<{pwo8;Z89`?;{6DP&>YP|3`+4e8z!50s&kDZzNT>bhxC+$g141Ov0(3|DdY0ov<M4?cq? -p5`eq)KnZ+OPg0O5^qsEoL?a_QL8pBGK$z2PojaTIx*J(2D*s+*v{cC6_Ei*SeK@2dURy{~d>fo6x%E -uEMKWsmb_@d1&7Jysd`Qg}MaJJ_3YX!xTxM~Rpj!stJ6BYMhbN$3Bd0A9Iu&r+?P7^gkGUYx(Wt))5R -m`k?tv=1=E&6U&{k0<g}>}O%$u&kzE=Zg@_`Q-P=Bpg4gB5RyB}+mM8HR>0mB80UZcV86Vjmk$)U>)h -!D3Bzmm3`VS=a}7FSPrE$+OlD7df^oyzD_U_SA$Y7obChFNW>gfhBJ<qd--+QnYD9988}nK2(j&!uW3 -OiY|R{+F+T;EW8Kv;bQZ9;Ykohumq<DSK-6bU%Cu66Vvx;P6?rFQ8H_DU37LHyG1A@JouW3OsQduNYA -*dbU|vJVrffhd6(Pk54giH%Ov%(vgk~<^}ydi#rwR(;+Z?Wx7#PV+^BOo6bnbi<)kXDAsNNV4kBho5% -%Rq_XB*SOp~O=X<)(XuG#Ig<(*S+{%z*TaxVB5^?eb_&gR=OpieT&fddi5D2!;`ymEIvy+niaLX^O4v -uP=!4AC|&th{mHjf9p;!y~9b%ZUd=@hCfsA`hJx^&njPf&E9rxkf*1{xEh5LQ!R596n50VE$Nn14^TH -p4&IN#<aId@Ivq=e@Yc<1vWQ<}e@W*MFS5ugv*43+1_I(i*Rov^v&$DwRv6T}-Tvu7f6*-8(Fmu2I&9 -+xJ`s&mL$QBp|Y{a2<4Ixo`SL^($4i{#LJ3o0m_2RkC#nsleDh0!u7pKnR8*8$c;S9=*2BylYnt(;U7 -@Wph}a_VO(YBv6?ECcHWORLPQ-`lULHE-A)KMBc_FF$6dl7p06Zsnk3)bw!+C#e6+i_3_@%M&k#jAzQ -%o?J|5|I6ylx2zs~O@$*w0vmf8QV#C8{hiuq;Mob7$lP245N6<Y}1i|#-u;XCW^S0^ol=D}dmfOCJil -{7edD_}?1lI~Y+yWoBRv_atoYEUUG{scgU?i+6(Yq?6^z5`^AUm6cvpJ2}3w8b_r2tZyF?^{>=!A5lD -40Yo#5@mc!}(SV!=yl4ILwsX<sDQ>SLHXwdnm;_dmzPo@$aj6!SzHg4$YSnqDkN%=da(tQLD@S*Anb2 -rmd$EG1VD<v5L_%pfbgYLuKD_AyFi^TSsKII<bO!d>X^PIa=ItokjxtMBx5{RfO@qPh5<ThR+9gl$q| ->mQvFd>*Th|ldGtVYlWsy3wR_GiIzfaqP}~X`GJII`+`v#?I)|NqkV#kjTZZPe32B034_Oc;@6S)>m3 -Czd$yg_MXfrKUo5i81~sjf_<FKPrVl7^bn?Hj&{Zy=mROCz)~Uh<Za%q<N_P?w&qhI_1|<{J8kiG#cN -Q_j_kP+N-ck3gCb!Z*qh_tS%(B%antFF7s^u9mS;u(~`W~9+(`+i(!@F8j)!uftR8(^iCH{KU=HV#=L -;}ATr+7AU1frngy$SSVBrpU9gCrb;QHO4g@F0;yP9h>Ig~@tl#=wuDzc^S*^p!gLXGiqK9((=s8s^<X -JQpy03d*YghjaUID4xfivq4L2GBrpokRGzfkAbtl9)17%?H}L&NdtyDpoIARV4nRGA5tjWt^Qzmc=UA -i?D)A%<JjZ)859A>w_8iPSt71`qzWOf=<%~ukk@>@P=}?0F%GUpFqwje+3E-AQx`gUgnta-kE3J!qYr --!;k&_e_--(S@A@AFQx0(HsnJov^n3Lp1hEy-)4|9Y2#j}zM=^=_u0VL?h#k=1C0cbs=^7vW!Yng-up -G1j)Hg;BKE>+xR7XI*$uGj#A9Y~=;R`BN@cTi0LyIGVHH`8L+j>yeaKzf8lnnn6RJV9+TcHk%@UuuDu -%qNWrvNkMCWceLZ@dbPXn9U_wqq8QFp4TGP)6tNFnSx&|Jm;FXm_jHGO{hJ8}p}cP;x@6&{v*hE+FQt -!Sv#!Mk+c~+zecVA5&$alJ$Ey1vvOh5m(Gt2*yq`O=A=$9t3QbFN5_x6ys{_SyUsBhPYz>*29zBf?Hu -nB<HgX;o0|pUPt6hEd%#Y7@ymiJrLbi!R&_X)pl4<M6a`w*;DK78V{h7Q`0!5&MB9#P#>Tr@z9|;7tP -S8iFfGNZ3@=j2<TML`12oZh*LeKaqx7W?<N>>LOXpaXmw?lAOB&KbMoFSEb#h$@b=JIlNcZK$cdhUB0 -?OsS7MvelK#^3mI4=JL~jDo3$M9$>!rNW$OH6~n8nLgd26Ocsx?qZgC44Dw|e%4WxTh@OLj17b=0i=- -PZ!(AK$g+?cm*$9B;UISf^EZ7p5&E9YUCIT*V9jh+-M7_-t4q2rOUUyQ1li2Mg|Da^mR1mkm4j$mmTQ -sws`Ght<}c@o7MR^=HB>4!{c<G6OGt37dK<=uU)M%~zyd<(H>~86$R@Oab2dHtO%_eW{3W)kl8t6<wo -;wBCQ{_i%CiSU(MP*8+oOsURx6XxMssW7iBD{tdCV>G4N8G`)-v_7FVbF8b9|x<JtG80g(R=XR3(Gs^ -LyuW~(~_gof95vx(RL*q_5%pYiZhpwU&%q+P;2U|ZI!WFN+>l~$CH)D1;=C6jua%rZ=RA5^JzU55znO -~gX_DM;E#Yo#AB~a6VSq>acm%EdczvF<X;_@9O@W%6?Ng?Lg89NNh;bjRVVO$Q4QF%B)$XN!wD`yd$Z -+uH#3LX9SMSOw5F<Fn3;^@!>Um{7v-k@)if0^D&!$%39usake)FnQM`*?|OMLb5aUFX=Jl)yozWwbCM --*Ichb4_O%&K#l=-$XQfRNlAT2vT)x*Se?l2>X)9|KK(m=dy%<HU~!c?u<R-S3G3@KJ-80A%Cmi3Xhd -SlWr3i2cq2$qql?kU^%n!jzj102?k@6A$Uh7fZjdA;vI(%)r<w(ET4;$ztmaw09t0{BP;KD;x%lY_a{ -lIbdQWXcRkgZ0h^JNxZV7z6%*;ak(*;gS0e3uHQ*@_TLCAchuP6K{4{M{d+QWmZfZ|j-~6G~Ws?qQR? -t&+KlWy4A|Cw+T`KWExT}GtD$Am!nwU9f-U}l~(uXh+q>{o06shoRjbNGK)}olzzQcmiP+ODE9lYCBh -R7O;z`}4|>e(g+SHWt<z*88g&Xx4vhKO?hQu2+4ctkIbKj@O6zsd1(Wcr5}zR`NK0b@OQoGKO~VuM^; -{1>&`tTI(Zv-m>%b${?NSQCZnP7oIkZu7&1#*2!fHw)=aL;Y|e9!Pt$pI@Jp&?P)@%}p6*$xriS!k5( -_-@F?151+Eb-qXry&e>I42roorsKAGl6A(?MiLhy5mT1d)4v|}4FGOuc-)gZ{tddpaDxM>>2#GQ(!fW -ouMYPw0LEljWD56BPur8xCS*;g%c%<UDdLtNDJs8@;Tb^Kw#^dWa`UG7Xk6RX|T?Hm^a1?!$A}>}cn? -eUTVu|v?T<1U7w>)XzOZegV5^vYswDTaHcx@d6oleEzgS-QMNmBlHI2;a!!>7-WpLX2%N(Kubxu68lj -2zUoflG8%o1NfY%Bs>^2LjIL##_IESb#ro?JI|`=ksKmP~=mFgYi{q+(4<_nJn!D2<7#tO+i9|BIZ4i ->1AE$!uT*k4HBRU8u3c9jd~=2iuhxW9)Sw}`O06-v-32hs&`~_KDjbY7ZH^UKaVnO>TgYe0%!*xBlE@ -a5;lfQ`S6YTJo6+rCLz8vEw1X>SJ(|oe5WAZ?<wTlKzu(|Qj&&zV^>we9#T-sHsM~!VIW!uEdtRNH5! -IW{*ub49wh-DHt||8#47*l1rKH0)lgeB@D<PgPLedrZ-WQ``Yb(!x^{KMXG%6U=o4n;7tY}c`)|#&c- --_ID}U$6&flqb@ag`d^32E(Mc`8ORJY|V)qnT2l6o=0tZhqCVHTOVyc3k1=#IMHyM20yJlOWkl{`=K+ -oU`Z*`#;i9Z13W6{SHda^d9X!@;vb^Tg*$g;%XK(D+|nlFHL(v<=uS8Ff|Ckc`os!rQKv%~zLgBJ=VN -4-fly)D20ifognJxrv&VmcsMlv%5+Gs1Y$O24nklE-^z*e_ZZZ8ohH;;Uu=np$j>?j^}8!+pB2IcL1f -yv@u+?W8hT?Tr;(|rDl!5_2Ez#DOY0a-h99W7PE?ogs5vXXQBH~ekX7bB}on(lHoLhW`bxcY>oCn=Si -m&Qwa~1I660pc|iTDyb8)W6};CcLnB3(SHYR4@W(h?@!haWi18F^!*G32$wv1RMup^M*Fw_YMt05QW= -!dA-Uq6EjH(V1(BdNWo>1*83__w%1c8N5osse?nsb$~9j)qF?tDQg;3kf6Fm!0uQ3a~b%Wd^=U~W`}2 -Cp*g$<qWf%<@Ks379Nf!EU^J?`<sh_`wuEGhU}Y(lUZ?L}d$+RQN#_KIPz$D5FntAuu+|JffpTv8kQX -gX_JJ5WI&rY94@*;$09fkTb$wJ#&Pun$5<t;=!0kgZbh<WBIq3J)UKc`5Cs8AF2_%WyFEdd2o2#5e*F -^cHMx!BWds>3_`$@w3`i7?Nc8rJn(nVmf6pINc&`C84x-BOdMKh>y4kD{;kqUTUD@TMg})V2AYHG7Y} -6tKMx51y{+<tgZ1B!BLmdm@J{9OY6th<DxhDYO7W#cpvUX@QsD&p3wh>iVHZ3xKqrNRt)_Ev!afKfhC -(GXhrsooA?CI0jt7$#j$NBDD602P*?tfI55d%RQ7`$ug1!ZLt`N`cvQ|pD1xKjY>k~G7rnA@azkBQzN -g6EHx`;(;G(Jmhpj^u=c|P%_x#lBeS^7;I4dqecUdcI0Ip=$vgsuP)!c;vh#r+Rl*oSW=`H$`ahz%fF -^P`!ETu}~69`M13Qf?V~2LcSd#C*fE7AqTta_-qr$ue0)`Qp}{d&coe<u3=$ZG)PUplCq`i_GRQR<{| -r_ramAfa%*Vn@0&<9xdI2DX>geu(}bF$wYd?*9r8VG%hwE^thYEcuw)00bjixhnfIX<wySb;x4_~H7{ -d+ZhIhK0+Gi69psTG#5&O#CKEGMo^ltTtHdtp2ilE{>^c5Q7&=85iY3ibdhwmj2?>YitkWov9-u#YaN -OZwFIMUTk#>k#4Ka^w-?~S_DR+5kFGMYmN4cvb-y=@d3-w%>3Qgbaz1u^%mx1;W+Xek}CZT6Y$X&`vo -JZ?LDMpY2aD^R&r_a4kI(__99}d<y>2xSGI_T746?xRDziD>Z87}|%jyp{{em=jPIvOnqDJe)S*8rq7 -#9bgDGVeIh6b<8OMk*q1U4e8pbG?FHzNH*yT+DP8Dg#TZbdz&YV{zCR{qn+I^4K(VZt7vATFZ286pY^ -*sE+Iyw}C3+L00s~Ze$P4#?3N5kpei7<3d;S1GwmSkDE0Lg5lj9b<F)?U?;9sq38b%Uq|3D;o>$^T17 -&)u_;2>eAv8j-yKHIyN)9CvI%^g5U!~4ZQvQnZ%)OpzVs3~Kf@P#f=^!H^G+I|y@*TPBJg`_ZvF6(HI -%RHQO(Yx_7ixV((2nUn<*eJaD@^Ewux^xkYnv}KWeZ28j75yv|<h&cUsL)b7uLYym^k@b&{BzhBOz!S -=>aV;QR^A6r3uJwKZ_@@2=CO!64T3W1IO=^<b-%s5=g)a_?_n#ohN_0#|$dLPJFIx6J?jQ5ZJdgGZ{t -v6EXl?XLFwz0nbF2Mz}P3Jf746nu@ej#QXdIR8N2u19*W<T0aj$=*M7WbSJVqvx>u5FCu8W9uE+dew% -{_=f1<Sk>`T0NhH$;gP7M-X(BTFWhEq@yI$(iU?*;E1_BS`<lsaxWu4A5wovVWgIb96?+D|hY>F|tS% -*D4}E%cZ$qKMv%d4pU(IV8HH8MF<Bi-uKkf}gsi(E2o(_6AbhV8R`-jN>;BZ5+qrO&}sxo$vgujVMMa -8{bFCWWOO|unICy=<|SbM2oSY^jLHc{vPJj8CyPzM%cR1J$Ux&ti6=nKGNjQAHJe2bBXZ}F$s|MUIp_ -v2UZ{_^%clss17Za}<v`G;5Ey?zr-rmzNycxVV`LNqARF+8A&$vT~08ZZ;1F9<X78!*Iw8(@h0;5S&1 -1|w-&{@oxAcqnS5F8^<FiMtBEKv8S*Pz2tlQq`<9JgRnY@Pg4V1709+kJ%T_PFhw(?PY3po8D+D@PRh -)vcZ8Lf~8yFTTksnPS3bgGF~R>ST=I#?mxw)u@^?Msw>RAsYf%xvC4+m00NqZQlmy<(r-@l-k#h0g-f -1&fot%7QQqQvmg_mpgRb27<B0$$<7IpkiQApl#gSHz()BCuwgnMkaQ7iDN85oCAkkZ8D_lBY2HAE+q% -gSM3nDVqiK7mc!K}}@iB_vPoxuk9h7OS1iuJQIHW=aVyMOZrK20jCx<;iMEd;G@3CL^;<5R-KvC_roo --WezE|OrV6yl%6;*sxlAs3h3lapO_KUZMfa3{#11nM{wfg&Ks554FZ1sgThA6*Wi{$wUCf5v?9!JZOl -M%CI|{V*d$kKHT%!51wIhQP(T-$eN?DPU_H<ufTc7)-iH2@`OhfP2_FIcf3ZD1?y}7ojKMGsbah4+}l -aF-xX&yiXVXBbKk}j0&Y1^JzGNdaU@AfZEJ-ef$E{W)|OoTo43b{eokc_)lO!w+%`AF%DsB`HW3IhNG -#v(MtGz-N9EORYfdVlu)paGs?1TXps33*2HxyM$#>8$uThpnj|s4Ok@JQ06)pZ<z4>#=IT})woJ0C_+ -S#xGx4CM)kjHeku@SlZ^<3#lU<8e!(otb!_Kocok<}LTFX-b+QAQX>7aX>;Wouq=ALi4P!^{~<AD;;! -Bbn!3|{xypjzYl0gY3w?w>OMMPhl28VZCpP-xTl!f3(z&i6N3n_zY!2^<E}vj8fH{M0CwMkPYA|NR6U -#Gls*l!L$5%rS3Ow8U87<waK8<@eG!f1y5~{D<!I$;p2N6hqjr;Cisn+G?bqs163sfJ{O!LMLpZ`wBi -P(#r)$^j_)Ag1XMvcf1|y!XV%<gkEfZC-3QXRlHYByfVqP|HUDeNG9}}u$xb*<|#~Ge21qfF{?!Sx?R -}8ml87yTr>oY>WIV>ocs<ke)B(aQer)b1FzdP1HeIMe8&|<kMAu%r1UFXwT<TG!R*5qvJDS6xgT(1)0 -&|5q-ss**V=@B4V>E^EN<6b4mie>y-A<dx#M7XY+~U!I=m7)3cG#fB5~J9_9PJ05CmSl0CPO5`t@Hjd -|}Qv=}2`#3~_qwu`P)@9`~g%yR82O_!Kb?UQrvgUk>?Ba7*D5{`VT}JF#ct<tm^cYlA1cg$IDZ6KvcQ -1CJlvdl+~?T=Imzqcijfiidm3Dpb7Bh+wCK)h2pfaOkwsSioCo+OT^SD0ZMk1~s!wUkOT`!5!>uk7_r -xNB4!P3yb1=Qvm$cHVWSJ4JH3x?qg+en=sehU?-}9Zla4(j=DLEJ5S1)7RK6~w}m@tdC{2E3l$OcOO! -OUHdu^LOrV^{t3@=GJ)tK{3;yg%l3F-*1*~Q<jz84i?eEHzSt3Yo;qER^;+v6AK;D#W2HZ)#Od%vhe3 -7K7Oq?m@{z<*6&dpA-o?eP)o7WTGd}$<IPGM?cvE7qhj%Xx>#ND-3p5et3J~^cbW)g15e4^0}(>Abgl -sWFn(p+O{TgqGAoPgj^s>1q$kr~gj^<)uK2xlzc5;a~v_sZ}y0=<ZDs9#r=)>Yh(N_|8fh{1&7o5*q7 -*HQc=QYC{hhM^{(RP5gZoFnU1F_fQ5;m$>t>SB1Pa8vlJMdNSR1KjXuXhWi}V(z^G4<P59$0Z&Z&Z7! -I>xzMPzG+rfcGmmOju;0|qUsc;POzYJrqvI2$IAuvO7S;x+Z8=}66}5xNxJE<_%tgY6W>||lbu6dB4$ -sG1uk?JDD4N#f)B0M$B^y$5bo|ts6jlC^XLTnV_4)Zd!?pgzq&J=2lhmMp@&{9lGgWk0s9QS0xS?eoo -x>HW{uOAFNODMd&4FJA!wvHM7F`R@<!U)B)Pbd*p?s!^<)UWFrQYw6vhu7ao0l^Y`sTf<;GBqfN|~8u -6@S6S(&!6!D($-XEk(1DC1A;nrDk3H36H|delE0(m9Z`(=v6A9~21>jNo){PHsRAk3NzgrU5YdPO;x* -heL!b`?wPzN4@dfGdYu8jc%Q^Y_G()@V3QMATThmZ&v(r1b;|3mCwF4@m6Y%vhSp|G4WE(fvZP48G_% -xz-syyr_X5s(z51(^hH$@>JClgMojDwf1#_aXDYs&7nOO{?%7!bWmaIVuKw1jZk_zw=H(byR$%~E0~S -K*G>=$$`PtQzK!mvT6nJpp)sQxB0la$n^!bQhuc`-L#jU2wWERtS#(`FQd?yv7l)9|d@`d3duM#l<yt -*3w8bDW7wvfmrybtK==(B;Y8Uq--DXf>7&u~-tAulW{akqy3{@`RbIX*dQRb3oZg^z|$kNVF>qoV;V` -opKshsRGx&-;hZkB^=|9gLnH9uG%PM}7A^x5@2B)r7d)80N3?YGb(gU2Zm3-fP^nCjAEEdJh;^j9i&@ -e#3G74ac<+j_c?SIIdqAsAXgj3~r4jyrp;s^Vt`MxXeET?Cn?fbhQcUYP?<GiOs!wQH$vMRpCFHcgz~ -TO}!2JW2F#^1kCPzgn$G*A-v5fK|=(XbP+|RSRu-pO4OU7Vd1y<Cbt~?^7z?vJ<I+As%pIbEFX#wTn7 -|K6P!Ni;5toyUSptjYM{9pH&Zkgt7!OW@ci&I4Cmp~0e>QQbjLwOAvPV<Um?u%wog@mS(xW9aR0Qt$N -kga-uYIaZQl9Tev?Y3`E}qVZz+ZbXwp&)gK8+gtE2G}v+zSoU<7Ok1cn!E+V}Ih7s=rr_9%5F&#r3`Y -E?8wacu4KR7Wh8Z;BTZ4u_Pz$1fLDfJ>&{fqw{NL0wUxYYJ8JEfLKz3uzeL!Go17UQXf}#$S0+XlwH` -W3n!aw@pR_w))dWLO54I0JldZ9$VckBC{;!TWt_-l#AU}B)O2|)t1HhnGiaH78Tm|pB#W#o5}zANXQ> -6_Tkfb3@oe%i{|L4V-JRpP-xcuukZ*~4q=hpl-WF6Z-{7;s*cL+NRMd4dGg+@z3<khY+n(1vxhYl)Cv -qMCVoV?P2I>{-M|e7Lp^fCJIx%6-f_R<&LATwX+fFGAk&wIGMDY%5z1Viiaa!w`Gy`=AenFI%-4=&-c -Zy^3cqq7^SaTphU)IJ*hUT&V-&zV-%e`AbpCb1m>c8t8;tqCC5*W-!oR_o+hl%&F|UR(R|jJo1LMEJm -|G}iwG91IFy<BGUmHUS1tVyNS$b*HxI?fawAl|fBMDf3whhWYx+f^ROv|GkzY{B~MPeVB=f}7$JQyIH -(*_{+(BU&yu0&(k6;4j(n}OIX=+CRb*me0id`>q0(XRk$hrT;tN)H0lF4^0(iE?4uC5zR$7xKvGGvr= -qMPfWL$eFd6s|i}jrFS4k!-I3z;|Gd$>;a&wpD7?w^+$bG?-G9#X!j9aXSMLt9V!}4eOvr=mmQ6!4*h -sg5N>5f8s)Ue!k;mxMK&RGT7vvl=d=Wi+X54Kq&mDyAm|wD@3J^8*10$)yN)^J1D%F(8M=b!Cj<^kHc -+|fGT$b0$Ti$dxc2~b(lX0Z4ZH0TLMj{bkMEwKV^Vn-;PDFLVc_xWs1|t~fBx*y<C~L_(2#AH-P1T|R -gEsI)~4Fv)n`Q@{|XVsw*v^j56XA*k?|sN|BV5{m27?k2(O7727`eWf~-v>`!_`hw{l#A6X@505Z<I8 -+f0yO3?Ur%9`tkIMD35{*MT>CUgCdYk|7=wY<r@~BIdOy=TffjmM1IkVB$4(Cfk%TG1!>O!?ECL^H1b -e@Bf&s@iGETZ96kC=pE?D`)1>;HkoE=Z|AAYt8_RUx=c3t1W|T0%_rU{+|n~aT>RE{uzgb(()cZN?CZ -)L3u;x*8mKMM<L!zz1pH`Q2zb3yn#ad|++6oJA-Nk>=6$Sk+!&HwSLNFn7fIdxeZ$Wbfq`B9!E+a>T$ -dUUdm|Sy+}RzT91IWZOAMjRQ8hD0XyVX?b9YJ&kfEA>&8Nijv+4qRl<J|)Yh_Om_90o-c2Y2Ae}BYfT -v_j!et#Nj4}Yj0n<HM}(5pGpKU6juuK99P%~w@5UvJ{}O~0a_Z;m$z=*?>?@Z23xFRRp_uv0x@cdT<R -7k6Hpg`NKoP)h>@6aWAK2mnzTaZJ`y86y)00090E000^Q003}la4%nWWo~3|axZUkWMy(?WMpY$bS`j -twO4IV<3<qvo?kHqA)Ko(J?>ji;#8BEi*><{9CH*Q6d8L%wm7zLcLStV|9fY49ls>uDpjh5l6YR8nR# -Y+b~%P&QEmi(Tq>}VK79P};a3Rb&8o;#7&E1K{>Vh{xOWUwCRSWZUgW?fESX>r8+a6Pu2^crLNEr!0+ -MAc9+?fQfH>bk$%HI&^e!G$%yUG87!nLgwrYt$vRJ5>STHnCA(pa8c#MdU7Rh?Wauq9zxZoL+2xF-wg -QHpHbJW*?QWj^xb0FPT1utAJi?ss5q!K(K6dM6}o@DEk^4J<=e8sCM1faQ)1iO}42jyzRsz~{Qz8MvV -Fy;Co<8o<3$_f5qt<YAIFkw0QVKu)L0wl{a!r)Arikl1xhHA!0B~hy?vUKd1WwGkkgH$cnBFCUi`=kX -@M;I9O50)sBk;9_Mvf_mbOt6QX>XM&y1L=v-B7P{InJ&!qJuehyZE~TGlue^6m0ZSH#sjNB42PHoavr -zp6O@ZoxFR?<q%4FEzFYU8NoMTAEVztroX`bt2GcP3=8fDD962+5KeFM*i^joq1ZWXDesl}LB{=>qeD -(a1U7@(YPeXS$gCGR&YC7@Ukqw?doLrAQ{|j88w;x0>@vgiGp`$>DtpGiDR-qv9l^YJnD0D8oi5K14a -Op)pAzvc215+oAyy5l431NC2PJ@|?sf;RjKkz;OGQ^1PmFq_X%m8KJe!~}-jh)Fvhjp&8o>1pH45qiC -_hlSa2;*Qfa#3~RVy@1`#5G~D*x|(Su51`NSI!q#`v!;=YBQ5*1#vTWwE|;1_&1Eaz^B57fggqVYGd_ -bR0G_2GuH+u^k$fL1#uY$7>X!Izd%Ewx9=J(YDc$gXhQGTGy1uuQYSHToeAR32%_yW==Bx?7x%SfVub -q=_=;8v(C;h$%JW_?$#4!pAX1z$DaoxAKkUY&|EbrbNGV&ue2!y9&F2<wwS^7uaQsO8diV5_O0<LO;S -0!EZjrVRpW&?0&?90l8AO|sxk41eI%TgV?kQa2vBJ$S6`TRO>VbslkA;Gh^b}4S%zllh#HI^Qi4Ep+m -Z!Cty(X+w;HYYL=%@$0l8nW|YOu9%U8Xo8t!||aA;yO+Tje)7z&V)DyZa^`6#R@5zsPZP;hX-ruXDj6 -gN5^)WjGO1nlS?B4^F!cPS5-aX~JQsc7v_r62tuUH|##g@WeLo{{3gT!yh)3f<4=ivscxmL>(WrN@+J --GQ|~J)jiiB&vCY9-G);XoM1Gj$gs<=A>lx8=t<T>7^3dZ?)NlzAMa~rgMsBzIV3S<k*OiFTh$K>XxE -vtY}c$+V1;$asJ7Xmx0CFkEJ~|mO@^j6GOoq+Vk#wr&dyUzRDoNGy~%8g)sGD)FH1bzjSdeV>K7Vxd$ -r*#OAYlO_S=DwRae@%VXAnXvh=^@clJNzch<@exu>pGJ;QmY&LgqAeks=e!Zow%E8A3~Dm9mzSZpXiw -kp-;wBLpy^ezN#jC0sBWcV3Sn_HuXWs)88qMjf2&<l9W?B3!MOyTvVwbZ-KO4kY7ZxwMQX+zyT*&6rm ->Hc1ipQr7vZunNKva`VLLp{dr@^2<QmugO|BHD8-WK}I)n080;9tgT%8g2G#w4E**I;_f7A9?e+4VEt -1#*1z3xX0mJJ`JPDvfSmea;8b$9;rBs&?8=FRBnC34jQqxGG|W5!icmMo83|2d#_#*vZFGhUc0%CQcJ -cvK}GDUwXn80fZvE~tAlZjw7Uk&1H<g?ZD{B`J&{(QZUQ@<#9w*5!X<6*wU1m*#E+d!k9Ce#zkRsVB0 -SvKE>ye4ziHWu;r}~njYO9)y-bn}ZxO^u{E)F~Z=TalpncZR49jF|`RhH10|9s8*0;+~x;+fdX5UFRZ -8Oil*QZy3|0#$r{an&ci1UP5T5Gp&hW&2P>XxT#ho8>%%P!<jCYLb|x{i`c!%h92YJ)#{X|;P%rC7IS -9~W~dDfah$)epl~3OWY%*fK}`9#3r&bM_{Q70PxU!}+-}>HPyxO9KQH0000808trnOu-;@j_S|=0IO> -Q02lxO0B~t=FJE?LZe(wAFK~HqVRCb6Zf7oVdF*|Af7`~f=>Pf@2z`AB+8`~;N!louTUnM9-N=@Yq%` -S~RsJ9nl3<Yl1AvklMg8n|9{a|Eq->|B=bkXFMFP9CyR);iv$OMf5KQvXY@7ts`7|!dG`r|c=W7qv9t -1o2bY7$vmsJoBJHf{K`qS>ldjIPncpJ~g!ErBmJ^XH#76}!8n-r6@EYmy-(lWSAisWn_ToiFuC8H=fF -Onq4&x7G*TwEkkP~}0K&4X!Dlu#i*tKu|+mH|#2453*pTU`R6GC!|w;v#|KqaZHJe3-@nF&O2;*(AxT -xWX3C({WM;VRZ?830g;@POC!=jgojAq#3|V0{JSqNvq3zRs}^;Rz*5QC=nDIj%Oq8hb%BoC#h%!0T4b -)1UoBX9N5<g5tyFi--HG?ot=%-@-hM_qZGlP%_?|Y;^SeGVLcelle`GZWIRR~DfFI3tb0ghpdA1*Mbu -UTS=9E;Wj?XT1E@Nm6&W;}jA+m~ppM#npA0L8gB8y6@i@PMAwsj+D8+G=n>2yP@HRfnuM-*+&wG|v&| -~fi&c;+vvUpWq#xR64#5-dTng?9R#<&XXMOgtQq%aZFyr4$i@%FeA-|q%T2d|EQ+CJP3_Kt$LhX;S#d -%62EXl)<C?^YE2w0Hdd!H>rQlsMdebNu(<;8n2w=I_A|dv9JM#&>^yd$@aa6dW7|d#~T_@9n;fg1t98 -`#-+id-GlJ0&2cFI1cvrUhf?P*y96gQUKfAg?g_5$m`w1o$ukn_KUs!z2m<}!K=OFHwg6=fZYz>ZXX` -+?fkgEeHgs`@$l`z(Jpl1B>;Z2_vY0hw6ptq_subk2wH}x!S3JSXK?iW_WnLKxBVlG;gI^cbMW@>hkM -_Be;j;&u>W!w9=_Ox-fh3w-{r>M{2f=~{`TJMD0sR3di%Rws&@cz4ymB%;ZNW1(j#bb8~(R*ym#;hak -F#q=J*hPB5sZk4v$skpZ1P+qhR}R?+6j|>hJ&>K*U0w0|Emz-|R9RL^}2yV5r%FLO7Nmk9Ku`UhZ!11 -GFQoZcZgm?%H4gi*_&wwt{zStyXJI@f*p2y1~vEmN?K165J$#1vn~s1)rxGlVS298NzA`WL4lWlL>rZ -TSNM-flLt=P-B%887yKT?sz&a@_2ZOaEC<#523V%jK9isGKIPlbhLI|_J~%iBIYFnbUaQzJekMCp#m5 -orDG{z3`pEXaxojn1;CvGlfg9uP=cR;t>|t>!91U>jq<DwYc1iGJ5J&Px(vT>f^rTV?gK2^f^lGu7@M -2K)$kG@8jS!Nu@^QX)}W8q=?GB^9PO-#3u3WDf$!=vuCOcAcSH=psfrmgj!T6IU}gpIlJOiD_}e+mPS -#sn`#xdr69>=)mc;tlcoMX}2lfU`=%>6GkG^OHA@mrz{sn9XglNG6V0e>YZRfW2tc=GqX133x;8{Ex; -h>V_`4_D_;N@qtbX*0qDfAL+@81I8(Om>z_EVVPcznl9bN_Zb8{GxTIKdsF4A#Q^+xFx3v$xo*VwWHH -1_OXU7(BlVa$sw51)aM90x4B>jZ)yFz{Rr*7$xpRvnuZbhOU#MqA6R`9WZNkHaFMS0{EO4z^yfD0(Ai -oM6AHZ7>}oyamnQ#NJ5tg2mHheTU3O8zzV|3A=m8$kAqg!f`8qIU$hwRB~AlWa^{2HO<`QHzhCm3R`) -ruSZbt4b9hAK=GUE$SY%?JVRxL)a4$5s6**?Bsi6BjIBC<Pb`-QD{D<D)moM6<43|j?)(v7%ZS8_aBu -aqNewhKXp;$bM&&IG%@^%JPhvi^LJ@3LKjN=TabiPI;9%S((DaDqmmnaYgbl|r(J#YV`ttg@FahLXQi -DnLyayG6?pcLLsi==|R7UrI2Ruoc%WgzZZ;~OBmA#kQMAgAFFi5#UHTJ<Fo703@2bQhK!i6*dIiM_<x -n&<+GCp0RkR|yeA_PWLeFJXKrAeH$fkqCuZ1nf=3+DE#s=F@Zt8}~f8PCj7mo695%Zi<xFYL$GbcwHA -DFaVQ*-$hJJ2qgk44)an@V~`3^5);CNq?Vf$M1pu+=At)}8U-;%;&%{40aHy7;M1fU_Bz<yFS8sGBNi -fcU~-m>P~I5k6I$rBtH3q`3lkS0Z8fcpUcc90Z|TR!=_KJ->wgLk0F@-uuJ<>e_Jbdfcd#U^@XNg5LL -}=7K{t3dttP{Zzs?W|y)vH_!vvVuMbgWX>N&J6mNs{Cji}=$iLZ*}T&{Zj3KM;U&t!3ww^Y@6DZheLl -+jpKRaK}+2E?Lc9JPWn9w$UC>d}-|xBLauHB8Rp;gxzYpC%>uas)zk1&EQ|l)u;3s$#yWx!9n(#Dyn| -9q#7<F8MG_rd6;<&vuI<FN_*o!Qgvb$AN2fUY0v3MzFPvUcw4Mj17$6jV&sm3UJP~a2>4z80$3w$B$V -UsN+qZ0g4{{6Q`|LR`9Cm;etuRpapAz7LL0bqd*X1@DMoC!}49$3LXZbLAH@gtDT^ObPa2hX!2yO4Lc -OFuALb89dM5ylKBmc)O;j%BzgpguJTP@?Pc^UpPa!agI{qJ_;(k?7y3JyR`YhW)_z6oJQ=;1<KtI(0k -lZazsryFoqRl-5UB5pd^W`|M*I5!dpA>GkE*z+_=o7vTKhFhEw9p|q!({;`psXf?Tnf{$dZHNbzUU=V ->~~|hWvfX@)vzC5E`-A7clBwnm2fh@93%EySo{%9Inof>jl-WtscFKt9Wdb6b*^3KovV839SxM@_c;o -pTxSD@8j=75Hw+Wuaob1Q?pt*OfHfSSnB91ogUME$u$L1`G-R5(QHax$M47aRg$SMJ3>MMBn4~jpO86 -=eRm}P3Xu3!0sOC|$R+C6+9XY6vkAdx(L#Uw^I1w&K&IOn=VfvnUx=Rv(<BqWhDX(Woa``*rUy9@0W$ -6QD1o(s=lT7#6fY-}Jp2Cm_5Lm#7pplxo1qe6yC`D*J)OERM`vRj$!qxN2)6!9vs6NddEFXvg@beYmf -vJUpdrE>4Kd-h5VS9o4~&4d_GL908}Q!8*Rk7^u~=GTy$r_YGQb~Mj=(1IRe}QrJW+%A`)BhfEDEIj? -P@0<t0!-Z<T}k~B~ondp|QqTj*z9Y*?9aiIh$Q<4<(h#Nd*qZD9ESVs9xc(ECvDGVKPd@+M&$^MJ~d{ -be0Vz0Zd79b5Ze&L-s{70fB(#spQ`vr418nve)EOJSTCX5~gThV70s$yNjtT;_QN7>SeMfekiol-bV{ -lV_=r0!+exzP_wB`0w`l`OW_KErWqguT7NNyEsPLVq!%f0qhk<;fJ-ve3&|DJ>^%JdJT2xH+fXYuCI! -LMffqs30#b~y!alr?r;J>&e++nWKxq(|VZ*7CiQFe(Q>bQeW({#4lKTiWpLb3+pPsJ0{rli46tU}^te -*y3Tfx({^gO@<yvYq-Z~r{ldvnaidz1J>nf{v4t200jqZMCP1wBM0UKa2G{$&6&cqIymQw^TmSfoYa6 -NdugUtC=9fiA`K6$zn2Af5?fm=BS$5NQw;SKTfyUWkgg8J4q21c&Af4rzHo%0^fXFhu;uVl<%!UMDD0 -XLCGsjUy0Sp$d!-keQ6jq-pplK;auAGkE-gzVOiCxW?lRK`QTPDFNirmqkA9rgWM?a>g}5$9P$oM-13 -ZNW%fc{*lQM#FjJx0eRjF_Mi&xl3YwdM??rHQ0AN=oyY08<WoT`LG5PrFG?_oVG!n1*`%O-38XTCQ^{ -xIki*A2QCyyXehU%;T_Qkg6AJ-0Kvu5!9a70}L9f>fp7%_=sP8~^Da<FzutVxcBpNaBNO-4iV9RUjxh -3W?jqM42F^C~or5LTA8aQ+CKuS0<0kSV+<d+3fnJj|j<G{qhk!t1)MA$1*UBJPJr8?|s&(~22Pxn^Hl -l4h)$FK`zC@>3cyTF0=tXboNwBj$4N+4h2K7{eKKTO7`Z-<kHpu%>?0;=BwY?3>|_J2HhH+uYSW5FIQ -B7=>F<9Kp5ii2u1Xuo?mYX^@5*e*j@Ghqe%<z!>C+du7e;O}Y2hb#jyaOkW=O^{GIK#9(M7)U-&@Uj6 -52t|V6bDzXqPU)36I1C1&y}^J_F0h`@@eGa%u@>+lWJ7`rDJI0-CKiMoh^Pp)<G_B9`?PxHbevY9LG? -B2uJx=JPeH&Mg)r}U_z#VaMbx2A$E7~Ck9jB$j*?J!mRJwh1{X=jV!$z+6LE)uKVdkhVUrG!IAPfDU~ -6l{3t>J7NjZ$6Ae<m$F(_E}yYw*lk0^K+1<&EIk7^(~+|zA=I5FeoVZ9z5<azGn3Eq2<LKv1aPN5*?5 -i>`1h8&dh$yq+eX>0$-^JlGh?KYnYbK?yVc>8hrxczOLxiQTgG!a}>0kAF<S%P?)mugx%dZw|B2%uq| -U(;!5HX0et7*mOZfmUfuqT5`J$}?=S6tK*i&{hq0<l#PKjw?V;;pN&I3*Q8POCYWnm%}t2z*!(EP=<k -ZXuZJ09KBdWu}^dkH6Z<sr(b^c^`HLyO>0fax%`H{Jq}viFLqw;zKYL=FukocbsE4Tq8pE??AqY0L}{ -CAgDen!v(Z`85+gR&>b=j?EF2OxhloYdM^y|rg(2Q7885X~sUy)-Kk<d?n<hCFR|NH=gv3>`X<U8sNM -69v0@WU>Tq*Y`y3s^_g!>b$UsT0x1~-YJ8;^rW<Ggw#G-`OQSLVT0l1ynU5>Qm}oVS|^Hjm_d9+#wl0 -BS2!7`&D!Kypi~!5}1MW)w`JK8P~;aBCd|mhxf?wGI)fx9MwO5FFO%K~car{A+HuP!W}<Si#{gSOwp1 -QA_oAQx@oqy<5vm9w6{<BMhqneqkP#p#+Y~E&+U=R<1$=Awld7f2C>Vt0Ij+T4HKS!y&HEX<`d#8aEk -T4vk?#aFXWY;t8cPx(G_o=lY@u(T#kNwi!#85ZHRB7^wI%DS~bgU+3wl3{d0%0CI8x_C*%M$|r(4AHz -ws1YVcp_0#N3+{<|TEBFNrDx4-g#tM8P#K2#`4gIwc+cD(Tf!H-PfyK0k+2|>Om+(fW)yu)zoK()JEw --n>8}PXnzL;VoK1B9#mK0L$tQRCIlpP?$eC$9NlCJ4KFsMyWH*k|<BZEaSYzZ|KsDWcriwD>W{NgFU4 -b}RK46--&;<1Ja94>6Z@KE#3qil5=fWzziK$g8-)Ys+k+!bELDezNUj0mYgi?~WnSZ4F0>DI$C2vHaV -p)Yti0wFcT-fTV`p((`}{&r9q`p#+@KcV6<k=t`dz4#&MrDOC6?~@jEi4O_*QdgS9#noOmomCoD5j{+ -bBY6OBJ^$ia%ULwLcqK9vS7MsNi2j5!948(Ci`|WHq!6-oyd$DTWr1-4roo9rUO7#MXi&jYhyRd;Ef2 -(bT;j@pDG;`0p|2bCt*yftxlI%Xe7U`c^4ZCz(ZFd`n^N~<wh}4GCk7BWM0DKgljVAd&}nE+{3ykFr< -tu2qTpA^acHebc@N|ns27r~OI2;DLrWZWAw-KF^jGf;)n$?2WPF{*=MM9_o^St2kH<pFw|pE~jRAie= -lvv>`>DKEU@1mpi_HbcAG+2?A+v+0&o?msu!WoUMN+gn)-^SXtF7A6$JwV*<Z^f$381i>c05l7bKVSY -?^->Q2eBlsl#X3oU#FLPG`k;Ql~!aEMIF}MZ(T9JKJ&i51}B^BTLi_@zd?-l6~#h|#2d>l(ILs%iI+C -h424xVuA(T$go-nnWNOaP$}FE{qi=zK<<rs<rPIkI8KH6Bc;47!=e8vD3`6(%J)ZZ*>6N;Mw+r5(K}a -PBAf>qRoW~Mpvd{asv{xNLho5a{quxOMe0~S#!LGjb?*NohiaJ_xE3Sq{IyxM(lJbnv!kKg!qeVfS1+ -xq<SaBD)B18)Vo&=jDCDd60og*CDNP6&3aY8vvrYkZUs6u-V^gbn1$gu#?wY3|h`rz%GRAk2F0|UgK% -RvD|eOn1H3+_v8+tRBCYINm>L{^X~(Ymw4J;{s3HA>Xet1Zvy&QZc9NZ0Xrrfno$97*d=<E+Iys~ojC -!o;i<Tc}b9vC%LSC?Jb08r2io)t=qgO0qoB-<S_v473bz!?`3qGOK(iv7tod>69~T90a8R0?kXD;;jf -^Y#$DK9cwaZ7l(pGG<Yk4XL(t#R#43EKAjgeOu1wm?<sx9?HWsgy~?$W0j#8GS#XC^g=y6@%xB{fVgw -Fc1ujQeRfTL_V#RwlHm-T`R<CvzHVYi%B@muMol5tRUmH=f89XdeboDo?6g%b}GG1{VoS(y<W@~w@an -dlS{b;)3j;xwZ=~ztf?BiXE*F2(bS|5e1ev+Qn<z&CSgfBx?Z~as^2;CQhs5NJH)2It&tW80n!$yLf^ -dnl&a7-SFm0ECVvg{T{jll$-q^Mw>Br#hSvr&~a3Zt4MQn9Jtb=lsEw6o#P?KsIo0lIV7(S?ADsR&;E -eZYdE5ROCk<)nXlr!19>ib`-Z>h+$9FDS>r2Gj*CCAEbD=seWL?!*bJE-Oi?V#^ScOy#2#&O=eq0UWm -GNen_12)*qmZLPs@KaYc^`V){3E<XjpD4w?rLFz$}{4z^{Pl)@niNW2>0SR!<03Pe-cE^kt)Zm%{)es -<+BpX|lDXzVYHGz*=ugixIO9<_M^UXI;`WsK4_RWTHt)NLz2&8+SZQ+9I_@q!gB6pt)Zo-Ab1P~IIos -NMh0@Xs&6lB|Jxi9%S5Ngw#HX*6q^uEWavR{chr2eN;o)T$>hm}QTWCODa9NAiAUfc1?&w)8YHX}v!; -=TA2{HMR6zCP`@Pn{{kD{iR6Ror)S^ju=YeUGE3R{&SNs*N5?92dsbiD&d!=2bk_Vpd=c{~n|20>#ZY -gQtDt3H1n$3LC~VTomvKKw7+%`8<dNz~+a1XK{u26$)iMS&FZ5iTmOfj*Prp;xT<UcSQUCRzQkSE$P= -fi4x|<0?P^(5ihQu(XozGsE3{dxF14k3)yOOs?_!HzmMAfzQ~OXd~WHl4$f&GmH6=J;0;vSG-s4xEg> -5(dR_xFV_kex0oYt;6J+10m%qL97NIfXEfIb36`_&ieF6Tp3ZQVv$n)P=;71lvceF-jA6??VojMrN7Y -$8(JK40MqJGs2*S;lPr3K<>;%CQc#8tX_0i1}hr#`I0yAj)_;-ApifM5WucrNLNjm{-V(D-oEMIn};i -D~SQCV~@$a0)H1FPI1{69I4cU`UW7D`H8Z96XTb;y3ZUl*^oMiTTivCo(oPqPs+?wHVG9kUReI4Kwsj -D=PpIN9cE=44(uYb%bx8pwTR#l2N-Iot$<&BlOdb2J5MUA7jeZ_fsEmUSxhC{<cl=rlEC-K{dTihZg~ -}hi2?yCtB}#!TE{%UJY5N1-Ve+EYj4Z2D*R>7Wb{DjBM<*?vH=?tcwhPNak#ih3taA?cvdazOFhGaxe -9s`o#8=HgDEJ8qtX$D$yUc>DI~SJMygPM;F3Z_x3J-s1K^v0`e+o;iTI?brI;F8v((hh?C$N1wP~m*G -5M)_~6vOs&Y|w6$RI;?ZO5!ucHQX?Ra-**_*3VdFP^@p&3_r7193C!IR6$wZr0PXHe<d#E`o$T}8&kH -uiuflzMROYhb}df6OSFmh&~NTkilHFb!`P@hy053NPegBkuK#Nk<#-Ro6+n0GX3H+InrF#aHNV(Ka`N -7CmdpDnjBW8tdaRl~m2x<bvHaMPGH_UP=q`S+L%)7X**DxaakXIFZ;Y!G7HDI30vp4cLHt#9DIOAXU8 -+@(r7YJxY6`Y)GwkoGTMisV8jZLbuWL^uuf_n<FJJ+C>{qaaMU;_#|fJz<P=T&DP60AL!xqm!SuDSpP -jA+o)T99AYV86d`GNBRmF>M=;(U1W7iVpfH$(Mi&+^b)yt7rN*UVHwH(%P<?+MyzeZ!xVPy~utIZ5h} -*i-V1ypk=T#k*CJ>liLvN~XXB$@s*E-AdvC=upN+Ine_<wIr*vj+l*QChF7fQk~k6~3(c>02m7j{NkY -_3@MWD|{BO$b=(Dw&sc^)W2V%eW+4O&f(#(2})U%eG-jz1+q^TMeVvc72l<;%mOAXw-L8Z6r;idQAbk -7oIy%1)Nt}BW&0u0s+6XsDU+sLG7e~AAF1RFH4#|z)!2yI+WTxMg_Teqiz^Z7VJ4I^fOdF6jsAedmn; -48_zr12o*o#LTAfF+sCve;4Ep4Fee+MA0IicF15$z#|vAviAW*UK=3DHcB65u#qWgO1ug#07;b18mxi -B1xDER;sjn<l2nK8_qPq;Eulg-aHTS`6NZHPmd~4IIEjQWOCjPLjyK*9a&kl>eb?S#dYX}WoXa$6K>! -U!OA<y*ZACC}B3>FQ0hM!sh-cgFj5}q`DZ=t&o@nyd-W~Go!<LUW~A|aj4(dfXu5e@?KXkoL5ah_kXs -We;fux^EHUeSAjgH%XFiP#F(5XJCtXRhr()*Rs=r}<RM9gon~7ydlDy1{P^2D^tOo^g;EIdH^X09_}e -IAMf97k0ugW^3nm9GBHyN88CAv4K?y-K;JHcn`z8BcMCC*ws7e)C7YT4H*|Zx7gFp9r;`#{-BXey9_~ -xDIgVxX;3$F@^QqjQb1*>yOOP`7Bm=WAKGC_x71dHlKR9|Cciej5^Jgl`Kar*AB2-!nA42s%Hg8pc8d -nC0BHoMZjqG*$gJfQ!$)Noywau3vnCFM7ECG$wgD(co>Jaof>s!e>MhW#?uE33ivltUifQq2UwdLsG} -o$Ml1f5jv3@{aBOxQuBby7%B3wtU#P@T`Gd<K-u8tMjdeGl^8a&<Tw>qfGr2Cz9zSnt5cRCy9rOq<Y@ -n~dvT$!U-p<Sy<tIctImW-WHGIpmxUd8hqmJ3_^+b?$a=|a`pP0w(!zGI%Z{X%z9Tz_@kqwtSteuJ~> -x6k46+q^o2!-C*lKH_AJx6_O~uoC6c>Y^}26u61i3rz$>m{^H`B+{DHS6sA)^oA)XV4s3$t5)f(kdro -4T1cebfO@bQK*6<p)OEZ*@nDDC-ELlZd7uVRJ?En~>GF6(@SoiQ<`o*fw*^aS*XKm~kl<gk+_+xl=7p -`tl%h6lF<D;V0MOJgk;a`@9R5PHulB>TjraFg9dqR7O@rzQ>Tz(-XjBs58Jc!O9AkfBQ2|sQqg*`Ej< -_XDxdMsM<egBlQ-}D+jqmgw>_Qy`%?vL`(SyDhj#*L*LKo7!2vHr$LVv?Tbg9}XDX?^4F$)zljSSGz> -m*~KD7Ddza3MH`u>lP^){^imHtn4m0BlA^m+k@*7qDY@Oz{eoTM#2$N|D9b#E#NQim~H>--&$=F@XD= -EU{$2TWA<WSp96aGzQQ$XGT{ylQHWtQxi54IBwA~v8OrK9R3=Y`K&<C8qy+31Zxo1<CS2^s@9#j!`Xn -0<kD+Y<(xpFMK>w-GWeUl41jwiMWr;?xES$Id4#?@{w1(SRZ6m56#?;rSex1krXcKR{X%A)<}C80yFb -yh6(q6GEJZoHI+<bDWCre?HU%_?&*AHeoL$EaYe69f)T96gHUJP=i2p>vGEqPvXPvwkv(<%4M+`6;UX -ChgY=O*aQi!e9l%2JR%e2p1T_^u3`uNYGW&ddH`eRGGPM9!H<-+-1u0lL{HY~pF(MU!skZTX95h^S9Q -E6c)SDuVn`LA9^Cg_!x)G(h+XBFGUW8?#S?T8&hL|g<qrpO~~j0?lBttm$7001qOs|EJ4=p>%f1)W@g --c!g*OG~%^5!j1@FTeb9rL`scjwEByQ}Us5=&4M8Sx8dJFEgo-Q9({W8)5OO&q13wA9}R?%Ls+X%(1i -if<@8_31T{=BUyA~5G(>RhGhpQv!q5USYn{xFQpfOU3s|^p2&+E(r+mSR-StFh+;Etx7oE(G}Uwhb7; -!xs6$xe@@n)xC`aR~_vgX*sx*WXdc|+>#i+a*pTEBvkIMI>t8(1-l7(|U%rq1Qi>}L2rTBPD(%S- -5pVP*KmI;~_>a_UbCN_=`nI*Q)52wRonE$XnBMi*A_cIa><%WU<q`>+@c-^f84tGQ80!Vp|?*%Hyr(D -15C0uyFsjJ6$)y!(yLmQ$rp9UCnCPCh2sA>qvPK!V^Nlm*r$|tOWaxQ2QjKS()_)$d+oXIW6EJ)Mz4I -+y>y7o;A%uPSSy}@vv#n<^j-*F3SOt;!Rl{&GVkE6IO!wF+a4M!9K|AD5pbGII345c}r9}!JE`Z;Rdw -~s)z6s12P45Ugv&rz5(tv4HxI#=%=EE>$)APp|r6(>bE5InIVbEF^#Nn5G&X$V!0+GAhTS<2CWE7KXO -azCD@xy@n9RO8irYP%}pI^o1|GVX&RK-XoW;?$#j-@C6n>imTTif`!C+_-~?bI3W_+3DtSvD;LzzPJ# -}RCtR}AKuDtrfejx6c;<?b3#adg2o=xQBSdU~z@!V(_j~Ox6w5$}hp%rrQTnZNvvU^(1wj-)NC(~$(r -mI_8?D5w=L5&BBdMpF5m2%pt8)RAJ$?Kh(PuaL3wRtBmD}a33HaZiREFYjbujE^0GTmyo&8}fu63gzL -;Nv-@)<kVr!MaFB0M&D1nkg9--gn%(mI)~|XOG#vT$Mc)GDgoH+$#E4qdUSnoFwP^>VksC@vPL?Ym!3 -_4Go^<R#*$dj>4+e7?J=OiR>mi0e}=?Kc{f5v}bkgemNdpy${AE{!8B-1=@okL8T<-uerDsk~aZk#lH -@&)g|wGy!W7cK+NJWtY+jy9~&;v<}7=JUow>!E?UwjQpmE;*v(VNFzs1El<_o01E9#brTD^67M@A*j! -4XNM<wzg2YentV6kqE&VjI}7wSC;V)3A;k{TKRvWJI{Rve7yn*0O+tFAcf3|>WE#=@I$;c8TPKQ`6^h -WK86EwG}zc|~X~&r(wV7iyrJDP^$=x=q^WC!|kaLIZLy5x-U?@9@O&<x?Jh*yd>z+_qr^?M)EjqzB-a -9eCVEM2N>&f1Mt(^C3MYP#c}oyQPC42zMYw@-NvhXfer?t%fybe&h@spTRKYD3lkY=)M@d>^JuM&ehn -Otjck_Ev1D9Hp9G%{kkK{WI=)ZFlh~01<3R{moX;!p(-{#atzP+WuAG)j*sb{v~;G}aPU{6%_haQ6@F -Cz_vqjatgj-4lm4%<bO>AmT}^{*=2npSX3%=t$BPRjZ1{l)#h<h=@b^aR&bx|h_L1}uE#1#mbSK-)&E -v&UEACjvStLdd&G{Y_aH1cJ?l{qX7wIBI4RrOCCQl6lzK#a$r)2-YoZ2U%+t(d^k^zYKI3T0Dsr$-h> -*Rk2Cn(ie$2=PeTwCT|ByX?8t2sNAOq3S~JKj7seoYD=t*s+|vjYPZwwwxGMN92$Zl1m@e^RHA=Nwh{ -E_ERbA1=eMZ=nVtE`NT#FU9ClKCI#k!y9*m(^6uD{Vnp8<qNf}+G@dq<3LZa<<<P2O;m<2F;@`<b?+> -eDWN0107LszrX3bnMy!HlLobxc5%(hU5OFcTp`EuU8CvqR-evkp?U10yES*D184z7{>Sulb70pte!J? -0?GtjWI<U_R&o4|OFuusweeR&+TV2oy@222tYPf>w9t3;_1`G%M*5vd88@+c|OBGLB@!t6xNYTYn`T6 -UCn^{%-E#{A4u62L6GzSGb=lb`8)TUWAjO)j~JO`n@9z^_(eQ078$aUn{1)sA{;G;%-(6V0y6+>_Sc@ -$PE_QQ}~D0w|R04tBX`tw`2^U(Z{CalcDv+(-z#`U=oFQ7_tsYO-{L`xL;}NbqkYs{1UuBb(7xPSO>k -9m<c5ZejzPRESxv4$3Ci)hnuH(W(2cHgBdL9Ne?N|Hec25BmY#dtav`JYo{#jwpPOX*U$J;+|D9p4C% -&_=EhcN`4B8MRY!JxYD_Fqj&hS1us9|DDm>M*t=WxSFi#1{fEi;MLwE~cx7f3c~<*Ceb4Qj#Y0>QU}n -M%6E9hvCOo~mf92M*CwBWLFKgg_PwMPX)=*rRwU7Y7(qW>-{%p$X<Z^aqa5f=wN*9b(Z7;4P3?eRfYc -HcjXI-H8>xH8Bl{*5?m?nFEA>w&D){0H)2~!Xf{s|PC5e-muNYx&yhfotvfgnq~_=V-F&n@Zsc|sDZ8 -HII1`HndXE9OH)5w1#yl)+U8`}<U#M_FbAY*ppkC|d7E_+MB3ga0`y4LBT^$$$g0%IY%jSJ-~g?#SGq -*q}%$T5lUefDS}Lf{-$|g*Ct(vUXF?TAgNF)87JyA%_H2;j72i*{vXu1m)w4q}B0s5)&6$T2j^ZRa89 -+gsn8)*a-Ules^P|`xHLGgN=>;3#YfH8lAz_X`2u9q|lbci>X#N+iba^LgT5juAMauI@k<0He9-Zher -Pz=b!5KUo`0e8U;i9de}NTQ49g=tmZ1M3->S=*6s%2d84cd?|K%GTFLm@;1^a;LwOx545DMlo+t>M3t -LiLHI~JVBlLL6_LO^B2Q%69$*MYBkGg#~6oBYyBOu{ex55p%%^b;WUz>Wu$+X=@+vjO@iJ2gP!*SrK2 -FCd^jW4pi1STe(z>vPjB7adnt7OR3iq26!J%T=KZVyonMh<4V$iN7Nxm$PI?!C-KUMu9wBBzT;yd$%< -YHH0)y>dAn$E3{Qi$Thm^1ndEY(;`w>Y=enmuwXkf#OsIIQ?9Ni!(yV@pBO}Zo^ATHC@7+eay1+E^C` -b)Lk8u#bX^=U)^q)cXxPj2NL$5Z5OBkrPTxHSqejJ<f?-%9j1OwD?EJ;qK+c2LCogs(goog^qAl5`!_ -xlEv<*;!?GJZEH?wXwHAV3*bajBBU;ulimN8u3^(e`iV>WkT7!h<>*6(2qUag*>2ZINwa8+*-vQ4Aaq -XFp<)92ObSdFNp{*g#=BAI$wSy&=Y!!KUuy!prIxoSb5!cnqhwBE!J9D-2WEq2Oy~~hXP9Ba<H~FiG2 -x?JH$Yj%r(#Z21rmh2hZkW?goQ2QUK|vMQuKDh2XCF>+9p1-(_$>ge=3T0oa0EHq<X=Yyj)c7o?vy*X -+}54Q<LucSN265ijnaM`z9Os9{$T`MDt4udwSpwu=&7b?=k5jJkGGdqHQjvjWRwrf9w%Jw<;BI5r%%S -|SrHfWC!#7QseNFB=`7tzg?`g8M`%1pz?0@3_k5ONEOC)B+7S~0+gOzw`;7p}LqR*lJ(p_32Ha_Tpgw -yht3DQ$WG?8?O6(hAGxbPAVwXlx_QBvhi-R~ii^B8lEEq<kXk&f76ZO~ETRsp1rQuCF0x|5%^`(0@fN -wkMgOhgcQP4iCJvsrT!1fN^f<Gs1%FIg%g`tCZcMNE%DH_{-eCIbeuxP^Gm+MPMrQbt)bH0b=m68sx# -tBB=uJU0%Hgphh90G<1GEh?tarc_Zqf~KiwPZ{|A49SZB(<oP&T$1-VWUd1cJZ{R6x$64ZX`K#=n?&J -1EHHCJgI<blIw;A(j9;i7{AhN+t*8@Zyg1`U$c*H3f$Ug+h{gtNp5&1TzHpJx59*<i;h5UCHpKy<dr2 -vn~enKke7)S^@Ay1{p8@YMl*|&28B*$AYeo~f`>Zgt>HCQ!l^fUuV<9l@HK3jXdY4|7Z^;VutHfv6~6 -r)2k1}+)Kkcaphkca_GPMMdLGQ6VPww46f&5~5cVp-5~h`*jfS%El$>NeFZk~882#NSt*`)v^T@h|J| -DT><W;h1rSz4SU?OvFAu^&QAEp!tH9jk)C!Lx517V#dz%>$1@F90n2@RMCT66S*;D}=2?>SNM4K{uEt -nt<JJ2rX6W>D>e3Vo48B+pb^!a~nXO|*0S?0Ead^E=_CRL(9g_%zC!Zpr>ADU}amglDA3xlWTC$LUGV -MBU9W64$$eH!<E3pcE5IIiEFfG-Z;D)3FDrW6dDSJ}$@gXVBC$QhTtKaCrg`(930u&uMHnhC1DDQ1%K -CKS+XWMFD#y3K|q??3PoZnP2L2kRrYPgAo6x5Ted?ebJ-YW@1{$TLWZ^eN9dwr|iU{L7kpd$}k)OUjG -<qL2CVY+6s*BV(6cpL$P?g)Q_c5fu~Cug;WW=E#pGZE&F=|9Vgt@<NhX><UQEl?!3iM8D#@O=|@PXFO -##`g>WZBS6mr`8WBqO05UHyN_0UOwqDcyMGIztPgSItCrb+U`8HmOnQDa(N0CUo7@F%}HrJu-WcH(g_ -BpG&GcwF;=rAoh?sYa&y(hoT(isB}0jSP5i0*TGj1RG@Rx3HZQAT^q5QzT{-5%()QsmSy+BCZ|lx=0R -@z@0a$T)EV-L+rlT}%NB?X`h>K{??QNp6m%xV_;w7eXP63~MwarKz+hb&`YybW=__?vbY$;rzN7^$C~ -xm|5b7bchYf5M?y@cswpK(O7$w40DcChCaDPI-z3`r%A>_%y5vDaDB!_TFoVkftdtJti2{vRAKD_l?V -|Arpf$(nAm!%vy_phFXN2QZYp!VDxjbYi^e`wWi*beO{y9SgCQtGCp{Hx9v)CKwQcI7ne#w&@TNe0MP -W^kc&!jdAR`UOEOc|3!f~hX_`Uqo9~hj6AWoUw<Ou=aJgsY6+^$=hE$T=q9Jeu*$;_}z^;J*LCCaws+ -~8qIH|^K<V8clLK9CIW@mA3Hy|wHFbpORfAQ98;0J`H+1cuUxqt``J9u|37cG1Bc_AE50{T%eVm{?_U -t<@-XDVa(dl_xxFo==EI`Gq)SW4^!y69+2WQM{%tW$G)DG;YLE1)ui5qSX%K#W?*n38)?>!y2P_z|jf -iV9I%kcBTT?Cz~6mxO0V1qp!>)_3VR=nQI5YB!*WZ^?z&K(NsQADQBTOqcO56ly?*p`l`1M9V18pGnv -xd1OySYVcEo@945O@>m5Z}#ZE@+!r!55UzeU2aHK<T{YhLPN)`TkzHxN9t;h7M+wYw4Z*TaalhA?<QU -D0mbbhp-^G0bH4Vg%+&cf;}3jA0kIHkAKRz3Q+vvAl9$_knFsY9^^6$_iqc&?SN&KkyN5<RBIyi7_Y; -Tya&ypcHox&J`!Kr{_42C=xkL<$4i7a;NKzg^lP2->(X+mX7Oyh%jH-86&43`3X#V#XCFY!h|SwLtfE -fA7ui;N{+{S1_utMN@mPg6%hd4|Wb-?gl&GZ@>9&_b3W>|F-)k_`g3M9mDh2uXo=Z9|Z@8!HfOvH$M; -%DDq<W_@`Ycb^QHq@MibtV|ostUdl1xi=FNL{owc@c=h9(onY_H(H=DN)8Y2px4Vat(VN%U(u>{T^#T -0c+kN>3d<Y6M*Z~Q}Ti%tu(NRP*jR%N=0q0T1DM9lP1%N`7>0kZR$EtZl1J<<3dN)t+>Jap>^NRso -5zyrZ?=I4cq1ldnVNBI-%c6Vd6IrM(K#OUa&ohsF(Sy5L*uBHgkfi(uYixjV?D>OnJB4k4#NMD-f6}E -Sn)2!-Sn0pK!W}qw;bhrWV>fwzfP3v-tkcKP>#f2@72fo2z5Y2jCe#d`j{No++uu4@VXBiYxeOv}@#^ -i)Bf^79<;x0vLFXAbQ#Z%Os;@U_#PoS)R9ks3QFqTF*?*^qeJoYZ}ecB4UM*RNAb^91MV!EyQ=N8o6p -gy-rVp;1wlSf_8B7_M#M^xQ-aJf+W_gVPWn{dq$p5sWYi1`rJM%iR>uRQZPm<PUgdf3Y$b=)M@DD?yK -z|_m2lZeZP0SI{@~3c!cN;-evEqcLkRLQQ|Bw6XtuB$o$I31A6~gRFbDdR<S5f26DkmK12R=nZkOWLc -N_!=u1dhyDcZ@!n|BLfcA=Xl$4gb>P7+K>dWro9yHb@zY+Q!1*9$F++C~$v0yYf7u%O!@!1fYdY4^Xr -osEGF^2II;f>%G-83cV_y^wOA1JceBUk4&CU3k7JzQk>D1lyjk)`M9FwSg#T+4gffPR?V%DIsHj05#w -nAv^v6P+=weu_#nM8Q6V<sO$m;;|yMlO&o=V!mr$GMpiLR*Gw4kXFVsl8xbDBP^@N0w~%l<udeAv2u( -^O>6>?XqnoCW0~l)Rp;L!uH^D?l4^<<X4S0a;87$jjcXTBs&86lwf_kiVPrgQ3JPcsb|46ZA@2~CY+< -TTE832g{j!XKi({HgV!8gb+^jj1DT6w8iSsxes{)o4s7iA#chy;TmE||Ep%P7#aL*PNx*W(du(Hb88I -d@0>0<sw?0~Z=3N&`>fXu^$46UuE>79|l+4~-czAf`#N<274uF|RIaIOeTMQ8&c-Y2~^7jYuHE($9qA -C+M0txV!MtKxSjQ>{Sbqtu8E=!cid@Jb%`$H{rs6`9!$M{02cnoN)J2F6W2%C>kH8L;Zz4^!%iZ^l`6 -@>VW!KbeflXvSLr#-Y>biIK`tz=B4b)d`+7b(VTdhhY*19uk>|;?Xtbeq*VP;y~K1!j?ZNFKoX+?hal -nOE>mfZ{XN{Wjl4^4$1jY(Yg(7Eiicq-CL09!f-a3jbU@SPJ)n32!LRH*y9C5p|087!T2}m1P_L=H^Y -&|)JK;taeHYRSIFBUVNBEp6kq2lT2GDOkQ1Y{CY5r)4vBQ@z+RG``?#3fQrT*5(62d4p!9zxed3ONXL -r{Nq#FoMF!2MNZSDPG%HkRc(j=?I)vfLa(M7Dtq%|0{n<k~yFy=*ik&?|90TdGJCq-&TImiqpC^U_D= -dl@3s0R3kt_B?+s2}uBBkX6~(1aE|0qaqJed9~qd6Z{K>xY&X{_Bs2?`h=qBI9Z|gr^$eZ@M$;t0Vb+ -^+V8KUk|?ia{Y&3<EyV<x0c#hf7RbukFZh{eEro|Prru08(;tV%coy``PJ8Yo7}Y%)FT<}+~Q@DKn4Z -%CLx#~!xR6M8+iPDC^VPJaEhx7d(|`7l=<G-h~2%}jIoHNZ6@yWb+fcI<o0ewHaZaSNA7mwv<VP2`zV -E5PD7kW%SD2v1lyfVdxb?5Y}CA@!!wuOLV$6X@dXs1c$4>#yp5G^r)_w#qeL|$@W`&rGw{=9xZdA*+U -xZ?L5RsN0Aay;C&Eo3OE&v-RlDirZnW77p{6Csu657$C9hhk?OGgMUj|-h8&xf}L}<94RoY3T7q!$}x -XJSvu6)~L@J3@U1=;cW08fWn$TKO46F_f|$9zp)*2UXJ^i?FZ_Y65SpA}Th3bTYGOwVSO9=X_Slxo}x -Frn%0&B5{RCX=yB2^BoTHTbBuUAY^k2paOO0!Coak4HK6BtYpYsbk_yir6t~ZPKCK_ae@gK<TjbyfNK -GBG@Y<A)%0Cu!>*^=@e~B$1z3-N0Sd@n-)PY6s*7JGio02p5sJ0f|Rz`j?d1D<T|B58>pv@KWKwV!I@ -iFr-d9l<JJvk?$CfL+BJhmva!&BHKK#NXY$+g6*3a(W1-yEYHeD_#73>3IwscY+sDa|06@piT85s)-T -@oO^|^emtUxEp4eet7;IP7-y_aO866q*xJ#smN!G%sXU6r`AxUKV&XxTabS^P;Bam0VrtlN-X_9H4<9 -Owlcd9Ikxo#EG4V{)Odd;Gm-?>@?Na1G3as9)U5PDf{A`$9v#OA57xdz?_Krk08$J|nL{QarKkSC14@ -JGZI>cles5e~LGbwylvkGgi3?Ym}Dw(jTn`rb$7xXJ<g|iV;bt)2VfYkSHPuKrD_~&nOp%Aey}>5GNP -nb*{Ul>JP^T17y`+!82SH1JWRSLg0uAH2Yn%G*Vr%d*irOiShIXl0(0>P+_)E-|7bPWG0}f65jAJb}m -|~8nt}wx{IgYp7G1u^Q9ZDDfEhs_R)D}xFRgsTy>=RX;P3t&Tju~kcJ+HbG_GEM>KILWY2yH^{sh#e4 -cSc51cimX6Z;vThw~@sd9W3GmBd{o<z^HutZbH2nF}fow@IvQ_>Lmf*;5qn17nj4Hy^<9^7D15n~3r0 -j9a#viEVJ3_eTL07vLfK(WIUcs$N;IwlA-17r{?3yK+#pTh&6X~S7rkBs%U%tV+*41XCJbs7(^;tR$D -x)bl)4#iT)P;mDcj5OyV>)rE=lp*Q)oGo|+Xu5vIonIzTyTp`_r6Ct7s76l0b7AvJokgIj5!h9TUX=f -^NLT_eajVJV0KJlLQj8J?L@~+}_I;2+2St}K+A_6m?Ecb8sg@+Hv?kWoi5Q71iM`%+IOht6IZe-P6Nm -CrnNG|yX+enY_VHyBk2tniJVp%$)|R)_T4?-?R@U^npQ*KFT)mn(HGMv}O*MT!yJ0nbR<y3B&qt_>md -IbOc;){7oo-i5pqw1UB3jBJLm`w|azX#en)%J5QGcY8>{IdcAkfJsWd&d=;}KucX88>bCgLD#Oqd^uV -0<QU+TRdgp7#A0HchuGm?Ouqd*t(Lcy4FQ@oHs7%0)_nX1!|(iEl}edq<&lue}|!+_==D^)hXp*2Yre -_7qRCN#pLB{rkBuj~-S{c*zlWLoj%{xO;~GnpGB}{qZN`-SZG#h(CQcb}%U_&4q6&?3us`h$(?{0y{1 -sUTi(e?)DxNqTsGFGsN>P>s~S)h|vxf;Qg3U7~mZjj$ss|WeJfPnX=TG<G*wFZ8=UMG(N$*N6Gq!vey -0gbfF)_*dS6@A}(O$8{?8+><a91pp}d!yz{t%Hc<cs34l*GEV_`f8lmGA7SRq26q-Jts*N(8OkgHqBF -FP@InoNsG&Lx@_16D&w-~4_7^ET+sCmoaE!DFK+ov^0i|37XRO$<?Z?(vaLV7hLq>@VT9uC+kT8(>#> -fOCIjeDfRtgBy__V)hzSk{M{JVoFJV@)IV0|}xrZC6GrP^-Ye44M|AH>}jyJG6%hF^vX@conl^v+f3B -BNmW}qkyAb!jKPfNH+KW_?@`zQsQ~b+CS@vI!$q<iTLG+s4U>f3Et-LdKn308vnO&bXZ-ll#PVkUIA@ -3BX2w<i$et6fCHE^kYSsQKziozu`LASI~MC*f%L?5X~Lcuf-RbWjN>u6U?oM-xvL#@13v9;`Hr_vDL& -Au!z@8EMj<>yZtz4}Rmo&Z8g^JaOy>?T5nfMA_y!;voxfHgE9u*z>axghtXT8M#z|M{=d)ZK8R0NoQ7 -Rp(sL#&!vbwu7A!48zihUpg9xr0}y_(!&nb@3Xi^*+(HY<C0*@shJ>Lj#=s>`H3#9R3a&7NJu6SfN1@ -9kN)>e-ea_(9&Fv!@xCkM(ukXdvx1OE*7Ao1@uef{Qm1+O5zXYGdu@k?Rs<cx1Cbe|O07PyUdONBPhQ -fFrbtOD9C$$Ts4P*AXl9+{t#wUV~~|G}(Y}R4{mb&Fe@H0DYX$p(V+bM%P9$&l)!WOjp2lEQ_PdJ4NZ -c@x<)HdSn8=7@3I4J&<p_*mRZ4o^(-E>cq&v0!RO<d45FdQVzOb1E$^yBlLd;f1MUN`tj&hNj-j(@5I -B)rY4qZ!~@G2Ox|^G$!IKWEz}7faD--QV`LM7;mBIJ+@<C`Y5DrLBEHLI59JnZ3?J*2>?*p$nrRdYgi -T6qr(8{s@0d@BHY}CC3O!>QO!=aSCdO*hOL!5B@q2<ONJz)#3)XFt8#%n?Vs-%^du-&HLTR03%J9QjE -4tg<PGpgZ3rcW5ZLhaTB(r&>g&~tuMCRqbccx69`yw`Aq7E7Ad7WpQUBV-*Qy-gThZZSqG<f{@N}3}y -rZ5sq8wHK#R-2Zb)!?}yG=4-|wm*;edg*`aijZiujY)F~0F9?ei{k!QtsO6-KVeu3mQ!DEmcDJ$stJ4 -Kv8-&~F@@^F$i1zPM9R1=$4Wb5)7!23)xBj{P*e3GWruoHa^JJga`l81YNNad0qFy=+ld7pfD$?9&Ff -s_uvwZ-)iqgTyf62&bZQpXZvNCJ^dsT;$$(`^9kx^S)e6-WQIZjVJh~M=%jryh?!Q~%N9|a(4GU=p6* -`uFR_tP4P=4WQ!z(<=&u81u@Kg62^>d;7u8q&JF7CM|evkF=Io85|%Q|RY1K#7r;<H0ClBb96^H!wrt -OEnBa3JWfcp&IE)3Q1p*rek<9I68Pj0k*xwIlqZ9QA%Rg?aiDrmAMxNt4akdM2lxW%7hXfF(sR_SG<l -aYhi{V4!@@NEZ#1U@JV?)!fm9c0VISTJlHkx3x@-(fLW0Loe7*a`0nzhFYFv#HVk|tyvCQ`Na`J9K(0 -4W=G;wV+F1PH3zbY^OKtj9m`CSQAObPDsiO`V=M%Sbk9&MvcP+QmL|}M^_3pjRQ&{sP)c_!R0l<-@;+ -oJ06i|^bc2v`K~W-5LtpmTybL2Wgz(rTIIBwOuTn0kLhbu1(F<9P>H$X?92BFZNJf~9(!U)DYI&8O=M -97+kz)}HG?f18L-R+|he9!$6B^z2m0N|D@N;i^lE7D_Db;72u6)HXECifuxY6J_p|5#U<{nS;DJB32# -f6Kvrwd6|gYuFsem;V9Rkiz(uc~$r61Lghza_0Y{1HDu41@EO(gc~|c1OuCvm`t@75(|&OxB@95&l58 -U5xULjL9$3s?y?86H)V7mczov{)eua2Rh>o(<mN7gpV<*z>8$c30~O|mJE{5L>Q7Qwume!;kEFjzBaE -J`Dz3WX^XfT=rs^L&>lH3LcaMwn+q%a(Oa$%cD_}`=ps~l?*R0q;x*kN16K5KMqOaNxdBL381CzEAO4 -Cdv<qOQ3p~x7tVhB6sYD93D@>#@8oa{8crMMOg>kBd46>$HKDX-5IOqznHwl^jGA1x&m|2L_i<m4o2S -g_0YjN{j0e<mjIzPu~PVzQXCOnGCra_}ziKr|?f40k%@Ar<Q;Pu`S1`0vXQuTs!Vc`{vw-FPl(WE9^L -YeI*S)W0_u(_a?Ri16Aw+t4@ovt0JxFF0tmo#}~oj)w<GZEDZqN^cVQ=@)N_SHBC$t$tdTruvcfSEQh -;0FTBrfa%k5)je6$;?|SwA}(GS}L?h&}dHua|$29FS6QORe3^VYK$dTZ!IL8QusIi);|?ySWQjxj#=N -w{H-o01Xw%`bl{}d!4@NJFtyOa$G^?W`2NjfW)`QsUMw106#d8Ky1HKr24CAZmm_NPlsNHe@Q4J3r4{ -sG=+!RoAC|R+e=xk$$c;uo1ZiZzapL+Lf3|Ip7;+i3L`yAcmV%xwDSC;HMz~>2a^5yExU1nRFwQU1p= -E<~DEC#N#bk4yQbvQM{X@n^lIB1mH+4yJjb(O_pH~Sf4kzfhf$?U?$%o*gh%qi^*`ZCxu%A&*9=uvcO -e2;G3~4fnM`G7WKEUo?8PS}dK#g=1R~$oPgeE_))!@;HC#OK@Cd9KG7(G?f$%(R&LXl!ErG+Q+JCFmQ -1!M)s+M^q|69|tCuM?QfyAC{}v|7r_Q8D{zkzc2y#7(D2mZS`gW&~rdC?5(U0&ezOgiBFLQfa44ZWWm -WkAr*;B`5-q7PC_GLU7g{Afg5qcEDjC!t--HEnMS_3Ma*pg**#;$CSu$nj|CGuF*J){ObVkB8?)T0SQ -Kgjd7hE_^}D^5=E5~5ZC2?pd-vH8F>Iem$*wvOerI-QuUN%NfY2apNSL-(ur{{ssZHVoH}w%Za>BpoF -`;Y9bs)t{V#?SOwbLDgR7F$Hy#RwVCT4v_iU!n!MH1X=S~j`1$c%bc6M&3<$RcvFKG+c9UAt)wu)o9$ -XnDc-31fY&aKtlopd$Aa_sd(kbCI%C;LLsMmZ^FMmb^HTC~DbmPl(@#O0-!lCz{#&gCpExXn|n56vJ< -pz%3M=R74uCu&xj)~VmFItXg>>b}>Y7fy`Hm`zPPqQ$Q0Yz%gX78do{yOBMB!)Qc)_j^eNHPO{ozpip -+eJ}W03E~c*vlt~TBlsR0@`5rq6Gq^*;|AYkjmL{aOzhGollTo*)ye7t_+3_WH9HpPM0Vs%nadaF<OP -{q;T~YKih?{7?vcDz8qq0?CNE(fpCx$S#jxpy&xBZrHy9s^y2Se|dtv-CON&HDnSeIa!gekMpbC`b+s -h`wym`>Uc;{APPCKiIM#utkTpyVW$?OiH3~g_DT6VJ$tn#~#F%Wi_+_C%?agmPGVOoikZpl$3V5>%FN -#qlG-Ct63AwYeO>R3hwFZUwH;Ibk`6Q{)?za-ni#ze0RUmkT!_SiIYADbg4mR#SpXfxxyhagKCIey7o -Zv>JOMV+jSW247Zn|V1(QXqU`D0}=#n_%4JYe_?>!8A{PU6bEqGe5zkVdObNGwnBWaP|Gcm^E`1ho$L -`ssKK-em=jmJgJ3O4{va$x0((@f;0-PTJGT5p(%0`QtQ|#waL^l&8FH&X{DYWvwJ{*K$A$4(s7saA+Y -l<b=p~ACaUaR*NZiS2Q>ycYR7Fm#!x%P&l&u`ZA4<lj}u>ZX?24`Qdoxtaf@KR%LGGSCTg>4^UUV%l& -oOX(Fi@al=`i+CCRvzR(wcnzg*F{J@L0;c2UM+biK61TyLqbJ(Epo{@`j_Od~8y&tl#Juh)%Z<rMi1v -hQW>#|VZx6sj_$5NMi5dx|bK++S>D^I=%C-LmPV9%0&Z-MXR`3u=zgON9d@b(K4k=nsW5Ky_}!>i3dT -ax2M?H*O9FLD@jCGyc9HP>q15tM1CNP$+?eH_0iJ_=Aj>GkCrI^I-4IF~|yloN+u|EV~@xzEERyv<Mv -U9d!K+c40|MXC98&AmczNh)z%~k$KAT(noF}pWqQ3Pj!h@P}BY|Q`{@KJGXk2n%Pn+ClHaQgdYk!z;b -^(Ys-F<Q#eKcw+}`;w*o~JE|3zdU}y><$B1{BGg1MPXI~Z&@X%_BBwBjnF}ow>p2*7ZMZ^;ol3p!@gW -khGK30PfqrutGMVPMy#G274;g}LjLuQq*XHm4=RyiKMKksim9hal`@2}3Ee)$zVxq5&8=RbWjzItDtk -G}cypITO3k@S`zI9XLFtq_q5VJ=F@r^L*K-02w$K)~=B9%B>jp#6wv;BnCYNBdC-;JWm{qd2Ws;hvyZ -Y<-`tMXj{4vjR@63je@Q9fVhV`j3CqOUsXF(EHAXu%r<8cuArAfm9zx!lGmF$8PQ)w{3sizRh{)l<l^ -E`(El##hdTCL0N2<|0;9$WL?C5?*!#qL4uNe%xt$NXBbXiTeg>%tp3c{aPDD3t-J#CP*?Nl!!(Zjrlq -^5wls0KE(68ZR|9$v=RehB`0}`Z57K;}BNA2aqu&BTX|@-TXl+c7f}c6YH_<Vk#ArnejkTZ?Vjo*<E{ -<?MZf>06j+YNtez?75Bfw8Hl3jQUQMeq;@-8ig(LgN!YlU1Tyh6dOM47}d!8U8wD$MG`Uh}9C(lWr^9 -f^J-NSPKoF@Y_~H7e4W;2I>GO=7JgHq)HZxMS;B&$@fm!0g;Q-G`=CG!d!gFtrGARiT`0!y~0lCAz_V -GXtl|j#3mCL#Kq{Bw20Z;*d33u}H5dMRyWWSrLb#J&A<OU$m}^Ctt@}QxW74c_Pp{$g0C3h+oE~AYBF -qX6P&pQKHP-P3dRPqeX2#L6rsXAA##;B%_=N;m~=zFzktlNz$v*YMi+C=^lX<z`0{;QHUuX&<(8#)NP -<TXOxzx@<WB%BpxNf#W*k0d<Msh*<`}TLUhkm&M4&HJTI<#W>oaIzNqMLptZe{Vi)|xtsR^P2hiF}-P -&tx?K|1p5x4eY&I;xuXbr0T9b5A*G+gCd=rk=KVA_LSOHO!zw1k-$P_ihlRn$U?@mBI;OfydLFw0QKj -1(mir;5uRg_L2r0UgCI<L0=;?{Ru@S;0cBZcv@=%mUjTDTbg=H>MEhs&{I_2^~G6GSb4MdC>MTC<ABG -QqS;zN4#y8r+yDnk5jyOV>)|8rklqCUmu(_*zhXlYSFM`x!}ohWI5Q6*#8WaRQ29SnzDBcqmF|`C+(o -1(VQ*)NMR38P{Q%%-fXpc@AEX{C}1eDM}zY*^0q95dZr1@AKP;Yu!fiS&@MFwjms#a6(%uUv~iboS93 -m>>hzc{ljJ@lHf++^=!I*h7v{S(_pa@8DUt{o%QQ)=ZdDJ+SY?`4lqq-=P^>c2Gzk3*Y|=B#(>LVAd$ -{>V(8hS2-*EobUy~vaq-F=7nnmp(9?;N$8nAZ99>GW3WAU4Stg!P*a6OAYT9^g|<(MqkD=0&Q`n{jTB -lGunIh<McIMmxNT8I~TK{sEX2BeK`U>r+q0skUo{EHCjc|+2yCig7M=kFw_R^<C8@dusY^be+CFb!D3 -btf{w7rihP(UdoDlpNu~5;KSkH@F5C@?DZ8oM?Qaf~ph5Ag<rTF(WWk)fDr%lr8C1x_~h-L!c%ccA$- -@`0|(J7c5um3=Q&9&wy4NuW@r*k0~69ytcB}rYK_{YjliZ(SnLt$oQ$HqNuZ`+8g{#F{SDj943;3b4q -O$wtCUGn@_r5{H5hE3FZq_25a@023ja&a*pD^L_)qzP%OnvnegK*M)Py5P|eVG@QYSwIR`+PxY7w8eo -;RZaC+i_Po*1Tw9@ohf-MRg)`Nwt!MiO=`f;Qx*4bE64Ty#=W2li!eT56<kLfmQ^jxo2UxP*<q`@E_j -g-3(@6-*e5F<zsr&5CZ;{dH8Xkm8Mi4M2+?QC>+*TZ<RsSyX7vSC_0Pr(*3hf5A04h8pbMH0um5;r`t -L{{EnFN%cRP0Rx!bhi~@1{?R`7xtaRWda*5UT1udUm`3%9)01tw+O;ZE<tY2+@^IcPOq1p<g8Zs;+-B -L#YXrKy}>VEG!U>Y%=08hl(pA?QsG&ynL^dGNrsXj%%)H&?rF{f=C*hf7kCd>_V7#C+KDrftosZ#CNl -6p+5%wU%7>-LlLBK-Q4mOKuffOth!V>D#H~fVdr{)ztqq%L2@$}`s3)Fn<KgWjFc-vW&@op`@p+aE`5 -&PR7(XKSe!{L1p<j;Ph%flZ%>Q09&qIFfMpzt_vom|TSDx*zn(e60AH`iOMKi+akblhZzjkfIkKTad4 -;%sZ@hs$D?X~G&eYJQ0SndC|w7^5|)>ivuHkQ+Uzs3H@SnM&L)hTDU&Rqrto?1E04D|!Oe;gQp&`N$+ -d!Le*10`3RBr-Q!%F2K^*yzge))Hbhn_>#65>6{)w&vZry`7|41Y#+09tD7nSBvCghQ$nTSG?*#7+RU -2Iv|8ofQV?l!}C>Y-jsI5cpimWM4ruesH)J<I2ETh{dH!T`buRpK*j#;e<elEc}DL-eB5!}&cgzod!Q -E-t1>|WI141*mKy(eX83U3NlL|=xt%h)5w7Fw#zxn%=)D^hi1D<!c*Gh^e<2K&oK=BPFtk}x4FxKL4x -jDOKG+Bxu1P^@bNHZLvgb`L`%Dr~z7;7sN;k`&uhk^u`-B(|Qt4ziF%H>SM}f$P!&yNVxn)lnS>u_{$ -crN)FAKx1n<6#r;++lvmHm^ZYXzpuOb}L^!}wrn3H}9#UO4y5A9#kQD*7ntD&P4%E!YPB9ZJC@)M=wT -os-Rt+PRSmqR(NYD~E!)E;h51zN1t3^bUP5am=LIkhPlIFgvmZr|5;T95k_q{wM$rw1)W50-DZA><89 --S7F3#dZgNWytsSbskD$)d)YtrP!E2VQBZv*jWXRWv;GSDL0;b&M}Y(&40TUiwb&TuLEGAt+Z<J~{jh -{1Dg4tB;Xz6`_Ug?V&Eq2DXWz^r;W29cm_A_Z-o`t&>6U?x;F(K;-16VhX|kbdTgrh=HcKwpFq2#@Tb -86`&cq6Bl?kS8;4NBsZjx8s89IL?6h8tj*M6DBW8~)SMrf3_8#f0E%fq6a+S>bwfv;m{fLpA0S~iA5q -bW}y8qCow6SB}%q|XB!#mwhRR<wXY%MTW09d5VpG2vXg&@H$%4rpN2+iM5w%|j4|dA^RD_`6^K0Vtki -P7w0xBcm^!d$rTR8VLSsP`q)5m*Ym`W##@fjMo+F;g5B8Glcot(cOyDC&Yd(V}i(wk3IbT)}$RJ74a) -v)_)xI{sjj;jqYW7z0We&e;oAx&E}tn{9Emy|Ka1O`yWk9`=Iz^O8*5@dQdD|%AaR)|5(faW)sgt{zq -*s!_<82bpJ=wT1LmVKPL5GFsX>>rB`mBWrF`$&;Mpq&qMx?+ImjO8~|oq<h@vRuK(GznBU~pb~bOAQ` -JE%Bbzk4gEm5n{IYnGY>^JG!GHELFRI~;?a9c{F{uu9NO&}M6yYq;Xl8pnmL?-?{o}E5*h7snHcQH0H -gIA?K{U-uMGS@ZqxK!;n~aBKFi4tDw~;&Pu&RKIbgVJr3GJfq{IPKCKID_Ms!+Yk!68c{l*2yf=e=9% -H~K(DjZB(u128wjD6V41lA~v1G;CqNS{-THfoV=3x4Nx*xiTM?$uP^EM4}DNG{Q9jnQ($8j)8ERlM<K -*QK!dPaiI>)s4CL2Dze4gq<EdPcnuwiQo{2jpH-;5&xK0e2`hE?E#m5YMv5u2&X*Qe(yCCw9gb&cj7q -k7Q|-{g@ckYKVlYQezx9a5Nqn8?basme_L5_B@vtxt9=UD9z-|-(8C*l#)L|GMxq?b@pP?YS$Y_^=Ov -EZYWO_P!Plg^27zroGJh38|Fk4l^?=$UlM4mIs@^X@oW_WXVHsh?5X9=0gvRz-90~zV=cS|&=Cat6lk -GCKlww(&Fmc_9tnW?Tq2?C`lIAW<WPxt{a?;;%u+zZ<+6YoPS*WmK5TK*bTM5ipoV5k;2wHRJ<!#|lt -R~WPvTV^qh>4C~Ysyiso#El}x&Mo=F+?8y$8si<IAUrwiZnOo%NL6Ttg_WwP=Y%;Tu|~s?{%0!CP$Jc -FR@^(botM2c=zakaHTlqZ5y>vsVX%VKCi3B$SzRdyH-i`jVbZ(kVRFHV&~vg!@+jwc2(<X@fx(M!<q8 -tW({Yc<lvnuc3DtKZfup|LzHv!q#!cl2x3V1~RsdY-YbkSo>C}okL3Pf?@%!M(Bh|A<Pl9oI^?uaus1 -Q9^#0k+;hbkswcvQ{D$qobiY>h`jo1d>@oLCc=8>D5m2bc=kIyfm0%i^vmEbk6kj$S1@ty@C+A&Gv-V -)dQ4siLu+5e%_S2c4j%ysq)ymqwx+xs1q9gr7w+<eL1cF6%`qv?do?3JZvSiPLdR@sM?zP?2!F^er&8 -uof@~GdB+f($?L@g*6a-k}~ud!&{QF$Qq{whhMA?$wiR?OSx+p&^n&ct;GA}?5Pak<M^T$i2Qe&lp_k -ahb`(*dlX&|TM${yi2<^Nv{X>9xz?hT$^tb#Kz|@dqLzVax3uJJ)PkR$Ixw0ERDjlg3tW39{J4h)IzM -Ixn((}JGjh7#Q#0Y@GtfL48@A(_wc@j3(BF6(e3<_l{P~-8qo?}Z<TK`e&0aSWD*<QE4c5bc)bG?w;< --ze6+Ct5u=56xPXXkYHpp5!R26AW*A6k%FYNTemz^jGG3Lo;pOW@&e&y+3z1crOvwvP`B!IfrM$+#ib -~Zj?EKu1QO#kUhqv?NzO@I9<O@CEu`fG#Gj`fkMyv%Ph_7IOLkmP7KWCK1^NM;TrBR+P6A;^FE#CeQf -{AS=y8Kz2jL6OG6+&k`i=z73Hsff;Px)fP{lsmUKqdP+oi$wPvUIgVh*IV!m%i=lpxy0(T?0NVMQSv- -`1{itXX=$|!y6PYzdWf1#`Z=-NCUN;>R7RwZQ>o<cRGYGLgls!T<wh-|qS2IFs~2pe`C^ufxU9lBldw -gK8A4BqVIZLcm$ONnb<xU?_%fZ~g)^#w9Mu?yGsj!=(m)nP`%*nrY&?m}l*5W*pxgq58CW#LzocjrnN -*=#p<WCNj<!xdNi<`~W6e2J2@SMXMvajU^{t;a!|fM4FMGWnOpbp$hpE9W#20PJl}s9U^+o&i!hJVbD -r(8Cc!dMqU;whFPnT$FPY|`1#yOcTs>1=FN}YU$HhmpPs#ed9V&y&6!uvyL7vA}lrS_;`Z49ptIa3X$ -{bM<UR+3Oq>^u4EQPZdEi>UYNd?tS%qqFDM$!U|IvV-j^#fM=sOa#e6@nIaZA%{|>ZVJ*q$J|tjkzR+ -Oq)yD-noQ}A^u)Rx;Lt=M7b#H-zN6U&{>>=C@MnnGECL0y?iC>;3z98Z@qT0V*a{&Sghm>ISb*RxUYd -(kI?6H?Kus&0B2dv<kRLTNis3jfwJJcU5d7$?hqgf6i1;9sZPme551TQfMhKVY?F!_gGeC|fxwUYdO| -r0#_*T*CpmzAYe$cA*#BF+ER!vh_vmoio{=+ZZWM|1QO->Eo1G<F)e|k=0a7dtZz^0{Nl*|#)?2CTYP -R;kz2ADH0!YwR6h|5Yd3~*qLgL2Y#wzgQiV<0C>nvf%aq56Og5VwRmu5~>GXQIn`E>TezUxw+3-`ba& -&68r{ST<=@{j@GiWHQ670Q*O7czX)o>}QmmgpGLmFS8WsFyXWt#MuY}h-Vk5dc>Pmd@J>u!FRc+N%1} -seVj_OF=^w{VUc4E@}nqcXVwnG=U<FrKN1%UV~lhq;(QnWo2$3JR4ZL$)c7OkZpvQM<%hxkvBxo^&4e -MbW#?$2TQp44g7OoB#*J4xW|)dwp}8$)9Ho|q?LYGR59Z`9WFE1tw|K8tR8&Z<o>qU|Jj^cKD{73EWg -d;UjzKPUu4~YuCFnGAWA8Gy#XAcxl*nn89V6BZN-iBDR$Ak&_Jejrq2FK5CR6c_PVwT#O+3Qvdmy?H+ -=XE&mI(|Pb)rbwBgj|;82=c~BRJzpY|s-Hi8L^sT8Ir73bP^XBZdI}Pg;L;%!tc*a1+nX2wH$06>-iC -h@qAy-VM__BkGd<yZ17}gQ@|HqZTC2n0W=EvYi&Xu$FL8^E)pt-?;FQEmYiALqILmj>84gY?KZ;S(FN -sEUzV`0~C$OAzB{bx7=Myv7|L{sskX(@SUmIJ4vw(co^X;m4&M0X)uEY$#*D{Q5Q4l9$&@cOnmEf6t- -w0`iO5X3B0I*psg7)7LT`gtRrK52sH@afmNe?W&tvnoDE1sM3HF60h|lF0iIE^9*_zebe8~7D!R35<B -&~3Hh}~~p-he>Vmi`Wk{6kHZL~-V8_K#wEebV-kz^~xvjD9~?A^|-IUG81(`Fi}z%X(~#08zPc5p(7U -m#})EY{F21q$n`NdNA@zH<YyNhl$5fW($(J$`Lj4ag7o55t~n5Ix0e+wHbTuAOD5I1#tpuId&)u=9AT -DZiSgYF&T5^Kl-FsGj8zv*ExYYluP*nIhCGeBE2$NH(5&07*^t%Aop5x4%()3P|yV#c2t}M+*sq(TaX -$D76NyS41*jv_1p&F)-p>U*Y<Y|6iVJleFZVesJ`{zoYabt>nqF-K)3M?fIvp%5%=w=d1Lz*Z;ED|LP -kb(wyy<7Rtxt(W>O?=9kc@JFpXYaJuF|SV*olQa$PVVBCXrePnw=4<BzltpUClDc8yPgdRCi1>XHqDL -1=__Iz|_hlYQ(y|?er38R(lPhB1RmmPQP_oC!F6))`5ZIQr{Teu=OAvgFfFpK>b*rax+N3&kLF{q8Ea -XB?ErTZh*cLC&`dcDoyo@7XC%59NlU3h{);sIjMPAewQR<auHr{y%ps0PCLLbX8~U?g<h^6)rLuM#?v -!HTXOfFx@Si<Zo=&DGw$Gos6uW~=z-DL3W2*$d6Y9TH*@->6WuY`beDM3f;BaC4Uw*e=?=#`Jz>@Krv -uG%7(@=-46=fg+beDO41vQ*qwu74$3YaOgD}mX#0KZcoUX3tE)Y=vE+NaLGCvBuGP2?z3V9D@oXTDn% -+!UL_71fWxS1;bb=qyGho6@^f{jt;Cgf2ag!416UHPdE)EJG7I9;qGXn4^_+=~5Ix03aN72}tj%F(mG -u%#+^G-a4%+bJ&76R6F`WYi5(x`zA;N#^<503h?J!?0J-mxCNGvg^9-aq6Jd$k5bBV|MR!_M6Ca1&P? -VY83&&=NEaRuylD`<tUwvV^>J1vLKr-@KwzQTe!548{)S~Y-B9g#=`>36*~utAqR)1=24xEhjg8|5*X -3=qIr)~Pz(eus0>z`rz>`#1qRkQwMQa7LvT?+_Rb4|O`zWaUY0oIw02a+@Z;$z7~?_jR$m`}5B3+vB~ -1H@dS>@iX^U>B{8?Q=}PZTdxbaB>&|T<XM*@!;oSP6n@(7gJ!W35UyG7bH}r5DZRHi-Rk-p?i%L|KE` -Oup-;yzx2f$jl<J06&E^?ZvIHa|_RSY~c+*|w6Oe|KCADoSDZxtTj@0Yg!76*|9INVkM%nl}!5vWLZ& -?##;k0v9$sI!$pryl{gGWc~_z;h8;(5vayno-QF}H7yjTqhh0b8Q7&Q0bdp0g%`UV5*9p~xQQ@uZtJb --yh~`z9x=2>*CRwg?hjXs}swofIECR?*aoqZOq;*LbZWNl{Enyz6iMn9*QJXGVi<IrqTm5mb*>PE2}~ -3wwo{86IDl*_nSrr?$}%{-G&Q3Q4{>Ip!HbTkx22ezKuWY}^Z*7T@$wU7I6YXrGPaOE>i<KT}CN>F4R -{RnPPM(;&1LrTA=NrIsEWX7I*P<y}Cpa$b;3BO;TW{o5TVFa{nbBf$3T`d7)EY_Jrs2{~#MJ>*32;@p -Qj00(TZjFcuq=H**=Zt({ONrB3A`||0swG%PuqniI8FC;OHB@2lOW6K2PDX_1yhZ*G-+?i8NiXcPF6T -KkpHq7|JVwcv-aiL#fhB<V_iAea6VccFGEcpqkl%T@$p|#jHcV&M<5wU|--(Vn9k9zr1yY;YawS$L-y -$&O?)5Kyl>5538Y#HQCg~Qf7Osj#9<NF7}+oYfjD3nrohU4Ajqh<ku0N##VBvmQh7UJO1IIkXws_D6L -C>3XJrF#+VMa+uQH**Lfr<Bb8^8jz7imE$Ii{T7Is+WAL3(N{7@4PHiG8?AFbe*RoWmU#03s51#fc_c -$bz0<Tj`10oGDaBEQLFPI1^@Dqvy-bi2(8t!wbc)VSsk%i-Djg5W`XW>T;~BHP+{IK3uI)h$4}iu2K) -Myy|&av*eEOZ9>JnMZSUa-`GT!RDqtU`rV<(+f|tS>b(F?c0-((Mr5Fx&SyyspMP-=zDW6R7enw?)mm -K|0U>c(t%KfF4p0_%}Jyn~dN^Q!{Z96@0Q}|5!x}A*<vhjQmp7k^=i4GGMoI1b7q0kSy(pnBZ_^{P)- -$fj^5`KsCEnq@zwk_Qr;{29Db(8B5|ClwMjNb5?Q$+Ts%eHtlN@cDuY*ONhQE%WO9YGaxQ@az3TiuWv -E{QDM$)NviZAUe6LJOm$$!o=RTFQC5ViJR=mvIKYEYe|#G0+DsTHvk!)6zW}ihb}-hBIBTb4&YWGB0% -;nH!`UHCePKTaE?3c&MZj`fZ3ME7XQ>t(tJMc7Hj<F9*EbeYO4L{_)_4-M{~IaQJet^ZoYW5v)*&+VX -L0@PAsS(N3ex5CwYjw>ZY5#C_dlk%bD;r)Hr7l_3hKKUSmheoNxB=N;Dnm!gUo@$V+8c;yh!*6}YDK& -&E?$k2sWd^PDuKJ(0zeB~hpnOdls)bx*9S@xnc3ztb1>Ibgf@5hQ3)*xz{=g<&6C~;{`1_(}N*Ogdep -`=q2OXw3)E>tJ|Z`X!wNGm6`c6GCsN2A8if_5<+qzk><Uk=d|xA9)0kvB--$H{gymXDV2ywE;*M(#Be -izecCn}CniZ(v>WG(Zy($GCM!iq`s0B+N-vvED~)GGcH-C;QhDFIb11`APMOd{9W_5HLk_0$*GLe>j3 -441v`ji(p}IRoDR`i91RQdFpSH$(v;Hh`r5mr=pZ@XcNR)-B|j-tI17Eogs~hO!X$^gW_lw0*G>6ASm -WBF$&%s9M{TnBmulJ7Ve>S`As`ex?^wcynfm0I3n3_G78{%urnF;*IUYo93G(yx$#Hu^7JL#$+N1!sP -3FEgZn|+XOD>1`7~XPGm@Gb+Oy9Yu1avQ=S--Hq%>BJi<6wTtEAP&WG;HLK$?;&Rt$aIk|Kmz`JR%*= -h;E;zd_QgdmXX8gZx--W-n8Dd=P(~WhzSrz&T10T1smP@3A7(Ddpo<#K$ZJr8T|RQm7q4n%73d(W42P -ah72+`b-4)y9jCj0s-y6LCYj*A05XQ-5*`YMJht6Wkv=z<=o0SFI(h*)>2wTtuP`m(%yyxlwo3XpjS$ -mnwCmsZv>kOc5ZdY?t+S3Xs52Rd6!Z$LWw~sg5GqMIT1yQ5!<0z`on9{B8ENd!s@w|cE$a>jwi*$L=| -U+2OkrM`7EngMW!c%H*>?3S7eJ9x33r>i_Pw7SC)3Z=C)17SX9dm{-f2lq-4V<$hXx_Z(_t6pf)2WM} -fR#&q|sJvvq+&Vef2=`X-UNY;_YLi(I4`QbCskgo)oas97nI#Tq~DM`MpoBah<Anf*tdm%OpXafkqRs -@HI+=Mt#RG%qz9n6U`GV-S67`*;Wb_ucmP@ps>Co93c!^c!9BXDZ38IXr1w&)cU_aNE{nXm185C*PdH -)3(GCK5ARdwomVtHT<*Nu<vHgff|Ig-eyyrg}yPVofQoaADD<;1vAGDm^p63%qoa6x<gz>%E@ve@c1^ -2@vT1JoSsuvG*vY#&Vv}{&kG6Q%P3fx2E3cIu{RGSXSaLaukX!j)T`aso6tSFJGrbE7c{y=C5_)pMbd -|bMX?V@Cds0d8`gRgdD^XAqAt~WHK@)$gG@rI2UL0HLoKIZ<+0L)Dv?4JfYFdjK-7Lr#cD%$a+`3SXI -l!qEmAmBScBGBn0sPdMo-K+c8n8U5~$CQZPJ8-s?%On4kjojC3G2q;Rt?Br<QVPlZSg6)d$k?XhzCn7 -(p5A&0tb{i>kk37<@s5?YG?01D1AIPM7_*e(5>ux(&wr+(wYUIsA~(g7wyK`N#9)&e-Fi@6iuQ<6Jw- -xk4<F8;Z=Qr}goO+9#TYoi3##tDeCUv8IPx>nc+GRsL9-W<Jp{=cmOtqly|y7J{-Ri7ymf0X><82&k{ -k%S2|<ekr0~urmNJG$G`X07se_u1@hS@Pg2}nFC2iT^@QN@bzjwnw!^uAx5+lv3DiQifN|B^<u3#?6q -(`Gn<@1L6CkUp$;NZm`Xjt+(RS@06AY&mpztqrPhq|6>(%^fI(tgA4Cj>!$3u$XYfMUZqq$w=UYqvMu -kcVD*kX6aIj2joNroDl3a()FNp~$S+0b3r;|uJfJ0);Jv982<K)vkz$E*8al5Jx7ZgZ|WM=n<b&_6Ol -4}D=!^ofrk``xoZgFY^K<V45W8;e0k}(@4F*UK#C&i>CVB!u75rF4yG={&)O**jx0vWRI{%u*r*#!sl -5p7z=m?CJDMFZ+wW|b89aRUgIkq9M4?PwntI<M5TMS9nWI8(B>A+i8G*-`wfoNnA?t951QP%6xnhLTc -Dnw<p!Z8XBxTb;XJaF|RII>d>rh75QnV;ak2mAIDI^TP)bjEw}7n2WFo?2v1mPmi5g0DSw-ea3EpVA< -N<-WFGet<iRo;4=zQH5cJAgu&V<L3u|U&<vVuZ==SCl6)8V52mrFY-eS=CpeZwk~{#pDB>$?bz~=%kf -X3N<A~6DC^6Uh6lcw#4HaDhv8WH5`?nnY?@m9!OYS@8z4Poc`QR&6{`oAe&?O3goFx@ZxgB<S`)FrxP -f%Zf<ImlVufD<qE*!2i3OimwAMx*OGLC2TB&mkd-3FV%xYVK%v`)EaLn6E69CnoX<SZYf%Rb84<*-Pn -=&dtKWB3Z-VtnVet=2gX5oiE=;6y*B9(0-%i4P>_FgGM}X)`WpJs}qH6lbLZ<+ZZj-+21vS6~0>&)>A -jNrs*>4}q6mc<QkySA7tX=B2I7FrKCrdOsn7{+bjyLZpnKxMdZnVbj+?Ty{WktQe9~O%?^>H&qTh))D -YBFDv$1C!K;}vm!$1%RbR7v1Gd1V@}q$n~n?<4Jhp$I`BEnZb~xg7)eOFuffXWSR)Zp<CKhi*bHZqez -1*oi~z3$PV}O+_qU(-cV52sxt={Bo}n#&nkc7?%<ZEc=`jz>>jCe-qB%{CR7dTDTdk<ITt$q(gc?_Ec -)~;lcKfY99Zk2^Bj!r@C6)@}EfGe*YSgb<{%M&hiwVQIOO_o(D+}ppMOYc)`qr<}pg}5SO>ni`e`=g{ -0bITEH>O`NZ;bWAvUdj{XrpC>{M}GY+C#|S7LIi59)k__QnaLgFDNQnQ@@wS<Z~OT52vvaV@NeM!;!i -pB`pJ-tJd9IpD1iPdiADMmn>wU*`gFzg$xNG*cM2ohNSh=>0lek=(?gHakCV?(h3&ETeVK78Jj=B7x( -Cn-S^-Q-iRvkhh=zHWe2afe;(|;IbO5Z3d#pdTA@Oo_p;;s-m5z@Lmyi2?`^}hOjn~=37XZ(@77q`@S -k<jVlJr19-^c?w#d1*`t%*S*VeiS)QKEyYrP&r+(+D7o(3Dji5H2w<ZYciEKeV!eru4Fusg!Z{37{qh -&wSGFw}v1QVuH}kzKGM+h(l~4@>ODBkaYyMxBKH35%r19riW6B<8mIEE=<g-cGbircy6*??1HFXX1As -r=&GS?8^sTwBDVy9$QZz(=)54*Ns?ILLf;GB~2AXQ#atugX71!2qr}^{S0bViIbuh=g)L)h7r&KNvnr -ynmXaW&Gi~WIDVv+l>D%QPIyYA>d+ew%}{prE{c3M4Q>4{^wPfC4o>R~&b>zd#NPXq*Q8wBGPH|Jwb@ -AAL$#}$)ZVP{Huj}@A>h=Z_!a5qb%PubkhI~l5@mI>j0=TiHmu8ZYJ}=(by?&$+E3ZtmXP^Eov!HpGj -rE;!Zx^oEZ0X#)RuIEJ?EjQk=|!8tF_p`TF{_^#`JvMZj>IPb)wlYog&dz;@OHl^(gB7-8K7bm-xK&Z -Z1WSQhbHr(T(wG>n9q9Pzy-gFf<O+T${L3#D-R;{8lB72o31iE{{+;^Cw#;!J+f~OaE1b9Kgxumms6` -dcAs#gr#ZKof{vr)A1a2zHs>iJ@sAZm_vsx{-@3GVHrIXcZAlEJ^OX-y}kRoyIZrA;r4)<U)*?&)=WU -^j)G)_RWB)|nvPY}LTSn&sq0GF=9>y}0!l^VDUUvvV$z|9BF5^@FS7Jkov9$rP(xS+Z|Bt|hTTs@&N6 -Oq&oDJb$jJwthKj9NXvZrl#vk>J70o-h;a}c9qcj2-l>V+0i70;}U12a4mX(yLkeXs}Y-S^_jv6iVFf ->y(!}KDI@S=6{xO@7SccaJedhbS$3{?z<K-b0E*sFOG7th~~Zoj<ibn*8D26PDz-i`jk4@U7^{4}&l5 -1`TW&ET@CrkhWmkc&uuofPNe{04=sC%?=vYA#4TPd2{()6;Lhd2*TGbVqr2p3k~8w_S8r>ymD%OA4f} -&_|VBoXu|B6*Je>Ggs3%$>F}fU5~!J3wK`sw)670mw(xTpHJ^P;m<q2{k;F%{$G9;zxRIrZSQZt{p~M -%{M%6w2^n#8xJ#)+w>U?rAw0HDw!8mzD%FWTeUgX^!3l9n>#zl_9CLtEVfsaB&ZxM&8=^{gqz%-5Je& -i;=tbu)ILEYv9B8DQmc8I8VUt`zv{?L3&@IRIMK#TI9A_$%D3)dopOyKGql#cRdRClzV)}&ax*p49<z -|2yiHgQROhRH61?#M7B{wJP)P0?t7CJc9)dn&b(N--Nn<_#$!#MBw*9Nir;lyk#GT?f`!8pexv!?GzQ -x+6M9;XJ_NK$tx^Wa-5e&y(KUvLqR`-JSU7uzd)z2k?&%p2;V28yDld-ig5XiMX_amw_pzVlVpxWx!U -T-M{LZ%@4WdV!j&uDzonQ9?iR;l-?e(&aW$cN9`_j-iI-=!3&uk!Yc&ru&yGwEXc<KEomTUWefY2jNc -@s}~%ANBRYc0HbtR8LvS|a;;VDBeK<h=k$Us{0gNOkHQ21pIo68$_W1W<bU}3$>P4v`9DV9HwNby_su -G<OnR6op%nAhSbTCtLG(XoIncK-e>COMVpV|@cjXbVq)A$_wD=2vbd0?TP+c&!t(|Me-vQpMA~aH@Y0 -GceriJAM-9H*PyUM@;AyZA+HQj9kc2W)nWNpcSffGoL$Mw<9eLlqtU*tZ(q)R~Cr5UOkr^&GGC8&f|> -@bSl@mO@FOhEXf*dMA5GJO`|#6=+<BZjNKM49*KKlj@u2uTf<TAhV`(Sg^ya4OHoNt~IX%x^9evQyxp -l3fgj%GAkGIWToSFt^dfETh^w9{7TGYL@WjrHpAHz>MnQ#7)#@qyPM9dXV8zUDD72F<eXrThCRdb47< -{e_$`dg!MXU@h;6!sb7gX8<}a4!=2mqy9xtM;Fk=)kSPI0X~4AFW2<xx9}S0{UvRs%)^odM985U&+%I -LXgmaDb*a_R?^8M&MXvzH53OlW!9FN|gw+#l2TkAOaFz_^Vd)tnz+1YB}-PIb`0KA>Jy)}E$;%?mC)j -LxDGWK<%g?$i<Z>!y^51#9-hyZ3$t(IJBumpLTIGCvgojy5f*MPN8Pn+J0aV{ufcIW@K_oeM^+(^RT{ -VO`uI&4}^T9oY^ilnS8+Zn&B*j`)NIVgosi)=|9^BOj3S+O*~{jCE>0gWapTh1}ha3(U@4HOCmpin5( -VX#ri=xU2D^Uc&vG{;j{`G#2PW?wT4eTDBXZIvg(8D$l<qGB2N*<^Url!Lb5)Px7=Asn4~EpP^HwnSr -ku)?_+UBIy%?`AO{#^pt7147xIW5<5y5V~<mDl!EYMwGB1)vfXgpD)>cg}F#Aab^2z(VnF)F3sYuduV -jHT~Hu!N{C)A5V5@~@@I)Qf<Cg`(i4)?#%)k)DYZzp2@ZHg5gVo?z}Wc!gE0w$)RhrQSSqfjX>~!1fq -d#8MU;fHqgQU}HH#WMW-Yq~yv=#XTheaf%H3?Ia)rBA4w`?2BD|>MAe>Qt{OREE`N8uSPbqeK>&eT*y -@P{A$Ixm0ZV`XK)%p2uakn_G2QPW!$h)ex!x}n(FS@Fg!vRAbtRL%v@uO5%09M860;OJWEYEYP>9w&U -VU9*e(|<qWNTUa5l|;L~$%8|h^_?g#Ay&TvT49{zdV{{P9T%EK0R4{XV!<Pm)7h;&+}nkpl}QP}!wx3 -?hm6DV%*%G1Ve&NF$wty_Hz?F}qnw(<HL_EjV+lQ{L_aug*6FyZ38iZ{e3<2(q7r1Q43oMMP%EiduQ> -?%E4viDky8-XYjLaLMW=N!XxzJ7xUHATDK?sL{Hl*rSgxe3Tvbu|kxEJj)6zUySxf0@DF0p6Yzv|nSp -fh!-2#0aayci>@9(3RW5wG7bCiJm;9Wjb4wxJr8&1_}#MhKj3$sp1^xA5M#G&KTC9+U*1DvGt#)Pp^n -Gpg<?owe2`hP@0{}D|yWL0ub`11Rr=nm5fbn-(b>z?9CKiZ1$pX%L%ayd|`(c)64T<UajsVSG5R+PF9 -KE;jYq8Q|}<f7=&?mbc+YymNbMI4~HX;Tli$xgwLA_nE%9pR@uT2^fn8ZF7yD=iV22^aH|xO%ThYDZ_ -=?cEyce^<gQFta_J0=s85VVp{O^*RTDkg__u4Q+Ms;QgB`t(BV3ICra%ovh!uTj1$Q{IovdLW{8i(Sp -iu624xHXU|6;?;k3(i_bp*-@az63ATJdhr1X}7YLqC4<wX%P*&?d1t7Hppi3gTj&dN6>G)mVr(Ej*hU -_yCd=vg=ItEZ<WxrHRIq7@07A5~sf~I{$|IPeEtDUZl*CskGrcIs5wBKZeDgMai>^#>wtQ7WXr2~$bX -Hdk~LK?O60j72`^}Hxi{kMZ685I4uznmsTdoz0QF!}E<){@QkgIcBHv5u9{k&x@*H?E4`pf>&k0P4$C -hR{Fd{u6Zf2}Fr9U0xE2qIjE6?DiTK<aF!sR)76%JU_(1mHj_xQzS|0KVBfWAkDj?dhDWrp)ywr@^K5 -&y^Lz7Em)mt_&b<fL(`5ywOIzb09rlkNftBAbuq|^YpK1!bXwW)`br}&P^)sb(P(+1VA-B}b%W_Yx<# -*GY|(EfGfBOd9(vSy1uS@d@#+gQR7GP-bG+9O(7@NJznbOi7uNLEor{ZQE)|ReS$$C2dZX^fZE!fM;E -G>nqiA6a)aekf;S)!oDmZeg3ITU=Dcs%9rYY>_=*!Q}{M-Q6V8N`<slto#(2>#Dx@bOCLO)6ynA8&^6 -r`hBON(2c@sW_XP@D;R?{dsKmWfyj{LYP_UyF{8W=BWUqoYyn8d};L6k`<{&xG(`0V`3`QR0Y4HV1)< -HlnV;p{ta2kxV8JI8eeh)5DE!PiTV(QaFd&8vJi7s%^h{wZAK@2Wv;O8a_VUd+a_Q(c^<>?$aqf-GA* -qJ*B75oU+$txrBN8MX>`UngM}EwF=Rs>|~5xS|tk)6@-3Yc-JBzbz6aj^|wH;k{2+QCHk@KB7K3qMx5 -ZW|KhiUEPa>Rb}9mR#kyfC*)qe`0UqsQB3dhNq|35%trkqyLi~4<cs^N}SmehgM&(wvLDQR6go;n_!C -F<CsB*;eI{zmUAJjh9eWl`RauP+kp{<ft&#k^fu)ZDoX0lzuH+<Ud-gqfjh|S!qAI68{{qbNv9C;X4# -V=3$?^0#KCgS$=2n1?JZ2a)=WQd|!dP2S?(`+(^@hp1Nbdu}rcZ<%U02z+=C30H4myi<b)9p1t5vzNe -(S!*uZf`MT?pB-}cJgZ<CXA%%3T?~WBo#=i%|Z)s*HF9(wMuCQ;CcBu7N%Gpv5%}%SFXlt54~1is4Yh -2RR%8S%>T&gWE95F;VgC)-3AZEL}zB;O1R0<(Is~)h9t-xd_-!8Xo+Z|cBuW1=X5Pm3)-H{vI`y_j=^ -WB)YQmGqR1;F3RbPFmn@R`xzh8R43i_++<_G>UYtLwK#VwBDS*+;1OcY#x*U%8Bs<GTBV{g`l3}Ne5X -}Bm!a_EnEwclJ+1W7^O5GkC_xAQUL){=3cU$<B;~M*K_}$5zDNpa^rPyOrm2EgF{aCOhU}4$0$t@mR; -?X5IK*OtlR0zI2#di(Y3=q5IZON>yQ(404&#SV=4dEtH-F8p}Z?|t964Z|g;1b>!N+_v%w1npcgg4$s -F{uQ=xRvCof;C2#H<lw&$o*A>5&g7?=17UBqyB9y3uP3%!h*QzPyvF=RH1=`g_{gery%+3U!EU6<pd< -=A_<RKNv+oK^<;tJSDn1g!AB=>XO}A}FiLmjbS^CIB_a?$oaM003Mz_El$JS~3a8{*&<PhcF?*{Vmp* -nrGY|Satp1bdvOw+=7!Qhsw>bAuK=BTIYjiP2X0x+=Y8)vz&@_d-2MYayi7kb0hJ+&$#cY7ia!b@ZD> -YhNH-br;K5cS(9MhR1x6AZyX=*HIbk!{Bwx`AR!u9-na}8C0ceU!DmF1uc@Ma8$VwbKgUs50plW0ZVn -8Fh3Wqp-Cb|fMk`*-ML%o1VJd$BrD_`!%sn~fF*NzI0Eyqsl9!FhCY4d|Sw@A5Gv_$Ws@C~OvR4jap) -FaaVlx~zC{t+Q+uCLU|K(*#k(oju8vQ(J*?O3^p9QV?Ho4pw?kO$zkeHJuN}Q(T2nOK=#4&-|`jw=eL -%d#1XlSUSfE4X)nX;^}_IKoyY2>%@3k;=#e&E4SKj#kp}%Zo;>htTQ9923MGqp!pBA!jJ@k^#zYBR~L -76)pg}a^0&F7mhW$?uBTOOAA)Pn^zGJG+%jF27U1En3JoR0J}q9QAF)RLJea@XDpku=!PE0Mb`D~G%B -&M;3~wEZ`3cvC!Eq{Z5cl4Ac%n?OfPk==XU)lUjG3bB6b9)O*g>&e6^d&M15&5&GKyWVW=~lv^LpaXT -@An;Yinq$8|t2ABTUUPo*rV<7jGb_5Y8U7VWJ<E0Z%kQYrX3O<Iz$OJKh<%t3sZ$u(^-qRv@EB<Vjb7 -R(rq^GhPL)=LiVHx~$L{`F@Snw#s`O##%eTYa2b_C)0GoH^M3wyT3xx!5|jsVJl7u7@9EnRB0iDQ(q% -GOegVDDyb<Ga-vw!-?E@t9jC>CqsPRfELle23<~7y4vam2^Ze`3`~KB5<FiW1@}~<kb%rL&B7C)Ly>G -1(2z)0OW+5usi>k<B`{j}{wRBn-UB+YW#$Lj)?H6s^CjG14(&-A=z|;3LXbf!vywca^Mjr$1Vd~Z%4> -p-{;vSlh-i^^>AW(JegnLPCjyf_kHG8)k<7nlb%MPN-2h4NYFm-=y18==`x!_hjNLfD0R}QAfA?SS)y -_rv_=RQ}!oGS#ui8Q?E-iG<Fzm;gaA&s0re^w@kC5!B*M5%-O=tAGZkH&B%>{iAsIC>vxp;fit{pObK -cMD@Er3g^IzfFV%B~!5xCW|$s(&T{$Svo}Nwn`rpri7^1xO0=m7p}NQTWUH1&NIr$V0~}YuNPXOMBxM -XkWbn_X>x)=8R5S^1-Z}<lU~wy@+jkV5XE`oa}Z{Km|`9prKU=GA4j2IMgDt1X(Gm~vX|%xpz$Don_Z -yHh<$!Jt#dRtI&wWj*R8r6P(Kzvr#wJAJJF`k9e9oG$Zcig*ykT{h~Ky~BMN7XClk<^YOq~6OY&8Pxu -775p0U-yRh@ozGOrH7sd+k=<!){rN9(}kMaN-jABXE#Y>Q4A&xqklx8^>ttShV=oVxb;on-?Dyy@R|< -U}{OkO!}OWBI2Tw<;|%8l{CS(iiVDa72G?>1|vd;Cn)%?A~CY^f5c7BNkukFJ!kabOP%_E%AHDxr>}) -Fe9SEOaDHE6KA&5Id(S2A$lJ=C16O`$>H)wa+YZnAo?aW=UMOV>#R4Yl<0BPk^8v8ngl)~z)fhyVxp{ -IrN~7>WXXJjD9A@~++4iYyyN?8OqMj|bk9m9w*SGaa;=PYZ6-Jy-*!Ch!&D_uwn9Nc3QsV~mvSFM9h@ -*=R(ift3_}it%X+o?dL4xH2_L&{4HD}YRcnfBiOSneO0`1Ewivn$brx^Q>`LM8yF!I>OPQA>zt917M` -XMg36`Xryefxd(NR$2THdcU5(6f#;a7NK-lu2q^H|CQ6wfP5iyTCPiz&L>U})DZzZs_mU<su*;F;Tsn -Gf_unfMXYc{3YNV&Yt4CI=LV_tNPZoVxDadwYT3e2oT8dgy-3LiH6fK7_Jtsf>PQZY%Syd@{O$=BSjz -R-^0V=v7^2NsLO4%zqqMzbhC*IC7P=t6rv4bt}5B7pfI*D_X!Boh6iZE-fOMTo@&hGS+vwF(e5^4S*w ->(ig&V2J|m5-x)~V{YwdMnl-huP~<f%5J%GFkLOcdYNnu!awxJ+sKIv$#2A%~;!O8IZf7zPgVY<MU4e -RbmvjPwVehoJj>~o;LMfI+?ve?qz(j+NwX6Q1Mk612FVHMNS1iK}YPbyX5Or44qM`Uwf(1_Y>f}ijQ~ -|82Q>oyG!)Yu6^EegSZ<-4g9_SOmxQm=W!z}=$)(Vl%G#f;-)y2qb-OT9QCs}1TtpK;6bHP@m7GK^<E -Y#;y%T;-kKXvrTzrX-c8d{~Xhb`}Ib{UL|AlBRZj;P~{E#BgESa{m+o6TlLO;)vrT_1W@P_6sQAE}e@ -RG`rso#Z=?z754gD;9dfBNwDGP)MK?w7V6ZK>2;FcfkD0FD(zCH`6ATu<_aoN51p+v+`(j9`EI9EC2{ -|CY`C{N}`05uxd;1|DULn`hZ8ITBN*&_^gx#Woi_XYS*>ZA}PEqN%U1RHpd7?k9^z)@myP$wXrKCXWL -{F7h|cA=6m6U??P?93Y!o^rTiU?M`vi8tQLVzA~A=pb2a(<XGi|75R=zzeISGa098%R@;MYl=@UO`>( -9|X-47}unjfx5^%fc`+ed!*00!k+FW1_e526RH_QUp95v6;r4owOr>&HpdsdI7u4s})uB)aky<jd*Gf -~1L~QeLnXGUn*=hB9WQTiIs{7d50U?SQ-lnr-i~$$RAN!g><#NSm*v94#of0CJnO)xq16!D88GL<$v- -KmogLQ2JU;oM3^g#pZ5?AYp;PBMj7AP>ji{V266LNc>QK)z)DBrnpsE9k}93rbU&qq!Q{(wYN}Mu34j -Hq-|w}V-?~>&7lO(8Nj=zmxdj}gW`NVMIVO}FjY%$?P$@z2`jzfUgxV)E-t!i0ia_Lg?0w%@T8wc@3* -4ndkhZgl*ZZIO+*Ns!2MCBAg=bJPnN!y&v2@->MU2(S$U>2)mEDAwx~Pf-BA&sM6gYNn1me98dM=pyT -S*F=CZ;9Cc26pPHi+c_tohD<8P(2{9Q)MHJSxAW0xv-o%iGEA7Azb8EBE{`$rT5f4)6IP<QjsCgE!d) -?WYpZjvl(fDn+5{KZl%KB2})ex(YlNv~Hom0m3ov=n=_NQzyHE@;moBvA>D$|u=5y{Z?=y;q-8?gbn{ -D9s07M9p1S+~t2tGOyIL&1bA}hWUjiWAB{928~v^W2^NAIvr4{-?U?oGYnx^>e*)$<n09ck3fGTf&Sx -UcfK+EC@Du=gvrM@6Mp_9wSTPCF4zbeu$+M?#!hFbMUs3(MgB>Y{A5(BHu90yYxJQu+kc<Vr<fLVwqO -OUEDrkgSt1hRXMtE4M#fgUHSrKZDpvMq5DtZS@n;hful^$>Y9aAy+B?5>V}gXt+|VCqbon`L3BFuK8t -jb+6cz?1$IH{W_WJ3Q=;iCZ7e73W{{Hmf;N@SVA6`Fw`XYLK@YB=i)laWq9Xy5ad;9+rkxP2?`1Q-bz -7T12i}Q4nbyb>J1@q1S{<Qb{X|(_R^*+=-eEl52!<RRQd#|IvJpJ3=4=-OtFZU1eUjb>MEdn=#s{`jP -{o0}cRi^ovp9+AJaWOJg@CViSfg+z9<AC>MD^O4B(qiBe#IKmD2yjF=1CM?YK>8N*14)?tSAj76pu(m -Jd{T3E5lY+&(=Up7Q1wVgFs>?77;T&gGlvO<&SPRqNufO^QfMEP5!qBudD`|9H3KLDIv_zWb*wp`;27 -`+w+c)BF9lh@v~g4|aT@ZmA%YBtX&|?z^U)!&=_1CE9uA|T0glu}Vp^+dNCO$QH#U-}y}1#prRE*cJb -JWYtHX@u+K)DpZ``U}hNnJN+}u#$%=D$In;XePx2BJJg(CjuJ?hlC4#pGVYWR(7;y0>{U#Nba&N>?#_ -#nYQ07_;UYdUR;$J~0LuIN=0HGELOd33qupxbo2c;}Aa^_vch>_69~@WxmjzdYLT$??-uml}_3hrX$z -#ZONIr0^>Ggm_e<!#4pkFv{||>bRhcLPJcu$jrOQop_Nu^E#sERNbM?CUwA)PlIylvuV5eFianU93YT -a(<jhoi9inn1ky;ANTjOY>^K`Xa6*3iJ6SmSR!ZeSZHNzw0JI|&w|IIrA;+8s0-_+W{Wj;bpd`I<-iN -MYZ{Tbc_T}--cQmK>GWQ^0<rqX3dp82*nU({rO@>tkrZhabw~-G|5dLwH5cG~L-x2q9YBr#8z>H_I^o -_dsk8C<-GfKac7P#K0Z%jUIp&112LahQ=qFJnoCQuhGEpBRkC(x~O`O-3Qt;%M@$$<{PCLe+r-j8<NC -Z%;d6anNTUBrx;EJG*Gmn1#WJ*;{0Hp?bI>X^jd+U1ygvV^DS8BU%mlV*+Py2fTbIE&Vo(djg$1n16O -F+JDAsN1~31)HI3_}*B(Uh#4*+ytYokIEtYv7jCSKXznvb;+<=XW5LH74oUD;s)7*q6`i}_3fN0(Bj; -qAuJhF0T4!VAv}0r0Zu8lm@o|;S4NLsz^=@jh{6$8feZF;n6tw<oIH~1v%RVsN>N&=KZA{@_M?I>Q!t -xFugqJENIS-9T%5B`+V9iJWj@l$Q8c3|aG#5M=;jKi+RNx1FTTB0AxeQ1TE^?>M{vXK26qd^XwCQ@OF -f4$r41Qt*yi0)7*Ni6orlxtcpYMzP23v=)25#O3Xt^Y%K>|v=d+j(V_PlZAylv9j!ZTvO%WxKKem$U% -l{~;+{hK&=F`zRP3Rj(uTVNGUFG^S1+cJ!cG<N`Itn?x`KSmMi<G`pT=#yJKngNsk26f{f3jS8Oj7g; -O7oQgswfi-*bm#pK=2>$6cYC8Q%26!R|fhh<OGt&DxSYysE&Jl(v_+l1S{P^sAA9y#8&gqSX8IN0mRm -V$+TCf<;yk9lX7X#WrWJhX90QE`oP1$%t-XXTH<-*HcxqrN79dl@yYHVt62rrYP7vcD}L`<XK74~@DN -vop^#oKzLVi<gtFED#33kLF3LA)OT$pCMxQdBZYL(ijZt15-5aACb{<|a3PWfIa{?;dtOFMLAdn!cHy -3CWE;!ZvVxd*8V86?L;7mIr#=2i!`6Ns4y^j^1Zc4BfBq>d?+xNY`DY7?p#9l6>uM#{ZEN*><04g@q? -g|9?)X*wRBdaI@`k4xv`1mqJ4o`YM7?0nk=ULjfS*ldz6TbXq(ZJe!v?7qLZ3`;3(Ks{dLrqEz6^)l9 -YaRDd1SIFw8hV$`IZz5gdzVe~(_C99l8Y#3=E(Xbbd0BgDybq(5**#Ck8+d_F4D_F(GaReqxoRKazB| -aF0eJkYfKBu*mYo-#`Gi`m}oEgj7=v+_{ylhW$)5pO{86n3aBrHmCv~;z~FX7!F4&X0Lzxe6RUP*=L= -x2y>2#QDi6P{qq~8NDQm}*m!lo3L-8J7*)Sh*J*v~eR0!qfi-l$|@Ung`y%z-hU<({%r?VPVWdp)$XC -DG5ZVbsrkf7QtLwbh5@sS0;su^K<|FcvN-L<TgjOrHTVarmN`@vL%gnTic?Tv266JUPpOuHhB9fk#5! -Xdb=-<><irkz-<6?_5{)Fl>ur#=en(fA$Br<8L#i*$Z&mzQ#wCFU;mf7O@Ux_sn(W;_?q<rTBIh0iaP -gLoXhczH<dG7Jdk`lvpOF47S>^h~DXNqR;hdD*<MSY=_ktHT7;c}77_<|72IH9ARDTlY8A+dinm*?C0 -E>jfN*UE{#pjot3Aa61G3K&s7ueQ@I$DIsPR9j1z4@+00E!K9}<f(49gfqIVjHbl0Z#LNM2)1g*#cSp -J6Ou%f!*KFKg#qpR5IZ;wQEvW*sg8mIl`f1k2v#y5lFaAQ=Bj}42OzFhR3bR|<mT2SeY8{fVi*bu0$L -QuJ|5p@F3ufxj8Nu|*>!#?GB)F(kGEwhJBDvtqzFL-Z)}kTi*#K_sxXZ+7_sC8!Dpkh?+naGz6PyU}0 -;6|igYN_|TuiXb;5Av}=7@W2#R`l#P$n{jH!dHo5G$RwfQvl08U|=7#xbD0<ev5+l*_GMR%0yc_>Bl4 -0J=zqVS<cc^V0eAa<PvweyT5b4Pf6j06#oRu!XHKPz-3Xn*`sH+ISx3$D(i^L{hG@zGJKS2jke?o)W7 -W_cMz*M`gJ;d4P4a1#@n2S#Ze|d4hqEQI5l)K;k~uIiU*4ld91lKpi$POj4{+ZL&1fEXP~GrOmRTY+{ -xVH6Lo~#oUxB1(5ArH(Y>t$CO6U>M%#ke-P&M`WN(y>5OQulvRoZT`;;B&j)=pdIb<u3=}prK5A1-5C -PA&->?s>WX3<vxpUD;)3P5-WoS&I^*Pc%IywhS8|iuJ@f4xkQzx=!cD2KRRm%9XPC2ImXIhu|9Om8#v -Er_>@0xcmWqdquJQ9U@9vK^Fj^L`%BrE85<GfD@;OyZx$^o))G9XgFmj>XblwEUO{es8%(2+fKytleY -LEIiK8XZ^AhSoDhETYl9C~hZ>Mfe&n^v9H|tHtV8tF@YBZSCC_vtVsTB3Td2zh9yH=Vr!E8~;|^I4bg -Cj_GA!y&rrqYw3EW^Zeo?jj&@3oMud2{%0lCm9yABF%RxS&AmWfoy2TQRZWz1`74Voe~JTir)r@eue{ -K^FXn>*=lC9<{F3!%&WZVCJRT_D!*YTNdl%gW;d_MZks^oaY9*S5!5|y$YHQFJ<JphOByLCI*3goncC -A^iq%^E4d~YEc(dS@7+GsB}&PDK$Ecldf9CzQc6kSd>XR=&TgoO%`Z7urg4cRKCnBJnF!GUc=XVK_Uv -!9>kv*_1+0;h$+ys(WtRImOyPY0+QwZ<$^IOOJ!+$HVJb{>(CpogK}bR7S6p@$723;@7tSEn^t^&rbA -tp4%*6?MTW(%yXV@R9Sxg8;SGA5tKGuU>nj-Q3vNXfLXqkLU^#fjDoz{pRbh9yOgufP2N&!;)UOJ)lq -q4<FSX=`YZS0RC82KXmJdx)JC?^t1W-Z14HO7CK>;5>%ovM48m0M~wv22>>5zljGdhR}E*4Rc}Ii=MA -mwa`-fDX7BAu6()2GbZ)|IplsDdFBM|{M=Nnh<GIRC_c?aBvQp-D%#?1p+v(lMA&z1`fe{QUX)N+0xc -@@k!j5O98^GbXtkJLlI>9E7H6bOS8>nXtazT9VEC*r%l)|=4oyVU|q*zU!c=I-&9FAAmo@rkv5gb)(6 -WX8g?hM_^VYgF35{MnmLDnA79;wac-7QjXkJY>QES;WZGuJd=`c_}4i4?(fn&&;5P}8RNO<0Y+!5lVN -=VU=^4~`Z<Zd~ph>ZsfpX0*iPr!pdzCk#4Ja7)}_G#V*GU^iwZG^BWGxY<<x26SiGXc;_7w;4PD&Dnx -kIT1u>Y{*mq5|@)4dCDb-1Y=HR%{ku?8G&tYJR}c?hLVNyv-6qGsui6QA2Jb2$6;D%G*Q7_aZXd{**Z -EL6{W|SMX9oz;9(NzsUb2M3@lxX*>^ZboZsLiI~^-Ud~m2#-~s^{i}K{wj4@TQpDM&MIR1^NxF`7{&& -&A??|Vpr^Smg~rQ<c1ZAR_r|AFwf3H$pUpRcS%SJ9gcZ?`e|Nc1EtdefX^pDg}dMbQ(yY<@Y(+&Csp{ -H!<4M|@rSk!4*>K|aBdSAZtYC;0k&L`Q7YxXhyBvY2JVs5ecE^AM)`^Oe{AZy!<|tpe6|-a|@EvcUi; -NMX(~Bhtb648}aJ55{L#qk1C%wEfTn`t`T)_Q!mLDOs@K8%C}`Yle$+U{4^nk~hF?jCMSuOEsv40Q&H -2Uq-YHcu`1)H&0)|3#)y*5_(fs2CCVH!7Ou_TUxb%Q{Zw&2b%dr@J3QP0#pITZ~}KpgG4n}%ZUP@$)v -eO-p7-JQ-Q4<aLT*E&aeTQsEXsaArs*}4)=z9qBELcYzNK1)rEWB%391X`(ieqj72s8#-K|)c}MRq(9 -1-1ZHF;^;{_8H)qHg&wf$o{iJ=T*D9$P{x!z_ottqu}GSGb@>%s_9ybK(>pzIK#Gox)ft`*t48`eNdE -U#h^>%+<h2`wAdLIzk!_}N=Br4~JNL$C3a_HS(Pgo9OE{rPZGX>nDD#ZCbV)N04?mCGGpepQ!#_6GSa -vEG|B8Mdm~hA3%<1>-Zc#S5VOmf=AH-)|ohx{8m$_u5iMQp1Q453BGNJVhhE6k@mo-##qiuh10ufBh} -uPb`b{<Et_(idFD+RVM@wGo4r!a=0^Jf9rRKa9(<NRQ>^K7w2=0S?VYoBuZ+aALWyz;t+|FrNvP)n8n -oIM#F07A2-o?>LQMxP{2h)b%#z**bx78%cS}U>(+M-M7Zw@EJO&DlB-s+6XBvuBMlme{KdswX7E;f6b -o6%eLjy(6_8^(D_^27&GPO0$~Z4pv`}FZbfqPiuEVb!BQJ9bQzQ%<+Bgl^N!isVC%OUq%2=b=a2IwiF -K)zcc0l?P4cQJuz1rR}Gz}^Yg2Y(pl(NRzBS;cwij-}&tF#ND)?&wJzidaRKb*57^d{J^&=@S~m$qD; -p!tuIyTtjWRHM@11wWN>3+SaDw<=W2L<z#G%&$}3beW9Kk09E@c*Vy{u5rcd%X+O~{C;1x6;<lC@Uw< -7DODt5Jx)kMbTK1@%1Ruj@%m2WYLBZT)N9EW&zs6Xl`L4xnkSJxB@A#anx=S*dg?1Cq|GzgLXYP&d%N -MZj4Q=e6MdXLsgU(g=J}wHM-HX^;b;V=0MAG!o8@PS6EjHNR!8&hE%@))DalGaUoEI%1jJh#>BsJ`0s -ShFNcpZVj6skrn|cDrb<9aW3)?i=V%FhidXY~1D`>@3N!T8t<}}s!>8ZmeS?QrwWP_9pC#X7UcTOo?u -<}$h8XmxFj^^#ChC0hmU_RjVKh57GQ=^7hee_op_Po3^!1>;e#uuYRxvfB-fa|dOg@Z3Dysu$aOmno5 -leX&H+a+W57jS6Xie~9sysZL8Ng^hLWg%0-M6L@@P(3&pkKdx*TQBQpxQNm2OF>p1`ES_RpHx{19dFM -`SBCncsjLbI;1S_wj>F<)b9&LIopgH}s$NAW@E^}=I^x1{cTTD@7={ej0fnqg<<TgX5E>2$O7whkNiM -+H*%MN+^&(u&Y{LWRGbEvm5Zj8P=R|wx0BPX*lpPOd_T_j^U}3xlc`u(~FkZCqA=;~uAu!>yDMef#m4 -+<b>)3Rg*TDXG1mvHo!I^V>5+vV_9b01p#Y7@YrP(>)JeiK6KSMS4Z?Y^p_#oG~GOW2~iwvCWq)elkF -Qzh4W(tSEEH&N`jGXDr@~8}S4yZUiC@7_CD4h=3zlRcy42tvo)Nkgu3Dip^!yysqmHVb5CPMHiV+G-G -+=K8D$*C0ze86}t%7OV&`7amdzP#ZrVIYcutrWCjmLAFanVf`Xf{6K1Hin>MD=a@da0bS$L=3pGi?<4 -krl*c7*AHJJ>9_tlSpl*$b49=P)m^`D;>fI>zEz9?r>JLFzmm)I$M$Y@*XPdh=L?}7dQtW@#v8z`$h9 -h3gNZXgIf3EEoeNnv$OsrcllU|2xfiGNK{U*U<0;1^1QyGIXfn@tt2;%d_Ket>@%Yd<ctuS%`kkn&`1 -Ol1lS)L*^Uooxj}Op+nJYHnt1e{0iYV}+dJS8!=Ef9kYH%4?I<iwGg4}3?@b=cAAR;3KvX$Q~fJ$J0^ -x}*JLZeW22QB>iA--n7=XP9vDH;?B&P&6r@o-GlDi(z{GUKVs0O{&k2{hr505^yr_0)*TCWe%el+<0X -GETUyh*2*3L7SPVu_nU9E;5)=A@#Ud+UUz|!6Sxwj)EX`wg-!SgnpSOCmRciWCVd0>zL~KY@qWvGZh| -RYRj9%UhFf;&<-3U!lRL$NCZF2&*tNK5e58zzf)p0Ok!pFhCazB1NN(D@83%VzW<?~_J08`K2pT3Uu$ -^A&31u5E%3F0bD0;&d}9i;sW?_~49Ru&8cJ}3*6#HOsGDz5+-XW{Bls)J(MSWlN*HC(f5*a@!v{$9MR -lvuvS$5mepJ$;Rr=d1^;0Wn_!vm%Bf9CwTdpZu)R8b#+_;xkp=Isd{<;-!v^O6BKUme24SgH9g`HXr^ -+#$3g<~!&vQ;cgxq0dsNY+cdN!O8N3xiQ0*{CAmwq9^bg=yA=m4_!q@_*-Z9XAh89L@^NUgI6uf0lT0 ->zWu2T76w2be3;PED_<g{o#o{ixSi?4>aW<>vq#UMJZ5H5?`>5shcG|u*&$nDn?UKJVonV6_X)&(?Q& -F-~}fFNWh3Gkgk61@45YKpo_`CzPjdm$-=ItqDWeZ-L&ALzzrex#tK6mC(&@+PX{}E*u$@{OTjob@r4 -;4Nqh>CDqllItByhVc)>7O!2pZuEsLF*R^PA`6lqMRwkp;V;TSYgzk#wVYtpcS*wSe0KlotX5w5SPul -UgVYFx|ZTDha-eO^{UPdi|+Vbc-37e|dMRldS<R>qu<dghg|(}szX4`G4!X_OH_iFIRDH#p1bC`yx)q -`k3$`Pel7J|!=#6#tyi_OY=ccMlH(9-oDHd=erZACr%b;zEcn<Jx8U$+Hap$aT)Ez`i}!)B6bqroZv* -PL1!8o6^rrao#^jvY=-e{~iZudZ|+Lps|j&Ekv103u4pk6gFp&kYz9uc5&z6C3#7C3=P0$6v6su*gx5 -|HA_$C=;x$N<%-@kop9U~rGsY3z42f^9BJ8(blik>jur|8w_<tyTRXE3$nx@p97>?#d<s=g=F>qssRe -QVjbc8nDcd2Drw5hV12hjMy|gdJt>`Ptc1Xbnh3BmWMsQU0KQ&irG1(G4h*YkD&N=v6iQMzqxXHH>5u -UE)8C+da1!36^gxp6<;wyq$)Gy3<1UvvS=)+RT27RI>F4hPZ<}}CT*JxohpH2Ag0AB^0(LS}ujZ!-fH -fcc}Yg8J1`L4MtrHbd6t5eh97dub!mzt`?vuU!*z2l=@e?=SgBG5`8zl*IU-ucT-ymB-A*yrBzGjF_t -9~8b@K24~5TRs7GAGS;%bW$69q{zcQp?IS*WP1Z*ffVh|y<)kh%aooDWvyn@$)#3K&@5X`Ls8y4anAf -MTPJQJc>=F+-^oA_!i%WPO1EV<7fLuVeoM&*Hp=QdQZ$Tw)ivxfEQNPAN@`zmse|Q`eB`$(K(IoQ0X4 -LFY!!+-I|1Vm)3pwQL|>P#9Ol2~v-6jyr@*f<2666dEFI{Zp+qr=Tl+YXFazCL9Sa4ogh@zuirnj+^2 ->sH>aY{7IcFFT64irk&D8aWND$SOX?(F0wUKkiqUYwV+j%0Ad1p^Di^8U?L>b#&pi4{KlWx`kkObRUb -Xu!8mr04V8Z~{U(uGYxK_h9bD8bTl#&flnEH!hYi(sWqEjjL%<-TG(pOPM;mV%_4M7^YMWul8pY4D=o -Mf5Rs(*;U`A_xL!NWAF#o4Bsx?DpJz!%dQVIzx+heg2sWe-?Gv?9ZoKXH3yN;LR_n17(R?Y6a8FC<Sn -ADbi$L0j*4eLjWdC!74+#mr=Guig+w4_&weX^w>&?2}y~SecufC-IR0Xht#A_J2BsS=38H=1?9=ECtt -?6-O+*M;Dd9Xybh@JKIudz{QkAJuJVR~6+R|_(ctnWG8M<CUgP!GX-YdiPIu`)Q6v=Ga8%5vD*X#3r^ -NUZs2RiI8}$}#(%i#gHaj2p_o0S=IgC(9UkFSCh%oG?=u8xg3gz;2n`<wTxjlTL+bfbmGOM^TW&l37F -gaT!PBFtND<=&Sr7LBl5#szU=5ff>4WZXmep2iMRLW-ll~}0Lcd#_x{$%n5bm|T1ldLyp8yFnaes(fH -J2N*xdU#tbbn_h0M_k8&hHfyh`Gl`C`UWhWOZa59|Dm?KiwA&=7{>DtJbq1-;I7$Q`}qeIzqHHiv5QZ -y6DUi~bz$n0$rn9Rday3*x2_wt*7X7udt+p_Gdy~*<4zdE?d{sN6W*BFx$<7*eJ>(wpG%Pv+=Og(nxp -}(j(<>Q=;qab`vWI5r#J^NNmaK$N5d(Q8@oL+Lt#3ERh4x<_yU_lbE+8Ukbb19Nw$B{$7ya)i5F!(Kp -2NIt1Y~^$%D83Uy7(0^zlFV(+8#me||ZwRq@{4T{C4WI!;pu&KQ-jfeUXWQQT2Q=s+^)tAF@kD69U3; -&2xGa4pWZ+uPdaEsQ|~<d^{l{nKCG4ho@r>F7tUcJI_<WT$q0{~F($q<hmdIgYrbp0RrJ)ZClf#gF`l -qVi+4PV>Q*6V)CCNCk2CfoCRS;i}3T$Ke}#zCP3CZPS+p90vN?blSquRIpdo#Aw|$BXbu?eixX--D%@ -!M8V-Ttc0v&21(H%Ho7Q6BVWs(8Uk6#&Wm@C8U=Xf-G-ELwZnQBhA^|2Zg-0kn((&ag(;-vy@(bre3~ -Kw0>JY?0DQC~C{f{8J0_*6pop-i)mLQkW~)xLMTUa^>zzAmch;h_!T2N{MCaK6HueG@;T&|8-6k*wJl -v@zwM1o`%G`T?J-7ctpoFV-YT@xU#rV|mk8Ub{tOQJbzfK|{NLS%|cLHRR*3nVNN~oxCr37?z5Bn|~x -iPI1EKg9iPdKZU<wZQ&>`wE3A9fPh1CV%p53jq9dwTc|9^pPewMDOSa|Gtew!u`-Gab<PI3+iEWq&~L -39gm^O`vkoY3)G%9pCI-<VCi;9fE2vkWl8PLg6N~EV*D$bEl5n+`It#X_}mzBt3K)Ro5aZi_I)I_k=( -lfO($1r>iABE$f&XS&og@+TPyQ<HuY3`&&<*Y(0Hy+jO6MT)ID?`#`PzApPiiE$V33Flri~=m)9<2eD -G@S0PmryS0@9tDBq?4EG71u_h{_y%$l586)Nu?r~N@4T3W#A_cgy2=pB`yP9Ks@xAFZz0~U;))JZwIT -pwZ*1Q4{TJgL_4so?H-%+&+IxCYIjXwQhTp@Yws2tM?d-Dg#O(ibK{(`uJ3Nxw8&$7V)8lzbMB)6%Wn -gy}Er|~M?u<B^{2s%ZY=njRhU}gJ61bxBet{-g5@(M*<<`p{XKY1+_=M<=q!eUJ>^j>@}H=`|}=B -aAZ2odY`I=>I`x9I<0R;=}FY<N7-rJ-e9J@Nc(;$CuKEHHVa8`B;M%=Jsivos+?c|!plU!skb-k@TQL -f7AsVshnw0ZfbDDSSeS|oXn#z4F>^Ux-)PrM!s{R%p7hfQ_G1)MXQ*e2Hif)bNgTTj+}1pzwKtYfO)e -hlg>vO}Z4S*+e1=+Y*#ZCTik_o0sX??r(I;X=J0#!r?2Y<y2j|c6y-}lqM;UdWgr@H0bfYR35Gsth=j -Cub`h~pnucWvpcq7EcEF|?!+KuQ(nq$?dj|Uh*z<Hnc9a04e$nJViNON^Kz2q%Jibt`*WnIwHvdel5a -&;rBo1jBF-cTL5QC+do?&$#8*(g3xL&XxTA}J{iaVj5FIa}mO;4T1QXv=;BKNsT`RCDTdw7JtsvQ<Sy -iQm1NX7BRxyl^sBF5~l~5-Z9JTD#M%haNrJ+3R#VW@8VET*F*bbJ-j({wJz+0WZ-2i4md)RbdF1Ms+k -5NN07WV=Y&2kyo0&T9V#EbU7ciP$@Ey<?vV@qzF~Cg{h31uM87SnQN369KrCWlxyo!)GoBQ+O=zzHc{ -6^Pd01Ufa>F{m$G+KUYI~csX7s>z9}D?MA%nan@Y`Tbt_0#{=QMWHexA(S4PwQtiaH)2`OUtKR8{c-H -2;F8S6wbSdQdEkfPsCaof?`5n1!~T@4?MPX$MtT#{b>aQvEvFq@Y68HSb&UxCpDSm1sMTLV@%^RH2={ -9e`4iDrH%cm0`R2^9YHBAcmD2XP>ExoRDGtDY>g8OM*Au_hd$EMBApfgFw$v9cgHD-mxIFPjL4h100S -u{?e-3Gf4)3jbjSE;)X4PH=K*ri3x2C4f#2sHJ@1J41FU{-Q`_-9f1X3CD6nO)4r*Q{ofFn5rYR8i}g -<6>|lAZg|aYa*b>=(kXncIKT@Ao^RfWvk;*Ub)>_Ei<?#gEERIkhGRjIalH~uMN|EL6{Z2~%&GFlj>I -g$-YT;7ZkWpfvEU`c2=*YvGNRv`>2$NAmrk<Ra87vtIvt%U=Sr;zUHcaxM<tkW6#c8%ihgcdaf$*XOl -wE*tR`+p@XDqI?F`UHyq9!Oia}bOuPYB>_jT=PR7<A#H~e-+Z)Y{956a(4iG3g(zdVgmSwn;_vH>hK9 -VTL4a1R|T{4z`Z=REJdH7pZ#K^YyRg==-BcAA3M>M(tq;SrP5E%bS*4#q&oV%Aiaj__5QDNgAmhG+HB -=>Sb(pg(7@>=0i!b^|a+7;^&22K+kx8yXMO?0SYRT(c+i3A95_b8vc3>E@4W20~mSjo_bD2Zw-0*`Yw -H40SJw)A!)0p7nHm0aZ<x(O@;v!vQbhjE<gu<oBa%;t^ig(opnJxll-hhd@#~ZDWwxVg75%rwU@pXW5 -9%c>r6gFBUUjt2!z=zskO(r>YReIcXI2TvA#@CzCtsny_1R2M>j*>1$>j1@Fy@Z#1fP0>cSL)*=sVn# -8qj__~YXbar=uM+sK*E;R?ffc^JLRrEk*0*<w>R6(ctbeb3Akv9FL((3}Rb$Vo#+H}d})pMi7)gA+!_ -GT3A?d@znh#qh6?Crt#-S%eXg;S?fe~c&f9kR{dWXrt0J@aVu0Y9Qb+w=(Dic-6}qI=NC5mF;4B;6vz -Q08do8mU8anw)G!X^X7tVv=`H%nvDZ6y#&!Rx>4A6t1MejW;&1Wc`Wo9@Gx3`wBh9SwbiDDs&0W70{D -tEkj46!HoEFcrqS{@Wk#}nYe8*yqK+sWm?4q*1Q%h1_2;~#T2dQhyh3`L3ji5JelchPnS|4zu>(?(ZV -lr?YW9`o=(r^WSx$IL2!+cZ6dpPX(l+0a@A}t5i6WOZ!Sl(^!;BMI@&vfR5i%nWrLl~hNcVIF)*4X74 -eHPCmmE=AcuZzDD^4Eb;_e{I%uitjixwj_2v{@f!}m;d(c9r|4YIiMUFwEDZAd@IxZVE#(F-*Dy#&w( -C`CF;0G<`EUaJF+htq1a)c)u-I!-$43M?U)JHa;Ubi?VNt`F11C~oAH-beN$?_>M=fF*J9L-*ao4nqV -Y%LIr*mi*@Z>_moOQPD9a+iuaj##B6s>>lCP2meglH!gXM>3vhz!6<ei=7?(rM<HB(*R-BtfS`RsMfh -#9OLz;u307Yg;A6j7IoM_>R$6Jocuj}G@+(hi!u4+rWYq)_qc++vNn4+iyWsEfRoq*#jnCQRxSvz1^g -^z4LqsVfE^boz@Z^X!iIWyK(nx=Tx*}kCH`DVsKsRB3uX{DQA9?&V|67^DG6t3f$51T)DWC)r&1`k?m -wQxw6eiOzRCf3*g4xA6!1M-HX~HNCyAm%5}+xn)A*Fz(4bJtMO*Rf>!jpEml!8H(xZb2EEG!Wq5^XOL -vKimZt)cpwyrO`dUR{UA=;JTi!EcAcf58*YrFXfLpPC-Nq|B4MA;tyH3oO~dMPQzYNC+h7^Dg#OaZsR -=Fw1JVe`)98VKRUjvUHd%?4p+$`D<Qaa_5Yy}f4J{mL7uKeHFn?RW%HE$!Mx|GKZVjrlEh!HJ4uvv-k -W1ReD#gf|AS!qXBR=&Tj4aVk>l+2WrFgg@G&DC`Fmu1jy}s!g4kY$`(KjRaJAi#8?WFo0zaME}+vKC3 -$X_+C6W@Bwm@z^VO(NbcAw5D$%LXMl;Vwg&v4Qmst$GmJ)a2=Jecrz-iI_5^1wRMkczJg7C81jEoHf6 -9N=DJ)o@TuQZN+&^by)d5&v%GyAgs4Lebj(Yf)!ygYg+HW*V&usX*X?j5qs4b3lK#C0m7Cj200z(OK% -6QTalKM1k%oLr#Ca>ce>V6rUAGHag3WvG9w4*Xw9ChwcaU1k@VSuUrsqI3~68iVKmjZ16gC2`(d(t73 -fI@k{YBfy4%4KU^YfS^vNU51UPq1r=AxHAIE?~+p;R2Of8gm_U1UE$7q!nOkR#n+)V*)~xVmcm{qPGA -o-i%Q$4(QZ%hsoya;Da}9ZBGhE4^P9aE=lw(vmHz@Vj_o^L1myMHHV!fx*|eY?jq$gCPK$)0|<_lwW5 -TotSYKKQl@AfTGQ8ts6mXjPj(}a=K9fgzKi79zMt<#+xOw=2=|8p(@eyVB9Cbb4HDN*YDq2kgL`2#cR -2p_2IGPhN2trh6?B-M6){wG1$z`x@Py^@0tSLRJSSUVXt+PBZ!QpG{s_v|7eR*`Xr5594b&?;?|6WSm -!7r9VBGtW<T~hqy6mg4l_)66>uk#=1J6c%S>1e>*CMivAD6^>L&ys&Q#`J9HBGz3x@yK!Y~6t?3&Qi7 -(L3lFX$b~IzyMT-EZf<hVZVybtmU=1C7%H3<A7oX_W=Pmd>hl*LJzYJHZd7b;=0#Py|Gn#0nODLYBM( -U@yA9q-0(`~PWE^|;G*32Oda0T=A$#~(Y+N_Y+v(He{3zl>V-+vNR^fHd~eiu?+9T(8JW=m2@XX%G~n -ZWM588I{rER<grpa2jD^`Ms~)oG;ogvoM%G{D)|fmnGK%`3%wCx%^L7UuipGk$Jtg`hUB7Yx2}aZ^n- --@1e&NQPa=EIxiU7DHo*cX;IEFFX6b90Fon$a;3a4^Lm&MDgLOD~>xQ(7?Dmt$he2p3NV-7cr0!S|JW -r)+7y=4Ex_Tk>+-D{f|M{gSGrP&aWC%F5o2`@w~qa)^FdIH<+>V7Nw4RU(EiOxsPL|_LJsg@u7QuI&T -n-2zWi~cXa@VB?W{L<ds-1K(`X4M3@Qaay2Q5!*m^!Z3g)Sb>Z_=X#ScWw7&o8Lmi@NV<Lafw%xhtLX -~n)tMHC#XVgFbL?cnO=sg#x)v!`mM?-PF@adr2r7OMP1GshwB^V6cW0p%n%E9%^Mdwqo<7HPfK0(-02 -Zp)6r{S<>-&`hL%A@DtPrv7Bxjw@ux8HBU2oH`Gud-Cc#Vejap)F>@Qhd6f#v9zOLfIH$|ZM9i>j}zh -bWznxv7s?@jP#xO3dR*ZQyZpTCbA|B7ll?dxW=cxaKmb=tt;H2lA?E)|+!MIt~x+W5Zn{%^;fjpny$^ -K`HI?0CJl80vhK_s*xWwuo#E*sp$CKiYU-ZzS!n&?if`__8-Ew+M}WebZ(-?XBbF8v@OOumbCl?ke(o -YM*FKu9&>E81b%xlIW7=hjh3*(2wJ~rf?fWi5tu>YIyo+{q*Ab{>vv%0TX0cr2aKAY9w+(X;W*`auIK -#_B4A8?Cx!*jYqW!R;^QWlK$3yW>USj{^N0Nl$`;aqJrGAP^Ux!u`AiAHl24MVg9e0$vH{Rw^OWYOc< -t>+D)a=R0lDt#cLULv%pJ{($>v{52TOB)9Lu4P?uw<`Q>xU6sbIk>Yd}d15l|nY43C-e8RDY6Zg1=VO -E;EQEh`#{eJcJH{aIECDZ1wwq$zJ1HfnJ`7dt=!_j#1&uKB6zq@#U`D?i5e|53$;+p@}Rk=3(<PmiG! -Qk~HlIh7@4Ek9Zb0sTEs2X{pk7g-`o+q$2ZyX+^P!Faf%m-tB8U<<Lw2NS|ZQ5N=G9ySB7^WHXW~3}w -`T_+Kc2Z-ug~xefS5d6<9_)WOYF?v~0KObwHv-Vkv-i~y_dnE+-q)|A7^=VDY{SX>;ylMKn(a60U(|) -b&=7f1u)@aswY6)L0~9sP<Uq=19)K!ZX(>CfS$>ia^4X;Z;b1uKQI_vTIBqB$Hy$p-(NdZxHmO`LwZ% -$$GJZ$V4q1mnPP}Q<Cz4_y)#k5tfS=8JEkVjl<)~vaR~SfKDa*(6%Q~t55yD>cAFy1y|K&o`%e$**n? -3SOwxWr?(GwTW6E9{5B|XxPxr%Z38p5`T))BE?l(-ZA20PPwTWKzxi#wC4USGB;yzn+hnWy46gzPd=H -#9<{g{)26hgDr~nZ|?-DaI4no9&MW@hE%_U>9)Ze6DU>9N%+R>rAtM&hx48WuqLB%2S5@QB|-t=TJZ@ -E2mkCxt>k)(@R7ORypNT8DS`%!nHpJcrm@gLJc&~^RDv3?)nB|&2b{)#H%JG+}%E2f{q-4(V)fjQzmC -9j$^7r%$%^4gy_#m%BK<mRVGdoXHVHZnai)IL`zhe5oi_KgABzeZk;mlJoo^|-%)}006aOi-4lfOcK1 -4NTvzIr{5X+Sr%M<b<*0+<LXGPPfk>^X(u@0h(TlyZFeC{HV{+aarSj@VStN~8FCwM+V#NUp`{+6rKG -=K+=Z1$7HV*$9&q8>P2MYKDt<g94Xrc4&I0uN18s}p@1JKv}e=$#}Yjf&N04L@EhyH|$xJod`D04KtO -DtGEQ0GfGwQA)cts(m~Dq|lYJ7d|*#opOf1ChB-UHa8uj4$*a{a4a(Q)-;~G<uR3c(8?8RX0>!vAE-v -h7y#dB;}<=L3<%}7WN<*3W1?FZokhfl&%FQmy-6IZ8e`v0$B`Hnnd?f8)aaDBd0UFPEe!Hfu2)}m^xE -=olv)A+_A|BUv6w<Db;$;+jQFR>*Fc4iD=M7Vx4(nFSJkD3f$&v;%gbxE?Qt(VEVqH;2=XrE3b0)rUh -HVgRIo`5*%x9;>wJ>P(F$9JZ1zF&KS(vF%#xU%^jVGUHD>h97i-y12FDdi<JGM@?1?RBB{wFgzjM<7V -=n`2TAqK4c_5&afLpXptYv+(P381irCKxzOfOt+tKD`l%~<MXVFF)ZS<pd>Xd;xfvax1E(}CCU6}NkD -hUK_9}T!hHL}CY=q=Ez4~v{H`Oe2O^@hQ<TF<o*xmi9NWI^Nt(NoO*do{WvyX-HVW#2c;9@b(%!w?Qr -@^&fa!yy!-m^I{WOoHs?c=|RxASE^0vf)H6Tl?!I!fmbnHT>9o^a#G;(+BY5E5Ub{5W7?V@$Yy~{6Ei -M{P5)EkNEZ3%hzN{i+}#|^7Wgi(z*Dv5Tiqk_<2DGJjGgHo<=Vn)*AhYV1LkH-!Rz6m#k!d17M-b-vO -*2Jb?1VmM$l>S1s}|oIfMYhxwKa9*_j9y6y<`ScL+9z^pvWW|S|7IeA?N0s-1NL+yV`)l{gLdc(vLSt -jL6ED8lmO{dg}PNK`*kz3Lvy>n+iL6b(~Dq|Lrb;?%JCL6|V`3_Juev)AlJUr1gf|3ts^<ai<l6bIL0 -yfx+EC8hOY5HzV)9B!XxmD@10Ns)(Uf1YEGrkzDj5ek0`y{kE>EBJ!c9Fc+Q<1%E@J?0Vr^3#WMDK?K -yZb-a87t0>1Yp!nbUmwYVNm};m*wf1d(*^wb4o8Lfs?g*mti`&@t~nLz)};7OIZ<}e!}zr$u5z}n=Tl -K2s~Y3e*)KqKGc?-l<)w<<)|nhg3~AT4{n(2wQh6EUU0^iXad0hsY{&x$>4vb)TfmBzDJfLjoJ+ZsSE -=o?YnB*q)%kT;~M-+zmH0boD6A%9gWgt$_`2;>W&6$vByx-A;?yFdcT%vFPIM9Bp;Vmpz0D~sWN?Mr+ -%MI*DOxEwb1BU?eYPXdcAjoItsK%P%4d{)s5JqbbQxo(hT6hfc^8vqgB>=3%q`-vGj3t*Zq=lTrv&*I -1_<1txQB6ET?+_WV|ovh{|>>f5#=d`c}e<@88yI#^{?^gZ1v)swK4uuqIg!=K}kRG{kk&_T6F^bvLSR -303{IOp#Il6I;F?YFc-7My;z?4pM<vYByGO6H`=c?p*7eO3l+vHwjv+2)VplwAj{MMXZOXbXv=Daw*| -W9O~L_F_CflNjXKg`IK&nP@rc@$AR}KBlUfWy^}IRu5Zu!ySVx=)$lk{#?IRy#!j=-o!a?qHrcv=-)z -9Gi~McQjRPAQ)^^RC?fdC&gl}QfKg+i716V8OuQ{YP_IRN%KZP+{ub{IELbTbO&7nu8i8M)-U4k>JwL -QTU2l?o&Hj_@R{S;Mf&;{<>F4Be89X&0d=MXzANEiPao_pm_mcOnFbxn?<(%f$E?b57>2l?A9sv*H^7 -zOEK6rn*ygERx20feK%Q^w)KHBxt4Vfz8Zs%82D(r**p^yn$JQE?=)W6|7=mJEAH2V=#qNDD0{39nvj -fBRfZ?QbitG>X)#$j`-T#oZTDsJmXIsrbPMIkSRhz5yaAk8`2{E>#n@Fs9>Ba_=6_4BQH<=|Sl_p=T- -|seg5#(v4g7wK2ynbSh?oXjI!`EUwjko7cJP7McOWa|h*XcGw0iPA|!oSs5)sOSXYj-(mEHX}St0i@G -98I(<r0L&tpJptY#bC!E!FAb~_npC`Kt$?Yf4|8G~T*)bY&89{|Ykzwu)($5(j*m%}B!W1o)iTu*US> -%1@G&;@E`CKkpzb>W{*LP}fSys1dIje#LDLX$K?bN1dTwZGkPiE~^ovEDQoHIm?(7k)tCS`Y`GOv%ko -|vo3G<tP8I~Rd-=_G)bu>FV~Bs4bn?tQ4yIT$wKeK^96;ed}mbc7^4V=S+)4TdJB9X8lx3ohciri*bD -*G5Hqi@^dc1GkaTtIaKjo@g4Va{$ID@rOo@o!Q^er1vy`FU)~;R&y1w1a*V0$VLJs$ZDvBMH>1sjtb7 -Tq)*Dul9xRG`6>H~=@0^^H1nu`*HKI;j`>!XvcX$y8#=tu0nJHr9lO?(^>D0iy{to#?S1wh$gDzhYQV -z9E7hyVL^kzieQWQ<-@E^}ckt8GYvm@jBqZMXY>19Gz9MeBpTFC6p1gsfBuSxEE}C6VvYp!5H1F4T+t -I^lBWgz*+xJT#oWkkk97-n-qD}a(owO^;?~*3#9QV30)eV&^KQd#8AK5u5nZSQR`2e2R+&lmylfjcvh -u!3yUCUC!MGPFx23{6S3E5&7pODMYyYgYn-3bIOg<chZYiY&6GeQgEb`_~!HMC8RBc>35^DOPNv$BEb -N-H=Sf_8|ay0{j1h`c8D>QrY4rByt-Tt>Z63=Zp^r-=xFx>Rp<LRPE|8Se(EW(jNBxCwFbrKPQgxFTt -7WkK1JNM@GRoxmgW#I7bsd_Xg3kS{DWBs}W#@TpEk>8c=12_=xUFnwF0%<c8dPW(1`$4XrILQ$;n&2d -Q=?8j(7RU9ABcu8u`;Tk~630s%d>W$e=0tQhs0iCp#%_#Ju#b8w$b}3Ym#p{cmsA3|q1r}k`(SVMzys -3N>BrReXJe-&wa}<sxuI<3^7aWNfD!u(rY{*?gH?hdNL5e2novLo{D38NfNVDu9O}pcW8Zz7APQC64v -~SQdgW|p7URWseBfVc*8Sa`T9y4@!|4Gb*Gj}xU{)4AmetMes&^6#hg%UG6HQ7@+auCiTmXtp0zDVt_ -yfK>6H`*D$9L&ChA77r$zSFxT0s8FQq$s&`d*i85+SUF{+uN!e5O?)I`wsp~6A_sU>aOn=>STa6U`DL -ZPsI;11XRZo$%wqO^1Tlh@K$6P&b7^!cxOD>D~d5%!*_MGV%)sc<JQ5`XNQu9>F2MX|L~W?5_8K(aPo -Me%w}RTXn0C4xZ}wIrDq+$34F);r^j`W|EKP=M!iuH?ZL5R)3(mQ>VOXnhnQx=%N#&AzVit@)~ZlC8? -vuAN1f(qkiD!=eiG+7lz<6w*+PA`F3tA4(VXH)sFSFQN=**UO+4DrISq4bj(a(UUu&u4+{VsMrkjNUN -%4@yI+n3P%?X1}_s%-<mr9mC6|r3b@9`PBCX*0|d|aQz(OhIiQSj)tP$etKY%{jcMHCmANw5gG!3nP+ -!jHpXW?R~6RAg+(CKeiJ-qnso2u=idgFU5~D{Ydp7i7|lnbM+6kG>%b$A5gqQ6V{U9NQWUv)*|+%8Ma -6u#WK>o=g)X*ea)Jl6#3)|B7BK#hKF+6}}2btZ7Exv7?#x{vD1{tVoNzXOakOwd)8DzG^%H2v2u({L* -O?)cGHM>#$0OiHHNk5m7uAH#eHVNX_)`xIO{JJzGS>S9Rj?gcsguK0M5(Lui_2=mE@ETEHrUEVJWA!r -o|xnPCrfFmG~U4@H(28fWUpcY<}|L@<-x=B2Q<Q74(c)@JjqRC{GeD9G{@{)owgM4*+b?qlCC#_nCS! -c0KIB6j^N+iyLr56H-~u$`BU(%^E$I&6v_Gkhex9>EwTPSGB8ublv=N7nG5VIjMNpy8`v_NXB_&*(}+ -(iKWcEfqyv7^`R}g5e}0bF~?-rgRtQk97vy|KM<Qo$g(-{_B>-T}&7=FUtB<jgiu-iiTa*tdov7WE8V -2b_dXHiAH{y(Wof)JRasVG@{T;5O*4PIUDaoauY?yE%~Gf;pps7)}dm$7$WZgOF=dWWQ8cbrsAm>evE -2WU}jBg(>Mj90`~$Iq@zA)4eK<g9C&VGXKTt>G6%tUKUrTJJDM5*NEt+wYQP=>%n;5ZQ!DM+b1-721v -OU?&`4Zq;BI`Xj`J(7H_;Ij*SeUT4Yx|nM&0#$(R~ylHf?E~wH1ZeqvrC$#{r4fcCFeT@6q~$dtbTD! -lQ=wthw22w%g7l00bOsj?r?56AlAgAz`{rbUKfcsJ;%BJHQz0_u$J{$H&4b&TqeCYdko%HEabBIVev< -v5AH83;%4lkB>|C#HE<bXsD{(?abzSh0z`-<gkZT)_Fy7dCqu@jNl2$ks?SSZ>B;rS9=@fMoYYHZGsm -6v4*oA#h8mCX*4=p53OS_a&cwV1Hv}_L|I#JE~hl$m(e!t3@m8hElS1g3e&}RcA^I*eT?0(C@~K4?UC -A@$!lb@O6@^v2FlVE*LWkO&1c8%f?CUAw!*2EH{30;=BjMCep>_DB$EiIQ^=P6oFm56K$EW_Y2fW_J3 -G!IE9<E=$pW$ZW%P+>D%IlS%h*h*^+?mt_+*NA!aY;b$xqBifgcS5fdO#F4Hao_LX(fd6@9qXvsKZyH -A+3;UR0%0UV_v5s)*Qfi|F^@;|H)U`?zjqqf4r?sgeAY@m~>isZYUZkfoJqL>0aG_*fXXVPoM#VH9sR -IA#-COychc4YB@+c-4!AHoF_GmNhg3ws*t_uXS#=yx=$}bSW2_<DRpjJ~C)au8K_HYIg2ei!ZerSDgl -2yrlxiXig(0qnZDP3;iM1ZvfLJ>(}Cco9p)`s8nKbt83V_A{Uy(@#EL<LeRh88ZM=0S<;9);boP_w|p -j5mO1Kh+!iWB4nawo6;+c4b6>=6EqC(<aV)?Kh1{k=85s{j>i1IVNO_`ke_vT$hIb4onY)8zfzA?i+E -8~IP6Z5}s+9%(>3A~H`Cm@w7(Ec$9b{;Uz!vzfaka1tRbeISwfOt3&d;@@(b4qi==chL)oKm==je#uy -g$BrFT-;*8jXAP#(KS0FNG6v9R2&_Ii9=7fDk3E;%o^fwK}y|7ns!R%P^@m)@$|JVoX$E0fWguKNmr+ -s@C(Z_Rv9}l^d#usL}VRj^6O&epc#i_aLs%$%Hsy%`F;J^}Uo4HKo{Q^&Z74;y7|UwYa7XW8r&)vfh$ -I5GBA&A{*LkC)DoB&hFeW$@Ok{iGYzG!4mmcW5AK#1AdYAAXGYuMzu0j1<GrhCTv&+_SF(NNgW5YcHQ -{S)pG|mhq@sZ&#!5W6jyDianpvBuU1KULs#`AFDdgzhuoq`98{|bvV$7{iSOtFHeiJ*2gd@J6GZEV$Q -f3`R+0=Vxbwb>u%VI*Q{S{5UE-^w1q}8|O((=X(Gbwa2^AStG{lo^c9CTxfi%H$(gB-Dq>kP6Ps-qI| -AVE}wUgRF-6TkrAenffGEc=T(|0yRM7;9xCy5SSz!^}HI4}`rY`KY8s=5p(SRZLPVvDsz+fO=dLg$pB -G|(P3F}|m=gdD;+=B&1}{b7ccj%Z(dIkhIEG9QkOAfv<e!8jkdGlEUrNM0|c<zk&HQ@PKIEQ*_oMsJa -twpLxON1!@AGscHj_qHl*0v#$afdJ5XI^(F~NW$oJFb3)~8<v;cS#Qvla5N*f&qT;2&cO=1in#A3Eu- -sjwO&WxMeB71KLhz>O8QDKfedut#E<gOT<2CT(1TZduanpChwk(zu~y(FQ7vvr(>L5Sx_B*&K_cufQU -8FBs@HXACy1T7brtpA%q|DnK2NWP1llzU-<`<AHLl^`TBFL9Q*|Y-k(XWh+@VWh59Ls}X|#b>AOUxd8 -<<D+tRUNdB1a`WLkN8V-w1R^g}jX2o|iSQ#dtpLWnJ2l%cdncMGfwb`+Za`NADZahcaF|Q|tS?o3L3p -udhpmOW=X#-PyQ%4$=(G_H+CjYzN)`=q=_zs&CYzFTdo{m=>x2Z9P~?B1r!C1ir}`iD5N-SFUo+y2vH -K+8gUWygh^$09Qd0No?dCICLm*h(UBC;@Y7KT2IvO#^jC!Ti#tVHEa|OHnNNE#^l>fh7Rl~99DeuSVu -V6x@xCWhhMnH-pdH-cG&#VNDwSelnJC>Qc};3a?zR!57E%suC%qQKq)Ad=&cA%uI(D6m_fX=mQy63x{ -4SIcPyM>sU=Z@Q4G7uDtN4BMnIerl|bM_743LuC!kA0JgjW9RC%KN13XG|d8>Q)mw>ds@cgeo6c-Q<f -6q1M>x}EVYZvh3>9f6`4i3A2{mb*ir``R(?7e=I=qQ3!?9P4`2dQmwjKxL(P_@2Bkb&dnvXH<2@%{Nc -y$JW<vyJ)USOfa=FCC3hPu6w&$b{&=>Gb*YOqc)-|Lq8}qPncaQf<T@t*FyXmW5$WM)#CN9%?rKX6a^ -fh54?PT}m-&F7NG#$ea`c+7(s3GMG7@%X;v_Q3!6*qTfh$E128e<XcjQTe{4&G^@krtG66g*-OAW)5d -)$S7!akgK_U|e1d=9%;2zvL&P@+T;dJpmC`>J<lG3UJN&aK1K}uK)MAl1j&78-fPMJvsgeq!pWRFaoH -91dO0FbXb%8ZlscY^r-(t&QRVmS^DotlncP~cI-AQIFVoU@=rY5&$Gz*r3+Imd+B4Vf-jLpr?jl*=5o -@EYsD4mzna%|3}20e^&_gs!+DZvCOSe2ShnVUI4)p5HxCqG;5fhh29xP3u-j>m(HqFs>^Jm(a%Waq>~ -rI)v*Np?BrfUQp3r0<wd(ZYre<-Vf`tw0ZUnx&|t1aW-I7CvOLXJ>*-9zSU-Pl!Es7?r3gjRg96qsEy --<nMoQ=Sg)SLkjrio?>u4?Zv-3V%wgy3!${68yn)u5AbAfQ<isrJTN~VJFPr^9H+@i(sP=6{8+Zd#r9 -%Ph&(w-+x~-1|AB3G-+X)GAOK5x7{5<0{p&=^({OfHcvMgy<F$t$q?|n*%QdnSbwn!0Vm5U7y{l7T%O -y9Gi&ZKJgK;>DJb^Pe?$5P8`j@Xu0OraK)vMwF9l0lHTcbhy04iY{ocP^sN^1{X{)&A`0_)1)cWQJQ7 -U6XPQ1pJP(+Idbp@v01!5Wy;QLl$?2N`NZ^{wHzw!Iz22KtpG;FSpKX{*72!%jM6xhRCo4&tI3b%z|A -GE}*ekeqe}MTX=4d|>o8R`^12q8M2n9!@i)ov7l(YsA&vDA#CB`1o6$Fbrl^UD}>uY%}q*Q;+ey`YZl -v)Q_E#TW-lteXmXF!<@{-8yj%UrH4P5hkKj+jK0vn58#0Wju7q$BuZF5ejGwGrHp0xr?(Qqz=0IT)Bu -9rBNMY&SEou?0QnFjiwwwoBg8%2_hmEnCrf&QoGH|o_xR^>m2Md9k&#*Se=YR^*_p!k*v;UAY_NBp_1 -?b9vMF!PrKoUtoJZ{vWms)&Dap*L*XGmxF|J^WNt_5yhB^m+`NfXpC7ovbxTG;qC3hDW#E<aHdj_+A; -5p~zAf=q81Fc&3bdZZY578fX0(6L={pqDvvl<e;nV(cpXcZDH>6m!gN+%!>_hVgi`BA32JH`AY+?k(7 -`R$K3v>D6&k&aVbVcYM%^U|9hn|?OtCEXlFbJZPb#ULn($&?fYUK}_q*U1TDbDD6X-`dd(!yf6>r8@u -O^A}H^zCib*Smh~!ouMKJi#u_|jc=WSsEdSGPoKVyyu>FZFm{OwFbcp=8l^=5^q7n4KfQ49$n`l(WMC -L7gAAR2LT|?}4t!0(+P|c&PWc?;msfOLkA(h#Nuh<DAPg4;k^s2-p`+~$(Emg%xb<>bed(YQz2M!4o^ -#Ggmoc?N;~vp4^eYRE-<;$qqo}ME(^}_f<9%<V34i-v;h%5t>nVOc<*%p5uqrS|Z>VP4#xf_TSo3Qv{ -WX@pla4N5s`y**b>Bu1b39C|f)Z{CJBm7n6_}-Gb<F94PL5AOAevqNm`);2%^LrjPvY7c9ByDG4=2&+ -q~Pe+Q92nHH63g$sqb!o8P$&J2#C*phzCP6iD&9x#^1l%&gkK89cW#@Quzwpwp(wrOI**<dad!DwE9p -dO3IMQV1OJV;=OG%7QugH=*+3`NKuud64YFWPJu&ZK8;j-dvQDL2Ptx~Kg(t@x~Spr2IgDJXY~TpwU8 -<1Sw_)HicH@fN9?UQpJJ<1yhCkL9P2t9qTglHONAdLPbS|fD3%QdG}u^h7^Uyhe1HxfcbvPkfOXORqk -CjybMN>HzkP9^Y-?~N?%kKBO#6V;<-ni_RIX{D!l4Y#x%clytyU|#cmKL}=MIv=wyoRT{-W9J92G}zj -_-ZnZ0^eOB$6*}0|8JgP#c@U1gbAjah-}*TF{Sj?kn3AR-&UnRKrPgGI)avzKrhu`(%oAG`i~id^9>n -`dBFU@2^0T`-E(ap}1ieRc$s9^WJ3gDFbvBd1%WKTVG!|W-1<@!tvmPGgGVqg4e(`V*LxuFAr_6BX?? -V&`^&O&H!llCBc}Gj?IIjJH6I&h^+N-tIfc*N@~+pe_CV{H02Sr_TrmYW}&Jl_0`nr_LxrqYtaz}yjw -{TuRlhQUrTCAudntYPGXF@^DG@==VFf|rq7{&HRikN8=bp`yi9jI#e+aKV0wm$swB-4ZF#a&tEsG2qE -)A*S~+6zt7)b@45fk;2B?jbZHN&P4e2SK1f{EYb4z%+co;b{j5%Z*cB$R(uN>`|;B*b>E-F*6*;aH7* -eu$da`Z^fWg_*UO=Y}8(XN^p?Mg+_AX8O%1slo*C&`5ILeFFEdYP*@i^fy`4p;QC^A+M#hDK<qtqK}% -vNv$hN{U0*QO3tn^virWX_~-tY7^{Z<?&=_g-P;k&89g;#T^z=j0U&lnpbSAFT2+X5EFY<Y~x@4UG#F -+qEOge(l>9zvo4n~8efGu490X!x?}S6HVPPM#C+d1@zO@w4E^yjRRi`iBeZ_p+ut6hy{>x5SUi9A?%{ -SmdH1mN_$z$;m3?e5dj96+H(zbEp;R9x0U%I}@i$u2WV`I}%CBbmFmvAG1B>Lrho63W{$zVT&-?Nr&9 -SDPzBtFWLlaL`av}nlK_Pz1&d`VB=R6KJo}Bac85&(xynB*j7?{de*dg~d-PGCOh4PgX;oN!S1re{z0 -$O2=Rqa5zM&Yl}_J&f_p#Fer=tSgf)JHMk;4nA_wn7=uFDLFDfvYqJto;Y;{(}dt_QUq0Z=GjfwKg`h -%?B>ztl4(;-)=sLQjbq>r^{q$_ebrcNSCsxpJ<T7eJd9B<k_<u5qQc=X;I6%jMwgcx0lTa_aEM*<zfE -bx=t@@o(fhWaWj<KOOVWmn0zln9#xGvzOBqtLNAfg3AKC}!h#+<?GxTARb&&tG~I9dUAbG-wy!n61s) --1TnBzg|7Yi2(|x(VprXIJI_iNa;xD!iJy_p-Aj-IluR}kbTva#c7CzFg#r<t9>~ZV&=yQm3IEZaNl8 -I#m1A#Y>98l#|DA!zPqa}+wi>=e#XnpMht6JE?f4(jI`LQjztG?6r@o<*gjh0#mS9)AurB1zJ?Ir1pF -RsXpC%Lxh)#9y`dUW(AtZih~z7A7C;fmDJFjp4$<u*wOk}cAlzj2#tR*5F<+A)oKslZGgFg_!xx8+0z -K79;w;xt2|JmFHX0-XbL=qB~DE>xm0gVK@=WsDgvn@a4Qq+TYc*8=RY&9tBO@?knyik}--#Hs-5o%QD -N_ecG8$DhvW^Q{n4H_TCo)mhl2lEnrqQP;~EZx-Bc1QhztbR_l7ebjf}u%4iWZoOtYsh>Eh+Bu)C>1I -D?hagO2I|>XA&uYCcjK~CMrJxNTr3Jh{!wVuMTR5@~QpQl}${%Z?lQ&=L&APn6K^p~CKh$?p8xU(%Fq ->tnIPV=zQC&Z5nnvnL#Y8Ak%Au1h;CaL<=EH{0Ta^w1GyJG^)W27EG?Qk#UNFa>Iee^gF%qK0$i^rQD -E}8c%LWFWm!vwY2T+YW+0$eF<BAY>9yPviRCGi|%`dA4K35OjaSSxPkOpg!(XJU?jX(f3?JPR>$GsvN -<vo~tgYo#Sb|EuvMzNvhRiyrLmw~It)15`(O{-sQyLS4qGv5@RPsSsfp=wtmcOS!{3>xJ*_kDTn<j|e -oaQ>|<ZJI=4v|(0QT7_J=#71gr*<}v>&U<(zgHAvKY^+x>0Ymf%^r^b|L`Jw_w2#`%3)@Uo*@la-P$& -tq#+#2i8_h?@SDWz9!(((-KE7&yPyc>sC!5!e_^7qKP~*dcYuQoMVQE#D?y7u->BK?M#{U5m0|~Yz{= -06dS<oeQ*97xbh>2kRsiEzMPP0O0P_1?`<WyIx&2VZ9!0S<5-@*;eK5N|jTFxf`5TWwT>ra<F1xujKh -On%Scq93Wt;)8x9P_i)DoWvkTozYD5qbPRE<A5L1YRGv*@cn=YEy6q|4?kvXsPrZ@eKC%Xgm5wwWu}} -k0{W^Q}|Fn<wO*n;N33J2@jUO`G^A}dlhW|Dnti&u8KA*Uzkb!m7T=sCYrFzXkxc?+@l*}=?M*Q#XR1 -;jyqee=5fP&`2E&V+kMpd;Li9T_x61h#iQu``z`VRC^i8r&(n7qhC3r((W(pYXTA9T8|{hn9-FVz6SC -=%y4Lt~INPb+{d@E7uz9y%6Sg#(_24Ivt7fwN*n-Mw9i_k?U9`%&g<tIXkgVH_sA=^pAQ=tOD4T+!&X -fZ&r&cBtdJP9!nBW)3@!s_4TIik1x?iFR0MgL_%Yg)iqFvofg)948Rp6FKlHK!OQQ?~nFln|~Yk&Lgw -{X&JK4?o<)so5yKOKj<G1g4rter#;+KuDj(9(=}H|w5`O6FboaT2%ck1{kUjX;bNd4j{%;PySQF3!bj -ooR4iez$rw{b-O-rq*{dJF&uryRh=KCv2Ume|YyVTX%oly8EVe_w@Fc0nN|FO98)p_T}L8a)qTaTWMi -XyP?G~`-r7MLla&evxSS}aPz^|qi^B=EqHXpl|qfm)sjS;50dE7xBMTx*x1<kZCB9mvUKFAN)hw>SKF -6aI^8|$!{*h1O|6NKVC-h+@a(8>9`(~pegLO2N2b^Jn+VzL#Nru>lb7&m4u{Qt-^h>tG^<9+$H+yea~ -K`tgY)rx%1^ead_J1bGSvlo!l|d|Nla%<>`3E#d^P)Z_a9eyV!@YN-&3W^J|eQAe)7_keLXxs-x?0LK -(H&~e_X9MH#W9lu3b0K@Ct@=K)N8p3dV7m4+gpUMVU$f;I9<1Q%RrSQ9i-R%!wYo|Dk?ZS9Ue^sD7=; -i#pi~f##d*xG8@FiQ$CcJZf(`f(&YDb(irwcJsaZGy{M1#~v2YWUEV;y%Rc>S<^zPm${0BouPQKfcZN -Y$Z9>5GT6vP?Pz7mIuDcQvQ-`>u{)iPhtWlLLg_I1IlJsF<Ed+m3|GOdjSAKX`TBtKcDfAYx6I^84fc -~+KbR%t@QG(4Pv$aRh2c!(_h0~}1AIBOvm6+c5d$OV^_~2j_z7$YwtZ(;pbVXy0t4vX+>Pob!r3THh7 -|SSOwfsQN(U)tvbJEUjtbnHH42=OXG7~Imz#eru(?|Ib2W!-!%BNW)kk`Qk$IxF5nI)?3xR}eM?R~8S -L7P6SnbQ_v+OduENNtdR?&jR*eeQq67SA&uZ0;%sR)gSIpXTE6(#v7USzTta^6DIylcsF69mXE>}Cjv -#EFE!o%}TFcF|0%+r{`CwQhHq=A&-6wxv|I*&yr92siu*Q(GmoH}jcGs1ZYEX9@?4V+rkq!XcK-r^+P -~buiuk(v^DS!F)KPxY=AO;P043wHC#~qh-j>-#)jJ!`|>9D}zQIqe;TIg&NKz#-~M10>ZFd3Pp@9MXv -I)0o5Oxx~4m~*&hR$x>L~~Q%H7)`H<?3x=q8~?#=%mXe`CVP-}S9C(dR&FUUgIEqZFKyO@dQl!m+y`* -EagJCuVyI-w#{q|kc9ldRvT7;!`6T94s{)rxm9wpJpN^RHp#c@(r6M|N^Yk*hzRQ8Eyd#lTeIE=TuxO -MmnCH?6<@{U87MySxVPsp+oLDZ(<Wy?J`@bpNo%@*KPeY){Z93Ra_DI|cxk)h!V8B-(qtFPqRY?-br- -;>o~SyG3@Q3XsZfYvFSb_V$v;kCXj<)sf4h)t{#W$E-lR?DNo+03^}lB=YJf(IFPzlyLG9d$GItfbgs -Q_fJ6tHpTz80JsYj#vPEGv5_ivJq(bs4dEk*x3F&X^UpscBJTr;z--cyqLvvM%84hfMjX=@$I!*MYw? -X(T!R&h%1y0vmRk${cDS!*)mMd&FuAcHePgswGelcrgyvv&6B8K1_x}S>O9KQH0000808trnOkf@djb -;G=00jd802lxO0B~t=FJE?LZe(wAFLGrqc4cm4Z*nehd3933Zo)7Oz4t3Tc1SwWO6-WlXY7Pf6u>PWA -+3^tK-$O8Nz+nkEQi!_-gBOxOP9WL0XkpM5c$Ux_SBDIYr6e}I9&soqBx;L*f6#3bvV^}@8egF=Oa0* -FDR92$e>bXSrkWX;OcdYvRoIyt9N9BTztjc8XQ(Pw8zfX{R6fKgWCQKiQS@1cve^Aoq}BDY6&z}YdQy -w1+r0;As<+Sj570mTv^sk_;*J(p_WW8Cm=Nwf_yBLnX_6+QF5bpm*5a5OoF_Fr#p}b&4FzVLUdvYwhN -r<_2JB2CnP^~wTA3jz7Qq23L7Fu0|!SY2dS?wn!#H^)(35jU`iEu&-BX0Og1*$gV>dmTcaCnSsZa4Hz -_`9Y}<-#(}`KP|8!cgQA)*FDcEd4C>8Z6B?c;A8?-V`PP_J2!rKNupH=hkFhWPzcC|~z(tO1ep68v;X -kHM8K4*;4u1xXx_w8R$O9KQH0000808trnOd)%`3eO1u0Q4pR02crN0B~t=FJE?LZe(wAFLGsca(QWP -XD)Dgy;}co<F*z5-G2q){4hD^Q=D9j4%u8ZyGzkvZ89WjZ^i8(&=M8%PL?#1ieq&B-}fG=FQi1-xgwi -!xLD-l=Y4;Cq<nNl-WKIf@Q1Y`XN%J}ui?M1$SvKGABrqtVsdl@|HzL#X1Qbusd5-3YR$++Nn`j^&&< -g$Oh{hj<Sbl}012k`)O7Y2gxD1o*#K@{C{jrV7+jK+XN<6?n3am~oW#YZ%s9<sMz&n7HJ=(KM2uf+jA -ErIkW*Mt!c%G!5~^yU*GiS=CnwwOHl$kEun-R?nIV%WKVH4PyuQ194FcB-e$F!{B@yi36&IlFYDZ`Z0 ->yL%VrFzp3PI?DU@)f&6nHDR;`zgz$Rbr+Dj32fTq?m=m2&LWhzDBR1Yj|mlj+4Bxw@N@zg^s2-OUl? -{nh;sH$UH#_ZPRf7uWY!mv`jmmb|^Wes^_$b#o0*-;;~$U&-IEuHVfG18V^v_EZYg0L0{INtS4{-7)5 -fkQPQHS+ba?JO<VBhl)Nh@=!c7k%LC0WMac5dQ^gd3BqK2!xdF}XrNa(nE=Z|C?bHo*i2GUY)Hw=FnV -M#pe4d-$)6fZxs%OT#W$?|E@;eFH2yr9OpcH!+|VbUD{?~4z|tJU;~zV<2GhL>&qz`*ng2<VHGKr<Tl -8TVPJX)hXY~H!>Ygmg>EfF=-+XoY=d(9}o3Ir8ti&!jPN;a0b8>u~eBRE^Cj>sz=~VxH$Kpaz1;VFQ9 -;4=<GR07pisp(_#iTaEEkdE$iq$6;E4}!;k_x&Z2LGIth2)4pGXewEhUH3<l1gcUX&(Ygc1}LC-L?>k -clDSIjUr&is?^3^6_8ioY1PrM_19oVs3eax;|UlrSM*6Q<0;8l9%v0_WC=FZYhs#Zm=b2<!{TFYHvFJ -rw}O_D#0X?T3UlqGRtf?jL<$LW&P=nkWJ#0;$BkQBuh<`ux)OP-b1(~0s33&});gDSy{2W+%~~^!+^u -Scie-`wmHdBc=f>zusS0TjXAnXi9}_u^PAG8{@tmtD3M9+Y`9M%2RZ%XliySt9E#=C5^^--Al@V2nZA -um8)n>)SLGpxUbT>wY45O4kv1BiWsYlU<=a!)DD1F+y7>bQxm~CL52$EhX8^oDyANB%5iH2FM9a*%gG -R3h>3mep-7#C0HZB*ou**>AN9HfN30XU9|htc1GeNQ3e$9#k3aKBp)5q#nh38Gcd&La%9Fd7LNDCA#b -T^gH)?G^EK!j2J*anjMIcZ!9>!i@Wo^;{3I3rqv1(X2rSsT=p9bioTy9ga0T1nVaEA=0P5aMsK?XuUJ -^K!<7Ki0hdiau^aF<kUWNPTNOxfM@&Q<Ll2`<lAx`AsKS@6CUKMJ=QifUanr(^(cINx@>g(W(^NvyU8 -wfkI4PayBk6iXcE@YqU(0VWD;31=+Jl}q($vabb>V{MuIdSKDOig(;g2ND5ATac32_qg?XZPvQQ7x6c -wnEtR2*w`+pQ(19-r3(H`6e1uW2#cOWdQVH&@Tug>UZl~7V^3GIRw=o}ikU62O7;h8=gq<FOHG@IFc< -sMcK42}m%m|j5x%npVIhLSfloQZb4-CT5N)Vf)Hkm<D-PRzKK*Kh9**YTrX70HaT(siMy3OB%b`tsD% -FXCG-9b@dTrvm}T%itFY<8m7jX}tIi#PU?EFOtVzKPJvIvP%cpvLo+hm!2Nau6p%Yc7a}dv#V3>aCX( -K-0Z?ZC%ep%4o;|T3x~HW%Gy_W>S-GHs2F*umu8A)Te_1#(4I8+$nVD)4i0LCK8o>lXK1lttajwG#Zb -GFNuLEwpSw@}n&LUS*QB-LIeUbf{-t`i7`>5x&+E3}7@W>PcPtxjUv*fNf<e8kWN&}012EE;Cr}H8R4 -v6uS|`xybb5!yTx08Ng$A*Saq{hQY!?oj>jwPP2h9<IG|Ij{->a)u;(w+o-a!$4ZG}&IsaI*uz^Cgz& -K`x$(V^8dFHALiIsM)hcrT_wK@mc;3^r6KL99(EpB9TwBy0P7L8}{i3^<{iqJljM?{LxlE2g%LK@p?z -+DPdWv470!B(^usmlxTfkICHc3Gk|{*9drYF_U`7=ebGa!P#%_Kfuj8y@z}B%W2<!ug#Em-0(8fHHJw -i?Y<fhJ3;7Buzb_5W{&kSXf%5mOa60?YOZDNl0AAteMN#Xg05LQCc#(<dreMfGk1H@eE&)o?rzY^vlu -wv+6K^#gVyGSya>3!{tQ~=F{r)98)@#25!YjYZ}%KwM=UeG;AIVL@87j;4T)u}da1qu>sC4~&w-`)qO -w-Xbx~!ByRtcS+Dma7bTE7^t!vtFO=Z^$^bMdF|7SVcaW%bY_(-#geK`HtMeeYD8HF<nyI8Zq<#OE~w -Fc1l)kg0$pZAYzmJM`XM!JqH306Y^wIvB~AjJQI8N?jkSy_2ExE?(1YRnp6FQPMC^+1{7oqMy>FUdvS -QKfm%7j;hh38=m0-t-%r4>_n62Kr9I0VakDlNQ138B(a#kSVIvyYc6#KI@p{xD#;0Q0uv?@g^KF0$(5 -6<FvQSIpj7dnw^vT3bc0#!5=JhK4bKoYTRI+kx|X(2+v)hfO${bxJSR8ruJFO*c?I~-)+NrO%>1=z~; -^+OXg%%Df69ts-$_<O(pX(G-S3<hEX!iSa-F4p>rujAzJTG4zD+j;<7t*ewiD5UhrNq`Xx8>ct+|PqG -F>%$BW_xX;sjFU+H7`VqRkpCDajG@3VTvi4N0n(F^%rjd_Jdrg?eR<Z1iv3>P%r$VJ}F6PCxcgzBl^8 -B<*oF-RzZbO0~+-Z0~@92iC_&}yW-5F6;W>Xg-m*E*{-Yw`C9xphQN7+#y`t2XFQ*LD9@#Bn9?2M$Rk -a1J5Z6N@Wc6SfMp_1k?3XqXR+l9Nn!QAh6?ftO~jJ2fca`(D;KOn}yT?j&wX+1&e9YoxusHMT`-IA+$ -rFX64H>$m^0zR;?()v|fm;$5XZ?s(sz1lrEUlg*1-gyxCnNNus|WNuDxD~4V(wI%eb(xl#=0>}H(dG? -2XF+t2{RTBOb3Z|C_o%=s5KF+OZfF8toJUh^mbSFO(L{@kTR*E`2E#E%F2sP@oc7;4Azb$^B6Rqv}zw -+Nsf1idaW?sEB_G5lJ4L=n;589us)YOq$1+HqdXDHVf;}={E-w#RAahkdB^o`dpdr8?ACp)y9@`Nb>C -~6q;=9gl196s<z48*EDTr&_Y8g?RDa(hl+sdkSxo>U$mH<s%(`2eQ-=-SI+KKU<DO9KQH0000808trn -Oqp0sT1XuL0Fre801^NI0B~t=FJE?LZe(wAFLP;lE^v9RJ^gdrwvxZ=ufQqOG4-CxOPsWGlc_sZY^Bj -Xf1Tts?d5qm6bV_ZDUu~f+j?*Af4|)YK!Tr=<#;j?0qiaoi^XE`!R2r`{G0`0kOf?@Rh+WN6rQ6y=EX -i|+1kxmnn!}g5xd@IYxp^4ZsfDK!{Kl+c*RcRWSa(e>x^06h#kLv^ZI-E?+5mQM}NAT0I+z*QxQjlR{ -(v@(@h{m0AvEe);#6QExSwIDC7Q^ty0ceykg$kP4D=aWieE>WeMT4c$v9Dgsi#1T(Sjn0Gq9Wkcd~=q -nmQ#%oQT`0v9MUKlbtsk1{vI8dpIGZM3pAXTycU7>=kKpSvN@19q`g7qZ6yTAYIfxX9ALLn>nc^1|Fl -K6G&yYywpWqLVlTkORWGfOa6aW44L?V1>V&8kgkDFc9l8^8+Nl%rnRonCbBdv7jyg3H>2>h^zq(>>+A -#$ss{uJqZdnQ=$@>^SF*T)z$>a(<)CRsFo9!AA{(q)<3zIVGbg!;xLRKr4B@XfbA0RsrzoA)Lq68oSG -!NJ&H5nSn`2=k(6Dmip1ItL$>5fa!@tM*{!rHMIJ;3dJwoFOX8F&t+&>eOnjQM#ns1~FO&I{%@*u>e) -ZezY<k9qlLe%QWA<fs^XcmI4Fibz<nrbZcJ+}>F8^Tvm|dQY+4T48`E;>hS92gXySP4|O(A!7d3yf&Y -<Br8`v91iS2yf@b}_pFvNu;$r6M+)E|A>Cbbk5?l9La!^V!WGV<7c$c5{hzKVHq*gk4YOH?z~v=aV_R -{ye|FT1<h3Ga!69yZktZdZriC%NrZ&g*-O>4H9heX>xv!l>xQMXK2G5xn!qT*MH1szka%5pRUf&rjYq -z3fxUToKIzC(6rO@$?Rgx&L$U=U#En11$3~52q<}EUp`GS6YHG7ztfx9)g?CO^y>0v4#_dJb$(MIf0- -?&V>X%37ATgF^Q#MNCJGjCu80g^UQQ()6neF900h&Y7t?|yJDX0<f!YF*WkWT%Js7M~P+7-W<yoF`$6 ->(+H32kE#32k1N2Uh@mA}d(FN@<)=!^g?O(i1+WpuMR)oHOUin49O#bDq#ZVrPuh1yQouwk^=PfL~cO -G4Jqj?=rJhk*6~<)EVy?~VQDwf!3GA++bS;Hx|&QwlI!P;oaEoGEx1?W+}-JydkmaeHw6$1#uq&TLIG -h*t5}*SGBCgdIci+wS7GSp2TF{QdDQ`}u@fZ^!K22t>AG0Q!Ew;1A7Bbmx!+5I0N5lplZ<zT;_80BKp -^g<w;QZ2Xn^8Gp(sTT-FCWe~aPR_89a8A=%oE+)S(X8$`?%x>H#5&Vk}cqn))S4&rLnbppmh1{_)j_y -V+JX*x0>}2~Ci*Dd?)ZjXg0-WbsILG$LidV#N61o}m>Ba^tm1Y7>zcu{ReQ<{($v^(RV*f4YNH=_Rw* -sxdU~i9sbSCTqs+0t@!Lr`4pMGL*-;CJz?2Y8G6pAD|%Z|XV#$Z&JAxA5{cEJRr{Nj~GB4Gb<qSMz~N -8qEAjmj!XI_!5VCPNP#7bW=T^A!xckb^c`Fx{+-7U{o~!<dYi;<YHw(rpzMh*-Z{qfwE`pFEyq><YAV -1+&UDP2;qR@(LvMJxHjMxl=|>IZ0YSzT1n|k8f+Vd>*pjVE~gXT;F%Vcd*dHjM0lw5&@rQ;@8~@^irf -P!tso55rSfd?I0C05%8;tO9SM9JCKLmirft^sn4Wwl4WBhb)1QD8kD)rU4d<)4CvGhC}%~bjwbF%x&x -!@Xw(q}@f8bifgh<B&bj-q?HLzdTGJ1y7vOVcN-@UFU>E-|)5bh#BL0|ocf3Rcx-c3O0~1`TJj`&QAq -fYParnTkkwF^dn-NRnvYxR*9MQOl9^!i#VU8oPF1uST(RBge1pc`=7+HQ7f+q$(7t9&VeTV~Jpqr~ij -bL}+Yl8WzQAznGekg!^lv$9#1Y_66Q>a-76_A$6F&fbr9g|FXfGxu#0c=BR)R$5QMF(DhN9JEheJVS1 -M=wIBgy3^W{PE;6jw+p+!?bA`L?!DZyP#5SggLhuc|aKjj>Mbx1PhhQnAs#E&{8bpk39q30EA{34b_T -NvtvqdwZW&UjB0v|y;lee69y%P+oQP;ZkS`aB4jywI1{CYf|s?7CF-coHRV=^tLkkz!N~;8aQly3>ST -k~j!u@1E$o>}D&5uvX61g6Hm4J8CC<-ZhYAC{b$G<8;Q6)&_jdrqCuw2Oqrw!f9%S_!R8hy(gGb!f1x -I8gQ{ZUkOJWxchJa;T=rcf1(}0$_fgEEElE~|Ab)Xf4^_gQ0)quvEe83#6hen^wFOuzpv8edq@rX6|j -!8$2z5a2DP;Jy@?{tv|Al>F}Ak7CswJ?HzO>5ACsjF%>Lz7mpdmEXyR_|_50nsJZI=?$jSz&)VjhTj2 -qd?oCjWNz`X^RS*vIw3o0PNb$*3t*zb!R~P7!$SuK$w=YwOXK|Hxlc`nh2h397KY41i<gbmA&#iY)Of -xVp%UBg&bWeoS3ht*Kc1RvsDoJKoZfz*o8+}BxicaE^+H&1C^sIOw`a5FSe%aALJHL7{b&V2-?U}>mu -4skZ^B{26YWuXoV81)8p~fpsFzUQT!OGVl*TF{y(EObTEx>qs^f)`x`7AL!=~(3eoK8d^CLpOpC5o>i -k-=`gb<8hw#6~g~cP*XfTA%T7@AE+MGk5S5sLB_G^0`W74L&<%8j6w!2wvRR9Keb&ip6-80?Q*oF()- -TJbv8dkY=|KQsehc0yk!I>OoRBR1tL`Y=^e;(8&iZh0l=)rD^)Noc1<@qh4eNGS7*Ek|vXc&@dZL6_l -cxEFjUaK^r%4INwU$)5T^FRa<?gV<=qCsK!p|y3XBn$tyIbls}PJoV-a^b_2W45iWYM9i-QW-gca1z( -Mckg<7K$}kdn@bv5nuFR0a(@%SecjcxMo}c~a-IGKz&KZXtYCrHG40@jG{GRIDQ@42gnLXHZ9!(SKvw -4Qt^JMxmmDqayC00jugRcl<k}U5ciPcw<htR=1=r0`N(9ACm0o$w>myUj=C3?R@gyKH1&bmnCJOGG%= -U1Hdd?pJBZt{wD@UC$hh3|cz%)`5ah`h0iKo^eIf16g6-C});1o09N&6hCeOqIyC54`4d?QTv+n8oCl -ZH0VUNA(-C)FKWF7>74$w5WtHg0;4%qgKkeXY(cA=muap|_x&w%HZB<CR1Z<Nrm@Xxxgw3PNZs!Rswp -Oe}NAhtW(0C5(FNrL}Tl{5A+y6E#RP*+Dyql01`34#k^XftZY@?xRz{$%jsAP+!zS4s1ym&c;pp#iRi -6r-KA&pZDk^P%O&-Wo}+R_M<P`@yn-W7k=tScYKEop9&!P&_#+H6IcsLIk>`LIaF(!cVyP7fQS=*H+4 -Vv+Q=5?23?q99r7pVuRP8OJqciuP5p}b_#lfqu+8C98%iA*p9N3P0*^G#eD>ln<g~5W$tr@MgQKfa_4 -A&nl0S`HruIO8`i6?|uVBZhPyqPTO~S#ga4y^5V>W7#X40gsc33KWm@RFC_2Ot1+$DJ6LzeE8($_NGj -*x6qu0)<}9ei$s^OqavE|Q}gp79rcY|Lr{cl>;_**e)e<t~lsdb$eGMq-_12~2YFeZc>8Q^_DEa5O>! -i|w*_2L&O8fsZw0(Sf=N9Xun;6fR~^dJ7&#kz*GiokYsM_;hn|eqE#pJ?ZWk$$S_<4VvRh%VkL$Cf~S -0=xhR*^*1@_3RFTQDBr%AT}&^U*$8fz;5+C>anwN?e3&lk6{H;%;1OAs@J%I$2olf^LU@W-CG??^Lxc -#ZjS#|qy1BVt@bp1;TQi5cL&#(sjniLeRfI;yE(#0sJ*zlvdAsO%*MWC0=Q-mskxy+1f8{(UnE#=NHj -tDjsnSb)Y=sfAch56X@=obRH=~A~Ff2xot;p`l6+*BZ_1FXE_<<Y7Wb@97Csk&vvOaXY##55`2&pC+1 -E!CZ@KT)Ue68;bmDbv>$yMNb36frv+(|uY@>hZDBbWu`aNNirjgGm!SlK;+s~?R8$v!NYz32*#kR4e` -Y8qu`Zx2Vlq@f;)-i>+{2sjAi)LX}~veMc8DdwE&oW|~|!Iy#AU&UsFx0=cxIi(!kM}1Won7z`!uc~N -v{~{$_#gS6RkHwQB5O>T$8g;{kfVJQ<R@!qR(;woBHW^U;&8lm6c3;)+ZrSbB_dE^3j>+j7Nb6-Y?I+ -T9vR#8v7;+BpBgt{C-%C<MXp%DBO|p+zZ&?qQX}pZH(pjk`6=P;@8?C2Jm?oa#w#W=MLC8d(>!R>QZJ -PW2;(UI6T26F|P&w7z;(ayWXOBVT$B%+GqF{CIv0~r9c8Lb>E)4<t?eS3V3N^PX{;u~b8e9UNa+w|Vs -M>Nn7?@{-4Vvnnkv^3z_hIDetGZuM9@17fBjo{Y`)*{h4P=`;`x0X)RRDKzi&{nlylx_odkj9BCz`me -RL>g><oU`;bt|c%b;Hr1oi8fYj15P|=_Vaz$Wsj{a?Bxj$X*p~+w1e7>Hx;GmqDe1{dcR#i=WdK2sJo -%8wGQH4xW5=IJ#u^FYyxG@DOBxfyGbi-W`biXB<QaqMGo}#T6*-199`{B{k>K!F3mVKZRA_AI(X^Ts$ -8)j}EL<As$+73JYu8%zi#9Nf#C=>GnX}tkC7>V&;{JaqqSYFlso0Hfnx+wo)O1h-YE!9gGeT?&cutLF -lHupO2m5&9vZQ=ZLzk&ZNC|x;m})P9iN6Z8;J4Vzy6>y?hNiroSE2+z!uk)bw(duiNgXnz>rOJ7-+-K -)>0HEB)EZj7wSj&$yrG=hLc_eBA3V8>qNPawzU8tZ!hX-o)`@txxS*M}0x1U2of4yPw_??m>D>n7w-2 -&ewDGRw+xD-d07tOK*#{P#cMzdYf`EPa^wfnyctlbysEXuf2d5Cp>CbKwU-W86UX+Vdx+M-l4-gNZ^r -y{}KXt(2JdW4B)NmzXKnjjx~)#@b7q*r16v5ihnNlTooVE@+%VBS%B9Yx-7^J5@>(U_{s%upX|pcH}b -;+I|6CVxlio8l#V<NxlUt`3vpoE0Q+hC5=Lk{{e=y=27~Yzr~bv=H=*$*$kwXA=G+Z82hp4?MV7i=2J -H*HNuI4=+Q@H0h`Q^WP}1!?3-H+TTQu<7P@)!oJEmTWzjz4&+_QZV{>%73b-guzA&t)wT~vIj7|CwF% -u)eV$|1!c4w``g$_u$0<;fw~;Jwyo-)D5A8+qFoQNX!#>nyi;C2|*jyZ_qd@$BcpD(r)NScTi`#ddM` -TtBvO9y>kRnxJ?2vKqYZ%@$<#@MlF5N8fPsQxmLvv@&;pmlnjSkJek%N!8JzkAUlivEXa)Kn^8<?-;) -Xx7(8~(YwY%hphG;3=;jo(IAm`42KQ|pFbY7^7Raes<d~H2nF995}MHNF;N~ueY;^{9BfrbMp>}`;Fu -#4PT%EqpS{l0Iux#lg*|nyq;QzpmH7Rd*Td<vmCx+uZvAT>NbXd@YEN{N+ogz|?>>SCou=H)ICC4CMp -x}c;(9u?4HtZ~#20k%9=^UNUqbDD+Zut0^YXncl(ca%y={L`z3z|x)t-2ICkFA<JhmrhIqOMWIpFt3F -6;wgmmRe)foj(xk)GE?)s6hGM}%=SW=GU+d{E7hkCG{RF6kfLK2zDd6?{*nCS}Fu$hscn5o<MOfE!_W -k`2DIQ7WZYuhuhZ1W}fP$f-K$6?8ef)Pe`hsYF&op;Vd`Ro(^Cuc=pRE#Jr4@oswKwIVcRvNr5hFLRu -)&weYaTA4MBKw7!CCc0zxT{>jnF>3XAgz_-oban8h7zgimV?-8*o*ZXrl%bNzGJL`^SxAuR66GnE<tk -C2O9*@mL>9wSwak}07DATmR2AkfjF)bxKvV)D$~Tp&O$avh*wz9l!pE)#nCZ3_6p5}TR5Ci+V5V`(F7 -(0mAMnD2gSW0R_zt~m`;-k-_g_Nq8T~JZO%=lmvZgTzG8@TQqXGT^(K?pNgXe~!yQH^d^<z){8U){XZ -C30?TMIiKw}G7@x(4?+FBMu&Z)o1j*I6S9IYV@ye3QoV%^y=w^(#_&w2bq}cXZ?sOJy_}PzAEHJ(}7a -iL2fNJ5hmdE+~m}VQFC%ysk}RsK6#(D4Mllkwl-B9VneQLsbuMg{{=O!C?!3t=&;?Y6(mKl|czcFAzd -UCGu5$#890<y{_fd5?u!?C#`J>t7BAU>G$~&R!@h6PE9W2)3o(~F=K(%|CMJlrkg5d7_W|A`&99Swz^ -{q5Wqs6rKy|*P>@DNP!YB0{c!-HcialIH8Qc3vFgT<twao6fnmg2(M-cu$CS3M2MqvfIEKmV#?wGG+| -m+uqbis-3xG!Jo^OSPuYLdR{;|#80Uh5aAc8RT8Otar$ZmWE)<z+qi(|V8NT@daFc8^pd<kXZKLq>{n -`O#Q>I`Z)APuo}Xh6$Gbi>PX6N9+!MxbJVuNt)7okHSB%RYHtmq={0N1oLo65Z&JXLX0fHhN><&d?Cg ->W~8F8J$vqAWmW9w7_ApIM)+0D|`#^3uP=UY6BTIUk2)Q)2)qHAWb@wr5%)1+jh|+PEBLmN7DlKbaWq -BCkE+m`qWd;qyJU1e%n(;(-JMMmibTE@=};J#QQ?g_ixNaTi%L685mD*jSd6+PZ>HYNS5ZFjLH^7*)f -I%lri=o*Iv+%HT?O*aAf0xTGbSqXozwQxTgAG7bt`KT3y+VeEvj12TeGDK~M<+&>8@rO)i6&Qu?J$go -tgOqM{FosY_Hsy2lt;D9uh`Ce5aQ<!*>Bay?Ia(&{dBC0yg1TlUildt=-vmbi0zYkkh|_)|&H$V`R}j -2bLKUAURI=E{?=Mn>4PqP^-F*6eA!YEi~3_9ag5-BfxW82>eMBi{|d!D35L0Rf)XdWXuX;Ek5BQ=Wvb -$F20}pZ`1>GyH)E3{aq894<UJ(c2e=mdb~^T4Gk&2Bmk_vW0^<^&$W3>s!+l7b<8i^VOII9ccOLYj8V -i=w$J7GF}$LXt-AK_Nt99hmR3^WNK|iK@Ht4bya6pb-71nX)nM~+2?8FUYc0gy5$)CRAiQgWY|J-K#T -I6%JGe?O1au_sWm~xocNoY-U&Go;*;uuS~w&L+K|G?s$*B`GMamEWd@C1wY{vK&Kk@~fIo51F~Zf!Js -kboGe{o+O#7d5+N`m%L``X9mMvSN_sBSSt&y>Gh`cPZMhz5L2jT4oj&=Z}0LySV*|KfJNFrdclM=_um -PQP$5^PX2Pt<Tr?&g5Z&|4Rd3diPzv8NK%z$H^a$}=v*qhlQFa<kYrBa;LxO|e}9t5n61f~f$vO(|^| -F<EFNDGDbN++OJ=MFk40B6ho@kg4*L4y5a3aKfeHa>Fj%LAoHT7&W%~xMzVl@Rvym)0v6{)8dr_S;IS -su$O+xKCKiFlu>A#Trm{#i428&JbK?!AChx$$JA2v@Y#{x+Iu}`mw8QDm`YYl%bnN~Su#qJZDsW57xB -4A#pVdugJNS04HB3`vR;Eh5JS0LGQuuVC>6P3{W8B{peh3nW6nqX@q3YNLoPAO-3;^`ir8=ODE8a2{X -=CSt`cBX61I~#p#U>@0E*HVnIGp_#R36%tEx*oTiw~gPbF~6cQd!PwS(~x!DJb4k0H?52x{FDVi`fCQ -!GhV0A8_~j1`64V{j&12au1B5whhI*B+6Ki5Fycohi%UXa&OuiH%Td4Q2?T&b}hwjj>8>&676UH4Cc$ -=sZUlN`&kTWp1H44Te@4uQz^VL3=2_+A!=AHU8*@j=}m^QK&Ki07icoMUQTTdvJl;fBJ~whl)bM>&gc -?jpm^#;E5@)hBg^p0ib11GzC!O=O)doF(=9L)RdD*ib|AQ{U?V$Zh@*38RT@6iwq+%BCGiA23G}d9~$ -A;BEQyhPOpMDT8@Bwwj4meb<2t5o-IdC_h>m(BAeajt{CKk2n=fA<HiMEePw`>%Sf2`IS({*)~HGrc{ -dwbb10CV^p1RzM(s^u0!*JU_YtW6Tc+H-HyQ0_5)645L`LL&YxvJ-SRH8cc;0|u!@jV7B}pXJN(m^m4 -7R4a$>B;^Eh^fCmrAY}C?_1~h+wSyf=AG+shg3+MRT4AS`?Yg3@}rbi_8WphVh{+U}Mzj`20lv#9LLd -Bj?W(HS?A}{mz-#oJPTB_fDg$Fc<6ktc!U7PX@9Cl?*kPD29Y2HJsX4Jw_7DGXYxW-l6g&$MSSs4ndq -Z=_F7^>mRi{jjv1Ly&IJt%VX*$!ovR(j8h2ftl%!<{z<uP|1zIkUr*=GWU-k2dWj!-S=28P<cW`;Cu% -|Ze0?^#nJx^u>q;>Sbo~TrRoO4-U~R0c8v%Y59Tr*&oNl(L=N7kzHA1Q?mJENAs&6u+mb0`%!@$9GWM -<(LbT|1!<pqY~+79Nc!!>ecTvnhKzMTr`pURk#I<S9?%eo|VBl<SOdvckUc;%i2K6g=lz`AbSd#r_GU -@2M!eHy-K-9!EW3nKg)l{(s0pC?kEd7{fhwCf}=$}ygG6(KiYQMImzp(hQ_sZ3I<N}_&Zi06Qhj$?VD -(DB1D>?cK2f*gO;=9&^sc{hR;faVqf9yHpTbiu%w9c3IhlJMInlyfv@)@aQB{eP8PEft38$>=v~lh3_ -aZcC#G>Bv=mtgF8xO%1Oe#>Q!I2a6H%<)EZEaknv6n)#`SFqVgS8lEiFk>gN-;~Z6eErQ<H+d|+j7eU -wil^$-ZgA4aGsd`|DE<IwRB|dn;Gn&Z)W7HG^0UT)=9MyfP2HYde$|+y9fEo%T`&0^7UV<7cQIif~vL -Ia1CT#$uipY;6Imdd|cgi5$)_ql3=yzgh3ymcp0&^&S%0p9d$mByG;-?r?#9IMQ0meu!mV89)vzhl6z -v!W3D6c^Qb<lCVNtDorY4tmHS}~!|??Sb&gKZxxo}j48gdqj`5(w^0Qqb`v3Ag&gAVuTkC)ErCphZAi -aL1Jmvm;f}k#tk*7fsq6%HMENt~|<LdU}C*ZiGa^cSSw}?z85ysPZ=i*1r>g;JLZrTB^~J?kg=7Yh(} -Ecm1?<J9I4EdVbmGCq*6+Z$Qe9IANi?S^6%;|9!8c02fq%CAF$M%Cpt?|8-Q+Tp~4)-!8=PHW^o6*TJ -AFMVw*vbuKl_$lX4eWaMoMbo}(U2UXZ+yw{gtfaW~WS?UTj5g`L?fP>Q$n{l2S7fjW>CJ#rhr`HTa<D -;74^SdA35C$O=QgMY5!xYO1&+P4wKeAuuoZ|HO6LJTzW$5mxZA1_h`EnrFgyU_wQPVE!GP{W5?+EUu- -kSCh<#+lt(~39t3l2$C68|?h4d~9wE2gd|!l;DNDuSn$?+Bo!4I;Xn%ePD_UXsRuzY(_T2{!^-YcxI) -S#uynZh*XHF7G{-vAorH33;T#oO9o1)&dkEAs>Zw8o$(tq{(E*8xEkZfX*+RYGjo9M@mFF_(kaFikDx -3uY4Np6Hob(C~62{X2%Z{a3S8aNhHNG)DzE8fBTRGC3R+l-&-^Y!dPBGo8&A@Cut}ns0A1V^YuuB9>y -yT-*QSDp{{ys?%iWc40=U%jeaq@#ppjx5iDpJ(l^NrVo=Ca{01kUS8GX;sV%;MXIe#N0qIh=rQt_~$) -JEyZ2`82t$R_$?O*w!hH`k+CUH7rHaqNVP@Togr7eOQosQpo3?hsyK1TnDBx8OJgDgr-jtt+pu?Lk3Z -Bk_4DlROK2LBIGO9KQH0000808trnOaNA_I<5c!04@Ol03-ka0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^Q -Y%gD5X>MtBUtcb8d2NqD4uUWcMfW|$q#JgPu3VXDhzk=v1DVtT8lclmi^SVo1QHi)|9gM(M{8Z8ZK-6 -RgnMv9U`cTIiKIqLMyV%u1TFz#{6OMOsf7oybJwoj$)%RZ1U>r(JPs5?z7UPlTC1wUF=MGJI74w0XW@ -Yo*%uknfUaK%WpZ)sg>7e8ni;=IVvZK!V2(#~DwO&SFq2>iB-^V0XI2AW7}CCRUC=77fAsrqj@1`XO9 -KQH0000808trnOxjdNr2_&004N0j03ZMW0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gD9ZDcNRd4*F=Z -=5g?z4I$v<$#e^&V3~gX;L+ZbX7H*vt_|7SOwd)O``VKcl^b&P10}y&%Bv=^PZ8j(bkhm4}(-gRh_J! -iIIl!XHdPiL?(cRUkf<zUL#m1x)D09ywwvEy)YiuvfGfmO}U$t`k+BPl=3^-`Pky4qV%55gTq2NE7b` -*7-8Mo_Qnp&49b5GK?GGjoQMOz7@mco&AuY|q&5t55AX~V&1rV`<@3|mCPGG``Y^aHBC<zsLCp6lPMd -8b(f1{u>zX`%0M8vbC$%cWi<a$MGSUbM&ngmac55)o!@-NewMV<aIfENZG08t*+k;k{#0ZO(&dY8SPv -iqHWKr$_dn`QHESvSBJgrCX&Hnnj-WBq1L)<@@Gbr)i_}LcJ#^eaM=$BQoY9k?9?TUWU^U&ea?@T*og -Cn6R=4rjy33-h$nYKRSJ$(A{K)fd2{w8QwQnhZj^K+Z{%F{EQSx7}gB<fi_#WONGQ{4)DaR-tpSLB=c -2}Bg}0~>_JfHPV-$Yh+s22nyx$FU5TS-TtqSFP3`Jx#s1@dX-|#gxY&@u)#u`hACTpwOY=gJrfml1}1 -f?S9ZNaYEih`WTm||26M<?sw5VD;mADGPoE2g8oxB2qp)wAP4Q!LOt2jI#`9HIagu^&Pm&nn)6^B=XI -)$E;iL)P)h>@6aWAK2mnzTaZFI=sVr0l0000I001KZ003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7NWM -Oc0WpXZXd6idDZ{s!$e$THEt{CDJfzjgjR3HyquXh`;4F@cTdpHb+Vl#;l#quP%x$M`El5AO)<#aPp) -Uim4<oA)H*tro>6Mbz!EtvbUZ|hPE!PR21m*Pws*5t)2)RmCAguh!*TIIB&jRvVmr}WEq`}rsLty9ZO -QEMqU2iXff)A9(<{&O#9zV;#?SgEa8x435<E|NA)Xod3~El(eD>8o2>EEXlFN{x2t+{pshR!<9p5364 -(XBE|~J``urM^P!VAqsT%ZTb1jcDW|Y4==yHY+sgttrk|Lf;}k;Rx@1`nF79F6YKZp4^hL~ii{q+Sb( -Mnwb{xxDdH1RSm)<VDUb}^{RiZn#1UG_lxF3ez&(`*wI=uXr%RUtYq-VKWr>uniHUHP`+!6JK^<i}@H -Q@9BIE#I7D;+1QQE&RyiAadJw^V>tFaoT$ZQakXzb3wxlO`kHcHJ9z&K?gcES5PQue3}uY*WH8-=CQQ -Kl=O2@>z#z4PyXqBx<wXimN;AR2SqeL(W=g*+p7MNPCo>sUK`!n8L4-!ZjVn6*`Nz)-a5-kd4bh+0|2 -3y>P1GNznRohRKw(cUFjF=VqL%TF)c<<m5IRpGbT#K7cU!dlC^|ErM|+$}QnG-0&_-OAdT-?fYnvYF3 -wWF%1<^N(pjg)4GX!K=kc`HtX1c_Ih~vGlO%qg93Erj_lCdxFhLiU!%CVWiw=vJ=hQ2AdIN6YnOe6Lr -N5@{|{yZaRN~vnF<f!dt~|X*wooXvF5)*cyl(B|W0J&v}^0kCZEzA^y+CoMnDTo!yn3=?Q!EP!6U6w9 -0()+|CCtw@0SPg>g<y4YdslaBhT^tttF-aX6EW&`@ivTz(z8kmZYaVXhKtp@XP8%m1M`?#Qzz4Xv+3A -5<6*)#S_$M@<|XdLBgvc7V!Q#`0>jAo?VPQfwc!+*I+5>(h(o$XR~P`t=Fx?Xq<qzBf#|J~YG;`_bFU -m8QB?CNJ+Few_MqN4^3%w}|kOzJdWv<0j-~OAkXUwD^{yMVg#})(Imvix*g;i5)=gd_+Jgmzd3~p-(4 -56pj-C@`DZQ0Pbz7Iw!y43q!I=Otc|0YF;QhhnYtV4D<;T9fCvu#Z1_Jnd&~O2r~1$-8!A!A`+bT4To -@4h!d#@+YYhV3v}7geZCKyCn$yuG2L=%+9FJmx)shSSf%=CQ-O!)D<*g776vFn6Y7mnitTuCeC-56nw -0{9WCjyw%e8=n0T+gCWM)jl{$+`PN1j>P0eO6Q_yHTGgw+hL5;)NAJVsb*C@uZXG-?TfpBtQ<r_lN`F -wtcdl%hfy5m@AT*A#E**j<f$oh3jE2or%97q3BpU+7f@!@&E8M{i+VzQE@S_;JdD<SCyxk%z`I-YUf` -bQtIR@yKE>1dctF^cMqH(x&hGuoAX{L|u;HrX!^hkTaINa{U4WQ0*D28weJAbDSnFA#-Io=%vRGf8WX -*D$RM6HuQFq=ck)K`!@t`nV52O`X!`Fd2H(wROwb>2a%%hWJa>!P#+M`O^~d_`jq(Qu@|$1v>iuQX%} -v~kxgR@Vsr>};(Kk%;bDFgyOGgA@N>Mv2n93dZ$^%pu{ZSmcRO5c@jXk)h1K=H=f7y0OU<i^vn1H)4z -Di#l|miuDeW)X5YB5sI-{wHb>n>Ug6^g))#T!oxN;P&<a3t|v(|T@9N)(f4A;QC!cL2GxK|oQ_ldoZZ -(?*b18ObJ8Gr^z1ERq$)tb{&kATQW2j%eNjY-=vCt`Hqcg(Ce!R{6Q1yD-^1QY-O00;n48F5S!s>bjv -0RR9N0{{Ra0001RX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eV_{=xWiD`eol(7RgD?=@{S+rABBeY)qzwI -8B1KV$?#Q)|;Kta<K3YXl-o0l?11uG-2N2wSzs|BuywwOwDt`L+4^#w?uRExG0MoP<8+2scaoC6jq-~ -9r>@0zaAc5+DQi~`n1mhkWY<xI_Hj0dQGMo#Mu}Bqsb6ZVpOzi`~-m8-kLRlFjJjsa9NhKeAtTsXbA6 -A1SQXbJ(YdGPV2XH$<nuu`lwEOXjI$w>rIK{2uQ`!#y0M}@d@L$Tx`Zypbpq6vq^S*FJL*9GxY2>mr& -QMw2)ccRr>h|E>G(#E}mWzaK-zS@xjkF}mqdOk>W-r$T)gpDljT}W<>|5*&EbjQrP(7L)|IZ8-UCS@b -FHEr+D6Y%y;Wv6yrDcvj3e6Yh9$Md~fGhD0P)h>@6aWAK2mnzTaZD{dEi=6U004Xe001HY003}la4%n -WWo~3|axY_HV`yb#Z*FvQZ)`7PZ*6d4bS`jtb&o*{!Y~Yl@BI}4FAB1YH^HNz7m?w8)GlJQTSA)2{P) -hep@Q}h%FFxu`b_Uj2i-X-SI}sTbj-wSLZC`m?WtXuYKLt=G1&I%T9x%1{0TW{W5BQpdkWWx;1fuH`} -^<!3@+#TAR)<$8`dRj_WJE2Q%u73JA89E?DIkUPc=qyBq$XpDMI9grE?R=Q6dFz2#Kq1Pzy&q`x|ki? -?#5L6?PYd6-=9&0+%?SjeT~$!jCpz=49F#A5cpJ1QY-O00;n48F5U<V7cB14*&q*G5`Q30001RX>c!J -c4cm4Z*nhVVPj}zV{dMBa&K%eV{dMBa&K&GWpXZXdDU9$Z`?K#|Gs|(Pe!oX%dYI$fv;!4?WIlv1W21 -ANv|J#?t+%MyQ=l7Ncqvj{qHw3BqdUhjolUp+yaU9Acw<w{${8k2xgymg6)*5vh@0x@oZbxsoLd|Rb{ -P2!Zu~i8Y$QvJY}``wGmRuXcoZCG{-S4E4SOU*xK7#*sGXlqDXjc?^T+M*`_XYCUTx;QKQmKGV`+HwG -;_gVy%9g=}}c$MeAE2QPxqrvQ%{wtELw1%nL5XyF!XWrYgM^uhUo=0#VFk*qs@NFD~$bc_~Gm@+|$W9 -q`FMsAsbo?n>0`+-@)03iY0zh3j>}bFp48X0snZzJnpPh~hG@(oBSP@N*bm{(N@$&B4|4#o6MU@bD1s -@%FC^xV!wBuEKxerFnJ`M))@Xdb31qv?$h1ordslaW-S{19|^|k0s*_7i}c)#1!nV7F%)8wy^Vpr3HI -cRUonSo_)*84g2`^f}Q;RtJ7#kRPYx{5J4`Mj5lhB%6?eFifXrHAmJKrHZ|YoqEHLina_&lg#K>pvZ* -AD0d}ICt9VCaBK<tngKGh*Dp;r=UcR_mnt7Ke-Q~;f^0d4B>I&r%XIx4~YP%>4RhL-?8Yr)S5wYq-^9 -r}FM7`m$V5($NfKoTsT$$XJO_ngShJ=AZ7p024&7j!V>$FJKdL2rUZI*iU`S)cZ%=KC*zLn>n>js{*# -#7S}!wUXzwlTbOJrP%Ijn4?iAE`;(@%qjm)~yGloEsqBnJv(!S^prZ<pT7ZblYp{tSIX|j5E1pon;v@ -d=Ia*H=t4d`0+i;F|Gx8B$%A!8^LbG1BC+|K#W@H{TXJ3KTsKHhG|MhPaVCEU9v2mLR5NlAB#$*Wf2A -+itK^$YguNE!VSCwSE+&bEGzFs65)<v<!3Tr&uI6ZN0{}_%|(P0YDZ5k2QZ|)Zb$XG$4&dJ;uDw}90u -Ls19m|+nSilA6pG)oYY1ZrD~uXAZVEkEYvUce79e`z%*TiW5!6J1B;A6gM_>#B{>3!=G&+usk;W&Lu+ -!71ooxJKtwlomVZ2CK@J$f?Ql>?C>1gh1fttVv?R+pNP^Ot~r1zW!XNQLY{O!c`++AtrEKfn9qq4_pw -L^gEj+w0?1aG3&x;xc&p;Qxzb^I{yy%RhUwe+2!y{1^(89Fm_?JTo03ZH}MN!%QSNJ;XRXRzm%l=YY- --E2e+4ggm*YUozTXmoKP4m3ct|Nc)Wv^ZYt#o_s!m|7X8=B@?KDafo$tej&;Fg*J<>5=p2coyA_o1z3 -FRv5a>%gc7gRU`pasBpfVFNQPLD62KEDePT(@A0Ra3bN_tJ?8tg3K!PhNSyb`3{o*G1n0q$y;xi=24p -s5x{%w=1c`fEy<mSi*Yh`Nk>GTH=G7Rx<utP);(<P=$k8Z2IJnQx`8hp)6hEzbpy7pmVLtcyUG$wr&z -|`XmaL7V8s{)~6VCBbQ{pzE0v4-E0ARS6R55X%O59k{`OlJ-a9!U)$nNv=mS<9o`$6mbl=9kKiNU}y7 -{PV7Lk-!YL|ix9aQ?n5Z_q)TiUk<;U4G`vj`+fHF}u)M*sx35z~RR7ZvoD-vQa1jjmb3dNCA_gEFc(f -KuS9X0GE62T9hlz5%L$uzH9j#`e=w6f824&0y{l08)DZF6$DX{^jyvrw&&mToZqkb)~-)!AdWBF$5&{ -YM^9x7X0Ks(z~JWScd>TBEL}?A5;4y$s*|w0V_2C`b7=wJonYueOqQ5Nuqg3u3B~Uj6QcTX#1ztvJ0q -10LEb(od|#SfLV(9?dJ7i8uQTz;&0g$8e8cW`0^J0iDCPyEeDKf~>m`oo$ja`bgMtuucp|NtE*<^{01 -F9>Zsv|tQVVrPFnj5E(4b@kTNBCByiK=|b|0<Occh~ozZG5hI5~Q;v=d<GX`YKD1=yKAMC>OJL0Qa|L -!uBc2e7F^<0zZD3qKfKDbBQM`uZ>?lG2$Eg+h&f3Dqe8#(<bWO_8zEVD^Im5LUqcB4-{Tt25`8QPC^` -^Qf`}0Fnx|iOPC=xKnv{Sa0IL9iO~7kQ$1uPNSF6aW~u5e3l|6Kz*Y)VPmz>u>y^pumpGxJgfkUcQqd -=*&##7!}wVvX`mGXY^#wCWQ;Hs%m$1_<QfHv5b_sSjYNM3jrit~%Pklj`nrWZMt1=WW#5&zaM=nidk8 -w6%so2hHxJ2bkWNDN1-LBMJfNEm;$IZmqGwT_y8%C=_J+%L=4J(OKGq@#Y0qsicZ7i+VyA*d&5^}9J) -MF;7)O!+{iC#^egZ{drl5@jd7QWG0-BRe(Ig6S3+4=gppi}h=%}IOOm$1q0-_<*I)j0Jtoos;w~h|&f -@i?J$JTs^U!2IP7aI$n!xi6Ibx$q%sPIvgcc4q`B1QP0Q=t*p=WWA@UT^cT598VfQ)t1eR;~ja9W>C? -h}JQW0cpr+A!IUSVMWVL!Hx?(jo~z1(m}|?31{qCinyaA>p_UmA6|brW1k^<2@FA?dq|c|PQ@*l2Uo` -NWs@oJ_AEn%b1xv_4-}E5*C(A7=~hVul!0o_AIL;u>NPb+(jpcRkq2aAGO4OAuOT#IIxEuz(Tw7SN_8 -9pBLQfn+i@l?4al@yG%zj0(0_vxgufKUQ{~pAvRdy)U}MND0UNCIv=AC#6+$|dmwmF%(v3iy0P07>w2 -Oi@cn7x3w>kH~Vz2m{L{D}H=#%E!!BJ5vp+<*dW#LDKQ6?crg+mhiJnXF{!&)+gl+0vpd}FbAii<@rZ -7XA$kc=U98?s=|Btgu)V6o!9O0hB96O_m(K<by%C8?c#KH;jCKu-=p+s*_FN9!J9wT}GSNVp#=42gyD -?qT6JrX~{<9LmFp>8UB0Qj=L8)fDVe(<4;%x^)PRhp`7Hg;E+jcdO^AGFI+PwlxljPzlURAW=x}b)5n -T1b7Nj=#ICgo%QZ$(k1!@4IrGMVkSLckMR#AJLv$n6nms2Oi9>%FR1Cr{)yP^O<kAuBlmRFtGv=;MdK -bXDwwj?;Lwp!OXljyY`XN0yte=?l3yBwuwyr;J<ubVsW<6&m7JXU{JbN-Cvd%@Wgr>2i|Ej0H})l+O{ -G-Rr!aNO#(;ahUs06JcIWD2L}g#Qr1w>SpB-<&H3A|Q*s^8>`Rqft^Jgh6O=w}rR1ZP8L`Fd{lm=p63 -kr-xEiy$I)m5exE7%)?p>ZZSm7jo6JzM=Uy7hK2&=pB&&@KW&0iwXti^><kf*K818ld{MgTL3kK-7z9 -BojraFpz%>sDpNpp))5x4bdhw#>yf|sj-`xhNhhCjy<(g^|%UtvQ5zuD#YEoD|6g_v8n2OB|W7gny7I -0RW}Ydm-Ba<6(-`<cX%|2eWbQSJb&{UC|wO#$hcIiyiC$fDw3xy^_`iu`h<|yU+z7UwFBIBjp7|zy}s -z$+N!VlWoyGrc3mb9{UboPiTTQ&s1ry+su&HrgY<SF0d&IrbjWK*Kos+l{OBqN>@9{&dyap`UXyog{C -a$JiY+pO^$`)^yKPCRy&Qn{&RWP%AmT%DRr6xo_8p{e_}D#J>+S(y^@JeY<?#_9qvNBKB|E{ZlcN_`e -cL4LV7d+_w2aexQl$B$3F1WdtR?(Rj%1J?6T<=H?Cc3k+M;HjqvHzeFMA#_GFIYHxSro)$tDVO(9g;4 -mVW;WTd$nqF%G1M)q7EF@emJdN4MnhUSkZth3J!Dge=fHu<M{feRqzI(G%Cxd^p4$j_3;jP(6+XGz*p -rp<Y5*TT(%!({EA=Dj<Lk6tI~19b)n(tq}HTvoyBrmWV(jBsLtJkHiOR3u3d$j5ZnA>de!`*u?&z%RV -Kij2k6j3%C757I^*yH?*5YuORH3P#ojo%#%(gx~co8`FuJ?_s33NeykGRBG4){Uk=$OEygK4knzu8yb -1>MIhu>#>o*0>j^h_DXd#4MV3<_cfz}nO(=1xkbJ&4S?2Z-1F(p(ye4#P(o(i0~__fC#q}B%K-k}Ul5 -9a=X0x9y(TY2;}Xl&t@D0K^`K*c_MYdeN?wAX1?BWu(|SwM0dT_1ms1#6>`uIO5%1-lWV@@h|apM&pd -aK9aF>D&9h4PTf%oiy}4(MUJc*%Or4!#vdPaF|v4urF!y%7J}7Y(X)?C*le1RickWS~uav1EyPPPET| -duRkAwUFt*8UQ)oxud#<}MAOAw>fQ8{_1F=?xcn+Q6yOD(IqA<H{^w#`JVA8r@vZ085&&UNNlZm;E6g -E7=}7mWjW;^UbdFgMbwcNnj9+8(pV~d{@#I0rL{IkS_~DE8dtjq2F0I-&a@*Max>w*+Kr+X@Iwsjx%V -LPOY4B(>Qz!R9vj&$Nl9{#>Jg6f9nvVyNs>AunNknS_dyL2a_85^z>W}!O{q+hb+dFOhP;uKQU1ILa1 -urC;iu;Wsyyy`z9XA|J=O2EfXV72WZz}k6ym~$Cus&6F<)+vB{r^)K)_hGxP3QKLnEkb%U+{fEP=0ds -5_L((GvHJ31ZqoczoLX}FrmX79ED-gslW8<y5XifCHnLi@zYXQhA3})eh%QbUp*QdD)CE5dvJ)y+(7D -1M<h(HlDcdK!z$bZvD;E9VYk8MM349Pe4*n{=tMi&1L+}RE%~X$G4Tz@@YBrR>iqzUO|dlTx?=r?)l{ ->M-Z`QCy?_YjXwxd5fG`TxK4|eRT8Y`E`;7sX^AjH!BsJft6+T<xsOwa&s+TLLXSF&$ZNENv8NKMJI` -pwAhu_uUCnr>w$)>7GslTrPGf8?jOV*Y18#nnmC)c_*E2y4~*td;}qKJw-UD=~E>cS7qQZ`-+#r5#>I -r@kSEL*l`g|u>>Zg+HQi6@d7ejpGVXy(#*sPLl>=iJoAG52xSB%u7R5cj|1>lbOAwOvh`udTQut!&?F ->Fd1kX31{#M~isn#^!c%szffsk$?$Sd((dRX!;oaeT<s>K^tB;J3cz15N*ST*(SS9d8fO{4O+m5WL*0 -FSk=DT7vU$O`WGU3k0mFHF9w~w-q_iH0Z>Z=1QY-O00;n48F5T(CNzBc0{{Ty2><{m0001RX>c!Jc4c -m4Z*nhVVPj}zV{dMBa&K%eW@&6?cXDBHaAk5XaCyB}!EWO=5WV{=2FbxTkSfI<1Ne}p4N#zHif(~DbP -Iu^Mi$o;DUehg|9#(3wk*5B0^P&<kl5Dn&6_uGhHirI$apec??a-W4vFKhFN?)OTNNWcDQhdGchAQ1r -=a?t!^&4*Sf};Fg7CVzxyk=Oc8H|?7(y!e!PTUw>1hn7eQR_}dxNONO#I5>kXqxm6j;?{T=JwcR5dgW -hdWY0*thH`wJK2q24o^>>mwsRjadA~dPs~^`bZVurxs^8gK6&)yA;VcBhH9kEb`MwAgGjrselndo2d` -}%^(5j0E18l2YV2nnZa1i@%UeDCL}@)5$8MZDh_dEps4mkWseY1dw{RXa!nTX3SJ+$F>e%6cg%3kCrP -WcHZ?e-o&&{J)qW2x&OD1r`242khRV`7lge@x**14j{ce)u*e7|(!=fyq0Bug4UahYmqh%W)Tz@^uyP -2Tp`L~>e;6%Zxj%TTFp%v4s+72oh&fVCmP^m4WL)Jo4;~n%<E{<(FlQD6IA`&UPSBHp*R1nI5^rGfOA -!}5Y**?<2KA2aPcn$(?fB*OofUMs~vfl3mVd!)GgaNvC;EWTL$w`!(!91P<e+j{d(W<az?K!$-f-_A7 -!|aimynvf6%4;xjGZf<*=^dlj0agw<k0>0)3&)xemAPpZSrUbLIcKR_l`~fiCL+%{XcjJ&w<-1U;r_n -%Iu<?V(7VEi?fr*)coOJN^F6=8pfRE^v1n6gZ&mW$580WfF>v&RnH_UvaoL2`vV3QQ2-oG=cY)Io+^N -)+m^ZuU!rl>Q%5nCy!)D$};c)&i1DtdzvWw_<@6NLEo8~@U_3#p=$6PP|N0yP@w`aJePfTBiC>D}7YN -gR~I0~J2#e9@retvnN$GXPu=otRpZpAcWi=rs5b$wPg@=VK2^IAjGT+jI>)2oN8^C~IOw>&7T_4=w7R -0qe4@3WUh|4i}@4%G@9lRQcbdn2Y6b7vFet6&C%>p>PFRMfkJtY_@hE{;=>hvMmvY+yOZ0iMNQREj&r -dcB)3k5krhl8);P+*)t*LRK`nU-*i+;|-PXt{D*K48dhtv&Ev3C|?)!kyDcBi+U^2-^DTILEHJ<%3?X -LAbEVX53x~zQR8M#O9>EU=Yw3chvF;CIlFx7w%o19jjXz~k%zOc*D9&==)%G|9D)D26r|DnfHk#}GwX -MJb1|Xo_uMlYZ)TFCK?QN<&!`$MFL{5B@+|&>IGEuxZ8r2FD?J|EP__IVKD*^5!CM-FwWd1#oQPu+^D -h(mA>iZKqo+TAd&UKk-?OW)F!E0fG_W1qu6S=(oGbmF(*6rjO9KQH0000808trnOb%2Y{J{kP04)#z0 -44wc0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%geKb#iHQbZKLAE^v93S6gq}HWYsMui#u5mOWdxW2eQ8 -<)K^Kr9jhet%G7H0)dt&n+-*3Bo)Uk`rmg*k&-3n()dBv<=pt4%SX~I7gD1bGr|)rJG6Y(G$Wl(Dn*7 -!hA9gRO_@UOYbs=hb%He+p&Uy^TDOt@=9JBovE?=W^T>Kg2-CRJS-rh@9lg0&p)=I&;SuU3sJBMFe^K -vz*}GWwKB2!ZR^3jglaLgV+nh=g;ZzeDSOX(#_3XXiWU%ZY_?c%gX8(k&oQ7QNf`OHgL>H2m62BrBhq -dp8BQ2sW!HMyron5C@FF)|Og+^tQfvCOHMb1bt7!1H@%&=1E53I;JDI`^z#(`LWC9$zuh6`?YSaQlYf -g&s&fg_a*uKaq;uiNcb_aDnRFuK8vCTMnh>-A9?viVRDFsx!p*XF(65=e5qC6y7Jd@YpD2-hm?RBu-x -=e;AUP%gy{O-O>Y5C}6ScHWgjj9wEoo6Rfbt=9Q+G67MhLP~TR3b~nVb;c$#jbEJ17ta)|n+iTY4Nt= -b+HHv>Xh#qyB&p13VY19<Of}mhh4+n!#0{+PWP!G#knqHk@J@_euKKgt6pc~$<AH@w8nV{y*Weeqt=b -Yh^<WMzt*C{w3d-rB9o1We`5soY^Dhseeg9$gdI<oV2+luTzIz3D?(iPEipQ)-2vPzX<#RKUT2%VwPt -gsh=^i4$x*5g}t1`t2TJOt*GYaV)Aue>w3J8E}BvLC^CAkXv0Ytz5sDZ<I&i41?RpOd>V4)?AXxM_gQ -mmn(X<K*MSb$dveZZx3&{7&Slw94qk5SnoE+pT6bu5RPG`(9HG6~QkGkKORfbWm-d*7wFzr54xj{_VW -<la;@O+Ik)3h)0k$qpKm#ewhBW+j?c0+}z<ZHf$YH%}Fs!Q|URDH>_3n-<`kgbjO7X_h+azG57dedn@ -o!K3^LsV0_gm{;Tyw8g*l&FlVEGiQEXXHCYaXeWT>s<YW(bd<O|ewJW7GXz6(_htF~YS469#p4%v<w& -T-C+_n-%C?2avEW(?W=-_-Vhz)<-!2QMQdPz4((X&U(8tSSID~mV9D=p~3Zk?!yat>CIi}nUd_&tgky -Ipg5mZ$WMU+z=MK1rt;q~qy_qL}j%n*JJxs`hQ*u5u}wUfcojA}qz<zx9!HkyUdO2e{BLM`^=3GA)2o -S96PZ1l3w0(KA-b`L;sZe|<wdn!Z~Q)P6s)o2a8VEF1N`_^Rd0P3m^-eILLL_$+ak_YSHtsVc;4KiOp -o_a8oaI+tw6v9Mn9A6{Bt?{w9Zmkr`Z!osr4>FrS`|$}|f<<@|o>(Q=001;`!A$F8STI(C<257YzQ%F -t8wfTPw-BciC=n32AyB<F(b%ntHdG50Tm_;al7!q4Cg5$DiEorKYy%>EeEDgTh*(WNllA0$wfcKvy2K -3UH!uG=Tnf8ws=E8JBn;vt69xN{m`pg)J0h<qFl@Dm1)CW430LRv=Tm$R_=a(wKb!yd!n(NRHgIRsY> -XJqs4iCmsGKauTiG1Rwt5UU(Rv?2E#iXd2r5Pwij<72gD+L>oJ^-9xXjIEVJ^={Xl~xkr?U}Sn0JfmD -O_e#bAiXx>C9?h{Y>NDIsVOuu$oo=dxHpQHO$&P-`H|^y=HG7Xak`o_fOJa>QVYLZfx8olAft-vptCT -PsMNf%G>mzL;LrcX|BvQS6kvy(~c?IXOhEXS<vRpdUP7!k@wvo+)Aez-T~p#^4w(Rh}jI8wKUDS505S -ZPH2uXZ1h3xA}*wa&1{4>W{nxX4W=V2KDMrFK~Fn2pz#qJjks#96tcbLM5&0;v^=s_UNXwdlO~!V(-& -~~7^3;}>2%OQ;0_bNpB={i=;~{ta|hF7lSfQ<KyDT`rDbZN^QY?as2y%H`_{AF;6e5}=ws){WUuo-P) -h>@6aWAK2mnzTaZD0nfVe0K004*?001Qb003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7fWpZg@Y-xIBE -^v9BSX+<VHWq&OuQ;p0Lei|N%?-tN06(;8x|;$`ie`{L7>0+Is4+7#rHYiNZjt}qb4W_2E@NkF1Q}h( -kLUWGb0qe4)o9o<#lL>F5cW<~-PI>m$?p1(QfwECqN(;!i#pvLxXi02ZTN33S6Zb?H*KcdhAVJ8UL)# -Tskl@^iv#~&WZD6wS+%d3?iT*<_V(vrxT-5$oFIDkP~u<Bf7cs*todTG$aw*q?bok1TxM0yH`}A;D%! -?33&3B)@m%S&NO756h40gxo2!7SOo$+!fkL?>H3XWTq*4bNw7U3D5YGVhAff=FgjAZz44-<6xCKv~WC -gh($KYVA+$Cc;6Ks1GoGs>{o-)SZBy}>YwFUxZB~uDM@J6sw{K1>3+J54hMks?t=j83a#?8De5^zyN7 -oFR;ReoH)tK`s1_U&fJS<V{;%ekP6x@D<b7B6}PbOr&VM}V+T(DXBJmi;Lh%Pfzas#zs9mwNdFD;4(u ->30S1-rv5tfp5O~Cn$_~&^yG(e>nmGZBOBCxQ9xXM<_Wv2zd`ek1*_S$8rDm-x<7xypo}Y9XoJf7&J= -5k!#Qu)J=8Zv%7^(;X9^8#>(=DHsnQxa4m-4{p|X?jAc7cx;0gq7NX>j4XbP3q^}WS%d&?b@Y%2S*<C -V=VU*pYp@B)@ML`*iLZTH(+8qaiMKxqzq8)B`^OE1q9SCYiXqjlTR%m69B74I2IE#WuYBDYzYrM&nxp -v+Ivt6oo&+~*{%z~igZHXkv35mfS0o?&>?s1#NxMt-eJF07_G0J&9?+S@VFy`Hyf*Os0FMtwh-k5i%l -u0Q;?$W`sJ~TH)jgcy<^gBwyx9=ko(hJL+X@(2_9PAFd?ZM6Hjd@ED_-2Mz2|Jl?aOs76a!R|&0{TTh -B|gN-fFciZJi7^F2p$qRkgdkaoC?kNDw=MblMqQ)w<KVXVxP<`Js`HIq`%fZnpup@pv>AaVf);HE9PZ -t&{{*8=*i5|A@}%OhHr*jKc8+tpCaN4UgJ(vl%Z-HII!jj&ZdK~Sq1beSX20X_KDLz_kGgw@Q_Avnc% -s{(c|T-kdVT4s_IhcC``hkH_82WDIGS1yO~(Ytz5bbW6gRdK78F)cJ0~-XG%{WUiVx__Bt^oBKA%A#( -3J;@1tiw;ybKBmiqY-(;f>hM>cY~oD&cI_~HG#rwl#Kp9^_I{x}d7$x0hBfn!~Q!_<&n9{DFua>!G%> -lcC~NIz9VMyp|s46<zbA{a&-^@65{Lr<$I4^Z2f+Hyae?j%}*)~Z><bk(S3goh^(+ytn%!V0i?;77H* -ZCXA}l6cgL4Oe)#>-f}rloiV-y$6ZmH5*s(!LL4K@kbtFG2U`6;U1d}X)4~n)<-HlP!$HkPZ{zKJsU= -?HL)L8-*e5Iy+AiU?ywJb#6yTwz4|z6%&p<}M~tXbe0flhLht%p-5f``Nn!1Z1O0I+xHSfUehLWwd&X -;xL0-1}P197(1O@?2EIbQ*MSfxryz7COB^qMZfI^kwI6!>~*3?cxQx6rjISdNwtURc?vMn8$5rIMCDl -*m2&I*|8ob6NJ<OsdGdAWvvIQfF1<W6@|;9o;`oz?5Vu9xWqm+gLwYpYgwPQopx^tLz$Vk2kYrLphot -LN+K4C2LsP&fx=J0cVUwI(y+3VW`1Rc>;cUfBS2@;vQum(Iv)Oj9#&LO$4-1lSz@eD*m=5pmCSgivuD -4YOe!58on&*tU8uCa$ozvu*FmzmI&_#hPQGXl179HJ(ffPI*<9Bd|{`HoW9s%sfr}$zU&Vrl62<N)hi -pnOKzO$VbR2rv_}C@uoe?y_^q%;3Fngah#M$>~P61bb8j;QHD_Hp0+8G0AKbf{`?Ad@Jan6e2S@ghB= -IqC{sHiybf(?IZ*16-l+YaGpWd!SXhWsx=iwb@}5D2i$|kdUwg?f3TcdOu^G29gipHSHz@PhrpDX-rX -1R;kzhLzUm~(M@|64}#h^-dp*t4MniehY0XfO~C#Rkuai)1v#;&>zWkt;{mU<!$13v9C#;Q_JylL1Yr -n!}3b?UCyX<gNk?Weu;K0mZlzAYV8*g=KsRp_>b>)7{_uS2LCjE{mhUzt*fBpD_UhA}Lc5N5kpKJYvo -s?=>KL1(smQlAy6@4D3DX$o><^=Mcj<4ySG_E?{x7HX?@G#N^=fIqtWtrk+};W=1RgUEh8ibrr}B8H! -j$fy!tr0{KjO(i9wv4<{jQH%w(EUBAorNyFVZUo1=?JsE;M6DF2PjnCoR&{|9Zjdt8x>RRd9OF^k5m> -=QX{z|h1~c>G$y^ZPSs{`ww=JP+Yx61148m<um{uAYqF@>SLg#dSRY-kR7*AV7pXQ<o=#u^$He*P~Q~ --wGQie;eucz5G?o!Q1Dp$asU2NiR(E?Q??uDd6%I{frw4r1B9~)U@H!4#k8AD>>vTE;l9*U4Qpr~rmT -;G=fj-?KLPvM08EIEBx=qj2kUxsPDn7MMLEFBqis@?Mo+D%f;G3(NOG)--vJ6p=1YVF2E=bTM~q?39& -uB1~HUi@tp%+z2NF!KeqO>V+47^9Dle_O#T_|-a&9BVO6+L$V0E1B#2%_mf_X>n?~rvbaN)KBa<{aQM -s?A%^2=+7<gKEa$DBE4_9{UGT*8-IlHhsLu<&P<W#M0MXx##SK_F50Bqo18i8;xK*D4*&m9Jv{ph#_B -IjqrU)9O9KQH0000808trnOpANPLc9O~0P+C<03!eZ0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%h0mVQ -_F|axQRrb&x*~gCG#acRmH1m>Atn7#cfw>fR7MD~XCZj-{Wz5&xh@Svc~3_wI2G+MegCRwDs&(~lO3S -4y`~*@4h@k6B_(0QID-*wbhVC}XUK=Flb_IF~VgKEXh~>;QM-2S|OLe51cY9H3F1`2pUUwBXS=GCBZh -$=GJi<#Jn$;YAvNbp`V3_hK6p`m^J6NxZ8gu*)0ED95l{HH&koX^DAn{XimViN>-hl5CB7jkpsNAO!L -_1eW~)P)h>@6aWAK2mnzTaZH{aR{YBV0040T001ih003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj -}zb1z?CX>MtBUtcb8d3}&EZvrt4h4=i5w_REI0Z5%HDzOv^v2?1U#3!uYC6VK!@b8=CI0OrsoX^is&+ -a9TP`c=!*aRL^6on^GL5)$lZVbxnt7_fzKtIm96D`8eLOv=mba9jvyT-R7QRc}Il^x;z=K0ojUE^Q-< -935xKom~`jhHe)i}l?T*EnIEvf^aV)TV~$erpPF$ZCgy{2Jdy<!o3GSaD{H#A!}|THd>hLu-{Vt5zi8 -l5NhqG7pR2_7w7*A1=}U&!;$4^!gUb=4}1}P)h>@6aWAK2mnzTaZJId2LD?H007Jl001oj003}la4%n -WWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1!CTY-L|#VPj}zE^v9BS8Z?GHW2>qU%|N_DrbfgbXx})2(T -ngfC6a@q}j5fC<IzMMT{j<An7<B`r~&;QW9k++c15xDBk<?+>sVdtF&bmH&rcG6XBQ2OeUpP4QoZ4W= -|jsrPEsF>r&Lfg3vXtuW<dkWZJ9?q4)JZ(Z^odYo}?>^Qsp)=LRn5L%*w})vB&RcOq{4qW?UZObRGjW -+2~a$W#k5+iGDUA=i>OFlS|>3YaY>44*gb9+;B#j%~TL%qr%j>BUyUFw&YcqZnCY!ZIO)gi|6*&Q4kL -2g6RWV(Buwzg^y3f0+aa?$gEX<=Gwk?iZJTUR<-SsB2boQ8Q7ZFL16HuQl*u$KY8QYn<n;_Z6&pJr~W -9gzb@2GwG0wX(1Qo&WFE(oNo+}jV?cs1}lTx+&Z_E0`0fl7=|kNEf{k<Y6vckGW~w~N?u*o9~6_yvJz -2ITV{4mE#%rz0Ide(hsD$yP!dfOv<+Vi`M`K5>Ea8fFt}ib%K`!L*kbiv6*%*h86w1bB9FPXI#F1{=` -y=nUM;V$m-o|v`e7cOL>K;2vU`Cf-WqiO7AxLxy&fpRIM!B3u6M6^JpXuecKhXZe}2F7b`GV|4h5Hz+ -UP*M2)6=iK-zH`$U)_Dp*SRk38oM%?E$oUH+V;<8XEO9^uf&S!E+9+Wy#0orPfN%+48e{i2{Ga?mBih -8)F@;E`pA%9ZPdA*&|7qwP+cyaE}6~lrY%d9uciC^Eh2%8qpO=_fK6DQy5FngE7r>3_{65SfL~$(xP? -h0lNisL&p0uI4U_fk!{X1+Tt=;0xE&`wF0y&3=}D%)Hl<{idy`IR#-pPoH0|WO<lzO>Z71AJHDeBG6k -B}L5Kyy70=h0cxbS~&k?FyJhg~F-S9dDScBbYNqS}BH47x-b~TN0jzK+>Ax)KIJ839zu3@Yc69IDdfk -qwoxU1D8<TfT#UMquKDrQ3fR3#k0c};_aX1W{ANk78_rQCSVgcLT*5(9NPXLt^vd8Ls_)CW(XPp^1wC -}}i937?**llLbl^WIzkpl&DdD+&;OGW?biE~ht&u%*|`h2=hA9K9KYB~~D8h~6aT7&55FTZ>T`E^+n; -uQ%XYCz)PwNutD+k@Y=`Ry_c<D?;>IKx0pl?&<#V85tM{eHie_%%KIsB<&$Vk^X%w5}-nX@V2)dprif -pdf+1Lhqv+eD9T|m@qzwkEVm+Wuz;%Qc?B{@JIV9xpfAG3CN&j*_wMK9ISrz-Sz5t!As)ckB;eo}TFO -99H!I`Dxmn&_E^sDdZN2-h>k0F`;_|^A57h2>YV6P)wj<31ygsCn9shg=Sg^|4)+~;XAB3$oE4<}2$2 -h?>CVlJ<w{Yz_7RGGA9KZjmH$!;=4GdSakkl~V>1nyPu7)_W6EFXD@yoXv`;mS1%Wp4Ck(S#keN@7iA -&pw}$Qg`kg)9!WTEi|X6@}47M)joKn5R^)&Xd3IBzwh<LLwRu9Nl7}+`*Fg;rLds-p;7%W%Z(VS*3JT -#R!`?>N$I&{{6S$BlJG;HQu%SF$6=4go|4*IGWM)V8VFU0aP$ampm@WozH$g>W-mc|KX(eXm_V;U#Go -x@@}YDhZ6>Gkp6OuCjigwhS#onM>5Xl3m0s%=JJ`32f&NC(1W0OO<(%~8h_RK-<*o4(?RjWEy%Zs|Ff -{sb!JsY@n#f%f*<_RlSk*)bUMBDWa=;L{^Ch0Y=x(s>v7ur{q{Qb*|;fDDDY=Te{Tu;o-03e=G`wQg! -%3LtMUJeGK`C2^9gs%?!p|(@i$OQ0|XQR000O8Q5kVe(}>1YrU3u|%>w`cE&u=kaA|NaUv_0~WN&gWV -_{=xWn*t{baHQOFJob2Xk~LRa%E&`b6;a&V`ybAaCvo8O>f&U488kTaJke@Q!nd=918Tb%TC2GU}r(G -=vu8T1rpOX|9+&S_+wjiuxRqV#}CtO3_U2-9_biSDX{$^L;_>qY_h=@MJoWK3CZ?2hVy$-6b4(MK-#H -<P4Fg_WU7Y(_^ei|pC{^qhx>X5P3RAr^xis4Ck_n|+d`+4CW=hkz|BJGChN$F$OU>JQ!kTM#Q^COJW8 -;)O$<3U1lX1ktJm2Lw*oZ!lwb|_-}v!$x7}97EKAu7YM`#+%XYoqRq*+2aL0|)DZwu^HhtGkhh^BmU_ -)H&pdkZM%6dyml?h$D;nuyM^&-w%d|a4Z6Ym)*Q(p1(Z}%gy7N9^TYMN6w@TT1nH-H}p8!<gT1&=d59 -=i{8iBA4Sb#*!?$zs)rLYHvK$wJ)E#kw1Jr1s&xtgffPk8_gccg;H0n0##1pkva1$293?&~ikLLmda= -jKiDw1Kj~5v>~1$)<1)G4yZ#(kidG-(vRNjgf;w52=A7<QKQjE;-BTyWvk_g8k2=Pl_hFrb#2~PispU -(yXYCmCb@b4c*cJKP)h>@6aWAK2mnzTaZD6&1xGyq002J#0018V003}la4%nWWo~3|axY_La&&2CX)j --2X>MtBUtcb8c}pwG&sES%&M!(;$jmLsFDg+e&qysw)ltaLNr?wDxwzuv%TkMqGxPJ};}vWbl#C1vE% -Xcw^$abPxByT~0|XQR000O8Q5kVegDcv>CjbBdDF6Tf9{>OVaA|NaUv_0~WN&gWV`Xx5X=Z6JUteuuX ->MO%E^v8EE6UGRNKP#($xO>s$jmLsFDg+e&qysw<tix3%q!6Vvo$m|xd2d00|XQR000O8Q5kVe1)<vY -3pxS-@FD~N9smFUaA|NaUv_0~WN&gWV`Xx5X=Z6JV_{=ua&#_mWo^v8S(BU0x+Z$huW)qV><;x_VjdK -+FPMcSkU)&OIl(L@Au)*I*PldHWtaVxm)Ey;pE&LCP);(F1VKK-`(_IIpWl?W?c-+ijo1E5F6+QA&sl -o=X4G}}jc30dKNsGf|JnNAj@Ey@ABFzsw{sulaoGL4%@2MMmz!_@<F8Hs$I^M+WIi~I(-=X)7)sGN!B -8+ok_-$JD2#(Tsz7{`vRfKA_a?i6fnf0lCpHASL5K~^YzSn-pqm)k1k{FzHW;;Gl1+eYXljEp8`@t^v -t^N=`vAv-aKn%rI@m<`Cc!sMv?0+A>Ti5{!}uE-*(7ggK$cVa_y&nKG`eBJxBgIq{JF>Y)e!=3aCj5r -n;_VLafZ|eM>ip}iLs@}2-_g>((lrpzrpEEKyFBSL%fC(Q=1SR#Wo?RnQX{#=@0`=z)=SJ&*c{<%8K@ -l7Y$R96rMH3S1F__iV&GR&z5M)4hqMn%7J5Fzc|V2{DII1LHBn1`l4K)p~mW>#Odr{&*DL43mIY&OXR -L9uNT%Ro2<*Fn$5AbDT+}Wpu1}zY4;0?r@_tZLR1_@fjz#}X-y8<J)r>8QymsZd1fzf2UJrmer{}4%r -oLSK{wf08erlmu!Jgzqnfh=qzar53MWtq3es2MQl?7b$j|KVty9lri=Ctz#UKryVC(u`9Jy^EGa2MLq -v<<QugC;?aJ8#yu!E4kDjmcjItM5NE274!Mmxy*s~ntr_iDVfg<g%N-ShoYhBOs3m4#*g{E*K|fC;+D -vAV^wxWWkoyBy!MHMrTj;0wKff%1^dad@>)p3gDE)zV+xmF-%5w1>(T^)o}uCj+mdY98lk9y?{fBDKs -T{bs7zi~qbs;{=~4vJK5GyRA)lud1+}TWcJP&Z@;(A%zJ2$Wz$*Sf1&-#NaY!YbJkm3vH&0?Hxj#CU5 -J4wDSTF29M6<GT0ZGbVts3pxo4IUC>kSGFf7sPrDsnc0m})q-n@oBL_c0?aew~`}C4^b{A+iF5R7s4A -cGb_?&i}b_$WRDdH9>Q$wsBoCD`gM1=PvI?`$3w>!u}NqxSxSac`{gAg;zQJvT)$EFY~UQI81Mv@;z? -p*lBO=oj`;2SRBO5vQw62WLR#AH%Ut(wWYGwXs7PHd`zCt1$*96VAiE`ujE5(bf554yNK>RisAmS<yY -fO-inLY&D8tiD~V9Q;-})g6vA(iru8Lr2}IF7*Qji?eyI*Xx-%&#cC!#p7CJGBdy&1U_SlWsf{~Nm%4 -|x+Nlm!V0>k4v*}ao6=s`BgtuOZ~V|a^(wX~rg0y&aXthkzdz2<lp|L&(qukRR|6^J9%2P_(>xpVcGa -l@uUFnP%RGuAIo*EVWc~@`bEqFeNw!KN6(Nk)l2Wtm$uPK^YDAHv+d{(F>T#0uHLX$8M0jw3KAv;(ly -A)8x>GK@CM^@bqNeHuv4LoJ`Vid{;(m~eBId~XK8~Z;Q~PNbw-SQxhv#*Bt?<Vvd1D!Ix6HGel`~bY< -wuaPfAGYvG%%OPP{d=r*m&Uf>@ZK9!HTWQkwk7ajA^a)h71#?d&azryJy|VgEUY@XscSuUE!Y6S=eFe -r0`eFxs-0U7W3Wye7WQ7fBo0nlqPDzUnex^cc}Ff+yJ2Y0+Ignn}PlwxBm4Geve$Q8oz}vl16EoAPE{ -liLc;`0dqgTp{NZNFAzb1DIXw9vccd@5N&V(Oz<X57Bq-pQ1~T$QN$*OH-50-2Lhml*dPGAs0AuufMx -(ul1&tCB5(%!g+>4i@eK-275@glLVrQ3=rsTef3*kWp%=Ugm<^0>Fmi*2n}pd!0JV}0g)E5aBg>eP;0 -0>{rtl4!Y=~fkFOapMDrf?ZGVvebtIq*^J@$WrF9G)|B89(%FH;b~?0~<)7eA`5fsRkFl3EKbZ$ZX=p -Ys(SPOV%S#hEoeppE~8P7r{nPY2bX4uWID_8Mxc-~m(;5miV5GO>fRl;z^94EkP}bE<k~hwTUQjL~<5 -`2}Fo!<jpS#-<8x%iASf)%{PG@P2SP22k;rW8i+BmGAcjdcQFoxG@5NrV}fG3VO|hpE-6PoOUd^I#hI -BSvEiJ+m&LU1D?^=*R4Q`&FKI=@hBN@D;cJg!PNq$NhAt8y12LVcEwddVCfXEux=INS!>l->ih`yXa5 -pE_Oa?*Wg3d>L-VZXdrMBvPLJL5y?Aib3f|u0b(XFW_BI4%lS{o>w@=MG_i=Yg;)BlBm&7f~2h^EmoC -#+8+@>nO%fw)xYiH`5Ci+O236CGb_BwTT>tNWm<}0yIZe}Uo4m){oD2F+Mc*ecVr`uyU)J;fi<(tvBl -lrXjy#OBw{$M8kpk1G+>^>v_o|9)B6?eBzi{WmR_}z!*$Erb+_`&=4^cl?;mtm%d!<uf&a+B4NC(?Xy -gL-9alAqEOU*R;*4kF9?NA4!@98{Ta#AvJ2FE|1Z6ZjOoL0IUD0h<dlajXUC1AwrZjo#|wqLk`ZwNkc -_jfUa2<sMu|T)JJ|Va#y3X853`uMQH9r-y^dHsJcx9qyI>)__ByejZS53V7lMy+3X9^0XZ)qKtTETHb -?$t4xOqR1(<ab=I>g$^z@8;5EV1$i0k1Jjk^SVPyqZ8J1vNB_Hyi!SORTR-R;D$FVMP-=L1%z8Cew1D -9K92d|wWNJAaVW?|RRWH!)2B?hL|-kA$6ZO;MMA1i^CcT)E#l!B`6D%^Tid%&;w^$4L1GHP7I+1gz`t -ps!b=sKG}Ajj&UDe{Wkdp8%mY<n1)veQEf^u$dF#}E$j%|80iGgNmgEMo*V<%-Y<*)Bik_`x?|ySPbQ -V4tLj=#6bkT*>RIUu%TClPN}CMMJ`?nm0xen>>XexIGOSA&gvF@lW!ew%avDcD<q+`ed&n^U}IGJC|% -&0g7>-t@Wd{4o1Jz*A!%OIlQ(Hm%OS*k`qr@oqMYh*)e1jmm!_T>Mj+#w$zpJvECB=QRE8o8OLcXn}_ -soV51En=!H#u>9_4S?Axgi$}IeLYO)G2%Wr(#bXk&xewWp^Z*1RP>n7_a0AVr)!0@B_|Nf@j!hbA)_` -O53>D%s`7I)xfD%SrI{;zKc!!X}|Y4M-mq`LX$zx6xE(YL;hzty*L`UQgjZyx6d(l1Tge{+nV=>Q6oB -#n~{iBb$sp%?<A1ddV^O~D8aGb9PhaO6vJ5Jrn01gP#)i+Bw2MH0TDJ<y*x09T+W0m{BKFU)*N4geuQ -qYWIrR5G@~gAK`S7|>a?2>`?sn-JSzK$4;xg4j?%fWjLlSTtxz{$ASxS^-E2AS*yQ1BnV0a^f$I(PV= -LOCbs`!WPKbFxdFS@?Rih0d=6F<tPC}HL)Ry7o`Z7azGuZU_+tca{fdPM0o+bLE%N650dn<t7jtXBey -Ta>$r~@_g9(50hy*M+r6r{1H`|HJy{%fwl#~c%31O|+8*u7o_za-@vS13y*J_G_I+Ajw5?QLN+_(#ck -DK%$khO&0JG{gdWKay9&;A|sH~o^`Top~N3$Rl=~8~QgAP2m3o5l=XoyiUlOjt<Bm=;%O7i09VDi;UM -P~Y7Ta1Ru2_G!v^xnyvG!?bhbG2C!)YRJASs<6WB5{-NAlL9#q&jL(kz7{3qg}zjPr!e;$TjK!+ufmP -TP$>AtIqGz+Y|v^5nq($U3t%1&SI+RP3mkBnpyfEH*mRs(0}I!{<wsH^9C;W5Bl%iz}Khn-?@Ry{e#| -a;Lo({pRz8sCvVb$jyc-jR&)Sq*pXSOWm9s>V6IuzSi5?mH;6=Mr5B2hE@D(x$vWYB>0pR*0%oD$5g? -)^A6FULLHkO&+~u$`HGufiE(m#6bTo;aeB=I9RQIxnrHq<&M<uoV<TkXp+wlbI?$B@wdbx*+(F()Eke -X-O!|r>9lqbm^MW1x3e0P<sx^NuZJMC5FR%2S01Cqy{Fow9;;YvDl6~yx^yP#GNV_Mb5JsHIQuo}|3v -EmC#G?Cn`6z$$l^#G3-+q+eyq=nn#Bcf%+;mKqNxx+kQ?GBwEYs`NhNZt1{bu@Q`d(UBl$TY^0E*Jbr -lxh)iUA#4RrbCA<for?t==4xlWrR(HZ?wz&Jv|YPvorYpnLmZ=16@t)-tcdz8AIqKov!x+j`E9(MXY_ -Goh})zL_>G;sWWdbjk_$<BCG5fG!?sZM<U5llHzCV;at@i5@hb#g*>86O3w|?!^1TX2GvGG6qi0dJmK -QNoFnv>g^byEHS1*AI_=hYe^nz(@p)+N;X^)^a?9b27S*_S^}O=~tGZHZu?Lfp!&cvB<|?k~vwYpv{i -&-eL$?fj>VdGlLlQ1FPM+-CtbxaVe|4pEa4&UsUJK(8#-7U6ly(h*8l@g<ADxD-d9p=lX00%`v)n=EI -A2X-dJ4l7F<7dhCmpeC!S7Jm%?UV89rL<wZK;1CO|RccvtSO_BXOX?9TWAxK~Kb6x4`p1ZgKZp`1}tP -#_9hBK>l-OfbhdG{3HHRwB}Fe|7WTCExUzvbN|P;VEWd?$v?jRM+qK^uKiYKe(;a~^@9R@?(eWviKAa -w$^V7J`yeBqkDi*i%KGZttNU{t_D#Hyjc45a;-fP-36l(p!(VZWI9?2K?B#r8=wd$r6pzVG3<w9YNvO -q15AY3!zr_95#sjff5*wIYjCVjt0IOKsb7JGi3#9;k0Q8Tkg`5D~2fqR011<u(#E{=`3o=?*4mcyA0t -?Ftm*EBQ;xUlu!W#gQp_#>y0E7jw2R~ef9lcx*3fs`|;yu9O;=BV^5z<QlAVOch1?ZFdBe&Qu++zH0J -cvgb$Xwxzc?HP3P7p1XQ$En|02vMehc|nUc%r|!`lt)+>K)B24U4d7BFf<QhI;Q}Ot2&^QF9hP^4uMu -n)VEDY_G^WLfP)hONOU=dAtWs35OHc`i_(xvSQqsZ2ke0TmA=30#vj6XuCr~Oz(rr2H5)67{KBP(0=@ -Y!hP{;J*^CH#vQs;W$wAgJwWkPcWv00naOtzLgCX%6?A-Wey0qRn(L!BTZ3jwZ)Uy8V$iEl5E0ef0nQ --9KpqWZ`tHsTo%GZ73lgge_}dK}_2mv>(4qQyXa`u+ErfoZU6BE&K$$7z@zet#9aeUA$k-ZycLzo}E8 -t#1o}=`8Q!G_peeYQf_p*9d1Q86oNPqd1QuD2Gc@e}Ju%I{dg&oz$uND793HE|AXhM2l9wbiri&hrj! -H8y;<9xb*0aIfkhljD3+y0R&Y-mfB{($!I(|8Wu-t?$0-TLK)if~=!X1%@EgVvdQ28sKv?`fCgLB1oj -IM>H5(qr3pUG6wNhFVX)=Prta+5Nz-MPAUR=5DbCyJg^VFGoCI%^CYdu2>w|Ayy0+<@(jRxf*A=w0jp -)OYV6JGxCzo`TBt3=TJg3tGKK~zJ7XDewo(tjT%SU;qgOUw9|z{FSp*p9}JFEwh6iB?A#8A(_TLj2hz -~n&QRvmnryFO+R9Lc{_Js>8zjt%;3Ye~n(Te$cFJ9@WE`kxXj@;R_*UD`m}c{<mDya#7QAmhSz_n!<n ->BS%-hB02c6I`l&)r4^%Q4U>6qXkA-jceT@hHF<!V?Nbm8wCG0=w-W5;I>He~kMWxHO_ay6;0JGO9om -;K6!6kcpk=mRK6{6IZMX624#>_=M3gctCbQQURCSFus{@Rf7POj76C>yB=!@OGNaH9l4e1|HV2hAi4= -)9cY&H2{lCn4v?WXRek}DvC<wE4vxxMqt7xcBO?J3EOR3QPuS>mT~Kuq?bUmi?|}c3OKg(uLrwFIhe# -FKZc!=aBoE@scsI7lX*lfnu=)V`3TC=XoSwV2~V2{pngr~6q;V9ac}OBK{z-xc$i64e$27+OpM1Pz1^ -P#k%k5Vh^X6N_roLR_+WS1+a0xn0#85iO1H}6#;y3ROs_&ZJ~Q!6lT^vWt`x6e^X@M2L=vVuUTe`f2; -fwa?BMiViw%@Wq#yO=rBH1;oh{>Hi~l;|;QX@7su}<!KLv5~W)8f3`{So$0KR`5{)H3#dp&%>_HSE%h -G`5V2%JQyuTUD`8<77DzKCcBz#6rnVgw-d6^CYCS{uMFfM6d$H~u9`19XhyMS@50BH2lDG3N<vlf+Bd -8DKa~FU~wgZ=zs>(o4sozr+bB{5L3#fYZIq2Opq3xd{K@6@Ng`mwf;Tfd4WF{N=>SD~=vu8wA-P%qAi -i%VNQ8V(}pGV8dX`i4$z8NrDpxe~xZ1x~p7$M`<=?+5Ri`zl4n6MeDm}-9d&ao>h+hfbE@LNiCSpJ1~ -uxs-X^|{t+g=3$e2+!}1NWR3P*e_D%hQx3lCuXM}-V1iI5ob*#)T?#_C{i?>*V%HghHE|S_>!UDJ^c! -Mg{E+m)=@>ZzKnprG`gOk4n-#=pSXUiJJoYlVvD6HKz*aBd7m<hU=KSBWj-u6G8T@W)cxqXBQE}t(Cz -&zmrjSksw0Q(k%7ygEb-K%0h?Hi~P5SQdHQ`Oi6!rwAH&g}Fc4>-~v_fzFxwAIy(QE=z&4xQ3|uJ)Pt -B;ib}&*YppkaEFT{oHcatydyO4RbmsdoM%$^mYqZsiE%^V^;53e#Xjt=qpRx*Osc*<kM+(Uc85@yB9v -37(WfO&8*9_IIVe^v4`-)p9b!*=i1)KqZ^oL?-=sT+dh$ML)<AMb6|(Zxrf|JSalCiS|7}aLkb>|3a^ -q+$lW=m1v@fspvdv_D3SfsVo4&t3PiFV-OdkYz#}db6om|C71%so*tR#Zayo0~X{3vamqLyx?$6L8sb -kb%^LtZbMy^swEeqQrRuJ^Lo?<93;m7q6X@xf2<h*!~9e{~ZRDtGuA=8oLJW)D2kz?|_f#hm)suf%C< -#>J|5GP{8I|Gfxw=lS(vfcu5;3HGtG9C>0^agJL1XEG|?2bVn_Slle!0NmtNa&G}8N(M9sn$@+oWk<T -9vKETnL`u~IH~K>>gn&jli3NhEhRH#(vpQU%#jB9v+MbD|v*)_5G29urwM<acq?mSf1#dSOHwbfD -eFwt6fn3IlBUd-oqkYK7I5I2n!`Nj<E@e*EDj<^P?w02jkiy`L%&GOypde-JbMEqimui3ih8yFJrH>` -#M4VlN7xu9_uW^uw(%6&%wPHh~51Q`OS^*stHi0cZQpTcyTNJ^%X$x^N}RJ4Z-AAPOL75;(a9u^n67! -xba@AYQJhjQEK>Wtnl`Wjg)WbC!f*5C)u4ce$P4`;|=6#UQ$t27!W{|YAZe74uenA-vn-HC^XH&^$68 -L`+XdP50u?BeF;mrI2C9dEuLW4Q%!{#w;EPaoFzFEI9hu-gx8`)j>lferZz(ST0Ghz)@+9x_cVr~|MA -OO|-^@;h3j9>6Lf=3pO`e~D-?y7<iiF@OjJNQh%ge<Zzt59klz63Hw*0VN7hj0l!POHdqCpns=3fqYD -sL@c0sF#w0?(ovFZ5_l1j0A!J5Lr2S*qBocP6<sIe#X|=QHTD;+i~tA=HZ-WiEK(Q1Es(P)=mh<v?$l -noll(w5?n^IA;GVyrnF+wmf<B8--7$)f*<H7kahJ2jcd2Me#pS!}YU7b?PXT}jNRbT7;<@9+H86k^%? -H%IBOP~<jSpm#;;m7J6?iw7+^zE)(m|h~ZqZPS44RJs>HyOHS~djp&q!y%)(A-gd;Sh}@aJJlyn6PA9 -s3bMN4^{l1cqbT5}TSpGDbim`tvU^`02hF?iB`b*?Z3L3cW8V2>mS>JS3Q$pDH?K#e;cE&GOknTWV|t -8bwyw5uH0S5Y3}|=SwxY9FwQ@po<kO$o=s&uk6l}8mF8p%c=R{>^8yS?lMrXKGxctcH122B_A2=HW|! -$U8{Ejp4v>ek2l#J82om*vnQ5pJ^vm{$|}B+(!<hb7pe;K$pyzMyqv=@&~%S&wju%J9PaUtV^#ZS&nx -zw+KP1knD3{nmM8Olef6Ccg}?_F@?o<WNvsbnDGAH_$O|!``A*^Zyrr!}_Ap?4aXa|1aGlWcTpOVg?Q -ba7X@N*RW(^YIGd7){kv;%=R>_3#+&yKKvHN^H**E*bgzz1KeT>h#vg<TH7@eu#J}GKdMiyhikduYqL -+F^mbEx@qRJ;jLFV4^K?wODyf3c|H$l$zru(^8RhlQL0xcdQh^k-<4RQ8n>Hl&x=(-$ejnJY}5%WL*~ -$IxGUeq2M+7*(16IrXpvK>f41@p>|$_eYb{bFor+{ez@Mzk330$<RN?Kp-V&(+{IY{>>}<%42zDkDM1 -9;isn-`bmf$_yAX|a_GDqPgf3i-$(i-3sKJ?(x`}?QQs=_rOYY8i>SWUopB3!ie|K@VmieM&19ZA;;e -HI7=NuKr+8cKluMJDY`DMX4o!E2F=~6KW5$))6T{jV2#6d8-ZJzqZ(s*kw~29cZ@WF#GU6V-UbI1!WA -dhZ$oZO^d#q6{Yk!TalR-57bv!?LNNaFYh<(Nb+9)Q&onY~c20mr&31#ZR*Hha-L>IY{QKmSlt%xdJ# -S#5Ho8IFhx=@IxYx~-cM=payedW(#dc4(mFRx^^Qcj2Myd4d3mbtCAiz@ast}{l$x#rN{RFfrqsJay= -g{^z!Lgc$EVHbDPORqpXGdw-w%<-D)f7|$ePZ|4-wfx;v{t?#x!d3p3weOyC4em%By&KDM6W_x4WhbL -BOn&>RtFL|T{~t&5i>>`nNAeS+KuDY<VH*9?(gxDff5o%oXvzJKq9vmaeubW~XvqL)&;`dA29o?vEC< --TSsYNW+-+>hyr%Ib=Pd$qHhdY%_&d7*KL8?tGmB(SnBPzf>XpI`I0GOLc(NqGh2+8_{Afvu1MCEjm! -mPYr0fCtO@#~7h+i}V2yM`IaplP+O%TX+G+4Acpd1vqqIiRcf20=0k_wJh-^H@wbh`Z;OS=_*#%9R2) -lte>>jRqw>$^MqJ;J;AzTbnk+n;T2=!eg(roIdQI7AL8#sL0Y!DLo^x4MBWy?|pt+9vPGy34HTKyTLV -LL<CS*6om<LFGd(b}HX~fPC@e`1fqT5?Xxi-`U#lyaiQFanfdRl3az=^2J-emqD8ODjd>){RIJRQ#HI -nVm}Z7`C)Ir2l-VX?;&k?CoeOHMOfHhem0h$I>MQXT+ZL^Z7@1-ain=Ji_aX;`_2-%w!uN`=XiSd^8P -1PV9`(3|MyR3Nez2hnG2NcepL9Ld=D@P_MOY!LnZJp(*wHo5lV++^9Lb<{>+GcyDKz))n2-N#V8nIs7 -E`Ls8%CHOR6EQ$J+J1=5kWR_oo>X#Y=T4;8<=%-)sY8*f~n8-qxzu&MeboDb}tO#fYh3=j`_h4&jHA4 -b4QF;P6;ZcL4W$+q=4f!Q2p-f3DNwxob=+Hnm<)C3ekw50O0r9LiyDPM!?3FDqXmEcYNf@fIb7*nw4d -m#@zIL{i`=be~91j3mrdR|)of!6EniJlN)YPgw0-S%I2>q;qmSmqq`uJgg9B@j{A(c4PXsMH~AmlvWt -t$@sR?F&B<ft>Sv5sD|ryMchvr#Na}4Nm^JN@O!%Dv}Vra!<|^$<SLd(s@bY75cex|tL3*k)w5M}@=> -+@PKcluyrRwD%PDN$(&1TgC$Jfmvh?d=`T2Q&aKh_nZ&XbMQ*#zkXMJ+=UsD5(8Y+&)?Y_U5sT#|dhd -DAZ5We`C34Y;e{tjF!d9Ey6*j_8Ypp)pJuX_=CI`HCcypxp+!@(lUaqJ*mTgA>p@WRyaA!h-9JL_L1@ -<8uag^39KfDCH7?*zhIWro07>BFWk)2*A#?mVIl@2n8Rm(PRBpW^AMIQ7kCI_QY(=Y99QA<9|x*4}BF -Jg%_0mXT-+ziaTo9b;9v>o{ekqcIOkan?dBZYQqUk(b_wfT%Fn7`JjqNjn?;EZIA1vQ7U<pmu}yKDwj -sbZiKDtQdyyST__Z=r`@0kq_!V-A)kW=pkQV#&iE@Z&RbMF=mb4utyui!!DFXG&j!<mI-!0g<7jt_;r -h3;36s>y}DXG*HGM(()khT>50F&;=?+Wv{aenS&s#+lTRnsI+8c#6y_*P(Z~btwtbJLy?)%f&(uIF2! -2LxDERYp4MaUAmRGwq*H>cgG&=pSC*sHTn*s2a6aT*c>!a`s-tjLr_?~G0m&!j80UXDvFG)Z`Eg5otu -tc|k8V7nFj~6hfs8@1*vVn;W_DV<x@R<-_JLd5M!~mUrd}#r&IA9hb?*k|&HZTzQ$nrA)exF*B;2CnU -xM{#H(BF^%&<jm0?lu~2P-3AVVYK+}5w`g81o@%@@XJ64G=*NW>%b-WF9RLW5Q<sce+pfi$M_P_4v57 -x$6l#{nEyw|++ODDeEJ{(0-GDomw9rc@)wMQegV1d#bG`K_#4RmvWV)_@sHJ5FQNUOIIj$vsf?<ie@d -MHr7Y+8&rS#Qo^0l*oc`f-Xa;IOKlIc)83<Ia_#gx4&&Q#UWck;cufGwVMccviW`ThiF3jcfvT_)j4u -rf2g9tC8GhIhlb+x|=U3$8kXK~9bx$p2ybv#!L=VphSnb%wpJ)q<!7es5M_eOZ8$MbH_uHs!3bm{uo- -S69NrIx%bSk}!4((JDECf$rzpk<}I?H+9531w%Ljmx;Bdm`}}h0TM)T5-CqMK{)XXjIr{#*;4XJ&oz* -3^Y?^su)cQvb)`zK+;2q+u!97v9UI9;S$HKl^vS+(5*{0*PdfVwEgi8rfv2R+iYGL{6MXaJY{Tk$7c$ -71qB1W-THL9t(o)~A4siK&0}Q5yX+a9{M34yhel@A+DeU)@Z0$mi+DeT=vCf_aa=o)dNPuMf7YS%ELI -=kSwtNy^XFw-U$5FSSt!0=>)g9hkHIbkPGTN6r0ms3HUENDCi_)g=)Ll9^Tf1Rz5BiObnWwTZ}ZlTD1 -7O7KE?b!EBDF`x)78;kN4PE-MIE)o-j-FIg1R=D`FoY_PL$TS8ZsT%hr1wvUy&c9a0?DWEkb!lbM{MP -IqjtsVb~4812^L5uCZr-b?d|tR{Wt+j}XoYH}29F;jZJBpc5@vt>b+#3?$35_D?gy_L>^6ad)0Jj=0> -EPsE?{R@v)59`z)inX#u`*Y*qx1%0)k7rfxU2epW9lEw|&~?DYKy%la&qb6Mox7>E*#}PCt2<0ajYv? -Vrg7xm72(+>l-&WpR<0Yn<A|Uld9xuR5gpzT5yYQ^-Bub7yDNC)3%Ap@xpf9AFwSjQ8&BF1<2lD?>+o -5r!{1rr^)dHbx9k}=?cV~IKeYJ^zI?9#NB0^iNRn9ckZ3SFql+NJUb#v@<h`xj4PK#I%HP017}8&&3( -#`tD{UGh7EK7|b^u9?|4PlKmxL+?K!d;F4TUdGG(s%eH3swl?<A%VFWKEpu&i|^vBi@H7(+0NL{0of3 -gh8oMFVY{ywb83Pa0X`t~k1&8TPW_lb7ipy!0^;srV~*8{i)DNB3It7j!}RKe^Y^FYfhgN{9Y1r^hNc -e9Y<g=i|0R+@mF!8KUp=`kR=8RY4sz0g%`wo%zj#CVnX!4D*N3g%+jzSD_n~0rFwIy{9tgZ1`c!NuQ2 -Gie&e`3pCnId-KH?>6HD>OIF^LQ@SW8aIf~B4cR`Qk3E~@JNRm83HQvpp!3gh9hH-FfLR%y)?QdxTg% -}ev<IYx$B-i*9v@7%J7qK!>T=9IZQ30vPAJ`dO588%9=}X8r<5_AX*dR-@Av7FlU*4Ksgw#pwb6~LQ* -J4lCZy-bRO8^-aD&LCYfoEElH}GG{xsVoF%R^k=*4|?CUV3(`Gw;P!!tUIUNT*=dn{cciHa*SN#iQ&= -HRLC>r85??(w)@c2%>!kUoC!`%F<ZeSOlOBC@KQKFQj07HWf#(I*sAJ9O&<^?JMB<cCgdCGl`Ud|_=~ -BO#<B`p`Dzbsfj^?z}cos?+^zn@RCK@@;>+9-!(%g@&H42u9fnrek3qceIGa?etPqWZjW~5HKZG^EJw -T+;&=lqP)=c;WJ#pG%`kzy}jT0OW>g6mdjnI?o^tXRGfbD22E6lJsu#;okHA;{w&s++jUi;V|?lx4a{ -vL-i5kY_Kq}*UBJgv9`OU7Sap+j&J&Xl%2aZB9Y|+nN1<D}+2XZ*&wIh?B9FDVvMFvaP{Lff3%1Yp8k -44E6;InIZDHEvB#s$hBUET9jIiemk63X1xCfncw}|nyw^x%JBt{Hz86#y#ZYiUGCb&z#m$i$kF*<u0^ -UQc8=onk+jm3uP99Ko+IPLxTkgHvIT^WJat)Sbr@5YgtvGaJ69hXT6jTL$7OdnzTmf`iODk_z>sgIS| --VENJPd+>J*=YYMh^;-S!{adshfLX(670&b0Mmk(V-28n^t&Oidtg5B*?(I3i*?`EPmm7%gz2fss%~D -5l$-QBgPq*1_z>LIxMKV@QENx>2Yx*r+q^m%lG9uiBZPeardN4NuX-!dVq3&<jwt1<=;?C;I1N0ToSY -$gQ~K_cnOB$V2}X#P9>;EcJjuj`lp()X5+yk46@B>rGn!VIcR)m=YM$kqnafZ<lDiYNHf4;GLPNBiKs -||mCfqo4o^BAUx!d)=>r#F<-1Rwib^XphpND$4H4-fll2Wj5cDB;Zyy;zwmZB<{tcTzLQD?2;8R}=xt -8nWiMOc6EN3@`B7uG|T1XqeNGntOs{n(&lJ!u@)U9bRmt*bHW_?|Gb=Al8STafi(eWS}&LZQS(&;xHj -#sz#En;xMpxyVj(G2dD^4D(`?_LI<`we=0ttE0TneMnc(^X@8{o~uP9h22IGzH8{VX@sJ?Ot^zQEjGo -S>%3*a`-T-A+*Q<|NuFGxg0y#_qBi3D<A~e^yg|d+li~P57p8Bn3xNa@cbeC8%24`Xn|ZfN_Zo~I6sZ -tYuDTx7jDbXBoiuH^9~1R<seHMSGh@x%Dr+2088Y54dR<K%4i5-o#7um@vHn%-Fgv@PX*AY5NRaSdz- -Df;SD9pYTAxVKy3;Gfjh_KJ&SKQ9ls-Tt?qUVabCmsJdY+G`W0S7WN&l>%U^kvp=T2Vs6Lsp`+k|=j= -!3`Ho^*kJDyMY=<ddw)=&B%U%3GaFC2NU!oelq8vV{Iybm^;B|CBI&L;pybFnq~33+UGZc5+dzOuU%c -fQ^LclJf;h=*5p;(%eGoOUkrt<Ki#bV^pv#Ne5CI@Et%~;Bd)%0~Cg2UW6)KR<--d2B#LQeMuwuCzJ_ -&`SDn=MED7G@!bJ)Bhked0A!0s7Ka{iC(!khaUQ*nz7o*GSGGIyx+riaDp~erSrX9cg)c3R{vT7=q~J -xF&VQmz+kb~Ly_UhhQzrMHQl`aNe-q_Ec+U%UvObCO;^(sb$7nvU0Q-|D|8g|Y=iz)F4WLB7+h>J;+h -;{t_F3T}R_AA1I&hOoO=vWY7I>leaXb#NRTEKSP@yZGN%;|NJGX)BYOUpn`-plu>R>^n5y+X90~?<L6 -1!ts{CGJ1V);sLdE)gNGn`V?2X-VvGwY?@?aasNh}JT*Bp`J)XUUKxtpHm=s2sUoHEnqCr=lMQxl#%} -1oD$7%I6Ul?=+{WmvBmk$NjoKJeVVihw*M3Js>v-Y6o^mOg&yXhjH?n)^`tkH%yePdtru)D|xDTgnUT -(z{;+;tr%7q&cV60TYo%2ZH#-pMLL)^qU*U|%?K?Fr-335ge<SuzOL@h%$mxN&*%}&u8!7N<6f^1H4N -iE9|CBvT^d{U9}W{|2d=%$dxdB2-Q{UU&9$++v}ruDEuH7SK%Eo3l9N*>@czA+bKC@|11V{smn%>=yx -6!RHhV=SS5JddY>|DI3O=_;75h1y+Cc^@>dru<z>=F23a7qnQW!L?FC~M{W0|D<ao#y;UXl(4KQp6W* -MV8Dv6Yr<v_L!D(E$pAB-ORZ_d=CQGkP&P=*qIU%VQowk=^O{eP<G?=IN!e)3P(7_m&szw{4HDtK3~* -ZF5gqhR|>=EmfUzPU{c=RhkqncotZ9O}8m{@Xn7%I9<y7@N|wGg9jwVF=N7QccE&U0wvKME+9q0A1XM -WaOlt>m!_+(8pT*zG|p<VQaKJ>dRqdVy@r!y>ywi)k3)^}AFc<g4&J-#0sV8^!$4`oy{;ZQx?1yzEAK -|ioMB^5_5J+jdO)8n`hQmWuW<v<`%8G|J#zreNOHi9*=a^&whzj6J(J|n^0u~Lr<Akn*qsph6WKcFWH -m#PTg>&D=|V1qi-fo(^}4NAcAP#+dpoT|L=v~+lWe6NZ?*7}ueCuZ2Q+_l96f7W9RlpAA34Lv`t*XEl -sxbCJ28>sBlU)Od$GbP^BglzSr*A)c*iK0Rev%cDw5nW!AKiON{K}4xAeZThMl?w%|^=MnpG9td9jfV -W;@n+o7c@WKPH##`>AFG!wt2agUZ`;4f*MM+nscCJQ@L|H|P5<QujUl47mO7l!&)*e}Axua=pQPeL;k -YM(PA(=$z?B-0Xc1G7*ckR;MTZJSQVId(NJ|EB6@352$fyICNop^NPM3r_=rF-cxU7L@Hjms3||tE|? -)%u%{Uhn**xmR|yq!fpKdkr>l!t@2cv8C@a@EkVnMI#yg+hX~Ti>*om<uJKZa~f{>x0kJrHv9+y^I$D -N^s?Osj1NZHS@%<OHdMfT@7%~t94jz@)7Vk*k{?MNv%eYdlrBcExOLq(DtnZZ^HceSBK_5)2S&Usj9w -<6lOT&o%y?Ol7D_$OnJ;T-kkS-)L*&K4s5L)c)rC)Ov%zDC@kv+n5)y)eQS4gK5cz>2rK?hub=r<hsu -yb;>jx>&SzJ09&~a3Nh~cl+b{;1^dDUCo+pyW{xG?{zk+_fD)_jC?x9>~G0n+VbP7Nfie!1O0$Rrm@P --|N2%5S?hm``MRp&CX7FFA#LT%zV;JXjw-iTV&jsI0Lad=#4ZCh*|x32>{a^ft_J^Sy8ONY!C$-kX<q -??Ay9;dDT+jCg2qS~r(qPQ8SocEzyv`O6!Ybld4P@~$cvEyIzul$(6Wl}EnD$r5mA5v1+P8z;th;`z2 -^|TEJk1ebt5-)xU^nkCH^b_|Ft#&MVBlKCRuVYFm%}%D25lKi~L=PWT9~W!mU76f>>fVu)pkjKu61Bg -&^3(@nWzg$dWw4yrLw`YhNPYe}#MC#gHSA*Sf`MsYYSTxtE=j5HOlQhDhoq1+#v9Ffv`lJ;XHNHTOJl -E60+M3mbZ0S;qp`Kwr=_O=a5;UL@K@Y3io<RQd0z4V7J$vv=lp!Od8<6(HUgl`TOEX<3c8MCGkiceOb -{wflSa!nhS!|NEAD$mJfQVtTQ(ClokH8CF{PzNgTSSWB*;;NS5msOa}tORfM~$BtSqPJq@mU+s+Ww}$ -^p!Tj$Ge;GaWdHDbOetZ1WW(a3nkyi+<__5@ZgT%Dk6V6K}orPT|zyZ8IRZ)IL>7C*VkM?Muwp;XZ*y -V7eCAQLDwj5jFB2?ZbsufN{YZyn-St0tK4h-MkQy7Uhr+vCb(zRGz(vyN-@hx_;XMEm1yDjb4b~!{gb -a^<);Y@j{R898*#f*NqdTSbakQP5r4Q!skOL;M(tBBTg#h=gtFHbvW4#Sm&!Oa6g8D=^v^ISIAC{gpd -&pXL!{TtJIZZ^o#nyc!4tpc)oSJnl-s`srd$E8W*tjVq54tmb?{v=uH@jSGwT*9UGpq0b^9><oKUE~_ -$MvbDnl{R$II<Lx1+N-QQxAJ!6o{4_|P#%-s4i$+t-u=Aa-q+cbzb-O>Ua6NqQ5fAmD(dMp4eL-)<Jk -&U96qGDmI&Sa*B1)<2*$W;iA&ru<PSxIYtGqN-*4{TGKWFER#T^DR&a7GY`1>cY*(E$%oXd>2@PoG&n -*laZRq2iBDX?a(_S|fWD;ABCu#Ue<)4yw!g55JcLzY_h@{WfNg(g9T^O7&=)fg<#M^gfO*E(7d1YE1m -y1*uGD2SPyIH5PnOfcFxp4OF{<2%cBXe_QW!!pEA+-@iJu#J8QH-~D#`t;}VI$BJPN4(2a#4~<j+gsz -7%W=0Jh3{nC@gcmr~8yt?A7oT4$x{P1eb@(vH?~dw1?r6oSebP<0ilirrYxR=C5nErU_Q4c2u&y@>tw -w%B{R|BRL&92vC#xrmpkG2ZTYPDie{P(*2OSCvPkKonQ>hvY%4(;t$Yj0ki>Zs-t?b0lr>P|2La{0N? -wurS<m~&A+m?0B2s&6nt4y004}p7R$g77m>cKA%DT%vO#RHL{_4&*R%t$08If70z3nN2tY0(7k?sRmY -@oWzf22c`Axnc5R?EIjhAeI-vC=gEkSx8ex)Ns3%H`x5;g+m6gU~P?EJdqD1@)oa@6825XoX~EZK|xl -E;9*yan{-R4kANFAENqZG1reKkt{LzSb5z{$w>!zhKx_&&2@xh^X`Ia5k`Ax#XpV8K-$b-21XUFA2$? -Hdh7ndt`dfSOwUwP>p(k<oCn@fs=#)MV=R#ekI+1T6TSX_kTrp7(6f-?qfOnlC}peXZ!&v_WUEvBM$0 -o&B6CD53ZWZy!_G30y*0C5YOTP`kc^cz{;mxX;W1!qUqvD@WoY9(~)`)y_O*cE-@GNccWQ^xMA2@sMK -C6W&*?YRW5zIC+T45DANU~@qGCgpH|x|=9@MH^QH>Pi>f;RoNjkHb0+vd>O0`l{;-b>^mD2m!QK+1$K -yMC9Y@Wu&c|mFDCyuw!?{_>-0DcM2a+bc$Wm%Y)q5Y}Iza;SsCGUhmPb!$P+esnIXxzLD2Bs0nSC=#J -_Xym`pmZ)+2&e`caNQ&sF`y*#So^hpDFHV`OY}q(0r<PoP6bzZPcvuS+Lp+!M7LL;Ri7r9=k2!T^Ll6 -___$As*5`u@>0#AmD(3q^;nN&S|u>fJiVJ*UZ33BZu(Pe?a3APXlKVmm^s&Ksq$0&p|)-;Tnwl=Rxz_ -p$vmV_s0C&Xc4`g;ePkmF$cS=BpRuIb8k$UGh(WvMKH3rmmv6oMv`Xo)g5sIn@4|$|E?A{GsjlqM6RJ -_?0Y8U=P1Ogw_?~Jv2t4=vC8rIlIdQMdq(kdTi$CZ)h40IRVTb!c|IJdnpAi%KfXsM!-@b3F4`I&Ywc -w|k;!VG7-<Q9=FHG*8m!IJ$w7eWYZ$n`Jc!(w<536C&9xPl7ds&sQaI|H~!^AA*OJ->YEsyGZN-hUF` -}v8qf4pSxdjtL+n|Udq*(V>6r&Y1)F4S0@*|}JYW8$%nI#pdWSZ5~{qdu>w5^LF%Ns$`S!Mi|LX1dLZ -hA*jRMMsjsJ=Yj5Hu=^>8aQ)UDM5LRvznQCZuuvDCL+a04=&Qo+F^!_4t|b3_ZVmuW~Y%UJH#JS^2Xn -99Ow0oz^`XlXik9;*}MlJALd%;xTd>DR|ctxLf~R(T&nHyPF-lbR8(FnS#)m6voupXz!qW_Ykbz0l{M -L?hvR*k?jonQ$k9@Ek2Zr!RKN>~fRX*)w<v6SIC)xE6px_OSP!fCx$0^H38v<G$oF$f@}7+Nxa&SMtU -HYl3~H-W#yCowcE*DhC7m`a;YPT3?e2TQ-`Vd^?`zwSvi47@{NL-ngYA!9*}rb`3y%MPc$yE)|K$`v? -_)y~FiMgP^A+X;EL}FXC70#w6uM;k0WAt+%iqi^!#;WK2}8d2!bN|xLOy=2KzwbvOTe!M>Da;&KqCP1 -3Av>H19*n1B|HElOW!oJ<mZRK4KLtJw&Bumut--h1}0pRI$~teu*>E)$tHxCA4qy37~qskI>{?9kxUk -ayNsDy7UF}mE<5SM%f`UuD`}9z{uo|>0bp>4?8iPf%|*|?;MxH9*T3LC51FQTQMvF#{ppr#KkZ5?mi+ -xsu>I2xE1xsUq2H&Ji@nN!Pv<B<cl<AQ@Y;T6!F_=9#Ug5Fb=F?n&%Bj|uQF&URJZi6o5gFtY!+`s4& -!)^aSta>^&RBCEJ;w$)&MCVIs4=IeJQ~|T}g1phr`E`$;mdLPd)!@9sH7&2>r9P#3w2vrF|sr^-R)Lc -sO30MD)0#3{2yxBILaG?ogTGg)Oqh@f7;kX!K0AFLv<Wg?B3<YfsCv(16|B#`eaF(ec0`!lOY*nBvA% -%AcqJ5cgi8MjH4^gV^K4>z{5H<p_;Nq~+(`L87;IP9fz{c-XLj*jhm)u^o>4E9E(ky@MPcOu&yWN$%@ -AQebV0o$n($dsJ5Lujg8pPNhY3C;y_y2X79~2qUxusHR)zoC^CCl2+1q3GwKXZ?Py9FVhwloP%$l4YU -%opdQl^#gAGwt?to13wk0Plcy8k*mHQS+q(sgfkc)DGH#3do~7VM6fSq?$~c$<Z6NnUw<f~lad&>6uA -;v3^?rEw=W&I%0B?ra0v}Ggr|buBNs!%wyDx$#?d62<%hHntl4q8?W>Ot(jUk*D_y&lJv3&?0Zzy^_- -`ew1UFPMpzPw@iZ}Rm4%`@t^TnP3IeijD^a6awz*)Qa983ik^9G2x&WlMoS7MG?Cmo5x5<k_6(#__?8 -(yk2T@)}fH2`zgeDqEuljMMnTQ(3;2<H%AUpSi&UZzA~j3Wb=41dcs}134fELnJRm*-8V{OTn92zB+g -C)N{FE*+<cHb}cyBywtnM(ga<2ZdvZwfwO`k=_#Nh;6V9$y+PUYl5t3gTCF1g^&JVfyDQ{j#v3i+-#U -1mRg#bZxm+*H%9&p;L*kyxNMi6-DygSH-#@-obfoG#F?ub>Sw5z>Pf6{)3jR53Md=PfjG53rC}cSvh@ -*cSO5Au%t97C(a{rNan)=?5`bYMo!LRk9r9th<;$4xse`jWbKBlIBcV>b<rl!9;Go`6cb|t?EsV~2A; -kU`OS*KfFLc!I2f0Ltg0VOxZ%bBuHB&EQd=y`M-@loOoUS@;o^4?Y6*78cb%Pe(V!I55z)SBk?<QW`} -%sHVUif7EnO{3TufrH+2Zhc=K+Vk4ZB7KkU$!F1qC&><V11_Gmk{SpG<~M?rsys<7#DK!>)!mwEyw>- -Z8#`-!YM(}`Ki;=4d9KhgRq&nNRH0l6D>vM_aW@#TCOB>=V~7t=P^GJ6){fQ=pik<yrc%nJQBBvLph! -+0ce~s91m8~0Ebtl8-!Dp?;N{vnuH!~69=ZdKlH!rs_Sh!d>Z)wZ{!z*M(@p@o@qF`#81?g#uO7FA<h -T29J!KYVQL38}w?@~p;~qNSbaeH1c3u3HTD`J7ex+*vobmm(&F|>jFL@y-{UvuJUi$=6!Ln2{p_l!Fm -c$Em@kIP^;aZ>s4qux^z#BC9lDh$hg!zlL5+=*?3H+60f(OecLjk%hphRCA9MSONqJXm@%tE%PaFbBK -;chgsm^IOB$HItu1s0-(SH7(s0prA?Wk~2N<^VWm_&S6WuQektyNIG*Upa&=ED_LBpIDZVg!tmu(BvP -vTeqM9@qKqAp3{pjzwqF54(r?3^}r+a)A#lKG(-OICVu)_p7K*2>Bo2Xq-y>~wY1ll8t8ylDcHy6z@X -Vj*^7RuqV;_~gZ>uP`g!HZs}A(b-1N87LRg*mAz8g2N)~1hJ}vCMW)SeL(iFqxYQV~kZ10BR&IerX)G -MhQ%__fUp1*w(t1Xw3?rsFMW2(tW0n~DfTy1W9p!{b_bo(rM+D$NK7@xM?Ixbe!(8%p5+%a`0OY3X2_ -Dz3H5P<mH=Sp39MfnWZec3kKZH)}w<+grwm8EpuUS=DLiPC|N&8GsRMWU@&T5E{(IgGG?gPJDf{aPX) -mLuS)TlMzxy*Tmdyp?jLA6&qg?5ubuIeqc@-WhO&iT!0axKkyOuz818tTEI5ZRPGVm2r<xpE6c+WQ1T -+R*$hfl^3hi>%>KZqpnj?E3UUOmIUHTDb}#-B2dvD4a9pW@J?tk8H=-USB4k=Am}INc3=YOF`dy>vx? -oRBgr);wa;KaTMc2Xsp`JYAS)b5YZw(GC7CHOP_8^wqH&bM3Oq(fR@AaKmGwg%?Zc#NOXu?BkX<z12A -#NiN;X5MPOjJclfMlFqdjXD1{-J)BOI#AlhRzwtwtl;Xu3vIJrX>I5V0FfM`2BPg3F`F6k5;6t3cJQW -Vnx#I-TprS<&_6Y_E^g)|m>=jEU<_ok2_ImT64-Fw`{OU*X_>a|vq;)l+CtS5J?rQ92jX#A$o*vAK*O -ZI6~*D{4|1XgZxP5}<SQ<DdvkpZ~way;+l+*w!uj&abF<;$G1=JK{XhiB2Gi9^UBtMiK(SufHJMS+*- -(uG-)E;_irDktP??l2Te@He-(A#`JlNz|48dz~YePDoSy=>L>(V7ya6ltRlPHi%%6OBhQOef#*l!euS -OkyhRn`x5^RlbF+o}5;guQaq(lHB`idhGKG0nu9i)XJOVJ(H84ie4p;UgRtZ+N$v;{Av6eV0gAl(D7~ -tm<=HDJLz|SYl#{tv-@@V_QKjAU;SR)z0HqZXv9h1{+PXXv#hJO+C?ZY;6zQ#w66dX}(lun9qvw4wAo -YE`k<au*-nek+O?STAH>IWvpkcQSzZMqZ}G%zkN)Rv_-J6Q^U9T)phAncs52JUMh$Z^V`JJkg%rR{SI -WXD6N+%Kp$aK5cy(b(~jx;$bu?%?2*k4m4kPQ{`_m0%hyUtJYD_&&LWcWDwOTm@YBqE?~e!eKm3M?YK -Fj>V>jdSmU!7MBn{6+9Z~N<r;`H;Y&W72b3RIj}=}Y#=EFSO^?!{dTPaL&Pj{ZZ6RFHdXK$EEp^@o=( -x{t4RA*3Ox<~;1Yp$z)9hOu6I}N*BB^Hk20cp4A*>|xSH}sI}-%#5RuOX%Efsw*@QJDXS?7;Z@YLUNU -rPdwYr}Qr@vkdz_R54y%ezPgcTSTN}81uf3J;RTF~$bLD0!>{VETOdBune^n`Hsz~aJ9N&?W6T^?v72 -IKg{;7v8mf|la9xR(*hwaHRqQKq)K$?Pi$+6iq6YMo;&YB}$S<TKd$<_QXbz7TBDC6=NX`%9gpVqc<O -5Tu=!O$s8**dPR+etO9XLL4ELYfzE3S8?bL0qx)E1;E0yCB=)XG`(`x`7=Bt%<*nugLRWE8BvGC5u1b -j5Kb-Sa3_Xw*x`zk(Bnyu;CT%JDm}kQ8Z;{SdgB(4Rf<lq3+5OkE+?GtoEAgR|2`~3|BJBf7x(-!EJJ -@Bq9v(M8M|+WE&7hYXl&<N>_bKLPPEA0^2^wpWJ_dwCo2A2q6^OU@mLspM?}=#Z=>I1uUl9Z?xd2v`W -3y+uF&^T>=yNr_}-kO@L!2eQt!T7yz_0hzzctejN$tc(`diA^GnG6pE$Yq<F*~5<bUvRue@Q&P9q_|= -!8Y@svx{aW_z;_-hYMSzYEL6&f+*$cK-~^V*me-ux$M)EPIDy`j26m#UMIw{I7>)+P?_PcnxqM*>#k) -ZS{*~r6fqkX?9&3HHa?#vCko7hJ)I(F7-VZt}4Wtt9YMe#0d2~=Zl^Nuwo#sB1y3RhF<VGT+^|*QA#r -uAUcu=S{+t8mZ?)OrXUk4!HP;Pzck2!Ji4iE-vJ573Fll^s^#<pbG-1x^{InYG=b-fpccywE<7AI#YO -8@m+l`(gPfyksV?K4%%5HYP|X$uSo%~}(HUa(^MRyQo;S4Np%s(E2u}KZJ#myY47@%jxWo7}m)yNmZ_ -!*B%@Z)W1%GTpMXi#e&XD$Alg#omnubqKbskNu&dZ%#MI8EM@1#Jh52HDEB|?r1^GHq>&;~O>wqqEQX -MNlPyG~O#WOz)+yO@UjLyQQV?haK-YV$DQWu@5KL>`Wr@)Tt&D^egDv*0LVfrhl*88eldGAze97q(Y0 -;HgsjEt7pV3YX)UO<o<-Z5nsLGpe&FRZXfGuyEllkZan6R#xIIcvl{4c?RJ;q_)^tv6f3Dkwa`hG>1x -$Cz;alXM%9T@T_l1$&Y}`2%e@~2C<*=7`X)DpxUNQKzI9ge5qQgU1o)J^D-tvnLpZvt9iwFpl)b<FX} -TN05LH>@>A7wh-vl8qKO%}Lizfr%}^@u=MwX{%Za%+s|)vbI)#_nIh5-beZsH%p`jT7D^K!xGHQzsiO -kNyn^<cw`4r>0S)V*bcBXSeCYmAstOl~pKGPQn@46lEN#TygzLbq}R+a)ymfY?C7Ms_5ZBAe!+-I2W` -x4u89%v%)Q97JuZVUKCu^0KPi{rB7tbzHih(Y0Jg)MQ5d^#NhLeGG=uj;RBa>rjpUCU1;_U+lO5%L;* -w9Ze<Cz3EncJW;u+FOkBQHS<jM6UA$5)PYB-&aO+!Ij-#mDcp`ixt_IKI93}XCPjg(^p3Fhl<G$wYQx -ux`krbl_bfM?zF*&J^hI-+tX^|7o)#Ko{dfuUFPo=_jX$w>tDuC|8b+^2U&sd*8m?TwkES~XWjAjt7= -#-FcyL2Ct)S#i!#wj;M^7s0?21PAP+qn?;MXL{B;XBNebb*GYseUl9uhkm*w)_O$58(!CZ%x_^PG8L$ -Iq+nrRCpaF4+x_$a3J>G@}heMClrJT8%WolJCi40Gx(&$G}Gh+Mvq`>}_kpxBOp$voxyDFMKfg3N~*6 -Np|zYh_Roa=o0Nj6zTFP+#>99vt^NIlQCDukGtXl_2v<`^DyMvsuXPRL%}B87qvla#(^UK=7G18p1Jo -0aon5MlKOpn)7^>{4lW8`x+Obg`e+8OW%4gOmtwxG49@J%%b-d16DXuG?1Tj_Oi(NG?<+mxm<WBg4DY -WRNdG1lt71QIODfGVOrt^@IEWdA!*5Ll07kpQgQi7NJLX^Z!;EAU9`Z-t$Rv`{GOPH<xHDV9d#@hRhN -er;3QB}QoXo!c!}A&RVpKS8+|K|uGd(&6E$TPFnKqU;z0*F2NAsQ_`TQ~ZP`nip((@zSS9b7AKclmx= -VD-N=sJ_ZpLAieTLHk3a<xAO%4yTLPRVybN8AXY0UMpoRk+Vf-1mWVCbrx0{>O(F%1uss7TY9g;er%& -mx=^NsloeZXrL$%z6lYJ!1ZIv~TL^VU(|Q!v&?uo8w%qaNjjBcG}WAOMhWxXhrv1fEUuv`slapq`QLY -T-Qi`L=Eanu9m5_nWqAn=@c5N1R|(B;WhEb92tbM|A%G9^Zzjg?yP;WU;E~X^7ba#JHtDN`PqGI|L(C -U$H3o*w*TGj-=f^VS@=^Y`E$jXw+G4=;u7H=A8uh}gzprs>@859lKYhZ&hJWgy;tmW2XT~myPidR(3{ -cw@ED!$#lzkD^iAzTssBLPuKb3-*<|}TS-cl0e_4f0-+DEBr#RVp&f9I!doFF)oW=HXCiI@y53#*<9i -w|B48N<JTf~dfJN=q^_o~Ua*V-1tW8vOh-Xd>eZ*2dT4(;x&v0D9;HTJ1w9DDugP*rVS*k^eCZ-?r|h -8*64pxpV+)I&4lS^1{3{=%)m)!}!4*JO8+*a##p{v87C@MZ8<>zjg%HlHnR*7)o03W9%OHUD@GaI4R^ -_D^>P{Az2z+S$*9W#DfZ%j@HSA0PyIk*|Pq2wRK1P(4A<LvR^2vcJ#N(og`M9iHlwABbp(0!|IvmU^7 -aV6d-lpp2^{iNotP474<$NhYphB_^F&kysotfkM;@z^kD%K~Igp3{J~WKEbJli3(U6E?(WXYw3}<Euj -%x)^rP6DfIhmRNydmK$4k{5e;Y$utt26lj&5yT`s<|-H1yJMxT6QR3Nfh0=_3i%5<8=;<UM#k3L-!pd -=P<a69P0)j{P41l=4vyi0VSVl_h}6ihz@mFf5_;gz87l6gC*%@c}9=`k?OW609>qdDC;NdaDWX<VqY< -LknOQpXw84=2kbAMkX$BN2RXE^0$~8@MF_qHx9fjj()K8G5gc0e=?9%shtLAk>$mi+EML<dcJgv_{U7 -$^SJF`PQBVe$rF>WwR?3xZ!r1Y72(($LzvKQqKi&5`nrwb12bohv^Bn2y%GM&ggFFC|x)d=?$N0FNDc -PlSSAk8oK#Z1*ReaOCfSOb3%3p?25)ZmDcZ5<yaILwp@R`T8;VA(V(5lsh-8>qa@W(kn3x^%#XDP*R% -^w?dmLGhXd>knzqoYs3m$H)eSn)ldkJ}4S!M|I0c?t#edoD=;!!ru+-a$3YDbR8R4aOmr$_*#o$krbz -hL|9+^%^4inK`Esw|KqFDS&LRbGP4@E%SSrvqRH%5qumBnRmgQMj2BVd?WqiM&K8hdM59L^4$?PK(M$ -nguhK4I&yo=??GZy4uKD-k^xk13BQl%Cr8#QYnwve|d(J^W(XiF^@&`Eu!}LdxH*`+$}2*8G8d1}Dg; -U9Av(i?!hUfsdqbm9K0cZNaGhJjT-hKyQD|?VrSU{qwFCO74XdBH4vMA#!h5(a^3vwt)<q?hULBlXit -t`0aFs?PJvY0Cl+G)~{qp>3!B`TMD6jStfq#oNqTnZ;do6*`Ef*cVHp+UG0UI-8mfISxeB{)B{C#zA} -XGUAgVv4Mt#m?}hEm=-)bP@$y^q<b#pKN}sZj8T_Y1TQn`<0_+Ft*Hc@xck+Oz6yFsxc;Urb5rQ{yE9 -6(?Rm7;ad?yL>0`>vtx20uOLtn|lub-}M`0-=m#;EHT|Nh3m%O}0XHe2%5I*b2Z+OVYr*Ka%e<|(O_U -nOAvu_L#_cxL4$%f#r-BN4#DM-M_tPaepeEStn!um=L7Jut7AUWwFV&<-1_SBupIm{)GX_3(<N3{)Oq -?ui;=c!#HgfwzOzz?8T|R^oLdfcIAAfbOWq7IZGFZt$LhzQMr3!I3G{#x^-$ty1eVqo^q7N-6`4xOl= -nCh$oK<O4vh*0K6M-A<INRvnp0vE9~BF4>9`)~t5Dh{YF%Ex~K$NUMCG%Bz%fZaf<HiU<`jo$q9KRUI -e_@z@#$j;Ai;`N+Mn3clcFKahQlNyirn7hdkLgeQ)WkrUgeqT;Jt@dT*OU!pSQ=kBtiY}Jp-<(AmSof -Vlpc2cR!&S0-F)y3~?Ea?k`(!Nr9wYLU6@C%hp;~USH%dfI|<8H2OSza~&rQZU4CYtv}l9CPAKEscl> -^RUPL4v94OMfO6y+dh#ger5Q*RlcD+rxc^k16B5(_LpSqcGnOGCzgbVt8wS(DZW^U)_y9$;QDwzKj#q -Zzp;(kvdN(-~m8+L5?FXsS+PDR`vR7?V2W7HDipmTAS&Jy_PY8Pm6TNQtZO30ugiR&|OHSW7&xZj`|( -Lp}MXUCJCpZIH&X-Uyd-FXTEU17P7>0u`h)erAMY)5b^HtXbaFt4;@ZIDgjtEk*-_1*63?s1h147wup -%!Aul#x!nmquB7b&<5wf0(l6q2M_Z}X%H?~fzunSfM2=2CjXKt;-`H)7-(VQ3uvAUf(qF<tMqO8Tu5b -Gp0%`o3}TKmVxzh{K)@Szy_OP=bNWglt7$B>EK#ou(UU-xav<Liq5H}2b?0OWu7nZ7~LkI%yV)nNl7V -Tht3ih@uAhjEA|XoRL97{L$}CAU8_jM4b#&QkDx^kZLiIKmwX_GwUP&oAg?hpyzEvFygu;eQhNbFu6< -qEW<uz6{Om6xX)|_XbN}9HLQZ&!{qV&x7zcIX8W)r~T4fI!^bTD|y4+&cvnnZS2C^*;n*ScBAY4fzU7 -RlE{u^RJ<b=^0s}9p*K<E%?E*!ee{%i8(wXI8UEgfL)%Z~*9S^nZN+$yY;}W!mktNnl=xtN{}j167RZ -0{aN0G+{?rV6SV!+Ij*Z3baf~Is@loeZusXFHu2@11XxxX9N8}!rBJ!BrMw}|~zBmlpJN3V9s=(9U>K -d8}&FVJ@Tnrzu_ecJ!y7?B}{Cms7Z`vO(ZNtc&I}7MM1HJR9)t=uMd3)7Y0pGGg_Mf~w;O}1FKY4k;- -@U$n^74T1U*Er&BJ~xPppTJB04SAegP9^{W*jIoIN!MWDI0KX=v3i(Se0DxG`kz>NQ9$AkU3jKWeZP1 -fEstt=PrO6AfiaOF&`9TQZT)HHkyY-tF6>#n5Mn5p1F_yx<SgrC`SI&_depQmZQnah`8hx;9uJ(5l=D -;Ifm5P!s~GAB<o2L+5rj|2+Gci>>JCOLXN^Jg1LEX?T3JdI8j4sCu6`(khF_(HL`S)hkike$E0fO6kM -$I1fo4ylxr8$vFZ@7x_xzbnxO<vzCD;%90V651Qb)%b#7VcHcx~WwaNmsk%xI1o^n+r4#7w84Lf(+cO -xaQ#n|0SZ!~<ZIB1fR=}rk;ru*_TQR|Qx&9|g14|ea3c^2jmCM&1Et{ltwDa)`tBM2XW3w%Lb@s}nZK -U9jf;L=x+=wnx<)9?~!%m+|83rs|Qr19^JKau9^&f1+-f*E=)6&3f#`IuDNKauSEE#U{!uTwX!knmUY -%W#dre7|*@{gN&UpOP4WFQJ{_oUa-yA{l8GE6%lS)F*@9ASYZoY8{LzwKXu$8LA@{zsCo)z=G9#NgJF -4Q<TWqi%0l`IzW#WxixNWo_Y?U@!(WA(HV!_%+5R=95T!EP5u7JU_xYB!O#2UH3GK)W3!4H)||7@1FF ->BSt(sJ#h0m;6yX8gyK@%flNNLqekV<7;AhS-aF09Rt>hE}vO(*u*Ctp@b=`}LBstd~@=#wb5#!tCs; -Fk<N#f;sA3=$oqOfN!a<mQz5u(?Nxd0{6zVI^`iX%gZLHE3IWrbPGN^Rjyr_t2)93?oU)BTteW7z6cW -o}39^@?31n)9z$;0%(2b+H}_`r_u!pz^*~mgveW(LdG5I{zQ5NdFM~Klm_7mOsRM{~Z1_wfMOHEzkQ0 -BQgKi9`Qq4>o2$bzHCXu`+NyR>|?26w1Z^!hC7(tIg?TJ)|n>X!qmG>#isy{kh^wu^frD*v)v(U!}AS -O$?ZO3R{;&*Zj;+TNoX$}Qt#G#ntr%v{1w2__tQmtMvA?qzUX&+L124HbqfQabgzPL2`#++5brh4?Qy -Yehv+cg;XQd9Z@~0h-z(iqsag8&+wY!~zXkAjTJ<b{SGKG^5o{=cZ*!;{K>5zzL=%!p7K|bg4Sf4~iB -M<$)7e3oPv5B6OCd!IE9^b;`dug#k88Xz%Wt{aAG56fvZbFWu>bHSKh-`ie!VvP>tFHr&oR^95|74~C -7SGeD_?ga#VrlTf7)fdG>-Z<v(p<0l^f!*4mRxlnl<OZp1l6v7UD0?x8L$w{p+l1{w1;1i3A1*PZZk1 -1t-sgN|Cse$pN&c;I%@5Tdoc&=3bYQWH2g($1%Xg@qK?TCS*Ek5KkYN=2|)|?>~CUo+X<$(Swvw8knk -&kRk0nT<DuhO2<+nh3AWyfjKFT3Ig7AxI&91@(>P1ZbphqsEk-Q-@72LUyqMl)F9=duX2vY54aCGSUR -1~qgMjLO}0)+dA`Gxc?lVry_SflI?b6ej;%pdzQ{r^TWsQ1j{Jw6MKBd!?-*yh?)J^rd?1`&7(+CAhV -eXj8^eQoWCpDdjuWvgXF82%^qG)INO!G2odhW$WQR|X+|>dhoqG`Q%OZQ$f@H(hMer~z(LC%xIzugkL -UO)&BC$I>o~u0Gf|%&1nFakM01sU?U|}}mNH3NZDGnpjhoe<#vZ#N|Eco`E`zo{F@bh}$+YP;&)`9i; -7v}H2FTg+f!u;L$1^9dxL0~jy{u&W{CqnT{{N<GsMV{2lAW_02ELdzgCj_&yg%Q^*=F@Z8Uaoxr`Y9v -0_<$?Er(GzhcJ&1~pGi&H0v9Q`_5&{=>BF$$L)2(a&TmQi*&m;_;ho_L@)YIdIeD&*GTIDPR3cVPUI0 -t$R~gLXQoSW5bbKBkb&mUOx>{2hUlOo2{rq^mHa7%ci!_Yn08%4aKHn}C$6xv@AhnB2VzK^W=%OUhXT -CfgP$tYml5t|;Z#jtYYmhv-(|Whc5Q#TnhYo>uD1#T)3I>n}_k;7gNj&Pvrw46>Mw&B)QZ!qbd_Bom> -r4uFmgR?=n{uP;_(QL+SjoLCS;M(!1{kTYcS{*RqWb1G>8Q`(BzcEu3aEeH8yv%XR;Eqzhn2=f*EfA$ -rjI`n^UvS^D-iy_`LG{F-@o4Tdnn#e7kle>M{kJ+;;l!yn=_|x;#>H3d`fou8%F$U1~q&uL%{JqMG!$ -dUZ&ZOx5Rszbwk7rc=x(3x=S9V=$`*>=osPup~7Dg=CEC>JPY4!IdpFUZuvS%>{mi!A4v`Ay{t>6yWG -;2Z>QM1MfoP!h2f6LTbdms?^pCT)!0?bqg|UKBDN&{w@}RQa|~1ZJ1FiyIawOuW45%=VjDGzxDAHDeb -w^OXndr2M#yUlkfw>34{Y0=ZN6dK0Q_*%*TSsK%l|Ybo&mj*@hvA_HwgYBoV4!c;_t3ipKtx!&Vm1S> -)-AH{_WPc^Dh5&3-bC-cjd3?E~-5$knqHomEDnNk2Ol+I!WccD949BoXCqBW&ov~3uLtXs2r{O@~8)% -5GaN0J#cLl$bwbXKcqC7s}nEZVQuOj{gDZ@v_ky&ymLFi?P!bVYZE+2Gy{|1Ro?=|Fl=IpBnqVh*kb3 -30B57TAMWX6Ad@t^<)+lr7G8!n1bFnw*S?HwkWD?J63-_jK3CXv;irjhoi-gFfykqW*byj=!?US^(U? ->cwq1D{4nsi2?6xkJj=5jz%ZyB%)N)VWr-@;;^yo~5@f}_jv_H6}e#DqHYH-yHIz{SJs59;i0K1r_n| -g}kV|GaoE{#SUQ4wUyK=HLr?yO#6@HkB6K@oaJyfeAL_n36lWQqH^1$pqu%veV#D<&gy!Zn6pJjdT!8 -DBZJ{vsh!v9hRcFfHX@*8`v4KpY=~*v}#V*Pu|bnCe?lC>?cZLsDh?&^V8PW9==y?W2}{L`X6Op7!At -rd7=Rt&*cUJJ0Lm9v=9o@$9eQ8Tg#!zkNCxH@RSC0>yRcgyJL2E~}f|BF2wH3r>gLs}*&eP~b$$>8d5 -^c5?FtA$lZK!<Q}=uTD`;816rrp}T;~ikin(q8c0QPTIwOF^DWq2~O}pdViL$gAE-qG7xMYI&kyNGMv -MJD9NexEQWdHVgdJ{kz(`-Ic?c`fZC8-zEXZUDGl&iU}6Ywl#K-=>ZJ8D<@xnG_SD59lN0WG-hk6tof -N4yHW3NO!EUPsWo^!=+vjfp98>Wb?sCIk3a>h&#Oa83b%%z%RgD}D?5Nm96E!qsnRkH>$4Otyi`D6qg -~PEb_<(!8DDvIBbh?wOW7>@4RgJO|y|PEKEohu?)dP=b4~(O-BmPhADbHKNI;HonO}oE0V*C+&|M^Yd -pw$Y?Iqd!rjUN#eLm&i&NN86wgeY<sFQjQ2hOxJVAwog~L49uZv_asm1dZ+JwnH$!yE|@Rw?SKm?$DO -PdlDRDZ|lYMQ`pV0-O6K^L(KMcI(&mRjlBo_ptn8~v6r*AUlH$LQEwflT`J<2evia^T9MvU+YQ1~YFC -8bC9ku6G!Vgdz3Y9=+cRp{E=+f;4(i=##oyje<U3JLus28k&6MBvhrX%m(eI@n;+?ny|EXgr;c(!N@i -gawF!+odrg}<$s$<9;e%3LxomH4M4*Mo|)ENkk?8db_1N3{B#lH>Ozh=3MX6-gl!m3r;s=@Ch_vdRfa -QQjQJ;tvM9iLwhG);k$X%~%-TDXb2zgigrzf4;Hp&<vrD1GxhuUg-^eR{~wF5Idc?utTQ*rc*9I20k} -MW=|+%Pb*A2KK>95|ujGO`j>x0Oa%%Dm*Q#hi7)Wi8j8>aZQT{aTX;T@6N-)R%I_h4@8T;y0dLT5h@5 -Z3f_vqbl@A1UlW(=?>Ia1Xv``4cuLr(rDBhad(HTKh%c~(`r-`{b&MVhE4pnbXMe5Z#uQ(px&TWtpHp -9QM~^KzMtE8^b%qUbx`l_Py&vLLPDbTvDGqTWo2k<<i?%B9rDeltam@Gtj)$>ZG<AH$2s0{Koa}S+X> -)@Kt4M|HT#O#6Wfww=Fz8lRWGu{y8E^Ts0*}EhM1aaQz|mxHo%LkLo@N+vJ7xV4TSX5%I+uafB-eYv0 -zCJVf)8RA3VIU4c2Rh-X-zMnd0>~8;2%9YB-3c$68qGoG|`N=+oY<?qgH2Zq@7+j0|LFoBz1s~EiIB) -bc?VKM-Fhrn@=&w*no}cJv%4tPH8yBk<VJtkeW#BrZ)+^msWh_t{1%9f-dX?#fLapp13KgfN#PhOO!& -!p-<cNUOvvHhxF)`;xv_|K0eZrz7VK!3H(#xqk6cc<T$$#d3qYRYcBypu6kC<U8xJDOHYM8(>im0rn; -95EzYPj3#-1z5NB;e|6%Y*$7r6GOgzmQq-U$p0j~!I$&K`v%emuG30c2AH{Q*k1A%JH^A-ac_^371Z1 -=^tB73-prC+B4fv?6{+Il`{s>{`9QZ&bECA3z(+&SAhuNy#rG2Z%9eVVUDR*Y}#%m~0&sSA$TqQ~uAI -Bst`&lLTBSV(N{bm|sxGJA-LPqSQH4vm>35WS=`e<C&OrUJHW|9Zkt;23l2+a<<RO@}YVcD%S3_xZrI -HB}8FVdDU>o{c$1UCwnzd21^*Ravd=v4^~nPFTqGL>oPX-LHtUWFt#yXjOpDT2WQ1T)ceAfZIBm2h{Z -z!m5I~I^Z$mj&{ywX@_$Y72)nMOlV%*G_{k7R=lBsOE8#57nekBLlp>w?aNz~Qq7pzwNX)vnm_|OB6@ -l_Fp`fLmKwe4@aUy-{b0$;R6^f@Qrq$R%QZR*fO5I8hhn%-SVhla6xIlv=JqX+m6se8EzC%b&6D}#1U -;#n14q6DY6anKN1Jw=#+(ESn{f^Wfdtm!Xwm~XdOfU$+A|%BT)thP%uLRw^adsTx<%;Mm47kD#A+=3w -9gO;!hmo)6^40XR;GCRQL5aqOQo=6>s_->S{QIevMr*V=g3S>p@^T<X688Fia;r<gYDA-bUavU4@G_X -g0C5@d+V*~biE&*ER8~UuyIwk#P#G<d#+ykoS(Jm$%gRseh8Nab3Ndh3=Vs*YjVuQGmCGBjZ8M_(Z63 -#S)n^wYf`%7Ozl~JJTK^JFlF!bTxzR&VVDzjEAV(+=hoEEUZ%*sA!{hBUb%p^>#If?pyw>Emygg$lR{ -=a<_CBW$ZNtdXM%){d(5Z6N#pq~ubEKh*@1PG`T8>+n&z6A`Viyi1<Ym++QPLs#;(j0>nhng+yz?~;D -y(oOalzQ|Hv-ae=af2mwCB|MZ3Q9^PVPu$o$73-uchpe#Zq!wrlZr?GwVm|M<bag<*g5KtE6mNEpXRn -50n*Mj)IbDFT5BlB6+u3(ZIvLvV=tRE3iw{}aDSZe+BFI8eHiqPLJ}*S@0mkcy7>>P7fgo+dw+m)?b< -(Y;=={TE91LB!-e%lD<gvPEfdy4PEhY_EXqk3{d05|(U{-Y>$koi_I-6l^y@@E)8|*_(s+7O#%tT~d= -y_DBnUi$?Foj_^%&!}lkq=zYyDKAr8w9h}&gp~+s^*+NhJ_k8NNs>AT1>Tu=HS&kc-Z%o7mcX>)YF!T -9yWzOa^d1*&uKPn`eAvRrT?_t;%+l}wIaVO!$qQKjBdSB$e7rlpYH1oQP<9sF1jY8-q!@I=5vFtAS6S -q#iWrxD|^M_x{BfC?u@I`s^n_I{#{CKTmo6jsf|JAm?-!<^xZ2Q};cOJlBs9V1v0*rj&opIsJcqdV!$ -Rr0n!5l&|29)hox=q%ZHW^$!7CC<@8RS+wjinTqllxL-Q{7UYjLR4Ph~6%>x~MqXSROA5>f~R5mY0#_ -v8JfC^!<~*fs3@*t(0{O?@6HgLNd$`blG&_1MadpJPDcJTM-_j2m8V2ATS#fU-6d!;VA!5=9dSN^6*1 -{8X8;Zf$wh7U0kBU2p`1KoT2++9v5W5b4VtxdK_SY<Hva)ADZZTmrZYewY>h2pREM(O4#3fD=(z+Y@| -tR4NIR!#GrT1aXrHK-l63ib^sWAi|We)UrthpA7k$&VKIN_p!ycL4-#1#5V;Kp4t<6Bp)sQCfe>9{E; -3O{E_;Xq{An8Ysg2ifeLw-0HI4+KPPB45<&`kn{<9kvF`*Dt=GVV?R{v!!@ZI8Hvbp=5piuBMQfGaM( -V=cm2Q+RYUwaxHkhtoz0H*~`y41O!vsJ@v^;GK(!p1_q#fiE`=TLKWl^70<TW^4a`|8@eFcw|zTN#ke -HPxI$OeyDlvXE7kJJdT+B{rmj1U3zcWjRV6J2Tq7vt&hmK3dW%!OWuW6dAXG?!sAl6%o^UX3W)%ZY$K -x@q%R3=@ns-2)0H~V8Ym(M{YdaG--s(Ez-FLWb&A@%L|Z@ho<MTo2|(fa*Sg-38v9<JiNrhR8QxIB>7 -+&dLaQBe4f|fPFcKRJSmjQ{1=k~U=Kx#3qLBtMg6Pzf^J(>X0Wd=M9cZm@vS4G>Kw~!Nw)S$?ZA9Eo` -};-{Tq4952*Uefcu|==YR7+e*w-PALK_q9*u3FN#is{;|PR7D2dTHOrZ!(pc`~zIEG@xXP`;ad;LA6_ -wG6LmL5XGy*IzX-j@Gk+1{1M-aNVuiIC5089NSA`)JX2EAiGG`XW0Nz0orvc0M@<eQib{*-odU-|9-} -ujqLDGg3PVU{|Te_Gc%lopy&1@5Vj;HfKoRk^tDwEl;R@tJ}7Tx8noyw);Zxy`!+LLEnbj+hfM$4#5Q -cThP3}LGz=9aOL<ZcLtU-?qZR+cf}1P$^6`tq4?hdO=gxp&?osGeLiSu-%1j|)%tE&|C?0x_ZmvyUDH -J2Gv{r4XG?u`-hO@mY<o}jJ294rB}i{}VZE>M-)ry+h!E%{^Gy0-TM8LNfHd!Fi7X_K2vK&&(vPA3f2 -Bf+RZ}5&TjHTwRu88)TU9R{nqHSsZOGzuZkh)Ra3-%Y!MU?44z&*n{}OA)!O^lZPf0Nc3?mE5`oN-`J -Y=gizKrL|4Ic6Ff%@ICr%9kI2q#Mk)KoPY8N(^fXPj-FgV{jY#AeuyB%i9DKp8q<t<xU2{3YIH{U?ZI -h~qE<7|I=z7q=&CNRjNP6zglZ1{QVC=<m3MmC21(`V|yv*_S8VBd<hp0*hNcXqmNlabfzAG(>K$snLy -diMQza$llK3V*=MmvjaAh+@(#m`(YucyTw5#`$i_LHuf5PK43texMbzzhtZgN(=5wa?_aErqK_h4EM_ ->fL^YZfoQ@t?)!KPd<{w<5&cLU}O`lWQe~_$ZX#A=>kpWnzv8B{YDZVDYA!QnJ>{*(>_8ZuIKK9JV;? -LIpx`3}eW1Sde;U%l!2n(G+n~#f?-E#|0y;|;<tA7w4cVGkj@tJtiVX{~Wu1-%8iPO&NT5bcz$g5(ND -^`1v+u*F#9$(&ODxQY(a6m2&&LlYi5$8kaJQON%&lr4xs`f%$h%6e#EthK}7jkj7%H$2p2GktDZIyg? -W0sLYXjEn82wb|xuFKHhLO%J%XA`9dxX(uE{hXgymv|WLUI6Ms%(g-GUL!U|5jGQ{r)MQNQ1bwMQ}E% -dIi~#lIQQ&*0H4#*um(i#*r!!Iu;KV9C%S%mapSB!BQ9ozCF_7f2{lI78sN4+6UiYoN7Ba$=I~o~xwn -j9-s4h!4LRgtkb2Rg0S;UzO0fR|D5Wwlz9e>G7pH#+&i@6>{2xB%U*PkXkM}*2qBxFX5Co9~218pSO2 -agXU?d8WD29?0y#0#$l-HhMZ*zxqSAoIfeH3<wKlDvb$9GM>7~c_f!^bTvr9PkL#ow*(^v$kA(H(kmd -PlM_*{OB=Oz)d9w>|2XL&6)_!aJlT@dkCjY6@WQ0zSS=&&24?S>IA*jM!6B^6gc*rOVr+q;I}F_Es!J -qdgo5-|E%Ldrm7P-b6ogAJQVy{pmLZhpAnH=XXH*+6&+}<O4{V+bdSu{&ZEI+mYQZ_u6lg&-I}n|64% -%nAL9@GmG*)w8`7gy(}Ep7<HE2Xkurz9i8$!nEKLDK;9tAfA0aIy?(kjNBmDJW^b!+i?KeezJ>2Gv3d -IIcd8IC?YhA#3Y^;aqH16CmCt_HxDQ!~@`v|e|M?>u{i4eO7>@rD82mgO_P4WPTBPCLr3FCRBykfOwO -f?ozHnG#s4=79r9LiB!y8?{C3cS^Jq$JXdY#gxqB(z18`ib%7OGe-aM4HTtQzVnKuta+>fmVR`An``y -7{U-yc%!M)}zjKaVai-BZ8pjJ&?6Du{mluMbLm3SFlbto!q{5vQFyth}Pr0rl+dM?Bj@P##4V#acu;* -?k+;i@z@I^*;@oGsO<(BfL!B^@2Bk5;o8($6trkmhqj-11I7080$U9V*&?h%>2lrP5X)1KF9;qeCmGY -=ETBNKvMzhJjgi}q&FP4r{jy|=Bc&i)+Hp!S>d~t=zPxj-#Z5?%G`_|5rkxfr6xz%q2ZYCqeInS&wo1 -&T9$$yU^lFQ~KCy84EBhSylzx5^z!|A|@I*^YV){za%gmFm0&e2Jx3=D$t%1K?{LA4oCKmJ1L-jNUx^ -<C*+?Sn2iex*()Hc0MuY5^r=IT(QN}=~aaNV<>-O_{L!rj<tn*GG;wBS!Nu>z?^Mi{K)aS}ChaAlFkm -D<v%>3(QeorrY`>GjibXqSuJb$O|xERVsCq`5*s!qpKdO!}-{!dx@_YB^_RVEF4oQlUsNG^h<}xr!&B -DV5W87QLg2zAm-e>Vo6plsR=X0{Cl58>(@@IseW*OfS5mLv=ne!ZF1b$v11qTTHR@C$8t*nHFG<c_9a -rh`AuCMJ@#<;o)&62rVz154BoSD9Q9L*-eg`UKnPoJAvszX5$vQ=%kR|6f^01K3f@Cp&dOP0PtKt1wu -y&mRA2U%6?;nUG8NY-j^>3xI@~|JRd)y=kL~jcpZJc^v7Rs_^}$h{SQJQ3c_%D14e8&`NIf`++F{+^p -eDB9D3J2|5}cv_Q@#f%K#R&+YF%b-XG7%y_yQ4d*L%o-!@6e?p*w-+uxUNIJURKNo2>;ErX<y_nb5R_ -A;V&%On`u6T%pI>t7%{Zbs2B0C68JqxYTcrU==aoEGkqZM!@Mxf9)>^zHMv&z|i{7I3uZm)nAEpV`~< -Z~GNa?bY0E85!<4O?^lK|JHw*ulFu__t7Oc7}=%G!^KCQ`alnsw;hCy!D*i=yaAV=CxsjNC46;r-4TW -R(h;8{$ytBWQhQTffj5`t$S$D^7jajAR94ScJ?krjYF0e!*4N7FmurYtZOMdX<8H;!KSQ!;SAy~NtlA --2ej};GJ`zv+QCF`1LMH=uKA9~kL*yQpoq_wWAW45+fo5b(koQbZDu}UB=7W29u4HX2FpOg9I%K)2!; -jY#L%Qdy^UBrMgMq0y=S%|+O9OBUm7_uCPV3L7ZxV_i!}sWPTbVoR=nqHMmrF?<d(^HpPk5dTUqHYUB -pBGi_mt~$0_vEFTJIS+IWm!>N*QogrFKK=a@{Gil|HszxB>}UBOOk)INq7+C^F;(HJ4|ka|s~if>k98 -<4>t`vrXCTj%WYqrpTfNspCsLPgfkg%-9_VkJ(~taKWA>OTc{agf8I&kVyA*CKKLupR=L{V=YfY{2US -uFVTg@(-Z`4%6Ndwqb}yy^_knPq?-|K4-VKgHUvmwGR&7Fhe7G%z~yn!*dG=|70<Dy^-&NNxSb-nK@* -b;>Q`^Z1mORaVgDiV!%%HRsmEDm))bA-_0qLib)R}ou4iHU6Z>)?Gk$~t*X{55AtuYm-zKGY(#L#KnO -o15qVkhqzW?Wk>j}K&ydd4QIJ$b%#8&y~qsrsgSjKgZ2FeE8olx310E|w%8lu89EU@)?;xDu)8|S+A( -nEJVLHUUH6m!AHj(%QIJ%ju)JjF+}!>@*Xa|;SsvLi<!ufxk5D9I7!=O}O4Ym%TPY*?da1!7m9o)-(p -A4(fWc@s=$aZC<VwVv&}W&p=nxEv{nf8uj<jBaJpcN9AbKBVX;zFWAF@F2Q5fTYc}oxg#8)WuS7yGU6 -_MX52s5<QiyC76=MrsL_#D{8((^Eot@d7hd`93YvC+39xGOM<=XGfSB6;Q-6pd@oSdWr125b=2El6M5 -1-t++K=+0Z>IcwR0~-9v=y?jl;jRbDU|AF!ik$3ARC!y^e1L3c@@A;Ge`8}>iX7)|RVjq}j2ncTR0(w -2D_j?a7gMU3eWuK$03P7MFutsnW{54Zi`?*k(=O>P+<iK8e@Z~sB@E#KQMe+Zm{P;$%naQsulKX?bQ4 -cNBaYeSR`(r{>p3i!=$-UpV_9ao6AJbR3PZvOK&o&7R|guhFeyWvmvRz5}FZ0EO?EJEy}7yBer_#TOh -{{#Q3)d;;YY`bCG+lGxHxwF2upA&kYUC!Pb8e95Ee>bC?zD;Y9_fuwXov2+^<88?czvZdEsLJme9rSO -p&D^oA`jBqA8Y(#FdRQssP0{#PJWT}?ewys<46r}jYwEZ5S|Yw(UAF`XFA~XFwsg#nJ7?W<nP|aY$CY -tD^q%?Ju$=Eoit;i4=GnL9Wc9k6(Q20bIy>KFIQDD8?&tT?oi7ZqA4Y}Wsg-B!bxLd7&C~acEv>S@$u -{LzgnDX5JRiTJEFjFdV8ee>!>%UlYrnDB`ySu6BMF>{Ah~j~?v2{346^W=KUZmsH}9G@M5NyFS)4Glk -=rH6_Zk`~>Qg(&c5B@Q><rvjTwW0GdC;|jM?6y<>!rfhhDOs_=$>#Bb4pLN1i77{X+Dcue=f7Ww>1qi -`m=BY&Zh?FDv7pF2ooeAYP)BCIjgdt4kzE29(Mc0`=@de%Q7?7bIR+zQdO9DD#%3E=?Hk0H}$p<bgZI -B?$tN7WGpXlyxmsI)#UDgySbIZ*VCehPx5$+>jI;L(^-3s;9;?kGeEMz0-Mp}e6;Z^%~J=Xh_4sXBWO -2lF(`SCee;YXAEg9`scv_qC1014ggvH=FM7xWVS2r`ulhEYjfa6Y-QtItX`pW@7pHB&^@|$j`HQRl_X -W?NwIMaLdxQpgk|Y8FkEdGl4lmZp3%|a8LmuE0=&8hViH<WH-wg7piavV2gZyiyPxIX7jmah$-2{d%g -S<u1Kv_TYggu-ES&b96PqHBo(fDDRq?Q|J(;(uN%0e#+pB{)$Xl{)N%J4Th7TSq=dUt@CB!lT6!Gd22 -udW1<#eLDCQl`1j{6&226)@KiPtmhAXg^ZHd(&#f5V#as4zFMZ4C--Tm3G#l>Vm<+iH@lYFUd<mMYC} -lt+<7G+6?5jQMwT>?}s))Vy}w$P;rl}h64&O9{XF)xfLs634CSAnd1V6ArPbTm4`dYl_ESNGYiBMXhB -Qmx)9+lF9(fougLF#b3{3TvC4Fpx?z6PlX=?S<A+e?S)@k3N)8C8TlV#zOEk^p<FP}<A7a0c*)V_nKY -xh3y~v-xV8oy0n*QNEA5%P^uKyvSLa|+m495wWf(UwpAnH?&@pdF{=k9hG@69!MPe#yaCx+}<)jQSMP -V0=?MJu)hghoF{7-}y%Zs<Y1MVrts5EZ>^c-Wr1>>Oi!?~|c#tfJpVMTFctWWVrANA?5^iuS%-MDI$4 -P`HC0n!bHzshz-r$2-oTZ>r1&Te~QBxKH}*<2=-RvIyHzZ2uYFr*(I4S$ya0(7)BfK0bGZAwCdBVNN3 ->2^ZL_!TGbm?-M0zUH+-LWhF?n#_*0Z*cQRYFX?MD<K4GvbTr)Z78_|gASziYLf*46tjt0A_UZhSm%_ -`i#&3wjYw#Cd%1_rS_V{!5#GCw&1x*`Gh8We~Xd??pNi)6{eBL=+U;*E6)j;U?ki^wwMp=lL?fv28zw -{)(cF^*72aN;XEwo%<?x6L|`bW(d%5!(IKGs*V9+Y^w7fGQgoUq)ez)86)k9&#+U(3b5jmUulNaA#zS -&CDH-fDWP5<tIq8Ll#@SRAlxrIJs&DaV5oFQ?gwGrm<Co`z_rA6DdsgFqDBSV`JIhGSsF*7f3Y6A)N_ -P&3vg^LU?L!W4I9b{caKFLKl^hXqWAvQ|`QDZm&YB8^h1X=RM_!F?Rq@jB#Fg21h7SWlI6AIPCpy40x -7Y$-5mrZZp-2l8qs1Xx8k0Z3bh+QP+51-Bd}7Y<R4Hntp{M)fcn0)JeZn}&??JyWaabc-79)}M!jI@< -Tdc`Zr;Xzk5w5Y0lUE=sL{EUZC&IjRDhR@ZsywjJ7$ROc0%lfjhM@>n7}q<g_hJ(hbUBcSo=RehT2k= -N5>u|2BugqPJ+>PbwL9xPbe5+7Z0MdmFZLg!N@NZvE;l1i@79zqsCd#wJEzUw1}w_Re<-UQOkiVaDcf -CHlV_r-<=Taqr(tlL`8GczT-1?a?RQBDNC07tPt52?-bU3pf@f}@!D<d@7fSQ`<%)%?m_v9ygQSw6#+ -Fu2tqFb5fr^O2By?NS1vh|^U{QK;)dUidP|#boZc!EKNOe)rJOw?IExm!^*VxZ<KP2xTRTrP4W{@uhx -gKrU}V3BrZa2qILSr~G|5J0jv^XR#D-3TkTy!N*Sz<JE3|xZu7%gpU;UzN_BctS@-|GhF|Z{-nD&Tkd -i*8rvhVb9P};F-Qsi-ce`lFa61V@n>s+eX)^$Ro~{R`C>67n>TskU0L@kyahT=74!JPDbMipZ+5%D30 -0a{q}MIV+&=U5Gyd}ZU-$3-yV!4jK4JVOF>@&aV7Nh1A<3Xc*5XO!(2hCh2a{YK?3hAembl?`ITvm=y -_S^EdBhw`aprLF+~ixvd<Ja)F4_F?iP-}va`fOvJ{`!y9mCE7UaC^np*fkWfgj~5eai18yM2x{`Bkr_ -tA!yBoMG)SFQ(-*<4`}>;~YIO=6rb^i55e(gkt=2rqwB7mog+-3c)#HmvJ_7v)~i*;5Z<fZ=~=jC3A@ -l(7?tQt{u8@%#?OC5tC3U!x9Y{a&A$2m=dBDpTzT&jdJqJz$ds&fOxTQcE;d^k~)!yMe{NV$rkV^5u+ -;fA@fEVUm=IS)>HOa=JXW@$<o+Fue^q~KZF2Ds`EtwrHGa9fyX#@C4`DbPnxM;CG2&nmJ6Q<$4WZ7{Z -WTN?0CGc2O-jq{<*$yFQG_Eep$9}FNa`C;@JH?7l|8U4xE|Keh8a|e%t;|PYw<pN1M*=INnAzTo6c*i -!wn08oA}ycHY8Z(n}m>sUN3IU76C<x1-<68!xm5FF1&e<Xw#nnj7eRsnv)2!h+Qoh5<MwM3d^Vh_tuV -TygYVGM1c6*9j?8A7Ssh4V|`wx46Wdg-KNPfZZ|PzKh1xna3wM1A!*6-Lq4B@#gc7gYRGD$&9M{`V=t -Th@eHpFEn;^iPNo`%JX!e;E4el?!2-HSd1fZjVbn#w%FoE+W{4==bHghbzQquJ445e-SxGxAXEN}aLp -{6DZT&OfbDm8{WWC!@s96<Hk^bYltLjKg<%q>X`J}9;=LPz5dR6`J+CK|J;~mF$l^WKj-kE6OyX~96} -8ip;Ll^WEjbUvy<z)BdpS*aLU0`I?4_NCobJ)u?h~Bt>3s(6J=-ldgp<AY{CUh4y-kR*WUs(S(H^!%; -oet{i1)PGdq8^&#!zyv!(+s|O$_ZJ++HWo-qf&cFH=D8LGm=&H?f6}TTHpdZ^`dtwrQ{M5+D90vh|wm -6Ks+v=<&Ia$#;WTz}v_K%75&e9{-HV_EBWxJ4FcQrTO1SQNUh4h@_y2%kLtkk1j5==oW)%s|@MQyNmn -twHYvenhX24y8(U(>OR}eZ{oK7P2|4CZLf<cWwefIS&S`N#kcmEdL2?q2a|Ig4X285R>^riTNUFS0>g -Ajn}FjAWs8RQf_B92Ma`=(o;XP@Pd`gMJT(rL8^W-5_<=D`(j=Canc=?oBu3CJ1v0t=zC~UmU24I@kd -g)hbvFif3DH~*>~`uAM=rNPe5_Ac4U(v0qX$JAw8}0agCeXlJpx_CI1PUa{VOb4F3a5qMIvN9w2#$L_ -D|dkr5FtwRa%4Y2~~AY`X~YA#C@i_>J>`>!B{GZ^sj=pm~m?D*c-dxR3f!Ka4BLxHL=&|fPXe=w5<N= -frLkuyo8GhI>#anMj%x*;WR8<WQD_vKh_c!^4xNV^y`2vj(536tVCE`)<$@7V?yC+7KFD}fk@QYL)H& -KOiBD1%5Qm26)jn5H{Rn5_Q^k10vr@)V62<MNV$N-9n>1_-RbbC#C-f1h_%4Y3ZV6D{=hGcdiQ+}hr! -D37C{&eVB(0US8MiLD5u;Ovf|g4zrQ4weyw(PoCA)M!N`yR$zmVIxgT`QHA69^^0flfwSGb{KTC%(^- -tk2OnrCF#7LA*3+)?_`DnV=(R`Ysl>wE0d_GvTU@=OThBl7VMnhB&HC}R-=traLqjkQ?)s-1n1bVhOs -)>~*=0to9?m|QWczM89RE&)l!C$PapQV~N>}q-)QI9(l(%DqSM-E+F;ey6tBcCSp1{c&v+y?A{+y5kP -1C9i*&#A$V)e!xE%)M8Wqv+Z#c+aos%bC!8M|iU%<^m6r0O199c!ZTf0`cn)FIib8E32z|?>%v*qq-| -w!l(4E$E;^9gC3+VhLiD9k!4f-6t{i0E%d(e-^6Xg-^FbZ2;BaYxD8^Jqg-Tc2cO|1zH>+Xa^Z4>y`K -=~97L@gwRIpU)(&Y<k*p<KmYLw@alR_w<fmO;Ab+PMwIw1~r%#{UwF!1qpkRzt`(2pd20XcovhcbY74 -9w3$E%pl2X5GnUkW>;yxkdS;%^}`F)!*#SiQaD?kABCrYnD!_qS7%*b1{fU?+chiU?7wV~k5ei&e^|R -fh3I`X+?#F`T`HPZ$+aa|zxi2OW&=n#<)ysZaI%=nsk3)<V<bxxMA4?L+U9D?dGv*MT@*LrA@6;=_9A -OGdG!>{BtLKE?Q=NHK7BZ!VnLT+0rD@1*qH#Zj#Z%J~{-p<j(sB*<qPimYb&1Tvdu^tV%1*RDsoh&wn -`T33D*2w`;OSQ6p1qb|$1Z{AQJL1LwrngLHO^t2>_NO-lc$Bdzb60gnHZRSiXn5QQqDSz|m6LFDWSIV -H^=CQj($J4H?<w&85*>_UYf>L(4Zi~CH-Rqu*cN_cuc=%Hyy^ecboh8T6)gh`j{3C$X=$U5b$$E^FwB -g9{670k+WN4R@$fAtKZ<R|Ha=m_ia6uOJd#i~-bwF*&hi(w#&e&_mt4@TMn`BBxNZz8L2{us4mMwfY( -L72v;_;>8y3G<M&s?9n!CiGSdN$|eq3xW_BNhs=qQec9>vIxw@@W?zUeF+GE?flH5Pu0wLR~rL97QE{ -C)g{sujd=@v&4MAoKc?mb9*^C>)*OCUkL@j6si5XDG<*25Xk)phxsaQ_lJl0f&Pb542_~BK_E*Y#gG_ -=;uwO_Fo|O%LnF(Z%io^`e@ldfuEEpWkQYpYdK(C;Fc3ne@Rx{ic_kzN6@PAChpik51Oe?MBwm>k^eT -FTt_C41vjIq_r=TsfoRC@1utb5(uZZ-^+bOZ`LxNf$g08HK7zCg|84m$np=@PoFso|^w(8yHG#H@E7; -qigD!`t_AT&f6a6#$n1hU-GAGmqspuN%BUt2=*{)I$O<T8{l8KAEx`n-w#=hJ7wXZ$~3<IMMRnQo!p^ -Sv4KQD<%my?W^T4ZbHG{JqZHH|{*7Rml(J`Bk>v30~Ul61vkwnpFHmp4Y5kl-RfOA|#H868g-0*XpAn -nE(XIzI)$Xu3!jGJK|m20Q#kZ-v`3{ulVv1Ak05+g_mu&ZmuBREzs+XE_wHb<xFp?s;u}+aCYrP;7QD -&+tAz0tvEigCBhl^48;2Jo+^DkCdIKkpk*17uJP3UGs{jhQ$3<fz@r%~RL22{v;6vyT%WU|h%vbA9#k -w8s$L?ws5(&@i7The&2*VA$#%BEQ+urtaEEt7iLghh8P&==oz>gam{$Rz#wi&^7@{&pPBQMsUJE2?AE -y?Li`O&}C#HzF1xu~*(00CX)-MT%(Ku2Mn@vckLyFW?MPNQubH4i&Ran$SViSwqv7`KRcarYcjSrKDt -likbv%^X<kcXk&(#S|fxL}Whb-{>@rb4a31e?oC9Omdb4x2mtG)=DKCf)o(n1|KT6n-&8#(uF3`(R)H -Ltt~zmrp~Oc;_vD)LSXGpTi9eyPZb7wGN?AIq=eD%wKal%+`?!LhEWr8=E>`>655qvZC}x4=ddT6Gjt -(NIpBpJAPYRL2XsU-nrv9X>bp2iO~w0o!Q!*9GaRph0$dp;zUCi1@jFr^xSDPxq<MQa=nur=+1RhZ?2 -D<yMNX4w%GELuKU`2c00d?sr|I1BD^VJ=skb7{yt2p$Wt3~5B2*e{7}xpt17}aX<l7d={EU#$`Ln<XN -(?enJhvjlA3-Rwk@0ltZna_SAtwZmzFBXT|QzLy0Z;)H*OyMWVXTOdKoOr;as(}ax}W9V`jVbu|oFS{ -QBxj8M&RUZ4~JHsdpjPAz5177mb-_ae`?!X-QRdx5>jX^B;bZ8^uvAk%;u_Kj**?Wi$@iSCIL}QGa{m -n=IUq@bguYT{u6__vMxC|CRjTf1xl;{`JF-|MQpB-~Ni;z-rFYzaIDOufA(u9{}_J;AOl6?&p{AJ-m_ -(filPfqYMgT;9r6yQ82THQ8Yy%D1*Zc{3*OH2$e)D-694aQ%MGzPw{G01sH?~=v*zp8PTA;f_y&Q%^) -kmVXdlQ8K_{qiRRHbKslTSZ8e5jC3IFF6*2)O4l4c^{i}W$Fn2}4NZYdAg7V378Ef@~VnD5A!B&g}Wf -x{0fs0XaL}u-oF%;M!UKMMXi(k%~<7=M`2c0@P25ds+xAb~(H8&Z*$;Rs<<#{i`qq1qo@LNM??zi|?v -hi2vX9=$#DjSN`2d5Mc?XP-qy~YRc{PZ09L>JCkpcP%|_AgG1PT?g%m)9#1|DuKsc6{z-?V<|m2vlc* -X=IsVR`V{`xi;2X=B3JCF_{c~vq(>Rqsq)<3F5zY=%BSl*S%lnckub$4EA@E<Jgar<G~2&v-lms5hSP -o?3q9xAId*{CeX)+@=u=$^zotm$us$0pC0<nT>8B~3REF=Zl`7SOrWKI(srWgYJxpIqN8+&e7Njwug1 -3QeU_6QmeZqo2whk);+tc(oucpYSD2veE!!cym2-DNvv#&ynY(km86pU?WPQK8B;}4ZvjSyOIe13Zxx -fd{wTyep5w!AXw+}K$4F1(2$9{<@b2(WOuq5x>8Y1^fkod0NBN9d3W?OAp{oy@QjJnaTcR$>S^NX~p3 -ulz)lEH5;JvByms+9p)i=RozuDAP$P0}S;+)so1tdogOPHHkGTu06a<`wReM!!nq?y+?-_{Qh9)`eo; -pcnha;5$gaS{SN46jyY-V~by+{7%?*knxevW-vRDo1!a|ZWH9lhUi`=CH2#H=^V4-Sm;-J^FL1qi1PP -y=^STKK72YtH<~(RPk5@!%XN6_GKr+B`<e9Rmr?V~QdpZZtl>G2q@TNx;1klbIrTMjFxYuJpl5$ny!@ -b47ql1WyQ{=~sHoay-%Sto=_CD;#LtJuTn>~n?F<Dw>?SiOE3Pf^8U-9Bd1vL6;U|?)?b9nUki@#}ky -*#_XC}SONX)}P7TPVFFzT5-LDMnu$;1hgXQw9EoJ(igyE+sToinu0hUjrAawOCBkiDiNU6zlhODJkaJ -`M<_c3TwMUMDuo{JSXAOf?Ne+CN2|(n?u%8ody1!HW+cS+~(fn=+H-u|FGec`Yjvf`^%43muf$35Y4g -f=!E?WO1k!>~QgvnVK1GdqjCu+T<7UR=7F8n}x?^;!+)F62pGh+>xW8%8Rs!{Rgw=-U5wl`{9j<kNtI -g#7o}(+r0OG{*s9W-QRcrhVNew_?G<Y*)aCE`Wvi&*yB&*i~m1g=X(J1pIqY)RR9deC=$mJk|IbNCTN -C&5fTj8<I4*aiNFX>d`jC%VxWDWty6a-1)_{>HIB(Mz_cN#m1l{82q0hLmE_Yf1<ydv52g!fFe}K!K% -F<q0VR~60jnlTL2D>pbzqivm-FB_u)oQEH3bNifOC-cQ`tHOzXnM(yyo!hQ2mnaGwbl;DzU%DC2RkOX -1)mjF0og>3g|>De+Ljr@h@I*>F>i77?2>T$G0kgezUrB$dHF&uX>d}%XjMYarz}pd3|F4@{RbpKyni{ -3&ySem9LuL--t5@NSs1{f#A!R4$XV6ZG<Nai?Q8JbNbO>zl;seVjsNf0;rPeXKvjOdfV|!5OfAzoA8; -Ox$<2DHv`HqUktS4b|N&_9nJRyf1Z5kyR*Mbj?b#ZAwfG`g4fSk|Hq^sde8dbSV!)6F%64<jA=fGG~o -IDJcsxX9w2yr(0}p(zmTW?{RjBnZ{gp2fZ+K--#@^AV9@j2Eg#wasYjr$Wwq-gJs2>R<cE>AtQWQ42% -EimAiVKhg{tfAwx{Wq6w}#*&m@1nUh4f^ZO?=kXA?BQk9pfO8xG0u6nu=sR`r5}DTK%guxC|_sHz@4( -;?w*?|Zhid$_l1dgSERFY82|Av-OFU<o;FW`86V&T>+D7oDC;a*Sq-+rcO{q&5;e&5ia_QXZMT+R#@z -soNwVa#MylV`DxtlO=SR9IS53-fr;Gpo;V6j-5C2vdYab=E*WQ20>~^3l(c(Uzl0Tw(Ovmvw?2>#h&o -3$BA8C`MPozrb_{Y=_vS?*ITKHaHC5d%cQw3*=R1WP|cBG=7*r|X9V6tx|;dt2jP&s>wPuoiPf=)=)a -}qzPF2@_kL0Qy$8HGih;xBy@wY5%!QhijGh(jz?@Tvx<K~2)%YbBm{|ql3il=y8ZQ^7TWwB`+(-8+AZ -{bQVWYuPWqzV$8y|O8P`y)i4y$%H{QwG}%Li#?;JrD@W8oajOc%e1F7iK+g_W%nMmdjVFNzk}9Sv*5r -r19rZ5HRhnNx9gVn3eH!x81K!C}U(*sdO)ryRYU>a$_YB6J}+T)ZM@q4vg5J9P~j3@zJiPRl1{=F5gI -<SWlz6ztg%`ED2Sa$N{%y@`FC7JMpzh$6B~?o4d7B?M*$?)u<;RqOPSbMYc+UFy0Q_vYP+aVi#cxM7D -!eV!T-t|gN5n?2-<O!4YSJ}U0~_3WOE_!Q@xObqR-cfO%A){vakYlEoG*)}@!`xfq%5k5@Dsgut^2;s -SD#S@P-`3%%lUnotcu7~%-g_L0A`MjJE$yD~nFcQmeE2gyBQ<M0d?(nA=dbAFeU6feL4Q;#`JvpkXk( -N7@#Ws@WmswvWL$ZYvqx6U4{w}6bPx<=w&)Fxy7ccuVPO`eRe*Z#$yY#m;i1<i9`Saa=FcJT{%LgSqh -M_2Y2|o~&Kq-o%X^ccEVhKiYlq6{qg)#I~ErJBhb^vqk)yoxKBadXIc`UIAlY&YEnyzF1=&wBXXbOx! -CT}eb98h$zb#5eG%NYy`ejpeS;ZP}vKhjlaC(r+d{Hj>81P}?b%HXX8muRJw0JlGEHRoZ#{7amGVU*> ->z~2=Ep-oJDxqd)d!B<=KRk9#YK!YM*4f%-lU({~}iiHO#mR$L7N_a=!II)F)i4Z>D3b)-<hVbWJ0qS -SHh-LA@-+K|KFMe{(x8V@xl`N?91%)Q)`&kvCc{8aCJ?pjP@E@fG0E81j*v@!!j3qQ@S^Jka2wh+iFs -ovJqQ3r3Zl`x7<fjunp`_!UN&D9E_<n9h9N*o>y|2?XpN(Zgznsh5Kk6d$y*WRjl1lLoeRJ{d?D@Ni! -%Z|adGln1;tYk4c7q4TGiY8rI3H^tm1mq2Ez=s)_{rmsZIxYcnY`4M+)XI+?8(c5hInJZ7kRJ^2rjgg --7tgTCyB=-@-4ZkOpY5jG-zzr_IU)Y9%U@>;?}aBg?l<4)KejcagM698uifV)05dw_OY!F^i(fl{zH+ -ah~3>C6VtdS#*oE$5&d2^EgQCJ<r#OI_Lzm&3B4$C1yMreM#=@d9F$HtZ@BESN0L5%_U+?9v)dR(>g} -W3(-v<hIA+WY$(#<b+ICR`KMKx<==!O<*rf1tBnfSF;dhCzOF0)lGZx<<qo-vK&f~r0waVjm|H_@{9G -+_{)>+`I2CM{;4OC2G)#dk(i>#=zrt`r~{1;k1&__~*S?y8j*^AqpNNwyUZ1YqzIV3VkdeqtV067N?? -B><Lu7GyI_rR#XVxIWoUgyDYAD}k_I~TD&HL!!eIoSQ==k%?)Aqay5-%4M&*h%w1E?2#g_Yvhf0|t>H -c7+Kh!9}mhMr`kIcB6aPyPRb|>?G4oGqDrG+6cT>ZsXC+QP%Xk1JbhOojNpI2s>S#r&LRr<3?TZjK7- -R^g3ks-J^I6>U7;=O7b`;c^gl(>X|n}I-eg%a=Bf|OFz{uBoOt3KM2pQ-yK`4-&L8>b+6}6uPkbJ&~a -zyo-S<ADz~t9t1u7bJnS@AO4(-@zK%A;A73gNk%xREj*O6Qwn^|p&uC^Xp?qxM3O1<lRzGabV|ZZXQ0 -5xDr7LwGyn-<zo)(0ugYtOD1mYje{wl!X=;3=`i{jDoH(IFm#C6gsTPN)DpoI8+yp{dafO)DC|ADXhi -ca4-!TvKO{KFl8#KLbo{V=Ra0X;hsNWo$VOdte-qZo=TDLK6)<0M1T1oNpd&w^R`Y61t)1_uPj1s<35 -79l})y}%=Ynh5CdgSnW`74EPIKpeGlFc;_oG6V1``i}#b*9DF6H(l1%i#EYQs-CY?HOQ}6nLzUZUI%D -!u-%f9FZc$Gbz;!%Umz8Qfp~w4fXPy9)%9Nm2EZ*K2_TsQASFTbez~;;T9+$JS1gW}yZimD=5qzZZ;k -mSmpWgJ%02gu&TvPSK33Pu=Z*ROe-4J<^y3y(lfGb;{hh(;4|RLcbFX2oQt>s%t!mJi2ZB2_vZR^75N -H2SuL$~hNq=%h|D<aE)NLxb$&(kE;Y3(^zbpzzR2xfcTTOv*-a%*cczI@*%xbh9Ce4Wds4&a!d2*IY< -W<j(MkzVlV|lS5wM$hhVfL)(Jb5{1pJwh6w3U=0(qc2dTJ%nrALjk+yR!Dcj|8&4oVycTKblM<G}Jbf -tCiRKt~(wM;kK3uFG_Y$)v1!wKT}Kfd2`@)BZm~UE}jm%(~Y^FxcYjO#%rPmEK+bB?`I+I>qc}Lo_%9 -EoeC-KiKw^!mG%xv8y3tZ2qHmn=go3rjtx9TkXefCgNWWOvFy#*I9h?^J`+{iP?!z{-KE*>_Q&&y!>X -&hLr&e(O*b^*9d0|mEMoD}><)N&Sn|y?d^&a&b`ie0y22w=g#91cy8bg=ojoIR+K$WXvw*@l!9M1Dso -dK6-qxC6zH1c>8h;<5eZ+P>@5?IsqpfT5<r9~_ed6AdMMPJY57L`X0k~ZIE-z7)$rV-NEq{aJKKnOL@ -0DDXY#v#eJ0cjWTpu8#f?O*QsHvo1hVhJ=vm?p8b?=?zERq`|=t+7L@n;X_bjrBx_NFIXRK%|@;;AN1 -o9<*l3S1fC)1*y4vRiqKsk0>uTsFJcQ+x?!Yo2o_-Xt9_TnyQw$qP~@63q}t{8?WZt%XzqZUv;gY{hh -QA9(#t7~8$e2+_$xL-={*@VRB58G^@_Fu3<Y+HDDp5A-J)Dk&QW&{-GBy~B(1pb~|w##b#p+3|GsJgJ -l1>qa;88aeraj@6^2-!Gj%OHnc@UZjo;Jta_1AB2{hZcZ7oBzD0=*FUq|^|{2$UMN`VW49;h*fRI|?x -;@NDBh2`WhkkNm6lH@{-0~{7@8p%f5S$5-+=w=aBj~-mVOlI`F9TRRki1Dcm7ck7RQJMCNUDHQJh(zl -EIgBk|tn!`45fZIEfR~r(+C60(#*KNapKE0JX~P5G1G&16hD%wQ55^Mo7c|qCOWlAW2XGUodsSuzVGo -W7ewnlI5iY5R?N}v8$#*yn-B{x}`vnhx(;(PXgqGQWC&*{w772|0}{km3o2nY|U&D1k|%Zt{4Lj8?_d -&^Hp>Yq5qXLU@v+#i-!r2b|P!59h9`m-`21dkP(ev#~4hf7ni5MYjF0ygj6`f)^T(Er9=Bi;T~B1P9A -4@w@zQ7FTvqSEgT;xx0OwTSxr)j<~x5#<R(pVQRyDG%qtYcNaKoke6viL(H+=2uA`~qbcy{24t;al&2 -00vQ?Atd(Qz5kdHpd3?xhKD+Un333LJ2TeJ#1^Hwv68b05%GF)K0FxVPKoInB1PT>~6?z}$llg!LkM$ -r5DmrCID-gVQt>aZH`SpV}DP)tc3hGW#wDAqftQ93e}j0Sp(8+ziXg(k#!Q(|Grt?w5V{4F0}~{-@kI -&?SXM{&2<)Rc$>n$W6r9W9<MY+wGV|`;+rfHq=9%3#>ZKwA?)T^WNjb+i<6PFB?-yn&u4QYZu|R*99< -9`6{QdP5FLwawQT*_-VAXZKM+(A35VVDe~+-+0u!W;88WSvLmbA4to_-6kN-YhD_q_`Be7McghBl)m9 -dx=(u@un_M=%&EuXG=mEvlF=}HE7o#fCryk8|(N-G_yPYo322BSuYiT2fU#PG0bS(ErAICaFed2?0-t -|xUA$h{t5Ub<$WbcILYLRyq*~|0QK5Zbu*>p;LbCzduxailrVKAP{n^NdTjxN$e6=5>Miy_=od(M|84 -$~DP=tJ=ai%voqP`CHg+u`0a?_#sKY%Cw5!;ejE^WYo)VX8+@CoT5s@E0{E6ur6l(8r4K-wzOQyEjrE -ErK??CXfYm+_Pj^m3^vMqj9F60FGDMzR%P#s+VsRerEmDSt9e(cLn;Mh`DV1ivOm~e!QHsb{oWGnh*n -aekdn3fb7&z2+>$#z3uM$^!p)WyquTpFz-AelkSW_YBgq9hvFbQMLNYae>7xKy>cYS-`OXm@(gz-l*A -T&noi>E(S<jSF4)6@{*HllU9wS|BR!8&-0#$&edq;l==3#WV0+e*Eo4op*56gRDLNnB;@hJbau`yby@ -I9<T1@Ks6dKb0PTi~fq2i22@ZlZD95T6!=t9MzdFR>nmRn-&Hc{nVq@L};LlwC0Lgt9ux)<j?5zQW*y -P<atqYc3(H{y6Btl15TG+kCCa>L_BE8zyAar<I&G>?mGeM2Ww`Zxx5kI_1pRnuAQpA{!*7NukdA_$!G --B_}AC^Y{;oBd0B`7gU~9so7(-+^fM1OEQJ<>7xF{ulp|p#EPu;5)AW;lX|Yc!XS%UItk*VUz)K@5`S -B^C^NLF`A?i6sM`>g-^@FYY%z>;Uxu5V9<$PP!mbl3M&E%!wd=L1($4e0n}e;zEe0r*ad$RY;~Jk@EZ -e3@sg6_F_60j-1G!6%t;)0$pZU!0*oyt*{^J42>{hgP_X31%W;=9mWtNvOn~SGaB!!91s<}x(nYI&?G -iFjt4=*bfgB%RPZp!#%7C?91U6VM1>pVfsp<sKmbjB&0p6qUb4>3N=@BYYnOC(S_4w!I;qzx1@eeN5P -V2$xl5$2b&WX_pS*c;2RyaJN9ct|X46nw+yT1D?{n}eqrDZKrymj44KH&C}pMLdWg}!;n2EbEu`k^hn -q|9r^{IxC2oj+bN^iMDO;}t{y^pd|=$Np(bE!0niv^5!%Q5C=O)Dl2F*sd9<Y?JpkJdZP!P?~t4rl~U -gd^qolW5c9#(QS)jjN3*s<#V*dQm;H&T_P6rz+ZR5$;wTArxs*)JVFLP%DbW=lV?u4!T}#IM<<HZYOd -vJHXKixW9wYq@Jc?OC8@bkCg$YmvwyJ1#zAil)XMtBX8q0KNzcQhJ^6lzhg18gQQ5b+lat)o?Nh!mlv -r-7#JF8M@#dlp=gu~AKXekr6*uuNo)FVR9%t91j?TTUme`X>4^|$l7IGW{?Yxf)txLA%e8~}9XlR^bI -a}FbEDl`*;&FeaXe%iNmucm7x_PCo()-wtq`S{vk2V#}{P6$>e18))^&vRlQtAYx)aH-bFfWd;e2D;H -GC=$6x*z!NaFbXqO100-R3PqGZYq-cC3UtAnplq(=n#sAZ2CWD&QJ{M$S8A9F#Y}oi@$y!+~xIj4eE& -bN3Ny!!*}6#T7cB8es%+r-*U1ah9yQR{ToN@-IOpA8X|Km3{M%7Es<tryC|+)Plu{vJ(L$(HWE6jL9> -=H@xxU;94Be!&SM*Tmhc$Uhgxl+5@C~K0Zv@lvrm#eSac<5*(MC<J?l(KnVHk&q!XFG$N9mIuddE)W! -b&I@?C{TwE}IsX;RSpyp#Kk%M)pd_OIdsXQx&<+|HGg-}i8M5!=%|K6cXf;IrG?-grI5FrG1GctYboQ -|U&>?kJbtu6U1D?meC@34X;T_LySlmENT8#aK(|RNRbRW+i6gAY@;L24gBZbdjef+Dp5%nS@t*ru8<x -UqTx}v=_02EQohjGE_U>HuR$o#MkIWe6c*S*FR0AMV|l9)9HVHkPj*K-yGlv(^!O{Xp~+MmV)U8fYAk -P!Jrt5tRyjt!DyKIlo<vjk5<(t;LM(a?3lp7pcqL55BE2=R}_IN@{%>9zYqsl_r^0I4glO>QvjFQDnY -m$Z%K~{cpVobK_!~bRw!Q)`j<UfWM!l=D8SkUx{=j@c0to6Z;n#HvPV}lc+lBh2hHM@$qvpJ0W<h$^- -5c=16{|+76?yca7|0T4|b=12fF+jWYxttcQOUep4V1o6Nz&jR?b?~2=^7c=Zazh-O4zEBH7GyrSpN*^ -iMPDH+6x3Bcldgu&<hf>bHzqGGXlxP2P)91G>6zS@k<{YkAQT@$ZRS<sTFcpx@o&?`{$L-97&97NL*# -m{zRG70H)hm&yUUO<|g>TIgqXfpH7FKhvb;rQk%RnQcMRVBdmEha4OAz}*RsRW>Kw?CT>3bDXh6wLQF -R#<@r{humP<e*biZK)j>pDX63?yn~Y5+B1A<4o6Z|WPBU*^pp3R_~P9U8quA{8QpFC{!UQ`hkLXu-}< -Aq7m`HD5}dSj7h+e_&GSaH)RgF)><`A(q3_5_KYmn4y$42mY$dYPsK?p$g=OsJHQ-ggr94?;>;2{`v` -}tV^0Lx1^1hs(cDxVRS2|zXd`8BjX2=^!P_Asny39_a?I@YE3nyEYUgee%JGb-+$wJ1uTPjrz7HO;4n -nsx*hB>9Tbb1ha-(y<aNP|C5m<-i+#J_yi&i2{s2kR-Bee37FzXxWD`pfHfF3RDrFZ5kv`?kN-Kf3g7 -Jr%pOzukXY!2iEI&-)txn{#}>z%L6sLemsQQwV}#2*E7NIZVR@K`;nHqZonH81iXW6(?Z4hd{u%Y(xQ -a3LvnMV8CcuQ<tTYTGhnSRigYCihWDgf})_gm#q!G>`h#cSO;}ilP!z^HB+1fe_|LkC6`0OK&9nZea2 -Od23?aNP;JH6F)9)ecL9xfEu_+`K_;55DlZgR{+HY^SzRudg&aT@4WIxdbtFjhfTb1%#Ax&1s=o*{Sm -1~D>jG~&$ZOhKHwBl3JXh?!<mBzIsK4jxXYCbHc>6vAnhS@dI~Vm1;i>*^WxNBm@n@nmF9;ZVq&)kLk -?Jhz2G71v>x2&6IG*T&;Tj}vt@kxsT7G^eo!&splKFMKXUVDZ_Z__D@6a8Z%>K!KOEFhj^S2Tzq=Ry) -BTjn7&bnZ|O%cyuUn6u!0wvUs4NM>n_^tB0EY`}`GdkbZRwvCiQD)3eyGw|cu*#R!-ezA5svw%Jjw%} -n&>MxfIoh7?S~e%gnD+?f_o^@WnRz9sS8H}L?!G#VG4I=-pyh|gMm^$Z->#JV%)9GjITiZ8p8A3}GrP -Mp`hXFz+gziG+bNql*i#32BkZ}oYk1DC57n3GSt(V$xXFS%@A0TN1-5++H!^ju&+{$4O5zPcV<GUSg1 -uMB-0di1+1_bgwY{TtRCXL25A$WnQD|f^{kgXfL)erLRzCNPr6bE~T1OZ@u;mo)nUS`pTmFoNlz{65d -)9(Fm#7n$ZE%;M)_e|@Bko>zl|{GdtKUV}CRkSOdxi!lO;6iM!?*_=ko!C*G)Fti<&JrV+t=iscX9#Y -BCXu{a>=}lxPfisoMMH9Qr-TsIT~g^mFgidIcs<5E=wAcZ*bJnMz5Ld*H~VVfq`%ivktu+k4)J!6za? -5G~TVi<(Z*)*nkH6rJRb0qci_Z1%m!WU*$gPn_Cspccrtio!Jhhyiw!brM#FU^gV^=j~G1Squh=UCB7 -Yr(KRN>K5G5Q!H<{OaGQ(CDto)W!p*Uo;fw;D&-hg{Pqo#w+I*F$y1~p)!9D32b9XndQ79jth$E<^=` -yiJZ+rfQq7&DqspctDHCzR9bkTW+6XJE@QkumS3*S5oB#>%eoJtyc9tZu-bAw3@g{E9O4Vk4jRq%t;* -va;xT`x&<QVt={kvFHBtHP0UmW-+Kh+odqDS}GfGg&G=mwThtuf1gyN-2v^-;&SsF>jnywP))h$xXpy -#d3LgrkVKgI1{h)kqyH$Bvm+zPp?Mr#h|YzJH4}3k5cXOlq&y*qb}`k(qJP;b`!XipFGe_e$w24(%~l -_Ry$~WpmM%|{~XBItfuH9AedgB+gCrFe=-gEe3S3JLcrTUlpkr(S%guB!cmyPNED$yRZ5T6e%yj5M7$ -D3(bZIAbwf_+6?Vvfp)^Q@@^pckPf-yRB{MKtyFe*U03?fW(ES7RCnzW`zR8ynZ_>E<YSodhI_lIfP; -p6J;&n0?*hFTl*<}Wro-_^;o+TFoy16Kr%uOf&m7q9^gX{=jCv$<BB?9<ASPtHTV{l(N0j6gnP(b}HD -qaEm=E8r|u{}}=K8nYeTWvqpu@%gZI<}#`1gL;kw>HTHwh<$_88V-Nqm%ZXD~P7?@BJ{8C;`h95&)w{ -2tX?jS(d6%e^W&N_}ZuopV*Bo(LMA9e>L8<`p8F!7_%<P{LKl39Y^&`p3udu_|von^fy&LH99IgWQb; -6aoeJ#?!$q)o(!?2EJ+D6`J8hh4w<}C2RkBq$;Wa!$bS8#gV?Vt+#b#hgPryB#^R_(ok!}P#lfAJtwX -{VO+UXBdFozJVJ1go$A<8vY|5MSf;~J_F0o$7vti7#Gd%YNyl*|RL!0(K-CnBYpDW`+yj0Jf;t`s;{O -%#!OJ7_AegUczF+DM{s!H?j`PYc-$VtV=_Qh<?7uMkLvz+jgyNl-nKUXknLI?)G<b!rN$k%OE(XJTOh -0rDL;GizA=Ge}nynD;CluTduy!Y5wco0lUbDRlL<zf`t-HYZ{c>BRftHaUIq(<MIj(1BgD$Z*6xq7Rn -u}3c0u_t{t&c97tjAIeke})M11KXHRYYw~>J`3gL4xYp`J%MrJ2!-qy#VrXQeVqN9jpfqVo9Oo+WAG` -4{@sspQPk{qm@9}iw>$gzt0`Gg=6znaSy|qQ;KQ{RC|Pd)$!GLiyRI~~tnL)lyl%@Ll{0dCWQFa%LG- -If4ACYM0w!<q+)-~&*rZD+_Q=L<kB0cHp8MhQBxk_rJSeaEzERs}6xhTTQB($Vgi@&|Ru0A^vV0tinW -I{%OQ1Z72!U_3-Z9Q3nvh}OIL+fQq_sCzlzUr3kqW7s$C0y<=|Uq)BbZ~rTocjcgZtwFDSpXa$jgb8j -4Q{eGBda?S3E2hbMLXTM}p8_uKGa;S&m?cqhpUaK#E#z&|@>&<OmJ0*^Ye7-Vk@}s;8%)`;a?YiSpbY -4~KjUA5q2R6i>7b%GTKO8kzkehrP{#GxpmhGVostErufetd(a*pr<t7oSKC9eSUj=!13v^al*qtGGNX -g!#ydpznrYe>c0IdX90vfe|nRZL2l^$5BPsOOWs{TvTn$3A3a3=n+N{tF!IZT{xDQZe_9q?+g5l4MBW -#igXxt%y5?Ir1?1gx7)Y)oYq=1nKOfZ~03d>0VZc8{)~O641-a;QB%nLB3PvpeiopOG=>$+k7sPy*q5 -4@fbk%xV@ReAHM3Yq{l*(6n={k|R95H&6&xk<A3SQ5Ev?xgdq7U#{j@RNKyfS{)td?5GKd9w^zaQ1;z -`$t#)qk1WeeSh9eaM=YLx~Bbas7LV%dun+Nfo_{<Rxd5y?f{n&)8m7I`c0jAdp4*9*?-8KQ(|S3aQf9 -sfi};)_PjCEI;o_VDyWFesvxJCRg9vYJvHU)pPkfTP@<P(zm=;{d^k`xR3wjHXv{x|H*AYYe{gqjejs -GdE-e9!PWakI*2Y*Ml>xNCK1nGYF{a!+^jcl2gj&g$t~Aj_6@7{PKfMJO}5jFh?R$jizLRKavuAVhfI -BY?5XRrid=1(9FunF)&0xuHVe#KTcsdh6WMNEhaI?$uFQN_jjSI%5ww^Qtr~C8O%fvHe#{EO*<aaLs1 ->+sOJN*6pAqhr0qZt-Qj4@?23*yk!}WG{1`W+fGVh}^Vne!qCn;n?-1HXHvqDgv9B6mTm0VNXgo8&#S -T3{YqQ|4Xoe>Tf(4nKBGGA$9xa||jygnr)%8wDd@d-mJTO}-CJBda>5^#~sawDhwBN`e;O{eO@yr?;1 -XUD6WJIDCF0u57y#`R_Uy;8&np3F32b^LgG4l?D%`P2^*I_~eUN2<;25&Fc$OZu#7$9?t%TOe_j4{Ky -Ayg5xxyt<pXC880(J04w#yCVmuG*{qgPLV;|7SzTsy6J&v8bc8z8{h61XxNqH-5FeRu1^+*M^*8pm01 -ck(|*lmJ|DF7tT(5#I-GZ2YzOxKQg4PJ(T7sZq)P;;^X1fRJyH`lj}E<P_UmEv?6EpN_zR-%DEMadc& -F00klGefSGTYaGu309ojPoVLj#d#sjLliQUe^m=gCuduac<Wx^tD3&!(yH<6b%ol7mR5Tb?+A;c+>Ar -O090;OA$zfu{Ht=nq?<jI<djrt+V<e8Xi|XDqJLg9<6BBjXpbB^zh|cI|YpEr}B=wIg16MC(F)i;{+~ -_2uO-%c>J>80E-$;R5jg02BFFyyRgk0)1b>G`@Rdl}h-S+x_`&U-P|Bcln_WMq>m8V<<)A1Vhp&O;I? -FW8~+ZFBFIcED%Ripl3uftI_aE;K(8{@wdE~ucLzt)@7ehBN90fF31Rgk@4z$LeT)nmQ)WAQYlc?#8+ ->|galxN#(<@Y;miO2N)v$ubBJjU=q5{EnK5gjcGc(xR8t0!MuFE!1b}scwKM{lw!mwgf<ckx;;9w4v( -@<##lSGhlI&s(AgD&ahqxXTM*FXY(Zlln2LEsZ?q3gX@u@VnF^hr51z(GTM-yw#fL`%7bv1r*LH@xsM -9BOdh?~Da!CMIrdavPqn>th{{as8z`eKmv<7;2fzP8T(le2@9L+jc90TFYfo$04#nPGX{(z;GS6n}gT -(@m-R(<F9AD@VPF60hZotSFrcEB9g);|&xskla6rn3H-tp{0<h&waR`ZD>cw=j|Njt?U;fOv(G!j**b -H=gE{A;aMU4c|)=keuW9Okx`>@MDt{z=R=HnMvJ~6<uDYZ7#`T%+ub@sJ`WsRMWV*usmIpHjt_ZgX^a -us1Jmv-^M+aM@@z8yxO{UW>U@L-?5<s$>W0;MjCe4yRnHyGB-iw)^!`<)I)n$~W|E%l%rHD90e*O5@s -dh})A{A=Gb9b{MS$CjedOosExk`sG8!(I-tNx%WQPu|;fXqy<#pNrQCMfw7;{76FtG@y%ghGQ$#%Po` -IU&-XsUev1wMSr>41JjBOB$FyPn-&cU64JUbV|+a(I+BGI}$+eJ5fX0_c9)g?42}s5}#2iI~9gT00YC ->hJE6uMI!UPOO85OqGIvl~u}W<#<3JosOkLpk^aN&ik=&)X>)&>Uc#->2TsspVd~NFT)i+HTG36Sw<7 -)yN%jKO9JHfBik?>?Ods>D!uYDR{Vf+{{E01cXJ>`8%3)i|GJ=Heq_|@Zop<NqI0Mvqiql|dnUBge7K -%Mbz|U8-4_=W=XX2$9LOnko{$%xxD#|T8luBF<rtwQKPK+c&9^LCM*=&D1gbR`Z1Z}>C0ZJA#dNT8U2 --p&+04&PyC3do5A|(wa|a&_bCz&qqo_}<;}(pI1qRhI@^Jymd8D6P&6sHJPz4sZaZZ@HQ*Y_x_*fzp7 -A8~q%#|Bl#3+fP`P#oBo8;uBd_lH+e0j!ICEYJ$5f;)89vb*{sV6@T5|cZ@l@Iv`#Mi8yAtptMA2h4> -Pw}viR6`@YKZCdhk;+F`lw-8!QOS}=@%{h$fBsrB;Z-jvJMPslnbqe!jqic)zj3g4IQ;Fl-y<VRGXx3 -K^a6?$Mj$jp5(JFF#Io8E%L^zlPNqJcQ$*HMB)n?v01roUrBJ4zO_yhDxsw2ePS8}0{}q4UKU{EXfh~ -BI9;7lr0a^Y_#GvN7VD6G6E;vi949z45%0$cI7dTFUYvnIsa!Dy866^+sCNWSl1tri`${0uz=Ri7$Tr -qO_VFAkp>_Kk1&W2zseIzFUv=b}EBwMS#%Qo<8b@>PG5qD52CB7*fO39fC-88vT=Ox0TYHrxm-RE<P* -+*8U>&@RXAifwQ6D^UrP5TrTzhppwY_@t!E(_QMLm`h(`-<(qG!`}0_e>kEzdAhrZi)h0$0!8x1)7g< -49xVc1^D4LO~OA230o)4)<#G*zf{J!ix4T^BScFqu(>tM1Ir?q>_42Bl}@qhLnU4{{tLfj9Lvz-4v_s -VG5w`9&X=KxPi-im@BPExZ76WtJyJaup9LKWX>?F9m~>h+g<rHwqdNQ=#WJe$Ybmh`WWU0gclEm(64# -gR3XIQPDtaE(hnW-G^r}`ecHmAg{D`wrecYDlNgk{lcY&ut?bs4JSIVow>>Y2Zt+J!`sI@;g&K!|`w& -nL+jWZ!Xz^7-kbx<bF5W94FUqJ(39Ezugogg9X9Su2JLEex^n&Nk&pP7-D=MvEy;rzTB6Yie){fXlR* -H$pmf#I^D8e2n8MW7;(!*%yC4{wv{msFiN$W1GEglY0aT^rPOV{y8y37gYVuTBVhdl++7?HT(d-0FCN -vmKPr$#ru|@fmRjACA%<XN}rDa!51e(&3t4dbqY=E_`Atey_s2zTJed2OGY5y+wJ>LifUwvc_a@H^O0 -Vrw-2xx}O#Mn&YM0I?|=h$J9*ZhO;>@2|9w6j}k3ilQi4d+lLGJ3bGL$V=|xVIp!*V9-IEyF?XgUkHH -mf0_MKEO!V2T#VjV;{c*^NBg~Om%r|U!u%XU@RVi{!)<$Qoi~7by=j?K$xQW9>e_K{`MhY)CO8Hx(>` -Jap>9X9MJ+AHdcl4q_X?sGA`{o#wNtlg&KU+7unDBCXy|&LMQ$~lhlc@oB0?Y_Er+N%XOhw~!7jjFUc -fLUS`LSPO9iq!-?R-=4UC<={EqGQOGi0{ixosts!s#6LNF|&-9kJRM(bd@HwNE`kT$0&03(%`37e7*5 -Ief`j!;XH)_O588QF4g`;MdmIB^nyPOpJavEozv77`}RiWlf+sJ|4_vbrQhW_gz}ZWi>XDIX_uqoF%H -~Ea|Qt6o_v^nra4I*qsPjI&znC4#Zzgk1Ss_J~jjwsk!6D+dXobgC5TYRe1y1p&X3J*HD*;J1ZT-Zo6 -;qwy9Whf1R$rk#UFKVwymnwCkyB<8JJ)AsIB#aSShBcNEU;5|g}I&cjUkb(ybwqrk&gaHCTnIikL^5y -G_UQQhQuMb2)|9nCU>P#>Y)Y3N<W@;Y`3bFXL2&}`hIDy-M&X;$Yw$JCo{cY6qP_=FqMqf<E4e{td|* -z-4j3l*0fBP)#DJjUT_pIrlqQ@9a<*agFLzLp{?+ze5C)3vl}#iM?D#J8%s@aV2Ec@~8#a!ctCeBi}C -eH=FN3CyZnk0K%CU?Wq7Hd=YK@4Iq?g=5GkRE$;8lC=lS<|gYc2@#KGPd5BsKxIdHsDqrTV<Y(X$s|# -Zq{BjGlv<JwhZ;-E>|pbax|fI>E#H<b?BQ}yk7}6ePU5s1tkx2Zgc#)tF&~##nOQ=scxM=U2A<d$qGr -Ed$w=%aT~-bPb&l;?x1nuil6hQR_UVLPlVaR()>LRgrq?B`)>5*>P`#|k2Qz3y0wV&SJmZyhyj;*(ur -}xn$rt2&>(M1Yurti7&5^`Xyv8amJt>q?z3xZSR?1*6Kj)C%7Ts`fH%e^X!yUI}3`c}~Cc$pCYG9EW# -n?;rG}n(G5*hInZro`7BD{76cJ7?k5I9~`LmYb*b!YlpbeheL0F}DAQPmS>SMaSn!dJd%bh1})F&zJ} -sA2rS$r4c6s;q;M?CZ~#VK{&B?2qBxZ?=4o)jq!ULjj&Z5g0`&6lW0PQwkTda;%n+2WUhyfa97cU~Dv -gQ)+mdh>h2RJ^n9*`ZNT~S5ZWuFinD@`4Y(i+HVY6)5~F&APJ}(<zV_WU&mId1RQdSlbBykz5>Sv1{@ -{9!K@Cxj_X7@@MOqVVj1!#V?nH?kQ7YI(CO+bzRvjo)7aJO6?D0Az(`w;hG(E}jsr)q-&QIN5Q3e*Hm -hZo4J4^!`Oh2G_YWPuW_Q#q@r^FI8m^WVh?-ouQJhK)H7<FtUYh}E8B6-kg7LzwnWMKvSdjU37!@?F% -}JkuM)DhxYL$lg?zN9+2PcRAld}UEB<N4=yV*lBKTedobFapbKHxp~xO#-pL$G~t!o$s}H<f!+!_t&5 -g@=}IDWY`Lm^_zn^OoqZw+2?0FO#rWw$IJ$NoKjC+;Y~0+?Q>h(Rg=N&$k<LtyrVoJnH!2V>)%<GQRM -L^I<RYVQesyeP{E#L$kAf5;E+(xf3a5r2#%WK6<|^W~WN~>%)Gr-k4U%CY%oPu*8BTNw8|s3$wP@1>( -XlDDL)lhQtV2n~=d$n+l%d7LKoG?vK3U2(VhrLpPsNeVdfJBnX{L^tQ+DjSK!7@%y1_(@Gs4QaL`MU9 -Xz>LvI?k7e|T0PTmt2jf45<E{6?+W9$OV{;R6s%QPRWz0&TLoojDT*ma!mF#Q#~e{0|U15Y>kCddb^K -yUC`%iJ3~K2EtB`}caU@C<kB^{)Q)un4<>%hwJ%R400)oKm7=n)A_mIa+;3=AA(^aG1FnQ&mG;kBn*C -rV~x3oIL0qOv)t=^WrN@0!Zsj+LrNS2R~hAqMRBJYj2lUNh5e(vL)4>#`l+}pc1+vH6Ge491$mQsnGQ -E5RV~*<HfX*>Zn+Li47UT6Do*4J)NrC4%u3Fo==A`#`aE>CzF{j$@gKS+;6a-<?WR?kSerGk#hIalED -!bPKaRn!ZW>MO|IGuPtK_XJbKX4eKV2lZr<xEoC$GgWcHA3o=L5b(0SV}A=c<zJJN2E)Ty_ZalD9zmb -Y<;V3(#UvlFGyPG5K-LuP5ooz(;3MWH9KLZd^>gB<;u*jbVloZ!9i-}e>zpTA`6qbm?VjW3L0`mZ0~` -BVMl{}bo`r%p!exqqxi&@h9*1Vu6oN)sgTGGb^PrU?{g7>b~2f?z)NTZjn&P8begEMdUZCBF8haT>I6 -fvDh02u^V@00Mt50<mBmldX=C^y(Q-fw4^t$P)o*0xaSf%!Q`tDjtXeyv36hBGX^>rEyUAkAcGjPz3~ -qj<pj2O84uYfOwsNcJu;^L<V})3vMnyEcb#kfJ~jC03w&4aSZ4-Em%n=s{jR1R{AXzZo!P`Bl=d2h^9 -xwwXe(_IOd#P#;G_e^T%-h{>El*KN0PdD%Sm~!|SF^jJ%i1n@8}%Cu2dlcUCi`eWUl{s`%5!#bIUlsz -vZMt-mxO&mjrw7BNcPq0AA{F9J5813dgwe<WzFYrOeZ&R<#w_;SE;EoFRd9cY;5EP(8&v+mT0;q{<ux -B@fuE2E^(eUj=?AKzt#-$>jLIFrG1KW+Rcwh>DR0YmR|Er;))w#2=FRBY1KzZ>Bxpyeqm+WfOT;xEGj -eLkPsU7$Gn$pAu*o5%A|;;#-7Zz<PT*HFc$cJJafM+WnYsP<b<ev0<%94YLcopuQ?dmZYqmy2ezt=mH -7J!;OmKq9zZBzxv4Uy?0XJKifBUZR54nq5(fyg(?MiV2~fqbL#1@+%GK(nc>u2N7ebB?1Y*tOGasnQ( -HBGdn5wXy6=tkV(De-QqBm0XoGJM&;(t%&sHGt9Ch_k6RzwwbMOd&BkfGO`dJGjaX&Fgr$iJODFu?wA -%wuJ#LmMN<&Z;saM1j3#XRKb#ykd2S{l5kF@a@e9tz=y5`&&4R)rE?xa2)^v90ux@Nd()RDSqdr{hQO -Hx}c!3$HkX`Y2VR6dLbaTEUE3Jc6&gnr2XHH&!lWa$)Is_4@Vou#-D@U5oM!^g0IAK$_PXo(Ak$vPgr -o};qv%ycAvZ?pV~4jcDWG?&XJeMIVuNp6I4HOZ5BEBCbTI7Ui0y6$k$?2;VK(&EJ1v%ZVv%e5adv@8= -QC#v4xQ6rHxcDdi5v!kfuk0oFc*$Wj3O4<musYCS>WA0OcZc0&Cg3;jc=DPP{EO|Pq6i%4#ho|eLJE% -%=rgl1sQy3-pY{~c(F}ukE#QG&uxpLWX6}R(dnm&>O+o!Z(V#h;KCU(v0$H$8cvY<xkTOpib<z5j!re -cU0xC&(N?ix=IyCa6(hb?xf{A?#*pTlD!D|T5RrPq}|2~rBG=Syr6r+Oo87>m81uGff1W$1pX&v+u<C -St~EWYZVr;U-(+@SnObeerz$=za7BgQ@?j#nON6Tz~JQ^ph(!g)9J$p)g6IG)mwI3@<;E2)Sgr3%)O4 -zht^F`3ut7n+PxvX293HG6h}p1(mUEZJfUq@>ee;{Bu(F0<B=yGg-Us7#I>wRw^4HKvO`*5Til=JjVe -;df5`DS1l;`t2xt8;2y262@9qZFi3BgWIQ5Q*+t}w(cyycfcu?;KXeS7l#qO-V`JbPOEf~|V1AY$0jw -{f0>OZNv$tU24`xxpqFtch%#`x6J?X9J&^5EGkW))iC-1XaRN*s${l7O-`pFLodh`BC{w+VGoxq;I0- -KEet@lr{;#c)0sh-726WkvZo@PT>Vgsl6Ug1gnMBl>GIPIOFrh%)5zQ63{0Ha=f0q+<6Z364XEwPD&r -Luef7`H&b3S5@BrPg@$J#LBLpV9ZY4O%kLDqZ~UtGz6VA{!_GpXUk&tG=|yMUmxIAt+d}AN-`~9$uGA -cBbZ=a~W+RE{pSi+#Llomsv?(mcyNWu=llDb>g<)USEm4K}2lZVb=`5NpyQfyRvBJl2N+$p_9-hx;!@ -2bxt&{JMUEl*&ES4M~Cr2Pn+wRptpB*x+vD>)q0<~214K42L8@9upJ6kV}&llHj-?Rhv81{A>mk9c)a -|&ia`Bx?;?oKB9k4%LY-J0!*MB9d@^tOyTLF4zi(z&m+_kR)DVOA+7;YRHe>;QKXOf?PFuEd_~&*T^b -Qry<8lzq)|=y;xXdBxPKB>b?yMrZjU)X8okDDXyTQ)>e^d8n&8ni$m+(EGqAuSKqg&>oBKm@P5Kursj -J{z;21StZ(>IT2KDAFxzm9+RTM@O78xeu6Pp-^dxt4308ZtZx^cIU_5}X!dVe7OkNzwgBbl_hvh}ge3 -xTF712Z8^ZbNTBa@k0iPpwxyF5rTpV5~u<(%zK!13l2a@o?*7Qfm76nDd4uUA`##bZ|f`lHi(JeO7Ai -GJ4ODUp<p{60h;ob*<l~^wlV~))F9hSz`;@m6h6V|4QM&PThSQkPa_mqqk-GZTk?mDw!{Bwpf!5ePT$ -EW{2pT6^3m))TARHk0>ku8HD=!R)wlK#&<-NO&rhxB?d`WP5`F4MM<7Q8qpWYedHgSBg2V$z0q4WlC= -syo<pqa#vUA|(b=CEKYVCfN0(KvH+58t<?&beF#C#PJ{97Sr{S;!hXaXDW*!Iar7y3E@EBqiLIQ*Ru1 -I`-y8e+Z;tm@+YN0~NN0v&JgySJ*M-6l=FzUA9~6`Qua@|Usc`_Kgao7nVSXj-9vLVW8x`mUeG2$jYp -Rr=_DPZ}tX``xH415F0^rgX|skmjRc-iVVqU+>NQ^!>68Mz2KK*9q2*XVWhef6{ePNeFXKL&0^u#gux -hZAp-&z4$7aOT<1TpVw8hn#k;Mu~$4CZ-+!=3lokn#=)v9e#iB02<sUXAv-d}54XEF-klCk*^3@I*!g -k9n0;o`;)@R>T(`qcj2SN~FFk*C4y-s^aulGB!$8cf3n*UFF4~BuL%sLT-mczaXhj(Jg*Z^;b7m)P&+ -k;>bjj=xGYGhN2D^xTotF-EptY#vcnFM(P_*-O_D6X=`uhkAwKdjkPrV(K_L<#+`%zetv-k*XslO7Td -A#2Bsd6jm_&42qe-(zIFLAi@muD^WF_oV8yAnSn{HtX5De6b`&m{u=>vSyFvJk3yb;mZ&Ee;5V6Y8f$ -G%kYR*!ZZbXuR8!lFdZ`^8@qT9zPFLdSJ0mAXoaJOR5h&_?Iv^zIDR*)>yoky~Tm!lAWHt(OSir9pRN -VRy(qS+df=gb+?pbKVF1q6CG0|8lV?l>Q`FP?%X5TK%3xLr#WB=Yjq=u#u9>|0uL9;Xx_dj4|duo%N0 -f)*Fj4qlnW|`4z6sg<=nPZ&(qyC)~2Jzu+g*G*-Jhg3qDp_mb;%%FMA59c5a_-(2Wj7`U^_onE^G_xI -d;>KS+#2OWW~T<|ytGH)*#II7ID(F_{9UB1V~xr~5rlZq2y%ZhvL%^d?-luXAFva-+g#Nh54X_5sQMe -Q5DdN~`Ffly#~9g0k}esrUakW#u0-PZ|cCZ*t2$F^ooF5@;eJ8;XEwia;m^ClLn4Khzf95=0^e95BFP -O8~14O8`x6%Nnt_#szSwhd~#X+F(HV@wij+7VgD?XwsGy0y{knlzc(q7Y1B8;w|e-Ab<`I<bg?0zTRS -d^ed7ZIHl-4_KUxjlTc8oCf|g05&^Yi@ZuCOyeS5>T{pNvzUP0pcio<1BG4p8-c)p;Km1nO06HJ<$>P -7(7UnyEDavo!!rM9xJM4qSN2=3=4TlSq5dJJJvt^#mhneR;C@F)AGW5BmjQyLEGN>p+|4B(1RFt9gOU -m}Cq>Q~iaLzxJls7aZZV~Q}CFO4;(f_if3?e_YrKSJ6r2G{Y{o9f<fJ=~3awyP*=a#4J7&rqaSUG3lI -F`M!sLFDjKa(d|kla(<9S6mnr5nW@1hdu{+lzI`c_5T0^kh`i9@}$P+tam<VFyPq6<0Rm!%b8(?SZ1~ -xPzTY@&$1^@R#-Cq2-{5HT2T-SHv$F$soclRA~pk*~)fA?X~v<o@CU&D6>Kz)meX}S$Uc1CAOFKb^nB -gFq^n7r{0O)#WUE44DtM@YX>^LEE=<hZ1INd_<k5Y_=MDlu?=r(IVps4wx8wVR1+WUU;Sk*BfXN((9@ -!tdos<6e#qN7kJD69%v_z0bvQP6yJyBhz=hM9mv+V7(4spW`LBMkx#oD|h7Fi)q4km5y0uW9RpkSEZ^ -I|Y?hgOl&egr&#<c6d%-j50obI1GqtgGegX{krr}hWa*1vaJKg1!>#v~}5!f=?z2^wLxC`4iufs!~5V -+e(k^v7gt`t70$EL0GX0OAP{LE5rKI)0Zc-vUes4%pbB%E)|d3PXZ$uw|?m0a!I#u%J*dVY?k{`xz3T -G`VfWJ_$5Yz(_uNyU@JJM<2x@^etz<#Si3NMBNUtWwIy%7}eW}0h!$p1Rh{ylL5*QP{F0aRm3#NaH$O -Ndg!;r1_J|@QAC6McMD)!){OmiZaaXPBvSq+*2Hz<m6x|<O%#M~ti+;|ls}NIKj*gNN7m{86+W$7+V( -GfTEFFiTQ17{U~=k3O^t59uiq&<{XM$(&k64@@?GYGeD?wwockr=J$j9|gx=d~@=H4UoymKDmcF~8Uu -JzFRV3;}Nw!n!=VQs@Un9NqUGG@><6q)Su!H_A+JV8Hul-Zx`*-(-@Us1WH@}UR{SCtThdD6xQ4&0(B -6jIS&NN>)WcH&yQiLUMlt{xLt0c7=)g*~JzaG_9f|$XpifBu!vhg)W_i%M#_GRR+n7k<AMfQ}nqWj8H -?#KMNtB}LYE7`%9PsU9v^4?b<1tpD4qJ348MEJs;yj@o+$CHt!M1Zms-^2cS;@5jq#9cbESXzl|dK6c -DG%WePQy^WZP$o-weDL=LdeANtr(^UbArwzEDv?y~(h$bIp16Su$DMN^F4npq2uprdrIeV^o-^z;IKM -9S88tOpWi!Lltl;9jx>>ojO-K~^^?ANhj5_3_GEvk0X&aRn4yq89r!&-PjK>-o%F9o8@b>W*_2xnr2! -Dy~*J<+U?&XIMwl2R7e=Xama{OYD1N|)@dKs2^zLx=GnVUp|+djw_Qc50DKSBPPyBLz|^M3sb{G`^=q -`j6b(3qaMDUc2mF0jQzl+=9<&ri8i(PK!TPPyE<4wv^(I#+|iyZ(31I(>vDqkeyX^49mq_mey@8h`d@ -eH*=g9!Z0~%%mmzwspibb7$R~hKFL@0|mauiu}=1_E`tS8A}}M*;Av-2}Ni&7SQu>KGlqnWAUO_$gq7 -bg8ie~HH%P+X>vqQYctlU(fW3ON$E~|?w~%kW;G7E+Pj8Ar|^g_H-5Oz0X^Vn4!Kt1wyJW$LqVQ{cp5 -lY$c@NY=Tm$_g57b2@I}!y;ok0Tudzof5);mhNt3b1ilM?H3ts2>v@i2SiaS|DxtC!*(AK%M7oqDobO -&*>G9k&B5WzYj=fjlmt{42V+mBEAIj(T>N-UgwrPD=dPhq(`P4ab1pt}|gEuT>p8>(&Vn8m1Pns=wfx -HZ2Fan_+hkQ7ou+^jhrWWxxMaWCvA#8-289J#A1$JqgIv?B&l2FeGSh!fTB((r9q{u9~$|G?25{}%v; -`j4^I|AXiG2cY#Y&hdNHMPdk!fpKq~MhJ|6Ns=Tm1Yu}`fRPP_kvI$!$VaFP3&9-N2CdR}!JYgfBfLG -x-aj|=gS?Yz6o_wqh`P3ClJ^u@@>V8>QBXM802}?b1!59_vEmFgEYJkl0mKYY=^{Z-`xmH-WI&@jc~7 -GQ*z{H`i{BzD2nPBe@mrq^v@Bxq-uRo%w&5y3Sz|yMBYw*!Z_iQ$s63$W0lw`dfMUvDTk#d3?>s%fqA -nd5b}Bv{)tphUv-+rlwC_L2{{Jr;yD$Hb8oOJc6_#Tlw}Sj&f$)LA^76SG1N|pA@cT>nS2qycKj=TXf -uH{h|NaJo`v-lwfqyRF?A*P3OS`YOY9{=3F^ja*RA!$m4J5k{Mq*8U*RXfhY=oPCCp{w!Wr^?(%{k@9 -&~(b-B?@zWy7C+NyXS^1uU!puEjFf5rXN68ykOOEKpzYRtIg|dBiE*q=TS^qOe1d7zWJqFJoIOLufO9 -K4}D}8|4-cFp^xn1|F&DaZun4@VME(c)ypBY5>N0AboE3eBcMF;V|65F4cX-lIVc1!ZvyFor^uCu@Iy -wM58JLBwofWVIK@^{@F%M?ue51J$JK9`ip8QxEO^BtpB7*QXcOZI+uz&ELrAi<YuHjF;x&unseN-%%z -3$I^3oP5rr6kcVhIZ-o#*4#GB^3~f(McPXHGo&Bd&g9yYRmJ_WykfM)IRh{@ZWT{~BO~Kwjbff6ZCg| -F1bsUgP!?xqtT2dB5<Gz1|`6{K0P3EljqJShXGa!`AzM`=gD||K+p!&I9OQoXL-6c>>2#pu~cZ$cMzQ -n0PzKQg2ab>>c*rb3uUTjRMBi7F4$|hQ**dLVv6_29toxwZ&B89a)k0Az}PoGH2e(oDrBXf-#^R2EUc -28S3pj|0@%MEjW`15Lk)d1Lnz_CWgJ8Z?|KmFyNpk=sN(XV2&MO02u)=wvo3RAOj+F@*Zv4&Iy<qyg6 -<7+Z~so|FY~MfwIT=mG~t)uGkYSYkfrh+;XJ*_nG^aCuyp8{-%A&0qx7XR|OZYjxp=|_P!y2<XoJ`0P -S-Jy~27aVvr%YUnaH(PnL#>YS)QG;G{nm(Y@|MU#cd`>{Pz^u*D61>2V)`bf;i^QQ+)>fzMfH%5dShx -RHj`VILMc7cpk!Hp=u@zRK<1x1r<@@A}oLU^Yr|i>2;#6x8{Xl@Qnl1Y<sL+u|tHu0NK39LfDox-s6C -QVqGv(saF;uwlEvvGudu;|xNj0Y&I`ed4RxGUnM_S>(&Sy<Xcz)E~*1KE4tq5*|K5glJt{jpG_F;Br1 -y)}fF25Eam`S-%KK>fhac>!N|n%nzd32N!dNR52MN*=kiWlB&xe-}N7fT+h6n#uTAP_E~sj=dvca0jO -ju<vLuMy282VwoE^!<#8%iLn#@dJ43ZZhne(xjVpI5_zb<zj5ZqKm2ZVb*n4{mx3B<__4MgYd!-H5fQ -+cvlq1!iE=jjS?3FF|B0fDYRH31#JLOySLoYQ0J?*4c*!OzLAmoNVG+W@Q$n(Q6^<HeHU>wmgJpp+vQ -YT5}Syzke5UOV$*t{o^YJcNH1X;WNGst+^DR0=->uj7l$m~!om&fx-XLDoAkg6wBwyvpT4!%ppM6$C& -ypR1t2`~P#qh#Bcc5)*z*XI7rRJbJ@w9QX+ga?eL%qYZZuWsjZ2`iixy{(aZ>Z>f-nmhL7SoesPfoI_ -1ra#~f2Cb~~ea9Y1oI#&8&cwgNo?B1tz1s8WVDk0EQLDR04ajA70zw48ZrdMTd#afH=XIi8i_a%cRJk -y{5)IAWB)fp3Q6}UAa_BOWv-qQ{?_Ws9(+>w#t2|J3##d%VCh_20c6rv`9_LpWypHZQJ{LrT^3aZ_>s -VI{t(O+p-Wj@a6f46FOR76Dhoo-PA%L@9>Z>avIp#CMz0y#H3Ay6g!CrYN+D_K@P|IJ3hj127BZlnPQ -BHCS)9eP%+p#X(=uzm{uxo9vd?b!n?B#UGjvBq95;W*#G<H65$nK%Jt$EJX5(@ErA7Nu&F<;jb1#X)& -QjKB9r9DH2u5LDZxU$#Gd<-abDP{aHzEb9{WHukB^D!{1$QqKX&$@oA8;5WTp7NQ#j=|d7WpZY&HuX< -z>0e>^`YlPjEivAH*5N%#?>`f=KiuhOoBIFcKwoX^|MDO|I`e}6-Yn>kOoBoJv<rZPT?G2qRPvtfg#o -Q?%Q1;}zKo+FPSPK@$F~p&_|Yh6PA~|dx&aMq{4H!o0b7UoJ$=08xFA4AAap11tQq;0R2pb*#Bcit{H -^r)wilw_N-$f1-O~9j-foZqd)xA*BskSA^e1l%q789G*qi!?y&d}^(6In^zzE>sQOK6{|D^`Z0@~x$S -IV8pYB#_9gJ=S1LvZ0wRrMou7R1!xrZ1W=o{QN<aIx~M>@A>J4*uN|r(yedFr0omd=@Vgc<sCe#sYAP -tGC0>mWpkmr4M|fy88Ifq^{-LJe0AR@2Hv2Ch`Ds+n^b+Z9D_AwJ`%NHUB3f;JKP+rDWqTNI~*UIPfJ -{mF+FS-?og>x3^SuE~3V+qf+b)zWNgAZ+~`4fR+dSNc{%W+`k%KQa_C@<zRGayV-_!CD0AGJxfBr>pt -FTxK5nz*X8+2O3EcfRljtIk{@>>>&V>+9Yooh<?FMsYVir*NS1q9w9`Vv(amn|>puFDO6@TRmwA<lsv -zJ?Az6l3FQiYCAu8W#Wp8KeLzZKi>7oQKaIf*?LRVt&NrSq~d3%QCmsXF*lAk=xImI<`;d_I#axFFYi -PzQ6sW_&Sp>U@s9|Xxj3!@0NMrJV=Yu9c$FMm2jTB4&JYc;3ZC4<|oPAPTj_Bl4aWD+S$hB-2tA*5IB -CaGXz8zSuJj%l2SP5Z~uK(FQ^oi3Ssi_lIIi)$_+m*wh*O}p~;(GYPZ2*g5vgxaM@@8Nz6EwbQ?c;Zm -Lkww18OobaHMptBw)s~7LNQKGpaDAYiEyGppZa!m4e`r<y3=i8?n~>aGt_S=UHqjJh?S9DoD}CxvcTk -n%dd;WQkj5*+?=Cy;K_%3!kE`Cl+??l&?gII=K!isUINgyM!po<p3d<W72>IMrj^|?VrkzbameX7sK7 -K}M^aam~2IJ{be~3?}^n(#1pWDK96V5kPD`-x=y}H#x!gJptj;c8p-J<9m->UtoPMZwzH#io_+j$z6G -~2c+9-!1D4r}f2mE>}LA<;-H(VoW|q@ytE={L6BCXbx6P$e?=!_oxi)6I7eEf30LMVTQ9abz;gG3~b7 -)mP;?$g>Nrc<A%OQRoAPso@k8-`g1iH^X08HF2NdgTso>%4voe%besUD$7o%m1Vd*@3<W3F2+1-2lJQ -I9@4P{OBQ0<aOn8X?`5yO^28AF%oL&X2F2?QdNK>>f$0}+LzQ)zItZA#IDTdg{s~1wlODz+_LSg$du4 -KO-g3CKUUcv%yFd73ejY{J4#Gbyx4j?Q1DDs_fG1hduN6g4s>gerO)V&+DT7*+Bk|G~2jZ_G!SsBmqO -6<-lYOogCk@zjM<D7r%-jZ$vaCv2<>-;T@qFGe|0Nk`o|FSR&$rk|+*013%SJ${t1FNPtH|5Av;DmkS -P#~{jMh|Ud*@7Dr_hb4#CGL<<v6f{ukD3qC`i3FS$(C6V->{F>29XPVy(`toypo8$oXc<Dk8$Yd#rt7 -2tu=ZMl!?3wP#GeH){tdzn5F`Q(f{~@VYo`mWI?0QCMGUeE}6*VvlG^Vo&~To8Ag%M&f&p^P;BykX3v -e=+KVDc>Lyz{R^wc3vrFKaiY!gzKk32T#MZ;qKw^IU4k>SpzG5{WtWp}^yMDx3xA(=Xw>F8URueu8); -Q3#wHWEwzm&q$Q&g~YPJ6GOr<26UGz>|aY-W1hrZtBj(s!DW7R;Bn5WO?=5VRZ$H+6n*d*d*gxS!8sU -~+?;`!%PU9!_IX8T&HrZJa>OBI&FdA-+T1)0dJb6#}s;VtWzA&FhQ4FxBBy!|CH2`?Up<6+YHI5b;}s -9ej&Zs>ViI+xhMu${z10mW?@nfprdXFN`q=hbspX05E*$)D=w5#4&L+MQ`{(H@?9^1PspUeVRG#-sC0 -57-r2rnWA~Ycs_T_rPM(=Wv~R9QC_RIqvgpDE@A0WYjgH3m#itJY+LtG(tm?y94`A`asI#o>$xdznvc -a>npTEHgNXCGe4obzyGQ)Q0^D6_!+-_=yXB@Vg~4GFmG1IrxEkFL-B^!wg(Ii;9DGnak=<o>;|ea;qT -j#P#82cU<TAZ5aR8yhy$VrngIld;Xr~mLct6~1c2c7;1}2}d-ESR)P`Z7?aAP`3QY_HI2n_m?gOLmUI -__s;D#&Hw@fdP<3-*Qx$v6=`L?V~Xn^20Fp0nbMn>pgHa83aCyKB7eLTDSSlZV9xr8A0GxQ^su^6K!= -^~W4s}eVY+RBy;reF9768wkfbLcyaHh;!vt0B0cEC5_iX7iKO?U!w^c~%!dF8p#f(D$eFZ_Wn#{&apg -o4+{$@D||iPBi`+>V~cE<)b?n)v0Dn>`vevLhSPcL){!ladZ@YY~d)QE~n}4Vpkbq+tq?fuPeORw2H3 -U)+D_|Ltzdr<FUPgq}~v}U0-hP1vlTOw|t+@Pd<7xJG^}8((sDJJ9Jv>GoL=Ya46uu*XoN(?lZ&03j< -B1aYgis&JX!5OZF#8>7CGRg4B_yQe?xE+Li@$4e;pVn9Y&8)kdwT#q(J_uf#rS&wSe~n3W0M!Uj0;vJ -8AQsI!b%rQrw~EuIUhVxarogI}+lzm!ia?K$4O>wQ>ZF-2P}HXDJ5&`oNTK7X&Vai5MaEF@ZM5G4e*$ -Yx(aPr|h?C`><)+02n~>F4H<tG!-KpV<#fFloXc>j|IB2?F#{Jz@TZW;*zb3035s4%Dq+>NF2}9%@8U -EyZO+RpX$|15co>L~)^h#{Hb8v}yF7{?NBWloIj{_=4R?zn`m>q@3)js~AMJw?|C{!>ft!$l<E(?d5# -EgsFAg$7-{L=e-t6=Vp$RxO3CurD!FKIvxB7Gzy7p4tm@SE)fdvHth(#NpC7^VQ4$)@EjMoy1S%jdo0 -A9-@daEQQG32kS0du(n37(heYcku{dvl9qmPpPYa2sXze=M*WH1p+y1<N*vG>4?EYjbxEblL=ujSaw` -_w^!@<2h+ar`2^1LH6|K-GEO}+-4!)~xW^$L8x?RC<ATvrOY)#n%wGnXj@p~n0G*JdT);AO*-5ZjDb| -DOyFI%zy~>AUF-)^eUjz~ZlkZFv9f<BI&Je)`W<f`5OQuQh@{9^!|f@}UL`^_ES=foKVXf@PP6fn9Hg -f@D6$K`a5IYbfYkqvXdV#R!zbnGAHTGa9tnDGa3Pz$YXHz3Wevh6n-0cai|Lf^CsUkgp1}f7D>fK!GA -nK>?mgK?i?}Lde^~7z7*UO{ISi^MQazfhd@~`SLIgL|X87Ai*;bDTxG>5kSEr1ThjJ!EpFrMU)6s>+7 -#%d5-;9{WbWh5^!(@v4g&(&3s|poJN|0Es_88nYyoocyB`v=rhm#3=B4si&lT`{Jt4)TZ#?(&Y#BK&V -U7&Pp06artlVhUBEWz`;CT_|EO11wbpkvh=aIjhv32$pt<{{^bdVB-uA6IJx%gg4@dKS^-Uyhyw4;(F -ra4xMK$qnhaa$(?Jw!GwHJ#!kNR2bSLlX3Tsu79D=xAzBy&`oucSSeb>^0q?#@wm%6g2-1+=w;y@xEB -I_)o$bWb?n$0wDB3T7CVNj^@a*~|}5Vpv^1cHXUj?#a8ptB9Aw8d|vuQFt!NyNe3Z(w~;Ya$5@NeDok -A=~#KM4?)|=!MfXHSL2zJ1v=P9_S&)v>*1f&As*!M;PH_vy<Gd4kYYZD_vM_o4CEd#gtHLo3}5HHlke -PpFQPnlx!TA<-gl=X#m-IX4U5{#@Wk76YpGXvnN2oe)5rY=(MBxz@pg5??QV3ZrV)90j^Vrb7>$%BG4 -VX#0yZvBw-+0=4$J!}+M^5>t*+{xwt!I3?(X*E0NM}LX@6gsXX;QFFN=gnscfG7j?b=_7lXgKc+elnc -%PYje<1Gt!k!Ug4}5Xtu8saod}WbiZhRzERNdxt-k>6Jq7LRhO$b>HWhKFBh1Z@-YxtwE9s(Yl8|V;) -QRZxUm3!>YJl;k3cIxKfh)-I-gY`z%5DAqwxFC!Pu~T3@?_*P%dtdCRQY|d#Lb&m`Lp!ze>K^yWd%nZ -F)FWlQwT=bK2+>S=5~~mHVe~>a$U~%V(%p{Gmi?^y9b`qC8!=P8rU;HdaHF(p4f9RPZyKMy$&b;~uH* -$q7P@ej`;Obc>JHw=TXu5EcE^l>+EcsKxP2DFi)9proz#^ZvHOmac5JD5LQWs0=ENBH8*CCvDpW9u)O -o5OxMNgujR{#!qFF~OC2pp8OqN1@g(SOI|9*%vZgKbM)A+aazdP#|9v<J^qhOfX!pzqlfOh#$f$1N=_ -)9qY^B4XQnQ$1vDFme`5@866#&PPy$*wJq;0&0{1_RzPm=j0enjF#FSdnBv4gy>?-aM)3V{X?LGm^K( -Js9GO-v`Uy#v$-Kv|wP|i+WozCU3*66aoDGEu7HlFM<`er92tn_HRc7jQkK#;?WqK#umrIcjQcCP%w| -*YMklYmSj6anglsm_%;?v-*aZbi8*=m)ZWu#Ad>!dYncbt*75Mo=+V%2)?^>;mA?L>z07|JT+rvp_2= -#7Z%N6P#2{^eX=4n`pT5YKYb#rS>3}NLcRR@L%f(t?r#F5-yZvU=pFi13LEoL8#@c}u`a~1KT&-VB62 -z2fAs)%Mh=&^IU<U4y#<_S$Jm?7Qk5~5V#_zB1?_3`AXV>?4E)V*%>-#&G2PNl!p!IdU<K^BgyW}aOh -b*_o@dQ-~*=XbK+WO|yUAM?rnr!Bye)JTN_K_+?0(GtW5RMmLO8Dg=6zKU?+^}+cyzXBy6i4@vI#G}8 -v9I(QU7m`spn6&m=ke6ItqiNiHH-N|EEX?vI~X<6`g}Hq;#{-I1$UuLWjC-RD3+h%50xvt!?iyb`}}U -<3K=(~vCDRo<UVxvz_#-pxxZ%5osO4uO4L1Zryvu5RI_w9T#hTt=d+bNUX&jZaiNCUmB|XWIs>^#yX| -OO^!LuuP0N;LY!GEmx>v+QTP9O;mU5-MEh0H4u|IXHrXD?-@}91xSP2ug;!`2y$BD{|f#|giPV!*2;3 -nTs0|M<j_p{d5k;?^c_seMap%Enf25z5CO3u1KN10Wfj8i-y4u34<`?EQ8Jsb*b_NgXph_b-?`FHz5A -M6}`$`?gZ+H%L-=Gv&aj@I_ci$8y{^rk?5Rkj6Zr@<DH>aUB@W7BTgPt1OTANAD`7kwYDmj<^8VQO`1 -qzAfy8hv#U36`0G;3<LYABShVjPiIJAA24%pQqt5SPGtXwOyoXKk!0!QTIpVPT@(P$`zC(Lyp&$+eeT -15Ly9K9LPsux%es~izw`0J61~Sj8mlhveWk!<#@M?dY-a7p7j((K(9r#*X>Swcm6JFYAUY|r##VE?hW -yDg!v!|Qf@S}<0D%Rdr2yGF4LKc;^7Vxl2i<#rv{Z#ZQ@rLU0i)JUI`hbk%O+-hVSlL!>o}no-fgQ8# -AmtKS(%CwzHkiSGt^u7o->_Vn1<&3nTO*zy(!D(-NpR{nENmOb{|htMfbW|NQ~*x5L#tF+2Y7i~Id=- -<r8L_VWbyzd69y5$uom_@&ntMKCx@0`bm|6|7?dM9}CRi?_%H6K@Lh+nE>$P=_E<i{C0=K#clhf>%O< -iRMpJXdr8Z!Cdne6}MyK1SoCB2&hb=Zwn7#E<(J+JNbL~E7{ICde<(|_Z&3^>Wb)Fxdj-9Am9w?w?Fi -Dxb2;icXbg>L8OPN-#@jpfxu@7w6Zr$0PI5&K+xVc0-xr;R<OPRxyCB}gV&bo6=(kNhov2mJ*Km;#R? -Ap?6ox;7aN_&ppp9TGrqS=A`j<oY0Tov+F#0peD&GsN-{wN!oPdc_~FUzxzALqYBE+4H_qQtmdj7ups -yQC&M+KyQof3wBuXSRx4@sj%kaLodY$dXXJCT+#V+jd!zGlTp8TB9{`B0BArJb~m}g9N(sBfM&u`LrV -RI@Jm)kAfTOKOL{_CdbG-T(RFjI%a-Lf;y=m%#f<#`nq?z1;?H<=<6so-=(^n-EAOV~J&<OQJuw<tJb -So<@SE2+UBB@J%cn?5t?uDw1myt>!tTgJWO-4geWZy_tz2`cFX$9%rX6f)>=Zs$wYY{|;$+8+0jzVJ7 -jxT1%^i?L3zTueFV$AMV%g^YI$PmOz*VUJtT*xmR8Nu1mA;m7!zK$eB)$DW5<Qfd2YXX&MulU}9|mg9 -tSSs(dpo<xT%+3#%WxEoaQPIoTrIi|=PzIcT$-R-i0XzYbLVcId-WS_<c)hWSWb5E}Pr*#UWp%E%fLg -%KD^5RE%OX$Pc_KP_9LsL=RPY$+wKzij?U4>Y?<`~`>>W0|^{VRP-*5Y)_99j3!?G|<&8RF_fw%bs3& -T3Y;Y#+=}KCtn+G-H$K4axH8(6Zf`$&^{ZpZge14mq8ODOTnkO7ziWv`|?ZgdHD`gkE2wLr05k)Vp-> -B6zzWu6DU&wvV!$_@~DaUst!7==!nmsc@=~&sF0O5Sej_{a8Hg(gp|aF)9gVvO>a@J4B3<<b2SQ9gW7 -KQd};#Hr$dK!q7<DkTG*jM(YAKv6`hhRqEF5#TQe*Uzg6a@Kbf!7FOE4I1yFoH-rw<QLsGmtP<FfS+% -Za<wujoJ!H%@d0Z||Q3=Q6vdF1X7y9gw)a&I%%ub|oS35`W16A}RjB3`^rn;(41tV$JSKKO)FEH8P4o -~dxdUUrWOnyt!Z?(o4)EcE**Mx2N$WkCB7S_M<s`ML6q9lgHB>hvA`cIDYC0PCIWBf2Z1mhG+;V46)K -!FUS=?@3ADeNsmiN9T=V$gL8vEP}ua9I5IlLSJ}^xKLU_!ECDQTe7HWf7n$Z~LZi>&O@f`5gY{K!Nb` -HjUgeKNx<8CJNA!vR{n~!8o8x(I9k!V<8!Mu;r3l%%U@JpzT3IgPt1mR?Y?*A}CO!+@k3gg}3v-A~08 -u!Qe3igU8gn4vNFSr+>+Wk|nV2?w2otOm%k?MUBJaNFUaDCilCUYzXwRY|og1iR_n@>F9!KUuFq?ySM -_P(~nXe<)<m<Ya2I60mX_oUK{T%q6NmHEx49dQACY0SWSUNkHXhX5P7Frg0TfO?~_%7ATH1rkiKp-B= -M)(r*}47b+Xvc{41dbA{k%~xe9zhZgTS<<j(^1U8<GCi}u>m#U(<o^;`OE3u0Sb*6bU{nWc&vt2LQrK -IOT3gMMLU%zv^nR)LlA7TAPC-3&)^EGarv5nN#mbPxphl`zn&5LC7%S8M6SGx}VXVonZPi;H&K`d&J| -9F8Z{{zSaCj3z%i`rfq(S-%)}5l1b{fa0)c+zWo<7^dXBwH*n2oScTA^mFJ&0(a7fmkGD=GD^Cc<JFV -e3x$#~Pf39LG?O8nQD1(5kbFh@p{MfCG7PBGN=m9>nDbt%%4Cn=;){qK0vB+2-(>KqiEMapvnxW}Ad_ -V#uEcX$>W&PiMw-8z6V5q5u;VN|pNhzv*UQ36vYWlaEtraZo9xY?>syspjeP-KNID;%9GYQKO>s{-I2 -$_x8{iYkp33Ke2%8;IEL$ezFKSy0OxPGYb2WT<ZchDxMo>dH7GsG9Hdl<W;<!pzV>zuhJK~X-T#v8{( -;d94=sh_eUWRnPRO%z%(xk|V7mZ(_>)r~a)*$y{7QmOAZ`eEXFwNQJ+Pnh14mF-bQFG5cVX{%5&*U-$ -_uCzL9KzH6)|DY7M*T&<Hi@{{GDBZ(sJ1(1bb3l;B<zP`VZwFLIR2$?;b_00p?#N>vC^|)QX)p#pP_? -F&%QUF7wgcxB>fPz8D-I~sx`X<qmRsexjlu%ljzwXm84`-mEo@Il-9B{q|+!tq*-w{p$cpKT3Lxp71K -QI^1VE|xjU}4iD(4(dhC3~Kl&BZcpJQ$Lk-8ca$s++S3pPSq{y&SN~s&~G<6!j^fGZ}G*qQGIQ4sEpc --rdkO3&^|Du5WgO#UUuj$a4HqM^zl$RK6{8CIsDB4P2d9M9@fP8zC)KKMU`#<1v8_=mh5$j~|^mn7-D -kt5{A8bDL=GsDFRrzUA`Qr6C#VZ&8z`-gxOQ~?yWx0Y?4EAbqBgFD7du6#A{2PHMwtuah8(A4=1B)A2 -nP!vx({__(vCq$M2T<8y;%bPMCpMbEjv@<~UmLt-4VIl*A^t_-d|P<Agn67A7>h64pOHj#P4^4-IVNp -T9QvH`oaJ>Xg|RjgY&Q$~OdzkSE`vorF12ybE;#I<6DK}%y<(uSA?SuVzV^n+f9$T+;j-HJIZyN3xYt -mB+|7YE^Tb>nePq9XRyKuHMmM5b;M_D=M<7)fcyVU!?d#(W)xkQvG!efB4Y^9HIKoe~ujCc8(x*Fm#Z -nUK*>O%cLL^V&>5S6|bXxrNn9Sv&<vLZ`i*BJE>t%X&8hXL1a(SRpG`$W&9bTK3z-wVw=>{RyeBBACX -E_iS?uB!XXIhP$n0_=V)8}H7a<(srM5FVOac6Bq>-L^eb<G9y{<1h%hcRc*Cs-jW$Vtx&M(Ta<uI!<} -?k`=cAH74<*Ajl-StXzx94%kQu3~S7)Z6XIN<ts-EPU&Vc90+}858oUp}Ar*%yklH(KiXIif;t<M6in -;cS@SL=eu>sZXWt#Fs-3af$<<8{JD%h1G>i2lt($f7mc|e1Hly2r91UEuJ2RKP83CAnjta5$LnGDp+l -?my&50cez-d5PJ(mDdD$63A&(TjERsz*$7l5-lcLiO%f%OMrSqzQcBFc{FGo}6AJ$1(PlvN`;E%@s7O -#*6^SQLH9a#=j{0z&%ZS_lWRT=$2FY4mVS2XJs6&(eKHRYkb5js0?*^5%HXU4HOsML)cDZXeg4wK!}a -0k?vqJ}t$cl>bD(7)-zx<N&CP48{`KY(ZI@qemU(L9O2Isb$Gx%coVyL|zS-*)*P0Wt_hkQhu7I0Iue -gW?Fm5Cle&G|4as4sW>d!*=)v{UZ2naP@W<O+wHkAYj0T+OQ$U06c|e0B4cZ@6^YTaC@GjK^-3@KyMv -rj8kt%E#ghvLf&<X7&Hc$7*soe=V}I;+Fvw){;1hQ05liJfb7n^q2Klz7zMSKgn7@jM*t^+(o6K7f_q -nD(Dwt--FVNFZ}66RH^s3xw;ni<;XpMP`D=1K4a(EZS08bU)p^X{J~tO?Uo3lHN9KEzeW=;P;y)XtO7 -1GUpW_A~%j=HUO6QuBRLR)V+#kvq24B@AboGhp>JVjw!rw-(OK}DD{-dDcpGL1gZxiyxTvfy`S^Vc7$ -3K4OFK-NicLvbzZz4Ml#=3(rlYNUv52^8<P#>$2eb(kWx$i`2G`d|{r<Q!W#is*ZdozQjyM#Ee@zd&U -^Oja^?;fAZUDMbDUx!C%PV%NcDp%(yzD}>lA%3A{V_(8NJSdFv8nk<=`3KA=r)9A&?HV;$l->)Dv~H? -+ClyF<0y{uwcegG{-1D?P?)eu3o5^61$UcQboxCyWk&Ajsju6zuMNIZ2Uz1B?<~!*E4dL<77^nWYo~7 -EA+U$PePrM)nQES^In^)SgsKjwS-?z2Nb3)j18!O_Gvkk9fZwb)Cd-QY>qT}AubkDjwhiSxPr$6<jUR -Cq?c#ccTG`L;LYPN`&S3@WS@2RNW@{-BZ4$?Z;qsfdexO+<-Wc9V-;X*yFw?u-u=iT6$h{tZJ<nqx$q -Dn1&B)-l)IHg&3A_-eir@Iw%zS)oDs-vS!!7oC2Wip*-*K4>10(aM#Qv5nBWIftPH?rb=Q9QE)EI+eR -Tug{7&G7NK)Ro}pK|T5BQ79kdLy$YGk0UeCw}8MieJJe4RJCb2nF66V?qid!?BLQmRNTrP+})oz^Q<R -0X~jW^wjgo6?GP$9V;&h$MdtIK<833^+3Kz6<Rj6!0^N~GqH>TWJ<T-Q=_@>*o<+pfsq;FkkDWv)Ztv -@LKKLwmu!QV^?$P`1CJ@O<Fb#9ZWHxcpc93Ee*d7@|fl3F?jcPi~eM(F#=^L^`H)OYN_-gvndC0>pvk -84pK<fdzHVg|C8lyW`zm;)9hpWy!SC*1ui0+p!*Y2k;7bq4AjvM5_Y;QJJ1KTpXN%yoZ570`zzP6uIM -Db;#(wfL#o8CAVC@h!`CvQ1c?ymW4tsM8+grG8xm4sep5saj4$rw^!<r>}&wgf&=M++x`0|r}WclE{G -I9uBpu+w(H88Udz4?m@Sh3+OrjM;T~dHii}7wC_ogK&Jc$OnD%sF$Xk2wk3u4)GFsl0K?^L7y1)9Ny- -W@3f3@6FPR8$XdFi+29tLtkPz%EqJS4cimz1m{wxC`xeb9<Cv;`1l6H+SKWkn?z4IvJt@--qpT&o)7& -%GM@$ywVI?kIm7f&KRk=0a2YvRuRfCjAAwfdn)I8_geF(++Zm4XPmZE?3UOU>J2F#zdE>q_z(2hei5@ -Sa{i}Rkf4hHFG^VM0W2c($;EM5FT2yUc)Ke3~CQwUdINQ4@clD#!?kHN83L|d9LHgH1}Yh~T|)Ta18N -9qaEg^S;<0sJyxY9|~X)Xv0j*<jkv8s7C{XK`~utmLh_%{tv<WTOY|et%k0vdZ))e}=qeObhEogy&4Z ---{;~oh9RP(<tS6FH)IE*EJmrf+!3!i&^42mF`gSj~PvEDXruR(u-qcvP6@@O?TBY%kE9$e$lLe47V& -HWE>d_j)6Im!e!zT`8gg>(ZcG_?1b`YuSJks`a>f;Uqk7iRWi;T6GrUzwuo|BwP%Irx9_7Ih}Pn9$o| --dQjgonjv8Gxe+3!6hpf9H)#Ax3%lXKjAJ^7q<nukVE~(F{H(A+l8w&Gw?vm@nf^Q4Dd#&0rwKK%2UJ -rH$-9v*uEBdyyIyquYxJFYR*OE8Kytj9n<YOT`H|3bsH>LEW*g#tmqff}y?~d0+u6xK@0?zc!+zTq<c -)tWg)m^>Qe!w0=peG`Zc=(Ga3g*<T(Vh>t55+&AM)F12L}}Om_Q-zYA5D{Xar&tT_1`~9IUfHf%m2oQ -+Y=cm?tKIS|Lrlp;KRRq{SQ18<gGf4;xtaf8)Bpo{6mQYB7L(YQy>sbgulZnz;^K4VqimM*}EHtyxr< -CAkX_DN(7E_@8V+^zx!Iz=Q`bn3AgPV+}lv+2I#go3F+Ud6p%}p@b@?c8jHUu9FpMeHlUfkMTR%9mt? -?j0DGSj{4Qi}uog!F*2GD0wh0Zmo`Bz(f@&h3g0|R(R=17YTLMaG0t%wruQB{rC{a1DJkOoeZ#<O4X< -Mbpst>8~Lm$`g1o^*WH18}4hWM#v#LWhI_N5Ax=TyE}ufCfHn771@HzYh)TxEN?UN*QVOE9D=?~$o8@ -R2%hK2;MxE4O{!@o*L$pnv;5xNT_G8K6aLHOd@=47;D?FQmv><E(`fzCYL(lz2F^_b+WWRWu*lJ~trZ -2&ppDY#YYt{UWpe(kjzGOCo+7-h9ghEk;=(-;{@eV*j^|TfD`8E?s(tYfRRsGgQR2H3Q$?BBqre6tli -MTnQyx^xHryyxoxMs%SM(VE{v$pNb)75&7P7ZR#cR#m_a6ulu!ztxk~msW2*uQ_XGA8Z!lBIc{)UUfJ -uHzN1)4!giV8A1rqlg40W}-9l^prQ4TVXtC|I9sO?P5gKg2GcWL>0Chi)DX_0kjzsxabPfGAyyi#Ncu -nRquzvL*Bjx61p}CifJ!&RC1EF+p+KRf<x`X9*ZFyXZAR_%Wx;hQbAeA6pP-e&$^>$z{gLIp_pv42Jr -@MWfowX<A9oR+o?mGn^FDIXu3&$Su?G7X>p4X*Ygp{G87k0RwQn9K}zR>a3?a`G54$ClwT97att`B>V -h1WCWyIv1GR(3}@&9JCnroE-)*r_?QjAGc5DBXJGb$TGX%X79wC1I{MMC9gv3w!n1FOVT^=zE1<<IG( -gVtxf&rSIq^Ns?u+_2{X>aw5H$sb*1!%khPYd8R{GQBvae*ty23<1g3BG*#k-1vYOXs2w|PS0c}j@|d -f$b2nJmUzBCch65^_cdLPk5OR`Td(B7VWPpMHG*;5nv8<0fE+KLO9c%g3@9~{jEY6*y(_XntYQ(y>eN -y@wq0cqs)^?&<*+IJTc$eB7b$_V)wjOgbwAqg9&Dwhs7>3kCbjXwNLSG$$Owp<LdndHX9@-&jJ73H8C -B1^Q!<k2AkpXgd`Q?(z@QxuYIb9RAMXvNkw%T!=77L#03{8&*GoA^^ui&dm9I)AtU)|m&H0`;t)-ZR- -;?p?0?2w6RPI7*NyL5c+T>VvhO_2<NhLn+Bl+Y5A+=a^#T;r*+oKNO*AhKaR-S2VHmN1@YFBL6C=CC_ -zOu{4Mh00ySa&D1PHpK=rw}TDQj>e6-K*g^Tm?{^628*9hV*Wkc%s03Vil{0l2tQdr>>Q^Tr~|T7?(D -ANRhd3t&(<N8=4#5*w-`&JP7a5zJcp|6*ZrYCzMv`c$f@#3{96kQ^z#byPZt>I=N0CkE-=u~E6hJ#U_ -N`E-FV*OOSIB<tu7B}`LTf4=@X{Uw}pQ)1$F_&X6RjQ<{#66{Z8F07kx$kDjE7|CKs!=YnEPHENI^Sq -R%A@=$AEKjdi+3MW&}g&^(or(WOn5SshD;v9DT6CeK;UCLcO!JJ?6VG#oNv@KBXxHyF4WC+y~umwrCA -v5e^9RKazwU{C!N26k@ja!as}t;+BcL<9uYwm1_P=3?yqXBJ;eWh&u)F6}jg?sUo0utDvjt1cg1+9%6 --msXK$`>p&uz7Qy{!~2uu=#Vp3riCY3rte3`Di5u|RD6Zd?I|-47n#|YW63f%=e`W^-g9><iZ*qqK+; -1c4e}MLd5Ps+_tb|iE$<w}4h`wZ++)4+*yFB?vt3S+jM8hb9BBnXIzH#iy)#j$bvSBg69>*$x%O5dft -EUgkMGXsL=dj3w}s@}>dDs!Uxg=WcQ8sbGK^Hy;WQ9PLxAQnnmdzTXtUwu!HLH#WTlf}>v|(G$*t_;T -dk&UEN)+Np~JF6cppv4jNqO96md(2UZu*<(qT|vdfeY6UVgPK&EGYOeHa(uGTzTByvB!>QxCU$vwfJ% -edvy`$#YD<o}W-zy(;ERG5uoRB?}gZ6Z@L1+CJ%8FJ*kKGO3Up&$Zs)w=ZqN&(Bf5cY@`wx4J=u6v~Q -Q@N!*>xi>I*io<jYg&o7|Xg4aOed~CcrgQnlp62R0H2#6u*7%EQpvaD4-J6|5M>!UabUD$uE@NHo(Q7 -|fUKhWt-0Lnu&F2WEKeC%}2;`9utmvF3l!@S_vaoX|T%iOmt$)aR`|S$=|H?o6``G{A9pOjb+pk{zBm -bPh5duLd3PZM^G>tPKGT)dt?$6%!T^RWtjsb-%MnFXsOgW`*tPBJ4HVnp~KE(YSKHv6D)3<Ke+g=(Y0 -O+R~plK4n$FYFFWenJADD!(p0{ygb%QAk2`w<MV)V8DG7(nWvR80Z4+;*x63Fff2900|E<QatmF2RQK -;kSw@6@fQH-*TjM22P85dtU<!>lBdcxBMdx{}T5*XMp?V@A&6;6W-mu%sCx@f&2UaAL9P+Sm0;n3%!o -#1Spg@jM8kU_dRKkhd;5vg|7}}Z+8)+G-mUg2PS5$;tYM+`2CIfC-(*V=*Ik$`vQG*WB$o~fj+u1e|} -$nREUB8Tp~uuyw|BZwlCC<tTVdbbFZS&O;`+SPgBS_O`t<?JDUC^8#h7;MpNVTEs6@^9LEde=k<ytjb -xv8wzpieOBo(xQ;K8PNYJDkFQ!gGG6j>bcz8YNS!^eCP;GZVT-vC*UxJoX@tfToUbx`kr8au)Vk3{-; -wclpY8o7zPAIg_#VOF$5;kILZ6v)3_Pk(nY~Pl#5EjP=RUNv9&pX$10;+9Bzsz?L9zIo>QYs0DlH|ng -bI$A4#3lLEGHt{#Nc6JT;-OKUy>2w+$jHI=C42?@^3bS7AQAVMZ5=OJxyX?6xEbSkunU!`O*3cD3cCF -nlkjkP9Aw^_9&3uE&x*^O$lqDy(a#h{UXRG(++U8cj6!OHxs$N{y$Cw95J4NLxlh|PpnB9$_CxH3q#o -<={f;SYNX|?pM-K#nNg)!v>4ACBqM^y;V-~D4HgP=R)0(5*3y4*PV<DPJMW{xYXX$Z91N9a5)A<rTNV -eW%2P7%56pGTSzuso2FgdB}@t8>6RY@krMV#{aP^qSjN6bX?>+#-T5jyN;M^etqeX*jnI58bW%6)h;{ -96y})NQJEm#J`OR2LD}n@8HNh|{gecll0ihlldA(6htL%maQfk7Fw`S^-U0nR2#utAu64f!8Rs^}VY( -v8tNac!$uBOrQ4&hB=8T_!}Mx=m&F3UBs*Jt<XPmXyspewN$6C5;3{-1hbCU@|VNk#`nAkh~pfBkDsy -f8qbl?cHMxuv^Si&(j6`(&*7h7YRRd})ld~b|7m~dhZj6$u75gQw<QOi@S^~N?YZxg`ezNr^RYsT4Xw -A(m1iF@>eZ@jBJo|Tqq~)Fxxlvacx$|H#kSaNh(G=a?~Y(U=+lnXEWVX~!O`6_?*eJ$7&cZFH&-z-xU -X}vj^zS4|LtH<;BaTX5(mSHC(ZgYZAyIRB2V98|2M(;r-H(bhj>fS*5uS87r0#i0p9-t_o07__kUi}z -Tth9S2IjVt6O>HuC}}<xXUvWM{ItW;l8DXV%9XJx}#$FjF$QexsPHJhb}o~e&izdi2MBQ$u<Oad|fjm -K<H!&$V|Eu;f}OZR>S&M6lnD#+*8}WJXYv}?0j9m>64qD8m(uh<Ek@>&sPr%fg>C}O4r5kUWy(*F0E| -Z<n-XW%f3&p8w|AfGnCDTc}VRlLo;7pI(QK3q&enAyOWudtA>fzP90kGu7qgoeoqNC*63n($<OVT)x8 -x8Q6pzcN#cd-$SB;-Qn>KMaGmw6|2K7S*5oFdbqn9~EBc=AH1pIE?*#}DGeS%fcgzSOkQl`9>kr_eY* -)JM>h3pAd=XXYv{DRG%Fo(sKWncApX~h2J`f~+x=QI5<<wnEk5HXUdEv_Jt}^qS0M}wc+sl$XOCjxBN -y-}c0lv<!etkqYr1yPE=itULT$a^6JX|aO!lF*|90PQAc|8H_R~0_HJ5PZaOpwKJYtNU$9PTHEA6~DQ -<fEtN4l3=-u<^Jq+9L=Pgt)R<@+BcIV*>1n3c@E%>lWRxxyU@sTivP3y{>EAKFQuIULLdHv@0D8=(?X -y<uX0gOgwTjM6_K4=&<%YTTeR5)MIKxVqR3t;absMbw+P0m5$j-$9*c&lhA3OkDQv<a}qbjUz$O{^Av -c~2fN~}2%l5zHW6>@4b`NRMlJ{U&HH|!y8i0(&*^<E%U5@NONTsb`mqcgkRxAY0KiN>E|YFJ(?uz?xw -a1&t{)5x6#^~wF|;&cGDF#OdUBo*lJdNDIm!(|vz`$5`{jP~4?awi`Nw3X^n-xGW`E`;+W625;XgdpR -|4>xr}>r&d}zC~R?=AbIfs5N_fv9@T}rlwIu>nnCTmfT?eW0OHf{28-M`2Ch0!)tf_|C_rMI1fwcg&; -BKW^Zbnm?Ha*Y_>&Hj_^QgrmQlwx9!kBYWSZvn~CMk8W+w?o9Yk(zB1W>=0d$R;|*c87;;A0XW*3K4F -!A>GX%m_3;|j5kwdgxO>!$uH}Ee%e$aFZ2(Sgb(c!4_v<dIkX87_)kmndZfd_;uiY%jvm4{8jRRER7M -$LXE;XBMRathW655>G>HJgP2T6d4R!z2%l;a_Cyd$`_xibzqL~vmNJ{PRBZGj?F7?%S0ZZTeEE4<3%= -aOIn7(=Wtp5XFQv$F0_novoB#`|yCTLl*FecoVbQGaPp`Z0p_}pOwgz@RDx4xo^aliUgrJtMe_$66z5 -~T<}Z>2i%sciph5;1MM$6amBPI_}j>HPEi@L`5jVE;J?Q2#u8^J8o3<JlXHnXY*`fz=&mrnhobPgpKg -SJGB_Kp-Pg7Ie<Uor!2XrJl1F(^!%7I>0D)xK4}Ab(RZqFf}lz=Sf5Eqr9#dM=xmchLr$lt<{n%OSqS -J1v);O2;{T8$_}Ajp_gUy;7bK>h4;!BTpOutAhH*g?97H!Eb3g3Gr(s$8{F2i+pl_~8P7*8bGl;6d%h -&uW-(y~IdTlHo`ycj^nwN{wslF{zCNn6VtEB{yxUxPn4cDLEirN=^Pn-+*o|Lll}K%v)+MW&F*V&}p0 -W{4*N0iW-u2306<-;TXQ1c%Q7xIFOK<Uw6`7iG2oy2;tAawBnOt8~k)7X*IdL6-V(Zp+#5i=r1s6We- -T>?`LJxnHc?gL7D=e(o3g#P1K_SDr;vnls7tNvc=d(A507Vc2$sQNL_hbH=iJ&=Nr^H4JStd@wHH8^6 -jNeB2)EGYU2kMl_)6(<B0nI%MWEEsMp;ecp1HklID$u<nNTho1j~B3w2X#8Oca5#{Q{B`^`!oo!B@Cw -PaQ9L>SfB_Dad$5MWpr8~m(BK(%YA?5VN~HIPBK{PB3F(2$S8$uLrx7mIy?zwqdYZ4fUK)$(8q}2)sk -|`20)L_qDi<5vD&MqF^EI+3p%Toc|gcA5nbA^%gb_7(-NT$!%58$njq5kC3GHo<WDA`o!GadVpx}Erb -Cv(1Ae+(=RsNG$~-8?P>o;K*OW57<#%^o;ROtRq67T6o~yZj$pAhm!n;~9vRIJ6<1*Z4xAmj;8(8<pb -DcCU>ZWS)+t1vD{(GnW#)0_vPWekXO~_3MNh6yz+-5$s_svLVvqV_`i^I((E={(<(rksSk3EN0U_;_P -kTBi{Pou3HhkdddA~u*slMU^%-REJwT7qw$b8xmo?$1P)yUlPMZHSufrg)nl1hVbuGkXfb3g0NQx!bM -x9Ald)UXpBAT`!iTdoC}%+c+TmMmx5l?&cz~Co*QlFX0s1;I#9938&?M3r-b>Ex*F4BpUE_V=}(i1qa -Rze4~jTdl=d?xaeQQ0k`JOmu8RZ{c+5eSN~BY-*3Y!@FTwd0k8CL!7K11zWxbbZFiK%FYr2T&db|oRT -Ukr+&g+D5FUy5mYlM_o<H1<He+S>OF2<}chHY;3;YUie+9R|C%nb_(K^vg1JP_NzI}p`(EuUvmx{5d= -pR?w)AyNra@^tOp0LJ$L|D^=&{@xcT01MrB0s%1N>K8W$nWQj9g?B~Db#PAE-D_x&0gX{e0#~MZ!fg3 -JkOkca|4gj3IveM03t+tu%W_>tN3ut@=NU1t#r$!WQA&5Bf9=%-@B7>H?W62n$z)8Lq+5n`t=1FfHd~ -yu)Gowng~`YibSU$`JF3iN}0prZam`F<?D-XK!bLR#bCVw=t3D;;PCj9N(>;Wnl!0!cr<Um_k5@w#6e -FTWiVczGDSM!B7Fvr!^`%T^CNK1&0v)NSfRZa+;F#t0V#-FrMF~GtgQ!&n?z61BRFRFlknZF>%X5dER -DKefHmrH&?F&EgQ`svlP!mI^`Arxf8Z^9_OqsPM&n&6cj{4qhr+4dB=_CRAT)Orxm~RK(5R&gbdrnH& -iPfRc6Mv74>!GbaD45fr<>bPnWMCu8erXoKjNWOTwb{meC;+9lamOq4H$rz2_&}-+l&O|zWa7q-U5tO -XQx9g<`_%IIH%8bW3U%Y^v$Fv8g~?l=00(J&YiLxplir|<t=0tFh&JV6^M6RmSP-UWYCmFq^eJ3D1*~ -X<JpuhWGzvrtd%BiM%StbQh}!iS=H#NZ?n0otZKczGk&ne31&n_O74EAR>dh{Rra9K6ZX~){#iUMJ)3 -6<lkpk?JoM+atl<~+<boJ=2%|oyN+=;g?he^<_g;2Ox$<BZehvQ{aQnqY?|%z-|9j{EGXVeYxqpeo2( -|4SZ6dU6+YQ<R=i@zm9^b$Zi#K|h?s+)tUqkdmBwkT=rIK{E5#r7DDA~qWQ+Q9x*#msYaN9E5oEhkya -njph#O7g}{RD{#ay!>r5UdqIxR2n{)W%yweDnEV@p#2x2Hr}9INQEP$d>-IO<2I&#Sm;OELJ2&nGNvc -JuENX#c|2X;(v|A)Mn+-r@utv2mk*PiOq#2z98|+M!rMhZ@dNnJ}Lu$#d^P@a*+QNm4Uxvy}yIXz_+m -cF)DYX`K2qoDBq(p>dip1zRvZ{`rC~7_uME9S2sKB1-jIYiSVF8K=US=le9qELeRN@!cV~L@>Aw4Scq -NmD|1J$>MgodBb#gT+rL0)0o^MLkLvK;+m9z-#Odj(S%?`yk!&Xq6riW4-`)l^;hc7Xx(7bJNGZ4uVc -B0Rxstp$T{Vg^y7(z9B+DJqH06#tiQxq67l;Zt9mC(9ckT68Hr9Kas(Yp_+xpE*#5s!&SDkizOKx+0g -wG5}U{9`!EbXKz$H#NXQlK~&N_Gs)W_k9n=rR}wlH@HD*BM44DX}f>OYopc4tBkx{tU)~!4Les;)^Kg -VyeFb<U{0Iy>>kVlr%cNb+<^bk;)Afh<@Li_awS;;&Qo&y9dvCXxZrg;70LpGGbAgGS&cJ0Gq_4y4>W -ZEqeR8%tCPF|H_TRc!ffO)`>YivS8L_AR38c&QJjpp{vnI2FmrE7BD#$$6>faQq)An?QlA+T$W!z8SX -|qk>=WaLq$3p7Y=x*q#Z2^Oh1nYjY1Dr{p!^=&NCOK)5^8S;_`ZD$*Z!7E>WP9q&f3s9m^u&=F<yVfY -&%gi8b}-C^ai}-kb+>Sf;)6NR^~~N=gWOTb76|hxB=E+=VV<nZl$~GDhjl-4oy@@TbhZCeTDlcuYYu^ -FD$N;yJJTfq>)lxujqyLMYV^sh2O_jQNIYc8dyfaGx)S8h~FYrd~LLESK;)`x)flFx{L+5cAa@Me=}> -(^;#Zs9L<)rmuMyet4J^%BO|1tAhb__Ko~~H;Qaib9{=V{VdpC0c;a{{PBYyjVFHZkgpySA3puNlsgi -pF@j(yiXm}i^N;vY2Tp(T%ndiGM!MVk(cy+{;cnwc>}Itz{#n8ieXIjtpR#h<Xg5j6i48KDc%zzWycy -eW#)9y_l6aGBlj(-9ThI==o4->((}81O1m(MpVf^Vf;2qBK?cf#E;ZHd_=`Qo$v7gvoDKK)w=Wxe<X7 -6!t#)|Ongp_S}6H>o~PiI>yOZ%&VM1sY~wf28@m+?avq%;46fy5q>`q?Ra^W;0g;$znVdY=O5zllfXc -`o3BPl|*+8Fh=&;Ug5;w&lvu7rRfWCXAaogy{&dzU}o@JE)DHK<(>e`<?tb?e=fp3Gn4s{&XjQ$BvyT -`cp8*ZF9aL+)dM@@i^m{A#(S#qG`RNoE?AZOzbsJr|G^jQ!yijR}%4qdIF@0JRZaJ)!Qg>8Buk7fueD -_&sx;Q*D{+suUAiTYs4P(v|7?7^)dx*MGo|+dePSwh(cJTPpx;L!H~!}>nV5CnRH7Zdy*ipLxTwh6{z -Q9a&2xg=z>%wQmMg;ljJ5Rc6}35xm6yo$Pv?_J+R<#_ed@?nFo6J+8QzC<4G_sSCShw#egvB3{nk!xh -C;+nJdypfLVGHsH?7=mx-Yce>kM^$Q}QE)}F3ZjHCYW6QZ1*OU0S#Hp6(N^yB+Yz-2lphgS=DqkdCaL -`g0nrW#M=jZ-DY5`_L2ez<jTI=XnD&Mz7Q>Ipv)!NYqW9JG@E90mJVShRi2fe)kI#9PO(mbt{N0gWw# -XpMiFA54ng0$-@@o`W&xLf7kheFQG<=~&!wFs9^3=7P>EiUjrfYULnyyM)wXa!|x={@ZXS@kL#q;^Jn -=(WK5f*9AriyrTubUJv0)-%YFLZ?6k{R4#DcWW<}&^i(lc3`g9M<vXP3-vNTaBXkv<TecQjw|5T&v~A -9=IbV*Qce7Ob`kqX>b(dGGyy5Y6bIlWKg86XPwJ0cWPaO$l+J_?@hmDeFa=;)kXMP~yX4qb13VNG{EP -f-l;ff;ryuKw(4P*FTbZ#Y`-4xyec7(Vx9^Dl5%=G}&)zb_j-))O`rbet!M>JdKF)5-p!f9@~Vw74r! -zDB6-=9nR763k{p05k&Z$r#q9P$yw{PFbfAci3*j7DjcLbow>iXuMrDB5B@h^;5OLc+ReGrN@#zHijg -@xO3nH{nb6Y3`NCWgicuGuyh3?ybx%I((;2+n^G$k+jX;4&7o-lfCP@601*pkXwew&lnmUZtdF*qQVU -USN28imV4`A>+#zN61HInk!({;>*?0ZtRT19DG?h}TyHqq8>R4`We%s?EYf;N2Jg8azc$<Z5n?id7R> -YFK5Y2o<d6S0#C%QP4t=8jGsNWcr__&cA!dK<zYj6r-^t&Bm|k{teTs*WICmi`+KoAs3-)jw(|2>F); -#|#1XrdG*3}wEM$FEx?+0!R(hZw|s{)TsHw#57cgsYkP#Ly579(dPN2;P>jG-X;zVyzd_zJJ@0Ma_Lt -*a2p96yeR5V#+V_R*$tBFDN^fkb`7$QPownAW4Gr?IZ1H(h$krDU96t*w#|OBf>mqP=hDhi9KPz!L1~ -$YjOXTv)7Np;L<DYxz9M$SHoK{v~2+!jg_g7NH)ZlVBs_waie=vu7WC&OQNhnT|A%<nM*C;C_5q-Z2& -V^(|G6(IfMy0O202-$Ti^<;xG1W88CKf(XV#I^lJ4Trmnm8AaucHx?Nuan9blF19Ev{sqKv6J!&_5{? -h@23VRsrWI?sk|WF-{2xKgSI>1;t}a~>kS|?hkp2-p7UxiF)+`EW{WPHN{YpVlI7N3SGl8C$2Um1M!z -EA)6LN|$FsJZFt;zWDjP#g3APQrx1%qh2%Ts{slRR;q7<kXy{kaT)b%iGsjA6367l<X22x{X2UmJ6Zz -A3lkZ8gmw){(`Ierddj%6E%Xet*kBCSIh}3ji%|pvWlCOzJBAaayTZn~N?gB|eJzN)Tc`X0s{}Kj0fU -F6n(Jqdb#Sv6>pM>G1(*s)1>zlDLb!5sNjhpeq5R)0|tL3~WzH#NElD^%y7+-+6lk56USLg=}idOgaZ -R4NO@24%C~2LBTV}m7Kn>oW(>!R<uQlyQ24eiosXdznSjegP2pBK5oO~xAEm?&;JNqK0o(cWT9vVqc% -)|DGbL5bVc<KZCvqfeTH}I^tJL2<4qfm!Mi+s7rSg7z+DVZuRP>q@{-Uy*TFVolERza-O3UoWE(SGNe -_u_b|cg$4_0!+F?6Rn>vhndkr!&8KgF_b6c(elZ0?nPz<a#adY>D(5Sv(Ly#|7BzIQ9?ZDAqlE_hEjk -CYV<SLj)>4J9^I+Pazh#4EO`bAD-ca^4z2Gx-%+qU-3M+vDRf;6EaZz9EbCqx;>j*YiK(GkDJU6S7$G -!|TI~*Z&Ds9CrCcT&zD(<<nzd?*jOJRQdQWfX}G%$6d(s;irg_?}&2PLp*YUoj5H6ULFKm36?McsNzu -A;m(9V+T}`14B7Dd3zOm8C-FW4QwMc|F?^J#vO1Q9*VmlNT7Yt75>?i?3dyea;qLUq5xl!tR#=mBRGL -&#l~V~FZiV&Mm_r4@uk)3<1;!k{nv`e*04&S&EXE#@-SpY0WITs`WrEXLHbo^$$yeoZ3#;Gk89kRPq} -@X1F@ZItf_J(#S{vx-QxPh&0!j_*^%U#{UI$XoJLanzHg0QTe_IY=_@IW@wK4Rb4M<(jpKlO8IzdVRl -5R~Z<7IDAw?$$Oyt#TLs8HxuJSgrXIi9qEp8KiPeA2WMC4rW=_EatI3ile8Pyhv+kg=j9da9P^yv(qe -4XS`YE;wj~?EO8Q%9tDO!=oh5Pe!;+?5j3~qU)d<%EI9Yc%VrljfW@HlPB*5#Pl~%M&b0$2xuf0F`bh -4qi2PTb+VHoDoPEeJI0W0P?JFkw1Jlt9BV<TPA@ARt(f=k*M3m4rDy!vv!(aYPdck)l&HA1PC<<YCr3 -EH1>%FH9yMhH!~o;uFmh5k$=?0G{sKmfRY;ldxCQr_2YFE>oyRT0>i9W$9@yg|RuWN6a+_ti90CWV7J -Ns+I%>*8?@B<Cbxh~Q5BMl}yJcT+4EVIwliC&sMpiLIG_6#?`{NtsBG|bA<|x9|UCUWh9zw7csaov@3 -IfU3s{xG#?dpfxKfd?B{a#k1VC!%8s>}WT!MJ|=Tni6jt%A<sRQ`@PJn)Bs?)M!>p8XoCxp**aUGF$a -sLN~M=C^)3$sJsUZZM&MDkH?JN{%9PLELwUoy}Z6YxK1+WG&Y*QFz0wXL&^dOL1@8=}C94^Qj-}8-rJ -kzVff0pn3G}+*A)Sp1J(&qO8@a(l<iv)RQC)cCcmKZh7Y6ry25|*%CDUIptXV(q;q)(564f@28NL#(_ -K_R|X07YYCE8dx&{)0=0+xxQNEe`4v2St+kPj8Uu%#O=pjg&s%`5t`w3z-(IoP8wo*HAZ(f<X={WrKE -p>GkqIMA2sq`1+<8PzB7&@>^+WM{TMdpe0GHKr5VQ1Qg|JV+7B@%-R=wep&>RlMx){2W3gROoU(kbjQ -lFk81V&)Gk>8M0q*=g#KaO|s7R?q-KCu_xWE_5ex3n=s)va+B48jF86r1Ki-|_t6alP-&gK)2go@So9 -2n-;ykT!Nsoccn{PJ{|XX5nB8a~APNywO&w-8PcCzpgBC9VL`KQbkunjhM^RQv$AyUoG4n&X3^Ia&1{ -d9A&GR$0k+XzpD8THhs|g^I%%cNz>lz>i#0f6nZWG`pFMz;HZYkOC;eOo!Zdlotjyu5v|%G75hWxOs| -SV5A~Bti?r~9;P7w+1@qZ+X}M!IgeGwAkBMlsk_cL2)hvRdxzRFNQg`R^h9J129R>I}`19e#8YdK@#< -0Y^QY;)8EFm%l)bxN3Y}Fjk<JI~*9v~kTHp1cXw~L{Vj`@p%XnX#5bQ^~e6vY{sqDf@^10_E!inh!ac -(YI=h&_A~*$NDX*{JJEz!7X~tF9H#S~#UE4NpFnCed5^=32Sz40`LrZZ#CSd9AGsezT5?H{1IV-wK>9 -`X$=-M>j>$&y>E~WFE4~fwMikbEVr`Fk7}shF9KB?gqxm?l-rx^7a1Ll8a(C^ZSh6E$7mWR&Nf+;nrL -xcHa`3-pZ%7h(fVn6-6Ah6-8J7kB+VqSGO*P(#jeS`BmPEqNRk_^-~|u&i9+5z%NUYKiuZmQY87VAlf -Ps;7chY3m$JR`#jyG^X#OT_sQ7CJ<9VoPX}*>(l$@`<uP4w_bp1``#nnQ)8M^jsXW_%f3?qc{GT(=FP -0yC8b<LX1=+(jC8dh|3W;n^v|xQq_UV>*EsRR@WXT+tyKQb+tehJ+mbDCB#3M0)c>q>L!iZw>q$uQEx -bfm^OMM7pZow+=^eT~Vw8^*SUcj4q47;~>FCQ&e@Tt0325mAx*TEfe&u+&dC<h)MG^`XH<_+`Yxp72q -4hc7LisDdRO5IrIGyd!=b$*na5AzSvBzD-&6*+POV%Wi1XL&w+6D$%^{)uN#-wr5o4$E&iwgpoHKPFR -hC986I{`s}9I5!$K%X4?OWG{!zlx`vyw)FZ2wTyIuybcJPD4z}qOz?$+j2?7coN~H>%bee7gTO8XRUG -LIE$~`cp;!qD_~g0?NW$ZN_B&DrvMOe3kvW8rD{0YX%%3O1_rW1JJ+H*IOL5c$`>SL`qpGKWC-`?0P^ ->G)zJ8?1mww%rlVSdkTi=$nZ@yDz?1RQz_QvM}zmI49D#7^C$moCVDqpRRes+a#7ebU`DE!0e=5?h@c -UdM5Z+$w1{;bKw$&KF8%$B>~hYEO(Rnu=X$J6ZRLS0$6LRmyW9DC=*s30W?KqZ61Z}|aF1ie!tKHE -lO~h=7xOb&=H|aiZ}&id+EF7mnuqU;8insVQgqX5Mtj2&fj26<t%-Y_79MV^B#mvCNp=U%Eue(jgqkb -+U0)`h{<76LY+{g?`DN|nIl*B+oNAVS@YAR`9nfugl)ozaD=&IfWN<mZSDsm2(PD_u=^gA@?thwg(}a -oOflarN`0z*hk>6?<rj?@QU&J6sch`DstJG&ccl7SEKvap8yyHi=Wp{iw(#+R|RGv4Dqp|4N=RlBsNc -qcSfM0Up4@1e8!wWb4z<!zD3p}5ArVkH}=0C|*a^SObN39<|n*&bkzs~LDNZXSBoh;=Up?GdxJUHCE0 -54}^d;b9Wi~Mq`_%H9rrxp2J1>ZD4x1f}d8lb?>LML&kXBtc;$2YHta)yMXXyQJ>a@4a|5Cme7uJ4dm -0$dMlpS=3GUQ;y6!6RI<EAcEZp_dj%zDmN!nV51hX!&un%Yue;$F}FPkwu!~NKFTv%PFEs;xr+V=f6_ -_mbJ?ZEnOK80)?g(g_^slR(Xl%W(+*s$V4j=$qnB2D@`ZQ1vu_~v6e^g*`<gVFN)Fmds`NYPETkN(8M -`W@AX?=e=6abY4sW8cNehpYf9+hsMUeHt6<LIqTKo7jY7N*;&@sicM$P8lgQnMaw|fB2hujWH+az;Gj -2hN$>I3z!`6BgfQ?TbRtUX_z}X=3=S%UZ!vvS~xl~={LOc;i^W?xfhc#h;-vB**a<lmnRlc(Vx8$V5G -!CNgOm{J;Xt3U<Dj0BpFrOQsz(*a>4;!Fr*tE80vJU!aAm#=Ox8#NpGtfzefHPy<jx{60CHb~nVenj` -KOf4{&e8*}l(0#qJf9Gj*WJ4I5L({+h)v#wrAz~4W`n}X*Ff>fTUhXF=_2>|fP483M7S8Nwjkb~kcW+ -kh1^zFUSAScelvJ|eWVW>P?)n+MvZYUCTyAPyQDqtdTht4Wbwv{UXFHHkro2?3wfF9s8NWp40^0+-wN -l`uPfj+#uA(M@z~3g6*ceo4R-uGcsoO3<`xe5qkd~R6%4BUY<C?$Y1T`<p}q*Rgr`k10Ats>UMU{;iW -G{k?H4m-kG!kd(tURB!6Tr$sYPEtuKcNA93<;-;?du6+LJJ69)BNH9e+i(AM}ae0oMw94lDbt@qac5b -pPjbHq{TP`5&C-3oQQf6u%5f-rP6nZR2XKzcXf2OGJAl@=6a@WI@tRDzOdp?baR?^C2>>K(yJ1P@6z9 -!S<p*-nyD7xz+P4G_44>eqAg15Z?70%np~>zi|5JA<4;pS1GaqAF^);hUunr+^j#Mt@>X{3qfugPdMG -ceKU+kHUbkd+pTW14C$sWA$Hy7ma|3e)MU%n{3SA`8!|r3Uxg%RKcI)}ErJbvvEw-8qv8po;=!V+x$6 -S{hq7Pe+2m^imTvD3OrKc7L39BRHn^{0RDX?*U%+m6i`MygHh6sjKG{aIpV7`mOvfcwu>0_KKe}7s@7 -(T3cMJUNcGpGhXI9hPCoeo<^TOMJ?J#Dwia%M?C0^?S=G@M9A+iOT(7tcEDdnC80|Vd8g&mOSR@fKVx -X33^Tr2ie6xKyug(Y2|tRj#KN53VltVSbLDIRw!t|9m)@<BMp>AMibBKNIHtgTGStxo3R9+V_N#V%T= -fJ2`g6M0F>Co>(I8)|c0Z;h7$KNWAq%WX|V)Tj+BpNu7F{qtHZ2Q<&p3vkZHz+1XD0?!hoR3cPh6R4! -+je{{soKLuPtsWJRH=+Zb6%Lgdd7e76<ywdaDQE%O3u<3;B~lX|X$Uj4&~tu?G*W-B*sC&zb!>?VJiT -QIX=l(q-Im;-@|K2j@LI3GegN|)JIEed9^p6qJY8Apbw1*E>5F~CPN7)*_yGa>9bh}ZOtE{E390#S<& -;)7e>|7vf%hN7=Q;)W?jOuvrwHuH@UT<TX1C}i@oeFSH_p1Z<Y+l4p*(E<aDy64KU~y9dH{5xRqhb;B -FHP7;nm^MU(bYhGBtXc(flGngJMnm>zKt$m=&yI5;CGz<_ry8%OzC@T++y*7~>T@aZi;!l9Xk(<;eQr -SH9I7jeEX<p7Mgu!jZHiJRcraOtl5J#6%~NC=XOc!SJo?npbC1&3oSv1SQqa*>B7x^`UovTCBs%yE<@ -`fha=wnJUPYI`H&DW&FDa!tN<uV}k?@bN%puxGXz`QCa>3^QnnH7tDZ;2Y1ORqlFOBI5crRUkmt_FY{ -%}?g4OJDN|r;7kF8Y#Fd;~dQz5l9HF{1b%Lj;M0W3IT55m0d1d~OEgVe!6QBBrJ+Gwd(f#9K{`3FS9D -ZkJb{Y>m25l<Bq5c9a8`d0H^jjqRFP!V^7{FgX@t2Z+GTvK4$<}{bL1Cp-D;bN>jie>yh9KM48oKE=l -9gwD>|sUh8B=t;Vc-ff8|%XMrW3t2n&Mr&i0qT(@%s2~Nwoq_Os$OVXDkodC+Xw8OSPYI<!f79GO;zb -=sh_B2{%LAcn{}VA0*)o{yt$bMt<gi=pHAz^1g6yiov^$RYv|2%aRStD)1MQe=hj}98{MVDnLKzU#L* -*!XEFyUkHkoyI8gHuYP5CyffpSBc6pH*%08O-e#@1tI>B8!;3e30}eZ?tfcLmxjA><1F(2@F}>yj@Q( -cBgX86gMx0%--whf_q9Ix^W2{_s2DV0=EE>edsiKv&Suj1U4Aeb;7k}J2Qe{+|<<v&bK6~9FE2%AkFY -Ij>+;0H*n<H<Z^z^I;n4UVhtw~Pa<1mSc-Ih;2xN_PAss7vO(25Bkfjl>tH(wr#1;dD#u}KQOq+`*$# -}-(k3QV3L2s$`ws4O*R*GX7`_r4&PT)z;vpjL^ne<9i>v;x)|lgPK4`tXJ<TzGmq;IS9X7|vpjb#9PE -F)v_etj6`%@)pDhC%sn?Mp*E4UllpTWg9-9iQBXN;n5*tez$<a;9e{1JF<Kt5fX867EmM66u+sh_^u3 -ZUE+i+dW^;SeoPNkbUn9Zk$LJplxnf}O`s|3tkQ~6nsev|P3+}i@+Vn;9iLUZFhmfRZ#tTyiv%I6VD@ -HST*>wj>n?Qc5!)Vta5SvZhH0@!1mh5gN!I;zdrM?r;_H%BTu{)KEa5y6cYt{kREl3te+77dZV&!Zss -KL->UHyF2(4C$U7R{umurW+mIY=LQ&rU+w3l*0Th)I0Y1+`zlsrWsZj^~HTYEWzb*~EL0A24j-Cdw&e -k`44qx5V*l0>s}%|#--tniNp&Y(n7fu^TR3^eyVJ363w2j3G|WW(Z8CC4cqGF<Lh)`8q*xk(;%d{Xnp -L35Hx@5AA4qAild*GEAEJ%pCG#?ITL3aaBnGEUr!jfP0|u4~o6V#{oFv`fDF`g{}~^O-6gk5XP|0=B_ -BFU|ns-VaQ!RSXBUnep(wu!bnPB_3`D8D4XE<&Ji%1}U~5=XYqsX^t|Fw|9|8R+7lVPL=G?pXq^? -*VdP%7^%cT*TOidUC?AW$}vEL?QQd(8%3KRce*Uv-xSicGD<R9m>OT#uU{vp?0f9r=0L%Po(@(&b7kQ -K82&XF6n`sYu3pZ~A!;R|N|o7ev(n6B8ii6vLM6m2-S5-5t<cvcqfVLb7sttZoM1T7){6@N?&vvkw6k -i<qJ*Q4S6Gz`6&K$3e_(29*{x^c2Cjfmbhr&fqV(XZQ2e<p_U2B3Jhr39@wNJsnVJF^kJaQA;-N$biP -lO2^;NF}pPh`HVbO6{gJyF1OwKhb2X4G4TCgZti6xXsd2$gjXu(6>qU>G2m}>hAM%)ei`DM&t=N^W5P -JM450=MaQYy5Jncn^6H<r{g+Zcio-T<9$Z#5+SK*iSXgbqD=Hzt4w|+8iDn&s=qI}Dc*?)bjU{s6PhH ->>&+ELdh?`Zhk350(FGcj&#=E^G@WuIx=9~4(3gZ==>@Y_xpSawaw{~xLVfrlA+1sXoQ3{K}-x2-On8 -E&_?tFc0%meoa>*d7OU2C*H?@Ix~(tmhszjbGVQ2}vn4d0FUIU=j`_!sA7%szTubli%J^?h0kjbN=%w -(qY#abI8BdIHod;)l^}!-i{3uvRAPo9HvcmwCc1{#h^AQ#l{QJn$jTtCho=`tW>*Civj5THu1<VSIT4 -WenGIQHjN=Tu_Y=P79D+ABLMcyuqmIO+W~#jcv>|aJzZgM4!lr1>VhDB^XgIF^@d)Vi<R`gRbyLvBgg -ckfjyYf^e7;@CA&_#1z@nvw9Nu>)~yX<O5zLs<*F7?MxwsNTSMs{w3{ZDc8bSs5>Ca7x_`91_KG`Rp= -g?tfsJ3F1*E*Pf-~0?A|JqETQI$IUdz(C$9JsQ3E}5XRCVg07aN&c)m>6Cz?H+$DxT5SZm(yWc8E=@$ -#W>nACcO_i3(FNm=f$89o`&D6Tf~y4WW`6nF_U$j<W5UC%ut_F?qO(LS9uxgt9vN!Y2>tJx^PFLQGyc -XJM0@l$HbcAsJWE2Mv?PJKSb19UbD`(~yG)p`O%k~`etG+4Gfo<FHmQ*J%<^kQk9^$+Y!)N#p*d9Dw^ -#T~iz6Qe!6d*ZOiJhuiQ!jyV_BKP%))|V#=e>~B$hELD?^R^1`d3HXduxkA`)(<C2)r&GY*mpcOCejG -n74YNgB;<54vgW0@dHp5PZ)#X{O^$9dU--CwtjUR9_(yq$UL&<~%cTGZCtfTRe9zAI@o2{!les5hmcG -zDA1y;<!Hq0(8gO2mQ%5pcn?qGAg5TfK1I~`3tyUcqFZfI#N`GPx&kPw^5LM;S9|Sy5#>H6PYo!Aua( -6k~fi6CeJoHGI#YM^hY8Q4={d6tOIzQ{n5(I0QJ}{B4Xpo^74E>r3k7nb!1C06wHMK!9IK=hAs}MEyq -!YA3%~~APgYb6U3s=JQ+*X(&Ln_(PknT|B%`{otzQ{mD`N`v186Cgic7BKg1I<kLeO8zh|9vG#+=tbz -+W|JM`)`Tor(Mi1Pq6>_{3rWQ2wrP+nm}QOq<++Q{6}Z{s`~iLvwW8ajZz4W;}nJB==v2VVERL9%xvy -%aIz;i?>$*0+8Av1sfoG|wnw{mBillvKSuMN@UC=t8(Al}`3RKW<rd*ima%<LGTrw>qm9L`q<9PUTao -!^_RcFqXV8u9(z}L(A-Anla>wp%BJj&($a+#Z+OlHE{ij*9-FCFk3x?s|T+X&vx1Md|>e*%vw~fpHk{ -XNq1}OQp%`1CjbFN@b!0C_2`NHJ~MXc>vYemoMpQqn-&PATlir~7fkMd`OVV-+(S8SVxua?bNI6e@Zc -B4l?Uv$J=nXS&>QDgaoH?!lIuE+&n{pq=a(%wJak_mpK&A{G`{esT?ebzSvwQ>dIFEfDOKla`2@A{Sh -<o36_2mX`W-|imxI~v?49SKkSao0?!I_m!Ds>T~|ogq6^tuo$o{Lsm9!xhjy@}<FLA?%Da(s<*Mm51C -^9xsvb6b1Lg{mJ@>N6V31UjRIuX<1h%TsF?P$7X%DQsEh5&k|YkgMD7Sa==b+NxFLyW~an~J!a3FkT9 -;$Yw*GVs*2^e7kul*pemcdEeV5H6P!5Lw^Bct<dSiWfMo0?QTY%q^hq7ETzp1miz&}phJgGKFaAhkw| -q*tC6;G&vD15eJM$ND(Z`|e;TIJpOpqhl)e~;s`CXoeQ+Y~Q<oawQpq(7qCnf!Mey_jPh;EcF%fm#HM -yG9-hs`~~0Hz>^yfaqK)nL`c>FIbun<-!4wW|dXYsK;6pQs{$oE%?De$?<gah7E54I(V%gj$_U(o4t( -!||j#S!*$y&eKS1L;5tJA`qo?C1mR5cvlJreqBg;m;^Q>gX?i#ng5Ad7U+0-A8GHU`Kf$prNM>;+;xy -jWb!EmR1q9Wo)H%sd_Pc#DhvbjpWeGwY@r@VdK6wK`+3682kEA}Uf~M3g_=5&31iS3xCp#S{aDjCWJ# -?Inc^dVd3lNG8X?!NH9~(26r{%$KOYH8@<!MtT37_BTSoMthIdg7WNV4((mrd5Y~!C;+m(ciuC<T!Xw -r<P_K$g(p+O)@kt7fE!Nux<A5Ku|H7F*ecM2#^>NI+2@??8mWgheK<RdlwwMkLxN8$S>g{WO`d@I*j@ -u05t0;EeZR{H(GmXY-{4X!kP_DAOOQEXV(?QgQ#-Lmu;^}sDNC{sGPvn3ylp8Za+`!l`n=Z3~w$g&!c -VyZMA4-ea&W#7Cew^Qr}!tH^Ixys*Z$4F>IN}Qf6B{_G97m~o#vDAh;51-*11p{Sgl-kXBbjK8osE8G -oDu2CXSP2Zo?a8_hVY9$1JNDQ2n7b!AbPHAA2N@m=(TraJzln?Z${91r;*SNSz=0i|7(BwLYaP$!xf< -0;#gs#+&iUIVLbSL+A#vm26B@oN+yiVKK8sP!s@@Efa*3VFaOhEuksewaOSvTpMTEBV-PE2n<+<Rc$} -)sCSVunI;X6|T&#^ij&JNA0^&yvxlh$!8dKM|$e3ER(JLH^mN>#vP%&j#v>Qos_WKs9Rq40pu^98uTY -xNvBBy^igRJw+PfX=1>Mqq)+SLy!1-zVmk970k$oa{^M6A`TPeb>`C3X!0B2eSArRTrs2Uj{wJ8lEV! -aKyvzc~Bfn3p?mOp$jy)ddDI)c7>wBx1!hKp}bUF)2K6`;uq$LmhzAbZRbz06ctOAW<yWM70q%wt0`c -g51Mp3v95wwL(0ln89bmRt>CD4f#9$x3gv0{ny4T~@A0TI-x7GY?4xB}(ucX0n)P62@G*FE>HJD+5(= -j<C#j1BDT)hdb9Yu|7fXfd9Jc(jh(#iv#Fx!opfOL;?h2pEYO>C)&b-It)uEKY6JpSi)@ym818DW>72 -FDZIm7OoJe;(d#I=T+MY+|<$fH4YPI&cFRQd03dF&e$Yf+`$9=A<IX1ZS=5>NI&KG>xH8^?Uzk^l2gz -b)4=5+*PbhcSx47zW00493^ejiG6VA_x+r5SSpak19B9cPdEtJ$W+POn(r3+iE9?ZHoihT?SEjn>;0{ -pUHPWWg}zs?yQUL_1{+QZBBnQxwTYKbPvtjTPGQ@wSG1$LwKzYe^SA%WmmKhD>2NjA11bYp!djU65EE -Y;(Z@xGd`rZ-TzNUMQiD}`5eWYQWr))=Xk95v6YwU?zglbMJ2!7+z7S`?*4Ui!#Yl2-`{vbF?2M9GKs -#<x&QIzz4&8%vt*URRp+i>Hat$Bl~`L9qlZ57+{9+zOc!Z@Fd3iJwOef@1eW`UCDG@?jNP1tHtFuHJJ -x4&2Kkem*V*DRmMgN4&i>dgg5~MRuiWx;w}?kR35vsuo;$~?4=?8`;Ds2_x#r7Wi}TIx9$oPdgCOfCj -f}020sN_vp?g+J;FOW@*(5JU`F!^c&7zO&d>~&jn9KU<`AUL<epqMM00Gu~9aFpE-wupDuGOOlebsA1 -r#=>1$lCgy&=04Qw~eK_U9b1Ja0#Yl{CB!s(Ck)7z|E0jzOL>PQQJP%f*E>%+VowY`1~2(pz3b*9t2K -r-*EdmA@ra=o_He`&^&ucMOgxG`+j(xni%&6A}0&Z*2XZtV)b=!`)+t=nGQuSq*e7y)aAD>3Q&3gF9y -MD)Wx0_7J$z#eTT(6oQ9x0#Wz;2QVAWZ_DI$?zVr>IJzCT-H2h+VydP?JQYTCGy3*m|ZdDv$woZXV8c -FMSwYf{lE7kc4&pmTm+~d=^)aW@79`Kh^z*+C%yMb8Xn~B(LZ(7*8u>JmX&L+WHsM2eHv23>}@_r&I< -<2)<5iEZ+IDoCgF}$CXa(QSTEL8IKs>SIr2P~<{e*AMmnM7P62u6Ul9E^_wn0AMOE}PMX<~c|2Ni>2W -r-igg)@Rv=bkNB&DT@8&PSZETo6!^I)|c_&1Irc-eP{Ixr+A=Z9_Cy9ysW=y5ASf}oruT#*en6T4JP6 -{vVFJo8{VmI8(vr;>`pj<aPkaV6yGJ|TnJVd(fyGJpAXAoPPBKco;hsrsFXefBFTKeIB{A15<Qb5d5M -Yx0mu*sX~4sYmL^Yb=x5&?OWa3HjT_hioO@ZJ_3K0OR!HM18{^OleyWWNwa3d)<g^Hs0heJQnK2qPNZ -D{DB+ydvGcK@1XM3l&==Ih4{!Ch`rOaARmh4*HIP$U_j<IS91`wqE`k^*1RolzURrq~H88^(&u<QPDs -J5@@H|>HiKVj|v!_XK)Vi@{k%i(Vy`~|Cia^QE8>JN<@$X#`e{_9hJf92!k9u~VYbb{Gk7NTvx9LKkB -(2utUaArdXYIo>McJbKySA0)vCFsq)XGNxXACg@$E++Q~T6EJjGt5t*hzYm$#rh1C*m@Auo-!3N+dvD -0?<RS>$~sQAFsW@fg5Itdk(&T}6A8o{=xqwIT|cm55}a<sE6Dx=ar&3d1b<s*;o~1$1An5m`#!t*1L~ -O0A|&fN-hEMFxmN8F@lo8;NH}+f36s~Sl|C$b8Ba3Lrk};ox(F*sdf|#KsSvQxY5zvQ{RlzAW_ULnC5 -!7zKI+JqG28DR8v&>M9)g@ZJxLB5eVJ_$g+H!ld3tX;`HF4VMPFoWn{xra8FV=$mukFjX-$IB?SJy}_ -i%LkX<z+^d?X{2F7J%vm@@{#dcm9=But$_&!woruNfiUjbTWT9MM{UET%$qZ<J(ZYN?VVri2OE8Tq{l -52|FwULHX<>WuuM!R+W#E#pK}Z&4jEeGIab2WYs7X2Ypw0<yiHYKIO`JCWPFq=cQ1^UprBrh+uike+~ -z51KBPxfLyXIw6C{1A_pFiXQEF@LI$=Mn--Va3q32;c@h8R?%Kud|6Rb<QhdeXM?7nX}jXCp~20wjv} -$N76cV*IW+_q&r??zruh~I=)#I7w_vd-zud#idBsqtxoPfjQ%Uk~p@lum%bcZPC@TQ0M{>K=S>9BauJ -5a-$hc$+JH6fcDIqm=W_k!hwwjV=Sva;452KFry5-BI8|doJ0bv^(!}=l1nhrlM<>OGL!70THQavF&7 -bQ1vgv;mnl33Ogaiqx^Wvr)MUe02J#8nHp9VVO`DDJb<)x-3Z3@n1vAO|bUv=>iZc%E-rXP*eJAKOg5 -f!P}qALmCHFp3*$H$XfWHFtkPh(9Avq%ZhUYA+G>e6aM4Oo(<m5FzWS=R>AtWP@F~J6FC6=?--|Ru^X -*I6=;BIVr`Rk(dB|U)<M9Pt=~ZNbX{I22P77{OWEAL(wH7dfjA^vOTJAqZw}T*cbp~Z-d%TgREuVPTt -aGLT*<&W3WK#bdW-#=sf7hGM$a<qm#Ter7THSZbee6xZ_VJ;Cq4HPpJI2y#W2eCLnjaHyUz&E(<Wc6M -bYzyjl6ePXr5pUR?H`nZUXTT>wn<8qG>3G({aFmRBemt*t0(n*N@pl7R(yqg6r9}XL=KNpQW8NEC -#s!JIEi)ui^4-}lkdqi`-XybAxvQie$DB$RxD(4u_BFa-&W@*fh5S~B74G9*PnUuVver~>jASG#>yZB -92VrJlR7Dh7>A1dGsC(Ex_!*8M<p1+NeIbLRH&OlIG%`*vwS9B>3IWyS$B(*is=^Q_@->3CD@q9X*+y -DZ>k{3HdoYJ5x2>k>^%8?*902sTeWtYxw!`!1*maAT@ENQqaoUpMI=;5v9~JlS{Ebqs$N&^n(*~qhvN -37$lN><F+|sCYt6DcfddNgvVG8GuC=a>JeorlGGHKdgNk_M`j$$$lIN(cUr3V^5NP&!EmO!h(=z3otY -+Bl0ExC`mn1O0e}qZrucZiD4*jLmUljX#Ef{=RKV*z0;r9}g8*+Rq%xh`LxqI+%Giw$ggM;hW&nISqk -R_&Fh*TCDngQ-pU}=ejGV31pRFialtNkI-Y@Q2`=2eZ-@Pr#G1rR+$N4Mi)^mD?A?5lqaZj11;F5QV# -Mte%n9{h-Bu(kPAd9X2w1n1}L^deLpdO}PAU?(wj{Bf4y)6lBrK;0Yr;7myzt6-Y7hXT!$1BAq3JRV` -?$#}~BH9Pn47&4lAKP|u&K|<e@-}r>xUrA&g`a}9=QtpsR$~0e%R>^(u#s0g+684`IOTTgO$Hfx%+r` -pab*!`-*`sMT58=I1O6g5Cv9jN7Ya`w5NT^Nwm&PA^k?g_u8MS>S$<MnbFu5^h1mE<G(Z1WVo?xZxD+ -iBu6Rqu1Kl36<lkIeCX|+8S-SmWLxHSgwWcx}*o8%GShtAg8Ys)M^cQ;~uyY|ZA@py9}UjG`VyA@-!r -*ooPl@;ykjsKq%OMl|)-xNz_j+o*P#nPw8{@05o{ogE>)Ju4Hy1r|g9$k@1QVK`Cens?|LkIQ{_MVI` -_F3u_`U(Wv95V0LOOu;*y^lAI!SPcP<uCIdYetU?>B9^~!Hc_W(edowh_H4sxeGTpBNJl+U|@0MoNs5 -Mg*^9-OxlG72|5yP!)a96H=I0g#SKrqu527gi$P^cO?faIXKvqDtz&?Gsd+vZrH2RG4%72sl@?U?NZy -4gDOKk@)IJfL*Jw=BrFJjSO}V0P>aB8E|1Qwe1%P?wg;Yq#pN>mZ*0*pG2Ge3|(ZKQ19D|^_+N6TaVq -x6fE`1u)!sI327hIk&DiH$^#yYGyOpIfYHWPRt>l-%u7@0_KjB0czQCu9q(`d(%&?zPmW^7XQjnt4nj -4piv)Pi3Yy=_PcX<suL)-!sDa>sS^qoX<K5t1kx1DS&q1}#P1^XZ*3jhcE;m_2T`a|IT8gd<ZfHRf&~ -Z%4ul#P@*^iK8|5mYi#`sgQ6^T|?nU<%LcNV);Z5jWiWn<Qs1rFcH@}kFFP>3V1x4k8?>Yd}Ym-mNu? -+Q&TwKpiHH4RfGAri*?`>3^~$@tHjLAVLX80lc<Z)5k~Dcc%RtIb6v@4=RIOmdt07FMj6VoV7FTU=DI -M5LomCF^f+by@I3qZ2~Zh+LW^ZxCrj1#m3}t3^4cRgkKA4*d8E0}do&##C9Nt1ny8ze#_C!-mO^*vv= -ICI#gdTXO9oXDNa5Wuz5yqv2qik0r{kOdyTuZFU`xPqT;Z-O?DfIF@zT?g1?=$Bwgy#vC-24=UuW5vm -*-vA=F=%xYv#rgQ6Hf<w_Cy217h2nnJ(Apc6xz|*>!n#xDZgZ=r{G%60Zmp6+s^-1V2y%U0$1<xO?F1 -#>DDVKVNJ>KDHfnkU3QckAuvnuXsE^on;nVL#ngI&JU6>Gn^C)$6{{u;Bc6Fx<as8Zd`$}P(V_&k+7~ -9rbdsuvfe#1wMRHSTCkFxazS#Da}r!I>{gq_qdJGuT=C)|I}{d(+@vl9Ov1(_|4{eAQmcM-@t=c}-u3 -Y~o-Wt!|C0A!O^;$*u;4qt;=C*F72cdTyb&P0i+RC=KnP(3;@1zTOjp&ZKHWX{&cwt_bXQ11m@R#1XR -fu^%B<-AIgruSx<HuV&~aJTBAy1Iy^|}J(XZ<Z01+g%h4U~eEUCs#%Hm53#mYmLX&!pL*W3F<*f(CcA -7P50WcXqy5Io&@vh%79!Dk@5>zBM?+6FC9>A`B%?2FKYyq*PZ46mghTF=^ObYgSb(h~=Wd^C63uQ~f7 -Z@AX*K$FOp&hRIEVmQ$vxdx-PGsIKg*<zAeQXeWYynRDY(ycjh@iSKTnZ$#GlsEOML?HmV@>-D0r5ib -FQ6&R!pKeVP$c`jMFYO+=Z6>M^XS^J*r#R5t%D7c&@<csEyj5QuFcVap>lZOEDCN37InLnn{JP0x18L -%fvzOw=_|q^EbJzuQwSy9vx^eY*g3b+;rze1(OJb&09fF;=n-KTsbBb|CnweqUUaMZS{aKo$^dIyp{t -qW_b30G}^~E#%3vKzzVXphz-x@afZu+o;G5^DZLA)o@XUXIHUSE}^^JC{<+Zq3Fz0&vfmH%>;zif6)< -4-OJJTg`2$2*CFkMb4h<8V&qM<aiVeriQ`j`n-S(ZhlXKkUYlPx0#^z?ObwN|B?Z@o*UjkMt9jeXU=C -pnvDc!OJq}Pq<i-9Sa{j$IFn9)e?FX=@g%Z733qn4Sp_gsH5PASPJ-YL(Hg;cwK(1tq}RK?z3N*_{ft -Ui!a&7|9t0nf4zpXd}ILT|I+OE)$H&W(qr-N3S2h2|HgXc)|`H53K5ddYSWH+$AR9;!qE<YxD<Fh(aE -N82SaJ2v#$y!qbB@(@OPQ%qjV$+<RAJwG))rB$rHUX^7QtoY5i)QyM7~c-)PhiQUFIiC;h%UF8rlAQv -0g2aul(Ax+8!8`Toww1OD6R`#T>G_-~)@zkR%K-ITyzwNuh2OJ$L<gthWgE<~Ak@mM5Cr0706oi`mId -9}omTJ~BzxwmHKnC}ZU8AfVY_LS8QbJfMF6BxUGEth)rXeyGI6OCQ3$UEScGhnH2$MD6$8A1K^qDuuT -ua-pe;v;V%EOhmrGwprK%Zf3Mk?VTW@Se4|w@U?_z}qNLJp;IYj~M*aHc#*Hv>Fh(a?@H7h5}C71%A> -a>ud-b3AF)61>#H6dRoP$-xOiSfGDR&Ppe804g=#PX&$F<jVa@OM-kcWUQ1XEUoSZHR&-E`aBRAIWoJ -`9m~%tWP8z^>w3hH@`CO%tVmcV?S6e?7_%zDv6&zeaxlijlK!JD08KNRN>+F{+zJ22_z<(n!zpcgish -iS<0Q#K4S6F1@>hcr?W1!!n`#KZX_n#4%o!@vj<h95C6x?0kfUn|nbAdwzD^7GGE^f)9PHrZ0U?#=L& -B48SDlwHp6%vD8r;u3MqjD@Er4?~!Ap#)L7HsVPQcN>{yK&!AI6GF;(qS7sApD91qtM%%GpD^ojl-Lo -^J#X=^NWd*#YaE@FYhnHxI)<C=Y54=TuAa8RMIlVfamOaS4<Dgz5Zl!IBUN{OB0F8042#<Xb36-2cRJ -HR60AA@SpK`B26PthJ=!2xhd35BN;7HBk`)$ud>O-8y1hVHE@E37p{Jt<$DX{R9+iVEN+H;*IDS<^l& -Ur^n$j~l~I|Zelw?x<f%4PEvtVJhE$^oE}5Kf*ExgsfYTdXFPN_XPqe^z{+AZ~1G$F$$HGth0H<S*Y0 -P(&y4PcqkIg*(f}{UyXZnVde{q(dpb~-+7$sp6CvX@9VG1G%h=Oqxfk=`>sr^5U#DD7&fg&HtE%Io%A -hM&45&fXi4rwHMw07(ulqW|G=e`5}dq7R81CEnVZNm<(BzT<iSOY>1Suuh*)|z1KI8FSK5+gpg#OaQJ -f0o=pJ}O{Id@S^!@Ub98Vn>C<et~1b2{|ens4uEL)Ugtjel!qvLU2g&U`M3_^Z{TBJ1(=IXQv29Wkhm -3A^x(gl&23soxcOB>B$`Skc`P#814P&LKKni_J91OKSc@9uSE%h<@_K>Q!bI|X&)b;k0?N3ZISQ2kK% -+Bp4$B%1f(1P(Ae->EoNcu(dchf1U|@<-rXNk4PUAsegqSRwn8Npr{0wGLA`se#>yeL9X%gAcyikJN5 -3i!?M81$Wdoo&>08@eOn2H?lYVUo@q{0xgE*#T-1o=T>EmLQNjs$PFZ#r9w|EEB81XjEE*Ir{#)J|q` -)AvuqkZFO4%rd;9odWxd{63F<sy_nrcN40DBC55TRMfuIr81#N)iCS2T@LzHEu*TPkk;K+7>!byhfEX -DDZX{iP2Y|GF1-`-+cr5JYNOy<im7NG_i6^v|Mvo413{?a2DIN4Wat9qZ*OwR*|s|cHah#e^oCDKD+( -v3MAdslDB$YF7lgzFYoxuR4&QGZE+r3^#Kq4lJ=WyV8I()?-Y0r#t^@(0bz!vz5j&(UwBble7ir2b$Q -9Sol<kqBTF^h5QcJVDPeP}dwXE%`3r>vun}8LOhpDpV)S61GeDcJWL+uFUArr%mCl^Q%dnz+&K8!c2+ -MLk!*fOQw^NVQT)>}C{q+$}x&dp6rRh8Xu^#*$avfT+OLTYiK=ae`B(bbq#{`exNC!<-y&a`kP``m_8 -6LKn>8Csb_`l?j#HeroMm)XheFio&9?61l-+P<}F?OW!pBm+Chqsf)Eh5W~;_=I47H#K$<-n9jX++BH -CzUTtc%<1}iC(lHcjSNEk)^-v_+`K5Kk6)iKME~gFs9M^vudRYgo4KzpJqaM?r4|8C+oI`c;yPQ(+(x -N|NiS}SRFwWJ>W%g(xneE0|6i7%Fwbu@B_iv*?Ozmsq%x|$n+M?dWdl!n)}2qPpy@EqjQ3D_B2I+$Ha -a92Wg9=JP?&haq^Ov5NUFai6;7JOcvSrp(Ik~*|b9w4`{}S_eaQ?k+E*r49s?`bM9T?!}RT+B9+l@O> -m9C6tgm+FP*j^2$&Ff%;}eb%LZ)FwzR$}Bb1j^Df>W8hwAi<RGGcG$PHEpCly@8IVIzpG}mkmUY)Qp& -pylvBrCTqeOd1zrQY-{lq~Z60z{8hLT&36#Wj|3%*Z<hH(H@(spzi}`1eto`yY<w+RndzicOD>$bap? -NA1wM@9>E`k9hPKT>huWenaB_e%#N!90(5nw)pRm3-}Z^;2#BWlsI}OsgH6U^6{lO)&@SJH%Ru~+Tz# -1mHhZ0C5MV8@~QSikRu!>KS%H21|>(>2vbKKT6{bYvEopkE5JX&S@eV1G5YDdOb?5TJ#5C|Pcg?wvkp -T)!Ufo;rvpD0DsuENV5IWnko*t;I+PjW&(gyouJ`FMJ?xsGf2V(=8S}u|^*hdTY-nu1t8dnL@D~iS1V -FRgg<rm@Wv;yXRkQP3@b-r^z#fksHE4q3xzHcZxIpq*b)b*5J#*AI9QMIi=cD1dKOP+!?sDZcNO!73! -}I;?HsE)|`X{3TemAV&kLsUvGV0g2JyN)JqM-ZRz_0b$cX?mYok5JL*9l&j$MZ^aytUt|E?pOn+do>) --&{&`Lp&|L=Q($S+jzMlo6T3IQ4WRG`l<pW9M6M#<0%|07iHk0FfiHDCD>Y;5vV;tdEeH0?oEb>^oQf -y#?_W?mMF6h(+lF&u7;P(QGH;wXDc-%I;1S%Z5xmDiGwd8REkwqB~^S~BKq?70*#}tpg2R4?)4WUS~r -H3%;x}VJmJ#sIvQ7T)PPoadad4@_m_0;?dh(?j&i+lg=C#j)+V<8RCVri_M{Ud8dKdYWFN1NNaK7Rcb -L@!=c>zKNhizn=_3zf8aG*pLKDR1gz{Dv3Xu4$5<7WFzjrdSwDmY>g?~hgz+dLO4J6(<Q=#c-^|CPbT -D*twtt+S@@_(XV$}-@W^1_0VB~_CpS(8QjA>m~qM|dJyRmweHDs1)X-MayqNWF6#Yt-P&-KO5LHe)Hy -xk1MrXnUUSDvrE-xyjtO_B97_Y}4L5+u1iTpBMGf4<sL*N29Yr-*4aJJqw0vn_W4>wFCqH*|YNy!i5v -~D>=QdeTtZii8IWDJBfy0ftf_(>YG9`B%LD`0>7kBusI6MSBNMhpu*;qeJOw~(qotcb^H7lAaV=#69= -18e0~cyc1!R7+1~X7P@e*L<78xKOoc7rrNmtYM(JzD_Cnrd2374f{*<_ya)%{c*HmxO@~#HrwAfO8EQ -K&Jxq>|nv;b8acIrU*Ji#>48OBA*l|0t#TNf3rDRQ=6OD9mZQGx0~;DMZ7gkVGZxxQj}92MJoKm1@;y -rIQzYDZ3|!7hfa5t|#lI1vV|;aLpamLRk<i(Y_@b)UNFprOKhnFBHBw^oR0HR7n^FqfopSVg~uZ+vT~ -jS%;^Kt!xg2#7e<;01k?fFb+$czN8poOSLZI~QZvv}j)in0SqPS*f-}uMd;#S7bo~=k5_RRi0JtB27+ -pM?ye(R10)^TAPDo?~yf=b`XQkY9VMlJx=of4xr|}|0S&c)5HH7uD>4oABg>1#n~OxQv3)&;g2dcoPB -b{=%E+1N1xai4TFzu)&3;;eZwV%A0_`gEFT$P?BgE=9`Xr0b{6r!vyVv79+&PBY>^)wkB2k^^-<(T{% -qMlKjd$B+{QmT4CKdrk;D&(-jCeJwg<%UN8<?o6i6odahaVk6v%PjL!Agc0_dY*06oxtkCOMdvJaAze -~sAYf!Ob#5F7k0Vhi*?N9@auetg45+5H=cZF%9Jptif{T=WZSy9;n^{N2$0?#O^Y8`__b?4Nk|D&1Of -)-u;8M7yxpSFrFKfz>aiqsqRp^Rn-N_EsuX#avrk+3w*EEH=_H#S*3O3v%mA`o%5Oa1q866=8}yPo%a -s@S{9klG0!^4FnL!fWk?tHmmE2sxlm*p3#c%Ibrntsl;c^3?qiPX~YGpgY3$w=cpA&r-ey-4|*ctX*! -yauVu_76D!RKm7E;H57!di#MH4Rrz)NUI$Jku_01TqbqGbs3W-1))K$2(fS$na{o{dO21F7EsS*tKbg -f`)gXT4U;o#_o<>NKxSA=^tSVi5Wt51%>s|wiZVkaaZmF7vha3M!db_pva@tB-8VtWr)pP?CqCl}$Bb -3YF`f<cgk#P|=$ZJW!{G*SMom1_O!*3DY;??<GL?^pWhDSgUgK+@Ol_bb&bgP7lu+uM=b-jQ2+$RfZ0 -W2%lCBT-m@YfZi)v3*Cr4kn0#srPU2XU@sp165GJ8h_kqt#<oT>2d(^QT+m>h}Iqno6iQ2Kc2roDD8! -x=Nd<2Do;`t`%SL?fc?+yJeoVQ1C~SGezKkpls3ClU$u_0F+TL~`M9($3|lqKBa^J<7<IN|_%T}Gr{T -i-J7KBs1SCK{8YD&dDb&#m4cbrak?#QZ;9&dkiy1g@|IZDNX^;q}*tpnkeI;W)a3z&6PKNQwT{{`7bJ -zpO%&m|XHf-K88{{Sv$3<H;oS0U;3$Zy7grdIQ^h0rXs&b1E{aQ5$bXoZ{+wu{_fNs1@H;J#vwjTzHB -%RiOjSs68<U5v;<5Nor;{hW^0@kk9L@x{xwZ|pqMJJWWQWpT$p2aNKiU4i{TAyb4620YSG9k$iz3GIA -2E~~WJLio>kWy<wphor7l>yJ3;t*X7tbHzmvdUq+GMxvmj(GH{%o(k-F~rJUz>50q%4U#sGoH!wmUUQ -bWIW8&A)_MEGXO5$@_Ic4W)8PA-a#eP6FRgZj{4NR*X4FsX79C7Z<KyZ&u&dtRj{GIuRc%zi>t@F`~s -#He4y^<b^Jfa|M{zi{9o+*T?zh|{eH@1gBSrL7>I)~LLmr3!q9KmfnoeeN$;`m0id4*GemsMC$S@BJ) -FTlxnuC7+z0+%C~yyKap=fO=O0DBEI(pf_|r3oe+2ywog?fBX3<Y&-U0l?v1&{F**b6zAJID+f4s)BP -Z1vYQCz}4=ns7)b-@Gf4?#fcXavl5?vNbW>La@T_#WfPu`nHfa@JJ#aY!Z)#Ru>&tuTc602}CgO`bw4 -mwon~mwFU#zXxggI}!q4bm4VXv$Tc(lD?MsrDxN-0Pa)49xg=H5AR*}_xOE#AHA7M?X-DE_hu26Z*u4 -iXWGoS9lor43i4NxKz^T`()D_X1v>7geW}sgW00RWF77YOxh^=a{6<?}#SR>{QQpU7mF{y)cIQ{%k2f -Fto5ve%x6iwC`bJmLp@VNC^!x$R{MYxt3g5an`G5ua&%|xnFNtLNNF*QLNcDp>X*P?6z=kHlNZ19r=7 -63ms~6zR37<sw$}t7sqS$l7d~S=+$dYzc9nf8Qib0;oU6Fc~+PF`WuSmCtAl4<o@a+Wm>v$cP#2}uh@ -iBsQjfbAqkvH-545(h)8jzD?BLr`@<MoN^&<icx)<PT+8Cc=>eaN)6C$<Nc3wLPRLs!CLqO>uG5*0!+ -rsI3FoHKQ9uB5I|r=krE5VeCiVUip$of5<!FA~g4UJ&`o4DfM9vg;cX+!KV`A~W*-{U*Ls2cOn!c~?{ -GLKMD7u4GpgdqDpVPE~_8Y8z@f59hRXxnJ;<iF}L<E10kJ^K;pw`rdweC8;~Sxo(m<zpb9L%-e7UOcD -2n;w-ioXl_yaTKK2De$cw@LmS%7wlo^sQW%3;dN0^|89Ea3Z`F!1Chy)91OpO9N7-DCOk(&Q=Y;LFRu -#qz7;nlNDaEr{wa^8B>m@SGw;JcJe$vge9!+qxQLzG;MaVagM}P65;aY877JzJO65DdksrTAtozK3Pd -sI#X&l6*JuZDXZHS7ahrKxmX4yeyj=jS(usYD7%Pc+?7ttnNh1#$BI6c%OhYOG6@RMAi)?clBF2DijW -#W=++uGR>2s&+N3ydH0+4R!eY$=?YucsxuMuZ8MdU|d@8fk8BM-<r6r7e*=4p1TzZt<Q!70mIW{J!FC -Ta3zA#<hpRhy5C6O|ISb4AT_`*^>;r>F-=j24g~8`xmH5ubJ`lr@AqKdoWcKKx?k<3_Zf)|_fV4SBFB -)+I}vqEii=2pA4>_&xv3B8^YaW6*hRaBm%E?=6KmRa2Tl7_hjeOi!G?FPpqM76b^i(m8rs5Z5_<0)7R -ARMflr-&D~NT@%`)x6X90+h-sz{BfE~{pElGHq*Fy{hs}!vcI)b4p#ja0}F(S5;-t6pCJ6j`ox384eb -A6Kl?JKKh?!{k-2u)P;mYg{XB$Pa}PEi}zBQ*`x>IlS%62y_ZkP%_kp88NI__{RsB?eA;Ypai`<ex8+ -@)@64nY1R&otnHkA2zRV!Y85T%oN-@-z<G646i}cxzvfz0+hrp;0V+D&dc>RmnhTJl{l+UaN2(qUKyW -J`dW6ueIgqvp^4XdyRCOg;wOZ>3K`wTJ8J<t`!z8|BwF}3Ee7XaPwGhYQPME_Rcb>VC%9KT%)Y#eIN4 -mqOtif>TS3SQLh~deK)F@Ul?#at-ujb2UO{8zah^gT*ky8g|B2twDtrm&5aG3VMDZ|Qc8|_KB@g}tk= -y`?SZSntBsM+<ZIRs&-*Iz1XYs?#&rkPalQ3PkC)3?uCr+2pw+^9tHju0na+Z+m2yEK5#eMQ}>!)^US -z(H=rMs${7iJZSiZjng)yp-jS(B+uqfQDJ;1Zo)?;BXZXL1Ep^gZ$e@-o>QdGYgNtaKx)9o}8LUaA|9 -I7QPakyCU=wuG4=>uI!hRrI}{s()XBie){EmZL)$@_2p}!x<O(c>1ft)PLRcyMolWy?#npkT8jXJ1;^ -Bl*B2V1b-|2xQF~ZlQ`NG@*|PIa|@6<dMIJ&P;Ml$PjMQ2qzFj(-yr<^+y!zRO2kKT0EB&VA;r<{u)l -<hBU3>^M@9krSf(E0%IUG%kE1&i`}6+JLvIp1`atuKJ3;oLI7xnRD~LLJ7j~+(^PY_On1+A4E@1fJc{ ->4uKEsB;xBz|hr84MHy*ip6_M!YGJ(9qUWtrrA?m`a6E7CXmxxdoCHRd*Ne~9Y?^s*?Xt8-qfFt+zte --YO=ZLnobQ1>+xT-fiK1ncXzaRGiT32?tTg?%KE-R0_Nh_+=%zGD086!v|a#>*>zqfOvjW`uQxJ*0?i -({1CO%a~thY@S^f$>panqrCC@S3SL>=72x80p73Wao$mY_O}^N0zBjS9J<e7c%Oo(@4<lLqV|Otd#ry -aR<f`*gS9S3ai7p)@|;Wv)?T-S*G!h$?fwV>X{rs_ib<X?;lN;SBgVu5Ya$SC`0u4%=YnU_hrJZpq?Z -~(g78^6=}(w@sJ0dQ4?u+LhmqevOMFw0R8?sL*NjS|E1kO78h4Y+;ek7OC-U!=HNl(Lk-U>NLB-VVTk -mP0m5gC4vB03O%(VwE4=>~5cny-^Zsu1Xnz&c^;@|q^B6bfv$LR)bLHjuqG0Mq9H2^YAE*HV}iW4_)W -q<E7fmVIA9xyOoOg94WXPWHKXijLX`I^k91y0RE-kxN_aF}`qz>Dlro~ESMcDAf5kJV9ry0WrF52P@} -k93JqQoQo?lN0@U=N>w>49_d4<b%Irxdb$LA=Zz_*1|Nxb9i9f(O$^nilanXWiCa6Kby5t2QyZ0t!p^ -+9*EwCks#k1yq-}4KrejDfc5YWTkyQpMya0Z_8x4+ysEJZXSJrSBgn0|c80I&oMO6ghOS<CM>ZTXv@3 -8&d<#>1Tdmp?SOmIXb>v(o@Cmv+Y^>pt;)YG~WIjNwt_xODj3;M~qI8<v>0<XWkOqAdPdiA9n!ZnH3K -fDyBR6m1Tx}+Cv;F=mhFMZ&=J3q@2(Ec*#TT=M%0A9}qXlMn3{3j8PD2MF%{fKY>v&!F=tH(HCX7e2M -)#>X(9t)>v)|6|BXv2ZOJRmG@O{bO<oVQLUK;;HEx|_rCgCC6LL{7{Kzl{^b_60{XcE7jRq&8Ht@`Xv -ZR(GUBEI!X-_$$wTRimjTXy5;5K%ylAwL%azFvu`D*gMF5?J3-7OO&7ht<2c{ajz@*cIX2kS*;RD1ZT -PelnPoXg3Buznni|bIg|<*UtAsjfrVNzev;7DD-#k0A3OK_(N*-@vTX>6Lr{6rC(N^N@jl^A2R8FxX% -GX&6JiW+4RSv%I7{gO%eE`rb1?qHv|S}X^W;!lYwZ-q?3ht(_%wM`=_Kula^_wp+)z2<c>!mEgA5$L& -@~CsL`RhGtK=qxiB-$(zILd2VOxsFX{3)L1Z3}%f8?K$n!K{F8i5;a6cpcI5tEJ)6ybJhs$w7{>Ll2$ -76V$SS0C$W?r<I(g0!ZSJ<zVf6l1wSJ;QV4?Q-S`!SOJfa(}oY;xOi;{8OzF@oqA>Av6o5x%?;e}>M} -D*fd|w#kT}k6_Xu&4si^(<{yKv~JQc&Aar)q(2|=_y{H~Xvdk`uUB{+XU=G5p}7aGF7%6*QaW20gl5s -N-;qXV<$i+Cm$=c(4;3x@Um$E^$pSwMg!`?Vz5lqORCsM8xZM&_xE(cD0lWw9`_7Xle5tFE7VEnI78d -)-$PYdiE%E22yU(p$W9@!x-(!Dm_uG5|Vjq2(ht#py!U>|i!XJv&B60s+AW9Vn{bv-KM>SC(&tGzXzm -GM7FSjz!^W4sG&GmDjDSrP2{#lXE4(m#~(*3zRyLxBusE4t4iEx)kG_i)B^?I0OmllK}7~@LDMz3qvn -Pi{!07rnlMcq#@;r4L<iiYPsf-;TN6a(5n*W*mbx@9;Qq4!9QTI(7wkrP{ltPLgvS-ODoX8VYD&gv9F -&-<!}`^{*(x*JkMy{Y{jb16P=Us3$v2U9<M$oV~r++@P7t%5t<0a`ormq6Qt09+IuJR_?6MWp<N2vMq -I2b#-DDw;KtOAxOWwi<n=khqvMb)({2-gCgqJ1J7!G2>3d(FUa1X;2jC)$tgUVurgtT5m$GwBp#ORcX -gAGihZN735-8Mc3X(VCwLxgUm%P4MysO=KN|<whu$Zl-+?fRHj<;UV?QlLpw9CC%E#Fku|aleskd3mj -EKKJd20rofe!brAG%Ny?RY^g>G64JuK6_FC|}rPbk4jvSXQEV#-(PLw5}2EfuQ(8Q=QewlzLvUH^HhX -ScJLY_s|kxbpTp7vp3`y`WmIgTaMPBM^CAT!P%QU6B|!8mOR^hR3&OKtZXeIa;YW7^DzhF2b956!&0- -=P3+CWjf!NXy~O<k-GQu=tD`i(<%TNatamf@eb_aR$U3<E{3nRruSdbjZ>(6ITb`yq=?y}q$&uN)xA& -ZvXv7u*9P=}C7?Gv-(2HJHSES4OmG%?<ee&E$;@SoOQatnJzpdi2Tq>OhtC=fiGSu>_N8s+hic-#>s0 -o45B$lS?B|1iQbL3A-}XxvADwt2KkO~@!#wj)W+9NTEy@&laQVZ$vpBk2s6SaaO^>uFN**D_p>T$N+= -Y=N+Ss4x<k70UKR^76!Nd8uz&@%k#lLav&y;GZ!?^6r)r*hICYBxco@sWh<&wk^)KJBdr_HdV$oNn=O -O6quhm6?~a}>x&p)EPG#^5JAjDL;-^M6ChU*={%eZcSUy7MfjqQ6zBb$<~O^MrH-_>Y(G*Tkl0?Ey%} -I5l)s{Qg1zS55k%5;*-PEOzwG0G^N?`Pi?0D9aBe!(RiD8x3o>bkT1zs%`p@fyk;mE(Uxmfd&2-7g1} -UujGaQW+J+@?jDo`ri)G{$gjuj{mq*NV4$xCWBVHtN5|iDv5*xUg6$T(zQVgOem5cm`JaLl;4h++g~? -trj&6MNcvJ+6>7B%1BuH5ZA7(qH5C8~Vua?`XCVzqWn>C850`{CxROTfhj#9MNusivEorns9-!CtIU9 -QpS%$J3in#tY(kX8%Vh`a#~ukRBhg)BK}w+3==k4Jf~2w@DvSyX-N?OWT6j`#+i!gJslh*w++wgNO}c -|Mf-E+oi&wi=kcUMv$m<L@an6|mI^3Sr35TkhoWd<s2x7GW_#j9v%*exLUxV3R9I8m5tXosxJ%140y^ -X|Rb>tRi;ac$2gF4_|`#A{CMqq4<Q@?~j7LB>S{qCn<p9mq+72ilrBXTG-mVTCKh1M(<#S_;g(|o}BJ -0Y*_~6UoPBfMx*E3=u;NDrE4?6!22@RaG)7|Va4>LIXf6ymor{xg7!2#t&1&ayxrt6qUn1G^RV;O#c8 -9c@ePkj#MVF?tJjTsve=S>VwChVD?Tp)e!r^t_2NFNsB4Omyh5yB<j`bF)=PWBb6D#zr<O@*01x`yzZ -LKNf_#e!2E(udI-yWyCr=!-naRepEveQ?MEPOk%v~kbp7OL})+mQe-5DFhZN<#kS6n~!H-GJ#o0ctVV -H1ifzsmbrWg8(`l%bnX<m>$;eUdS6ps=K2{&td-2cDsQ)1If9xQ{_iT-Nh_s~Y(&Kb1`0#!7#mHF1OX -&)8g6slpHy#Y?Q0ugq%^<Vn5*s3TZ~qo&;QH9C1~i|qWqGWtiAxo=g}z<K-ge&}GcnQT7!QWmsR*03R -J`b&(LsUUU~xJr6jssQvZsXCCN=S^qu%1jb==U(E<iUD54-dLK`sRpNkFO*EZCER1b&*$E6_`CVE`{& -pJYSrsya^fM0&Ih+Ro!w`qow)a$S^~@R7x>=xDI)8yn{#UAd0JK!g76DRoLqFpeF2d0m!V&m^Tj|l(# -u6>Y&~k-T=?QqOxM4lj5HBcxXQl2PBS0mktZ-CR&4qz*1rA#EE#qv(OMoHoL%UEy9O*8c4K+Yodh@QY -F1E+O*7;4-p~e#7^GE8)GO@HypkD4oPe%wbBYwKkU8gYIltAwM@+DGuycg14=XE$wrq_Ry~`xoK+<F? -w1mLcP0^-nYWfubVP;%&>MD0;Jv{w8%qYDhvNw802ST@QO*!SSnu25e3M<3gpsDgg?xDFgfLJ*DK7eo -5jo<I3wh$-cbWTg5l5uxN@w-3b#hadzK(>nexJ2h@&ilHS37&Lkj(;Ne8g+c28`Ys)>mnY;L=ovN)wX -e`+gqTwSdpLhP?=C<Qfr9Hw?_xIoOdj~{Ag1c<Jn)Z8?eL>RnZ#BOSLE>-EB3DH>0@aP+!?q)o@z8oU -vQjpk9uzD{f|)R~VRAT}YnTa(@G2Q8KMM?qyHu)qI@S(}Zl#5T8tKbCATspw*>4M9mFH;ncIiKhQw6^ -+$Wnhx7CP-UIQ(WVC-!0q*2&9ovsCAL8#+=5?e}e|Y0p_Vf1+`ObTOyZcYe)D#7x5QXCe3V{>|fdqx4 -`zDwqV2B_{oCF~Z`>l@u;r#u{UqYYkCWar&)-e8+!KCn^)$+B)8T&W-do>vpIXF*pu%{y>dI-_rNBws -S9X(KZd^ANL>U$qgSOoploD)Z?7x}Z)>|t3)9Yy6uek6$t@~8zTh~tbfa^#HTkA2<o68<-g9t;Zp(67 -VaE<gC*(c^`G%+irhl{$Q^qaSwc$iGSIFWJ%cNGZJ8Z|umT75^kWIYe!eHQ(-R`g*Ec^jlly1<*I%)f -o9(vQs@8Z)0C@5_peO@B9y4yqYGoR-1@z<-*h+Nh;MrH-N8vqs(sKyvNgZXFur28;5h3FAc}?&)aS^q -FLs`mq(k+C)qo>k-zq#r@xZB_YNJt_?o{ty14vbM)d~;vl$rB{zN6_w<0mx<%GYBMUIUvwj;0T5drY5 -*a{5fB`1_qN{<QbMJ?Q<g<zd!!2>((7BeYKWI6@+Lh7D3)n{uQlc(oGBccZZ1l#KYDN2;hv=>x-SR1a -$n7ar)bH;^Kvae}043rQNJR&aP^E?sQAi>-T!uQjh0w5wV_4a@o21-%SZ$SM9I`)+^&`G~bPsb34EZ1 -*_JJB&E(h`-SmPzvgbQ6$=Osps1d<!bVV~D52>SCrTw|mtE2}!nV<;?H4Uei8LM@ecYCsAV-l;DOVu0 -!n_yk;2e2#}CAk<11W{(@bDD=mzby~n3I$`L8ztkOdrp?bcAu{@u!gnAQ`iuXBa6U93eFU=jursZL;b -SdfjS?JP<@J}=a-iiIMO$7c;g0u<}ZYRZmybu8_T*r{?I%rOg1BXvh%7JS|*e3zyP)$-Kd2?<q;<Qe@ -=|}YwHg1AJPs)9A3i+;SqcRg5SkYXkJp5bj%GwN!JJga}Tn_BHNnnX}%?2|blQSn%2T!Xr2T`Q=5Qo` -ZxzDI&Wh>T1rrS(`o{C#2(3crex*^QSNtQc-)Y=O%UbH~Zy-gyl)X&c`UNLQs3}%6ywuyZpSA<pX(2Q -M(Vg$yPw_8Z-{mEJQic6j4Lh!x(3Mca%yE@5b3F%8NQ!7v?G_QQ#X{xn|3UeRefVh}IJZNlRUgQ^{OG -Q0IP|-hf&eOm3hZ!49{aNW9`?Y7x_<e)5v)rHtrBwsEVNajagW=T8PvKNL{145Tz)yCyJ0p6{R=Pu2L -+!K6`OG<-cxxK4sSVKV5@MQ=hkoClH;pSc=w2o*kgc|bV-S;L`x&pn`OHd8P;iX|<wzFat6-7uXR44W -kjS0$4UzbS&iB)+tPGLNeFZ>q>Qt3|p!>(tw*an$HAQiX%?-SJn~;f@FrU35i$HZ}?S?bgMvD5NaH!n -w3gp}X$L!1WuIi0h_<eGg@BV9AneP4skNlkX(sE_C)AF1>=sW!mdz4FHs%9K?%@&=>Ga!V^JU(rl6UH -dN(XYS__5FMGM7)o<p-pdQBoBct1!O^Ldql~fR7p1R9A!`)O&J0(QQus{K3wnaB^QeKT5ATKHKk3V#t -FL!ncb%;3QhSQ?7U}87|KYccg!EX)`V|Q8MwY%&T8@C0y$R~KI!(H`=^0gx#pr42KadBjQrjyX6e3(M -|X9U@iuUJc(2txSkX=d@bX?m79c$<<D&Lnv21DkKJ3U5Va*DO4e)&-%n_&3Wh|9?Fz*|*NVPR?VFo{~ -+y^F-)SK6Q6)*SD&cytDXZW-hF)>G2%8}NqTgwe=K^_xN+si>?%WAI0e4EvNF}1V<B=yXDt$~MdV3O- -{6<*#@wUsXFPQ!(G+j+BvNMYmdk=o_;iYDw0L33ilc^TEKw*vMBM)0YMYTY(pYrMhvee`|7eKT+TJxU -ieX-Y>X@dmxO5AA&h&k@v1zMpvEKWJS4AI@CvROQb-=#M@Aj~RrZV&9Et#D6h$TOS*+qQ3vj$(!!cK5 -jc59_oL+@_$M7cF(8JEBb$acFR95z~3(PwROFT$M=3AEgzbEtAFi*|9{J%zPHo=_W}LL?udiep#%)#1 -c<;GieT99m|XI)K|D(RkfXpp$qt4@d{kV>`0y><IT{ilG>xEk!uR`@KIm9jKO7LrgA?xb3D1v26ZNUn -$I_3Aads3F?mX&f%=<LZV>^@kGZE!uB*j4q;ZL7n_NiFh$F`qw-;QO+B76GjGK@b2E(Jdg4(O4|+PNu --9DW3O{Ao<2K6X;rr=1@=gmRGdub7-@AB*hVAC64%y*zb-n7pC?NZWt%U1jngHHen2ndGtarv{OuBPO -{|)xqR;P&j=PbJ0O}@}z+8ke$Wx9&5cB7KnEOwnkK+*vwAGra6JvSA1{BqaR(CqE_asKEFe4CayaPYf -955gsw(c<wiGOM=)xVdz{(pJ}m9~QpP?4<kNSr?<X6gpznWeYF9lA0;11werk^Tcn|;N^!TL;ay$C&^ --ncq1Ab8|lsDkhl)ru7_|q5kcfKFszkNY}=lcQv+ZXhAz8~PfeL;Wc`}s$vQs~P)H;ZRU53lwF3}?@7 -2r%e%E}j%gQT8Rqy_>n+G5cI_>)lq2$ecZyv9C@e+2AXy%nYu`_gTd}ZIj^6NLC5puxdHUZ$awpYjXz -^Qx_vHnV@8>`xqPOiW6V&#!&ZZ9K?6}8!uu4nb?KB^hwj%0$@^CdU%SmkK-HO5~|Smh^5sP)mo2j!j1 -Ml<332UoM;A%>N{I5tvsAuIjMVr5&r<5(5d8Gc}ds%^>*5s5Uz4FI4pQYde1A`ZWl{DF=I^-+SMc;qo -UpfRoGm~sIo{!IG};hN57FB8KOD(?oB4vJve=JSI?mD3a)wLMO6k4DME<Ev^b9%#Vebl8{1lsUa15WE -V{=kbZSr&r)d7UYBFp@nv{YDkUy>Ci96T6b@GTtKFu-w&>o)Bg2~C=M8hBF3CQ@gz#|bs-X$+TIhTWw -I(N^{ME1p3T;I3Z!IzV`4HHVbIid2%!W5`^4Ls59Doq2X8gCt=!BQ@Iwc}&vc*|SU0T0Z}4WXjuCOkL -VeD;&sOTzj5YFzqxdkW(9CWe?Lk-(--inmkhIb*8(oobV7!o4>PvJ2ekPZwqNi=cBu$GHjc^=)rmCA8 -IZIuk46p46=a2BA-<9g_ngxO$0Mr{0vXXU;$_Och<9Jp`AR5HCv3Ih6x-eS#hFa%1l9+LPB*ZUDICj6 -@}NcZ?gBxo;C&m1PCpKR1<Pi5pBP3aG5^&e?H5c@L+JCv2R@+`nrorOrk&Hl5iC`;RFw9^K_dXwIZQo -YwrOrc%NlUk{*@WCGfFkRqSp3{oGGUYZRYY-HPrJ%{F(e9gd&9f~V`Y4{2yTs)+)?sO4Z3y>T-n?;>` -UPEXq1}6-XJ5*-s`+kqdhlOXDE(rUdLebffU)A%B)AQNIwCa4j2A5|Dh)Yn?e013(;8sJ&J!An<kUF= -<+?`HPmxZBafUWKGFz*<T6CEeGV-YT7Qc65;Pzn%)&RQf$c$OxPbeEic1HL}W%iX6=Xo@B--19q2vsh -^+edto3%@DcrOmzdF{;bdla1s+KS7=(Wadq%`$X)VB4A=9?MM>tJ=q&9m8`qq(0d7G!z0+ZQcPXX3A} -d!w{snj`ZoJqf<}efo_7a%3_si@hq(Rsj+_7oaJ~b2K=G%>VJK6bc7lruriztZ~md|Az5Nf~k>6@BBI -@9qbYQg0OW`%U4EKtrIj)@rjOyYj6^4`S*Z%>LTAC_VuFEiL2wFTaL9AV-Jr9OytIH};>c-YdL3zti( -RjF@M+&Hy$ys9d8WVcuFF(@!nI^2pXoevuTt&l7{O1OmdIGb7*>`^{j?4;CZ5D6d>-)>b@HS;SqXAm} -&#lgrof4VL`RJ8EabHE!lL9)K__#FW+^O=c}Bt9WHQ8}CKl8XN7q{_-9N`_ONM*?Dly-x1odH;)9Y(Z -v#uAWaamLlM-!wqx4WeF#_;@2U8mTc<wNf4Dm!i-Xd{s+QO|3#1x{(nqh@qfdW{)WIJ{FefY$C7Mvtl -8%1(Z7PHM{f!U9&(9Le26LS+>szYEiA>q@%Z<omO3~qoPE|!$)jxa@bt)!byFfgGKo8pMc|`jXQ!HJa -XiV$kHyEII)gxme)Y~o3G$<AK^}dyhn^I1h&$~skLBg;C@RH1Zl>f%R58tt1|SqWmTHsqV?grJz6Q}x -^7W%}0q^V<{{OGQqWr7C;^Axs{(nYbQT|5)i_d_1B*CfLnmmXD!>+NWXi2#8LfXv$`e|=>sN1B+^QB) -9l1tUdX1X~J&x&j;)w4_^B4N@&45Z)$vV}B}s`c{c;Z84A%>u&1!J~ne*Veq1xuef+bEX<<*1_^|rO( -1^&K{`&Vl9Z+D^^?XW#BDUyA@6=;hs_hP<3&FAzj->7EVaqNlyb>UR$4!-uMgz10N^!C9<!TB6bLxPs -Q!pCcVv(oP*2p>j~VtOKIRvt_iPK)j-eIn>g!Inu4{pv{wjsL%K6{Z9QvFm>})$y4N?mik^R!XbwptV -38rREcAD(V6Suayuuy{t%LH?rT59^cQ$zI0$732u0M%Jspn!i@sBBx{&xv1o&n#cVOqNHL_isCdhiaj -3#w`}`=4rTe+VpU=CuyZvB<8~8_>sSI=OIusxJ>T6#R{ZiSG0q8mmDEye9=0*{0`J?+g1%HFn>h%Bqd -Q6TMUU+Mroreyx>!3b*^l;PDpKIS%qNYK2j*CKq(*6i-9KRxe)qg9+<<-PhTQ-5zx@3NI=07C`17M}q -lzUVR!%h9IA+BnuWHuUn~T*oS86$mY_-BnVPoqZSIL7Scm^P=0xynBYJO1<yj0``UW-31M8((&yhcdC -Fz4PR6!ag6ftDH`-=O?e26#uPyNuwDHaIQ<yPzfa)HSN2YbTxRarbt#Sjy5pTIdyU9=3Hn`{Y+%a>e> -8}`Mn)!L#*3)*~Nt~k(R%-x^onLuen3un8-gvY<OpmXam1iGJf<frh0<mxZwL{{+@A|z(;&;3K)GmRe -2uTnqMUW7JKsXBiwqhyHk8aFE+u^fn6{m*>HI^MqaXaGeaJOSqk{s1b`*ZB~6-!6D<&!KyKFJa=J^B@ -n=FN|C;$f>m94m7ueq7<$0sj~$rvHZjR8<%`RtJ;(vzCS)$H$+R(F8fhh9L*UQJ-E3694Mly~7>(k*Y -vGWlYC1-bYFJz-sbPJuc7##^W8^(Z2+}>;S#?^hdh{XQ*Ml7UT9G>r|gij=}M{#w_34B|I}YN}#_^<f -7MnS@AkL)A{w+Hi=B6wjYHP0e(^TL49wNK#nyzopVubV}7ho`a`CWTUO~tr{A@e1XlnPL@U3VDz?$r! -XoW<0NpR`5ywb>_150O?YGi`e}W!f<;+3yeh}*IW%Mtt2lV~NDPES-bLvnhrcYv%V=rYW$UPV{n&Of7 -39HB`L|q!~EUQ$K3h%JaDg6E#Fm%uWkHbw@JJFC55V-2I5aS5bK5Hvpk&GS(k0R6fLEmr76-gHO^uA% -QOj4iE8~se-%L%X}q1wUm#Fg5Uf*&P9%O2;UUi{i_<tRdH1U0PxzWGrpDP)?o^;Bh&Fq&rx(Zj|BP=y -%1m`CL2MPg`ov=A7S)V99(;p06NRde>6mcB-FzzS0y$@l{@&w7_{A}Mhbr~+vZ@6&rIwGR2<UWkynlm -m5kJhA3{D=*fDB*J~gyi8e9Igu8%;MI;)y|yX~QZQ>Ee=OhOqi`7F7ewfKbB|aqp%PvRt39>LFf4@VZ -;AZ1A|Ck5lK4yBG6O&MWm^)H7~larzqm0<^s&;I@{2f=Oq<q@TgQE`ep&};aZyc;-|zk3;FkDPJPrIJ -YjDptCu#Xwyfk8_a;Vsd9Dlnks;8F49K0N6>zdOIBgPwaB_i?$yrN=@q3uPyAiAGURfF@F>bbpSox$h -?LaDV2m7TZkqq@(PA207Bg?ZB0_5k*bH3q=-!jM@>B^O($jF~jyiQ!AiS`0(wM4ogd@2?~l!6kny)L< -G{HK-$fX*WDcaI8;(dn^g8PEgo1cu?C5oMt1-;JO51TIU7zrXqk~GNy3o*^xq6Kb^Jpw9tF1u-J_-2e -kJJPeV~b%~yq2d=k?)Eslt>YsB2*<a<6}B(~!z{A9(wt|n`Wh{&Be&xLMSiuwXBLmC>-G=j~E8l8+W2 -Nn+*<b5t1YcyCX$MfuOLy<W@yf~}J@8uoPzr;i0{`>Z?Zo$96(my!t8$|u~ke@sH2oOE0M{pR&aSFyj -0>NPd0ucfSaSTIo7zGKEfI$%1r;6XMMC|i<@-a(9ilcx7`A8ugPDAKN((fZSw8uI~cEmt&@>~4cBcdH -T^7zm@pzx#3?uhq3ivat^ggi=KN$A*k#9Chzct0+T_@C939B~+atb=5qW<vr$qy+Z>aKFHQB?|sX<zq -)#%AwAi9QH(q!Xb4mH0=K$&cfJHD}#Kn@6ahik0p$KOb00cC4LFvQ8NM7-|)-Lg{n}W;3&GUo4%xw&S -;M*O57;=&y|Uzp<uDOpAo@qz#n7;9u6-EPy$6&^f3=!55Ze7^34wnee2e91n-BP{-|v&HJg#N?R)j@4 -oUL5hb)NBSqHv>z^@xMzWhbDNYQ_gT)6NnV`V<&hyEA8W8e?NV|1TFzv(h~KkoG1J4xpF(%Q6tRB>Cr -TH3tL-8<n~kWt>k>_``cMH)VCc!QZdV9B$6iUpfVGhS7OYwA^EjO@f>&1tgGY$Sw9S=_;!(eqg0>$&W -oBEf;&-IE#c=I6km4~t8-cSE;Fx|HJm6BAEb5eM8%(Q~!=QjAa~ZgNSmY~+TY(n!P7>puNHbz%Rx05} -;G^Ma>~3`;0lqLp9Z#+VN%b4?km4mZqz#^?f`S;N_=fLFk->~8Obz3fw<{ip!cSg>bn#6_@UdD%KI0T -dYRRN0S{nmuIwQQYixwGbbpVFncwqfBtO#cpdH(&uN;18z0hQzT<)sVU(A@7NK|{RFm4so#-8<3X3Jo -yROv;<+txx~l|~UkcxRIW)CiPY)nY7W9tWO*;uSeD7#Fisv_JS^D*%Jzr#X+rJ*W-I_3ZcHrDRa~ZM> -=iw1gCAvM^6hOuRYuFvMd2dA`F-oLoVK{JD2n779qQ^tPXZCH7etCMzT{yjC-js63vDm9wD`ye7%t=5 -+&&_AhmnJu|2-)=%l{bQ}5J~Z}aOWI#v=)!%Y29bCdNz&EUTP||%k>@D6HpaNv?iho=B}wVP*J~W+~A -u+L%oR0UMd@S+#YZfF(Oc;e&!ts5g%_tZi7xu@yiu(8n8J*M8l}qTg1aob=&wJ3_(CQ<%FEv**&kEwd -OT1Cwx+LO*ZF=VLcIa5%2VM0yg&c>fK^<m%p!o@MBXF@T&sC11o$I!fXC24pu~x0&J2*DJ-4#pUQ+^Z -Myeah`HfD5|BnWNC8qv@9As=q-L)?lR@0&Ig3L8S*~aG<*m<S(_ibzxn3vpd1V33iRCTth?TZ|TOOGe -1(^*RH>ThJrk$BNCxn@XJIMKx79vETcDdG8%TtD{q4F{qNIA_p&w|m{IwBg6_;#(SDD4d6>?i`Y4J)z -H42w=yP4&^JCATv%8k2EpRSITnR|lTK$V!*ayh5b9$UJWNPW8gm$r&Jh)ysaZ<q*{TF)c5wfj{ua9`& -}Hl(C}0WtNQrAzMy9d@F@#doOF<qVmasIWfskccgP)L(L?{$pg{4X_ngwS@E?4v-PoxJk)vO|H<5YZ9 -9rCTZ8vJ#ktq$UwBh@SYZSRE8q_A5dtL4)Bm8XtX-9rS@!JiUSo}AkoW)zMa+npF=KuM5$s{`hKy3Wq -}0v2t}WBJny>^n8|$Asqi+5dXKbAcls@=sfmEhkrA08v$eJ_{7$A!qIGkvCf%#{2%knP7iK2cyqLp|} -VyD&IjT?~&r!r>jjEiyVaf9lYbpx|-Ud}b3S&U6K_Kt%uT%TV{+1}T;rOE4b!)YLPQBle|iP*(A5-60 -7jTd)_WOMH%lJ8Hg0)kwj--d(hU>XxN-P*Ui<V2^3gpfW%&{x7A+sECueP<Xv`J9e8)zO5SA$KSV??n -$hArvRXWsfjoqHyq3h+0r^&Rpa5K14PneqS+iZ7OdtMv?_7!tEPWX(B_FrPdcFpex9WQq9&Rjkgw;YE -lU`s2g&N2<oQQ-9nX>&75Dd6mP!nasM1u!T$_Z{dl(@qAK_sRE1C=gyA4@3_hT+9aRx1ihoi7)DE-u? -K|88VVs0f0>*wIq7Z)O_K+V+M)W0zog9gQ9YgIgJ_LWpHipL^2eA5nRsf`q<|q8qJVZvvcM>0&Y79GK -asoTV3qbg1vE>vx($N|AQ%wGZ;6FlD*++soI`G&rbuv5%9S22(IP?<0&$R96Gu!AGNJ$)-?)}*Ny8D5 -5keDO~eHTm*VhQ@`nA$N{gdVsIBKK?j+o;MEVo(-dOc{(2IpV0YO;Nu_b7JNHU!bb;_ozze98BHh-=e -Co8~@9wO8VQVsu;@qN}E;eqWRf;y|LkR9VA37+es*bQpkYklkA+-eO;Ewxq6T>3L5hEa@^PDdJhlDqJ -Q5n4}3Z=q?=K9S1hhqtgv`S6*Fy6??8tR)tbEg9ZdP^5<krM+N~L9O`5B*o-Cg-MMUu~%tC<*2?>|OW -^!t4JYBKZiCSAA#x8~*`kcUWD~6_3sld}i+RlAGHcshvLN2;1kwdw$R{EJM&}<347^mYqf?DBt0(9bu -LMY9gaBsL1H^FP^ry8<v?Ud(we|o6pyuXWe0%ExCMT^?%gm7sKf)Ml;Hw_4QP-iWdch`9vW9oJ}TSJ9 -I{<2tOoDCVqw1duhnZmoTQ{#d+T?t|J3Ej`jZHnjwtN<xIy2f{~d3o4`d8_#HMI)E2ZKA6tmhww^7Yu -Z}DgvEqW#d>&+d(fWcw8YZ9W~_%Nb$wTDy|A3Pi$d)yo80@*UklGRUAG|&5j;TKBEbn>?ew|`8c)Dv@ -pP)f>yrdZUC7Y#%SGNP@oVz$*U;Wh0|`ur*PbZXsOUq6~Z<#OH1MP;v^|E!L>GBWk)|Z6iEx<tvTie+ -41CD<%aR*@MXVR#R%X~8HSV8IgLNikH;vmHueT3_Ps{Z@;K*FRZz}~GyoBlTXWwb?74<0?IbOC8mdQz -49%rz%*eng^g3)P&+~3`7ie?<tMwlFce0wbn!a9um_?bvo?YmF3sn(m@=luP+1D5OPKHfFOsmjcqJ;z -h09DCimU9%xde}0*vtdNb8|q%xHwQr{t4P-C8nnoiJYV~3Zwv^2z1kfGb*hKs038nE9<C6zW=P&u&cm -LY*ZsZl-|dyirk66!7u%kD4z2HHQ>YeweiRq+c@vd3IhialJj%*|3M_jPO7E)L(}w1^MF)Opj{0rk)R -)MZ=QB#&cvGsBd#7IEJKWyWl~xV#5(4*g5M2B!b^RQ1j0yGVNBRJ-)PlhhM{;XQOSLQO@6u1D)p^olI -v7!f71t^xGz0B`<_)zPHx)aSTZCp2nZ}f9vG@6bRtVIi#wg#C`_mSg>+b)tx9FW^alKuO%Ow*ZG7p^G -)8sc!-8PC(xMKJ4a8G~vZ*dVr2c^d%zz5CbBB`OCi;H{CSz775o*z)Pzbm2(#ACQ*mxh?n4s6Ct5jB| -FsBSvEa@~8p&J>B{M7Trc?e=n+>ckPmJA0Ueanj~in-U<2B<*gbf?%l_^cJ(H<=>#X5=Y!GDO*ME{eD -`=3%@Y#`%L*xAZap~_nnlCH|?(FfWls@F}QP^e{T_sykT%+MZ@?mybZFtTesK*{kHfWyq(Eu)?~VQOL -7{OE>}URpQ?c9>gy3SF;yjAZxuR<iYBKn;=Bz`<jd9(PLjkiFY+OC&kgnpeFxmD$k;PkwvP}6?$!XC8 -yJ)<@+i_vN=S|r4#KFZbwcp@pd-~3jFz6>TMp??>OV(S$Uj3>Ki=(!s0#T8RqcQYq(B0PAOhUs)RCIP -5o*U*7z|+q0uwL_LkIzq6pT<9`CWp+0eh08+!7{7u^#_YnSc&BM1CemfXGi2afo+**sI^~e<Bam^@Y^ -B!>f?|)NVfX*_8MR0Y6hPK54A<(>oq#pSGoRKk|=I6?u$lJZ3zmheGH6)cxoOAi|En_mj!UBb!FR2Pg -MPl4Zx?q3k25{gLwoKXa)Lolfc~`y}L%GsCH)1q%Jsfm6RjRoC}DqRX;_k>L!5dQS`>_fSbIEPihY|6 -f2=>+ew2F(d%~7FGSS@xP3!)W40Ywsl60041J+oOWvYP~0jwhx{gvFo{cxWdi4=Irs5%BnA!cyrD0b* -AQ-Ebjl~&R?b3i_SjA8)ib_ja)RlwFRd(Sr|a}m2Ss}U!b2tc*1W2Zjt~kT&0Z6SP8w*9a>;h8f;jEw -Qp(Ie?n!KK>4SXJ>RV-Wi{UPtX95nPFT{AaLti=xgYz(-Vv0X%nQ(NJaYChdyGO@J6wQ3WUpwlVNRPF -kF*bhK+IWhAA%y5etOvRx!Snf%haO@Rtq8q_Tc>I?BB8<RJ5Fy2%_Bn6_WHP-7!Z07B*B}eZUTZxU#j -Jlous564dOkcb%389v7aq?Bn>f?tJkg!aehJ^mum<4scv|8XW$aiIB<`SX-a$xK^%n`C(u1>2f0*?&J -JO)UdgYGTM_s2N^*A<&cbZ8x`{S<9Lxx;DKTo^W*}W(%YFm&Gsu)zdy>Lru5Nraq;rEk?@0LMSbsyAl -}5|<4u-F|Ye<$>iy*`i)La{2w4SA!U@ddY=tM6T<j`G=*SlOO*CKGe%X1nMW8!Zn|G0@$F`blK0G=Cy -TU1|SdcfWCly+a5n^q!1a%!@wpyjzF)#oO@A}QhUFM)R0?8KcUeT1;(GD;)n-4a4pFQ5U?sHc(HNfic -<87o|hF3h>+PcC)#r@`PcX14LfXQ(&W7({xO7jceplsUmfWFY441gwc3Lxkcz|At!UAEK(I$c(pAJ?Z -+kUgj|Htd}8OyCY@s2dIiO3)l@I{*kzL0#}+XTwb^##>0~N_v@q2#;dji*J-%nN&ubd_q|@j(w>lh0h -CL7i%)`8YlHi)hGs&7r~9A_1VUQeex{gBz>l^QmHath_$-!0hH{?j>F#aJYwRRIaF}B4uJ>5ktm#b0n -B@1QO1#6%&6q4!5$=~TdxZX^c5L!~tFMZ_Z;Dndond45_ZxUD-jhC~b_v@xNQxFN*@TtwhV3;ijt>+i -fs5GD&X8<ruxPtQaf|mg3u-S}F20ZhuQTKCRx)PK=}l^!ZstcOvR?t07)c9j-Id~AT->*B*}U~nWIF3 -uH3;!Ju)N#&2yXyLSLc`LJJCcm@@XB?t82d^|BSO720qKv{)kebD^H%g<#8z^slXX||JX6Iu*|fd0f@ -rcFE{K^ET1w|PY`q-I!@8m-kxcDE|s3*=91uAt`>FiO?o-Q?svp0cP&@kq6Q#U!Q@B!D&|JT307mXl) -N~DIki~M-QQ%0z6AMVA*F#2vXewNl{#4wBI3qyf#1mq;EGrR!O{c8i$&5TcB^)qBqBapDz6vZfhu9Om -f)G(k)hUCm|fwnus!YUc2Y-)8gOeKy>_jsLdBOLF@rh~?ujKb2}WS)OUS!KpBSbBGkr>Hl(MZ->Q6gZ -y4CPy5T-M*?zijx&iVJt-K`wkq!8*P?~r47a1aBo@U34KSFU;M4Ed*^0{{AWk}@xkR-pf(_iaO({Ex( -afjyTmy5&DVDs}O}xt!<u|0Mgic;EJa;z#@Ku#$hf*e|0?e!S3cn41_vVhBn?I7p)44!J0V#8Cu95FF -mY7fOK`3Q^xfUk70NjOsk_405D`Ncbqi9W6k_F-|P~w1DqGh|GSXlJBCg9ju`rZJr(Y?8xYl7!8k%5( -*yjI%sx4vK0K_F7OZurI16}97}#evLB$Y9T0+_`JfU0=~71yB_1+9XgB+w#{sCLv3-BSer{QKR2{KTS -2~0qRl^8AN`ol%`Nob$rZ74{<}nL=zYy$CnJ&#Cbl2g(jQeCUHP$B|3r>58L7ce(8$j!Ok{cY;d^_&b -bvE8r8TAXdq)=7!(sZG7P#=xlx?|O^aL{$fK?v}fh;%&Z{&~{Nhp9=m4jHbmIB4R-d(wYKfU*n|BN`O -9ZY}W*|4aM2x&2J#wAESvP&tn_b^7Pl^?W{rc7EAbG0nGJo4<Y9zdmc=pPcsBvpy&`z+dCoZ~?aFZ>J -*RxNfC-v$xabk*cmm104=IM&ybJ7Cs>5L|>y?*$|H^Lzj|oLnY<&@Rl8q-SqRtff%Nz>9?_H{0$YSG> -(C&lwI|H_uh%>fdy8Q)cY9;ta?KYwHZ&yI^XiOg$se7qcTAz`pQ_Dax$YUkMfk*1AJc5^p%d4J!(!68 -g6kyPyH;;JFaCtb9V3T`vI5Pn}Xpqx~-i@_iknlXUr`~vY~-!LCklr@1a%xd|~i8Zu)y{k7ww1Gub!# -An@A@4%#<O={NtHt@ZPANG8eR#%VL|zW~3|cbh6BrZ9B5@gRH9c%@N(X0A*8kh0=}Q)V?H<MlS6=N6g -uZr%Nm*){g%)13_*9Gkz#(7gPHp$RaIt<T^SYh7=BX;c2jo6~y-5zQ8M&>t`~*Qe`N`b`3iJJ!p10`V -zH7FF;Dd*qUGc@hR;S-15|zpPPa*iISV_gg$wR!dZ$@TQf^8bSjl0bnJ!vp>+}O5y~$NB8pO0`5^hO- -)+@Q;P21CZvqS$%Eetc-;exYh{%qyFknpy>unew6ktre8ZGZ6O+EtG+f)uDMvIJve*0N`Dm24)zSB2l -<@V++c6jU+lc_#%69MIMga`AmanO1;%3|ISWLKqkGa^a-cJM+ZZDZoWQMCZbrq8RrboHw2&&bi4chxQ --#GRS=o<BYEBZ;X=<bQwXMUAYq)#l@#JR~ea{7e7W}dnuRi@6!>B+Du0U{~tPotN~^8=6yZHrX0rTj; -a{hblmKXyOJ|E5#?i;MlaQ$&926jAI@C8tOT1W61-2n3>F5+P9v+i@p`!Z<;FcLp}`;d}005P?1wpD) -RX<S6bS=`m+I{e=Bt@@dZfK7A&`j)sEpGYssQLqZ;Xz46D-?i)ey5J%aaS`vQ}0_5RvcPE8_hd9a)oZ -^=X&ZlUE#)mNW?ghawyWvLx35tGZbndP-I%+pZCS_m!s7c`;6&UQOSVhpMe*-$M5&dX-BS+fe&zvG_9 -!@ca|Kk*KAv_gG_PDyTshl-gVMc<Z6(-O3&-DK3-EBU-eeo>7zj26%X950=Lp(eSaAXMnsY5)@8u&L3 -@i=SXpE*QzPCjCP@e}y+s!9x#J40?5w3KTlO&bA5tfP7Hrfs+F_uESw-LyAZP!O`~n>~|8BA+0?kuxC -Z&<soF$n@&#rUo|K!<uJY_gJh;>1Kc%>!DY6p_FxZd8<CB(@Ewg{fWI3Wd;!jU|RI;?)e6^$Brb6q}p -2^6}$b*P6GIzm)M=e6}-Yd8svf#3Yvy1TpHt=XbpAo%?$<6v)1h}tEMZu=_Ns++tIQR7qrQ|LJ@9Fyl -a|C-MnGK>IYcL%W~ijEw?OOr|XRm$W=f=sR0&M&8p%IJ7;>v?sBE~T{%5fqTOs<oE}Eq32ANW9TJ+ad -Yo72?G(WnzX7}ts<3s1x_6lA@AQ@ZVz+)Rq4}@Ei+{4v@2u!=7x}dXMPUjd(A`pkAc|AOZb3g$20>vU -0)sG&?GJr7r<<aOB_hM4aE+k{sU3rlSw|@TsZu9L-t@@Xekk-P`dtH>eBy>fT8jDz7~lu{p1?ml;m3$ -$0y)q>h#z#qIQ|S#&W>myM1NpFchkAAxc@wu_uygNQ|t&#Amj*c_Wcv&qrHV3hfLDL!e(FO6+Ri?_!C -~BpL8!w93=kTq+;P`vT^himi=i|QGKF{@D~G0Z^ME;WAhoZgmSSK(dcmOyNzT_@!yIn=vn;58YREBM& -BxfibqcOOTu@f(GO$4qIYBYg?#_TpgO;7Q!n2tgSz%_rakiW^6R6?QLFwcJw4jI_|d7ZkLP^Uqgkv1A -{bmGj!u6`PlIM3zzuf{t&{j<j9|Hl*sqD<cs(S@rQZty{VW?`d}ITdk8HpWIbU0*Y1%@BWV?nkJ6WA~ -Hit*S=A}lNjk9Ji34qV~i>#h<Z7(?X950vleH&Qh;pKI0Ui-4`i2DOCPN-l)5`7<?Ya07YKdRamic7l -y&_bl=B+FOK;xwEXMNrcbZydn^eD&73en#b_Pgc-h{RR)Ff!?Da|3=*;r}im0HGn6~Upnc$zFsYe2ht -i6-sYZ)<U+!#7`|Lac4cyNrsk!|Q34_8d6F%{8eJppE9|}j6RQ*U1ro?x*pIz4Pd7+){kgN6*vTX%** -x6>mteQLtLkW%o0zvJ0T){-9;p1}7{FW78+J51<rZuLV^C%nam8ZEl5J|kObMJ4$dBkrbm|VtQME6=N -m~McHE&sbleV-=*^!vi1+bU)!tyhI8fuF$e6QN-@8&H(BQ!5er^x1;tBVTX!~}0+AK1MibyM$Gt2_7a -X&eOVG<%4KD3xUEzR(#Dqatg!)6!LXpUc~L;Z;qsUJ}3VPWz1lS}MSBa%zp?Et+(B$+iHLg&~Y+(7D@ -pimbb2D$epaL!wf_!IhZe7vVXQehEBCy8uEmJ=!z3shV?AQ$;IeqAI5$Y$_DuaW^Ax&FqMbXqbX`aR| -D?(aRz`wy=_sygM*}94>kr3U8hem^i~FWh`zy%ec^4b<EVu&71u!FlVi2;^cr4ewC4Pxhj}N)v_7dDb -Qc{m`MYp%vG|gX}D6l)Lj|55soBW>?2tU?yuRqNp{doRI9cK(EW~IgP_GX&CVJ?9sY(U(f7U0zlkFL$ -wGhZ`+gHWe2SJRy8As40e3$LQxJjgaRhP<AtX@*M<MjP!NVbslN`w|?4#J2MW1mv>CvdQV{tG!d=-Ts -*)?nr2)^GiO?-NicNaubhm+ZZj@|d+$%hk$AJUDxr$Rn6cM|FtXn5#fCkHQ{N`K({c4rrU`qy^1n|-> -a4<bEz5W@DKhrm#JoHGJ{MkFFf@$_Jfg-6YEKVk4Q8|a93sGs)e2>x^eq}f3-+gDEhlqJUAj^45O{)_ -KpT=)LI$!X6y(2N^5D4c}2`d#o){I`OKzwY;rIw$aN{NCaAfPdrn4z~yV4ZpXkqJL;`i-$ejD)5jE76 -1k1d770tKc{&l%z_vCMA`Fr%~sJOulOlGtD9#&NlhQprGJs2?7^hE87$EkcSyJZS&vTL3D^C3_6Rzes -rbZSYj%g#`PsOG#E|H<Ak=UwgPd_f4IW-r<cUi?E)0`%(}94RtMjbJkCSxzyEUxC7XZI@1|u~|{jDvQ -q<m?$sPcEM_sf>FNPlK?U;6pl`Qv>FX?hL}X#r>jCdqa_^Yvg}?T%yf){D=Uq&-$iCf;o+K}HcK)hR$ -%qz!HEEUKf?-jMq`oZ9IOJZNdw??E)TmiCe{WA_-Y6<()>+DywMJvyqS;z8-h+@YuZ?90(J=_`V|x)N -gUL;~X)dw<_({@l{~vz<c!h1L8=EB(%FezVGN>?Vpq7zkn*Nf87>fCNEM$Zj`}>0}^;;}8lX-%q-bpF -W@Xm~?t*_-9ADK0=Qq|Iu~yMc4uPkT$R%si!5$VQ-JI=E;%!-%ZoL>mDZ@8JCYB#F6PBf9A;U{~q1DU -rG%>iW#s^`GEM)bhFQhvM@VrB_1D^nE05>Baf0D1e7p3ba0Q@20RQanSSDx@Zf~(hu_1LpP3<_xQL>D -BFR7Hfz$^N1S$VxH-j;9F<h7IYpEM4)guYyao@%a^AR(Y|E-vT{~|B+v7N=Qt=TV)y}wGj7=I_}QvSD -+E`R-$k2C%|M3OVsGh4Vrc}#$m8%LMwrQQft>2}n;Lt<nF%BcwE7vJ|A<Uf%x+(L}FpoX?^yU|--wa! -F?JBD6l!o%2g>sp8wCY<k#y;vM1Wx&#-Ztvlz4sSf6Y25fpJ!*tw$DxPXd%vl@ZSws70!$~CoKqg_3? -lNx@@mWxQF1P@T6E&C^|ZZ~)E-Ow#0o{b*#i>?DItvETYt+N36C1jWTV%&M3+gHQnW6VX0A}`0LQ)%8 -;@t$jb3XvB`A)_HbgX98ZRsLw7qH7E0hbT{^A=lgUv`KPJ_r#_lK|3ssU6<<!HF^Vmw%)eCfo?!u*8p -tYKe0cs4hs#ZB6q3tO|up%}Tuh0tKCan-Rx6=cr<t0kco+AQ{L^MHbDnOF;ZYa!mvJ!&;$^Fh@VDfFc -n`bh-^o+HBr+IpeaOQg=00AEaP+t~_Ik0~}|)$ocO0#hu#M=6BnYSX&QQ{VF!YdX!c1%j<G;oB`(66( -s(oC;*->dxpHks@W~qm;<bSGN-B(YUkE@vi!&?1V`xpQr~rpH4;HS2wdXvf>?Ot$`ap@KOSVPWf9y&x -IJtj<O#y(jDDt1Tndy?Qjj4B*E}OIB7SsB|(rk`R3j50yn6!rvP!`muy0jw&<Mw(_DC@kvsS4J%+DK3 -7%P~cC*gn$cIS?vvk^h530z02Vs}`-7??=P)Xa51=3vpDLwbwh>Xy(Dxc)VyPGPqV%_bO;;n+l97ui} -kg5M6l3b?(_TWCcqTV9&(Trb8T0*MelHc5sLWYjR&OxuVQ75OuZW@GhjTJ`k<|7PPF2wsMcIsr`4~nt -kYzV{e&;T_y3RW9qfb2_jImmghhEBZv_TCH&dFh^)vX-ee0Zvx>Ql&dawTY%zN6S)OI-otQ0?4f|$Vf -Y=l#D06idqYXwBQTpM;}?;fLBOl-(w&Xo(lAo&^FW1@@#5gxjXpWepT`$=ANX@jIk0M6I`D}9%u3$yF -9%JlZ_|{wNQM9z*zZCnn$aAt!3WjJob7)OYg}`u)r$mz1l)4H<HZkE_Q&IVNou&XEW{U@WOJlDGi8O{ -lf7>oF`XR?Jb@&a=BTS+pJ@QBpNgLqA`tO1<7<6Rxez2!WJv39|FW^*nnvO=-o$99S9>TxIP^0d3Jew -o#FO$#nJkXN{}`(E!DXmb(x&`9F;|wT9MT&McGhN3ZO4YDTz5cJBh+2R2OvkdIv>AKiQyuHuiU@d(Vw -QJ0YtmW2dL;=Hic-zg%zn0Jah^oOP>>!VPQr8~AW&45CAfdAXh07O!AkT7sv=*V*7eijCA-dFvQ=s`{ -mm3r&7H5ODUJ<Sn_SXkV=dJ2^zqdvo%}d6f(%bW$!T$xLPHI;RpY?@;u<RL=g9xH_SHKV@tS<O+8e2c -6_*%1*5Ii5D7zX}FqOmx);zkq=?<W@Kg(Z8s7QPJbD+vAU{r`u~^~{RdjNKR=13e?Zp#$BTT0YJa}KZ -%Sn#M1j-}(lCU;NEoCL<e-f}2##PdN*;wX1p16|{T*zBq620{pMug3dytPp$|0+TA5@QHg26{(D@%S# -_wD5O2_)H(iA_GLCLwtMrDOIhd{o1->`22>*{5lpJcz(ibfCLq3~ju_!ymym_|xbP9Y^1nKIFeXE$r} -T%)*!C@6owM94YDj%%jirr$da4JVJErGhY@aKC=>#19qa(5gYGtbdQ9QKW{aM57<WjGQPmDl>u9)sft -c?MuEg0U+S0ccd6d_qZtMi-%NZmL20>cbnqqo%Wb|+*5EE25?{G}7j{%uG>4!`Tzwh-1blWpra!^L7_ -`(HaC~?uSNsg3Oar7e8#Hep^6am;zh9NRfFsD1YVBq_)NU9U%K`b^_|*)*{r4g4$|Rooh!D9?#QJBLM -<0+50}ed*4bDRk;jpi|VSjdsz@J^?pIsvGXV>^=mk50C8vn*{Tob?r%L4QMK8CX<YlyIcW|zqIpy3)N -Av7IFi;a*rt`y46LP*0M;4Bsu#P`m!HIp9DZ%8%LW<k73vmrCEs8HopVeu)rwVF5t!sXp{S6z5WGM+r -CrPi|XY#?}d*>HqlS%6~9(<vhOzNBs$)|{to>GqJ7;%M$(rqgiMZc~Njv7k&REY)6Tt$bjzRKvA4_(S -0W=X7A+mlZD0s$K;{-NH-XW(8_-i~xm5!P$%8-{!Sx`0jnlxV6OL@YG)xGR_}YJ_CXTli2ICwx8XagF -aH|@5i=(S`0YR<MJ7KS4h3ArQ)$NF)91IoF2mpZXD|bdSv4PaOxco?&i$}d9rfFi6w$~SeNQDQQpd(N -ZdvE7N>+ZRjPYwfv;zCzs1!1`KILim6(C&?F_yYq}R?b{B<*~`n!7=pp=$L$*;?8funa(-dVI_i~GPB -Nk<P|oW5_|1X9l+ECB1en?n2qah9yk%!MHYpP(kaM4J~f=0@rCce;kVM^!Hk8SvcIV?g@#yatQYhpxl -|FDlENOYfS)DSxa*k?pt5j4RJ8dwH59`snCDNQM)8VN(zaad3sWHaweZ(eX1LMj0SHq8z?aG?Kjy<58 -R+n~GnXIW^1+<CCZ#-^YPaLS@>7SZ{j~RW<CM`1$2|Uc<h80`ahT)+ArMXf)1OMm17z5^X3|WH{cgr_ -D*8oq4+R-!#Mj0`-6c>%DO5L{|vjzj?Bd@QJ8OpU~=6oqnVs`=4?!@SA$@cYxss7t+H5IUzscnE8U&) -pmG?mNm6g-wiMe_U*ymb^6^=qataP#rii!odzK+M=dz<!L`2*&-B{&>llH7d07fARKkhzt<Zg{0Gh<7 -o*5q3`34RxpYY81?4=1`GF0eayGt6YQ}@Jg3h|)Ytn%Zz@y!-*yPNIFl<op>m2z>h+3|@jO|0g00dXy -_rWJD&33<##I<7-ELC2~i^@o*D!9rFM`Kn>5o3<_lgr$7F?O6_QC%)Y_7s^Kth0;{GWhM@urMDkf6A{ -P;(hA;n80!30EU)76<mdZnJ_CS#74}u$Ptd6S#8{fA_`XU+9L{Aa%**=>vQtUmCcy?5KR{=Pj-dzB_L -by0+-|rOAbN<GB2)UFMLJ4xYMxKIbwt3*Yy8m&BW!s*;Q(YH%%liIQ`R>Z;Y!Wi-tN7P>lCQ!ntGia` -IRy^E08GRA=8_>1k20E2~&E7_A)k+NIeUP$k6a4=ICm^-vp0RPzJ77zygEnoYSBoa?DJ$1ri1`np?+| -wmz4|XCN;)YDwI4Uox7p#)emMUu%n=9F~Ol2r%?wk6_cp8ag^zFWMQ+R%BRJV#%@ztgm1uzf^h*xf+8 -BQzWUhxsM%uUSLqE(X|0Um4(F!#qHiIAs8E3Qc<$oBPU6_#$r%=sxPx11hPn1NZ5S=_qcXjOi0%-Ftb -%;0L|3}rtXsthl$G$oBlE|bgcdHk3#Do!#cZ2|L5~u)3NOT(b8#t4D~no@ZYZW6(;_rb$;9Ng<?BABy -f}<ArK=8lE5g4B%pmej$;J5|M?@Fn59Sm(~j<TU>Fex#zT-}i~#|EU|05$YsC({7GXb<)FZP4z<r@6? -?7z_gCYD=0v>n}j}LNiMjX`R^rJYNgg^I{kv}Snq{P8Sj;RB{!r9TJ6@~{NApM9DA)o11<VWUqe**cz -r8s(2TnO|hDn80H<Y!9+9b53^fRizDa0B9K2ef~R6On@wK>msnkU^7rTdTFXJTAmibCttge}oguZ(6) -uS6%pxHot->w#J%dWt6~^x4^3xfjbl+kH=!01^a`gt2L>`aGwzb|7o;R_{DX?i<7&qCOD00?Y|v~-xm -{;cifK4wW7ygaH8zGw&}`W)mi@*R{YW@_9s~Jk1iAVE7$o)mkIop>-?k31peqc{|a6Neg=#*-#VU_6C -6C38>lQE=S9<IWwxzAMh=VRvt%^Zf@(I|^fEZBx3C+j@yr0oO|-`(Ahb0%6)+3+I3)F=1wA~ZvH-4pP -=S-T((CKXJn8Zq)aSb-)AH?geI#n_1CuN|errb=u3kt#_rsnpZ`bX_pIK25-!R6UbVxVNr4TwZFU%G7 -9d`#`>KQvl@^%J<9`xVtMc2Zx3&vs%sIdqJ(P@#K+izAJSGO6tuBm;)-%Q{`B9w&F`K+I87`a{}7;rU -2!WId)Lrg7)ByI-_kvK%jRtX$Bln5_AW9l(u*MZ$`T25is$=OmP25*}>YBoSnujjcl^)OC`>cZN{Xp5 -Y7F4QNX*4t#JvfGs>lycvw3SR2lWj=4R6$~njAW@y+z`jzG<#-bee4lX&??ZQap%JErjQL{fBZz=Vf0 -`1#ogq(~7-+eMPp7^jR7sb4YXklRhk}u8N)_f`SN_~{^$j+Z6klYu@wP3T@4Z)q+;%NG^p)FPyhQn=s -pAQX&J?kK8u7W(SCD>huA9(}4D*eD=}wmR3d}kuHn{_1+f2zdT{wAS&xT9UPsijbx$9gsO#z3YJXgt2 -XV0vzgkS_l*WP*QWh}iq-RQ=II-Fr}8`=Sa)v(Ms;ivSPk-_2>tDEwGm{S$>YRcCXWUfU#J=K5gw`QY -9xvt>dYRhrVY^3JAy@^;)EcXpw{7r$*LE7{E`53H`a&letTar!4LE?gO{2^WhzRMr{5ndEFC!>)YH4B -sxGz}--1i<Of*OPh*n2wC#T6H@N-3>;17jA-eV^gtVt4Z7*jE2kbS<sAGvZAG(^w(o9>_b_~y(=aO*D -icrC6u(D>=}7K_2%kYkBfAH+?1^Yq9JFGA8X#-Lp8a7dF5ju_V=<w&Imx;r6b7hj&C}`SGt#|j8>(vq -4!MvuxX}pBc&5rnPy1(!re0XoZ1wY5YW=p&q6f<<joY$rLy7cNe8D!@C}b?;L{`Nlv|0;@Ia6n6Jtx2 -hHbP^W8Vqol2k^HNGf@cO`tT^m<N|t(@rGhiP^Ig6EteZikmI(?uBnRwx&JAJD<GNzWb)LN0h^B_NE< -g*8Y|PRz@V6cPRxcbwrga&^06?T<c^@NU#Y^*cE$Rwii2`RxUt2rxgTnjM^ZVx^sr)0pN*^;<LDAD44 -3Pk8zEYa;33^+Jb0(?f15E0TJ^dc4AE5C@zN5nSyRl;zq6l)KX{QX(8Fm*gsrB8cwzs&Tu*x;Img`w5 -r}zEW__&<j)&(Lh0*d1_e1;M&LauKJ$pyWB}J&wY#CX$X!Y1p?lrS0xXn!G+~^`(OE|MHJotQyP{s^k -$&eLzj2}#ktp0kCKxin6<63NrB$ZL@l{4nD)F2u<ORi2`MMR|&0s74td_<Lf&=O8T3AyFBAPG8375nq -y8u<SaA5&=7Y(CsX0-V4PN|iO`UiNCXW9QXy!g-7`aNF!gLQtBS%eV~LP!`PU=X4xl!SJih~d=!FNz` -*MPLLBA?SCBG~vNtKO~B%k5FWGAh|3#&>D2;D;=Y$;14?m-r*MX{etj^n;C~6N<93Tf)#$a{U6#4P8@ -aM9dBmfLF7DEjSrGMu^$Kg0b)e6gJF+@$69Fg0fG1jXlBQ$W}mh>2tH_~=x0*b7adFF^C<eEs7A>FGW -Wgq=iuQ{SWe(W$vHf-ntw{9sSYAd@gE|MC%uBjeL71bFYZKWrO&DI?}#*CP!#ZQ(BgrjfPaG)4-^G_1 -ET~3RR4NraR-ZknpylaPz?MVw0K-5@DI@9Z!Qz~(RF_1`Tv0C9}a>UKC|WlNT&pcEc5M<LAZmBVVUkQ -m<C%M5=p1|s-GdzL#nwK?Kp&x=|lsb(ekow@60K?E(ac{cDe?c;m7vUCUaBY^=*T|I%&TrjKKVO^ -09^KQH+48xp>?-wsruj4A7eD=lx^Lj9(Ow{x4CX$76TX2ForacHtJ><v1I&SMCzzkNZ*JLHdmP=AbVb -7f&fi&WtDBi&L<c{ica;IQ?e#PYp?=7)qZ^W$x(gv@ef>(&yD{kJa+Ksn-|Eo;S=Hcrr4__VkQEC={r -DE$0aFWJl&|BFTT-&t+%0{0FN%E0{o<+Dk@*ZJZM};j=t5pt<bR#&_=Qtwm3g-t)L;MO{QAGcetwlz` -G5Y$M87fE|9FwFmiiB#^&9()A~*q|But?c3{yCYk|2puAPhqv9XyI4NQyv-?^<XWJS-<n9CkYSGRp=0 -iAp{JIQ}6ChDYZV_9akGziXj)OT2$$_(xU+Jb3-PdEE_q2p!Tbd%R6$M>#1950YY<9_n;qblA-(`q99 -{^l%aAXI5bhANCykG!7)6=`~>Z5!<IeW}7%Djk_Z_hALv8{(|_ZLBa7+Xu?1Bp6t^uKp-C>82BghPX` -_{=rOw4Pk$L*tyE<#%D%#A7(13_!=7@mrKN9JYSQd*d=04V&tt0>H8SC&ol_VcxaoFV@i8L*84^uT`; -kG_RA=7!$}Q|g;ODs~c6d)-zj}~69{kN?Uq%kDyZt<vjUSt;3J(w9Z1qEP)NOiGZDZD;$LG}k>X`vQI -<>!gW`HWxN1wp2>5E@qs6E_>IU}d}ml|LoN{zCCXV<C@L|U)+8=%pRSO$c#uXa3oIZ3@YyP0mh`|Xh> -jqxVa*<jbGQ}r_$7noVrK%c;&oeTopr&RrmJ-__KWWZ$_>CdRCiY%_$BEz)P3u>^v&b`*l*untY( -PtJ04P%RVobic%k22<EiPJFH}Ias9mHJRaR>f@>G{;sN#T;kYZv5&HgtgbC$&S>U&FO<%K=%Xlfs+dX -o}up;ZsnqV}dbJ}~hX)6R`dg|>FNar`&p~ipNY+?T!W()gEW()g`oF`0>7(u}xwSR#aNWd_TlORr!Aa -v+_QYdk>exlzsThs?h?jL*TLu`i9BgJ<#NfJjA4<V04-_chIe}+VTzhr&T6VaonjDSZuIz$hmbebJnQ -M)<IK1bNGUXmQjP$>RkQb)%_VfX{H1%1lg(WiL6pAV88X-zQul*QA-93tpp{C2o|NMU6M6*0p;_!Bz1 -o|4a~)(|_gml=MrCXaeM_~~Dz_H+GHU@0D{$k6)5Z23YXqpbgWK_13-sS;<60$=8D$+iE;Y(fA3HCw+ -swZCq*zQelyHR;*}9ld!^loy?QJ>iR!OkStSCB$CBEuoG9@**wQn8B4B8urk-P2=iepy%9ggPFh(_ZV -3*unk2-h6LZ{?GfJ-J2c-$;Gh{<r$C{<&8}{(0<%PpdkR(?W}VyGc90azBT#<M)BG(|_8Y#}E%kd#em -@!VQJDOrMOq>SA2*|e>d$=ve2;Za>u%4F%?l>|<&`%K8f56{42Nh3T5AfCfp)tx*8S>EZ4O`%me~1=> -x2nbLRywf;pykn9487?LEBS53HwcXe<XoKtincFI;kbB@?drOwK$y)Eb~hCu+WoPOrX|qJz4K9=xO9H -+d*pz!|8vLblAh+{bv()N!tC&5Pf=0zWbzaY~jCJ=&L>a^F@Bk;{ibg1i#yp2}Xw<+CyIOBMc0E3LZP -YBI9E?5C(o?TIdiA-T@f$eVx68JPZpS9nB*cbg1oN)DgxW&}_FqAJO6%JZ#q?-14F89DO3`9vA<pFD3 -qj#Nbh=!9HUpBIH;F`AE1NlpFGp1jLZTj;7F2EBZ*d9L6zAjy9DY$L(hE=#0+}($Q{)k4(X*4<7z=es -yvXb)faD)#GWoEcNgAV20n2lXbxU)qo>5pIrwr3*R&H;Nq@FWO)3JF2Za7{Zg%QR(>`e94p(&MJRyX@ -YElMOY82x<<Y-mb#O<2Yc7w5j<55fcdMs;T2OLOZ9Y~{Lcf?oY5Um}&i8L-^4ayT2O&LF!PP+jE`ZX- -Y=F3A^x$qbak~^zYc^5E4=Vd*XL_E?Kf0t}v}O)T!0Tsx#r|TJzZ(X{{G749(Z`FOKiDrUP;`AX#tn# -X<LC+95UEz}q@|z?H`S`_brjAUH^%YJRnw9#9`J>vhFD2AN$!|66+@B7JLG-`q}mro9iA5Gl`0b+pSj -`Egc&5jv5&2k%+gD|og!7!A@l^X3vwA(Qn{X{YO4w1=>f||rZJt*4{Z}h7<z+}yz=4O%I`&x7b%j;a( -)`O^oH6)W#?N>_p5Y%KpPt@Y9g$FB4301s!hS*P7HV*`s$|F)0?K+rAk#qu`3wDTqPnSl)xG@A1{8&h -NF0HESYz%CP1wg?u&WY-ZGib!24`Fp(}cCgSs_CP3Rc%=9U^O9OpH(wR?S-6!UfpTkwRMMZ*oiEc~=R -jcB%7{xNu0mepWmm1=Q`dFX=2%X>L1upbiA&_E-lQFm3I76*g6*NC4q62KjTOq{DkxTVX{0sH7T1QXc -}LFD(nO6W2vg<i`RmcqD8Vk&obRm-YP->4;$rcVG`zV#qsD-qK$PTm$`#5~{V^&Ja*p-!`qJhm$Z+cg -cb?@AWBC+V$3Q~Ah1AlN3}fJm*0I2PUV>Nancdk9M`@`D?L&oQqFyUicktc{-bK;fx8t<~)4B39o@?T -WkQ=1l;zb>WkN@NNrJexTLBR1D$H1#->sC=}$q$vI)QQARTB_d10MEGZJ_9Gu5=6%%^`Jg42B_u(2m3 ->$LS9MP!PA(jw(p5(%(H-{wA*U3}g6FdO^`rty-8L~mFoAk9-_xM^|3GCV@fTXRC`#oK$&zN(bR^>Kf -?5pJEDACe9UOw%PIVbo@PeTOSL5zdN&s+Q;O)P(*rc02)b@P*_A)7%n%ar38D5pacvfsh{l*7Ka*@+I -{*m*6Pxu1LBT6X2Cstj4(p2~AK1xAGg_w2GIXL~AN-8<e)u4A$ndox!|(Al>wr7th=w}^qXGYLq2hWG -;VR4mFL2grZ>@ZDaR{ZmyCH}@hw>;;s@E6E@y8rhBFxgD68V`tpQdbC`6AP)@rH6bTEX1Pi>cTDBy12 -$*$JBM7Sew&j`lL~vMb8=feaqCKrYOWcjPpX{HegT~CG&NLL8hqhe|K_?$l1X;lae>#;ryHhH+nvAok -L5HE0fd|)Qc=Q?R0Zn=F+O9=02n?@qa|!<mUxy78YF?NgnBX|p*&7GkG_KFskBSipsmvlTj6S69d^~* -8o;5gAR5TVh)xpub%OJm(AR61HL?~w!mHM9jorCoe?|6KwYi=gDzbaYrmGlZb4$5ml;&<v0A+#`zf4b -PBfRcCPf2uT1kE`_i=t>APbo`kNTqASkVqJ+hq*x!v!iLdbMbV(Hv!0P%hI#$jzCk3$}UlqO7exu>(F -8gce)$VW|+$K<O#yO3MIl<nm<-ag)ld$VZbwB2qI*k9h`_O0VkzYG($HXlatY1?5G~yY2&iz9vT!*Ig -0lo(eGW2dJXy>QQ=@=0~E>-(mn3>VE(Vipx;M3y!#8_`8UYxFD>)Oxa&Vle2cnv(1m=rh!G!^ity7ym -Xb#^SOy&;6GvkkdBk?ar`2r-O?xmG{h%8dKlms_dLW-8ri_kwZ~uGWX~#LlL6<qwS5bNZFPQqQog7d5 -VTug>41J)W1IMB9LCm4BPc;NTqQ*nw;sc>}M73kD9de}~7R(-5!XJe{_>clTwoo79P5fcI98J&3aa!1 -)7BPhQgSyIJqpo}PebnXuOVm}*^86KbF@KD@OxOPp^7=Yy@|Y@lOhdMLOs$%u>30Rx>X(hPS{0!xe5- -DZslP5AaE$vo^49|c-yC^SY`Xh8r&1FB1J8bk&i0_yEg1{=Dt&we?$Ymc)P5GY$Ug!X>_^~YcOEF2oX -V`Ot!=P?Jy?dWmu^Jpwnm}LL$)UDMduVMU+_ZmE=6c7*jT?D+?HjApxk?~c-AKPmz<xdjs=|3M@z-N> -mb|CBY56|(jFnhxyykIx!kFE!nKc3ad8fHtW2$7Nv+*^j))etiH;;da6U7>4^{Sjigq76@8)s<3(|Pp -Iw4zvJ~uRxFtJDFDTN(L?K1SE2P5}^x-2}3_rQ>8X}J6B3x_evDx8VOlrVFc7^Km&<(pJ0{IYH<r@uR -yONN6YOr|`)C9li*3Ly>9%Z0%)UV`49akdo?@T#=wGc(l)I+ab{8HA3jm}vJ{?t1djf-?od*}}APe0r -8%1XP&x8pTod&O-IHGpt42-e&VwP6n4O<k@t+3PH3~J3B=rv%2OEGPvFbkYrD(vao<66m9PWQ%qky{? -=UG+maOZQ{0fVVurJMADrCr!FS20o*r|z*T}H6!v+@1Uqd{zfO8PJV1!*dr^{J9%%vJdL6s-f>oQmC0 -&N;6R02=j_CP#fgCdJMF7QdGV@2cn20b9o_1immsaS*A-Owfkst{<jm2oXZQefMrojPDb%DRhm68;Ru -xSyW%^HTUv_FYRN0KFwN?`~lMy_=h+r~7M3bZ>(j&)t%l8c4rS#3S`^TCC%~4VY3`au@esY;57@V7LM -OLeVqvR_}T5THA;w%?0(*7vC^Z>%LW%o_U)7IWc=ADZb570O#%d8I9j0W^edF%dFp(Hu;R_uzZi*>q^ -eiGbethHTm;s&V3Q?maNOm9WZ?)!re+)gGtsJ*hON|lL<rZQO9+ZfK;J+FrQ?kx(S1Vuq7>1%n(ELDC -BE&=5g6hAx-c3)eX-rUJe~7AR@9wH|EqokQV?anSN)o$J1(GF<6Qi_Ew^@EdqfI_;dPV3hwO0VPv~bV -`F;2(}JC3yuFQSYdE3>ywS4BK#v@*Wi#2TnvXWYoP#H3-Fa`0l-c*OW5W98#l%&WRSv>K^vn*omX93P -W`X%;FPDrql_+d3v=TwErpD4DK4y*cu1#V-X)QWaK{XIbhg`Y)`pzohtz*V=iDYF3*r%qtyyOd}<iC@ -Fe0ApQOkUu}#rB^r<qka+hh2DwMXf8&la@i-D~$V%zrB=a2B*N=_EF1eMT$lpQg6i<cj|1U538<o>XS -u;g2E4%ttYW!c0Fl5+18+dEwouoiE%v+1h76d(=rWxHlAe)b|3jG7^!F)+j`Vu;q~IXE2a~2`7CRKjz -|<gi4I%6?C^GbNFi`(a0zcX^qwl5S=Lt+G-EWl!(qUN!sX-*5Ahc2r=T5h2s;Vq)9qoKOQ3ESP%`xN3 -Zxgx$ZONM!TzOuPFx`b3b)czkrNO&y{+`oU$@YE*l!_~ONY5zdY(;JI4cDYT2m4b+(hm9h(RSa-NSrM -1j)-Ky<*Rsf#=W5nmQT=J)w76rUs4MPg#o3aD)VSCT9*`#{lu#yzAeY!7c5u<_n>NeY9;l#N}5xl+S2 -V{Xb9m24nrL9lxTgKi=s#m<oX@l7t};K`9hRP#B>=3_j9Z<e?~llL&>v-_;R_kfYy>_|)unY?OYAk_q -xtiX0FMrH+QK{U=6!I>~;J=gL0%i0MJpKtCcY=%=WNVLy@R(YcR*W`7-$$LVMELwpoMk?<!N`%yz$a# -SJr<5JNvt}FR4M9AoXSVxf*{G|NTqxe94#)o0x@r^{s0f<jcVL#Zu;|{&{lQ<gKz$1B=Vh05#O#kjY3 -4_fAHmCP5$EjA{f{s7w?+LPUjPgAl0c($RzcyRR)(%mk##|Fm166Bx<zG|e3nm{Z4EQo~+sF-g4`A-@ ->ch>i1WP{CMt^2`7zd#PR_z^JRnqo_<gtfjzu8zZ%HKUB;M-IBD`)g~WB@vc>CzikQxK<J$U9~FzOp` -@(=9-oq|h20K#cjZ+xhv7<F0`y!6|Z+Od1&D#V?L%o4EmzTQC++@Kz2Alol<qvHl~wR|@rby&T|_7BT -zU&aI}r<46Y`jM9tK$$DRr(cYxF<VVkIGTtGtFx{sbe3ypzYGnQc$z~$&0Sj!<o2=y}dnMcC0k5i3Lh -Rzuml%pV{Y*F2+-pcPDpH${L#{oYKzMu9bUM9mAO``F`{2(p3a+IcC#)KI_Wr&!2v1uctZE?Z1?L=cQ -fku2=n+k_m6ZRNy7yXo6x+H5?|F*4><;z$@oq=-1s;Sz!kaiZc#jMq%+oh0O}WfnRXfh#r#m7uQn^0N -68f~}SaZ%XM()j*t(uIcxtbMVLm>OYhHJ`ZcgR<jsK2vTvO;FxOCl*p9gE3c{(zOhZPAeRw)gaUcwD- -iQQUcP7vLS_c)boaSLw(VOg1cO7z*iei?|f_YdJMrC$L~DBr<to;a59En<;7As%P%mGHMlYhlW1QRFD -S)Ih!}m4#2ZLV<=&sO1^vLK}BA4BQ!H>Q_gk`otmky+%<tFO}_@A3Z(MpdO^<JAWZYc3v|m<t9Z-LJF -(H0ZA9u#XDj}0lT)36c$50%>q4;PI=O5y^Rf*jC;$C^@}oA7JFsJlMM?*XDfq1Qm>deP?K6kunk?zDI -AgZnsL0LNS|UFsEXkwg8)(VZ?%rJ@JXkEdbF!GG>(Ts`%GEMW;*>BJVG}zV)N~Tu<T=?Oy5*h=2MO2v -4cCE6a$lK!h5q2u_0zJ@j}X`IWdIx_ob}tx-rv(ho=(P;bgoui^*;DFei95aHT(s6G$UooK^T}=uWE4 -SUa9td)s*JeJYWL9b63e>#QJ@y@RI|p+StxAK-?>$3r3^WGp^9-k~28_W$a&xfn=#VbFvGY_m^vxkky -S1HEau@({QQDSvxJ%G>^c=d~2loj0WOS6y-2psjF~vGqo*=B#rAGLcs;6Tnz}r9m;{bS%e`5;%f5lp5 -~H9fu4!)bCd+WtGZ;;r{@qKPtSh5Z+8e1TN0UIgW5ch%m&A{WjVOn5fx+!*3{K9I4E$M1LM@YVOWc@n -m&-O+#bb~e0Q(bq_Lvzy3P&it#tzifnkFKK?&c{o1-9LU<RfNc!>Y5j4c(_q*#}#J;#QAGUWL_ULZy* -q53I2Ed_6p<tAX2<LB9QD&fIbMAK}bhYc|Ed+?L{MtT?8Op>=pFTq`5cJTS~!BTS`)BcMiJh)W1`4n! -qEuf`$>tH1Kx;OUa3AAt_C?kf=)Jnxkvt7Hp8ri2}y*}0&Tk5j9(y_gI{lhOTXMNsZ%~Qf>r10x;K9v -%HRbgn#PKNm2*-0RyJi}$6jp->&Dmx$oe9}R>oygaKs@7e6`Ney4G7(Zw?deS9A<#MP^`v?XvN|_e(y -MA{wh$R8LAgn<l(=tZbggqn)=?>^o^Q&?eYQHyj1EI*+#wi%1fPq~7t+HVRV<yci@hb!<zz^stM*sYO -r%XC-==?JE25ML`9A<ww<&I`WJfm1cz^vvZ1wlf{WHA!$$5W`uwa_p!7V{yD2<{7P5lUAq2wp0g&$?R -{L@}Qf3&fWzS#JvC&C}6`6NAhWPg&=+7CZ+N$>$>cC1EIA3ZzlQ%TGZA*e%o8$SRL@-d-5s8#7<=8*r -)v1<oJ2aNiZ5f8!bPZtG3932@n{9*CqM*~+1ADOm&5QdJt8AW_DSkcF8HTf6$Y2u*qgJ+gvpAsZ>v}G -WFsqQL<NB;yw{19PnP)Pk7gr)yOgms_QZ<biA_<Mxq$Zi!&ZLNrU8=&Spss0_xN?>i%)&pe$2h952V9 -o0PWLChBruBDcbs(*uSw8#`X(7tPrXE7|CWQ3G?fdw2vez4SCxNWF51RGV>X>`XoA`RlDN=F~@=`>OH -|m$`R%G_BsL)5(yM$bxLjDN)AQLidpO~})CL2S<$P;o!X9zWJMnq7|g;iCETVGd!v?yilGpp=Qb961q -nY-K!oHJk+KP98qT0oo*@_IkP9?0<&1j?7lS6<2FDyp%lVj6gprAzqp)fbRP75DABug}~gnJ8FCC&v^ -4Ft9Ir#qB#oB#IGOu_Rfwb=rm^+IkCC{#@x-fnMHez(;JoBe0~70xHzEXz8>BH376HWPy*%DKZHXVU1 -yUtB*D=bmH{VSq(pD1s+aTkUj5KcV5Eq9-LmeH1F%R#G~&S5S#(M3+9+n)4i5u2#!5dAGTRcf*0Bf{t -%{`!y`-UwiN3_qmnwzdlvh9i<6IbTLF5#EDeL$2=NdcFV=ED;0fe;SL-5d(Lj%|M|p}jgzRHF;ohlgZ -x~nNu~DuUx1wD@TGsON@?~*~v1h$ndn81dM1so)a^~j&YeoA`jB9qYJjz+)5sn7@Ik=21TCd?{hX9h- -eliZpTSDm21>Y6#Ji`i{=$GD7{8i7-B^x=x%~+Pl=`q2OBtEy~aY3BbF!w6~UL?vc*G$D)=JF1bpQz$ -9OmsD~^@7zJozwTw-0^HO+;U}zS9i2iA9q*MgL4`xc)$ZuQGN1AvR(y&9a#JyA}!!&4LBGo7yVfE#@N -S6D8AbB?KKlOQ&hFzAuZrn3EX`(5^@4Hp0f}N*vo-a`s7?&*a(ZJl3itehUY%;-h{#=Ztw`ZMS+bP7? -FFbh<VF+XI7-OGlKe;xV4Nl$D$q+)OkdGdhQJmRa~6K&QT3*)G9@I>7HJ$>;k;WkGXSU>J!OyMeQ1Cn -DCYOi0^F4mp(ITplF$AYr9~?rW@0h@iRS#@|dic=v>f%9r3Cm`Bs8%a78z2YlFdU)kkR*o@cfX%UJVC -w49!9Z7TFl7EbVb_UUx+^%;^W325g|Py@D<^G61v*WrG>o+ox$#3ar%pR&-aICccs6K5LEg!N_CQ?$J -(Q4(QYv}X_K%GO}d&$a95wt~<3O)LbJ^O>*{mVEybr*RWK71>M5Y+DR%(M=J{)Js9woR(vJ4tP36O;z -S$cLs{HYXBie{}RfRDyPX(x#c;pL|*cVg;(B>un_TEaS4~eTka~Rl|2re;uc3)P$%}UFF!&t0{KlgB^ ->r}Q&8$>XWzEAzKe4(?&5Wkv}zk_IH@GQiRZ9%2F86uIq|#_)iobK$WmY8C+nRxZ#m0kltBYrdJEKV` -EtH<wzyCdirGz0!gqgK+>!yL$VeYxdoi{=iNwckJH5G3wzHA-Ls~Q)siG1XPZ#&hT@i~*opl7C7+4WC -M>%}{1}G<kbAKM#>vHd7^K7y_lr%#UUULfXCIj_aI?5r&eR}BY5{)BuKQY-U`P)cK=*KS%_7BSW3AO2 -ee9_1MdhGvoh+Y2I(Uodt*)NCUW%lI<|J7$B*k(o4{*N(xbp!Z+B>(3x2n5l;{Qk`U@k_qrs_4t*w=D -f-8nR#ReY^ev$^CzAZr_mN-=5d+xm?(e2x$~YeuN6K_$U)5^vB_gINVd9<N#1m_CaLm(JglL*+)mYF- -Crf3aQT-2>G!H_?VlZ(Sg_q;=}h!KPA-cpjhoFEsl???vRe$QQgmkpfL2qK=^d_?r`<U4CcqlM>iRE@ -U!+y>~NL*u(WdcxabZzj}ABFNFeSL!m<N=?l5o%tMI3{ZJ*Q8e0zu_{}n0}ZU-t{zZ3igtG#OKpY%G1 -52644hsG`7;4X<Z<9zdM<sElQzd))%5!xwOv1Pwl_f0%lhV?eIzKURaI0Ss5AK_Ez8}C?h_ho(_)1y4 -<Ye%Cj`t3xGD{IwaR*h$HMfmk5z}LGR-CbRbD#gCtg(8VwBmdEc91ACiQ^W{9WJgOb{{<N`i}o=0yB{ -|{YOUXpUYqph9$wly@XbezV1@DhVkWL|(65$dd^77CgYHmt1$5hizN7(}LuL6Ggg;~TpC8zdo)_>>9@ -vkb7w}IW*pHqU@J}AtkDeFs?;hCUmiAX>X}}k^G>#}Q;fmmx7M;|Puo?D&#!u~4xrX^VBb|8l<jW0wM -_d-uTVMq0!^(pJ25rD}up}A7tM)#xRRN;K(i_p8V;I571}*Qq7iGC?lH8Hv&D}FP>V~V|`I{`~F06Qm -W}yTP+oi9Fi+eb)3~_Cl6xpm!FI<T{JHaOHlH^QC<bHRB;9$RU&V{FydU8Qa5113x8NhRdb6M1{w!ci -9(XAebQ5&}izF41Ag6)Q<5S|`fhbvbEjA2#?jdylqNe~7c_>|n<hJU$+kC%Y0wsb~`SANIi0eZ9D<@H -!hoJ>!ndtJ2k(#8or-`E#{J;r{#-yoolym!znIwn>_c(i7M6;g+0eOAro_ibT+R?cMWpZOmAzAfyTR3 -QPe<U7w2GIC`nR*<}5&)sulbl_)hX<106?GPcEO;vS}+vThYf%JHF6&_Z;X1;`*Nt-tisO{!8-&ER0I -qhkIPmwY%?wNEXJPNdJy}vxQV&v%MdF{lO@M*cULLF9bVKhr*zK4L><QoB|_3SXBq59ScT5wlK;4>(Z -iZNZ5o01ZxB7Iv<m&l0_-8%cjlYa5=fJn$2fO8$$w?<^e7gg`Ab~hOG8&l%YK6N~dJi)8CipdjxB@uN -?If1y|rR2rxSNn{;H_QZjW@`HIUQ!?za~q2xl$?~%?evze(K`5?to3r8Q>4%q3jPXcQoaxNd*a&x({5 -5H?>psdlTfM+!h-Q)U580)ijAf7-QS@*{y4+*a?P-Z5@VxC|C3VM-;AjO2mj~69!CCqfyn=RllzBAWS -`h?p$HD+*oWUk!88gH7!AW13==SVB&~i}6(l|$4C#mJO&x~pM<wt>9Y^CMsPEyQramN|^j~rEWBDQI5 -D40V2nHRXg5IG5ek7A%<alu~eBdKhm6Jztk&2F1`GdK*--`SRI)RYmcF=)`K6x|jV3K3_p<s?DN5POF -4>(1BnB>IA{4^yGO5*;b{f)#Q$#M9@WuiU~_4|<-evlgX`Q?A<bIP3#s^a~-Or_4K(IvB*PpZn%IrC) -ynMnTLz64$1-$mWO6Lf)p7j^%A&=uAr=>9RZ{~eUF?I(W=x=-NWMctnUT}NBKv5)}GR+cL-z*_BWdVA -joHT2uqj#7@XxrnJBctQlT$Q+ED56cJ^<Niw;?efJFV$!T)J{R9~&1pOIoFd(E%BB1MaHqK2!Nmnx+7 -J<ki+{9<!JB69;OUzn`o`RYwJAO-OBMU4n;dTkIMg$heao9l<vZzGBJ_-6Kd4nCdWz-dU|B8SXzgnA{ -qDaKrw$j2$O|6<BJTgvlOlY-7?gbo3@)$PEOKNH+4T$m@#u(Vt%==(W(6>a!mx^AuPH~wj!0tNW)QHO -hlLWIZ)RM1t&EX1m*?`z3|@Y}g)tlqk`#nDXJJQxU5)-8@fhqRVc;zE`p|l!H#8DCd0dXyq|B!J6Yf) -jJoo<Mn*6g0U?Hb7y@J(N2H1_%6!mM5(SN}G1U@}Rm$b&0S6XL{@@PH&ab=&5Ahv>YKL3IH$umg8Xp+ -Hcl87T$mjg_iN?z?X6v^-{%V_ytBnL9CN}5@E6<KNu#aZmhZ|3cjV+v|uLxSM5?;f)<dwA~yrJYElKP -X@}^cD1UPMJ(RFs$RQCDnB0n9$|>{G3bXRfXdkvfk<zuaQ-x36uW5wz0@DpC;Jr)jkA>%c_r#6)oyNo -g6<|zW=Cg{GVRrySDLfF7P|MI*7z^9HD+}FM%B?{yhxr3oi0W`jej`0SbNWrLm7ibbRbRDR>|JVF1WJ -bflwh5r1t3i9T$oBcLE3uWRCnDN*v#`=CDTr2IIHLVwm4l6>UiK3);nCq5lsbNFGJw@(kkzS{j920$M -pykkrK@w(o(q;T@lKFJPUWaz`e+UIoi;^Lp}^TCh$%c4bn1OW8Anus6?FYSlEygcjup&Gygb}h^rhka -|r?G2=S#GO!>-M$=q_>Pyw;oq&Oz!!;)@1}4(&n&#z9D2R3r-<j94S#cwP!9J9Oyjj<W4L_wgLSh2TD -`Bu-v;YHPw}s22>jI)|7wQ7F~z^H3e5Yy_tpiT%2~H}SqDOa!61i@o35gX5)Cx?MI|o#QsO(FIg7*Dj -U41EdPx4B=XjpDI-~>brBT)ENuw_JxB#~Du$}(JlNFf_sL;+?o8Gd0t4G{WwcgIk0zaS2{>DLhBh`Jm -(kORBmAC9&ed65X02p2yS79}0G_B`~pHZCGC-HQ;(L}j6PyuuPz2sVZBqc=#K>~SjIrnTv!#*vPSv&x -;48sd=o~36Y!9=A%g}!F>r6RggkE_)S{kQ7nuN527N#izh6QW^}Zm$@n5Op&*KzNuSO3hvW7FXY8TQ8 -s=1D0l52lA5ggxlaWXLX)=jYBS5T#`s`Uel}Zp?W1b#R!zkES*p**nz-CF}@{{QgJ7fIMJ_46t@vv*H -AFdZG~3g=~|v9aXYsToj>;7up+&0Kt!W3pIh9%pIO5SGt^t;d;R2zcZ!uPc!+xn_n5FLW{EE-U2jHcU -G7<<pBis_-bWx(DYft%BGIJy<-nt>-Jcg{5+(A=;5{qy-k9k*3tq`8!5MR|Or>q;yV_ajBI@)4u=_yj -1cELIDD{+kTc#H|G_kQB;(Q$9GRN+MVmgoX#+>>ym+~CBR5czwcbp&(xeMIX+t^ZCrr++^$tbQE#ilB -DGu`fW9-pP-toz2lOX#AfA?Wrl$HFZppO5R}jSF!31`==or7bypc7!vDDtWkx7>EaA{ms7*(dHe!<ez -P<r3n(xcm-?MV1?4E&Rl>oej@k50@>$%-;UqN%l7xJCD=duJ7FNUe;BpFksdKVFT#6{o@}t%r}a;YaN -i3Z0K@sx)V*IN_0EdA^KLmSJdjC9=3CZV<87)~@GV#ChG(;cZySs@6YW$8^d9``8rwitgQK(D46LG`S -u!xnT6c22!=a!P=03dXd^CpC?P?g2vgG-MuulvwM$oyP?C1WG0rhnoosL@{O#HN`Hxw;BO@K~>an7?F -H`%abbd?RU<U9A82A3;g^rvE9cUTf*cSr;XR&i%Q@a-T0^KkBv*o72mbj|C5_fki*95P4(en^lB;>ex -!$_qBt51p=*u`~Ewfg3ItTLHz?#ze1}s(kZpzgI`JGs%+rQ`m2d&`>YO5Za+oa-Zd2yw)l(-^SP@g=t -_>23;^|dtHciha>kCeig9xR#<|BuN86C$=qO^kyrgpyN21VXkVC<dFMM@_mNDe09TRZ9ZIgZD5$d`U> -6Kj{1-hIVsxr1i_lKb9J3X(f6JDQ@rVR*@9P;e9l70v@}dKHx26}RTyH$bvJasm+HOS3W>N-K-+{i2N -fDK-daih8T?jRN=jY%S+KMFzsd0H^0QkneYa}ZhOk|R0N`ij(n>Y~*b-i@qnZ}7rz|I45KBY?Laq3Jb -wtp*EL#Nf1I)wnk+!=0>T%-*}1}oGa$qm@=mZt(Uv4L_~!xQ_~voZ0@#UVS=OYj?*GOjbr0eX6e0N%% -Mh`W+kqQwW=;nV~<-|^sP)qZa`7bZ<0c{>FIfezE(hF|voT++l;zlgI5ZPtvhdtWsN06HL36a6ArTbG -T$SkeESAQ;ZuXgyw_aPsA!;mbe2$oQf4_S>tmRa;cQe0~hI*;pN~@Vx4Nd1uGZe*M4nKbJgtXZ@EUII -q6mv)w`1FU)^^j?4b*50LNwR}=pRGyfM(`uDc<1af34XqZGW>W5VQG&<nh4hau+CFGN9Ko8KG6Gz?Ra -E(X*1>;91;;>czv940`Q6$;Vz&@hH>Bqw!`qVEDUyG0H@!?d49@29#@)1k=kje6&lE&ymC;*NRpo?M$ -cK*V|-$7`a9QlevRPRG9OQ{2j?jtesFNiv<n<MH-ZtS;&$m6j6Env~{?g;cF@wCI$zohC5=Yw57pT1# -LnNctwtc;@gA#sdjhu?Ti0G~vKs4V=4UHegc)7VCwB1BvRThujS_=*x2!PTyb(~OR@Z`56m<sxtCfym -<bLzXs`da*~^QIW%TpVK4$_J1Mg-}_kHEsy0)KNO*SWF5R8zwG<+rT`3!6#EKWjui1XuGiJI`CdF<T= -DEWuu+)a(nhGc#t8n1R@VNuwT=*>04%8`V$X#XQ7`v941wPZgLe}KfB$Q-if(`RXNC@GlpQgn8ZUk*Y -sc7*mW%I$nj$TKK+BF(3%3KueiA$LEEyjD3jA}aInZp)Uy~KQu)|?|u`KwT0^acq(ubm1b1dzsIq~wy -gNn3s3ZrX>Z~r%`D+Q#TJM9ll=#i%Q_ICD@*2rSn%iv{~T0HjP-_!^2KYS7*upj(N<?}o4+Sk!c^cA< -ig8ltR{$mV%qi_&;zrj*wiM0fjwIusrMc6}_vLl3_lI8y32L0fi5c9l@fQr%)?h0<ov-i4p0Ep?~))> -zVNS0g2@Sp<mj|>GPq9Qilkb1a*>1iG&93^Y_{J`*ekJPvA!Cb@#*qDISwQxLWX+=vx9bV-JD*3!6%U -#}DJE*LE*P{rQVy#PCfX!K@hl+U(aF;!BvFb_`z?$;j6PJj}WL7wXuN&8~kCU)+x>c~Tq@6It+xH%)b -4uG~rI6swqN%w(rKeRQW@-a)N59dc3CC6!?%^;pXz=1|F9o;jC9em#H$Z4{pXGMbih{Fk_cXgx@3h^i -Y%EfPfbvQS(=9&7>Ycm2LKmwQ)CZUSje$D+AZ6u3>&tTnQ<q9eTTODQVWLp3m8G<a9Zdp1GMP9)pZjQ -JdAtt1)HWlt7$%MLmkU<Rx8G|91Amp6`KcT985h%j@BxdztXE}tyfebH8iJKBqG_(Y4oTL+4}Hj_&3P -ND5S5Bnpv{DO-tO!TU%4c?JWHqrT%Yi|HbbYuF|)Go9w<ha1__@m>~T5ecq|s43o|WUW7F;V8dFqyJ| -CTD7SE}k<|p8o(d-ZCGn|dY<9Rqxp7i4d>v$MJprD=^?~No{X<UtYguOUib#>ETNi2EjMFaaBcw~WF^ -7%Z!&u#lqjTGcY`piEBzxErfXKuzssJVUbLU^qwB)yynE05#_gb_kRI1vcmn9MvS!EK^bTRbCyPD=Zd -QY=ni?fPV<x1sM%SwpjES$k0zmIOZ!&O@;#TlJnEaC(j`=1hogyqRus{(h<CljG^{T{RraUf)UCzZt$ -d|2G6d$S)X*(lkXw=pU0v|Irn`XOMny_U~f!4;>7!PxC^0^dao=455zHK1zK&4L%upGW!?taSVVCcjg -~PW%`qtiQ~gIG{O(run0Qh^d5bWL=O3pB!dqz927YcIeVNvgmtL>hChkQNObU#4)S<%T;*tU*u#5r+y -hPz4Z}SEQ`o^aIt&dyZdga+C_a)?Bz4pq_Tayx3Mf1BV8}<dhx!PN9U4D>!=UtNa6q5mqB6_;J@FiA4 ->mTSvBI}zQuV7m>J%gJBiRIBW1VlpUDuDaO?8Ad4Zqq2uJPI;+e{36cSQc0!-+e3jC}2=1blBW{Z%}N -S@*xVW+%&4{N(C4;17d;63;PP<u~%NcbjW|ccTRmH^%)|px{3)&`P26+IF=Y?4w0yLbLSUd(`B=gmnB -Jd+qkgzyHcO{|DkZx~*}>eYoKl1jrXF<M1_#N|@0kn|_YeRW8D~hdGfL5d8`1J^JE_{LXp(-Nc%v_OP -v=w#f{=bKU}%Dhr6m^`7FRN?mEF;Lw-Go?s-&m|jx)Ca7oY-lwQicjB#gnH2=vbfWvyJe*3y1-#Hvmn -Nkmv%(+qzDoAdW24gdC}JWwk*xDN!`eL`NUQCxpstGd%l;w1;^a|3&^Ipv`*QLcvpb93=P8uwCI*rE9 -9}Q0s$8uAf+!XoJi(cC^(i<Pv>%$gJzbdFt1i<)ZQ^~qbvt`cISd=_`E-y@XVkHjiB+LwQXRsc<}GA6 -yH5?G7xUtcv)pXel>^D>T8I}b0l1h^F@!svZe>?#a7_7$h+W(*9z@#QH@()Hb(`&|VCL$1bbsF0UiP{ -|Ag;dG5M~9;gWu5tD4jwos)O@c3SO$`XavDP>ztdKFzfI58Gwy{yR5zb7Ao#S4jh;1`xbIIpMiNnNAV -prG?&D_m@KI1PfvFLMNzlPOcvk89<aOg#pqU{We3ZR*Vxz$)h#Zb1!hS=2et)N(qm)X>_Cm(Tlh*-oT -2r|%6XWCoyL4j2}htBO{3@*F6t^NwMu2kWRmC$14N{nu~v5j4td`Ol}Gd)et<j^>XTgIvesmS0QwQsh -ObU!f*7`q{WGq?lwIsH><hqi&uWk%O5cs=$_Y=3_zH38)kYI(g{H`V>yii#WA`8Viymzff88ZvzZ+-U -7YS`9I7%T#eNmp470D$8Ab-wJ{q$hu2P+luO=%~uVF#(s`+`)QuCUQhua~x7wJ4hIr;~Ykxh+LI8d(r -c(VYhxcYDH=&kYDbs$|OCe6#V&_1yj2#9e|)L=qj`$WRk^s5C_Z(?8+-Uivf(g;{DWF*QxbaCybv42V -Qv)w)?_*M}EPvkEmle`B2a)*#M^)9U_#(r0Kwz{bArfNYaGq%lT0-LzVPm(T(Vh=SXTX1PAvV$J1+pI -4hpSk0TW*MdOiU1a>0yWU6RY4PNlm_25=YIF2x-yl_NHSjE{1ie&6v*uZF(m^Gp2s|VSjMblMHhI3J? -#m+HJ7jb|vC4TxXv>@RwQM<e2cbGpVu35;PJ^iCyBmn6562ODoe}oF<M*N#iMfyTL5V#`ItA9NPOcI5 -cvpxwShSMoAn<HYWh@7HIL1#~^h<`n#sXf}s|Om4#hi8c((?j!+TsoN@t}XK4A*ANMC@>qH7OT}$7sg -czTjuoX1H`+g170ibZQMc)1tWh=r>lI4Tmw|vm!MYDZHj}TU0c}Xl60jKmcku)YFI)<<P3i3oi$i0)> -`pq17D{WVh=AsBq42=~xG3y~e~sbPxs&`6^FL1EB6R88<I^nIcBrR`$(Gj94-~4D$L7?X_fm@p*eS;f -}=U{3b)9sMpQZdZ!>1x3>orMxQ9-Hr20QsNq`~lEXGBg=-Gr7}-9U8n8rB_<|+wt85f$a)iGRz^;mA3 -%_`Zm8seK%NNnruWs(_7bNxVXFH7ga<F)x`t(atPUzG7Yxt9C>Ho5eeuHU$alzkbRY;Pca2h9I0;ebp -#xMkdaT*~hnjlCVB5@KYen@AEJ|6Qs<T}6`b>OfaK^+n|)Td(<KR^);9ViQjcTDv|TnFVxT@HgjhVRs -opE<OpqmM%XbtF1=z_?$D&OQ~qPYNdbl<%^i(V2*kx4;hGGV18(IH*?S(GHS)q-6>GpjRC;B>siKM=w -kE>1e^C<Cy$Yo5Zt^Z$12JF@ZlUCh{YvxDOJ4h3ok7fFlp&JDn+g35C<!a~Y)402a0Mj=A}VjjZhWM> --R4@xQuu?pRNDq1FzavCV9u(m3WD&I|2*+!dSxFgqHKJM)`NzPP`BAHw`0FWfaQ_}0OZe>>s(1uga?$ -_fPD{H;SlHmYCseDsf=kFe;6pTKrLk|R4*`!*)*V`8L9&;tBk&qr4@^J{Csr(q-YEmv<X#KkpBnHA<+ -qegq%#~ssRB_KxKDU`moL>#Z_H9_3wH=P~(J?U>Je7~R~q(h9HOW;>Jddhv(`eFZW`T}7y6p)2`qwXk -mNM4ov9_j1#6wtAPcLLT=te9rB(zZ&)iB|ZOHi>+SL#bHrfQN|OdrJ%8O(qW4J4QH(_I7SXUmkC-cm+ -%7ezEX0dfq~Xlwp!jppqR=nV7?D)l{f*v&yU-eE=3=10)|k!d*j|DnN`T!5ALV!5gPZYa99`tA-O?Rb -MtH>qf1CnA`94jglwf<?9VFkttVqJp#)?nm>?!5;N8D(iNty`*e04L)LhDdO-w;-S_np>@6)GUIAUOh -HP{A4WMa96$^w88x74XozHeqUA|pSO`q3pN5&7sk}H-Fu~Tcq;ajO@z0R)hLUJC{w9+p?L(HHd;Kv)I -ViG$m%Qq?yEX?-CT)t9yzR-ArKNF^bAJKSp161@*&#>ohIN4(-Cb;QLSF@|3Lqhnh&H>9Z5~nW?3w$9 -6F+a~~2&{I(vb75&BY&XcaACSFC`olw_4rkkK;l+@9$~1cQYReDBCJP|B&<SKeekJV)fm*4xBjZxp<S -GOSs2UU>YzmqKUMiMD>zVC4fR^QK(YCgdS;kfm&+A=Wa|yZ1R)^reaSUu3c1EBbEH%cN2v!vG@LKq{f -@n^K=^iU28Hx0oRR?)KA#nCAvb%(JY-Zu7PBs|QX!som96j-kC{=JDml!u?0udLS<ZpzCbo8hQ*27xV -brzMMe<phan0fyz`6>$7pw4O*ox_gckV6@qEBbdqY{d{a1f#-fS$lwWV(*@-~x0SGM{>&3pHJDj{fM+ -j{xEf5?w~7?J@Wj$g<r_M8#_VK)NnuM8*8l)WR_bpF@2`^?i<hQMNeRqt@0|$(HriF=YK0^T!g&e{%k -JvAW-%`#Yg@oP;nGLNSscVTzz(41r06BvA~*DH5d!5<^jv#BmCt355P3vjc`dbYA!%*B(BJAG^cDeH% -W~`DFHC0B0XT;A{_*KWm*iJh`KTTZ`sj_34n0kxrZ*0d9}HIeLV=Jt*!mZVz6EkW2or^k>$Mhax(9ln -&634G<h1(#1G&1VWtrL}2tV-+_}OgR%!_^pl|3=TBqDE%A?n`r!tY9ZD<E{sup4E_>Wg4vNZO2FT<{e -6-&aAI|OmNZHfkLiNQRPglgB<<}+M8hA4P^wkCS@9ymU!2{b7=HK*5-ZdE-*T8$cQ$#2%|4{`;P6K@m -k*5<t=;4nTO-n`8Cd0y(W3%(Es=&i~WH{m3saVT~Xy+3=>aX$dh;eo^1Nvrc+QxnY;J3kVW11-Zp<|K -NeiOD-o~189(uvQ{41|^lI^l@6#KG~+I(OP*9=cE0zBIyg;Aye=);>eqUL#7Ds}z9K&^Py!`1pG)hOZ -<B^v&bOQ+Vruaq+J~mU-*TDv@HYhT9X)(11y?`LdzNy&UGw$&BI_I2zp6H4Yk2>5N8DgmvUJ+5md947 -k)){>)G_Xh+Z;)0_I046zJeb&{VdI4>>@_jaDCG@qcEy0GDVOHp=8Zt-;n(1OXHyeUuk>jf5r^R^=aD -WKvFKH`;VJVk}@;EKJ|IPP0~!*6f+WP7xJIh_>Vdl3Md3v^s@?VVL2+vo6YOxG*c*$<2pWG+1?O$US9 -<o1KCt&BVn454z5xF3i}#?u%F*nLOSLhO9IJcrbMCi|{6Wr~+&;bUh(fh;24*dwdL=yO$Nd>QIy|K>$ -Juvc<zWF7FOJG1gLR=3sr--+A)OxqUtv$(A>iO*J*F8*b^x%<km)jn9JII+#^4*(<Zjm0qfH;kc|&|6 -@Hh_q*hGxwoE84Wr;yO+GjN23Rc&g&9f!X%ioRRw!6;d~h8u|hV3CI*4YJ;$#g(!}d%GgltG#_f}x$( -L+y$h}vM6;o&-P%qGH%GD=T;@wpOdcO%tFe7>1GiK~H+A|1m>?M5g1bM&BMeEYHb48g7re9MdxxMkXI -kM<OVC>V{aW~-Jtk^37%Z35<SMid4e?lGo;sp8271OuhW2xz0rxrWC&t=543ZIkpfN8p7mp4UPffT~| -M^NTvmzB3Hf_zCrZsYqjuC;hCvT00SYHi&u63@rE=9<-d5GPRAm1PRG%_@M)+k0>u==hm@E6-phCFi^ -vgF>G4ZJhrBi{VI(Pu(vc8Hp_YW&w9>-;S8%^wpM)_h0NRDf@eSFRE<#M5AL%_x04j*#-LFc%R><`G0 -bc-}Q~|u#~0`3D?7w4y90tJ`^!X0^6e}4kI{C&_8Asd@=mpqh3lM6oCD|`-Tlc|Aoh&-4}K^$-&vN@7 -kkX{$tML5ve{>VrX{6t0VEA9MTv2zAwrT#^Ju3+vDcGu|z(KtjF=mQNX8>pBW&1?2hsew;+v<3z6hej -o;5CK1Rklaa0J7mVi$HMn7BM96R0!fgF3wI68KWhn`t}6f^cHzh5(jj@={lmrf!gbVNq-dt@|}G&Xhw -+45Ag>frkHOI0WSlzfA}m>L)SpQGZw>nXk^;3antFaD!VC8}^Gw~i$Iz3=$?$aA+N7y?H$Ja2o*`bIb -SlCg(li{<}qtGfNgECl$vw~Rjp3E3SL@k`hI(HL)cE|enl8m%93{&hbg;5TLdXz=q4qVdHBTx|#O%3@ -#l7)U=lQ2AiK@*1x1&{b0;<`27L!{&dp3of+~aQEQ8hfyeASts=Ld)(3cmN0#UzE(IZ&R%Mv-=EC4ZF -Ba0reCWdz)xFQEn`-`?>)!Q^GH3Y_@dKc9%PAY=$q)ic|E_rh;u0apuLr&PkxQzqsIWeWTj;}d7+emN -`22#L)`a%V-jN9c@vk{GnBi@xwMKf#mHkMr?5?taAGVv6AW(X0q9f_+GRL#=Ciks4pN9|=0`3+PDFgp -PIs>0{L+0s`*eP+nF6z?akib8H^;g+sUizp&u{aziC}$Vb1W7>9>YA#<9+rH1*hoV3F`2KXx<DlC^lc -Xtm)2_jItQeuRcIq0mz%NJ}aGcsSQwd7OPsH{d`qTRq60qeB*N3_h$kHyF&HnBs7}Gz+EoLW3tVVdz} -QpdV@Lmy5<DkW!Sl>Ni}?>OYlUfb-XTXQ__o+z*rb`rRbh4qi9sp7~?s}c=o=*9dL(HNV*cr8bH2jb) -nWfoR(pa^H9E+DT0H>1@*;^6r?)CJek>5Hd6wly#>f$A*2F^g*4dqmC}#f%|*SC&YzOhrPx58Jg~Ntc -a~c2<ZZa`k}xEhY`UaTc6E8@ii6741FoS<#tIwRi@q*nN~``um|C?_N0&8=rT{Co7~5g4<MqtzzMtGG -*?FT8Ni622$Tq-!lLnVQW)iOncM3;@bbX87+6(8n>lvFefy9vg11zgebwMq{lgg@=C)f5b{w*>V5T(V -{Yog0_8oE<;JC84peK!j8xYhexV5WsWOZ4Pj(;Qv5OK+6$TVqSMm@o|<VY~;>CLcPdULLC8f=@&X?il -Vm6fVBHCBRW|{Jl2EpXv|5p9>Hca(4}!8Lq_*Bh>fp<($~HgY5eiwEryb0esXwe!m0IziV^IQp*oyL& -Ve$IlZ$t7+jE#+F~01B^YlGG8ljeE^VnLh86M|LM2^;72W<l^q3aI@3-vs#3T4&>PcamBY&6nMR`)~A --p|OxRM(?2ROHfJT$rJr|zO?F~&96<gwdJqxoCe@n_^cF&7-y0>#8`me|1Wk(HO?hEpw^#0U-eItG;+ -&JGNTOlbge=G7B9FzZS<n%wxR+t1lYS>2zs2W4sZr0tL=rD|anB<VVLKw5hjRZSoFTSL;;EiFwJT0@3 -+A9DX9A2Q6UzF=MId(%1bHQT>`6LE>`NW(_$(byp1)te-Hb};S>`lDWmr<h!j6I@Eed)ay&4G2q)p~b -xFapO~2KHh~VuDD9(mf01oV}QAz``PZ}88t6AJIGE}XID}gKLsOHa;_)#_3m=5Z2e`R!|<G?H6*&q$- -Bps>6_sR+`y^s-uR~VGS?5`iUp7R8I&8Iv;|vr%Lc4`fk~bk=RKyRT&631-#GY0XY7f`)H@K95fLjop -Hhh0lv&xgBPQ0ch}HUvW@5KKdV5Wr4m999D@4;cc5!{d!uLy-sIspCpSh?Py?k3m9<H_@8M41FY7)jc -&I#ud#vk4#xNPJ8-Sew~bUShJ+TtdXeIn^Ocmwb&1`3EgA@qGLb6$TvkX2$@amLj$DRassqk>zvWzlg -yV#=q#z2~&MksA{Xk0GuA{^jBC%DVk+I4NgsoAp)l3zI}?*6lB%KK;eahAes|<u6J<jMX?D2yXaf_77 -|Z!AF<pKRNRNdjIuPsQJHZ4&Pwte|Z1jLR9ES=<~=^<cH|S4lZ|;wqwvFJ}M3wefY*j=}`nYm_YGSl1 -P5sCJKG5?jYjG%S6P70!tsQn)`+0k4i>DeB7Bn2V@`7w(Qd{8WBIs%Y2-VY2*-LgOL5c2VE(~j(W$T? -}i+gPQKhJIW#y99&Ua#p5h;&jYHxsJ5o7FbadA2h&V}))Y1M2Jq(`y3Vll4(IyIBe{D$liQ2~FkDVT{ -vH-tn54G852Z@q9C7UQ{g7OWXk(T5Rv2-Lkv^^T=WhlAh@%j++2Ndz#CWu=moqj)PsXMBA?9l9kHk0) -W0=@j+_jlQ&&gr{BvJRDPEG=!kL%1ED*1@5%=IyT!M+1)Cp^)AN{<)404ri}JJFJ60Rg(UTmmQFPg>9 -Pcd?imgU)3~rP-`n6@|1q~>(<)*eXRcVc>uqCApgnp0Dk*G{*&hc{PuzTC(i@;?F0Gk^Z2_^b`RM+cT -yWr!g}h)&w_6whW^^4Uf)n*`+CQA!&>GO8YvpIE!`gR{Thq*RMlXiLV*FWwH{uT$ZjPVfj(q;v&8dcH -~V;BQl-il0wmqW)9^a&&_^1U7sy>8w%8_p6r<XP_He~C`&>9NbhEU&>z#dfJTShj@RbrEh^_d{Ih!N* -<}N|~yn2593bk=K5jVyNGZ+Fe>(u8e)$5nxk%tqq&Ao!BnhGjq8~TQd%39)UFf*8&Gu|!D7WrGG5O*& -kxids?z`gcU@n+;8c}C$Nc|SXxK681$3`2)c{wbW(8W9{FwI5+<w?Xz$!=y%%QX~{5u3doUHVW}s%SJ -2gZO^X?_X0Y;nUO{nqKs?42=>*<hxI@RbviM*OWM6hUES`w&+soEDDuKzaRu>HsYYZc#)6?I`iElVuq -YYPc*fi7?6Wc&dwJn%79LBQB|?j_<aMou1Q6iiMYY*$Dd3glV$}A?jE7IL1dbLbWjdpl7u-S>$tN(RT -+z%es9U8r3^HzrUd0p8OF_t5j@Ith=|V3noF=K*<c*00#SOH)B|2Rh|Jm~BqoEBbDCushbe||SftaP{ -4qS3Yk3{K-5iYtsErWjwXtfEoNeO4}I!-iN#V~fEN{$OHvqOX?T27GbiqEbNqcs888GJ_coL`D?C6#F -3FBu~OQ{v@h&kU_~+9_k^0p{*z0&zcpvcTVEU;VZ|m6&e7YW4Z;yD5;2`x(+RrBI=9nc=7GD@OLn*fl -TDk`2t-UV}05^cGS8e{_dc$>@>8C90OO{QBU=Q1je$EqPWgkWM`Da2X_sxh|(ttjG01RROs4oi@0d0% -({tyXEzSw_<{v2i1nA#BDW>a6p9j_^0ihT|%B?#gc7lN3|)aV$DswFJK#i@B0YQ7w}9wPQ2BHq1Kt2M -OO%$+o2318^k*Aj8<%o<h9wGPCYhyl$}*tfFTAvt?3DIfe_D|A@N>s<X#iH<zS6*4+issz4-vE+LzR` -r?Vv48AS0~<>;nmyxNy3MK4<2VR8i2lr%_#+fxVyLGQ;FVB1@KarcK1JWtobB4rgK!Qz$Q7i(4~!M!! -_+oZcsed&g@F9Dyfwpwf;FS1@XvXb&r$7%EqR{Wy3d|C2EBFWGw2{*xg-x1O0M^(i{oF~mk548r+LMY -0&VLG4P=e}R#C8R#n)+;gb=V=&7@toBJL-x_h45ucrVVSEHkc%~VSq=A@=0LpNg|`M{l`&oU^;AEbQz -b15EfyuigQ8^X*)yAKmV3M7nZ~%9dhw(6R*CGbD6WP9k7OnhIYBk`d_z3Yq#ABC{JX!Tp{fTRYNYNCb -7|KOboJqD#mqn7%}t8V3K`bDtO6NXNytmRbvBj?Gh_)F={!OHA^HJ_U-|r5F`0)*VkmHr=A7s+_hxw| -BJZHq4?PtE-W~mXfX-k{(E5slvVRfOe+!iT=3V^18_xc(p2vRzY5y>Xzl60EeAMuE#0Zl|V@`q`8PE( -qkS&xRUCBG3J&Y8P11M%c>9fucF*g!EdbRfhQ~W@qIeO${N$jvC-7g;}2k_i6GC>`9GmZ|FOZ*JhVqc -V8@WT?~5EjM{YCawvB5^wohw&pRdkEJhN1^fXY)%e*8`GbHXLKNJ0zWdXF?<|+7&a$I()V~T)W1;lFQ -r=M1J*Xr-@@A8OS9|{?)d{q%YPA$`p+Tlf#86D3gJwi<-Q@f>yF@n{}j@ij?RDe88yFTTo1LCFCE>m# -wR<pJ(_lsMf<3)7)P@8(0KVaHW$(TQ_BQ?ZRSZW&G=A6jy$L=%psdfJIL&{-%R`dnf7mI4g8a7e=@S% -?~|{9<`}c_E&IBSO6V=aQO6BdmJJZG2|f6DUB=y^uHtT?C$0ff6qbi?`-LGO{iJm9?NC%P)-T;bhxh8 -C@1p-3g_V!M%2_P{BP%b(jufzWu?S%&g#vayTc^~pDD_plxAg3-j%U7V@7>){&ZQVvFo|%ziY(F^=RJ -%)v3vh+M*GpfFGBgYIp;y>;^NU%I{OYf>N%0253ZN)s@p!O$e8wD*`|qQk~N<?2mH*%>2H}hU5pCgFf -}|g!nMD=8~%-eCp;+{ym|gXVTJouVI{wcor2w;OJzpc186Oqk*X}w>i510@`z`aW2~UtWrkZyN~E;q@ -wW#aSS#p<i*{8EWo9!GW>Wl4TK62-_Yr4~K?jR~8*#1sG{MEtS4xo@D#IW&0WYwwHOG#6Rr&SKd7Ntg -qw?FMordq6776}JYdJ=LP(%B-2miJZ_J;$1*F1^QFb%^vfs-Un(G-dkBt(-a43h*+-~^20#8D6<f9!E -c=Kq4|qje)Ek0iw5<oqFn?tgINSbNcrf(iW5+r)lc1w)V{RdJM<KH{Iz$Mk+bJW7tW9!U<K%>MfDJB* -LUN;p3ZeU6sMpDoz?DvLx%Dgud*RXNR%tL&56ms<!wSh0t4D1LOA>@z1nHaz<z6X=Kz6m)Q7j!GGHBt -6JaR|x@sJQ2x*GmHMU<4$xe*zor}ge6$4TbzvX)|y^vA-ql|11bdOANQmDz8?iN9{Yo%U}$Nk@a3y>b -YL*$XWdPt1x_|0(b)Sp(xiQ?JwPh6L+We4agt_b?RyU-18a3Ke^@pAmllvKe`Erj?_>X6Gx+-)7l6?p -MoGreq&BDCvkAApMs5vxxN&ud+DN(%uGrKL>Qi<O&nE&wtV?(eakZ267e+@w6^iZT*3`)8d1F(f!1_f -#oG4JH`H-kazYc2TTy1u)^L^b?>U$e1-BZY(qf0Xw0iv1CH&tJZH<o~@mRw8@D_i?%kafJ=^XRD(%sH -WnbBR2gm{nqefYApTz~G$$ljsIOqC^Hg(hR}6f-7TAwOg}6C<lVJHMdZ{7y7MjkkqE+C-GP-ur?<2m8 -%jOH6wxK01?$r#?u)1Rxr*EQm72L^*TQz6@=@D{l1twAvb4LHl5{F%z_IpWddr8dk>aE<pn_SusNNs4 -kc2;qONjs?}8;nHFvHen%St_zl+!RLoWCZ*)YRS5vnKNCofzQCC(ZhfGge5E{vP9+6lKnkl%l4Ip~p6 -dckN=+Yy8i<YF`3tO^f&`Lg2%V!FN(tY_bx^h$sdNuYgInUfLSR-3B9%`e}T@KAV;#o4Y^u1&k{u{Y( -q6V_Z@id4FANbjK8ZTQOBK$n#%CK56Z#rJbKtEy!?n_Edv!!$!b+&We%&bP>jg<Rp|Ay7Cn1oQPmRsF -L>Ef>Iqvymx=V0h9@b3$FO=tbq^HR?7<ddA`&SJ2QoxnRI6C;8Hzy|)ltL^2L=wd!wIz{|%u>orNBdp -qTm#xU+?jOPh{GEesya;eu-<~R6Wm4W;tjtlTdDbT;>xLEf&;o>GLd2!z#0c@2)YAXlrJh8){I4-|G_ -z%Z^lAplu>g-=RF1;AO8J{%Y&IVUQJfBOj!T2KB_zSPv(~b%nC`e+TVz?3@2y?A*!+*2dkjAD@77vQ^ -UkRK%ONck@lbpT!lYc^39IEb)T%(|t`7gB{P#ttY5&$htZ*D&1k2fjskxa-Kjw~7hG4k|rf1<piH4~; -A%^NRLQ#c`KWZpkP7&{~JinA7Ak({lL#!0MiZ9jyqXyeUwHb7)vZ$3Pyk$HMkr>3lLw|5Ih(YSO-DO< -@Mw%|m-YXA|`)LEt2IG_2`7^1GN-$LCdA#Qor9n?OilSnWZ!PyABzh~6OI}!SnA60ifq<Bm~9mhJw6X -*T7JDn-5^Ocxwuy7Rn%-i_sbswfXPuxki^(CQdeNHz}7)$z>(}oXRdI6^V$ZDUDTMAd4i?}slJQoO$Z -@FA*IUMJ*PzH<PJfEP5KJ-&`kq70eJ{#G~Mn_)(qO<B!c+<REbP+1~WE=iJ%)Qytqga<Lc+XShJ$*{d -Lz(pjAVx8WS#ZZJ5D0{rpT0qn5r0PfU!KgYs?*(O5n&1hn?cgrzSj2TUWMbG^R7=xN>645Px*Rgr}B# -F%UMfYqO4ACVN#>Hf1<nx>;Ym7&u7lFq=a}qb-T9T7hmT$sAF0^Y<=s!ff+@V^t*Tr3wKv3_J!pPY;z -n!ML1Ak9(QBtvw?Jqp85gJ`X{gv*)#JfL|rw7c~fnMHHllqRibk<UX0`=bEYNd$>^;b072tqHe+_)&k -^BOg6NZ45>5)kPbeNx@bxw<h{HLS+H(i*sw=9X`3r8*`l)+N?LT8O{S11Le*&eDzYC?1U!W8MQ9F9tX -95^U2@1myh{g#NhiC+$XdI?UoZ1l;^(CPwA`ipD1Uujdk{)6k`+xTrJElVDV=d*-(jX6gb@Z^v`4UQD -`H^Z;*#{%hN9LJ+x|I*HQTkAp!^k6xPCl>qJQhz6q?R1EJ%84Vk{q}QhmOPctQW(6XEzZa3Dv_uIzEO -wbm;P9P&EE{CmsgW$Ig4My<hpU$g}6W$${Qz`pC_bkDVb*{$=hf9k3v}`~gax!$(4lEm#To>C`c=(={ -O%?^l(@1H%CS9T0P17~tPPO!fC+)c>g~_={XmgRVXtap;K^#33308hy@E(!A>-%A9V_2VS<;Haf-mD7 -4hA7QO98zJgQa=Rsy%nl*7^_4XKXY}A>CS^)V0i5SAJRtOp9Gt0L3sm?J!77d5mIDCbc$Z_7UFo4%PY -j<z<rC0lW`GYMA{1Y|JPp+rG&cUqU)zE26HCKS3m)Cja`isbh8vAVkc{T%$jhJ6|{%POezZ1Z}q&Iiq -BD$O=oxwLVg*0Z|$m>3xrcUyn1LIT~!83T{4{>zm3_)NR^&LIA109&1WRvQ*Jb9tAD?LqlVdTIS##{0 -hZ`>?n?vtb*LQ~b#wZ@}#9V~l7hf3HsCaM7!H!QI;#zgF%<B(;z&qud^!p$_g@BUstC44_N|JslD*Sr -7dwEJS$e+z5qksnepOk*Sj@7W-PK@g0P5Q<R<4wKX#>qrv+GD9Q|>7hNuQ1B;?r5}Bu?9dt@K0=(|#1 -HnQ45j}w{n{~%{5VTw)FEQ9@0%e<XiPthOBz4uiukwqhJOMl_IXVm2_N}q9R&C%n<GD6e|z3~2rz$M> -`@o{bm`?EXIJE7BD<gaSYyYIoN<q>(MNjuSYt;%0qvu|iQz|q5hFf|&VS95j6WG-_J^>>Z4bf4^BaZ4 -zQc7m-3J){{K}vDD5QLmpUFr2(C>kzz9#>&;QGiVd~XmCczQlM2;5(^k6D>dzH1vp+Sy(8iox`=3v1u -x60jegb9;CL_KmZ7{z5LHV$AP744g~PKTdS!Q;mIp4{t8upzII(u%pHoAAYP5UsxOew^nL_-$gaC%#E -Y^?asHhTbLD|J9V5Fvr4usfM=O|@HU#_Z8qK<#Dd!Nt&@2abVLlyrE{xJQrx}b+-hj6drIo{{$4^vMS -1THDYS<>?Hc<kRPqd*DD#$ThTlRkbT=gP2AoDMA08ALt!SM4OkPQ_#wKddSb^8DwgH7KDp#lXTs2tc^ -s{X{WgSXM;MjI0SP(#x0$njuX-Fu0L%Lj1FGg_BhRo)M*Mgv!YWp@%H|D~KLV4UPmsIaibTBMxGVuzG -0k*~BGxIM<aek!_j}<yg46hD*c~<2@FS->kCIe}j6gD}wZbilqJgIXNg*d*t03D*=aD8}n1aZ2MPX+J -gXPJ3mb6@mGi&;^}whJtX_OcrE25Df>LW1Uy+U8bNvMs>noz)}BmD_|n5d^a$6149wCOQJUIQ;|HAUj -Dl(UGoI@hr{SJc+T4U0&!q7jJz=0H-jvoKao;`Ho&~;!GQHPt`F#j}r61Pq$8tFXQqivF!|LaC6xo>D -kNDEh@AnZa^OpL8E*UpuK=7Z1zd*oZk+sQAz!x68UvCU$ehDtX#RnMvLD2`D8INn_y0+-&Mh0XJ8U|& -r|Fs-AFSPMB24X*>G}I+U!nKVEfMD-a{1$6m}VozWZt{DE95bynOXGUxNVPO>3V*EpkJIIm<0l6_(^N -ZS^R;dPgz5*3QQ+Ca;ODb7MCk>d%^*2Jm;iSAXp!tfAoUtvn1MRp>3J>!PFQn!85MB@Slk+W-~I7PHV -YKX(3VU*J!dby+lJ8kWM&{uA%+B=K;J5Mr-Xr;p)a;-wwEAqe7ut2#=uL!q?9*T`ceUU<Y6p@@)avvi -_=!y5YGN48Hk=ZmynNh|J8)#}Xa>#^kMBL@mq8??TAga|i{-cv{MPJxJ$d*@A1%e{uFQ^B%hxaa0#n9 -g$BE8_EE%fy~3c}r{q!cEE5$JoOPT#be<<2k{rb#Zw@T6*e};L(O>dnOXC4c@`^*4f6(BX3McrS5ccd -<gKUQ+#*Ja7^}SB%kz5@!ug=(O!Q($CLs3o_fDw_O-aG(AkNGv^T0D6CP>R1*imHfm<EEanB1q;+9iE -*J$$Qx{Zvbqzzv5{Gz|@n9a|akWMj`QP9(ZF}uC{A%Yht>?8vvC>oP{>9n~E&AV)0rq}Xx4TBBG5NR% -hw?&&22YO~B{%B0=nSX0t=!n`SX+#?x0EY=p?JCj!8Nux(&BfSy-31#mcnWU|#E&$st*_{yTJ$A?3}5 -XSmcPESuH{uorC|V~ZG4;fJu}4;sY>_EtCUjfadOo<>v$LH<MRa{T_-K5MYuGE8ah54czUvUSNn8Xf$ -IprryMe#ez?8Qd-g+uEyjwE<$}YU+f@u-6x};Yxp}`I<J@c&DP79|BkU>bin{_Zvu&1RbDh8v8Ms#^V -^AWgGX8j#SEgPV<92fsi04w8)G^+W;L#@RxBljzC-5=`6#%!(^4|ef$Ug&BzwZ9O0agE=D}GEYAZ&+G -`;#JQirDi*nj#63pivwrQ4Gd0>`Of=ocy$65{KIa^08ixvZIMH&ps+r$zgJuBS+?jW&fGQe+H`X`~$< -FLvHHOKu-=4M;bX2y(B&;dxz~7d|;a$wjB-^`LQ$fXDX2h`B6&v$fWOAa=<(MSn*8YgHX7`H;g*EF^? -3NI25X4_+!I?eD31YMMHkh3VlO%AI2b^9r_7}!z}V&0af?N8c$Q)&~6u9W$-Rf>z|d~{||wx^%qd}Ek -FE!8C3nfPLA)ON*n5|)^O7-9K}Hq0X(AtzQG&kqHb#6UcR9tWrFleOygNwzwpEsL49cMz)9W4_;ROow -p+xph!BA?EG8a0@Vr3{uVUv*Sr0r$X==n+IfY-AD`60d^t5}2q%weu10<^B4a*3>^n(XGI=WeP7c}Fd -w`Oxzd<EBNNb*CyW=W>=9s&B7e_bzg%{3<ifL%X;Dp#Qk{ajzka9TMp3%H;h8byx>OC(G*&)3i(rqe{ -sdIcFvb9?)|grzZ*^MDXgd|edce)HH}57J2y8?(n1*ni1aavt1N%&LsFHz7}T#|seBzAAF{DCtuY!Hx -|S_PB1HqDm|+f_F4{yayyCU8OOfb<ZZQcRP#M3+r<`^g%^AM5z+iq!WDQLYR-y8z7Q~wEwE6@Fvx*Mn -&EHFs0B?!g^}2qPz~VOT^<L!!%|lwmg&d9{S)^q1>i*cDMq;{Q}|LdbX~i)fp<2mDX)7i2Ay{U;~@#b -i`-8Q!}BSTOUtC1y{kWQ{1i7@ckDf0h4HKbbM6s*m0oGFVL6Ql6S~yP1>R2yqhJr<9^Nx)&e||17TGB -PL<#M)lGF`Pk)9}Z2I1+(3I*8p#?$d4HU_E#)lxwXqj4xs-mrGlP!AO6Uvr-zK5HSpUWs_z=%5m#htv -mC<qbj7T@ylmAlM?y<HT85uFv4IKzWPJ`bntTA*jA;g$J+2vkMYlQ2sa1@QL4I37-G*bZ()9KFA&e*; -zDcm8VMUqRKs+CG#@eL)O`I~rG`)Nm)FD=grbo-8t)92O8`A4=40fLP(}%}$z*Y+qQ;-io<<I15&$?9 -@Gk)7)#PlY`s|<6@dIgDeYSp#@taZF%R@R{{ago5-tF7ebFrZd|@x9WDrbjDB4TAx`;x7Iy6Wq@KE|r -nj!RnB#k%Fy!9A;>!SE4q!Eoz(~(b_9w(6I1!%1m6TY~#)b`zn0xAwiIi|x2%<MhzJ;eJU9O5Z4TDZr -YUcoR1I8A=;1CPXZ#v7F$zECVEa7=M$TQJ+??=Z!QyH;o@#IYNNwVh09$yTm$ip*-00T6U`fE0;7i(* -Xkusa-FMdNWr5-7`gLJHlsg6dqUR2-cAS5!F;#3&j?DVlIP6RlQ9ZP{{eD(}R>c;_uQoCFxx}BccxxA -oPM-OA&$>`7(wF0(8S4gf8N~Fn0UvT@R)9%Sk&ct_<(j3E=BfUq93rD!jXm)DDdi{f;-;!<LCZ-6L;B -<q$v{a9j>{9rU=K^R|&|Jc`cH@b{w7w?TG8}IN4c<U6+Dp}lHd5lYzHyJqhq|#c+TqFd2z!f*6wer-) -Zr(OP-(>3szatwk=>v`p$RWdK%H*=Xv5L|f(41<%9;H*mlMevq;?Vu@L|AM4)~WtXZJlNP;aU}5&0(V -iBd6K1+l5IsToOSem!OjooMQ^<!&|zs4kzLpsS)+nb!at-Y19u2B<>+8L0Yo_x}y3LVpESFoe+%g^(~ -t;RKFCB#gi`jlmRw!6Xcm5QZP5hOa;s0v~LJZ{#zWIB?LxHz1Fq4hbDn*)(xTL>zk7=#IL+1XYKc1@S -R#K@S4N4tr4Ss7viHQuvVaM)Lz^LGVX!;xkhEA(j1UPen`~HZjCe@;@$PKLPd8-k?5gvwf_XIxY<U_| -3rCu{dz(ZhvqbK_3i?{WbORL51i;brk-{N#XG^CjFP7ij$9Z`zZQj0loqGjZ#z&WL@r!v|6l-%<10>@ -H?LRqWt~$0o4I>fG+^m_ICl*fv14~4xl>l6!0~m(&qFtNb)-gPu`~lw=YbSkqf<K80$jT<>(|`1E57f -w2MSxY&FOCl~5f<E7PY>cEeT>k4gyU$q%{+wVc<}d-Numh~)W#j3dqt5u5^TaMOr8<c2T(nLpyPzFwb -09o+@5xjS2S8*Mq8EUBkeIlsL%w;69?jW<7*p@FX)DgTBcrIb>dTOu+JoV9wwJXVKTHb50$j{j{L`d> -SLvF`==iLE&69dl+IrsA23sFG*gYAl-*LiV85^}*I8$O@ItJdlk7v%~%!d;t|b@^d@EdeVxhXiX6t-z -!|ik3kTAtXE1kIdSX6>ky$XoGZ*YGaO%&82DtlZ~?IA(%~KwfjplZTjM-%*gF(bseEGpc4(7rOZ*mlZ -bvm;ehyjxJX`>>Wc-*F{$Rn1eLHr)M7n=|^!LE`$0L6VcqBqm1dUJxL6bCukpx6w#GX!KC=OvTK|=%# -BVRIY_Z%@rj%+N0K0?6c!Dh|qLpOl>7zaf7!Lm9`1<6148Hf%wokK@w4=kUcw5NP~nA+2}J-a)65s5? -jF8Q>m(dj{++S9ya;6GC|-UC^j{Ac#*O55Y;9=r}U1N5`t2pv)ebadz-ARiaU=%a{tXeFRWrW-{^t_n -v-u*;L9ZV%zd_WcqM`-A<Ezic4;mAGXwvTSbT*)|P5w8U#MA_iB^U+QtqfV2I(CGo{!p5Ixe2Z8qEZP -<K-{ObVqzBvp2-X{foW7(!_jC%7Qou~MDQCwJ&zK0-x-}0lqt70I{;b;A<VZb-D<exYC6?^?fb-;5sz -SFqmI|uk+nL^=B8G&ya`d*dZK3v|PsHhgIOzDkT1c!0H^Lx*H?YNKR`wC?M{1cWJb3t20x<bM^-x?h2 -y|qYyJ4q%3O<@mt8LvioYo!WJlS_G;yjMI0jI&lT+LU6<+s@Dn)yXpLh@^68Y?o#gKmgj&;P|Lu^!Ci -(WOd>v{@y$$wrs;Ca=RvM)@xoZ^F%<MT*Mo$otxr9mNo{W&5dvY20u9#o>GllR4!Ox{e!y1m^MOgeXC ->^8isa)&ZVBs`Yc-mOjQg8w%~}SUG)OrKHyLngLemTo2T|fdZ@aC-VEvshn4HI#Oci16qu(yNcI|%_v -XZ_`lUL9N{a{<`dTG`#T_U>rMEgNlaH4y7SxF@)$eqq$cL!l_%J@2l4_QeF)@?O5Q{T}X+&wFLKo2G_ -5sSPUX&gV%4l6cNE(vl`FUBSaHN=1t*~jyqNWdBhL9zqnN2(Qa;B>sjv-sx+zGg_=^N@Q_QlkX6u~8( -?2TTivq*tY$q*@v8L}4#53d8%(6*!SQ5v<-!bnhbZ({!m7_~6ot1-)OmnUC%n4dwQdn-I{Hm+65Ol&N -J8Pp~=y3h5~CK4lS^5}AYp!T*tohMM;DRzHUGb{{?-kZ|+=JyGGkq1mBn@dOs@~dpuhTGH^UCd_Ow%X -Z@B%jUsc<$pFcuA{hKv8RRFBz4hDD9~{dbzY1oO<J`KhSs4pUt*Co$?sFdmPNErUIk)EXM*I<z%3D$p -#7D#4<on*C$Vt=)fAJU;mEZ^Vi*1KTogtAUvCljBA_`wqpO$tZWz1V-v^KzY(|IKZskNMF+2VU0=f4J -gZV5HjhGCA961W@J;SUP*&^6K6!K<s=yfEH(q!;a+rcRv@9U0+Q9|FU(ECpR>8mLf_bi={Wh{85%-Fa -f#Nd&`QjQsh)^^El+EJcJ_wW;dC+s2=CLKo<#b)?XjD#O_twhsbc4ZWYD?CbPRQ-_df4ysZ6!u^x?BK -V7y{%vv#V$0BNuCBTWqB}5BKxRp&;RVvrnk%gf40>In~Hbl_bkgeR~WNw<n}HU|7s1V~TcFK=EDsffQ -riy`9SjC(CFXZbqxjPC6?K_Efnd)nntHR`2Juy(VcS-F{C1Z@xV+&1QJ(THIe<c&mg+LOTOhQ~|8P6Z -pO`@;D7CIfD9<;fxQ>X=c?rrOzn`RQi>#yUlB2_k}5LRPZ~nJ3plDy-1yK@h;>G0}0gDV4cP-SdUZx{ -!UUZ217>KyaZ_15@j*;SviJ@uSO2ST$1^V2*;-P#=|k+A7fp;Ft>zGa6R3@x#I3u?D4u73i4WB0A>}h -cXU4o-sDL1OjfseRkKo0Q|hK6Gwq%Ra)pHaM6V?z@)#CIST7)|PNy*JTp6IT#PR7$Z1VK^sZdz6rk@I -5x=^@3sUkV;-;--`vn=fPLdg)Su%0YnyWsh4UKpHAfou<&OOXW2^ORW_cDg7S&%VLhJMT$jwki$yxS2 -E^Bk&2V?)a^J!_4!Bm-5hOBA5J4nuGCw3;Ue*zbsBWq@Eb=w|)K%fBU}ek7(*I_xz5WetqjF?I#MSNC -Mrn#T_+a6a^jJ1{}wTJ$)pg{RN4CNz}@aBa?zY<fat;;0yTU<?v~_-vP+c0z@8V?mg%F6Vc!u;@}^F; -X_{u`4q{qgUhhzWP2vJpJC53cdWB#X&7=8)sYX^3ONe<e*&G3cBzm2;Zgmkj|_9q5O*B6C$KSmfFt;m -&mOu`$dLd-pU!*&K61vxKY~2y_d61dKZBs3`uo0-j*qN0kNy%m6$f-e#_!PSdJ7F*6BA@*4%Oh)y^9a -&D>j36e*c;$9v;a*(WFG@0lTWFoE?V`HTHMlGS8;zYK8j{6u>XpKkW1&Y0bvb3RFGze9-;qFC8Q;?I3 -9#+kcR>-oLg8{qwUQCkOtu(?38!YPS?pr`;R;1gxw+%vwlG40o&6S(C}P**v&T>@%snma*6LB>o(Y62 -BPT>ZQIV#d=Agu9f63v&aFKO&<QGMeTc)<IdCdPUvm6SBnXy{fB6tXQ84}D1TQQ4w>ZZt;?`(Na3^U& -vLvm8{kVqGF-hr9!%C%3ny=uOA9?MnSG9v#&n|SKhcStQ1fNVSrUb~a%hj_&c;#K`yv1Xd%i_Hvm@6t -fuqSS8w0gMy!fg&kvoj=6yoBxq5Z>jxmk(UbpLR8B_JQuE6Hat1W*#Ibl1(8dIN{3j2rtF-6pM^w<nB -q?FdmpzKH8<v6dHOdKZ;eg*hr9rG}d>l{rApAHguku+!Dk>oRC=R$X1T5>l$bIeSqa)g^qX@0)-&v;V -#|EoFtFo4^H3bi~<JfhL|Fn|&4=s1=RaYfs#TAZuT{K;(-erRt<cVKaCf_!M+b10|{HmOOttgVEGUAd -tZPz@_?iL(<l-F7l}>M1pk*Z@7_n8BA1Me+8qRgIN8(Xe?>O<^HJ<%R50!c*eTS2DFQ)VC3SxxZJlv# -O#BK2v#ptqXI^g*G(h0dP}kt%C_lN;FkvzGy#F&h~o|{*&#q^uWt{dX`0Dg7~{FRMk*G1dfC9<Kx=yL -VIO|=EN;GsHZiL%P$4`@NT{cD-_)`Ja9^^5i=b#>ZBDGk^A>1DKRZe+L{SOF@OK1M1ln8#|K8LE{Ozu -;Yf3LU$`eW(r-=QeEu`2~Pyzy_8?^H`Y$Y=$s-4|gn*)A7u-L&=uW=8N<K7};x&pfg9N`YPsbtMYNlk -}UI-oX(9GW?X4L+nCUMDO4NJM>8w=Wbyeuq{p&R)=yRyou83_Jy)Zt%HmcVKzX_3h#h`l*o0m$_6-Oz -|P%r;Tu;8S6@rN>>s=3=WNI$B)$oDHaB-+ftve<*HNQ`%Hm)e0qd5c6v*bGC!yDWi&waga&9@Pe|NWT -aU=A+-bVeybM7MG(h!q$V1!=j@4Agc(U_@N<k8(0tNK-xay(D%cLg+r!m06WRUI`)1z(?*%`#cpsXAq -NqMX9d@xY;jw-5qOE?L5uW*Q*oo1^EUF{t+p9rmOU&A_z9MYT(mDI};Q<Dp#14^fk(&Vz2xewtki{p` -NMQbMH;H^myZeYMX4WA@D+KkSCr4I&*0H2>l%djboR}GMd_%or5=rZk7F2NImK|zxs8)aBVEYI=M4Hu -$Nzis1WfC5W7%QCXO5rb(!%1hM&L`zzZ8|joYJ)-xE09ONTPOp%$>&O?{0Xse2*u<JX5k_5|SCE+nu< -<Kod!xmwb^tsqt9F7@s^sXjnk%HN(ET^i`@Z9$0=?$tnc9K|eu$|aJlm7=g3>+MfZ1fW!a%bC{V4alN -v`g#dGnXaB^kZJo7X&6qHR9d*HraRG72vp_NkslyaB22)Wfh+V-HJn`v9yLFZXmDSyto2f|mN2g;UxY -wLnm<C|B$|SPMGzWEBnuQ4PX#9+T#n|9aP#Kn^Bg9H}`4Ef?!czVS-tbvIPk>8|!QQiuK@$W${;w6)J -4wezC}^=;EHb*lf}em`*4FZ=vlhDVX3AVtwILEt!r6BJ1uGSo1F!X$!15RTy}b@*V?*jE4xLqF0(`9W -&ffl{6wWXppte$;S2j0Nft!OW9`@{kc<0<6QR>!bZl;Kvwv_G!;1KU~iIAW0C}K|9z1TLK^KR3bXIq} -hMMe^!X6vV#SYeJ%jY52gh5fmVlyR(#Z;cI20!$7%MB=*R2}CXNxwPw{;}$Kev6A4RGpJ~|Eed)aUBo -9q(t*P_$kOro0a0Lx*UHQ(^&R52}%O)OSEu1#Hq@%n{_JFo{${EI5k56?&Lu8F1(-?N4uHR~}8KWwX5 -HuePqIOHV%#Y1P7fAwMiNfCbgR}tQDcoq1yGWIWdq4wxaAA(yq#nrz6)_w}}`xX7(1^%u0{wXope+ID -lZve|Y0M<U|s0vm{(k0Vx6_7-<R0u4T`(yxPcZ62zmWGRaaIK*`!%saU5BI?+%sn@JzZ_HVTXt&E*wz -Y3*g_4U4MLWw1SGZ`9;_#3`{j%d8J<=}8id5-)XGSgc^7ZA1T25j0~-^m{z{t7#nsbm24sN|W2rX__0 -oXR>1{2|)jbyydbvo3S7GDecc6QJYDzrT(mji@rg9TzzBkd`@*@K9jIo+=3Agp_1ZBmn-k>4fzxyy&J -ZPNceV-r`EV)sYB3{({8SInv^?pHAM?KCZtO7JDB)8^yB085_xAM~03>MQ9srqufBuVBO0*Z;be8yKv -rh}8ov8VmJ#~1tz8mrj=Rk4Q(rI%j?#O>2O!$dmwPa3;{!zke=3?Q4qCc6-+&RVUQBPTS;LdvF7wDOn -i=R+5qF}Z-M(#Q<CyZGK`NxLZYQZxE7Xh)*Q>I*J+XZ9qX=11j@(0UPXbRRF-^DF}{e$_axsv7Qgl?e -w&OUcP)SLt0MN}ZnLke8B4A#W}BI+kI!s)keZo}eL0O?Y<SfDRUCn?SoDVz_v^t(4}kq&K4I_2u5AEa -M69<h~G(no7r@3H2sS7r$2G;6k}HG)+Kz8go<e2F-IQbGS;@ovQluakV8bLT(<Gq{3=$797`UI2THyG -)%XxS}3%HY!WvYz_qswu9{_n_w(hZlx<X}x1w?%7Xm{x%$*0;quLl*6#bkc;eA%0t(j)GOk~dSqg#Rg -b+hugHJ@$x7O@xZJJ&t$wasY~@&D?Cg8a=11^F8j3i8E-LLn4|(*%m+Fa=X6wofk*fm1YsL(o3m?5|M --{W4=erV0EYvn3xk*`8AG88#Ums{=@MbgYxfK{P`?lMeCqgn~y$LY?IY8}3*I{>a$jp9Ko?^A`1Kcsf -=v@T1!)$v@3j@t?O=!SS&cvS<I%=lFf1!l2Lk1#*nCC-8@f^GBa#pTLgJF65Z?_LQDNj~h8?bRVJSef -mf~o$SyjnUAnTOYd*=Abcj2_2&r%>H_%QQI|95i`n(Q|I){c{%@Fh{-2*v)<2(64q=a<w*5~}DAhk%v -q1dkiX`@9xd6qjwwi3ctjJKfmO(i_B%V}8u2LxE#a>d18AddAlI1-eRmJ#jUe7)~TnMeg9#R|vK6I)a -qY(86s_mGPJ}XTB7|cD-=H5DF;rBq~dap$>2GyQXsJYMhW#S0R>Viqvw*r9EOJnahs)Nr<{=$>mh2^F -K_xtOHQn`h?dbh=gVZK%R&BhIqsrd^sOybHaPB76IfO?LgZu%WxITeLiP*Bb^!`IQ}imld;{!!n3GEb -gF9z812y-u%!_u#23c_BC~q<a8yZ_apP^E(Jp>bVh->Xea^;t^=GhqNipRgRD}l0qL8oW7|mC>42Bg_ -c#OcOPsrU^{W8cY`S<=q8nPgbg#t%L&q5i+zJI6;JE{E)hmH48J@kO7%{5^zQ2$5lz$i7Fz&ikkHmfP -fR4cL2T|Q@<cQ$?9?uCo-bc|3yE1cx#E%rnV%vX3O7@{+IBp=&JGb)K;y182$PfSTZAmo?@)HVb<4Y8 -pI<NcIALsTMJimSLyVyBDN`F@_ApBk?D6U)v>QNb17zYiJQizPe<xjhT091xa}Wn<3!I*|n|T~WC~{F -N*wwpB)BZJSyESgv@B}9W0N&iSh47p-pf(t4JvpgbVWkC`pgpRO&pn?9nI2s|=I)+ibKvax=JBrp@|? -TtCo%wy@R&E$2`UlRx9eub8N9amEah?#&BniUcL2V!cVG(f7k3AHK3`c)yPAT}DDug<*6xc|?}pw0?! -TeV`A1^?dX>x$Td)@7N?1c1I=mAG*fI>s-Oims`L7BARC!tNM6;YEdOP|0l3jesPpBC)A@hCLqc~9EX -pERA!3Z2uJuGCBq5(usw`5I5Hvqum3AKv$zNHr}4Ll?a_gh69RI~M}zm;b$2-~~XpTLA_noijh6Iflc -^xiGGN)Znmc;I^9fyK0gH9io^d1Dky6h@))l`tTqVbF;PTw|2sa^~i_XsSFFS2|U`jq}(#*8n*#n)b| -~=hAmJ3>8b-(~_L{%j4R@>bq$k-h6vKR2{yS*7N;5WvocG4Z86cWL=8}h=-<LonAIAy`W)E6Cz@bt=1 -Fk6vI3Dh4{W%RP>v9fg@kF&$<eDctOfSG`i*_)xg+Wl%TT48uNK7P#9fHujbUg+q>kxZ0IRI{G}%qBQ -a6N=VL!IW7Va`?bHnH<_aK?yYn@d6g;b+`t8vgy)t%<q~p2jK%3fN?7Xf!IKdVKl-rPd(w82ekc6Pw) -(h?g3Oq@Se%s9y61+{-g(-U4Sz|{`Y@f(eMQ#j6R9vp5<ti<MetJl{n1`k;67}Zuq`?Cuaj9?ef?lGu -oyBo9^-DV#y-vxnYAAEq+~2LImde98UDALDrAc`xS`zdSd9rX!0_e)CJ6*eY(+L(3>rE0xskn_Z3=|{ -KU69x4xLD&1r9v)SX9>&=Vh`_6mbxwQJ9hx=`c?vQ{x2ui=-<Ra=-<FW=vO#s|4TzOL=psY^kYIhBto -e@xrXRH$)@(VaT@)S^btWv7vqj$c1)3z2T)0=kDl5`FXu?LKkE?rr&*ICzg7)S514as%96uL;^>@=jz -2hcu>A?_IP{weF_Iml9*vafu_QwLSuf^Cq4?+o$Um-yIeauN9Oh8S!9c-2#)avJ=&|ShhkG@Ahy@*9j -qw40(&!LhgYkpywqHMl9z2uy8wf&oH1t<Eh#ijk-y46zLGaDK=}mAl<}pIDGE0l=YFEF?t}*zpc8C86 -104_u_yY#o{wW6fNwfFAf`JYQ1bi^icC=P&Ked&AXY=i;oWwvf!*b27qe3>P7`*`tR)k}bsxN!gDUp> -QD_b3MVoh$rtAX+a+kegYy*F<2)+L^CZ}+&3+)K+#X-g>5_m<b;T=n5VRKPzm9r|Kc>VaXHZfu94{h1 -S4T$mSp<HcCO=3kZa3SD8&tjLu7o<{n1yJTpUKYD<D`A*Nif=Cora1`&*^_^rQ*O>TI7&ViVO)g=^(^ -4zzR!`4<DSK=vH_+%9R~Rx42v$p$bZX91uQmQjWA`sVc<gTm5A1IQ5A3VpL6bNIQG4(}X%d4W96930@ -n4E0_Xz``FpB)rEA?=I`{*2|_@T`RlSe{zXd8aSy7!HFdbq)19|~>q^|EJ99Q0EPJC;3D;>d2|55;y* -rJ&@Hd))J~J-Qq(J}ph~C*vaa-}9dZk3B-*=|Kp?J{ELGV1N$l+2NJ?@oq(_qilENPW16F_Q?bHyes+ -0n&<IRp*sj<$RQSX#KrhHe7_MA`Wy6EmO6sRt^7H7P$J3mb7z9y{{4EtSGH%*zXp%(e>iwR|K9}<{rn -f26#Atvt8@oJntpnVmkb))3<}kNWJ`c9p%|I(i=4^~AsTd3<|K8l$6MCYUDB|xmmbT?UAS3se98(l&W -r>z4ElyyC55sNKqJno!qM~CmiNnxg+W;ygCgel7=y=UGfPuD-Y$P$r2@WOsrt1_rC;C6*46QQyCcsi@ -}@DNuyF7|p9OxUKL3!JIKNam7wP;i4v;|yb$Rj$90ngU)Ne@W&FfZOF7*s>kHnzPX~<91(1d2|l-*T# -q0KMkg)usq;W2VKzg)hP6rYb$+0xezE0c1xG<z6*0KTkhgbWH_Yg?b@kEwL1!R!$D;!`~H52BGeF5ej -Te{@_v3N}C9_`<*PZy)qMPJMmAAEOmc(|f=|DFpfSL4MW_=p$TFC`s%X2ZkYZ{||y-6pbTa_DCM^0sb -&GppSlEen6fbT+r~LN3+A6L%|_ERt65un&iuP1!sqz1OB1cL(#$Wpg!T@a9>6a3JCVGOCX4Y!Vi5TOn -llZ(frSZC$J*~?R${l<S>vU=D^tRgc11DAW47v52*ZT?M(3F#r`jZ9M`!6ob*Er$vz>H$PT9M4&vw!A -WHGSEc$%3WQiYO$K{?xgF*xU9J-ex`x)LB9<+p~k>tO&uC#s;nso$s5h}+0PN+Y-3!DkxIrHBfDy83> -tbh-<|M7<%em6Y+;dgwNe=u9Mje#{sTld%KcVa8>)5eMwe~F-)=kUJ9n%^R5G3$=xVZS#ReC)FTwc_* -N;lsi4_y4$qg)CFh2=DK~?W@8N@TZj_Jrin@vKr$#2d%DM<s5gB7UfRzb$@Nd^xRxxQ~=7jSBecq$#) -ko4Xh-jqgXF3)>-W|2esgxoba8$k<gt;&QRpUlH|A=vu6q_p_4VhJr78WEs>>4=HOx5HB!@N#XRtR4k --PhLf^ML3K5+kE)FJ227ON^$ysT<R5U5P!T_(?_jFud=-Ydvcm#P5mYc<ktzGy*2<-wY8IkkxSDfAYf -h1k(%6qvyHBR3;8~=U+x9&j+Fmf$!)OK}G&UKmIxASSf@(UbKmj({eNHx=nd50?z+LXgLo`c=(RiD}@ -P%&UTTd_QGVuv-f&2&T93d5@1AK?D!(}t8GA(<lZ(G34+1nZqSirf_)={;J}Hg8M_(1cSzppi<EWI?T -s)^3b0;13NnXI!+~+u*Q^m%7)!uI^Wxf*K0U>1Qd-olYbb-T)Oo`@GLxpKU#bBw1K+OP-bPSyHsPyfC -aiU7nK>`*;7nDH2oK)LU-INd_6Ylj42qJ@e5i!m{|ic8ytiVtjcKecl8aSeu?@E)yw5YKAbqUpzph=@ -E%{G$VYzv6MLlH3(3TtHr0(6x#G-t0{Mk#gi5zQYLg^7?iJ*@K|j*_8s-n+4#*#CmmIMn3K-s*~yU#x -Z%S|jTT&-aZU@<s=JPR((LZ<+NQ=4d)CYjLubDyc`#t~Of61ngxu}!IE}fz8wt1z_vHtdBP!-1a{pu< -=bJRLWHY?6;}-3l>~sCd0+;z{B5r5(%)EAR)3XIHux7$BR**%K1tpS3s4KmOH+D*p8j4W`SDXFkFMa# -@1IK^<ghTsFgNbtzxjO>7g`i%<k+R?Mg;X2><Ok~gOAF^|DcW?ZW!7Hr{lxd;I<D^NuI8%tWk~zhl_| -ENV8COR@b5cq>WM_&=x3#Hvt=x*WIWI__!b;S+kcolFuP6jsm7`+4X|6tBn1`?O&7w&xsJGVsy=01Lb -``$bA0YLjbG)xl{5mKI@10vmGExxaAs>?v10(0Fv7gIUCRQ~;n#u|IkrAIJ4@cUOVRAq*0E1&8mfw3F -x3eoPBILR1F3oFesMAl)U7Dj?UVJrg}|TmtQ*-G>!mvu-vg4iJzV4xN{MbsyY+WQ9>V~94773zX;g-A -JON&>=FxJl%XZV-L9u~DsWi>`4KYw-l)T|uk9fmE%h`(qbEf7;Eb|c!`%~vLo}YmLq9JF*sz$W{MK!! -+3448`wWOG6!F4VwgWidMcz02Frcrw7n2E`9ZU5})MZTfg^#mw9lV(kCIZJVQbxcY?OokGCW+}4SOcx -zX1=Z@v)^aa5;^BuBxJOP?C8$?;Q7(N3Z2j{BI-nDunra+h^|fn;Q%;jj?$zYPh8HovJrw`JV|I7fq; -`Ab@B`7J>AbyQ-^>BkZfzrp&wiy27S8+Ue#U0+oK;l&dYsLKe2DH-z(RGp3wBsTkC@?OP~-hx>@Tkg1 -Qwd}hoQgQjVZ<rt52?CoX{##v^E~}%s2dXq)g(~p|D)8thOPJKPsvC=1J>P2L#Y62Hj)K17kW6r+RN4 -OTkNL<T8qGq+F%&sqklvxogc_FRQ^6bKn1MT<5r~>@b(#E>Sc7W^2FMw))$peH?h}Fj9R)@A9|*wS&5 -TY(9h!XY3#4n*GL>b=kbL`nM_j&B-2zA8S=Ueq;LRJ(PVD{dPGH8TVtqpTThd?{6phG4i^nq*~TLvh6 -s>?^o~(g#7>G^?gUH|LEF&O1Zy+rD<{iQVKpy01lI@{A2!_ABxilz9SCm2p%0MmCF7T``S?*g^wB+fg -SAJEIF!Yds@D~$kL-AhJNaMJ8Fc|!(=O?j=|FOqb~VpYmpdn9DFpIey}9=O}jffuqyf~;O%KU7JW=$( -?c#h`>a<UV3;^cby;*ER^-!bdYHl!M@!f~&QT6L!0cbaQa(6fDK!4e;^5yrV!t_eLBF6+PmmYjUk2!j -bB5A7cy_hSL4}RbRp5K?$Pte0?|WK}dy=<CNR5X!%SHau0r5?*cL<8?8{E(z#&`#UQB(IaFRa1skoQ- -Hz-HC-roi#dE!2HK&s7wU7gWuL=6xdkKv0!mEj93A_-OAs+*reXkbMCBNY)+yIIBlQHZ#cla6bleA!s -?8wSeypRjOxs=A(8^_q|`fFr+r?IQw50nvdJ*e;K$tZqr2%$!#AhzKeWo8^36kI~!*i)*bI4K115!mG -Fmcn!L}ge*n+Gj-Fk&;scEhzCGPVyIP1>X3gh*)fmz5;r_5RSDww^TX^}ccK2t}N4L5LWM1iFu^tk{d -&^Q-%Ys!$$j71g75VSNyeap?KO$-1`+om$^7QuGV-Anq&n*M{Juj-m^xxfkmG2Mf(83h!Ch~`UfO?8c -RuA{HhPST!_A!5ZPJrX^h;}x=7b^x&@HpGEb{xQd|5Wt-uj6pX?Yw^;7<m-?B)~eK&-frX$ucYd+oBf -#ZBfglnB#q}xP0u(dvs4%h!+V&v=OSTjNbJ|&+v?a5b}A#2eWnvv-Uy`UTR8dZT&H|tmL#;tTC|xTPZ -@W@N%_#Kz&_d9kiJ0UesBj!_qdL;!7ngb&L%La<MK(AM+a}rRRi1N_qqB*EX>pO~?=|>ph^Ob23i^%z -(>n>sM$<ZUe*6j=pv}%~M)&8pVy8z=|j6`>A=Bt8jZtea;}6qAJJ@2%^Lsg?&n#u|e7H5V`|r<bl~31 -bK3y%9wGc&IEFSsoHh5nLJaiU&xN>dhxlc!xK>2@}`23!1YM|V&4clToYA<$Yn8T-`3vv=s#$>P|56N -n!LTko6&(&j?vXn%or>O7)2McjO@T{xe7nqTK$CcLgyrvZ7g1Oi1LIP2G9NA7K;RURPjaG_|L^h{{$5 -7*p_QgSkAB2i@Z0&qTb$gFEy<Km6wixr<sSso7dRPU3xh<)8M>@<d-tP1B{e`wpPF|S<G>@c&|6gc<Y -L)!{}>FUG-MkG%ab}3_^_%E+8iu7hgtAd#&<0zUIK5GvXMi5h%4LwSG4oO78_SN0YG}!peXZ&*-u1U3 --NnO%({y_s{V44tp>($o@5AK)uapvG2}H7va`T#@<ABuPemLP?C{7UAu$m%E7khhF4F1xq3N?&bh+fb -AJw2mrMYv;#Y6%9$@x@pH|qIPj$;_W6|6z)yde6@}cU5TMc+Y$@6?4l@dM)bE3T4jdV3G-(e|w9VUo* -dac{^6lYy;?A%f1?ImB^>>uz}#WTlzGjeBKNBYgef3pn3*+GElGP?NN+1UU2!w|n6dl{DO1ix{{fBav -nbN;nn^*=J;cXaUeV1I-GGz8HUO%pgoVi1f#FhzW6D32Z-(Ud*_0E!*GLHNg|2uF|lboP;TAfZD;3(g -OE&zFmH`KRZaIx0lery2Svg`)>fKtIcB)W@<YqmMHXA6<+6oFw*RynmOU$d3Zo4kl9QD0ZRf$GIpys{ -S9<ilc51f4o7z5uxb(sA<LVfoJgSpjtuscb*dZ@kBz7;yRpuT8#eE`$#B{5(~<G2L^I(Hn-EnO2o7Mv -I{%-13&-{gkVD0J{dCe_xjYuO+C}aC7HLb&Lb&I$g@4Z7HwB&J>D%$&vR{_w)cr6+~+j?s+No9@#d&m -zsnSx=K0Kql6A;Y{9ecU9K^A<ZnL%n(e8JN3P5xCqws#ztQOt-y%_Jv+rE9Dh99uuwLe|*uU8EG(@Xy -Kih;j<$%od*7xNwPjm7bq@VL)}SMUrHX+EXhp;XFZa?^BU4nZ$p;XtO5`(5F3FKn)D$&oju0?r+wqK^ -4yYQdV9C+&MSzve>!hSqtHO5)9_#P*epyq6Kh-7lXqJ-n6r!cA&l-q;Fop3faGjC5Ng3-#c+3xRaT>- -x^j{=H9f)hPp+>ji?E<<*y5NP4decfX%{J!sDPo+|?v7o&%UeD`l@R`7AePR^So@Dq&%bn@)`E+0bYm -G^Zpm&WaRSIzResjD^e5-MnX1-uetXdWK_Ce@p&q2eV|O#Xr=D|Ru2r9kp9Z%XAgJC3Q)+=}~6@OraZ -{Ji7H)9o5SbEW)xngn*F;^B!!Ru!Y6sFB$A2xKsQrk3NSUS{hg0!H_D<6dP%DI#;ZF>ENp2oR2<g&>$ -Tiz1`;@~C3V+|fLFRSgRl31m4BGu5niJwJ5|g@XBNkk8`emjosab$bQ2;;mUkUSIo?&XX+GBlccz9h+ -LYcELmR(#dyeXuPy!pOHrCQ+o2HxqdaHswJrS08|vR3pI5#KFn;`4$nxgbV;?!n#hp~WTBMIflEt58B -{bQU59(_ezyA(eV!Ll%s8MDrEF9;OT{<xOfx-c4ak_8xR+O0Ya!UHWf(_RpYJE7jOskM9HrCVC99^)e -$Oqlf0bFcp5x+e=HW8aNqB>(*sE{2fz(x2GcHbfHo-3Ry}e^}H?yS>2y!N*X!9zb4-WVvVfm-k9Ya<2 -4^H34GHP$z^<2^QVmEShudP3V2H-CjroSL89}0W>+m`L+1<+AT>#Hq$Uf<ysAamgQZ$5)7SA1d;3W7p -=qMzAYeN~E-4$4z85IR3=YrXao8-xvTwo+PP-553|TEcte)}`IBv~|b4wueLK`fF85A#1N=#+LW{%?L -b5e5exPy`39&!U4``>{Lc!i@x**9g~?D8u}B(iBRoWouqC5O2zrxO+x*tLg{7L5v){pTfztP1o!LyJ! -onyfOe?UtihIPI^qk7*d_j4uVVyPS5->E>%2}|CgSR7G+YXfcgn|Zj71eYwo!a}Rn{QTT01|@48fDH$ -jPni$Xc`9OP33NHZF-U(;S%Qr;8~KVT6*Ycrqdpd`|_iXBWiyidFiyWx>l|N|4NoCb~FPJ4+kLtOWEN -izS0;Zt>n7n#314jRf=MvS)#kTL4LDyM!k>pe^qDVz%rNjP%?VR&9aNgIcIS0L`a~g*WX<zC&u1$y?| -2x8@=y70Y@6L=P&-b0+nMM~_y@^K-d9NbwmbNLrBZ7Y_P}feJyNqm~sf(Idkh!9O{cS;KMvGJ%_g@!O -W?((B&5gRPOpeme1YBUSEPzt)r5^b&}oR#@@nCI?L3MCUWFLX%_L^U}Wnhw8xO0jY_+Hnuu8t>qvfeC -Hd>9$&@iL=n>|?yFwcDJ`2o5}t+Up?pkUJ?VZmvVCSs3HU}m`pl+IIjY6&wLM=-)bwWwjUnpZB@<Nqg -Qdd{2IAWOo8e>D9~6ZD^{Lf-f5TqiL)N^1v;X6_H2cl^5A{EeYRr$fxo`E9BpR|mHNgBoc9I{(o-a@E -Q&k5iaRkFKh{lg)NQl6`_VYNDy6|JcG5sJU2s)a@k&hu|jC^R{$syc|k{?ep{A<2Mezcb#ZAaum3s0z -{?sKeIevlzT9F>+GCGL<eqJA&e?8t8ie9)g2dQ$9I(WH~($mAmomVI0>6ZnwVIc(eLLxS~?T_q1-m`8 -`J$G$W5(VI=MgYuE1M{(y67=w?U_Z!^dDNgQ}@|T4k?Z9)(559!L=&zWRq>Uk&@XPjaS$ur2QvkoO@| -mXd2c85oi>@e)dxC%0EOX|+xhzU&W-tREzsEjbm`Dv}4*vi&PX4|$7=K&!v(7Op7cN?Fspt*K$~tPvK -EfRosgHTo>|{UPx7yB`{jNvG>r+yGGrx@dunQ0Y+7I~21oQif=V!t5cLgyMp;zGB+M@M2_z*Nxo$p#c -!K{5`dv<VG@yKVzvwG}6P+K%7S+#B7R&gxQ{UT`Q^86o|8->Q!hl`{z1P;H$&~LZP&a?Xc86BARbBW5 -CDZhha5&qXD%7TvX&!vtJ=aCgFLeVYU64%s<f9|LI#u?$}Is4-SG=G#*^n1D=@JI8@Ux4#Z5AmCi<;O -AeV6i}dtLy@Nue(ebf!3MIDR-sUmZxM2#pMMzugc`AlYEw3X*6JtX~s&n5l(k)+co8`OaW_9*)_xsam -C)}s@lZTYo$vVv00FnP<d*U5V|(c3lV!*XGRokvKeRgtAcj+i9<c$oxPya=l8jybr9ltbw@~3)EE977 -m$%0;z7XgOL!UG*d`%3JH1avTZJ2>@b4GgH5ouFBsfbrXN-wjd)H_{3gf|VWO4?tcDcIL8m9r$bhTcX -&fAkXg$u<c)kl9BNrdwNKEUpU>eH=s4IouP7ykD8f2#YEW;eBD>p8#T&58I#Bf6T=2m}I&Rx~sEz7q% -#zy1TAYnSbNT-UB!uOi;SC&C=G1srLwm6<D7+Ic{Djfa4=o47Wl-b0%k7sd`#_uM77MMxFiqw&aYA2y -IRbRb;`@FKPkNa*LoxzABq!nk&<xbN*$ze~Fi^(d+5_5g74ZDE7>^12LOgDR_a3;*Ph`sL)$&INvX7^ -v%hI(Z!U$kA9XED7of#MN^K=@!+FI$L@zgFO@vyKd3PsNNSQz^sRK;jx-)kJsr*cpWAJ2aMH-6}6ty6 -UtEQAWG9M9Kh@z@>lO7dQ5*hE8Can5<3gtKMO*(E|J8Y6Gwi*@GAkz7}Rqj2?^WJ*CSTnh*xq;<y4{| -yH?mcO!p-w3V!5ia3e8E&V|C`Uf<aVr+bv*0k5`cl&VF}9M1N9Z%#v?d6IyvRE-GAAxK84YVqJyWZ^O -=BN&a7nZ;LkXd*l+#sQFFI>e|6@z64%+{?XA<A%S0>J~F+-rN{)3HxWJ4EJHBGp3cQDLo97uwu#JrXs -omYjrrE%OiOd%eB%5wKHW~<vUDf%D)Nz$bSR;{}XTWFTwviT@pgTFissY7=kHk`+-xRY9;-*_9!8DLC -?p0>Ah<VdruIBcU5%o27c_VN5ntR<pktEf_PUkhrzBu+K9yNBTDUR$PL6{WJmpdP%6IXa<+x3<J(DQp -V##h?1zXwnG{odpBegg5QT%cniJjgLK|N}sa;Iz$8UXPupiub0QN2iZEwFZk&Qa+s?6;)cvo2NR-*C# --r?S7{a4s8$Scb-%vXPQQS#5pYl|0b?N7~D?_ACv|9)|X0p8{;6~lZpzj@oEye}BP@EmRYQ3O(0_zw& -;819WghBgCY`iG+nGg{vukQr~d=h^VOi<Lw{ueQs6n(T3r*6r;+N)gI=gK*$0K%TzVU<%jSUU1^!NZ2 -mCezT14<VD|N<cC`G{o;4y+4yyuSh3Hx)^@CaDaG||RCDD{JLWIfRYa7v@^>Eeqh9p4c@Xf02>rV}2> -3#T{#_pQ&xiOY9`sut^=u;w1bgYFT#{@p8q#CZaz;-Ifv4FPrJOFOtHnNUNK%sV`6biM1riliYe7J}_ -i+><*VmH`2qArSLT&isET<Y~x7^W3jk)4QajK|msZYAqM>BqBq2+?rEIF1v0E5&*%jwd|7%tHXr{&x$ -AC2wK$Ld}#1FSv~_uidF!gT$>KyM=hsq_N3?sALza|a-=zPcSAw?U;qKQAb0S;ZkPJMtbqJ=xS|{XTM -!<C7}`(V2Ap@FZ{U+7e;#Py@KR0Nm{sI97c$Z;~^3`9-VZFnS)QDdOAyDno2AqSxS9rD<{E^W`M+ey1 -}$O27zo_PZGHS6o&m_bkKVsT>~gp+i|b&ex4_%5-t|Fm4gkJV6CfLJY232K~0hrq**YP4;YGcmSPM&` -gX;ji}H*qIh@{sw7X&S&sF^A`2Ohan_v;1#diJ(~1yQ1jZ{|6C0V$d6EQLTO~mMb-sFsHSO?Ho%>L+Y -q|Cf(P*)!SE3U?XliVvnM)%)-=NN&E0(efsL{MCKuWF7NuuOK7#y_+f+uH%J*pJ7-lq({ELjXEccU2t -SiHLuj2u9AOdl7zeq>rEksb=v#f?^ZOi&LAH~2R}A%oUQ5$tNbdVLUhy0Pi@Hk9CE_m~hJf+jprv~iK -qg*Yxz29Q@s>J3hu(z=As*l8xj*(mb9k7sv7VfI2jj}4QL$deIxd{v$A2meICx2y_Dj+rLlR`YlTs<% -)zOM93*&+bF~6RG-gF7VmOzeB2iKKMt%_$Hl+@p;H@Lq<XxO|78ZGY|W9dklhsWH`j$93Z-c14$Qde1 -AB0Yg`cKveEvEa!&BP_zu>Cc9FYHL?@2{O`5Lkl3+M_EJ<DSzH>l8u|vzh=Nj9$GEs!Z0yFx?*TCj^B -`DBTv_c#WZIusDsnp96I@s8=YCDW3ya|~b8Q853c`nIrs<XPf=VJ2q<<W+duu_`rfa`*`KHoAaD7Fc% -5B)OLIIVZxL`m)f>khz*+dbM0YT%2PF}+AesBEHzgMp`2PS&TEwCNxdGPN5Q-p*R4fdpYJYY(De*|<L -7ovDB`6^U7|1XGZD$1k%gI`j(Ov|hZT;5gNbyR_cIG~HbsNyYFA6g)uol#f<o14zX3wS`#qOvy!jr0p -_{PTFnI^nA*QXyUkDeGP|@CWV|0i|XJq@k?M>S|5B1?g`+E`{*S1CtSw{Vbn`x)VV`<la0f+ujsA@ON -yL}V1|gUwO!u1ex)S=M}}D~Y;$>_fDz9Pexl<6_a(8pgp>xYBcB%vH$||}StW7w&E#fQYC>l8aL8C@` -@mdJOVp1O{a^rkAY;rkJ@SYJ$Z4IMc*%HTu#`$u=)5-1-9@09!-QcX&s9xSYw1&-`jF;jbFtkHz&47l -U$omrJek+fK?20Awa~oF<P7PCqiPy!t5*A*JKr@S?9xaviY%a^48?(i`6mEBXX*Fp>gj(oNA;gt{7>} -s^kYtn!j2?zM5yD&M@byPDDqQdoqa$L@(%>v%Wsgsi^(@8NQ7_SXM9gaQExH%c04BjfqyQE-v=wgdp{ -n9y$uVA{dM@;fjNQp>=XPp6WnbIf_JA+u&1qvjm$<rlf?VGr4II<2lU}$un%HHcF{Y5?e2pl`TiO18v -czq?{3a-x1EjdZcLbb4`__zy#;W)IO@YPk$B(ZZj11jDJgMJNzLD+q(p<2c`|gzy({h0lvMbCFeSyW^ -!*DJ<GxEto$ep0mye<)qHyB;K|jS+f%lrFi2YHsM3o|)uW&o3-u!=%nmY<(eWB*J@2I(MeWc>j^z<_d -%6w4J(`93zd%Z_3Kw2L?u#K7^*a#725$LtJxR+5U{leeS!CBR#2A?~jxao=>r;%b>-F&WxP6Yi99l5E -3>Jw+G^Nj|WR-$qFoOiI$oL!~%@hJwgSiew(@L=$z$w~(H;u=p8bm6T;LRW*m-jVaGyk`)N0jQbrC&$ -t1K7@|);rimm=(*7@F35=`U6BwDZM(s^Qm5{>!5ekj=$lI&cF;@WkGCh#&U$RMtbESI>ZCUgcZMm&(i -wbwP6M+}X+#f;*JkyKj#@El(j*US!)Ht_X7>|z0A>#YlNYO`%FrWHl)pq}EgfWTt9C>5lvq`<8n&k+g -UfZ<(292+%~)-bbmECd;qibs8hFhY%okDmdxF9DuF0pSEZ|juMfk$V$pP~u7UU|d_OpUcfFFhu{Hv2c -oqzy*CPvRbG1U4<N1kZLJi-ohpKG!?hX_9bVLn-Ndw6Lu#IA#3Jv~iNktjOW(GWTQ;W@wh>)?+%b}di -_1L5)bJUmNp`(km)Vj=*2Rt7sbWz6$TJed5>UDQME1?c4!2e4r(=LltPPuA6C?u2m|Iykq^V^`!%^P~ -#HJdlMfkG*WQie`sgUx`rT^XsWZmuIE8hqiQW*+v>1ISVUHXQ*`<;d^--`jZusa)m*_(29BIz~&iphK -&bO*h{o=g=w#2A&}Pgq32}m7@hUA|A_m`Gh{B{DAHJ2pODHY84<80uQQ|hT=0U~j$p#Ai0sM+TllSL* -4u|oEoJD*r7Azg&iT|xp<HjzT|V*Z#{cXb7^Q=Q{Z8%4Fy#Liw)G#KuU}y_Z<~Jt>Hp{ky@Bzr-rX>? -Yaj35|A5_pYoRYV{i}<7i{K<lVE7S2sNFFSg(2wk!G9#a*J$APXg>nlvodkG7n1yU_v~I;3issAZb-N -HmwldCBKBc_DEgig1Mk}1<8d$k1peNLMnZ2#JAW@Q1<^kC27M1=fWi%Xe`bw`?P4O_-}6*RypNO!;=L -{vzlZvT@J=eocL&`*2_D~zRYbfW$D^Gn5YgTchfw>a5XZNlQL?x3!ta(hocc?V5V|`Vk@nZbQv7-a(B -jidSALpUO1K|HLhtt1f>yp3QSN#b3;e3+^hcfljo#4)2pc#FdqeIPiTwdu07p}AeeMoGp+LPh;OPS7x -JA13^aXG)Z`mnU1PJui_2>&&13Oy#Hud}ttv0x~pl@qK8z7tEdNUPluMJ(_=Efh#fcL?IAwTISz9}0S -`Gb`3cj10?9c4LjAMxN0$PAQCZ~WXZ`JYPaR^i~cQg*{fY2N;2kx=dJz>C6?Uof<_;Hx6n*9i!WuQPh -S1>pTTd{+w+dCAm1aY+7oTb){}sINSdaMCUlF?dJ2#$LzZ*(BNVU{Bp`#f=KlfrXFG{*s|S8oUnP_A2 -eb^4(GPhO1pkM<+cxxBK((;wOl9Co5;~X6xzEO$(aTgnS3+vq^jkSnkyI;!s0RHv}0dk5!9`5xNzmit -r*4&>YV|8dq)?B9Avh^s2)etWF)W0E;2Q-9A(CZW#9zJz9>Y_Ri#yqmixp5GC&d1x=eThcs^E+Y9whO -aB@oMg=P))ldL;?NWJ7)N%Cg*YoUkr><RyOA8Un_MC1aP72N>uGl#$^NiJ@W!5OaFT0XlA5VVDfI~%A -eWANA<y71yD5#k;cas)Sb-kg}C^~Cqmf~mDd=>Je5w?x_Au5NXE}2e$kRLqYa;TRu#eL`-GjdWc%;n2 -%P!i&`R&w9qP5weGE1({;YU4H2;;m(0>nD%v1U*pb36QQY`qJ`D;A!CN#!2b+IcX~VkdT&GUqn|vNn7 -|>O*b}@&6a~ymp>oHjKs6`HahnZu#97PK}kQ%i-wjRJyHS(lfaR|Ziuy7@PSLp`QSzT<CujMZm?6Hx= -2q}oz$ySP6FQD4$#TE=7xJZu$JHD_wGeX<EvS7`wlvf+qChPoP?LrQ`t!&vqmhDp>dZ+J>1F~0F`d3Q -P4aTdXt@S4?n!tm@d~)?&_`yMgdhHLT_CcRy0LPx7qSI1SfnsgkZ=9eGVw#2F5>SFlNNi<++{icygD_ -Q+K%&MNUf^QrqTF2S<EJki=PY6~?FeD|BMDIH#PBvMR+WJLh>5>5B6`@6&-#KV>lKi58huuh@o=Iw(A -6*z6|49SFPYB3<CNg!7xylfi(}-1aaZk!WkGll7Eb%bgbzqn_)}1#du$3Cg6p*FG7aA|?dRepDX`!D8 -n5b@PK>AQ%i`kT5)%MLwb@(6f@f$T)Qt_|A$O)$(7{&B}c>BARPD0BYK1FBV!K@_|pia)}fk4nrFp61 -vb6Bk~Wk=VC}P(WW5KL-mAj5=Y!<>x%J2sULtI(~q81m{eXw8I{eRV-nn>G;ussUB7%)!x}$9xG<TV= -q(OydHpGh*%IkRA3rn*2%mHzp;0(?T%YB4x(CUXBcDn7z;jWZkkNpAY`E})qp2X7Rdl~Wx|Kv5`ZE(% -JOCeGK=ip3%3`D9oU2O;UbXupDh3-Xz&o#^MerQOK$Fj4XhDagDCExyhX}?=%WW$K&M1-Hy;2q<+-%Y -Zf%R8u+OXj8jL@NH;EJ%u)J+}F;83Ka>4vO~m6I=5XN9-z&jl`20!#HOF@<6C&u+H$_7yv&Jhs_^gC$ -W7r~$c1Cwb&=BPzMju{5g$JN1Xc$(Qj7H1a&O{B-wIc5>DvgOgTcu{_M4VO@~KObGbpK0oOrgumtsQ@ -9?B-|ZBQgdQo!X9BeDK6%w@xaSLLASuO!gdL-fVM)`>ky9|KZBiPOqtj9R%<BOOosNL7qWyf*q>;IR7 -$P%MIfS%QW_e~ihQS<(_>IcsFOjhm%l>Dm;m;QOEo!(e@*OoiQW$}tB#a^yfx!3?`8>H3@74hEaj)VL -$y?%+>}9^_JvWeg%Y|TKuiT;jKggd<^g?&`wa<Zm&y|kxUHr3;j0oO_3Bk_FC~Vhx$H-e|6z{5T2-&# -bPpBdKHbn@6y-vB?EJJVW7k^)IpIR9138}qX&40Vb#Cx~d?#qDeOCSAR`M&*jpZfK21^X<rw<PL4wBo -O8j%=}$jm-E;4Wl?nUL@bzcsjGGEA9kjEuejy{EimxtPuD+v~XvIz~7;TJ1Yb}p@qB#DL>G{bh&c$`a -LcDI0pP3TKI0!{yVgAXNABo(ZW3iwSMj*1AMiSIo+TAojY~8f;1J`Za5%Uxm2puf)^R8u<|Vr4FfOA8 -e^F8Tvho)_8bu)yrXyx(*{4*iUk)Bw|#&lKdAo78!mJr@(>*e*}n>r0x{H!SW@pWm-d}d#zW7lDZs`x -15Vd7gkK9~dxYQn7t4C)C^NQNC+K)&%W0~*>-i+c#r2DJ82GW{=*NmqItqNaa?MpU%_6-RAZV9RsAae -Uy+3HcpM}QXS<bLD64HvGv5IhLaJbYvfm7XpwPO(CL4!1bGFnG0Su}s)1^uCfqQ>M;g5WT)xH4FSaoQ -M#1##+AaXu3-oCU>MQb#gynLFE+Adu3~irIcK;5VX+Y`K`rp{ro<IMHWT$VRAHx}Z8FnB7&sy*Z!me; -sk_$S-fve`C2HH|k$o>f7xaM~)<d5J&2WV#xLb#Xj}oi{ECwD7@#aVSkrZY+Eh%-b|DCM!kj8FuWV$Z -4ol{xjb|WmbblpPrD;~-aCT!>90PtYcjXJbMN(u_6+$J*l%GxvAf*t;rTvk=x5tC^2LG=e<u_+3?Scw -7K69r%x+YS@B23K9$bXOdzX*@){O*j8yzIsWB%yfRkX+U@$R{^K>!8sN%_B)hw}K|2TXk(z$o4yZnv5 -S8LOX4z~*fS|1l4JHx+F+e*2P#zFVG?W#M|#{z&faa>%nGP<!@w-@3lGyaH@GtNY$1?)m42*>>EIz<d -j`=j#^*Ba7|P{?kRMaoe`+uXACMy$koN1oGXc`fdI_wW_`OM*L!Qyw5b*Q|d>>)Yj`e&91$G_d)LK!S -C+xS8fmZSNHcTw+H;I`}>vK1Af*>^jRNKv3iwuJKJW+IpeJokb3F?1xl`_T2V=WQ?iN92wG%W?|9F&a -{L?Ys6D5#CxOFW86z==BFr3()*pn^(8ad3B)~0J)x{!&vWDuVc@hKFHjUN`xO+mGgqTC;Jj~15xwz=? -5;_S;VrF-XrAJSCg^LdygEJbem*f>`M1B(5Mn>hH8pn7pleS!5<+XjV>Z+=|dGltlU17u)wCQw2<;Nr -9Dd21*Q~4aU37#G|{Gg^+lz}?;WTPF}T}twH_Di?L)7zcsBa(_}zE-__1{wTPFovrGzL)e_5UN!=%C8 -fbS#tZ#hY97dHpfuVzb@*PEFsf>o%LCnbF$|JYTNc3rOU2bNCN@oWh`^<pN|5;gKLUe2u4Vx<qef%U# -Dw^G{?Mk4H}9MUUo$u=ZLzp2A`6s(|0co5IQoG&(v{5j3aW(YwDb@_wadw3i%XY@S;G@(VAxFBYueo# -wqI*tv3ij*Yc%48SM_J_9e`URG<ad!1xNWE0w0ZJU_8xtDm2@I6SUK<M;OQWDA6SL9R3%!&pAjjh)rX -4d_z)ZUk+cA9Hgkv=F)I_uvtR&=vRY+YySDQ_!et={cv?ISGvPsZLLeb<YgrjK&kNxH9M2Kpu*5jrjY -SL2Ksbr}GIiD@N>}Ri;#03St&%1P28z&(|Xf_LI$&ZQ|j+3n<JQ$=i2DknWB*1P4bPZORG13_f^sfuH -Ctl8;FKpZ+zND^J#uvLNbFz)VY59jXR;UAIl~y}lN-SpvSP_p9n30ZQ{}$&Xe9^15C+{$|q=V*|sHkl -7BFiU(LOl0bM_$Xi|pgW!FOJNuZ_O}wXW7j**li%S(bl|%hq+xQ)BX88dFj2b;V)7=5XZhL|kP@hR;i -Ku?0MtCm6Dj}N1J!GwX-}p~*xegaoowy}FqeavCbP9wreOiJ94f`Y(Q-o4pccBmrLwYKpT;FV@dn#&@ -x@;73>lqQ!CwF1!NVl%Zp&Ts*AgEqwu*SiOc=B%|CUpkx%kd$l)IP35%B|z46yIO?O)iPc(V)uVp-P8 -tIC1NZH&);fMD6SP5DNH24%1UdnYF1gG#h95Re+arxl~6m9;}DraZD&xHzRfF;l>Uf#80&|0#!v-5w{ -YoX+2|XHV^usI$<=XW@mHcOdNfZm0y=ZA38z3(4l$tP9uMOI?TOh<5LY>5<;+Q0UsRoFwd_LvzNZ&Nb -6P7cIBF@?bm|?Em?`6`i*?$l{V*H9W^?OV@Pzl09tUZS@=OD#;qc=em+omkYd^sG7m}li1o*85ndRlf -qcHYnaq{UR7l|wngj}s9w!Z$4<RoMoc%!c++ZTKtZU8H*SK;S=q{4(Sy5M-Vh`Qv3TKt##%cRx^%-ff -GnH=NLBOC+H;Z+m*Q_W!S#va<-L4jL$w73cJH3`q`r(CHO_jwXYqG=GoSdK?94eb7n1u+SzT6iG)=b3 -aR>~S{^YB=RoHmNU814kmySOk!eZzvk<DUAfH0^f+{C{_?-=&T}g!w4E+Zk?uZ=Ar67=|Gv_8D))sGT -Ju$lHGfeK%OcJ9P}9Jt*G(8&G@oW}|w^Mhc-%dE+tMjao2x53eJ5*Lxsu>IffqLKot@^a6bgMRo-R{F -W`_``Y-=G#uOY_{d(-*=?nx-AiU~RS)+gF|l7^fbFbwpThn2k|D{xFMQ*Q*n3_^^tOsVzAI6?0b;n@# --Q)+^?k}W`IljSwU-RC{wr^k**dhBU}QY&&td-h-w5-!===3G%!mIO=IeL&mn%S@hx(@Yr%)ewA1s)| -f1?5fDV+Ev)PH<i0pjoZFIIs*3HO0NxyD{vL&sQGI84(F(dYEV+(?sU+ceP0?jpE}jEHt|p%wFtmkJH -s#UMQBhlG|h#;w*cWZV~;fgY@^JVU1989CVue4>*3e6~OZzKLtHdIwKV;meqnPrz;%pLrr6c@gH<NJ| -(0lW?D(F3!`5p;qWuKOH?@KoI8=RG_B<KQkElG2FMwF2*9lNd3pPXW`Nc0x#^I4uF+E>nr{--2cO2R% -0(%$x2sn>R?^<fY+!$B=t6{ZY0>uV;CZ80%0Eyh3R}#)^>0gl{+Mhhq||P9}wx1tiqv)_)2S2@lqhel -)5HF`22X-)Vk_tg}^2ARSWGF3mg=KL)NF~KBNpUFa~7ux?Mu!Uzh6tKTt~p1QY-O00;n48F5Sr6GBI- -0RR9*0{{RU0001RX>c!Jc4cm4Z*nhVWpZ?BW@#^DZ*pZWaCvo-v5wm?42E|-1?wAP7Z<1PbO?~8=mT^ -(prfEzbj(&34M~oXrO#f<v3+UL(;|W*KmGc}rw@lQhQpcs0sR$*Tk6=WC)j`7L&KK*<p^VH_b)l4R8b -VF!H}q>dbp|I+fwSaqX<3Q(IEs(WAG7Dhd@3i<D5yv9vnCKfLmxxCe;J>^~|My;E;gh8cim65fGJ9jW -aRAHyi>A0PWY&TZcdH1?8F-@RF*I3S?z$-d{z>gyt7SY{o$82Im<7BKeF`4|YS>@ZF(_2xk`g0d717= -?hnCaE1+muVm#UF<da^NA@|6i3b>CrZs_M+(){2v=Eq6tT#PMS!`hvG?t6Z7Ebc)dN8T0Ed_6SEVXXQ -q1Kg}OYV+tRX>@0**?SW&BR@`pxIgd7k>4z&Ote+W-;%&(wS@vdbzddYqn(l^9OeJ&hrGugK;Ds#Tz; -Q?$WVTZ?2Am6_@X>%79^ZZj}5#_4C-Ek*goD|5GuMb0T(?Dt++f)907Ec;5Qn8JqdMdUSVTDn%`5oxe -eAIGtdpb#KUPy*n-wKt7dAb*26QP)h>@6aWAK2mnzTaZK>f4^!j<000*T0018V003}la4%nWWo~3|ax -Y_OVRB?;bT40DX>MtBUtcb8d6iR5bJ{Qvz4I$}!XYr@x*?fflF7kIOyVgu3^vVh0%5O%T3d1@If<v!| -K61`Q1UU8>cEHe-qYK+t8Vx01y}xU5W*<9_QS}BtI_!SE4+j4cDfL+xrUst6jL?O&rBhLmYI2C3NN6R -6(mf6!jx;H_^L7p+yE2lXQ_x^$dqTb-Ks>23d|b8pei)Ttod^r&R~RE)7dQwR4j){waR%y<PlF$XauI -Aw0nAuDXi*-H?&5g)(8wG$uq;HxB%pIZts3XrD+FF-NE*@R?z{epvR2$uRxZT*eBC9<c!>HnQrH;2=< -kxz(pgwmL-+7CP6CniRU@25GsvXl{=(BShx@3yYVarFPy`@H=TN6Jij2USxY*_N8Bj!qRcr7Q&oxyQ< -HHL_~uWq?}*`D1*0IITld2t4*e*C;dlxjOuT6vT+c?{6ehFjWE}Y}K!muB*oOI5$h(L$k}M=8nWAAl* -PGJk)Lu;n^Ay(X5vk1y@<+1AAdzMLUp>sFcxdV+%0AEw;28*M9C%WkX2;0a-6fTMe;o)!;yUnUKp-Z5 -=G20S=tG{7^e~rFIdCPlvCwZGaZgSMgOg8#vy%b9ETWzF7Wm=K2VX|F)9GYN7T_kbC~e=1QYr(J`Kd! -6XYFAnxE&>yQ>vI4%DBbNwg)%uK}*<<Yztc~+Kt7+f$#n_3dSMboMHwW#onqmxS)CLpLc-P(a}-!y^( -FAM3K-Nr0m;fJ#af~mIro@#e>^vDCZ?ptbncHx!t4L#}<meDpG11gwL$t0^JSG)Fr-P!E$Lg^m1t@b@ -Rv0bG=+1xZJd!-V_(wFjC)@<G_y7R`wCR{s(K9Vw@%~CWF3GQuU7g=aOQf`IW05HXj?w*1oo0cegt5A -k8@(ALzYY$G=bh9J};%3TAp%Xy1;0f5*gJ<DsuD3NH5-?x_uQH!zp4XQg)taWlm91zn-3l-NU(TxulV -Ur<W}1QY-O00;n48F5TGzl0F)IRF3_dH?_)0001RX>c!Jc4cm4Z*nhVXkl_>WppoMX=gQNa%FKYaCw! -TU5_P2lBVzTSA^7BEiEMw{vFZ1GZN6yQ(79>qR^=K1{GCFlbWKE$toJLzkcm`ENXkDVWeFylB|>Gc=( -68*=w)8?&o*E`|ba>k3aqMlP|W<pM3J^7hiw6ef;^CpZxdjKY8!(Zhp5t`{8c;^6~y}_phJ7+CF)BdA -Hra+5YnIzwTeXdLIA&@yDNE-@kbN_Th1R@#_BW_1o=5yyt_PcOQN7`u^>GeDY6sf4_V6@YCJn_VE4o_ -BYy$_kVHs_RWjuKi&Ob&E7w}eiQ$E{ORG*e?-IER}YW*`isZA=Wp*`Zr}ZCi~sRa&mU>)r(feyKfK-E -`{egqInN`S_|3O}uzmFE)%KM4zS*AMy}5h*``ybN$tMr5-#*@d_j3&My*I!AL%gzWe|i4+Z`)V*um1L -U|Ks-l7Cn5sy?xle`t|J(53jHB$5g$#|L*bm<FCxx_m6jX+na~)-~JLE`{VZO!_V7`=dZWNyO;NGviX ->Zx7+jAFF$;EjL-l0@bdoqUwP^0*Dqr@^!n}H<BxCN&EcQF_-6b3?oIS``}5uFyT=&KS3iIE>i$K1`1 -AW0cdy^vZO`9qKk?d|AO0~@pV5)8ua0b=Jw)@)?jN_i`}jN0{`=kIn|NibACz}byIQ>6Vy)kM{+9m7Y -W~Cre;=Lxb$b=7@%ZkOAN=MN{9~jqxBJ&N`$Noq{1OeuKz|9d+P=HnetvWJ{m-v%qlI|y_ODN#{mYl% -Jlj6{;;-Ake)RO|M_)Yq>mTF2G1KwaSifxP{>Puf1Yd43s>kQA-~JjMj|Tqo>C;dCB|h=d$4@?g^6an -l{<9~~zWDU(ueZ;>e7b$Kef81PXHP!)=JSu9ZeM-#^s6tw{`7-w`}*$g-4rvKzctDKXNtd%CVza0nS6 -Qo_WAv*H#zjb#`3<24!(N1{qX$ncd^Vb?(V~)w&$@$e){$QYYksLy#AZxjgS0eLjSnkf4{wccze73@^ -~M%6V~@1RySJt$NJue(ZBfMb{i$$^!)X|y^1CHIzIl{{rA!IXRjU}9&fjgAKtv>t$+C_KD*aa_V-KM% -eH;<b-ePQ{kMJk#h?BkoyzZSqT!G4|2EhV|Nisc>la~_&%b*`U&BD3J-`3u`Ro50P9`?O^T+7oSC0=r -KG6Tzhd;l5asMjb_}_kb`}U_leE8unzx?vS-OHapc>BvAj`HD;@sY<5|JnI3_1L!e-~Z=r|De}8OT1L -aeD~5=$Ka(=>bsX#&zH(x`}NXswxjdGy&u<0=Nd=z0Z(4u;XdA3H2r(ZG;ja(uCWi_EAL;w{(k$X`hm -XZY4q{o$KUwe>-b=F=fn3#-^=^)+wcEr|Dfz6H`1>^g+Khw$36d!T~Nn=!KAWN53ggJzIn@L`tj!%KW -smQQ`3QjyLtMjr#CkrKl$_c_Ss**dh*FfpMU$OCtp8%`sCwpo;~^Ui*KKP6#vU1j992oet7<fVTDos` -<IV;A(tu}_~_%$KmGRWC;#(Py582j8jk(;^xJ1&e*4+ePyffaUq1cQr%&VW@7;vcEVt#@<Hy+NZFG6u -mfp&3xaH$E{(8obqw?Fl9s3@ym9^r1d%bP*h>yhr-qxe?iL&2rxZyHy+EIFZsI}WxSNs->9sgYMgsu1 -6uwedL;*)2OALUrLrSR7|&f9h_-dyKx>!aM(Ia;>c>P?|r@rHPM8~bgiA6t(H*ILHy*7)Z*qaQ6ESkB -2~wuAoi+c<8c#hrni@z++f-G0P8%oZ>Ew-QfpC3-aN<%)J|jklKQTRgDc*3Mu1;hUo;BPOlwXW@OF$+ -+5`{U+wf$!iREr{^s`nd3We>vG_2#E0gL9`)$?5pUUIdoy#f7^OD4Q+d`k566BJ!-$#L2gBW24}RlW@ -vi7}=`~toMoMM&cV~LBBAx!m)aHyZL6hHT_nbHJ@#xIJ9?n?j_`!-}6er`GeefgxI(O`$xJL2l)@XdO -82JbOd89qW5N=|6;~%vhJa}MiCq@wiI$JEoepc2w`mv&KrN=zPYn{g9ExlufGv@1z`HJ-|*=~(>D=S{ -!&oCWlwb1=NCbS&g@$D@8&L<g2j6Ql5PdK8rZN)$1&5nUdd)MFIZ?^Ls40190XgqdOw81}TG!)}ISd{ -2_i_vV0P88;5#O&9$7~H9`F*jj1wmbKmm|E;1EVQneywYMuwmCJA=>AFH_A^==3_KPtjIA>+%xHwc7C -siwxBF>lv2kun>~xH?N0ZS|tUva{jt<j^9$~OM11T6$izjUDz(xkk64nw^5bx{k)lskhp7kbd(5b~Mg -#Cm$vrVG$Xow|d-%r{-!n#X6W0u+;oo;Doi#OB#YVU^a);-p3(YJ1o=)#O{#cVO=SjJLfeq&`8AL1?D -4aUqJ(Z&($8=Dr#5z8GGKC|80Z(`uITVqyNjWO4Ff5E0>+37T`O?Oo6<M?Z#gJFB|Yjm20Y7FxzZu+# -d+V`6nOPDS@HQwKtw^*nWYZM*S)Eg_#YcaLaRkkqwoov6baXyCa#k0zRXQkaSZ^BtL+Kq0l6VsjXV76 -N9xme4=J{}Id@|fQ66!F_ZR|{LmIXuG7JGN)LEB0GwLoU42$(ojlUB>dnvoPY5@r9u@COP&Gb{?<AJ2 -d-)#fyQAXgAjUYWFy9;tfOz_YofGJluZz<Y*|?9YZO65+}iKY;3DJSx`L6#NypGwdOpuJ=SeT2V(>*E -aU6NndV)y@`RIlV3HdH-)#fa-SHIhRKhf-z-ZRhZr#J5Rklk^UM0RXRx1V+-O@4J<k7K_cuW|(Yk9;j -i)9G|bX*6^jdL%#-&&hD(Jf7vuz+{!F}_$>1BCmYokwegws`)*OcPM`lUqFhJP9AwaF_e7jT-%Jyi5R -&T^eqnIxRXMeW%liI~+LoPLs>G#BZa!FN`o@Jo~keW4z3-D;^7QteCP9PY6?pPM7c*;d%!>r(Mjn5MM -{kNH`>dR;*zBv+=`cUF`-AW0vD_bnB=(9~>SJ?gzeL5}66&3wN;&p2c1XQ)Wg^!np1#I<}5%x9@xSb^ -SFx>M^S^BjSyT|KqKM_=AOFNMS&je|6^UCB}mXiYbk;*7WNgTr#6uF(3gBz7|Vf%lG>u*6ob$mxC3oE --e-pgXOPyQGo($xz5}dJ#a}h$vhCr1DLZ@F^|QPEtYIzg)C^(<q+p1V8lRTgwgYYe-bbeP4FnR3odCf -tBsfwyRr}#jP5(W6JrywbeoLlx2bm|`VfjS-Rk}ste~EPb_17$Efc(0(|O=U@QG75z={)l!9`dXejR) -4_y=50W#;06IM8@s{C3Sl;F2&<`iAKYR*P=M6r6Z0b}wDXP<-eb3_N%Rd}41{?O~IHKjc2{flDITVmi -dKb+Ey3+Rf=^$p+v6UmrLF6KBH=yvL&PGV!|6iEu~;`?RwGE~y}}f$u7;_?k8zLz@wY!q?&nWAUOjqI -E1((=yIjw}62dMJKcwyj$Y45xAt$g^tIFsMpvCK;`IkXGh0l2)5z}z~YLj>hw2S19XMK7UnQI;m*JM+ -wqg`hHfuGN&wEzBx4k90xTvg*y5=L!wygxo$k|pOuP~R?5_URZs3vv;EXK{h9*?t;S0b!mKYax5YDGt -hbTepHSE*rSTe$M7r!vzJ>%v8mjE5MQ@23`i^l`afD?r7eGoJbCKSlWqhlc8@8yg*OuEX34O`511D8} -=V?bd<45;ZE7=3g#o-lDk4m>_dEQ=8m?qaF}R$~vlud!<`Ts^@hF)W}xy&SGCkbw6K{11|niiyY4FmU -`sb>?ty%P<Z|tIk*2Z(x9%&Tfx|A|KKNn7kO|2rZrdR@`O_BZ>|JjCYL<A4iY_Oa&Tdgd^u+1}+I(VY -Yw{Yv^1DAJR1dbJ-k)RXvN*?_?7(wareDFT}HAAL2(w?&Db4h(p7^`Btq9{|hcDbdZdvu(z6KN=_9%; -vf=;8n988wlJ>Vu6YPtQuSh|?>}_VY<VW?1YqG*HkS+(TS4g+uiuSaIfmlQ5tOgE8QwAc16Hs=`U@aC -tJ_ac2&8QSUce&ZoDCBlB>M6E6SqlsHc-n}uRM0`#J7_LV1CV-#&V)gj4e9Y-KlypTq)^E49=_=S6Z0 -|cAok1?1>*%;F1j=Q;B$Wxo0&to{ss)_8a5|1j=d3%`~zvj-~Tqa749<QO^Bp7hJ*~i1%yxootLznLi -Z(EC8}GBy#3hP<)KB3HUSOW3k+gG2p3M+QSl;OkO7Qih#lUjYI4*fY3%laq!d`h$<$P#UOkfJMNW8fW -rr)6OnSig|Cfui$!d};)V|$;NK?D8oR!Wys)y^bd`8fNxKFCbpu(3XRRz5@%Y_51THDLaiR+`4|*pyW -YPva!AyCwTBnBHao?m&hr59g&%}qX;kUH216(o;GGWBs^q`;a0mfH!B{(|M&z&b2Jgb0=Bx8XENmEw` -Vzk`H5l|vO4l5|4EpgOZniC7<+T#R`xa-tB%zf~Hh8bcA=~+0W=*hfr-_ck%fB>c&zcH#s%8L^=+a^g -4kY#2>_DU*tGMY6+bn$#Rp8ztzgCp_75x68igntO<UWuUL^$3|cX19rUNlw?;y%_u1NwIbfixf+*#0m -y5%60>n5ae*U0Q#!K!!-aeXYMV>uvmMTA*SVIT3W{_+1stV{TTJkeS8EiX;*(wRx27h+{Zj!uLms??~ -7U8g@)apv-UdcL-xn$Cm_A%A#h2rCV1@j15`FTO*TNCm^5SW!D{Ju81n)XPZqgj*wd$0W-0UI*nBr(N -FCgzDHwAkmQHL{!hy&Pt3%u_yKNXj2~eaKWi`_naDC1Gp714Lu_jfq0lb;+Dggunj4{&H2DL;M7L70l -qNQY)$v^RRnD5T?4<~%dOn*YWz{hl!F$3iQ&mGMEffa(cmhPAivJso~4UVJYLc%pAemKD;7;Gc#Rwge -#4kYL{$?`DL%EX@o*C04LjWG1GX*Vz|hfzK4EK*q3Z9#X)cH&Y^<sktGeBDe+1lY+k!@T(`kgvNK`T# -O6Y-wJ3%L!l7CvR=UsKzeSW3oA5Knvg?n#86~HbQ4cWCsM&+9+uW(JT;#{)`<McryCiz-~pq4*m_7bC -OvTl%;V1rgPbSY?Wx;n|@uEPorc;&OO@=ToRpO&z?A@lPzQl%ZGMtWQ%1dBdEHeCM|+_;B7WCo$#lwx -v9;_b_18hhlr$&StTVSwJ72ed`$c(v?~>cw}BXFQg@hG*-aG|zX9gT)!#w>7QKvQlF$wN0dVP69?uy8 -4$F1mC!<}4ix0=WHE9lVo-z#r$(MwQRr(7>dir!9eDDM4OW;Z93t7OUH#*oPoDUp1ux`We#AM*4`kCz -pE(xQHg@qX}kTC%X$p6_}tvS==0StGNo^;*<R)|mdgMXT#N}3G!1sVHIbd`~I{f>+bmh2?sz`FS8G?q -DEkS0c9))LyFu7opiu|3x<9Lh~0JXTo2*oy=-d@Z}Z@xX528Mt2f(E*uQAUYdqNx}bCaB5p}fEnlGO% -dNVa$z0VArm|$=SU`b>%Pl#`2^+$=s<c>KyLx#q;FtY8ry&5zKFy=;(P@s61o@2a%DonJ~sN0d!6zRB -$GJRSR-%=4wq!Qor#?Z3@h!d1TN{rc_<FjZs|?UD%cW*EGSI3k^XI@q?LaTlE~<ewg(+jjWyRi1TKjW -@k(s4LHrKy&F-OuvhUIX000t|NS>HMyfa~pLP3Rj+$__85!!`!NDm@zVkWIRW`IDB6mkwYK`yaTYH6_ -K!(aqy9e!iS(O~Rkqt~<?*)F)G$Qv0CnWF{ZBrn^nOH4CLy!kT4lWuQ@AfCX687wl$eKT>U-9|lt>~& -7b8;L`yL3%`LF#&|kQZ&TwWtZ=}M#-!utir^B$Vb)#Kzr~HoyX~&Shvn<fz&Fl*V$ii<D~o>-nkaRT$ -gpmcM8IbwEQ){flHzd*xaJ8Wh^9HjUClo@ujnb`vN4vV@4;KRiGqZshQ=%C)C=m`3+oBx-Xlu@Zbe4f -+KI__@kI!liB;)aG?nCnONmpK-h2xrC#j@E~%_rhr$~rHy!;jECHzxX|jX@Y;Zgfh`E!yH~d2}d$o!; -SFT$NTv80|SZx8r4wGtJRQN9GG$KB3NDBVgsci9ADoPy+aTIMoyOaJmrY7=O0wDZ)hhrQt;sdI>W*xG -SEdkXRbS2i+;9W}<0Tw(qWG$6}TCy$@&9iR0S?yQOWhV~+%)pma(@IKd#cDxuZ$qb%??%ElX;SPV;k> -flNqp;!0FX9LV+maVp|CQ8S&gnzzQaWtBlU44BNa-clFAPW+>1}8ghRWy>M9H){ljYUljXG2!;Jt^lW -3Lr!C4o#iH;5&mHF|J`=WtMU}9q)KxJSi$eYrVlO=VllC^YyxbuMCQ({dfukcis#d2KoJFvdtCqY2M? -d{Y9V3H)&V6nPfRcp%Rj}ZDDcA#YkyMNW6$wX%y>hdLUL~xhUknbYT!RY5s8_UTsGXWSc<{WQlX$YKA -MHk{(=o8xwTvEY_BQh0ClB}tT=WHB+g(GLhW4LZ%!vg6&$y1rkF99cmz~vu0d`V$^&0>m)qn_A`q$P% -`C9$dod!psc-3aS}i8n#}DIJpgA|8CxnEL^uDQ;KrStDc?fa!3T*Gwj9vg;x-#YtRQc=IeLGs1Dr1AN -JF3t8u#T7fyBsSq1%I9v+L6jLZ{1R!(momKO5k_M11NQQRf73M)NG6~%-R0l9XLBnvAX$;Z5IS{PdWN -%7%0Nil2hZWJDb~dQv6jxk=0=AwCMS%#bR#3NM4F)Hnor9FDP?Nz_Vn}ln?S|0{r$%ZTc!$&!Pv3SYl -=w15?&L#DnvT?hP!WH{pDnq6O~KE)@J!I<cLJXTt`^0Sy5Uk|S2KFp+-Xe5PeN1`=#vKH-`JPUExa2W -VSNqC1QOc~T+*!29_)+VnyL%6oO6<DGtZ^{f|RVuF}0>gUCSWsO9?_z+wQ@B8$?TTAGHybVx#w_m2}@ -70%C-?jIIj0cwo2F>?!@zp^zloojdDxIC+rV`ZJQ$3F|80hLjI4h7o59O^KtKIgllQ8Fib7oAb>1oz! -u<R&bbDL6#n38&>=fFEc*N@c1HYo(E3=SQILUh5km&Fw$M^1}^DHK>BWJQ(^%3w%GSm3&lHAkF7<5oQ -MRq-}K2q$ruQ=8WP66T<yY_$c$6e8WLe-z_IM$aPXO>V+>#v*-l(p1<#^yDQ7hWky4R}%>5RY6!@1Ub -*25{Cm~}fLk$aP4Q|A0=^)46tep)v5l?8kH$xTS<G9*YUxGuRywlvhr>G29#``y^SBUItfk!%ElJ~<= -wdCQO!3a1r6F<zrC56&v<ZFbiES3R84kE`Pw@6w*G6|H7zz9-<JBUrdTj1eIMw&(8D_$(?I2e}mK-$s -iQK#JvZ(gAAS_ZGhEV+U{hCN%Y^1x2utXsX}@dB4nn=92M?zAL=!C3Oi4h}xK_`%Yi{((f$T`nnhU=- -F;XZo{c9Y=<Yr!&Zk$E=hX8hfBK=6>}Ee72;?!2F6kG!*qE__LXHrx^Wy6PrYJ0`VII7_v2>xMsPtOR -74dcnX09m=uZ4AW)7fQajxRSGx;-viJt^251(>w3@N+?2wbZkby%>cN97eezdDySgZ)!GzLdRI<IyEm -kh={)UBL`b2(WY4QQm1GZ%dFhRUd5d!00~={5ltqbA0LOG=$sZ0yJb8Z%S$`7)*qNW!W|kA|v}Y59A~ -A_yDhJu3qT^#aXKJn^17ka$-oUSO+ma3e<wd35T#NV{--ht$rgcLa+~i|$}oP;3VkF4s48AmOm6<7B3 -aKtpn&T17hOG?Uz2dml|sCnqaZ2gkvtAfw<}ej@kV0WLxCP|-hh%Yv-<s5%5#C<;QI4sOnBm;QtQm66 -8^;x#HdxuDnlqAwwpuZA0*IjEW7IOq{uSl*E`kRlW6Cp}5?<y&Baf!Q$q{i<Jt!wNiEmoGO~fnbE%$x -8VleGEP$us1x#zyLcm^VSeSs5+ahAm#7)k^McX<21E&Foo;1zqV@|v<qB<2CZ~@V}qBO5*tDgLAe73@ -W11oe>ek|RN_l)4r9~_AMX=DdtHW?AOj4<#2SUq246GSCY3sGHAl0SFt7M_!k3U|wO!<qqP4=)aW6P9 -&7-S0l)<Nlw@YCHy3}mpV+Tvt_X|Iq@Fj%vrsvdC6u~N-EY#J2%`O(pPFORRu}ZJ5>>wCnY1lx+ck_V -01k;H<V<Na%9u^8q>T;G~pk`6)Ff!V>^8f>|%XMJ;!`+znd!jE{@Z0Kwib$W%Y`I$Ymtc#?1n;qtAT- -O`%`zVmzp5i8nxSpl5Do_}>AMTS<M0YiKQ-k^PrJq1ldb|piZ!{ePE4>|2wH>+n20VDOuK<gI?iH1k& -Y_LISjj44bmtI5QVDHklG*Cy{r}MPZ!?C8fI!2u6EVER@JdMi75i3mqt)B)#GrJvSDZvAm8*wr!u!RT -_zs2S<k!>0d?dT(#=r(s(Gb1!F>%a-zI6X$>8AJR}REdyK_VI0e52JZGSfp@FkEO@geX%NtBjk5dqNA -sTR~Bm?3x-V?S0%MX4*5TL1+CKuaDRX-Tvz8Dhf3R-<;`x@Ey#B@b?XS-ErnDC_irILqDb2UvzLsr{M -<aEa?Y)kl#gStZ1WcM2w*4IcfVs|7EHqf7lJaF}$mQC(;j59&3)=w53{yzKJechn!yuJC<N^M^mHA{z -EZ*HGNsxKbQ=v!;@|HnfW9JrBAC<YFEUGDI|g1!vh+F4Ny8K@FQxvtT@l1j_8}37~Q$Pg~KwwnK(NZp -}&t^%?Q9JI|6OsaPpm7e=h~;()iu7Y!2kT2vq$SG(w5fi>G=XsQF)sU0;=uh!jNL4`<^sU^)F{UJP%e -Ic$ObcnEcX1jq)+S1$X?oS)XhZ|Zl!Ne0&=mI2l*B3sw?!s)ULLk6lYK$4#F8UIb=kb1)j9Nt%ew_00 -)?nCv>_#}@Hq7U75&)cG&Y?V~X4ublL-*RN6<URCfCyN#N~eoEm7JrX1RJDc(Q~Z@Vhbsb3`f(!D7wG -w4Bcx7pB1(h=^Ta#Yeh9=33`C#)LsittwCfA3oK+S9iiZ;>d8P&GR(A#?iCqFpYpFwQ^yGc*QRn{$$K -y<BzK2C8PyEjLMh~62fi!+zxaoW?v*MWo`uZ>nw9ARaurug3Yu+2v6;WZp#W<PsKlXBUFqGJkamXdwN -<lXvV~doSWF8^ku?p#%$5>iStz!jbTIL)@4D@2e^o48>jq!arO{70Tx1S{8PY$QU_q!V0s?BmF*jgMC -&&%}R<-a+gy}QS2jH=88o;GB3tou^AbfQL(`B~~i6T#L*Ayb*qJ=K*B>t)nq>roJN_=a2EXIN>8T#wx -#{q6`YuE|wq04pbdgtZ)nBV*?=9xS#O1s!^#1{+3Xrv1XNJn(pQBn@U0U)WtYe)Cl1H&;}4G~OHq&L5 -48IRGu22yeX{E$sDJ{(@n*T_+ZM(kr4xK5aWb{NL>cG%vmSG$2rhR(QA&BK*-$_^VYs-qApZm=#BfSW -as?Q%24jDQ+3^=n;O&H7MP_e%a$@p>IC=)j9L@L82eR=~Ba_<E=T8s9>#*&TwG2Bp$S{zpwdic&NEg> -}VXx1wbzls3-d1T|e`3w8$SLq$v2JgHDUqA_sRI?!WfyMapz#iF7Tpjd13FbL^#KU7$_M$iE`Vfe<bw -ljD1A=9oN9mXQ_i;C_w(n?h@pe;@PlvNS;u|}t-RM<?UZqi;yQEP#00RjP}xDEGPzvdxuNtZt0<3;`q -Td4{$!7-IEx<L#V=4(`QI*9MxEunhVPVg2Wr0oVS>1Z>yuE3swFP?c&6*~1X`boM<(WRP=9_rMrc&Jm -O01aNR`(+R4UbklL)gl5h3Xw-+*&E)mH7(gifib{^RA{nV<b<o*AO8v{xNu3gjzb)RWa)ge<Y|@E3W1 -4<Wl->)PXc8KJZzoQA7U_Fq@-icFS^&-Jc5EDve>aGP_$-pU=?=5Xem4Nq=|)P5^|%Oh$Hn}>ItrP(Y -<<h0Df|`bdhGotir+8Z2rO01?Qa(afu8ec%Zq3VIEmuV3O_1moNn?padPe#c47EHTXx)n+tW&OXx!SW -~VWk(X3pO?Vrh?K`~)x=rWZvVoACeHr=o?yGu=;%AiPIvT<^3s~Z()NX=@3fkxKfD!SJ?)#0hl0I4~b -$W=Eqf?bueg-6xm7<;FZTvQpQ(xl2a0^cutK=)cmh$|4WLJDnSV;KK{h?v4IrGXI1Gh0pNr;WRykb`c -uW$$tx(7hIOT*RamsYY9N;Q-Z3!LU%fHnNmg@xJDKxg|hvO19ltJ@*B=*J}PImAR*!hGl2Jfwl%Z<nD -=(A>@QmFSY?1ve+y4MNZe+y7~()X|8E;q~;Bcf8t?vuJj14P$l}cq6BaV2+7|}H6>q9pMSMG;3rvjRc -aPfG*ja@ym?z{1Pu^!?o@Bo!;q~M@`Vb*9!*~3S~qmBBNLU=USeWoQk0HclPuMNV*ZSQQY-Z|&&k1Sb -Q6R|$3$=Gf6={`Lt$>wS>a0Ho=hQkYlwtm`Zk*9B;-{9Sg;-g#co4H*~nG<e&GjnubquhB~U@%g>BME -GEk@SNupo3aj0iCt|$dm6>bzID3P_@u_k{;-97d(0xp%Xh<=(5de5hWtI5lh#A5{;>YiFucu@M|Txf@ -8j>H32DS6MT?iDt9qqedwC7d3oBu!i>FJ;hA>w3e1um{;NSX}cs6Y!vVq;6jJi|(~FtAD2lF+q{l^DT -pUV^*sp<*A;>>~`NDJ`4H;n?BtBsrO`|A`Z!MrvC##3iqc9Nk47}eT~?QHd>q7^$%I)HY+DxzIXz3uN -^BN0IjN=&`$!P`t(G~?lA-`lwjYi^1z}twkff^rFk~JLE=7iuXVRRqy6f`o4=8CvRCMIZTgsIYY+(3h -se7JWzk`s?ogq5;j=?r0tQHSOHOI1_9xg|CV^0*%2Q?ZNDzj?DJ-rIeE_Sa=zo9LU+Orx?*YfSS-&-b -?;g;@7c{xWiDR5DC|S)Am+*-!cChB8eeJRbbg$b?=W5^qGm&1i03F=b^{_`uGPM!*n+Tgt$Ak{KmSwV -+{8>f!I$D}F_8`qrndHtB*p;5$<uJ(5&7xkd#E{MS>Z#FFuFm`-d2r~Ki1Xle9L>O$4c4d&htXK|=8- -STFS=3%XJ}kU7P_RghtrLTXWhS|du>n;MIO&{*v)kw<a<QzQ~88Y%Ni}f*yBfN(khbItvgj7e#moFh| -VJ(vp?11pPH#hFSH-BZBn<U&XBTp_q5rR+p8L^0)Hq(4{cw#THPxu`_dKMS|C&+0N&vQ!hr7S9)jE5Q -FsrQb~O2Q%t-M{%UF~97~Sh=ZcUOM%&CEdx8cFcG%=tgncOl*ax=5bQ;L4LnKd4E=(yTNU*cI*mE;7O -A~jef;?Tl+ZqOqr9IhxZJrz#2Qm-sUJtP^Qs*me@OGWou<mIR=HPnrz>Mm3sQT(y4MnR~R?6j7_1Wl( -~4jsCO?wtG8-_vyi2?{lqdNmmt*dlUP$_@~jNbnRD=o8h#>Q)qT5M*6~rJcbihCf?u1Snc7o$^5nRg$ -vDIN6dz`WS9;kWds*Svx!gmv6=>vR>HKy(+=rm}Y}3D+HN>3cFm6k#+N|J~WaFzHJ%=0F`7xm}jht=T -i4<7hD2n8PLK*+J6HxO-c6Deyg7ZeoT9AYEI_qO1r0Uo66QM-m|HDJ(M13k|w&8y5$Z$9!a8Kr@NuZQ -%Dr~KAt5!Xcio?_|$VXbgz{xsN)|tNh~P^5}?BI-nR7SRE1O~LVj*&B@6y{GgmyU#vBHyBijX+urCIP -ZR9BpK%ES)MMGRe^)R5d%#5Yv=PfJLbU#5Qtt5{Ks~vVm&T1IpR6zGU0|C1nYA8&vJ*ny;ICl9GKz0w -Pur`N3pm)=sHFU2rQp}o7x2Yemnm?E+ALwfNNwy9&vxgt1^JM|p1Y3>Qe)Si=ghaPOrPg7N;9{dOKu^ -$yNr}EwTm-GyJQPHrJ~D+RH!(rD)(zcj&B}vV)A})LGA4O65g-{sru?2`ZIT-&^9#hFhPf-qJ)EyxH+ -8QJs1lwUEOASfk9>(XEdYQRfQcQ{lw*Feb7N^jWJo;gPI;d~L-#t!k2lY7sF=;n1R&6*&h!}sMdk0%I -92C^2EXqf$5SJ&93$_mXy{%Wv$dg+sl^oikkIi&Ac3UH>a({`qOigx4;hjcj6}!m_fs|{{R6t!Dw~^u --PGbVJ%RpPnkmaJt1st6LnRe?OtOq3=RZ8xVOfcGIVY^b){}`aUbUzUJnWm3O!iUz5IK^^y}SA>R`u{ -i7s3o!ftK~yhVHdMunjd~%JU@R%%W><Yi8OQ0>*>4sz8jcDFDcdXRYBeN6&g}L-$&7Zbj*>sp<4oA@n -g;K9ExmR<NrfCcEosUuvq(cJn;35_|Qy=9lw0upbQ-*XSM*^9VmuBNJlYzd@pPfOKUeG|2nGj36W-^O -Zrud)1ZgavsMT^z<~m+9D5~cC%ful>$gffQ*}z-b`T$ce|=Hm623%OU6xr_f0L9xmY)MS@!}NuN5!^W -u_dvH_z2!9vovCDEb>^k3Q2fncsKq1}>?R{k<qHVMkL(>AJ|`Z#GFV^2qJ-`6T3Bt96%Aj|IZ*$yYaZ -ubu$d^THiFV@;Q=iG(pxA@<Xi`g`sRO```IC4<!N62p3{SG%0YIrG>oUIYkpq$A}C)y5quA*fh4RbC5 -s3u%&vQ=wV9CZ6ZX;GyB82v5c3Q3y!}K|P7G&VYT7Pr3vmQH+f&jLJk=&LPkc&c9seB$%k!7v{K#8+M -C(mIAs)?+k|NlKV6eZe!UyxzFfU2D;~>ykUq$DbI^Ebg#`MW?23(S_y)iOYHbOiRL_@ydQRuQUs6_hI -w>dI=;T=`R=CfwRu`b`Mb6atIi>wN@`Jb-$;L(Hz*+yZeDqF$SNHw+`O&;taQzTx>rS)how-=Bv-uqP -w+i41kSRM0oUD7kw;1li!6ZvR)#t6Q{X;<n^uK2UIf)Ob<&>G%aaHO3MnL2*~e<GJ?~E{UjX6Fv%{dF -(c3k@)^W&I6tXGN)&HV78Cm3%O~y5il*c%$;y$gwX|Vyq{=DY*V83}$lG!%3WzG(?;s&FbgH)m&9yN6 -z;~iCg;z9-|a7Q<P(_LlWO^gh`qd47DQOz?oh;^r@q_rtjo@O6N6jYp>CdzPoQw*n1>N2z6uXfRw0I# --FU`W2{VX<z7nDi)BA|PQ7kaY!mlB(1ELa{J#QInydYP-#KvorA9yA7FBfd+`~U6Aiau*^qpIppQ4Ss -3d82=?gcnfJpqbg!MXxp}-5ox%`4qoUoM_%q26<aY33ND;SF46T1s+vHI)BGS6>I=a`<Ewp<qqgYJwN -G9;vV*2TQ3IIJ7Tit`-geCllqAqW!8fG<_A0s=AJl3Oy>>db;w%n=eebiGe5elV3y{OlTOe2zGfOXha -xWR{A?N0A6;e6JvbrED%QbAa9^;w+U!$}Myt{aTnuLXIesg2yadopq)e@5)RDQeJ%cMM2xnpqdu&3Rz -wA-;mN=*fS8OEymmq)OTm5@GT@dQ<lb1KGe2$OvIwaUiNnybvsv1*%dBH#%!bXq7Q!B%Oq+n<c!97wT -T8oB&d_sljp*xr-#oq<T)HuQ~hv#!P#04B3*`K6PzrUh_a52Y@`fy4UKVWzQ*a60IstWyuI_N|L<VV? -(9vF@3V~LUm!}WX!ZPbgx5toFl@69|h4yDT-PtOG@5w1x8s`AxQ5NW_!VkCkh}CgtFtx-_X5oUOVS4L -8s&#LQE=Qg$}l9M3~N?)`C9+aC2O%f<VjghvDFA7v1aNV8Ui<aVQFegdoX?H4^5!&Y0Nplm0e&3~{@d -$0{*5;-{ZP_d1jX6C;Z!pGXOtN(fab&GjI=qZrvOQ+REd2RpmMU^roO#dY~#bg#ARRFo7qKS|hCSy0` -*ASx<+)Z#lqt9XTh;!LN{5<c#&l#3@w-K*z+@tn!{lOK}@)Fs9QgzjE6W-{BX<Ew=|cnr%8=?Gul_ta -%Jbgz{_HN0z#Y_P(e7VptYRtJ6sG}2K}7u~nqbT@;_vAP(dg=-$rmna+Pp0dw4WPe%qL#Hh|rrqK!xd -;6x`%Mgnq3&4#Nqa!|x~bwiY>3Rdo6JgqFXK1KfLGpRo`qKsClkxOY|ptV`n}W}HFd9f+khvUy!pi4g -Bv;&yJ)`%3R$wzJ)C-Iiuep;qn1f#G~3nRz$G14vYMPpAA89VD_)Rd*Det0YWb{gzyxFGRtb;1xd==w -U;VCKa0ygfrEJx7pJ?N%hw(r(y_hKF7(iLXE3BZ-yoiPU?%5-&pBIio_u4#52qWDP?~Seu0IZ-&7?@p -~GC~l7o7w7eQ{M-E05cB7x8usQ(7kSlLeuI*Nq3XzE>#^6P^O=dCRA^_G(J|)iWh2FIXr9<nNUkyjqb -Hl5^jflP+sB(8W~>Kg6UGsA;%xYq3&H=RxMH@M&%p*&>+k0<?1iG*DZt0kgqm!2o_l_vNkl#gA}i$73 -xjN_;6fa)Pxeb`j&$qxi8SY*5&yYFMNQUQ{2$=={}G|8xWyLb*SwmB5`v@Z!*l3Glp{H3#X!c?Vil0# -DHvpH+bt9;6$!heh~XPy$Yn#Eie<ySd{v!pdsQ9)u^<K?iCDOt0%*|Hi%2FPO^@MAg7K=Viu&-R9)<< -VC>1{hf{T}8+Dwf=S)OSDulbB^4(Eh_9e^b4Wgt4-TRG(oyLro!3fI)vt8$AI6xcy1=cW@ingdx3N2^ -e&*Ig2)_FAm!d(vBe4cV3YJ;M(!7~HNd!o^fe8^dq_%Mu7-(=^F;lWv*6+Y416SeaxxjcP~L&6~yYhf -$fMPI^$8^@Q6I&Vb~BX3FL2)4y1Z-9aGIrL)i1l+PUI2GGG(}Y~AUpl<5?sd10ZMG}JfgAEb3n-%(lP -#~Z;piJVQsvy)CQSz!K8C>2D&>C7FLj*ZiEp@51bvmFK#}6AE>G2mbFIMcHMl%FYfN?(hVXFa$Xjw>b -ak(KSZ{6e$O@gQQdiz5cIGhv516X=<aDw|4C`wc=Ri#rFkLzjz$I~0%M({K1%?|LGKkA8y^#@sJc_4? -nf=Dpc9e5N?9oj2QV-M7y|(52G7oAa6drptN}0}~-=VBSR2yvOrl4i2cFpPYIyP|0WxwiP$>@6XES9m -idOD5rK5^blSCFU`R9U?V=B$R((6r=*#Y0T@mHb&p_gay2kD-I^+7$cK3H3%-b`6|mDft-RtYzwaSXH -m>v5uedqN95qT&^&@=Ywk6P(WoN8kEyz<`pYQS_tGz{&1ndVCMKFqATmB-TPjLXVMTzkd*X1X1sh>pf -WG=*(?a*Pp$tAFIogq4M72oXV4he{HibUD2&+xyT^NHao=^R{{=@Otm#x#YR`+B0776=wXmu=5K7jb^ -?7c@j6BOr0;+xU23jhvr`;!B6vv0dhi#?4I=q2Fysi=hBBxBNAmwVea!;=jcL;DGth};rX$2TIu6oNR -odO6F*TK5DCx%hVT6P|(Pvy>ln*uJOQp8&+NjFvYhJ6~+G3vXJI(au{o?dkc(DT;3yn{fUc{k@L!>?! -G;Ln;?PT*m`QEl4PqMk-(v_;BIV2}nhM~96Yq@P2{7exWvMPH(JOL>!;7G)XB;z;qIP9t8lOY4yWkV~ -kpIr9=?0$I_j($3Jm)}HSo8+3<g{!1Uu3_1@KonZrOH%59X6iFnDF*uDnIEdQU<#*J*;#oGL)!>w8m# -u-Z?Ie@sbZYfLFp40m;YsM>eL-Gn><tXWurtqDLc5b^$y{hyopvo4V6e~u#L}v~O5*S|jqp|_blW5I1 -$yEw5?OD7yy0G9y)MC4Ic`<(Mg5J$E}iz_Wp{WF&;3d+lk|E@Z=|sU<jXY=)Nwp_;H}_A)8Rm>XHyi! -LU^<c8ahi$Lw42E;@*7a@zbSG&Uk_DwNkzA%J5sxJxS-O*wM<1O9rGSi4s100A9w})M9!xVTtuKZlZe -~vOvg%DhXz-COdd6?{u<+-36g|fV@3MUXTvrE;tp;qlsLp%k1i2p)~qZbZM$-WpsJ-wiiSCS02N$1#j -7+Rzi*z!!!=%RlZyqa`^{zuY+l?!U|MI#RM<!1Mx};(6M~H_v1nzcj}eHOC6TCZ-TldB1hi))zQ7yWF -^&k!wz&En6?UtAdqwmn#=Sa5@K5U(S_(0@-ftQQn%94y;fvM+ss>8d;@Vv_67b`dX=L<75;AIxr6Gog -w^t~ZCV<l$T_pV+0nfgio;!D4euX_(<@5rp>%wCFCa08vfxnP4Io1^%WIs5BGv$=>MGZ|aZb1h<zx@L -+8%X8Ucb$@&P&DY41`CrofsCh0a0yuns2v$lIJfvy4Qxju6Y3m_tb1Kt3#2qdP}OX{d&#*MqHUf7p_} -YbmV}cT*tiZ0o`k(w$kAzt2bm5s|RI=w!DfC>)Mr;z^*L|1>~Rv!y)tNMK>^-W9EG}TvHl;-7g)W3P8 -G8t2dL%O5!#XO>-*YT09chrYX`1KqVyQMwZ*#g?G@s0($5hb@$~NI*aMtu%q->3BMIK;hndhk!MW_1W -uW@e7<-+?QD1+=hPHDW$I=0SdC{uIg|rMI;Oy1o2J-1y;7cyc$IybT6NIx<^jG03mvxWwI38+8pX@zT -}m?Zkl|HPO0~*uX!Fh(Fs_`tH)mcte$Eiz405U=g$QvtVEMX50c>?BEO+#t5+P7lkHf*|_T^zN3mbH& -WWA7cdpF(h8(3Ka#D2WU^6-K|2m}Iz2zM$=cI)UYar54pOVU}ry>?{1o3jqlU-BWdM~%pPsYd?hVlzI -|IU*=FU3a$$&`_$x^EKo$=&iC{_!3LJ0K*QcS}7VfYJJr!>pfLYQeP!Cb#J5q-Fte(zh3y3N1uE8b#$ -+rWCT4LAhn^Sg3~qKGxf^ch7r_j2qZ`-Re~uRcd#^XA37Dp=6N!z?Khjk8r>FmKotP*P|GbtM&-Mz!t -sc55w#o&@4P|_gp}X4fit=Aq`KGBjqb5Hm=lRn-0TqGc%2^JqkG}c>1CjK5Y_a|xPok#wC}qA4C?i!c -`>6Wnn+Lj@-8`WNw>!DJ)D3Omj}ss^E*5aPYRs&iMoil#3lbgn#8)<8SjSyi+L<?`qd0}5J)1C;*B5X -tn7=D<8m3*f&phPe}?Y0a8hY_=7W@_du4}dupjbkAo7?oBgJEulCIweveJ6M;pxMxzufog-Ot7RO=UR -R!zpL!*927mKtp+ClIX6e0p^kN+Cb9QJTu!byo2tw!eq6k#)(s=Q%B?G$S2_ShauY)_vRq0M-CIDX5) -A}Z>6E#gZuDwM<hjgWj*8^MWWu#ZQ1;gEE_tic6z}#ap+Wh3;D_hAASn~oCxirdu<+t^oBFGclUnqZn -*KA8j2UkLScHooMTN=)!y}<@y!LIpm6DII=a^Z+-^OuhULLayc|zgKyaE~OJOdz2|lrT-z)W1a$7-{@ -`CIBosRCcWSj-Aczvap@HTJgqYeqwX~<Z5@kT*K_mV-=o|A^la5o#zcyY*=04`7cj*eVWt=s`Ack!On -ynGQfA^~NE+;V;Q%S&LU^6NM<zNveiIePYh1tDi^sU-JGC=bTDWX$>Uuk1@wp(#O5MuH```flC0R}Ce -?n4*lX3J@a0@azK*zmfoG=J$F~v-jI`rVdH$ssm@@*Sh9`@5e#IFlN3V)mL5~imR@=5;l1AlnSQkxpB -X*V|h?g`z1$nH(v1q-D^$3q*#+ojv{?Kjfd0&mPG+?IrK`D<^%CS6sIkOdp^M{R%hOa*U`N;X*~}Mcl -p#)`0SYdLKAHSfa82Y)T>?aO2U!cruV&g5B=3He910)@se7P`?)+80Ay^f=omp$lM8-P<N}y78Ibs)* -j(G?*U`N;=4~@%d5?e_UD{On&lFL47^FK7B>&o@TiEY6q3l65bIi*>pnGi;2a4Z3pg5>|q>kDoxkR%n -r2<yrotG*wt7GXbNuvm|-Q;lXSAV%zO{7nvFua+rdf!TZXAW+Dx{uiElFQht#3in2<V9GApY@0SVW@j -uY1=0+V*pf0I3U-(UoLO?hB?uQz#zk`VGeIOgcbE#`l5p6UAyol2xzN!J>-|e!01USdo%wu9(s+Z!$l -sL=#4n!hJgj^`1P^Uuk&pdH&yGB@d3yVzop2p>NvfVM{eBFc)@_=O7lQ2Tk`PvV2aZl7_R=pmn^UIKY -at+)dTD9V^4NXd*rj&A=KMtESAi!hfbM{l5z9uFLfMTS%Dnuo;mUSuM#4~80Z(v^%X(-f1;`dtZr)rY -Ds7vSG)QfxMWB^j+{4$Q4c6jXAsMGvDHv`1(Nr8krH}wOBVyN8@)ZT<@aiE3GPiH4s2der&w39fMPL^ -kb1yW=Gt$^@Jc{(%K@i0q{6)C@AT`F&Z}MSRr3g-$t=aSv9cNr`(fJdSw;>7Kt)yXK!Il)3Q_@SL&4D -SQn7dKdVh(tYR>AtW}embz!3E}-Gv0y$}d0T(ak$~z`v(ozd(}X-6MIA_sIKR-K54L1sYHaL;e*4!Sf -o27d6RL;s&5T#&Y&GBSV`9EfPm@WnJ`F<3#1Nyk{Tpzg%q39pGL}lD)CqTi-pNcse*w4SAl}(n<2E+( -Z_*k6-|6)v?QJ`X{+-V&(ma%FJZ#u&KuR(E(!a-kv41n@Z&5`?#iwbAW!~kNXWHmX7cm54pY5ADEK~k -hHYRsQjq=R6HOd`%Hhvoj8$i4xi4Hb-!?pB_`WlF1CA{bJ!)H5S>00hpLItD_HCEbbZzXxCn)FYPv(- -m8C^*`|_l$3NvigN0W~kt*y**GH94Qk+rqy%_QrZ2hQU-zej#`79@`jTKv2FO&|80fs<#ESdFFYRR=; -$$ivvMYb)<v<Ys}0n@rxJ?=Zn56*^L_ZEN1cM({jrji*lA0N%2+hZmKi?z!|299X~Uhp&JJV0}CCuI` -s4c%&HZRxiR~I4x0*0LKg859K3<C33};JS~TYV;?(>nyJBPIeC65l~&+|DXeOKUmk&EXmPw5DoTz)ed -<achC_@u+v#^;c>qRU!FwWg?p_M*=|czZH^g+mSj%aF6l+d~H`n`w>~Hg&Fcn13uXiuw)EZAu<muE7p -Wqiw+PI@(;=vDxx5to+>s$834;+_@_{J-OYZ@QvN=U4{MgxE~#6Up4>fs%~Y;bDWdO)|NBx#=C<PgnG -tzLnta*ec78J5Z;7@6L4mRxbmf`)A8*Z$g7hNMrv;v2fx-{0K)Z%|7E1QY-O00;n48F5U@=VxX-0{{T -s1^@sd0001RX>c!Jc4cm4Z*nhVXkl_>WppoMX=gQXa&KZ~axQRrl~i4C+c*$>_peyQFAm_kaf<-g3kp -<L?9`~gVA&}0WYE&eCQ6Y8NhMH!{SD=>TxtV%dXknq!`a!@Hk+3p>h+(76B-TU{v_#BZ#0d6(3RX~qe -+V`)6~k1)Iw2gGA8M0Y<^3n1ip)+)G`&`SW1;-?I}f0r*VW1we%9mM}A>tc5KPy<S%d{f5P6SV#jZ2r -O^(bc4ut;0b-gNyN{=qh3AacRn7S4Rl)|YU4^T*o?7uOb-#T13ltaAI}|BJ^N{Ok&W`O1XZuQGqrH{u -5@ojB?cazHjfMS1GpROK7W9Fj(33YbtNhmJL;bKy$+Z=>3a;grnViY}D}+5zWlBngCd-+0dwLk*N$Bj -OvA`E5lX(?FrOr@JQ0>_k?&#suWJx1-P)bj%*`k_RxmGd-cqCKSj!8J$g_zr(of-ro$w3GW4CrfjABZ -K+!`&}z9U}Cp(>>mHU~Ch5-4Z_NM>lr?cni@LDRjdgk)4YcoGZ;p>Y8>7@9_dc6#9y>qBT?LI4@Nj49 -KOQ!^QXMazWALnSMs|c{Eu(KOh%Q;}redGs$9y5zGixS)qLe;UF0I=ka$SqTX;cTs#N$gW+P*PZAnT= -M>Q_nlFa&aum&Jww%wVNxwssFdr=rW?nM+WN{A4!obOly^zZ7OMgat9R#Y3w&I1+=9DESiUfX<UG=|u -sEpp!^#XD>^nqkf+W0oTT8Y`g^!?FYu$=qb#?YsoHr;oTB=j$Z79@ZVWDe?qGRC&4XPghI;|SQhPu=d -_hwkUQF3~bU<l001$>V=qD$PbCx2B*@u}-(bI`%tj)~Fx-3qR4gR9^Nf&oNFD_Otr*fWdZ=dgDAstq| -!}YCgi^`XmV_<Ne7I0-Dp@g_%A8dUA9B_$D4<8&wXQ=%miM;*>mmx?d&Z)p+{YA2k|{R0-#5ioLwnW! -2afSQQwIoK`D|jk8*{9IN~g505Lcds=6vHq{B8Q~vEa6$b|gR*?4fLd~sz34I5B>%vNea(~12uUDOTf -3?L@^a$3`Z|EA7`|4ETp_?l$3VvUuWnWrNH{q(AYXnN@O(`~4!Evb2@lE3&P)h>@6aWAK2mnzTaZKP@ -C_Oz1006@z001Wd003}la4%nWWo~3|axY_OVRB?;bT4CQVRB??b98cPVs&(BZ*DGddF5GcbJ|D}{_bD -V7uVInEymzDw{c#!3fth2*x=)(QogN}N=O4tA|zHbgs{JUpB@R2kidpqYWM1>RBUE?o}TG``enw)$N3 -++tlu<SblbeDx4Lz@ylr27pe?e;N5|9~3u=dQBz@bXtH2c`72O5DOV6|MeKMK((y?_AlH*C?YjPk{K3 -Xnq`cg}*ycS=D7feM+!H{$gCgfW}E61LS1gs2vg|Fc>2+bD&(|r&|<4!1SEnFHb3}RN59WvH*0aas7g -{vY}FD_mJB3HajHP53C%PQ&!CBm=5jZShE_&St>8ID;{#a9?1y0gPCbT7S8C?|A6*r6sJ(EUP>13x}L -Oy$WzXom~7+AtJ?R4~+YZ0t2Hf*CosPoZ$7ir`@gO}6iz1|il@0#^<fJT&uN9EW$UML1DQ8{V|~bSo5 -gN;kq6Ax?8Y8+g*e;#=tmUkS1mO?ga>*OqGVM!NAvs1X3(SobvviFwxjRfGy7bXKk|wZ(`fg0Bm<=Ka -H)Q(joarWfSF8{u+gIoAa1le#2*13QN8@e2TP&^c&D13@z-hBL1O1jy3IX763Q-=kXVfj-tcom#8+@E -WqPG-lzy2uV(+prA`QRcQNqfsF&;uHLzNhZVKU=54e0z`JiWd#!r6OO1AiYII-g^qN=w+ggY2`<?rCw -_Yad3b8aX8#B+yD-#a^ISF7%S7=*$DmwZD+^eub&!w^bRlv=TkYE(q2$AVxFCTh=KQiaVlC?o!lN^#C -=n~CC3GRS>8SesR?cWke@03gQq6#6~|Kh;~T`X_NA)p&x5QHVV43uWkyBgM3&Z^bQN%eW9O4RRSWZQ@ -8t?MTymE)tMVHixPEM|_LBPf1j&vEz^>iw(UM+@%iSiQE@=+yshwL91KPKlx!IPtb_b({aGmyT%5Czg -D;Z(h}It?OpD*J)n%d(C#s>eTR~xYqt9+|>S|vrRi@o~WHAAJsk@oIS6erPSYC@=&h+c<Lz|Sjj%Rg@ -GKsNNwP<dGjJyy_tA|@<{Gc#h;~0>3!eq=BnlK$F&-%9XgMW9M4v$B4azeUZx)eLk-1ep`<DVgU`az$ -m+&_t#<$BopoL7)vVsTPQClCeS1xBsaiQZHv-*$r*1veyBMpKFD}+&t+pAeRL#&`v(>!o-(`WGADMYq -49T)2YLI0Wl<<bJe*Pe5+0&^+$ZLDxnYbPa&E?~_neZK?j*!cNF{Xo4#or5&P%udV-3Z<0$wINX8f9% -|ix*ltuo%^f0Nzq7@WqCl*@C6y?;@UO*e-uX0<#AJGMf=eC^bnR|2Wb4N+T81SKFHjnvbP3#_ypND%! -qh`=gmXGG|==UP?fr4wypW*q$>(ePN>jbSPaILPU8wAwJf6`s(y_KA)E-QHxRz!qMq84A{l$RQlRG?f -a5zl<hGil+f2gW0FhOSWmnJ8t3)lEaZw9r}lE%IC?Qflj2!!f>xGkRPt@<vib6@9BAOMPgK5uantts5 -bcUC6xZB}1~!QG?AbFjj%v-^7s&RGCqN*s-f)x_kVqJyIgIMf(6dMEP+kg0^}-pt0C#CNQ`h-qXk6Gi -jyE%{!`M~{tbst4p4jddn>1`s?KVoqP>Y8Q>1_wih9b}a<qf|IH^o3f{%kUc+RcRcd>nAW-iRbFsVKq -Rh4?6rXS-})S=)FhglkM(GAg3~El>Dqld~Ad!g3c;A^+kBb02E`ksc?lE{7`^di$2nUZv9BG0hQpzPC -U`py5FLp#eHO87wp+YOMhg!_8Tem$A>KO5rU7-y9VABgzB?Mp`Ef0oT0BU3OAU?mHU&1vW}cXTA9o66 -(geR-QnrkZx*n1^p(IlhTS}VR(>!*_!5lHUEFguFQ3~+3CvTY@v1f$qg?(3;jfjqJhmR4E7h_;0?}S= -*8@GoMF#!t1DgqA9~p*nwZRZloKj|qstJXhfAl+SiLVs5HJ{Oj&?p_o2)P1aA+aZWsd$PrbT`!OWQA2 -Y~<r=c(hyX-`-|4Za{)xh0LZ-sZhv*on)|zS@-_)v7}urZqjZ=xn<SQvL-%xc$9F1AA}RI7&S6MgaW% -bU=Po^A|j9Co>Q$<{!VHZinZ#DDWNvOz(8BV4`!pW#XQQk4o%HLgj)ev;2^2-#S6Mttit_@7xI`J+Ve -!hE+<eLe4mfX<2unJ!HE!M5V>T+Ntbi0!IGSZc~7~ANO>xb%iK0A9cNJ{iqb3RHw*4co%AEy)0`A(+e -M$0$n&eH;|o!+d}`og;c^JF=lxMKa`>7FQ=l=>QO(<sWqa9iO(_vN0>M3r$4YpgN!ywB2Xnz((PZXnI -mO<VaOUoAr}`c>=2XsQa8;KQXeQT{Hw}x#yX<SteJ8iE-PZBOR@~Kss@W9A-wItaUM!YZ%b(O;ZoA#> ->Nq#=eS0)uk6i@!q#JjGxHF#gKCYZu;<U}qlcobvI@N>_4P~e_8Mr7{zoN=F=bTPX@N+0qvPyt{?uM* -g&5`wks76LLz(;oh7BVBtxXh!6Lzm@@CFq0(ENaa7b!7!$Hf0<H8!b=zYvofiT_<F?oPWDI&rSCi=SZ -rBgz$-xEz(bG;OZwcT3grqY&(%l>JObCM(TX%gGrtHXz&QBQ_l(ek$UI*!hxjz(D^=64=VqAq`s^?oz -$0={{pF_mzf{K>h0Kv(R%A+)Gl6Uo~iaA_M^{M2QWLrd@8f|AoicY>r$*VhvcOsF_VlhWGP=XxAa01% -gofO#eJh8iE%(QT*}dl9}^4PkPnN5Ew7@x;$Y*wbdM-_<OTJB7~ogl@5}A>9u3QR94<c#D*YuxVlyIY -8=Z~0t7c+j>$R`?;^&<BsGaA>2L}K3JOz~vlmo%fD|-cB_kFYbV}frR@?pW3|EGanv6ud%!5*Qv`|k( -`M4tMbxJDinc`xJexfq&g5_>dR>p(2g3Mu#t1!AT)y{yKyDKWusQ{OHc8>MMUj_S*oIq?CUL@4BGs#m -sXs_&<%UO^x}ukLy%T}R#~Wb|`qAaCX(c4y<!huB!9nMvNK-rxVQ`&2&k|6j!OP3ryqcUId!`6jjd4w -Wd1yKYa3nwNKPvY*x|{sB-+0|XQR000O8Q5kVeiCH9was&VX%MJhlDF6TfaA|NaUv_0~WN&gWV`yP=W -My<OV`yP=b7gdAa&L8TaB^>AWpXZXdDT^IYvV=`{_bBf5RP*=N42jMn&tv^96M*~*v2m$p%k%}M)q>+ -U9-DNP=Ec+>c#SlRN{Uq6@kdJGtWNr%!{tBsvmghKMlt)8ut3*c^@7|linXt<9pS(g2e`5qWPLjCZMN -61a9D2{mq47^n1IFB@dWY8Un#lS_sI;YZReF$t|bIM|?%0cBnx`U@I`me~i`yY=;N1TuDPe^-k&Z2LZ -!W>C7HzWEMkMB`M<hRZKgqT|!rFEHr!9(7C<+l^`nJJ?IJnGv{kyh6eR3hFK;(C9USGn9^*T>)*%%@X -Yjgm~ye!d<!=~3@um%)5LC+%=0Iy1Yc>U6Q^3F5y7a)z7erINK^~~lb|u=CW9v-EHD}Vq%_5ERmh{nn -PM4II*zqPy)}h~Pva$w&=6C2LW!EPnZ_%@0}3AT0Hr}-26oP7Hl<PnM`WH8fq^3URNXs3PUr6KSJZ|q -@Y(AWx8;Z}pjtPXb^NKCI~RCOq!SQS4P8Wfl@gShhQMVCyCLoAg#anhH)<<bA;bowShNU%eBs-0@pZC -XKzIBC-@3C|cf5GHBVSUQPN{ww65sBq1w){$G?O+V;so&ApY^^{ME7Ah8ZKTO`@wKA?$75in9QIH)9! -3B>@7##8BCY6>15vb0Op8=#7@jAk@pfu1i4kDWQdk=VY1X;sJw;<iV!yJ6{*Yta_T5xG$Om?q8bV%*J --{KQVMzpJOZg~3*I!R-l6V0t1h9G^=(np2VM()>5vnX-vyOmPT>O{5%fSPrCaczjCHQhU5agg?sVEWo -uAtsfaRPlbr1B%kMCS6SB*xb)fPOIG4(Q4&5h1fs}+~)xuqt`&w~xq2JMbcNS)lTN5(nYX=-dV8i8QO -6xJuL;$3#sJaVL&rIDoqMd16KCg1m)21V4Orj=_y;(}WDeyk+sp6)U6uEaTjZh;HE_V!4J7zgjyB@+3 -2J_{^0fKOS&J+zMxvm^~2{Q1{O*b0sH*D>{opG$EMj%j0`lBQ*4(|j&qp9Q^>qigY^4)Ta`d7*o#Av6 -22**%&4?Anv#?0&j?p<_IAI^+219y%Av^*h-}7n|(G%e%~%Y>THFX7g1Ce4JzIv?icH$%uz213XFd5; -XT{w6T^M`4d|WhIg1uUBa$IW48YPCtD;^4nl+&=5xJDEc*1ZIY{t=CU(^8m{Q7?%aiUripjh9ouS69J -ZjQBHqBwrzEV>c@P1x7{{7L4^#+sW_|YFO&T;C;D0`_ZT^g5OcI1Jgmcw|m@Spp&t75+k227ZDEQ6cF -WpF6KspA(~ZRfX^m_<b@$W}(x3vhn2@70s(Io;klg$m3IOPW(?d$+fH`-L^xL$phM)BbS$-FLz}`I^- -);lk~|pT+b}q1J2i32_y#n;$=zG%$<!*n*0sdj8?6q>u}f1N`HntmZ*~WdtF8Fx7na#$p+^(zvs|QI_ -jV>Ts^dVL{!$f4>(lS^Z^eozBdjPvZwrO9KQH0000808trnOyHMcTE7PX0QM6A03-ka0B~t=FJE?LZe -(wAFJow7a%5$6FJow7a&u*LaB^>AWpXZXd6iddbJ|K0{qA4U6@M^nKnuBbYj??Gmk@}li?IuErLu`v7 -Saf2Ek@drWLx*w@97zV1cp>XRZ?cAryr-gPdDf1$3OIO_<1~~$#^iF&WH4Iay|HiPRO30ozr41=vvE_ -R9-}bI1nULx{CjlQRLCBl8-{CxbfGXPDMt6$b_H8ntX^lXIl+pB{K=JPvTKTaUwLuA!SEYLw+i<)b|p -Bqs=B)()ThMs}x^#5^M7Xis>fS_T1OP%S1rS!f1SH%G0bXDPU@yQDe}gH=RxwDvpXf)Q=*Xv202+kqZ -4N0vpL7R+*N|9Pu^MW)CMsSDt>L8yT&%+)$g~VMbX@H$}FNm64dQ3;gq<nD66Vyau5XAV3<)rS^2e=! -RMdO5-qlg6D6kh;#BiMOp+hwf2EjMxF}(8f(1Y#DNS8KFU>qcsZ<0=uNr>`SbLaCL%>B^jRpOVg4pxM -$*UQiS&g^1$ikYe3q^&C`atbymW*{G1MFQ-;$8HXWN{9oX{JmyR}woY#~-^cp3YTbSM0<38xE+kS@J_ -=^TZiiZmdpjM_DlgFm1Ufj*)9XelU9MVLn|Xn-tz880rcZx_^`ex)z{*{nZZe0>X9qyo1{u+=0tNhF~ -dQE5+Q1ssQhtKn>Li5LBk<H>mOmAxO07t`T<PNVA?_35TRTZ{*{lm3iuZf7^w^Pz*}3bBQl!8``?4&o -3hH!+YzlXx;pZRlT--V_c-0j<49fi(L9T@{dr3Q3Az%3&0%m5CQmDnQ?o3`xaVi=MPZ?VvngWEWbh{I -<{)zSE-LyAbl!LxdE}@q8phs2)XetXuRkPBRw0>f>$aO}E==cYo`2iEigOIrX98^wUq0&-vLIGR6HA# -Va(;YWo%5o`o9i<Or3c%FE*$9WNm@&rn`xXJ>xor63LP(p+SGCv+oT{uk_o&OIY;%**T9VsN`~7nidk -zDz#Rd+Ip<_}yLyA|%(9;0M=jq#_Dis9d#jLm8od-%n#Dpoz*43pj4d#-W8T_pfSCabNp(Acjz_gpJu -*iELud8m_Cnjd0y&<(>vTWyZIYp43rsJ`ESc!D2l9Y*qX#(ad;Ru~S&mxUqDoSBosy%7(Uk5DF2L;4J -gHbOQ8GSuwtyP+#-DvH}oXKUSd(gz`_l>^Pm$AitLWMxgJ5%2R{3y9Tkl%OVqQtfHc^?=-#vGA*1mUp -AH(jc?zdJDv9T=f92any)Vq;sssUKo5=M>?e#%h5wc5F)wnTVjZLh9=v+>YWMdSW{OZMW*F|(tVo36b -ap?j-gr^6_Ld^+kx(mU@ZCvD-@Nvp{r11_cEWou^!C4+^m{%|@bLTd-#PTrsCv7>tP{G&OsX;8P*x-& -@XojYSSz(ByEi=jrAolR2sA`#^C(+#NO8{N7-WRZf)5o459}swhz1*kAIS|UE2uJ5lwPEc9U5V-eD<D -SJfy6yY%&iM!fG)?V`n7W>57DxW`uG+g@RoL_@!Lsah}4z|K(hP#>LW)Dh-;+JBd8sPEdpcgd&Xc1V< -RKzLYiHb%;2Q((8n0lZk@^NPR66r15Dj{WS$K(>M=38kU)^GUgnuA*&V+y*E|E6R&7AE8FGh)nX-{Nj -xWD6f@85JH(kYLQzqN(u^rDYwz%@X*-D|*8%GQY?$!Mk8<pLjJ<`i60K**u4qC9RdCi1)1+vP03e}Jw -^ja^TGhU;4que#KQCH4g-1T7!7B(cwvFdfS?j&Mw_AiA@tnca28(>_wYzsU6*iW!o#YXtR)t%xH`YRm -s<D8ywzXu}9n4+tK;5>iwuM-35$Xb~Av(=RYOr{D$U~7raRXKgQ>3V$;7}LZEb=t+?D;yz+~nfpA(eY -8R3lbRlecV*CNSwQ9~`K`=4u)Q72I_8?l@?dgGTBMLhWwvZcoDQD3zciQ$u5orZHbBcn2EhR9^I6<gj -jqx%!8R+6mVZRkHb3^d~5tQ{$Gr>qa8uuK59{&y0bzw%py{L;C*SwwC725Z9*VxGeS<r)>Hc#BTuN!D -f2A&f-QX=bWL1<deV-{O-e1+UQ4VymMf9FiB3EkedyDm|$E-Ma9x0<UKd`{aovv`yWnlUO5pg^##YNZ -%g0H7@cs4L(Lm@)8-eN`t!kfT)S<VUkNa5-O7Nm0h${EaqaZo-%pTm)wNsW{rxXd>#m-an|Ui-jy%lB -YA@2_k=M+9eqo2039xOiL?aT)lu)yG&|h=x`}idUtBex1BD)IUWeNuZ1{qj_gDqp&AEETyo)#$HwMZU -*W6M2b{xx;)4(tuq!hhh-d=eM1>Bk$M`DP}B`~yia+w&2uUM{XCgoqEDy0XVT`Qb>{o<NE}nE!_w-u+ -0!Lg(TL?Uwnjvu<iyVp}S0TPj>Ve7voC={t^dGN2t1?cQy#D(-se>p4LuKd_kcGqd{~LRVTdsrg{bW^ -2ZV`%<-4|A!DseMR#^4%kc`6|44s$j9g4xsj|;sDL{ve#op`SM0E<tGnh26W4jhYoS*TG8A;V?&0?VX -b4UJB<MjT+0WSo-M_R{cH6eT>wC{QJd%NWy32ud4D4S8`2fxXUB|&a3F_Ss=GFfJP)h>@6aWAK2mnzT -aZFtMH%O!f000IK001cf003}la4%nWWo~3|axY_OVRB?;bT4CXWNB_^b97;JWo=<&XlZU`E^v93SMP7 -zHW2;pzv9q*h_kv{++x6*Ai$i|X^kaLU^^&+A~0y_WOJoNkEEP>fBhaQ$-k3zMuFDHyT`kCcaQGT(cu -qWc0c#}bkn=)_J>`%yt%vjlV0#WY8=sM#&l=oROUj_l}?zXrA+@Ll@gIQQ;K1W8ntULmrla-6E9flIU -CX`xdRyR@3XV9m@`aSR^&1kPU_s^tC?#Pz5tl+wJGhfVc|HT$uc1BUnPvknlEwH%u(~|gxViJ{tk$P? -h$pAqJj6dG+@hS!AV)kmCl`!lfr4!v?ph<5Zwy%o$jTY8kx~MLWYi<ru(Iv>Ab2R)F?SI!Yn;YsbMCo -Q}>L-&S|L&ibYO_6KP9$5aCGV$*<ZVKGTUzm)=z53Ci(VJ2siEIsDvzpc}Txls<FL2G!gb6D4B=-^iG -A%Oot#z0J<nOkMj#hE*bTtpOj{Jtvkp_jfPYSXk(N)UI!<5L=`THHGu}qnmRdc!H#tq|gmhM@9!JSXY -{m%meHU+~XerM4`_ZBbqQ3meWGDfB;|m+8cejdl*rt|43gugF&Z1dOU|On8qpkS0c%5t|Wj_l@YmHB5 -?rRb_Z8q5Yf5p-SkF}KKtw5sNWq9>H2O!9lGxfM!l<to6dml9|re#!)`=0WUeXpWF8`UMR5wqOoPdUo -si0wr9Yy*7740^W@5o;bIcMGMFJ}_U;eKiDxFV5y$D$odQLK>T)P%M8;RM$^zC&QDC_>VF!XWMqTkwZ -68U$977P)7EmJ^WE3Hk7F12;u^|pi9)A#N6>AUua(>Bq=5SEud)a`%zNf9|}G|(x(E=o_K0n<h!H9Dh -+^8&M7o!yFfCUYJ-3{|7ih?THj2@?1RTXo*llfO82*h#D;y?OH{{M{kzeJCrPJTn+ezf1x<fCI~a7o5 -js?*z>SBqc7CFa&G3Bm!?HfH6SID9<i>jQbE(_0zUibDJ`{8z#B*)_ycG_ab(13|QM~i3P?*OqAa#d< -{{E7UX2cQP9urfOsbIDT5<tH{d41;$kc-%rrN=kh-wd8N?){9k7vTopnIR$a(?zu*R}}E5$B*z9jF6k -(D`ioNbUgXqSK_zN;xYYXqR-2n$t0oRtEAKW<eE0`U*y!aN5t5u|vEx!>wcfZF;rWdu?LErgOucxE8F -$mb+95!4tEjWwD<@+J&TkO}8brqZi;fV=J1X;pdUiGO6+mL<A9zSju5gR`4nDPUlI&M^YwdKrCMmV>r -=`C}`mInct`<>j>OL;1$QJJ+QB7nEtO#F(sxlb&Z1L+M|S7*CT3Qi=$l;x1gBaa7hECKbsk7D?4anPq -r_eBHQ6`dNk5KI7uFT7m8CRy$D9+8qoaq+1Q&Aoev*akpCce!t~gYZ@qCujjg&L#6Cv<+x|3wvx0p<f -nSK11$fDRgrLT+J{@UB4`)7U{P54Bc(KjF8X)Sd)LC0a7yE`#7~d$xM^9XEwWi9US+{5jmCKRS<wZKb -`Ijgn6am7j84Jf^w7B<xv|3hzi?i*<AVCoob7Y3$6)577UpQm?k3op<8dxB9*<A9BOnFrnkS7_aizhZ -?NzmP`KG)_K{3`CIsb5_V?|NCfprubx7OrmrfJwO{2ugg#D*hY$8zmbX>2LVE$=Us)gdSVfT^jQt-=D -k<!f`X*^Y0=!8mqauaBR;#ZRjc+_PWdp%Txw#^}FV`f^*h)2i&N%+?h=ZL;QP(jOgHL<Ri`$(E6=O)7 -m0%EJ}JR{NTJ1^;r0tW@}QI)2(;pYVCR!S=~()3OD<k+bi^%J1pbWqEr+?UjRJSD1Y7ru7JdhhT?P1> -(W)?ojVz)ScLY2{KV$Fs?-KRjjH^zi(hJ`1~<9{(mTLxk6U>AyA0vPa)O5K>HU^O9KQH0000808trnO -niprWk~`60B!^T0384T0B~t=FJE?LZe(wAFJow7a%5$6FJo_QaA9;VaCwzeO>f#j5WVv&p2USnE`>zB -l;&WFNvsk;*eK!@t?hBW>avS=*QEaU9rF<)C6U^_*z@t;zM0wSc0WECNB8j@vv?BClL+J4V)7H8<aRq -<OpNwcX0<oA=dQl92e=a&V<mK630oXIF?%M)7Q*GG)56k9Iw+Z0VH@yoX^G%W>0gAU5gJn?XN;vnx+6 -b9dI(*7HJ0&PQ^>MuU9~RA!dC=OcI#lugK<A!V@A$#?4C4Pp|GqoC36PPWKP-<gu|}&xrz#8%>g%Ug( -N2-m>Q-RUK%|DNshO7@5ws$;JQCN-*#dQU@UsVxB4y2t_5DP=mtu#x-+u>VGAym7LfWtTbUh~RWTtK` -XZG=MyMT?wF;PlbMX|X4~un*aK6D)xLSqtbTi^yUm1?lo{mg%yHk>hxhgBPZ&)}JJVvX@10%w5Jd4v! -t9}}%^C(F$U91pd8LrZJvYv%2EZ3{$B8mDyLUe9%+su!e{MzD@DYu3@S&$b}xnt=Y9<O78sz4?7#AD7 -$?pdBdZg$Oo%}^Qr>rgL4E)5+)me9rrc(Ib-jyLb8%Pg1q28eau5AbcsNkactJc5MbQ&}?gR2gFfjE( -bc>SM^*!S!%B_%gg141smRp3e@V`Q1M*RJYUNNg3<m8rNZ?Y=8Qvck?WDY48KRn*ameHC`+%H`lmDYH -K=~H*8LYaz{H8j-L5lv9rgYfY(Llrl6}s)YBjT>>GY$x932I82Xm_!gb_+z3MG>)_8IO*m_UQ&dy&@O -9KQH0000808trnOua&yF=zt-06zx+03rYY0B~t=FJE?LZe(wAFJow7a%5$6FJo{yG&yi`Z(?O~E^v93 -R84Q&I1s)2R}A8d1322ay9G843ap~osS$rcvQgw@&=O@6rAULM5~#m^A0^pNS{vBqNt&7WIP+#W-R}8 -A55uSNj3(n~I7^1~FqucsbRo9e>C$q?X>P<;C?+Y=87E<>&_9KgEYN04DQrRK5IR=E2}C~fS1$FQ8`3 -$sGaQJYac5Ju=P(sTsYJ@0(8}W1?6s+XKuim58hdIub3CI>RWts66*Hb|U*W2qqh54PgS)%GL2))bpi -oMReXOOJTW(%?)>IN{<&4;rPMe;+{sIfpl$js25OQloK{td99XU;l%I&mj>xVQ_Yz#A%S1C7~lhwI<L -t^(->5@{W$nZ?qh8{vVVk-MX8{i9_iM;ZrQe`N|XYIHt>_Nk)*@`CIB2#+eiW^k3C^u5108d29mF2`N -?Y+(JPD+h@B1xMFjWp<Mb?=D_`2F3l+*nxXQ!qH()-v`<8|pFV^G7%L9(awUE0XAjIUs|x5}Yc{NT`~ -22kr3zLKOOjF`^Bp((=5NeJ~)FzK@sR=Bp)zvlsdv#&I}XzT6`gO2do(HB6$|O95h3Wtegm5(mL_7)R -fL2p`6i@$$uIKN>G*!z7{6Jf@HqVZ0nit4SEsVihmu$uJ;FI6p}2#XKkSQQ{nwg@%$DcT7mzl>UPDS| -lhl+Ob!THm6)*qKM&%?5qFPL#frat{0G#p!XzlQrh+D%?Qj6rti1zg5}iTK88LG`t*5#Af|puv>*X|B -yv!Xq}HZS5865(It_un{WKWd-VFY{9T2S&SS}qJ&L02c66tn2xzPm$>5iG>K=@%p1N|!+uA=Ao@tq^Y -o~SH#M2o|_P+RLTZUswsLh%DKsy&JKOdC%NDK`Ex%iZ4S4Ww@4r=@h_p>jNeH{otkdruf^izD^o?ytL -bGF?ySkHbl)(@7<>wlO!b-g!2x3v3I_Mo#Osz|vW-dzQ<*wfkdBte@UHsy@{b!4YtMiiM+9V2$j)o~g -O_G1n6oD|Wsderb~S&yh7(Ll-}e(Ea8)#@)>veP~TP$s7KTtT`A!gyuOnT)E(5p6@Bv%y;o8#Q%D^!@ -m}4u!bFswe=q~581lvC}`W%wPFSTRaC=WX%t=6#a>-vkW6h$w!Mgc#=B<fs`D>UO9KQH0000808trnO -hg2%$-n{t0DT4k02}}S0B~t=FJE?LZe(wAFJow7a%5$6FJ*3ZZF4Sgd99R9Z{jczhVS_mqn_FeDzueW -NGml!pe`XnB&^g^Fv$Sf8k>!sc9Htycj7=OtM;&~<^q2089(#kxwyD+Tp>WMz-$maS#CA`;|6$vP-@I -*Rj6{kQKhj*(hV;%G_d38GhbuNak{)T8&z~+z$Nqqm-Yx;W?Z(G$L0Nc%X866)%MD{pi3Pm6<ljza#x -zjaD$g>`4dxf)pdZr>P+<;Z*mPtSWw`uK#kI9%aP@)6&ADvU0G}3P|ExT3(W-(Ah}Wnq=d9Y$Ytxy>v -TTz5;y8I2H)Y@N?z1&l(tnK*ythYJ;fd=od($Fa$Qp3!(13F{u^2x+`!8E(eR2EmhX0A4@LpEo)(MwF -{r^Irp4ksmi_|^yvR!;HktZt$h<)n)9>r{*={^@2P|e`;QIA;$8JBmQ@7f$wOgx=!<pv>werm>K^P?c -$FY^#b-G-?_R}7|zlNj_aNa(msLia?qw(7b=j}kzq<vbbWiHoW)G0gihM#uFz>B?p%z{zV9K&!P3=$S -My%B_QGC6OI2~Rh<#4jSWe_&ht{0uaT-C2C<;MpvkHH0jV{w9p@SBWx3KYvD%Z<NaZkyA8=)xh9(7Vw -nX7gkCL^-2Y@=g8<KSEU9e@tipDMsCc0cn$PC@Y&e&pBnCFSvTl3jM%~8#<9x14Q7ipb22MrxPmpBgn -*NjvbI)5j`}hc`ViLvpj)6R3#q#lAOfAPT7cqs7uCs}a&1GY($G56S6}S}Zkw$3k4fm)#{2&+{=3_o@ -vv1H3QhSf4)Y+QBn#~A4OSOxG*jEliv`diJyoO%z^GQ8GFR@+rYep=ZO6NWei+2F&<BD_mDG7g2pN@B -pdst?qEYXALwcgsVCmf59m*7VNspfB*oyV!h@K|B(6_=({gT+oKAO&5UCraImC|<p08mQ<1QY-O00;n -48F5Smhy^`01pokU4*&ol0001RX>c!Jc4cm4Z*nhVXkl_>WppoPb7OFFZ(?O~E^v9RR&8(MMiBnauNW -m#1rp~%s!GkJkxGcU^Br%piB4%%S&Kb}Rn0ElU6OLYzO#P8IGDTKwf+Lk&OAHw%rk>8FPk5@bKiMW7< -)r^8n|#bo((_38Q;s+B`nqmGsRb2uoQ+eM&KGY@-t6U=18@Ih-^-)boB%`oILOG2~)X61u_BCfI<FKG -&*8iB-3WI6Fg#uOQGqf+DeuEAYhnFmD?kQ%wP=5eTH~?6;l>#yQizx2HL|8^sldfA&5qI2L@>hzV+4M -qek_FabC$#3ZwXPXQXQD&RenoOqlu$<~&^~zJWJD85%GW=6kc2qNty!N%>MSwYMxK3K6tS%rhl+1ADo -HhzU>_bDhHz5eAruf0T;iH!|kQ-kNqIrgCi72GvHF9KM@Az!)`U3hz*$qH5;5Wy&K89`gu=MqnDY)~4 -4LQzM&5P$U8)N$?rFH-MbZ?cGnPG+E%v>6f<^h+U8h+RWJeshe9H*rBBNkWx2P8R;}qP*oZO7a8oDxT -h}!NQFL=j9`hd)0phiE+LRFeDW6WXAcV)OdsLX!1o8!#p4b664P`_{mYT~W}9*Xrm7SZW>1L|z{K^3? -<rz%=Z(F^qs@NgEv9Y|z-Z>f0OkXK;SC?g10UuO{(Kg=4nTldQf$d=BKbgZLXaCtOvY#!Pjz1UBehpk -f@utE_Jq{t2stSV7>&qw|4ltirC4S4Qb<MU4e$hnG+lUBoU}vgJLxW=RQ>Ie=p&~KKljOriN8{6K|tX -no)GjXl~Q%#PHJOaCj*M@UG@9DH~pV_eSn96Eax6@r}wX1BA2aJqT~jgXw8&HvsH3Q)l>KE2o1>?pqX -dJ(vb#1th6D0ZCJGC0uSEVNnlSV`AHFiVn=gQc#WA@?br%OJSBy8!Gf1zRA?TU{VJn%q&H=B`~B}>Fb -OBKdv{C>2D7W))zxr%YWpy+Y%OSb3crv3!LQS5wW5@14X%!ArMGLpXy;gfi;IiwGaIX#gPj;n(z>wg7 -j(474PF4-61h}fCQ(u+MuzGJ6a}Msn$I-yNUH&v=IP!FRjvg8%$6wv<{O#9^_o-y8vou=xV=kRO=kl~ -d&0;JipMC7U0NhW67Jz5=a7E(CB_88kkbYZ!?wmW>C*BLt1!tLbUT#-i;C@|ceI_`FA3^`4eU4voMVK -e@0|*V{0l9G)ZSb8<IlqxO;UDz6bL`O5RNl^@6q0H!@!%&$KJ?u@88z?T))5}_EE&`Q;i-gs?+&Ch*K -RNA-$@a4}<x@mh+u8oQnQi6Zkmu-NE#~U4J}FFFMUg>`zE2VMH6yP`|CN>ONsU6c~raGWv>FT2#>NmT -joUBSq6-+MP=Mxgk^VYlU87l-_oxD>c(9uX9)DHUFo8GpF{6=pBcP9k%MmLnkseskntY>+>?hGi^vww -ClNc{@<=-e!tP`BRb9gz<B`{3bw(Q)GIVQCC*%b4zRrUbzr4;C4v<tL$oJ$Yepw1<qVyqQ}11IS<kt? -KG-qUc*d*OtL{$_<6`|T_lA08)Y1K!zO1gwvpV88$*-uVCPDkBQZp1%IgQL!)*#RPAP+BQuR;^}kIBv -LsMC~9J@U5pBH*~bKl9I}axxSnMvON)H_pJDTj)1>mpy+O@arw~nv*%)abV#1?Z%nT7U9G_8+okMEdI -ok{^7sEl(z`zistOTklASVFuf1G#TVil)<DI5K0H-kVex9%KJ9e_;?c^eAP*DzI;tAyJwN&vP)h>@6a -WAK2mnzTaZJGqV4@TT000gt000~S003}la4%nWWo~3|axY_OVRB?;bT4IdV{>gTaCz;SZByb%5Xay1D -Z17dY87x0p4Yk;$fC0HR0-CW`^Fl=L{b|PY7*SyuI{^EHzW&@j)KVQT?ty~bpLy1dLH^$;pm8e!Fltt -)rEGe(d-&cIB)kF*O1_QlsbaJSVB+P_qHn>Xm}$Dwht5UFWYfM)>HRjVp}#9xwc$8u+j62e2|Vel?pr -y0wxCfcV*z4Vk)s|GMTxyDFWMbef(EVJ+=4;14G|a%XU*q5y%k?=ZlD&T?s|8rgQ9S9KcEA6!NuN6+^ -J@S*SY>=;Z5zE`6yU<Y+mQhUW	?k+!o%pApu?3(b)DP&}&b_iHkO3TF0D%Ync`)|eaQ>JY#~v!7=9 -DE%NeRAZ1wV0MXE66>U<wzM9NGRdJSHLl;g0_B6zV75$hPLxG;>Ed9U65Y)x?i-c-g&yw)AnNa4B7>a -5nwf(6LPvw{26pz69aJl-m69DpMCU5F;E2TzD9Mk=-+pHrlE02dR8)0WF)4dJ7|_!BcP|0vbQA=9Gk| -IOsVzxEd-_X4w?1W;z1fU4$KD?(q){h!g#Z+X#jdX1=s$P8uViFMMkau6j2EsCRGSTV2=d-NEe{`eLT -hitD$GWKX7!je&7iO1Qxs2aW+cO}%l2iu!r0-5T7|=r3A>ZqqQ}qNhV0`gMKKYTUHzI`nV!e$QxT0Sq -al6jL&}B>zgWg&`*%W^yD0VLSeE>bJPOJ`T_s!B{*<TxL_+xT8Se5t+_+T0_Tk?-%n$$ts~|U|ZmNK^ -lH48}|<GzKzwzD692N<EA&WX(;8<Nw_~8Tml2-7q*3=FC5QPX*l=%fLuFu)aJB&K9|WCa(RFo16z__( -CmKM@)9{pr7Y!5AS>M&?qysxIyxO;j%`;O0dAsH>gxMlqiw*SaFWWWbFnu74l9QzE>}tAI9ru$7Hi9s -E+6UgaU1FKyiOyX#`mX@PUCe2(iM1Jfpi64S0r7L*A+=u<aH&|m3Uo=bR}L_CS94=l}T6TbrsT8B3%) -GOKB~#k*;Fl`o-U5tCFr-;ccX=^12%7YP_ySx*D$&q!YYOkWTQrA?b#^Zb-TzuQN$!@;Z}rCa)WjZp7 -<Gq#N-%Njk~vB<Uotvq)$0I*W9cl{#IVMq{uzjO(W~YYgz_Ovjp<y57@Kj;})cIp^(~mLZuYx&|_M32 -f*6f~MBMxa&0cYNP8YgO|~ZVr)0c#4IjWp~z>BF7--k;ZaIl!E&Od6#Gc(qng3%G}$Ax#6Ob#*gmveM -ys%Wa0z|!9^9pgDndq!&JCi6e%Eex?~p&*O*%t(JH~#(^VPZQ^u9FP=<)Zl=?LGy3&hZo$Dd(Y3)9P4 -u3n*+B}}AJbSrOq_%y8bIL3epGZyO3k#4NN*r+!(u9%SLr>pOo%kzv@$ZMZAogCrb&%`}B9ycgUzC8X -Xm1-G1EvIRX?ym~3y{igeI8cQz{tqhrBU@PEwRHTwUg23=Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8 -NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN-0Ms=}`hWpbhCs`@VVXpb9}DfGLL!hxIEBLCYEV|x@?7X -4R?yGx3m=Y+!{+up0Y1{tL%$mrm^Y{?bxI8lXMrf@(WfB7_`d!$g!6dv7o&jZ>zsjc0U$-ovPoDD8Yz -_(hWW1QmFZ|daOkC`rMzKIbc!b4$(l$l0%6Y;hqy|4Y9NiV8UuSI$lhV%+d%za6(9CBWjCB0g@^g(*R -Y#*femZXP=@;^*^Zv}sQklt^6<n+p%cMwK=0{cSHIsj`vL3jK0R(???lHFdH^$xKcUl;ZcL!%4Wdmre -@-gU)X2Du=1C+|R`F(9Su{8=Dfg4nh|n$PV<q>GBOGm&o0d3z%L+TV^yzly1NgrwK{n?HOktl3r%AB! -6?U+3XtDQ5e4`1paO?+;1wP`(|KetgS#0JLI2bkEG~%Z7)4+PMF>hYKE!9gD5LL|i*X&yv8h{%uPFo8 -K%x2?C3AyfX-FOmlk>xYoA=foo4m;SvU<{smA=0|XQR000O8Q5kVeAUDL&Dg^)lr49f9A^-pYaA|NaU -v_0~WN&gWV`yP=WMy<OWp!g}aBy;OVr6nJaCxm(e{b4I5dEJ|F=|v5bc747PP!)Q=?IX7mS4g~Ra8aR -Viwq|*+skSwDi;8TiY0Hpx5eZMGD@1^JeDF?5r;?PCs<pz3&aF-)nb=UYBnBqxJ_ngT1I+kiX(I(qbt -ji>R&UoP?pZ`X-`?HI!abh_yy#2kl8=1&|&7%p<kon$&{q2@c?g+?tSWIF{DySc;HYp`^j9-YA{CfSA -Tgr|Y5S%<?(Swh800E2bUSW(!v<OVxIbns49!35t{O2DPGyCJt+8!VTBYe4b{~R?=!Qi>=aCQ@h3r(S -YgCG#1fPi#1&mBD7=`jkk8CWR^dqiNs7Zy>%)rH0Na0!hS(uH?&nTg-nv>b74|?2w{oI`R_`@ey!$Wv -2{zaoFg3<wdHzkb{gIfr_|>Lk<vYvTqB!tJc~pK<Gu*FG@O{BjaxITy;65B5HAaa?iA<~b#I6Z>^tAj -TpO&=>qc|uEn}>c(o|*E#gA%koM8<?Zz)1G^v<$zQi6S^a}qM4T|s;N03j0nf;OTVr`YgC9M!=9EPd? -x52LA1t>GhmY)vMuq5pUTER@DB>X$N!^(GP^Mpl|hyG7t27<4D?2UxUjd;OmO=%T;t`NOW~(cNf5EgH -8bey=_4w<a{6PR1jz+aU5d-%0GmJSB22@dA`<1tsU)G7*_H^+%M~Ai!u&EB4G$=8y|?6fqo;&Gx5i7% -90-@`cG>&>Ip9lFHWUix%h|bl*{R!LqM!9ZerL>hwnwASORYD1is_JFx)uU8Iz*)2%YrK?g0^UcGKMu -P&Q!u9`$s4=d*$>JB?UI7BWgm4#MoYH%5&mr*r$bjDiEgj{+SO$6sGTnWjOw+y|Wg)62Fw;Ld#R%SPd -BP(vVmbbC%aXU_SGaJkza2m(5P8oM*?PMq6&wTAnK$CZ=I{}$NciMhG?i_5iFub+~gDbWBXA?^MwSab -0gMYOpAo4I~T>u8&AQ+4~-F~G~2_t4qx}2s`J)I$@5QY$1Zb3mHFw26VYIwBB*4<-bOttC(Rh<$<BR8 -n+vDnDu3J~4969QF>v6gHPH4B(a`5TJ#?!0ct&J(qcY)dMZ%`^tJ#bT~Ty6~e??99I#O3}&RXh5*pZS -FE_%s{d=FMHP9##+(~_`ZBUesPW>VsaU?<yrIhY{Mj?c(G4(!TCIa*D=>E4<PY@p&LrV%~%|C&_-NVb -JPLMJ-AXI-+Z{vS=^vz$s4&zx`kFM-~1$=l6@QuiP3@alVJ;#yH0ZLgF+U&t0A4Z$zJt<wpL)kXe*Mu -D-4B3cQP4Gih1Pqi_~(7s?GT<URGbdG=#rwYOHX{aIGN@E}SIAm*!Rdi01f7Q#dGeJ@b_nu1=zMI+|R -C!x7gQj{IQIJ+heLo91(2l}G<2MbGy@bw-QR-tR`!VJGPMzr?@i;|4u;@5BnwcgOW#Lc%cCnoIl#$~E -V)cyKG6ud8F~eRi0ZDaWVg6CCC3boF%J=;(OoC+UE%p2vS2S<ZBF=>0Suj|~4#j;F)j9~^vqHm?Q!M$ -M-mY2@Pb|C0PgL6jmX4&#FoUlmGx*?ihV(JTo%@6bZKce;MJ?e~WF*X0>gJuUH4*?>zGFINFRomka<; -Lgi=rM5{kE4dJJE<+CFUuh)X!)W5Sr+(l+OuBgKcgk~jpW^q=X!$bOC%V53N>P+<kzIZcu|JOGoJ)!1 -)>#7-tWP(^S&A(3HTzmUjHO=Su2ud8P)h>@6aWAK2mnzTaZL0<19@Q>008PV001BW003}la4%nWWo~3 -|axY_OVRB?;bT4IfV{39|a%FKYaCw!QYmXI2l7_$cuSkh6MrxSKsH{t_wJQMzPiru+4QS;3f*LrOqiO -oEryG0OU%&A@1@=m2q+KMJ`&4B{M#klhOXjUx-~LzbKm76RNqKzs;Ng?!56k_>PapiP{FAY_PHvSK?| -0?tasSKy>f*9IIK17J{dM{2@ZbB(%ZvQ|;lrn^{hN!M!?C=%-0!Y#%9|W>_vGu;v#b5hK4<>0`*nAD_ -_#Zk!@F|x4VpRr$?oR*&Be#v|026TTwUkS<Hy6%A4#}8I~=$7Z;rc*o88;;`m+@Oywt@JS|2~>Qtxld -cMoot+WVR$zB&AExp#S4&KY}M&Ue?l<FC87+fE)Fu5OO|*Pn8m-(BDSmwZ#oPZ!63lxO?PUyl0^<xWW -sZ_3S~Jo|j}{&4kW|0$}={p;h!@iS6;ciipD_2J#kZ^_vA<@4cFd2?}9j=Q(}>y3O0;-*|&z5UDKnDa -jz-tOOh=GCXGx49j-zS$i=Tz{3}k568f$Ghv~wEVcc+8uK@&py4r+`q}mkN0nOSJ%68aa}(0?)v>7l6 -nLq&%ZEI9vzar(*3^d_W7N)f88Cg^G%7n_3LV1D4v$o^>-IH@SocJ$i&;p^yhM!+BklldH0(l_+zJU% -l=BT?^E{qM-t49{+4D{Uhm4M>)pFgm#0Y~$CkgJz4+_XmoLh_CqI|J-#b6Q_vFRT-{;trbbd|!ZIt#O -KBfu2ExD`X#nsK{WIPG{^zi(_UvtL2`)7~OUi=LAkIr5^dHDQ!dGz$W+$+!SoxeDH@bdA!^YZNF`Ln0 -bAKoqH`EK`B#0c|SLjGOE?~>$)LrU`P?&e~DdA)7@=Tz@?GI;s6yubK$muh~q+owg9i*%8XpZ{MvygX -d};(l|=9|HZp?BA8E!_8^=?YK|dN$dNQc9Y5<`aMmfe{=V=Of?5xT>axRRq#BgKia=b(vL0=hvR9vf4 -IJ3=uh`@?hv&Ocj`FQQeHmKH~;KkdHCdq|0Af}I!VIMFHlzQ>fQ11p<KL1kum&~_WfTs<pYM4zImNC^ -5*hW;=^U`FA?BV3OU^)1^D6PCyec8_vZc8;qvgyXNcBVOSyCB-^y@z>G?aR`Rnf<`FpDI`|ovT!VvB2 -i{4vf&d}CBUiGdn&))7X$`4;{7r!`1pygjTO4C^WQogHqzWlhI@0amzK<+%*%?<u}?o|$gpPU%uG~CI -*Z%Z$h{>67be@qCx{KnjqlZP)K{O$bJi=UsJJ-GMy)emRSU!0%afBE9<>62II_ws*9X}&xBKJMQA#}8 -jUKl_h|`94<*g!SP4#SxQ9bNSDwNAcz2_2sUdewma`lQW;bdUXEq-(NjF|KZ_zPX6wslscZ~e?vZEII -Ux!PfJ_tX<cg1N4_g#tfyrj`e}(8ysM{W8I~M3<k#qqi_=op<@6*eEc}M*(9$@^`Lx!W?_wDF(DJW2C -(rA|UrBlzRz6HTW*!n)VP=(}3-Cxb^O4KfmX8@mMy3o?5*%m9jLC@f+nS_HIAdfb3AEFb(pxSC@A-Sm -F)c^;0lpUB!NZvEmL)e4O{y!qO$m&MYgrM}#!*j#wdU`hyDw{gPSP;9=D@PBN5oKBb7|0T2)7}~#t`P -NurMo?6y!-tmqlCS;XLTiGb^)E3A#M<QZ-2-)L;^v7x<U!#*k@987>nnp@n4%R$<J9J|-5KSY%52^Y+ -ehP?(@F!}Sc;bIx6J+({W_Zf5lCUr>O<vUWt3%e9(9TL)MlCiV!y8PX~$^^uyGk<a9oSqcTz%IBpbdl -p>~)xt`PI`Ul-oYd$7eJx~x^y1vkmRC$yJ?7@qL^KC1nMb(q6;oPNf09A{xv}JH?aWx9x?<RMBbd@1x -0ek|V9RO5NwBj>L-RR$QfQdSJVF(-j{$+ByrmAXzDO_`>6qYJ<%W5EU^D}f=7bw8aI^H_gFlf)XGVvG -4(SfTriXRMbX;#_-yObWE=SkYUjBv9U~bKw)FCBRSA2OyQtRL&?J%Dse>NVlxqX>=EId}U)%mMK+U=! -i+TwBysUif1(D9TNr(bK50c{Ga<h+%4m==4~g%n5|&=&l!)oCC}z(SQY;IO(pUcUMT92&QGsjaDlK)B -GFxKkjL`xc8F;s?aM=(cEi2zUU3qDmF!@U<22Sw|Kb88Sj2pAq{MNM-IYJ1&=-RmzHjJJOvt0kJ3;)3 -gL2p;ZudQWl`BTz6T>4;>Rn69xB3EmxOE1i(@mu|CY9flZ^*<lTr1b@!Nylr{klGb>?t6EF%)pCk_$L -0~L6#ENGYY;FZ*$5cvb1PE+1!6sOV?cs0({?P!8#>QIeD7Or{t)N@OQAeaXgd8G)wA!-iF&8eNbJ21E -jC?1<*jN+m1_72mVm3sebT~E-p2Py&YiWSpI>{!WqAXVU0Qx3P0tpW*TVC;@b@G9APp}F8V#yggKw^M -q6%=R3u?Qg2dDjr`h#&DGx2&0>`pRR#uU0T~o#8<Wv+pKM#1HHdJY2y;q+VC>Z%xuCiBtej*EpHSMyJ -6IARr7jsvjEW1)0SUuoOVrqEhhw&}@j7;ZlCl&KG~OvS^7zuh>8$B_;w@Ww^Q=^xfDBV%JcaY-L5_`V -dyMBEEtLj9?7lQ|9Ie3=hf86YhweW1IN_a3}>x*k~Ey-~j^)B3vItOE?rG`JfAp;DU$^eq`1G!PIXm1 -+OqD7L29N;*Q47R<Oev>+9fJERyk&{MRZj`*URxwG6DzP}QM3#zIb!`^II_k!o!L>5d=?5R+?e?v7b* -`%W!aSMI2_;{gM4*;Is(S&2$j-Lm=Wa%I$)l_CDU%3N-_SG3%5k_M&$y{R)oGREFPjSjZPBC<dgH`b; -J^eH5=A%51?bOF~hZ|bPNL#qOS!)%x%#-r9@FadF43=fz?xM`~JzpVtDsWLbOn{by-2$)wsW1C=i{)I -!!aQJBO#W>a^HAuPQ8N}Q^ZZQRK72@!jin{=NnHUk3m}fTGi2Gepg*FC$R6zue2-x^vZW)vk7i#)#Sv -N*x6D<%7I$8ka^Dndvtv;F^`4y?)^PPmV65}iJwi0|2Of|*^a^Vo&uTo$#4$+%f2mhFAZ%Ad;Jyv}gw -<aJ3p|7Eojw(7(ZhmWO)f=j2UIiJa>R`l-KXf3on;&)pe+M5spx7r37FDYr^26q)Tx2qHa0a5siaKFu -0O5uiEl2nnb+NNyFtFe=qAYIKK!|R-*tI8Y6RH)A><AJN%(<i@Ap~h60BpyX`|MBr8=x6U&>}QvGk0X -oPCBv{8D|wGhvd^qRiFW-7}L6HB|eRghA%Cx3F=r8UmIA*PVzxzKsuM60~kReaDxf6+)Qgx%kafUof1 -u@kbj!Kn{~3=s%;9eGv+W5BP%FXnG*WDQ^*abS=3;;*|JE6We(jEPWmFA!(k<f2rInNES-6Si7Kk-jz -*+zPd@@>XYC1iG^TWAXpY^<96MkUS~nYL+h0)FlFMAFvhUU88xNkU4uHxqs;Y0f<yC)l17e5PhuE=`x -^W27cQVD^0n?_?n1%;iDw%)uuIqIx1(l+G5t>j%A~QG#o})K66|S_|CJPe>3ScmTjDe>VB3uDNbIV{p -`ACE)%ez$^1%|W^RthmbBS&mNNeEa?zJqFX0yai6ISPzAU_f;>^r<Mh(eOy=RdtdHJqrIW1kb=p@{v( -5pN&6_n<Psn_NL`IIzNz7Y=7ar$Z!#mLNbVk%%@>(RG(>wAoiTH$<LUn11mgKZ4O$9p%_aW<1)_V1MD -V}N5D}PlF4l<k#P$N2Gmgs)bZ%iW<*R@Wo)YYRjMo;ES%^PWa>fMnp<{(M9LTpeG&{G%#&eT9Jr$y(` -0a-j16#@W|Kppn(9b`BO4eE0WdO4fnr{Z8BK)A>&3_}XtB~L85UM$&3$eJnHNxPY=AET;#C|qy6^BFZ -3iQsjgC6`V$g7|Ac)!6o~cx<AZ1ZqSZ&%9Vz)vCD;h3Z?U`6x*eAd&=Y>6)`om$dk{Zlju+VC%Kp3sv -YF88&ZJdX!6`JaAqQ8If6;H`0;+#+ta9miv+ij}8BP$&J3q<8nw|YQ<IM<?_vSr0=nm&YKG>vTXK?*h -_zU^VbgvE>OlrjN)RacsQP;XSgp*75A_F*GPAY*4>ll5$1A|%WSBBl>4hYd`t%aH<WclkB9yeX4a7Cv -u|#OFobBCiEKVuFP&Pj;y`sT(h}Ckbp})G4-qh(J~~i=Pqpf&|o~+z>p;or0<?sC0rtBq$lmx+!Ia;L -2njTI|>$hY$8WW|0wsG9p22pi(q%u`L9a8G-<;WlYluz!M?5ZsjK+ubpeZ)-x-*?Xb{cp(`_z=tfLw$ -!ApSWstZcIiREx+4BP;o!lsDwGP4}D_BwOwK&bJd<xrrcnWHzA(;;{Q`dtp69lX;KY&2pzZM=Y2Whab -rYA<#mvN1JK&vu3kt?b>qx69)yCPwNhU?Ki$we%NG)86sWR$^45G12c396G~({-^XA*LAXns{g-?IPG -5sX`DuqbeH3FcPE+`k~kkJ%1b^ZJb$|Cr+cDDa;D}3f5_si%|&IV=kpw%5atkVZ+hx$My6SV({p4KHz -5Lt7+4=W$@7Yn4~>u;0EbRJ|Kwa7r<^@ERNVCLARowfb~K`+h(VU@idieOCZA>W5*eZ*c8R4&G?(eiY -eHvJyGgUE)1K^Mj63>G!<ky+Rj17T%AnsGbbZC>n=Q{+C~NJs^GR*d9V|3jg6M3ahN*KqXfz9NFT?+F -Ng{Zs|phMs%~#%*mn>FpQ@|REG*>Y7Ly<$2Z#&eKvdC&G<M$Ju}4{2ps+w;QHK77knE8eZpps#B_SCO -7j4Pp6-N~fC<>#Rk&pg_^lG0AKC~=Suu<Dw<#5YZp|#qjBE-<xG8q_E0687FnR10HahaA)vdL~ipxW( -|17F6X85E@A&Y#3!*u+~)Q<<h<pcE3wNC>1^q)`Vg<|AaRqlFLQKHWg2pk-6=#g#1p2#)}GRSaDtMgb -b$EOWWLAR{BsJIN=Wf@Wy^7IM_!1R!F|$iNt*HkmvA5%h+G9#&Wm&K6NbXmW7~vH%bi_DyZx5N8@>Xc -h%cv7qA>w1k32O;GvQwta;(s6;`T1OXoEv!I*`^5QT<Bie@%2awOnbeu<jG8vNq(gIuvd@^vlBsenJ> -_}lag;Zn{i)Sa8+lVm+xM20;K@L6GLhC+g_UFSblYmV01lnr0%JM)0p*%t$0HtUSW*B8Kng@IeU9faV -QORkZNf|X3JyV-T3)Sp`yj$@#Ow~0lqU^VBzD8|iJx)=8k7STqWCTmwdJg2RP4$rFxKZ$9Bq{}{0h9; -XM1&0Eu^d9=1J?_JLm?$5{*}!pOh7Cs2?3&IOx91<jW!6`4tQukf%B{!Vi?uc_3}c#3oMPu)$@TtMG4 -312!t!9eSiq@qJYz7Go@LjkT)$haNWFS3h0iuYzTru7PV>}CQ!{q76`IYodWqUTSbpyRF6NJXkfdSDT -}=vrVylPQf85c_iU{MHwG>Jo2-*0@uZLu1o0}i<{)4i7Ew^JhtgEFjcbi|Bg2}21N?{JFg1OdG>XPUg -xsutMp3$+?PNWSe2U^RC=WuFm9W6Td?}j94>E(*X~=ESXhN+WJdXxY@L)Mb$!PKlV2rfFfZrPS`AJkr -@yZ6U=1s%q5U#8s(J1g$><*Y$>bII8>L&mdPw#ADyYOnKeHBMLyTwHCun-yPPX^|kWgg;F_Evah;)6j -D6kq&l$$;4y>sTcp3y+lt@WsB9MR?!?2se^sjn<L{PejbcGg^zZ0KPndo!Ka$nEprAkAe#^#iO|i;c^ -O?lcBZP&m&Y2ORa@*lHdq03vjkKt}YLon0TR;WMjkdKGS`$JMPhVv(JHDP!`3wolc;HTs=7iV1bgrHS -)ng0G7y@V-N@^I~t_OQOe{wE}EyWHE07mxhFotWf>*tXk=rUZqjEfC|G-%!GLi)1_$saRwDTxv3R08O -$^7#v5pEN(GJkb=_H0Hr=ve@G1|@Y@Q@}6*>(}8XQE!dlm~<XzH5RbfIiBh1i?{`M1pQg09t|1hiL%E -u3VhJ;=w~tB5B9v14l9^vM~p;7^zI+#_d!Kqc!EGgd^8XzJP54*Emt@nZ1l=W9HMu<x$y?hk0sdCQ4^ -I&5IASWu&MihMA)PA`6Aj=vHRkSYNOaL@<ylk~2n*W@MI@b|8fWdg9F*#6J0^6atdB58AdoU#gu%fBJ -w|&Tv}yFUwmNA)IjF7o(M?87%R((Ckd(WM?4bsC$y&jEljIR77*`wmFj}+DmoNCxJ&#yhjfg@RZm*MQ -I`oPrx@5)FD<Wz>;<@>&UPx3v6c+NmhNCzQ+h2jvjBj6*U6_VF@uRi>(f_&+H8N0-w0W5!^ONs%TjN; -S@eNQ4Efr!jg-=MBze2aQGdzJ~{tO(Wv>x9-YQd1Tt|gAvhEckD0=9y&6tPGiReJAF5lPd0;1Ir&aaa -nDHEp5|n0IrA1V|@j_gvfKjDmRBg_KNWpP%o!p5mp*&AqNlY{JK)-ue#Qvcbw^w1@_m)|kAW(Nv5l<T -#7T#zrJXRjIrxD0jbCP3oP#7E!#@6ffd<dHp9?83_xxa^8_E%>>okOSK04ONCf+LC&mbV;K1ZNas{Ii -oq^FP3_pu-t<uFU2^%fdaNV)5WvoZVz`8KXT(Z$fC3=`ZRr!<;0|Pr!%PTad{G-K<ax9CwB77&|exLu -p!Md5h4*FiMD&l6zz{=GL|oWZRb@DzJ^;25Y8wLLXBiA{5{qEn9Dz7^wik+U%Z{CrL}epX^M5C~E?vU -1+<p%U~nOT@bXWEyLV~;xwo&i_M5HCm5C$lwqb|v#Z-bB0JR|IQ}SRA=Fsa)*i`5P}<Z<InVwiB{pu_ -aA{7~XyJq4Jge13EqfFXt<g(kaN}QGEULErJ%uMQ*2%kO+8DVqsd<=Fx9vX9B0=;61ex2IFU;CB$U-1 -4U7OZkN!1L=%?!Z0R1I!}xwFJ2nIMo=T9eg|7tt&>%@b@USyD76Xuzr>9rR#N4-^fD3&j&G>$+w&C#~ -&vgNMgZAbNQ%$crX3C~FD{h84O4#al>=hyIhy+9V@~oJ1}Kgd0pw#*!)IiU+GS#!KIt5z4~BDuL3>mg -!`f1ORs1!juBsLJKpWnON%00&|qf9&h!~#v4Iipwi;uuyi^0pnGMsQ=~BSSa|rsf(&Hz@Y~vp(>rTzj -?`oFeA$+VU?)lmQ21Zrf>_`<IR(<y2aEuZHW?=CrA4YNY<Y`mg*Krwl?Xf(PMBhHo&=o&RB^%=(^k>5 -ol#?FoM!=Cqsj!7gmX)4AwBAAkfH9i%gs&4;Lb$QPs#^W!J<i7+t~LK)Z)F!!D`gQO6wb3kL=FILor# -h6W%OSiL{fntV`{=vSuUU^oElu<zy*HJ~D52o!ES{Vc}@_A_x+=Dm|IHZQcsi6ISbG8}{>H%hAtFo}h -*8c=$~SDBen$J-MON=TXo^j#cdi<NW|}q7AT0OFOtS72Jf%hut|3?Ig`gfSX5|#WP`#tvsH!Q|T71Mm -hM5Np<0mwDy8qbun$-Yu`Z-59Z2AcsqmZf>l+|bO*TiRmP1V7CL%-;4LmgEvd*P*ThK9VS-L#*q!49p -n8pp0zYhP(?1F#LJ~9+GBxz5!~BpyKWcb#xT;(5!_H6h-ic(e2G2$Z&!#7@#}Hn;##k(EV1yV+ySmV% -F00J~uZe`oq<-r-R85ExSO~_c6stK?GP{x<x3IDVXS)L$OSeD*wns0z(ng)sEj=Hv)=UuO$T%pz!lZ; --T;UbG<^|TtvXura))3y+QWkdcyfN%FP@LX>%CP&{Jp!iQvLUPD24IMXWGj{9wD6#lyLmxPk}@)5@&L -=b$`IuCS}}~y<cAaq!9iYdm=Rh$l~loq!?cEb&%srgbX)d~qDWqYqq!sqXwi@iuR+id3tjKa{Xp+5VN -~|9u@l@Syox({T-W@`O5QRZTn`N6dUMQTrUgwmWHJy@bvX=e%o+Z)7KS6_%0<`Y5D(_WGG-YG%MntmS -to~Kh32V%h)q$jdS?RP@^Zk;;Up)NnSFUlw@c8^YyjAsZRijdW=}h}qcgj6Or9joo&d#p`wI)a_2m?O -non+@ocs?^O9KQH0000808trnOeO`F_&5Uq0MrHm03rYY0B~t=FJE?LZe(wAFJow7a%5$6FJ*OOYjSX -MZ(?O~E^v93RNHRbI1qjJR}A782XM4;7Yl4RD6q0(r$&5(WTVKFKuaT=C`B41l|cRa9{HN4Hn7VlX)c -Fn&J3sBzI>=Zcp6P<Jc<U>WI+A#EPAFZvF%oy78|CSm20VmqR8Y-(ot!CNTozz?3yyzg4Qu~q@|aLeB -@VFX3LgLLH+^;;-~CgCbkSySyozR!b_tae(l!S-4B3iZtUKkSr(piTGczm->(w3!P?fiYU8OB-BR!K= -f44QF+8A9DT<p|M=?9Lubl5IiH!DEt}1VA$KCz|3(-W_?=+WcZDmP!1csixp?U2$Mjz^jG)k_luyvzS -VVTL9!oPvo1J$OYOlY#4OSgxI5T1n2|1cK$rO9PcH>OJGD5qiV*_Q68;nQ?UV|HLlPpsLZnt8QSGDGr -MW~?2PaI|e~ZgW;@*bqq$L}+LLzf<>tSi;}j{mRzCLZ5=(@wNkEmyD&3@C|=-bK4}|f^<y^-LS{Z;Gz -WQN^_EW2fKmx_y8aZeZv^him7s3RH_RE#L~CX;_Ga=pm6#^-@-T!r;C>d#6oF!(Z4;CEVoJm7*$!JeG -TFOm<;0RD>B0VXgpfHH0+0?#dMG)G@Qj0(mae8qi8t}W127H`79X(L<#dz;zrC%BA+BK09hI+nX?yCx -qay`Xs-i7mD5JNGTNN6#6*$66WP}PtB1<y^{!r|oCSR#S&%lqOK(<Ub})Uvbr&e-{&q3+S<t1wdI%Ew -yFv>Rqz`2Q=%F&kcByZiZ$c*_a_>L&diQs|Kks`)%LJBdhX&Kf|F}fjtyW=8NkO^FHo`jgTWeORAN^| -{(WFvd_G`}(yb1gH&U?tgc9DARJVvb)*+yzUrbRnX(s(9&&oKosr@3op`j9YKM$hr%J4c9hR6DGq6Fu -k3U!v1wl1^rigK?|X%9L<!Z{9QPTqcfnfo*}=C@4)OmQI>>9IN7BZ;q?5emd`<y0nW3P6@Z?SU3(Uq+ -s{uLfxHTxqirfFGVVvl7B$^FW2Sxc)7)D^f2zM|Dtyw@9R^Mhn}Wdl>D(!%f7OjZgAJ#b9{3RLJ7UD# -QJLbGaj4JH?5ygO9KQH0000808trnOw8L!)iXK(0EK%103ZMW0B~t=FJE?LZe(wAFJow7a%5$6FJ*OO -ba!TQWpOTWd6k{rjwZ#mrqAmtQbMD#r2=RCWklNJEj1XtTN?w@G_pJ=sOc_D$xRo#x-nv|e%A9uBp%7 -$(hLVhSACh0krC_nUGIwTz4!k0f7^#2|MBT(+ow-I`uMXiKi)q4^z)DYWBV_zeedSI?fG|i+vkt>f4z -V6;`R2?!>haP{_XashyQ*5`t^(W{rm5Kd~^Tu#k+^c?d9wHyEpH)mvPMpH`lFC-`u~uk30Wx_xHQk4? -o;JZV%sX@BYP@as6j^@7}(A@x$H!HSGPvo44`n;|~vy{t^RkUpzd{zrTFEd-3k>)%MNLj`+`ydhy6uK -l~hz`tIHKtB-!YrSlvy#J{}!gYC)d*V{9$eY-uodwciz_q$i~O+I>f^X~Efn;+vffA#j)zm30a+n-)M -{%!l>{`FrU@4w&P-(rUEws#NP7eBxI?%~aP|5&Qm_uo9ec>I}F`}XnfZhQOi?Yp01V!zvde)w^F`Qpv -?c=zi5?HoQ9;@$S*&8y!$JjVUsKfJpC_GkX|<C|CUI?Vdr-Q)LfuQmMRXJ2if-o1^PZhyRcbN3i;^Tm -(fyuN=KH-CEn^6t&syY0o>?Fat$_Pc+q)F({j%QcbhlZP1I)&1RecOReg?7!bVzKy?Z`Ga&lZH;)l#a -{pF#XII7yZHk*{yHZ8^Y%J+<MF!lgMYaM|9I0^+x;7d{Vvu%{t*Mli~ba1wS9B9{rL9o+aF)w#t3ok_ -UEV1|NZl?o^MY+`^)y{C(oWe`Rw^$eizrqO2?<Me{-b!?|%ppe6__}J-&GJ?&p|z4DhFqpMCW2amSMn -pMLuE`Cpj*Cr_V$_VJfrZl8SqY<seO@#NX_ryqUw>62&M7hgU5;`1**{$Sg_yt})Wn8o~8i~P$He;Y% -7{}3zr>h9f(``2&htN$go_iaq@^{ef>7k|HtZGL%o9}=~_2o?F^=l`!geEsm|ufA{G@{a}m-FE-&_U7 -T;?e^2-eaKEo-#_hcjPj5Dy$zv%`N8ehQe5=n&EH<f7JM1Ee{%nA4E@RLhlj`8?Zbz+@3{0&PvYJ^r? -kJH%AU6Et1sg(|J8rn$DjS-|Iw(tcM}7D{MAR#|BOcb=Z|-9UWQn{_~!N9)U*&F#N*q?hwry<?*H1hp -B^6nh9vyFJ%4fk(~CF%Jq%DN$&1IB{ugo81Me1h{`ltQ{p+~!e|-1u-4DNg@28)B`rz)>j~~4I>9-^O -=KHwg@i+g*vr``1_Wt|-w(TF(oR1WL%I&!R)cR=rsil1Vsn_|ZwCB41G|n<AH|}+;Kb^ge;?_TXb@yW -X!zJoW?iuU9{r(#3H@`~nuYdk}`+fdEqx39h7_a=#_q~Z5V>Z9}RjYe?KmPUW-|ru!y-f}K`G+u+um9 -EKUVMXk<o4f?HRkksdw3K2`}Q4L_Wh49zuUeGYo}!iJM`=i&u(tqm#?4y<%_2uJ^A$OKRo^N`Lm}Ve) -at6=bwH3>`DA@zC&XfKl<*)BQh8A_Me|WYM|J}?e-ev$%mhQ{PmYl|JTRNzx3l8J=F2p*Uvxy`jclL| -Ie>KfA)uupTz~gx(S<_ZqwNJ+tl{sHYVO~Q!VK>toFE#PtW)<GXFYmdr5nI(0g3B=i73mxHxw4Hjh0n -PJFt>_Vk)>N-r&bE9JK28pFkw$FDsevDJDT5?<n8DQ-REVL6R@n-ZTM?Yu4H;Mw`OEp?BJk6PBiZQLX -#7FWb&B?hVc5l^l0=p2LIZY3tRwKM(})4NUQ!L8e1#x?%c#%;}~ufnIir~~&JOA*(`-!nhru9Es~Iud -vFc$J)E;1siqC&r9xT$k$Dxwzhz7AshGrk!(TJ<c`ox!=S@c<s$Mj>|@m)vldK=ku0l$GgXB<<T;8id -#pIi^Br2c=5NCosTnXbKtQbH}NL@Ht#J)YCD?}_ixAWvUp<R){_@VF{fAnSDU>o&N$u1D>A7gK0RC>2 -G04W^X|ExF|ji?C4O|?J$CzKWslnU5es<iF6CgO;%}vNRx2J+=Lbs9l8RBrO)PQzmdoJL6`4B`jhF<l -o%S=c+cA?KQk81m`CDc5c%NDsE;c?k@MM$M=8YDcmwNntKVuTEY>IWtd%R~zmaoVpS_sM65#jhC<`s` -n(t7+F7dM{6i~cg>zTa$Tj2Z9g0>mUjr(&bd!a|RD#f+rId&XwPvpcg$yg-X}&!w~Or!p7MDQ!u`7{^ -U4FIySwnR|?$N-WBDD6Yuy$?WzshHI>L>|Sh0VOP<{7TcJ5VvTd+1@avD-1AKetw%`X3WdDJt+Cn;5{ -rTug&kugr92+7m4T$Nyog(@!ia|*@yac)8J}s~ge(@87Yk84>fd=jYLVD?W^yp_2q{m>W<Ggh3=-moS -R%(MJH4gSXNk@0Zm)A{$QOE@nb;P4nNrACY>#&#%&{J!YKm68)WFWvabQzoyJOyK;I`kyyEAZRk8`YX -h)TRWDul%gWyIj9TYKTt#1yekad9p!9#(kK&bsHk#O*wen|PftY#6+_0kuFkQqvr<(4(;Lv4f#7F<E8 -qL^)B!kaccjp<?mUIQtrS<eSXe#lUPTYv&uEA?cxg=nE>{7%5B(rnF!+;$Z{PO6ZWwI6~fQ*_Rv>f5) -Y9Lyyf5`-6fU$Y+cc4`X5oBL+004s6QFUc}$x;*9tYc2KL)*!bbVac#XR+N!KZ#r?7EiTgXZ#v?)m5S -PTQ2lf<!Kp2mMUB$W_NWSWm^EGgZ%{yX>@e(mvWwFMsv2576knMQHU@3ey@4h<-)&*y_hvUJ2BM`h#? -`z<CgmuemE~?tu#+XFBQ~Y}HDvmiSk`m7ed0@*z*HaHk2|4u5+;bk5@*4QaH!(3q7>z)gYP@1>??5UJ -UWIElr31~uyzefhW^-#S9$FG!DIRgGf%}LV7ypjV6ih<wQAK9M5>;NnS7fA+!+19T>MkCZsHz|ZpA#a -qFO@D~SXpEDy<-VuqZ*IKE`(_7cpGz9xzW6sUD4B=yMC<mtD<r8u<4pmi*Tk`C=Cfxk+3=&OCB>(x8h -~pna;lT!NV|?A<`_0&b?y0VrG3TsR+vvhMwONexrtN#iGOwN0_)UhhB^KWVd*!SaJ0LJBfL3Dr{(T!H ->p9?Q38HmLt3DjE?5wJYutux#Dic2PeWjupim|MexFS@+scS_#u2&sBT>YN5B$eq5?R0OhUXNLK4pj( -Ne>CL?}qcZpXhe8xrr{=c0Cu6~kfY@Dy`k0v2plOj`v_I0~IU;m{0Im{@gAF<dz`me_b4^cfS#xy25& -uE}3gks@FTp&r~&7#+F6L>`!_WSC><GKCC7PY{JOD;VIMv~H+Rj#Y?%Ejf-Cy$K;zE%0E2HLfZc1`8u -bD7l^P@6b%d4ied=1MgY!=KF9=KS*of2w2#{kRXf;TNcX}Z-;_qlxb@O4H>t76hxi4v!QuC79b^DB^# -dz)JnZnIuo!&5D<cbf)P?g06Q2xHuS*GMd*Q4vG~RSh)^#o$VrUoQmFqYAx>EXN5B%7xjjTJVK71?Vm -*j4t3h^;-HQ9!Hymsq*pGyN3ab-A9TLT~k8U`!G%vI%R9dx&ps?!dD-I3gUwDCn2g=09g%~jze4ZgQg -~^r?YgBbtzGFF-ROAR)67gtgGm4D!$c3G0I8L107}$9I%kW3Reh@L?AoqdO&IUFZ@8z0eiy~klq}Wca -Jt0ZWq$J2JCO={o0*S$`#DhFLUL^)L&SB%L+FZCKL~;!r0ZUfFPi9ikYcxO1#Ez|LJc5vwEn}g>be_c -FxWHI)k{A-B!QTv}*5(xgmV6Kd4d&S}4w!s?q^wa+W<BUj*v@!&gg(1?+LQweK>(MPo@?L;SSq>|yQO -hJJ`5>z3PdBd8i)|Fg)GGs37mIj?&R5IaShjifFJc*iU?RD`e0KDDSFk|hNSoEZpRK9L`5nW!=VCLr; -IYxVvN@?QO!FP!E4|_s?eM#wu(G}P%wmyaEK|kicxOrD;Af<XDJf~rw}AZaJ3UN<D|+m^yOspP82LGW -^A7RfTbi{KjVq9M@R}uC2A3h*m$YV`ykPXIw?W?imUEx;MnM}6+~y9WT0b!31cgP2#G79wE;2q3zJYQ -i%%+<2*8li_>}8-c3vrOm|1)tA&DVxt9V5NmcvNhj8U1v*s{h0pGWMMu)?wUXe}le!Heu_8KKznn@}N -kJEj;vIy=jf&saF2h&Wh{3(I2~O~kbsL!7&>*Gci%kn<XtfThobUKJq3n(+ckKlc(Vda_$YrAH=MJ8) -8m&Q$q0c?*o<<xHyq%R#b9I8}5*#1IMT<%3u#bKJz3m{;Vu<4^{fkgfp_5K%|QNnM+FvU$h?f?tx!_r -W}e8892odJvu_V`lQ2T&9q@t4JTKoi+aZT8fa$n;3(wVBcy|zSPZ*;HiylPd9<o=^}^b=OIT0m5NWXK -h5i|feBa|Z-RrahG_Lv8L%};yMq1F;_c`b+L(2^F-Rs!?q-p_5_**7Od}77Tso|HgqN;I!<1`w5i%u! -SY?le3N-*6DGZ0%Jg2;4ld9H<UA=<B*4RAkacgX}A&KE-*4h*0W108U{K@OEu?Lp58SP=RF`IpeMqD$ -FfF+Ti_hRJ1haJ&6Obol$U?87`^$0(>vs?JgOe$H)9pgof5XgnkYv2f2LS|7*Vu+T#maK^w;NW3HkBI -xnM`S|%kQ5eQMZ$~|fF<#hb}TtQB48=g_NufRa2ExKvhy$ne2{xG*${B&&N~{Wu<;4o$0ge@GmeNY48 -7h8SsX-cEq;XWP>)cnjF4oIF~qWB9YHQa8Dj3JN?0O-$AMUlC2o;O-GtKO3W$}6gkm;WM+}a8+?6kop -rm}Drh74T(I#Q7i@6Sw|5&c+0Ab1OQBunr`Ditez$+oHjfFNs*iC}EOF{nAU3}L~<tETOR(yPbupAnf -LZnVkW>jskhQ*D$+#?1--n-_RDI!7z?-hz*8q7jnLE%Bbf-4A-0m`b_ij$bA_%C)9>B}tsX#i%l8b9) ->A1zAHi3n@A*HVPhVDpHn$nJz>PQ5fC>)z02LQccOVqm5lLP$)5CrC%u(++I;0-M5m#OBp0_$Vkj%mK -tT=ZOdEr(?2|Cqb@B;rtaZeX>v|dr7i)Tt+B@%!oFtc9M9IwQnR1NJ^yPx;9f;&=8~NVkqeAk@0z**$ -6<{G1eM~3%$ucy2gsdkHimO0MLVIV%z+nuv+Y!sS|)NZWa6h^XkCF`@bwj1T0-&6ybXecPby4$b^D`1 -eueGIc}$6?13p&BQhTdWqS$n{*~N>Ns2rVOGt8+#7hRx-&tA0)0D)24*e~9F#YYxNO%QIF<v@MArZze -QV{`5C!`5e73z<>?8suTGax3lJ}?BB&7RC)bz$055fWS_@_`=(6`KP`#2E20)`a*xf!}ON=m(EV+F1o -n+5GJ=(d3emeYUrm_TfQ<S=!pX5dljE+|9b>VPsj5bV3sHfUQnHn$aO}YGVa`^KQgO_8zwtqU<zLN(P -RAC7Iu!6VoP@B>X`0V*xN&=xYnj%>c`ta3}$g#=^!s;w3XdNc;*$b-DjRz_O7ycYSWNsvxQ-^vjPO!x -TDPL5(-e`-bOFM0Syx^25l#;3TeSGg7~B|1&-(cr6CWCLI`hB$|be_aOjdOc358@=C5#$@$~WOd3w?_ -L7Pb0ZTQtKh+H#FK}`P{9~iLu?BE*=nH8<C|xF6?bX04DS`#_OrE#!<1l3V4Wn}fqR9q;a#YZRm@$&F -yGE!lZiE0mk`|<I=*{tTyAUMd%oSIh1}sPm?zVy+L=54}GBAc7>lm3BiE>81P#RT*5=c6nyRas%snjL -MCjm<mY|=@B;gXAIX17`2IEK2;Dwqli9Dvmfm+TZYU>gYAM!II)s4C3JRKSOQLyQiTyMfDski=3beFw -AiU##cBx`|=nsjQ8RRaFSPR&O#MFdisEtW+Vc7E{>mv#S>5y;%$uf4!4akqD4(*J2i!g!Y#`J|kd>K? -n+ywpaKANjDH7bsHATHcTXu1Bpb;!qxT#I&Or}0}M4UTM<V1z*aaMc?}BE@k)S{u`=$=U_*hJNyy17I -)P&NbwC`#p-Ng$&fe>)j)hInH#yBs@e0?I=}hyCq*7#P$Wof3#q6eR<9Lh^NKVXvkA-c9V+hTw#%_Sa -T{{b)*DXUPVK}jKe0w%Qz@{K`)URrpcQ{#Art~#%1T0~?cspaNhN=~=CC*B^<)n?*%%F6GMafhU2#iR -ByZ)L=R8GGvMQ8Iu%c>iVInDUoGFJ>dK4YlCgpxIfq?(f;)LAwojc&#yiq$pafzPWxl`u&>ZTKro?t3 -=<pqT?Ep{W}pL8P2$=-f~Xf@#`{m}eyERZKb?q9KMzZyuKS95^&$Mm?fCpmKl#IjJwmW*-(<xnp_haB -mT?l=(pP`ZPh%4^wFnh_#M#umGY5&Al+lR+|%##WFUN&$Y%8jEC85ETteL_8j;lvCuISZy-3qOOvP7G -M#ZJtam;>8yyUBi50j8rX-Xtj1lZriX>?_979!!?W=JXS|9F)Uo+yS!J%BhNHfyKew>%MB?A`10?J$) -vIxk>=paE&nRSh^8kA7b|1z~1EDgV&iC;Q<89$bSBuYZWd3mAm*iPXBixk;Kbz<5dV9DZ3fufVe&6t@ -8l1dT@=^EI8<q+GnLUr&1Ei;q@<z(%`Qxb-vGy`;-D6W>djTW3b*I}a0=}f~NRI(-$6djs*BIy_|_yq -K<;ERAO8`8UJ$*N`huIV79V8%s-?Q8RL1T5vWPG^h?YSb9BsoW&L%(GD6D5SSpjJ|=?8MpSN#l$y*V% -1*Oz?6il<&wj{<1$dt38^FzYivbxWd%~$H)5xA7|~;=bgM(a_8K?>maxKXxj`w*YZxo2zJ?>qn4glU5 -}O<4ckyg=fVppG?{)dSu>WixuXtM4A@GNakjc+8#gI({3f5ANnRI~vW|F;ZIh)Nh4NfMSOO7)L3xc1B -Mk-a7UZ<8~lr1V!6Fb!x7A50CPplxj+JU!{I3l4`y%-^2+BcP|X0fi_jAhL|fpjSe)ufY}kP1tYeIn( -kjME)R-;grkuWbz+0ZTpv^xQ3mBfw8cWvnMEKoQGY_aGE&x^J^hH18a81XNgKw<X8%uUKQE-APXv20X -3@)(yOr%yvV~6MC?bfNoY}C_^UTsYLRc+FY`=#)XoQ*n~`vlO&K>HXm-8GK+am1~Ek6mZZ-i`vRMS6( --a#6dBTaS+_#Kf?JO%N@~Eh5f650I;TOldvr30=3Pt1AbQk8d=Otkf)7n)4opd?PdP^L$zi6?H9f6X3 -(02%IIO~1eZVVaSrzQ+p=CY^moMuUY1++3m8gK)WZ`{s`3+UsPL~(JX19FI&M-)}YIKNV6WW3^W%J|x -^3pYHHhD!f-`oN!LluWCCJm%Ct)Y2D-wjxx>S+$Kg~Ga%Pnw3-wG@?rr5|nz;kM?Gbpn}7RCx+scEg- ->YGRpUY$iB}T!mQ_Ow0+!u4v?I#sn<cJdarCz`s$?tI0sb7cdtuuA(~#HkpMG5Qw3a152_L$7S6@Eki -*hX#fN6#827W;9x5{8wJKi^d1ISWQ`=KnhNfG;3ZUZaAEnlmI8$3Y^;K?xw=VoSFD~^(b&rUK8Ifqqa -OcO_`z!9c+Mp0V+AaYfJL4G5LL+&XLl>ezwphinLNAr7`78_#-a2O;fi4^{tH;Ko8~xh1S}o%5z|IU4 -`t4jo7}UK+43p`O9>IIAQDCT3dmM(mb0^@H!SnQ-6DKa^Cawm$Ga6+VZ^=5aU#ZytpslnU?9^rJ3B$F -0Q4g!V*nIU_|kzX30c=_7P5KZd5Rf=+*%t}qY&3_QEt{ULDu7vZoLJUo+z<b3l|P-Nl2AOnRbKU(~uR -<pH(`_zZ5Tv$QJ9?<%|{CC<rcaUv|m!wG@<uEQsnsNM8#1WH+)zmO942n(;NMUGo3%(uDPKu?9m?M@! -CYU^pxzn`)pI*)bJ-=8nnF*>!Jx0P?AT>spADEJuMI^;x)Bq=E?eBHGl)i1we!O+h|MzFFuj;EQ!DqK -8eyiue}EFEZ?K^EJ)ITXK9*5>oKf<OGD5W*a+7-woFZI54lQqLmlY*cn&>Hcg-mS9^NLQt6P?o17<6i -rrRtEE+RKD#xi?DJ675TmjVh!8__pP$c+7UBh%-YkYvPprG++h<I6+oKxiOe0PLYyPqusponm7DpFBR -E<i&%2ECk%tQc`-n9W@v1n-%N?vfl&Vs--Bj(Jbk-cCv=SnF^eM3B<TbbLiAhhur!iUSS{q0@HEdNDS -!=uDaCEHqjjvp|f`#GY#HF~u3SK{lpIk_GdcafidwO@(=hWU+4IZU_&Vr5wD2FqEWYgT_#b3t-*QGLs -b6Vx{03I0BYJ)RnQ0DI1j&K1hE#PG<*8?(h)=7uDh+3<M+Uq`MkC3=_AgCRNhynGiC3Guo4q)tBV27! -2@1s{5V$6CzmB^nTJpus@bX2{ik{-RdOWX1TebAywUSb|)Hz5n^R2VHB7Ng{nlXEPH9ZPNWNBT_{4Ad -f^q2ZsRViFDxbShuEm%szzjAK-8xi%OV<8vJVq5o;%%h#QI#W3DRwcDi?PF2U!djEu(nZ1fZxZ<5sgN -krhPi6J$;0oTN&L$&S7@57KR?@KLgnWs>|^cqiFC7FY=DeZ{6CQKi*WF;CFx5Mksn;~MHUa0D!A5-Q| -k5e1smHlc>14RFilZK`Ul2V@YyjgqF>B#YzXbY-THZZl-G0ynMj?j19e@dq&pl2T0qD%}P7c0@@3(p7 -VUrQLK0R_K+ELAp&ydMy)qCFMTQK_m^NpyGEZKg1h@u|Y@9v&ayZsG9Cq<I|=~zm_5bmbigbL1v|?sD -uc@HVI6?w-IMDrerj<L~aLYY^V0#!H+ZHP)%jo3Q4y^E@%~wLY5FsYZlt*X1#c5NhkzUWSFrqMani=9 -$2gi;;w-q-4@WcLWq}z&D&(ict0jm2Q8HnrKKX0WJ~SF3g`glq&Ha}S6l(<HiHROiXojP>P^Fj#U3OG -Rf#5Bh5lBM%|ynRah36bYEI;De%!8sL0HmMI&e3uc#@(R9h4$b(~8$dT*!+6p)+7&nRInPhoUJx#0Hk -QLAtG!WfDcbL{L~@?q=caJ~=E#k)T+x9g-fI#CxVm*<W!eg!=Wo))>+)+)I)ME+gy%KL%k*#5$$PrsJ -`2R%<fQ1hib-5=aif4^0%hEn5NUcH5-j0$5WFi7W8K6j?`;QUl~q+&dI4UUq1TXTsuh0AeBGjdBfqQj -9&_UZ+h|&7vN-K**!H%9NL)Z02yP(%|t;Bjm%_Mn!!EEDh2vs0HaDStvR3Ocki{QS{ApXXL~3v)PQ?M -`n>UpfYqV`*+p!8W@BHdk&8b=LN#j3^ct9(`Ac>Gzdhn7<S3vgeOEvr-R89bTHRNKx&X~3*5<4+yLnX -8gN`rrfde1T>yLvx?U-zC8E*}^{xZC^=2>+%+c~S@S)~u*su#yjIh{JGwAN<f{dtn0sk%3^ODe<#6lx -~%I=9MtelHS-yq#4$WG-n=%DI!8pfiV#3e<lKj3Vvme1jRhMNavoa{eq`w*+EF5MvAb{Qc>I}5MRiXB -|gYQQokngRf}OV3n#ts9!qT1a*&h%i=?-Xz^7p?KYkF~A^gY{E$tk^tJe04IvrMS>2wc345$Sb)b1$! -Dk3G6&B1yi@DQvU8aX(oF6t?kAUB07|z=IF!5I3xktS`vTBQ*Ju@38l>9<2Pb7+F#l?b42D1g6R=aIf -?29<FlsY!Uo)|?FrKBw51x3efhh?QGNauXOP`957zTx`o!oj!`{a2dYeR^LeKURm-rBSTX?f`e>9!h) -Ws|*K%t5?F=87RJ>%qggq&MR^yL6yIO_bDGa7i!M=FufYc@dkB2<xO!ZeeDbQJ75&jiAoi3IYgCLCBI -(@kuz7rSC7^W`lG~DT~O~ZUj9lzz_zU0!b-$XMsF4sYJNIW`S4pDoBVMICh`CY(=&t)cg}*L~|*KcB? -f)qMjr;>!*kTDvjoLxKRBN3dc(i<MkDIH%PbHjI$@LfqKoHC?g!=>3}QrD<wwXx|Ciu4=_?n-k9t$!P -O-dl5TazKnPvPpN@?L!jsVEis$ZtyRhS^bdby^2T@2|9xkqumzEKlq+8Nx0jzV@uz>+d8d#Z)x?>S)0 -J|=Su%;Eru66Q#&?Z~f+O@_JuvBSBRDKfPw?iE1z_(r2%xQQC1PQQ{uqlN?W2IRuv=qJ0*dJiYwy@0x -={6sBz{vg}ic5Na0R~?-i|XMKg*EY>r%0bjGLkl{&Q%i4QfWxHanpew0IwZpL&PfG0Fu9<G&)mjvl1O -nfnoeL6;bj~Cgt>&97DQIG`eMQ)J*GDp;szbs|qL+<d*QjWCVvvhf;Mgrl<*#ojm8N!C0CH={A#MCcX -DA0LBzg69mW{b|YEzHAf|I&l9{O^q~7CiJM7GE{nI>Al(*Hs(wszu>m!LmxMZi-3?f%8yK4>s~5%m3G --|@TSd@GTnYl|HUWjj&fqBl^(T7`JZtu{NRgh|2#(8)4VCVS0fL8<>N0#U@V`O2?T7V%>a>wGj3otyc -oo;(P6l<5m`J=8n__PeDcVMpOeH)l>5>Xaw`qvsDwP<^WG-%NPBw~DeOYa=r_*Gy+Qq>vNK}h)<F2GE -sep7_(<}r*U*U$s^6`+#oVk@!9&i%G)ne(J_1vT~#!GXFBE&0SYYgc&A!K#-j@gJ{O2kOSZi)TqhmPw -MX2D|0A(`pEN+;<btzS&jCh3-3Z96RWm=;*K#F~&GWJ&`G_gyHfl<q75+CcjY{Bn9U*-JPRmmEX7O~p -<QRzZpol1j4yYlm)Wdwn1Ax%oHt*I=ocompUIK8q33Al(*{fkGW68x-a_F;W1kg&2owd=1kyQNAgX1y -5pG`fhWw#ICzod0vBbTfmRIge=?Z=B-#}5Wo%lld{uR=J3tL75y;dJ6Tz(!7_HvRcmUHZnF)J@M=2Tm -JZdVi^0xhj}Bf`wNp;-)(s&=7D=z<PhA4GO(Eryie|t<n6oy;mKFJS!~oPRAOa^?VL6-Q5;9V=D5sq^ -WRbSF3fb=q=53H}D_tnv&RT1kP0oBZO+tN#f`>Na^Q7bGR-xGd6qAV9gD9=_S_-;^j%jT5MOd<8PlYd -l5h2VWX-PC96&znVDfF4g0}ynP@s6=OSL0uUblYt(INdyX=h+u<V4{&KsKvSiKUmc~?A{|BIb~~S5o< -i}O41vo+YEuAWW6-O9;tOD_UjX6ogJ2hf-+4t@9;wp`M;_u_J=yi)>n0`LAovG!@D-k>O6?3xmK0LEb -*S1RLj3O1i2K%Nf~Y2><=FPYvFDU(rq<vmg{pWt~T>1b22>uwk4yHAytu2d7r1o4yp+Hl7{WVtF+l9- -KtTl^l6b(7Q&o1hLPw>mda`JEHRPXz(@#qjQQ~^;o0heY>;mIVG)a+vAVW6Bidf_Cp-uY<07j{dbi+4 -)5$gU1pz1isH;7{LAvd>FgJxv1K!0Ui8hlIGUz}A^VO`YYo0N{2(Hz-UAt|lf4P51w~5d?lL;1cS2VB -NzSuQFHXK+NvTz}6)ct_G*FIw8c(!h?l2C(mTdSo+J<B0;g?+bTMtW-^q}e5p-|_@P$o=G@oig2_2sM -{%DTt(7BJIvhN|zjXIvxH7NGP&DU2WG#u%Qzo0%oBOdg>8v&{^&IP13E*f65qTHZ2jq04*kKRat1yLk -6biaVu2;2|!~SOH(u=@&%eUNVkQa<9--l3s|#dhw<oSpaT&}1Fs}ztOrGtY+$sLyxJa{jZgcv#*l6)P -2`~|#+ed4cesLuVq2%0oew!IQj7>MZM&doQVfykmCAUpelez7w@ZkQwIp$bLUwj}ZOoEYK7Zvc@D{s? -Rg?Hmd5&-fMp-GMcbDc#y0x$A&<G95c`%!X*e2vU>k}AYi=>CKIdNJt9TOh2(X~3j(mY7FRm`AUbq5o -&Um6#jIFO)_zEt;3Ru)-ghIo;sQVzFfI5RI<QUU1}GCk;llqu~BF%_a^!JLlwTD7M@9d^;vZk!Jl>C^ -~N+T3m2T`CRfwon7gIP*+dCe1D1@g>c>kO}}w3Q2WtC>E1n(`-l)FExkg*T9`T??43%!hq*@qY*{Wgo -)VxFv(A{lX<Kl9Us6OFO*dZ;B5WJQb4+`5+G$39K`(c%hWd=ywXQK&R)rGXe{OOaEgS`C?dqKa$aT=( -rwqD9CCfs2tqk<YAA>CM5Ibj36C|w*UffPFo6QEHw~HUGXGcCW`lHFq{ZQ1v%ITmgis+Hob5uDE(&+L -LVw#d#YrMAaRFwc*aCB2cm<@}Omvp%p{&s2x`2x_o+v394l^!QhA``Hzap-o&TPUWr}^=!{kPM$W+VX -kq+ly@60<}b;n3A;7D{F*dCDGu-2}l%#;C<^eVuz>h91&wA|Q`B`2(nSJ^~4t8g7UrnnA<1;Uzh4(h{ -Khc83#2_I??9NVggAF709)VuoU0zzVcgcRJC#P1jKJdRGx;R`NtD4Y}F}>|QR6{(y8_SeSx)=!DkE0^ -TfaAui-;8{k_tM;(TDM0>FQ5=*{GLdH7PtEJ$8bX%)M8$D__>{E`-j0wB=mry#GP_i0rOC)Zn?7C$Mn -eOT`^v7;VNLxc14YRUSPD^0#c_x)oBT$g;;Wl$USWg>?gv=~;bT8>^;0RbUab6d0Jglu?fQ?#!ZaRoW -C*3Y~<qCupVK^+Fj8+I)MWcK!dwfW`HFw?T0YZ#P`eTOVsTK49lq@r;nS>dN`7p}51UC9$xJNZD8pN^ -7VVOO?)`4l!U}dV?L+S)~8WIiG8dobhHwk~Bh+Pq6<6$M#)pK(|y3J4wvghi^lEb$a$iW?6aEED8=r1 -k;q*MAlDa8W5;!k2G1bMY>9FT4ksd=Fg6?=pSBcBC6sgk;-XHxkslesSf$AJ?X;KLq7qMOxFvX%nUZO -M}CQ4kV@JehODjb_R1gRZvM+BM}A2|2+wIYg&-^HzJE_G@5DLZ<t(0|o_yu+uqJC37Z5DmMPH<?v@V> --=`L0IpPtnzKQ%SYR1z-~;NP2aTwz1kYo}@#wI1Tnx2mvvfJMDi{cBo#vTME^0Fo`D$Q2Al()!m>Xs) -c_fZ}J2<BaNTd*hBojNh3>lO%OB*um61mjurMWWKj426a^@y~yn>1*Ih-<naj=F_)YxehPQ!LaKEdhE ->R%`3`Sn=@z={8#$HJd@)%aBir3p{Pd^282#<4LJ<jU1hQt4zu~PusO1$RiuD5U1JoC5@uZq(K4`$^= -F6m<I@vNgdKCFw`ux{2kOMcdg4}K^~B9^Neu~8x5Y73iCG=q-w-42{a8Mg4<~*XX+wn!**Ts<He0VAl -()ZG&wDEpS~TWN+B6aO5IvS@n3*a%#QL+vd!AA7TJ#a!Sk{ekZ!AFSc1YNOU0&=!zM1>w{6;|tAL#ph -4NSx_$sG$aw-+Y<4V?XDF>w6-X#m1HicN0@vt#+GSe}X!3e`n;oXy(U_skXKI6{Qa)mp!))>-lvDjC2 -jmUzrBN$2sz{-}7Y{eI7^VBU2P9D>jSo{O*<^YYcV1=W24vP`n3?<bF0%8KDELX=@k<+6e25toSOI@| -VrSE23PJ6K+4@kF3a7H?ztxBG#K+(6t0WM;_hfJ^2*Y;!}%&tVX(_*SSh|gK|yaUp0g+5$t-s`5v9^l -d4E$mORc)(i#Mh*$saK^x8Gpx`G>lof6@3=Ov7_cBl!oL(rdpD%8EK9Pe%uGLs%pOWPS@|UF&Et}Uz5 -U=C_(bzG+X9#D!a2JpDC$k5z<u*Qft^$VZJN-rCoceNc8$<wD<Iu=2^nl}hiQ?T{YvJ|s2cEok{I1Rb -44i2Gj-%c8h{zO+t+ycJV>{jC+tXcIPJu$W@6Z{>hd598g+X*sp7#W=vJ){8z{un^(8BTJRse6FxV=l -Ewjmk0$gK^OBqsp@cbmty&IS4vkXX0Zn`-U+5alW9(4vRERj5Z59|^&MLx6P!|=Eh|HYO8JI!-8a7ff -vd!LQJ=)k#RH%PZhow3D3d;sEE6~E3hfk5FWjJJEdne#ODqISkR&IV&!kbhZY&tVZRu&Ylrm|xSJ35l -|y3r<@zVFNq?#|9ZbopKTMAa+fz!$%HCw*}Ze3(0z901-;|EP}~h!q`g0tMi9$RWJdLl#y!pUcJxSJV ->{cy)hr+X#hT?6*LI+t^`nq1h^~{pgdhDN`3;%E)+F7;J&mknD>BmyR~`ZAws6AXzk})==s4*CBEBwu -G6>n=Fx6AxoS;ZR@GwY9guD}d|vWcJCVwHj?3vIj2skFq~eqo>uZy{32Ah@tH@gP1^rrM4~|2QwP{2+ -H5=!h1{XAoof-^3AaAx*B0tn-9Lc@*WoPARd1*+uoY2P}d8irThoo#7=-{%$>MbweF%zcD*`7P=Y4d< -P_1|c7*$PRwI!QVjH*%9=O^n<xcclUml-=VI8(7S(PXmgl6FjRvvGQZBF{Il*>_3(1YWc?l16ezL1PO -f^mY<2ucZ&xYCQc?QHXY8hF^8isp9kqS$&nDxw=7d86sA-uOPDT_8=~)SKnnPlc0q&P)6$#|pI+j2$Y -H_$=zJut$nUUUKt{gM4RKZ{0IT@7I+GKRG4V7!-3?kY)+tj5q}x8k;|}?@CJlrSQ!422cDIP<?7W64w -!!KuMcbEsj_D9vb4B!$ZV77X$zqR1qLBa(q9N7jw(QDEFXG(9yxG@Qn=$!^@8fMt+#ucdxii(HJY*|q -U1>lg5fUTop61ZxC?VU!-g#m-e2!-@us?lV?jO=^MWAY)XH$9J1MZf<>a?28LfdJ4THTl6AqEOuCt#z -bPzuXqK{p4a+eC7cU?JsZZxHc9x6}(nmBe&(#;z9VcJ{S-wlNW{0~t)ZTqnmIkZ!Ya3D`uRO-sChOn2 -DCeaM{EbOEzir>Fh8kkMDeE~>$_J>V*rt$=i!?TnL8HRd62o+?QQKF@+9)X%P#oiZK+iA|f+c3>g|Iw -aeE4Gf3HaxLZbgp*62Pe7!dLF+RZS(O#x(GyLfAJ+5fo*{|SHxfeUdd0_(ZZ~<75;{a~?R5ZZO$M*<t -~$lo+UDG`PBOh_)rvSiOW|VO)@f-6q}vTG?Gy?+_;vRn9HNPAjy(H?3|{TskX;C>Z+j|WKrZrx4#^Zt -DuyK?LYnN6q`T3#rUQ-x)*wl08a^BFuK0SI*TGw$$Wra)hFmExq}#&wB-J0xGVM0ccnImK?PN?1BV|b -0JyTMqiPCmajIaT99ba`wx}{cDvwb4!ro?xTS8I;cn3%O{H;VOW9?K%m?B8(dT}8SE?!sfNZ1tUxepb -vw&8lbFvRn3vfwp(4knoht5Xb<!l`W}9tQTGZ>6Wv-`H;K7dTn+;J?Uh3-7!oa_y;~%r|sm>JdX$?!= -cPvWTUiol*i#ox6OBwbxdVY@@LUMX$d8SRRaMJAK}eBCB_~^G4gEa;RkCePB|=!CWSF*X+;i9u@Aa<= -z|BF5(;viMM2NO6mBHZEgo|-IVAZS7=)!s?U;+job2=yk?;%|-klJ-h)9Y}4o{mVl3{-`1fV3~I@TF_ -2c+BW)CK#pvsz&7ZD%;vQ*Q(P#I|O;U~LeBvR$%uA$!-sN?N-Hrc20*@UEoKR$7bB1_Hdr;RlX{KzJ- -S<pL6!?n&1kkvcr1Y!N~aNVip`Yc@W6_K+nID8U}B1X5VItJ*I_t52EgM;<RJU?_*(Pgh(4>9$)WvCf -APs@BQ+bgRg`JZagl)k7wcO+7N;E+uI^97cdURyx)p-DdkghmE?vyFVlhq5|1ZhqD7RGq|ufQ4CheAO -64|FK5~%-HH%5T>&X3QF#Z|tMe=Z#Q^_A;gm*be)VF39m`DYesjsn8rXy5@S~F`PQiP+He;2!vgYibf -rm%6NGb$LFg?rx++S7YNNeDOBO5*C!G>{S5D)zF_=lp9>D%q(EY4WB459%3;=v{EfMuG?2z5xe8L3Fr -rIMuy&;H=-u?&J&ce$Xfv7J<&4hUk^JxEVpKY&`<E$T0fzC*grhiB!Ogh9dgR1^VYPtQEn=HdY{bS>b -*IH{z}ld>g*!`a&9ajn3+L%QvjfNjtodJ8TCim&rfka@HL%(;1#A?r3n4^+iwb1HMQQFej<UDE9^))7 --8p=aMWiB3WlL{gnY8>&5B)Eu%LCkq#x;@oWwHqIHV=cYrt?H)s5QI8h0gj7@yBF=`PyYZ7ziy#gXP3 -0CEXpuW~YW9%BbH4^AV37m_q+3KONTa*G;<I*FTw_!cWSzo#I?Q$SsP@he$JB~m1Jl-==lO*mFyj>-n -2s}@dkKAR_rQqCr<lmBkT?NxQQm^iw2LRyA>Ag(fi=%l0}~&D2{{Oc$%ElxVHfc54pg~O0?CA&Ww%q0 -b_h>+xTq!_(rxt&<4K#Yl8D%{(}T!yZ62A_eGYgj_55Ty1@(p|(C!hIyTZIqj_HtYi${3lyov`JfS2~ -ut{NJDNQo-t_<kw@$$z2n6r!z&oO5MP{&fvZz+y8`Gp57F<HEcC(X$8$IWx4@${OcBABM3ay+nPI$M) -FZd@jmVhjd##;MXHqtS~_x%r-p&rFC$kN|#Y3M9SI5V<bg-6tGimb3TMFb!i@?+q&D^=&`(J6rT4h`X -DLWqai&Vqe<8BJRr4%@Q#J{R7Vqux<J#O?Gl>D1bRfP=kxR0Gp#@+i%UsB41+4WP##=>QH2zch1~pRi -+#DKF6p+bN1jj6Jc=GJgr|Yd56CBxV~D&PU{S(BR}z6V^=+<<7heO@)_l(U+4AC}*>ZTn)Svq4q0ma2 -eQRBWm87G%WttwlXH=x6d5~_aXq$(0%L>b;bHhA9sKIilr!Rr4D!86WI;GsBzBL#`T#LBD8OAYV;$Dw -yu@TZT1Qmo#t72V0coh<NS`GW8i+1nu12v5B@RxxPH_zQ-J(@H21UEL1T^+JaB=O8+>8#jme~3kK<Q_ -qpRrnRgc1gFMtL_0W;H@3TQnyVC5U1MyXqy3fNo~`ns6Olp-miP8>TZj~lH+1YNV1~`X^{hwuOz=)fP -}t!F2(NI3?d%{F&=W#Jw&v5{+2>dF1)&gIQ%UX1V`ba4J1cd=B}7B@K^^P%T|+!k1Lse86G4&`)1*%? -~=KQ=T=7{=R-xRU_+iv_gU~}xWjnCkqn$Y5dneVSK~Q}*2DS&k<jTm{^=T+fF+4nz#Yh*?sI7DNDQYb -Cf@*$msK^twxYTC?8V`jh8Z4nbq&lpEF@<Mo^?MBW5M&AU!O2fWx^SIK%G6M)bl(CGwCWxjinNubAW4 -L5Ed|@PQg8Sz6l^>KK0GwzxY92u(WGXu;iiPGzXNf?bM^OgJl)GIfx>hDZTslHGqDW*~A4VC2PmVFxW -K3z7vqOsyA1nJ*RY@RJ%L+8W_@TCdSNjvASD<{ZSFcCjB-T!kK0#g$x_p3N5ut0;b0ADRt)}ZqOGVw! -+qNzx;z*q|_|B@+zE-?!i$u%X^TX=QMkA1ElH%@jY`YK&R;1FMb7WykRRmj>Cvi^*2;t-zCnQvI62{z -o3AFj;i1PpbHi5la1>E9Az;==#32bKhHQqn<ZL#xTq%)3f>)x8?I>{iAPx^DG>h6mBG1d_g5zt4RAMQ -_d8rLVs?j}qQRbx>GzmWbe12c8)~+Wqq!bVV|$4j1|>J`=~@a%x0I^86<w0=Tvaf?l&2}KKt#C3p}%# -bz?qw20*1}@SdhMw7ss2Hmzy*Lgi|rn+Utz5y*f!FZNL1(gDdA_9h2IbUGxT9#;hxWgt&h*Ktu;%=m5 -to6pf0<o?(QFZe*Q)>$e}lbjNS_EdeBunb5S@@6+owV>m3`vhqAI-Sb!rk3ff;4^zRIECHNnty^`n(+ -_UP5Q`Hn-;ZnH2v`Q$ZjoU_HdF1LwS3(~1Z-O+JDlgIhs+F;uu|sNw0Iq9-|5#ZEL#ETHk-tGT!QBwW -vPd8*_a0=OTe}ma!6{zV&Px`-w54VSt?nlueUT0(rvbn(Hb<tNfnqzwzG}xG<A&Kqd=tZ0##JmFo~^6 -3@5sLuqX?HgeewFVcw0C^W+A<`K5a3jI3cB$U>F|Vb0h+$aC5X2iD>dBAE`Y?qk?N4D2Mll?Ak~pj%G -_1e!14tuBh}Qx=NC2N>B9L!~r1_I%B_uzA9rpeb<P$BYq)G2uB^sF1^>Hq*R>a45EH5UV5;-66m^Pe# -24wj{KB{vgp=a}bx@N8s~3-K$EF1)~?q0Z5g|4<0o<+zQKF^8)m!?Z%8f=L6?aJpIzqi$7TR!{nRic# -5lV3`VHBTgKs@iSGGGS7r+7wn}&RfEWw6Ku6ir4{Yf^bf%33^rRI`DTThV+fXM+sKv6K^D>)|Zi|Pyp -6bRxctjP45=5bK-s(3hnHr0>yWLn9Nl9ixBHOFhMBRd=KmyF~J)0A9-vk-8lLrs0W+=$Etaib74Xx*g ->TawwtfNPPsi~RTHzTjuh6zuO!C+L!6gBp-zA@W45X<T%NYp$9%%03^;L7Gz<r7YHxR<fpIG8L~00@f -T3_q}&QkaFk^jkqHtL;HlLNC7z>^Ur2sOD=!^z;~89tPrF;VO?^J4e2OwIAYUl=7++vLO}7CWyt`?4E -QB^gKMMT5|F1%LH$w$WbNj4-aM+<vdvcrB^L!F0?;vHoXSs;5Y!mL83g&jE5p@KC7p4J*O~(9%zMU)k -$#I%9>x!;ujAsTLI~|W_bpN^`~uCY<|-I__D0xVM`{8c>29|tOv&k*qQH1`!c<Lv2KuVlc2}^_5s(!W -MY1~iv#1!z)*LWSDbmi1qqX?LM#hsJ&)BdO<og$w>vW@M(5MP+8x~L#5$kiRmh)en?GzTH05O7x?*jV -eGN>&VkjwEXWm<7Wm(wwTx0i0`I-lAVJ1#TXB)L?*)O}ID!J%9#EE=87+nT(dJMcfTRu@2&oy?&Y^|F --cnekEL)blsDf=yeesHZZZOz1F6{w?5NhRX5as%``JW1W7<h$lwu^zmI2d^YA#(wDYR&s-b4(rxgUcv -|beQm-Qco3-(1nG76WRb+X>yR8oRyqaA)4f!{m*(MALZ!hRK?MhNqCwfe63ZswMvj)HmcUY+=1;yER% -ebBV^XE%gcSaj*1&w15UDxGSVJ5Ehp@#peCDvoAodODFg!KX!)ZK49>Pqi^Q?3;*v=)_jA?5=rokaGY -@Va*;iN=T*d#K};VGSY-s%rWXKRMvUR3!Tk<h{`kkp%PNYgO}zyqaux`tng=a)t?+2k=fx<%*d;pl$g -kHQav{(3D10ShFtEzdy2X%iSFkM_s9oj#Ewhs-z6AUCjKS2(+H%ylEMNefD66>olhbMt=yP)h>@6aWA -K2mnzTaZI2=jTkrs007el001HY003}la4%nWWo~3|axY_OVRB?;bT4IfV{~_La&KZ~axQRrl~i4C;z$ -sD=U24C3z3K~?CGT2i&k3WKo%We!bVY^&|tS=wBs3TW}L|T>#xjbHVe`%Pte^}Q(fJ3yM6gX{lU{{O5 -;&9n8pL@k7v=pbfvc4YE!ahnpwG#S}2N4#v~mT=7&^D1jcSCMJ#9?OGjFIiONTQWo1gXWODKsI8Z-j? -^01RLPb$&nF=qBcKB&aV|PD5Omk!R@zk>LoYA`8G5-3LunkvP<EgEuPIODX&!7JW#l`Y~LZxWY)H+(Q -WBbb4zLUskZ{@o3#&+E8KZp=bg#Au)sWw&?bVpF=$s3y2erxohe^{gB+6r4YF6EY)oXPzgggsDgDoTY -W%b9e0dKlqJ=<E+;fiFxZ^STLDIzu~+YR|TCM-QK-OB%C-QhH*|7TwINwUQ~oW0|scOu|vw#N77m)UX -i}AB51*fPUxh1F=NDdHa>ELxesBz2j>K#x5C49pM}Om}c1kZy~xSg=yF$GPr2LxzmiK-qCL1J-&btjl -N-xXw6hP&MVag18V7clzf{l6AGs<^c*f0;WT-9KrNg`7W3OP$)Z#e#OTTj?P~}J!DO(Az5x;TN8?fQ( -x@MflIb9hX*gR@Nb_)!jH2Z@T+n>En9t%tKom0{EpE)bWb(=49F&EDlNoy<mD{)eg7G>CR2gl>D`U(l -OKcPg{6)(8w`Qn}-t77X<ZS2z$(*$DU3#+;yMyifWx8NF&$o-EPlGP~)kBfc-xWp>13r{FsE5iJ+ois -7zA2rAz}|oA_3rO_f8O_qmN6pNJ~Ws<{?8-QZnbi23JQvKx)s*3FRfXlf6TA>6HO}RWxw_uAse%w@3I -FBu8Y(g=do&qNVih+5f<$-ag&+sGe-z$PJ7qv^Z_tfM#=NzyF`d{R6CralRW2&pQ=~!WHp&R4#urks) -Td<=w4vwvTj@p91E;QPOFu~%~`EFj#Yk$Hy>Bw`gGn=b!k@-oB+4yS|ko8tRU{og|<6COZ|X-@5D+p9 -shv!U#`3H@o|gG=n>pSzhZO{@9R^Ohmo$dDEMQemVIS4-Qcae<oV_rg%WyGiOp4bBIKLUH?98wP)h>@ -6aWAK2mnzTaZDLS($`}r008Sy001EX003}la4%nWWo~3|axY_OVRB?;bT4OOGBYtUW^!e5E^v93oNaG -qRd%hv`&TRpT?r&Z@Ab0ZZYz-rC_1IkK&lEw+%L#fnJz1)Ol;Gw%CEoUc~%i3HIWiN6t>SfYp<6%#~g -Faxy}b4{QiIC)2DxW_Eq`v*=J9`dhxV;`sLT3{d4(m-uuDD2j%6P>+<#e&0lWbUfq_@?p|M)n}_n}yZ -^Yky}iosKmGK}+nZNck9YUw)$Pso+sE=M@A>57*N;AXd-HgcPkw&=*X!H6pRe!B-H+w*cgD>7zq)>Wc -y;yj^?w=m=I-r7e!c(s?%rQAaQWu$e*XQ{{q@!3_3QG(J4gKcM_t`B*3a+qs5g)0!_Ph{^*oOZ@w;#T -q&&I3Ezf!HLwSDvaDD&R>(_H7pWVHEyubP3mn`$chmZbm{!+@HukQb?d~<XAm;0Na%Eu)$d@PT5<(qe -pZ|>f{Uw^jh_U4ECtNVBC+K>0w*X7~v$H%{AVt*{}?tUq+uHKgW>(@6AbNFn;W4U_!`VV*a`TS3JuWx ->Q$De+A`#Q^E){ocsKRx`qhkyF&+w$f0LuOk3bp7`FKCAiWmmh9#Ugg7I-n_bg`*2;Z9?H-B?cvRDJM -{$<dGUTC<%_!v@9zGwT;Jq%p8ePB`-l9cv`^}<PkTS&Wyx88c=gEqbDBT%!H+WOcjY#xasTTlKl$A)_ --&=H%gtMdeUrV<4;e5E{aehc{BT`<dAR=Zm)pyXkoT5<efIL7zW(-QdGghF<zJsXfBxjFm*4#{@6Ar< -)tuiP>E@@OV}h?sR&{^%_VHaNo&o;+^!aE1lutbQ^x2osUVg{yzj*fYtEVqslrO%1UY?Y1o;-i~?6Ys -beDb_}^X>C*zJBralTuz>U;nzrZ07H6@_%mej~Vi(yX@ra>&L5`+lRUI?{d5knc(f~^5*KV*E!}_*Eg -}KaupZ(`Q88O3~%q={>Am?Bfo9vAIr^;<?Y?$W%=9vO>8ID_jjk8QGPq$%NYHuPcF+^^QNn}|8|=rc# -)5Par0w_{^IuT?*6iTdiU_iTmSqdpIut5%g41ZwUlpP<S+l-f92^{pZ^a*<%5e1{HIS_uPxj5@Q7dh` -!9ix+jpG%>+<T&)&12gZ0YgphuiDvf%zK?%;Nt2>-*QgzE&>t>ARoGoB!DMtuyeNQOn04|6^G`*-w7* -hrCdiHr~H*w)Zd8o)_9Oj$dCm-oLPHc_Bm27wRX=^6LxD={$RV4Rri!&3MXlwz&L*kE?zC!-w_b_dkA -=zxFwa=W*^#_wPUWHt%8Te<&aJeO&`6`RyZztLr{}>D|wP#NU1D)eksATmKJMHRpEsHlF(Mh(G=G%d0 -o#O>j*NiK9LL{Q1SjJb~|De)r9@&z^kw{pZhKynO!b({Eos`}(WzpFhd}eE9j>8=rjo<<sw9Jo|r7S< -b#K|M^PX>-qODzyAJ<=THCT`>&sW{`7g?@!>_?_Ig?NabDIj`ep0exa?=kKgY7?*S_#;y{!9^zl|+#+ -0OjBR{vRJr+d5XHGgYuSuZa#LI!LZp{?t2S;n5B_q@BD`EajW%iqRwIhJj?tY<#b&TY#-W54X{v1ELH -Ix|W?M$3RX`pa@`=jCXbQaN|tvmcl1*8E(abgo<GpC^r&39gg5t|yZ_j?0>9U$&!VC1W`+FG?G{kyrM --Qja~0TJq4k?}LwIWk>CoCDXaAc@JY{u1iL(Yvwf$p4mpm-!hr(Vc)W{nw1?#R@;s((_Aycnt8R}vL0 -94GEA={d$BQoJ=RQV&x8Axg&k{NWttb+uWZX`2b<9{!jc*8J^Q@m!z~Nvg(LII&h?W;^sK4$tf?<&KD -Ka1J<rS<aww&)?Xqr19<}zoaqn5#y5^^{GT{u}&X#9pWAiz-hE2-aGt8EK%^5A3@XDd*nHO2?nm1<D( -J&w^X5>xGVda#!%P|<gSJs`aYAmmm>{ri^Sx!4Mxz6V9noXwN8~==axbnQrCR^NUwhx<#4Gb(MvssQj -ZY<f0J%^W*Vboa2$~v=={qmwOnQRQd@^~i4+z)I56R+dU^48d4oFgOD7+&92cK`#zO6MU|53gnq*9=o -SM;*w?=kk%dvja;Okn_&+8upt<U5*?i2h6!;8)5>D&vrH`Zk4^qYz~IebTf2aax#M{<#;v>FHh!J+k3 -~%o2!P`Fl@FayOhu7NipmkN=|{(>v?=-zqXUj*zo|ob<4K&Ge7mM#Tt5Eh(~1+2itIF`(m4UTx~c-&4 -7*b$u42UCrjC!Toy3S>_x$d2T$^VcYezG^S+f~GS-SeEHR+6IYUe`kdQg-Z1!>TtNxAOZXC)U>xe~SN -_cwX1ecbn<E%k|?7)KK^S77{wu;Lp2IeV8oUr0y9S_L-H&BWf7CwhhvQ>3u=N6v6ANYKpKC)>!lp`<4 -2mlpNAsbYB4q#;1%XPuT*}e`q1UECUZDR`9Ie@e-0L>adip61v_2fKaOED^T?!cQexl+K$g{|6R6LpD -q#+UHP%qEzEwE?gNi#+j}CDs;S#=&zSIQ`BH^UuJmS4^t|rgit^vkhIytXPrb17rti!w$Dq_!^bn<wV -acJ{BGi?uVG4f6mxf%z-sBVLZKp^uaJjI6Rc#$HFn{%ZYKF17Il~OUr=qFdTw~?%Bu~jKfqga_~63pY -eALVP74ZX~wN$hrrUxLRb88jcL_0rw~i41gZROR8d2`Vw<y7*`$nGIrNQ<JdIh{Vcdf`oLCx@W8IA)* -m-i-jVp2NV6T~Q)s4rBMdFTlY@D!jj2W<l`7s;8;lyuQ$^vrjcp^_8OLk!GnsY|wcm{?SPXy*z$;sl6 -4me~^F&mA51?Z#OAppj{77k@}+-w2B*_w^$)!CYZ^VoBOW5LU|17EJ3&$eVodJZ!v)rp(f1om5bVeep -aT&M%;U7Kr(J%OUiuE%x;pIz1=d}S%_E{IgM?lX@s#Q3~t!2>`W!p@nGl#1;fE5^t+u$+Xp1`Z4WHqR -SJOsfM%jga4V{T86~jZ2O!=9InOfVs|-@<;4sBkuD)B4&k(^c@J@Rt|tOBf7+kiTfZDI~>1a$s8u`A4 -mg9*w+QBb3$H#tDpwH4DBf3W7*?5)$@lyHNr`6IK<(31FMyX;D3!ZjWbqSi7wR;u({-B{J=>D^8!`_; -Kc6J{mL6%Sp%^Nf{79<m=D4cInEe%mGnSkGQ$=2RSC6;HkI?vDKG+4;s~=)LI=iJ%7W`jS%|L{01q_9 -hybaW+(oR>Xdp-u9Pr={dTt!gdC1y01r`O0$MX&_KTqQ1;~zi{xJEF(Nazz1h{1U4NnG3XYE1kP6c5- -D8;L_?=Kwq)GiHj<zyLOYIIms=iHRB*IxjbHdO({((=f}Es0TvCX|m8*L)EepW7w7ajo1*F5SN=#kI( -@cz-1dIACrJ83=b2-p66IGON{Z5+W@+Ga6PfCMkoq4;md#>NSXIwT1~vlQclBfCQ`w$IGxlM^AaJdM+ -WVS$;HGtx6J>du-b};1yf`y1~Pz*+0@fL#7@LD@o<s9LB{;p5H&UeV+M>FEnpL;3@__|%1-3n2-po|D -IK3|SU0<}=>Yfx#IZN%=%F!U*kOenT=0Eh;t6SD#X=M(G6GO7V+Bw_h}AbYM(BiA+_tjU2Ye^5#tyNi -HI|U$*hx5801GAbb)6pUYh854N|S$J=X@-G%SQ53)|6AkY&gQgRwW`ZLnDM)$1Y`M!Y4#~WAQP!e3pf -7+8DHw@S%&sIxo6j4t5mQU8`)B!-U#aHYD>0LS<37?72YuFb-0nIslfuCw6F_vI1-?INiXZc|5q|f;Y -(kww!Wdz-E-#WW!L3;lAe3N0TmO!!IiTChlYRhanC2V%Ef5H|#4Q01yy0Fq_=~As}JCV0Wg)sQ7XNLK -_J|;f>)+gzc((0<|uRQ_#9M0=?nn*nlQN*h!|g5I!)I#AOT*3KK`#G3*@h(J^O2xk!J?&32PV=1P!SS -Jn;FHGVH9LyKrbcG}rk*>>ds&cIjVAAxcKA#xNUd!&brjAAtv!0Ymf#AO)eDs+I@!sRy15sBxJWm((F -K`kBt|6tBJ88YB}Vr;CjLhcW?l#t)S$iP=M){$?5A{8FfP5n+16MT&XCQg`N1r@zQnz3Mq`|i*_u9En -$?ZAB_3ut_#>{8tYbB2!2aDtUC=IHEj0s;9GCc!kzCYj6(2TU%g(cm%UXFC8+pqF#yM>xv@<6v@&N8J -gBkOq12Cif#QH>2K3+Nv<15l@zYn}NxpitrdhGMTM*ZqC!lK?q@;cofFU$wQVpn-&ko1c9ot8DQlGm3 -@_&2t#D84HH>CdD#T}Pv|?@3)o%okc_(%x%z~?mBa-5JuofF2CjYJYq0bNVUC$2U9c<IPO{I2aWEjcW -jO(dEoU3MATJ`jLLJCLv1A~6CqhGqD*MyOAS(fN<-v^;%n~bylD+BTXg8IGp*5VhKs(^YiG~;z<I5v= -jQHTqeFxbAyn{CnWR}u&di0o8b~IHHnBrluVGps|?lzw?la5RT#^caXq^y%%a**qBNQ3a+hr+{9&QL= -Eok6Y~ILFF^N%+cX$ai6EE|x_yH;CHd*qKrx2TgJ<A0@$;3!3B*(iRxz4)cNZ#2E3!hAXIUkdJSqH{| -;P2NVRbF9*td*p}6#IiKsW$%=^=rI#a<8^odtf>x>Lz+y-|<9@{Djq_QX8%Yi)ybzx%6d%gh7sCnRc9 -6nnJ)}+xY-J-K#~laOeE?ruB^nbF2-cMyh}|<K$kI4GU~~w;N9!YCH$GP7MHSY$gJC<am+(m14M{<d2 -@*H*B9=_FKV(%En9$<8)<8(!*xb`Zg!$tIkgAJv8q%73NHng}X3P{;rIjv51SCLo!0tAapN&dPMCK}o -nI^6mFj668ntX(HXHfM$fUKL3lUia8UDgS%t;CD-G;<~^Cdb_m!YFLDqaqb~SOZ>mk;|PU*Mpvp11LW -`Zj3C&rX^kgK6-}q!9Wiq=(urjGWSLIN8ALCyB10OSXFSqtGbv?6QKu6qA)aRMm%Ml3TIj${BW?^jaV -d+KM}hYY<dT$x8QUPXoF~@t88jaFcTnctb~BG>YkDyJV0R!v}tBFGe_W8M__Ak@}k8YT~-b*009Vi5Y -B~^4r|wH-L!e$;31-@DKGBQlzb=Tu=P9p+NQ>f0TEN$F5O}&9S*Szg(z{IH~^c>$tz-jHazKAWvAKK6 -L*&q;ctb^BZf_y*GUg?je^~`Da@h%Er(*1JFo*<1OvQc?f4dp*BGnh8*pfd)P?xbcR8d|6%+%kNa{VH -fkqrQq?-VkdGtIEVz-&8A=vH%Rb<E25uOUVL_SB(eoBH!frsfibWRm)u+XWknd@~70ec;~9vMBhG)S= -<8CXG$uTb4a0>1WUVvVw^-<}eJ13ctO$R4oyuHH=w8eayit5gKLUjXaF36ssO#G)NxnIJXLtSkIE@P2 -?hDpy8m;{f2mSWQ<%`mXS|I@L4TFp?=cSIC8FD!<NP03U(nAV$RT@%}1vP=nay`DW^*N%)#lE9q3SMf -p?=0m@R_Bo`7d;x`iMOmBB|8<nz(cq4YGS);ec=5|~Ps8Tcr9#19sRiTU^i*J#~Wg}%#n`T4g1%Frb6 -ik=#Ym;3xr8h<eU^$cyRm)Lh$zm8&*z@Wt;cRH|1t@8-(59F=WfrIc<%tAJvqcIHr%%U<fB?c_4uyw+ -J0uSmIcv`&E{mSuu;iQqTScZ|$_T~pP^&8QAvE<NY7o%?@IoLN81hBHNV1QSf!N!WjbO|oi<JV-kyEZ -j!qGi%gaB}@uv4{9O(TfiK)jBwou@#-06Qh%(-3fS-n)7aTa~SeMF5l_`-#X7&Ce+K?m)UP>@#Gxp#e -5_JkdSgI!$naN<+7nZnmp|Lbp_*DO(+CU52`WVO!!+MFMxSc*8VEPw?4zBc|F=Ktj+gv0->d=tISWe- -KVK^AvbYN6%mJlmRvDXf$<GpaMs$fs*rX1k|12zn}P#B8GXdwYN+L!l}+hGBGg*{~$;q^|V8k80OnmE -gDH6TUulx5DxUDYCUVJb1F^bVp$%phvtrwSTLKi3DKknE5T+r4W14Mrc`rp&_;m`sj8qKCJx|If-uQS -*U~^1B50|qI-3G9zY-u$lre<Z0+%gTBKTX<TQL8W<q}3I)dcK}K#BmsBcS^pcRHzz8W6E(F(HG~;m{N -m<IC1YNob5_hmZq6aZqj3FvJSw8REsML&I%OxGY7R&?X2?m%*y7GDFO?9)@4$dg9*)I6WX^1j-Jl8xZ -D>&e0{W4a4r4^;!i7ve8C_Xo@nu$-@CoJbz`t9pQvzzAyTu3Y0KssfKbI4$we|i-z$uSV<-MN?fB@vM -ExtT1;t0J14siT9U^>A<0#PZHgoi+HOipfreO7DL^E2AiZ(^`=*Z~1o=1I#o7;%q}Ex$B-}P-2@4_FI -Ko2mWrgt_hl8H7*|n)pZsxNHu~Y4Zyy6g~Evu%~XMztdVD>{*WJMfoRM8Y_s025HbBs}$p2Y(`U{Tje -K$}L*pcFt6avUHAGC`ZVm`vbin~{++7Ozxv%{Vln9Ip_sj5vt+V`!xa$-4zhAZG4iwbIGa54NR{XRp? -JmHQe_Z`FEM*LLv3BAQ`A{Sb~-Dely{WM`<9FFK?CLe4hT-ig!r2cd6+aa38tVnSv;Ry_|TpSaxRhci -XxBg%LPtid^y@Qga}g(Q4rkf)UofdF4tlx`}H)_(M56c7SgYcfogjAj`en`U|BXR&EGD)bi@O;n(L0W -ESCLJlh(47gyha^Q1HLhyWbD3g_@ITIu0pGy2NU2DRKJRP^{C^519nFXv&gy4J{<26%LachJ`LIO6`i -Xr1bN9h)^o56;{!D@l2lc%tA35<CZz7R79z-_{ymPPfbf`Xmh3^YM5Hwq@4#~?sJdMdhahksr)$-v@z -sw|f}44_5vxHTbE`8duy@am4yR$QZ!I&~E0LLWsOlRbo*G%FvAjT*cR2ITalnY2CNBv8+RhBaUb9RO? -)+7L`)12b~T134&Rf|apVgUuk1Z<e=vSFfT-z8hj}3BU_>@B>ghNVY(iq7YPlnHoryfRI}T+Cd=H0sA -OqT7!s#G}*?~#7#d<e$5fUWqr9XmOo5UfY6;8D*O@ftZWYRf1)F@^O$NZ3Kabv6(W%t@Y6Cw0EWFw{% -kG4>kc(W{MODG-o0DNwnt`I55fx!ePp}t8JRiEfx;mSb{5h%QzFR>!N79_stBzG>eh}!bC$@neabA9V -MvBTmQ?5$YfT9D6U*^iPM#F2cFV!6jL<PuPtY}o>g7Nynl;*ORmZlwfsiS1>Xc+U<V7oW(0~tAgk*kE -z*U9bbZvZw0WG~Jz;Y;-k<9{N{GKv-SLa0I-|E2G++77nHIr%~VpqowD+1&YVkq^Jr!15Kkd53qyK~S -&R2$7_H<-yZXO15ru9o!V6>ZXdbO<VsmC4p>^AXC)&}C;m#VR}wZAZ|qHiZ*5vjxn?EE&7o7sdW&TLQ -rc<~}=PSlMwXRgt@r^Wce9!2)G0>5kzL^rr;2C|pt|Sti;H+ZpH`uzx}2$|eKL?g+7DQU$fNAzU}OQ! -$~W{FpqBMAstS0Uqv1SC&pIpjZyANL2(+X*N@!>cL6r9VkdP?Nq^mQ94c1r$KnS7~O(wA)X7NaMWs>2 -r|VWd&lgnRWpR9Cdnnc8qkN3iG?J}h||;$A$sJvo02>SN3;yZv*Q6(2V=K*f&DgJ50S5{ZCj9`BcyKf -!_{5|9GZMNp2_EwGY-iBXJo~yYK(Slke8BW?EDSoHGpdG1MG`-gUS{UhUtJ&M;FTSWWMmXW^QCgPl)M -ux!G-J4q{LuQMXNtE~`q8+xN-jA&HC9n5cn7j_yPwK&AU`rJ<@pj@x2A%b;}HIJOF3c1z*giKVO6RZ1 -j<@@B7=N?~oQi3$3MKuIPTdgAJ0HpqLOXdiy4iA<~IFbz^<cvyFX$X80S)q)@3(Aa@W>8v3quJpSN>( -^8;5~NPK2i+R*5ta61QR4?3l$b37V;J^#kPq}`MaE=KuqLLU`Joc?Ii$UV{AsnAM5Ef~L-4vosO_eCR -(UP;b8ZT8fB_7@9<v$GjMz*H$$wR9wKqW?-jqB9e$JMd+iXP=woUVPGaJJWWw@cNis{<%KuXs(^<4Y+ -AY)VM;{XP1`v5R(ilACiIOTe}T@)9ZosZqbfi;r#H>xkIo@ldCwQ7xI1Iemj>*#`1v+{@^Ef%nvO;7| -a9hHxWCq$BV%qB#M3)qAdW?j#k(NH-CZAexMGESpO^I}*`BoJqOR5ANW5KUmd!xAV2q$nUEO%^o2bxe -6oUDN(B^U|4CFcD9|q|?fQNjg1IHb)+o=1%i$%o0MVyV$CCS_9c7J(NEvF;p_v0f+2Eb1+h!Hu=~|Yk -kX_6!3D|)u?5G*z??gWKy$ksbAWR8c{a8i)@O)5)}00%A2iWa1R=Ps?|FS8tP7`Jy8d)cUb$gqQBcGA -mbn@pxQRf-cbSuhPT>=V);~7h@z$#NH1G8j8@2N4Bc|Aq7rHffw-G$9#;A7*Q75bZyweq?f(^@XmP0S -3NeKC7}$#qbjDIcj6FG<#z>?B%I$$uG%o0-6d~$9D?aSC{-<t(@eG>3MpO2(sku|nrYu94XfzKuva3R -kq97_%4`oqaVi7iRomOuZYIK9yOgh_wpct?m8$k%IW48y+4#{E@6sgRj%B>owdV*n3hG|8EXfw;AQw= -h7@B&FE!ay;5r*_gbaR_0RNLaL4(O{dY4L;O~T*G1|KXvpM?%F`A5hKXQyGpns3}U%r2O?5Gm7Py}MJ -Q;U7P=SZ4cRu)m~|iaBo4c^PaF>JM@BSGYrA{?W(Q3(Gq>n3D>QwBm#y}45UW?wKu_VQtu2W*(hLhUk -c5VKR=WxQCb!uvs>wnjRHWvl8c8rrxr}fe3cPYChq}WwvY0d(hskL}-wC6qR;4-)4y}{5$<-*l?3So( -afeFJb}oabWodS9*mi5^w&-t<Gke&zNcv8Q9}T=MN<G8mm*N8Xc%%QNZ<aFImDL)g)p`pw=Y&v7jd~d -Mg5u*bSOR#V�T*uhtC#yaw0c1berc7h6GRyeM{1nK)Prr)|7ajA@It28UKPWF@n`fFzJCrXZ9SeR< -t1Mnl@iY*oQbrD@eR6zdU$35+<7g@F=~$nu9t4MDJ|*ojKeN_-}HiZ;=FBV@+C2QVZ(^YQ@{iL9@vCR -6V%%{DU*y(%gp^2iUXifXqRs8F?5A#Aoi5O<_HcI#Wqz(0sW*#?@1nz95SvKcnJow}|OYJxd0ixQVQI -SyfOkb9x&B6T;5j)*B1>hZ)zfu_JeFPiC<4GYUm00da9_E6iwWvit*HA@_T4L3X7^S8Ci@HthIckTt) -z@^&Z^#x1nwxZeoK^4>aFUk@Y5@ckg750@it5_T!T~!SR*iJ7t;MIn0Y^Ncxmea;QrJmK!R%!^sm)%9 -PgOs<BF%nu6qzoOlU=p!U+e4LvEY-2uwpoy66zVXIBddoUg)G#jT$8QERyQ+NsC0o}HLBeM^{LtAHj9 --*rG!2s;l-SAH#4Vdy_kbo+a&?lMC_SRP(XqjyUm`n0!K*O)mp5$nv@GovOD4v-jAYEV9giJ1GbuXTE -#~G!DSmuZfKnYa#7BiyMSvv^JJP-*T(D#u6FfTJ2AZM0NjJE&6qNKUJY{~wmLbH5UFj@$zE;NAYJRQ! -g?4Y(Y`9F@~SWkrWKUxYSCu5vW*=|Db#b700-@qthTQ<Uy9Hif>&}X-2owNWCe=~8|HwC?>3Mhisj74 -)`-<ozx^;88hfqqpyGI7HbZ4&wYG?O+Dshm=CxnUwm-!{WDxpoHmAhYX(24Lyu#|Z+mr#VP_N#<P%MC -L&)Pc~@y@nevLFti@3ccN01^taIoDc-y(lEV7v1)JI<>o97oct>vR6V=p`2Q+SRxLM&2pW6a$u{{E#a -eESDl9<q9Vm~Ouo<qP?%w-SlQ=&9t2|3FngUa)w;{O2@nLcW{GNY>>(7++cH?Fy&}71SAcU7ouNoxve -9CAW}E$6=7~f{cxsh>(WF%DO&OCuu!ml00pc)`ddz|uHb=ZL{@E-i`S!lWv;p~{9locoL02m#U%OsGV -F&N&c4jMs@Zkn49E<JpUb?WKfaDq%N_smx4ZNQOqp?H@IG8X|m`Z3ET<<Z25u9xjvlH0+LPN!$(&a8$ -BD_GV3+0ct&ivo27q&wY+$4XyKBGg}4QWXd;OC#!D_)i4am=<66&*zY9y)J`NI(?+l=C4aCJL0P;V6x -&L-+_zf$z!>yF3X>T%b|qRA=s9j#Kop>D1dSJY-i$21M-i==N7B{775D!#4SqnJ1P!i^oifJ+udoMwx -<U-MlzxujeXxnMDr>rcKPV|4?FtFl134Gp#h~h8F|!UZ}Dy)?A6|4w1Iok~6gfDKO;^l5#{{cmTTTFu -(#OUS!Z6n>uh;P{7g%TnJQ!zRSX8$iCP^rdDgmI3=rk+NG%u1yT|wnw>sgzT<Pv7Ic<VnzDyF_H1RPD -+LyX)=VEP24zFtOd;%cH_0KUfEBj*QJd*V-A(^?4^0Z_V_N0KWEnA=S)@gS1tzHDc4B00;?<$qOa2I> -HZ$4cM`%J|t0pk?**2;g7qx1?Mt0JXVzVlI2d>;`)NZ!!dF!RkRs#0W1nIPpN||AiR?@T7r&fVn);tt -TxF%^x<UT|;>EU^6U^CZ)(p$wM;RclovSXHP6A_55goYg!%(+^cn=S5Gk&QCW5H?&7TSgb}*qMlW!G* -R2tgj&v6@=MhUkh}uEjHF_JEsfv2AFn&6;->tpfS@GWGmj}vO<lIDz|Sc`5cP%a=Mbn>a_=jWi>@_?k -!$KM6<M;+AcjRK9v$uRb4h2-ejE?941&BQ&gnvID(Pw_DiFuL!uF++U_+%dgtowD7C?6*5la>j9(GJC -By4GEoFnGyeKc#$)p8v@egf9F>NefQRGG;tFR+T=4*M=H1e3`E^|HXY4!=*1_qn}28VYGhh6uxtI8$@ -)oTO2i&99jt&Q-j25VK^N)-F*EhNmhql#2`*hM23FZKd@`{PuXhwrZ5go4m|4VviKU_ND?o$OvKB<|b -8Nruf1XNE$Yva>yX<_xpkg(ax8dvRrUZbCD5+q3m3aLs}xg3i7y1}W(2VYd`{gqKcDxtgMkHAu*xrT1 -0&81S^NV?#}&r?$C>)2k3($FMs<BS3lsfl#SB8`RcWLx*@-lJs(mr9ZTfW>wMqd54W;UX$EyO93GyXH -r&#lvSS5^&{J?<vYluIQ}7!3HeY#cwX4oBoQ{P@JhFH6Uu5N*}TMMSw<WsR->M%aFOecVfp4X64K4Wh -l|o7ht#MJ_wHEMalIyIn=+XQ%5gWzp(I(~i!e;sdWzEht}5NUGq1u8Y|9tywcq6)+%nyzEDF$GM^h|^ -eNm7*CbP0<$wrXfR$$U%4ED4it(u_%%vR1xnrSy4i=ATLzOvf@%e7&IURADavm?9B+}`n0w;`UR+br| -Sorx~tkaOF-@M2%&@V*Et*es`2sfZdQ5NcrY=Jzav8=4dluyZcYEOwG`00=?t@Y3ES?cNX|NO4=LfD5 -hKU2ExDHN}+CW*SHdqjpT9?eprgh7B}%_s<Rive9ax8;;jF>VlHrs$B}J%BVMEc%}|lRn%-uWQJZhhK -0->&{O=%fx{ct^J@+WLsrf=g&L^sYC93>pwfs+`01@6ub2>ht)6eYjT03i6Ac1@vH}229{k!6vZ}a4< -*poFt5;xyjFrtBC#ncosU71qtyC_o7h4-ChIVsFuV-Vr#ao%D1ghW#1U$cp!M+2_<-5&(YG07vu9&*n -!Lix*C;n1`p_2h^xNh_QFX!!5`$d#RqMN#wcO8H)8;iIVQ4xabEVlX$2UG7M5_<R6;-14)1q;6`KyjH -)>D60D-a_J`u!}aeVaV7dAiKS*EU$Wz3@AJVKw3Mxc@Q-ac%<SM&FArDA^P;Tm!)`R1bh0Z(VH3WUM^ -F2v{BSX7PrAZaag$$xeDiLF2jDo<cn<E+sBqIy&Zfwxy=h4P7_VvTvct20EGWF+H?{EED}jgW~YHv-L -JVI{#m}Gh-O7}%w|0EC%fD*RVr!r)1fKFm*rQ*Jf5eVmO5bkv)%#E*d??EY&-X0H0=7J9J*KwwR}VJ* -k^7mzI%I#GOyQFM3(t=6>3wkC@;pCWG==rI})hyP-@z|8n$|;mgK9>qJ&+VmUHZau?mZTu-p3U&2L!k -qQ}BIZP~V`a<e_gc1~K2k@pLQ$!ba3>dWx1XO~JzXyHI&q&LLpWiJa3P;P4h!=`yiihYq@Q#O&K)ut~ -tmDozqL?E(cV3pLVR_~x1j{r&(V6HWRSK!H*G0gr}uku(dfeo8H3gA;}L#y4q5#nC^br@b>@LM}hos0 -Oi+fiyhi$k01nI3vk4T~gs>;$f2^d<2e>%98O{JGXt#N=5V8{QZPuUyn-f4_M!L3h}F?gb0)xGJtx>L -S3`N=j|>iJ3H|v{Jo1yxFG34$!yZt>tbJO3o;~=D{HEm>0*iS5iypV(1(}o!UtOhYILcEMT7AHc)G65 -_GYTXzWdbX1$R_6yj^PfLC+jg<+~0F%3M;cbhI)ufea_FB`9ly5lgV#vkC8XbipDrRO(J5S>f2$zVoy -n~2y$%Dh(ocl)0dPphJpH;241&g7KG4jZBuuPB-=(m^iuRGhFwdEQXvrY@*qr#v*X5t8dUdmkug``t2 -VcW4@90T#6AnXo2h*NETo0Hl#s_V*YDfV&9raCSU&i4d!sv4ON=e#wJ1HWr}lRqa;ucxY{;*QxLGt}2 -P5{ZBagBGJZ0XG`a4<#FPP6=c6d#12M_5`K9N>oM}e57E0D*QJ}q(B>X`znj}u_Ow@9hZMnQ^_JDrm@ -~Y!<*m%aZ}K?gBi;ZrRl>x*`(-)MYDG5$*a6|!PH^<d0mW{XLb5$|a*8qYyK=lq3C1rrbST}<4l}O?& -5NjNg_I*tRVwybjicHit-#F<YdZz8^ESV;$uIHXl>L^L;r$1yW`~`$HbMfmLrH#K?WfLTFT7C#hB<qd -^1hAksEt^+QHI&T<;@~T`QY~I;gJgb#YYzx{~u6G0|XQR000O8Q5kVeeyjeEHUj_v+6DjsBLDyZaA|N -aUv_0~WN&gWV`yP=WMy<OXJRrlF*0y+Z(?O~E^v93R9$ZxI}m;6SB%07k?7u#s#4pi(p@%?qVgpcROJ -bo-C3~ewUO;jwEgux<}*!6buUjaGw1lsnPHmE%OC3Y9tL9?4wBwD?NN6)Nxsn=warG8<{PGom20VmqQ -vA((ot!CN~J_(?3yyfqQ<dwprx0nyyquYX3LgLLH+^<>c{L|Cbo=FSyozR!b_tae%h_EyB{E?sj>TbW -?6X7X;tqS|9nc=z_qRM)W%aQxu(viPai>Xu{@$!DVl{^M>BS8pE%!lk{Io+TvguKmb?Cp2+>H`A2gL} -ZDmRC2ns!UL(|%Cj6U=aYm{7BVe8;hVVTL9!aqaU9o43yOlY#4OSh+o5uSw3|1lQ$(&VzJL#Wa@+6k& -X+tM99d>Aii$PP;Bfi+unGp$xiW&jUm#@aCnN81o{o3m5>AS68qp}qnA&fPm=iF|nbiLFC~ZlliewF6 -_DjHQ<FK|iLs4Zv%Nu1R4U_K1uwT5#?(C#iR|8+eZ|AVj0jSR-07RgQ~FwZVW|`aYO{oh;@Qk00rKJe -$Si`QsgG;WV<C-=0a9TO~n^uB_0$hHwy!db8v!5OH@f9Lyhs`u<=(?xiX9Co_s^8qel~WHF3qG+oT5l -e8BRrOZc*gPE61K3QCVvNUiqXD_63`_>;ZUI&3Hr;T`Gj5%Y8jUs`+$hQ7pGgL;ecl`o#HuR2ULE88> -JzI(0!S?+zU9g<z+s4voQJX$=P$cvZg%PBH_hkX<zB0zPscW1MrK1?wo7+z3=3VFgO^0ZaBJ$RUdgJ^ -5cto0wMqy1!QMt-C!aDX_YgXtV^9z5XQKh`>)}9k&Q})wc_JF~4k$UYsR;?7-MruC7l3gYZnbAITgn; -I>cVVXwfQRnw`_AqCi%g7rR6E?FlRoFl-^-WjXgQkP_lAu|ri62c@Lpr<vUD5_+zV_+LCdAY*;y`Ij# -Y7phmWgpfLbrP+O#W)PKfJsF%kzOmeBX*LhG$pYF~k0+OZU&>!0xd%U>*c{k+9}^a$>v|6+j9@9R^ah -ruqjDEW1-mVIS4UF{#cdW%8{y{^RiO?VRebbQtL1yD-^1QY-O00;n48F5SvDbuo<5&!@WHUI!40001R -X>c!Jc4cm4Z*nhVXkl_>WppoSWnyw=cW`oVVr6nJaCyC3?{nL@(f;ng0<}L_o=U2nYuanB=~Z#;M02+ -6v7Kfzc{3h}ge2A!sUt`$>R;bycL5TVXeW2mc|FsfO#+Mkz0WR~gM;oL_2%r|c%m-Gr)QJfGxg@;>hu -@&#M*<s19i7B>Z(ZQNv2bEn#V>ZR$b=*NzzoS4_WeP3X3<<LKoJQDmJBw%Dhk!mJatkg>jaY36{Mzk0 -#Amrcn7zl^vw9zW%vgZ16vw=1V-i&Wke1GpnM)=+eY$x?uvllyzZ1ZM6aAMX7qHN9x7#@k@~CTs~BzG -*vgW)~Xw0P4Q@AVf-}D$|9Lo5T|F4UNLKzx_D66Njfi*r5dOexKd@Vt~cc(&z!hWP?}5&U2I5Kv%(l< -^I5qDV?U`)Ua3fDsxWb4g*@agmCoWn<puUH^EjDp=uwr$5Qn%fO|i6IW$z{*)P=F&RJ}8qDIm>tHBFN -Un=g{cWY#Ec)ry|kMWd;6V&v8_qRw-W*QC;)lu7WO&L(5xiFz?S@uxY8eFdBLbV>Zfcq`g?1g1ACg*6 -JlbJ(eZM$%X%8IxT=_xJ?_A?O;;q^3qy*37E34+>bTK929+Uwyb!qsb@raddMtn%sT*32UKgyoLRQQn -Fm72?#@~LTBX$jDx`C+0E&D>=?ZnUyScQ5%=fgyUE$@tvbKDQ6qIdy15&lez+LjsOt|m*H^b^LwKAqU -d5!$E+yA0o`K{thbH0jI!UdF{t4!_U@(o<LO&XqIWmZmSZPGWYV(_HnC97><;9jpp+Bi)rn0>3t96mU -ci??H)&-TuzI`}-H0-OFCs?GjhZH8b#rE@L2GZwgo)>-fCbuOmy&Pfh@r#p_<H5-f$0tgCxW$vFe$?6 -I?RTb<gT1|3kuTNIWr|giPa!?5M<H~IhqtD@=7(;f$tpO#TR?A;Y<^q9+xEPRIT~?pY<7qcipol->4u -b^&$Hw|&>`G2n^$^n$OE)bQ?Qj9m*kpSElf&T!_gwEk~-mv-d69;v@mOmOOv`~c8_#Yn=Xlswp+`6LU -g>4Arxm+u?>7j!wznhRpu*Vgn~o1Q?l6~-(C%V{PE@A20!j2)%+{5kj}lQ*XtyU^R*qEym<MN7F^`>B -x<c_2n@#EE4~hvIvOnaZ(8y5&s&S|gjs%*!&ivle#0~Ah};?hh^!C2Ll0TWn@Mu$gNguhWRjH@?ur}( -J?*lN)VIwEWvFtUBXi7V*p-!}cruf%@c(=|hdC4uCW2#zDx{6roF$oond6vE;3^e71yp=4LQu>pWRAc -7csw}%`nPjRpEh3_wM=Y;M4FLfu?3e%|CU~_4N{h0CaN0Pm5GuW$8enJ2+^5DmZb}hKm3&754$)-JkN -DmK~QLKhaE5z5i{{$$X7$<)H2y*nWVaC$<`=>Qz$17-Dr`@i(ah|NRq8aC{ILzxKv121qF&Td}+Qq0$ -Co)gP@7>EHXuA;y#j8ikPXWc+`GD#%o-GNfd^Z!=<uitV^Raa3ht##U3+RM*>b*E%els%~>P^YszXU| -52wEv;oTW{>5MYKBrYs>m^x~RxzD3W31s`9X0qQ&X;%tH}k5B3<^@YHd18B$GmiqA5RjbodmHhiciW7 -nQ32QbbsrWT0%-IGD<c7%DE>mP~WLESW4+^dP60j(jxJVB(F3VYlM<kZ^m!OZUu>=(|Hb)ES5u-px$b -YvCT2?K61xGuPs$t&aA1Ku_YKF$!=k(v?iTVoMts|8M!DYRWOY3C2CV0J%Ftk_8Y;?NMXcbD?zEb<VI -{nfq9_n^*}I)6WixhBiXHS2JM?A1^z-+!uu7%iV%xG;fwmbUgW8f*Pf~RHHcAob!`)>-*pD4e1`UD9j -(CT7Jn8Q9B<{-a5z+^j1JX4ogK4N?Iei4Lg}J1!Q7o?a{^+bW2pU6^yIvN>|E<ur#4snkIsu|bBDp$Y -4=^4e$v-=-E6-;2c)A2k2&&khm3g{`G_<0&{atBOS=O0PNoT;k#BixNeRNPQoV7s_-JNbKsXkV4CF8D -#kKF!0VpFet-yXno%0(I`Ymd8sgr(pL5<%yqqb5f#ga~!Ih9)A3JZx+Mo`ELuyy8Igp!gQxIHhp^;lE -jLhur6%_C(t@Hs{zBa}xw`=mC+-O_qUYrPy><^eTG>}=;a%~8~rs#<aWa;nwS{1KQtz!NJ0K(H?|QI^ -=HddN`bXeAOoYGsgtDahK<IM_xLwfBqu2I^x@e{eJ*bCZai$fX}^R<9RHD;h~0=U31d^?e<<XH^wYws -FlJ3DqW0WrFf30r$okYEp!BFXbR%2$-5BxN>lopudok5bYpCseK#C40a(?mKRH%_JauY!P0or7K&obX -sfA1I4!h6+VfyEGvd`#r$P@7B$sk^oF&|8Zet%hf$~7Jhyh1%5XF&q`*5$<FI*5QtE3{z$3h3YASN%i -s=5ndYNZgGj%$K9*qUbm2h_d==m~AknhTLtzoG&+q=yYUhur|8kOG_^5mqZGAV8|Jyc<;xz_10c+4P} -cL-n?*J00?lK+;x#mmKyK=1?HIB_mzZlLsYatJ;^i(?X2TX4G<!H32qf<RcXEi$pwvkU!N-X;##MNA> -iqCJSv+ridF90W^F2rq$;-Z0P(`o>BAb@&H0DTCglQAHWQ0#?3wu8=#EtP9yVVzg7vO2y#9{NZfb)Ac -Yfe-xYba66&tlcd_EUZL<qg5(+j_x_HAwBBfHe?$=QUlS$5zLj-BX@IIa>NSb1iKrPRBj3mWosR0Pxj -3QJ8JwtPWtXCtqfgm?!;YFNITz72T6Q4diC8QEl<Z%^I*COnpRIZ_w+I(B;l2YhOUn(s>O)?lkyQ1mF -SF9}3%H8D!6+t~mx$-5d37Wcu^#P04gVF8jc-)H3aH(CPAbO0G5u_#D&vh9FuQ)?z8{}(*A2}#tl`0C -4V^pjt&Qc@fhE7rk+h&rajK((ayHW*76>3hp2%LIF?TX7hAhbYaiwvG@r{a69*7*pDgWEd~;Oh>Zmr? -Edm}HdZF6nPiSrFV7ZNd(MP~-^7=LDogHMyH>ZEvF_-DgBqPYS~P+DA2pEhGTB1PS>ycdyebNgZr<&~ -TePp{6`#%`WwWh`Q2AG011mgF%L1F_i1n-Bv;fu{oDw)rxGIz|7_=eu0eW|0){3v4?n6*&0?zh9&Z?G -L^RL;?k+vDY_McRNc{q_*A{w;!}pF2xC$xEheETOekZ70b9c+Tg~TGD;!@w$H)Y7n=^!)hy`-*eIZEf -zo~gN4jVVdcmCD)h_y<~t)Yw?FCFk`%}8pM1~fGms&0v{)3x4E`~w;QQ6CSFkIAiI@R`U0I#5f*)7uP -~q-ZL(ZAML$#iX%9;AXZ2vK9`x1s3ouxq4giD{UPz-jR|0+fT0cClp1pZ=b^D<HC(b--Y4pCXuueU<@ -_!(bNn_l6+X9WaU*|i)b=!ffoE+ETglWQoV!$no(nU<<3N6DhR(2q^TuriPGN@j*fE3l+K`H*sY>4y4 -ux-G`(Z?zN1l>Bwu>MUZ^29@KYIAS!g6dh{{!3nup1-KCp@`mDC`mMJfn+P&4`_K;cywsI$TEfkOK}G -Pa;AtPukG;oe?^p4GMl?zNKA(W^Z|IS1`j@F&$!X-$v76T2s3mG_;GC!>q|Uq<KZwL1Q4G(VhN-CTxG -r@_+8vrBmxhfC|HCRjT8Fp-C|aH)SfI}Vm!pUJZy!j=BvpM!;Ww<GkK{P<<KHhBJ*J*SaNAdDqiFxN6 -Y)(u)~TqM>F21G-*-MM@)IfBur2KAk5M<2<N8iIl*q&83KKd#f<CGSYmg^8|@xExRJMXJ;HqnrD;<J- -H@<dlSd`E3!zL;n}N0~Rte&4Q49p6Sc0w`Uh2zeu7d!t%eyw;v$T`?EJUXCLn;qf2@nx-_r4xOz7}-C -fp-1)&$4nYzD+7Rvkk9%WnS@7%=D%(&Oi1-xWf?>K4}Q>MOW%iL2u-n*J~FDiVkCMX?Gua<iC+~QSX9 -=qR64N`-7W`SqLCCbh<j)7;EAf`<TiEF*dgKedKOAp82t%PP}0}^?{7B-XABe?`g3P|$GI*{5AwlA+q -Ih25xZ&+LMHw~QSVi!=3OD2O|A}G@Vdg9<xKuya40gjw36N*9C`AiK!J$D^0O;fAYZN@`&_^cJf_bk0 -NO%bQb?mBC3XhXO?Z0rN;+;g}&t6H{I-=ih((xUZNwtvQTTARP&Lm}mct;CAW9XC;Mrj$GtkpVt4&AN -U_=nd;4(fS)Xzp-}fCs=fS*4o1v{Y#6jEYF@~O<YhK1$Ae2oOqC{)jZE*3Yfupn3!W3J*;^^Mq})N)? -sR*MP8cnQ1$3;1HJQ+pS=iVRvKulEb<j$f?4S=^yy&1_MtyEOXZfu4PB&*^B#SU_QMn(<sRI%m>2G{q -oEb)2K_f8@wrTIwKAF=9xS@yw+jazuQi0|n7M0%oTdbrS>pq?)ddf?RPAxpwc)t^MbCIJgM#7)PB<5T -$~PTmp%MCgoj?ao4Mb=KY^RBaZhFag42ReG>aed4(M0Oy>W~jTysV~3H4kAd5~4*bMYBbanRDAnig0& -k%^BBxcMQJKAmnQT`T`{zQd5(eSyH-eVH=qN)3<pAw5rOrLFa5;YFVP43W!NhA#}v&C{O%a(Oo|&Zum -@;HGs^8NCUf`i>n54wYOcL1#vYqCU)^O-IV4Yp4tklR?KMpzOjk)4KCFTT#H(x^kDOa>l>R!u^vO!Ur -@M_#Z%p4K&|c@eb>0<lCwNbWp+tkEDDYmCVDV&DACE08c9gdmlzzm2$mBkW1qYw@n2}@7MSy0dl-=T( -NyAM-)-#-+ESgw<Q=V>n%W)Oq*~CiFf#Pun6|!(fxV&n<4I@&!E2#9Ui>B*cLQ&nwfS<1)ei^7fkPsQ -qrSQ{%f6aaS>FX0=iz>vlKYB=(m)-S?PS(8QglD#7&`kJ8U8wHOZVK{Q8!klzVpv$8TE5?*+M~-SP*C -0y`$QMuv(kacbPC4;5ZYwNk&`78a~UTAHHD?0PLcC(&w1-_5pPh+bFZi{5w!b3c&xL<bfk@MW_p3L6D -TeTMjJucu`adqC<gP6jY@6Cae`H{tldXu(l8<F4UEtqe=sY^7K<K2jB$nOz9eDnybJO0&<gFHuFFllC -?f3@YQgc#Bs`9y?8%e2GF>PBe_*r>7Itmr~@Fa^uXCr65Y;-eY?;GR6jy9Rhch!>F%0l3>Vlm)V}?7F -il#>yH^;wdBssnx%z3S$q4$0Zc})SNUk~MFUyLJ`__|q#q$U2KG8`xL-qM`bnQw9`^`+silwi&)a%!+ -uenfc?ogm!wd#}m;Am^SqG^<NSYwdokPJfK6p=&bjJuMo3fzi*T$SuNvSH8{G+<q3RCIPv^X+?nmuKm -wSC_qJBN-{G*l+yXwjdCl-oNHfp#7@07q!iN`|Ls9z(cWrSC+G%8=`Cx-t9O3@We54R0gLRl=-0Uy=b -8ApsySZGY8#`cgrWp`Lx8WcCPU}wmJnNe$>sRQ0AcMq5OUxym&<{Fn3=*4^Cc%5%=XYRQpQaJxT2wee -54!tCP;X=m{I{+YQBcOYovgg6$gm<?}Oi)bEk7)qd{?Xi{ss9C1Qik|%O8sGYIP@p`?ER+nAxh(9=bi -qqbc-oX1*k3vO!_~;4sde#0Qs(sEe8nt&)`i*MqYVI2WI+nUM;AAgIsOQ*DR|PJ2W^?os^!2j?Y?R_F -WU&-kb|?QyCJTsl<TTX-Vu(|ZYMQxLR~meKc6WAqH=eu`4*w|$yxi27-wmYiX-vI6AUaT&e){ea{VR8 -=yHl@z4tBYbW9Mj928dEI-3NIlqsrcw5hP9RgSy8wY&ES-@no0}o;P<`scNGCa8#cdzrO0KGQ6Q<YT0 -?f-(Rc2?>k|4dK&uJ*w@G%C6=h#eCyfFpo2LsAsD`(YBbDmMZ>+WLDFyz?`W>Xf;npVGw7Nt?QA^?l~ -f=6kH!e?aq{ohe@*)Df%?Cf_Vb#*<yg*g9#ixg3cIh%f^m}b^1fQ?&6I8r53$G6KNe_X*H~|c-F`!J^ -xw;3ukmkn+<X&$#Q(lSrv3C`nSAs{ANJ)(lnQi}(x0uC-F?LNy(V}f$M_rN?fl}%9ZD;C_|$gBl)Jg< -#_%`9bY=d?{~U(@F@^suVAge|$~^@wZ)v^T?Vm%kQp^4?v`??g|DUDNY2Gdj``nTyzyB9dO9KQH0000 -808trnOu`yDVHGd{0I_5M03HAU0B~t=FJE?LZe(wAFJow7a%5$6FKTIXW^!e5E^v93oL`R}$C2gV`%@ -$!EMUPcO+`fhU1JxZWXeOYENMv!1MiE_B3o8tTHT!ProEg`Kk++RTrXe^u&aku-^-g>RhcIvPMnCWPd -@qe|H>E7|M23Q^7V@^pMUe}dHLe&Z@>H><v;oDCl{ZT*FRsEZy#>{a&vceTfV%1dtGiG%b)K5{pR-eD -nI}7%lo^VH&;*h59Q76&Gp?=d6U2S{NiKR7k4*LH`(*|*MGgfy?=N8Q0{*!Prou|{{EZmr^h!}@2>x^ -VQ=p59`obFyZZ-y$brju_YeE~HxJiWPuFkDj~_JRKVItUfwA6w$V>hFRDSd2r^VKqImEC2{PXhc_O`s -_w~yuJ_2c!!U$5WpC;9UJ?&;y?$M^Y|zj^%hzvefk{ORi9U(0tlw|{xK`K5eT@(!QM(|!5w!_&|Acjx -oxRNdbE_;B^`fm!?M;rhBf-v9LUx4g06l@Ist%bTma@^Jn3=5Y_76Y*58?%w{>{X_Qu<^Ju>PapW|{o -UJq9Paw*`r((yk8}8kZ@w>IUq9xZmOotIT|ea0eE0sx+nYDp`RkiE*LRQC<?6A#<GaV7|2|V+aU-wJ8 -!2Di=kS`{-<9i|{CBSX*XxJJ{HFNl_VH@xh?gbT`Zrfk+<&g-J34-vH~pd9=4w2A?D_exPQl-w^liDh -)3871+~*%TU_R*I5?1BM>+=5b`lt7|mpMZIw*1SB*Z=(O_pi&dZ~k2V<=M-Z&%Sy6=ilXTbEflObN%* -6H^00~2)-@(R1a5oPapEebAUfRfBEG<XOCxJy!iUX>pye%U%hz!>2U%2(gMEYHe!&tATM@#XhlKYL -le`~Ky3-@bbOc`2{1uRl&Pllg0t{C}qSryTN^`<%(Q*H2eBw~zbL|D4PFm^XO)w)}kc*Xvy7H`h0bsB -)EC<lTq=uQj~Azx#`xH@p0OLVs6oekynOPnYFy4>yUOMBhKGZjSQz^}S5czxn*KG|L}d-TmurF2Sqp{ -?*M-IrLYz_xBH%<%|2rCw}^;XW92~v*R<1!%F%7RetlI{a2oU^ZWltqw>i`4*cqh#mcAp>EZsDa`ht% ->BpZE-~aom`~r}2Z$2hQ-rT-V`*54jmloiCPI7LKoWNh+y$5Vh*KdBlyT85v%LmQ*AFtkB-CeUJ57+< -p{`&4s;{EE!+r;eEyN!*UqaW|{VPAdr#}}_O*7NVb{Oph4ZFBWOCgU-;^2X==L+-oJxnJ{H%4eVb_i} -tb#<6OC<*k4GYPMlVe$~uBezm+uqvPTA<5wdml8#56AHP~POt=2x?KQ^e<Njdpy=2kKfBQIC`KR(5`| -SMiX?}11dBd8$%*V({{Kvj``6F&AJNoMFx7~j`<F~VamS29Vfo<)pzy9zp&F!yU|1zKRzW~-3zkhjgk -(2hr>py?@;>%}W|M2@4uU@}=@x}MAUwr$`4=<nP|8mIq{9wAi{Q2sExlSzp+qVxgUaUj8+#@{u;_K%> -yn6A!o@b95eeQvCo4)+v^|wEK_44`u{NdY|zkmKR|M@o;rPSjx4X)Aj%VN{BX*4tc!B@L<^O1kec3EQ -DW$;~%qh7|*=Vk3jzYOc`GMZ%%the=x{9u<km|yzHp82bBX}03h-TP%b#=&<pFEi}Y*Xoz%H7}Ew<-5 -gC@}6ePf9T!zxZxM(-TAk?!EP&mn)epD%v{~`-r~rsu61eS;PxYb=RR}rRcR&<Qfcx|j(Uz;=S6<-OF -QyP*<`2uj%LwRntb{iL6ZX=IccWu+<6&u@C^Bc-ZVFDkK5~o+o3tiJL-91>p5=Te$Z5!Mxz-SH1jf7O -n<HHmJ`~JT!&aZ=E?`rxbwKkueB7Nr{^KpkyD#9ZIuZ%jgf2VExY^l{D(O5nT<Oik+)Oxk-V=QCB}Kb -t6!MD@qCtij7~GSk9^Xapva%*dVmqn?Z&N6P_XzN&oz0j$#YGfYj%xm=G?FDNWWrr7mt?L%7z79^j!2 -@^jyryqQ{~~E@*=5pfMWX<NCbF55YH;rqOhoK{ILS$uyeLGci&%t{L5oZbmnwn~gngtvRmI-RSOgce* -E>v!SQc)9DGEL18xZaC!tif*wH+aKpGg*Uf^SLC>IP&@<>6^sMx(^sMx(T&vQf(xcL&(gPS7@MPT4bK -FMHM$cTRTr#>hx;MHvx;MHvx;MHvF4*bT>Bh#gPLE#qxGUF<ot+ImJ3Tu+J3R+I2R#Qp!L)&C8$w~OQ -DeV#cJ$0S%z4~6^J8A*6oJ9KOPhH!2F`L=4aBwB4K}zIwg6j{4cAKS8FORcG1nsZ6xY|dUM~{(jh!v1 -V+ImfIlT$kl{Z*cE}7SZE!^3z+QK;nxeRRK;LaD{<-+HZZ#-m&9Jezr=A|aY@>eVOKwhB=p$75|<QvG -(U(@gmiTLzo#_v|z$s95tX3uYakKI}9BW<CD6$=cWM&tJ#<C-%V*sff*?9OO`EozpVD8Oj0UBd!x`{2 -Vb^7k?zIoe>1j(r$;TlpP#$<8xP_tHQ$=L<7i63)S7q&aX*4i?b2UH3UJ0{f8WFs%X`vXn++vfR1bOU -_^pf$fyj$aTmc%cV5FtNevMWnAWqanqMvV1@H*4Q~1iBb@jxu{3UAw7Ho=6I>9OcJ8e>-E#k=hma%NI -14{6uo4W(*G+$MM}^VkeS%vpa)BB$|7wmO1Q~26!@L!+mrrz#8)+w-ZZ(&^u*Vbc4QG@+Bk)_AH{+Sr -y=$s8mzoT&l`~?P`4YDA8_h2Y7AybM405Z^7^X?)AG8~m#x?vgyMbBFTcI1<1lwt{aVH+&0Qn(%IyTg -?p`JE0o1m#QjfR=lB+CU3#?1|uyM!6xE-_MtD`?!A>*ly=S)#&n;^zyduZ+%JRt?EavzDFt%74iTVsN -Z^J|K6l8JQbr^<drbYQYj?degcwM$TozM+=1~2W%L|#JU_cGm<kM2iPlvN$XrNwx7?(fbX#OECoy=*P -kEIy#X;cLU!V&b6?~W<zF%bw(-b3XqLF?);Au~0p~o3E@6qn^i%?oo}TZx{i3O2*WfC0T;_{?frHB1( -Z6EP>NyX|OY%zGQ4_#5nw~z{02HcVZ5#`mwyURo+Ph(b+WZ)7`lDhGMqO<s~8_!`gXct*!xI8Kq< -$_6}`%!U4<J08*Th>k~eJfh<f-M4?M@Dj%}I-XHP&+&{fux#iFLLJWtHOqzz;t^TPY&sTDAL$n7{U$H -T4|K;pVzjfNJMPibJvxLX(QMo=tR<f-<V`%`5m3qei@`D0BATBtseX~aAJ9e-NNyn=YXz5;WvonXOeh -?iw3>DeRv+3?S*;wB8^im0+c<0R5^wwz2kbath+zX1+3;vMVAsmvfLZ${X6u-K@ASa&I*!--dB5-yjB -7UZ!~we=4F~KvV8;Ptr?R0ZZq#w3j^O~K+0bLsWA1fp@DgZogFt3OPn?%S*RZ+`dYKJ9HLExcD0L$kX -wcBc5;WKRuFXptyd*F=fyoIb4-(o49vUpU!7&@YzllKN0vn6hnEl3_XG0G_5w`bRgO>!1Ex=`f%K(=F -E^z_b&=aN>;4#2sfX4uj0UiT926&9qK4d(S<ATcomjNyVTn0=nfMmeb0w@Mh44@c5F@R#g)B>g!Fts> -w){~dy2YOa|f|Y=&1sDl15@002NPv+5BLPMNj9}EVp$8a=zSpfMFKL*_Z0HGA0+JSBB)~|3kpLqBMgo -ik7=iOQ*nGp;XG4#%*R40!4XhCF6<w}ZMRK{zX8tt)Qj;8rbqF@Ivlu~mlnw?{miLtA6cQ2Jo^^Q1Vy -mst*WAn$S>;v}jkRk9fnor~0Ez(=11JVi#HeM%BdzT>GYZN31(E?I14zOevY{uC3^r*6iWMkUpjd$-T -ritP(`g3HwmTzvNq(RwkgPxw#+nU1fn>#I;2yJ~Cs3?BP31u<P^>_)0>$c^?~LRn`GKB5vI5BpBrA}t -K$3{I5!f{mJ!Ul<dH}@=6f01yK(U_wVk9rg5A+0*6-ZVfNvM|%JqaEvP^>_)0>ugxVbj^r11MIYSljm -VBY8=FpeK;5K(YeK3M4C#teC9|6f01yK(PYF3KT0)tU!_AwAGWZ4|quhk`+iop|YVTkgPzmVzw$!teC -Be*{X2u3PvgzsbHjnkvh+Ho2(mHsbB>{pA9|1NChJmj8rgE!AJ!oQ2N%uNCP7cj5ILPPQE^qm*j`WH= -SnCOd5KE5mb+c644;?O}<QirGb$KMj9AtV5FVAdL}Q)5A*~p4XiZGRs$o@(QN1mMj9AtV5EVO21cMR+ -0X-wwAkx5lb7TNdV-Y(RvKojfsqDA8W?F{q=AtJMj%+(&;yJ#Fw($CYkS>h@{;^OPq5O!O2ce5Fw($C -10xNL5UpgxwZKRNBM_%-=mADr-|IHvB@L`Ju+qRv!)!G$(!fXqBMpo+Fw($C10%>B+0X-wG%(W6_+r9 -K8dzyyg&-;$dV-M#Mqu;V&=ZU_Fw($C10xNLh&ssG_v2hQcu5B<9jtV)(y=EUjG&7(=x{^lYDhp$f(~ -j*Q+!T%))bG4WkFpSccGWSOB(c}$vVm~b}-VxNCzVwj1c){!?nOj2O}MfbTHDvNRPd43trN}N(U<)ta -R*22O}MfbTHDvNCzWW{cPv~MmiYjV5EZ)v@DGaFX>>VgOv_eI`*W4kq$<nx!KSYjC3&4!AJ)q2z=Sl1 -B~=je^~I64pur?>0qT}PdXUsV5EbQ4n{f{>0qRTkq$;W80lc7gOPs57Ykm}!Ab`!1SJh|E*pA+5ovI! -TaD1X5j{5|-zHMo!AJ)q9gOrd9$N5{4pur?>0kvJG8?0DnxLsPji%EKnn^<sFfzc%*l}S-47qOTZQ0N -htPJeQ03!p83@|dl$N(b)j0`X`z{mh21B?tXGPaJ0c%I{el>t@;SQ*%p0Y(NG8DM09kpV^q7(qSE%}5 -V0GQh|HBcs+mF1%!bl>t@;SQ*$8^pf1c^aLXVj0`X`z{mh21B?tXGQh|HBcmUCTzJU<D+8<yurjbGgq -jVRBO7{xkpV^q7#Uz>fRO=41{fJ&WQ@MYO<s~8=m}N^SQ*%p0Y(NG8DM095!CF4kkVj74I<PaLTQEQ0 -Y=6;*9~5R0F@0r!OFm%3@|dl$N(b~j7%^x!N>$7XhhjGnocul_PQCoWP+6mRwh`P*pmrHCK#DuWP*_i -MkW}UU<4s98+w3|2}b7TB^lu7x*-*3Lr<_Wu_ve*X;JA3MkW}UU}S=k2}ULunP6mskqJiT<|StEk_lE -OSeamDVoxR*A;!*zo?v8xkqJg77@1&Xf{_VECK#EUmzcpzCRjm2%!Z!WlL<y97@1&Xf)Vt)Y`7K}nP6 -mskqJg77@3=wn88aXSV5&|D2mz86O6!rv!N##nP6mskqJg77@1&Xf{_VE<~-L8UNXVT1S=D)Ozg=7BN -L2FFfzf&1S1oSkj_Xab<h}%(*(_4H;0!ju(H6)0xJu9vcSj!BMXcyFtWhN0wW8IEHJXb$O0qip6Lenx -;eaLft3YT7Fb!>6I9e}=m|#1OEi?i2Gega{075sV)zS;pscpFd5Jl^WPz0hRu))U*pmfD2pO`WCm2~^ -WPy<dMiv-ZU}S-j1xD89CFbyw1y&YVSzu*hPZk(iU}S+21mA4v2}TweSzu&=kp)H;7+IT_n8QmJSXp3 -Yft7_lK~m0!o?v8wkp)H;7+GLsfsqA978qGzWX*Hk;3W&JEU>b`%EF#3FtWhN0wW8IEHJXb$O0qeof; -{phU(i8z>=1n>z2GEKN#OQP0&=DM$>5q&7`4cVx$wbWkV06htb36v3ZGQIG*DgJ&m45Pp7BT)9LB-bb -2~HoohKgoE}b(phwVS^AgK&JjV@s20eqGLC>IP&@<>+=~?MnxmKk|rAMVlrAMX5<|UTlc#d1?+34Bm+ -34Bm+34Bm+34Bm*|=7tN2f=pN2f=p$L1wz&W;?n)3ejF)3ejF({s>s&~wmp&~tFDL61R?L61R?L66N# -EW_~}chYmxbJBCtbJBCtbJBCtbJBBhtwoPTk429~k42AluG?bW7Cjd|!3r{DN9XEjS{*s7BWHE8XdR8 -SlSS)f(K?!RN2Kgz(Yl?yB;(|ZP9m+7NOP9LnYRj0Eju5IL`#TgrrZPSH|8Y}96G7DPU@{7J(!*TE#u -^iitOW%MTdg~R-}_X2^?R6wg&29AvQ2@7O=7)NOrblAUrvGRJEOVvW$~23U0(PK2FS9kPV!;!3p3CF% -t3aC7UxZow#wr&!W7kG9-$&p=(B{qH&X#6nLr=Od6!e(8`QRF0?C2sTl!6!PA)(Cn7UrmI@(kA(Awn! -BG)3Zt@bt<Txs7!SNW<Ye8T$_EEtq6}Yy;s8E{nE_2*KadTzJ3#oauH)oq@+~g$&k1||lkl!>ccR*=_ -NVUMj4Kh`5zy%i{aNUCPSojBrBREo+o%wES<Z*CbMl!NMzKocrlfWv(%+_=tBnUAyP8eL^VoogVSW!n -<a~wlO^wYS>O9BJp>;XezHXMYbRCe-T!B(s2gN{UOXrYEZ4W;ymOABeqLL^r(xf(ZArvMak3?~9Nw4A -_B6#~Y>eHaeSu$YGRFkG7vDs<aOCU+;PeCyzOInQ~(IXC6}7#Bs+k^LQr8M#*@dUlLpz~c%rhhqj^j$ -K}@E0?<U-^AOz2n3+ckd6*+>~VvRI=D3AdBaB+9FIW=9re9HWu4%~pe}_Fz}AVg<Xq(S^aR{=<=>k2a -U)v^*d{sJMsAQQ0(1()Jr@?VETuijucCT5#F243c^pD+S9TT6&TvMCqclR(PDb6)jqFhNh)YAuD-o?L -2^V^r4sK4nlbE`2GQ^HGHRQrV6yhX|4Ry=NMw@2Um2f+hgVF9)o{qiBP9o^^y7OdtN91wHeUc}$s#*t -B%tP6xybo{68STq-Y9g3q>;u7Uf&G^zMbni|-u5A%3f&X<8~7#lg=peR2@^0HZq$%BttkP^;t}K+L7Y -i<C4W+oAKlJ<k#Ta`2h1EwXf*9IZ7UfS$Go_9lz~D}+sG~pE!$jSJ@_#?cwyIQ+~g&NTX1Ru3LFb92@ -qj&SVrbD4rSCCh*U&qGZUXXcF!@<=CW+D_gkmF1ckNeR*BsU)Xb3soLMbObs&&98O#t@px~mAmvJQ)p -k_wg<Z;FU87E`cSu)Z!sG|m7H}Wl3cL5B*g0+w>?Et`tH<?2U0<@V0yNSZR*DW{6g)5V*Y(JF<rEhRz -AGmXp2=4NJ>52<^h9I9sjx8t6n59F`5P`gI{AQed;pmw#VYW9pV73)Wt%7!HkO(&k?`)VMurCr)A-4p -?a{oAjKq1+oag&!gKs4B_5e647;}jtn?#@|fCu9mlEQd7&T+ETGYu_?Hh8EjB>p2g}OC0&DA|9E12}v -zuu?=y<5xIlMb>fhaQDfa4R#u@CM!0Txn2P$Oag&!=m#xEWAypXab0HonL}*SP(n$L{0YX86G%~(M%x -tRcB7`-#eu<N(PU=e_Rj!J(kf%FvS^4x8TI0x0L3YE))EM%-QJGUW-@$+(k{ana)6QdD>Px7+@ur(mO -&IopSlBTGQROf8<^WjaehI?^#!-gKF;o$<v%q`ZCiNvv1q2IopZm>`pl!1)%r}m@khn2Yt4`w6(ZMT8 -mqJR!@Ek!tAdX$9klvkjV^(o3g<N7$Jq)hGn>G_x48fxyJrpGEGG&m+{2(|xbtp#GuOLckTzCngv>_} -RbwSp}igvxmWPY*rO&b?_SLM!Ca3O1#JVX9!qi}40k#Ta`btW4TqK52=O7=(u<DR*8B9yhKhQhUOD3y -lfYH}oKtOnclw(I+HJt}pB*asp|G$kh=Ye*%&xyqr9%Yq(Ifn4?od2ott<dg}X9QnGSq-osbB}RbhWd -EXXuBlmF>;`R#{0F#=_081SKSN|AuQjzfRU{SKQ|GwUm#BsTJ<32*L6S3!Wg(|v+SXW#A`+omO$5deV -L^H}0ySeXx}Eq<MsZ=-_0U|d&C<Ceiek{b3t1r}bz<nxW`Yd6oJ<vg54I572~$M+*0{+_41XNx;6`Cs -B^B%BLkn)SknIY9Qc<15_K^ImcxqQSN)ah&IqR5mVk-NXY&-jytWaPJ3hAOwk)5G%6f}BAnX)MZ%7Z| -p?NI%W%0CZPOlW>{CDXq#M@|4z&_o^e&UT=p@2b`f28L%uh%-_xmF%(;@0O6AW<}<%Q%HV796*();vu -TkDz@1V`6iJsH3ycB#}xpp`0RjuDmECx9<*Z}dtB;XN$LcQA{14GiqIet6!uV(#2w)jMOHyF=?^EqDM -&^I@8?}%-_CbaDShGEv+@n9c2d!t9I#j?TC<Uw5B#R7vJ0>qDbVoEX}IYsqZ)f$>RyRO1EcK-1I9Ito -RJfGI!cdK)$UfD1_gbj>z%w_S49;BwjjxQ^mBfbm-zX642>YhGZR7@F>^uZH)N;a3JxI)w9q0dOF5+@ -Q55`@`*F^1@{*VeREQ`M!%e{s1jDJ<Fws%PR7j0Z!o=Ws#ttnq?#O?R0Ow$jajAO^Bp5@CHkHGYgErI -z6IY=0!O@GWi7Q|U>$WHWK-L*a1K(tA>$HRs$#=jRv3`&^H@1W;%0#{>M8HP=!l_(y%1sPyq-b1XRl} -4PY7ENU{=%ty4R&u)L?<7~HJv&`3zb@G_kz_X^Ib7zEFKBUvee+WhpMOMIc~>J4wZVckEcA%!8Ecp4Z -gmE3@j|@>N_%mLa}EHB?nZb7=6vRzi{ea3tF!!OhPZQv7?&`Ny5C)PzGSa6j?W?!lNL$Qjh=#!#CnhR -29a!$xA#`Ud7`ozM%TUT@jC_k>D)060krm-Um40-Hob3Cly>o6voz-U3IUdoE&H5RPA_^XaX;o3f&Gd -yN(eg7$7{M3a55mA5uWsf~i<dRGM*<mr!g2oS0Bep2#)j<P=gA+fM^0J`@a4HkN1!(+0z0Qv5~gkvZS -^rS3I0|5O}_73m6DsC(kCBL7ym)y0R%_-Num0ZOz%Q;K{kl}8#kc}Yb?GCZkKDdix!pe8tO-!bmqw-| -$s!9FS8B#%^@&J4itN#i=sMdKzfaak-<2S$m4%WuJBP{A;>GFv*&z}!ennp$Kk{SeGB(N22Jee+2c0D -i`jRrw3<9D}FIz_qD^K#UZI;4nAKGMG4`NfQGl6vOI|)9z6B>NrtTxiNwu#TM*Yb`)EJl(Z3DIRvY+V -VwHz&RT}b+@^FZOas|OjSDXk352!<$sc1Hy(<h>vF^g8GZ_%4XbSXINT-4~$svcht2ofc8FjA(IQf$N -B}p!%n(1VN&R-}Dmc@dI5Jph3P>|&-7QQGL5j@-JH+S7DPfs#3P;guZ!9_Z-Y=@#;HYxgg846h-5tx2 -I6o4V`QlDzR&x_zUsMEy~5naKdom^&68B?fOC|v{{771DGQu*XksCqLd)S)_MZmz%gF?FxbzHk}R*p; -|QOl((7stxUXZbmBDP<T&mCwwQiazk__9|D{im%3M%Q$z$XvP~h+hz4g08K?^~GCD?OO6d|SmV5}yjX -XxdkR8I~=24XIUN{wehJQ2YQbo3{Y%s4Xs%1!gZ{S)x!i#HLOOquLT>+p|MOL8x8aH`KDEuRo4wn;Wf -07n75;sW1JdM;J{Y0{i3Z#kima6yV!6jau_nW-Ls6{HUvN-glOQf>WG}s;${S?gWWC2;fAghUSVfLXZ -iv6nOvAy4@dv(f?3O_ZduaiRep?$A7YiRZn0c1V!bnt3N2XZFf5o?W%Z_zC>uJjT`6-&-YE(<D&Kc+~ -^bWBNw!35exK`-*A9oj#PCL~kGR7kaJ+=YLGYKY&P>WXCq$&f%V-4)x?grpkDEh0D)gCzP<{y(=0w(q -xXy#$JQh{{#QAe_?HM8raPw=I@R^?;6UjZ@Hd!2>ddXFhfu;MBdEtA3pcrOw7pELkU%2*A*3U8Ud{A4 -*49GPL|Ey<{<(E+a~``3`ljPOW;OPS;dsKvteg4xW!Gn^Mh0!xRup>SKZob=DQ*Ytq=Y>m0We2WU%F$ -Snr1>R^~jDi(9cX+ZfXS~FE^*M06x<BGt-!Q{<8-f!{}gHZ(2Q>ivJ6fYzFQl@N%f>f+NB*~h(Z{3J3 -$rB<p6e<=<-FZ`|?$xIJn@peTymjErv3eB3W9CCAyEtZHONZ5hlOQsAuww<&OG?kq^E!2}B^0c~`=~@ -9xsLPXr?>^e9-FELU5bwz#0{XxYy&a5XUb*WPCQWeYE%mv>a$hFr@BkXj3NROj|In5mc$rW;414Z`5N -b~b80f6TSvqdUQiT+A_61lwj{4s9fjE;H*qY~0lVYM2Vj+)ooAs<FOqg>uk87y?$wy68awDi|0UL!07 -QvcpqH37uI?AoW!j<avO*MO*sOw=3We2-o4lk@sN!=cU33yc#D!>uN2~k51-4)bVyMH1#5useWX-iD1 -mcY|>Rx>bVj-162m0X9Q&|@1CAURIsngg{9!Yk3X~_m`L}w`>X(z9y?zOn&*gdN}i|CSxF>*)PhpD42 -MAl6@Ee2l)C`g1j<?MyH+x)bX)V(?)Kp>t6sr;g-Sf`?vV%E@v5<xVb&!U(=#5?ixOQ*NAs_fd6S5x; -II&~(i&~zw=RdC5IIvJ@2CC6o3Ux$+9)CRl8hBz*<4A#!52+_F7OS~yyQXq)Yo{F(0Y9i~I005(^O2l -;JO~F|~(IJHcv~Yz}@ADyEf(|1QLXMIkxlk!uaIuDkFNm66_tFxaR<RM>0e(m_?ARyl&UH&((m5Vjpq -^#t4<MZA3PCAiP>N_uFHxKm@;(Kpv6RRoRA5$(=*R2M7dmyXCWQfu97AbL>2fmP2Xcf&6GbK%P^CDkc -ppdKNPgLrL28IRr>;TWt4r>nBCaaHL?kqool}Ql)U7xgiXGaGl6fVuZ3hfcL~jwL;>5$$Ibr#Wrc@n| -hN5TMU>j^ajZ`RZhByn|4Mz!k+TI6<3zYj@hg0`js!lF5GohWzDLti}rWBm6?T3?L3D`QO$jD`S>7j$ -s+E`>RHE!qp+m1!yC9r>~hldtQ(RP=Klx&KP!&{$QLf%q}ffR0{=QDnz?lrnXoK3z60nk#W4r8m{zDn -?gDPfTILMh4=*XC9!t~0bZJ5Jq*y4O(MKZev?QRb4|A`XPz(HT1CoD^A=TR;Id?S`q61BCRg`J8bqb+ -05Nu~S+Ze!68Rj%$H9Q9fbhP|Tr2VnjMaDMdMN=r}~I_&$&B)V-RrNXlh$e#bDbu8;+)jAn)7L5^ieS -y-~sWhxXSh*S1vla03RFLkdbmI19WS5E5CEx;t0TIoi3RpYpn6A|#3NKrf&aSNArl`5Zgj!xaH4XIY9 -L@=oiQ8@*I5J;sqDS<X*5vOjusvOsKJIYr!MUCRld)=seEy~KsL}~5uQKo$N-X>ahoE)XRMG-J2#Lh% -NJQ?*81*^23A9Ctm3w32Cf6QM_g;|%Fxbs;u^N3O$9yFM+cLl^de~tacBk4S3-EnMC_v&58*-fF4cnm -*43YtoUP=17h?^LsKVvdcV0Fy9=Op4T>v5zGldtCGq@}{N(%AvEU;D_okCt9(-$Av%+2-c3a@zy|$)3 -c$J0m%lJRbpK95@JTv67QqDnun%x1WdKEAxZ|a5g`5n4GTz`P01me>84ofykGJ-6zY|>a}atUrdDMvh -Z0g!BJdKZKV1p=seBsbQ*jm#tY;l|jteg#g%apC$hJ62Rz~T4PWN<G*J!$Rj4@QfqO2yEmhcYQ(9xkb -&vDU9ma?$SrSB3O;0!UOj=yLRqKj4A=|*ZIl#s`=E+xOTqcKg2Z9gHPQyhSQQwAPtq>Q@sNjONMs>M} -LML`RdduVlfcZ2Fc*uv~QW$Gyq(YTxwb}>u>Hq4goL#LRAP@(|a6?z&uYMD}Q6}_bB7`gIJII_?oWX2 -_rgV8q1VGV~yjD+7pYiM#69VD@ZyUZIY4lys4DY2>)P8s?`)s|#j^pdgPNP&xQ%Jw6-Xn8Q?vh^}Ka! -@;?ZW0G+y4VH$MH=?5M<gqAQ6+TBDJuV_45}PeRn{1N(51+PC@L8piEW1}U3i9}3^n2BI`0>~goJG&E -$AG-tg2ap!-vcp#TbS?3BB$Dj~{Ra)8HXdOwsdH*}|S*>RwG8nl~GC8b?ELlOhgk&a4pWPFG;1O{8%# -e)vJ^Zo`#%spq)L<8*0(XcJN(LrS-*cF;Yi=sxa_XCPbZ%GpR?ni9?TJm70~T*xW8#Dnal;`GhKWpKr -Wm8+KAqGXN^isSh78jr3Wg74P~PHB33eyMx)u5E?%AW>d5n?ox@EUr!x0$q5Nu8eYh$bCRI>MkI2NW^ -)+@Dk1l7I7g;`<$Gv@yy0S12b_29jUHj`Y`OF_bzA!p{QL2Dq88-<0dcZ%HQGzgIc=6%DCVxqm9}coJ -n)ssB2rp#mptaRLwa~mYMd=t9cs=aksPyX-bPuT5;K0F;R^0RyI}KMnU1Ok&*Le;`et1K06K|xX-wID -#tHUsoewAUGAI%#8R9j-Zv#4RfGn6k_!T7Ook~GQ^gJAQeVQ!4G*RF8_|_Ax$sop(cuvPD&I?8M-7R< -m<E)7Ujm@&owVO~J#A3;8e}V7x}$g^Az5IKJL86s)Wi^oEtS7OM>K`}Bpb?7eF-MSb{r7Yy%rq1t7p? -ubS0tzqD%u<@U8;Ls>vWE#KM!VDs|_8NFnj|nzrAI!b@eiUn$M<ebQ*e)G*b|13G`TEf1mMc2#@H3)4 -gHR`p~}*5I56^b!){Md>rbzf#r7lztHfS5FcEF0v|T$oj(jWDD2MS?MJvo0m}cTG($!y|7U;RB>K@Y$ -;wD6*jIiKm-|~pjWvl(JG=>Qk#Ze9lm)~Q1@!|G#FSY;!zc=UTUB^IOc(Kp82F~E8@o@Jq&UkZ5tm_{ -*naS+~ZRBsx<Ks39b@=_zU}>$ge5Ejjj>W?XeV7$LaL~CL(1?1QPwm$xEnvjky^G09WL>Bv3<oSR+Cw -YYL}a!Xfen{`JuMDj$GpptRe^xsR!PEy}-f?$(w_k0N%k3f@DnAfl9^P<3WiNAi`I!C&c4IF(?gw8Lr -Fse5%L4=GG=70W71$LYJGDq+nV??Nz@7IIP`l#4nPy<!z4G$_wocbpZfd)+GPz(}a7x@(i_?H<zmMD$ -do#I~l<p4F>BmI}Q>^0n@F&jWR@HKbS$l~FICi`A9xN&XmR-VvOgEJR18t~^|Y=6A$b$F7Gw;@t0J0w -x!3dK=ZyibGr&w~HhRQyag46O&GAHI_=g5VrL0C$u`(Td4Z!->7@F?brvgB?=C5L{PJDW0NnKu-<fmz -fhqzGDlYtk+N>mBq&XdW5<O--K&u+C@NK^Zn~(XxQld5v;!sPs+@+rglZy`@y%J9lBc@%DgnyLQ>lA3 -w6Zc}*D+u!QDBqC&~CuOR+axuftY}t%6rwMNyT-Q=n8fx9#r=#;ak*RGNg1Hs@X!X?2ziq$tQ1mF;CZ -g@kqP;Nx{FARg$vjexvTyI2Phl0j9Dy$`W=NTx|U=uvg_J9A4!GdQVPMa!(~!YyekE{2Z4&&eBF7nj@ -ei0VtIGXWf7f;!$7~LcuATRxHWf9LLa$+&B?v?cB%Iz1mU*pUjI0uL2vnI}9$~x+13q^s=DI8h+6CI! -OJI?N;^oan5h@l9-$NYPHz2a&7W2lXnxjL<=n8P(?jzGGHHi<5ZQM)+?!`32&UK?$ssXiR1A`74YsVA -EtDsswP6^eo{SjI)kvbh9ov^b?F2u5Ip@cb+4sqA48l(&?y%1wkx9L*d=(#G_hAgqoMb?Buq@da-*8Q -GrmyW>ynIv*+M;Z1yK|eku3lU%DYRTrX-U?7{W9;=nBqFWxGn~uAP4i)xB1|1F*>!fD8%hQ&9!G0S=^ -MPTMJb9Y`QZR>E540=kUSmvj3!>Rt^cHkRs91R_;-0d;tFAZ1o=wG7q1xN7i;eY(I#fFKQrA=|Du3hG -|VRB;(44SJs!L9(OKJNk~J!<41SNM*3%f=y<KkCL>dOmS|;c0Ei`_iCi8V;d#~@W_=aRDqyZ)qzx*Qq -7=5o}DVx8-BD+<UGlP?z~=5_gbdbR8l6D8+v0IxzyN-DZrkhAELP`<KyTM5~hL2Xxb|j+QzOo3e~+z8 -&L&`Se(wt=p{Im&=<Y#NO2^m$l_3ep5|-s1{_J#?8{&6`<<#UQFwhwDU|e}12A|FW&{uBinhgP3EiA3 -oS3_ahwUeG45K^Gsm0WJ99c2^z}W9u((S`{R1wl;EXfuSn)7}dKZ~?b##}^Rr5B*(+;7yq7L|RUB|*r -ho3Cr*ieu_%07AypTb0m~w5>xojk%&M<dD8o&v_WCpOpFn0H*wlZXfEPndWJbH%(>o$Hom*U@Fn1Fh* -qyT8F)lr}UDkQd$u`ZgnZGEwB-LVIN?uF4c|z-goW5l2y=_Bv2C*-*pv1-K!s}qUGO|ciO2?<#eYCVl -h5Viy|MbGX`S906_VcrMN|JfZY3diI<4ltA<TA@Os+|u@Aw3A6mCAwyDrY>LtVt_kp+(s=(FzuG-E!a -YO<ghDcnYKZ(Dpl0lWzxN?0&Z8`*@JbLI=aY~aQ#!!o(7d5FcLt-1_ikEEnge1qWR5m-d2(02V)E}Ae -t|fz50NAGV1iP0?9ve~{PJ2e(E72^ErurR`V3k>@FjvvGjz~!NR23oyY0IDl$yAxL{h})syw3ZDm!S6 -<%6!NVDSDK)r;tTQ5yb*Re#oTXsiIX3ltc^_SnRGYLFp4p4>?DL5mddAYB0NkdZnmPC6&ITvY;SJ8RW -!t)=gx2DG}q!rAn!cJubY2F<co>)kZ)BVymdkO;?qiG9Ne|l|x`Df(W&C%{fehc(b&1j+?y1b%;D<%~ -k0kpRQ7S`8=UOOdsWh15WM|mjydj<S8;^fV0k~s_qr6hTbi>Ro_FNgI9zRl97+KU1}sYuY{DgNmUv_$ -F)?C4m>vBsnori=AIJLp!Too$d?K)NZh-Qv?+tC@>*ABR^uX)nv%W5$5bOlY@MJ|_iB{n7%^2>b(pf( -h{i={Z(Q1!wERQJhqX*mU&$P*#S+9sv)3MXp({&GaAjpwpQ<Wa9a$8Q!qzWUo#{bzgRH86t++|m;_RO -@Pey59+FunWNIKI25s9$7su}mFM4o(zj`Ve<QSs?RBCu)!pf0G$ZP&#!mz;0WNhzGNcq+aZ)yyS#t2T -LUY9{8cR}Bhh%A>Q1P!ACm;yh1QO?jN1{J{da9J^j$DR3eZR$UOcpxSfP>?+-!<ZV+`fW|er;EucNu6 -t#jwbka{vl#xa^e9F`9#opUj(jOL=&GI~zUZp*1gLuP=zjlMHPx4>Y)XEfXfU?@)9D0k0jH-_mtK}uO -GXX;tteNe4BVJWsjTPyqL=6mzq{aI$gxTyg`KK4q>DC6n?VRv^(g8rG}M|3Wwv5~>ayz}Ds``+v=#5` -F?nI7C3SKREwm~WL5FtTs_>v1Z5^)=uh%XUMfQG<o4mv&TDYp06bnnQhP0E7jwVw!WV@vB5(=5B<S_0 -_2T}FLY1Vw_-zs&lu3()6XjOfm_zo3^p%6>wA5`glY^_)4>h#8I(I2fj^CgzG&T-)-obz!)P2UG2hDs -U)0Pw>a4ar`3znwb4QId=d(>Wt0BXy2y*Tq-8?-fg52;i&A`&BzjMU!!+$MHTs6q2ee5AmKvf2aai>| -Z;{ww$-^j^6i5$w=sEloaWyFh)}Rj?+mzDm^RP)m72NtHGsUDJYWW6xyqMT<Ts;wTH@4VsdQL37%e*O -SS5HtEWm+VRohpMua$*)JU{q04mP+*>L70;}#sC($&7>C)Gkp4uILIz|*yiBv_Q?aZMV*|E`~x@UMm6 -IMe%HsmU_LQdb2mfoq5jh@vVz%lRRL#deci*mXh3#?DPDh*Lm*&I9!&_|!nl;q{KV1-TnVH&h<UZ|Xo -dm!^Qs#H~1z8Y=tgDxZ^@9_P4ymh#E%)#H<1arx=R#l?RBP)h>@6aWAK2mnzTaZCnzC2CF+006s8001 -2T003}la4%nWWo~3|axY_OVRB?;bT4XfV{UYKE^v9(Ty0a_NRs}}uc#e=IJgt6N-ul!va_)a2Adfh2* -5Gta5y?dx0=?tkyuG>hWqtfZ%<{Gq{jBmOvH`b4c$_`WMw}2WL8Sz*|X_?;)mlGr)T2T>Cy4o)v@^D) -%np+VoTd+JI}=RsubsKbz9ZNS{yZtQdFII-TZI0UKi^7-QA|H=0)GMV!p1*x)*cR=3ob1PwT3$RL|$- -$8z1=m#t`)qMsO3wLdHSZeHA%Y}l%)JN31_Z(8$34J<C2)*hd?Wzm-lar0<K98XoWdaV0LHPxyYyGMI -Me)G-OYKY0^2jXzO7MHqhCoapbY(JI@yON`(?%V2Sqn5eb?R~3`2=TgTKZuKJecM)dVqYi;d(k)I;;~ -;fwOhYZ)w;TAi}q1#ZP}Kk=$d8!palC)JT@CKFKW@2i>kB3D@F98s26{2TGjuqSyanMeP~lJ)N-`cec -9f1(BX@-H{w;<DM`hPvMyV-nv2cNx|*xbuc~=jccmygaj%bcE7H`77UaqaB2F4LywUD=qO8<;J@?15? -bH#G97xROMvR2A^={E?`IR;Ab;ms=^rKiSYqaQjFsTAs=|WVs8Fr;~uRf>&)j}T>ti(+zHeI>gtRppo -YAb#|y?%NA=2{${y%j$nUS1xaUBCTKwN;u{XO;czNY&lFg5W}^RkcOkKPti10I!cPk6x-Chd-RYI=z0 -Yr9U~nK0Cg;5+~=E;!s>1US6Lby?J$bDK6ezUYuVY9|&<(mQb-)=9H4XikE80yGChpQT9c(?(EXvD)V -+q!1Y3`ijSo-^SrDSqC}xw<o@xCY`AXfTeDu(g%tXosFtE``ba#qmBNlf-^jXZ6tZumKtDf-L@rgMqW --W}Cb&}FPpYLF`efZSZ6tnZx?VSZeW?1ziInlaOk*j;n=5r>+dpx9_WUzR<=M^-kfHvss<yZ->Ov&@^ -HtG`uKd@gtmkSq#m!oQO|Pil+}$YsC~3=Lz7q3Nfut?(Tjis*^3|$0zGeD7DwpcZ+opZo`Q<)2QX^{L -Er0FB_hNTvH;(ixiQ?boC4XbT>Hcyr+SyH_Onubv)c?-ROP@*2w^V($pX~3{oRjXnjB@h{@7#=(nxl# -NB+bv%|CHuP#*So8S-O{fS*dK#Obhy3^zd8t__?pd3aVw#-P^7sHyX9N$&JRKFK7+AL%ZDT0^c(CTN? -daJH<}N`llT=G3`mCcEsGg?NR;HYxMv9%L+=^#OK^;ZLB%cY35!z({%21ksJKx429BTG4n@qH$xtAA0 -eArj7pBt-}?HaF&Yy_Nt?0PP-2jjm^DeSVY^=Gbb*!YpRfbz-6BmI^x2<@`y8A0b_UEZy+&b+1nltpW -AqQwEn$>APkIiO?l<@}jR?7tajNYh%`0;(8@pcC->to*Uk2=um@z^gC)C>`dhrIM(l?|I+-YD?aweR^ -0zmkQCl(?ZJ6_@z6?@nueo+=4*3dC?NJwKKWi`q<bm)0lFZXuRXy(r6PX7=v_2&@75YJL4PCA-_Gfw6 -(Y9o^bMpFi8P;(ZTHw)efsnQK92jrFekZMOs+|R^m7eO_ThJYf<%RFcja;79Auagc#Hc5epCSE6)7Cx -Fdrc1q^U{XvIx*1P?GB>t`2F(Fguq=V-DWs^3t&%iK<|NaS(Nl-5)Zq)ERJ!(w8$a_$o-%#TOz#OlVM -5wfCyv3$OX)5BI!ViEl(KWFa{~BzsMj<iyQO~a*w4fxQ|jbNZJLKeFf=E1=}apF2ZI>7$FiO>k2os;a -j}O7(LR7fOXP%)bOu1lxJF4wvFAr%1lmj@q890fNIcFUE?7hQ@g&124+-F2u2q5<MKF(18BwZdHIR9K -w?DamW)5wHFo-Bwf+wRi@Ld=^a{`dlg&IwnPH|Ly+lJB94;wqP0X^{fG)h^!Btm4)JP|=a@^sQAQ56^ -?@$JAZM3^3<T$`j(j!DTp9;pVj0Rjh#!KxvTQp!x*lA+gQD`IUzfbbe6-QkVQiMv_CKF7W#Py}sd{u} -ypj}B7}#Cplj$%x_-LMV&%(j$U%8L*joU6B^i3%VSp*WBwVP=p&j;t1Fv4?cm|vLTO>U-F$Mh6i4tMK -U?^Q9Ge@N2L=GHsJaN?SS@aN5QiI<fADMp*+?n-h27fKozCUNrbHi{mvZ1tz8h4h=!!ccNm!{dqTDl` -=co(B_ycy6Z42eERaSNZ^*ARhjGgBDQtkJrN_UeeJnPlC+R^WT|3h<<WUlqlCn@J7z<=f6mKyHO=W?$ -VDymq<A_pkawgg^@|1hPqcIaS^lri&c`wX@^Ax)?$CHVle0qbCcsPXqA)}CaC7cN>$|EFo9EZ}F)WSM -vgHTQctcDxo#NnJG6K(EN|2g%od1Okw*T-C=VQxfJ&fQCT|Hax9W=iBoVa5sz@C{!QeCD)8BN2}Pcxh -PD;XImq9wk0a7#AQ)5kDYi(fQm(`_%u$Qizz~;bc{m$lx`ScyyRJgLo4sob<nOEZjgOE`3J&f=P%^kz -vJ5f3(pX(i4^mbf-g%0>;n~&_laTM1D9B(iGxPzN?~ikC$|0gusE`DWf&a4At4$2l*&v;lntc_@g1_2 -!o`#*kemZ+t5j^60aKGb107_9vw1V>>^Sa4#J(4bZ~&kcH2F4IL@TBH;_)Z)34DPDnRfez_0+pt80AA -$Bj#lgt)>Zxb#%S>sUy6xHIuBIV8%4k%`tr8l?nQMq{GEo{Fbw1P}_FTu%fkVpDDd3ag9;Q7MrFim>` -Y1v8$|F5fy6=|CHtx)6v-pOn(%5i*0YN|XC>t;*7{q%+K5cz(l6<q#_l1O>HZ%!f%(6mzJ+LBI(Gr41 -y-`T^nd8h##VFCPe+c`b7yqT)gBkWT!{5lUN^kTH{BR5-5*0wLk&QS1%Fv-;SPejJhUct#Z_&QvnYqb -wr)h8aGE%QT|>W*kvC$vl1?kA|DOaR{Y%!n6!sV4F<TpSuMn5wGEs>k#c@EG{UliKROhB8>8#V0d|p# -7dayrPm#_$1w`ZLOp=e91uLu@G&AjQ)uv!jp%8dWy1(Otwp9EN2pMN!V$YLA#y3&i-EQ{0FZ%(<s=$m -kUh~xSbAhoI)U_#5;zK+8Cwo7mJ<>)KOK@}$ppa0JmgXIXX#*Q`rLb7?xTk7gluY976+OLZFHR}^&p_ -sgr|8jn&Q!%wLqGe4|$X*g5#628jeBmEYFt^NNJIL5fn<LUlw|Ygpa*1oGF>gN2PNOUX0`=a=Pvj77a -NnxeL+WiT|YfN)pTzvn6w4V^{9N4HzPHGB`F&2!UAgRK79!zug0nddo7D!kNhPKpw+P2Q)=j^FZ{xuE -H}Wq9nen<=G|-%efZY7Pw);ohjU04GX!%d-%!AlC=LOQ1EIB_j3NWg7O$A+05kkZuD)J7%4LyA0K|FX --J6eDe+S#kC}!C=Qxk@B4cQJ4go6M%0P#33?h8EV9Z7iVPN})#ZAi8$e9Ad=dKghN2%hBgpI06-0Ni| -JurA;H`H$!tCC<DTu{yz%<IGaeY}gpcR4y{hZ>i^zwE{5PDi5*oQZ1r<TeQd2AP@gi7Hcgfrnp!giBJ -QC|Ms4ImCJ!1yQwT8kMY}HLA^&q-QkTT#)(BbZLPyag-`3)+Z4edaS!F;!MNKNtsuNohc1X&rLbpS#S -5$Pq+HA*SLBR57Rs<tz=9m&?e<nWJqL0<h?c_iP=%|cfLSmRk)%@4o$8|o-=SJ!YWop1qVV>8nni72! -k>>7C|D8^^GV88+t=~HbH+TD5nTOeu&($pAJbHTA!k&&xZ%bVxot8Cdv!LYZUxK81^)YH#EPD!*3|yy -M7+i<A|Iutl?uPkIU)UG)`3Wh@OzUhu1xMszJLR$(AzQL{lJ<?6dU%Yz+xeiSNmmm<<Ibn&)gtn~Wqv -K^92nkqP>c>@$LCn2L~I$t^)up)Gu<9baM$rx>PtR5gvAsZ)P0iD+ArM^vAlDvjf|%<+XxDs<2eE9H0 -TgnK5QY*5VMcRku^=s4ZWgWET78606Dyi0^OBvV@vr~~`@!F^9WjPYVt7;8W&Fx>bm2bCRY=Sf_UGEL -F_P+%Nhb|+#R?3u6~fjfjXd(te{p7@18ceJGgR1koPYe}!Pi6rP@!-y<llsFG-q}wy4X+8~^b6a%(l2 -?H2umC|9Ob8>CHA-f3crg+(>^H-ufsPWUMTA9)U1=1GmU^48pb|!=d^81`6N19k(oHagusA|}{;6FkP -iKZ2Pev_RhL6YuoPcmBakCnhf&OucJC6|SfojTX?Raz<oGbwsBgTw9TVxUOtsE9|$*ICZ4G*CRah&{d -TPCK++3(zQ#<ai-aqCwy(96J)Vy%B_Mp_QeJ`tkD_|QuZkoQU2x<X0MQT<MrfPvamIB*QVp2G@$Fc -nc3@QBK}Y<qMy_Sj7)rM}JBr)>`Q9JbrVuXq?d@sAYqN0_`*x1-32}Jm5w9PCGb!l++w!^yZh51Maqj -DS6zl1Ve(aXR?_2@w!isawlalZXbLLmeYZv5XyzoOCKcaB!JXypa!9aXR9#0o^!l=mWuZh#^pYeeKzF -n5gq|yb)@EUUN)=miu-(r)?QRy6klr|`Fgu5W2J0$IP1}Z?vPv71i#u>WuOSvWPjo^Wlwt!C;9(fK-J -ev7&+1%5DPFGE)&ZWUbw9$q3;6U5dkPcK4vr+gf8D~%2CFnlR@g+vOKOdAI2h5O0oF!yL{5!mtd3Y@} -<Waj&#-rh$iPKYfy@|x25P+*2peAr3*qE3jET9b&XIx_BIj;qnHvQht&U{^To%pf1FY2-@-E(e-b+LZ -zs&2Qr`K6rqd*AK|_3!M>>)H9q?C9|N_{I6<Tk*a4n>qgc{Oo%6)7kmY>d3w{hmOzA-@JG^yF7k1yMB -3jeD(7D)pK=L#<4m5`tX0I&bgDPXQ!{#RL>8u4}%ujjyb<5mtr=n>Z+g3cDr)DbmHlM`s=~0Z~9_AYs -<Cjbk@}6;Iuk1>x#Skbvb>$F3W`)W7d7B?q~XW!dbn!n{KL<*V`sdtDml&Y_w2^CeP?+5BuFcT9!TV$ -u-47JQL;sJ?V%iLw&br{vk#&Z#K%TZ5P=`A1n3cRtakkcQiy*o2MZCvyV?`?Ops{{HHxJKn0t>S_-Wn -ar4-l!RMQ{)em>yY?e#?Bxa|dJ2lT{QnO~MA8l0%E#^w%h>iA83T+tufa-_3c@Qi0zSB<(>wcX+tnH= -esr8eZc9PGuZ2U>H?n^C$ei+>zQF7k5<;SYobVghz=;_ivV7puww|bGvq*}V`c2h?B>0aef`k`q3AhQ -NWQ7@Dw>iK$Oo|Rq|9UJSWENivO#TH1N6zi@e_$<}(40<A?lv&rek$&!VW>mx=r7T0^&|&?rE&EMd?= -TtkqMgZ<4Q`dml<3x2t$tX)TtsFO%x+5LN6{%t(dIBuHTNs^g*(7AH)eMrP8BqYt|TPr#Wk(y9~zGxi -x3VR4)jLDvRCSTFpi*16vD$G$6^O<?bG63Vm6vyi-D4oM@ePjwJO{4K!~49^R)eZ)ij-XR@%+huNvPp -FyMoJ%-CqhP^w)d>8UY(XEaKS&`+y(l|EDOMfy(W`F8C(cg2TN+-;OgFDk7W?Zw*ks<#^J(X8UWs&Cm -S2APAQTx<O#{<^uX=0;w1tZhD);=XK`O{+9HFAoSm3VTm@lyCR2suW#R;_rmQ5N*bpA|udjt)T9Py)A -p|dAq>zyXxCY{Fg}H?*;wUvG0BF@XS)3{KvL=$&<EGLM8U8^On9-G!Zl{m3xjSR-*0N4u8=-_Kd!Fr- -!sH#$%8W6d05$<YYtd?$q`l_Q)s@PtQcNIpWb|wzcI=TNWRlkeDLLyYTV)cau7J|IYq;KfS<hrZB&W8 -x?QO%DUOyu4ap(FNQ(Z(%v>TO{FtzXoXhA;LB>E9dI}@{gr}WHjdjK6gz4vD%SIj{(BdKdMh^U#Y5A6 -=qz=ZKMTP<Z@Vcc)21nM2i9na{jp`@_j}^6!@2xmV_<Uy`h+mlk@e^>K8;PVFC%4TmzQ4sczQL=Nw?& -xZlou(!;NCI-H9<HBlq5c??^0THK38D;`ppC?lk<rx_Wtfay?T6ePx&UPeqn$?EcZqz<WFiHs0`y^kx -5Uhd(oE4y#Op;<8dyqyOFsaxp#of4Fe2DD<{p`PR#-bv~t5?0GnT&jr|xfBjmDzkkmgt8ekI-<<53Kk -*X(dK^!kKRFtZ8Vdo*kjQtrD7yF8|Bca44nJ%3?Up>c_$E!hdIH!?Fv-&*r(vBjTguT9r{{l-geyu7; -A7dIa#<Np(y26}UW}A2-+w|CNu0Rwp;fLI&quPlm<k^rfz){4SdC)w&Xi-)N$a1-Z;pPv_;LsRv!Hu~ -yJO()a1!+=$Df1ha;?T54Slk;XZmMFr&3eq;b}EChG+Wu@H~{C4bPo_15ir?1QY-O00;n48F5VTXvxY -T3jhEoG5`Q60001RX>c!Jc4cm4Z*nhVXkl_>WppoWVQyz)b!=y0a%o|1ZEs{{Y%Xwl?OI(=<46{L_pc -~TYt`M7n{kzskkGpiGz&9mX+S`0)KADH1z2P3tnG9UyW0Q0=h`XPEq{d2u+lyZmPuSy_ug~Q{ip)@&7 -1xo@#*lF<5O{Rd~kSrc_==eoE`i_46J?Qy%AUUTAbzaU7SXVILH=S#D(~r{VPtA2+t1>t2CZRWtNM16 -6>@SbFA6%jOcM1moX&&uD|IdTk2e7x1#LPiS?(tEauTtGqrJ+7I@5;SzbLru{h82dVHSisMHH_^H^!@ -nu>DLwS0uB`%=6+crWB^Hie4b<vU_ONyG)MEyRT`bpA~*YEKTbw9Mn172JGRyx+r!5TB#`cX1vkcX|9 -EJ_sNzMVX27$MQZ)*Zza5B)-X`{E=9@&9xRqc3XZ2u#e&~TZws;id-+^qE-(gN)e@tpR*kD57{EVeWa -mPx_~=`y43kYVL1Hd^ouyr1(1qgbgFZBbH2Js;yHv*;<-)>Euum!X{@-nOdS!B%QX;jltF#P?nj|x%# --bJIxjFH)Q&XP)*5|*Sig%(!jEV!N$@>DKZ*p=$c^MqF9p`qg^1Hi?LD~17bt|I-;q}0MvGOUZ&!&A4 -OlCFJHGn$?8}wdKm96x+rPNjKfU_;5o^ITW)Z(yQ~a<*3N8e^%A>S=1aK($e0Xv2D<t+m9iJRueI@iq -$5*F^mzUz`>_Y5|^Zkpf<AX0J`xoN;%f<QG<>8JHms%T&iOfEd8;WnC@*xA03tdKWQq-=0MR*GUOcvr -k`lb=)xsH)hB0`BQAD<P&Bunoqe<5NC{V3vFk!GbYzUMJ=2iez&F0|PA`bhfujxWX%i=y=R1R=PD_)& -Zd)kjH|<-Yio6(ueGybswxNf~^QVIYP0a*2_lA8~m4_br>s8xM-rc)VAaRhEePeUwLYBu`N%!m3zBN% -ANbnJ&mdq5nYMP{L4}mHLme(lCMsggTDy^v@T%T;*vs9PWwY@!<w~-z`_^yj(?fidL!{l{dN~6`Xy~@ -<k=6_C$b6o)NwS0||A$T*g>=72PCyuWB9$K}k=P(N&RB*4;#i6e{L>oJuv8pH|6T1Z*j3y2{RSR4`Qe -XaLZWrEo7@J>0;+Une6{RIHFe-=ZX5c-{#hr{n7Z9pZ1|od*K_?e0<UcOekn;2CQAZ&D*kP3XVmCN+x -GD1W<qSWQ@?5xcv-m<70Jz6|iWtMEzRcX3NR<NFj2OeLNbo+ns4!n3N>i~<j-k0ldKPccOzBVWoHmSE -Wo;}W7%sFUMCG~+dz2`o(@x(g%|Senq-6rzL*-)H!Qbs3OqLWMO@Ep}z4W<qFSv6{j?BN4J3VvNS|eF -k-KR>9dJG`mnkR-mR=47@0Cp@2vMi3;FYFu}cxdy0EjshPqlaD(1}8_R)0Nh~KGfKo{;msk$2l)^fNb -qebg)+wx0b>7SZkJwiVA_^i3A_^iQXeY}d=0b>t5DOs|(inId(I?i2(@ISQHCQUJRA7l1!B<R+5vZgL -9np8tJ_dNG5+kS}(MlD`1(li`QiCOmrbrZ1BYYoWjOZJa3L1yH2_eJy1Sm-LgytrdnmN=6h)M!S>M$i -Kh)@Clg(TmB6iy3phvLBvwSvU)DeFirNDV9rQUei6J4H9XD-wrFa3&OqP@Z6%3WFRPk=h!KhMEZt(+w -IcPC)aBa)>@b{fL~P@1TB6xg)D=H+4p8ZUgVV=WXt6e|DumyV4JLrFNHTw--rmWJ8NFU5UzK7rab}G7 -^(jo=dq~x0F^FYPX)ID^05|#5<6rs+&@zCQdhMI#Jb?W_3SUccoqUH$}80AsAJ~$t$s{LR4p6k=;scy -3)&=+x(f$jpnJjA**?FTf9zl(?8hU2q|lBbyva(AAdn6?0lA$I7AovpDUftb+HE&!Cx?b8|OGgj-}#r -v&qgZoGCkxsvEHd;Z87-Q<}~-X1OT+1UqV0OQ-q{hc=w^`HEmC2o#JrE%PKw?`pWzEdxJ%;!+z&yr;y -?6*R(X{aaSQp+FAUX^VD8k=Q<5=w7nAWzS4^<rXfeUVMarOn5<$CAr2B_<ge-1Zqvp&?N^E1T}(w4xX -}YF3)Hm#_+#KFwDGK=ZHxlRne=OKo25NTaNYQfw5fsE<60FH3BunfqW?f*+Jtz*DGr4>UkXW$E2qg+} -e~rXGS&ZmH%u6TXMkbUojk}jYt-Sbt3iorkK~Vv9)y`gzNaXtF(SH2;?RX!XBGjaL~>H`^oWaRSSLoZ -k-1Pja+jtebW&XbFG6wI+lJg6YZ8!dumXGYZPkjy>y!HYu1AGG;AzOHme#`wiX6<rWaLXI~t1Rgj)-* -mj}U`bGQ4M{3AgV71dP96H(Y?vwe9s+Wl9sM!+jWJ;gzP<qaTE%og`wGG>CNI_g~E?!8VPY&s#xrXJn -Cu(2y|$N$=eb{FFPS2Fwd(B*!<FcUin>Rs3Dy=Et>5p=D;0tc)bt=EeEHeJAW0^5zAtc7Rffk6=ZHvd -#(i$|r0#O)(K5Cwkz;dO4TnT{~z#tRWN9N6=aWFGUH9NOq#qZUlG`}SewATc`=-vD18g?1hU&7Q1$d+ -c<(5O?%-&j)7Lv8SZKH#@V<M1!kl%2U2M$XlxHq23C)pO#FgAK2QnUQ4FjI`aelVB;yx{(TUxGhZ=#? -I>_u%4}`6nb>0lKg@K?**tk6%PgCP%D3bOe!C|rX3Dd6Ia%%^+sybMU276;9R_~DEL!qxf94dcwHZ$_ -YrKdJ4$g?18Om^APod^yraHFxi1cl2SQHeq*%ya)OKqayauBj4H5@30$xW;^2izVH9Z%Z6|0gtgV0*G -T{kXf739YNLLD0=ace(ldNix9>2c{eJm5XwgTlfwK?bfN91>H!<79!`AW*G?BGM)#agN)^Y+JJ!Dc9r -)aaEWsJ!9X6k`EL*ezMFsTmfFe#Qwwgl<50s60<(j#Jm6i~ZuLA096@hKvi-=Y44JidTd6-ievDFVnc -E|HP+M)?4w(H|b%gn|Vq*+}azumHA{Rps0v<r#Ou1G2zb#kEYn;*y^Ss8a4cWNmR;9^VkNf9lec$fvX -2Kc)&-yl<{mr!}4_vz3@bRafD0H)YyUVEYI9)vE?$Rxz&?jIi?L*M&%5`9Ddv6ohtwvdQBwHf3D(&K7 -#~cLhkV$4`<Icn(2hQ&{-|p4fo$anKTQ=L7*ouPeAn4}%@F7py|73M9*Xt(`ge~6N9Jpr|&IGGQ*IVh -k&I}@OJ5am#xqaA8`85aK9N^LDcElbI>dCM*-3PgE?B##8@iVc@IEUSzi9wwQ_U!9Y)y?}2dBDq;Z>t -<tKPz6~59dL5bOQ&fCD8wU5J5NEeT{7ZfraZPj~g4ew5`HcCid~LMIK1UR@=)bIp`DEJ{x~{XKEC@Oq -^BY@V`O(ooS-r?mu>_ok~OMJl;I}TPv?o<rt`<z%#IIvoEL{NqkNSo$~=tU%rTMxkFXr4YR*x7+)sN@ -?iMln@o4(d-;F!-kUc~oA(pUy9xjHgm_D@<zAQBbw+P^T|Y$2w|ipqo2fpDE$L0?1-$|RnKF<6fLQkh -h-zv1xQypfa=pxom|mW^uHN#;`e0`^q4zSXRljS!yw>R*y~KW<=(5x~mK;S%p?!n1(B*X+J!nk)bbNX -CVLBbpK8$~=<`dXlMRzp!wgM98QTo>R{^NPSwO(m^(*Gyk?)|^;9~c+e_u>Nq9bkZ<R1EwVP)h>@6aW -AK2mnzTaZJeZR+|D00010D001Ze003}la4%nWWo~3|axY_OVRB?;bT4dSZf9e8a%pUAX=80~WMynFaC -z-qZBN`f7XF@JVO_LpE2XUMka=mfA1D`kQF#+kRsDp*On|6EGMj|<va9{?`<x_>?Zm?{Wv(u&AaY5Z< -Ky%4oX5^E>Bffphke-nxPQbB_IGxV&UV>{gX5h~Y=P{Cx53VDVs@M-*GU@9*iJT$SyHgW>_5qD7UBB# -_AX5(QJLjzGE3sLWE042dTQu?nv@Af{vLmiXW2Z?S$4%rhfc^J#bq&x=CPqR$<hLs`8><33n*qMSzh- -~@;EBvDZ9L{H1?;8a?&-w$5b~Zd%g39iSc*@6;AO@wmqA%Q<5#%X<Wql_jp=+vXiA{o?PC+&DX`7cj# -g4Fv`ENlVo<CC%5b^gM}q4Gj?)c-ehUxKSDK2F7qhAr>I@!am<SBs{8@N-n0Acj!mMJ<?%ErYV`<2$) -a@n&n(CI+iaR#-BZ_HI)yuAbs6Wkg^J<FqtEOhE?_D97^iU#Z%*zmXUPPE50Xio7BPzoHmAPgMn`Io3 -^{8IVS5?WSJ8dX;sp0;?(cD4pohs#p=N6|`V6^#9hGE1vN@-LZ(#I2n;{#y8oB8Vf%bIDlC)BLgV^H) -3gPGvz=~bQ?5>Ef?q)tTK$d;kKmX(S^Eul-`pUj+pPp_Xoqv4~SwtFlk-u6~aythErwm@@QCi-^a40z -3J>B^OBep;6AMBrhCF}S0&yRM`&e-1ZDcfcz+o$LIJD(4>Pua=m)05+~-A%^M;#h^4g6Rr!8{#Xdyv- -2FX<SChtf*c8iu4vRa5iN((f1f>p2P_d#Uhl*{C=ez&a(8n@)tvNK;N_EiltfUvmbc^>;Qee>_UsquM -f~qHhmTf2u10)8B%bD;d{vyRPW8QEce-mtSCwJa2sQ}6oS7M0T+yYK10u<AGUk+`y)wZ!-L{a$NQtVr -+`d)eHUHFg!Onvm39;5(S&ex7|rJi+&+&kXYo6a2Ap0@aQmXnF0vd2ad8{X*}vFpPlloYxVGgyXAGY5 -71X#JsS%_m@SoC1jU+YFe_UIvCaA3uTM~_aZ=r=~1GFL92yN_(kfRAS>9ZkZX!sCvh!LsT;+_cU62n3 -a3o$IjumOe*Fl+$z1E?Qh=pbBZO;}sQh8Qx$OarJJ;u=E)W@SUVMi@y=bv{HNHK-qs&_Ax!47kSzuws -Zy>V^t2f+Zt?b67Qk_=x(TX0+IvA)Fe+k}<@`5FbN)3`@qCc?|VqI5{5sl5;eHhEQ`1=fDkzT0W@MjN -lX>;&OxraRG4waRG4waRG4waWO!HoPeBwoP?Z&oRpQCG1N$iONdK~0mLMRNDPs5jv)bt1Q-%PbpY7_v -H?^FkPC*Dnh0tFhzAhgg7_B1k$j2dOC(<+`4Y*ONWMh!C6X_Ze2L^MERmW^gjkYBT*62O3z(o=Fczw@ -jG~YHN7i69gTsuG3^_xEASyKzsDbZHkSHaORN`FFFf_!9Atnql0pigh8_;i34^<8PrceX8G4c^kFu;$ -&F$M=184QOQmERU&3d0c(wng%|k9e`5Rue-_Kw>n6W`a0k#0d02HVX)f5FgMreup$28jua>0$aRNbH% -+kp7$e31)}ysNH2u+j0ow;RAiCRssu#L<1M3}irF5ZAFnO*pegOP)CYB4K2+wg#_Jb%Q1b)v1{HGH6g -3qz6+0C@6*_Uu7FnQZui~e%ras~<;;DydPml#&vI`o%BpxMVBcdacBRCWJ5eZhrH>}8#2nL(!Bn@Bq< -%M5f_{HRx7ka2Uw&u~F+2Vy2zuZQXo%<Y*+sWjGWL`*SjU@B;SLiQ5b3gk8N3>9J#NWzNie&ab9FD@5 -P0S0w{FR#+g8V8K?oo-aQsLFQ8#YJ>=hU@DEJyW4Oh+XVHlL9Y+fkhn<59_w;Z%QAv<+2wCRZq`sA{X -i<5oqHUFxWcb-*hM@fLANRm~NTXfAP4iC2|8kuQ}!5ipfLkuYnBnEdbXP4(#s#bk^2Ve~NyQ3R1S(F7 -4TQ3a7U(M8yB4Y59P5UmCj%z>y#%OlpRc!L<62#J;k;*_xA5t@<sg_yqjG^oFcA$}PQUijsOUw*0m%a -hmcUtk0DEFO|J*dhI0O8pILgOyns%~%ot`z}r=aq$ir;{QPZRgxDaz#+|h<KgCDz=ggqxZE-Y<Yo|z# -&kcAaofCA{qRkJc+mYczK+V|du)sFP0l&SpWYQk5~T-GdR^N~^vC^R$pMTQ=k;&dG@x+VaP#2RFm-So -QYnzm0kRq9va+@T>n!)pL;8HhqqV?g!(t0$6Or{;pd-2{bc-^D`gL0%R*%7=8CJ4DJS7XJ);c4?H<73 -E#M}Gz{3~X`6&tVbvpJ(QyshCY3^1>ZMAzL%7L&AMply1z1>$iQD1^&i40IOMnW&ESRbw~${k*8Cn^) -`PgMJN2M^B9djS5E$9<IX`a3C8l=1sIk)1zuZG}f$W!O|EgjHy|4G|XBM&DBasTrmr-YE*ewXMr1uKa -~ZI{O(alfy7+MT-VCfXQ8_4h0l#F)b450*SJ^*4tO(X-%pi$-o{DeLfN$r3uJ47Y|yU|$=iACY81`Yx -)@1xVqjKe(8fSo5#nuhyj5p(SkT9TUjORAYECe({~A8%MuPjAB~)HSV};X#hmS|DOuG72#)FoJG#}J> -Ff4eC_f89JzlEh;?T^$Hx(*EmYsi9ZR{`a}Fj!9`QM7eot`qCpshSZ`tREQB*Xx2t<GPS&bE2yB8g=S -l#e<@qeW3+ExiZ-ZRMAiwx3RCX@KZ5Zuv68M?&3hz9&h7f?o*vlEKlMC(R!<~Su54MLN$rLdO9a6%mr --<b?j9gJg8s|7U=vcB-k~<ecr}E8t3(yXU1Jv=5{mU&X7?HeL=NS_EmK(P*kNlHFb;L88`kFe#?m(Te -5Qq>)?jMI$xgXh;)Z^2Xf!E%X)g(wkR}eMCzTXS(zOR`kvbXvm;={Ky{kCWNFRGTWl!X)NpB9zzs`Gi -)2s2%!DTl{MExWBGlg4#)0rnJa{%?nejD4=E7kc1N(`<oY7X%M`D`=Y0c=uo2|rJT!XgDM1uWslgfgM -l57?AvfzU5;;SkP`njZA>$>^_M-;3WxQnHmcO4y5jn`kBO`LT>ZijijPb?;#NMnXN2HoW8kT*CmtGtW -MMcy|^6b2G`iv~Ljrh>rN(J-=LW6c~QI|{l?;VHJU*-%$Mx9n2*(=K{$4%EKe+lf9pJiGc`u;RWe#H| -J0dUrv_j86BrCt6n4-fCYJGWulFX2D*l>@0Mxaj7vF$xfn*ir$@?bL%M$B<hkeGh^eR%MILSWfcR3^u --_18WwbYc3-*G@Y(`(yT3Y{VO281=rwR)GoCx=E+?9`(Ow_Trvsf2v$Pb*tF>`)Ep%6FZe6vt&|QyAg -Jn;F<|1|9)3bCp_a-NGBVyn{uZcF>s2LU~uyMik%}iJ~+I=-b;Xtp5N|g<58~+Xq`j~SgvOl<qfqoM0 -a-!*gxqC7b-P<Rc^V|H_?d{<}p<P%1vMjV~W7o@-s!`9hcotXmEd@_GtQc_LUK<}azGWmAE4$5olm#Z -=*?p!xdhKvzL0EHkty^e;n$hMQR}O4?X)WlIMpyhnR+hfK{w=4~4h|l+U~w*l&&>zV?gG~(G8f_W{@U -k4#lukY`cEXQ9LBS=8wKu&m_6R=o7<iR=JrY1;Hry$Kr0J=-haaa-m`)mecc$?3HJJ{pF4bujvfx&ad -(?vDR|>~pR#0>t8XOy*JJEe@0(h$-mwL5_R?2CUd`#P=_!5T0bOOD{0aH)w;d|M@_wF7qS?hfD-!ym# -6|W01wfi_j)(Luj7sWT9M3P}^qO9WznH~k8Rrn$i)KaaEAxuDyhx+l7&m^a-%|dqx~E=MM*pkEgjc@z -KhOJ8zY3_nO~2INg|7}i2ajRgH2YD!B@37MeNerj^k}yiz0mX=yxu=Memfe4<G0}wpAYq06H6U_@C}R -S;I-k*61Vp+Z%2c{QjZsX9rHOjTif;sKf~}*e!9Na{#^VFm%#Y{P)h>@6aWAK2mnzTaZLWZuPJH?005 -9N001Qb003}la4%nWWo~3|axY_OVRB?;bT4dSZf9q5Wo2t^Z)9a`E^vA6T5WIJI1>J@UoqHX(H2m%B4 -x*Riu;gelWwqS5+o^#ehL(uNrWnrPm-JZ4)@>hq2Bl+$#ohn?gfp&NG3VY%sew3(uQ8V=>DU3hwqP1> -E!s}@bvPK-kqEs{7F4?UpO!5>R!-U8s3F*5Ya)h5EN$gA^ArbMFBoPJgnky9^^?%^C%Q?PIJuJaca@y -ILt#x{w}_XC|Qb>l3U6<FfspB<k>t}3Jo?);tU_tWs(*j08HmeTK3OV5#(Y)H|qkittv<*)^ZJ1_c^^ -fcuj0Jn*yS9`VQ?!5naf+8C{4>q+i9N^yDCk^EA9!!Od6M>pk=keF)MobRI@`Y4|{I2o~m)Cv?8f?~} -OlA5=x*O&X+Y$=Yoy1ZBx>{s_a~(mGkuJcub3i!dwUK}1eLy!b6iA^(sp!rQg%TEz>vBdyLw`jFKezC -Zm)CnAHT^j^dwg*WG`n<$(^_#~W*I1?0Pw3L0>y<+M}8gf|~LPrVU3wGa<2r({oe-&wl9^yN!)>a|9g -jl}{a%n%Jxs-yhVf30JL?f*wcRDFho-Qbi3)p*bj|Tw4(MO~e-3VG`;&v6eK)_u3bbR&4*~cr|KmAOf -_Af5>Pp>||#au9rQN*uA3Lln8!3DvqG>G#x3<to6!;6DIAhG}M_~iKNv$X!``0DiV@{*3uE@+?5_b;x -F4?dpkU(or-i}SO~!yTeaA!>>xnO!6|6yE~!Apw&Mkq2Rvm9BqAcrzFnE$BY@DiG$m2$4|~V2Lc(Pl{ -ob#CL_i5K)A_rSO*GBzNgC4Us#@zE*UBqT=f!>E}BxjTt5d@s|i8xP<socnj#GC`nS6-X&Qsr+(Ontj -8Ji-Z0-|L?18F)AvV*r@wDmR9-j$=Hu~RxvY|i=J!Dw%#l1<nFy<F6-3dR7KzBDgCxEoZ)C#AG|R=ey -g(QM0ih0qJMr6v$X97xbo+ahtsicH`)aw0=lLoqQ?!6?Aa6uLDmZ&g(nTT2_sGLao=N)-YLl?em&*_{ -uY#LM>^UbuiznC8<m)`ShO9`hAA%+Qjb1tM%H6JwI-iL^x%UK^?j~WFgz??yGzr5c40pF{{V;xM4NbY -rJP&Q;(oD7~o|((oF76m(c%DvhpJ0q*KE|1pE1ep74ozn0l49tZVrW-RAEC`4g1#BXJv4~+Su?JznLx -wD1B`48P`J-_(WFMe?LrNgeXwSNHpSR3`YVcer8Uw(eB6}{!{aHYN@rw~FtE;(7IyO^VJ5=_d^!xwtj -Zf7#?8F#b7e9zoC-S9Z!|#zKf9pX2UjDs37#jF*tmpXo}|5mx$ztnAWUbnYC#0uBPlL(M}Ec_QjY*lB -lJlaA1X#NN@)J9fSDswKKvWWoRDysE*%`9Z!DuG6F`bjihwf?Xqke@Gva_}B{vIL!!eC8%z-R(Lrx{B -RZhd5%c*EgLI7G?Pq_Q?J}O`YtRZO_(3$LlCX(W4Txyh-$!Co1qD>^6R0kM7X(+z+oY#)?7{&}eKMT^ -&g7p7ikWe{>E=cv1p9N{4f`k({zR^YXc?n;(k{pNHO#FQ%;<?E7V1f55`ftM&hq^K2`q*r`!>41W#<2 -=V+61;U@w{R<6&Te;<)63X`Qw=!j>R2LYB+c6Gce3X(_fwUI3j;J3F5obR9PuK_j%Va07yJszICzc?l -q%c)p+s0>~Z`GiEF5QE8UF+N~hQS=hjoHM%myuN}Q)?>$1)93LRY>c-j-UdX!y_1<&As8<_1&&R~}A` -oES314O~I^tSu-v6_{F1GcpVY?B2gYCTYEVm%f$09{dd%GJt5`!la{#53Z=8!LubjlO}b=cLX-J5#us -2ZLC^D;DY~=sG>Oj=pC^YZwbWOOMi`#ynTm18zsb&aWS?NZj=d&)e0CyZTBTjsqRptU`6Q(lysCaJ3r -k>xmqgvDfq5H^#Wp!>cw#MS3=gPuJQJg-tb4@uO!YtE1p|pgt=T^}X60W3FD0d9?tBIv?0IuPYCf{`z -z8`JjuJABaMCCMpXytc539P}W}igrL_XorBt0UPukI8qJ!h*PgE2)T^@Z4qcUX0(GD5sQ9k013cRTyC -Rv^aBXa3Mbh_%A6|`mr1i`*vycB}9N2qtZ4GO*b8Y|Tm7~MvfnNFjM*m-*2kPX#X*KfdILb8+de2Bdx -Hs~KiMsOp2AJ>ahhkP-L!Z)^tFH_5yrQB|de0QV02XxBgL=LBjZWTh!Zl`w<iHG`u21cnbz?ffvn^1U -ulcO%f?}k+SW}IvOjIB16j6z4-#u+kV?q60+~j~6oGW49HSHNH4{D~l<&bHC8KLsYsY$6j)VDb1dM#1 -=8)oG~J-OyzkG#rI-hk9FytKfMLYsY^|MG4`LG8z8+!a9WBx}HWIMCV9VOYz8o=p6~Fg_cAYYZq7eb= -mrwL^A}I6C`!u~L)TFf9x8^Pjo*buA<l%u$oOleSB1i$rxwSB|tr&46lE*`$UUW-DI$+%Uq}{)xpF== ->4JUJG7jhaQc77Mz-SZq*t+jJofg`$AVe=x4tp54e$uwa)fF)GjAOtp)vL*v|e<;>_lNHFPmo&ka3<E -e_Q00cI5Hd-tlWpIQ}(TbkM~n90;ZqWP8Udj~GZ_Se>1=Oph;bSshkX3>~yP~G+O%W%J?@g~FCWxdS? -v-&z}q6wukfoq>TqF_^Gp96F|bcQ;1XI8<flZpx6%7abbx6R(bL6?X9^`IVc6nVPu{UCPLXsyQfvSHh -B(7*e1?-2$EI_4(Ed)GpHz1!N_R#_HwN5QN^eV4|89pU<a|CVc6U~d_AiS4G+`2B#lKsIMV1Mr-ycX$ -3Cc`bnL1lq}_t%dI|Bc+TrPmZmjE0|kzusH(Vjym1()mI1a72cA>&2Bs~57hcFD$@6~Y#O!dfn9yRe+ -`$)n=~`)Nq4$sL0>BM?HvCVUwQuL0bV=RtEI)e3H5sk|8$66wqEUexkr7kp}JCFDc?0-$d?|_m8ao12 -$-)t6w~tcGMop|^)ksq`KrWq@s2&_dONeJd<&zP^+kx~wTSQJE9BRa$a9fm%25zy!mX{#M1CCy4*~<f -9ABQjnNG*EH<MqA@d!Fs!JQm?Ss3xsb^hfzpUU^vw)3|4CAa^)yD)8$JZ5jCeVZKqH&9Ch1QY-O00;n -48F5UHW~~^#2><|5EC2u|0001RX>c!Jc4cm4Z*nhVXkl_>WppoWVQyz=Wnyw=cWrNEWo#~RdDU85Pvb -}ye)q39n$`$fax<=S5)xXYRiHyRT5bv;)K8H~3b5MP8QW<(JDUH#-?8Jke9H~?VJTH?SDiZNJJ%{BfA -~=UN5_M&XP0z-b~3oU8PM_h)yco9f%b#(fo`7_U4`zG>pLEu1QSJWL>Iw-T+egp&Ub&RFv86E*$E>R( -?rE;90wtdL3&_h9L{_<c0u+<{Zw8sRUrkB6xXl@{qpa|eF=QX@?+;|hKcJSjNQPGXdEghRug)dCp@am -olt?{bPndvG3}pxBxzY~u&5<JpuXqPkZB_tsz`-D)g;A!0^y<iFoQ<>(Z{0%-GvkWpljEA3f&j_L{p% -mIH2o!{2cfR#m(~^-SGmR50)AxHdzn^(X-?G&NH0`;e(2*bhQ7kj|=m`;GX*sI^mpc{}?JoQScbQLd( -xI4`wuWd<xaXjZ&<zV@!@e`6CFi{w0{Wk8>WH`4iZNO%SW_CCXgz_41C+RRp!^tMXL{2-mX*&mCj&xj -R;Vq{xYA%45-UZuV0Ka<c#eJ;2^!|9mFpVxDDlaA1VwfyksSIGWIx_MMpVBN(Q<@FPIa$%AXdY~?|%3 -35#*<oXHQXE+i!U<gHD5uEg(Xcno*nP-9nXzBj!_S@CnE%h(I(|vz9>|fq~{|s8V4YLS_l#}~1^;|H9 -R-xm^a{vc}i^1^Z8&>p>&(6<ozcc#Nv)jwT%?+Ji4XIDp{o(D|$=!K>NY{76>#Li=0sO2~W@0vGospL -&egw;x0G31wIj$F_s(*)jBLMU!^z8gpaPwFp=O*MJN~ZIzeCP%KQ=%`H<Ocmr?j!j@Y|?A!B6bkU74L -#e?q3rbG(Iq?EkNY>KRmeL2Fp*~N3cHif*>^MIEZ2<z35}DC55m)3EL7xcQ+Vm`lG?+mkmqP2Lp^{yM -2`AXpoj5XN=&9(m<F+GspAhGzpMjP>|Fw#0>`whgqzC#R-QNIKb7e^Q8V5s(2Rq$*_Gy(fs8BeD|j_e -;m)8G(;2DOO_8RF)D2K8ibQ%p*$iB>D*&{_pUz)UZYO}KoQvf(+pBLBbCR+B?F9-GM&2MbL%{K>d3f1 -yW|xkMBH$6do{Wmei;l$7yWDcllBeFn49%h?L84ZVr{{uzB3!aY;5x_o!LlcBhAfvGaEZaL!F*UJz>% -zu3ZcF5?3BOM8|WdYYHLIc^v%^YkE+qn<~|^3_1jf1dDD5)3|mHO<_rNu;{k16y36MZ8xH6FVM6h@vs -FJEE%j?ERosrGsZz9EJ*G#Eyg>zhqtKJOW1UPrqh8Wi!%<xAZsx@T)V6!E7ird4L03IG>4WUBw_$cNC -1}>-$PQ1*<zX1K|e(2`<^Kw4oQm+dI5SUY)HXIVwg~&1-UI&1NSz14-5t4WMZ}!GXXP!s{}Jx(;%Bo2 -T2m9#H6rz0t+OMV-bi2kRkXn#vKB>tROQvGz|fmf)^)?pf$&$#H4LuA>i8Fc^-^ywiIY=7_tr3ARGu- -UktR^xjYFX8xm|t!eRn5vcVLcI#3Hjq|HKs8gz!Vc@cVxi69vUlwc;|Rtet-z?ATh<ayXfw)h!L;7*B -9Fo@W%U;u~&TM)5>SQ4BHD-+ZsVkAJo1}7fJGl3Rr8^mD?LlG=ZY#_nRpaRD$j7Wse(Lx-XBFP%Tw(5 -0~XfQr<WxC)Rl+_!Yi-H(iMx_3lDSxb@BQUUj$M~ZgqGYy()aQELgO+8r@_D32tFZW>-RlaT4;7~Msp -QW(u)2pl?W-r0Rcvbo3QSv~{k!pPa6BB`kIws-Uq=^LUk2w%`Lj&BrpemTbR7DlBSO&O0o!C2>4Qk7` -I?f*q=`k7%d54RV@ji5()uPB%@7MnIcICx#1g1JQheGOfn7vkC)()<#0Chg-4LW~<wCHLSyvXUTeU$I -iP*&kvfu$*_d+IFn5#72!3%QvE0@2yNLjXlFlB?xDw>_+AP@2cfu#*JNqYB4WLsD|0^JKzlTwXDxhaC -CdXUZu%^z=wgT_dd8=w$oX8ei`^hjvV#vJX2UXZ0|%nO`hEo+`goRdqGYhq%FK&)(5;nynsCIzKz+j3 -1@*LKPUy)AMfuSnapwQ(S{YM^@~+jc~KHm-_;qIK3F5DTxDqaahaAsfpGsxsFisLu(x#FL`4&HtSjiX -PXkpV#BODz2=F8|K0){e@<O3{$=*6ucnTASfqMEdp7RR~)O$1fhFj-A=dxf^rVjRitz-55I*Cas=D#& -aw%Cj>TSDJ;SAM1hQBYSIH}$pz>B52UZ~tYz;+z6sT0B>dBxf_SVEfIR~<R(AF^IhhEJKqQ(oG;90vb -6nBWKB1XCHtv)MPn^CraEZ97I7EA5r0!<+f^omp$4{N-TFB2set68NYjny*NHzV89tNXD2+<fSN9|T1 -!G#zRi7;J~2_Kl@lX>*V3uYJYWzwCW8dGXA{LYK1M8c7`F5x1)8i1ZgwQMJLg%~&O|+KMk_nip1Qz#0 -U0qr7HxX+8=)4t7RRUy(Ak^lYdXv6UC<SQwU8af%)&?*Mr;=$MT9oqsDEl>f<5l+jd~3pS|kNxI2&qg -E|q)ahCmkNLk!iXJg^ZadjPm`#zd%gi${Kaiysd3z*Ur87t!iefd&D$;u)$d8y+SFT>V+#BC~T3;ov= -~PfK;@g^0uKVSkx-7dk7mB8_%yQzCH(g76S{^j@S1)Pmhd(_AswwpzHds%zDk3VUH2uVs*MTgo_5U|6 -wzloVX9F)3rL8(_z88YB4WwBNCSm5eQbACz!<Kfh6IVTv8g}Jd+eRwrFI&|;uv*;LdZD^>4T9?Kv%}6 -*m0sSN%4wcI8F_`@B>T6p!Ny+LeN$^dP!1`*tmGN0*`TiWHNPEffj}0P<_Pk7P(bj`HYjGJzR9kLgI$ -li4Ut&fDXUveZmsvXK@~x^wdA(RMk{gfZeA$HK~Z{*7jlSoX`8dHN7|5$o2&HxJ5&9>kk{=>F1$N}{| -^ST$UrOyi>F}AET>L!WO2}ZvkKLkxLtN^m<v^<wDZ9>@)}jBBFNe5hvAxvq@PsvtZdqwH`<-wq{7w=> -ITavruuVYddHtn+`B%1pY=^Wgz7c@lHyPL+aTKGZ_q|@Fbcwn3P&%_bnl27zvkkPLH4HnMc;(KeE@kJ -y1%fZ^5H{58PBKg*zrcwAaePmiBZU(q=DQz=ymynjD+fkQqz(0pZHtNk*DHVg&;X~yhxcD!brs<-+57 -(`0Z8uMD4ePBKuAavwNwEd#3S^@n29&0|XQR000O8Q5kVe!@*U6)d~OrFfjlCDF6TfaA|NaUv_0~WN& -gWV`yP=WMy<OY+-I^XmxI9VRC6<Zf$R5Wo#~RdF@(VZ`(Q&eb=uT+~T4w;O3H)KU3^Onwzx2rb&>bDE -bsAHj@Zfk-U=J)VtXKzK515k`nDWw_fZnur*Xm;&6E8%$X4#=+!I#Kl*U=@#Kt7PY#dHu8!!#>G|PbX -^rix;1yjzNIK8s`#6mfI?QI0;(|VBe~*(S!u8|hB8{g}ndLN1VwsjSh0R`|r=Fy78Dr+}^1Dp3xy&iM -qtfFO_GhvzrqNtlZsRO1aGB4ue02fGbdlxN{b??vQqJghx$@XuD$13w`4US#l=SBCE%C`@3>RMWJvvA -dx>U9WUCKh{-{q`|<S<LiJic8Z%s0i`ecU1X9OZw|MV#E{@guz>AS|iO=wewuWN95gs7m77Jj$1fwYy -wODzdxs3BcadGF#9zN-3AKxTxHNh?1go_FI-?{$n<a@0RM;BAp=|g}RjaW1%_xc=m-(WdWr0QKm9SG# -888B%WgOX*`u_At@?ouI?2NhN)u(<f;Zj#~IwO*nLkj#<*JhyUYvRA+g8xYPH86A=huBQsGB7=W60xf -L>C9Y~*_8o|gg>>5SrZ<@N#G;{*;7=o4f`w~`ixyjvtacz`W^J-PmL{^gnu&c4ytgUic<v+Hl~VGE`) -iu_fc;>S58I3q-rM`^hPa5(sUbb0s*GY&qSoSs~NQ|OORuFsCHuITvuk`CzN;PU$9@XP7JC0%^Eyg0u -)+9SG>Qd6wR^pV_9d<U108JL{OGK!O;3jG_>TL54(qlf6bM4G2EhN37!iOiQT%3+eF_p5j@#Sr?Q;yX -&SvPVyO4DCRDo$SJk$!`y$pYHW&z+n`ne<Vo36{a7@cW`~2WLe&$4_Q$v)6WN(%LM1_9S<2N`f`Ok>; -BQv+3#C6l~(~Ai@{*ODyuA^=|hx9Q;4Uigs><UQIafamdQc|Nb(1CqXeU5R>~jc%0nL>km@+Pm%m-ga -*?O2+u=SH%g0;zeKTLA({d425?#4&T;9qRso?A>%V(>JVxJf)d7|(gYDlQ_`8<Z@b#$A^{ooYdQgQQX -k={pGI#q_(*?Eovg(dxk-UNuPx82eAo)dw1_5wHlL%HF~P1yUHL%9*kjp%K6talSuXh@8E)MwCPAKw5 -P3Y_D*KfyW1LVPQ`aEN;x->?f|*B|u)>f`1JH~Y#!9U~ay=wsp#hC_U-=+|JW5D-@6FcfgcF`3{{;G5 -&V01^TMfpb!0%0|tBa~cDIz{OA*D?`Pz3JDH4CJk{tRL<2T?nl4}lO7*392|$h5#s3M7~mM<7~vS>fZ -Ygo2$zpwH-g=$4+kR{j$k-~;RuE!7>;2$hT#~7V;GL%a16UK?8dMg!)^?_34?<P3@0$0z;FV?2@EGNo -FFXad;;Uiq$e1|fiM`zWPs10QZ@hwBQ-e0F~Tv%fot#~RLmezfH1*f%%MeaAwaSK;Q|~95F7|a*Z>D0 -3&k|T5Fl0vOcI!+GSgS*m?+ekA{VwH76~~VKr{mR7fKuh7$|{&JOa4_!V%DgP+|hnG*pw7Eyf@`0Z|1 -sR%yayFe>^A0Sw1#5a|Tl0;?0?(^y@Dm$6bIY(PAL*g!zK0%{bHCAtR&V5l6a5THf@ISVE0P=$&~LS6 -HwN`kjR@D!&UHvjJ?|IuzD{-?XipX?&Ki3IH~qDoP95>+)j=qAH0x`}E6yXhuj)lF0#|J%BWY82gW(y -zP8pzbCLji|dxXmu0SD6l$+th$NnEF)hx>A$#}V6%%KQ;FWH;CD_|Vn12Pzb#}smBl_p#(u^9yEw;wY -QTj(HtFw;!r|DAb0+$h!C+4eMW}{ziBWs1`p5Rh<4Io)r}7?~By4$Y3%17?oBSFyt?o2R?<=^f%duX# -@xz}P4}3R;=Z>h|@zr_tQRjgf^iAg0wQ-@o+3E}uV7)*85ja)|_!<P<K@eI9#BLDq3W1+{vo?3`Yf4# --){7u~CT{!VAP~-XH#b$jM9o2U?M2XDr5*QL4t#px^@_q$h2|h!$HBG;Ivlix+eK#1SdA>uer?a2val -6`uvS^MCb#(4=e*`%jS}0dJcGcE*j7Jx>O^PaMYXUA%bHqfcL&}Y)7Px7mls##MkV?+;j52ls&SJN#U -=#yYIZjeP6onScA>4r?GZeqL?4E(N~&rUKi>~51SZOMzN@%-&-5Z)3mXt@(x0a%@*eL**{uarkIbqC_ -H)mLEfDB@n;uk!!J9yLfuLK7qRC2Cb#?~A`mw&tEcoIV&NIO1(yj%kD{o$96S}~xZQ{1OvQ{FuaA^d) -t%XW;+*;q93u|1|->g2{#dE=|V^(F>lS%jA&|0^0wKfYcelm4yK{U+pMuoiYMBKu#%Uzn$fnmC;1(Sc -#bCsyBc9jKJ@nNs6344EL_rzW3pt@nQps#fIVND&fx(~P;qTTdF-wwrS-dx$y?_{^$WI;cP+N<kt(+z -Y^G$UIf;GQ!Jfv~b|o)D%QxwUS!FX2sBUdzD?m1yEI)fP56XIAW99hj-2al@JihiNq0jlobqT(xIi2d -q)PHny?xE`p!dfvE-4?ac2Yy<X_7EOv^(bbeEFVe|aa{aI^7BQTGiT_G@u)H*O6h{nRjWa+^CJ;0TzJ -Fz=`C1sm^Tk))!%B)GojdmLd2co+gx5mQOh;|ql{jo+7dR2q1;=;yaA?U8itpB+a%oYgj9P`$dtH%1# -CR(enW8Y+`g+TBAP3?tEv~GUvIxzjx%YmD$E+aN4foS41I=5Fd?L$}yyjiey;C3TFA2kAQJq7h|0iy$ -hzzv5r%LO(_n_)XFS45pG7=Oa?-mXTsC+bnFD;plVYjq1tp9kFOetHLNRB1Q}ovBV1y5;KX!0^Lb<8> -{x5!k$M%7UjBTn@VJ%*9Y=K?_Ik1nnKU*^Rl>87x2Fm4y>^n*);tv%0B?It$&NXyWv9U`s17eoYnFPh -#dwHA!tku-P|NAe{BwmeS!MbU4s}yOZ4A$%d}%dwdu?9Ua)ak9IAD-YmF}x4>5e>pQd^SW^oIYP*rK& -YE3rws<<bA2-3Q+Y{SLwDZ$$a;<9QO{#3Q87;V3us9Gsw;yopnp+s!&qj;H?LVGpBkv#(4gy!B?Oj4$ -OkI}Uvhk~s83%gMtpOLu+G;cpDLYPKO?3NqJFS7R4BIMebKvU0N@H8|>pIfLYGj^Og@Zu%LSbEbbii8 -wx7(WM*{Gw}e<Sf%om)ai*n!J(cR%PNa8Wr~aJg=$i+4tw{eiC*w%Z@HipkxF*!*|F+h@D@)z&4=#n8 -=!jVAEz0o#gurWX8Cakc4g`y2$mXF~gd>POIo&`yo}cVl<Gu2uqHtjsy<%6csVdj;R0MSb^zHhdd_?R -qVOZd6?@ZWNOHr15jG5y85j63jWXv*F&~)n71t?Spx*HfEu%1H(yM-j;*6LH%ZD^L~PUH{l-v(QEaF> -P?y5Wa`bVo5yJWdY?AG3EETB=IW*2nR*2RbILsafoa_rAXcX3avo2k<Yt}~v3hypX7$25?AhL=uind8 -S^Xj9{6?nt>V58;M3$w@VRD@>WKY8^WO<WDj}rHPIk`H2Hy#fr@5C>w@dQgQqI)&=y20_f7yL5_zP8> -(dp7*dude-9gb#?b?5TLCa6U)CzW`860|XQR000O8Q5kVeA`j9(@(KU|8Y}<+Bme*aaA|NaUv_0~WN& -gWV`yP=WMy<OY+-I^bZB8|ZEs{{Y%Xwl#aeA|qev3|&aY_g=roDMc<IKm<BaY@CY#Jgmp3IDt>#li>` -sCfgAee`_)hoV?<t_^YK#*nbJ`n(fqtoa>Z$7LBE!3P{r|+L<IkrT;_US3_~PbRd^)>4`iIys_MP`m+ -&*b>na7WD8YSW=n`sdj;yn9ToFoyR=ksM6Popx+#Waa^T8b&g3_LUSG>yv`Gk??HbdoJ}F0uzv_Q=He -3tbk|XrY<dI7<sW=8G(^9w1m;WqI8`&2?1jnYdq764zBlImueApz5g<J4d@hPA2;h(K~z~4wFP&)7U~ ->>q6(>^sKhzC`-#czF)%3onrR@Ekc|}`Jdt{P9F1kE<Ok#EJc}#t5x}wrH%cdDv9s&C|?n454qN&$R5 -h?0QOO=vZa_tsmS##E^6^0q7+d&`!&lkf1b_ahZQv~(;3Vm)TPenh2ik?#TRj=3m_Grb*gh%bG5ur;w -dJd#Z#RYT116dP+Re2nK~gLHw_SRl0kgM?nj|x^poyyIxo;7)Ib_-jYMC-*E>;3_~Fe3P22_Ol}O-?+ -{_&GQeZ8ei8!sqK7o7OKp+hLj<6E<S}Y6wuuObNz*zCe>Fw{AUv9<W#aHpi;q~?5#qHOR7z?J+3;)%U -;`st0I1{ickJ54l;1F<re0}sgW*mMxJv+VqO6X5cZ!eB-Zp6vuwKx=4hu62KM_<kkuf^4u>#NI~<AD% -2S{sUq%s!G^iXR|yo`K1kE~7XpYSX{My#)X!Gw~FC({S@t$A~BqVTmkOukvA%rH_@pm|_Y2DB=f^W~D -E_=P_aj(YNMZNU{F)5%kl6FZLt`Md_ajTyTTwC-DPBpCnn9`{Gkplr;4G5OV`1W$;0UffVA)4O%w+6U -P_7ZJAWwc@V7j_73W0l_g^O6y?zr!Bf<Muq>8QlB~om(*+qQ^bf=h1q_8*sehD}gdrrr)p7Kwf4$b_G -Eb}K@IVx+`90+BESBlCTt;<>R-#*x_qrk#oPE#oSv64|hyW{j;x)PJAxo0%dyG-JE|y7IIT})8L>RIU -di9h7`618d@M;pzV|pwi#Gw{D@_ctdqK=GpNEwR-iMx&N6Mf*_p5Ba9K;5_5WsVh&e(`s)<AEH1yK~r -kF9bXnyh2R>Nn#|43H_frNsJ;f%HQtXEGDec$bIF@V1#pwGr%*o4RP+_S^8o^_vqiJ{(YPiA90LRR$_ -*MC->33kLF3>3tYtnQzgVoh?+>8xS!Dda3h+%8jTnYeKA%zF<jC;v`Z342+_VTeFaofj-du90?Zljqg -_>EMu8_LBMiYKG>b9NkTC(B@WO<qVK@+}U^6#kpn;tVc4E=u#BdlRV5kBr1w;yn6i_HhZ5XSF6Wl9|S -IYO4f;<HiCWHaH_vslE6(%Z7R5Tb9LnsL`DTI;`V?rnh_aGn~0SqQq0{~o62f&XhoN$F80VfMgKpKK} -C>mni9{Tpiz9)ugAd4vehPVQvs0LvIkvqgdfp#KOks|bsNFbQQ5`X~Gghok7&@n;>*-it&i5Sv}K1pb -ZZW;%{BV0!z1b_&HJsQzT<|xvJbBH!@AVShc+<+6bsUdiPPzAJVNC+s(K$IBL6<UcPLbV40#EBq{xQ= -j+Ngz3w#*jebU_@jPQDhq?j_8WXV~SO}LNG#GfeQt`6a*`fX;zQ7OKImEbyZ?g4N9J@#MV;ie=c=8)x -`l!4E~1phd4)S-II#<P1Il%?vHFg;&{jgj0d3{kEt7(u@rnN{gZ<L5klRmenj@g?#D+2gJ2j!_$^ZDS -(HB3NGb6l9R0940vz?#{_-Pe+iaf~v|Y8R`dKxtvbn3DRC5N^2<pQM;8R{g5H?e5VXC_Gf_7?+!Dy8g -9#v_SReR9<25ht>1Qzo8p`62vRIJYn8;wERXzZ4a_OR8x5rJX|q=UxQ&9ADt^Xw$q4v`f}vLRKr_p+l -uupESb7m4c8sTvbyE4C7#m`2%h&Y71?XZP^9KG(vqb*I(O{ZeD_EU2(WVZ3i6l<PKe)0$xQbt6$Ra%C -e%HR4U1XRKF^)UMBEJ9Yh#hJ$qkCf=oEaj-1{&OGOTqZe#s8Ob60wGk1t_ZFFFI1d;CgTo*RH?XkAf$ -MF)w2VKx@erCw44F>jGK-*Je~sHSONQqk)56yV52}y}@%q@cIVx;5+2@WI6w}QoyXkd3E1P@Im20BG0 -+mecdPWLtKImpe*^uk{-K<U%rR{3ut8Sh5O<B2#L?g}JK8zNNz!+l_kgC1Fwe@?we=V}LV3JAbn++vs -?F}1B4KDL6n^w<oZD>=>E3((~E-o)*nhgJZE%I#4y<@f`PqousvNmO*Zp=FQfM*7qWVvvAZTAHeAchC -K3hi#8p26TmqD}EUN7+aSI#{Ym3>hdlE3e1mIxEiJsC>IOTeFN~-L{aMAbp$6`L6t&<!c;R<}I0)>9D -2L(rgaT47OXhT{JK2Z%9<FMz=C>_eSFptFGe(yGXiT*eVWeCNhMYD6A>vrH5mJ%{6_zzs!TjtIoi;<* -toEj;^~qtNu!rbMX9{lm<b_Jiu#ZUNM<{!^R`carOmX8%f8oU;~=QjbUrEyAR8zUAA`H9N~~?jWBq&T -L+B*H=)_JU`5&x<JFopabUE$bqM!|Ykk;0b@oP{eT}}r=j)QkrL!8l6~W8?XB-#@^7_;r5<V-iw?cW% -;dPy8D^j;Yu_d-mHO=nK5p-)6_vmZ$?8N@yk-l9iMp@Vuuz3gGf&=%ZD{M9JO2kA&jewV+ZJ}wpf|ja -RA>gk&_MME!rfkL6qiigCW@*@F*Dsr6q@LqhdwE8(??-mOSl{xheZkdcmXF=9`rcgD;=qk|UMq86l+$ -mF*m5n%cEW}@;B}%&t@bt44(~4dz}AVI--=$01Ea-eCc6u|3EybvNzUunD%*)$Auub!_||H%FMu}b^B -8H~T>G?JPM+t%vvTdbvDMAXaBCD#yx#K~w)O&l0k*}SEqdJ|oWGuS-dL>Gm!qQD+N@T$*fu^_Y@&@yJ -Ax(Ew;e2ycqOzwojsBGN(5$WRXz5ZiiDRs%IDj=?9T`5e%SQB(EbHO`L5=m!@iBf?#po#iK^Af-_pAo -v6lnOdl#}|PxUYNPzQl=B$wTdjs93^-&|{*-Kxw+y~}}Vll7Y`m;TzA^kh%$t>@mZ<@T8^rnl8fp8Y$ -XmCCaL7yV3$6F388CmOnD@D|V3KC;!uYXxh!Wj<iNFYJxa7nv0TQ-fH5U0?M1#}V*c_ZD7IjDvpCp5N -XaFKo9Lbp-rOk-3K8O#+N>?T*M}a8uEzxB%0^E7ez-u%1%+O5lGlSucY^UMv44B(BGVBjAmZ$O{|Aer -3lifzLy&t<pB_INKTE{AGKaW8GsvABlhYTIka1ZC>qt)b?bgpXR{*?~!$|E}{*uJpUsEZxry_3AWhye -<A4Z<2?yQb_Tn5uR^emdClf(_g_xbn>ctasV{h8i`Tx_>FW`&>op%`(WeRKvxI+pLcFI>)b7gcE~D?X -?&i_r{ekHFe#@u93;Nb?MxQ%iWSPf5XfXfSp&C`L7V$Jn?iN`Q(>D@#)hDhP8Vn|iKEJ3&{i*fhPN$F -b1?OF&%TnhUauOwl_6@K?mv?D2*XZ~KpgsWAFI8s(h0ExXI^Gk2_rCWZ@4rw>0|XQR000O8Q5kVewKB -tG$O-@eUMm0qCjbBdaA|NaUv_0~WN&gWV`yP=WMy<OY+-I^bairTX>(|8Z)9a`E^v9>TFq|TND{vDDG -HNAk_GKyH!WFmum{IuXN+-d!*(#p$)KgSO@t-|l1idk>}%|M?0s*u54K-ZY<4w&6vdg-hM+|@tE;QN` -l`C9=mqWkZHH#rJWd}DXj$IxO!SENV&EUWJ$`q3PG_e_$LH6_^!DuH=r<Y?_FmA<qoRvEeu&d3p`&cB -C@$!I_D7r~5$>O!mT5eT$}Fc@605Y-rl?)dOg&BGGRDkb)Mu4s3zbuLPi2oz$e*jSm_-Z4)W%s_;5J` -md36KDbeZMr@ma2-QqAdZRcY)l73EsjVuht1OL}$mn#6QEfr?)7T{=t>y3(=*U8zFlpVfTr$x)V;d3? -8oo3D!32N)rGALXCuGEN@y_=$E17M4_Ibh#=Yv$T@<^Iv~F{P~}p-bTfz|Nc9L(9JUc6c>+l7Nrl%=s -^L<xk_rVfNK)p<x#%U5Z~uYQIXx3U*N?XT4hU`MJeTK9v5p{fLcjWI{!J#G5-k+xL@g^WjcrN+Qm}kP -lW;e-T4PPQw7|jcPdpmT)$l2CGiZC&*GU%3q?^u3q4jmT3AoCA=kAbbdo`R6^b{cVm#Mte^z;c5t6&Y -tX6CE3B-66mD+xUexWD6hS4iZ5W3vV-0g+HdOD{#t<*juP`H3XIQj(~q&r2+LftPD9~vM_zn|Xxdhy| -g4$nW*?}t}chvzpR-#`{&!BYf#ttoz5fUk3cS9z3{D;N$1?~kvJe#MN#x2I>PHy^e2C#N^($Jf_%a&b -k6ba{Anb9(gQ?C^>%KU`g2Tp#ZeT`OfE)?oI5+(3K}l}{OvoU1a5lVa`qM})V4fyta6qt6Oqo~ao0qX -_x5SbbLvlPrCx{KXUt=o^afDa}fszT`2u1FCkS3oSOjJ~Cvs>(fX;C`vyi2*EX`pTzf2eUfBZ?$g_>D -7EPOL(C1N5W$WJ13~oR`f#uWy`basU$(43FFYugqtU@S2eX7`k5L}YK%Qbvgk`ael4M2mOcmNeQeVLv -O&CqHQhhBe4SUdlP{+u+pRZK8%+qQ(JfLFrbO*h!7Rz*2E~7O?E7gt4J5_-S%)Vs#yqYKvC_qL}wS7m -%Bou|k0)?1vqPs*LcxTX-j&AF;*J3x>MUM1@9Q~bMdGO5tk@NpW0m;y(aNnmroZ%GrI7brKV~pYX2+z -lXPeR}8=eXX}*V6ZBZ-R#y+}pzh2!}$`7N2??O2!!5gM!g`g9U^MQlFS4Fo|#qTuWFa^>ZkYSU_N9!o -9#f>3b+32~)<nAqW#D5v&o~8YmfIY^0TH<+9%bF$sLJKgBu0xsP*<bA)pbXNXhc6gVLVSH&1|W5|smH -`WTUx)?(c{)#aK0hSm+Fu*ld7qCLWe}UD+2(kcF0AK-}L@<Ve5hegx0WbxkAb_p_@&cfWKtIC-pe^<= -VGs9+k^sO0Q4@%gM^pF<H)sk$L_q{NLre~J==2ySBQmHDzCd^dfEEB(06QVI3sSEHCGeM~01$Z41WGh -Fw8;RErT}sZMTnHp9GGhJp<GO1fd)nB6Npct8DtSclSd0;RYXJxEer)Z8anK7hu{uPv<nlxDsD#l6Dt -96nqbuluC*J83;}VPXjio&$RbJvz-g)#z&Fxi3A6$&q^~uNaXp3LM4PJ>L&?4-nC1(vg^tv|@4fcCx> -)EIq3RB*IuZKP5357epZ0(=_2~L<z@7#5sJ9jiaESUdVE1;+9N?)VQz?)g{p<C^N^IDIU~R#A713x78 -ap;wU}kt`tsx8e+M>a$$AZAIz*r@Fo=Klu>9yB%4^fW?bxdUScWuF1nYZ>y_#D}`-+aY@Va6<w9UrX) -vW|tUoeF&$`pSZ#^@i<`3<+;-P9GCREhH<CW$m}Dd9#j!*kr+Whu6m4Jp%SAYdZ{HH3p%>Z8z3^wi$L -B2`36R2GX%$t<tO+GCDUr_}1aFb<lz?CvE&~b&zcy4EsCG#ZDA9TVU|FJYX2u#Ms^fn>`&K82xUI5Op -3J3vB374}yji+u`71(20V{d2WGO&7`tyvZPWF^kVR>iqOHpGSOgQ>w#$MfvJ$Paa*j@d3zSPk@)7mU} -}-w7pw(MRqoG(O%}P&JUM8Ap_r-4CMK4nVzULpVVpU7_C{WhIi%KG0~s%-=DJ~`U@N$kG07yD48uUMy -~fQ(YqY7#qWLsYsIu{UBG5e=3{2!r{)>8L(YVA(#ByQNPS|IS@LldY7KqMg(BvL(gd~IWuiBZ+T0H7u -gEc3XvB8kcGcegax4n^Qg!@=2xCOih@rq!}jg1X&y#_1Nw~yYcY%8L<=iE2>V0$FNdC=$Irqvq@M3ae -bJ&?`%(&yFE9A=mF3`y(*i@Po0CQh<tZ`I-$?(x8dK2P6a2WlSt1x(~SqU}aQzdsi&6SnBm+D`{|XX) -V2Yh=6Vw$T}=%G=w-FbEs%qNxaW^Ea!8PCW>omkYf;l5}FhEpVrqe#MMAyYqAK@LYf0Udb{*`nKq}Ip -GD3h%Mlvfy(AWw>M#LZT4Nkpe>u7C}iUH(<<_QEE59r-Wd3HTjjg6snfQ_w>7e^NVX3!B}6u=B%8>ay -B;RmE<Esg#jz9ZuE6(3`5X*{6ALe795B_$^o5*>?H7*5g?`VzBML!-xb2GgTag9X*kXIvdUxjDJ(CAv -!*-*ecg5Co6C?Y#;(<vNTlx7eZS$lHpc4hrVx3uqkMYUP%Qx>6c^A&R1<uF;3~c9VYrY+~1;_ourtVN -IQDsYr?}%<C5ZnUO4|XZr{c@xi1Go2cMWydzvjGG9Zfd7+9)yiLYe9nn-#TQ=Xxq7S7g`wbH$!{auAz -_WPM;VI2=V(q7B(Q-n49jvHakIGoA|r4jgnZuFSz`-n+M;-EHgV6m^x&3CSF$U$t^JNvvoFdltp7);8 -@T`!ij>}7ec=s1=&)-$<*QjXQCTaw^j@=vHdlS%|_X=z>>VNfUnklwXvHEZ|-_A;1M?ak8sLOy8t&#? -9$cE{2>-L7KChV?y>C?-6+@%ml28k+s;H@7Y8h`K-sBbuLXv1or>hLkvG&lN8Ai;Ss+`CkR5KezdvBf -)P}JA9=S0J{JR3Kh<|UlF&Fyx0?S1XUeHnG1<h(aarnwcUAt?RJQvypbI9v%K6)k(?Dr&+q0Q~GERpQ -qGd}W)XL#AINZ({4_c3I^wR6Eb>2YA%Tj(}iXhosj;J9A9bY33~5BNHwg@Mb69wu7E-H_R6^fR$`!F_ -jq_TFf_Kkn<$bXHW|w;{eWxg)_42GUvAU3Iuevd_G>p>0ox*LEy$1Ibs}te!D(+oNrX*KVM?#d9dI-( -`VYE%>-+ymdEG_l+g+-3^$Je>Vngn>^|BUD<`Jy`62Ka{sQg&Ec78T^_bg?pOV63>pPC7rG?wW55qHQ -M9gp+=ahHK|j9R{YT=DTkzVef6G+=I>G!h;U6B+OZ|(i+cLY&^e>xkpQ6Rf1KRY<Ctpum=%2XFRXS6c -QReYiOltr1p%N@ti+C0#w~MTZ%lNapt$qm#>0o!dAIND?NqtgkajVh?{oBRcM3tq=wZeR<d}Csv%G)% -0QW*c~^!j3FG8s*Grax8Bllljlc=ock;-&BX)B7J#O9KQH0000808trnOyunFq?ZN&0QwXF03!eZ0B~ -t=FJE?LZe(wAFJow7a%5$6FKl6SX>Kuaa&KZ~axQRrl~`?W+DH)o?q4w~Ur0+Rh9o4-opj*f79GJHhE -`EjS&ms?731aBOCs*q-;CdR4Itszv-8X|Z)<i^D((M3yYs!<hhEp{^z9C`dzSGx9MCOkB^b>aSd!0p; -QC;Q2?HL&qxg^ez6;}kzcCr&iZ^#<$P`SNVxAHbJXEb}sfBL96-TuP_Qrg%WD>*_)E?8Q-)AcH+$BTN -VzCOi=PE9O5Fh1I$mjtL!$8Pb?n&k<Hi4IQWO0|um1JwVMyk1jvT*_RT1`h2d)2GZ@_iVRZU{pbGWo_ -PaU_Nal;kffjISJCd_xJqqbpxw!2Oxz3%CUIP=OLKSgW}RA`N@K#;@xOS{GToQHGKPVM=}eB3-$r>`o -<P5Q?dKN6+tJEmq*U0Z2CCVa$)2Qs4%YuR<bzAtrpfCebRGV7wHTVsa6tN&em+Lyv_R3Vde)lSn^Uz4 -+WiaF2T|2pPB`EJ+s5^HiGTh@ChBra<#i`tN~pTqkZSKT4op)l;^_Vg+M`va85{EccRt7wGgFd@Pqtk -=4B^$RnKq4<fU3EDqkFK@9XA+YeqCtU@+j`4zN)y6~$z`eBVn(CR<Iuhwwb>W`l8Q5Q>rt61RJ5??HR -j)pNR=>}?zj-!Fc&d~UQh*rDX>yDntd$T+0cWfI>YX~hEw1%UuG48d7Fc=R9mffjhaT!ZfOv&7r<SfN -gG`SF%N!%nZ_ro~!CoFG>4*C<AyKfB3>@nO`6L7IZmg}=>=!;+$#fy+Uq4&V25C~O)cgeALuswIGi&p -abR&ZB%)e2nesN@E(K9;~nxXGtz+Vq8x6=;i4k?La$v9-Fc*Dm!&O$Qj;C^__jPXFP=mrqI4rV=+zHF ->uzrFg;Uv3j(}3>4Z-4I*Kp$buC%eWE}sJeb)EyG_%~Vdo#mXpNly_!0huD@_|en0QkIC`H?5$^$mht -kDk?>Le6Vhqr741$7d*p~pGy#3fgle4i;5t=qWX$k)S#>*uS+Pa=y}J*<(+;BVrc`M7T3`t_dml%4Q5 -h4t8cg0>0W+*ysWMh|^U!o4LOCCISnyVyjbruDGYf$mTqN5UW}DwZ{TVF6~La>|9Q)@t}xt2NKZ-4f0 -`8>bVWem<X0eERu(b>gd^&sQhD`uThf;%l7G*C4(|fe$<PqYL4#i0>-qI{}j8i0{fg8+T27*L(Sn#&= -D8*BkNKA6*D{Lwq+W--nPKM|?Nt*|;Y0HTUuzjju_3%|d+meyXIAT8DAB#CN;hFZg09-bJ?Zy9h^ow= -rK%^>Lrw5#QYoU*=+T7xU3wL>l3U@9zBl&?3Ip`TL<oe692O+QipBpRY}P?WA9fpOs^mVqOg5Gnyyi( -o2LRJ|pF`GP4IDnV%2D_wXT~we9Bv@jaybfpiXEtmHzt4)JxGC*jgdgd@IA%4cO}4?wc`OyV;?<g>Q@ -G>OkNwF`}oGw==Ygvn;Ek54*2;c0b^=LDa>GJlP-I?4he7m-3ERY;cOpVsI%^$`#Ge)PjyqFq6L(#wu -s2$X8dFS$g1L@w7V$G?%4OtW$1TOzI#HPNHJntJjrYT5@i>xI81itbc)!`jf)x7hUp`_H4AML#Vnr4} -7`ATCIJRxEFv9C3;xgLwV}$Kf~&I!-xc{xp%(CtTrFST35VK%`R55Er>JE>s;PRSq3n9WOap^+mw8ly -J=Z*YWVsP1Ddm4T;02Lfe^#v0&T11B_|)4-!7te#2)d9*i^njTBW2w6QOL;ZYoOqSl#b$r0TN+y&cqP -%^cW0etG(*5&Q(_1&fZ>5v)U4Q4BMcF@G9JQq{OCXreNr&YxqoEHm#RD@whu}`^=K|3@WIV_mbnCrx6 -^st=4Gc*lq9?hNUQf`<&8)@D>Mn8MMH`FQZnPUD@crNd++-Jy6?iU+&4t>599NJ{Yu`edaIp^Dst(ZQ -f`3T)Bj!V_PHF6$1JBSy_+*fVaMzOJ;>ESng!6|Bw=5Cwj588IQBS;v}ZzQI&&#=in5ls1n1>R1dV8A -(u!rl|rW+D=*TD7L<{PCoOt+QH`cO$$g(#5KOL<Y9HB=eHS%xW!LWPZqwsFwFoJ~w{juhSm6PFuK+){ -nKy*VxMqzYCO+^C$XV0v|`u_+Lx~B|%%4+8aU<|Boh`LF4~+;B2~*RK(m!{$D~j0Oh_iSV}G=SL>>_* -N4KxXLP99*zT2FLHi$2O9KQH0000808trnOg42GP2B_l096eD044wc0B~t=FJE?LZe(wAFJow7a%5$6 -FKuFDXkl`5Wpr?IZ(?O~E^v9RR_|}(MiBkZUopC<I#4+Zsru!jR3!uwR07BtouX4@8G8(?GrMTL&XxP -?`__OB*rXS!R-)kDnK$#^{0LW9)eqhEABJNZ4SW6ZtWS5NN$+pEV0%@&B6r0!(PAm2A5%|-Od_Et^+U -w5Pje|=Stqy&R=!TyP{@V@qcjCDZPgA4Ln(}a**(8<tTwDkMPw?VVLxV*1pbC`v|guD1ileUCV15wrL -z|R(^To*d7#-h9MWQ&A(lh=+G1_C2(>a)?=|SU-R=OQ(!538I3~y1CggC!`jx{Slb(`Bi$w~4^`!9`C -qz%a{zg*~FSS_HCqjmXjH2n*tdz_wW~(iJ{aD$1mGjLM$_%Djsc55wG)<%v98`nOu~=wdZ>{8!W~M|% -<~!)z&{m}s_>we-BH1Mc`3(6o{7q^2uT?0btvyO*2oWq-!+M<@lz$k{X~YTm(F04?$Z47`ViCZ3Bm$N -Rlb_JWo+Yb7-+@hJwoilx3h-G?Ziof$ZEV{UIHBuS=MZg=*n|L7_l?aTJ+QHk4J5s#7&X)f&uR$@rXd -NL!LCp-d;lPben(Hzf+<ZnO5-LFU`t<y?&D<cQg{4JU%HOd9lOsrutj}vi>mLC#Cj780E3nGrP(5J06 -g`b-XlD^cf--peYV*ThVHmOo6%t6P?x4%#~t?Oqpm~Kxig*2`YlwP`5>_svr6P#;s}sy1tl>#zKD|@^ -=FhfL4t8eEB}>I=72G3A^B*V&Gub2jFntweBn|EdP5>2snBxYwLtHnXG_%uN>SfkZ#L<V4vc*HEk+4u -a36>W(1Tbh-K0B}7;E~}g>U=1(`kR|{NC;m&1X2d^iY3%|C1Z(s#c3MCaJYwI2)}NV2|qA!Rz60#%7u -w?hRR{X!^Z@y%BObGw3#C=?5zzIeV+sYC-HL*llTS#NF2L30VE)4YQBAr4JuIWPht&a+B;s$Psy-z_# -(cdctwkM9a&i7l{~+e>+x^_o((sQf#7nHExrvd!v=39pfB*ZWL&+Z{^d2T6#WK(Dny}yCoa>)Dnvc8h -OdO^45b&#<TL{`fIyM?U#a~#=bNey?2t?ITk6SIZtyb;L3Sk^seMwfmCT%LVcV5UuZ?}G}~N^eT#b1U --P*p+83D3u`)yK9bU7<QtNAt)qMfX7B=;l?*+215p%e2xdrt1!1V~gE+Ap|DTW&GG0S>x)i~AaAh?|u -us<t;<bTZWE(iE3UK%F|D9kCy?a2_f`i?VkPJ`yk$7;DmRYG2*%lgM(62i}Z{8!liY)KRT6WHLm``9e -Ol%E}iqdGPBvG!^=Ni?dn$yGRBDXsCu^`81Aj|IM>d^<Vi_`jqWx-&ps(4so}U@{-ydqeksi9d7kudN -*3ishk6%JpAD!XVWeEtt)R?WD4J2rF!?b{V>0m(SSO&I<zN?Sxso=u|z!dG8;AHggi?^f*rVjm+K%Qu -I8&=5;;``jt8_KhuNdr%3P8?tv1=x_s)q)Jn@QFY8H<-1psn&mE2*KA#U}{SAgoWjvNDU9LQQ8}RG)J -6l-EZHJQef|8L4Sq2RAKX*CJ9w(05o4cO-==AY2x<B7B1=+V-yjXy2QZ0`t7mM#Ki}THS<amMg8H?J# -P)h>@6aWAK2mnzTaZIh#5vXzl007(v001Tc003}la4%nWWo~3|axY_OVRB?;bT4gUV{>P6Z*_2Ra&KZ -~axQRrl~rAj+Bg(_=T}^5UO=K0=vHcX)CWj`(lQVwpwVcxLMCy*9b-qfGo$p^?=c?(0V;JPAtm>odwl -OXwz<2z{ZM}}8c%654hGYBK>f)q_(8wH-qr4CzTq@8Vl5Pt6zG(bu=JpR2`L#Zlz8FBB9m;GvD{J09Z -#G#lmObQ9T~<-I04vK{=%isxgnjAyFm^7lslWSoFlZ|7D^<{39T$XO|H%E1H=?+vyUf+Gsja}l{?1kr -I_(td5NVqj_N^!y6tuc6gS~5>PbnF$6AWG<>rN_`$+<=oDr)6^VMzRZ$yY5n0cm9$h8q$dPnHck<%2G -Zll!>5pPQTnAAS6-{##Zv;%}j>nztoxhC34j;cXtDOQG=(o3Eh&dKV`y<(huDs@2#Q)GB5?7k_;=ZLB -Fy*8-d>QrQ<4;3nf2!2+_&DI{3A59lD;TH4Jh%0W;Q&_B|NKiZx30IaAvy}Uo-JJ9t`bOeIBQ(^Y-+6 -LRTp;h)_Im;m>b5$^)eekJ2tak_eE--3xi4&>>5?QoG{?%@5}YPYNvIv|29Dtcgc$S{dy-b13d^%XHo -*WaJ&xz!W{WxXrcd<Pi=y6i{&Wv4{6QA3@0r9lmjc9?$}r_hG!BA?K@@yLMXx`ejOS0j`{8	mFvWX -A$)%>_zi&u$c5B3Kvm0iw7+@&iPSdFXk<g-z3gJxz$h-Cx;1X_oF|-UW*20N*ngVVROQ9)KX&DHhKBK -Jd|3kck`m;B<MYfjFiTfdo==k2YdF)U9g<|-S5pNee3|l)U$*IG0KM`1NBg9ZJN~A)_Led54G)Xr_+A -d`OxkVEn-A|_t0Sa^$%~PyIL(XI7zL;g|jxg$aAAtkN_6?(-$BUb2svtaF;oh6fXNzg)Zj9PZfy$DQp -!Ie;>yc2rrVK7b^}H!S}ENTCchvI^8O2)c3JVu4i+_^&_f)lKk^upD#uX5vqVzV*Rm-=_7Kvn0viiZ2 -ouv)oO`k7I%9;h|jdEU(1P`54RRJY(~qa!2P*g)-9J=6Ngx>mzj__%3r2h@dMI7w!qz5zaVdtuWPj4X -wC`F-Ww+x;9L74EPbJW-V**f*;#KiE18pvmzgu~E>q`*-6%WSbeTFc=Q4Hj<Obi-iTY{Uf2(sF{2Mu> -{{v7<0|XQR000O8Q5kVeY4+g{<qQA-iDLi&9RL6TaA|NaUv_0~WN&gWV`yP=WMy<OZDM0{b8RkgdF@< -XbDO#refO`>j33(07+>%wKAk=!sne6z`54=oPM<Ou%L(@o$OW9#_s;q6cME~Nfh`+5Up{T(w8UC0Aqk -<i*ho~X^bb4ie>pj0gOj8F*{IJB2j@rMm}1{*rOL)PoSg^Gwc}YXJMyQTIU&3C|LeG}RriByW<y%NlJ -0uqIgtZ<e&+Yw_3wDV{27agJYfGb9)-4b$06zVcJ4X06*;~a!q?!=58^M7F}v^snQjN%iujaG7IBWnL -s@~y>uv#ux{28PqYupJ^-Rcu+`Y~YT$c^Sz9Ad(kO%jCDr<7&dr{y_=8+$~4?p|?DU6+3!C&mcajygC -mT3%17_rD_7mMh|_mcWU)40wgu!4nXrCGo^3;kL200sNV7XF;smd64<bwZgvG(^NKZ~8Ak0RF8%b!H2 -ZH20=Z9Z~9t2e)C`hF{Ju*?@;oQuc*=Jb>C<%qOm619{-s+zUCgLUt$8!kbk~9gBjDl7g^fAF_{I_ao -yD;NsZ#JP09$HR?usv?RwG^8@zYibVP0Y~Bgt2PpJ{xo|dulvyX6U{%v8bG$g)8)$p@12Tk)K0r5O6V -B!#pUvGG<N*7!?<eCw&o9U9;OqzcelQ#!oQ;2cgngl<0fqA?b8>F)Tn93SS_PIDEui3#!D)YZ^d~S54 -o?Or;~%2*$0y^n{%FLG&xh=QT^tO@Cr6iqgCV=P9A2D{`gO)eoTp7J8k1_|WfRXJ%Ud5>a>^siaYI@4 -A8>j@D4;uKH`YCe(`<7GdK9zZ61iJ!bq-zMyN>G%lvRU%WX_CvepF)*fdhR9dSBt}LN2TGTZ2w-*K4e -8z)qI;mkXz01oUHP23a4wz8}=sp&v$K*V6;w>J7utHKVB;j9rc(MfJn_XP-+BBGpP|7WlWU&b>MGWjJ -f%(mA#48^`0L2s%*(j(m9XrCq6r|F4b)Bld~CufRpej9T`?7!*>6>rd|rxN5ns|G@O0kOn>9<=4=j_m -(^71-1^Km~9I7OqshOayPmN*R#0b8)|+-@Ect<F8B>KzbW`lHNPqNP04T6vLAuB1i#f)<AUE(^V@>oR -`c6}-&XTGg5Oc|JA&U)^SgrIrTDV`UBT~4eyf)K2;3BWv#Z7h-&FH^g5Oi~dxGCf`OVBn;FjQ9lHa6o -!MA2gd?NT0HGd-b6E)u!d|S=81>aWlr-DCK^QVG8Rr9&vb2Xm}K3DT+f<L49dJGHtY*zV@3>KsDa;(5 -ZO1(cEo)2r8q|q2gekzH{V{PJZlT_7pP4AW}7Ljx^9$lUGpEoTnr>P}_;m*zXyh&9dNZsZ625lc+4f< -zSAn=2}IQKBD8}ToUANsOeoL-%tf9?-phyT5^T`LT)B5UIEcYm-{V`_1&Ge60mGs_0&2fMbZeL_*TY; -L15nc0mMT)EuK9XV40isxCkV()i{&UO3U-$ERZE_$tAr4nyqc~t8oDS7%D$s;vRU!!qq(c6L`RW2puM -p<gum9n-Pw%h2#<R*IrsblF8+7tmLEQL!F3OIEHsZ^4n*E*RG>*N!b(j*B5oFYgqN(tS}hpqlJ<IhTb -B%!M&BneBkDH3`@jT<oN=H*$+i$cCBJ(qg21wjf(DT0m^BbEetg(R9#wcYSjd~)Q4WynoKZklq_lAE^ -NbmXQhH>TY5#6j)?e((76kj0lj`?ST7DG#@C&|fc4ExBn^*~p^Tpp-@St`f9IN%?xksl|G|glIlfTE2 -!ddDl}{PF#0BDci`o80nw48ZVM0^k<(vQu%7MU%VR6(y2PD!Cqwug&Rc9P=0N!G(v3<mo|$qX9bIB=; -U5mlbFg9onhW4QuQL4sZopx(kb>YkF>8Bl?rUXUSuLEl&MN0DFr;WL^xJL@o}sqWoB>`E1~!}Rzl(^R -zl%8Rzl(^R-!hQYCevYP&kg2kT{B!P&kg2kT{B!P&kg2kT{B!P?i_RN-$<5_u@EKLh*5|gv3#-q)k{o -94n!$AdZz#IF6N&IEs}}IF6N&xVgsc=3*rzj$$QxE&IvGN=O{VN+=x1O0sA>7b}tD0ScDLpJv8fHc5~ -9Nbi6mA<ySSpTL8mNXTx!vRpeowl!rmWY^Yw<k6E}LYB+al7XJ7_j+*`SZ(N9qr18Qie{max`Sry6!g -`#qBaOiaV=vIIwkx;dUclb2UJzo`U7bSRtDkQFs|gc;f7dJ&LRBjPg5uyI|LF(4uQh4Lm+YF5GWiw1Q -JIMfx@vvAaUdnD22fefy9wRpm6LENE|r?y|hE1pQb#&Lm<LoPv{WT!7w!+I|K^H4k3$*pjh4_z=*K*^ -OSg~dD@33TRcyBo~I(aiV{mq#IiNl-JGtPe67;RQMx$3=XIt<>{3vf_ykjV5gJn{KEcBZ^KH0NnDO_x -a^vrrTTrTlVu8tYPeNcQJ{FjinZc33P<$*fB#s1z!m+@R_;35TzVRr5={$?TGz+)LSYWb`c#ML;Py&h -thQyJ;h_q(>?>Bi|Ul14=5VjDQO`1b&T2KEl{)O&SRZrqyZZ1H%J4JK{`jP?S?QW8@H>2c3vuC?|R@O -SX87<Rtuk>hvRU4+(Ko=|NUvv~x7dOtUOM9)6k!E1Ck?EE(GVwrC(#RC*vBt>!)cD-iq6cYZz8p51Mx -#=Z+p-fA{}DIK)L4$aOfyz0_096{<z=XFx@vxh<dgG1ke5+U_fYe(m!WX%Wk?)(84AZ<hQyJVp>XVFN -E~??3ddfC#F3YwaO`DB9C;ZE$6h9j7Q9R{B0R<H!`+{Q%Ioya@I3ErJ`TByAJSsJyzfCKXN%zdQ(2)k -GfEXMXMZMrAeU2RV_&R4v21%Dzz(%|MFseW>*z+T*odtO>%{AJU^ls3hBd^Zl9pJTbU2Tfu{fbvm%%) -4^Dq=kUm{;DeX#@Q*6|=);6@KTS+){A_$+ihTddWP+<C~S@v4$p!2dJnp1oj}XSs_IFyC_*HL*sBJ@9 -ye)4k<7VtI#m4SWuji&tQ=!1Au+B`iU_2IzsiZk>(%<OrcPi`R>UJT7k}Dh>1o6Z_Yf{zg5wcKO>tgP -+>&tqc?OV4{rWV+Gf@9C8&|=A9o|DVm$QKS`0^Z*=3#qN}ebqe^82|Nm0vkHX*9ov6%T@kz<bHVeF2F -n^S}#^#U0vH2r$Wd5r9Pw;whT|2H^^5l3d{5O1uvBRIj&`^ul(S`mkXLr^$582e`p`_Zr7g=KeISd_> -1q_PpJBOhQhM;&@kW1Tm5Qy=}53Zei?$wp8_B+ksC?7ssg%@`VpT*(J57=@hgU~Oz+T}H-c)Y^Hp|a* -=x!y&}&ieH(@;Q?18)`XD1+1Wcn<p#eL^$b%L`He}B}!jprNX-uTdBR5N27*z*soN?ABX*n_EJH9ti5 -`yn|k~hh|*q)kF{5(HnTX=UW$*kSFdHS<Gl7#e5}1Bj<lD;vG$TU(q0P3+Dqa{dnp`iFNq`VrEsjhB) -(U(6pA=jK@vwQNa0uoNgSylg<};YaioG2j#ZGvUuhm=OUz@;240d80faC&m9Z^_t($ICcfiZJj$2FHK -SkS0i(9;Nhu)M8LS$njs@$kd$wCz75w6Ry#3@J7h)g#zH&>TDZW21!SiUFp4XoPKwPqJ}{x!20b@>On -P}HtqC9b7z(#eU8d4I6HJWJlBlQmj@lYTiq){M?!A6bP#Vig8&R^iPmyjg`etFW{RgMM+*Lw2n0X1=| --gRC&ObDKvz7sy+M5?OCR)UF|WQq9b!#Bo)wp>#8BdI*zj3U1<2ZL*7-7_4;@jf|TZY;+R?m76HzB?u -=mP&f(NM-=L^?&TWNMGR6G0pCoh<@nev|N5!i%crd0?)6g?{yQz0NCU;0FhBAa)RN4neEk%)<T5{>wS -XgkLE+e6ka*5tyyhH`^vx$GdIJjf7b~Q<!jZo);L<XP-@MN-8a1Pt{<dmHTU^Zo$l47tcswpZ|47%sl -ETWWVQ(USdI@f1)G(`*ZR~=Y+q@m>wUSiRQTM8d^h}LCd=ZIi^2S~kb?KdUv0m9t$rCB9(_Z(rrl~a_ -dBr}ag<87S+Vd7_nObY>e$%BlB@fxwwf3I3O54=hPe0P{)LI=~>+E@Jbxf_Zbsy@{o05m@>RNZtTcvA -i-4}5S+qImjYv!J}oM~$2w*5&Oz2c_iA$z*k+w)fGnOg6~`cwIqvvkec^Omzr&3bfy+WqhoU7PHA3r$ -RIvUA^hk@urjZC$hXx)oW~HZ^;7^Q)Sxq@!Q?rWN@czv`96Z&wvJpq=GS^qMGR5}_**V>HSH8Rb2Dxe -#NqikkwA=DWWu{|8V@0|XQR000O8Q5kVe9(C^?p9cT{85RHlCIA2caA|NaUv_0~WN&gWV`yP=WMy<Ob -7Es?VRCb2bZ~NSVr6nJaCx;@|8Lq#691jQVx*{oyysG&O;2qvPe+K8php1l<z90UXBm5eRg9N<?eMt2 -{yw|5!N!J5b$3Wf!|u%N%x7jkJKKwk@(<mZ_uW4Ax*fAWHtD7}==@G6WG^ZgG+8kk1boST+oO(f8F5L -E;$PhJY?}J~l?4(z&dLrX3&~|6b3zf21JQaVwb1o>$RT#iUYRF0EFiI<u*5Xv`z(}>y<u2duOpv3cF2 -V<@io|pK!1T@8j2uZcLHXI%%%BGTPz-B2g=rFhoe>@)jF5dYBZWKQ7T@iw&&4E$x0eA$%0qr#*uV{9| -n9LA-<Zt{E8K#M>}|-A@`O6U(<VnharW6hP!Yjd@V6v?eJrJLhXxvyc(edAVBKzd0+=Sh3+C?jHFnET -X_DBb|NCj_9<X4m+|>PDkR%?KZpSOYvJ<6PAx^gi+EL7Aq&<r1^K=|r5=+Ah3=Wp0vtb#<{o#T+~W@O -B_mtXMy<)!0m?h&$T)F??gY$h_`eb3*jHz(^kaou^=5inV$ndXRI@|nKhnKXikEPDM;_7@q?+|o2o90 -D#C>gch2-E57(}33lpoC*MUpKd&wvHU(jVQ)!(ck0cK?a~Xpcti{^aQ!WRVK&BEhjGzTS8oh7na@`{5 -3b!@#3C>O4TBebeoACr`@zyY8fKj>mL27*U&s?a`#$nfBTv8cs*U!Pu-Lxs0U{D=^DI-b1{A$+ZBIXc -C)yG7kL->6LKMb7^J2GNjpI=qi_NRLExcQ#tg6ztr(U<pAh6;tTRcXwWv`s2!ANA-k}0$ghE}aOwtKH -6djCFCJ1bhWZ^}!1SFbL}1X3kf9QNY(uxvYBn41n;#oZqUjhbr#@u%Z{J8h7nRB)K-1I{ZrKE4j_8p+ -)ngqjj#)U=i-{ofBNTl`z;;k+9hBQr1UrM2F!z_^5Gw{!_akDy!+QLMd3+^=Td7nW&z6$Lkn-5gE@Zi -5YPoM908;JUejN5pYux>ZN!RrGQ@nU%nf<}^{=piVJ!|qXGRF^t-Yo>0jn*e3@Is^Bx}smQ>i=wMT~t -<g()~Nu9tNXHXFAF0H|k%mv{>J~Z=VxuTvfE3%NAr=95iQHHOah%p$LO{1}aVUAak$pY)|#8Z?BmZqk -P>LK1%{r9~preYbRhaNSVE??@zfr=wYL7>GR-}{&&BJt{+WJRhwHzK10Q$FcY6tvw{gWHV@MNkBy-AU -ZTyB{WK69k^Y%EWuU1C{bEOda*r#9NlHmIqzW1sIb4y^k=+a+FrE2!B!`*_EfKg{Od)r)FWC>vL3g1T -Ww}HsLfcbvXZKYjl<(up_;GqWz%3RcEBktg7j)KsGRLW@1HAgwICxN%f<iCp);ot&>+0$}OwWy(>W@N -~)|V`_(CL;FH#TRoP;ogt8|T1m9EGC&mhnZiuyM<v{L}>|ZFOsaUO|Y<bMQA}nE!@K0iNM*4|+mlx~h -(`M-voE?y##q0SlwRFG|(3X7?Hl4Shym_tJAUt6H6%^4mkek-hw1`kb2lDSuVoYt>Y>nknZ6$RnY)IS -SXp?2z{pmtQ{e7sfUgL#1Qhu{;(c=ha!>fz%RGs#O=<gA^zZzkNHV6l;rWmbLw%$7iM+r$dwKF52&^g -rGd*9<kQ;COtfxv77+XmMSYY;|4jZV%1HE86jk~5<t}Fg1&$M{uSf5YDSC-(9wlW&G(-_q1gq2MQE$X -63i0*iz4YQrX^~;|NN0K{4wLmV2m0DE!{gFvt6kez4e!P=n0ur9mTx}9HL}=3~=xnuY|0flpYF^K0C9 -r2=wH*#q>IUdb}C*tWJAk4Mw--D6wwD^N>xiwihu)QLU?nq5Ld!zc4h^W3vh(tVbY(9SnTb2yONJNu5 -D|G8**C%pv@>{i3IJ#}jIHOJ=YAGeDJ-AJ+9FN%%01QGNk%!FXi`RjezfW^Xm0suF_}nlque<an{*Re -%M&Q-qi0GeA*hFUy6S2=6P&WIi9L<TxdNEdeJ9JzrYtQy|)3G5MUbtA#Uj&?$2VmMvIIEEcYrw-`V6S -Kk_?CnTpF*d(1c%8hDqlya@$)-MIOF6q}8kCT?tAu7iQ8}(XnRkff+@M8M2I(z1`QX86LRpQeTE3QNL -@D`7GP^JUd(Wq4#*|~6zqyE1|R-7K5wUJpdizRbN>|2h4(>t+@eKYsv9*ISU%jx<$_s*!_niI1#>Gto -x9@l@N=zdFZEPp%{iwu3f;2NXUQ#BeLRx@K!=Gcr@a^RU4$C-BV#Bzzd+-37<S*yO2d3WAPLvfRS(%R -r)A8*#Gak2)E0?PnxWb78>IV3efKM(%hVA{X6x|4z)X2~292~nJRRQ*>-%$X;)c;qZGH~^698*!-06` -rz=zEg2)u2urq@jF>H@(8^Z)xB45)%Z`C{B%D0gNgNM9=feK3hjrwqf$N^K7;s;+blF;zMmRLlb7PGT -C?6rDJ#z!C2x(iHD;Iep%`r8#1DDG2zMLqU=Q~ySBbaue_vK-mj$o(B$~P9J`}FeV+IN6H!xhiQLN1v -pD$mIkq#>V22e`_1QY-O00;n48F5UC{!gHV1ONcq4FCWp0001RX>c!Jc4cm4Z*nhVXkl_>WppodVq<e ->a&L8TaB^>AWpXZXd8JovZ{j!*{?4x$sb4^%IbcPvx7B_C3N2dRL_k%wS|O7-VAa^jcHnZq{>Dit1Ok -OSOO?pXJdfwqcJJ=;7c|>1-2wEvt@gleL$fz*{e&~NcZEBcEGY~XTQEU5w4_ggY3R#;80Q40f^DeMsP -UFWX==cyhI&RS@X*vL>=?R&8HQ%hbVIpZQw1^rlS7U618THK))YmnRVbK843k3Rr&>!De;_f8q)OzTq -Qp=i=26Uex)o8DYaQWMO9RDL32K!}6)AGf9cXY4V{5BnOf^*->L-!3q%exjLyWJeOW#of&?o8xMvN~M -Tfse`hX#y<QDl}<#1`%{!au^L)yvO#;|!$<!jy70S42fNyMdw<v<%D^J%55ohTstaiuz0^`(vgI5aIt -J72;RYXF+5|q3|(Y8<wGJrFThw8BC!^HHHE&R8WQ6kHR@;9)f$!qe4?48rD{(m-|$9tRrsf2y`UU$LW -6p%203jw&h0&)ST*Wx0JDru|km;>pzxzZGk0pIs%U6QahxRn}U6$J}?o}F0nZH0|_zEEw&%bDTJB^Au -l5X+QM6R@;aPOpfPxdx5jwf7);)u&=yO9S}btF#8zw0kQk#<M3@L2M}mHP+<HYsquK3sC-2t#PIoeBy -DoHwV`#vrF`jf=(_Ui?qv?1wblVOVm(pE|Z8Gzc{F&kaDOVCRi9<pd*GcH_SYC||avzptL$S;r#i{av -V27-un`+3VSj6!nWS`I{U;zke%CJ=odk5R|q`JtmuWuQr!gI<{uc8qV9~?{IBD})_r0#GjRT-L68*AE -cAhuGgRx9__Z<Q**)J4g;1?|D}m50w=p%5q>8Yewl7D|TewUTp80hZ7XS_?HUH7`~(iZv-j&r?v=-eq -FJX)`i3MP@*ph=qrz1jnr6Oi{jr72lYs*6P((s_a{38GcIksFL3W_+s@iv7&xN&?jD2@+D1ozIuFkNa -6OQUXMRY2O%u5t{)ly<IVqkvGNp}1oUk$I>66Ez95PbamrC|?sOTRYF3Q>uxDF_;v8G;b*Ia)RkGp(& -v5!#hGx=rA8M5eijPf~bgt+&W1O(pUt`UoePWyKl*H<!Jxr)R@QBRG%p}nyyoG|tiPqpYTkb(~7Ek*X -ZxLHpp9V0SF}#arv!bRvNac3v5O1a85mgytE9Vnb+S{YTNuts41Ab+i>dXY>c6h0L6?8uaR|0Zo;Y#H -3z+4GCn3@|9yV1HKsDl~15_U3(H{~!pcQ<WWy@<sddH6j1Zr?w~-dLX_2~^;_1(`JznU?pDkM+OqYxX -UI_m1%8R^QtZE*-HYiv;%K-`YFQD1w(tJV(xv?ZuFf&WsbcF9%(@h(3osI%RIE(BZLg0Q~*=D>-~->F -M($bMPDtHJ1x~2=m#o`Q>;I54*1~mvgH_xP8uLw%&WTVLJSOj=@BQ^gp|I#;uIl!I!`+ZnjjQi@6Cc= -SGu%v^w-}Lxo@bb;OWQd^x(jU4NGf*?krMFJiDI{smA=0|XQR000O8Q5kVe){$p2AO!#bz77BYApigX -aA|NaUv_0~WN&gWV`yP=WMy<Ob82aGaB^>AWpXZXd97A|Z`w!@{hv=UYIG{-2p3YFbZykr5g-XYehC{ -@Q59LnUSO|g7wxXo(ocVHZDSiSxl}r<Qp4=bn|W_$$G*6ze(1J;KN!<+(Cv?%KHUx{-M{IK??vr`+%= -<#;wvuvh`KUl#5HZ?4<1E+OR5zGu(fJ?*MZ=M!?VYpStPeikzA6gz<~dl86Egr2GeE}3m*7}OQG>oZK -X<n0GOsyrS?EE->{Gty9Dtxm9H$;c864JL-lTh+V9{00f<WX7ImVCX4Y5JjA^ExS(q~EN?{aV#73&RZ -hU}+XymJ}H09As@eN%PDl}vyO?PH3MaCb}M0}xqwX-TM6=S63(tJZ<H?)&61->A~LatMI2w}(<;crqQ -ej`J^+*wmBLeQ~Q8>TjTui^c8PD7?qDcv){6xdATMZ^OH4|%|ZX5?$yTAN-MO5NE)oU9PKlYmduy&=Y -NZgW2~rD37#R(qc<Lu`^%RQHXoAKl#Azy^xmQG{-&ePpXrf`VyCTqLk-XpcVt2%_IGMzmlQYqpG|CJ^ -9Dp9k*4WbRUD{79cWvsq{CKHk6=O5+s$OOg0y8*u=GmGXtzp>P0<`m^o>B09H&;lO>g)!z-=ao=(1ZZ -e||O*=Dp(47xEGn&q4(}~k>5jl+QCAMN#iJVKk1ms3S$&eYJM>?hci1um}7=^U<pBdU5Fph~LA6I0%` ->7sAQmhib2q^@;A-*IbO_RPUj@iNVopcu{MSq(Z`k>XM-`jBV#n%Wea1egSmw>*Dq*P71mD*U>Q3tVC -*X{PzW&7P#n`rL9a_*u2xcAB>a#5=-mE2Hkvk2C{(#&j?T!26NXD`txjtsxu8P>(A!^|`}&0?@!xL9d -}QQP>znhUlM>n10TJsG7Z`w+n7b7yBd3vfOSoL<S^!8Y1yY@#&mpKTz__p-Cy0_?jv@&gO4H)TK18F` -~guRqK@n22#_GY89NUnfLPD@}gYYPBHpwN5Zn()DUBuz|3EFm6loJdQo)d3DXAWoEaJj<M0|1yYj|hg -R<2C|q%n>FR;V#|kCu2eght%i4Or73T+<`SGm2r>PTJk3)~tK8{jY&<4g_iPZ2)8TQdH7IK*5FH9-G% -r4KEO|K{X4LeS(n2D7*gIf+f2Ojxi75l4mz;8bJTVJ5QH-!RA#=^wCiA8Ui2kA?Jc1v-)baC?m8!=JO -y-IHO*$;!A0CeMUKw83bNzQVBFZ`)-fPlqx2=eh@)LZ@8Y%)7cnztd6s})2F*&<%m-~OTr|FR9S#w&s -;1txf1*yK2S+dP3eeNqY~*_&CeOywr=Ms+p03gwI28c$qr)IW(>;EUwzft5x7CB?vX0Ch%->g;!u`MB -o|-2WxN<Kq2yn%;`#VMtE<zk-B8tP~UYA6|BnPQ^o7ZgX9oLKp0??ox~|?I$G4$LZ?ne9*~l%E!Kpca -2Z7J%tZXuNjd__NTn^Ix5#*Wiibc;8>*D3kp?}Ev_B?O6@XJYk2pwWb>y0dU~nm*GNz*@sip}UG1N5L --G`b9Ioq9x33PS=d%4&xMB_y?|k?VZc?xB_Pg$2eE;EiebuY=UrFOJA>-BB!#9;*w_m>DF|9N<xhGOA -dB{Y-;Q41-iSsa-x!t+zxev2GehhoZ`?sL@^7XHL+vxOL!kX<%;i!tEx5=KL^(b!oG3O&9d34tQgXrp -+I17<gzVW};%e6EQup7010Z>Z=1QY-O00;n48F5T?fJZ%W4FCYeFaQ830001RX>c!Jc4cm4Z*nhVXkl -_>WppofZfSO9a&uv9WMy<^V{~tFE^v9xT5WS0$r1jpUoo-j0;<3UknQuy<*U*Q$mArX5~v)<cEPd?Fs -Egg?CeVBF3xYy(=+?d0Fs=fZp&9EcDj3Jdb*!}ncd$vKkTG^-tDoA?rFQ%Z?lt&tJ7cD2HO3-eKweLb -`^-3@NAcz`V-ECWS9PL!gXzS>xp|FNQ^jhJCHnN6CQFW^aJLA)Y?lVbUhIYke%^+?)pm}Fn`KIgJ{tA -cqkov$?<Bjh&<ugq3}J4pTW`()DH+|*M6YiI{~*tK4IgPlDIyV9gwW$3RBHPRy{pntwy5>5k_*09lI{ -OAzI09xa7e-pXi;O`d%1_afJO<<-rl&Fm`DNckEiYvp_6ZoneI`3w?II3g^D3DEjji{<B@5#{G1^N<* -=Npi)<i13OrecBcX7O#0LC0V{vYR(`}B+hYNr2&w0Xrb1?WlfU`__!s^}Ojq<O@+R0XZ7bx#LMBQ+@7 -=NsF0mDM&OIJr`s--y3J1&=!r`9e%$96P@8mpFWrr5hj~Bu^KEx~azhzutoaUzE#~aqNn#pXj#2WU>s -&+{0$8j%-@c@fnF&D=bB%GE}1=&s~On6G{9EXEHAP^gUfcdd8XOZO7$gM#FXxWGE;QiI@fF1WfvJb~M -H^;rf$G4!xQD77YtR;!X(iISlT?MumuCQ<jxNP5?z6ZzgN%x{V_(-eobO*h5zt1{XH|&^QAKwhRr?(f -!H|+ZM=K8ANws5$dCn_donv|TXcnXmVADV=d*us^1>mPBv5({)EY;NCk9J9mWRTE~zLYAv1ouTV{Gqq -o^WD0%D#FTk{SYr=?fbGCM*G?Bwvh%IMD;%rFUNu2vdv`95pbz$rm_l^N_5Gm6PJ9^>>E$ta8?9!uQE -whLnvC7{@n+M*+P$+!g3tcmix)5UF8xX5a;U<C&OCwr(b`ksIZN;+10L6w5?h@MXHKR><V!dw6tSnqp -x8)i1R9M9x4=3YC1-#kYj5w!j$kywQPI7tA_j}1mmg&0IbW}qTs=p125&xbZBI?kstfy9tUKUSn>IjO -BuhE88ab9OSO9<%TROhd%ibQ$n3h4Z9hv-c{TU{mB|mYnd(!}`v0{Lp1%9+#2L2cdh-pqS(&ynhja;j -dn1y>0FeIkxddn#6hj85*yRf}kWY2g<xbWl}BQ8v;MiXA?6lZBmC!VM<2e3eR%_8ZAdRHJ@j2&rM`sK --Ke|_E3Ox!OK@5Sb@W=mCn{44$dzyrM*DVzRJVQe&7BZlQ@F$#NuE85~x%d)g#f@~Uj4tbZ72Jpto;X -q*_A$V-yS?uWm^C=Iw7p6f~?*n+D7vi%SUfP&rB9!EubHGfv2b0i$13VGLFgz6#yvETb!9)@Wu9UnW@ -{Y7*%Tm^K6#q<~h`lo?>7YnsO*x-brN7|A@d`UC4?C_ed5KA@22l471Ob<k8}6k#SASe~d)>?1%i-Yt -O}qd8>f#Kf4Xf2qgYUcN?}sNJ2kqfmd(b`|0Hxo-;w{HtEQQOf<I1PcU*9z9pTBlGUn+X)cK>uEb@g- -O@bF*%{{0}P{m|__PW(@)_-_AdNNktK*C77ABBWn`^XAo0^=9RWRXzxB;y=iGv-PS~sTEWaKN&--#L( -Eq@T$bn+{N&^#PE6-!;d9~!(9w-N(`@dG5l0wc)5$Ad0683vGPq@&V*0da7chX99AWFr#0jq-fTEknD -wp*Vb<}*MeOeM5V<u3gbia49L7lUj`e(xm*|Q#5=5WA6iKvc8@VTVV-`E}!y&@4Z5|Z_$3sboYbF3Dg -=%TW;hZWkp8HiILp0G8I;>a#o(uJ^Ivjd7e0_LOns;u?;e+rr2pH#vHh2gmNRLUspt0N;B(O^lW#Qq5 -xKAJ#gC}8KatLGFxr-AWk!>o8-%4-NVmj}{KL;Xo-a8s4Rx=vakcBJ6^gVaQJOCU-roxCv=UEehq%8y -q@}w~jA2<?C8<Bq{xyr#aM4$Lhw7?(0a??hO*7AELfpQo*>9NKt8J6Q+!)oA_8=G=W^v!5s9ov;#EX* -`qK1mZz(G0U3!9s@I9v=5kyWK5zIj&T)qnU1WyQ2aIY@$l-Dj}pKD#-vmv#%B<m*k}OsUw?$5Yh#<8* -DJtfqh4@9DzIX?&#$0^u(2+k|as>OE^a&GMneae!yLRk8&ilFJttl=XgqfOZG=$el#MnWUWbXcjla|A -42bKH{!_*$QNJ?qfsiy4wG^co+42V;1EbgZ0Rbm5FP~31aaz}GMjTDUEjc{RQV^!DN)u)wy;s&+t>@I -oF&PE=&8o_-Dso@A41Y~9ppBR<ODSgB`3Kf%N0+y`(UrMCsX!C=>|kS%;AgJQ-zjAu8?d+sMkSWSb9` -qn(B(c0n<Wy!0ida!yt(8-t51L5fg9GwgMhTfwz~ZB(W~{ss@|d!Xc#a;BNqclu?@{6|<|7jD&)GEg{ -L~%VeYY6M+n4!y(7H^ZW-CDOZ;$r7)wTs$42Dp+}$%)y=VyjHx&a2ms4VEuu_uW&5lfXS)PI*iZoQR+ -TH}MD@ni3dnkJ0Jnoqff@3XO<0<hIIFr6vLIjxjyEM;=vmtxc5=c_I*f$Y-=tHnk#2$F7mBss@1DOfr -YHHQ2-r;k_D+r*o>wa03gq0~u=Ud34_m{F_Rg8&XN~owePGmGr^7mJ)@aZ_rM|-!k}45~F0XTMB5cp7 -$^DoGyq!+QI2N;QT)Xst*!sgLe_TO@(WWZn^Vdd${;QbvrxcLr@3dckSwqzr$p{&Vk2)v>WK#bQ>R{E -wm(A9}leF^pI;xL)v+?@n>$;L&CmDYzEotp&O?BF4Eyc#7Y;C8OTFsY-->W5(@rTh;-jU(LdFR~jmdd -Z1uM>x4TOBgzio^m}+(y646`QaBAL=tCfw=^hqH;M#<ktNuTlAMCr1#c>bSgPcn%9KVQ;y3jl6l0S(k -!GMNOnSp+US(>J@Cps*98P+SSlr^vSMl@ZmW2klSGksE|3@MoSXQ$z6+83pAjift|!ce9DG9(eq_|md -IQChND`d+rko^G{l>&UmAP*3k6*6Z`DderC?WYSPO{{3dGQxhvi`_TkbGUdY^z>k@t^9=qc0_U(5Eh` -5G)^Hjatkq^(nVR<EC{^QY2M5p_+AESFJEEXD&RIvX|4f@>EE2bHd*LL#dVEuhnR^(mr7>!}H?|k5;E -lHl<NFFU6HH89DQ8GV3XpnJReAFtfyQS0R|4im_8u)^4@j_&6~7gsHMr1z>7Tw3U3v+v;51_Rfag!G` -4-k#iUNZCp$8le#ZYL)~XjIm4fspz6U>p!?aACL+E)9-+&gmqXI3u((x=EnMaNsxp>rrY?`^&J@9~+4 -?cJxqYfal2Ul$>(Z8*zb;)#<F#@>30F|fcB<r~fGu#=qE54tx8;Np6%u7Nl60xmbtXBS%cr5G?-&epC -BGw0*$%B5fjh7l*=?!152w{~y8l%uG3Tih6TWclH!qLIb4yMZM$^#!<6=zr6Li6g;FirBd3xgF4o$1c -P~lM_AdMbdaA9i?C$lL-Tefsvw2la0)?_6%MMqD^O-GGjUqAiZFL?k}aJY7GYtj-8<lC=*E?uWty{q0 -3;?1sO+?!=Dm&o6$r5mp5!G_d$6Mz2Vt<3!7Zd$zG?}gBG(dGp7IjBfaF&}*{&?!l|Jas2_rMuadVbU -{(pWYb*)Y`4oqjR=$Lsw0nb~*J0-IgwVKlGQnt^Hea4evxjp{*TXYc4p8mKtVlHl;i8R7lnU%(eE8bW -Sagl3UjGPGBv6-x+`5z}X#NNt60UiG_@6Y?PfSe$fI)$@y&P;_b6D->Zad?9)dsdbSwrMFIv%KX8)2- -q_Xt%Nw$>OP`%cEN)jDEq6;}P53yPRV$vaduqvdB!8+D8hvMcYLg!!O6XKu_h^N_g3d)xU86h=zBd&d -TO7DzOGgOvJzw%Xt$5s6IL276KeJJLBqUeMttBT!RyF1_)S-F7!}TlZ|4KyDNRdOE@>Ll<3;XNPMA)z -z8|X|@o{QXMdz<oZdXn3LwL#O8Hz4fhh>>Ui*{likvNkDg?cEOUl%<TqITAvXs(HenwWims$AHfH;Du -Q;d4;gH#^(ADH07h1Ek$h5cR@ut=A8$%&u)?P#5eERHz#TtbVC7jq@0neO}eSq$jPMrK%W2_r17s|U? -=kGa>*Sr6^>5dO;)nL`+OTM{X)RhV~iyjg5u_KrKD!XoBP;<^i^G7(qmijyXSmTlk@pCV*Xp9r!?qtm -XjqvIpDqUb%hlBO*V_vNQ3CN9c$CfS;so4yFHz9Bog=hg1+3Xs+=<UOyR73a(iy>d71lxTY7<O(KRV3 -<_MdpvBV-;(0wkKbKjj*)(?vCSAC8)d@>5h3nwJbOW0zjn=m<+l)F953#=JF0^Hy@$&RwU<ONw<x3Wd -AKS=h2ETYj5a(h-_c%EAgtcysj_?hfw_*}ONdble$1TlL4CtCVW4Sk1pc523uBmW0bO9KQH0000808t -rnO!dFKJw*fn0L}^k03iSX0B~t=FJE?LZe(wAFJow7a%5$6FLiWgIB;@rVr6nJaCxm(TW{({5Ps)ZjF -J~fi3_Ptl}l5VfJsonMz+yWo-AXJVU_hR+Fd85zrN!Oa12B}r>dXgnfbo?=Heljm**dNvY#goOeaIz@ -ojjTy2C%=li17FB?M~(SFsfn5r?5n5SWHc{>?a#EU8uylg(=FLMMV5Mv)_YM=m$0K&D{Ma8SI1M#s?x -$&_WeU~y!a6q;VuMym3Kh+!^OWsem`1`}9rOUBbwkt(=0TS~Py&>nW6e|L9F6lcRN7;p|=5v##Njp`k -fs*<4;MzLjXq-yKVJy`%|k$QtU<1587xCT;az(|;H&031OergS8OBJbY(WO)&f|jZIAYl)%l{v(b0EG -$D6+Jb=KqQi%r6PPL6P9iZQ!WxJr%-KBWqQ}cXJ-LZ)T9)iQJ|t~=J}Gdn7~sOqtFPEhD~A9>qDo;g% -H0M0%J+^Wp^I{8TpIc@2E6c;Ku6jvek@TkP6z7DfH7cHwCamqPM_l8fu5M&bHuCX#z}?v}@`;{Xv9O= -m)J4ED>^zY0kUEK(X+361=#J00z!0d>we+zzJR-D3&@+UYcLU#Ig-%L`+qwNSG}NCxV&n4POW`c$!Qn -!E2#@JP91z_hIaMFo5~M3ns(Gbl|~!;muv&wg7y@U5krmo@?^H#VJu{k~*27i5S;a>8~_iO#*oW>*yV -6%rP?BD2V72*=&DkhFpqOSua5j4SfKXf{>;QABxfL(Dt27msk$-?b6c6Ru{hXDJT+eoJQaie9Tg!9&; -&G7oMaxMd)lm*xpUQ-@ESr((3~(e6oD@fbERF^N3uwTB(v5Sn)bi8qG$@B~?$;D?Xti8GSVK(pU$g$Z -6^8fWpJX$~Uxaq%w-vOknx8qovPAtaM??D({}V^pvqRu7+gGSnF&Twg|?zp+5^}?#Q0D=!toxb!o0-w -HqSo9?&@e*RexdG%uWc?h`yh&-&6T9SNoohK$Zl7`8R?v<4K9>956oRC1FU^~=MYMcy0(zCKAx$j --B5l64XKG?whYUz6Wozhej`HB%`=p7uevgPr{o>_yx#NfV@<s(_aC$pl*DZJO6pY!MU>&OAcZDZ0xoi -sUf*7P#=s-7%A?h%=!-+yDPmHFb?IOl4C!Qj11P@sxHw)r-@#QpyNZjkP(?>w5crp=eC@c?z|p7Ngg! -QQ+p;~+^_r;;ZQN!1_S>)=Hwb6;31UgVnr{s&@_$P{34EgZq3mOK;f%sb@W15u1G>?t=?Qk!-xcjhoG -XRGluN}?v^((oBix*#4+S)~@TW)Uw_3+3_PQEHj_kl51{3G`{&<!ps8l0G$`TYY7D6h!|KfVVa1n&Ti -)YizboAd^d%VO4rH5rc(r~o>x!~*#%WHLacT#k-F~7mDO_??Ls^0SE0ld08!_k1(qWe~l{(Y*r_I~6V -@6ScoasL2NO9KQH0000808trnOh?C%*SP=y0P+9;03HAU0B~t=FJE?LZe(wAFJow7a%5$6FLq^eb7^m -GE^v8Gk3CBSK@ddq`4z<^cb5!;MhAk37nmrhm@d7$y*rKbvCQ<G?!R|APB5&h7re68nh!4(F^?@U_(! -T%<P=tDMwPe(nN}3mB7BxKLp|fnrAkgnE%scHCk&p-$ZDpNBfdqwBvjV6xMc;U5trdgp|*aZ;frRj&X -^-L^|>7JL<x_9(gnkQq~!X)_%KJ3;D#Iz#%|W8>#i1EhkMvtcjNA?`8>V7Kfk_g&A;8%?S<}lZg()hP -)h>@6aWAK2mnzTaZHm2*D?bD00031001KZ003}la4%nWWo~3|axY_OVRB?;bT4CUX)j-2X>MtBUtcb8 -dE){AP)h>@6aWAK2mnzTaZF#`t+|&3006QI001Qb003}la4%nWWo~3|axY_OVRB?;bT4CUX)j}FVRB? -;bY)|7E^v8`R!eW=HW0q+S4<r&B(*m40QMq4hql|t0^4n{O%ID~pwJR!6Ol-Pr0g0&{(EOgNw$+XSRH -JUGyG=en+J9F!+CGb`BJKLp*GO%+*+$>Hk(ENlty+Awrg3g!SM%SK`Q~;K&y>_S~dbY?$#E#s=$a&8% -HYO)<PPngcGF`RU}lYE2&mCihlc#w_PK$EQ$c1cTldm35sBKD?BE>Xv8qI@_M5vgRNAR-rB|G)%z=4x -HXho)v`hx0xsD5NqqvyfZI~a7s{9HB8ooNp!667#?%?TL3uR?>4uOc#w1nOJE)Cr!8#0uMV_F@?-WJd -yWWVR0ND};z?W7xy%R-P&k<HChia;HQmZ-iN+KnqXrvQ{H%QEQ(yTgetQgmJX9p_-QKN~X*a%}0tSFA -;tkf-rGpb#Gy*d`7Wje^4Ksx4f(EN84d>8~#6jh?eELvX%WJ=dbBbBgoP`nj+?74{3%#%)p(Ek^KWGL -Xs6h^%o0G9NMDItcJe2G~es{(Y5%0BUEln@$e9qk4H%R;SWNDObmJCMN*Lity48dk^)VIM%UaK`OAF& -_CyT$5#lUhbT*hp-e-2A}bl#Dh0jE=?nR&S=-;9N>mC=;cxTJ>)OROj0ka5tC4`pa!q}b_g1`bMF{8h -VMMn=_Kx1EkyNf^9<}7b5~+*>fTdEEHqko#ERt`fnCWxBXw`6Az*>UZk#OphMQ&wy%lxefUIE~bTJjb -{QVc3OrWG^6}J7}Q+k%D`w+rqWuvVa0yM(*jl(#47G9$P1PgJGK*XUA{jo|=CnQ+t4AV%&<Es<xn9C% -cLo8PcCr+G>XaV~+9+l#|J-7+=7e8J+W$<|U^rG<}ubyItnP|C7$c6bUaPy;Rzxx@1_SWLN;IwG0IN> -7>pm6TUt90nUmP?i3SlHyBF$>Rn?N1!MNEk-fwlsr%5utLA^tmvWkyPxFH8m2JD&}5P#|=f;8GIUgZa -O^2u}M_hPL#5iq8bMKXlp^X*h`vlqLQO?xWA{I68i0Bc6Wad(o(rqSo@e?ULAI5@Zq5EkD@$-Kd`}Hk -I^gmk!i4^#_`F19^}_vl1y$MOtXA;^SxKv@qGs0UN4U6nwzBuUNK%(#prGl`<o;_U0!R^bb0(c`LSJN -U+rfaHt1IO4H57lsK3b{(^3{rc{Du<Ruabw%fj`QzTp7nBcFIAM{aN@iOn)jY3`eq&Ep^602oZ=x0HT -wZs>pC12FBfWnb6A+`U28VliBDF;=4=!+AXIoOEE&$m4ejUN)=L0=C)ITL%|s8cb72SUZCU{*QdHzU$ -Ix8r(HaZ4xk_#O!cJ)=XON+%8Fv=cK>*li63@`_Bv0D@D0H`07D9UP~C<Ml?GH*Ek9+%;2Y2!khhi^X -1dx1GufkF~-B4=X*Nbq05G=htMB1{&8sX#_ODb6IkMSaHo3{zHk_IFD_xrmGh-ICzlW1Jpr{?koGq<o -BJNhhb#+Y_P15w;@S5^jR%;YcQo*j$)cbYeoN&!#6>~luPEZcs-J~v^gmEb0|XQR000O8Q5kVeSk!4b -vj6}9@Bjb+AOHXWaA|NaUv_0~WN&gWV{dG4a$#*@FJE72ZfSI1UoLQYO^vaN0znW&^ZAMf1Cw=7H!w0 -dR}YoLWCg>aSzB#xc3OJcyW78aMTLusdeox^P|3AZK3@#BlF%-gV2x^#I+%_prH4hmgmP3xyk&yO4W& -#4WFq+5RI6RRf)hvb?xfO!=fuVsx!-bo6*YK}0*>@dePtt26k7~NfA(@QWqw<qqW#MPo9_Z@>tbK3n` -Y5}Ta#Z-<@Bw5^k^@K2XZciAJWW{LV!68$G-Hlp>uaoO9KQH0000808trnOg<H-UyB0(0Ne=x02}}S0 -B~t=FJE?LZe(wAFJo_PZ*pO6VJ~5Bb7?Mcd9_wibJ{o%e)q4?Odbq#9I?S|rn%t(jGNFB=m42qr|ozY -d%?OI*(Zsk{QFzU4#sf4X&&kaK>O+YcCG!^=8E`Peh_SvDDolWR3(&?dn!~42hwxgewU1vW77ZKPw7q -qNm&G3LWf8IGM)IrY#ER>OQCDowr#BvCdoF7cPWq!a1d01B*WQqLZXBU8YvJY%3=(vjO2oG#rOszX(m -hv@h#&tm0fEIa7z-U^4sfc;N3m@&T@zu?Pg+gtykAtHv}2c96~K>O0axPHX!y_r{Di#Tl1y=vifFQqh -MOBoEzL}#jrNjgenVleX^xj?OTiBB|z;2CtB_|B9$mG{B3XTf+|6Uis4bU%x9ga6XV|AA2xm&9KSJtn -KcC}LKz7F-ogWeL9Z$8_9g8H`;?n94nNEMsBbn(sl;Az$$Z^_R`&cCM5^R!-7sXFsW5CwNY`atUspsW -K;-V(C}8Viz+VDLp-7by?0Kgfy-!$_5DoF&_8A0ru@ZUAGfo(niel5LVz}CaPK-BF#v?dU>zv4$0_YY -_<ft^!iyH8g>;=uyD`d}9Vs;q^7EZyg{k;QBb<|pCf^ZbaB1p`{`R(hAtqISR+115Dg_2sjWrz0JMt% -K5(;cAAHlTD}Mz3SI?TfwgVo&GHkw&fEt~YQeWF{^<`1t8XXyBd{c3})|Trsqd#PR%T_8RJ_qQ0Lmo` -#F@YuJ9p9u57Euc3}B>Zkd#Wd0bq9dh`8`oYl6FzV$Gv%Ig*#rsS^>o_2#+GvU;o^)(L`i=n>!MN5+1 -Y85$ErMWH2YLqh989P4ry9^Nb36uTQl0@GhIheiH9Q607{LELoSiY=8sO=EvI^?JO<C?TSk-}dmO-w_ -Dgk`9>p@#nCei~AW}4!}=XoX+#2qtKdH`~?KFQX_JmSE{RK&%MPbYWxD|1$1@TZY~=TrcmRS`CTTLI> -*j*MOf6lY}+1p22r9)nT~0j~nev(gv>Zz@2aRmFH)0p_fZ$!}_27}4naPk6y=@`Bgo1+U2qUXvHRCNF -qRUhtZ{;5B){`?X$hohCE5PLms4r^ybk)8q%&X)=WCG&#a`nk?Zubx$nSA^ndB#6lBGEfX0}9*zfF+{ -0|Xco<I0NU!QaIGpM~B#ve2XODr852CiEJ$Q^6L$)nb!%M6vsBIPRgECmY9NN~uP)h>@6aWAK2mnzTa -ZJZ!z}avL006`#001KZ003}la4%nWWo~3|axY_VY;SU5ZDB8AZgXjLZ+B^KGcqo4d97O8a@#l(efL*j -#}A~kw90lKw#r$ROI9?ACyujaJLSzfE*4Bd5+@YMA;5Jsmw(^x21tSz(c0N{RZ6^|54szt4=&6ho2A( -{k5_BWeo7_RYcAP)p6f(x+3E4g>oL2yeal`S%@STH!IC%<Qi*^mA=uUBY<_(^XUjMd<AZpUrMYIgD6i -C3m6xeHI9TTChK;#YF|$vnaQ$PN0~%gk@aUVly4BkR9@39Bdyb_R`KGkIkL4ZQ26!<`lQgHRmci@OvN -_x=k|e-ip2eXSN*^2?l$aBCol5X}Y1^?_F_~(5dUn9zuWo5O_D5j95KCwpDxC|y38N%cV&R*+k+I8#E -^<j=Yp%G~xqTln&$RbOEX|pDI5v-JWFBh0?M3XM#dyC3G%gn<oOwpBMhRC65{l37bDm`)_tU4JMWijR -=XvytFBRh!g88b5){HB-U!;W|1&l{JmMeV3na*J}GoA~nS(c~Yw`>W)@FXE9bTED@v;dn(K=&M)YDUA -e5qh02nD?B=TKFRmhGrc@PmuYANW_Y3v0yr7X^|7wES3KjIg9~|rP5qRz&F=zOjsDkGS*?}E0HV#kiu -L9EGlhnsQ7otAe^T}92IgQauopynSfSXy~gOE=PZYNhzm2f778e!*G%#aT&7D0r-~AuOQzSN?6^#!N% -OceLGQ+4Shkv!?b{8k+mO&n9m0VV?Mi6uyb2hdb3(LCv90`Ox3+Z+X9mImY4Ke<Ky81<rY*IqsD)*Fm -)>L1^%LuIlO<vU8Aak$<6aVhMnAv|0>mPHR#>Z0iIBrMW7F%~OBStp4&)Pt5K8<~2%v#7e8Rk=Ljmz0 -DjCR{6<XWD1gh$-g|u;?3CM}mX<6YQ7t2Bdy}^qJNUWL^Lnp!+{JWXMh~#1%rJD?d&-cC_AD^6mJ%0W -A>x1u~pM72Y{$})Q<UjDEU#Ca^dK|&~({m_ILl~g4&eMe5+6dSs-Y<&CMn?U7x}6R6^N9V7v77Ue|Mm -Ov-x__Gem+5sb4tMNR%wWJmToqXor8S~W`g<`m?5y&ynyi+O6bXtJW--iP<LJG`!dZpkjX7h1!E&2Bz -NXc<oT${vTjj09jJ9$BtR9x$OUi{bYJ1{LNL5YkXcKV2r6V|Y1-<ciU9hkuH9ZD@Ejxy31uXWJi#=A7 -Fk-^_?pNz=1EIstE^(9QQcE2!)HTvFiF)I>yb?+%#+%4+_^_yD~*&!m!LYP|F~q&Y5omL<Vi#{DWg(h -3rG!!u~S735WL&)Ets%Ek$^Lt(O^DI0GMmgL!qPxp%ocTnRRath%d&gF`I2y;5xgr_M<US7}|q&M;yF -~wWnB-;lP-(G|e0sc;j|s$~#>MRjZ`opn_TqZBwF!lQk@KXFm5w{akSrq@@}4c%E05kVInu!PL`#HO} -;E((fGb+Q*5$vm&qzFjKQ_VP^L7&8Wj9>V|%IL}ji@Eo+5`s%909gsc%?Y112F`Eo~$P6PuncH(P>*Y -2ZHev3E)iC8jPCK4xD6-%kkX6#`x0VM<MQY{U^wjsrhImAaW2Zqk$CRMOvo<&{eMwrf<pqK@EUP6{i1 -zD`std>?YJ~Z2sx;jc(&L{YHmlwj6HWm*}q;LVVTtTWSg;<CMl-H6iQEvk*7qiGP#I2n);zJW04iJ<% -UoK%5rl}sNNpBoVV2fC(f|Mz(aNI1QSlg9w<xvhCi*xkp4qYbHm5?yg;M*rr0nz+`N+eTxWYvge3D>Y -f+<<fyGQlNbn&E(g29;yWlUQ$Im+`HJswEp%z0e0_0NsF^hx{8c`}WN96)^>8G)ME@WZMN%gM&C3)g@ -QnwI&7}&^CoygNnN0;#zS+?Q0g8b>g?iL;S1uJ>#4C?ffpBUR|9r-(rl(n~>ukW)uwAUff*1dw=H`Dz -lX;H%GR?AjaFvj{^YLpKd-*uLc23lRt}r8^ZC$)pYj3L0Hl*vE1yL*F*L<^S8UL;pLF+yPNs^dbc&b9 -<u*3zq<N#zZ<~3ACCU>d?@(O^C9bx(|7ahyXkHK+h7P|_GLPd0(?7UegFRQZXf{2;FsaSg97N74_RCx -sfiTf{GTt-CLq;)5e-N(hz0NWL?XfrVo{4d(F}VA;Y^b~@sLd~B<=HjPb^EUK{(rHPef$eARIQ>6N^~ -+(l~q>1j8e$jy65fxz%3UMD|T>YFY2rCbDg7Q_Ffto5;SSO)Y>yZL-lfw5b#PPHiIVt~Rv*hP8<>TH4 -eC7|<rNZfjFFgS)iJ4qj86jQNnoE^X?g&CBHL*QPFs_C)H@ransTiPoo0y#(76ud7WxblVfFSDX6Dw< -ls(n|i3YCsvO(^$@cc?2q;W7q?LUen)%dvbDMVwTsx+-q-AU04jvVZFw4KPXWtD0v7$fX0%yq931X!v -`h-Mc9!s^kJX~Qr-N#FOo!cN;Punt)p`#gF7nNK-}g3N!2IK2<c0|dxG!>&w{vUk1~+;!Ijt>#8%{U* -y<_TbdG67K_KT|+&xo+8Jyvg>)!B1C+WT?2r4t2b3p{YxT5jQB|7ZQ8L)Y?j)oeQJbDjENwe4(F<cdz -akE=)I@1!wUVXC4Qh47=phHLzMV7GV9S?zcUn@`9>?zi$pfoYyY7((LN5<!er#--m&Ps~2-U}G5~l5a -9#oDK|9k6Gz8o@e;4Oc$#>Ei&bgn$4^5!JGD}=wR20kS4Y+Ssa_1D}fVst0?d}`#ZkatBN1U;0&5S?o -rUSbB&}J$LKT%DJWNX08J;=`&O*6EqMZd;dg@2JoPPBqldn6stdkl;X2;JHm>*f&~V+hKze%bm);KVb -&(~)hnn%T5nAE6!qs1(AV^r*2{AoG7^f>>Y!YkVd*ihT^}LP~VNgsUFtVr3zVYv{IzI2dt9-K;e`Wqj -FeLZ=!MxyhE7)cf<vSa~1RDHzF|_jk(}#`MZPf4`#lF*mG~Wf9Ud-OUh=kc{&(G$qTMjk%dKuMECj3^ -=4uukpHg&Rl6H>KlpP2T?gNJh=ov=+h77v8=xYG_yD)Wcq{&p6+Zg+Cl-_V}(P0SjnI+UF>&uF`YS32 -XrLi>QddS#GWQ+k6Zt<;vwGLds7LKWqrVkLxypDtf=rqjiT!7h?mivO_#)EatoSk5k4s$%-UdBpgWN| -Qp1UKeoTWK6=+#QO5595J=B!;xGhT*LCD;fSn6r%jqeHU*<13)ltxF4AWiuo+wd_hC$-Xx_pNE}k1!- -vhP<$ltsv_yGmZj^rp{-i5uRn;G5!+A-dszy1;3{qbO9dF;)V%@bezTqx~hM?*R4&Vsn0>0Qa~Sl5_u -!~chMja^;QOnyctkD%~$iz|S~9%XM%&=q*OqG>C)%K`jMZRv=Eh__&WF~53g)^VqcAKv`Xt?omZAdm3 ->2gnsHOk)kR9(4){hV7IvUnx?F3sk2~AI?dQQ&}(4=4a7Z^;w>_JlLta$Y;vO@#&7)!>vKWDplabS!L -O|1PANjKTt~p1QY-O00;n48F5T~*4QtF0ssJg2LJ#f0001RX>c!Jc4cm4Z*nhVZ)|UJVQpbAX>MtBX< -=+>b7d}Yd5u&}kJB&^z2{eq)WfE$5WyA+sZu1M6tM{HWmj+jRJqNhH8^%Pb}0Gx*v^-e?b3}@)t(uT- -<x^k8LZT?CcZxy_^c!|2PWYYBO|beo0qQ^DZIb`0E-tZ!77a)_ztDU1T-Rixm~UA?$=Oofoa6cqap*$ -;9qXK-A+lnH-c|Fi>`GP6{Jc?nbh2<6PJq{Xua>O=|O#SrYMS(1-8*9SCxSb?v%vdghZVwIuSb_F`q; -R)-brix5@3s+CDO&tue~6078vs!-R<E%Lwepix3ZR4N@7OX6f8BxYfEsn7w(u1hxHzJENiWrQG69mFP -olLBLl8+Al~M2L$J7aDR)4OKxIT8RcD>2b;K>{y{RC%WfNCh#%XvqntfZg_c0az(IC)U^2JAI{w}#>{ -GQ_ezv^bM~vHce`TV=HIbtD$|v^_+_Azc!O}f(b8uNfnFA6q+WY&j=FR<kp|(uGxIqbwTN6eG1xX<2b -(3za2dkvC*^Hb`vs-6>)K+4Mcdhho?CGADkn^A=Jj4Y#vd4#h^l@EI>my`kJmNL3dICX1+?n|Vup{(8 -z=67-1l+_tI&>MZje7>*u!X^Zg&GXZ1G>g&mA~iOAjSO%%qJn;ygG5U!;zyOk6~6rb%e8ezIj3PG(lV -NClfTa8>usTJG^vhyDXVxdn6Bbr-UL_vW;`Z*LF^H0@v5SPj1ywaCD|F?=e&lAZm^x_q&2iTdKg-m85 -^rCKZ|p_HvQN2hOB<Ua2PY-k=NB*8E)-+K9<?7~D<a<Ju-2NxXYI#}{SO>#}||2(c$lsXnMm<Qun*gE -!Oj_LugYZLBx=7(!E#Y(s1n{sB-+0|XQR000O8Q5kVe4Q--5Oa%Y{^%MXA9RL6TaA|NaUv_0~WN&gWV -{dG4a$#*@FL!BfGcqo4dCgaCZ=*O6{+?f9wb~2pQPh`j)%8P~rq`UZNfokcSF05wFcj_xj%?F3ce?+6 -V@$v#KsQ>Qw5W>8_?huM!_0VmN``d3W${ZS$R9NIMC7I9!DAwUExA0uxU$Kub4RYuhKZMPAW7^)%E2N -WfK0~2(bO4{Fiybk^-f91=!$IObm?)hqn@+4n|)r88*+AWAzw!GdH!<Q>j}2K?h$<A)tWLve6d{v&n3 -AL^}bu3#7pL}?Sy&(upES&1WAI{YD<Pvv!CMhZZa|3%%QT{4&HoN3t|j}VDT~&Fk*}{i;Qzz{$gI&_n -Xoba)|?CNK;M|SiqYoEg&TER?EO6AKmK;jr!g?b_H<JfPjR<b(^=#ErZY^j$oNDGKR7DT|e^B&Bxhzx -){xSx#n;-o8O`B9XZ?0C2G-6JkAj^b!L;1>kQ|k(bT>De1AWhyW{Eo%qXoFeC2a;a>8>liBoCTr>Py; -C@m3g7()_p7q|Ud3gu&*1RE#*8%`|cmuVd=4>QIod!#%TF-=>6n=-N-F(tXDCM;+8;RCwSfzGGFWa7? -8!$pG+pS-ttm93Oki@)E>{{je!>taY;*Wi$ZTBzj10OOaEzVRWjI{(Z*`9O@Cu6(3PTZPU3V%1)s55V -PmJ&c;--a@MhEx>J%U0m%2UGIw~5Q=@-Efs>U_N8;#WZH=wd<%`s;aZ)Jsj}St9fTu-2M=o%R4HK5+J -6B{A-TG=_2oka+hZ@P@bqjh6X{N-oJxyt4ay8F8*zF8J`ARJlTqbb(JmaH0i?HC7y=uoA#HZF1^k||c -StCgs^l&@h|%5|%zesj8#e^tb~c+7^xM1TKKB-6r<o&J*SbiJUz`2!C08%HPIh%@x1l5X<t?m**Ph{S -V)t>96ne8vtTQphbI0=qut5X24)nX`j$~MzfSpyk7YRMx>+pJtcR6`vw7Sx~9sHiLA5ZrGJ7UMz%_7E -u^QpTVNXVdB@tu%N9*53i-cskvK&PWo-r}Y4e@f$Ow!N;O0)~=m(}S9N8(=6cVE?L3<aD7;iH0^^M7s -m6aOA7nrkYHAzKn6XW4<#>EYEx&xFplj&Fj;N+SXE&s3A8qD|^M*v!paJ3fpGIsACHpq`+Ibad1;at% -Goh{i!%hX+^c=?5KEJ#6uxJl4r43+tFm~996cP+^M&G-Jf+KL+#+tjEkEE%k&$-x;n`6zF>UZNvc?!l -5t2x1Qj^ugl2-!kT5TOLDvFGQYxZ2eX&cmI4l+HFXXoya!x3#M9;aXX~5Pt9^_7w5Ea#E$os9duQfe< -E^M*{bcmdv$;&FnViVylmJFuOSQ5BUV!N(&X%l!`gD<3}@n&t!njT(|IWe}@n_20pz(U|2#8RVwMlLL -!JHDHGq?D0*G-~u;W7x>cVxJT4Gm1CWwLVysb--}<jtVFWv7Fg!$_Gr)@n3Jyro0xsgM2QK^0uIbbPh -aQ0VW4qdFV2uvPv<wKUg4p313#ozFS(gw4eHVy{Kz<0_ls0@NyzNCXVe|XaNywelg^a4S2B*z|h)@+C -V>x@>ADP@(Pz`D|f?UAs{^jpX(($r8tC$$P@U3*^Pg=b8sd%4)O%b^VfLgXe9s>yB?lFc2ocC7>}A8X -hY0)T~+h{u(@iB_N$j<(DAWan{E5Y>i7Fyc1Tn#Sb3M%Z^_utHn=FSp}0sX3sfCh<QHECgFh9Y#Kb+0 -N)E3+FIHolAy<Cl{MeOXM?f2Mqa^%Y3DR`Z%IVDz@>lz|4M%1^<rTo*e^5&U1QY-O00;n48F5T^duJi -y1pok&7ytkt0001RX>c!Jc4cm4Z*nhVZ)|UJVQpbAcWG{PWpZsUaCz-m-ESH>5P#2KF%nV(E#V;P^{S -Joln|QcE`<}MYV(Bl!-VY_8+pAYoT~fVZ~U=~y(|RU=5!CoOLpw}_HV}H)S$-~E0NsKB>cu%AZG!CcY -%<Utl+fWIcvei_!7=edNjyV0yK#TOGy(_Lg41Q*B^}gFij|F9ZdzFLkp7mf(r@Dgq@up9Uav`uOk_8) -|wqfG)PnUn6MtFT-15^nMAVj>k;7Z;^w^fJO1rL+tMHUpy`gLuSWg;K+~t1?%kaa%>J3CNBv7M^h-^@ -Kfme^ZqJeaS<`p@o15WBwf`#DcW3y2+2QC|t|;*x9SleB&u_r{q0<lTHq;<a<{-&~Z0fHti2l46JY%s -5X>@({?zTemHA;r&93By#Tws>2M#B$-ODp`^H*3{6!s}peiI}fr(OP3Ng~=pgiJVO8DWOvvr1~kcH9? -LbqY`cDQ*B)l+2btbl#C-m2)oFpQzEX}l-CWz`1W%6;kMCQo=Yi`Fq0(pRi;Ev0^CdMo`puW;mMQ>g4 -WHVBDV0UkPALVY~f4Qkrs@aDmZI!&47!T2#_4eJfneBP*<7ne}aUmB*c7~HepF1<U;Tz$Qj9xR%>fH> -c$+m1G!caDdeXRu-KD<m;>VyBFe)Mt&<>{0Y}ZE>1acnQm8O-V~znV0)hU~6;>o7*L5@n{)LF8NTehT -!WF#5#Qk*PW~Jsju_>UDkM71KZIv=fHN;e*78tts&eQ>sATkroIX!sc91%Q+&MRE0JBI;ZT{Dff4Iej -6_!7{JY~a<xMQ_40EN*|>qNHy2-@JjBjS8+DBe|A(-U?baUtgiL;uNOivLM=NO0CPBp=v~z=ngpB@O{ -6+P+XCzz`Ew{mbeS+DizkS`qVa?pwrrY8&K8B*AD3g$D_o^D`Y6S^@jR+HR%>=^<j8BHRzY?YMIDcj> -NH7km!Z>*EjFN@N2hx6a_26h_(wp>%!mLBsUVh&QtN_BwB&WCR%+SoM;Wo%0zoj&Fys6unzqK-<4?hC -i(uHJKDZI{Z&d1JPBR6_9*nXJ&T>`H`QL5fB&-Zu8=J)qhjv>_Z?0XgsJd7g3yfBL6|KY#JW?j`wGr| -v3B0Q!CmErWnb~8Tz@nwIP79EFWlmQQp^N(BWnX}_&3Rdr-@8BvpF!VPPqC0K0}EWZpF)9CQ>f`u(D2 ->T#!i5w;#>jj+Y*e013{+1TSiAVC|DINJ;G8#OmrS$LH$@^02@`D}|1cZf$tq`UEfX>DF7n^VjVans1 -lTqK%d_mXrGcr$}Zcc5os(o}1Am6M`^FS7ruD*u9>7a&fFTHR}*_WiSr5SXw1@&e;`sEWB@c%qH-E8K -wRy7BJ0SbdYLOAH<)tRNBNpG-0(X-%k_6&Yao;D431EB%U}@br*Xo0vDt3&^R<(8#eMKn~-%9iNNBRq -`GQt4(B*?cH6tMSc5jCGoH~H2WAoo^LkTgG-slQcSRAbQa;t6#)3PVclJ^dlKX@)1@^6qPJKnjuuMeG -+tl4+j`OvnyWVMbp1J`?X_y?)BAt*BKspYV&DCoJLyu<o)`%n$5ur3yPa&Hu)f6Dq+SZm84?ZjH!J-q -&7wo~~<S&AldhXG8CCl5bhD1-4xmBCaMY*LL^M=`W$n7rp5Y`1yz4OUE5Cu}`;v1+m7$b@%`u<oO+;Z -=%9hH2d%Rq^g5_eJ+OO+p;9ex-9^oGOHWgY9P-Pp&6YKw$AHcx-F%_43G5YvRx&6+ZkY)Aw4XIg4bZ& -AP^eVEBbCVM%EiuQC2$IX%tO~-w=5*R-4Q(FxN<j1L=S<HVnAc!J8EZo!8V}5MTKIMUIKc}{z0N$>db -eq^x-^YxQn8Y6Eo_!p<6m%LJ?V2WxJY}<1`hP&HF00wzsC~}=RyTgaX5%%)lSA6x0qtf>n|-VyJmSl@ -HlpwH#$@XM=2YR7_b8ExEFQ4>+i3?IuR_ghxQ_k-P)h>@6aWAK2mnzTaZDzhQI}l-002b-0018V003} -la4%nWWo~3|axY|Qb98KJVlQ7`X>MtBUtcb8d4*BIPQx$^z2_?|?XVWHYD@^BO1m(Mm^5u@9bBudb=y -FjRIUfx-{W>2+Kn6%`{nuhIT^v^W&)|pj4eVqa6WnL5H(UGSh(gyrYIS_g%7jo-E1P;1AG{(PY~-*(* -#0WnG|h{8L$H`5#CN*It#JO`9~ANi#ym%vk^=JB+$~&GMW8>on!?e)@ZrYiV<P8Ttw?Q3i!yNZ3c_Yd -beFZz3(>LxC4c!Ox-wQs9aHqaix;v8>y8RNdj{iPlH)-KUONOblbwSX}L1{=$K;D+3@}%KU5&A5tdR+ -r*oQ<t1r?pbXp&(>Q&rSNDBLMSoSv&k)ses(2y=_9fEZ-p1A3y&IYcEy+Jn^^1(s3GR&duQLn`+zXih -7QRatdf7dju4gX6@2{q%&rC&W&DBTfM0>~S!okgWOH}WI%%eX;-yy`J8Nvy6hN&JBn=q$SoaXpalt6x -w{0|XQR000O8Q5kVeUkP(yXes~zVV?j19RL6TaA|NaUv_0~WN&gWWNCABY-wUIV{dJ6VRSBVdF_2|d) -qda=y(4LtUOs!uFS;FOkaFQy^}i5)OXT28#`_9x*nAlDVsG#s(i7d$>zWBc>zEG1SKWiK6mFn>ko+}0 -tW}@9Go{CfV*OUZ(q!cIL&X4L{rcAzr<g5c6WBgaj{&L>CJ5|g5!}md~)z~AO87Ve4pmgN}NZ(q{|SR -y-a6GUL~=p3sK)D;`OS&Epl;Q%<G4!OvH<#$>XR_;Wzk@lp=!h^14i~o4SB+H)WD6lDtM(=Sd=7o*tj -PIzI{PceRM}SR9|dx_EQ?&D)E!H|O{xwA-1N#X?M{^QLafWI7e;Vp){X{JJW#rcS2(eP>7hUR3H+nW# -_Is@mD9%hl12fIszPmF*<&X34S^r}WE7Sr#QXfoEbOUKM!)aOc=Ryidvs<~2?8d2#vVO8i+oJrZJ9EX -(L-5gm!VfT=<w>Q6YI!@TpG(=#=o`pzTJmubCPCKU{I9aRbcG^WRO@~)<b@T|#GU|P}w=1vmoi!@6vu -whh*IeeyG<~*m<>n6?WGzZ#28~LR&n;aMUJiU1xl@+qALY~3*C4Fy)4X4-9?2bAp65cj-nzb#OGNVrF -x%xiFPfgx_{-sEB`cN&iw3d(Qvjr?muN9~OzLp74D7gm^zcxipGoI2X0FbK>Wp=oX>f1b8Buq-*pK5U -k&Br+X8iewqD9&${9E=5_gTx%|5S%!f^SD7ZI?|9qI?@WrSx5N{o{SZ@j3&fx;A0ggIX()8wDyK0-2x -`ol)0P?fZs8h!*n=w33I3^^CtPV0pX#!7s~_)`}WOCIf-vCE?)D;URqF_Z=x!lJ!|UQZ($i`iR}40s; -Y;gjK90t)Zgm%CW+HBnbqpY{;nvD@f49xN+t)cwkm6h=bJH(aV~+Il)9~J;MukL)4N4hE@#e<|JEc8N -zbqNp(X6M7vH^<i$IU0ezC_{WFRkTy#krwg;Yilpc$4;4Sd$0TgYjhlyy;Ldex?|RBK*r{AqLBd6ZR2 -+kw8apiCP;a9I{NN@po?B@xDl!EI61hDZ(ugZ9}F|Ghj~BD3SGzhG1N1|we$M`C~fYhgDSj>XVy69O; -|_$Di^qpZcqTqiA>X+?P2OQhA>=C9`5$|Rf>izO(zVEFeS+#CG`|M|mEt{41UMD^?zn(A&L{lfD%k)f -ZD)XJl8;Z0dI%iv%v4m(Q|(H#qfva^!_;Ww!MwAe=J!`H61haY`#E}+Tj*$-v3TxzlD>Uy7Y?<n(r<q -hj3v=n%-L4#`{k}7%4Ql~#tO?OnkrE*=gN>*|vVyx>dyI`uqEzE%Wv&_N9*1uI>8el$AZOXro(w;5_J -4)1So1n=sTS{}%8Wx|;bainEiWl0Tw0cytgBCP0EuE#m4M1Ln?&xvU&n(AVDDsdrc?t`X&|It8H)(ZK -GgB*8@)M=wTOXAAqn9ark^-8dej$k!#{e1h{w%5!CauR)?bATB48*VlA^1MZ8vbY)0@Ud{t$#C(^9m7 -|vet}q)_IK6B6>G{0EwGLWn4`TY;*D*b^zrjqS*{q0DgiP;mwO<@%h2wpI~W&U}ISDdHBchX{)bME{+ -~QCMt$$QqRMpym^dlcwEkB*mYO-+~=Ogkj5lxRHv6$rh?ClTEw|+Vx%&E(V9-~UQ+)!4@m(9!_e@}vS -eN_3e+iOvWQZOY9`zV!ho^-bZ~Ul0@Or;hN?SQt|kZ2dqc|%wN1aa>1!jtD^9Ble3spVFTVQn$&rZei -!=s~<ta=>6tL=(@*ZL{alHaG=S_w5Ulfil-G!Jf$_1D*J+44&GDj)Gs7#1wqH4<fWQ8zcRYuoYTHPkG -17=xd>1-vUMFGQ{pT9&Y&M2^>*slWHQanJEnARu+*Wk4{0Lmn)iX5OPVs={q;-Sr_C<PnTk>HL(9Dv* -a+47Y^$21qSwxf9d>Rh1s9*KeY48~oSAk`zoW7q|&lK`&G5|+>cW+Y}1i;0KFMGMrGs~#>%@d7!@VES -b+5|fEuKk7Gg<eudLUz=-CE(>uG8m%uN;FgN;{M)m)FQ1E7XBQ%>q2ZDU&CX8*S|O>R6*3@3Z8lF)5$ -59IHl5uX05O8sf-t*{%4mk_3Vo~+7yuekWYKk!i2_=dEIil;WqKclnjeQId6c~4)Ir!?G5+B;$?<n|0 -V6GVD7I-`CE0w8GDGvA;d5B`IJ=dIi#kiH$^oY(*ZLjxL5Pl09tXqAzlT?!8H+B-3@k$saag_&X?+_E --{t%J;PHat(>&`wb|<uvg-=7L$8Tbz1M30!lJxNrNSrLLlQ;$lI0cXZVBoWT$x|2BTlHX$%~BY+%xO7 -CS^5tE5f`ZbXfgGZ8(j3HnnlYbP$V9iq^}Z}erG6J4=H+;C>EOaxn{Zan#UpuZ$k0#@UZtWql163%pw -TQ%i&LZ7`mW5fD*RWVHC$iMAq=AJC$HTK%d^^ph$(KWm*TTVD*X1OWTK|EfB;`CKAxfj&K0qXG2t3!= -J)oi0*cPkVgE|zYozKg{Oagb@t}u_}TeMCt`udM(l%J8ySY)_BR65n60U|E&KOLna)?Z`fIU=4fjL<v -yBtXWyDAU0EW&J4-7wDuXKMf4(G+}E~&$tqy{}(B7k5t(u_v3@2P?JzyjfdI{fnBOUehT)zwa}$xu3g -AM+wZjT(=^4F<pHH8K$vOeG(qng&+{d?v=x9HgbXYhrNCknxGZN{V@uW(`nToaL~b0ayj%fC$f<oYuN -S^9n~rCnz-O=Nb>BfMYkv+_nB$Fkqbr_@HCg;y8BrCUUS`s3!*&yw2YMZFEI^K%n>y)3Oj!l41}^N(z -1xl;e{(7t^!X7pG^hp1njs^uwEze|vlS=H&UH6+!7mI!;*yYGp#xL174npdo(&o%t-QUqNFK=)lkw$g -;a+H5T_s7F=G?-ANeCu>~0#u=0+nkqsP&mVkK$-Qovvv-3#JN-bsrHgegkTDgi2)xMlDN?DO-E6~*m@ -FYexPL>tqHbo&4@vC#Bi2w~$t{gx}3X5{qbEF$QR&J0*X(n-Z&K_Df*M8FMiXVUcvFqdGg5{+_wjVsI -8Hy}KiR4jrux!CC8fXt5VgqX~^tLhB%nlk!iyuAN{*$<_{(88t{x(YiM38}MH3Gl>z_;2v&h0=i>PNn -nIEag+%7@Z9QY#j0^`olW_>l<OunmnK+mA)G4A27}>q(48qmE}}A`e9WJ+OaNZopY#01?(&|Dg{XSVF -*_vH(98gMe0UP-}V6vlkSE>q!QB^&ufU)8z30ZKoZ)TbnTF6aZo0Y6;E;T0=~bfIE=*L-!4_yXqShgq -LlQ_2*~e22($<&St6utz}Xtizcg6K#CW2MW#YVW6Dr_fl?Y^3SLk>od)cZ@9o_^MCDE8?rFfoa5|0C8 -8i)>WelVaWXle@INPY`#gWLz5M~#f88Ie9mHUrRWnutvC(yxc0gk}}9F$2>g)gROe-r;9;M0%rX-w(9 -31)O{y8bo22f9ThE#Q1`|1tR?k$C;=;#=*BN*4?D9l~+~D@?e8Q&g!<(i?({z|g6nZBqa?Mo~m0P-U3 -9A3Ti~7G`-3f8}R{@-xme0`}4fo%x00XGF?w#olcNUo|Yy9R+Sl-KS-dlbskKUV{-~HUnb~qJs1<QwS -k)_7s3Rps<mjNmLqm;)n*Gra<kAV>EN@Kt_@pI4?CuM4pulQV3J9E|>@<nwb&svp7yUB2mVZq5h2Eer -EdN7@S8fN-${=np*J#_~pezWq?vmF!6^;Fd7%=!N@T1&|Vb$XiATQdCu}N@}>X+fJ7uo-lbJtLF*C8k -shG!?=>{o7N?@Xq!r+cP^_@!6r?>FmP*1RDU8e~O#{kMjYU=zcNknZOZf;$SVky#Rz@JgIA)GaXX{RK -ZxAa4M<&HA%Pec+L=p<ymPrN+^FEQ%W&oWvz)gsD4X#iq7e20LWx8x7GM(!QLt73^7V)U#_1T=zOWkA -FB|D&rk4wD2ZvZCxc{iu%$;7{4#`rTx2)60CgZQIYMD#|T0iLGLIY>!}Dp`&!6tNTm0@@li44UV`Lz+ -K59QeG=4&6l^-J!U{*92DdEHRcw=n`3q9{_>==o5BlqA(BByuz^V$++!dV9gjIsZM^pphcP>`yxcBkj -uCa5d@E6il6iV52!yFj66iMN5^6l*0ZJpGP4Z@KTY0&?}{-au>^)raxD9(x>+2U$U~ZCBEmQn{8yYzb -xS*LX*p}sn(Z(TH&~LT0)3DSTu`u#p)q<$jL?{agBo{5NWIbCW1$iyu;#^WBo|sII-q7<Zo&+4p{OJz -kTT}97R*rnI3ni(sV%t;AAQk6nsH<Y@UE<<UH{B&FFqsq-Emq#-Xu{jQ;<sXE3qmXAQ`%pObZOVE0Lv -liIy~^PXY{rrk%7|RI>zB&3vA|lQ{!m&aA<lH;}t3#4i|{kZmYPg@7&DPaV?Q#Arj^B*9p>0ztJy+TO -L4!>sV(M5{pj1yj)httN+`xH?rAjMreiF6HspFpA?qw(Qy(L<tB>q)2&DRQ~9QeESwTiYEZ%SatW?v5 -vBqJ4t?Rt^TBj%+09LQrSDZ;@{Kd3&OgRHD)MJ;I>6Koa;Uezu?ReQi{HRzQd(t|45fSUv@<mAaE4E0 -cy*yRQ7cnRZ(4+f$=-UQqw6WWy|SwIO=y-71W6Zw3Y21Oitd_4l?qW9V0que+}$L21z|$JeHVk<H2J) -{iC7A8Kj&$!Swq+_@vY8of%Gm-%n+9K5S-L0V40JZ>tIemL_R5!SMqI1I3JtT};~tq?IxFi*8^(4&_X -;d1>}fIzfdBRs$$BFcRyH-jL0<c!q2G`siTDA<32-@@Y3k$~T+9sl8YDF&o=BKQEBL4&>f2evypV)b` -1WT-vs3)rJu|soLS|)$7%elxti4>6Hg=>3FfMFDGL7OLQL%{r&zA;bHYO#<Dh_PQmYCwB0Qz1<YvSD$ -U`sdeAL`T~%Bk^f7$ss|MAu+F@qk9nm)LM1NExVYWmC{cA^>6<Nl6YdYU@tYB%mP|z`BVo*p@z$np#= -VRU9&QnxepUGxUeUp!PyF)$VZ)zsbYOZijHsmm-5+=&wgjfxpEZN*uRih;Gvq0DKSRFu?7T2@NkR^PK -BccN`L|LEJ%zN91vYUY#DNt?jKGd+Kpqg-i7&&=TyUJBH0GqM`FV!!Qs*#;u^g_|)Z|fnc@>zo_<92e -J(}Y+ht@c;Q%V+d4+kusM<S9I=2IA4$^f2Ptk_ZeXC7P!rlaMSPA4AA3Nw5Vmw_r&q@%!&eNGH)++$D -MX5A7z!Nex3z73LqUxNzz-tx3K)`)>O7;>DMoAZeDSax9he08i3nS|;`m?SK)uJepknRP6<q`#(K|SD -%drhA2#7fltx<jxw5FP?YHnqHY_k(?tqK2q@?@N9&`eUxu^LPOF{K77_+7(RI<(yfc}W5VRZ|wq*cDz -yjl<0+T3Q9vvKB>3~pelMkjCQST3|L<V)7hym5D50KCBi)o+u3H0*Ho$TjAgvkX1Od93;2RLY275iU) -`KPbiZ|WfxW&C7<cE;Cm_H97>4kW;^2SsCW*LWy`wQO}nFesBK&Qdp@tUqHi#_clFo5&c#H1bRhx8g* -EQv8$xsBViUYm-=V!;HI-VTzPjQx#1)OE_^X#3@SguT5Iw^30)GdDEcFgE?%*xh*qIIXPXS;5|eu3_| -d`5<oziwi}|lD2-I_sq{zD0BfLt&LVo3E}8}9RUXorOr#r`b3H+vi3S%$m3G`lGWVXPAk$QqvJwcr5> -($or&&nbp;LTI6$nub)3C8)npXChtXVLBPenGE3Iq7^P}DU%!_!K+Zm;37D!`HD9w%1kKs=u;_n#bo{ -uC)bhyIj-MKC-8)vHwF)h*RAMvc>ojz$5E#Q6#w(sx{qK!n8&8!Aa);MO!GU<`tDgOB%7mU1Ofl_0B0 -Yg?cJ)+;<hL&BBXQwM0Y>DA)M2Uhm0^o9zz)c%o4XG}@7c%=q?C`G_5mpc+jYk3ByouY>6TS3|)s6S; -lNF%e%fd#?X1p-;yQhI%~K44Z>7Kkw=O2C5`x~P|cwr-r&Lrrj^=4Zubi0QN_r&V1n14j>aW{7`swWt -|7QKOvMIY2wDab0!-6a&WfaA*gL^E8jAEI)yxyL$2270;!%sRS6!{VzjtlFHh^gq9|YVoM*;PFcjLb? -e!8bx|VMT&7CTp+GDfSS`=ak55l&KMKnNWvKv->;Z<Qtcn2&fo@3wVmXz8;e@^^cc^nL%OLVwKGnt3_ -lOYwEh>aKP|FXHUZfRO;`+$Z-Gxr)tt85=tnNmHJ=pO52g>2S|CjQ^FyvCK03MAsq;6i0wSl1vu!EDX -SBddS>-&T#FrecDgMi+&r0m-(iPnN461R(~<1a~ISO>6KJjt^|rjjQYD7apRzN9uioRsPP>*O}NPr;r -7BNyqcvXTdwCIV$%J2jb-5GErxF>%o3cX{#9t{SdY?${nZ18<sr4LmI(N8<g5ff5rPGOYE|{Y1pSZR9 -AOw@TDopG7R=WXZp1rP)_{^qZI>2i%S^Eis3hh|99L&XR>ZIX(3D>u1dxhz5HYw96rXZoP;89hB5)pT -W>%!hQa)7B>BmBZ-M)v`inKT9{tAily94qhUrb%EqZzlf%&emrsxE9VOSE+W1R_LtXuq_}qPrRfs;@Z -Q4MB;zm8Z9M=&HU{g<P^JiAjWcx{nXmhg-c)PHBkY`w*j{R6-V~pfS#b~%IUSOR_k>6wa6`=I5;?MhE -i+_z4%l{>kdKNlyJRa&%ku@iudXL|8oPLu!&3z~Fj}GxDe(-cG{wT$+$+<a@s6F)s5w7~(-Gwpn(rp~ -veJRM>D9yi%mY<M+=)n4pcO3!RQm;YF!cj*o-7`+am&vRFLfoTqUeb}!sr?hD0((d-SC`udbxuYVW0P -SRhHkQXIJC6~`a={D^0|dOj4}ut9o)95Ck9K(E^3jtz+nv88P8P+6!D@DmETO&Fae%H)!)2@Aj@)EHh -C^{ue34SX+`y8e8kqb|D*n>995(-w;5B`hV~eO-d#}aLPrEzG&b&kYMS}gzX6Iid0`0u@Lpf31yiwtw -J69l^L7HYgXLH2AR354WQzwT`jOKi4%Mc4Jh9^lH~9fOmMJ<Yh&-x-k)W!%>tq(;;{tt+q6W`2T7q@2 -nxyK0lgx!saZ$ughS!NqkbShxYf*qUdR3!g7xxxYT+B9rp%!alaO!g{5N@&-N|b|L;S+cpfLSevV{i* -S{vC5hg11?tjYDT8n%k{PMFzHhGgcL>Z}CjG6LbK-YD-sf54sWoXbdj@STKNU1nLGRXV$J^B@x(LycI --X%!OO^yrE6oPxoo^V5BQBBS#n1WV9)$;8KPLtaZs*9nL(3*gUE^3k6=|vboOE8D(~6M%G1FF#@(ca4 -h&7CLM8sA*ww*<;7VD0@~Jm^7JZ90vlLzj8e&3OM>G=S{_XSWty#^0hZZDtZ-x^rwxKnbH0x!LQDQor -gc&&GF6<Qi<2y2+eAf3#S#+>x^R_z01ZuIU|>9SvkYz}F_NKcQ%<2xO2^Cqb1e<mE7a5ET1fKQ1+{Yi -c8Jf3D2t)sX5WK)j>lRwggjH2lE`8qn#{q5J00_5ey0t5M1?X3RUOcDkmHx{KU}r#c14suL@O8`#3qR -<D&az;T;j+Cfu;|tN#Bmk-;x!(_@qZ2Ag~hfq~RJMXmce=xLQa~qpQSwZH2xlgP>f(7+2QwU0e)OQ4g -iHlZ}U5k}5q(BziYUVJ}5Z(~kn3RrlZ|t5{lEA^~jNs%FVs)Xg=iCOUW)VQzSiNh_nXO<b%r)I=StDY -&)c4lYcb*68DJ6d9`iE(0OTTU&6FQCUV!J}esNJ<Y(;NKUX!8l05WUAIwntLpx-thIp2>D}^n+;mf=3 -pVH-*@Y(0AXMvwSr%sGt3Zhe%cdoj9mrtTv$c34KwtO2xZdr^flR*2I>^KKPe8OtW~NhZs6Pbn4?c`^ -oZgXEp1<$ljX^&XPa0qW7OjXa4AJigN>#xu!;`3(<)!MxJx@W;@L1VDtwCiexKw($@}!ZB+YJx}H1y^ -LVB7%vg&GqV35Q#=V!86sbNDKGXc6N>YV0LQBy)I<ozag&0^uENykj)4IJ#KUH49!er3#RIYGna{goF -`z>8<P{7z1q--Q|irCj4N}2hf_%ZqrOU`$sOT)!#1Ho<9F2%5RDxAK}5;+GSJSI$?oL3S;`jAa$-4&0 -j=yUJ0hVDk6ZNNzUxwe=sL&iW%07L9o8EX1I*7O1#=Izcn+ok{jI#lB6lJZ#98lPVu6xy7o>UUG&x4N -ikrhJmGdOL~wdGSWvHBgl^q2e97j1yXKhpA$;PT7Uj!Q!|PJk^vF*3BdQLCfFU>=?<#zgEQ<TY+=`7z -%`ZR<($e4+EFAI1LJoZ-wJ_;w0dS!lcCOpRveu+R(VLpzo?5R8WL33>TH&xu98+w(ic}J54_fS5Br)l -hLS#b1)TPs0c9o^aYSN!htH8kZ|Gj+8z@_!(M~27vM9p`MuJ65!RA?n*em(+Q(&JQ<vL@J_8lZHs)Yq -9sv)g2fzfQT-;bSXEI{@%rg<Ev)uA7^wJn)vdJ{~%aB_HQ$4^Irk<;uR##|GlxWN_L{NCDwb(|$;fVx -v<Fm=&M3wCwIZw9Sf6O(-32`Ajz1BHejbLg1Oi&(V9|lHj|$;{E&g>WU}a=?Q`R;EQpbJ1Z8C!97ctN -%i<oUwr=gS5F^{p!{mIvn#$)m8IYd7y}0*nOGp-y=*8*ReL{&;UCBF&!6z0&+(rxXtgd^%N5=>`<lIe -ZVV5>fYAY)s!40shiN`5$|dGA@HhxqUfR=+sFe(n!=B7+ean?6Oe&oYq@1k&wlN(`pyFn+SWUMB*n`b -9x<&@7-mv7W@6+UA%r{KP&!?b%>ElMUj4Q&J`X)!vWij(P&)blinUpN>4w@2A4B`T!T6XN;3goVMhC6 -q+38o`rc7iCzCe;p}9|tn-O-N1;8RS=HJUmvh)z}J8IMD&ET#)VcFYJnQ`hd{gkMMqDv%@#(&HkBCDd -jrF>n<p_4U{*#>yoO7pO?u^lSO5le85AMJDthV?K_!{ZKI``t+2?GrTJaO>8iMBt~08U!doRMdF246q -iHmJr>WqbJR%NiI2}D;@q7-hPLd_|T}$#(3+FkwvatG*z7=Pa0De&8)@_9q_gE9eo3>GQQve5V7b6qo -38-g6i;9Rio~4>FRRsndy`gi$WrEjmUcP>F^8Hx6I{EQpEdF-#f3L#z8L0MPL%bmqB_&l#7?VB};yk^ -{BfN_m5p=lgIJaF+^O+=I9bOZutMS?^Yd|3u3-~E^?p#wzZWxbFd|7LWif+p5v@Q|D^(icQ#RIt#-Mc -9WZKuX}sE<TOHDB*>&>}t-H(2Z&55=Pv?iQsQQm)IQu#-VsRBJiiai5j{yS#Fn(cf+>p}DH(x8@7IFO -M)bxWtcR!T+M&zUmto*W*OI|Il@0rc-&0$`-WkW0*0?i)t{T;M-{Lifj>^PlI$URwMD}$>eKM#Fy#SW -M#7-Pr`Cal|xQ){W&L4$)9NLaaGn0o=J^VJ!-7Z$g<LK;NtRR&02S~vyo(#nQ?v8A4i1AKjzIr3_?0* -SMQ|HDsx00iDmxx$rS!&QKcjW+)VG|%Y&=7MGFpCtzyT^jPm9zADvjwWLq~f-6G_aoR?1&=XFCb=UXs -}?HH5->sMDU<DXMzA32W)%Ya*y4MzTR>adk;Fe+GFpm{B&A$4!xqq@$Lf+b2<5OdXzhc-*H$~LA$-&9 -r`t1Sz<;3`g>6uwCXBOtfhAoMAwM#lUxPu?+4EXJwWsi!Y<T=(xb!e3b!bf4{WsLUYwTr!6eszp3<vL -Nf_7f=2v$vm)S4j7a1L4Q>-h^@LSWQ7;nP`k^+uJp?R=<&goJHryqd6mTLW@)sMGgZI*rrAFEy=VL6Y -TM8jrYU1nvHvw02fV9JW>e7FMt_?9Z)mzjs6Us&uT$SFu_z(z@VXVkEuL)1E|0o%+d>n5qPf$Nx%qfY -Yu(wnA=PHkx<7w4Ce=K_vaznS287m$B;-nP2ikTtZZli4)J|a80z(&j%*<=}g}pF+iy`pk<>`wv<zmg -*hM>;}$Y2Khh4qwfectSRapjlSiaDto+i+64&Ds6mz-@_gcO=s3YmA}NbyDxGZPQv!zoa?Z(|qnPmNb -z&=ovWYD?tc3PaD~{SGQYm7{ks4*p$!+hi*+`=K2QKbM|B=EaX<Y(R+%zl}j@S+~4QS9Bl@e5ouiTEr -ZFD9I{+`TPj=x*_=^qvcGRHD%!j0QEc>#R*;IZD7J(JP{iJRJ?(vaR<2ZBJ;NxqW)7q_DSL;yY<E=UH -HAuHI;xu#aNp4U&>Fd;5Y}SBtu-#A&B&DND6XFqN}Ph{Iy%gp5l=U;KyJ-;SYX(XHDgP%_l@1p6`FRx -C(f3a$>br)CLVEvUbHNhannyl5lw|e(;=WYeDj$e+3*A#y)eCkxAXw;k{LbF1CQ0NsW>6C^ujR|r*n8 -fSD8>UOC9SS)2%?}o}8ZC$q{<_cc{Bgkk%b&x0EzdYn#=F3$KMH+pPh5Mpo`b9`MogDdfs)K@(75lY^ -zL`%iOqg(aT+!6RaLsaR$1ejc?bN@y?CIyRwxOt#~2i)@Ev>quUfrE(sJSVbW(pA-J#e+!W|wG%vwxn -gOANs>V0Gj{SMbflZ^uY;$bgeaF9wb>aFJW(UtLs3P_ga&er`>yy7%XsnCIi)Ttdr06nEHSQ{#gexL_ -{i~q3fJtTOkB%05kcp4P|J$R#K#NOlkjrvx_#W8T5`PHf1fQW2W;r~qg%r=;bxxg+swEHNRElcO_f_0 -?Hg4ssZSr=dz)70uHG%D*sUb)f<j%V*O)gL=-EbBSud<3<`0+=O00q_z2PNWU<wFj=(+^yLKjD6YE7_ -<sJtVY;EPa$^}D&MK1=oM3mJmD%W-@~I{SXCVubcUFLKd2tV}mjR?8x%!xy~o>*`!ta;djh0Uz_UEQ& -C#M)NK=b8}su^4+M>47bC#gDmU0HMcrVlmqL3Y8PZXL#y*RsgW;2LT`*_`n+FnMO>BC^7k!^?~tuVr< -S|$JC^X>jbjK4AwVk-HXDx#G2~8V7F{o5Go9^vzm9%YD@Dz4+sRu+X=5=p%jx^(uKVcZ%hHo(lIF#Nc -w~R=CbjWM#?(FVFzq|>kj~o<K)UJr^A4)U4iB1G53PQe3L;YTU~^(+ZIEpa`v|lgnPj{CNLTrddu!sc ->!WggXI>yunc9$gk5J&s?3sI4NaALe^yK8^1z5DtF4CM!Iq1@4&@{_*c9&sUuFW}erzhg_vh|FwY+u? -j$Y6`<k~p#krF83MwVmG~r)JiEzQ@XFxU8r-Gu4qY-Ktlr9L9`Az<w%-ukP$sNqzmctaHRfA<=-s7*X -Bw{h+F}u_v7K6fpjl`cOW><<l0!;o0-HnDhJ++On#|n!WCRCvVhnkrlnu)`EscQpSqOuMIfHxLYp*-Y -zh&pC(K;ST;N{iRGpq;bCo}rsr8V{Z5WjwVez5e$^_Ltg+Wskj>g1waEl`fRBsCGAh#wvo8e@f&JFA= -k#6&surm5*4WxT-X`<cc5l5+tPAuN5ZvXJU^Y7iUFX<XX#F=MXY$6s(PV-jnH0Q5W2i6m*V(6)KX^&Z -`&Avnx|Gk8wUk$ve@Yduhu$hXM)ewaZiQ~gNsZ#5FFF}9JQCEGqZwejN<CLAIjQ%l0+wA-S#iQ!sn`~ -iaj?3%Fk|4Gld8n=rq1B^{=ALC$4sGNeZmGzxVaaXwic)lo8DxNLdHm{eFSx=mlq{nlB6)Qi_)^<<_0 -S|`Hn$-e^*o`{QByKvPGo((pXkVeMD*C>GP9U7pE^yPu{q1n!Swn|1rJ7f1m7sHND#VgM9ar`939MQ0 -w*33jo$amM>(gtdc>xGsAc2$9N&o@D<%_&liiR%MSEQ!H&eE5`7T^t|TcPw`VN5Sm#(D*T(m_sL%|Tj -XdXvU#K<|l}U^*6qCd0S4>o62~Y0zuju82bRD%k3{Dp{VPPE~z0=7=4x}U)yhuKgkhmWn>Q*2szMqs1 -0FEhV%Y{jGv&0LR`5;(YN~~iE2XDH9;kYn`-i;Qi*N0Vd6I;Dp%@|U>!KzHu=o+B$5|M1h0pG5CM0HA -%XzJP;x{5lIZ`@^hY>)hj+ainA?szn-!Cto0Z`;Gv=&-9kTTgd^TE{9i4}B$ggTdgLc`Dzu<?^H`-mK -&(<;`cvtZfZ{2WL?mfoNz>F_hT3ug)Q2$Q!OSBUEytf`RArq@=scDx@=QpyEal*50}1Q1{}ZDnw;{Lc -<g9N>Fr9AwM3`opm<-#|A%MVhzm3+#vq7eJ)U<dtXF_qlSD!Ly~e`LyptnU!Qt)k63@)`8JFF{%-%n| -9=|(ugRS`yzk%5^zi-TdA<#+eh(gOrvFy7@1?tk=C1NaL<6*JYm_%_R+?&CHT+nuO|`)PqqYCJS1tb8 -D>sebP4*Ag@!V?rU%~5b+4SF>2U{#qf*;h*DDD!a=l>;Zlpy_ni}e2!#yJhQUOdcQH(Xr*g1rmYX{~c -kL5V!Jtdd-GA#GJG=t|yslj+2leU+*Ha(wpcdwg%|>t`1iCvRQ}=dHhg5B~S-KQBvw`|fLuIj=q&9X) -=GKk`|vufx63AIwvYKb*aJ-U|#brvB;Svl0An>;XSN>mUB7(BJ3u)$@}d`+Hp)y?(lKhCBW1>6!uK&# -d{7kWQ5;p<C<U+u1KLA473O|EqRGTLy=-`3*IJ|2<7Un8~Cc60t~cZo$q*d9A{)s5M;t`Xzc}8Rs0b^ -t$z5=oi|d#B6&y<4jaAo$?dU8&s_0C@fvx_k?hoW8#K;vPWMBOC6~7V_^V`qR8$OiGW+%Vv0Zhz2Vk6 -ipDn%(vqp<?KV13AQLil<FSf)Z7k`k!f@?y@*3VszR+tJI+Y8Q*PHN5$kDVt+2X8;x_gi_nv!97DN@| -s;4$Cljf41=6k&n)DTerlZfx&uw)WyJg_XLbNp2a_d%?Y(wk)<)f7{IVlW<YDlVKa{;krYFy3JVB*Me -Vuq27`cjPP)9rzw`7nklejy0l7(uXu!MuZp+eV0n(Zh~DFd3Z9z6T^#&Um(eW2x0cXd4}?m0c9eQ^%K -QyQBbSZux&e^o=W>5sYcKVNEd&8-9Mht8F)Omr6?}6aNUc!c$q_@LeJUydVgo8w?cGaRs6}L&9GTO^P -91+^(SOTo_nqf&b4nK)X~ak60NCqsW&EWv5^wzPa)F1mgONw9V%u+mmVE0NNa2&KZu8wG=)GFRV}jdx -%v(D6$iEUb$qbX*OEHsj{R<l>5N|>o|2AAkt1z<+`$pV0<3}xGJa%s3xW0Y6XCGSLg2V@7m-Qp!A5#X -}t{-eYUDV%N<!%1qi~c}F2uC~=RnnUi@&=DR%c~UvDj~$}k*wz$ME_Ls^%J4Vu+r6af!pD{fl})kyxl -q@<knKUyUWp40h=o=_22LjCfns!h<fKc39^%{ApF~l=ILaGPZ!7Tj{g=~*ZM9!H?;#od&Sm!$uZ6fdp -9{C1ai=#SG3SkJKp^;!q6zABLH;0LMYCqw?=y!_~J!+SBT>?syCvpjC~7tPXwJgb6-SviHr4)oLteyw -zTAk?auOEbGKDbWv2?29iP}^B6Mr7Lu|Ivb+_wq#W1%IS0{(pk1J*Tet%p!yhdby@~@t5XE({wKL<{V -{Psz7ao`ApUV`NYCHSZ9l@mWp3(<p7zb1=Y0~J#(lD8EH;-oEy{CVhCb*-Bv(R9OD+B9JhzM3WjVcln -qbFXf80krsY4_Yp2%EQ;uCqL;oN=gEB(}2hGmVkIJ*HXd&q@WkauZw#@hp604Vw5+?dnoW0+kL#qF~b -_&c|@<Y?l`YA#uX!Bj1Px_Tl+2-kbYm_%p+?v#YE+a&ukc|!7FE=aOh*}t~jRmTchvIyZ7z3y?rK<U$ -iNAT7pZge3KsPojPuWL8+>KuuBf^Mpr#4!dc*dhbLYOiL>ZAm`bmb({<t0vcE7K|0*e1Jn-0r;1v~LU -OTF$q=?p=*td0>rS+=4VqCsKMimaQ9mNU(GNT;{@hYDUI=t@FdY0h-Cs0cR1QY-O00;n48F5TH3d6j= -E&u=s!T<mt0001RX>c!Jc4cm4Z*nhWX>)XJX<{#AVRT_)VRL0JaCz;0`*YhylJM{PE3j6%Kx!#Ek4<h -%ciQi~wvuyQ{P=8VldlvP1(8Du5eP5<D2cmw|NHf0-Vcy+oV~sJ4z(MLz)a6fPft&GPj}B@c6@Z4&6` -D8U!7!|etG;yd~<MkaF{)7*4wtcy6&^lvvKytXP<v@4FCB$dw(smH{1TYsk3*@vcD@@k$ux_>P69)O+ -AI0?}W&{d-3e-)w{E4f8S?Cy~v)ue)azCi$8z={`K2;_!7z;JbLu#&Dopm%YXVhD_84EtVG>25cqO%u -xy)EHk&Os{iYSO8J20<KHJnKbXd%)vKMVpbq5FX!)4Klum7NaVVQYne$~CW@2m1sy}2&BYwKs#TwMVY -)XzrOTsK{Lzb^V~^`hJAZ+|V<{Fm(PRQ2(B*<o8}_j9qv0Zp=2bj_xni%yoDH!A?D%D?MdX#B-%`SDh -?9n?}^uS7rV=GTCqN%no+ZPxf!EdIi!&f2zVWyO`~3z&yO)qE*`PqLS1@1H(@`u^$cn-|}my?XlcY?A -%(Z)a!U&4LdS)TS>h1!lA^+D^<`@yn)cX__Y4ynr4pX6v?Di?-iRGA>gWD=~u!pUE*y4zloRMX{KPdx -YIhvbz>$()@h(?k{iQyJ+dpAMj&4J~%j-&5Ei5GC0l7bHs03UTzS#`6SE#3{(H2?s_O87Vby8{X9`7% -g?T^UewEGpsM}p4Uj|r0s4egBU<Q^B%div)pzu6G-FiEpzCKpzIpxj{X30eD4(yl3jla5M?L+yg9Z<t -y?*)f>8t0_l0Yykz^f{H@chNQ_f+m36dL6(UcGz&^t<oQ-saJ{&flIrd;Ru#PJjL1@6X=7KYO10a|55 -=z5f2~v$J<l&hIqTeD`lp-$J!9H~!+)H?L=BKfcF4PN|C}U=VtCFt3WP%Vy7zLPpKy&tl$>PpB<i*ZA -+#tfLjrRFtiX^%}63A;vml7Y1O4Yp=`tCR<oD&^h21VhN0*tjm5j8+D>u%I54c_`HA;Wl@!#fJU+siJ -_j0DY7(RVr7@rO}hg6*k(;FvSrg|0{WNvQ$LLY$9AVU0zk;${?mPpV~D)I5;d?eSjzD28(?MPKo4hLi -J~1E%QGyH_16-I6M)$Fh{Uo-WR-oFl|0-GhS`f9ot|=o<FMcHF9TgK77Ob5gk~(!{ilmXRyb3Nz1G7q -y*&ZGQmm-t3GF?89cV5-wsJ{j8ToYs%(gb8I&o-UzdqMBKES~6M_7)~1=xnM7MrRcQI#73Eb#opcnYK -}>IJ<V>$TuhP<&Oq6>HcgfV;vP!0F7IrAzcovdF)HK%oqcY}9Yp<(#M%wkGQPcsjg1CRFqE6;SyEV9u -)z?5E=D>Xc?OMR35iduQQfv{P_5CRsx}9rc4jA~9Cts+eyxLI>_B-4lz9`pvp;8hED%DaP)A12UkgBQ -l_|!}M=D7(;;=gLN%Y)&g#uwiMkod$FXc@77{oE=#e9?njx%95MlbxCk1yuylez-?tlRx4$ksgO0nhs -$eH*Zisat8*5>VZ7s17Z&^O>Ji~bI1OS77LC^wrg|ZDzx)hj_6t4z>bL-N$<UwkrQ3e%$n5ltd2cZOx -J5d5q0|l&K2VOyD_NQuR7{@+KD8ohS;<6&n6X^{LO7P7{O`}{cRouD=*|;F^y93YXwsP_!En85!D3nQ -dTT~l+CB^$sr5Kw3NeNb?u%nYmvtw`T;IBJ3kd9bx3Bqv;OV{VU!A`+Y<2!<xKmFap)3y}VV&+i!Q0M -+17PqAUSWQo0QB48-h~6YQg$?E~`$1&20E7akfZok-aE;uF{8m7x1x#)Ow4!D6tf){l1x|h`<^}KpSa -B9CD*RnpZ|-pw^<vd!BQd?2@`vZ*vMlN+-(PO(egiYx!mqv?BZ5J=04>Rev|UwYeFLlfxOL=sr(4 -VKK7WhIcO(8P%PwrrakCGM$(ZRq$Z@=t3DkmK;$Pi}I{vR;s|s>eI!S2L(Q!}25AJe*2^E?F<iRETmx -w*sUH=L5FG6{(R?o(FJ|FSi-=oBo)V-3%cWB?uP#HiDZZV1m@4Q9IQGbK4?8uI^jhn5a$&-tR6I9|y( -kUbj<&Z&8OJlf9OJBJ35n3~G4_B1Csr!i?CG_Bh@MXsBHYJYa^T!y+{3Nc$^%AEHnZX-b{cka4tObMb -EBqXDS>MJdzMpPRB~EKkB_Ld5H_Zsk5?PnOe4x-RaHR6X5ad@g|n+(b(V5RTGy^;}0w;AC1>2w;(biu -!8AJ(?EX449cHR-^G4cYXe`8?k^1rQ?qfdmvYya$QgeX!ASGS^CK1h+z$Ox)7I}t5HsNoa}K2`X7^by -b==p6vh0ZLd5Zb`Q8z2&qxrK70i^Msy`BPS?mF(cuHGGP(@V1x<YXxvaCiq?j)?SKA`E~Au#zku`+*a -<Ti3k^^nWRu_YbW)ppAS@8$(>JhWbs1$c5P3}D@?Hx+6ET3I9F)-YIL?XQa-H$4CXqmJ*+&@Uxcl8kO -i7+Sq_3bSk&pI{FH$sr*Wpby<Dj7|bQ3API=ptjPe@DiDF0A6-V8z7Zul0_{}339O!fCRugq+cq{h5X -?g82;9)a1g?YPJ%CKTTlY*#X1rIq8k57R0|B?x>;yq#a`j6gzmMt6^!OpHzC6i$kc37OwcYWg-2NMi0 -I)+mOjczffFF%c0`cCgy9o*2E<-6Ih3stqvQ^BEV_BIhB815z)H)hm;%&oc5#s(=NA_sO9IfjhS`dBR -m?3qBX$pkXIPj8J6I9Cw$Qc&qy=A%)eK5ur{!l$)Wgn`SqDGS7EDSv{!&)rdb7F&E@LM7M30zioS^7t -MvW#DGzry<qFuPw6oP-bmBT@Ec#O>GL1eTWU<nP1MD;Pquxl9LW+mEkZli}V0SyAQDwKotBN1!q-Tih -gWdA!dkH^L*aWFVUg(rqG&EBmGw8JO60uPA)DAF$)G)Uvbz!H|zh=Waxbr9r8&|v_<9P0*(?pmM;9Fe -5ZxdKhKTn`}&9<GUFUWmHWV<s%qM<0_KQ$8|T&FxOK-DFExw+di=RnJ~=(%4D%Fu4LoFpHB6$lmZRsY -b&G7W&Se#r$EM{XVmWT(fVX-n+NL_@-@c%LQ4FGddW8f$%1T2AM9gm&vi4u@Xx<xrlOYSjcTqGIDTmp -)Eq4u_5E4hq(n3TG=aA;#T(<itOkEbUPr7{W_B}83j8hTNFOgrpS_tV@VBnFox*KDc-gf_JDUOQYXle -va5Z6{|W?&uy&$R+SPV69BVvA*3w`^dQY6Tzta?4P%)2dH%4T$Nb5bCCYPIfF3VI~MeS62S++1LP?&+ -)u#84l)Vj%5O)Ge_vUegHCvsVFzXmQL7Rt1GO=k|Bf^l(yMgrK*;1#!r#?*k|hlzYLNYMeN0WqrCDE{ -OqPsx4}<z7{DCv1b(Z@wzj*~E?5W~bbVI0fmx2WJuLarM=YTU$6@sovX5E8Z>LCBG<f_7CTuxdw#+r7 -Y4Wt*rgq)y2cM<-WtU%<@~yjUu%M_0B}cBdLQ#;@8068z@Y|fxEZBW{j2zY2I_c$qq<a)ojzSoC-^7E -p<s)Rb|hI3zvdUCm4R!3qAnkA$GrR@q_3v7tZ?E&~Wc!K1af?!vT6akyC;L9ieKFs!6pt<07gSObR2Z -$<rFSg99eZIicGUdk3W>>8SvH009X_c#@#`d=Y;VQ0Uj2vp2_I{^2X&8+*x}gMySzAJD-3nry8O%aLq -FyLZGas(rf+N#DS;4>_jt^(cSbWuwR4IL{tuBUe{)^+zd#{skwK{6-?Htia=O-+^V6mo<<;Dc5XcP21 -yk0{@4m_cWsf9dvBi4mS-YK#!HG6(afLR4wjMa#)k;QWg(Ky`FKe*66oF2VpU1meD$D5>~U5w2;ek+{ -iG$$0s5(`A^(PnKlgstrP#19cMZk(byA$%!9h+h&rfI^WlQcV_Q*yT6@c15={0jGw|Lz>@D=!1!?MWv -ywC^MJZ_HnwRA^9G^K}2`GGR*0fkgdEJBx^8%=!IUX)Q7rxwsh&Hh+s`rc#7YQ!f*fB^fW@xx9MJKU` -Z1Ac<qd7J-v_(nmk>bj1T7k?YNL&$kc;EKrd{Y&z1|INf{e_R-)i0cpP899@S|73CnY&+^c`57_<`AB -@B-Ibneu>jFWs*TfiH@<cJ)BXribF_;D_{E2L&6iHa0wuTY0p)m@W4dNPrUyPaseguM7WT8<Vs_i<^i -i5@p4PBcjzUik=v+`O3G^s-4HS^9w^ikkah%_NGvavmd#aoSaYvP<E*4ocg2<jo7JX6Z%jOqMU#j=5P -+XV6nRHPEdRvATxn;+9>DevUD(Xo^;C71{<z$fAc^-Su<(UIpBz!ox7u6D9@jfTE>mckBpWWab5l2W< -X&_sm{<!2c#Hru3*ZQCg9HX=p1YS7%iiFDTw2Fo?@&S!o$Ws*KLe7RrV?Z;bYvfeU0li+7ut&tR4siN -ggg;wkU&XSBIsW&EmwC<yRc@7`Re?pxDqfIwr|np7NyMA?kCP93ZYIp^13mo7*F-+A|6MolMi#v^LdG -a!i-3J-dJW6bsTm9o#^I3ooqZU&62mNcEH!cI$~3Qx&@>HsXk5}s~MFb?ap!<lWHb@KV<TS^>hrQ5Or -7LPLPpXa9ehbWt5`&N@ld$^95llS2c4oBzcl2eOr`Qq6_q3`XuiAw&>(1et(FbbtU_BWlK?@7j|dp)~ -zp3Hf;chw)X;v8tn}b9qLOhNoa1*V6jzAv6yYzstbG@tj>4rMM<CjRk_G$l9QV&02wkBBIQUS0{1RNy -J|oC{_S@(G33~_n^0^QAw4gq7jiLJgClPR^_h_LXIO%FXr^Y5aG=+!gdrtH7)Yc8<9wQ-#~lFEzC=bJ -U021nGiM4Y3~H^UMwtNS>>3zI!mmczbZxyulljD<*l}toN>(2pLc|Tyaub$q7*!d0*TCFKWA}*x{D{U -sQk{JywYtQ(*Oet(>Iv6chbCC`iQWr0ss@@!l#ePk;^{dRISH_9X&1<s^x1Q5vz+yn@CdJFMc>;p{%Y -ZmMt^b-ufLVv#Wq;p+clpAB@o#BV%j&bWx@KjyZH;PT<90JKUyuU&V-AphXT`J3<PA7F{e7UxYpk1_s -VfVajS8XHrq|D8V~5xaSIH3ncG$KWCMt_k8Q!Jn{I;TpO0+At(<NI1e5+_+i>cpn^=h3k8Q!OYWse&- -rL!w%@RquMig6IrLM=X1eA@In+k-lsvDDvs-Xt*3w&eI#VUkSCIPbf6q%Z+G%%!)e;HX-^<hGK0n3sp -XUMl!qbnGX^tY31Dm!Mg2ll68AC9K8y%uS?-?1FN24Ra0k^Qy8gXyO+q1Y%!<Qg6s@zeG8QF>`=1eP( -&D(2e5&=XKMYXC^=S0aSUg?*U)_~VaqPd;8X3&C1qP40i9SR_r6l5N74UZa0kK5sS^d#6w}waY$k0o| -KUMZJ)YG3<%tU=JTDf5Q7I?B^wLT;KGbL=amk4m?Q89E4&kV!)S953F@3P4Px`!ABd~*aKB=i{4iDQI -<AizxrLudKUGyj9OE5?_>6_pmb<zdk7uTkYTO(EXzNZn88X}x5ME}%A}Lw=CuK-yj1}s1>5;O_B4q?Q -KvCR4)xB9Hp^vsj}lCF{<!;q@{3pAEU56XNmtGTVewyV3qvNwqsQH!h9snkglN07%|LQcS|w?=DUL0K -=Gcz>ShD2Xk>rblBtZ#yHNB0;9I=|lj&IZKJy{8W<G_@_M_ajaAJvj~B4jKex?9NprL8mpOED4@gU!@ -LL|tpEum-++yFk=IFGh@FW!j=w9*y!OM>#@BA-bTMa<oY^Vw5tH7_+Mht4bCohU!^*m#%8w1!8EpKrv -!?c!53xve@*3VvE_jdRHi=ONk0(iA7RD#SBHDK@AHb8APG4jCrG!2<N3eB4yc2M#qjKPKl}$bc84g#x -wgF3y@34BV}4rQQgvCh8>W73mEp<9FgrZ8%<=C8OrcO2eS_~BR#EmSdpa4%(f(+zw|EcXq}8gI=9tvr -L@W~F@U4gJxx(9JTkz}Gw{{Y28bAOT;}W;Ii5p#bRtgxps;p1M88Dzo6vsH7olT?H7<3+%f=Cr(yzG( -FiG42O+^|3SXUw0kBS`VfQhlAXqu3xqh)fy)fjea5POmfLHbNjHSuX{rE7#rhRKl^w)_gCch7S4>YQX -u%1ru0bo?!vq^~6>X_jmn=gKTJItMpYs;I7-7WN}_S6!OksWX@GP{-I&iMH6*O<h~~&VyX^a@$)*4he -<F!f;rUML!1SfKE~e+{&f6gjO1ve<3OIT24LF?CickSmYkb$IzBP!o@}2T^FC{7Z*ujT;z){{(yz#uP -^_|zu-Uk?W?cVx7Fe+>5n@M?yJwgK#x`SgHr4a=+Zjo;zh@w((4P&AQb(o*69uxK(!cB@Kg+|^3O0`T -cF3qs;pUayA&G5lkDa5uXe!WXjBGAB&Y~35IQ<02SvQSB(W*`xXA9{iWT>uxXjBQW0!{_blJ;=j|3U4 -a)$u{7{o((D-RKc0VErWfLk^dn&OEL^V8hdyIq~zlZgy6!&5%Jr4di?n%}psTo_XzLsxO4k-DOFC|+q -W%GRdVnfx+Nz<k`DYDwSgxIQ-E_aowq(jISF>2)#A!!kuvez6p@%dh_+YRtwm;u7O&i^RMhT>|O>j-Y -RO(ap;;;x_!ad)$$Rz<r&_c8qirmu!-(-V<{;s@)==Bjn;oi5=7IgWBNC77&7^4<j28@n5jQ&r3#c;3 -~p#!Tv`w`U_KfT%f3dazU?7@OYVnkbu5c6J&_63OnNbWP1S!N=z~P;|R(uHx=#E2#+_Sc6;1z>Wu9e9 -jqH%zqqE8LRl_(Vp1^k;<z}MKtwttiqfH{4~{|I5r3+Z^eis_8UKT68D@Q3AR-(X&@mYXcI!uBQ%sYL -<TRfn@w3)}pjYmk5=Mk3baH((IeDT^CSELK5S{5R*u(6-z#$hvg2yz;KU@n@WuHyI_)_h!zTsrRG0AT -|5h1#(4>HTcuWvtBO^4CKLr}<3$2hf-pUz_`58|{+4ibjM4%yoVA0kq>kEsaHcJJWMj|%GaMBImox0Y -6AK^j~yZnv$4pwhlrfCB4VFyAH_QDCNhs-&WbRc)_jPn^g0vuJJqoZY53ZMTZz6fL+wV?_^tunEgGge -C1+N{?_%S^ziMfk)8H<L=S!Ggj;DZ;rkmL#7I)V5p=iMyKZl1Tj4?v@Jc=_4|#I&zYiFB|+O%`ByOoj -Q27oRDB4S9+u2jlyT0IOsOZN{wV)4qt;S5LNN#NF@#3ztZ8|lWT$7)oky(Bmy}|q)ag{lDI*LyR%1B5 -<yY?e7E-vP+RsKR)0UybU&k1zw$6z*;v$kAP$i!1SxetTrgBK;pN#xMr16uF_feR^`LdF1EXq(?K16Y -DrmLT34d;)UssK%kp!cp@Tz0hAJKw|lIQ4CFM^1Ueqr_)bcBC4^Y`s$XyGp8C)K_9uiFyRU#*^&JaXj -S#Q!b?m={Cq~kswd02ftU)qZJROW49V!*}(uuo@=W+DVa{lLp5~x+>?BQU^)?THTG+&<|wSrK_&C`I0 -O|fAiW7ju~Cl`=Fm<>?z+kUH20C-m3tgwaM~I6#YfuE&Z&DlaG;X`Iwye?(&&~aI+t9bU^?!q1yu|2V -wwKVsMZ<g3$P>k9B(o~etDn(Y>FxbCfk+#iUUY*#Fhs~j$i}a#!VBqgW32=`W%_JO&H$gzGzY~j&>Tq -ozjDoTP)O6uvJM~FqPqQ3Id3Xz;L3%e(kJQQLpsha900YrtsH`n7V`RjPh=>iwc}Xol*^yzY_F7**oQ -;3ucvPE=n1iFr+=1D|{?{B&B?lGwwlTl7wf-XFqCLMo9xPGC&qY1i*J;Hv|0VcR5Y?(xVh-sx+FGUX+ -0wkDy#&c86xXdj0<FgpK=8-@IU7l55;$wXj7=d#xpIv3=MZn+mO+iKq@^i@Abs)Vf0&mKW)&U2Cj<n; -d~=K-iQKb|%WiquSn~3zCf7i`F@@Gl#6fxYR*~X@E}C$m%+9P_bLOR4H2jjsm7M)g+}alG7xXC%9Ok* -HYT7_o$8!GCMU-r>EXzCZ|Tl*O(R!BFQN5?_z6A0ud_HZPJ{9N|&eF%1g`j9re9b^bWF=nJ!7Id2r8k -V@Z{FKk5*m{HPEaD_H^he{AgZ5EmCCqjO35P3ldQdY~$65pK4fn{^-r5$!C`H0>d!>vzW*rzh`nj7fY -SiJ^$)R$x@x*xPPr?WP_~OiG(f=VK0ms>3pKT-sq|Iu84?62^`?&7Rgqg%tO+?5=!hbhd-}Veq&DCkw -~Xi`v4iw5O{B6HHpHPF&c!3vcdtPqdju%G+33=N&;`p~lXrM+fwKsb-`mY{=rO!Q;CrOa^QblpKpcB% -y0{!|j9A&{Uey__h{m$I@R8i;VI)TH_J*oF&UZbVK%-D17mjSb-DTpjaCx5g*y`D8(wh4kP-NHJGL*8 -oO^4JwP=pdYP=~<QQ9T=a>!!{%w*;!Va@VL)znd)3eHni=7vuHc}ja`A=U*Ym-w7CucZS3TqxRv4Nyf -vd&{-YHDCGbNC^W5YoXdi6P86^7c|nBI`82c6+NxgwDs8Ytl(Z<FGlI*48FbBtJs=C?x2CgWLGy1DEu -lO1J1L->?nnV~Ytbm2dz|XjA^Dxf@x`ma(C=Zl@|m;1KiTRU^4jkBD>4p-X$M1bB+60rpz;hhlw=jVK -t6Q$Ej$Eku+FUC2sRi&lq+Y?jZ+Ou?2!eYD+aLu03eI-Nz;;^B4*R`$k{)&^A^lk-5^w`gO0t2f(`On -AA?#A@Ad$4X}~u*yz4cTKZ1+;DZSQ9AmQU%8q(ww8N19U1a&qru4$NNmz(gv>C<@#RSJISx9{ia8=wC -N@B?Y|xDsbuJykHMkK$5H-u6gm5zQwwRr+$2|!F%RdqFc%q_(Da(Tf#LHG?DJ$mWfl4pqyO%+WYd_t8 -ulmRxMX~U3foYi~Dx-Pp<RLb_ltC_Lhf_(qNy^m&+|!@g>l9N*s#g|ay2d_3Rh-70r7JI0MCI&rgzH2 -*Obau)lYr(hif$uO#;!L!8_4f?D@&Sr6QiOPGLiIb!Hcv^qch}@)JgKw9EoOENqig!4lXSH@&U*s`#k -W@H+>mOD;sf>^q=%roCYh=L#HvpRxEeoxX*}(Asf)|PWQqTKIvH`?&hvttBr7DF_3l`r@L#|0T$Xuz9 -aC^H8gQueTst7*cc&mBev{=CYe1373M5HSiv0mdIMW)d5K(n4N9Z@6HQ8M=Iz&{8PlI=HO*;7<P_(K$ -qFqGCCb0hw4hS0o0_=4&de3sR%k0JEL+&p%3v2*+1XIt7dNzXqFn}dm`&YNu1AuEkxpn+ko%^Fh2i2E -MXQ^L_lzRtIYIhuiLNhnfz2_hqkyxk4Fze9r`e0zfrU{gY7?|jkkJhr)ag44si9p|+3#F+%GnCY1k*G -<r>a!&ROq`*wH_QeI0)x_Ni-fRs^e+#9C1Dus76ktt)~*VMcq4R8>JonQ7lXbPrgvc@#=L?<Jj3~e_O -L8@z{2x_gDKOA8Q?Ztlok&j@XO%cC9Hf9jhqvo*dl?_)4+UoURm0G9x4flnxZbVSY((M=sMLFO!lJr_ -%Qj7}1B)Ey(8KaNpSGBeSnrR5p}^&A#)+zwU*vdw77_#URfC&If%Dg!wjLevfi7Z8zE5UgC2!hhSw?p -GTgCG@~x(zIndTW^;1}zi8$g?GWs6qZ7;nd~)HBF7$3!%D;UH3yGuhaGUH2z#TxDt{ZK);T<IACm<hf -%hAo*rd`{Ko{fiG959veH~+|mIA9I2SL8=oL)2=sWN}<pxCmf+Mta}Ma=AfSyOOn6(FWz`;W9_r9nrK -ew1x%~E*Fs|shetDp<k->-l8SvJ6_=c=w2jgM*|sVWG&}OHuBYY7rZViTd6xs2j9Wz?)Kz#OIDRf`A@ -Y>flGY|B^e8Rm@d>k2QZ7?8lKWDWF7%?LtHGcRXW2P!QgD8W-~&nKS^81?I(ZSvRf3p?G`E}{nVek-M -*j^rErHsXliiZllK~OHb5vHI}!{WCeM6S|D<WL9o9Tsf2fW|CnofN=+y09#OZ)vkp*ke<=C=G7&b%6D -oh-xGImE#$SB()AC46m!tf-&xHy&>#)X`A`>bp*(kbZ}O*db;^4LG8!2lDN4%cND)FXLx(TEPM8f4T; -1JY-PX^(9r#591y2}`nxhjZB$PNWux#V|760R7<rf<v}onRv`#%rf#EFCUWjxCxs9G5d|b)R`!yzfkt -4)9f=pik*^K`HlP^r;wj=f8uy1u@EJjI6wa4B;f6SeNx}mYVzxU{$cNwlhL`#U6zDLc1R(_^Dafzm^` -2CpBd*^xh?GbY%1bkX>AIJQX_!2DQ@>tga_3BLm08o=u%=z?10nZdY|@ulT}UU_|lGO)A=A#5rdxg(g -Z49NfblXQIc_XV9c$p%FT{fW_FuP`})9Lr>3s9X^(n;E2lA6dY*^-9I!I8K>i>ZdDF^35mYrR#X=}n> -+fmZw9g>Sm_yKfK<r99g8}}MR7ciDD^w(P(@OL-$cp7uk>D1M^99z|eZM|=@&q&%7&cvZJ#E^nCm<t> -7Om+|P!7g`n(B~~B~Dd@H~~>V5O3aR6}S}1ZN5*~((Z^Q6VdDL%d|dJ;1YpTSFS!Va7n8{d=@oPf!^i -Pa@!&NUX!4${9X#vpNR{evc+4b5dud|TwJ{Q_ivB!b_f`bl9K4KL&-(aoQjn7fF_gf(&WHvPzW&~A25 -aK9f5D)2`el(A#)oN6ki3kGR`H#pdxWkWO0Or8)j^qWc4Jw^%g^?(h1hyYtA89Te$-tkUEe-nB0N4-j -$rzM(=*`<C(4H{oqh4eObaD;Z(Y8Dx`{g7(=U*E<kSLey&6-$Rx1LSp6|<SG}|afAt(@uY?YyMa%D{S -YqyU9Ek5J{%gAI^VfZ2b7+_@W=)Ka?ifW4MOe`TVup0wiN;n`3sRZ5g0l?D254uC>ShGROBafd=708m -zbXSM3KG)aSOJ>$_q|LN?Z7!g*heRd`}LI0jw091wZzB3Di@o%Sj3=to$`z?zj$^Qe3bcxb6foiLnnP -!CQgc^jT$%QcfAeg=f2fO1N2f>eP64?UjlNH!RUkRe_1y#DEs?<_vay?_&HKMm3cgaSR9JFm2<z*y`o -fH^X959JC(%NYJ-O~(BGjuJzJTQaKD~VSvR91`Ab^FhG$Fr$@+9(iAt~#x$IFPY08^D?B#u;n@GOOK* -lL~9%9&@^Oi|&Pb4Yo2<|!WTQo+y7pX9nUu-L&$)(v!Mu`x-lU;2%|D_w`F4D{8m)P;fC*v>*zT`5rF -Y+Z_AID+#U@_5bXMq({bxa=CIF`$V@0M&X#-tN|TQZ3A#p``?q9x}}X%pI~PTsc}cxpr(^5XHeQIovH -#@V+lXd+US&>2}tu`pePaH`?&ardg4ggv@q(?%SU+Exe2+?}52`aR6PdGX`RGZ2>RMWrtI>{Qa7zm{u -toPwOBxGl;G#f|_B7KGlwKOCn!)qjaL;ZZ2VoT1h`GHJee9XJ0VXm$cZtZOtqG1H|JN&s2^F^{-@3`J -SXfA^Tb=u*Q+f=+dG$7JG@o=`0n*@HZej&j%f^BQsvipV)8vhMh*%8y)pI|%-_AaZ;LnoKP5<nrFJvL -mVP681gn6B!RhE%kVf-b`L{KiPBJziO0$&(l!ICzNp%*K<%A2r?{F`Ow8iX<?QYyd!2lqEY;VM$G@O5 -9<GaKB#g3=iqo=6U8x2j>nrU&L{ma?Er&#SivNl!T%oQhbo&==E^~zQGAB<ll^^1J)(M;|7gN9?^8ub -MW*Gq4wW*xz>YvEN9~xc7GK2>jM9<suen>0mv#!vU&;kq*6869iO!>dKrxEyN>;Y9k!)Z*y%zU6y_Y* -6<INlOH^F1RzUa9G{7K~xKJBv8es9)#e#lac=tFk+!bAMmY-3Hr*LELc4L)lNA($+a#F`X_$T*S85Ak -UF<PqN<$rk{TfkR%uaw+;dPCn{ndr3elD0`CS(dpzNjn_&rnSpz#Li<d8Ecc6Eo_3P|Qz9XTY;^tLxG -VJ}`K3k#oe<rjEVtyFsM=<8#oh@^(1G^BgA|Pix*~lHHKUzK?g3k&Ty^8X+Tql2$e7cy(UHW?u>RC}? -nFBc47wBkIu5N5dyO1z9r`}(u-9Vq$uqFM&U%fzjKTo98y=}&<gIdXftw$u&ZHje^pvu@12osSMctvd -CH0*1SHM6j*GXfVz1DO$=!ye+#+{Um$TpQizjGtA9xFMrm|@Dx$0A$ce&^nwgvEC^<yxNM>35%qZSP> -&53sG1=kWAN!ev+v!OezlKfA;<1ds?o{6t#?am_u?>8(1NRtCAMJlIc`84h|e5U~Hh+BG1ejQ&G92Gr -t?81al91Ww~V4F`?9VO$rBjL%%_sPE_dwk_7z@tYmrDhERMM!)O|t7xgg$@VV!C8dux71$LDK3|t>j* -Kx$*b3Byi^b2y9E;9y+X1dbYV@jDGdl^c(KdoN$nJ7FtKw2rD7VX`b8Mc30`y(xSuQ*2Hl@uEN^KO2E -7C&=jB=#7xS*c^lrD4(u6NN_QcoyqZ37%16BsLRit#jiT6N8Y_zT^jEtbo2UefhGZGn)AYNGc!0WY?0 -?=CLxaW66Bg&6^6C%Ud_DTVqC+Ve{8&BaBFATZ+>ls>=zfO)8&);u)Y1U%RUVyg*I3|}tk0?DG51`RI -CGYVU}EWw$Z>#dUo%{djpsg~D%1M0Tk)L&f4ia11*f=~8GhYV<17@`B`yo_qx;q(K~ByjdkaM)wM`_d -y_Mf(<GvAjC`?6oe<dJ#9AOv_A0<g-akXFHOh`7Lq>z5U9SxSq;j@FTm(k@Df8rD_W?oVeX8dZImC@h -#pB*nKfYW<~iQ;<?5LIW&;^5X1;qy0FJHgyeI(;~!jQFF^TF;X``{Vg;S~!1W{N;eL{BC98=f>c_b#l -I!j0o~Ffpw>|O_8)<k))XGsXdG{YPV_6f)c>dAT#2wlGqjZE2bpq@Jil_@LI8Er@gmwQxYfNf>E&1p$ -TY+v=qFEH@mib!2+2ZL&;!8XdYca*PZG5;_uD&5{Zas(RSP9i5`<f#pM@hC3&M>jrU@C?cX;f#$JhCb -r>A*;K)pI$@{~RWAqHf7E&Kr_6q6l$sw0zuY+>pmd8og0&Zbt*URjsf<2a4Hj=<Eb5Su-0sM4?j*Iw+ -wm@qCIwe}<<R1hU36K?4%V8|bV${oEyxH*HDYPJF91Xu-5~*obO2Jtm_8{>YwiroYrvH-5|(%JdS5aC -2`REJ|~es?`7s^-f9Dw;1@)?dlR9B28UeHj+r7HSSd40c!UWe3fTMjIQkWl)`{U>ed2OY0SuFtdOpdA -OU<HRHR#tRecqi`cs`p`z7vsy66?EoqvAvA-ohpN0M;`iw^o`wrCVx!T(T=M9hM^S<_j{DQeX&LC6GJ -MfUvldo}l(L68O@WehD_k@4kdX|oEnj|7d8p`_#M)s4M`j(O0M=165463KK0i*#DZ>@$+!WAYr!n$Yy -xz2%0O!}0`8+}OT!j)Hz*?=LQntMW#m8NMyt_PJs(7UV5x9Z4`3yQn2u;G+TnA1z8orz1K4?Wg*Y8x6 -o@3rna=tfwhJTg4KVV2)#~H%9&SGtzjJEx{d2Z29P~YF*G02&^amddK#nCsx?9Ubyi^Yhx#Wgh#f=f6 -D0JbC$gD?+-s=h|b_9Vlzl{lU%sHt0!%Ji1y~E+ULTik+E|i7{xZt15S<oa-99ikJi#{E1v8U)!zbkp -(`+&PqRnQtqPCQ<u9-1P1SJh<${U@(@gxdtg~UVanOZG(m0Cv_*ikUiGKa3^T~T{@wheg{;Hf~eivBM -L+6KYM2nVIJP9<lGOVQzxuxQyDp<LQ$-FR;hx3>LLhyA~Skox6HekHRh#W9O+S0y+HqV=AqeLeF%Zqp -mdjeCrK5CAIlRbgI=Ea6>$bA1?2yR}se36)|($me7nMB`wJFj*nuD12A>}7F-J_g-2iO<=*S#K4}H8* -qfHW#7(OabbX?Dj#7kl>u(P-2C1D_#*W3fmU$LVgex+V$?(lz<3?5v`hAp;Lpj8#gMW$4G1{5x8L59m -Z~q3cH_U=uVPX-o`nSZcMS|o47f50USV$+}{`I=1v7C=J)pl-|Ae6B`tcMiBU;LpB|$b#!TxT6{sil; -l|6R2}3&Bi96{?3dBUaB>IZ<4C7<X^7#lalpizSn&3SjHG+Wkq4Y96c+V%_(Fk6Gbi>C>OwoMsnBI8K -9lzv-641@XoYWt;`REazl=pP0#F5>^rYKB3G#Zb0yJW#ieH*zaSTer2*zZdCA1RNxLbfL`d*XFkusz@ -l+i%2-`b!l%<Ax_yu-q85Us3|2h#6Z`A}hTyYqoXrNA1{-AEB^nv|}jfXA*yap(L8H@}Wwx$yUyNlY! -_~Si5@=;9VoA=pcG6yLAyeqw+L3Rv5d+S7hR3O+jNWCE1``<q=inM5CSihz_J7U!Af@$FR#ySuHFjgw -ESb_z%#AzJ}h8X7t1sJHCN8`M~7L60Sq+YgIdOe>pF56H>R|{pBvBAxmzfJCA&3BLAOH+!iE;9AK)RZ -GzxRmg&Jmu|C48VK2tzq>n<nUAVJ+Z&?I}?NIyQX8*y+BHwrOGQLA$L7LT|`a;~!Libb7HvNko72{4u -)K4mT>pj4T1}W@)kvm6QQ=nyk%$MmcmB2;etNy7`gaovo%bc>9>8gsN9=F-COk2&@sn*qYcZgLmG<;- -4DSVR#hiD4IB)V9N4~QQM$`TZtidgYuQQb<)&oy=$UUEt{O5mebL#Q|a8E9&j#ag?{Il_ntR`?_x^>x ->*0nxvsAXwCX9!fKQQ;dUXF}y4gOQnGrHby5EyfG_`OyX4FbU?>OCyRxmoRlAB{jhVUQ_5b={nEXWn> -&@08#+ZsDANw{<WBAEmNAq>m-z<Jdn-V-x)L?H8l^U6-r>oZ-5qH&k`$0EGZK|Ja<=@vwtG|Z#5-HYu --(<AAm13(KHtEJI^3O*IU@P`2)SFS9am;hQIe|9d=oJQp$vnZLxtw3?(B>q$fYcZqmHQWYPa|0FD-VW -FA7_CDUrFxa)`aYSu`kC5U~WOcT`=W9tA`S+V8H3M*?R-KX7i7l{kcE#o7a4d^24)w!;o|N1L+TO{Lq -+DGo8#n-76ijY_NO5fQH(YFo*<P}rb{di2>CM<+E#nrl8X6zd5&5%hdj2nqzy6HXq9$I<BD)=0+)ebd -F-T0wGCT>KptkZKB#)&F<>e4_P(vJGlmOdb-!JC;uDWaSes9$P{{!6CkW*3z#d-lcE_QF%E*0Cji;VP -TCR6%=YKf^<;iNy$e?Hy~MEb)I9>Q}nZgnJy{#1anL_3--||Zs@)!rX8k+pD`q>V1Wdc4GDbeK<qZF7 -5b{2X51j5EthX8auhG}yKX9#UQT^t46YV-T$%2*{HBwDz(4AhmA%7~Ea8LciTVozb5hOQ__P(r(F&0L -Ur<W}1QY-O00;n48F5U5IN~ia6#xKTQUCxP0001RX>c!Jc4cm4Z*nhWX>)XJX<{#FZe(S6E^vA6JZq2 -Kwzc2)SMb_3q)BGwN7|rw+r5D6Y?=ie$5^lXfNRWXB+d-88cCO;c0Il5fA4va67`y$*v3T~L@>M>i99 -?!?{i4%p*a2GR3t^J^39p3&HD8B_~hi_$wTp?DEC@zwnl_6X5!hCr(cP`s65__H}Q|EjG)C!mB_r3sW -62wTPa@e&9=zJn__M5VlBnDMV+UyQSc0Iq!uv@l^d;AwJG4&MoYPqxj|TOq!ceNUtGL;a}k*jM#On4U -i|Rt`s(seZ?Av2dV>$4-HF<jg*IXvSKCaj+|R7oY+wrRXHmJkYFitXHNWarsf$Eb&3hwv<yvL(#OVFm -iGXXZiyh2H%NU6wY`bfEa3Vh>vNYn79$si&Xs=UR?{@peRM!(~6S=3~sLH?uE(jn{$i7aBT^SqKDE#j -F`t_gUN+r*0v;7Wel1V)mSMq;rS(&-O*RSKMx+`@0{YK9Tm%&x*tc-Of=VDc>EL{|(%n?iloX9r|voB ->ev*RPR+~`T1Y-PFtij`8E{apN0m5WqC&o@%vO8r_FAND6FNPFPzxnn}Kk>({m3m1z#-pR#cc5?E~#k -bGjzPw&szWV0kZ_qf{8dFwhj~|!&Qbi?6PE_a({SKPuR~OG;evi%h@kx@wbj9m9xrsOO5`^kQSgd}Oi -J37Y9z1wJf3LTy65LqJQp*a&tOEHfxu;OrRWP;HDwE<)nJozL>&v+($^^;|CTO&%8HH|EB;k4w7_NfT -=DOZqRtxxNzLP*OV)TMWTtJ6cX?*qf#cu+Jkjk}Kz)NKoi?EW}dXD@$e^untPRXAZUYF2T#hI!kC<#o -YGI5^B=%i_I2HcK!2<8mvAjR9Om!eqHv<QhvT&_i4fI5^iQEMero-?*vgI*#PgsMh`sRnhAM$tmtBN! -7%f&T-X4$HgkP$L##3)X5=YqAjGtZe~ew*zU-rOAq94m>kk{2wM&%>{_Q23cI|c*8@HY=>_67K~ckK8 -OqT!W-%be|ZohgUUrn;uy@WSOy;H@zOC;yRWigpz>Q_M2aF-R0?d`{!Bco0`W);(V-`$Ro2Cpbs1)Wo -bEQNs%!!3g`630uqiiF&llSQW;OOwmkFx!hkgGoNj}<yu&AO`-sW|d0U_>!nTRV<sr;r(jECYa5Cd^o -?NNN=Ix|2akRT0W1R@Eqp3Si@-k^X2-GB*s4+<c&13H4CM4@w(>53h`shB|k4EcjF`|QE1vEThmCotj -G@JGP+<Ytk?Sr)znaRRLcT35i%;60kew5ZKFPI|(aPG8VhYE6A-qkTaj5t(!GWE@ih((-p)0r6Ua`rH -iOTHo};8_zHGFQl?(cfe9F(6H(RlySEMnIt`$Fg$;jhU^4dH1rddu$_oaDmPNc2{E)WrlO<cRckrUv^ -2HO&j_FeGj3PdwYnj}K|)~R`A`ZblqXz+_K1M%fjC{gc){Z}T~eU756iPfjAplAn9f=nj##n-B)o#w* -1rI8;shnKOC!>`x<qUtutE)UQ<)237m~MuMnE9;N;&)j;@5E|K#Oi7c7SD3)>&+1C6-ID+#0>{ayf@z -PTk;F18%v5$z;3bl7cVjp)<TUOcwxRLnGP6c${qy5nE4GS~L;ArWq+G%KVrtwrohE*2KCVfL{B4jT)0 -g3t|U@346BJ5da&mDM|?g_biyO(|%j`tlyT1<~O7VXsak@>0?12(rfFc1sz(a(TG<S-^$~~>kYI%EMA -fLdr^yBU110fjVoZ1FB`(w3tvopIatXxY9ZQC)OLfSwv!MrrCt>Bd=smD?nwYNs%^3`BCyjjg*Dh(rV -ztH;8S^w{oGQvsDKsH2~bCD=3U9~cr--t0E=E=WAu|lx_9YK>{&^fBai0vp2Lv1wRO^kBIsKnlo_WYy -z43eZ~`L$3WGY*ZeJW1{50SYwFU%<)`|qn6a5kuq?fIDgkQA5-lF+;IJzr$QJjLRTX<osiY=_e{ObtW -NMJUWdxhn$WBWHi6?n>VJE%Ym>25q}`?)n_A*ttVATY9dM_sWtNeqo{RSLS|Kn|mO_vTDI7iW~{oGrh -%&z4PAfM`N)0boJiG8qGJVu93{4sMW}HX;&vy;}jo=-!><Z_ox+TO9!7Xyc~~jnl`h1j!4nsuJP?2{( -yUw=iS!F=W1Kc!Po4PE~{qr!a#NH7CO#X+RnRQy>qn(tC&2zj<$pR3*lL`z|=ca0dfNOi(Fe-v?ggKz -KRJBlDz4<-$G<(?}V)15D=P-FrXWu=KFKAZ<;XKKAc43PddP$tY07b71&3enfBEh`&`b0}nw5A&g$tQ -$~<WB0|@BZpF*hOu(Ulg8^2P9K>GWjsa!?PXOv#>Y+m5@GMzbu~Fcg=!r{w87&c#2f_huu>!O&+s~pt -FmBG^Y*!eZkVeF8cy*_;Oc?ML=n3~&T~OtuN`M>AWn$WD8BnOKjROyO`m-Hi#PqZi1kFMyaS2%)$CHE -_6VDXmx^TBunH1N$?%DSW<%5u*v>bti-2_J2a=|dC7-k{_4bn&yHSiHwQ4D60M#E9|!19zLo<&%7Uvg -Cm0Iljx7(A+6VjWsBn|TJDkx#OsLd+ZSL|<R2P2S0E<^s!o76`ngLKrr39^gRUcO&-{9~`RAT(SBfFO -`Y0vg9X8I1*W7!eS`I4majA7CuObt;FD4w!4gaI+R<Q5%*SP?x=|1lz`s4UyQ*BfQA$fi>fNOItHuc9 -03CgrZZH&O090eq$1r!qj;7CgOMF^+o_X?gVO=uKyg0^aI&QeGDMaYA%dNzk)SbEF1VPI*Z_F6_%#j0 -xzYfWC|6<e<KZT-#g?Ez6aLPz-ibqu<w(-xMp7nRDl&l0hI90uop_Cvo8`F1Cp&au?_5oRiXAW+Q&*? -!6cdzZ0X@r$Q)BkQdp}}y>==&;o44oP%F`HxZco4|k{=9e{5u#LI{}9Q57+#Cr-Ij!N5lnLH^iq0brq -Xr%X4d`*UtG#;EiCAKyD2n+TEmh?<bCHcwbZzievO+q4LmxytoG|fQtGVI<=jNFGUc=RpN!dJ=9VND3 -a|d&WjO@^{&u-3qfm~onpWmj9VdRu%In_4@??8ljhB=Yd=+fTinnZ4_Hy?4_MM{0J+(~^}|C1>&3Zs- --c2Xl>-I~jE)W(#5$*SAC`JWKfn{E!uj<%2{<j7;Ihx2;R=M?D(TQv0t&2H4m3LGIv?1T7RxhK{f^pW --fHs|2rTwS+BFepWc*^w$VDhxdknVLnd#2-My$beVd|0`1C>T83b6*d(dz(mJ0J&o(Ydn|#d?SgyZk0 -F89-Ssxul6zAF?{12uf<boUk@Gcd_1}`~SZV?0^vn&iv@+_2uh}`Jfp9Kh*4BzF}zDI&Bpgqjv~eafs -Z5?S&ACBO1&1{xd+R`>gE2pt3nB!xvxhXnt+tuaGi9Y;Mp!keJpvdLal>#1=9mkeejNS9enE;yt9TWa -WFsjU<!czqq72sIhw0)7GXv1tdAb4h^6r%{kXTI9dle05s1-#}`n)h;Lo_+p`GfDZGodpZAz&M}tRxT -JUf?w-oikKO2BQlC=a><<XsnBqnTo%tl*vLPLIW7pu;!p0Yvg;MRL$&0`ty4eO>yI+&YRxI@Q<cKOJt -^QhqR4RrZ6cKm;h9o>)<Yo={<I1TEP!p3-26&W^f80xVAriFIIkrg643fP9I5OpRNSlHdG4M}Sg(Die -tkI$M$FUK)YyOO>#Ib8hk1CjlSLv`@9MUW;l?HC@Ni2oX_&P|m+5p0{=#Xz2vZL-AWHxV3zWq`QY#8x -N68jNL1YgHg_DB{$&E3QB_v@m2ydTionqo`qb+zN6YR9NRj!@ak4KzLNt8if2fEA^I;1ohJrOOCDWX? -Gy}EXtXlNo2Z?7{v*r>g(V=5dMSBsuKww6z@6{UrFRdGjXnosp?=lJzP6x%M1}!S|=F);K~Ssp9>jzD -D^LhMiCZRRG7eWxxya{Fo!bp<5N44Mv{3ZP99(~cFP(g!G$!IS@??!rw7Psib#A5gOd*TcM@S9!?10h -aaYt?dH@=T5KM{G3}f{Iw^Q7q<$)}K`eF;D2sHaDdNwl2U$7JWd8`%KGN{Y`AwjE5)#m=kxebJ{#$98 -spxN|qx_|tdgy+ROTYPLGMfP@uxVo;b;0(*Vwuk_U4YD7RZ^~Gpup5-R_!e9rRj*DN7zLL>Hx8FsC5O -=aF-IFRf5u>A7-+Qno!Vgnz2fao>n@tuf-{kG!MoP{wWIWRi&SlRg~e`2jo@L}^qNIm`GK4GT-wIZe) -sjTD?h)lcN*0t2}Li>b}K<=A|MECmwSbz0N7@Vq@WFEm2LjC-^kg0c<FBYVD@eQ=DydaB@Z-efArISp -BR|^`@g;1za;>ogk^?zVSuI#^fWkBlAE_ooW1X91W8+$<E?bK_tVlr%!F1`0@7gX);MSv+oB28$MANe -&JGB<8*|njiuXE4dS|qhp@R(OzYEw8Gml&!q)B|#5}^%P(;}&Hr+2%9#gAO!E$%Bm98PvX{0yVX0e** -8$0wsjON#Mu^N=T>j<|fhY>-xMT}06Zi^10<pibPdTr%mmW`~=^Mv3sB<jfUBlR6v<A`NuFm3!e8ICP -B;-2rJ0R^DGkuuZ_Sv{Vf44K(tP2r&pF=y_Cd!M@PRw-;#ei?%DbX!_B)0Jeelh(JS0EF{24wLc65j# -+9gxbs>-3hZK?)~NA=iQ!H?-e>?uDGZzsYH;=p{HT}Uc{p^v)`u-2Bm6055X&jNL8P~k()fZ!8;l@s? -axE8&ZjR(Gg60^q=y(DC@{9`CWjYQ+p7UTG=)AHKG&EWo(kSm)f@1az5?Cy`qwq+qt~E&ZS5|vBNX?u -t;M!h#9EMM=+9t7j<Fzrp<&U2G&N>49lsikU$nu{wL}f-t}Wbw#jr<{00~U%#kUYw$#LC3SYMcmUi_J -hI&bR>ZnYFo#~fE(_j-3XWcaHbeYgBc4%xdtVTGf=DB%vNJ(-KAN5+6WtB+rwxMyX;o?~iFQ(D~R{iT -UoXFxj$ggA@ll-{mN;JF8FwncGs$nv;~GMyW~mAR6bw((H|vO#XxHh{4kM{_*Q*h=NALho>orYpwc#! -cGv(ROLlNo-Tp8&KO?Yls`OeH$PbyxAXd+Clzi^B(vWsz^o-UIN3fWP_YdZW<_YzNdA&nP)rEfY^Bfv ->$O(N~Uf&KRa93d2)uwae(?-$y*5t7d+yP|9Qt2pyH>o#=W2`9pgbsdn}CV>bSus%Zj_oGK0$2^=QhP -;sJrQrrj`ZB9#6T0oZoN_B>cSPt=q))xcd?GNoF${7~}dS4swsJFM!hu6RR)5Pd+7nI1^7TbpsKVw43 -+Isbfd?c)65hF>S9J-5-WulmeHyi|2xj*mxoMiP7?{5@NdLM#bl*^{U>ewq+2+D0_DNOBju{sL^?6dJ -UB$96tEw3f15Vy!M%E@$=>3XKZ>!ouqFt~aArmF-4HIulZnZj6a;Ph!U?*AwDN?_#BRG(6;Y!xOZ4bp -x_jg#*-Z#B&$J+BI%bshp1uZKYC#7)Q^UC$o_Qs*a^i*_UsQsFPdHo>NIRn3^Q`GW74EttQWHw^^?q* -`4|~y?MJu35M(MWkSxb3p5^_K%}GspiT;;!ft-^*c^FX|0><qCOn*_jJ3h>UQ`8Jkvq1TY>i|`JRUlN -`9=Yx3%YE)jqYvPwskncoh{p@>#~1@IZnZ6tP4DiXZINKw<#dh2fLNW_(cP-iO-@By^etLo#ew=IAd_ -WM(-c5RgUhZTaI0qqsKVx*Be4S&eY}2=o#iMZL6Yf_3JW1q{E>>SY<_WQ>lMqGW7eW|NU&FOik}jpN^ -E#VvL8LjKj?9-RMiufd{s(atiF<nC$~pY>Vvp;bV(~%1vn7y?gM&!g$Fr-VdjSAy8{!Mgh0)Lx=RdCC -Quy9s-^^57C*wB|8=N8;Fy~yHSp))${@H@w3}J3t+^T=K{#dLyZpu!fbcF9ca|p#{QCD2a;{!7L*RaY -h(fN8;Xz}@jf>3B!4QatZI#{yZ|8v8~YyG0L__|O~EnB-L}Z2-B$ppvcd6P2?^)_fT;6HOXS5L>ETiF -_5iuS8p0UtOOAFelLmqdL<dhCiAO0Oe?g=6D5agp)i5A`Btpc)62&*hJOeU9v2YFu3@b$t6m~`a+{Q) -0p1wVA<zQ^Nu>%6PM{&0yJEk&`M@_J~Qx)MxkpZ6QX#$I*(m5jQBRmEVM6`#28mH=v{;`1imm?z2Zgz -yvbZM|H<2aAmWJDdC&j}Iyn%dYYX>WEv@M(%|)@Lly=kVEX5>m>=lxgb;Zdqj*V8hrPp1D#tKtdFcTB -K>$X2KC9vF(*@IvbDG?5WzSyPMh_Ozt1P?FyIc+Z+@d>oOYv^}nKW1VF!e3yeRNgkSgZzMK?(;UEn1V -r~#oAcEX(#i6&P;5G&O3k&0-aX}s3q6sDQw6sAVO)2>J09KuBmQ&HEnZ|YpV}E9@g=Hncs{(^L;>8ZT -5_Es|F+8Y9*tu~sdBiaHRaR*Io^0fd2c7!j#Pc*Rjay3OFFgTu=C%rlc?a?cYgn<@(gT1W|2cd77zrN -X!qlzAQnkdday`}%BA2py{Pee9fA!>RZ!3AMO;4`9uR@V*x!+9#<lT*>FMZy|a;I-~sqoXL8r=T=RKv -mrocQkjNv8>|`%saQ-VXcIlw8$&=-X(D!RcurzHFvC&bu&h@g4XD`p^aK!2<+#r&ucZ1FguNKX_C<0C -PUh{+n5U&+hnGt6<{L)a_u;@2txRx%W5E5>c2ZS)Vxf5axcO`~-shp}}dIK4Ay<*%6c)r4sA;tS8gWJ -p0qaTYNM}Xnwa<k@A<&{-OVo+f@w$<rQBIHQ3deQTXbyH+2X9+#jrUAx$3C+xX-tYIiIp{T)UxI%x`S -F@h|af^0z7lZEzpku~O5o~@3kn29~+4wH_rk9D%OMjaw4{7xBuG%q%V?$<ZF)dSnO^C`Zr%ux%RH7|d -k@q^A;sNVOzM#~|CZ-9B<@bhM9)K20Tu)d0(j4yOIAR;^I-gI$0ZU9~?n4SC^P)h>@6aWAK2mnzTaZJ -(0c(1lH002eD0018V003}la4%nWWo~3|axY|Qb98KJVlQlOV_|e}a&s<ldF_2`ciTp?;CKBBL>ezZhk -|Y8u``;;xgN)v_@2b^+RohUkrfIgKnf!gU;t1uGtPhCdUd0_(EuqYvp0Lr;v^Occ2~cu>)q8y!SVg$U -{<Diu{aGj&HVV!_~zi~;3#-nuD4abxN3sv=_ojP_~_&q{`oBUM_we`;C1rPd>uovZ}VAJ)L9xdWzbw@ -!OLxPRTjbPa^Bn~RTg|*Zi+N%a(D+HvMNZRy`rh|>82^++oH;{RaP_z>vfg|-#&l(?8WP6ar3STk|GV -Be*faltLK0F;m!B2UgJwBcW{ue)@9WMi(m5f!MrM0L0$&(?r+;BtDk?biu|)K3-x(fE*3CQ^|h?kr*& -E9@776krCwCoK~rr{4+41PRdZEk3C`0&_HLG~o8URUe^ymxbs7Xm!MaKotK>8&N*LfxR+*L4&1$usXb -?eC8}OveFUx#-z@v#(y|41Rf!EKdMVLbQc~-8Vx2jOIsh0mN^I{yphjmib8GYIm?dKC5T#>BcoBDJDu -gBEK&hzso+d#>mH)Vs>i>#g{Yxq>dsuhb#vt4KPIGAqoWjZO>S&>yefWCS2=H;s_&8uwId;^QQ#O1Gp -za@3%ydDQl_O2n&J+NM7(5<=|6HuD<aqz>dZ|T!W<^}L9nF4Tg`Uufr>c-Z$moN+CV3k~FlN4S{{Z-Z -^2t(EXPQJ^}P;;p#eU{9wvUIYpU<RsYixUg8J(*Qm3fP<{OPC_q7@I1a)XSv4@(!zBFY{(H&zBi5&LV -3N;y+<xCfKloTEXC9x^SO(;czL0F@gD<0QS{1<kwjRpI=txJLq6hR;y&0|H1{;oJm<VF6==KBg5YO0N -r2X+bsPDm!jF0inmu;rl;e-@XI*J>j~p#K3!%92e{#2$<Nfzivjw#^e&okZzrRJgKwU^{^r@M3I2hiR -YvFyQxb(gMQ?9E9-T$!$?^Q*@n0@J9)+WWr{6qz_4?TxyJ!{u^=*BBc7^lMz^60#KZ@^<;Lo4JF_wHj -I{4<zci&Eso;-W;X7c8LzkKF2hbZ{qs#z`HCu>-k8BwhV@1m<_^yO*^O@H<5>nA^a`)2a|#aGXMgv#M -n)2!>$2M^ZUbsn#Y^2KGfpzq<qL7L5JLX+i^&`e<;jlITwd-kF%vJn%S!^6V^#`I=W6#-NV%t`@O3a* -Rtwg{$MAdW!}1od4^l}-T#k`?at)8Gw|Vb~f$IVXy2mZ}K$Y49Xi0%$CO%`nVvW3kn*e2(B@jRWlTsm -4Qmc@|i6L%+?IIp8b&WMCnV8TNX<%F0c1_DTG3L`At<QX|H$P1ecmI$6Lh0fx+A1J!{;G9nKdac1&Kz -%_w2-ImpLkW|QwfCEi83z(LmE?1gieG;F<@1P^g48S@gKf)=kvaoKe;=~fEQTt~O%#7d>AgLB*@gk-- -CjpfCVY(@rP4In@<yAf##ldr!|KQt_F)g?Ph9G?7NT#F?2*QJ8I)mNSK$H2h4yM^G*&vx~f;!pO)EVB -iK^RJXSf**Y*Z>uRjSAQ_Yc{adTdH$aZkB0)5U^&&lr^lSCZZ0GriB_4XO@Y|>w1#~M~^=F{4byLG$E -SfPMBm!9wwhWJc;UTImd1H^EjBV$0%U{Jz3R@u?(^vwfF;kALp$mEUAMiFJ@(hi@My76lSb8%O+nhGk -3CT14>kvz=X?bGKFE*fWN__gbjm3`Qg=bnC;*P81X!>0P(qYtZNt9Eu%4_wtkCMud^+#cN8wAWgsWvr -piNO1hPA%sPyc#L#TBlQsNvcTy#oJK`yw~Zvm`S>+HLB<Ct3!=s;6L8%h?4xcbP1sEWmcG-p7{LL0E| -s|XhntR<4~$$SIE3|>Z~ao~a$@K;HlG))!BFk!x`Y`sio*@WM?Q-_a~jqQ>V%#gpCY*}Z$P-tSI?_5! -r5?u1ojd)-5^~)xMk3#qZs%tg$2ywxD@rnE5f4VPD6g8xcP*zbnMQNc!_=q-fNyOqMm#%|j*w(;_k!B -<fzs@Ym?~uN_+*Gg}z!^c9!JnZ+Q5ZK#6)%3ltw0~AznrMg^cUoE{;tYQe+ha0rl37k+YY>Jv7mz4yN -v$cUM-~pNZZRz3X+yvWu4B$vCQg`!O)rnMh85P_&3Pfw^#Y>Dj;d44z}ecxJ`g70ZUjV&Fm^BZV41D0 -SY6qZjvQXH~@wFjf(*tNft?7)D4kEYNM5Og4?{gVp_T>3Y6&?5K~Md^PPr+63SQH7Hkm^Tey!Cf(-;N -QH!PsIy9aXvkW05?PxbZ6@h53w>Kz7C(|7Msb*Ir8FzQU1kPwmXdY8?kOP(_$h<Hpd&0YT@G&j|u9I2 ->WCN2)UVub9ksZYJ<t&u>H8;LOFnpdv9gvuFKv|M%c%UtH7U71Wod$ms_NS40S(ev?=Bu(s<!y#?hcI -TCTbSr=-^ML6R$Wm9q7_v9Tu3AQ1Wh590R64k*({&uS=|Q>0n9eQyrBJ;&t4uwSIQMg?SQ`u;4$&t%g -b<?Et1(byu9oKmNV9<9*Qgu8v>Rd5!>3eh%qm>FQ3QW3C7ikC#15#TK?--`v=7Zq>BbiRWl8U269iWW -hRj<ub6sL<K}xH;SDUusvaA#ZZjG=;8B3mCM%9XmC!Z-YE%UO+`#H>Y8)GoZ7dMm9hEv~mhKt3a^YxX -wEBE*Dpk=4+2{-eA(&HAW0(RWGsBMaUavF?8h~*5VUJQJB{hjk2I^NW77zuFB_<^*{TY$doQkV0l40x -#i1IWqz*ZF+I)heya%2<wjkp4CPg2?A|AqfX#&*P^a~ax@J=;$y9K|*efJ{5Ck{ejB86kA)N31HVVP8 -WB&RanSDg#L@%Es(toUPW)HX8MtO4OqbFXltoX+VR4MPGxCosBw0xl1vqaIo(pr-0aQOi<6TW8D_fNR -=0x%=*Es*Ch4zB!wl3M#gl|OmY|6Wtf3dQSGr1PqAEg9ahPf*J7H1Bu`3p&vG0E|A~7DW`}T8pr9G8x -vH4Jt%Bq>+1hAipvlPXH4zQB(*`|>shC-B(%KN*dNMy;U8qf4ueR%rnK^cv)#QqP=KA`bvd2Ud(~@C; -b~~yl1Gh+)5&z<Rjn>Lwk>9`?NF_4Zz)O%dkO+fd18cQjlZEdFG&N+Snh)XjHce2iKrX}vBrpAr*$wM -yQ?h3*iPQj<K^nZ7l4xgD0ZL~QwnWn+rQnTidUBhC=0DAds-Z}s0jUB?2Q(=i@*$9U>N$wzB*5I}tcN -OSNTYg4MS?|Nl+E*YFl0}P!k46Ux1&@Fwi;*XkTj1iWe@TO9YmnLHWe~p=d}_m{_Ugq17jW{Qf=)Igp -rnd649J8Cc;8YTaOtnBuEypBg<q9SXAP~uKkk<5{@aE^k}%kVYs9@acss^1+yjU%Bc3|g$Z^L9F;i7S -{DW&SGA<F77-tPSRXYovthDA)=K?gcwRPA&&nzz-J4Mcm0~}}{2g!wMQK#w6Rsz`q?I^GUYT8$CE)D3 -%H|nzc{KjC((Sy9c*;WNU(m)hJXktA>Z7zcXRWs-RxhI_#_w%uL$x{!-c$w`&g%&qp3gMM82EgR8dzl -Nje=jQyuF|ne9LGZktI7)ut!2PTYag+?4k3*eLhkaVN_uqlW<7XATF{7$V=CZpt?CWx;EA$GzbT;l#K -+B*vHc+RPYj`DvRRzZAoj48XzFW6o`0$ZaTn=G*5wFu)QGlkqgu-0T=4lI*1FZ6ehGK+r%}(a@o5Ci9 -<VNu^j|AbsYSXuSXW`Y1Jo9QrO%#Pi{bSr~_qj=Ru(GNUz|{Sog2RUu1-+6>&jW3p4=YOIE&>Nso=Bf -K+Po^JU&_g9z}aWs6i|B*Ik2q+MDhva>@##uajGaE}}+^GH#UcB5k{hkTrPOPzGAZ~*Qxl<rElW|tnh -wdBW-xWnDb?9z$T4D`V$1U?wB#SRJny^0MX_s|Gr;N>2MI~(k){XzDTO3Se(Tc!20DIePa(|yu3sIrj -6gTMf}RejvbiX1XLwFeM6#7r))`mloKV7r$+{WB!;vH-9RuKA=XC(2qg$%}c}l7qd5N9rl=ShV)%%(j -IB2-#QAwLc)ygN_>ZFllI4=+Fj&HzOAVsVViWO4eE!Edq4Dfug*~Mz+ifGn>QyvqTx_56=+Pr{%xSws -mlb!#NxWhcdN?EloL8Q+G&9a0s(-_}5lI9kV6R0P9~C!W?u<n%w&l%VsAdpXJ?gs&a)98q_^MoQw{-b -ir2YMPCs%LC$*e0Vk^(9r9TPa`zmx=UzSwYl^?e%kmaYAu$MeRU_OnTP)68+q=E-?$xInmqCUj5f;HA -9X_Q^*k`N?ETrR3w!K<Ge+@S;>mZR`2711-`<5&h<rwf{0m=&iSjCH~+^kLEt4mCrIyk#ydydO0U*No -=B!VFyM*H*{5ePq=A3wSv&&UJEHDXjgKZQargpNF7SNGaCluX0Yhb;^l;B8SwBnDSN=|WeXGginiY+D -ryGQ7J2nECi=c^81Sr>Li~kIwaUTj2CJr1#Rl`mqz95L*dP1ET}O<z*-6Dk`jExRxSCx|$~I!}VYrLz -OmgCyHEZpfLB&UMPovgyCqkqcbeH9=9_<UKw%(?ri)#jHM_#DWaS6lhcdQh*-!C5)_^la#&mp^y63S7 -ct!FNGOaW%61zQ@evYtn^fqUiNd_N0m96ioO;CyLU0e|c6;lQPHFFH+HF04l988CXtBYo`gHd?OU;c| -V|yCw?uSlap>Pj1uxS|dkIHtP(fDY^))7~PIqkEB(HPwHZ(vub6b~6rgn)k_nCM+4^BE>dmb3<75C>s -&O+O9ezFU+N13gTFW-~rV=JGvz(kpxv&Du>rsC2tu_o7u)$DmjHQ7WqSZ=_cE+?itGa}-L@5QY&V&8k -ry9g<lBm&~{iZYe~P;RVHq7xmnwoM_!42wni4SPwxBltECE@!77<K}wsjfD;Dys2DcFZ+7WL6E>e>QB -fFBcj&VsiHVV9DKRP=Qu=gDj#sidHY}ox{||kC8cK*gR2?>C|5p;=lmsWo<i!pmQ+OMZD2wr0W7^bgS -q`4Ed0^RkFt88kfds_^3C8Pho}7I4`IvR|@4otMhg#l=_rX4Jz)yXZ03>95tMoHhio;kRkPSOa;p)>8 -6NIxopoz=Ku@uFwbZMK7DSfNES)&4{;y)>bRL8Pl(ZS{Zfhxm#NVkloCWUXF7s*onNa$c%I!COjwe}L -DI%|*OJ)gDomratb;&@dq)0(;nx|3ykS}e1qXk8ncrBZB{sHcTC$0+-hX^ryZf$(K)GG3SKi0N%R{Yn -`!i>R$_sV+K<R;`M?+Sn6q=RKFgHoIM=w2SLThanHBIRZ}yFh>q&lfVnZy+7KwF?y>NDE*-|Z43DzOw -zSDSd0*uc*BLW)y_k%R)-ho@Vkd%q5hY~5@&+oKC<AQI{i0GO79HYsP#Kr%Dto%et;gub=F9TO4Lqa) -<mOGoTRC(VblDGk4Rc}$Ewy>=D6LU;*!(hWjd%E?Yb)V^o$+bJ-(ov?T=Qdi)D3HK4Xqr!lGorH~OfX -HK?(K*cd-zkg)0cGiW;q4P_ZbkK%`;5VznutFDrDZ&VCDT;=gu0JX-!7r_bs`3S#$G78;p7_)JTMxx7 -0)Il#V$LN46Z}InIDWJVvgRM6udOdjh(>VCPwG7=E6k5v*vU|FwBqO@|lstZ?m!{k8Qv2IbID#=D@43 -8W88fIiv#V~q*2>P5J6Mh54y>&rY2P_Z5E-8>YF735;>h{w9!g;|a1yXqWns|03i+b9745Niq6IqS$_ -avLKS^w|yojpU+m5YUNMTeXg6Lj73daiI82L~Z$+uD59#Bw_v^({zjhaw8Ko#5i56mGdRjSG;cpRL7w -hHPhQXG=+gdVcsgh&OL2s)vyiyTp06~@cg<F*4>TC`ZJbiHJ@aBg#!o7u8%XHJ<hCWN9L&GQ;rm}<$Z -V_vg(M5GghBSqJHlpb#!4L)8wm^6X=OLdoRh1UZ*m21O<sZCoD>^sn_eElJMBN@*$Ny6QW;Bj7|V{u+ -j+Fyq?1zI5$o7B^l-QDR9y1vfY`)`u7a1em?D4_=T1rT~tvaj{5#eU`9waM&fjxjo~O)}(F=hn#UQyX -5NT`PydceqamW>$716~V3es5`Z4>(q4IiHnYLZ=MO6fsb7m8<yJT%wmWXuq)OJ?nkFuD{E4LbJMh}9! -=cU4(-a4T8r$QPpIPTT~j5VT`e(l{4>g_^3fwRX>-(sC|TPRipf({;a|Uw=({6L*)pshib|`Hb^t2!L -NGhjiVj8;-mZCRmz1wl|K>`SY+Cat@A!pogKXEwqioJ=>uM6dk6!6lFQ2L?e);Q!@xL*`kuYSV4u1UZ -+heHKhMGFD`@wUH`~yL_thfuaq(EAwVm@eJ)#O|cRyoH9MsyZ{G-!TB`V~=bWTp0j08f-RiP-n=U&D5 -`+z<PNc)OCHb%2e7uW6xW;GLLoZuB&GsY7r%<O)Pmo@f{aOweZ58_`8&BYQpAse(d)3{;QKUUIbJPV_ -k$`?o!hzv)T+?+$EJp_yzLiv4Ht?i4-Q+BumloWd411P1)tZhu$0lJ=$PiQ>JY=%PB%u7!3j_~jNMR3 -=yfM}$J@&JK0LbHM&eWLEK3(g%po^x5HPrz$Q5W3ffx=X170T=)yNjDpK*Tcf}Dl27PMai*&BF6`+FF -uU8bN^7f*dI_ZX{Gz8~y;-f$;$zm6cTQVk!7vr1NP+1v+8%md%uC*R_4>uWUPIS_*t73bRk~z7`Lw -Qja}AJ<2YiEdp)<#9$guUi1tWpWP$i4&7}4MhAWNkbX;u55O)fkHZaHX8514zkhL8Ziw~5I>4$hD@|6 --6W}Sp1K}lXiY*9Tt6XBH=bM7<kr>)V@W|1x&Wj?C1ndUpNC!|pnCG?J#2C;AuoE+N0MGg#hEeoKK$9 -InhabyPnHFC7@8cf!SygK?$7rR0fO$aB7C}iZI4ZZD{EjLLZLie^;!{TSr;GkV?6G`|`8=W#i2Zn6G# -Y_UGABjxwj=doXJQmo>!?fa$TYh*_mB>x=OJ!xmj$G|nM%4ZJ4x@tNYcBrko31QkF;B6h%Sp%kSe0*k -@e5p+3`|tlWJ=?UDCZT<1w|DerjtlsamTm`%(ISD&G!tH@WX6^?UT<2nfe5on7DvTqV|Zrd9U_Vbn6g -sx<T+$odN8QLmDx5&FzP?_ui{_bplC9^MA2slTbGyxYc<Dry7DCvTB<1InjvDIda@F2?JU`-&qiYL`2 -u5?Y7fB9@eQL2{$Q2VuG~$`A4J_`vLo?niwy$a3A03*U8Rne*5wyqARPujSxGr_df<#b=LB4p06NsTl --yS9;?Q8MEz8#(B>5ripYCswi`eRbtc2TBip|o%4(Wl|balQnBtCbfCxd1Ny8#Z3CaZqC!<B?tq#O@N -g`(j-mFXr-AiD*BF{l>m{abLw|abSKDJ1q)}yy>>Z!i;+P5LCKp2wT7Cr{`qGQp6()|zi|esI4_wnP4 -bz}3IJ~N|`C*XdM9cHlDogXE$)M#mdM48>6?monD|ZzJglUX|Lm=yiEmY3P&^E#u66D~Lzyld;nN-T0 -m6jWnH%YX^R0=Ry{grL?>dUc=1lUN5$KnJWPQo%P7641UoY^~^{x*Prf+G#AbWu3_5p-Q;oBHzfF#7W -47x3oM<MW>mFYb>H--q(%1m1-3CVVe1K7kjH-_~yncsY7oe?0o~09$Zi;eiJm79M`EV8IIu)<Fc&yuJ -Fg)2q+iUVUytf-b=jId@j@9{;@NKR+^pPbkHRorMc3e1Wf_55{oL!^4X&BWUaJ@x{j@7ifR>2+n}kf6 -C2oQ*4uQ{7~d5iqnp1kz5Y&uz}Ic3^7AajY`Wv4h1D{n*kH9>PFwYM!}V)SXdS)B1Wr38tPCWyxW3A! -bgu}?k0FPv6xiua)jqUCC9%!JpRj{{>R7T2d95M`|>~HqkEILZ{HtZ=&Wc2;Xj;oc6v#0|L>z)%8b@3 -r5J4~tjnoPXbGAUXf+=_h86OK`6SbFLk8@;a>>G&&!uIc<*)LhP3!`q8Xa(LKy(A`vy~*3q`@n07p8O -x1aQ8os7pj*wc_s%QXPk94bWbk!#6pIjGHy$Ak08~XfNGwKGA`XFp{BgOIB<tFm`98q^J3j?`#UOXUo -dU9#wt77B_i3$7DOOECwz+!Ai>c%xH^&VNn>mBSgfGSjc}AULf7(FDK@gPw0zpeEj>TX5r7wFQ12w!p -U2S)wZ@lB(Ua}PaJ7>(9qCXHz_R{G`s6+5DdMCK@FZp%Vaf86QBb@c<<i5lXqyk0L3{{JOANm)Em`A; -uL!tVBA(Vl>f@e!70c3IU?|?B*!sE$W-*f2`=gc#T+Rw3((4<@n8+RP!)Xip~`TY)1Wzjc!B*wsM(oq -#`lX$ugO{UTK4C#iSUWG5AuFz!KrQqr`q(KX#yb!-a65OB#%{_qHgogaoW~ej>F?DJb&>0UoirTs2TD -fJWbc2h*2Xw3KnI_Vi0^@=j#v!K=Nr|C>Q#*B|%kLU6Y<mvR4A~X1Rf$CH0l=4vw-F_>k*W?Md!5OO{ -MnZ;~p<x=)$o9X~5L!LQJwS|#m6-bl$~+AwrX)U<@T2~Q~<E!nbGBnh=NCB&?|P(apndP-?{<G;f{Un -AE+-yul1XOf6FN<qM9)0hFH07`7ZnDURm_6h@*=Zuea6`R!rrwvAN_UPdUyCBu?t_QLz%f@v>cG-l~l -Adu*`7&lg36e*OS*R!kjWUb!ib-0II_@Rcgnyzp5z6V9u?S>ZX+>wHN=Kbu88gH^gBMdw$}kW3wZ>;N -PZ%IJAoVa8>2&SU!#n$Chy1bLUH`k-(XEnd4$stV+CNW_X7uLGn$&pE)n$|XQ&Ub@H*|9|*~O+wI=L! -2oWKJH!+Pk*PX!bK%TQ>jUB*~rC}4bZngXhKjpI~#r{h;JtJjgq9*mq-pMG|V8M{>Su_^J3oL$<t>iD -}Nwtxyqh73qZ$E2w-r!Xbb1Y1GQ_s8=M5PKj-$df>~3me*FZC4FoKsf1?Fzvuu34AawIJX}r6C=kDMy -4xNKBm5rs5e8Q(CruoYXO30l8@U!Loq0<d#9=;P7aJA3Hgomi_$D`hd9`R=F!ZtqH~jRY84iBp}Yn)r -MM294M`76%JP;#Q`iS6-uVjXKR}07!)*xQh~&YJ4x&6Z=pErF3DVh=nd4|c^HC$U!wbo1L=iYiv5){x -0|niquhyjUyhIIb;H+UoD(@LvsA<r6^i`6r$|ADm1^E?EI6DbhtRAbNu*O`!+XM*6K8u%uGNTk4gZb; -V38Lv1+ABD(JAMMp1YwqQSK&HpSlFgAx~zoI)@5HNuNNTCbC%9F3*apZFXftz93X1oFT8o`WXpntDW* -|(IW-fS+_MBlBI%&DgzaHNH76bgRMRvvl~LkqZs&tQHhe_1LpMz<YnSWy^%imvl(E@8qtyVN+&sE~bt -dpE=veo6x+Htuk?m|CgV71rx<9wvX{eAxshs`ei^8=77>RRnSZ3%^I*he5@nfHI4hG;uhm4k<K5<oR+ -dBR}*mTCq^=TFOO68}Vq#05M4%4y>CvQOo%Ztss<0yZd{`vFw@BaMx<nvG8C)Elw(!bv?vbG9uVSJyQ -ygyD>>F1x0-mj8bS-(5}@@@L@=<U?Dzz~{aByp#2JF`7~g=wzY`Vi0&7)}wZARX(2S4!jg(hJ5+&e!d -QGFaKM2)HR{pdRR4Bs)8+5|0#Z=8<}nHxx0TQ;t~aM!fk#s%!!3T2`56B$aT@bAHXtziFRZ(<Z0R`7~ -%MB$>nLKueUlA(}DH7o68fhjpHH(#y&=xoJYl<I57Yd<~9j?#PYi$BC{TN}{2x*wbzpxs>9twxM(~M5 -a1~uJ2rhiw1PS;`p&98FKK@99{QFq(PR6DC4^$;(X{TkW{oLai$!J=m+Sb7JbJdW9u}ey8-Z}nU#{VF -iuE{7wl%Ih~!MG*v!(iHN{?u>DSoynNV#$waAAV84d;Sqm`7bmG)6eOxB*yHp`@A6*Y21QU}u>E!7g| -ye7#B|7V&Zv7^?Kc`_mR@<KDO>m>UAxSwdUAFi9}yOVQAc(SbqQI-auzJybWfn7KdGZT)*jPK9}AN%4 -}|2^QL(Gy|Pd77(ol_3JqnHt$f?xC8&3E%@&Exe|oB<wmP-5kE(bwYcn4`Ifhpj--s>MqJlgngV-A_` -BTgO5gT6er##P?GDKk{MAp9@IIP_%`gy2t9r9_rt1SrMPj<Zy5VupBv-7YtT4F68i2`GKmGYxif<qi% -3JN2_MfF1C=<URd#B+?nLf!QrUpD5p+yR`H(2(O=~4!Zw)zF6dN{@0^(M3as+l=Cx*%kq?vd-rU>6+D -DG9sMz2j_8VCFoiZe*#nsfrWwYgjik&DdL{=70RM-lgBLs{qq(<B_AhrTx;gb3lH&7g$uj@ZbN%uyr( -Zci}<z4Wg4OdLLQ?R7`;fT`xt;ZLhGctDNVitPSYd)RRtt<^HnX<!rlo^~Rg*}E(J5dcf)-O;kiTY1o -}-(q*pjb1%PZBM;1dl$3YCrgXz&d6^_M6`djNv{@!F>1GX<xk3?x@1;PZpu8xowlfh)8n05moITSKEm -L<yX458>etH3fvAIi#JoX!TpV^A=foA7tm*BwOHcT_Nwp-u1JJrL=1{704B1wh1@q!~m90t;^H~*c$< -U8K{usRZ{;TgvY(G^g_a)VEfj+2KUMB?_&xTX<cv9D!6<S<C)YsrBb{Yc!Zc7yPk*<Oe0F+9yi=xMSP -KR|l8LBpqs>lS~IvQG$;ocEjU9~Z?R<KolBGr40az`rf=^ExYZn7m^HL)r3W{Z04gRioirx=@EJ$RPX -+vnJY<?=|5(;U;CV8=kV?=BT?oOFZ69YW~(35ivdHD&aT^E%Bd%1^599b^~v$Vb?ft)yeK2jPV;F~iH -*Lc>#Soal25B7<3<+hW~Qer_gGWX>j0Vd#cp<MQ+0B=PtU@5@jLjvlLa9qh8-yjEv}@nrOdt~7zV46P -joe%&WiYnA;B-ILoGSxb}~j?VrSKA9m^JkG@9h&h;Yx(>0~hQD@cL+=rAdjMZ&`do0I0ZQi18?;Z?I4 -RGe>Gko0@w5$uV7O_S0d*396li}*2}2^XALyIFIM!V`Y~Nt|DoT3QCx3KqGL%#DCiDURN$f=&WYpmWq -WQ9?%lLH9IrJ7)i{Cdo<&N$dos3XH85RP>iLF*$`Lxef?TY{jC5C4z?nW7<hG9yG7sK)#(C8U#NZ04~ -TLv-yOYW{zwlr(GhGt_mJPk%KjL@*Y(!IM*Jw}k5I?bY57?=r`izMc5$F;b3XgOS>tMB+xD9(mCu(4@ -k_y^rblTeDY<rqSZ@csSoa0Xq+lc3)jw7!zo6Jo3$#OavA5kEQ$K7IJ<&U6+=sPWfMl(ETv`tvfV+i~ -w8q5dw-<Kvq0c1*kGWu%65S&=cS4-ve7mtpnF<n1sVxkBSjKnfz>qL9m_auGHQLe8KWfKK^Q78*CQGy -DQH>nfX{o&WUs;{N04{HHH2J|2DXN4h7)A4BNXv~Ba5Dcn)+O(?Qo8loQx@*+V0P&9|d4DJOzusyMi# -$>l4jih^fLK=-oJ0r3YsBZ6qaxmLhbW<7VDtjDt<r*BURy()7kqISLz%ckVb7I6iAyh2V|2|Pt2+IhQ -lCXKZN0d9CINfhb+t3?`BoqPGvX{Qx$0){4Rby7bW5g&lDsehPQM2%dkIhtdJkKajqn}AJI66|?lytK -r*&4?j(Lq51<@$IDn|;~NMn5>ZRSst;OUK^j5O;+d!<oz+XCl<^LpLJ=2T{4$wnzMwBnDRcTQaTjual -)%cBZZ5QIXyBcsPfco-&m?%x<{d%}_9q1nwH$#hN7f!n>C~Bp7(q=aytYiji7!N@oUY&|mPNN#eaCVc -?dOFM}s_a7)o6oQ1FLh`m$fULFty@qW=DH!>pD=mNcg9;8^Q+$^rxLR0h68S}PD`?{3D6d$T1d*-zMw -?$##93t_+jIVf0F!qZm8{pM#vb>J0)piIl8KB9OOx3*hUUmuDNHH(Q)M$@(G%pO~=X;N-hx5WO=V-%) -j>~5w2x@QpCO%e{krPzG+>Hkf?~(bKpOBlSY{`BZ^iIy-9ZC6p32oKW?|$`rUInPOENjBnZDOxPxPMI -H=l>%-KYvt&r;xS}LwG|T<fE~iYT@_CaF&ifBv}fDw<ODeNIOPU=wwCY(P{H`$W6k0)m6?8LfjL8m^q -#A(uW<IK)HlxTkK)E+^9I5lo`CFTGdxIAMlVUPp3}T+#bY`_*M-y*9SlK$*(N^2s!Jv+z_l49(4uomn -`yvSZmU#8ue1$rEBJK`R^tTf5hx5Vs<frwmGgWsSn?F$&yZip|f@niQ*(5UP8rtWKDVcFX-MpPSqa>G -)$x4X3(eKDbB>>^T(&xpGqg5Qu5Z+4Pur`F=E`{rMCfxnPW=rZUW$=*7-Bd(U2gyT>#IDY!21Z4Mp&@ -`@sXE-65SHJNdlLge{U7zD>-s2Yr-*o^>;+e8_za;mc(*%P>8=j9jN>*{3UeWXc%GN8T3MKatlFyZ!h -s05=7ddH@eYmAqdPTrkNa!19YHoeMs89)^f+2pBsxeWQ#m(k5BuX?cv~#lB>hy3y<%-U4sem3KYWB!2 -?c9?E88l=Y--FsoaM8;o_>Y5b_0m%!uiz`4*6Q?nI<t~T~qK}dSQyqET6>MG(Bx+upR;b)bW`^jQaWe -Yk(BAvM0nehvo{!JDX*9M{h_T>x5scLhE`-~~wV^hu)@1gLc0j9!GO4U%*4%F?9qll}5f=sqDzMDk}& -9gwoE_?RyAgnfgRq#GMuj}0$xR%F6{!{warF*(fyD;t)-g_<ex)}ZHsc-bt0|JK&^{i^Y_U$*>a9uRt -ZEvIm`+Odd?gvijNNV~34W?Oz@u`%`80A1E)a~3l_f^T?ZSN?6Y=U$<^oKA!@@$dOkxYcH)sbyN74*E -`%rF!Ls8&BS<>9E9m#s3m>JgiFTcTAG&4B~Fxeb$-um+TFH84C*M%_=b)47#=#os%?nW4jDJQud{lHL -K!;@d9l^13Hyw&p+uh|qOWdw|wyyyQE)$wT8x{JX%KRc)2N4fC-(Z{vp23T!y-j;ZZy5XN$V?9`r^iM -}?0e*O*pZ~##m{Z6F;QRG5O$8#XhW3#UxsFVEq0Ub|UWU#JY=$fgJN%Y%C2=97~A!LwIUOP9Td5<8dv -VohG`jeKc2hTOUqsa73?)5-R`E8XqnInXa^>>{B%L`H3XQNx>NexHco%@E@YxLj=q1!6v1K}iiZN!)} -FjI~G?0gP<x=LaQbldOq>x<w$VC!Jf-Pb0x!1`dNY0qNz&XU3bnx~%3@(fw84%hHFxqAm-oz8yrXCm^ -*2vAgDicO&{e0(GWbwXXv)&q^SICbKQnI5qE2CqWT*qNoygW&}v6n>R=GYK-RMEO!{?nE4XZQT6M_e{ -IKs2)&qu9?%6>05>*BHS8RFz*GTt{OUlsyLnynA;j4XPo*8VBCVTUz9v7ep8n{z{sRjZ>BYdycJE$B} -L!BBs#fusSvc-1M8M{I*m;^W6U8^8W1c&m)BvEGSXZ6M#&)r6#b94LfNBM=cUT7{ms)am;o}9h%Yj>4 -!Y%Xy&f!bgHdjHZoLN(5m&yz%AeLkQ(?I*Vdpi(jMX1}39+i)JrQD;l8bK!cCV-Rd)!U4_b|-Iwg5XF -AV|9`(Sdn8#W48)=UgcJi3{E+H-Y-zmLxpG^v3*qthU`I*5;*3u3AR+NZgg6M1hz&+bWTZZsgeNO-uQ -gbW8;jcrnUTWv&Xq^qmPzJJ`?(w4Cl}gK2*G>}Bxj$>+fX{`Bd?_`nG+hY9v5iC)YxeGWZlKYywwK7o -dj>f3c5^ZlrCSuGy$H6#!2WRW!Q&hXb0b7RP}gjRFO_jKk))-&dS?EB)$ch4sOc=qb`^Y33wUOjUUgJ -X6?M2pAgZ*Pw;J|4ZT@9#JOUWIQX%)WSr=?_O=A^=#c$LBwdu=?mv*ekJ#X@fDRgYqW^{Z=wonZ`pps -byXMqO0`j;WBPYpL8b$e9T$#&12GdrIEwQ`!1#F*9%)LRG%ovpS4PMjoxeHY`w<NOOiCTElRC9uV)UP -q^T3!p);P*8pUicp}ZO_(6vcu`m-9|UX?1G12=5abZiqTT@m%hrJX1Oq&+9)>|k}Vby~G4rZKfHoKiX -A(a3adB*4^`xOy_(5+OXte>%qEw%oZ~gJRmNMxF9>kGFCP#%d01(rMja8mPMpDIO0bS`|YOt-V=!W%# -&mjh<wR=^V@d;n=<V+ny3VELGVweREC2<Q>^i3}maa73gty#J5*e$wfJRmUAc4wboH17s78xIv&eDct -<6F3+CzE9UkoKDdb1J|LZs>Ye$Rq!HB1<;0k~<a4Hk?a&&ReETtk0x?+i*Jf{sy-cwg;GR9Wf&wUunM -~~IaDOsL_;;j2+9b`k05;fYEY75b!7%l^N)V^=;Rdt(;%*4N?M?Y1L6%~&l0OIc$z-5osvLihj*N(Pq -sJ(j>r%IRCM<MFXdQHhN|G};9c`D+F4lbhnku=9EJTd_5D)+ciMkk~SzN-Rcdtq<nm|5q5+3+}QTbf9 -(@?(oCNRTFiM^(KWTlAg9w)ai~9}~QrXE{f@<{-~r*kh=fd*Dx<kzDP$Fxl)!)7OMKDrY9m{bQqpx&c -CTM!XRo*LarHcn-71ILju#F)s}ChtA8!b%{kw{pZ{i$2Kq}vew?ZS3|9zS)6G?mw5D^7-F-}nR8dGqQ -+h8*6_v{Y=RYdpH-Ji_$wP>S!%p~E8bozF-!wSj#b$jqajpKy}%u_rG;KhK}YQKa6M_7Y_)Ef!4e=$R -oE^Er+z62SgaE%0A}YiomWT$qYQ!+R&rxSpOAilEJ^3BW#?lp$r$y`-mR({{Vm|jxs|c)sV<{`do(gO -<<}GjqC8h>FnpW&<)s?W<t6l?#wZ(P8Qr~A8)Lz3czH=9hibAJ>n<Hou$dOLGsg*WVU@(;ujUu0w8M( -1nGS@|2cUcSL6-Pb$N!uDw=tVHNK%uqZW6uvRYnC5jg&WJTrj7z#R3WTUJe{6NP=dA>#h8Qc!~wo5+r -vprVyxHBcO-WZgc&{#+vBl`9ep%3)y+djA)?*c|6cqA&cy}L!Az4!0x`K^q_hz+rH37u{)Z1ZG4V3(y -}tCTYotu^Jfq%34F^lHwDwS)N6{O5R|HW3-ADMsJ#-KO+eL{v|QVzZn|GY+-fUALjPu0JCan9n(VZ>_ -*H{ed4-j%^4O@;A$tS%5FkXq;2mL2q&qfp<kr2D2OU|+uxkXetX-9iD)y!i^q>KaV_?CJ)}XejJhl^M -D3G;B^X%9u{2a@lvZ#k+p`_NzXKJgCDdus)S3FBDZR2`#Hs24)a*n2oL;*>=6P%@@gVA{D73NfbIx?N -un6}E~<Y=aYwl^H|I3P{L3}5O$$!5$2N{A|!1YZYoAvUnND+~`kZ8BK+ad0}_<V#TVb|t#0%fLK~qq& -EkYGNRlm$;NjzbN*`y24#scqs?-U}K8?1joED&=WNlo3NmV(efauO|b;7PPd~VLu9s{P+k-jpKL6svi -mEh;EQEz<Jj0ustTLZEfX6viIl4`=pnXQ?`UaMLPost=!P;Ow{woE@=h-WxzbBBbzatRPIaDsq?`l;o -nbANS5}zIO9Mfn^jZfHU0%{Q8_^0ff9&rFVa^1t*poI^c&Jy#TC@g5O!QpV&9MYVvc<=e{)GQKy>@0- -%N^}}D*1tqzSW#$n?bP%q3d5>hMS^>mTR;HhtN|c8<-ne9c~kLj|--%Xh?VolsK~WZZ$kbncq=lTO$q -S$j#Eu{*#{f%GBifohUiKZ*{(wR){=cz5$|R-fD^Q#i#dADY)1qGPb19{-7*8RLLg#N5Lr;B#Hwf(gx -%s!~yi5<g*;F`jX>5X&-R(c~Kl;$V3cJ%?KHzk7;&uiUGW4?~RyHi+h+G+r8?A<tcSvq0h>LkCQx<x6 -(aKyJS{@j+M5xtSb;W4O*@Mc1BozA0&I8$7GAf=We`FZ%`^eyAQ03--OS+8XX=oJ#rmMP2)@ySv}=~i -LB#y*8AR-X`3=F<t4?en%K;wW}>zel_{M<tT`eS?<(OB6#Qoo%dra6y8-)%OgYsu^W9k+x<@?g2w7cg -tUsRM2=*G@oU=}+f5m@L#GAmznz>oj@L{?1%+oE8Wmks7bw1*07)UbV7$GPYxnp{;?IgJ(WsDUYyk$r -<`}ggki%G{MKy6xenR|H)W~yM_$;YVoM`2@8ca#)|k!?AFDbgvVP1Go5Ma^#91g5%mOu%z`uRg{7V|o -^xeq@8h*fXB@<Y`3qEK?octMvp(WA<oqcxo<W=HIJnd@o=-dIg!`bWKlGfwHzLta5Cy9<!E8pP|a^lW -FTkX|%*4E7&_AOQ1mbEoa(z(nEa5`_WMK9HB&9wB67#WfIs1n3PJCL*3E$S|CO{V_lZ-T`1J4K+lAkt -x}#Al|k5)*?UpuZd1{{%VMA-JF^AJ0zPFg0Sj5%!G)6^n<~C3&|y7)#o>Uf0s}$M^Z<~cx7LE#=e2N# -9wCHLm$DDXSP^U4ZReFiGluV39uqYa?czO5QJ(veGYg7YbkCOY>A1KhlV4NXAny`IqnE?=b$YTMDL?8 -CIwCxL9S;!SyK-#x^cYqwi%QQd4&&;b`Lr<@&9B$P>yFo>WNifr8Wr|UX*|}$HUtmTUk`D7Q$TA67V| -Z_(a1JnDn#}mu)**hbycJRwUibb`WU|-%C5AP_auWfRX(Pyszw(uAT{2F^VE1hj@#`~3@xU`WtQg=s> -O;z<7}t?;Qs(nO9KQH0000808trnOoo@Wn`{sO0NObK03QGV0B~t=FJE?LZe(wAFJx(RbZlv2FKuCNX -=Y_}bS`jt%^PWR+cx&QegzV5hNLSojWe^mqsGZ(9cSxle2ncLJGRSEBqXt>2$di$Yo<Sb-+KT^@Q|a# -ZKldhOcB7tyDvaHY_vOKk%*IQHfCip9sL{M40Z-P>_9Bnc`}<9%suef-nTFIM)2QDcD63&B4Za~TCBp -Hv-hIR;;=|W=EJHB&e?~fgTs@HL%+B$SeV7^;PmA3{OCVFUY?#`;7gb{c>46|;2;g9WI12vT=J{{99S -{uEKOv=#FR~wluMRmEMzgf%9BZ{b{QQ0UM6>83Ts#)Xb?tH>EjAqJ!CKy*5AW=DHfb9b1_NzLi)6CvR -H~7#<N9OM04{s6|)(jV7>}zo^o!U<XR2}(_Ac=&-ANzuw9x=4(}trMC|l%Bo@oCFq5V-=D=jG2N78_6 -p8GP=S2Xs=Yzo@2*NZC0=CbtoZ~P{rd$@z&0v7Y@f==jEd3cTKF~Wi2(oa&gTNaA`$KlkrXo$nipOlS -R@BR77y&1~VTY$52EoDUhYxShE)IjUx0jcP=O+L(=Y%kD&vmY^uUEU*nKQ(<#~#i<K0Z9TJbV{?I666 -O&ED~M-?(q~uQTtD>kJ<L;pv6!5Bzh1NC8^!N{*63>Bh-)%5xMQNWDx8RDhz)Glj2~iC^SlCeyIsL$= -~9<2(i^C~LuFib|QTEl40<AW)(LO+{`rbkF}6sozU~kNLh2yC;%B8DJC6Cb=k4#X-xgl`s8&GLeCH#} -ailIQ!q__opYpPlx9hN2kazPy`>uCPCmql1;_ccn^dWkv<!-xnlAgj|y)*VDJIGd)w0NNtvVt5)C`@` -(-L}V*xb2mIYrB0r0f|LXklPD_kzqHO{>Y^F)-Af%3qFOd?UMIq2OAVZcfN22wBx4Co=|Qx*W$Nf89D -<mnWwC6s*sL}XkeYv!BhBbc0ofISC%fLF2zvk2f;6UNIh4;KVy%r1cfd;$UGzyOi25idm{XW%S&?)Pq -k$oRB!AI#53lkmfd#J{fjo{4-xFK8Z!3<kg!qE+mAp4S8geg%90imL+r4bGQ**_;SAr$n;PkPFR0Ga` -B6dWz&7^*=i+CutI~w`WKCb;V%hK0qb@HktY!<pM)m35XpebixnC4I8nK9}P|)KN`ycR*1ALYV?o~X# -29(sVO?+e(sX*0m)Tf=^{9~I6wUFkRIM0ovVirCqE1}a>shSx~XR6LKHTa>*Yll-QrxFQO{qBB~HgdA -D-*?rJPp-pyWJ@YgATq*jSC#{IqrlK(5yqP^=+ULc;@XbaAdXXv{*h$C>B?Xhjn`O)1lqrqpWrn@BQ( -Hl#%@m`Xd|-iagzy+_xi7#{)uBpZ#`ZzVc{jI&h&nh=X22sq4c*;<rOI*@27ZH-T^!N%)MTtJ9X{3~E -;fL}XvlBtoqi{oCGTKpI}Ybm%UfYqCKcZbM3HL9dwlQw6fFnaaSjwpMJw91geIMz-o0e85;KfR5?q{s -q{tt_+??)oSMqkNPxA6x_5`0x?}L<AlV0z=Lr`XqN1K-BAgy8^0_Mudw3$_u$lz&}|Ys6{f)Y^zdbJD -ScO7vv)=I&P3=H~AF+@oS4|@<FaOW71aalTH3fi-C~HeLe@#1c@nNf(m|vU&;vq@rpAQsS=zRH`=iZG -qiBI|2|CRrZ{#^nTB3i=a+Sy5;=I|#?tDGVJ^B6+-S(+mR#{I;TboLL*;IM%qQi{bu<iw1vosD4gzZG -$CSnFiRDkb76Y<?yl2P)OONC-O^Wv3_<^JZGEBWj>1xJY2R3$|J3Z4IM5<Mme^XhTj)%2&dN{TNigOE -r3bNYe`iX5JMm$}PRgu*mK#iCpnrgQ$1DZ%07Qi=DNO#(DPa5Yx_Gw3p6jFz)h9&OeV^EaK6dV}hQGW --7y3ScCVN(eBSTC;W@NR1DjZz-wJ^8@_zNZ8sf;=Ad(rBvRNtK$JNn@xPsH;tNq8uoV2jkS%Q+?lHIA ->}dRbqN32IOeYc!D`5%0ri0IuF5Qqm{%|&^~_DFNc`G<$NLTc;9M0tLua+B$OknaROJPNz~q4&PAEV= -#Hq41d%{}(Hnr6D%ldK6B#=2x~v3Dj^Cafy+6FT^pgxoA-u-jkWZg^Q7p&LpT{Bsm7sFM7y0aY1?{;M -Wgc<-?$3)wx&!-yyNzWp;~~ckbMUFEF3x~p(lBt7tXvM2xydqD6I8XHm5T{T1YG(G+?ljM0Y9i97*b% -?+D{94%J0BJ)e4_6CycO|b#O_TuEMnq1{4V}iN}D1BXzx!OSKrcHMjztpGimbJAs>9aEf`(!C3(E8Y2 -9~Y(ru}L<uh;@g431<^VEO%4UHuh0l<=<Wqqx^U5RT!q@tZR|g*jcxWvLxG<9pLBBK!EmY<p0Lx-(TN -zlGoc;irpjct$b&G!sEW>Idkdb##LB)h4Oqz#xBs2>|ulNivkfG#J2(ShUnWTh@&jy0QmrMZINou@+N -^cRSjOV$?N70-|x7a_howJ6vzt5Z`i_$XY&bZ@_4O_sD4BNVHS?5BEaT->jr@Q(uYF{)L`Tk{IZpsFA -$b<?!17uw%6Lx*Ws7HVW@Uz^hq-cqQQc;U4$iW{&mD<$kg9i36S>19#vxZ=Gx7gW0H6)OCSmLMak!Gj -KTbzCvt&j6%44b855~icCsSWMC&Hik!4n1t?;|e6mEA)ga`>T74pTnH5s#J<Qe;ci`Ij#t?Il3i~&t^ -RM-7=TpdB2Wgs^V>5g@&)CnW`UDS0uK<nlQB$i@uI}HhJ_n*3Uk^ZUt+5-p}%ITD186pr&E3v0|Z>sB -{_C!y`jV(jOH+rEJ!An<-l6W!Bc921RYXcoao_QtwjvNi%Yq!OkYMrW5<rltAX;Y!QxuB*_2otlW~(u -w6rB9L6DU!;TpEWr;a>U0y_?K1XOl(CK5r7fU?O2r!Rp)}|r0)!WBNZih-p&2$2(<O9U9XZlOKEuANK -uvcGSx|7XrSO5KlJ0nP|0IXBUEvm9R4ZvEY>W?vd%T#eKrVr=kM#=gMC6z4iTj;4$ycRkrZpt&4CVHs -eFH|m$-><&CsT(6ExD4yW@ssA%`Lt80FNg359J&GXQ9vHU4f2gc<5F4<VF&F`>-7wF0u@L(7MG<ieL; -0Y?BG<gX)IS&Ym#A`%l&p(&$3*b@oJU4tC8yPY+q}e(jud7=1i!kVESBb>F7j9#_djVLuFsFy{;eK)_ -u_a5DoeL66`~=SDL&RudBzs*LY0Y@hUxhy0TBL2|d;Aq7DFXMe+E>_~xcRwh-fbl(SFSKEaZge<Djj> -aV|mF_qSIxB@)5@gB#-y@#3juw6Bo^<@9gRG^UIc{}*+SC+B7-pHh;MQz|zGeB<>CLv$Oc1!j^RHW6a -*R@rAv4UkgVN=1fui&qe9?F0=`^Q8EIiK<SzGI3Dj_qECMNu}B%*AUl<szJ<Yf66UsKrygQK#<zI@A% -W;85}d>Y#80%?R0#S#m#;#hMzMX&i;1UoJWx&yZquSkH`tVqXqJ;_qcrC?_oOtPJxWNM-nfXN9`5fkT -eIw^94$g^0@(G684Tp)l*baSU>q$VL*BC<#**%^`J&U`LRJsvn=~A?tumGR&Q@cRNxYLfCuEWE#pjw# -SgZ@332rqNTU0!8r+|TQjKw_U`oJ`Oirfi<SJ2X3;tXa~wwO^ul7r(G(j6C}Qe^79eKkTG7ZO^-=9Pq -uPo>n7t6WeGZNyC9I$B`pflGb?&PsKb;Ce@9@qNavWbgpM*KS^bw5;j*ZR~6==vNqA(3s$t|!gI+S+O -LRl^$GvcwvUSzg@F*?D-<e8d>W?co#O$t;!&?=Ku6B9uu)|yK9=zEy03rfcmJQgfgoY&F-3>HHh>n4r -KEE9O|CCSv~orsPQ8-y8yszfxbA&}k~%2A&+JW`LEsRmzac1tih*iqdMGKU*lfatc0Fu{Ta-qE($V-7 -7hL$B!G4>o5Zt1%aubPqVD0!j7UaW1@~y8!w^RgD$m4%rW+`*M^>i)iH~V8HkZ;vOKY4io`#>&UoXrj -I_+S7BIC)im<tfg2+`?3Z7DVR(|E$XAz+!ifMyU77y2ZOH`jO|{<i5XjfH^DPit)n2G>du{4}8TUG@9 -B8BY9`iI@1M#T{Ne{7<Fb80GzHR4j&EqlPKYHw*17~xC$J)rgD$)SciMln7zT{yZ&0V_I(2c&W<Nf}7 -9fpr6ymm;VF)L)XEAqcKWS!I5-F6|%idM?lyB28a>nT|t6_y;s1L>+Ag-{qyJ3!;@L(osVIK4DCN*gh -gJan8)6XjhXzC_&LXe3RIwy>oB0F>Djqts<EybFQ%FB$h|J|l79H9^$Li-TkEz7ut3O~VlKGRrWc+Ym -2zGId1Q=uG!ly??ER)w}4^c;usf=D&sBPajr#b@&Uj9;NhM>K?E54=etq*%5=ooTuq1O>V9H%H#v64V -808pI@e7-DHAXI>&pfBI|l;)OC9yzxUe_kHVcDOS5J$Q@s$d#R?9gqau$B;-Ujw6WwYNfVe3rRTpz91 -~FF!M`@PX(azg=H_D*f(UnA+i=?$K0wz8BqNQ%#JMMJ!h?||F!CKr%?llJOd%drj`*O(kI?ahV!90yJ -Ba`h|iEA@-;G`i7hBV1oA12#DA%GFC6F8o~#2ic2FM-{ps4b|8LXSaPAbXjyHF@}{ZV1)ZYh7f+N6$W -6#|d~&Ps8xgYOHQX-EnGK^*vt%C8Kc3-A(u59LH-k@${`;yvq&AayNP#d7%JA#n4({pJLOi{f&I$i)F -F4%Gj=Sd+t*yd^gEXT@bt)kFZd0!1r#p(C%%3Zxpv#yGh#Bc)zgwaHyWIkRAnWOihSt#A73Rfv}n+O1 -{+hT&)Y*T1x6Iol0C^JAE+)*XB6*2mv>>^;d^|!}PUrfUh*OCgk(mp!jk8T?AY2<Za`{8i>_jx?HZoZ -e()@UhX`T>Yu-h|6>cq)t*e*U`;bJ;!6mxHze2CIg6ndur_U|oFFV>n@I<5Hci7>TdZoR_i*<!B;H|0 -L+bTN*BA84X(MlYc-kw)n{L;t8~0GWR{CR^d?WAKDrLdN&2&X)DGz2ReI;>K)k323j((e?Zt~T6e&^R -ckg%)b9%=&Y6vcuox2{_w-8NC3Te#{1BGv^}dx+*wlW0Ra(vVCSneKt;4)v|5kFcvTZE<YEBfPih_<E -XO&pSUHs!Ng<xTE9mPcd|@aseCzMYrMORa>W^291y^TT^^cU93d4x`q}wYIChYQU%Yb%7A^>`cx7@>E --1HUaC{^2D~-)z!<v_I4_%Vx`~P%I~Ap45K$p(3Tqr;sRgLogns|9?6wLN2F#7h94{EB>#_b(1o?SOe -!W5A69Hj|t+<1~HIjC#hEUCtWvPvT-VW6bI`tE?CJg-15)rMhubXaSu}Y$*Kd6I`9exbQXynD!ug~NS -dI6h`rmKKJTu$8Faosnso?KshF2eJ6y=x!JS`E$i8(!N}SnlfoP)h>@6aWAK2mnzTaZEiCt^$n*004> -@0015U003}la4%nWWo~3|axY|Qb98KJVlQoBa%*LBb1rastr%->+qU+*e+6%XKyvE{ZMNZF7|VdJ$c6 -wzTP)eW1cAy}w9Q!-bxA6TH}t>n96lscqH~Mk3P?;*=lv#6$@!~uvJw?<HcQg!_4$8rXLdR}CGSOhkb -JY%B!53A7jNEPoWs9w$nU(N2XaII;B5h5zwi}n6sw39L~j}SbkJMTkQ=eqPgFAUljxd?Y7Tp_V3JVa* -J#NfIxXOBBN^MXMkB2o#>g+%@2@`GTow9R6WUbd{l^ctzh3|N+wI3+Z*UXfW+x{npQuzoYz-ukD{CIP -6b%w0dn$KKDzfJ*Db8!!Y&yDOq+)B{fSkM`pRPWUZ@&Gm06Mc7-?u^nFQxrbD8EvNe%aPk1GoKbww7W -~ij~;6R1^QzXkEfvZL~28FNgv?n@y<?EmID!)4cXryeS_+^4Y8`X<e5kxg>WPZ#0vwWIDT_&1S2bDn+ -gyY28t<S1um@U@JXe&ImjxKmNWWHQ#d$$}taUEaQB^o`IZFAdxD1JhKojlL)PV^Iv8MpN#!CTaudYA1 -X?o7v!)c&*buw92Nt}Mo&S07(uWENKAz{QxNb^2vR2)eLsRoF#0}b)QFJGlE6EFM&DCP|7$`eB{32kr -2b+}3l0@etSZqVY-C>utJ234kb~F4zXse~Og%y@gX;h;J5$A(%E+0)aQh{1*5Yn?aX(<5k`}T90xzOW -xH6JTR&)ALvju?+#N>e_HJ^yUmw?I><T+&ZhH1izO+hY-e-{_87bY!DszVw9rcbOVuD79N6HV3~1o@y -&09vTF<~q+vwjgikcW(k^GNH<b?$O0U6}Spb<a8@tCLvWVbN80d=P6h)0HX>C`mMrk<w^KK;vU{@rQ! -E<wFQHO@NO#&pR65-o!a*#T$F+BNeS9>U6#3G^?G5dD|^<LA4J1koxsP}3Vf~sp3|Bu2EK&QRhl*{R? -K>UB?J)Nds0hsy(X$<E57EeS`c)CB3RsOA$H*TuEqG*TL^|dZCi-EBFPs8EF4kD2)}|#_1BjeNQq9a7 -{H(wgQ^gU<yz7Wn!~9p)@#M|5k-GyCc-fvfX&*h9qFenUu`jbSF|&^LP;wH<i$QMyJuV0tO2>+z8M6D -*X&GUUgm-DcUH2c{UNU-3itCKov%p}1gaeT4=DypTE4G=aZwamzYSfZlMPX^#kP>JHIvR@ji{LENH5r -o5{J__*xvo*-Oa6`L6An;R!$7yO||xXvr3e<di4@4jC<#Uw61-zK-2|UbFc%1+)EMd8YINC_pfce7+a -Q#b@J!Wp4#Wn5CUu{QWb|9L=OnWq=c53Rt>zxmCu;mk`BB4*hf(?BY5<A2P4wPG>2>t->}A`39>H{6! -7#?$J7TBcbSLC?tz?tiJ-MSOwo-eFLC-QuxWUeUcIt(=Me&XUa?k_n*$W1=PR@lAd-YosFG1VN?2C7W -SziEinS=9n?sMp7wZe+y54};hmf;sQI=*>Doa?Q=CHv2EAs)zhjbvC&x|1_LPvW9C=wWY%dt~J=O$si -DYD!_VgIF%l-JmR=UHsrT79)8jmj%gmnnlzjd@Z*L(yc{h$pgzKWOSc)5sZG_XKNKGB#YEs`-4J-J$K -~alyf?FL&$^q;ZfJ;3kH{?>LPx2H$CWGGKEk7}USmD1|W=MqgG<%H1#*S;Lr-tKgO8Tp*c1Kqx~!;k1 -C@S~Jqc0$Q?G%nuM@qfCddyaH$aM8S{!m#I_1ETKz#Q&}^nC?W>5*Qj|yPK4X>usK%55L*6^7=c;bG8 -|3|OP6=RDawn4KqKl*b+z_tI*>a+yMMtjF;c8ijO*NP5hBMv2vLhR?bVom-)RQdDwsP1Jyj{BuP&k;3 -Jj(?#=u7z!s1N)0`R-0n#Mme5Yl0X2F@Kp{Ig=u5iqwXxN8S_^Ch+-_G=vJNT}D_<^8m>9J9x?Iy;FR ->ybcS&Z83f=Rq>M`wAbLgS9-8nh2vPjIW1swPmYaUT>AH9?~w3WaX{w;$|54@tz9$>ITY%Q7HhBV}Pl -S=>mYyDV(^B3Df+Bnipf)pO*v~Fh}wj+#PU9mKw)B!EPsypva>reU(CPa9&0dV@n??LiqfH{)SJYeqF -ozW#fmdp?<0PaI$f_`&_NrT8G~z=`gWXpEglQVcLndk3vkqKY5$GdZ1h<vZ9#_m+_qVVoXP%q6Ow*jX -6H?IP(LByP`0<^_M=0nlLqM*Ql<=+bS6SEvD@Z=DZ`?(ddz|U{Z;=`1BIpiS{1VH>ywc7)s1k^0>MT- -W*5c;D0CAS5%~-BOdE4_S7})D-WVN#G?m#DorI_KaAQHPBSmJ+@pmq-HRQ~upcKl#ZCAhF&y>r3E%(I -h~nr@hSY>Nm6k8M(U5`@^bFzq%h=rBDldRHTXmQNW#Xd6pA@e>8k|QhqHCRo1NAnlSj(Eq98;U{3ftY -pxLX)YU`cM_819I{0N+bymu81kT?V@P2lvnA$-$qujY&ENpRY3_8oHl&(Bch@|T(oVbKu6lwuAJW -50THw*S&EatIH&9Ch1QY-O00;n48F5Svrfl)IBLD!gmjD1C0001RX>c!Jc4cm4Z*nhWX>)XJX<{#JWp -rU=VRT_GaCz-Le^=bdk^l24IuJi;yfYIZ&fSHCOIUln%dL(50PlLk5?PEIP?(WsB@LMD`nz9M^>1}cG -vLijF7J5B8l>*(>gww1s_LrJ78^Ysv1ys*#nm2LHkYIS!Y3PB8(Zvoxwx<LtLuiv&j)OGduNxOUUT;L -zPT<7c2Zt8cWK4h%W_#{X_J@57&@JB&R!ippB$Y`#?8lurA5Y`zd1TRKK%0C>6_ydd<g9}Ha9m9=ZhJ -i^P-{7th{6mfPc-K6u_nIvaHlti*$OEUh$f}oxH8b8yhFf#iFd5nx(TDn_C^`DLjmK#@j=-Gv2}f><$ -Tq-SIZ#9~ZpJX~5ZFj2LWOR^^-}$>p+HRy;{qK1aB0S>!+xp3L%wSLv+Y*pM&q>9iKz_&m*Ls>htyHD -H+Fo8&T|an<8*by=w2XXVuu&{_Ri@r?}uYOKJ#$m?d7Uratu`2vYD1mtdcRl~1IBHK>O`66vpkCUbXk -cV%Etft?R=6=EJA#3=@hJKg5=4o{UfK<1<fSD~S-pJR>#>@qJR_U}!F7A^Xem`Vayh-SpocLH`q}t>A -dU_2@Im88e_G~-(c5-}j_~s}%o@{L3ta-)u)%3^E{uMoolcY%JK=%O<VmeFfTCe`=ysn|`q^im)Zc}B -jx53~C7VrRw_~SCKcxKojui0Gm#uaV@eqI)rvwYgDgxoZIzGzre!Vqc3fEn*9U<Zrcaz4vy;8|D<+y_ -$$d6~|}p^@Je6`z(@MgDi5eJd!q3W;~cO;O$zW=uu-VmZIyRdATY;x?V-*=ouepy_PMk!-o>N>I1hVt -E16VFzyy#nwc+me~?mJ4s;Q!EV`SXOS8<8nWo^H(w=(M=#$blcVQvUK}2M<ve_QJb5`eKAyZ#+!3AQF -q1+^AGWMv6>-y}6o6hM?8R^|)f*mU7&{_q6%ncxzvLBifh5qFeO)g2<#IN=XLmUWi3?bt>$JGy88nAA -1;N0|V#<+W*>9iy4yRuWsRB?qfVscB=CDJ%(MJ?O$N&P#tHYxSH8^~q>?FJJrsA|u0r@!kp<v?Yho7T -?+Zg`o>%g%6?z5fb<>BPjixX%TYl4p?4<U_@U>D)P)}yzxv_XLw4L6wk6P+yQAPw%Z)eBxvtDIOP(C{ -06e^*vnjV-?}=X|sP5r=;qEI}++=C={a!T^L<`IHwmhiPmizukHEOV2~D*T^*br_2soKF2+ngGiu$FJ -RNo$}}6jJAQ?KzqzQ(8E<$U0P?mfZ}W^38plGI)tX+f501Y9ZX<$OKstK0@MsU!!i&au_Pc+xHF=%F( -FXq)3t|3J9jsOJ`mVW%Bb2J)mHZo@Hmbc^BH7%mQ&)feUT8f|m&r#suZwi1SIy>(RU-vJ`@GSfUTE;4 -OJ5&Ih~73?5c_Al|MCAk_kW7#2ylLzHry<d2T7rtjlLwJpYUe67<rtCK#L9#8v6-qo0?f%R&U|q^%}N -O@ws#*YB=)2t5=3iYu>~I``LK80H)=!bvlRNn^Ujjy_Ue?_hz>MQj_<m#|NNPyZS;EMG@)eKh#h6_u) -VBW_<S7&GRn?n?FbJTLiyF189V5cE&H6GAVXRg`L6lWBEkthxw(}H1|o%*^c%!8Np~+Rt2+WPOtdP>$ -MZ;W$4k>Yd6$OQz_hQH;AF39lfg3yymObaYYJ6tP5T@iej-)`i&a>0@!TYkjjefG*TH~@PgD@_ygZcY -XOy9QrodVfxk}cL>Ol=SX*GZNlR^D=7UPHcnT`IdcWuJHPFMfKsb9I+e@mPR!iQd)Jw2&!5GCS*cTQ1 -^9?mJ*?`hUDC9iGU<u9Z*uoJPM74>}&S5*fJNoA6&38wzvyRGw4_t)6SZeaZ!UV@1rwgPS(qSO5S(G3 -gFJ@fPpHL%y90~>-3XT~H7C0BZwgAft76W8J1O{4lj~ai?IU*_THq`fvvSEu93|KI407K<~kVDz?_lX -LS@Hv9WoxMQb2Eq_uc=)?i@LrEAJ}+;<1V8|TuF)(_T8_5!xufm$jAnF1Ioj^$j<(x9nx!4kXuF?F$z -7tP<coGQ;zKyAYxX0U?RX4p6S7v4aK?++13y5qv*U>zuie@9xnM|ilCfVI>D3K&+k)yyEZ21rdCmbiq -|8hO?@Ojf?p_x8kFY(Jl&A$tVv;o&p*zZ+4N{vH!<SXIkuor_cG-RppLD`9YORK~n{2cF9xmvDW$6tA -wUD5e#bT-h_J#Rt*ZK>F8?gU&7PfB*zAu-;ZIKtkD~GtD=kYf%`QM<=QHV>kEO(q;r?;F0&GfniwGf? -@+e7p(k+Ty1g?_R%V<UVEU0|Z@qAG8A!K7j<<=DltVW7U=)a)*AuE`<Vl;x~;Anf3JgA7b>%RF=5>;j -mNyw*Sw9F8{2n+B$mW+kc3Rv(;Inq}w=s^D1TDY{O@I=~?4IAI09Q#7Y-E!YcN=s$PuKY{9o;6$Toxt -wK1)BtwSEG_O?z2H;WpHs=ew)p6A(X196a^rTx(A-0_@OHd#0oiSKLv3~=!2#+CGBhfgr>DoeB<_IAf -1(zV+RqB%XpaSqB+(Y#r}$nNOyZf<t<`#=%%eTeo{F^dE3sRJOe@u1m{)t2r6t~EmbJAPGQOf4WpVA< -)|Ys94Hj5J7TBI+j)}LaFv<3eab`bHguS&FG}xlKvC{SecC7W@!0~N4(RL>7xxKb&7fp>lw-<27M47b -kl4V6BxE7yiQ!1-3$<Q>}>#zf(g|vKhvzGZMT1gMNX%(^wqZ)0Z#A_Qgm0EBY!gSp0ax<8gTv?QRK{L -~BZ8vJq*q*FMHHTnUPc)Pj*&VxCwII{d-gaTDSC5n>7x(sHmc5AvnKUN%e52Q_9NBHo(n%|J;}eJn5J -oQ!pC6n~Y=?<wxB8wNmk+?Ol(Ot32uCfJX=gXnb0^pJ$*J|qcDJ~Gj6R2_?XI-lnCtjD)^&5Wc&Y`(_ -Ly`yk2={th>-R?*e(R3*6F*quO>Fh?9tK9FnKk3Jvll(QHMZmNkn}A?&$FOn-?|+<Cb#$P8|*}1oHau -<V0MWlovRBj1ONPzM7mIylgoWqO-pqjQ*02{=Pl>{rLO~<1@fpKDw=ggIk-!_+Y3s<{_F(boq&o_sOU -<mh!PU`B3pe;Zo(GYS2{{v=zFGy1Nl4<>93Rjx-oBU5DxjO__Q%g4w1Ead|Y?#&z!Yw-t<+pk!T?Fd_ -j)MMRkcsA*J7P%BGRU5ZgUTU@8ba?UHzJfK%Jjx0FS>l80a@mdux04okh=M?Y|ni#_?NYJ68Q8Z@kAj -@)`Z;Dq^FpLGJUO+FreY4F^d7aBHIIIkJ1}3ccnO?wgy}XEFlp(z_mX&spgqkX1OQhq7A>)jr!NAc|p -46i!b;O=9cd5;V?JItjPVbd|5)1w^tBwH!GiqY&loGA*iqCjjbGg|1LSO6k>JFcl2ldn#&iHbak-vp! -gE2$pdzuQ>6fC$VEt(vJwNR}IH(Cc{*@GURR#!_50H|3Et63Po#E3lw_5J$kkh<fqq%YgIy)&*_;_oo -gr|c>RRbIRs&GH*Ax0e`LcLjAC%}f|p0hp(Y1uX7UWa<>Q0|*4GyJ{uw)MX>h7W9x-TG3c4=cjL8ykS -{6r3unB<S=xFi)54@8T31)%UOeV_l9vqC3%rINfOt5b~z*x?4#pm$mDe8UlOSJ%X2bG{PrU`M&!DP&J -e7IsDYh>_*sGlMvfx(N4DG2(a8ooy<c!?cR5gKYHF&u5BbOGY+1w7SY8I4)Hsn&I8e1exo@<FLf6g4| -7E%ghaNAcIlV_r-4=3T_9X@ESra=+hZA;mXD1Ozvl!bMl*vt?=D4~yp&rZjEhvgQ{ZORKSvDT{4M0as -+SW-tFf0^&k3B6WuovRYw`<N(S~(t9yMr}WLeUuFxnx<*RZ>);JJR-|iq~W67=vWnV^8WI3R}2Q4|@< -i_0ZL+w*^U9&%h%bp=m4xu+_f~^!HJ-!PF9rYGp&q_^b~bB1R&Q2SGOwJU~csa>wrR&{X#>699B~c?> -+W8#slMFi=uxFNQX%dgoI^dD~WyGZqJa;qKb9@}y1I9NT?uB%IbkEYNKs5wLD#f^GvXhVe%d9{(}NDx -S4b5)H<)@{U*WpgmX11)w=d9pnaSDNPe%iPczJdO99+>anA12IpgmJ*5FCH@=09aIGdY&^!|iy~#gHl --hiqUy5aD3kA9)u-*8BAU2^;8KJ@afH!|~e`wAGb#pbCAP9HEr%h9Jaj3%^dgX${V*fLD^N9U%&<O39 -d%I*y9_4R!=#_lDu_Z8c&LA)%7r@E)G3n;^%OOL-<2<q^iLEg-%Gv>R?4_5k(vClmP~7q7@KS?(u;Om -7T+rws!U~ty`B0EqTdC(}F4m0m+Bqm%YYGEfcVlLWN$tXbIHSse#$=<puBf%7MN6tUIL={<=Y5zyc03 -~w%y^`6nAIoUqqXj7Ce%nLP_Skc1S(dMR2ygIE*F5H2$LNHdls<*4m%yqR4&8)_GS29&w12VZ5F2OWl -n~a+x~Jfp3cge+bW6aZtDn-n5a<AovF_2E10Vn`73p>u<qHR@&Kqa?f4xj57fEYP+RP~YhKWFfOr&>D -}4RtY8l<;(i|dcfaI4~ojvCmshHSE-oF7N{>`y>S?lz48O-m!B{35hAH?GeASj+5wbxiuo+yInAx4^t -OZS1-*2BPdwvbgXfOTrU-k@jA5>Sij?{U2VWh;(`U=kBC_4T%Be(r(N>KkDt50~1-+drfPiKMRpi4vx -XWD)}H4{dJW&0Gx$*su1@IUXiK5cd`fuTuYoV(p3)kk2>yB3X*N%Fyxh9Ys|;+fPMSmm194BIfQ9B1T -yfBx78JA0crpXpUI|(&Hh-Fagk%)xd}_<dWzTM=RHeFm|MZ9|t5(Q(s246g0hKwB-}nqp1B^^L4f)>V -GCc1mi`{^xy5l@MpCM>QQbrbsVG7UKh#ru-V6dEAt|jTi2I4{dlM#hCXqq8)Mv(?WhfJ%*U$G!POGK7 -~_O=U^m=6)ITh=9t!>E0CXdHl~C<JV=M{pBV>TN>)0W_-JR^Wcq9+CO$zB%5wf6!tzAh++S8{ucWHH1 -yAt4pH(@;lg#!8;VdXI?2?Gs25V#Mtu>>qj1^<%6d7GCM>Os!M59nu<PM!~YsG_U>BD~<k2aKKg@BxR -vE;HlXgGTq{Seun4YU^P8RW#;@4<s(2+c|VYeYvjltAgVj0xe&SHK+-2(onsXeXI$UfYXQA1e^`9iF| -3#?HdeIqr{u6#3%s}kkf0|TZ>#nxg=>L6b~2&6MF9DGQ)f{xC{&_nAq4}2lEomLOdBQv^*V3#)#SX`C -8g_@DYLxDDoKl<}#5S0%Z%4&4srm9wH^_(1$sTX-Z!UcfBSHSR&Uq2#b#fZ%kl@bU9zQg$aeh;RLDC7 -@Ncac_YXqx%}+ryw5f#kT6jVwHw^6O9;W~-O%Jt@FEnuz)H_$uY(R4;yKW>DoNu;+rIJGZTt|+(4J5n -hdngfcY`N|zMUK(XE~D+Q8eNTWGc1SA&c=mA2QNt2LqpF{T_A#VSsK*4L!RZW6MP><*JsLmd5OAsNwT -N!#j5wG7h=1+H?LV%o=}r;JoZr7HN><yq**&&a#(f6|0QM?+%WS4v)TS4X;8LEM8J>5BKoWR}Ur=Gq& -y|JgrO<*o!YPCPS~$<gR;IHNfjpKD`kVm@YQOVTK0@c~!d99UN954#Y~RX+i>?SMjalu|GtEv+a<gsD -325K^7E1;kdIM{%l51C};$4I_12D-$!V*^kT3Xxa_ii?8O54(Y}in6nT00{`EwpQdS(B*XmAgNNzGD6 -=huisl{jZqP1f=)?Bj=%7Scy9e{xZiAV$p9B>^p4UkPa%#@P)00M^TDE6pN%OFX98Hy;Y>0g)<j$WXM -;6#def=?eL{U(PJUgF>iIQrX~iR0WNZ@01p9EY=Wy2{&(eHEAD9<*P5?%CR&wY17?Og-|bD{)vog_Tb -n)kux)-pcq)D&4TM*+Uo2T?(7Rp+N-6)kAlCbeW@Tj$k{N!aK>oJrYk_H|h8z4XvKTqqS_S?LIk{${q -o*zM<J|!fvrs5W7(=>P?vNtX0F{IB*2f&OF;W9|V^k+HZ6$N{_!{{dIY;I%9K-rLS$Y-Umk3yP1x4xu -0>gX%q5fJ*UGzzjQr&IflZ_Vc4{2#%O{H0Qj8lUP!qXw`BRH+3+PpwFmX#Z&jccXc01qGJCKSY>T~r| -DM&?7-X)s6mDXVVu?0++U_tKzD!{pLnT>XV#wqHAozUfsC>vyXjlnHO*^A?u!m^q;uRP7st`eYg$aZu -!Tcqa$SA(V4(<sdX-r`<qAfav&(2*?;x;2vExfuK7%hRZ5)>vz&K23T#rRIXgj2=?Mi_L_CzN>WYww> -+45^di{4`5aY#H)H!MSic3yzTWW44|1q{}@@9(Ff%k%%F7lgBRB@wrNMcl;2*^`6>R2Nji78u~AyXFJ -)0fftl&=q$L9C_{2ifH6H2`HFGuSt7&mTnB4uPH|gDUaQwC)%by9f7Z|{%rda5+94X!Wbns1J+91^4h -7eR7$JOfgnyW2>eYr7TdQ5S`CV1Q787t0XQ3WHsW&m!%JGw04Bo$4ko}tyU6|_V!K($?xF>8u-X*0f( -9-fEz7#%tkj%9y5+l?}kb58qmbJKxSr!?r$F!{Yh@yC=DZHqg`<WHx2dqM6f-c$h{Q^$0(LDbMP^f8~ -kNKGC%oe+`mV1M+_i?TBOh)V_JCrQv+PblyPc#hV6SbH-7MVq=6odEH0@VqjHu2~xG~H`svVEN53tqd -lRf?gjMWQP%I2k}*>zS$CqD$1Y+t_(b?U?#@+Z(HfgpS|$S}m*$1LMzYw=x+-?TRiwigq$lyL^Pz+CE -0`%yR-@b&j_cK1gZinyGwa5|0jR|1l+(bnk9sOCdpb1In#sM;fkm-uk5i@W<f1>um%<F*m`<%OMHK_} -EKy3e;2S@5ik|8i9%~p}uZvm!HxT>eEUa^HXZNM$(B<?P@Kd_VbQnC#zbUt?4DzwR*aT)Jpc;?bdESg -GD76yx2kA&PgBZJkoplI@F>6X4M8~?lhOe@4i%Xum?GBS(_{N&raw5+3DCn3oBtuCvWv~zgyR;mv7z7 -vCrd*oqrfttS7vb?*|$i1t!fhm10R*C{mTNANkR<4_H4HY8A;lPt2duhR##a>Yg&nY@-ZuHEit>R;!q -;qGQ3#y?{<=U)zVxG(nJ=ML##+;;bc?&)FCI4w+Ow{cDrrBA-wi4CRj_x#{}&DJYv2x*RNBlI}2Dxe0 -R3$PfOI*cc~(7zdQm!>tl7@{*W1EOdo>Pc(Cqa>SiU2cBp8_PqnV<+KsEp&f9<)wYH<SPd=#HeLj#se -;D;_@rj^zyGH63bCmY(rl7stjd0hF~{T-US%dxODp^A_2l&6#lh(TrM4X%yv8)fXmO7x-xzDIMjPLKJ -(;{pg6-6vkS*IKG`%b~`uEg!WH~u(@G7Uus&+YBFdk|umJt8X$(th~y>xe~EvZWrkSC0)(Z~lwSTA;0 -r3<uL+zdN{qnv&KC!b!!UN16CTS8j}mTDvnuU1{$v7QY5qUoZ{)z=57&%d4=x3WS1`a||b{KFXjJ9zq -QRmK9z*wy}Qd-VH*(O=GE`Aae$oj+9%2Y>o?gyL>|C?WZS2MWky!;^QfUmqNQ-!ba=r=8*M_Ot)|q%d -sHPSp?*Z@-!xO^y#v-yoPM6D3kv{G=Wrv)ToB1+0Uk7ufjw<eSO&C%R4p{;2v3v2|8i^%tDSreFe?AG -D;=P`>{pGhUBgOx~+OgaxLrkEFrEBot;DCrp?=EDCHP$1GyXN@2<nv20Sy>Ig$}Yz;}~7n8RWK>FzU_ -XcfIDHyY8bu|IjU_zJv>tdPDGV^C>G&v-{HO-XfL40i<+qw8Xpk#Rq(8Y_}yebPiMAS4+zCSuWc%OWG -@am9Oy0yrGf*f(z_8G#W+pDe^#NIMPn*%yH#|InkVsTY#i-fvJMoW@<Rst;&TCha5Vo{<h`3iqj<Q{D -Q_UWNAQ8|>|nMk{N{k+dDSsi<kUHk$6LtY##tj%M`rMxmX(+gTQNRhJ;YgR}gDtB|pLXjWdWMpfnk<9 -N~RVA+rBTd3qUbte57J~b|c&h2eeSu`5g^{F1KJXD0S>YHruF_I2FsQ0#U3#h*K<4NM!Vn~*h20$3Qz -o7U`s2;BycY}KtZuPG*mgM(qE>|kiW1Y<Yc@g`<ptJg%D5j)<1F+~!HI<g8+B_7x3F>+U2!ns(}wEtP -(OXH`W-&C$QCktb-5^gr-{f}rR+Q0&vKHa&}AGG17a`oU;P9(lSeO93&(ia)r3MgD!O9}8bIB<P;Rns -QBUjGPWZD0OwsVYm79@eB`4|80VOX$-2{!2;)u<lEY9)XJN3Uh&;dtioATaNT*CzcTfS@;0IJZ|_*mJ -(if-0a2iB$=*tBax^>R9;+d7o(VDeHn6q8GVDiKHcLwt3Y7F|$8WLimil<5_$Vb3ym$u)KOsn0M7ep& -C*r!`K$K-8#MLXjE)5$B++%DSBx$ZDMTmYd%4c-ziur9UVe7E5B#Z5OHr;zXyrFY^*FQOryHOLoN#0B -V>-#L}N^Rgl!*cHN%V?ONn2h}0!qvbWvQRv4k1o{ZJRQAIo2I2vY08=>YBZeAInHd^Ad30;ur0*Xq&b -Ph$Tt9pwhx8CCV!#3!AZQUjyvQC|*HllU8tfpMn$co$5s7d{5k*Td0hst?d{XQv$a%Roc;2lWBrbKD2 -c4BnAk(Gk=bycHrN2kczBG!>0_;qz}i?98%rPAlfGgpGoZcur>q0gR(_vBe=pZ&IM37&_un{L$re}F$ -lKpI`!k~Vo`B?I6&D;~uU35n8BZT#ped3Li-I-|OQegsl(HQ3m2_t5Nvq1jPGXZx%ayUuRt3~F#DPg= -#5oBr_tQf`UDmFbLbf@P4|<Sl#lyWe++c+4+@?O~PbT7jkL5Y~+RX_&%vbw{=r>ZILw5^{mi|7;{rFW -oh&nLt3?qK&PU?VzgqAthT6YRj|UaWiko4EA?E>zem^^Y55dA9t8}^j-FZQC2*^5@p;mYoHzCh=&gK% -Tp)6R6X!BJd&fkN72v&L9dqd5MsX_ktMtK3w^3U?!fI9)!ovv1;sB<(kW@YfK1WWIv=&&VV8t4bk+uT -tM<A%wrEh#^VP~g0m|^I7%HEMD8L@>89d-(=^X*7XGgWE6*6E0k$hO;M2tVCu(Y^?fh6<KJH)vYkLY| -HYg5JRV+vv+!}WE{(&kDgZ~bhd4MQMRVHOH^63g)jgTVhm#%NcUa*EXiQxscvs^FK<j{MhFr;>lPDn* -O}2Dkn!As2ko>*+e1-JE-Z2!Gnb=$BPxRw*(@qNtnd5QZJ4DArb3T89a6qjc*!TE>w5^r=(PTSJe?&O -DVNJRyhd>*)&Oz_k%?sS07_1zMey?WS(;n1(4HIOaMBpWc-{GNb3LvZ!jRcZU}B!5InoqYMU_mLRfAy -EKKKoWlSt3S)kBSpz?RWu>Tbq{9O@U)Q#!hJRMaiar2>m9hNW`0grN;_BVGTOU%?_MmG>bqm)X>fsvF -Su3RNyodWjnv%1DOjOdDm35BF3LMD#YPW07Ziv6yMPkqpA}Y?g?p4$Ntgu2<8<~gi(XhK{UXYZ%6buN -4HYF_%GgJ$w>~%ycHT6(@A-0w`e!RGCYngTg^OqO_ElNtDvlU&nZmBv^)Pg==f?*Z%OS7swez_-Y^7` -_goV}o`i7!&X0cBm~iUPYI8{>H1TclMw7YOgM19EjC___pKayVy4=otou#X+V+8o(a7#$XK9w!yDD$% -}5p%EH9MKs2*a&=bJ;1t1)jBfj7&>4w*hU5Y|MDQ*Eo$K<W=LvdV3`7!3uYOJ?UiE8WY$ChxEB-yt<8 -63-JfZ~~~);AW9{D8hpY&%@B(9t4%u94cGnfO4EMF{h%%NesQfKgN-?(hLqfJu^};CDWh)lG{Y1iKFx -y4exr8X2Y<0b9-P?WHv@yB#w92=^oH0?4$72*1833^Zpmw&p8)uAU|}%dnPtia8Z}mk(vGl{Mo|Sdzg -Fme#s=yDao~(fWNBh6eh>*s<tG@-3*o_Rd}&6r=`cF{rTmI^o>sdujQ^;^G4>fsEhcKX_RYQtuJbXzx -kAho>3_3<l8SX8pn_ig)TeSsk94Ery@io-Qj4m;jStHXG76g7QY)0|L3`d4Yx3LGzn(iF5}rtTc4Nsg -NO#nwiVL9!?{P5b#?)sm&#gpo4q-cdv&^jdG7T_i&RO`e?%)k40pil{$i}VBs|gN~h}nfhv}rw~M7HM -JvDHu%Tin3f77EFeFx*(494U-EYpjm+1I=E7DBqr#7l>HOrgE168fZ%*J9-S@)}54lEonphKN>%z%TW -d@0!8yLKC3hC(oKBQ&9v-@o+IoZWL?N8VdLLFG<#LnXr{m|Rm;&MbJ|t4|%Q_7z&lI^U4ANhn?ibDm| -EvX!Qei2p(f&ko&Wi7K_8K>~&SbyQQvNeY(n;khm^w=QFcvezBowaD-nc3^8wth@=;+h2}WbrgLkyr) -+INNa{CLa!9G9@c&CigjXhye#Whis_?7ucV*^<C3sPk6tDIOlWXdnF;rHz&-(5b4lwOq`e!~qVj#Mv% -y2rjUjtv?ATf{V<uK?HqY9;X;YTkY*9jwVNAQKu&!ITDkR3rRn7W77S7x+yahxXjs|E41=>x^E7{?cE -N)oKdHDb{ggW1Nuf#H*738f3{LXHSM8CNc&&2U!eGc7Lrl{~9;(r!Jt;!M9-}!O?jb$8#IOffr8BatA -#er;0CsZhyEEf7s-Ovje8n|+|1o2tigg=c86D!rK(MCY(lsD%-c^w*_{bYZrPWJia6Txw^5GSiAW=D$ -neJ3f`<W0KI0~`L;<g0_{820`4t@y^5pPyiVACjJTej}3Jc7ENE-gbWZk>0NS`XjY+qmum3B!04FSyO -gMGU-d3@*2bXn+o+j`LFjq31vaFeZj~b!cr0)1GW~5W)#tmaqKrMZmmYWwrM5f>$q(ddaV#Ms*XX;JA -Do)wsCAF!U?~=t8<{lIL)%SdW=(C8{tuBss-7e{YbcwB!TzY=97986)t+v3%<BrVa~5-^}BeWmzc;XK -X?YCsE@JtheWK7>u?4FxN9s=^arVQ#+AmRtH#uija5;`Ip4+i$DGq$>?QwvZw0oRp^CYC&*w<i0?WPL -Xam5NMV$tKki|vln3Qs}Bq0keP}~}1F)g{h<!N9i-RKKbGFv~i?BLxlAg#nC3C0d8^@;(FLmn0-`&)s -bbOO+~CgY$RRCQ~ozUp4pj^8*G7;AUgHC;q*?4B$bEDNL5ORStMzEB4mXl)G;R4wfy|D8!dg2zNvmR8 -YwQrvoye%xH2UpXIHC$z}iGC|~VH2Da4&+gTS{^(<C$ny55(>Tv~*3S0{q?cfvKtRP`dFdyfC!V_MGz -`lLzpFX$Jo77@(V{`fZ<_@^yb%7V!5UaOUq?`RS!;j}ULp4r(NG}l!0N`fLqN$<JM(iW;UHVi7jb4Ko -q@iytay^v(>y139fGhz7ySNipOK0ij-p!jeZx77HD&YI-?6a1VWAROdh(K7>>rJH2zR~PA62km_08qj -gX=)-vzTo;-+3SGm=V5HIGx?4_uf|=@rTqwI1<PoZ$s(0kP6&AiSFWR%DE1r7vZJU2vM70lZ%R{H*L< -A{W{~CG~Az@&uZJmZe?b*X*|vgR43x?p#-)LV^?^UE3|FV$+`YuKhvA=io2NG{j4($x;tTT;aUWCnb< -;>kBs7?6g6~>{%SsxYsUmoYiO)2rS`dKN*qvlL4TctmC7OhXr0A&tLTFCDpKKp0Z>Z=1QY-O00;n48F -5U=w?&w!3jhEPDgXc=0001RX>c!Jc4cm4Z*nhWX>)XJX<{#OWpi(Ja${w4E^v9RT6>S%xDo%~pMs5Xu -zdBZn@f8rjBeXxn-l@k<d97Yw1%P37Hu;tOM)oxu5-BW-kIS;q#j=HU5y~C$INgz&mT#R*~Rx4Y+a-> --_F^g-dy|{pNz(%F}p6xV<oq{nnl-B_QU1#7Z>o~kL=$v=SOzKzsfQOvUhSVawSq$7p&e1_S3Q66*;> -pHuXKP1bb5)@|4#Sp23Bv7>Dulx{|9yUBKP85@Ij%8fD!G!QQ>Se*OODbzDExjOQu4{_y_O$G5LOfBN -w81|I_5Xj2t?mL!`)eW*l|Fu5;_ss{NIrXrF|)}rE>8jZ}0l~iI~+dEm<tE|{=VdnO>Q1+_4-5zS0*; -};>?v9SGK9<7We3PZV8fgV%tJgoIsx!HI{je4#8p6CrnU-YD*E^9WWmS}-s*f|a6?H-nlNDED#!6oAl -DaU@Qd!N|HC~QJI0-Q8m7PrttncVqlq5OdgMp@_(TEs<>V1(52EQ>|SAy5zxci;RSuR8>Ql!hcQtYEp -#i3dY8Y80rr}Gi=rD6l7m$|HyBvK;V%ou8Tg>nrE{^W)pGpT6A=7k>nGrY<nD((bR5DWPh!-wA$G6fE -G5Q;&({189PnG!Ch#t?shyo>`;G{_aWE=CK*UkjN>q3xpS49AEjm6_88y_-y@PLMi))uUj}zyoue#%` -)83hZc2AXTDjo(W?DD_c9tv%|Az&)oG}MH!+!LELNuDS*$mV2RvG`P<0x%u8PJy?ZlfpMZK!PMUwQ8h ->Fcfi~1p6t|gCCC!Letk}?yRwR>oqn5{83COM-_^N|IcQ&enPf7c@ca~!vm>~9!XVRoTuyD5HRmvd5S -DDze`9))YJrs@9SQxz6GVXv`|0$qS_|q|!h?Je3Fy+f0L&_YcmalsaVGM{lb*2%0HOoqD<bw_nh*--R -ZzPt*xCvUBZ;Hsx+0Q5~qCcmA;gHoJ80EV+B2z<jLCT<^V_j+JQjdfM2TDz(@1`cW199-0?9s?GPa-` -~NDXtyi`tP&h0+bfG}IG+K)2_&0tl3&Iwem$K&4f7<gPrOb5}ah{1;s_`Q&5~m+-ArZ|g%uU0GvxUqM -@<AXy!2EO4y|@}m}N`I-`^Bj;XX2A3i?vz)QX{c190T(M1eRQzpX8rkU`)9{_-)8aY};1yQTV)YgJ=W -qkiAv|L(H<I1-JFud@2w$4e!9SgmBVPq0)#lSnrfDkyp{W2pVD;lrX7Y=YuW$KQcokV4);qKhXHbkd= -mC`rk{Pl{Dw2jFlo!>WXW7vdfLc;(Tpig#f%XV1pwAs@R)Npq0leVE+pZvQXqI1~sY)1i&vVd41&)q` -nLt<}9O5!3BfSCGBAS?a1(N|3l`7C+58)<P62Q%|DUuwc68iX_JaM8x2BAjA(0p-IAB{=K9GqDwf^ms -S$Ry<1>P{91oDQ$?UWX0}%f-DB*pwa!WLC@lKshvF=fwz>Kz}w`wZFHpk()a@GQk{d&wZN}E1v00^2? -{|Uft?x(NTzdI!U6-yX{PmDM*RdR&HS49_=GimHZ~o6xxt>ft?MyzBFqEB_V(_0&-Ag8+hj$qeb6QUM -E>tmTYWU8dGlwVPT{oY_CPr{#BEQBNHD$5tkXSfn^^<6{u>3<u;mp<#&AI7q(kjmM~HAP{Y~>%CrJ2M -U%KZt|w5C;cr2IN$ZJ@qOirBBf&$Pt$MpJ(nHp%wE8K?(HG&%tl+u~gME1oa99(;SV^MaB?*j7C_dzD -A#B^;d*o0;qLc}O>qdE=em$tVN!1QWHeq0gfC`Wiv2L)9Agn{a80*WV)p*7LwP6v##(%n;)5->m7<Gy -Y796-}!|toWaBf!@u-fnhWD-iARVblk5~W{Eq_R*k3e=eCw4ctk9JMPBSqj5IYuRz|dCpp6X+xJ_;?? -92lM~2I6ZteHhNy=nNr70Ekdk1bavBoGpfIFmbUAAr>sPowT=+e4cIqJU2Y$6^uW=UU-&yW9sIBGf79 -Jj42^e7*xXpVK+{p4&844ML%JsyWI19;r|6`Zb)Fiz%#lWJd+X=s7<sm^(b|Jf<q!rb%PhcRlTgdw+c -m~StNPJw7W{Hi>f(1tlP5R#STKg$aT5#Jq5(-MSnzUl0X_&pj0-W3t)dQE!=o_p)Y1A6bHPVxcn|KBW -q7Mdc2@E@2uT+9}SytSOG}?4Ri$;t#>~~jKd7*7ksw5NIGlSS1SPF<d)jf?OuG@vCJ*i$ti;ZrhxXOi -DW{|JAa0@4haop&;4EIXb15rAF1;SM5Gh{%4i3{CGuJ-~;c^U=lOJ5P(7X*e!YJtPaR}C^bQ3;wo0F9 -ly=&~--0)#Cr<uZ5+ONC4jO>c5qRgfSqi!!>LcF2xWK$Ee=o!6d{vG0uj1*2WiI~H1=^~Mtf1rf_;?< -#ho-7nqfgNCAkhN<ue>x#r*Bo5K_m$m^(&_Z>0TU5GZ<NwR9RqbyL4oZVyu)>CUaJhkOXV}~R$iV~=( -ujD6r9VDh9T6nP!RP<VvW1|-+cS`~b1u3({w7Pp)+$`no`qOx%eA9XXWP{<IzC>(obFs|YUmo9ry+1P -dsrDjt}FJO{hq;9WGEYfW59nu9a&lkl}~EGXds+3!m_Zi1%!)u&28<YhFD>b#Q_$B$N=?``TZRnzvGI -av8N&8V-h);wn3eS5I9;mC;jjw9`sqAig5y$O>NX5YGLNR3{8YKf535ZY8oOLiN6NFhoI{O0Q7*vqUE -aj(zhfL%G{so0LBWo^m;KC$wJ@Juousl*gK(908s9xlBXdAj;0C)B3`FsrC9%o8iV%j4A#~01oUcn7j -o$@J-dPgog%TfNc_60ik_n4#L{k38?@@TA(uWwic_&VY@-Qzj%_%YJDs!dD)=|ibD9MaYPN+>n7vQ#e -No*$P3{RydCm&K?3$mh80}qo3KCm1j6z;)+KBh|^q&MzeXwIRLN45(Jc%36#L%*cU!ekTKj^S*G;%yo -Lb$!w8P41Q%2C!XkYl-cv3xQNe&WziNpzjvSMBsJb;lsb2kGafYwhg~KBW|BtS8xDNPI&#?UXCGz8ow -I-Nau(aNLGHqFr1TWoWNvUNKLhT$|kkZIT&#K3!ZcrwrR9ZDGj$UZl7;uAxOG!V?OK=6wEG;)dw{|Ii -_RgR`IFyiN^&YW;qsb`R9;mK75X#~^pMunwce&(B1Q`&yAchHveZ&ggxE5Ii_D@1nxdFQbv0>KL@OJ7 -h27A7{|ktKyr;6D=T<D|YeM?n7Eq0=mvd9mAO~9)?+PaSoFl`4%IhmdS<$`TT8TE#N_XV<wx4cT{?p- -sZ=f=9H?J7r8Xe09Pt98r^6fd8*IY%UXZ<BIw@4dkNSaFuL9-$Dv?MJ#=KjqtOKSr7TxRJ958fm@eIU -o91bv#vXM1{EHdVjAV|@I!gcwJ@0hgTMKYzm^Au#9~;m!eO&Gzm50RkP`!HwZ%@$d_Nx0vA`sxt&o=f -s;>2K<!Gc~VR`7md7<D}f!HXvr3o$~_qcS_}EeM*J$b-d-HKKd(w&XqTa9CHGdUxjOtDo+^yhFyl9|C -ZwW1Vk~qRD^sk_D%;r7tD|SGqw@t}4xMLcJh}fk~s?uR3b*qt$bijcz(~^CLVkM!@_eqkPW!iZ);LiF -**=fKJ(Wtm9J`O#Y~yb!va4X&{4TTuTa1-jnpO-yahfH1u^@{4cuwgmb6Qm=Z&l&>@SL!wD#zH0LHy% -wz=N`q0`OS-7)x^Ti(RV3_0L-Vcj@OJ-Yct8RDid<?;xWw0dAk2?5wMRBX>LpjB4H`5>gGzY)tJ3hj{ -md5MJE>h{_4|B~DCCy21L+(ChI5Rq3WX`(<A@FtUb!?B)+NUvQ2Yb>kFmaPu^c^7gKeTAYYY?en1pW_ -DO9KQH0000808trnOuGN;+X@l@0C+n903HAU0B~t=FJE?LZe(wAFJx(RbZlv2FLPsZX>fFNE^v9R8~t -<Jw)J=Y6^Jw+sYasnvGqD%mCQ};JMG-W7du_HB;!FOBqOFs4ghVdw?BUG0U!yGl<jn7a*0R+5AXX6;D -pS-o0FtSdA>O!m0Hh#z$c^0XhPl;<xcR;l_KGrDS7ei`O7){^B3|f&*_d_(679VVAvT?ST0#gR6*1gB -j-DHRpjKNSgTtq7&$GfJf(`mGx)&-p|D=A1YcFEfV+)gY|C<mur3%QXUjJyZ!b<Fb*Bi;Q}X8B+spUM -pFUi^dw+osVccjfiY?&<;oGthiu|-wOfKJz>}^(THb75(TgdvCVD&GlM3t!KZYM_uW|S1$k}A@^09@C -6Gb1TeEKxDb4YOwCU%Wi!8ME^QlSL&GChMtdj>OuxmEu|bBE(tmN+u|fKO-9kK=1Gkz*b^6L+;!#xCK -0}W+T$S%oLVXimoy?BRr39Sbj4djgWHS@S<ix1VhjCvoMZxx@B<;qvD@WPLDsFUB<s0zg?c5TwKD0AP -7c3zP{UL1lE=yti||w^lVIOdKcplm#6a|#=toc3eAd~Eyg=0$FE<Fexy>e?JC<5n4inVxDxr1Os?3L% -K4TjqL82rb71WemD}j%`Iu~J&eu$;U){xCjYtD(nF2Ss+Ii^UpYe#4q5wwALL7_ailbO60oZ)};d^+A -R4&E`5`L;(2|sUn{_@56@YM*QKbg;ofxO;nWu;}A@x*AS1da+^Qn3G2Txg|~5t+{sFVGjMmifAPB#kd -MH8n{5jZlGNmYxfK11hj#(tCWOB?^d~u^X0=4F6q>sa)na#WfRSQt{&i>0XT2G?NTTB0nDP0ek2!eb` -_R!aA&3{0d|qfg$iR1f`e|ASSscd|g{Gmn5NC29^ys$gDLN60D2ojNEc{1<zmz=q~6!ifDAYe1CBnpD -o{>#P3f)rv%gH1W1Le;NO!c(RZbWeEa&-v-w}6FW-fq$Y=E>`fmFAPr-C_@#g*V{4%~g`Q`lV`0~Uk< -z$b80yJxlCJPuD$6E?^5C=!vVp{v1q1EeWDT6s^r`Zh)w?$f^?X0UjnI1J(7RP309NQ7o<`vunN&qo3 -Z{#QQ|CeS&NrjRy24O}L6ibCc6toav?J83+0IZTKC2)zEnH7~q89tk~W7pssOR#M7`p9zwJvin8fO6L -YqsZ-0Lq9l|77o%u#pdSIvoA(cvRZ{A2<I{Zg;1ZPa(Daszn>%UGbo)I$YSPBnvPmjfn0#mur@fTc_( -q+L8y5wT}C99OW~AE$XoCwK&fH^Gzk=$P)VNYvFt8kr6MQ#KQvKz!;T2dDRS^OvMNzlpc%EwzFLqM(f -1yaQh^&5(Jj~lqIMuZf6fDPa6niGpXZ}`3cCZziDWuLr#KpEy<z!(szNcx?}qJ9t3aTW0sH}>wXa%^P -r&J2Ge8<*;w>W@oS_44tDS-K6Dr}|8ocj~Gaq$=-O+6cgAOYx4p%%sgdt>nm~vrkQkE2agnsi?^JMG* -;5j%7nj++}2jG$O3&2#|a=`8Os({c}zX8Hq{DI@BvIs2<yj6m!ugCCgMjVcU5L__EfC%W&^Qkwl<+D2 -(bA`N6?lTXSad&y6Vb0>gfg~6?Ks`v<MXp7Gf%84;B7`gd{)OvR+oyVhHDc%KXq05&zsZHR(qBNKL|C -l8LI|{LjK@Y`$HWYTq%46vj)3YUf>BU8W8jkL%)}%u%`+SYF26xQmMr0G8z5!mtzhQFih({N+y&`4@X -@G8s5W)0$?}S=Xugq-bB=k=(e+A}t!Eau7*umcfSs82=-)I=<BWp$0A-YmOHr|bEGZScSXBAq6hkGrc -?d#9xxn=uVc<GZy9~Pb=Efh?t`CFS8-I|87>x7o{h`2s1R0{y^Is)dv0CXQ&VM-}OJ)28`Vk3(A?rr@ -N~SP4F|y()!knDHyI6jVI#dF}deDM|g^VzA>bO}JlHUbWl)U%+E4`rs+SE`2djADr;x2q2nHwrN&2_8 -<yuuJ;OYkxJXE5yyjE&qdT9_Yzrkg&8R?JQ`GV{2MbBvHKNx2F%nWGM}eVTm|VBXYGQWQPSAX??rj|W -C;-Nd}mQA;`+2cE({#MC?tHWdfjwV<bZWe0s7=t@C1TY3ck1?(7dVGsE<2hGk6nOH4YpE=~T@X|xqIn -*j(u?a*&la3+tZDJPq6Fl3k*Z5lSJTxo!(hb*BS#mL;qJsd9-+FFQb9;I}k(%Ma4Dc0M)?;wTt=5jIz -J7*eLToWx1vD_mT5kp!h8t}q6r{$Nd9y<-QX!?p*OMnY>z&@aoR?nJmyW4L$#PdHn8vKj{$PiZ>k_0y -)9}SqtKj5G&=HJIjKX&pCqiHqxqPR83<Mfe5=Kyp=a49c!71gLDb^7!a)3G7K80}*GQP+c%$ncDCP}! -@45qzU+32_t>)xSwO~^kAaZLp_5p>x2dsCcX$juo`O@VU8^Xd+@4FZykdT?w(fJ!&&zg+7VQ3mlSy3i -odJkJHNNT^*HST7M6Y3QYbd*#;&<c-`iKUK<#TL|FOh~;T*6`DLuyN9xd3HgA@mw>XBVJ^sAmcZYC@H -{PU<vt<q!OFh%lQmEbKOylwppD+Ow41I7_<I$bWPY(izi!=KH}u+k8vF_daMwR-?HEd+^)%Nbbw+k_% -NoAcT+2Pkh$`^vx^TVaSw>cH1JM*SZh;xMljPZ?u4w^9ps>bG#;b~FY1qwXUDW&*O*r-8+J;T|fcNV` -^;~d^7%qm-!@%Zo!E~^1)Lhox8xi|(%+DAibQqj`JaHqk&U^n4gnKCMU-_ry+n<;32gqnJH@JuULHv6 -1{$ly=?L(}%7Y)OJsjHn<ogdQ5{aM0LelYU%|NjY?d$1Yy)I)9`%W<)#85ViE3PlIgbt{81&S4(T*aL -QHVsItFaiu)X17+j!4)Pu^YvPd3(jA&+&amG_1(e8z0}9F!0Ai})1`)(Tx-~2b(R?BMF1B0GJ9_f8e& -QZ^K2Z9*B!YKgWb&8iM<gwfzzX>%wQ~fzB+nCF`ezz{)gw#y-_#XVCR;Hc79(BC0D?xRlGyFgZLnxq9 -8PpG3x|Oo9=Mn~Erz8ia??El=bZuHC0(0hn&legT0rEJb+g6gUFfQ+j*LmhO#&UvKOUXxiGlW_*vM)l -gU9S<c$H=Qr#wRMozdj!f~*44BGHxymaF(4vMTb_<=#^t1`PR}2M*h8m#L%zwb<AuW>T1{HCd#Uk#3i -R`YE2dj8_;MbWUk|ns;}1KudAWSwt=!v0qUQ8UxgoTLd~ySdbpoh0#naOdlc$IY(BmTmaY!QxNf148# -VDUKF0Xwd=N8hphq!f+nq1zh2^NK}8zCfd1L+^+V3_{m*)oPG29Ev7qRfex+GuX7qzf;4(2h5YswU^v -N+cq~o6%JK(FVJh92GElFq1lq8i@0HDr!NQh=mo#}l+OlRN9V`u$lAypKS@4M`aCt!Mp9$yfHB}qp*H -IQ!Q_q#>(I59m^RKf5>Ex{ocArzAs7_e<>I_(v!c1Sm|t=n36s!48vk4~~zPuFdgP7~|^Vq2nY|9hcl -Mx|g7e;-Uk+zWf-cDAh6Fx#dG^|l#?rS2wPO9zrsk8H~^EMOceR_OoR=#95HBCJOalH06*pyxZR)BSb -JJi8`>ku%ar!t!c`o3*ARXGZ|59mK$znyy)$!1$fDPM@TiiB3_n(okh@_69+l-n*-HyqJS7;$ijlX|v -2zZ^$>M$+`|yrbV_Js3p4`(7IVa3<K5e)bx7Nj{wqb_eceS3<7z*pC0<Jb#7&My+bp0Mi2=0Gk#n5m; -Y^Twq0Os*lf^6K(4O~{wlxmGES+Yh_hY;v+^7CBpq}*@@Z&&Iw-0dYy$$*N8RFsJVWcDkAG1q(*W!gU -4ApzD0y#p!c(e8IZQ~tShtUd9>}86Z_A+mc+~;&b)aM5(~|ezx9@@jsoM@<+xB5^@L)XAvT&NUM&|K~ -=a9JTXEhb~i5;)*cHi(?6JlFfxDNV!uY4eLT|ek!D=RHr5JtZpgxCJgn5Mu73Z$D5yeA}et^jia2(cN -1(7<pho&<f0@k-Z@0O}d{NdYgcM6Ir{J1&(B4VXO|fESDxYzx{~4{iAQ7W^R1uotDNUjrWqXzuXJ8jO -w<jZ_<W6Hsumf9fBjC3soUrEFD!;Eqv5It|x-ZC7w67k`Avg2xGKuLU%$aXCCV@^M;@SBV>V1lcMTHm -i&>qlRyQ&p;=pR*wh+Zp$@S%|@x^x6^!#Og*F?QEW9dd;Y_AWg1B$tRZwdx?6j>1~qphY?wb?<Gr}%W -r?!ZAn^z4lxc78b)tA-o1f=ZUt|9mZLN7<@4r35e@d@+sAq+r>~dc^J34g|6=6p>PuqCWW@fls=qG0O -oSBn>?P=1w)i4&!tsU*_gh6D)VC?O2wMRQdjPF4rpT6{BCcf!2$HEJ2J30V6)o~b~_nGbEi(~ete{CP -2&5Y`vwjJy>vs)fDO}hq^sX;tQP7z_shrNhc>oLi`=kE;=Eg`#6>SeEiJ^|tFrw%2sRz1=*^lbnkeEe -1rLDP7(y1$c=J)nnYf;!NnfBp{m^Suikz5FuRi#0p8`*u~kojnv3q};cyF87^gGs@{3Y1#T!PK$i6%I -VcNjzQvi4BsGoa~!N``nA#pU+1Vmt#tkL)IB%ho+Y&iJ3M@BlG`g1dywkQlJ;za=gMo>mNVS%s>!XLm -Ct-Xwj&5+7<%*rNy4g}t6~nBJexLUgzpGUz1p_aC*(N0r8{Z%JIy&pY?-YpRR>bccq)NscXK>AG8a{D -PE^e2UQ3250+43pmIV-wfjxvKNhPrGUo)1js5w7*s~c~oE9f`x48HfY&eqy_vb^C@AXfd(nceMuRF&D -tz#f(8`&iwq>0yDP;2smvZOB-+As1w=H>>d`?D=(Eza9Lz#G)JA59ARFAGhiu*WZ?EXQF#3ZPW){cqq -lwJTMzP+bt-kKHm{eXJk-`G+#Q3gx8j;<O+?^J?a|ir(sKFbHZX3d={VafQ9ZPPkYSK69=MRZS&sVXn -pxnPJ@UxqNvL7xjx5(ak^`m24Zg~exPXAd6(=J+pZOB2d0ytt|fQjKal$T@o7&zqOY)4r+B_D!l3pj= -%fs5tbdumGAW}aY_C#vT;!nEd(`c<zIN+eH!DD*oi7c-*1GySiri(_;j{jm`x2bN?fSvob=8~<Lf`nU -cC6_eh`7zW!E(i$)t}^^cWMIC-V}czZhy+ZIPuzW7ac)2Vs}_^udV1;e=F^QktWt#sq2Wkr-R&45DUr -Pp;0Ky*e<*o(Ot3bamEfjV3r=%oW~kE5%<VLaQ6#+LQdMcyXnT+ZNtbJcGfm>h24y~QmT|khleY!R#k -G%R8)w~;SGLh6iNKh=umPz_S|&U4m(GYyvC;C&Na`|fwM>Y!=EUjSt9vwkdL36Lp?tnY23d5^Bi#K30 -j}51TK94=gv8-K?SZyzkK13ZVTnM)fOU}Gd;!ExOzMJWwV=nMMa7=1O`F6l0{Z2-1bhc>4p)LE<;Y!0 -g|?d;PCsWj4FP^>QA*GcM(u{)IhwcDU{I}U&ZwTi{^WaNHpIz;L&VI{5$!V{W`&X0Tp%tO(T46ijm0g -oSWIb?-nNHyjo>EA;;%SvM#Vu<s2Hu^0rQ+-P6i@i(2>G9v+}>Hg2O<r;bW0=+*~#WVUDhHEyps<O8@ -v$nk7EzyfRIc)-xxEFZpf&F4cTA&6${Vr2}3J^-pdwXG8X+PJa-aI4)zplob3>((d4v%(-ajk-*#`vB -xv?|s2<Jg`x;<(dB455$H*EfO1+;{jfH?SM0)M>rX%jNaXbEZfm^b!Cd-dIwuM+o7&h8%GXG_^DM+!| -p}zi@VU1K<9J_P66?v4s}Xb?QFeT&R31Ln7bz{F;LtV&Hm<0uklcy6|IN*MiFnpf_Rw?TF3sLkITqQq -dB!Wd<Z&5m`_^VFABg6wzGQ;NxC8)`oiG%YQyYXv_XG@;F%t_DttWmB%P2QVA5%KMA7{WI-dTHb1SL; -0Z>Z=1QY-O00;n48F5VYn2-#-ssI20Tmb+Z0001RX>c!Jc4cm4Z*nhWX>)XJX<{#QGcqn^cxCLpdtek -rwm97LNYY6r=>ZZ9?}$N>prQjv90C)_gdhY5VrIx<0<IXxkyQ-cfV%_|dq&e~X4SoVcfD74Wzk)H>@K -S!_yA`ZOu#1(7o)Hm-KaHm)F3e#Af&%@s(U60itD}K@Av)nq3N!!I`ukr>eM+^=hT$_>_NuFFpL@gRF -z?NG1@-|^Y8x=_{$vkN+$DS>N^+jGAw-O;v2oUugP6qd)IBXH~%8{mYeUq^DaL3=eOq83U}t-erIm+4 -duDNxNGIDS7v0S<>_Tu<WF--Pdu<7{&(!jix$j>clo-!1#bEtvS1#4PgpPm-bKF|y`YT3{(6Cx#$T+% -XY22w^u6TvTfA6aysa)L!z?r;G2Snic;azwjM0#8NMo2+;N$mNT;~LMSmE!Wjs*-G877G_(DeA5dBQ- -E_RKv7z@MXm0wQeUop{lI+rMR)nHZR2V4igS05TsmFz>SrQ-6qIM*kSnzdmnlpq&oGg~6}nZ(YyByJ? -r+AndDoFibAPthlmv<<0!fkTgl}`(*grGZ+r)bzG@|G5fB>7=u>kiSNOMuB=^CdkchVU!l*;5_q5af% -0l^U3C`#j?dI^K+9WbI3I4#g?sq_|NDRQuR`u<=r998Z1Ee57~30?vsbKR8NnHJT3xDO2?l!4s;XB79 -^pm0agpa?<i&kiT7t`)d&0qxFH<2d<ZzM0nV4wt8Psg%po5XidTsBJ`V@va5P_QHGS*{LgC)H#ZckDu -vxspmCU>OM9Dxu&>Sc_QQ|+u^lw-kCgY0DU!@=Syy~=xX%knBLLF}09@j9T&ptIMedRL5sGNig*sjic -J3ANY`*ju=V!!Yw5%wm$Os;bZEQH5SIb||nncwaVzVIGy7B&oMgRmFXIQbmX4jM-c2Oj2E}+zqfX1p8 -(P1%K5Hgjf!p5m<681EW~Elh{<unrm<2$H<+&q{?93`=_3g>)8AjlQZ_H+zDkyfgj-Pv6|iFTA0<6vr -C3bfxVoq?5{6gTZ2}c8!PG}wX~uxsOU{-qugl=*?YK0Lf)0oCrRjVk@*<y?8tX^`I4Z<N&tRTYXeqI$ -^Z}08gbv`e4#yGXv;r!kI~lcW87HPaIGrnlZT{2MYQ<lQK6nzZzGiNA|2-_UV_E5)aqqQW{qrp`AJBq -u@B)>O6@IczE(_<vlEMY5sH$Xot4Y!(7NSLHQNe9E?&y`j6MU@2js)L)NBXRL1&;_u&CKH5FnN;7)s> -kYHdJ~*oJQLjwxb*1X6tr<j4UiTgaiMx5pYfjx%xk+$Z_-S{baEh0(I99*<O<H(Je}f|axei}S25-)e -ZRcllDw)$EB74aHi-4SCkpLJ}0J7;Pc%bF`}l=xW2}yhfY`Qy8YQlIG;KoGj$@zD?mi>;*C^u69G>RF -8{{oI&Yd;`1iT)20HLuUkFpg2a`i3r42JoYz6K{SmT3ncr!NUh;vK$SRl^&=R|}#8u=KEisQKdbLD@w -{EC|X(`UT3Hhv=Jrn8z;2g{`+2!$gU=Tej4~<f@EszGmEU$x>a4D1^0~Aawh|SrG=!H&=)}R1i#n^6D -3ukHN!gQyfx!CiSw3tuMVnZO>s!iv&VL%oG-sQp>haAkSjQ~^*gRD#lmaxD$xSdQ5V0)Yx8_$pQu`Y5 -j9nl&H2^IkBRX?C)aKsi0bR$7OOzZd+)B)sLSt&NNHR9~?KI1ZBoGnx%&KmD+1qklpkc+qh$QG)sk&; -cPDotng<lGKOegu-Qg=B7La%Ck}KLKlY>oxNi0j!j)WMX7dJTlF63cvwaAhOdUO#$vwy^NA^Lr0!zAT -LCgkZp#p*N8L5^JZVJlH?mNhRl_VU1YZ@-n*7S8z6ie47-vSTy0c_U~Naz^xD$JW}{x+m(mV|)cDFC< -X&zcjBFmQpb)>u^Q^Rk0F08+62SM*AyOnp`4RlE9jK8kbAo|R2)mj!7D_%p0~m|}R#iX-5Yeg*#Ooyx -TN%6`YqE7$%J11@YqFb$)St=VE%j&8_>?01{@QO8qkJ+x9DbUu<1`L=c`(p*4y#CJ@_XDKAM1^tLlT@ -!=dvwiJ7zzHdA8F$yH4Zi)JT2-GgVdwci_9G;BkEMBcShyk4UPH4;JuIQ!rNek`Ch~-s2tmD6gh<`;5 -!A;rdN#Vz_z`fA)w#XqJn;map_Ig*1x>|MMS!4+c6ARc`5Ve3O~bASuv}m<$y>j&HByE1ihGjcKt6=v -@_$Jr1!l%^~i~36>gxA(~oh>_>#|{P3Ze+$qxvzLy{cj^h-hBl!JX`(;WnK^G+CKtkXcB<wvDGwnA8F -`p;MU(LG7ZWz17z<RfRg}7b_?NKQasgz9A9Ub&Z`*IvW+-?uqXGRt^#Y0{NB6vHR2femuAWaL#Q<10% -)@Yx_d+=*mxW{Azd8krdyDcPFvGz}(B72LFMgEe-FfGh*;EcotL0d@q6+j3Ux)j06_c07a!7MF&n5-U -xOB@S1Gsqg6GY4`i2ViBcDX<H<q&iWYuP^BAba}Bc<iX)|=~uSEN?~=Elhsssuu9JM7ALOHDoLfRzMZ -@Z`6IXr?*~!5G9s&V#SvIwC&P#V5`Dv~r77g8VF2E&<az5ET;{AGzmTDHwYEsfKp1A|M+!NFPz)?Tv= -~@PYUB!w!q(W|<cEqOn5t||;DFFsQ()y`vCzSAo#L;6Ccu21mNT>nCPOJ*T!b7q*@Pu_YRj98Tm@g1Q -gXb4#p12Kj2q+?6sNEcsTUzM$~@gdPJy$RA4X<D79?CU4NEHPl~`CG4`}(zVPM3wZR_rGd&EMlnGteG -3g`&Fv1IW`5X)2?rJFCJ#D9!8%Mrx{3!SUKp$l==#saEvsn1efkhCGEh~YEJNjj8)?CWX3$!?I30D&* -j7qUYotDKw|1pwraLvidZ3{t_estD*2MNDK%=t|^WS=Ep~Wfv+)O0vDVE=6wMiYY#`i&T%r7HxfUEUx -UrSfAM~O~W+e9F&mc8@aSPVmtgYma8Of!Dz{16vMgVUUS3gdLWbyCwzU?0AU3PkGwY=OOnljdRWrrGv -b%y!e1uK<`gle@~pj?H$#y|>1xP6r{VN!$gttv<+f0DgglT7%2i=8;*U=v%b*SFG^~q^0ZJP{QnY{e& -f4(}eJh~ubtC0>^Y@2OCy8O}V)D+#4AZd4!T^0$DrsVKu3OD^0d@xvlNigY8!m>dF7m|1NW7MYQVkwJ -oE9;Z>(a9H=b$~ehik_b(h74LR#?<cs+u2$j?#iQ=F;q1-WvzxEn~6B(^+-H^gOhYH+&!b?ZiKj3M}P -7YD?rB^H|%lrknCCJ$rEjfFItJChj#{^A=w#5(9sY7Au?(iMe*DM?M?=7i;<iUsls6%BbbA2J)Hl91h -4Ke7h`yu%F9mwzpna`}#JTPKzg1+j}^SpE3qR1K%cJ-wV)}T%+(K!ci*(Ef6#+`<DmjsLLY3Iep9Vd5 -%7N;YoWLbmkx}3t8HP#u+qa0y2u6_|)vM0w!RZSU@tVvr1(#sj4@i@*~B%EQZg5xqK1%Czs%7^&C<%U -GQZgC(sSj;eOS2xTmMUnYH#}@vO>Q%6*_cTyv$Sm~`{uet>m5xWCn9^^{mFz?(tqkU!yBxg-bVdnKjC -*@fCGaBKfZP>~MA7t19;lzbuA_$_j?v-Z|nP;cyYz1;n;LWD=1j<S&uBeSnyn9Dbs4YLe&vHVYf5nf) -`E7x^K0{~^O>Z-j-tm|U<aW4Zy+hjXz|8Q-p9PR-{A*`gx5e!7~_bTbTFxlR^&L~Ih&fay)fa}CyDFJ -o9(nUh~ab@dQIAK;AoU#1Y%bmSSo}0Xt2Ot=`M6By&`0;XCOm)T@4bZ&>DzGGHSKt^IxKu^uBP;qE>Q -8kbUE-MF@UX;i1udN1or$;}53P<qfKZDpxpGTBOz|GU8ue>2R;2@$piW$Z{wotD6iH|=5Ul)F1ws}-s -X)jPuArrJP`Vone{!-`cvfa&Aa`cqK$1UX(zPLn6rk8FAue+UQOgHZrO6twtR!j6ibAsqy@~ms$OfV@ -Wc(RjI<l%F&{XR;(A00R#$!?yu9kJI{VcA35h!9)Mxs&UAqeCWeS`ALf+`Dz;g3sotcUy-<!K<!?s*o -6aF>T%man6Hlo;#dhsy`UXOiUo;-}-npC+3uk06Uvl3r%aMND^5-X`I41Ra5(Su$lwZR5gi$tH791Kd -Rc9eMS97WvAOXwicZ6wBJxf~t1m5)b)DKCV8f-GfYS@sRzKaqVvRxQU0Nc=Y*e@9YeH?Ok{_fvCm1aI -dhYz{v`*rXGMr!JvJvv2r_|temkbxrpI*nv0Y%xbXQ5K_~0NO@XD_nrXTiwFUeuvs@BB5TD1Ea+tutm -F#B$sgwG<@J_mh)LWqz5N|p!$1cE7#|oC4L6cr?_8H3E<X2QNvw+lYk8qpMV)H$~+*rsYu=(@M(FrI| -rN}q1a%=vFQdL*?UK2l4K8i@sqR1A%7#IE`xx4rpb3Kg4A^X8KR=KnOx-`KscaHsN?RSs|=Y}v!jzm! -l^&ejU4Y@Zx-p=U#@PM&3aQ+u*?dHH?fxWn*EBX|ER>fo?mLE3l4WCVdnu4Pr$2vi7l1;SMDNyS@pgS -|j4E}m8?F>v|Ay=Nq0)sQ{S5oU|qzNX~$vR-UIMp-Hf?Icr19MOga?iE;^u8wv(51|v3p0$$I;(txr8 -~^>Y)=?Bad?wFFNao)wVHV>5*8w01hTWs<m|0p4$KjVehL!(nKVktP8KK`hAx{tl$IEnscCdzl!-_mF -N0`WiNX$kOu|+52PC<ZX*xCa#Re_Aa*1V|C|GHUTH#pkZDQLuVx83>l~{yKH~9z5WCN^tw_2G>H?g4{ -Rbr|1hwfp;wqAfyhHo?QL$|Sf=F`|sA*H1x2T`C+YB$+=8RddYrsGZ#APVLa_eeNcq*l{8?!xY-pWod --rY5@UOx2n-TNbRaE~JTl20lsbGYTKk{`ctpck7I2oGyBP9}7yVj)hpyAS`&q_f(Jyv&a?wl^$dnCcQ --|?k=&2{0ujl39)WDMnW*yZqj}!?#Xpdr;;-r`1e$0s9Z7{6;Bs&d<RXa84X;f#=@XnM?1P2J32m9;| -nO)vs4A7-F<;g)a+)p?q)#M4nBhx0gb;B8}BA>cE`I*W~ze+8~Lm9J{0RF7xi~gEbIV%)d<qpe7Xz8l -HYJ~@%4`ulnJ46S>6Y+aRC+=g@S2MfP^NbyWKtmNLnj^dF(3t8FHE=+!f}NVAW8jZ<z_<hFutgyZpk5 -m(wXXYRrKc;kdYqhj-@MBenwt+X;huU05n>Co9uY<_3X&G^xV&lX<iC2rF4gBTm|ZH442XZ3rgZ!}>; -%$6&FkRI_h_mTY|trN`+2v$Y-iMee>%hhoWEgd!)d)gw~Ltr+1mkeS#`kWy2C2r+8QWROR<PJxF@otB -5f`m|hllKJ22l+#uqv<t~D@)0m$Vt_2lm9n!#X600=?6_+&nK>Qt7Ljiyvhz5Ai*@Y`!iNyP4VNWtNM -vUlS(^gmMvg--qmSSgqDuEWCW4r^HO2uW%ILypb|*f^bl`Iu!DnGRJZm;*TdnxYFw@tVHX509oW3Ts( -$^L5!|SmJl2`zdoy^u=4&Uaj41B{1u+@U`RP}91Dupxy{I>-YxAp=CTar5AnQCT2ElFLOMf9MB?!-ue -R>-oYkp@veR<l>*063rsK<ZPo5xJn}tiqkE#|}9l=*5l3LIeQb4=@b~<HfSIT}qIQSHdf?@>sXTMiw! -)!{smwaRreox}=JjRMDxJaJNF7mCNIvf*8A*pCZO;`AfvuI{qSZUs7VST%Lq{BYHEin^z5hQzgT8Of2 -g)D5<Ze8gQod8nt~O+kqlajeRfYKMK*odp5m-=No|ooPRWYb2~#~tekt`KTsmyB$8at-;KPGr1MKk`M -Dy=;ja)$8h<f}+FW3Z0oi+u3%t$XNXHOk;#<~e1m5YNL|?<@DB|D(f1&Y?=(7~86Tza7(nKQ{c#!g>U -h!Xjz(mEjjOi`V|0rtEVqJ_8_(Zw6%AF#)k^h-UGI?hy-~k$yEs|s|FaiL2B1{O7?M(kjnTLX^U~jm! -SA89Z+S!Hqm8)s&gw%@Oc+5CG&ya?<P(xC<T~vN<1wH+MVoYyM?3;0c<5b-2WH|p5xQURvTpO2yS$xc -Aa(kbIK_^A?^wp0G;GVA7oZJrtBUmU1i7ZLp=OBlhtS-^B2<c*T8Z-lz4W-D(dUw&}#RHSAm~3Q}@xB -!A+cf!_MDi%HITMo&%m8|^saV-ia<eHxBxWRx(cXFkU6X=N+!tkCq`jDKDeF5FxgcMwNo{x*0%CWmMJ -}^Q>&?;(X+0~gA1#$ysqW&ldbcB|TxLR<l<wgGolmBF4^_P=P`BBszRd;S#EFEuZqU5FActQjGqM9$+ -tQ~I?Ltwo<eV6@t{WOG0cCUIP`WF?`5%twQm1ZrlQAc8qm6#c=Iz}MSc@z!H{oe?iSm#fg9a$K_-2rc -k+I1cRF60R9c14{-X}P{D9Ea*r971bX`C<&Dj>i88Vb^s|Iyo(Q3*g)m9?xhw?hrma*O>eKfK{Ks#Am -HCoN~Cankb9;tf_czWk&kMYoXqU@Asrik6u}65B=~=WNXa9;+*l8Uq}#;VW0cDhx_sN;z3*NAdhA<X4 -PuVUX?u`e3!q0jVoU*_g(ef`KXLG=5FFlN4yfZN}hnd_K~O&&S`#=Z=H;-2FCgj&6P=Mqj}W`g(jneF -gT>*Ha<-`pawZdhCHf=Q(8H=3tpw3gVV(3#|{CrxYNVHosR2wqpP&C5Y{k%d8MX+tQKXmp(?0X-qOmo -9)urB#^H)01}JdY0q^yd}Y1MZSO22&5EibkA(Gi&qcsI-996EgPxp$RyL54R_hAXv@E*gv_U&}F;%H; -=WAnsgXX+#3%T$gY0)&S#K_nV*v;=e2xGwyD-us%QF}62`jvQk$hu5l#!?tC^E(e4apaPU@nkQv(!PI -G=#sD)VyhygWg1<*lXt~TMN9<ZBILz*RIe6g(FHB?8Lo(B>|%)}_u@(~caqoOElsH&xK%>`dF!umFe} -w*ct|7{=UJsydDbBO<+qi)J(O&&cJ|uda7nikkidbD>O?3xV?k%<%B`3$BA0cplrk__xf~|1{CU;lcs -=_1lS8*J<Tb2q8kXsilbf9?qch6judJx_Wyp)nruS@?8RV)H(EddhxrEie$Kkh=?RJ=JG-eFrAFLo!d -9S<-Rx=`%b%<yC_~pU*zyg-Z3-8Mc7T;%;oSibLAF;pz&?i42SQS)i2!z%<HqDcrF}W3L72d6{QyD%_ -P9EHZ=b~B@+_VYTk;m}c*`@U^f?FYU2N<y2P;kqdU$lYpTKK!MxcQdr#W%TS4)Q$Q8R6s#SfZDx*%&Y -G16{`gG2~$b-99T=YT<`^HKZJo_mltBqUEv}vc~gTHT=9*CDT@Q%B3uHa1!Lib2hc0+`{>9fPh}?Tci -k*q9c$p@pS9PJSz-!mb@@8r(%g~@nY{2S0!j5ehgWh$F7tn=u|O9UdjUWWZMXNwMFdf<Lyw!RPjt7Z? -=EC_R8SYwZWTSu*&JsV)0jIMtIw6z+TK{$u)Bs=4BjX{3wPGW&6qpP<+PyEkI@jiZ%BXnUf)A7sBy2s -E>sX+4hr(L<Q>c=BTSJ>T0XHI*ZKGG>$3?1Kp5}yKomTQUS%V^5yE?qt&}})Vn8=Y#nf~nW=Dl%H<Py -reiy7>$a)tp=GEh$S35Jau|5$19MQYfz$(#uBu<)mbBaBW0rVJrr;_2tlu#Vv=mQkSLLxw7UMA_+0mz -$&jQ==;<Ancnja5#55VH`NO&u5P0QiLMkWy9C|{fH@Y0@>cBf?xNAgih)VH0hBHZ7~V0xSc-N;a43yF -Pg>xQ{~?7$6fnCRDtg}ArP@T1-2$|P-b`>^Z;wTMrS7o}vt+<?lGTMQTx-?;U5P_c2d#<#M)#}84~)~ -J0a0pn5+R>e1oSh63v21aVfq9F3WfM<&l2pme&mKrzdy9&1{+~i?1Dr%cfs}Q$$E{6X?pMNaEr(8tGy -1HKpghq16l;uolr%^p5Hk<8&rM4s9R<ZCwI*~?r@l8g~rak4;XnQcKk~|3lg?9z?!CQ)w(H3kjV&g`) -$9wI~5VHyZb~zwzPcb|y<(R#B4JW5SF-G;E*kZQ#)t(d!AI5r?SM#I17$VzeX*F4V4Be*4##kI3U#|B -c$|CQb0k+JNKO+iIGqi;q1xX8Gh&VrPmuxMCV3X7ON8E)M>nscxKxs~$)`;u-G+Z>)qjIZMbue&@_o~ -zUD1016$>M#f>bO+bDt=>zu>EZ90<z^w5Pehlui#^rdM#!nzlJC&MLnXGhf(n&3aX9^Nd?YUJ`>BSIw -(0?X{mD6LFL&NXZuRPK|@{pYIv;~0xGV|=!kH(o0TtGoNYV>Xj`uXwDkkDQ2<Tu$fYu~l@Ts)p}ofW3 -g~#9MV%3-W;aR+kj|ry_%y~w$frOS+OYZ<Z5#D(`qW9pQuC8X<FRO3;bVxTed8xYkYDPbG!KayH2wM- -TyZo7n=ZRF74-cw)^2&D@gvZn(;Q-Kc<tBpn9Kae=8qixa#62g@Ig3kPq+#0KFcxNu}W#T8S1p3<@~D -v&}SkeO6X>$f%B(m5p0Pz1vA7#JjH>8uc0LkeZBDH{L=x*yYCo~Xcn-j*Ij@w52<w~M0m7U^Wy3Co_i -t5U0$=bDXU07D}VK@k*@6HybnVG<!*9aJRfg~ix%^GaK0r&f&*GLbL}KIISoV~G&?QGdG_bO>oXlX?c -EFo<bPQ1B3xVs7j}F75V;4N<@S(!=f;Knr_>$TWr({o5%-YSnrmRZGa!S9C`H<NW_3CKi{67mN|%~Fl -^&YgPw^#UpUM~6LQR%=jhmC$K0G5IJ&$J{g}C<ClJZ~xD{ut^nC5D%I!iK&aK}oI0FmoK&8TX5HA-g_ -KSSvZF#Y>t4fT9Bd^}XFp?#c=c44>|F-|7*p&b{7M&aJv0C9MIPC^`3r{PCJfa56R!#STs4RZRALpv6 -_gU%O$MLvd-rNft7?Ix@6aJCX;xUj(Db}a|r!3P;2^sRKKa~cm%``$Iv#ZZ!1dRDDzai~n1RBD32I3} -&xaWQ<@8cVN|r_tTmkR#|i+t7>!*pJq}Q|_rLDEor*XHp4(*u$LPguxs!WCjW~MfNb%)GB8Gc!N>?xL -^!cS9izjet2OE$=e3qKwz<$glW0KMw%nV9$s^`-X?K{iK$;Pu3lVWW3=|cGdB$ycNHUZ&?M8l&?x(%+ -QYylwJJ9JQAw6*$fgF4ZLCGniNUS<n@~9Mz;HFCc83joS$CKf(g9_^(~w&z_lRGNlUu^Er0^HXrm5PI -CT5nBL6B@>8cWPnbqbbP5-JntN3C8hVMS-mJWqA@+RtwIwe6UE3X7m<LzzhB)3NU4`bFk?<?iMZb3@> -mkmT!Ls-y+ysy(fvLSpDUmrj~7QC0al0hOQSNwm#20VzeACB}>bmf}!S#h6JjLy-MmoA}Al9wiOIT9T -0y&K1v^xXoS&sdUU?rJyEV%a>Ijh~SQ5x3<`MY~9GFvOh(hQVB}PWd%v~K!0n;0jWQUipqTiW}#h+G( -k?e6FMinsqJJY3PHw6m5aajU`aSNe{xxo^UBgoYAQn8i%M+N<N~LK|B0oA^*vUrw-Xn{J*QNa9vFcf^ -^i$Z&3&fjQeB(95Owpq8|5CV-4=}A&O76ZHRmFp6S%nw<7iTy?V_5sVd7x@`H8q%jJor(PX_4D^OP;; -?>5&#D`24@)BBAl%Jn^Wd4K(<Cfl+4(?-GZG@g|31)x=U<XQQ#fVy$A2UPrft#s4;l2YwJqD9~!pFea -DC$^o#J@*tm;1l0cmqSLe#tg(;Ek~AB^~*CLw57TUO3#(bRc^8Yg%RW^NC@M4N-Vhl#b>$62rF)7KLG -Vq_Ow=x3Zbc9HQf@nb^<PIzXe?4HiuMq96B=xJ0sN%-sunr?sUxHt7V2F)D7LZsSTN)?eH9_qBo99xz -y4f7Wu0RDp+BNi(IejNFNJGS4I@nu|igN*ofnCm7XM+Qk@`)^b+73Oo`&Rsj|@4ze{o}tt1j3fT2_%U -=1(`yh(N*C#OzoBk>$Vr9}fhBB0VDP~Pi}KuhAx?~2XHwZ{a_-#H*8&7kv5og%j6Bqp2%mXf>;M}Q|U -ua1a$6cB~mld@Vak3r&a@4+}2NSN2d#EoVHpW#uDc*s@%1VQ0a2CeNH`c@<X_c~4?m&<4%lZudn$)z6 -YPyeENSz@VBr@n!}akB!S#XAFs=7UZgnt5nObgW<u%H%>0SqYMjZ!DdX+Oo5!3y}i^5u8dJTrie5%Pq -<;d^zMRJX!=H^sK;<YdZS{f5qiXBTE@=;uMS(@+mGnaXbhYc}Vqf+^RqKO*|7!HYHt}rKEVsTueHDGO -X^zAxI;atBHdN=$JdG^-P?_2*ZHbH5wII-w^UNo^z<v2OD~b9l7Nm+c95?EmRo<lB{Yw^=v^^7Ib?JZ -3*4&8xBES2k8!LofWs1?PvKB_ESPOS=bNu&DRu6xq}|vOU`zCY@G>ksS2ZmPTW6fadyn122EL#KwLoX -Y6VN}q_RM$m}ZY`7_XMKuTKHFv@u5+0(o5JWHMdrkeHKXXO_a@S#*2jO|w+)@sLQ2^n_10Y|3JwJ+FP -8XwP!3Jynr%xynk#K3F`gFpI4Pf<+i=3q_v+us}DTBG)0KwUSMV%=8G9+y&pzdTr~+es=97dB)sww|B -W8Xk|B*RC91^VIC>Ls%DHAD#=U;Ni!6eoa4~}AJzbyi)X0}LXQB^SrslKL-jlp2#a}gl+l6EJ)@eFDU -g+%`U=~E)(7N2zoH$X%Bilp<(y|pa$2h-ZmNYt<R%ZMqZnbqv&C)qLXA(*B9VY7tAi1}3b4D)!Do;_q -BiAU<+fwn4E%7Z+Puxm`4JKFB35kclQMx#LScB8x!(w3fB<rS8m&Ww$>iCOpb4Q|dna!pf1qK9y;I0Q -+qGwwXrf$-o47Fu%o2IDhx6n1Jn&n2R<P6{Wy*_k@?-O*MP~cijbl7$XGZur@xySXOx&LfwIYe#BbQm -k(`avS8to0jV%s?RQ20y|H6wUrkQsqFm(TJU%gYy&lP-q2WG@gLQqu&ewW*A4WR>AC<2`t;kJTk5sw= -4L1vaALNx@TPDoN0lKQY<llg+^Pp<}lY32-MtM@m;gH%h(G2RYN8F)_1<;fKl@ZRtf!pmep6LLOblpj -cF5wkMG^NF0v6Po%RXR*vPEA-3DG+9+g+rK^oli9tz|St!|I#>D1o-0=7}6Zm;0F%v2jZ34eGXabLh3 -7kXZey}Tbu!rgK3Z1JkQDL4opae8~Z7QgkIJK4Jpm{dT@5ICgQgjWR%Wjy<b8s%F(YdTT+v3x?iW=79 -0Q|sQcO(+&T({D>ULzH6?7P5ZfA2)1?X@TV-DLmkd6WG&iOf+MOSt#M4^H;<Eii{4>YwcMN#zM`;#QF -xPSDAIBc1FN(A$T`%>Y^>E!@~QaJpZj=emrHI6<fTSeWi(&=5LPoAAaHi3$Hy^t=hLiyztKpV35*>me -9DL+6iWo5=aUVQ?;UfiLlG1i_ik7HZ!i?nlc5ZK8q*b9fPoFiAjTQnI=>M_tRh$;uQe9o?3!(Lb7cae -l-L+7|fl#Y46d%e}&4&{0!#W1lH*a-|mT<MTkJz8F402XF^xQVoC%fp3_Yl{hI=DwpdsvdLl2yLaZjL -JHa+=7Ju*k(xFL+1QQ277rjt$(iaRGxw6ANXk^QsJ!216+_lkU;`kc0gn0?ve9w{9e7{gQpwpNRkQ>5 -8AV<vfXZBkJV_F~4=B7YiDAmo_<I9ur;>f`IPwU=VIjXt0Ftppn-7bU&>R=K=0S58t#@(?C@M`0r<g$ -_60*orE%U5IX2siZ2ItDUMN(Cl{RrnzhC)CH;{xZPe+5+*ep*xUlsseTV64&E$L$G~`plL5h*BX_-rI -8!`LFm{pHyL$t1MDgr}9fJRv1CP{*u=8{+9_tSO-C6y1e%gk;<(0aIHylT9Lq4fVeETg2d4YQ(-Lm<C -k&Kf;>Zmtd5L3p+VYi46Y<43!t-{RGc{xr}K@OlV#5IZg-KnRF3e!Y?_}`e>#n?rMo|?)G}**T_4k!E -_1=T27Qyixi~W^jd#gh)56RN2<)W5vm05Nb7(mb)Tn_@NE0Sd&`S|?Bn8cig94aI1G_ZM#{|pBV(6Aj -PEn^OtJ&LhHFCWPj|oWN0N3~n)MU!6-2E#tF2zvR6)a9RcQf^zza5$eH5)m97H+v5;M3~uX+lyxYgSD -4xo737PP7<`NL9eWy6ml-c!;5=4^4)dBRT)y;A3V6Z)r5mEdm@zAEGi?SE+sfnw(&f0j-(R#jp{QnoV -hn0Qgsap*pS5W+$OWW9r~m3u&5-HG}{=1h6BgbVE~1`K<anHI09{*_0utG?l513zL(S3HGW^P+l?N2^ -c3;GwS>Od}=B~qs;(67aCOHv~u^B0NE+oa*Eb>2X@k^BsCeJ@p2^J*@*)Ho#X=O9f=s+5AOv{>HY)jl -jlb7qw=bQd+C6}i81r0VNiK(<^t}ebVvQmC`U6qX&T18^d`4Q!q30~A%o2O9O(%?E|p&v+4l=(Q>)^T -x$fetp-U6yHr{x35-8vsQk#a!T;q+I6Xv209{;*@ZhosWw5Rn^pJ55QT9JKJL$iXAn_ty=h~T<ht_qz -#W`OesT5*Pisc}>Fj&@XQ$~y3n#12|+ii>0(LQ&k=0o;iT$aJfvD=KPl`6Al^dxU!=Yzjd^(!$|WlxC -ob^cwNUiGrSX0FHOE;%Oj@4{-vW&ftgCNa<q4D29wM^3ffXa=OHDpFO;0EILhy1!+PC-Q2PI(xSh{Wf -h3XkGY*zqfRBppfh$sDp^LUq#{lw6Klk}SQ`JlFJozqWI{@bA*Ep8Gz2EdDb2;nm!>I`kaAKq-~c6^K -1A>>)WE>1#iwe8K>OnaG!hAD1k7nZ)7+hm1e9r1Qfp*J1A{>UmKOaDY9q9LzNBh<Gpuk$|4MMq`TxRG -$fysO&Dbxvz|SynYX=j(3D-w$|HNnYE=8s5=KxDx1NwknTmPl8>+e1r$gW>PN<FrowbR|H+L0vsnFjW -50*u@ZLFKR<0X7|H(Wf*!NI8YuQ#{2iwi)<l&8paG9Tjq*Nt|BH{h!5|sj{=2bljqE`y;xifX1oI+2! -Onr{jij%0*;Jf89UR%0Vl%xSD3s)wBbj;l6kkTTZ5~9C&t5ZPd6#z2x~%b@@ehSo;_KELil>l;URUUO -0?=3{aYj$i2AN)U1?JjyW7;oZ2C7+Dw)_bgQ;~+mf(ozKWj1St#tQ0J|oWJd7ocuasE%r1HFP_|o%Fj -O82iEO=%YILzN}3pEwzvHp-Syx|NA?6sL<;i@sz0U;Xjf*dcO7SEV#ukQI!{M5u-@((qph%E*&Y7n~R -{oyv&6vmeoUT=z@nZi*cpM2_BC^$`nJArUe!SV<^&HVz8o4kj+#bi~9zTLTj%zIbYF(_6za_zfuJ!1t -hEzQ_Ow^tVym3x2?T1S8~JezqHg$W_IoGj=-6TcKd|FB>QC<YP=K})5Q91wYw40*P+k(Fji)j6QsfPi -8gLT&6F%k({*eixd{P>9A&A1j_<xyhZNKsD4@R8;C}a?pEJtYMi-$kSb9aq!9FJ&-9+oo`;BE)Qumss -`?*kYa&#f3b^{eyhv9f+;mQq9(^rF6xcvS#(&mV>ORlha?#cJ~_Y|qn)~hy-1&(^tqot34OjzpRds;+ -Gda$ARLefKEdyY;Tz~IpVWVnAjeA}SigHaq%eG%9C!{-d{(SJhm-NzbSeuvgldrgP-1@t#kv93-)Q(P -cZU0tsP*>_s*M@tH>v6Oe-AYMM!WCRNdrv3jq+Z!`{n|7t0+d>Kji$kL8xh%ZiEt~Mkv8u@N9hK8+iH -;bN*kaG0a?BxAZs~n-uIoKyLFr5E-1)HgoAZj@z@B+f(0p%mKnEhvUfY@rSL)fp4XRW9CXJuo>OT!rc -A2kVnl6>{tqrK|~wiwvl3(;%x`T=MIX=9TdYm5R=g;umGq-B)R<cA~EsPMZ)qEN=wnE%)|xWMDx@j!n -4smiLg2Pd?IX!{t3bjG>p?L`rAa3F)Bm2{>&s{ve;tQ23g+JEA7U%*!#HPs{RstsO?SkXAmRPvA-jf# -_f4CSj-;OXdyZqlB6Bjv*=X4*h>c&OY~y1X|WUs(NtO>Ij=xk%GY?&!<qSfMg18sUtE7?6`xaoW*rwe -%EtSHLT0oD!R)Jq;dAv!m^0dNMW18i?YBmsNQ85v4@0=gG;_Kzw*FU!sX`8{J9^&wMBdc^Gt)*PuF)W -#LJ0I9(jgWh#7fRzg74co|15mp#rdb>Tj2ax;(I;kzZBm~IsaHZMcIM$a4{X*U;t;Bi+gFWi(GmG-NR -@KAl+5+<K-aEyC9`ElG6)RYMQH6>j#-?I~p$ygy=pC?b(x}kxFbO_rObNCFx&kL=CH)djPMq;1`Odh_ -?di<iQ_XTFM2U1+AfeZ*EJVky=VIj7IlSH{|P~^Lz@lnG4{p9|JJ{05dRINb66M>8OgQRUwHw;K2B6f -L82#KP8~)7w7LYqaTovzGY=H+N@%vOrI^3i%<j1x6w(H0QSa%)D7+4lpp5&*gI^$0*Nv$^#>~Ar*J#x -^}4*M|LKmp!2nKi7b#n*8-nxWS}5D1hL*#c=JhrPG}EzGJyOf4wJo{<t4m4HG-S8SrDhQArfPK~2DsN -5DTvT~)}!dGI-o1pLUwKBqm%I}i4}=nyT}4`D~e`gXJf0m2MUcid=u#K-O6n?(fHfAU+<(U^X>cwF?J -_^r5L*l6mq~zH?6*2Lxt9ORKNID`pBT;;R-Q;sb-nJ<kh`o)dEdI|2e3VS_!$lrA7`QMWHu1s|BUxej -G(-B_%LUi*{(WrJ+1RBYMI(hd6(m=0)N$i!E%_VmvQbkUBk6#|!CkY6lp2g7Q}+pE^qmWdLZ+qxgg&^ -=EDqZqcIXIC%<acw@50CmJYUK@+l#g)%Lmp}7iOV90Ke+nXpw10UX{jhI!pJKTZw$*oG7RxoCV=2Ghl -Xt5Ni$K-jvQo!FoQ&q~aVT!4=8jT7d_6Z7tIm%t?v~9^~Orai>cVkz@eWM$`M83<95otpiAxkf=T%Go -!4qI7SzZ=_mn~(z&VgSJQegOLw!VrBtp?7mNyp>18bjXQ5<WdmVXl0T})^Pqifla_P@h?UB7*~r|4e@ -bkp=<eNOoDc_akNsSgKGf3i2|4xHwVxtb4p|2A2b)PPpDi+GyCXRTai6v_0b8~9nR%*G^BKgK`7x~pV -zCHaS}eN3<F$Zr0G#uBM<ijjSL*#G<<_O5L#pHX&rX7=cE1}>T~KrX!04kRWRDlBM(XoBSp%Udo&-OL -3ANU(p!Y&i|LXY6i#W2j7k|)AhanNlld!T+U-Y|xIE>g2X)@?6zOq|G~_el>4J^PCW_I<%tgxXpz~CI -bBW$ABwd<W+CiuL&w;p7<ag@}rtlt>asZh=n+;PO%Ix_y5T61%9B8zs@+k=(iYXH*_giru_ft~l*Utd -y*8#BKX|P&N;%=OWfN->N)218Za2kvQo=K)^V|9fx63@}~uYARVhjT-;uUu^esVN;@wexAg`ML!61TE -1bOps&Bn1Kt-_S_rDZ_r6*H-4$SIiPO(M5U;eccX+SKTd&ZCBSCsqO@;voVwV`O8!bMXokXfV?D|Ut! -VkJ?Ne?b)6OgWU*c|Ll#Dh$ybuU&yj$L(q2hPv=sgx{5Cbk>a?sfYRX&IxVzZH~uGX2mFuj1r@>i-m9 -z4ILG!Jd&7<A~{jb(uzApA+WM5N-Ns*Kb!zyxojeWTFd<kJ%)+Eix4HF~G`%k@ru4{JAdorg7XH*z9| -AExfuMX?kDfTw6&rA$}&CQ~C71N<R=m>k?pTaNRk>0q?>yB`#sHAbDVc$xk>TD&}XgUi7zTI66h!ryW -Dn|OnRvBBRx@b@&N4N!%?zERtC6|CgLBLj3}rOX3y)NsJ1W<M9VgFq8H)Xh=e#dB5{IdBBGNFc)~x|O -MWo@*L%5PkM?&n3?M*P~wk=8*w<`T8T8rd&0!ZhBBKNH1TkgH2C>kq;056urEhtiAC<T6cHf0ImD@;Y -7*phcBpgmmi61-Ft2vbkTyxO`a^*_pe=BC<girLTYzC?#38|baa9n-R&qg@WXvZa!)z#jLI>x8uL`zT -hJnNC5Bzv)ieE@G%z25|G7zMiN04n2*H)j&?S(hc#DTP4(kJ9MDJ~i@82Q5e|C5PzFDnr<f}si@$Ek! --=7}Rz?u_a<n}{94d2P-=iwVL{SV#Q5j1PQzv3Uj@2Nv^{8pC_!Y@6G;Ky!b`H|{cmPos)R@|dqdm|; -Iwq0T#aLa(qG|Zr8)sw{aR+Eq?JF*IMlm24_pIvw{zA_8P<13|*aXe}el1RsJYDc@*%y|E{%%S^A*+O -xH_@-or-q8drBr@PdH^~*O9QG7g`3x~+3BHUc*!Gs%ZyLfh6kcQ2F2|rNgNqFu7E)}X=y%xbGf9F)T* -2aIXtbS17&Ploxy({7SFey3tpL$dJk4?e+@A8~RmvN05?2<mutHfHPGk8SzLFVv<I2KcGfYTGZ7EraW -*y4L!UyBuc)ONzXW>KfZyaBxy6`{Z-{>)~EGi7fzwsDGnN|2e{2MoGl`9K>6aQ|)@3DnDjQV#FzcUM8 -#P1aN#;r$n?Mff39<G!&u2fR6gNyN_dc`t&;8Yb63pb;+Ea2KY6CE_Cp;Ms8hC2i~NQ1cdJ+qKE%yW| -&BVg=<e6pb_*&h;4_{{S>WXdsW163&%qDvr9{99TH<%-QsQXoV9tisCRQUgEUXDBDeW4QBy+cErXce# -tKSsFJ;oCo5H=~VqJM%b^?0!ZPjK<g7Q$cUFQElKrbHOo{WtYyoqBkDA)kX%HeFi5#$d)$nYc{gr1x> -zo=mfJ#ZDMkKPuCTP=rY<@c^Qk!doUB<ICOLcSXN?!|0Mgm}!g%iCPzfGD&s0+ahk3RsxzRXBs<1ST< -z9-oO33P^nmO?>H3f}<f$f)BnvzwgrO{9V6+m_VWBfJL;ri+Nv$=dy{n=FE4^Wc1d5+596ohVa{wOq~ -DS2itZ=RVdB$p_s7AgOt3Aj&B_ncDkS`KWWRW;a-%|++3lA`)qH}R*jwU^>a)Hr(QfhAaCsGl)jFw31 -v2HLzsH=q;HheJ_NhKA0kl^buG106aboW#Ds2=W!QjVv@_!OT>CUf>vC$n6Qa0QeFjd$dkwG$lj#w9c -t1{XJDOh*t+OK>{RISW2R9U>cA;rP;_J#xR35no0dQ+3IBo3*1XJ3~-#c9dmmM#vlm-1^&7qZadpH0& -Qm-$Fz?`tDWs=HHL1h(zKZ{()I|S0)3m2BbX$iSFY&At@QHpU|knUqj$`qC0!vNVXwI!cjiy4Yv#zY@ -R!D*nX`v$r@P3sR=lCE(tZlW1TDL%&*R1d4xEb@P`VXeS|#e<Y6~eQ?SOVb)7@(JYxMdyTetmVx<R?F -rohHqL8b)RQi$pAPLEu;3oV=6?)-@RP|V>fce^ELm-+#kd^YnlT;xw5P(IuXUz6N!RfxG%p$nkY5Ac> -QytHo0F71wpay9!!tP`j+RS(DS1X10)LSH+WJ^1kapke&-Y6`U<q4xh66xztIhoU2Db_ib7_Q0)9<5B -g=-WR_YZ<IQ%V`SXuR_;sy?8ndM>d2PW$=W{QaL~cJ5|B_)2BxT6cs)H6R@b*t&C8$#M8EkE&GEgvaF -v|;ma2MlK94&&z>?Eaa?|>D2i<N(+pUdR(#F-z_u-+|+~)fhpd!{%;tfGTz6|n@kK(TVYrSgrK`0=;v -duysZXqusfK=Cu*Qu4PLd&TwXu|<vb?quL`dXmyc#dpbZBM)j3n5gC=gt}A@ek1!3yOL8!?-z|CLO5L -u!kT>?8B@FDY_PU@hH+~Am{!;iLWxy&0pu%Ak}G|1MmaGk>dkxIY#ZB)$CTp%_1}C{Yt8vOn3=mZQW4 -Q`w+hzF^ygun{bw4J?IDimxFj11}T8XHbmoB2OyQY%ll*0gdh)>Ko@D<fq*5GwXZj|uc_MCYueXL?dz -}FmqYt{Li;M#zJ8;9m1<vp?dzsO943rdgAstPc^~SdA#e2JJvY#W<C;*#HK;gZe2RyZ>=<DD=Fvte^F -u9;YDpVcLEcL|Bokf8?S<6jCaXbpWx(4a&SnHCM4moi;Knkz_3-tJXm2+O@POn@hwtML=%_*1LJn(T) -iaRT@b0NpGW8ri!-~M#h<-KR8v($h9`%;udn>_#JL;WDKRUFJsq}*m=~1x|AsBfYPK&KL4fx?=Ap$ZW -q!f120N(zTw*_YwEn*AKhL$AESaY)jco0Hu)us?m$gTR!;rwA-;psGVsYh|^XggBr^taK18MDjN)>H2 -k4MuOQMs0dywW+B$mexTg9HkpGx5$M^kKW5}L4u}PKTr>DjnC@hI6Yr+Btg$p2GjEgl$J*!El=(}pO* -1b%M|hf6&0(O_dB%X0f=~Oj4qVrp4S(B;du2`yyF?9@r*!(PwhFl6+P;eTiwXF)$9(+7J6+$OwA_94? -DG5@ZC<|cypVY-A4Ilm(AH}>$LX>DSK{!k`-&<lwgsYGltA#m~fjly;Gu&j6FxCX;=$2K@umd#?!BO6 -Q{zW)$O#_yX8))>Ud*SpHvlValWk?aUSGTrK<OvovKwyYjM6$w{WXKxjpV8Va+Oz3w)f6_f^+}Z11!R -LwlT7#*xCHqt9{PTwkWv%TBA<X3CGe44Ff?QC!c@E#)Vc^0}n#4YURkGgT6KBYre^+Z%W^82y-@Gj}P -Yplu-BV6hAo+oAb1Iuw&s(Iq>xeAdeRFn=xlO@hBM@Mjf?LwKs7qKk?Q9m?1iX9wD0DA^FettG_*0lK -+klBz(8x4r@eGnedr8BKRQucK6E4{x&Z6JcS_gJHU;5cgvE8w>G<ZsCd+C!wX>2m!poSy=!9TEUz`CJ -6wi7BYYl$hw!mob>IB_wdtw@g4^DVGrpt*W%P}=}3V9Wd}}ci?b8A^8zjWa5-Z%tkyk;E-B0LA6TEF- -x;vY!4GXH>x7WGp{xtN-NmvF^V9Sw&y-r%xh<DZ)zVodeVdg}(LSu?cjzep7SO6aB3w*X?xV_=G?vWU -hsqM(6-Z`c)0pTAO~#Q6JE_C6Ds;9`VO14K(D^nj=N+)3qwOXv`fX6!YLH9NQz&%Fe*1nQABN1pPiVN -c3%BTLcE|;Jzn}41dHRL)`M$Vy#Jdq>b$^Ut%Rt76)|jy&ZE+_Fq4?jHf$o2e5$Y@0rfa_4!e7V@5$r -cQ1S?Ny9u{S4!o#9WWf6KhnLHPUC0Ra*$9;(_iqI;ovI&U$fT3}r(fqx1NDdYo^XhZ!8_Uks-+HdJu} -l><b%*OY|2Ci=K#-AN?K74``A5Ijoh9sNg%RZ4y`XZ=KuwExL87r!Rii33KWJsp6sHwq4}3_s6rk@TY -s9+Nk-{*!<<TXW^6Em(Js`sGr4~`s$-1v8EW~W@cB)YSM5zCDoT4w&8!zgt0w+6<U(zBZrIuM0Q>xPn -M0iPyJ<JyuB60DT7vk0C{P;q=cY%HxwJ$S6HCr<yjBR%I8I&9lk9Xmv8<YytAkL_m;mPQem-9b|*PyD -<4u@3N&IKOV>{%#dxFlSN^IBv1g_KL&Z4YySdvrIW7Vf?~@dA&Sac!m;Gq24TV@X_K86HFJarW8NQqD -gXPi?rsJOkQ)wyS->&W+Kb=mlr=cmNfX=zVq8^u7Gs9vU%Xf^Jf4k8u891D1WJptBwEcw4KEHO{}5T7 -ejOAJ7FCK$n4ry7q5geVq}OVy~mxJ;=0y@6gi|BX{5J=+_%FbN73+yRWgb=koO0IX`+hXf61y7J12Ds -40N@Z8U|7{OuF)X0O6NcnBi_?#x#>2Yw&YS%@UWqRXLUh1f}9l*eZTm|#bu&3kcQ7|}nA*0M%RQT_|i -f-U!%mdTO)7FV#ikoNZ7Y|X#|m*D#$t0`vxWYa%^RRCS%4QH~29&l?Hodt^xc}?s!WqtLZZkobg2m+1 -Itl_9N^l3`{XPeUAtgk!AG_u0Ql$(#jT-x!uo>9wXu4i)xagvRcldMln+c+=rnUIwL=}bTlLvQrVMpg -wJC1F(c+t*d~g7pArm`;wM%WiZF-h4b=es@4GC<l?unV>mEE6%7YbtEJk_J9uV%kr`(K?1$wb=?gH?` -_J_?_(8)k+XZ^T>cMxsEJD@@P1Il>sbB9)`GgxJWRN(37hbMqjgls!M_O-`#^Jeq(Qlv+!WI<%xfDcv -&+CYTR`!I6=m}4RC<T{3+meWi3N3S8fFuB(&_!_@9|xZ#C8|;XB~Je1i4rpXoL^4i!D^{L6a&!-fJUQ -v4La4NHTIy!pdUzZdIigN%Te=YM9J_;>P2pvQF}!hp5lLxIT*!it<0<cAD*Ctf)3ajQwmKD~58pot=t -N?&Nl+V01c0C)4PV*kV-6tbB0|NMN&T?45i>nSnA7x6|Yz>#xV#c{;Uk5XQaN(+Pz3Ycw0==hHA}66V -~`?S%iE^TYLZy-YO^`g=^gdG)z|L+nD=D0Kf8?!mnh=qYY#X~xPIktw?qJw5W8-c#ikxy%wcz<-v15_ -*(*UXKn!j}CG>4d3fgnDz+Tbr{=qkdM%I?adD>!+cD?8-z%=imm;YI#vc1arnf27#7ROhT`#h?Ti|`Q -DC89aj#MN0wTGcY5C!*LHAie7X6+s1FscRG}9Drm_e`S`o?xxzo4r$hkJOhymycVRbqp)bfyVfT9j4p -=62qlY&+};7PEL;=O`F%xzu7mU7IQ|WlbO2&(@~R5knL0M{5aH;RhRJX(ZR@od|PByUSw>;FWQS9c=# -v9x>Y+uEcE}(yau@9z$NdQjAQZ)QJ~W+z9Quf?hMGrMPGc3n|yhj=V4#*8^*@A%5f5fIC05OEKuhUAD -swczIcf_8jl+(!tRy`}_>pe(kn}3S3jYyY6;Sv$VI}3{w>^^!)oFuAx^~l=j;86ZTK^eh91Vnz%%E<t --suxJ>M0zjr+ZUV2fSXRUAnqC$6{f7b=xH*eN(15gw3t_!^7LglX$H{?xL`D8nvH+k(9!KrIy%L~%NJ -PTfPvEc<+oiEbvxhQ^tCG#0QupFhHo!D%>xB5jFw$MtMemC4>#x@96d9g)aVkub63Q4qUk@Cf_)`L={ -r0W40>sr7{bIsBnmWsu$rIl5c%Rnnt52C(airljB72sYIK$ejm>tURR(>;uXN(v}V1CUSb^YFSmfQ@) -RsCDSOHd}i^_v-hOW?;f@HRFTDhh<dJfIEEUj4aSq-32Z)@Ys`gbX!a?M?w~Rb8W{R2P~#Cw%Q(ElZ4 -6iN@;Z(mZ9xa;Oz-sZ0kcWCmbAG>48T2rUiVq9Pt@Z(-;qbEc`)Om`gsSvKs*6p*n6a--x??*u*XPP% -6}QH_1n|i|vA|VX;&e%Mp=q{52v;<}WVghmtpUCAiElAgH{&2ivp-AIk7O*wHQcP}25bSGV8;R&g8%m -)3AtA8aA9uFb&tkJ7E+HX+4lB2HKw3Y_h@Ve$L@xW$6|r{Y<bPlF!uN#a?vFiO5*g;e&wG;amO3$x@K -R!U_DTjs6YjN||@ljRH+&?%K2moqF7FwxI~vg36l<g(*{P}y^nR6K-LoyV1blK<?WrW^y7DlB81x^88 -;TG3Xii~wZHb**?c9?$w1a#ag%QP8x(%^D&*<84Zood>0PD{Ud-*cHE^f!-W7Xw<jn^nWfccWXu#p7{ -L}+U*l~pGB{F6fXea?xkG5FaK<Co*AUHTA`d|0ZWuy;k(k_x~6m&^>uGuW0WJNh&@uvxp32RMMS^8V| -Z{bNQ||!XzcZREPqv4HM)XRcj;71D;Ge8qB|BJNXcTe*{y!Cl{Uu7YR6~VMyJp0%Ox-ErEZy>?g9BJF -swyMzMQ4i5%E$6uh8~cyp2ew(U;Jj63+|tyFPm_aMx$jPCy+Yuf!3Eun<LskDk`b(kjjIRaJLBNH;vO -dg*=)i!EkRoml(D^6K;NW1{>nOfRg?YchyogFnPC(jtU!=*2m~C-VlpWWy`;F6x6~r)t|PhCyA$tEh= -w)C)PU@wfANPlHy+@WY-)HIp|g?*xlftR+7j2^RGwLgx~pUOl8sD|!8<rueHQFe_xI#q9xnklv_fzAY -Ax#?@YO5~0q!kM4_g(H-x=G0tyA7FkGl#CCm-KdA8m?mtlnCA#V4QjdDKVZv4{MEwB2AEw{AiSPCFJ1 -_pdb@C|sb1GKv3avzpn~1X*A95MdC>1oVc?B5=%g=Tpy<$*~;ms)^P)!aT<0oQc_z}Uf<BNS35Uv*c3 -@-Hu-lx;;j2Q&b_O1ByQHpH~w#Duw{N;52j32Kal$;%ycT1k0!f7cis^XZaPNV(7I4hMz+ELoZL?qF~ -k^kI3XjhQM52E{B(XvU(i*cFv*%!2(4InAJ-Up8((a`Ik^3fXcI)+aMVdVy)3wrfs{vi}(By$>wFeuN -MZV<l4pI8v~LI$$qg?{tyXS8Wvfme%Xxi!DI!-BP-g8Ic#NdwPlw8ji0zkDIyn6b1m%0D3oZHG}gIG| -NV<$ZatcormJ`CAm`urZl>V=jZnDC6am`QLIoEy*<!i)SBrThR@?X@Q{NB@XEM#s*Z-PpQ;^1zABf^t -o!J;_LgCMpvq6<7Onv^NF5BeX4%lC;hPly-?x1d?$M-R$6rd<UaF!yg!ScPaqdBQxcL8wV%jG^AF;0C -E#WKS}PN%d>>Ki>u-SaTK_dq>&J?xjT<fEX_Jt(1uulHiqMyop?#2Ro=>bx|M+{{xIb<`E~KNv(EfX1 -I8_leB?l&zfqcdDd%DypWgcY;y(P*$=(ieT@onh%?;kkaB>h$GB7!kuU)$QZ+~n*lsOrA(_kQ<t>@xY -|-*H<uuG}s8JMy|@<ulSWDE>MvUT#s|q>bIxJ`!EtXAiVQN4|hqhDAOw^>Z|{n?avb;8{>-rDy1WO~# -XUVH}zDcl41Yd4Eq}qh-71RwpONO(puugQGQ51(Wte2u%xT<QWefJS{z*2W2(}XT!7pw2@D$KWz{$10 -w7>gr}WjNZWSJ0OF19iQ>HwjE;e_yNhR-b9oN0c)}g$Uu025$4y2L*KdY=6pbED-Nh;9dd|NYK1k#Xl -(1IW4iuDT1p~QIEBA2NC7aZ#De_4*n>mE{e&K~JD*)PllDEvDP2>D7yq!6_7f0uDiV~U`M25g*L<(p| -_g#{N_GpgJ(Q*$n`9oabHsF~}>GF;|3S56W4Yynaqd!N*+tebipTY3iO|Gep6<v*G--#<`Fz6=K<x&= -Kd%`aA)_Co}^*T9-b>_ciDg%|%Vc*Z)_Y~c<2?mNkN0Uc#!}$LFiQkwRX0A#bqKxtx$~7Pt$sYiNE`f -M*?n?@mbpf*s1`%elOWlFp(sQfXyY!<!&R>W=giMh3*5$@F$^q<@%mC`N>wXa9X=tBIGs{7w7E@RXAn -g?Fz>M7HZWCI1VgDJ<kDEb>GI8s!ztCo9SH_@%|4uU^q=DPK9X`|mmao#%qqrM56I8gFM&V*^r_FXi> -;p`PQRk(NF-kkIe^L-@)&ZBOG>)vB2}rK7QzUVL`B)Dv)Tp<UzucFx)Fsh$a{VCS(X<^iXgjbqz;y~} -ecZjL&q1?TbW_Z18m7TC-pEarGo@l~M)VsaUhIveIRi;^3w+k^Mw(%ypjPxYTvjQi6@bcq-#Mh@w`|? -{ln{b}Qh3_StZOc98aB5`dK?F>{!AJ$9omj&Cc{zEXmyk{^r^!bruH9lr<NtZ6Y)J!8$%lN!^1citD| -rR+H`v}x7m(yk$lP!?C3_e3Y`ZgB${sI0`ClNbSWB7KZW>!wred%lErGPvGH@cox@BYo8HyhFGBlA8g -^j&eHqJYq#T(>o0<(fun6s0BUw$&4ZAVehdtZ%KkeD=hVS?6X2W?sn}<DHKq0lcJ~`ecftr2dr{1vv- -8!vz%Pv1ciGAl#1EqS?yV$i%ty355&Ng6ZwIN%#+wH9Y^)eXjRA52|gIH{Sm>ROX<gm-F`$*E6*=qlo -^Z!<#MYQkGjb>NSKMgbg5CV9MX$Jz@Ki>3~qW{jFM%oZ_lT16BuXlPz93AOsia8tFf;rJeSKWaS>eLy -DVzV`zicb|&BBpr<moL&agb`MWyD1ERg)gbPfKEXni+u4+!oKb6XVA4!nXOOHZ{f32xjNn#WabV~U1= -NZXN;s~7<uGRG(Y|xDf#O&n$_TbXn;%`l20eaGVQL|YVu!?(A&tY-fgHP?0aT_RbH)@mw2A}Q7gy=I@ -px{Rv&r#r&;B#&cBcq<ejkrR**-ZPL%xd(-*XYEPEzyrMD}e-qU0C?#DiLKAq^(Fd{!aurFH%_hl$q) -n5~befa2teMqK#c(<H9H)%j0lA#Y*my@d|X-1RgL-fQcT_1Yrj9I+3ouNAI2r?8KR@N@D<hyM@W`4*& -9q-sDlM?%}i@WDq9B#Q&Mq400L;Mv;St%f@7?PD);$`%n#*I@zaBO1KGK>5cS&5flI$3d+DrAbYCkdS -V*7n(C(SG`SFwCZZpy@!8?Ch0N;#YqB1dqJu&Yka(x9!}IdE`+KKFuTVPawvTbAQI~$Ij^<d0+oIA=W -(fXEZF{6*nw?@m#-0-pvC%@*aER|Ds1;H!>96BahloOFK0Cdd)!&?W_C!@}5tlJ`e-F@}$9Dc`wz6K2 -Lb%$w4gSj!-K1lAmpZcpn=k=4#Dp5!kT*8$4c0sT|;`x8^~#c8dGzQ9r&oM)wcEac2U@(J%Xb^-9rKZ -)$!s^|i{P&KCzDHI=&d{U7$!12sqbAA9PFPf=%-sO`e8dRT7O09QTs!mfH>UBFfEAA?=>nlJ3C_v`>y -y*~_a)%%a1;Hr1mzjf6s(_QtPx~pEH?y5IUch$Q>ch#GqyXuX>7Cc40EySm&BSMfG+iT8x_gwTN&U$z -3JI`6~k@KDP<^x3Z)d9|WJE^l?#lLaZ+ZK1$+k9@2vtIfCH_m!ze}c2#fw;5Y=mE}pFX+yC<bUa`_r& -A@&U#Ot`>D=)_k7P;Z>Hv~H|-}m>rKV3XhR>Jc)qvZ<LKrc9TNA}n@+v;#>c(&@K>Ozx84hk=B>9Lz4 -azhZ@qt=@2#itxPRlRw|AK4sdxRq_tc9c=%;(?{S&}Vee%4R?CFiBp6{urJFWeI!ybCf{2z1G8~T?4u -6j?L8|<owHT`r~JvvWS>Sz0XSH0hz`=7e%(c*s0RWA<k?_Krw(caMZ1aaZk-Sl|fO>bG;O>fTtH$8;A -fScYl>ZXSP7k1MdGQdsmqW`^{-l)LgO&3u&y&*lV;$h~;{q%I~{SO`W0zcVNZ_!ZQQBNa`grgp!;@>; -!-O}%<xAc3CdXD)u;tVG4srT*w-ct|f;r~TXz2BYt5l=m``vRVNDEa-6r{2i#;(X<NPd%(>u&17UUg1 -CHsfS*7)KiZ-=fyqs(216M>NQ_Fz*7%n(NnMS{Fe56>aC%^bXeB+J@p<tcfO~dlU}6xL!NrHQ{Thd^R -Io+Qx6#t_0)TUVo5?Blg54DQ;*XotgXB0V07ho313an6lfrY3k17<P{cmZckh??qkb5i&z!yA!NdX%X -3~8Q=05m441XWPUmnD}8+Gr!#f$abQpp*UomP(<^agVA7(nZLYNfqJ7(&t>i>o?vi~NCdJvIO6T}-Y1 -sY4&S1+)mm;+FyOsV>s{->CJzcVSOHsH_6odjM~pC8+aZ4m4fFd*j>a&%5>sqsf;4)-=`o{yWizh<rr -T0z;q$Cg~dOJvv-<0*)9Us2rlUGQpWtS&%z*Z4iX}g;$%!PeG$~k>8I#Poo_@_(v@@iw((nT&ieOMv& -hBO4MN1D%F}iSOq*TSG18kA)WsC+()AmN}zTH4E>=7vf@u@cV5OyMQGZPA<nn3Ek*QJIb{fZn1e-GkO -Wc4hvgzxyxGi1hJn9;+b3}3jzoj-z<U5zh7wnQTTeX-*!cMSwo;%M8$d61R7I|M5(Eo=yhzOaMIy=IE -v3B47K-dLgNzc{HIzQhEIv_cp(l!RC$&4Uslk%b9v8WN7j6=BJNL_BX`>l0s@Z4>e`-w+2RB-uefHUx -(PCcQX93{+cVEYhO<9IUtK$ZtCwSi&daO?4ScqFB^enHAE48DO1}U|kV1S&#sk+vzX0xELQ-fX<Zh9# -a8vRK)6b^e!ZC6v^YXEHyU_>s=u_?jFzkvwurTyGXCj0(%!}G%qSMcEsO!wt3A%EIQH!+bAl|hlH -a(MqO(O272+XytQT*)QzAn`da{vlkgXz${`+NVFr2<$sWj5PVAQ>b1K#WdIthfDU|{Zr$Bj#x6Mwh2K -jkr{leri)~3x#SgbMxnR+%x<zf^R)VMhr5vHUxK1KuB*VmOL8X8*y?NH1g=nXZO)3E#qK7;;DOg0@1{ -w!BKJ7Qg0{ld&K*5Kk?B||(jVx0v)bAyZ98m)?{nPH0T@6|TPf1l`5k?uKJyzIAVkMldcpyyq*jMzeN -2A#JW1fET+82%!8otL_F<dTnmPhC2Q_jh;?a0WT^=eRS)I<F+O+o#d%MW+Y4`H}7ceieP1Uxk}|E#hU -{2qew($`l&1xd(g2P}AyP%R)O;5c*U9FCcbU%VA{DO05&O<Hk%Gg^sj+!q}E13{p$yY%9>tjH+JVsT+ -+cGsV7h!q9;r764I>iG97oQ2cothq*sd*@t;k(Dw>?aC5(>Rqpq9U_4}{_InQ9QXOmW6Efupd8HSpOB -8=w4mxHF73}Iv!(Z?~2S&V%JT#>ct-5Q!Y*5KLl-78FY*3>#>_vrdXA5xPtV7z)up46VqBf5<DKP3<h -@vwzICr$$MGm|O6&{|0n{>Z2OKU6z6@<GF=S+Rw*HGjU)PIC;nlk+dIDa$BhcA`DOgRw61N#BR-1{Qk -1cPGkI50&L+Jb*)(&^YJ`AsEgCU80T(k#3^3Q*S8RNn!eVvFr#pftlgdu;6qxsHXU8$Blv!oaD{HnEu -%>)OmvLTyxTfwr~G#oKooa{Jl;hrKreh`M<H$A?Q+MZwg>D_6y%@L29+ITisG0z*;oj8GOuxm<QpO95 -RmamDo0scC6ySy^d$bg7``QRb0lrdDcJOITW(VxseZUh{sxmj%(RPv7t7_xt}oZ+Ld*J?HbxJTvpmJo -BERR@tO1+O0g=qrB`gB{VwI;*(jX!LGOp$9U7PmP_J;jH*q<4J8Rqot<^s%EBv1z6i3D22x=3eec}_k -t&rg&UDQZ?QCsDQ7F~2WL33OS%FIKv!t%-F?3bcuY?4kp504_-xRt)+u+){L^OmplX{~e40@V;6Hjxi -_b1Xep;J~|_+?3(M0IYR3JE4wrHyuWpPP!RP(y_`c_rF~*pV=h9N)tgdekH=*DtL#cW1b#&WeG3)Tpx -9)A;zJR%}>2B|Zp~TS+U+z)9g!J4v$cDZz~A;YrDs@WWyw%9Vlnj_##DLE?8o>vV80{TgfREv(blC`~ -Zhd9@CE5TaG9V}$9pdT>X4HdscCSK~6vBh!))?U7mL7VA&Wx@xQN2?rC*YOx@}v(x<fr&aK%l048NW> -JUbi5_PDd}~wq{lG=5wV~Zwv}POPEd=77;g-z5R9dw7@<Kz%{`wM{b9E1#DWINxU5b@#{jwO!<H9Fx2 -jV%K^{26C*2>Av_I2<*lW$m4uw7=a%R<|CxV9tt15i@90y&i*vpl{*NE1e<B)q(9|FX&crK0YoJS}N& -tO`@s*^kwnqcS!&wK&Os=ErIwokcq<@4GyBqRK=Gd`{tAHi>;*$LfyG1sb@@96CUtc1mn*`VXP?@EFV -9v~l)V7tF(%%zh_RwY!XY;e+w*+9b<7phgZ4hj^MsTjsqhy|tsa)=AdDBC5tMh-G~o*8q>Q%-d8iK-; -<iH+muf-y%K&yD`h={@X0ERcc;^6fuS(>MZki(_3FO<s|D73SgOsUCTQ#-S*y_WZf>D4$E&FL}G|<T{ -}xiaF%%>G~9|}=@{}HZ~`_?-Kn?T0x#=Kk!yL8tq_Z)LTqJmB_x^?62!Hs2o#c5YrMxY$hpp02WRtMQ -KoxStUh?HSI5{otrh1g8vRo&8tqkM@6@tj>tr-_?6#!=58`|T8-+nod>lxFU;$XzviD)JnM~XRFc|&L -p~civw(h~c2x$Nwm`{>h5e>kdtSjN1pDmBV!=IH#;j@b|3cFd2E0qsS1MnfDc~5qVbrhGnn{)Nr;C2d -~^CDuK&ei|e&2~?b8y59b-Ae<-0?f`gDDVf$%6`8T>&7?4T@E*m-BPS;$!>r4^3(KQclL6%qh;3uotI -Z}n4|k#D?@6=H{?4aD4|Jq35{)#P{M5za&VvfqDaWwE}<@V3AJvJkkc&*UC}w07{`h2`j;oWVB>O<b% -dv~l;|q1X0IOS$3tdaEYk2H&eQL)G+B@ketEvi(o#MWx+Tfi;g@O9bXlbw9lmdncGkt2hcmH7P;DOQd -~<pWOH1q*DswP5ajb5Ed)+BQTo2K9lyPV642(O{w}$&1{Pu^qBw&1cs?t(fC-R_5aA>r#ZOAweqet+4 -kXls4q|#<4zY1(ely~nRUnO?$hm34vx=#w!#C=Ok3S}?V;FHHs#7_JzO_Ho=e_|u#EXYFh@u7_QnnO{ -KkVKD}YQN7y#;M$&-Z_lQYiP>kraa$SItjP5f<j~Kl!sPCF{pzdb})9dl;DLjbDx_jc5w?4tZFp)@40 -g2xL$i?ph?n-y;vfr3Y^7DNl$jDpPPGWC?@pp%eQ*f&E&q2W^#33Kae|0;^0b52x3*1#EX_Pe3tFL)j -6sMRyOfXf$fum{kv=_s>JPFxJJ8fzhnxwgEy}*^|mC4TMga(KD+v><v4bLlX=my>uLtM@3ZWI>2#!e5 -ZT9)3yv|RFh{D6oILW=k>kzxn=W6yWVuM8+E9oXFORD~I2|#x)Ka)<DucV0!WK3i;!PeMhkLd0J4rSb -+1#$4xO&`tf>}Pc9JPFfd>-EEA<giw=*0P+(^bsaL7ZRQUwqp79@sZiTWNAJx8&n?@h0Q`R81MJs3`- -8W8AkwPnkr5>@(P&AFFaSM{w%ApsMtk97*m);w~5HDi1fNtDNrKKv&sD)>UGo-7L5A@=XxaHh+%a73c -6<x?cR&h~MMl_p<msC4M)E-^284{evbS)}a=mtGq7jDhF6>y2|etU?HXAy1bC`;q^LQ<<Gd5{)+ad@s -Ru0c4eEb0*CYBcenUmhu^19({HBsnETu{&9ISal+(4cZ7Z*f^XINZlQ><{BxagxpiA7^P?spul5~k0d -tD-&p-X&7d|u}2{&)*Xllc02Ns|b2v36%i?{T{lsIiqm)oExFw>HoudRNMt#4SRTh~QOQg?<iJ=c?Cj -c897Lg(eYpp-Ehf7~-|6l&qQNKOQi7Tb#_hoR!J}BGmlKGV2n&x&n?>!-d-K_;pF`w^dgA39k^LNCa7 -|s;`o6k9z4|meXx1(iJ68<tS3T+#p4~SN*7x2(O7V4mH<IGV07V*+x%u%{2GY11g0iq1W1`LVl6irdC -eZWM>a@ep#j9?@_hPW>;4&5(&GSYXVK}GtI@0{-%4(d!6NoR7O=f2wdYQ`T9z}YvBtuV%0;!S3d01Tq -COxq0*V_FDxeax!%Gu-F<F1VHxQ@x4lp!f-Q(%G=*X1g2VQTS{AdUc4*F37hPqtGu)r>5!$33iZ&4Uo -#T%4D5D24z-a0F2KUl4G<h~d8~B`@lEl>(QN$9_y7Fzc*A=DBwu_=V&=yMfyO%9;#8LyoLRPB!M(7X` -Nzx(iXLTjFjoJH|TxEC5HjxwOCYK#Td$`N_iU_5as@^iDwrmA5b)S0;s>74E^>a9y*Pa)pvKcQVKrd? -Lg7ayhFLian1|)PJGz}e^WNrS3yo29i;6N@22-$|;nTM-RDf-5534iDsp9bDmSNFM>Z(`$;d+GbmC|E -G0-<5$1ewz>5^-625<6gJ<rTea9<rvu}S%k5tbU#q!8`cZeBK(ueOHrap)<I&s3<(l5+{-qjC0Dy<mI -*&8ghZs&^;88y6Is_L#Fk2-iS(0-)uxF=9OFGpy?55}N7b)TCayg!ni!7yv@1gr#&PgQ)nO-D5Ba^&B -Y)~3>mj!*ddMFko7Q9*bD@Xy5_-s&gdS4#4`rLdIL7gETYv^K#fB`^qBZ8KXu@-+3+<yQLZN*GCuf#9 -LHj5=TBp6DQxj-kbygTix3?7OH?wh(q;*`1#jI~E(KVLj+Nv)cFzKV-W1=Zl;!3eb^PqNLkxJ?qEc<3 -(6MDm-@{N+l@bqFVjUnk#Wu@z`D;mSPa<|k#V~EH?W9TGn40lnAi{TwzTUPp1U8VEQXh}k2c-h7t<a% -BNL5x&;jo}KA0*&E!ipEfMgHQ;H<WlW5hMDGVKoly&llCF(RECj4Whlyr$QvZJ*VL-^H$l#2(Pv=%bV -a#%3AN#4wSvXxE?3ls2gULsLP-ikQM*#<OA5o8SSQttBu+hm0uVvX6+`L$;B|2oJGeC!8pBehKXos~d -tKW$c9JYQseGV4j27C%=-Q>#?PNbHT1A5>LdnjJY7rHR<t*!I5k-kYi)iDB4rb9MD_TUjLyIUlMAjmL -i1N+Xg^o@PH|5e0RHsNpfk=u(mn%dY6p0J3*Ha{-U?fFiDH0O8M5S>^eQ25JxQq`AUE-dSV2v@Ei}q^ -~94Pfudzhv=Omuu1wni)Y*ER6!rVj~?V-u&!QjViR;eDh=%Ei154T>sZo!AZv6xQjC-meNJqVwdw)h* -XKkm+6BWSyh2&1Chc%(C(WBKcEt@|JBFsJ%sp>Ag+J8G;qpxtYAG?~?|l$!cj-ddRv!D6U}Vql6CZ8@ -?HFEZZQ5Syp^5+QI>;Cqyvo<G(A_3(aAF$?9zCX%V?pcbKe^(zfh+$l9l2>SxW{M8{^DVp$;urjteK7 -Qy)SI%1^<UL)GzgVv9KlaxB83q{2idGXC_M9B*DM0VDS%bYuHLx54GCyO^!_cND^jH`P{En1?8i&|9Z -5)rq^T0^|BnSL@s#s_4AZYi?V%MFXnybZmPP#eNx{Vp5Bop2jv5n`rAv<i|&{H~OhO0wu4Vxz-VQ-6m -H3V8u~Lzu4ar4GM0D(*_1u5F4rV2Z3a9I!^m2E3$WMuI~G9armEFM=F`j5V^}5Z8;PmR3w3C25-qhDx -UdTogADN$NKD${(7T!&-7vfP6zPR>MvAnXSy|fgMSv*2$AESF4gI|6c8sJoyT5>v@C{cP;DG#IIsZ^} -W_5#WwZT(qd&(tnCg_OQK2~#-{yb<```YfkU#T68gqp8{C2<sr3TQVH$4KD3|qi_Ws1^5oc7z-3AM@T -N9dTR=2e_ufw8su{i3*{^BcH4d-dSS|n*8PZim1SFNXy>tH=9hk4f)#yW<q)nD9t!ormp72*7;#aSg* -eI{Ym=PL?pnWYjJ*@`P|>u$4^KN$5p8S=2o6fn7&b>Sk6YU670-u{-0WKB+G<IeGcDrLb(!*J!(Ib&y -$w)BaMthOzW2}ZmmaTw7#>#`!8NN|$SpiG98+h6V2=s^sKE8k)1IcYwqXpKThJSV=uJvF(xRb4J$0V# -Hh;<J$E)`R8JDQCEfoa@}nwdlP3w;@@4%z@)X%1oy%&cek-e9L*!-TVy3tbxuBrZMIsnzRNJhNVcz?_ -@NUgmCM4Yf-qAjXPECgo}RlwanTZ6*ub?Gqo#!*ezM28)+IlCQF2v_vot4mRZLwrqh&u!a|gQi15Q63 -Pw|DZwb%Jn@y-NPrEo>EHj-m<C4i4gR1)Aun^pk{Mvlm3coSE+)czNbC7RKwzQhPQ_!@tpxqvwGc&9B -9-T`woP}ww&{3r7uPc9aDVudp;)FxyGhHgrDD|}mjFW2JcS9;wXZ!8R%J-sQ%*0|~bL%1tu$R^^uu6& -bBTJ$Oc&yTL#A%QAW}!-3<34946i?S6r5HLXH><QxO)>xIZvMetd-LHmlS@^LHZ%h76`zN;sjPA|pLH -@{QyK2Rw3d54?eR7-&))apX|8fMxS3BoIqjoat=C2!O>WE8<h_{8HT1gJpMD-8m`l+8$bu>^9^=m_ -Nv2!9Yh!cK#qo^ByPjUXl0#TjJDd*}{rY4(2^LE&`!mwuM?Og)#3z7+mZ^zVq$Va3$k1<$Ips9Kk7q& -j}6?>?W|pEIL;f^Tatatz=rsJWu9%GB1*Ok<80vUM91K%o;Ll$*e7R#zCjd>7rAOQW_jY_a^Ws7z~$K -)x&A~cP$2n_I8PS*@bYdS0Yp#O4xFvPi^_kkXpG8yz1(p#f?jAYboFL?;zi+Ur|YqeMiu%)X6oePP|b -k8{QUmg20O_$bOE%jb0WEbn1R&{vapwFQW7=h|+u8E@|K<hpDTpUnr!gh52?N7u$uSKy`KYi<9{RP<E -e#b2;m${RkP82=WQ06O<6lM`8r4-w}1wiORYYnVw{NlG%pLHe`B`=|QF&nQmmN$W)Q(Or~@Fx{=E0L; -BrK@Hv6?9lN?2=tNlC)rEMkUk~<f_3AFu{X)giWLyR6PVKVTveSIFxYFus43a;f&U7z!Ac*q7j~YK3{ -OItLgr7(7lV4tjb~xB{xb!n)kY#73)!FD??L^2RetDe7VAB=zS$AV6%TB+Ol|MNeRb}nV<DBD7HB`aI -CiB}z4L1ETX5=o*@vA4zyF9#)`c(|G93@U6KZmGz(;t=9h(jqkKWM5MT{QwdRx{qV6Ag;1(ef27THSh -cs%4gk_L8ZU_IhCpX(idQ%#()B$D|i0>b}JNoW+H$t=p$5-@1;UCcfQG;U-Tk!p2#Y<!JX(98H{QiEZ -;9E;P;5Ru%?oFB#n_`R1v~DORUv#1;)}!8B!&*g6Sm$!o>(`7c=MrdU0-*QcqigOO`D<a)l4bA&6E*O -aU9aqs*l@&dSY1e#cr4&&0Xst6;r$cb)4lT%YBJCrB38Jb)+&P}X1zbj58GPVgB=jL82KK@NqX+JS;D -|4uRPudP;u6fkG6z7*{FS*YxfO*}0-V~e;MWh5jEl8;vqkJ~p;L_YD#fo(sMbsDpiOcRo=&6NDVYV$4 -h3O}KHtam#vHGm#H}8uJRP)`M=;n$KhA&Z+R(l+oRa;p1x$qw8)7!cQaTV%fTbWo8r=j5Tf)Q=z4tMB -GLL08;x~JX}dG}Zk`Sf-tzY1NWYvs;jwR|$OF5~sr-aV63a4D=qGW6YL;=(p-&R0;ETg7o*Wh2f*S27 -A0<Dw*neuW8q_m6Q9&^2z1!az04!~0^#KiubIt3t7g%2%i=#YI}llU2N}*AaZv-!?()P^-ly*49Xq?T -Sf%6L?1O$t0{NAeXidP;ivR)|B#@&5E71mkiF9UDb}3JvawKTvoqJR2WbTT#DSMHz__^dc}0eV!FspH -3)J<C`l+h&ZL!57>rXLPl~Gxt%r=bX4S>i-1@drIh@XXke8V*S8vl^FP=J+vMrdBT*m|{$2nJS1$Lhs -gO)_D#U#?>dnGmHARY5CcxhSe#qK-HMqGx*{C;b)EqUu0W8D|jWladz?xxG;o0J+(u1^+6_F0i=^_TW -peI>5KtAZivgXO&}VpCsv8%e%yCX1m57eskER;0Rbnc?idy+YaqeWYggb#do>5}D*+96%<{o9hYFks0 -rU>C8;wC2`IrmS*J%K3)r2m7JYj^0CAGR@J@gyUr>3*s<DLlI~nw-J;H?q-#kj#Br0WIG}ReE)+%&R> -4Rt)G@mwM8th|kp(stz*z$t&qxZ;Vr)kezEtA)B=JQ#6eH&IZ8Ae*Rnqm+$tglrbl$pp9!{k_ZyD0Y@ -1*t<Q(H>6eDID;^R@QVoHM19psF8y7rn@22ShKp55?-6DP%Dy_C^`|SQbHT?Y_m?p;}!&qIMW{DI-+F -l7?CjHWz2~NCAz`^jjM|t_E%DGTIb4)!OGhu}Y<ye6O`1Sw~%Q@oyQ$9F46eJ4|ZJm~OI@by2?HQL=f ->P>vLr^v?H~t*Y6<Uw@4y*d*(shsC%3bzl6qwW<xa;@LG-J`tea*ZsYZ2ua@2dSkjx@*ipr-#|FrG`U -!xqL#G^FW^8)Ke~SxE=H}zC)$asp~SF##NH(1S?E9a+v(4SmgBIGeZ<L!yYI8??!hinU%AiF%u+e(DG -Mue_S)4KExVLeSKX?Nwv6zU=7L9yy3oL3`8Y1v)2Px>6<sm!=a!w`m4mfAXE~7U>{&LhCS;tKsku1YA -J<jKdRYSch-0Zk#`Q*T<LUl%1(c-DA4zBMn7sHg?CrUzy)I4;7)H)T(UVX6eKzvyRdbD_A*ehiQWcJ~ -MW?m4W>76!cGIBHX)il)09!eetSiP*X^~UYy$q#qu27Z5UdGv^mqW%~Hm*+<CuZWDHXPaJC7p|V8nSw -ThDs|rSqdOJgk#ujyGuGpR~%<rn&@G?-x8~aBNjPAVr$%=SS=ym$v&dE*V8hqMti+zfF1IIKweup?Oy -9^&B(u2d)+u`uPZP&?^RWINV1+D+You_DhUc0Nqrt=anUXp97&R#95POAa!yXJZo*A!ab<N)YBDGj11 -3?BYSrHmhjm`Ij=doU+EL~Db2w=$vDWWX>${_EN0HQxO1;eJ`FfYfUPMZAx^;)!C0V~0A7FSjHV_RRY -Nu!fqX;hOWX}bi>bO7+E@&gTz@v@}I)Mv_1@OUcaZ%W8ei64P``g$3q^7sl{i-py6yNdElg9VUog<Sb -vt+A(xoEB^A5a1g=p>4<6;YRzEDk;#DV18X(A-Leb>3E3mQjrq)*q0#OkSd}8WdBt5Gpz~R!k}KiQ5x -!E<mBPbqcicg(~X=VY*qz2-CxwEX+362ZiZrjfNR$4HK_wtG_V4tbK&p+v+9EKGsgc)L7dH)8FbQ%uZ -HkVFp`ku@R*(%zAkgFx2rvowZ6h#aPb>bFlR*VJ29Q2s6pLUzo$KmBJipeNUKUts8~;i1k%rW>{AVbC -PwbFte>ogqd$G6Q<ERTbR?WGlV(QI#ott3&t_)1h{U&<rmhG!iqh6)<j{&QCijk!V0<78YHav<l5RtS -f7KntFSJI^<H6J32Sp<T>~o<R-Bq({e7fuAJk7HZM&Gh6;^D)uzoJA5W}qdg%tyeb^AyeWo&`6ZV(>t -iv3T*ibG7T%Y^k5tWO9ldKv3nVZ|LH))~Tz9XQrpVLdPC7gn)HYNW7U6!Z)0WkJ8N)(HBAwN}tCtQZZ -gU4<1lC0OqjR&4OJHdj!_eW=zOI7)R3PHD3KCai5>{ZUvwVLc_R&}LeX2&)>_J;Le*>j%Qx8`cfN+6U -IP!m5FFnXvl9`h>6s!#Y=3!(g2utU6e8g*67&3Bo!U){&_)$_aRj7amElMhYuVhqL+%>quDd7uK<`-Y -2Y&z}i|Q;`#76`(|exWoe>y5j*T?biSA(&ZKwNx+KUh-$*VhtxJ;ZazJv?XkDhuF7FGMLVs<*%$Cvyv -UPB&pOO1q><zUHbkn*Fm*dTmQu5HcjFesSC6_i@m$9<T!;*`q*5wh|B|&oOq;<)VT|y-nwbo^l?9y9u -@zT0v%P#jyF2P!t64}LBatYJA%#~e!8zG(DuXUL(yPTF>Vze#`WtW4J%V4d`V%g<G;Zm5O4R}hX{<RT -y)DOjUHO1QTaZEGZi2hOQ=9t=By|Zi!wnN<1LTIT9cMykgx3IPpp535jIkV2e*v_2k%+`6h&&8U7Wr) -gr`es?nvVlkpKH>!U$&TjJ7sfQ-Mb58^dw%;^eNyCGfsJm~9x2L=z%6jXlIEbaPDjX|`jo6!2fCqYq) -Piisk$u@<%1o|T3Uv9de?Y=QZ~f7loxeQ#euliYun@#7iz1AnD?nE!>VvG2X(_7siXNCKCQ1bpYCEgQ -u&AU(Y!diy4vMk?9#iUb5<MMCgbp-p;ps@I?><Q7x|7;WtMqXcgBG}waCtLT{w-awa&KX8#1fb*xXiZ -)vlIZ;#6aCeRis4k67w(FNLgPIbuFjT=|o$QD5Dp{CR1;Bd-a;5D)rEQPa=ESnqHpcnC`%saOI@Bd5G -f9sT4c(NEzc^iz~i9uu)Fl80rHX;>C1&My}|b-CCL8gE)%y5AT_RR4tQq1)N#SL|9|=uuwm5pTL+KI3 -lmvQ*-_=N6WG%i5I}I+qta$C)nSI07eQQ>?TN9294|I`ZMPal77!0@VAk_s2smJCy+U&Tl6IR9fpLG1 -zozR8@0jPEYb^X+=@<B;1Vls)IB+#E_h1o8s}d8X;HLJAV(&RlXaD9?J+ftT#C}t1vb-?{si~-Px=9S -8B~9-IBYx(qTap;kC!XeYLY!!7o(pyVVcd%h#6SUe1;TFV)qZVtp{o;uz{+>PL}!hNe51dNey{>|AN} -2#s<ywI|0`q3KR04|Aond8c!;bEeNMG!xvlxMRhU)8-0?T~~KPCNg?1a3owPnI8!OigfDgPV5{tuF16 -E&|301NUnR3{zsJlHglz8_58m^pM?v;+!VroEg#4w$}nG0c~eEWJ5_ev-@I~E)%%xl;Ee3*s<^JXgjs -A-(qt$4pG4^CCVBjXg8^}x^lD62b}3U9%BJQfbtKYB)KaH`Q-j?K@3ADRGR+~(*i=VEXk*<Bzc#2YY5 -hFelIYQVzcCS*&vM%u_0H%mYS7iQ*|`O-#$H58ccR3+*CF&rLzB?&ra3zP5W1IayU4aD^t7ot?j%3rw -?Fi>u_?9~a)aa5uPl{guzuL^d`28Co8aZqd>>9{H8sW6<X6w^^kB(X&&b;jGrZb3NwzaiN5_yC?@>a8 -{rCA#Jbg$|3MEJ&$RwCfu#n&-g6#w+2rd#d`JJ(D1i=Ie1Y-%Z3FZ<!L+~-dF@m!Me-PYrg)uLJK!OB -<M+jyTEF*Z6;26OV1Xl<guQKLA(2XFFU;x2zg7E}Kf`tT65v(M5n_wToS%MmZdq}#wkDw1hC_xOtSb} -VVIRwiHHWBP5I6-ik!0{TzBTy4)2nG<O5R50tCYVmJfM6NH7J@wl#|h36T)rli+uOh2T9!c_bnFk4j! -j&uV;^kNv0umNY<|!0)iG-a-K~-6ne^i@T+o9(80=w!!M_lYG<=cT|6unhHi7;M$bAGG&IYo+EZENO! -va|XixugNU_)3Oi)Ih87~v9~XNaAiWlS>UP0$xm0y&h*1eV7POizFPSO&|cKSu8+mdlJRi$ds`n!rGR -2&We5wqVVKIh=BOh$YjXeHh6%nQ|V&1~uYCbwaTcS(FITm_MFjM2Cj?(H~s<QaBQo=ub~L<&&u<$fI8 -q(EuD1MUDw%14S9aEmNeMBf?H1Y6{4fPQL{rmGMOD406e!Gz{dM%O=uWE`<Q)g(8KzwBVm5e9|di7JF -0<mq+f+s3es15iWy%CkTJNoTr*{Gl}%!ucmzSM6U45r@w4l3@OEa<P#^Tlv2$h*8=g5kW(mK33t#1>< -l6&6S*Qx9#O6q>1B)X5@qQkXQiC_3ffSXSrkT3IICH2)}LInDYg4W>46I-*l@Bh&-6x1Dp%kL?wKHJ# -~^Sq)QcG-a7v`OS%OZb&XxN1wbgen#V`u~$Q7kEk!V#@4*3*!f?U5+>e*yU)G9S4`Q+G@Xv2Jb{)De? -t#7?uc}G(^!{vH0*nFfC&J(4E_Vho&7Y*sq*yvDjQp&9{3NjkR_oco=iEk1$I$kctJCy>;0QlY7UVT~ -6->koBg2Fquv&QlZ{2Td!OEdmvegU@p@<mM{-9id)pjal6Mq@2UX^V9!D(U(E4gAwYs(LnEVBTNmDCr -F~r_|!D`1`PsJJxp|<))W0mfCZk?2lfsP;g`8>DK2XV1tw<2+T6<c;?Riy^kILG@ee5+{<N&7H1HtX4 -v|GDSw*&-{F_~Ic13QPM1?x(yeQUDAPQ_54}Y{I!TN<Xz6-e*-G4SYkSn#)z97IhY%7EqRw)}yRjaA8 -oT<r`*hRkcOr#QQY^TIe>Hafb*88Tsr5)BPCmV7iI{3JI^_!&gLqf4km6+2D+@*T>3u?n{YC8XS30rq -F`Z0=(2$8~?(yR~)(Y-q-UD|sTf_ZJow!775}EDE^dz$bnd^?}SVuC0$rNW;exYNy#Bd#%UC2EBxlTw -p)5+{g=KRle#D9!skU0Z#7@3cf*@sN59D0!n-M=%LiK1;7#5j%d7qq2_zF+ATqM0}Ssj1}ZOIHbG8&5 -G&+A{?0&E#_EC;k`<qjE#a6Gf;TdF+*9BdsZ-G^f#Tgj_fEbBMLIh^`{-q<X1^3YvRU43pr>`$ZbPb4 -}UVWNm_f2a?B`Qxn$2(Ze}5Hr54CfQHgRKy`4^NLLjL(r8kXTuF#lqso}-kx7rxLxq_?ogNj1V6IH1B -11)gt}6E52ao!ezuvaLTm5eR8%#BGr@y(4{M8RJ+wRZdF8}P~&$0V+yvsi&uKGV+{Qn0$x7O*T|7{L% -sQbIyryd75)crZ$<zF2K{JVdDMnC@A(4YOAz29AvEYn^8{ch>4qr0JtxHp}Z%${SOTRQLY`DF_%3(FT -hv3SY9o_y-*XP$j->9XgSuXy3bm8)J_y=LvpudI9Zwb$3b@#b3_HopDNrp;TnzWd($AAGoN`;Lmrox6 -5_v}f<W{U3jF;M0SL4j=jK=;vP?`||i#Cr+OF`kQZ0pE>*8x$l4Y(OUIW_4%KFxp48<-!5JL{mRvvYk -yp?y>XK>2S+DomnN>Nrp=nWwP@+?(dwSoZQ9=3&a-`oj-5K+*G1j6TX(M>J$v=O{{inlef#y-`1tzy2 -LuKMhlFaw!XqMe>EkD4=rboy%9=bSJ0~|Uf2yItXeyjGea53>#*TY9?UCF2KQ?n#QSpD8{{M9T|91ID -4Tz439XM!kT>OIxi9;Sr8aga__=uF$k)uXS<$rts|0BvDcc3+wd&JIUcb4tX*xAd;uE-6G?Cek2*%#Z -{m)P0=WoLiV&c4a9&c4~s4(&rzDLt_f??IBHhOr^^n;=#x`mq?YC5W&CvkL|q^m>@ddSgm@wn^9r+1a -DAv-2h(EIG>SZ>d?i8F|x^jp@d$yj-}CD9{@o8b4V-!5EjDnP<om9;s5Cg!BSq)C6Nzp*|@u-;^)hq< -1M9mPje4Pt*^{o1V%>uw;R4Lp<>`DJhv(GP{HXI;VLh^X8Paad9DuuC%n2DnO$tNh+C7(pm3b!AYqlB -(ITBmz0EE1nS-;^GhfeBe8DMq)953>-7BmY5Do}<hjB07fKQ(WXb}uLP@f-{MUzJ?MeDm+gxVIe@wXd -7w-LK7e?}BqA;UmGe*n=rL{ZE^6(5HNw%<o+e7mDlj4$0X1=_}qqs$hnU6`V1>lJn((eqL9dl19?|iX -3m@ROGj6MPP0J4GPKVGbL)yeJgVg;zqMZ#CXQNc^WN5MhKTgg|-XNE0rC0`{^B_E`dE>;~3VooaIFi> -Dy_l^}Pgeb6cOBJ)NT(JtJxDKaK_V0;eE?E~RS>R^>o-SyS@>B9r(pJ(_(oy2$eB{uaoX`Tn92xZVQ7 -6))hGhmlEHSZvMn?Y`B9kPl_9%iF{RDl^c)h6HA$f&1`$H3qd9Wty^NosQlxd==zzF4Pwn!u1lq)JSD -&LSL>M-3fLDZjqyup-ikiw+r3M=J<^pP&oL|RA(X;8cwNCWW^7jal}y3u6FNEc}gG-L_e@JS{^f$Wy5 -&&buwFT+ieEio@wI3$~7Gu?=|h==e9hcNIL<@`TAEd0r^EVKth2%ulU{{MmL#`J8p-eAZxsIzj_+3BX --36u1OP<4+2F=;gj4n?@EY<-5>n5WLm*XOGB)AbWf#`N*osEiT0u)r^qIxls4t~x!R0%cHm)DCrO{p` -XR^ywMuOhaA{g%;6S_pVZ37N0ksaIkfi>ZvBZVMbQ&M0KXf{1*QLz0qjr%?gYeL_&rsKRauJ6hiS4et -9Ni<DTS41<<%(9o`cNaid<HFZK3nQvtH>)uW)7UD-_38>wirjOqz_8G3bIrV<)+f2@5;eNgQ5d>Ry_7 -*dH*_?(<{vQeoaSt6rXKPuy1uoX<wk54DZ?5tdUKc(NVOG9tS$;wR^1wkYdvVEtT@(58XC%bC8T|&d{ -qD%3nWf>=-s0xhf20Q1wNUp9N1XZ$sBlIdbOFU<vPQ9=hdQpt_{&KO87(TFX@U7|g>fTG8E@O_;ua|N -oc=YPpi|C@Ee441s?za?oBXMqD294CKVWKHVpKB~o_tqCutI5h#>vQsrGw#20KI8Rjh3V2EXMpV#1`& -mjqtD5s{;eD9K|Opo8h3k$70LSV(leO-{RewjH~gX#veU5SnB<SPu+P41aw_p(@jrBUv+&)Qv8ERtIu ->$H!Ppe4&>3S%7J|T2Ft#8oCqG-Crt~Lchv~ER=>__+(Ft+M!Ye`c>6f1|-Y(CQzKpHxPXgW4#&N<2g -)l#tP38S{Pu(5;Z{Bxj|6b}l`<uGm+5fTbclICSRp0-Bo&VcCbZk$L`u>L-#6SH&egBFE{`r1)j$ajW -`}|=RXmz$SjwJi-=(rMg=X_Sg-`T(Q=sWutjH&N`yn+AB@pZUa?CcH0MP$_Z#oO5%(jA(6`~0R%)v=< -fxA(tl(6Q@=JJ-uOV}1XI<(Xc1=kjQ8zO(;t4g4F@SF_~K`Hy}2&hh&#y>tAxm*3g{z?=2`_cicevO) -64^XXeUcK$cpD_es-7>612x?JbB9eY%cutuN%?sfV1_PVrpu-{JdxC6~eqorXdfkvHFHr1J?!*+97lE -<X^EnCN;g><A$g{d8g*d~L4hCe06YtE_ZS;m2RhGZIUv-NV^i4-zdZ=l%GdAS97+4^XsAv>0aOOpEUW -l;qMSrc>R6o%*3Wy!up4nR1Xgaq3jm^O~&nwXbi%GM7gX=F%x4k6CgIt_&^*(mN4of1vi#;gG|jQZhu -saYBN=t(pucv_~&7A}hBH%L3#m@$}21d^+xqdb$3h4{=^UzCp>5mGn<v$7ajwA9N{hq37FyaMIz!PsF -#ViWv)`(<R)lqS|8*=V5uIKn%5a6)QSQk?KO<TzNLo-Y<A*eAj+EkgXlVslBLiZ)~!DU0l6!W9b;EW{ -~6pI)fH#XU=+!a#K}d`3P>XI_Jvj$%he`t@rY3pa|iSXbUhok!$O5@ck=PM<&%HwsAwZ^YznEz0Be-c -E4^G5YbQi4*mPB!j*H75<%LTrQ!To}Kk*L&T$UGm`VOa-;K16z(UY8M0wgUKVI)A7id(_wMOD%$PkQm -&CdZ_Nkyns!b|gM|s62DkH-nDDbS~7^yy}M0&WSQtpC-SRSa5e5B0TC6pKZP=0KJRGuVqn(|Rxsq6@0 -ldU)2QuJ>-Cui$v9$MivjOIWhah8eHVO3CPt#9RE;=ObS)O>7iVU{5;7c!+(gVfYoxhPCKJkQ3-?1X3 -?jRa>OIS;q3U+sn6wyw1gZ?+Y$J$MuBc7bYzP@@=A^ciuvG!e=Xt+N2Q+wuQLc5Qz6B+T>TXbM$rADg -O4iT#SyCX@6A!D6`+q~fI_coHQrJZr)fxx6cH?Mo=(8KT^06d3h6!?UQ23Pg>NjXfc^T{xt&NT-Cnbm -HsrhIGRWqW?3&55x3Q5iFB<Uuv^SjIFnOr%Iq2N_7~RZ7P_A#0Ho$GfCE^S+NL}gz9FKV2?uFAYk-RY -$EK<h`XsAvob{Qls-|<9!F`}^&ZX?LZ&9qFi?-R2ffk`k`XpGH{+p9iA&-g>(&{8J&m(c3#E2KW0S<K -GS;cAuTw&FB6*4`Pi=gx{O|Ms##4b~$z@a0Ov#VOtzj{rbGX&Hp1<Qih}(ak|NlSWry)P+KG@iPM~w2 -0FTE9Ba*|Exgs{g4H*4VV037ZKeGQHcguX^4n@wf2ne5lx&hK71E=+ehT@Tp}`-<+70q$L8_W=1lN`8 --)-;?Ax!({hl*-VwwA0_9VExYG1CU!qS4}iT$1{v2Ta`+M%=h?D3NA@?%{&VGYa0>@^?7SequafauBj -@*u?7mgT@1X4erR?wNDwTy&X84+;q;4D5-+CMxn19v%cK&}g{O$bz`~3aq&-O<+Hh7%mM~SaGrDHWGb -u9mD9W#8Z6a2>Ixji1W%aiTx^ZVp|-Ce=|&f{_0N5=lP&;JsF|HIGiwMCNu?X^w+S-k(r=l^vcke~m{ -SpoO-I5;}1aGTsCb7stuRf_E8ZzXfpTFIRK;%RL4WxApgVXmX_m8(yzR^KMw**7IqC!3q^GJKS5ZlUm -pUOM+u2lo9-)|bZIKK-Iq!ZwryprI!oKA~o5Cnlfpy*2#N<KLXV#+Xl$6cg*HkXhze>DXL?5`vio(+P -|O`2>>)9w8V>kU*d#2qx%5(3`-EKuyqzz>}a2fd_#bfr`MHfDzPMb?h>MmEbhNajO*mFq!)ZDhM_atS -4AW@D#yff`tSn1la_S5HxkJ8^cG^dlJE50v$mxfrg+r(k4(5)cmMp=LilHR1mBuSVOR!;3<NI1ak>y5 -*P`x2{H)A5)3CuAP6JqP0)$JLk{muQ1b)PL-0AlZh{R2%L$$$SV%CPAc-K10MGxF?13A9{>gU-b}Ozp -<Ux5bUe}x<`o1IjDK2jQ!DFN`+<uPNPX-;u9p3TJp;&%mDE!Edw+G<jAg67Q=S@4=K|Bw-G`Y33{`>s -ZN7{4eB<5SaX*$x9iMdJ%=3Mio>4{x9S5YS`$sN4#E}4jTm`wOv$;3R30+pb0JjujdOykfn9S5=FVQ? -evNdJ*W-0@7eV+ecq`L}U@?l$i0ZsY#$ZQS?W#{Kwh+^vncqi?Grca^UL!-ZDo<jsy3{T&!ih*91>10 -C2pRo#0<gae!8Qup3FhWvZfy&uk^caOUF>5o!)=eqaPMGj&goAN%m*ny3<%MS+(s|j=hOJxUU<4?bS{ -n(&EgIH>6D$B~sVkVPGs;H6@`Y&P6J@*`Y<&{_1d+)u+Dk>`2mtTI#Zr;4f<fdC90@DkQ>!FG069-D% -nET#o(+-K(L;ON*iCgWoX)|Xczy*Gw_7FdCmAv=TyNX^eK({)L9=ux*9XN16yo+gtiheHe+Dzd;ZRSP -Qd5X;U$nVn*scH~EGqYBDFGlzShcYt{?UmnaCI4)4uf;p1UrYXYC`_@GzVx1bRfIoq;Lsk);i^dgTjV -djQ~sP=4nb)OH{e%$=-RjRb_M<d|2ee_4%8mFf;8}cbJ*B83Q(I(>C?N*hx^;yzx==<A|VsyqdNY^?A -8~gITQ{yQr#%^ZIy7~5QSKX;!@SVy38k73LxHVK0UOi+xi0{EP&k4M}_ekiZ0dw2>*kthaae^JycR5! -XM)N#)us?wZa?WseG%J*Kpx2${$HsC2xcm=RO>lyhZu~H_4l+=F5-d&1$<;6rXk~i6j>2Vh2tH4kb+L -Xl?@zaya{Vk+*?j0$#!#2%HF93ET;~aPYZ@%<F%~=l=fwEHN>WB_}7dM<0E(9*-|xyqLZA+G}jnrcHv -!j~zS4zW@Gv8=vQ6xn%?Op&Pckq9z{8e~fR*+`)=>T-cF0C65(T6=m+=ym&`-8gasu;$MDG+d`J&7rr -0E`Sr|M`@bJCV#JQj1pn8`Oq&uv^&!qTr}3h)UOUE&NMpr(^^VOWkluTXkbW`eKVQANfe9{tjIp9FUA -Tv97tWkyV0Qo|jH?XpQaPcFbfTQ@{Pk9k9zB@1w>Q&hG%P$koJB=NvADQ6QFcRz4rM7RDQwiJQEc3}a -jYm~Ae%UGBAYyUGRw)yVFrUi^dGZk&0?!ek?i$H!`VAUT4tUY%N9<FW>4isvF8ms_QC8>_C`q@TQ++< -+xlES+w;VO?C|O-toL@#`t0P)XAftQyEzN^n6t2hoQ?gIv*^z`d+-EjL%-#$fMCQ~&c^)6*@V-ajX%% -X?AfzfSy>rdvSbN+_St9I(xpq;^5x6f%9ShG+O=y%{chN>fo<NrS@dNee)u6fx@!ZQ^DAeYFLL(LM<2 -2M`}ea?KmC*)IdX)3{`u$Z#EBE^>#x6N7rsBvj{e5knKNeuUsP39vC9{JV&7fk?Bd0X?CRC4f>-c3_N -Vb7iLoZcG^)jnH6y-hPK~`KHDEQrhlO(=Hii#nGx${Y9ACmV^Ns9tenja{SsRMqjpA!4emKQXp!lOG{ -zQsDows5ODE@Ma|0cz+p!lCr{Bw5kds2KI#UD-ajTC<o#ebFJ@1*!gDE@JZ{|&|ej^bBQ{0kKSie3Ev -JsC?P@i3pJFN=+gZCFHenpbH|+eMA=vsR2B_hJ0&p^TrK%J@%97{9oY@hf)m+fe*&6kkK}BPf0%#iz6 -`W>NeZ6n_E5UqSKTqWF~*|1*mJy<L0~K9Z;@=aaC3`@l9dqxfz(KZD|{?_oTG;*X{Hk5c?+DgG9U|G8 -a!){-T$cGPCOvc=4snr$FEM4W$-#WCJ$G~+(`j1Qg1_|)Z$FL|5sjr$ls@~vHbHN_94_z4t$JjI_*@f -T72H5C6Hioc!W@1^*Z=aN$t|9gsm(H6fCrSKr7kVPpxPAROV6n0YzXDEe>tvLJ5hqKE=IlD5Iv#U!uy -S9<D>qodPen*Pmm*PiK{9zP-0>v++`12|LQi}gF#ot8ncT)UA6#o>(ueOV?l1rd1#qUV*yHfm~6u%F} -kD&M?DgIQ7zmVd;O!0S6{1bNZ>pyAIWA79lJs@g8lvv+q2@mw{;nl5M&p|fdr~&bDaWOIR(UFl+F=>5 -!_v+QdYtW$XN(wP?<W2u^WQmDM^S&Pe1`Sfn{_%;?vGI|Vd~9@7<bbHOJ_yjGN4KuBe_Wz2Dn2SYCYs -^{uYP^Jy(7}<kc>}^SDt|#J=>-A>nEk))vc?#`yj-p^yA~>BIDCKw{GuA{uH3M9H3_!#gB|a<mmXcj; -&j_m;42eUftA$WSlMiw6<+pw|+2O1n?FCx~dUBItIQ`@Nd()^Mf*K2@fC#ik}u4l{h3mJ~lqB0}^QO* -{<EaZf<U!5|9J@6U9U6cc>R24aETe=-9-#`1r)w#4hy$kbkcSMEU~~W8z~IV-g46*P*Q(0RH#)?wi1* -^rJ-<N~xuVA%I+dB7GliA{B9BY<!|1Lgb*7KjEJi<D&x#@svh~fdgB&ZcPDf{%L_t(scb}DT5*8f8W4 -?0)<XC|7dp?_u!VA*!Y-4D&>J)1QDGF%Ipyt8WrX1<nE%0OiN5ljEj}AOjNilF4})Ubbn`uW<z8TlvP -}eZKfNS7Si9NX%h#BR)YycpqLmRNsLtI9~Bg!@oVa&x+ji2qX!T#`};>n*ZHTV4TyS3+tSq~kgU;ZNI -fp5F8{P>1bIl?!qHU+|L90!*LYUvkMbb~(=~6^@}aco#7Hgi8e{h9OV41BRw0Q|RE}|W-bg=2c$0gOU -$i!^zPH3blzt2`Vq9!MXajG%^r>j#qCy*Zv-tW?Vgql^D~fB}OCnE`AW`wp$aBSwK%=r;35#qX&)r#0 -QRKN{!-ffYq)0!=CVRXxJ%Y{8ie=9kqS>Z7v24S#A{MldWD4r%27k#}%2`Qfm`>(1&pgAPfBt#4V#Nx -!YSk*XX3ZKQE4=g0J3=0O|NZxctnfv}E9`laH#U&0uzUAzcJSaqAsd`K`z<?r_AEPh?i{PGu4d=YpJ% -`QdO^qrzyJO_yK&<NTXL1Njr4xxx?Mlpzbg%NK{U`&yIeeh2D%wE&^<u|-OH>M-^6_Qb~cpnV^jH2wu -GNz8~OJ%eqXeUPXl5S&FJ%KuwC4T;s;WE9mS8Q_+u#kREqyN#a}`3-=_HcDSq8J_g^{XzjDg|t#V2Sx -ew^jp@UfZZ!fft9XxyV@82Jnb#zd7=-}C*>jPapTDH88_^f@m-aUHs>e0WIhx`34=)FVN?!9_Z*j650 -`g`~HW}Uh{(7S)<X8l`HfR-&<+}EjVkKX;8H|u?$?4VZnexScf<<^_x+<#BY79Bj>J<z|oO4Y2Xi;LU -+?(Q9&n{;@fb8}TQIP~}E($>|%wOfBYotwHK{d+wfThm+f?#-Gu^``dKwMR#%PUK5bI@3Gl@7<|QukP -Oc`+MV3M9TjGZ*MPe@2=j0zE1Q&2i3K!r0FPjXDkeha85GZZlT)2E)2qBqeK^JeF)caJtBgr@7T}Y#i -MNLXkrI0a<2ay&)-?52fo-s(Y8yME+|w0K9TF$v}sf7S;TR?R8r!|8R{v-HVmc2|Eb4GPS@=&!=qd=J -c9kzFTVI<DvdiIT)1%IhhKjA<wqKO&i?%K&)<{z?d8jtFVMX7+^JKiHtyZK*W%#d;2jng)?cQ{Q%(n4 -Qcw<mrTkFW7?|(r*|TSNGEr77?=r6Em@#7_1L+}q$1lJ9@(G$p^Bp^O@E?Etk<)m}j~zRP1uFjSx8HJ -_e{=W~4V=c=udP;V714U;v(G+zp|Y~Fc))-GeoU$-Y{6;Aq%AVQ1@+oY2H2G?LD+iJ8DVpBa{Ov)YW` -s82JasK_Eg@7s15ofji8{Qp1_ar68L}o@yGnV_uk`#AAk4VcLm<xfB!xI;fEji;lqddkt0V$IK&|t0q -*B0&Wjs2Zk)As>(*H$vc;Os=7;k0^J5k*T9ia`HE_fBAn$hV+WD20m5uiG^+nlv#>B+*M!J6$|4WxHa -gt@0bno6hfXZ;uPe1*{D=I2%<$UPSA^z1@UkN;^egy8YpFVw>pFDX|yn`kMNahhH@!aKKfBm(F`0hHT -Y5n7mKlpFI{dVb#FTQy1yYIgHmh!rWa75>m)ZPLJhee3{SMeu#3VGQ8_$vS!6hNIQ0Q?m?6uSZqX;FZ -1wgJ_-4eZ?ke+U0vyLK(4dhA9#F&8xK+__WW5B@lD;)JM!GiT0-ci@ONL2X!=M~@yAfVP49fQfoT+d- -U9KKVr8k2<9G&ruIIZ{Fng54~R}_geT<8}|Jx_+Pnlh0`!3_&+!}xF`4+0Q^7w^i%%92On^%b51g|Xu -~Lf)W`n)`vm~^ef#!_wsQRVabX7y=mWrSXeX#6;I`!#&h;lak37h^|9;N<e}sF4Iqz4&`LK^Uf9-qDf -4_3&D7BSNe+B>T+qW<A^70BG8GaG<m#7ax1Mo$eqg+7`>H@gKj=KNmn{NcbjxtAi17Gj~XaU|Rf7J0y -=Q)o##<}h@&b5a)4?4iP-#(&YH|Gx!4L!GU-tB$P7oFm~wzhWpU%{XHdK&<L1(do_;P12(v;*)<>NlJ -ZI?j3Y7gYYBf$AXe6V82!hTJbXzf#M2<`K>{+ij|eyTbqK)vMs;g?@g1-G~?Ff(ELGTWA3;;3MGJ7#% -2glsW1Md;|VRze{sAfzU&Q|AQwb8U}pMc?97aN;Cuz-{c>c@XtERxz~sF_pkjK{xoKArT+*2(|E)I4e -LbVbCfIU0(=GDQ0PD#2cLoO(JmAd?E+8o8P10g4e`YP1HY7L2tUku$fptw8fpuDc5>c($6v>v`r;)$d -h`gOdRT;ZhQ6gSI>76<<1dsy{4p*d9{L&kC*>TqQPA);=W#?sEYYyxXMQ)&uLR3(hyS%}*Eo$c^#C*| -pwQ7+ois+r_3PL9k@r^cwKL=SvZ;~$nLM39V)PH3kNA%Bp{F@d1Px!w?U{HcOli;irS^<Ispod7J@@@ -kYSYx?9=IL;RL=|j{r$U9e?AxZgHIaL0lo)cH>5+M1-uSE`u4yk{>rp4zS<PdUnqzWG~gLm#rY_ihNN -#fPavEIe`VL6L4(|$`=L*wKD7t+NnMGCF7HZxD?PIt!@pa%ZZ`g>F&^XmE%kx+i}66I3$zEkD>MLq>i -2lXvl;yL8Dae8Y2o}OqG1KmfG3^$&#^?qNWx?IS&0UvJ%a|NJ)=+Z*-PcVi}U+I1C_t}J!=2^L^1~(! -=L(l!T;3O7C|0Dn^WjeXaNlv4{pa>z#skO=GjsF&BwI-HKJiH(Xh%W;a_lp^GB+Q1}o>O-%IToeNz0% -y7mkjl=ci7l=h51srLsWnX3))M?1s#LUNW3K!XAe>1eEtD74_&S{%aPo*ByDd{oO{olZ0qhV$Pq{=~o -hL!u##Xc+S&(O}n}<K^}obyVt;f<KkUXQfZ-MKpB(pwWIw;7{`X!hnE)ZX~131^(z4VS;Bs17seB7Pw -)oRpc`GVZ4RRfam>^5Wb}-gl{Ao-XI#*5e*+M&EuCZRNYl)Q$=*<P@M!T?OB#FdTnnUfAkj$|A&T#_C -#GMfc6T!fg5mFXhGkP{vPuh^qUx~Ft*{@J|~#JM>K3M3gsJSYWaGip<#P|n);+AIZ=G!lmUExRx~$Hj -ON7|G2CJr&A<8bu%N+S#^@)@7`MZp`g_6ugwG=24ZL6iC*Y0t0KAntK_71~A7lIljo|-X^CS2+qTyYl -Vbd(4f!YGvGiZ28reUc}!(z}dc>sTW648(u!;3Ov1r2!6CxzO{7y%zO&j08$For>n0IXZLj=%o;>l|{ -C0`_%sr*?AV#tnY>g>+tN4&ooqCK{+MyhAj+CAVkvNvli|e1#!`KbIfLpUTzoC$gisg=m;ZG|V9yW)T -f|8p;?CA8ow<0sh1bg8zxH=Yp1b^XBpO>(>i<?uHJ97R0q4d57<u8^kM!h7X7a(VmG0^hrv4UP*n@az -iA4Hebh|BpMbG4GV~dQsSf8dU4gK=#!%CWQ=#J8}I*tzrz1ot+pp{0Dkl5&$rRgkd8aia^prVKU2Akf -3z@~?=T1R59Idzwq1K(Bh&D_OvAs3j}}dd;$>M94S0l%LF01*!HOTn`1=XF^=Xefr}1~m(4j-)b8~Y) -2Cit2Xahw>MS=!<{`#{zfr&QNaE{g3^X2Y0Z88ShbGh7}8$5TEe}F&ge(>PIs0aS)tFH>#3$jdESs5= -ZEVR*ZCpzv_CwR~&Z7RBp_DnQ1($C!PX^(PRym)aX^_{#|uU<SYEsd{TyOv{IE+{DAMx&80T)0rQ>#x -85TJ$@Rg&Ly;cw=lpUj<nR@+js5c+j2?y=>yOf6#nmb)l_2D>BAXxjiqYw(w{8fB4~t?j-9BSMcxKw{ -Ku(W@c_iMn*ODqoN*Odg&$p&_fUL<m6;tUS7_hdFC1Z)KgChd@#QUzMuhP0mcc14$NUd1Nu|&A;v=Fv -D*^EKYIoEU*R9GDXfz*3MCl>?HPU2vgwIH|4-*%VPRoqiHV7`!9T?7OK9F7uzB<5_0)zr`SIz~r*mo( -9PbZ4_@IyxKKke*!4JS4xT1~}zEbJ~^nv#<&w*Trx<GqCn-=Yv>cPG}zuKTZAK3aL<iO|ehIv9lLY`W ->bg5VeLEds(<|QR1JS8QCckkYv-+%x8oMdZ(3-CbOum{kfKtoyp;3*|-^sS$+7|%Z})zSDY$ru=)U!N -7tw>~+MpZsJCzw-O<N2$K=di~+K=bqzp=gz&fWXTdfXU?48M~@!Ov$L~BxzoH-@DgZ1y8xZQ4Rkc51# -1u(hr#z4qtRBd9)Woz+#n;N?m$Z;50QWE8<f#sUH?I3YP&1*^Yg!b?6Jpg0?*XcQ~_wy3JniD@Bp7SZ -JMYDj2X(>jzS0U1^&vKFXjd?(H_u7&>kALcZ}Kga}Ug)*<W0LL)!xX6ECfrJ$v@&Xs7Y<@qFgYnW7#* -1MnX(U;rOEa-?ua9e@S}K!Y;x#as;XHTWKQ!UPY2HhbQJOoi~&m;B4i%PVlxrcF;^4)J&J2X6wvOIUA -)8}P!Kv&m!<?Ke6)n(K5r-mhOjQ4jD(oQ8BX##>6;P)zU<`UCJ4`eW3cvc5q$LEUz@`U`<S(Y-J*Ft8 -hy;as%mZQHg98c;r1H>CC<Xh=^_=Lrc3g16SJStIaAS)<Hh2i|B0=zri2*%bT(SsU#DZ2)Zo>7oxN+; -37kb3HvhbyV*!?cTi`SCB&I<9fIFBVT*@M=4hT=8M3G>XwsifnCL-Jy3mf;y1wq7^6_eN*rZ95&bC26 -#f6(Z@<moeDh5)2EO&yTOuCHn###aecL!1BWDusJIM{#hC}ahxB43)zd`;%|4;345#G_>U;-D^H`*-m -sgNada&ko9N^M<?Z|G~l-wGe19iUyJPQWLq1N6!E@(}Du7j=aCz<5sd;tMVGn=W^WyA6MPUbW|8d)@| -apbI>Nw($7lk8|p?#5isL05=5?2mK8CB0S(9%!vTN9dy0;;)_^gT<PfO_*Zea;jhU5RNiwzgVHZHMhD -6peGrY^Vx9n=!dTnLn!dmvb)(1-(CdKj!AmG}w4vv)ng6esdp-Q^`5%2m!!foYEikdhK6dO_{_L~Q3j -Ve)cLfj*yaZmyJH`OuuINWdu3hnO;4bjDpa0U>vj}{NF$i=h>;33I(AQx+vZn)OyJgE3zHHet!Ouz?2 -7qp5Z60zH-oZ19{($<-SDc)j{vF(H_}h<*_A-pUY;&hN0jylPQp5*c2oKtTFL(=mCumV{C;9Z{zsc{n -;167=eF^@j@q4Z^|GE<`%9^L5zeC-?4fUYt<WOhmi=az@4hpmYcgo}M^fPzF-+ui^nM>WNP9Wby{=qx -+ascoa%sqSdh<+Dkfc6T02mWXW#E)zKLEHuY_UoV2PuSLfKm*23$S>&szy}zQFm|GhG3P|tqaKv?UDN -~K(dVPDML$M!3Zd5^n*V9s1^(dOJMsDL_}#uQg1@qEfpP|o;C14on<OJxsje`tcKC;J$AjZY?)@JI<b -iz;|H#ojyo3gq9n+@OGFN^xa@w@hj746QOtSsMrju+s$R_)TOos;P+vQs#n-%{A{>8G%CDTDRon+HhH -r-{ji)=>9X0dE?$#j5O|GOPE`x_7T_qfX7!tNj|V!e-GKf#p-^F_Qvqtb9a@OBUK@+8?;Lt}otUaucY -@_r2U`PhbyZD)|V+cG;oMcQB2a9((p^TEd?9UInyp;PeP#rfESoFDs5;BqG%Kx-!#7ndNK+fAi5U4#C -NWX|8IzpbKv={)sICrCbjiDcW!Bm?6c1|NcMByU`pcuvxjVJ#GTKCQf#`}rl#5B<t{<ZhAwFL%hlGxg -!CDbE^veY&#OL|H$VW&WE4m#EJ@O8w^hNEkX(=o_Kuf_?>S;#iCQ;xgxlf4eJPZx{5_bLPxRf9k2HQh -)<wC(Iu(KB8a8ScJYBvMl5j_`!~6jI~Z*2ptdfomkU`eg|vv(6Rkl{+I*M95k2a3zL=kJ?6Q{7jiVpM -49tIZnA%%FB|=%r0;{SY}3WYmM-c&7aH(`$lreNL&H4}C=-ldKYxFMzhX`i>zIq=HNf#dbDs8-q&H1I -E9rfe{R8&=2>lTBjA3McQJ*KfU`(O;YdXofDfas?Q2&sDfeXf;50>VLH889PV@+PkAMo%`lHL>gHo=d -_C0!eIJm5#@sG#eFo^aGBBI-URe~jZa-_M;jYu03YeYYad!h~%7W>K_QOT>CE))DRVhwc^n<J1QHsFQ -Ux(Dgyb1b+11CiM?W{*Zs{b)^mU@4yAm23bF`x=>n=y?o&(KKs}DIDj8h8t`MJtTXkK`LThXPUKJXr1 -Ygrm!{a`fxN-zF!4a&hBZ~_7qBM0<=Ol{)fxWu2j>RDCH#n_YeSoWzSBN`$Q3hY%*ZV+E}m?!dj$?yH -$hq8!TLIMO>fBhKIoaS9twVhjtROAv#ej5IYEMF=41&R1V0|G(|tG0zo9O;p$-`JU-@{X(04&sgf&g9 -jVt_!b#drdpqmgnE;;{M83RRLgY5V*{6PKshfG#hR+hee`SKLBMa=ghpM!4Tf-->l+3GBzH-x?l>#DE -IYuhi%`USKJ=trO{EYZi<$^egj9}V5DJ^!O^J^JXQxzztpR`dgy7hrCOGC|*ivbb#hihulMlF$=ieR_ -kuzP`q;O+e3Nk@aN7G7fkIKT^J92~J(D-~N^P8QLLaetSKOz3vX>^k+JwqdVUcIu_{a<`ND?vaZqYxu -yR@{uYZR{e>4^NP%t$@;LBN=GDr+LEwS1Kz{^3Jka01`Dk66XpA52c&*X?A2RmLnKN@AfBf+rl*1EGJ -R$l$^t%}Q(Eo!MP#)k#<ZZ8W`sM8B{O7aBs7*BB$LuJZuIx_vV@$z12i9~^#+YAGTePjEH`IkGb%VP2 -Xh{;kc<yt4;k#pX{AjG>$LEViA^S$he@fp`$v-6}<xFH`q*!-_ZaOO~i!WHPK+NxelhPL`eI@D#Wpl} -Tf*)Kpg}-Nx5_<s@etc=hK>qgA`MmnvDb8;r|3pMY_~~@I8K9%6s3>pz`0;x+8V#Q^Wr|n_UbJYDSi4 -Z>J}7gTD1T*dBg&)Un2ZN$Qn=5Ex9%wa_3hht1hsoH55!mxy$p0qBxmt4W5x)&Z@1Rmux^xbT-jSm$z -$L1oj>rW@<-kzfBXbpBG!%L;^M^mD{z=Pb*d<L^aqNLMBxEt4O!s_8YgPAv$H1>FBg!Egb%wh=l`=gR -Tq>MmHpyLlP2wfjt6V>BSwtis0--VXk51G3sCL~A1Zr96qClPKd3w(qqJV6`T5UG`eftJo-WE7Khl6~ -hw{c+E_e`Y>CkJSec0;}PzUH25D&PZEYNSG&jg-3cI<e9-JOm?wEu+*7pAXTwJJrKbEBSt!^DXbxwp4 -BA2MW!z)e~AQ}ja!2fk7I3+zjL`|Y=JBxc*Y$Xn!(JkkG{&F0BS4{P!m^U>!(w=izpIH6-kyFgexC<A -4U7xFT6Dv;ZWhUI@DZ(IHi*Rbr@BrqNs3<l9RV6UpOu88_VS%Yr$$w!YKefcluE%HY`)YpjqzcD-%8F -=HyjeNz56=JOzeIwSK6rJMV%v<D-e3bDQyaaj`860g-(Mtjc@ECL)Sby5Ob*r*Z@bBhrqyKK!K+(^j? -?XLr*suZo_cN768I#se{_cZsO+5Z4pnd&W|90D_wo6ImX@`2>-U9yYn_c^FcWv>Q1P#w$`3v9es&9)Y -jfY)s=STb){o;!+ZhGmZm#$DB^~>6|Yyb7~%P-gKch;|8e}U4-d+oK?ggb?CUcGvC+{%?Jx4-em8=^j -yF%0!gZTgsfeCX3ED=V?idY#fZP5gHm?GSTg@avm22T49D?SqOW`TF^@BB`xPe1rv0Lxxl28Kq63FH5 -VE=1h=JKO?cme{Vhcm|+Y?UTAB|oXB1lO#fM$18@E9mSOmJf-UHq(2jts@_onQ57+P|d6H~6L7qEd{) -qW2<_egrXlSmql<<PC6?1an4*o~JuNK7#8Rrts!JfY?rGdFP=3bclVcv&%XE4n>A;UnX0^aDi@L&!Dd -GVd6r;0S}pX%$<nhw?xFlR&gp`I`XDSJ>qm=`PLEy#P2^&o3P*2R2d{qi!A2Id@t2@llYs8OSYo*R7_ -%Hj0xReVcHxR_5uc8A=Kc?0H7v-E>R9?9QwzK+V}`RAV(@*wtzK(B_n1iv(t#Sd3*5OV*l2{xG<#BN6 -U(YPS`E$HO1e?S>a@oX%L;6I%{D#{acsM0KvzwJgF@E-bl@G0tY*sx)uOwmuHF2C9N5`TNnAhG{*#q< -aH$M3&__?wmZ+qZ8QvYN6V2mLl=F4PD5Q+r%s$5?L9{|K+tzp^I@X<?j1{uqxiPe9t}muc)TwvUf~8h -9felm&D}pb29(){_ty^K6XWyLa!d7Z*>F>-s1U0_G$Gy8|d;TxD>Fy90A&YPE+r?FlEYIp9QB@rLu(9 -2w4O#mNCUZOw_{R9C#=tTkt*(MY`$PFi!3L#o9&Yfa>kYH`Y%D+^06DA4DO&z_;4o|Bzh5Z=vX$PF!+ -FiD@2UeGruYl0!KATQI{cS2rHXnH|Tze1mG>YVi4tW14@F-31E$jZwN@8;7_(=DP!GqpO*XfPFsyH)N -oH9sjH#VpWIFd4FpGvs%2G3ck7C>MQ3k|C=wD_cKNUtsgJ_l^}8*AXHK`a*rSIvc;?-O>x<atrgO=nd -V}rmUz5xL_i@TV{H8fxcTrSpVBZuFJgt?Q;+7Uk}%?{x+iNJ*>Y{o)Jk=Nl`H|aYF`;94TA=`~J_pV- -UuNC(Sfbn$em^HRYO3n(dlnn%8`q`F8hB^d0Y;>-)IxQ@*eH?)Ck~_jg}Uzs`P<e#8By`YrNX;rF`VU -cbYBKluIZch%3y{~rH#{`dO_`G@&G=D))KL;rgNyaFB!m>EzSurOd%z_x&+0nGyY1x5s#1GfY^1hor# -E$GvrpMw4fnid=oq76w5c`M|bkaHoILVQDmLx+W?hvtSp8oD5KN$ASZ^`Y;DejR!t^hW4C+D_U5T9bC -Jwp_bWds;gyqIcx-$kmY_MIMNR7=eYIR85|ysn0B*&c1Gbzx(C*|I7bH|MmXw`tSDt*#DIOIsXg(fdS -fp*nr}IxdE1dB>_zW-2(3k^bEW&&@0e8&^It7P!~8Ta7f^Yz;S{4z?{GtfpY>M4=fLSHgIL&>w#MXKM -Xt&cqH)4z^?-@1^yA(G-yw7O>n!Az>uXO9})#sAzecIhmH!J96BwuD0C5Fzc%#uP*?4b+F!LdwP9h=V -M$>rVNZs=74})!_hDVbBf|d`o*iL~SQzn2#Lb8vkv@^ocwmEOm?lRvL$gEkk>-#_<<ruqozHzfI-kux -+k6iDob);E^P5ktkArV#-(J4qzJsZza(qp`rM?#5<-T9|e(USv=jPYbudm-ozd!t1_;>No^e^(C@4wp -rb^ne2JNz&Cvw*e%0|O=mycO_ufOBB0z;=OAffI?^X9G_Keiv917#S27WDHtJwRAA(W{^j4L~wfW#NZ -{t%Yt7H{yO-F;NOD1L;OQ@A)`Vb4Katj7P6J7|2SlA=)TaSp;tm<wF|XRYFB9A((ciIu05f>p>+=H9O -e@i6s8MH4x1LXHLQ8KH_`oc1QW_C+^68CX{~ui^Md9b;=ob9b9@*1t@YFTXZ!ye@JisuKs{ko9aIzaY -4Df9(?T|f{21aMny+mV<{9=?*v#-{;T7TPi2f1rNH2+rJBibLM)+3w_3<C+Kf`}q;O5}>g0}@%27eU1 -Klsz&Bf(8VT8H=%*A<7n5)u$<2%Q=FROmM1v3A<uv^ClX!$(uSED!%W+#3E{xKl*Sh=Y;eM*bN2bL4N -4HIYmlgn&UhLo-=3PxGec4^0!Fwmuzvv{XasK9hWmK9Bm$^I7Qgw9oTCYkW5NZ1LIdvzzMen9p}UKl@ -zrx#82r*WY)v?=s(&z90J@_C4l%-q+dh0lziWqK^1A^>5`r+W!&%LTX87|1$r@{?Aa0LfyUXzm;llpa -19nU-^GSylnOVh3fK}|4siE0o?=c5AX>H42TGbrgoPUkQ$H~FePAWz@q`n0#*jR8*n1v2DQL@iO+iym -yZdY5SSb28T?$ZQ^>s`0U?7zMu%jFtPeR5vMOv>SZ!GM@aXWw@Qm=X@b%%NB4&W*e8wusuxftRa7||) -AD<wf^**hL1E2PN%lBR16TYqd+WB=ND*F5R`-S+$`AzpL@|)-Pso!UQZbXr%e`kL$(L+4vzsmm=|Ney -Okbn^Z;{rYn_$=ULz)t}!s2#SWK4M<r!oYt8#sp0aG6YQznjcgi^g__fLF<FI1brB^C+I-Xv7m3M=eR -)J;27K@cyRFe;F-Zip{1dg&@-VwhF%JNfcl6D+MQZ`SZSCk{DttV;d<a-BI!jVHSSbPDL&6qtt3;6dB -eAt-%#q&Uh&)LH^skYK%anN0b2qN23!ts3vmj4O8ceODa<R(H3FBzuc!D0nrWKHG{qXT=5dWh^MvM0% -{k2tO-G+ppJJb;)Cw2-I{E4RQvLS&ANRi}pbOPXP=GEVKA<R|Ea1t2^_2GhfS&`r0!IaAQ(L<hI3Q?a -(BYui;Gw}8!G+YqmIkj1ewR4(=in>BwZSeS%|hB!JIkVWwkYI8$o-*HLq7_guic{U7dAL-RM@}5_J&! -*nuRA5w+@UL8u5F?1kk!tI;*3dkE3q~-w5A90hYi$K}~}Lf>VQap|4Z#^A5Ga55jg(UGEJ$8TLyU5Az -C73pa!>2!Ad7MtF~ih=|b<k4J2Z*b(t_#Pta0$e75K$bUs{jocl19_eooS+M&wJvAAck2STLHa;DFy8 -HC@>EomE8AT<rg7|(N@y7<AO+N4XeCSg_BZ`M_8(&Y~PSm#lzxK|UwW%l!!zl#KkfC6P4iz#~%+TT7b -JBa$bKmc~89D^akRf2e2pKYDh*-p-LWc}R3#}5NNWlyRgJy`3Awz{iJ9G%xp-6=e6*_c?5U^l{4juf` -PWl_}`vcB7-22?;<#6EK*SaIj^o5!o{X^dtTC!%r<V@Zaq+Lp;Y(AQ<>6yOSHoIc(?{mNBo_R04Ki-x -1Ftd{RmU%y4vb*vmPV7$`^NZpd7q_TE9|&Uy?A^TU`+8nK(2w;~Vf2&!qQA;)zx0H;W9}JG2z_Lpm{; -jH>AUWl_ttyowY<;X%S`0@GUM^Taq~{WDLN&mEZ=n9X*pZYx_F{x+tNvWyJPq5fjyEnoY|4Ruva$f$N -hwK)Qmstr+pdV^k$C>&hn6BK`O`vwO}=92c2LL41=-g$Lox#luE0DT2xKdQ-|tAU8<;)bReXbor=?tn -fJu`5uMaoUC|BkM)&&q_lZbid_u2cs^V7NnlROLH{4CPC2iGqJ8swQxqWwNhyKVv_b<e4SAGOh#1O|M -65`KkB!%x3W}%Qq1`tOt2wQn+sv=4#qk<}GsACb&v4mwbu!2>rqlqoF(LonI^s$W{>|q}R9N-W~IK~N -1aVB(*aE=RHid7;Mr5MF&k`gpU)0CtcO3^GSN>heFSz4eRb!eLgbS&<T^At~Wl4m%@igTRj0vEZ&Wv+ -0QYh33gUgid`@TxRulQ(#i|KCG|2@@tvm@r}f&0kPU0|XQR000O8Q5kVep5nz>TetuK0Db`g8vp<RaA -|NaUv_0~WN&gWWNCABY-wUIbT%|DWq4)ey$N^}RTeN>olYm6jp_(Z0*FLt6pcu<bxdrcUC=Gn(yeg>j -S7keBMK^$Q~@eTLZxTYT-(7>XVaN+8+Ba9T|!VvCy<3T;1)n7C`&a38eEbNOX@%8-s(=+X6AeEd++<+ -_xMOv-TmHk&pr2?bI-XQxOD|*<~S}H{&bz=>Nxh#&HeX(G58xas(ujne%hvU>rDPl=T4h*Z)M*6iU;q -hxbyzJvO6Dm;6W+xuDkOp<OlNZeIU<s{f&9|KREmDi?g!Q9Y!7J{{6KV@7C9L#s9kBnb9>H-jCk(VAm -t`{XmzMzHjZC2k&{mySZx?&AYCvn8x2{<iFi`-$LKNzPD@+)_119mv}jD_HR?TqW!<VIUd)=jpj0v(m -8H31m0kArQ_gXV<0hc#&;6OS@6O2zqw8m1>#HlO#n}Kb-Ymgb!zy8Pi|tSiJOQY^G)1KCGehQ;;iWdG -PIkx+1P>aIPUEKIx_?Qb#h#7(wUPlmhN68!F$?9qeD3M<P-DcL2oXun0=>oC&ztr8LN}~75r^GF`pa$ -U(B*`HHBCZIy?m4R@2G(8ZMsCGSV@^Sh-AipM6R`_r(>J6=m>EVFIw>ehu$&r^|QuyayrUMTpGpY%aK -mPsumw%#is1=f7Z^e7~Q3<qO?t3xp=;20~Nw#Oi}0Ku;u=R|cCn(YaO()i??u#!uGQBV2vq$+@2JBwY -;q9R*^@<H%F(fDUR^2IL8QATBJ<62tbl4?^S`K&n+Z54wHD7LME4v~i;tn&GgDA<1F8SyT?@5zB-z&< -;5wlEcoOe$wU-Pddhb((WT|s*r`vwu-?9X(X|v(tMi*m&wO_w)^ymFCQ{{ijHaRB9R=0B54xI3}|0jn -|DVOZO4Y~<cguij=br@G-0}MlW?<04nn(bKZ*LomVD?W^mWgrP<1#^;C1fthwd&=lhZg(ARB`XkY<A{ -{8JINy-(Lg0(oGJNzQGmdk8`)P@v`yW*`2tE+PEMF~}Cw1ztSnbvBSM)nP+$3|MTj!z7R|g}P*bhmUM -h6`sCD(ypqs?hYL2DCkEgwlM?~o_Q1MF4KMa$3^qe=rRE0YFMbrWP^H38fz7r1ln~p2<5x_TYYgbYt= -)VeB?`jnri1U|7NW8VQ39T2V<M2K_rZlbns6{)bEc&FQ9did@9u8%2m&1&11RzKInmZhn3^<mvmvn`A -ZH~|A1rZZ*{!UYJ7}e;xL~bL}3Z74LYH<DroJx@Qi#t;QG2^IKR@80m<b;ky%O)<nMyW${#gzfP6<`y -a8(t&v3YXWUY_fR_G&@@cD@7Bi{*k2)7F}g&8wX!7aB)c8H``w_m;q8dk<|Er6X!4L?DQ^b_bwtDkHT -$(K-KoHE;y2WWaP<Ru-!202r=2jE+YrSP6_5Wz|rew6@zxe>pVgX3WRoJF$!4cHTGldR5dx_t*w(mJd -ja*b;;aB#6Bce)s!=ct0kRb`@!>sp(!xV-bBi_UG%Hr>8?BM#ErDXdz76#zZ}8kE$h(ZB|})O7n_AQP -ZTcJ*RM31*X1>H5-=oNWN&Popqv=N;4a>OdD)FtECKHM%`#BgOev$Vyt(-lMwi+=h#JKCJ3F>M9`dtG -abv2Vl*gLs#xqw7_%(m-<)4)Uf?^R`??*yy_RotlNjNOs$wnW|>}Qnf`>Cex{jz-as?8W2O?8>3No^; -wXl)UV+GZ98Zh)4bFs(Z{5IVzSIw}6cHlxy)aY&hFgRwE9CH5z`<i22UrM`>1>0p=P{z=qz&3<L~*`b -pq+GR#{;uCM<ml6r2r34Xyo?=CdfJtvl72!mTte__$*b{L#OriMo0`#bCl@zR90sJ>-ef8x(<mD{}$x -i2slV!R!ad3=fKR*2ja6RkC7gj{P|`&`GG+R$~w!8-CPVs*Nlc9mlqXEmhkm`S}MPCi>Ndt^DDO^uv& -odI=emLaw{w#In5s)zk5GS`WSzBPLeiQAfNFoTh(Qm6g39<lyyl0ztYQ<L*DQF;ma)-o4Aj0Njlqn<O ->g3r`xYxkBt>;<4qiCmop&Kx9}+{2a?3_V~&y}T#BK~Zfdry7-`~4)VFYyn_<+qMhC9pk9u*|lw^w2e -Tby4j>?>>qAZE8DoU5qMLi<AS}VTS%z)%jK8Q0u0jj{lOQEp4_6nR*cm7d7X@X&_iXP`U57`o$=NM-o -{M&5+=gpK9kHyBzVpw<*6fO@*i`}@c+~q}*!z}?32>_}2OnoSW0wP@mK$I8BoV>4GS;CE>1IUgta&Ce -OG~R%m$O>d(fjHpyV3~7inJlBsrr3ZoLrzx)GQ0O9FgC$D13Xzhno^ohr0kcL7tOay7nK*4TBY;&m7= -xYiZpg(I@Ti(fuffExV`!vR-hv=KUy={90+2a$M!Lh`Jn?oWv#WmXeK9*0b+T!gLcrdpLOseNXL0|K& -B)*`b3r+_OmL|XqKYO9MS~9kxU2c#1z^I>1<k9%chYy$O-9jlv;}@mF&P#?#7us1a*#AS)CvBAa<~>` -i!{eA<o(0Q`&Uc$$jKlxFo6k$G1dsT<qEE4+|IzVIK{PdYj)IiO2Mv6aztDc!o6<&`TYaMAx1}HLx(| -=AQ;AsZMCk4@gt!2U1?(4`*GeBHV#se=3qK{?Kehr+L7tq+4)ywy1XjLT{urT%CFhKL`9PFXu<qQ2t1 -CWj&v6;^b^G60w!{M08zF`l(5bwArHLVLu(fW892u9I6A32=);#%sAy}yv{=cStkbD_@^5HayjabT%c -{-P=xtC@ab%bg0R5RJlkj<=_?47dx|b(q0MU75VjY<YAC_QpQZkh){%=;e+}fkSRSn^iE05lnH(cnd1 -~e`j$5(9*`SRAHp&ZxiSYs-XJdvK0<?lsq!!%RN^z5$1^ZS3Zl|!rZQSU-5m_`JX#nO=B->#evR%!Aw -pL?Pp<MOF99W!9nnS3oqK#6vZ68whkQs448QM-&_hK&G5%X?q+Nh<KyBeizQHj8^F(E$v01<MsNFq(n -2H00&E4_lY>n9PBWW9ZkiNl?>a~)kLIqIKsC_r@kzt>R;d^LojHCB7P&#)i3DLd*`n{pWdq40<zh>+~ -+v>b{*QigghcFpf_hpfmx#_KqVN5!Ely`2jeuc148uubH>z0fr~bPZvWr%o9KyXHAKt6zhBwo1pZF~h -LktS%s+u=n5)#;(JdF6_xgMV1F0CQcfJlQ4Z0BPH7FYW+~0NSs0St;DBDnzggk36M+uYa$Z&I^=dK>& -sYPV6rS105NW2Fd&v^Cz`m`$jL#AsdXr<Y8F=$?{5;zTIm`OSssEc>I@)LV#pG>2*=YPJHjOZjt!xaG -cfULmRMjUrq&Hd%v(VDjn!s|3=J`fN+a;y5v!<gkkVj>Gec%=AMVFt`+Jbb8y3wz;I_i{e_db#&agp@ -#4O70Q9hE~D9&vw^^+kcpK?T(GT_-KSpvara!N}QAd>FW8?bht-X?zx_0cJ!>vr&1j;ku}M6pq_sQ(; -Ip}jocL|L!s2f$t$xPa3a&az=wUE3?J0w6t=g5MnrFGc!L_xfw}--TlSR<Y-R7&!vF)p{`!y*ljAwyA -5+1A<mRH<ve>4o{^L#%-cLc4iaMfOs1_l-?mr1}hPp`iGNCT$?D7-^6%?u)R77yRg3Ea_EkQcBggW1$ -_N)pj7_)0e$L;p46eJb1ZU~kpif0Pa`m>&}<f8Uy;j0+tHzzhz;svTN-Iw0l=)x!fXlVCgRgu<)3{$9 -pZ=vaZIFXBglSK=2H$9f><}s7n<DVQ_56MU40SdU<(bNI&b<-Hz(vLx-z4Fa##%ck&jv*AiV)3ct47v -X^#2W-tYh{VtXLiEuXKdgA)`_9vny8MF@~M=YGfSGl5Wl<e(%Zs7r%@A5~g)U(e5eSL=ccM5RxcY<|- -0+=lW*?uAT{fs8K>$QWDrv=1a%{;gd-Q*tvYL!wD39&)`yOA%I~a>E1Noh1f$@-?N9Y~&K^0mYU|xBJ -T$TD`$;sf4dZ*3sws-osD&#Y;B(U2XjD4$xg3cA%|DSLdj&g23y!V4+nY&3;&abHsdAG^JwNd=Ijaes -h<Y-x__M7K3yziTGS<#T+kyB@c$-I<O!^AdOz~qtJ6$g9WqBLw@n~bb0cB)Y9?Ob->F{`4OrYU6F+k; -)az4O?r*yfQbXTx9c)o*L)3bRZ2{k=EADVSECDblqI*Q;zcaFly(cL>iI$~1&F9`^6Aa6#ZrjijyVUX -67n31?n2s)0MAMQ{FQMqb)(P1SwwCodO2iKuFuUA^S=i8gMiudb95YwvuOu>q$N5WLj8R3eApou<@!U -j^4JdPBZmV-h5gY_b|bRPLS(rOu>xmD9xWmrNcWRQ5VG^J?U%C?803UcZ35EFb79wBL2=U$tOx9$C~a -<3uR|G@ZEb%#hMz4U8BvsTBc&8Y0&<g|%!b{LZgf<R1Fivf%K%D)jUw>;svBX*(4UQ?1jZm*{UJAuL( -IDoR|C=@6y3U^`uP5ys~)i>`uaQg1ni9NV#GSJzx%_p9kbLsK@eHdJtf!82Y<^kp5(&I*o<AM#QLPMV -p%&~^}QB<*is35h4SqvaqhNKpLs|tkh3R%oN3wcQHykq08eGP4l;F5DqJd$#af1AEp{OEu(2A{7AdXI -oY~MV6jn)t)$98Ex)Zn=WwQ<o_CoAQ$z>=62gpV$QBgr@i|Pangw2b539vO^4vYmxUJAniECq^->lio -Ba)70k(!@GcDf26Ll)GAGWCXl*DAGZw(gs^ZEf76^Wg9S+qIMpYVg11Rx>3j~@Q{dZ=RZM#1t4bOS3& -~6GQzLiFeVb;q|Yp886+Pz=3MnYJ~76gL2N#5g|^gBE``7&R?c76xg=RBvjU4Dkc}V#o7CUCah$=1Mc -c@Yxjl`jzLeARE3KqCItspt3qbwdXpozJ$e(NLZZu010r7m$o5YsZfPn7ySglns0c5gGORp+Smy`5$B -J5=@bH!nR^9Zso+78{S*|zAgx^_^!m(g1R^|~8Pe9c=N>!F<LJQRHa0{M^F0_0$T{A_;2>WlPQ1ZD52 -sU*28F!xZY(Cx86Ym4KfNK)Ib<~UcgJO<k*TSRkfyb~?76OoF;J(F`$xvNb^<;@pRPJQ}nN>OURfb~n -c1)!?g-IH^zQU+!Q8I;5%GkL@Td)DrAP29E6I&C>wf_n3N!k)`HW2w!<r6vK#3hS+u5_?MOjs3)i^u` -+Jtp+S0ySgeXF=5wa(FxOrtCz)au>;<vLeJRhUIkH%Z#B3dgJ+u;XUHiBB;*Pt1{)LE{;DF|)ESA&vE -KWX&L5nILXby^ndCI}HJ}~jIFN3rK4}EXp||CFYj!@AE-2p}^Mr28)rJe*O(tmwJgw3ofv^8Ay&|<`v -I9Ydh3+lDLM@a!`>vvk8RV07VXtnmYV%M_DWT@V;MWG|DB}PTNC$Sf_XMcCn3;e|K_=_{_~1?{T{&u! -EXvU&`D@h%BG3vCX(C_Xy8Ipi)q!6tP&jL1fI7Kt)}pdSH`dD#^~(N+T0p?fXwk0e7IGEoO0|o!vl~c -E-F!70?!yx(|9$i-#F~dJP>nWNBvZ%XUX!j~_A}DZvT>YJmdml3DmZD}18@Ke4;b(e_1%m_Kdy#PAmi -sjKipD^a%V25b*ZDf4UD*4k7L9u5T$)F03(ccu!(}Yz^$n8u%vI-b&yJSYK3B%rD!`<I(2uz%N(gL#A -6}(yHy#e{U{Q1<qqdgr4F~(K?~A~{)`7+{L@WPrCZIRsup>)QoI7Vh$P@Yy};Y7I-Al`TU-J-7tl=|= -Zj~(+sHZ`v*Kxs`gS5~H&m#ugZ5Xbj|`^pOkXtu6N+r8Aj()pdGMEjH&I{r&~Gc$roJ-S$V;X8EXb=q -<u;;F;in$q4F$ZqD2oaisW4-EdE`qh3$j5n30W3q;|5|cg%`=X4xZ}XE`%wnUtmAR0*j%5`g?e2IV7e -m2GL5kLiBG?23CIu&lPNfMch;k-KhGW$h4r*1$|W3#_1NT57ts4HOrKVO1HUnR3UaS6U7LRqm)Vv(|{ -2`eVeMi&2dcbg*Hn#Nf28+jzTJ!gJdUSQUO&T;nz4IN^fMadVnYJ<2LWXoeQdSwyA%Cy0p<Esd3N_ge -;4&&9D(v8h~_IEEq*Bx6|HOwxnaI#<7CsZ-=^DEH6W3S~AzrVtEd}s5nS0OOCL90yAuR$oQVG+ZU`v0 -m}yE*bLkx;)bT%Z(2zq@Q+nEvjPN^;sfb)mtpxX7BQjfLsZ&AQzB{A?Pp<`>b2Nez-xMDbDPx{nw#qj -Rp#OO%|QO#9Uu=`1LP7SB>Tuig@OE@0NL#)2SgHmwVV$gf=Ya4zY%?*sjY#~WMDIzU03i*H8Ra+fd7n -^Ofos<cXjd0UWKe=@-h5Yo~0X7GRN2a0l!=(X&5onQy?Gt+-Gjl+i~v*LE58I^%AbE^8QYFoTwD<8;K -IyIWXd{;Y;n9!c<E240xM#dox6nsmTJ>o71|ssLQPQ2~$gMO!k)rC`iX)#5kY%OFvnM2PaHFSO9QR70 -3=Ot<q$}k*vgxv`9w<R1~J23lJgCdC2QL6v%IRHBWLmw-x0q0Kw~eD-mF94Hc=x1g`~|I<S8cn=7X>S -KAA$pt*tgTWmlVQ^>rQOwH^eQG}aFzHwbqIbGD7#K?EaqInmY3<5}3MG=Eq<t5(WA<5!#<x7{~himRJ -X`JHX<Y9=5i^A8K-Z2T#chLio4VYU5y*=LbiVx}-BScR+ZUey1g?Ht^V~#rp=qKjkz9BjC2F`r}x%`0 -~5V)P)J`(kYA7#3z9U!rRFykd(c*!^Ao}w$|bZ9XNzFbl_ztYTLuf*<@3Y1udG)9RnlycPZDG4H6Z=u -Sn$v_&{n9Q)0vINp6WOQlPHEAZ~9h0y=fwV(q<tUXjK`gMmH9s>=qSAZg(ubt`g#0ah%~otGnjuZm+o -Y?MXs&d=5>1zeDZR<^V_ql|e1$_<r(M}%i~bXf*Z+_jMeK8Tw*b407^ZA-N0-xF9ok}uPLdZW`}>rA$ -CNEeeEs*S+I*-;z6&Z5GIXs>iB6NQSE7TYiO}SQ*mjQ6o5BZ&1CI2xa1F5beg&-z(uzPrlk>f#m9Os} -q~&91Bn^E(NE>P7%!Hi0#`E?2Gb=3u`9e#Eh)f*5G4^0GRO>}S^ApsRB=<ua*1)O{K<KP9Q{4Yleein -9aRr~CVpmhjz|7@}tC$ZiWGRUX>{YY^3p>qG|9BnUU2rzjp&Msu*Fl#1X%?%IrLsSZ4YFiw`H<x<nkC -i9QgR*ZMmlS35M;BR&=pUSlMf!G=YxI}XEy?y11l8|TJS(iZSu1UwnG-(a<>H*G?2rPoE!3<?Fq>sIm -yt_I(XUOZyXc$fE}8TEXg7&ik$|(4gFhzb7y#}Np;y_pK<DVnCmKTya1$!@ImZ<Sr3riKMX^?&%`cHD -i?t(?RMuX^7I~eE>{IJ<_}LfuEcB$ZQ<)}YUU6oHor~BZodT!k|95$Ec3mt`^m^D!%#z&{1et8Ws0O7 -lKuoqnngrx(_5ks!5~+a;<9*g5LVJk&qytUu&PjI4EdkwsG+HUjz>!V$9L!ioFkGfEf-tM>{W+qw5^> -G_9>2|oaTTEHnG$gmeuY0+qg@Qtivqi?4!s=fqX2DtS+OYLZJotD;qu8WQ^9-vvszE*yxdT(*Uv8*q1 -|Dx4?33>gPMBqa+)C!(qeox9WpkR6TBa<0p<CPz5`aQ9BJRG_YvBIxsI!2pk@^&F2skB#<}ip28NF<u -bB0UkrO~VmM%9$91@Q>-HcW$v;t&!rdK68VZ(b=D(O0_6p-552&LXYn_FxLIHl2;^{vG#$k;C6!<_+h -s}H=>`U6&A_-ctzo8(jIUahI&MXbV5a$EJNMguarQ7$ug&Q!5>Gn_G;^+WG-QMsPogG_Hmot^4Ixt8Z -)HmE%Ll_4yIyb7n?1#w;KkGo~09l58sImY_@{Bu}{$Ly<pY=JgTMJ>)q&|y^OZzAPHsTONfDsb)u~Xk --`oB|U6_5_1fFSj$CV=;LAF{MR0)O-tN)#LX$X)?!y9vQ{t{+(%e`p%)e(fiVTXdd9SbVdXX~ylkan4 -aF(gSX<vkgFx=gsQEekF%LoVE2Z5_lik>Iu88u5>A1Z}6GhmDu=-AH%{SC6>J~r7jD(kLrjA3f55}su -zTyYZ{uwKMTYYNjCVt+a}U!mD7MB`|d|Z02^%VJRH+q1JYaK=|gC`p|{?y<_yU5Vj@o{SM75lp4rKd4 -0V$I;Sw86m<zfjgpv{p{4<^BR3GesISn`)0(gcD0P!PVq1L`kxhqUFN<$IKW+TrEkk0i$KAW#4l4p5x -m}WKdtmx0o>Zh~|#t0y;N0lQzil!z9y1njA%0}+CP&K-Afo}gh#7s=791hdI0b;4~jIat#m+-J)(VGJ -;2?ok*J{0VZAe9-3C-;*&#h$~WtEG}x7X#kKPY1M_BL7w|t0Ab1yeEd*bG>t6F0^+Wv==V10$%C%-@n -0NJzgo^nSrd@FccdjDRfzEK$7!riy7<GUc*2N3!EU&#pez7w+r6F!R};rLRDdV>RXgX!g??wlgS1^+! -N1hV9r;fB)37g-}5?MBUGe`UV|cr@qOhW{AT&pv?4}%NryTph3#VJAPqygbSewqXT1AFW<Y^0Mz@N1Z -s%HGIldpD^sH{XNa&GO685dhD!O)696H&ah-F8e7%c#`<N%C7=*_^{NYb~)OGZxs&w#SP4>zBMTBPk# -E<kHFe5=h9DMxI@!M}zP7x?Kp-Z^hlIpGHYoBAjK2b#JS!e3qi;qP&5;gL-U(s1!wcxi)9Hvpyh4r~t -1in4CPx^H2P@kj;Qgm6icZodlR<EKdj#!B~J#QWS6WDDRY$qo<cWg_RxKoeFd#dn!O7~*S8&{T`%Ix~ -}uJhfvd!zVC8!OtkhWPOy4Lf;=>W5-}re8a8yMV9(Un!4yUb~wqzxNhvlI6qM_3^eQqE4AhlU40evRS -Q5uEJ~G=w0#(Hhe&wcUP#M#sOqn9y`}1(Ld_mp^EoU9!WYr-APD<iKgkxqOO-zIlb>+dz?;x_L848gF -WO(x?&WnlC6B>NT}jy?`>QPKFBtU_M6K`!_eea0PHhITsKGt*c`cUWBnA|g@L&dRt6S8jV`z%CMYmVH -ifBn@^m9b+0UQw}+0k+;N5eNvn<-k_hlV@OHq=>0r_!X2RHlL`(iko3OPqhf+Ij_O5Ud0@vdqo~s&c? -e)WNKrKWw?-eMbM=f%XrgM{YJHHniff6UjSBLLhrJSmU^CJ4yBcx>`bYV3rDvi<`E%vCUrfIh4b?*#R -tH^F8!1e4SYxeI1G$fHJZXk<GZ&ET#B7r~(pZKti>C4Eg_>I=a7)&jS1sJ{n@iEx@wk11dhEy~n))rY -YuwLrj=9ekf+7Mrh@s%d^eMKz$B!_bWK+#g6^Z&V^9JIZy+$Q5zSai^AT&JJPYKc`*PFX3%g&B2;1%7 -fiv39e&!0PXTJeD$31={oap667l7)6Sv01eAvIgRQF6heZ8$cP%jj(eIFT$&tMqpB{Zun_|amI#*AVy -!vV*JU^8{LJY)|yQF=xNqm!%s4OV+{<cxulEXs#bhDp|)FSF$a-2|RBrc2k8FX*}X@(iKYT3+Oovh_x -K2HTWWedK2VX~kaToZRl(_Z`k8)Duo&s`~=U+o8DyX`t=s_OEE=k5N=WM(T}k7$b$q!WgN!z(`dVA~T -iX{bB#45LNr8QXG+TSnvl1kC94oauhH`9<mCNL!Ad}j_J_uI!+myag@(Zvn0;JDQ(Y+CF7bO{xaKxY- -kGCj{2}V!+g#-T0Vg{TkOb9*lw+0lZ?X}36<0%{~x}u73Sj{GfoAdcsp*RRy<>vn?yJJk5GkV;ZT9OD -U|g%hFtBHURYddqH=AIUfwcE=h8i)3Nw67;L@8XU4o%0p4y7Zs8_-QN@J-QzP5)|gVt2*fSy4D$Yhe^ -F23e6de(``CtP3W;Q}bjTg_Q<QsyKF%zKM+d4H~J10Vh!9YOH~C`@~gxO7(%gU1|V{~-+(VzsoHP^$U -!ko{|naYZTxF<inrTy@uksuMb0kUpTpsi$_fjoAN$wJ0rC*QbkXwG=Y)cWKDt_62u7y4a^obm-C?eDz -6p3f*4LB;ATHt31d@G99oVzC>4$S1kJhi0nKlN`)$rC6&FS@We%&d#F@2Ulaj}%>i6KCoK1(DX*>8Yt -`*%zr<v{dyyaaX6h|IeI43QxsEQb@sfQ$@{LG}b7=o2x^y&3nds`1(yRO~YgIHziKNG&H+x*x>Yk1|w -2B<jrbK=LlFoa8p&9!k_C%%2CV)^BDWB8*BJHz_{}9%}MJ^?lB&TAPZY^DjnPm%pTLG0^HbX#^Uu4~E -MCsY%%G9!GcCjVd)km51rcyy)D^?#xIfs8tL`EsgZAE-u_9BvPTvIEk^6WO?4(GzUdV~rni8Gheot4q -8q4*GxN+&QnhXrLL8v3f-*Ku29d0bGJ9H^n22(6IfM#$<3|4jvS_qcWmL=*Ta2L;zbxplzF23d@vNWU -fae{SEYquBt7V&n9z5rrHz`<Fx)E-bQ4g=QCw#!d2r7og?vKUfDwI+4heqtJ<Cg6o*v@LxJ{=00>&b} -q^Q@FjL&?UaPc&;&FzfL^TQXfHPF_6f8Xe>ZyZCWpQF33~Cf;QCqq<iCO96y1g%zTTwX0bKuz@EvA6& -vuR63nKrLyT!7ffCj9x#uXbSBFXHchcPyF^*&uktV_{bfJix%qeB*70+}DPQUyX6Qy@J0JY}mEvdF{g -3p=RJ;T|j1IsC-wP1^67zMvDg>XuW~1*h2R3%Lla?GE$AB>CzdAs6vc`V}e4e+b0qN5`vk?AYRsHV?J -6eHXTLSBuP($+<NR5AjOp@zCU4EmfJCo2P6BP*1g?4udo^6Q)qci9B;Z?GCn~@(P)EbU#t=p{%fE!9% -b-JeLHn2G3bHsL>(xKx+8)9M{t^qM@It_m88Wrc>y9NYvR4Q*fP0{VEC7OFIQ+i_T`@jvQ1mp;3yz>^ -lJN1Q5-yRVH?F(wu9_kk0N&FcY^!t4DXzqbLiH=_Iq0PLWekj+^AO)L)@s>S~e3=*`f)LmS}@9+HPbm -L!<PVJuPLJ*d?J&eOgj1?w2{EmZ6H3R0V*^HJACC&`88Do`u$>0@(MLaovf&1M-IG+ga8b2OdF{U?u` -8t;V1zW*JX6FYbM$T4N9)g+%MmNhe4)GUTGt3c@f_BiepnXO_7SnALJP6^t1ItcJBHsz>eaT}8>`wh^ -b6K(^?#j+;k7Zt}^ltOo&?p$__gKkA5FM@uM9+BjW!9&sr<q@k1ClUxw)8E<l^uw1({!qWwWE1tx@@G -&;{}$7xQZ-wK;xfr8y8TJaPxEY%zdQY5t60_s<EqEP<~CRlt)f2mrN7}`cOs0YQ?x7F{t1)4izjr$Th -38u1Je|~Zlrqb=QzJH=`fP1qoNsjn(=o+#Xe;*fDPo^X6>O>=sKn<M-r5bSHJmwfOKBE3Vol{a*i5OY -+yy@@y3o&_BUqih*+(Cq3h}k{bjqgEMI8GaZXE7+rOZwmsRsE7W(2@U}TijP0Gv@^an6FU<2OXjgZ(0 -v}G43XRE*TQ32B$7PHlLKVh#kcl9qwfYtnGPk|NnsbT&!CC;4z(&<MX){n6Lc6h>*$D#R9uNa!yuFg) -TN(kAm?l^?wVD_)@iEDU400btB80?mI`$<6b6R&#}8fE!iy9H{p%1?<vmF+EFbrL;_lRM$BJ>=~W^v{ -uV?UtOuhDGP<fsRF1k$Br{b2S@!893Y2XH3kbCYiKogNkN$Osbu6p3eWRDLlCkwUs4o!>mkfm~lUnGw -c<RC+b5R81yR%1l#x;)IbODh#slbFf{TBZl@C*-AffOkfn`&Y~yPhaEEraF9@ig9Yj9(8WXTIVc=>>E -@j~S>`ZGMQ{TZ(L^XJ|Xj&EPljo^_hf+%6Xg-LHoVo%+p<L}z^>+v9DYj=SDp@yqNS;wy(`hP0exlhk -O6Rb~;b`b3=c?DRdS$0N5xzX3Jne#D!$aemQ)#Y|>Ujro&d~Nt%TR|MOibX*8lAv1SbP*9DL}nrTp2l -zX&}{q^d<C;49)=KIRNANc_A^bk68~OR)@n<AX9V2vaasPGFX9s*RW|k)}~tsu-VA_c1PS&mby$!^zm -D#-W@SX!$OZ(yCXKfCPXRKWSg?PPYjtuQ*&WIf;6S`2c<O$cBFry9iTixUGo|CtD!)2bx4EMcUWi^gy -alhi-I@N6^VAS>R9-OjfZk$HDNp=&Bt9Ye=eZiBoj13COh=j&}3`y(4)gVWE~WLc?ufOXg4cudC-IC) -qvn=Wj99Y>yyr*epx_y?T_`r*mfIyZ5!~lnT=X1%<W5G!#D+No|NO<MmAIXo{y&?b&BbH%@5RhY^rU! -$5Bvg(uRIa2^X4CK~}O(&8JPfj`P8FkdyxqwJyvWWM2Pvf6|`YEZ||oHhHO<eLgO^$sjMSXrQZaut;j -_=+{)M=(2|n0L2?hs#+l`XqmbXKxtKz@5FR7Y>HRzMHS6tt2BZdBGuAtSq{vWre>AWx~-VhO>0P!hbS -~pQuE|ola|Wcl78Zsng-ftpZafrei!6#C1$O-k^gX;Z<WdT=i}en3eoP0bHtwQ%I;Jt#h)J$LpIUe8X -&DcrSocEB$^@@u|O&W%u;rFdHISJVhHWjt!R7vGny)<*Jc}5wB1eoC^v_h;J>fB7u|9z3ow7^2A~@^* -r1#n-W~AQ3FYCX!e1Bs#pDj{DMP=^H)X>glz;~-0v{dtpoQSA;-d>6F}b~~D$~J5r=4zZ|DS1b2ck<5 -*Zp;BVkz(3PnUA^6-v$wa{SFn6xUaM3|hW=L0XHq0|~U2Iys!|06H8e+eoE>)FjCA3?R!sB+G*tS;i- -7Q9|B!ZHPgk(f<r7^tqUbd6Nf_@2`wRB;P!c@A65Z8RdQd1N}aU=ZHIJc%6q%q2Py4rQqK%3Vt9?!8g -Y#_&S4vm#Am$Pf+k(WpN6=XdnfjpCG!wHYoUf^{agb1%C{IzIh)~@F;SaYU4gi#Gfo1NW>QnB;x(`p; ->&nCp7PlzJXM{iq$P&rY_jWsQ86I#V>%26Brr4W8VNW{_A~-x!<)nLB>mvCY;6(<P?91Ugipt*<Z_Fp -qA)h)NBj6uPS^E6318Fd=QnMuO<Pb)|wX*a-#@srPTzVjO?bW9VO7ARFMcUS0+4p7?Xx)UQ-+*x!DHX -d@PmYLQ|}9JuxMDe}#|kDY?t!JFviyR<_Ac#K2w}=#wU3pu>tZVT%~P{L)@LDee#>M=ffj6&vUfl<!6 -b=I$)@o6r76OZA6GUey5%_VUSA$FhmbWD8&aU~X3RQfk~MkAT*!k{x>0Gld#LQj2ol6A58IdHs4T|Dg -%J-9o%J1Z5AU)21}o(x&7p_gFatx+nQ+gr+%cc)m3K#sS9lbOD!&Wf6gNw0JvF{146CgA+JR{bY}>JM -~bZ`t+XoMi^a}0;sA3lGeTiUoOjqG3b`^XL=&i<tH(JI4kE}UH3(Fi?VOjRPtDF-ZdZ&&h0K;?zzPJs -)?_e2YIWH;(A_?quvHJLj#xXiO*~FjuZseezaz|Dg~#K5B@5JE(d9=XZgHK3WYj6vGOJz655Xo{3n|{ -wfE1`+oT~tGc!n2Py4GT=~d;sK0o<Un`MOmyj2ri9Rfe812)rHKcG}fonl6)tG|o0xoSK8qz6Bp7C@_ -j=-fu_bMphJ+RAdjgXKD=k{UWBe`rR5J09?nFN8Yeue&`3KwE2`fzRdsf;8dER=(zO+=5^@Xm%~s4vL -o%l=Zq`-r)=1Wb%e*^>}JM1!>-zL(*OG3{XK4R3P0D+$jZW(-Y;)J4C$^io~!;kx&J4-^ByUT#02yLY -ZOxWmth;D2ipSj8BU{9QewE3WLl`=qZP8-|z&}4Amk7T{itIAVRf^(GIssbhY!p`%N;{LSOziEO_&`P -<srk!9iE?HJ9Vjebw<KzUHwcw8fFKgsQ93Q598SP1Y<`vkR<8ePwHX<eLEb-e+zGvaC`=uMsF{euRg; -s7#wUoUcJjC|tQ#%BnSsdXrCI7u`sATdykWt$vqUnd1w4O=w@7g3hPfqkf`Bakaw8V)2myO)tfv8FpU -!I%ACcS1|h&-Tw9O=~sEtlCPvYVO%rc()EFZ5~bl)OG?wFQJ&f{@tT)=OKUxsq-idn>l--(lVwY@IbF -*Kgb|GM)AhRAeJ#gfBGj4+wMsm$c+0VW1K?`Mz?l55`&E8fCM*MO)W9a)3|>iE8p47O-$TCh=I^UoGR -wpVw<gg89=@g(^{D!WZgUl|h#<DVgZ2Pav&<_;l9%Q{?<&rM40<E~p?Ol_M_kwWCQjPJf0!|e|D?u*A -v{S`>pKzaFGNDOL66E%tKQ&hggVO_MRSKX^F(mCps8BGYvoAN;_T(-I7~3sb4ihM#4Mi@dnMMC-=Pf# -`1I^BAXK(Z{oDsw<=x{a_m>Fy-)vPqWJ7>7<L2YsM!j;;y%J{Y+{cj~bmE4o+b?>YDqOtKY3%NLsLa( -wW_E(0{rsD{ey!12H~(~t*SsgRxIm1)OzpzzadApn<wDWW|A>&YC_>)dkC4>UR*3;lUW}(Zf@`g0D@X -6YrX<9?DD(XB!uHkBhln{G5HqQ~$R?*ja&q)d)aC$getjx#b}-z;!+NaAK+bC)rzkl{x4Xm4#OaTa0T -7fi{(wVuZ=8&zE;_pMqUjxy8@Asu%e@`(wh&d9d$$h=7RAffPAj-l^CK4966Iw}d1$b91x%IL(ujKj5 -J0nfp$NE@&RV|`TBj`y)iUF8=e<GsgE0sc!0TE3GGzR<(Wk}hOa@X0LWbHffrthH*DsRQ2eQk3%`m-3 -`vl(e6=~9L(e0N%hI_09=yk?7@tsJ`qn~J(78Q;o!*jo!Om=A>0Dg>xr07M*(H>J9uJ(LQ_n7vt6Gdl -!%{UNcZE3$x*ljZh-r+%Q#Rs~e3Anu-5X*WM9rwl;pbF>CP_Ft=qS`20-#K^U-uO58aup9cjC<n~6b1 -JCNe?<v_`}6Hhf%M#2Y7)!rBg|A4=hN3o>kdxlI|r<LUjzcM*fe?EZv2D&sB$f9p4|dn}N+pyNBae(4 -yU*JgZ5{_K;>D`5aPm&`Y61v#Z~Jl^AW$S6BzE7f4@t5A~lNPSc^{)&1GTuM%uof+Ncta3)Osk0=-R+ -piK_*kD#jGZW$Lfp#PPyqgb=i-7+<0?aS<%DIVEB0$NwSMR2s=rW*9M3Lt#(e-IX7ImfmLe0DvM!bQ! -X07-U<%n)+o#;ARnW>tvJY_CFp|(M%Fg!*-7CUTA4GB`FT8JkZt?C6+*e>@c975r`gcwfyH&{JyUB4* -4kP<B2lJqqd!6^?}<`0j(3(uX)Vm@W!F;32>+?kpJJi0HGd<<EOTroU3kIJzjGhO4M$qtY_wP8Mzc?? -}R&=+d56<;9OLavPJskuqnh6zsGhpYgV8-@M4{9v1ODHWM}CgswiWQTONNY<-OAX-(I<?7$Vbd)*bCV -IBG4|H(bqyE$BML|Y`$ss%3%cIQX%e{P)zCk^=2-e%xAO;0@F5Q0ySCTWyJb6O5JJ(GOE}?c08RH`=` -4NOeDbuGcvT?FSFlB33K?k8zmkG-Q9Buh?eY5&nA>F2-W%(?{b)lTiQr@{*T>&Y<?xkDNs@aT`<`gTm -yc1-H+=2e1;Wr!webm~po!JarwIOb8*lJ=9qT882B5=raK&Gtnk@f&N413XR4^h!gfI26jX$qQe&49m -YssL=Hx_G;;d-0Up`y9FwUZl?5o>&^O4outWDV+IdDFe2M70Pp{XgH2yZ+$9~fGv9W<XktfmU~~;bw2 -n{j+qZVd5qe5<N?crn*4DnU5xRUH9*FXAfu183QFfFbkqyXZ72<xYub>=YUsfTS^ff9U<wMC$`@eibF -lO<>f6_d4t-S9gHC-<MJQ>WR9Gclq`u#g=(cc%ZVRL(YEH$2=WXccFbCIai+4HD#UDKYH#a^+fo$`Kr -oZj20S={!$^<j(gw-g~`1A&Z-JD=IU;D2VcF@^5v2@{CKK_%nKmi}KR(+4UC|)xQWIgf>s6HRk3Q13; -KL<&XBgxRhEV3Tu;v1kNIta=STiJWG@!oC3Z#3S^jklCS-@!51GBl{fX7j(Vr0TQ>l5lSk_?kkhx}D6 -|d`_i4FFV^-VpI5<k@Vw6Nm62^e9ad$bgPu3#O~y4vS_G`ufZ$aqWO4X6#=HS881#jp|I47Mr`NtYoO -u!y&08f{iOxa2N!vM<JMTT8&CCMVAG-p>CFfu+cq&Q*nJ*U_c_D~J?jc!c(88x`a>B$a*p8ANek6jgF -J{WK@OW0$AXse&|16!k@t*T#;S{c%bikFe@W?lFTe7-7`<}`jZ_1qNe#`RbB#82P~Qy3S_;dri9txjP -^}j-&uoYmLLVV+5ylBsun?6^ZcGr!PeGjzos&e9Jt+vD85G!e^N*R$_;Jsp+mzV7jNMma4=@{PCH5er -%t~y&RHno#`I=PJUdCjm4^d)^_+S%MRChl1sYGur_Y|SKxe`eN!rLY0ZxFZkYIy(%1i(WZDFC!|z135 -gEv16c47q;H-vBFKj6Q<?1vbj))gR)ieL60Cfx1h9H1^Pp<Qtkjj*<c)e8Z2m9>)#Z^#Zl1!Zf!xLjy -U0T!o-iW7in~15`jOtL}Aq60lQOXi1?f;t-7Dg**r#fu6>YX%2rK+E#mls+@}Wky)7*VCbV=OeY9y83 -IqYlp5gITocoBV5;C{qj4#LGWbsRl51i#oCT}$A*-*a1BYY9TGMH*6=pAK2<i`|(hDWD3_;o3Be;$V{ -PjnHe$K}G5yF4NG_j{+MBAA402@EqqHhVdEw$i6ABF0?1|KZRp2L395S~<^#EKqGGB=}uvO)WdZVcfd -)&Lu>C%*}JfAl!<1~tAW$3#!_(yCkqd=2^?p;!Wm&E|sWQ9SFi3024LktZXT(C!r(UBjxXbrkC!J+Hc -DCYCJQqCU3^Z~O4Rjq58_Bpswjvtm)q2TM;RS^L%_OAWx|KRG6rbwlPl-TuTfR8j}3JY)+s_a=T+cQv -E2H+*_T@+sPSLykJVT_DG+_oJFjI>*^i1a-?pq1sp0<Dr+2)-%0|+Vjwk4-e`zeJM@9U|@QcYrJfwbA -iq~u&Oi0z^ntX08yw%PSG^S3_ge+!gT&F!P&A_rXtFXhiU3wXOe6f$fpwr0P$<t5St{?EP0v={DI#?- -OHic`JVjQP-*^t$dW0aMg5y$i~{-Wojf(xgKB&4bB5P5^;c_-tN13wD8^c)TzDp*ShPU>7+pFSJ46bM -Y0^DG{n0X!{N&+R4idvpH&A1_z^g(Xu5o>fs5B?3*UmOpgFJyue>J#G8b{kky`s^9FfB)0f2W6TqX5S -@v~dFI@xVac=saiimUYy)l1x=tZUkend(pYrVQEBv&1|&k*kuN2sD>g7j~81Fs;7l<mx2*_=vId2?QE -BV{qvT8K!)XcxP=9$^nwIbIGt{UffdU0bR$IjfiN--Xka$A4uSftBhO3?x{<*cc*_LfhfgYm=N#z*c+ -NwW$gzd;KPUm#{w!1#&Xdz&Ys7G-RtuEDrY(bK9(DN;mNT+6@mI24s9I#YOdjM@8j@&Sv=lN-bh3m?6 -A8cY^r&azY`*3Sd;@WvfNvnF=i?h_=qP+If@O(s*v@zq^KffLtQGhVH`47$jZDR(UjSP^`bo^ECVIm1 -jjCk=M?ELzc$SYA^+w7w(fvNh#1i_m?zlLC?9nIj4#28o7s|jeP<n}r8~2A5^m0HQr`!`&AP~-6gIjc -XvDi-I9;6wLV6QyUyW-W15Ez+6?hHt7$cG8arsSRujYl`kaAp;)#RIiKFnR$im?sJF90Loj>R7%s8lK -~&!SF2LgQ=_rYqak;t19{n`!Ge(5ecE58vT|<B}LKk2)nchA2aY#iVwe+9EgvGZR>ACMs?bj1b?-Av# -z@f<v&ON-i>tZL_K%ecINxCL4CKB9k<CgHD^oW7!o9{UjqT74)oOYYs{l~)`t14x_!_RCOIIn1ymme< -+P2sY(SU_+n+;A1mj)?;})E%*;ecExU2Muy5bp3R~%=f4GGvozBMG^T=h8^h?2*ti#8_&;NPRBvu#nO -t9URpRykKByZqz_U*tH5y_e@fl=9suaqdo(dcOyuH<t>%UJy$QOPN6XeYYpqkY`~TL&8q#R;~?I&q}n -Sp3fR)0`1GCRG=N9W*gm!Zc1cauxWrqo469-j@z3~uubTNT0A#1XiK+%c(8Cc$E`w<P0>wqn!BbBPao -xUSFb#>+da!9<*4?X4JT)``?g|PSCe!O)N|}6!}Z{qN8&ohhaSPJEnr%9LVCeXs0-MIM+CsW<ADJBE1 -+Qn$y|?T1CyFP!>k-IjG2G~x3m8D3xkP!2Xf<cV_=PP6lY}6CI*6i8xu29&1U3o*U0Kln30)iK0<yHs -Ul+R;}E6nhZ)gJeI)s3n2|y{BUeD%FGEjPU~IRi5N0F;qFU%(2-+a^w~6{egn@+7H&ciC5o&lN>%iTK -4C;>?1|0TKITqp1&VA8v31ly6G<;Z5j`i8p2i~WGY!BWN*?>p7AVTAbtzj!m??5qC7gA^6d}UE?vOJc -!^NP_;MzR;5i?2b&qw$qm%(?$!l2g?D9FE&aEwjeO?R~{?);rW1+4V3L0ONOOo-7}WuoipOBUJ2Zi<^ -``MhV@D=ji;eFDjC3Vt5%nt5za5v_U->54&0`lOf&gBW?6t@7HK7O9X2GtMTHsKd9Bp@`rp@A?!Xz%? -o^ZHw3lmJ&(5YI`u9Ky@xO5p=2u`MEjun0@}JlJE1h%{2_l*OsqbF%`V<wUGzA|HIUWFPRo3YLfLB0F -ygK*S^<giXhe|c<23pSjLu}yc)YDWTwV0!fH<^I)yk`j!UN*)hFI;_)kVJ_5Qpa++Evv>e;5#lzO&ke -)kPm9^~a$;QyW@c^ghIqmU`?2?`aItH1Z@qDW@&y?IAi6kZ=J|#Fq>)Vu->e`dJ^vlhdgvPUrKc6u*P -F<H#2E<zgyr;eDM>9cA|s2=ezKabhuEE`rS3?RW!4c!t@u++5Qj?+;Hg(L2n<vR3t(&)Ky<A<Oga%%B --MF>)_(fK@JPIk`d28-{`6@O+bWu~_zf-2Gggg+)WDSf-Myxjsj}<l@^X!I+AM%VJrxXzqZD<dsnAiu -Ft&oc0cCrN&mRr&E4D*J4@!4M$x(688<A<dt`_172eby(TH^`z^3AEv&lTTM&#Ky~F80+;8KDx@QH*V -IPSJ%H4>?-@?ijT1?E{Ynznn4<(_cv-41uYqXpVo6sTmhokwY8i4U7DzNmrm)^CNy4+j~GFS`$p%YU! -t9CkY*o05Y0IBYpZfQjDko=~*sxMDUfoGchJmyJjo}zOaiXP5x025#H9fz<6d8^8mCR?DWc9_P)>{9a -rt1mPW@2Ip2dWzw*qG2{YQstT<bz_%*RkL0m8SIvTqn&K3DjY3S@7oLnU9cO*LAtg^wQRi&+fQjuodI -3ME(hCW4beloKG-c=C+100CZ<V~0U%fKpR}rlw^BPa7)66LXgMC{(6M1bW0+b76=U=!jH58no1(Yq)M -NtN;f(CjArMC`C47p*0Xb9t+r>9@pI|OC4D~<!ilP4NS5mY5x4+;FpA{r+Up8A__!8N7dxuO{#=pKov -Qzx+CaO|E$a1n7HgtLu24%FFgGZbz{}`Pi%5e3eY6Aa_5?zNYXNYBfH2CS&D{m0PLk^3stra3_EVplE -D+q>P=np4%_17y7;Pvl0&aTgOLs!n<gv4Njv%wP@nFHUNx!;OFVkTgB{0Cb)w{Ew~NXYlFX8D?bu^qh -JQv@=$;e0+u?oNCi#Ctpo#rzI@7l>Prg6NB9!c$GoHV<C$iSc>5{X+?ff(j$K0T;O5jw8bZW=Wtm(Bf -E(Ud!lg8*tg|BNAQq8E6P!`6ep&eiqU4{5GtTG;0|&6p-SJe4xPuO!yq?w>6__06!BRdG%9tehZ&Ela -JnsyhNg04l8H-AIbs7=wq*_WWL3)pOUOgSEGBbE@kQV7Km4}@*skG$3*9TMt#0caeoY3j@KfNRpTb6+ --c)l1bQWZOEt<__|;r3!E17Jbq~Ivz(uQR0c6PV-X>1{)92J6Rl%4p-H2QU4X&bR`ip3CXf@r9LA-=v -S;VziheD$W!Iv7j0+=0E;u<u=JA*H!Zhzx9ur*~}Q;$ryZr@yyu-X^HqNyIwWYy{|iL2F}Bx^)HW@*> -$uhG04Aa<y8o7zSFwf~KA%2cZ!GHa=-^g5m>;dDPv^A5aR-ta;Fjh?XXwT4BT8g9j~VX8(sj0;T6Xtw -_zQQ|8^!)1#)<aKJcC$dlq3zf1^>@^yi!$JpGXg&*l#X^f%Xfq9wDhg1H_?SgdMkH*>{~cv}@P15)Ux -U*DZ13Su=`0au#)qC;Q1t9BJx$JmGB@L0Lj+@?V2U~q3a)@cA8m`z;=8PPd=^n6-J<>l-7Q_k4>xk0G -#qNlj$k+@4N|V=<TT7NqJLKBZ)2Xiw%6F~#swV%uEW-XjON}-&HQH}Z%C&n=Qntr&MkG!*hi$(%Piyn -wka{kmyoP0>Wn#Vo=>;3b0}3*Gts%mzJ7jUj@ijhs=DDA<yi*a{Tk;sEib;y85fL;Yc73Z*Z9BW<EUD -sOtA-e9?N6z;!UXZ4jkS7r}@UImu|0_Pc4jm&Yilwbins)%mTR!;}KKm<K7Jb@H=;kb&O6!%$N?b&S^ -B~ckS}?9-w(6heB(<o=@Rx$h)km`00-_c07960*Xdfv5T&(k{LZW%fyMIxz*WFT}1D;%B*L1TiuWgJL -peM8~tU%L|{n#WSid{5%`tvAzprEY09->KbPx;UFIBeL#E%gts)(mWOJk6)n361dIb3DabDMkif^$65 -*c8WiL}R0BK~mJ3t=RlZR&l@Sz~k{KjLGz1J}~cv_ayD+YwPm^|ULUCc{%>T*AK;&nDQNXwy$Lj;cP0 -sP5E-52^%mSR^}Iyei&=><Qmv3N7hy*Dfg)Lrc26HJc=BXh}?1Y12|Yp}S+A<@nPE9qPN&*eU)6srYL -*P*<=^w)He~?o`-{i@Y6@*_(cxY-T>4xIP+$F>L~VR7tn#ZIS?gh3aK%@CaMU(AD%c{l}(%{Dj@K_N) -U5rdYieyE;()<RM+!Fn4#eRkA{p95i`Iz(Z=cX7-XU5}4%)$qmBCRMw5!r1AI|gO6eO;FVstT;p|hku -UkD8ntYJY}GOa^0}4@vbmN-z9h}7I5d`<zIIGRpm!}w*9fi#si+urY0`zo_**~HImKwdCS6pFXZ6y!V -lD+<gIp15WYmFPa%8VISop}o^wJ-pZ5Q@#_bMDrD6mloc1c5*TSl+rxbF7R-Z`&Ug@tO~(+Wv2GPg98 -ua6EF`1<c{%KBvJ3dG~6`1*aBl_^4okq_8M$Tvbuhi{vd3g2f#g1SP)tDI4Na<1C`aU8}ke~jWQ&a(O -pd=f7DXKM27b$f_+tw;hTEp&S#-i>&^T!2O^{%}AQ$QK^Q5hUM_gwESZ4W@$xw<|ieq<Kul6_F=XQsA -!Xl8T^?c%?9i?op?$5C^2&-<sE7seGkahL`AXXs1TV18lfKW^YElPM>b?yN_DS<iHrzZ6Cov3Zu^?8w -!fXxrV$!tEu@<)vTn|kPdb8NAwp-I(7R;_n}Ff{4e#9j}TNy=Cx-9*E%^xsM_Mz($MWN89uEdnchh<) -LOJXrY#Lmv}Bk9L3`fx7&eE^dTJM2LH@}&ZD$Irgyk&`vDVwp2T`2$*64ibpQv)J`9+dRhL@~E)2mm| -QNi1aP#UHlS*`2Ug_v6kKu65q>v|Lo*hz*Mp8gr@LwRV)XX@8qP=A!1a%IV9!)2RTHoX<{lj|7uUkkM -(yQ^M%kXZ=7$BNP}jD{}M<BDE|u3^C+<t*au7}F>xXB^g&GP+>W8v)%X7b8<6T~Lfa?IevZ#vgXV<=} -?bxyASsLR4ju%*i7?wcb)KXBFOiWnfIYr}q9*Eg8uTTgiOQ8}!hi1#ognLug4WAN&VKkQRz*V<N?fVe -ELam{ODZt_UA|#AMiyRp5tf?*f~k97|p>9-bCHh(|2^CxKEA*^j5Db`v`_y#{Yt@V4rGASn()i(7;=z -~U?i6MZ+vfn##SeFUC}gSeI5J*7VSIfWZvgZE1Trbr_YNA9d%()z>dHJqH~3A_7n*!1>Vex<jyxDPfa -c{t3$^#F49toj7qBS)j3;i#}b@+jIiP$l*414aw>J~Xnszm%#q;$8a#OVx_;wuD76a{jkxp^6<w&;PE -E_LdE*cnlpBU-J`-q@~A=F|@H)Me!B}00#D2_}ENa@RhBFvSN6erPZ6iR?Q!3SPegh!i%}n>pHk}hn9 -@<6gPj%@GQT()K~^pdzPMp=N>CO#j?RC9om!3W&#<q3ztSzTSI56)stQ5E?m+s=TRa*{PYXQZ?)zb<f -jFZi4Q)F`$SC_^pG;axS|h~Q+gJsMF}zlM5$*K(jvTi3x_L^FLk?PjscI$b^D*oDV2E#xCwvR2p?&pY -E9?>>NBweld5LtTKixkFBJfR=nt>p$kx-5^~OiGSqvqola}cCUOb@bzfxc^NP%f9QE?IH!`+lWLV0L0 --XX2WuR{J|W&hUr$V%KAsX|)e2i){2ZC4gM7ID&Gp(nDG-a3ou_7tY9!P}|Fp^-<PhpeZ+1@I;1wA3A -Vmec_WmqFnI*vjxyB(aP)E;<&&cFzXpM}s~zB)O3iPQt5clbGdi1)g8?dh|YBPiR8jR900E778Rn@9_ -4Lc0aHe0CSVUCPP19&bIl0nbc4AVLFX`3zDsm-gAx4)nqMIGOlNQx;$Ln`eEV-;&%8%-fwC2bwhizn_ -e{FBU{z`HlmgD3`d@~sBDOQwV2<-uRQyza^<K{kq*yW7bcf0O?mvv)N&<8qhd6wAx~6Vl0<!z<Sqw3& -Q<Q}keap2=mFt0n8BS>aaHp)z_093H{f+LN^?@YR63TjV5yD#%2s}5Q+~u#2%<CIhXzw%9KHPq37GMM -&IV*H$@U^kMGFvzg?M)TurdA*`p5r)F@C1^#qs;|cTDD2W)3b_dg-Wo>8K)kz@wg3t{kCpM`&DQo=<5 -^^69PE=Qix~dTA}cvXNiemfuPuv`WBVb$Xw1IRyH8<O1i)etbeYtK5|&XQ8oz$m)^zK?=VzJwFncN4) -6WvBOW=U?s(bZZ6qRwgScyw>3~!lHAkbH*XcoTK!|T`pTNFB|~h~(@C_7=Bd_h!OTmU{D*>B>Fg5!>^ -Haio$FEkOx>CP_6)8gfKz}7g|Gr~!b5nu)_`lD*qvI0x|-Iu8)9CvzE$JY@2`#LGIZ!$sSbTY8KSFY{ -<;BmgtG3%U?}T8_L|FH^VS)6R*|e*Fh(DH<StYqob<aUiK`{I)9d$UIlIYL<v@~Q|8XEmx(goxe3U8& -%+ig@fn@1o<v@xwR9`P$uI_y=G1nFFsk!~(vAa?1Cs{k-6-BZKQQxqrFX5#vhHx_rufgy<HMuLU#$oF -CiWAiS{xVC(LmXFhOR_W=_5SoHCOVTvb0eMrs3!y~Eto9{<eu=I)&RN4p`lN-$XXND;tiJ^J=~uKbof -qcFziEb?o?+(^cdA(9+K0AaKNn22ejP?60j8z>{$?6S13oVQnqq5L&{W+CQGS)SP|p2i~Qsh)Q<b9le -h9Reshph9_%3>q9(oNxA;UTXciByBup$KS>qQ0Dc_2ehginKx4G4|b;*Td*?Q{1{98J7Wp=BT(;M+NI -Ffa2Ayo0Hdgu@}d~~4t7J8P{1foA`%3ZsF75XF9=Wh}8&ov9#058`r5YnN`Y0zapn5*M2>CpbVcJaY9 -dKyi889m;|$mJYr+i>!wjet($n@|Qd-fZnq4So39T($ROEZj<exFtM`V(7nH=<6RXRHZ3f!jp5g6f~7 -Q`7Rde#JgCi{`;`H^F8MLd`}C#M|T$cp(T=aJq=$niz<VBuC@HKXDE)ueEG-x;RmfSmsWlm`q1JJ21M -yq4_!Xjy2|PF&Nk82DDsoqMRU6d@@_WfiF}NzAjG`kcyK6&Z^{#0UsU)o?Vleradx5@(amD`>=<R|U% -!J6ZDTVwvRSu3L&K0h)vDVcXNj-S#BZ=hb;Ns2b9CbG6r6Z(I?@3RrvUwndOGyh_+2*xbcR!30qjku! -_Cm`V~ti(W2kSDwG$O-r}v)}d$x=JLc1%8FJH0TCh83}+oU^QO_hK0)#-io-=n_O9P_NK7Ktr@mm4-% -{pR&z&o-ZPt8dJw66|^<F(`LKO}8{fj2y7RcM*I~Fuu=)?;Q4-UehhF62l&o-h|IS`aDjb$LRAYeIB9 -DUiypyZcQI>5)NCC<;Zg!vmy1M)uZaCCa&t919akwM!wiUF@O(#PW570H_C`3zuZpep0bxuQmYyJg|Z -=#W#4Y_oe!Igm@jA295Jd22KLBuT?1C4&NR|jvh;>T`mbnuYdrl=EWIj`ehy84HJ-k3CSq_0B-k4mBR -?9l7qRTRy(*sX`k54c)HSfy@rM+4tzimc%NJ|tg`r=rVLGb2{IIfT(jpF8HtXXxbiBHK$V}r`$+`h=@ -di%)3w&Kj`743y=+J7Uka9gj_=aDg7D4|Ek4CyZ4!21L>HUyh160krfws0qx=go!GJ`X&Hf&G)m?g<7 -G%^g<?SC^eSgA1<yNWGs4FW+iQfwZwDL{?qX%=?Wjt3Ubjp~C>(H*=bp-;KZpfS`07Eg4gLC8F$;SN8 -t+!M-H=e^m_g2vvU+8Ih%sD)x0-SqYK@?rFJPAT_>vb9aV{8r#GxbjJ%WE0x(Ad6tZOi|2a!%XVXH{+ -)6uR0sFHxqu-=yuzVX7z(a_Sh!pL52y~vmET%S(s=k4-L~)?Bm(+rMA7%-^J+zx(Hm8pEUZEUR^#rki -P>ul~g`Clsp)@9qiNuWL2WtIDh_D;FOYwmkS}Y4^K+aO&QrC3wkZ@p;rEoHUint-~;%3N?2t^d1%HBe -L~n>qOHJQOn$={QdHLIp=5+#X%p%Ax5+<?`4PO+OmFS?5kE7`W3TrQsOI(l0sSwK{pj^LWE%l+Eyizb -F3MASlOD}ddd>1sV##|GlFucUTzH4F&ce`ORe3$ZVc1@eJClrSI>m2whvB-Kjz?ZY0im?}u=P~+w@<? -N3{g4Kxo|RIrR&}J<(t%MwS%4%`SF6rwp-&gLw>Nx@;V4C?0ET!_o$*XUsR5EF8CN@mO>2G-Jj|Ay3| -cn{S6!9o>D5a$q){iwa?Y};|UvB!VH>#2T-d|{XM4e8;<t9z%&+&fYI*&nNG}yZP21VV^G9k-f+~Ida -1+Axr-ehv242+f5;0jsbH?0@+kFAXyV*L^~%>0fNc2}^9jeBK>g&XpL{2VEeAe^O)GNDA}ISu;bk{?m -R1s&tCtGPCB6_joLTOqZg+d1yQ(jVo)MemG=Vfzzt6u4-5%bWCuKRekqz_~gF6P(dkM$cnFGjr`tyF4 -AT)9<N$!N~sp!f09v<Y>?xVCEB$gS#2{*9wjoUs(o^J^D1Y}m8f2v8hUvUeoYzcZj?v&EpHQjv8eDtK -V4}m0r0LZsrqvL=#2q}RiRQ+}H!5WzF<r&U~s@`;vK+(AX8aVP1c4bJXpe)WQ;iNoaxhKb8>v!DAJjH -4~j#+{-8<ObH7HB^HlQ#8s2R(PV%txBV{3f4yorpIbKK`bODgWK9C|>`)XN;kmc$b>tHfd)Y8VT|#&8 -arUGdy8p2NCh#I|ZUR1CMBDG3!2h4&vN~(ki_fTyHWCG+(>faM$B&t~0T7of2k<0D~L(5yoV;;xRA%b -<<f0L@!yZ+tG#y3ynto(orG*xEU?zie@`X`Nu41V!zno=kRxwN|+RosIzS~$2CL0vM6?(P%#^uZg0Mc -)!od|dP+?^o}+NO$Klaiw1*LADCQ)|=kP1dAVz~!n_iB;_$u&Et)+fyfOUT4mEkoY`<3*Eg4Elu!e1G -J?D9Pz&Z2_pT*G^iY%Is3Zq=2@0!?DWbSR`r$X_S8nk&zX9yqS+%Yk3B_trztT3|5W3bh{I4`}(V(Be -rgp$g|24u7<lV%F&CXjT?Im}JCi43k&abM#Iqiui!ZeM#t&79e{m#-TX`#lewgV3Kdl@}LQ<82%s+ox -0luvexL%`NHyKhfiNSF<s869V(zPMl(8_>yg?N{H*TPVI5U$7SEl5Cey(@>a*SK$#1}m14@A3anf_o% -m_7vM5%;M2u_bEhM&g#AU95D(}D)7X1uzLRV3zjiDmd}8?I*lu}swNlC|{|nzVELvTGoJ^e2D^&H*3n -h!09cH7sU4)37e3zbJ}7Es7H?^W~wT0_q>A9wI{j%0nqMSl!!)BWybJ2ya;R-$xi=hd(uezB7;TLer@ -u#M`B#*(PIL_&f9hy$hTEYBK)hQhY=cP8?AtV4EqfTEM?@BUpXpRcN=OdEknsKW&`fitBkkuH)&@0*O -%9+rQ*DI=5|&d4SV4ddwF0rW+9oF&q+#ICwXkC$YTCHjCk>vM{%ov;cq#>KK6NeLM^<B-852Z`SRX-$ -)5oh8YA8kE?HKod!}$$*&QkF=!XaF*abJ1A?oMUuH%j5n&wE`5-n8basYv)FMw+dtXf08V-7i-fvOYi -&_a2txjvhSrLH-=g}^BDX*v7-}^P2nfHzvmhC&WmtbEw2$e+_;g1X(vpg4n28AR?=+5AlGK8un+;G0; -Qpln%r7hE+;CbprYWNr}hWLEI2ehdT<2HzV<oU~)jd<+{dPs-c<_W(<cm`Wr{{UOt%UJzt=8LDXwSDE -oQ*3SD|M1MVwi_=x#n#qGZEXj~3|rfmUr2y-^$P=RZLb_}*xLS+#i~pCGp4`rpKNVUvR9>}vZ+@kibw -xON5j{mjiIaf^ABJ|OVHSe^cc3P-+qu7kzuRKMuhILNAeT4syL#2h^ovtgqIg?h#TT|T^~2Z1>~`-yP -u~Hu=UR;Y+30TZ@P$%aj^P)B0;_Q`Tt<UIw{xfBOOwvs60%a8+A?_t6ytflqHg+S`dSi_zxqR6}Rc7A -J8KRIXTU&CFzMDkp1ueijV(+`yc!jd;hb);u9YN%5Hq_B!9)#&n4I|@wqemEAFKJiksv9ikCky&|mSp -ChD&^|4H;$Y(BwXG4p}{>aQ5Re}KPY^Z)3tnB3p(C;o9Jf5qmggZV2`cLkIhT0F}~pWv_Pg)YSX75AL -ruNZf2K!3&6r}`^?_?WdMHqc)&B8D>?d}R%yx%C?U!<w}DkSavfWSj)x*kV?`2KOz2w0e>5lo^hRj~R -}Oml^M$jQDSi_p`>k#&BSC{J-PCnCe3_)c<P^jMk?aTIAtT>**XAM*&G6=)l<W9~~GYPjP2-U~D<Tf$ -{ni9T;0DoYsMH%Kz6K80((o{-1VWyc$8NUNJP`!1&DnJqO1B!`_#`MO|%=-(itqa|Q(kmmC!o!vz5oM -U#<1XK+Z|tt>zpgk+h98O3q|fdWSid%d2OmF;`a%3V|3H&k3oODjsNFJVa=qN(?P&b{|L3<zrP_ug;$ -{QC}<bMAi5UC-TF@xcR(`&u4g9Lo<dj&(Y~IF=n?9Q*&z0miRhzu5ssF!2p}63+qbYkq*S+Cct`2N=I -wfkJ613#YXMjN6!fhO_+*2N)B6aGb0A?>@jdbo)&XFy?H(*#X9@+y3+c#<H+Kae%RYTeAa<4Z1SxO%5 ->b+;$rW7!BK6Kfst+*z5o!KZ=JUw&MijKhi0Mj*gvR9D=LqI70_rkO#Cnjkh|`_{id0A7~uO4m1vQI? -!0b4>Xn)49~LpLf6U8GuF;y8!Qg1YjZfFsWkzz)I~nj=wI*%o@vB^3P000hM#Ff^9YCe@2c8?;z(m3a -isAMaip=6IMUc&9BFJPjx^$aj#iE|{?wuMBaIPw67TkoG<q~Ra;3J==}04MLFFTji`j|A>sSbMwU$<n -G(PBjq;Z1Nkw(^V%10WbZ*inC@Rmm!8?K2XjX%mq8qdo|8qYY6G#-<WH15CIkw(r9@91B|BaMYmJ4CS -dPm3dsk2W~((-6lQF*&25<*4Z)_Kf&R@lVULH9n_aHw}_F8k2Ygwrwc28{=6w7LCq3!gx`~8(=8@3E; -Kvfa6f(A$-!Sl|zj<ev7_wANQ@sSyg}M1DjX>?iiUo$;Vl9V@8gGxbkwEjkAnzwLZ?m?Z;_7nvJtMIL -29L*s|v7y3W!_M>Ntz9<!d0LaH&XU>MR(8ZId6(B$+*wl2}?Sc{KIsQcun(f?=sTAJL|*x$sdu?g`l8 -W*S(*U!{-1dSWsQv(KUhLBym8pm!)XUlkwGj~OouiJd3<xj~p)QyHD85rZ+|4m4eKJ2QFfY>)li#>#x -BdTpWrLw3dwyuLT-r-$3`!}%#I&{|!_sH;-#e2Ky?X}w!tO6d=;nVQa6K^v~UthjZtt}tdPOI9mOIP- -QkFo3lxAb4%(U*^GZ^yZnYfIgFuzS<+{_bC)nMUDvGj7;i>Nc#DU7AP_f<>!m#^n2f`M#Pd`tmpP`9p -OD{GmG65_u?QW;-c=wj11VzA=dg#KsY_g(&#E!U#T4!}*$01+9cgV|H17U#bh93f-O=_*)P>wXUCP{W -OJ6wZ2jpvvXc2Z5VXhl?mlWH#1&4_@PF6;VsPQeJ)EqiYsj=>|=b`><yc+!KaMuW88H1L;NM$5}a=qC -!2UDGi4BaH!qfeGy7B@_OeiUycu5_()0bLK%36KEAjx&?@I#*wBo!3r=FVo(6V>Bg{RB?nWzBGBXg+_ -`_x$eyqV2J-qYO}wpZKWssORcQ@vE@b*`>GXkD!80#BUOR-P*@#Kfxe*jvb-wWT|7ISE87+y1&y_|Di -p-60)b)RxC;iW-CFDIu8h(V99RE$Z4sDCMJTT7&^@Hzf243(mfn#anuB<?|<C3iw-kfd+e?#$bOm)L= -g+=3ZEdlb$)k&Lhb;2LDnH!c#|m(MFv3Cst3reI@P{tIOg?OnSV+_5!@fPc&c(#dP1k3>=Qe!BW?H>J -1WAx%+}r(sZ=JU0N|8<8Xg^8G3r0`L(;3F5^-}cs=FY`FRW<zeL%&L}mFnjr8i%j^%pC8EsbAWAPjfz -EOBwS_5KbQOE>*xgC!KhwO77{W3pBLj%^v5>l`L3XgS?^M0zj_@Y0q**ffV4|KR(0xs)L7X5M6=8tWt -W}o}jm$;oh)~#*}55xzp!o@(Ft+&PUHxJ}_45SQL`=rpZNDj5^7s)``5tl}McL`5CDPWjU+lfgn16J5 -^WkzqWGuZcNw_=3DqWK6`>sn=Sy?|GA6<v0>)D}|d8jclR75H9LEyFJn++KE+2Atq8$`^mfW=nC83K+ -gF4B5It`90n65lL)Wq>+$hWsBU(9`wPL294@5wjUDeSD)w^!F{X)qNgjYp{n)Ks`YwB%;k9jVMig%q1 -}O?0xvg%>q$dcmF;(2wTuq5ozRz$xnt9H2%tczG`Q|&cJ_PR3Tt1*UGRO2YC*^=s`a(1=mD!6-oduf% -?%sjjU5p9Y;;rNcASlVpeq~Wqbo~S*148FsMMD)QbS9(2}M(A=Ggw&VcqAf28K&EUgs-jpR{Bw?KLd) -ld~aVyN55u6|`^MKE|!}<I8n-s&PgpI?y^e`d)>#ziPdoYQ0twQ#~&TDtJV9?NV2*>q)Irfu@PBRWa3 -bFW|^DI>>g^P*kZ*bUkYbyI|V_=~j60RW|rfS6X`)U39Z{F1qMz^`=K{UAA!6ws6+AaMrdUYsRooA-R -EA^|<l{cmB4y9m_d4m6)kEgq?%|Fcb~T6@IYS2qgz<@i{9OOADCHusc?kN2{FnLz<!8&JQ$}rD*u&%l -6A4)=;VPAlt_!sqtDZ`wLj>poiUd6%Q8H#KgJrC&4ypaLrHm4C|WlL@<<>nXLDDn%C3)+KtS~{4S6`F -)-TF+N&fbJDw=9r)-(y<r~>nhLECSJdfsS^Akpfm@2IQHtdOC;D^;*8y;g9kE=?q0BCSuT!zn(vB$Ev -v2#;Lq)jj2QK&e#GWRE5z<05gW$sHE;#1~cg2*Xjx%-><K_P~cUUbEMVSs+tLDdG`ICZ+VtXN+er+_B -0?i>3lv@g7ZMPp${aI#bv)NOQWv7#c3Irthk*%nf)<qJE(2z6<35cZkqVs(FTv9In+sLVBwBh^Y|$@k ->rGE3VqW6HYkVwSEzv-|TPpoO8})(6tz(IRwsmhHfho&>j&VVUD9L-$BXyo*}<o)+7XjBGf_?t>Qlkc -viLehCNK{+sYnmE?)fPP(6a$#MJ{1&Mm9(Ax{u3cj(!m9?gYn&#TT=Gt&)ZMk+j9{}Q>8$8A~EU6yHN -ot%q1Q#y)qWnhI_9ZEsj4Cy_F9Hf-;dBKiK|zWF_oU%jJe&g379F7VI)$ebWp1EXI*}&p16%0Bo9UgY -yHBRhM^J}Oyf}HjGI_#`(|1s&Pp2qNVFh)^je8XeLz&HI80ma{x$k%sr($+kv-S2OnfTPAXkwe8x7#` -O2dtfnhT&@-8!YS;Aci1qU~}*Gz~(Og?&P8$cY%RQ3!Tg#W_Xdz`B;o>G+5%yroONi8&@fjyT=*4?W{ -EjJ1Pz1W=RUJy_0J(80ij<PiI4X_x_I&c0935(I!j=r0cytj23ht{roV_WIsB68&7EWpHbQyHn!f{L2 -p+fFJ8!tyL15E6)kQ=3Bf*I>16XyX0uO&vgbB7N@=zQqxOl1*;!cm-Gk3Dr?lvQgwgJ2j5%%{gjf384 -@v{C;c@Td)*c4XyvK%U!+~5NDzp^O=v71A8_ot2yPV#V6XzKZ?_tfDEX(u(HmrdTS*E@89<yJG+PW}) -Lh_zxQJ^Vj=VA5sfZos;NmKc8Q|@5EGfwh||8l2;r}7y_l;JgEkq3MKQ}Z3Ye>g6a=<Qcj8-7-ml(1r -UP<jWCpq3Aaew4MCidFoi%@7<rRlLJ)u*W%<qinAY-k2h8Q^#|%PPeHix^_ET=W4Wnp<Nmm9lUsi3!l -+Oj|uPavpOuuk<LMeHxIJs&4W~^iZ>G;<fXTHkb_b4!`nQ_VAOo^cC#SyoUC2KH{<5~INjjd|7=4%uE -&=Nxg?lLZ93J4Bm8M~sY?*MJGRp5wGmHb)}q5<AY(7OTVI|P98AY6^E*Ky#5<v(ne$MsSF(o<JnGu3w -j~mL`%&{8-ffC!us_DJ&z>0Yy<nee!``}B{jBjgyL`QDyb{K3eIT6lvcYxGS&UWUy~XUd`+OAyn_dRv -We*qh<c$yEY&atQ9x98l&<)SX<~wrDIB?>RhVnH&yKn70-Vz^B=!f}U_y;>xv8$E7S$;EuomQw9N5P? ->cf@Jh_PXd^wh*@CJY84TlW$>4!TOWIPJ3X_fYBy_=w6;!gZtMvJ%>xf57e;p3ccBb!K(GZh^sEz)W} -wZ>V=@n&)>eMTCajJON~@Rnl6FGGcY=P8Q$)yExN2&6t0c=c|jOnH3AHjoKgL~(rDke*^^JMhq4_}G~ -n?_?h&Nf4*FSz>?Y`#dP^T&^lXJyV`m0PgsS*1R*@3xh1gw-^H@@BiG1_+4V0ox=fYNtcJrM!oCa<A1 -bji6KhO|g!^p7f-DtqI2!6;EH&55SUWISA9;hvV)}h%LL0bMSU)Y9nxBiUYUK)#?JP2R+hTs&wL$r4~ -Z@~onsvE}|x_>dGw%1HMNgMybcdjVzli6W&FY=~Ni=?-@zgD$D++VBOfcMw_9hY1FqxaXw@%w9sX;mA -XF0k#+wma@|!5eG?@CIA|O`}jAWcKU~Pf5e#s@u54wzV~3%~duL!QP0syFX%;CnBm{oz{f&^<`5EplV -d`D{PHmlmz7k2KqIQbz!|&7tX>pVrl+LD2r>C$m_xz`MU5cOB}O%;Y;KN);C!pUF}pzXLuoZ@da3S55 -=oCglg@_<Ly`C?FVsw8kbqq<4b;275DUFYpaz-M`-yy_v*?Y?1?)vjb-r#_`pD;C%b5UPr5d27i9jt0 -1!S#>$#a~y-`_n!!qj*z3YD5PX>;l1o|knJ8IqV_*MqgUZtw|A_izb5RXz=f>>Ei^yIKn=wB1CLcn+d -`|=gnk|aUYrZiwSW{2vD4lX#-9O5cgTdU;N)(Hx++PYa@ZT*0+wyKJEu+_fls^Ujo_=@Xzw&J=<UU9| -EZaOFcy6pq785lM>I7?OX050)1?2c6x4{~SAdgqm@q6RlSrn(?_hGQ9}Ho)C+)vU1$%MawiFnPH)oP~ -&<z4JP$wi8`>?#X9#P}p_2Xsfd~)~(Q~wnxX?e_)f)_=;Qi@$>k??d)p4!eDQ#O~yv((r&is>KgBTZW -#1+2KyZw`PyxxBkuU(bE@J=eDN0YAD1l^EHqp}U5?KV>Y_WTiq#a~gK7`WZ-tcl2VXJ)>03|t@;zp{7 -`ouo+8?erj}&r&aj9hwP2s-06vl}hvo)$z7o3Jm|GLu2!6xIZ0&IDWPzkW7O~Xfmq`b=_w)x)ZH>=Jq -y)3?3U;aRKy!~43LL5)Tm$KmFUF$Z@CU_Pfmp+QBa4ERjUXSzoxcIBxj<O+c`qI}vFE0k;Og-}yvt!Y -|O_{vFu$4l#D7+gCHsuOaHb2v721yzhhTlP-HerR21Z>LZnv&lk@N(@x>-3PMoO4Xok8Buu7Owm3s`H -^o({;ntxN=<SQbKX%c$c2#ZtXiDG0Mxr7x=O;UlPW~U>mX)U!IAVT+UyRUQ{^&U-t=~flI`gybspRk= -KaN&!50t>%70KGm4vTS-MM}jUq)=#RZTg&>6(Wm*1zs{BTbPxx}T+V;{6JY|*&Fl_w=%G-d&6KgJu(o -Ys$Ptd5&+hhe$(vDBjm!wX_DVx5pL!R^K`!3|($PM6>|Idon~zMzEQ*+TO9mJ7+A+M@H9Vy>&kU&nJ$ -X1<PmwC#0dO{?q3u3C8^`Gk=*<>e(u`AV{$tt3N^=t{nW@_&`>+4j^$hpCEPu|21UpycaH!)kwr>R|I -r*TvM@Mrj#swf}%TjA_(v$8}-V_(lv(8$%cMZCXkGd#Ph3Syh~IjSKykaQmaa&Q)ip{5srIdHgzDo;a -#)*Z7ihB@I{@#uh#+_<C|;sm^{Bmy^K=<ej~G`w1O;l%iT|zbclKyT*&P;%D=4wr~UsU`hpBD`qu-aU -d@!XER5gogJ}uDK<KWttwxTSCxM|#0nF(OYXca#8$EPhby?KyIWyZZ447te@5*UZs=m|xKSe;mgj%Xm -X<wnHJKUf_*13U;QaWoOS-U2;6q+ew(n=_!k<d7^BZwDIu?{?I4vlDafwBvw04F6ZngmCXj3@r&YABF -yoR>qM;r8TbWy6_{)ZM{7LBjq4UaK6MKnYpM}uha%Wu3<#cQG#h2WxMK5ic7+o`4V4IntUUc>s-uy`{ -gyKVpjMF(+mC$_G)gHRTI(_-=vaT_i;Dmk8?jKo^+<-}^5h~3hFQZlxek;k=LG`#A?iiKrpy4gmv{Zj -o*zD_O{n4!ByXWT>W5S*yRFu1-BFL2pY)M&6K6*Xp9<2GfnmdhHrX*z4-=BY~jTzCWIUF(6@z-WglnV -sXd+6z9lKQWQJN?rRcZg=%QS9@9^8m)9~QS@E5P5|;<_|3O&%)EBJ0>dhbjue&=4$I$Ewa<X%M(na7H -t4RGqBhf^#p@3?<~p?4I&H+(w_JaYn<Oi+)zxs#L<J{WRgAL@I=0&mGmftYgQzKQ_>h8sXPHoY1Yb(i -7G1m37Amf}Wel^LhxHeG5j@dpzYZpP_Ba_^8{V)-tPSgHaXYhE8`jqzVx(et{l$H^PT`4V;&<6JQ<dA -L(`;23cTzf5iy>TjwYY$Ac}5$v%X)WFV{dE3rZApiy*CZuh(9adF*|rBO@ly{brUe?x-sxyQ5TEp?*Y -woQI$(wq^@jADN>o`yi)uP=Zp&#YAi}nhVXcM28xL+U=$OXR9Mo8sRm=cb|AHR*hcE2r!WaKakacLVW --|+j^Zs2J->dC&j5$JvyBNT20L#|kba)$kXRSZYh7Zs@2z|PM!8?i#K6FKc8u@+c0%%!^|LPP%LnA*{ -FnU_-jKTEx;x&I3PYaX@o{VqYKtiv`BMfV3R?(HanS=-Z+gHMwCOh-f%$Cu9fA9%26jGrEWT*Te3o_d -h^&O6PW(K_O6Yy__y$|Yi)}X<r!Z21&WB@sKUxZOX0nHM2kcvl;s3#IU7+r`77ejoBYfF89>@)(kmDm -qF>?Dlk=wNuawCt^fT!7%7zCj&@^Ph%;=j#xQ2gfHRw$P54Hj#~0n!rgO1jVCu`Urv9~|S`SO%o`)6Y -5vQoau(-Fc%YZnkdFsey9ny4=)t-K1y{lDdh6=WSvIoSnI9W&VGv*nVKNpTomL#_}OAmpQG}M}5b7*r -ElIKExJPKHgIr|2Q6|X8JDBct@(myU62$+0)*~dtaftNFV-$a_`5W7pGR$IJ?hx;5JB219tb8-!pf52 -^l9V^n87u<s;*`OId3iLojN!o`w|nCO5nfE$>x`<yGms_{bm2AH?f{KPq82)_B<WvL+Es%7C(pND3pP -k4l;N5nM!LRpoXRhi6?%uy?D+i3IinC0n#iu)Edk-HA6&T%1-F;lsfVaY}`%1n-3?dK4041ZO!M17-$ -2_2uK_#2MI|UtXvy&rqNM8CvH`<3u7|FXp{t8oH+euk_+U!<e7xp94LJw!jfO8nqX!^ktF8a`!8b6EZ -Fg2;KOKec)#4W&1$=r8=Yi8^}gC1LX7$X_V2m#=dVyjl0gZhTV=-hj%wl$FT6dZSY@<SDfo&zEhRp+e ->s`EuLcDjBQVO!hWd+cR1mkB)frCKMU7Tig7)o%&oe}{a(N{2D?wSzHkRmm>qdt_Qv9di159!o?b;MK -2R+xr?U|1KHc%XJBmmkjET!Y#4R8OyIbX6ol>c=AC>OEhWVt@fr$A%I^N`s3G_t~o8M_M!NsQ3<P+F8 -o|iVlC_n6&YRL-<c2Tg>lG?Dt!+IA!KkU8K4Ub{64Gs-ET&${eI~Wv6@)?kZ9d1@%Zsf*H-0=C?9kuS -Z2^?{?`a@Cl(lbl;1Z_ROPKyUEl?MAR_Wmry!6Lvlg<sJyoqsZYPVdu#h>$lL12ozvd*SS(Mqj3_G2* -kdcAZx}nl`d`YPI!7e53XxMAoAgZ#Z-guR>pV1^230)-kD073k)r3e<VULhfLP24q~&7uKSSjj=3!e0 -Y3D)h<sXK6Goe8@<$M6bM>_8qEUHOoL{j_yR7P*PywC=A1CPA5H6x>=oR%4TTcMU?^;4k8l<tk^E)cP -1hN@E%*mjVQ}5wGK2K=fSgAxgY-qUE>4-mG6>Av9GN6%P*PI{71b&+O<BSznli|PXAp6U;x_X~=hcWD -*F(sdLC}0oP@^d%oIj673j+r~+b1l0@@NZwS^m^hI*;cM<VAsVHu3z~;gml{5g(>+Bc^XXnn`GenP8C -6tOm_aqggf3#c~L<Z-N@l8D%_!Fq{2umOq=Xi#ztyadrq#vGUpH6ob7HA1h{4&o(~wjI+)zJ^dmpYnK -wfa^+g&Ne%oxwz&aPMQ+nM<8Ha^!Ll^HeF{E8Tq8x6@L6bW(WCxERf5M0RU6`?H&MdoGv_AY(f1B`d8 -IEq+KWrv+rf`CJXf9tmIeV@u&|NX36p~A9hcrXmc3Khc_9cX94|BNCtb^-v^=>N5M<B6EqDtXRmG+jb -InsgU)qk%i|@lN69l7B6$db9jv41#cbqacg@Wig&P`t)AIkS^u!Ca8^7v@^z$d#=1n(540hQhP#mz+v -LxJN+cFW=!>q}*>b<fj)qHZ_@ctlmwmGW2HTJXLLx(Dg*9C7*@7&w^CnO7CRdc8SiPqB-1E<}sh+y}@ -vA&E6K$R}T1KTxt0?z&Qi^nG?yM&)HYpKw2r7`9)#l*E;~DGao-Seys{5z9dPQa|baZ22_!9uRsC-tZ -1_EFR}R#^%7a_RCs(y)>eT&x42JJh--afopeL4`4Qc&5b+Hi}&6u9%gW7s}QZtkUL*wjF&^%k7+ltmu -@2~BM;PC_#519+|ezB*dHP(-cLMMVgFgOeTpSgVy_w`ftd@w<Sr$Dim3-iBlY$#^kJt_9$1dklr&&XH -=NzV8dN?F8kzm^_I)(q9G+o=P#|pwOUttykL4C+;k}4$UO}DAda%tnvjdTS$;RU~I{Pj|%vXB*C-JJp -ePH~`4!)M=qhHA>S=6=ejAY2dXQkb3-cpY&`EEgd(NT);K^&3(#z=MVhE2&HAQHvZp+IBZl=%<D<1F| -m;OLQ0IFqVke7PJ9Ouw_cU_egmisGEUE7f26N{<`8DYb=2>*vT3Nr&c$gYY|p@McJKz_%Ae;06|WcSq -ot*xmEBm*h6ah_ln(hb<-~kso<7h$Bx4cArC|m+BPJV^r&BD3mUh+QM^Kqjjon)!JiMpaq4t(K;O<m| -C$##ft(%5xNko2B90V=|>kB70LpT*$#~^NF&jOpeNCay6_g}OPIM!T_ETb%EfhR+1>~3710IpC1-3NY -}Tz#rM>id*UAu5Nr*cVff=e4ay(vJ&{=x+A;++)FQDwH#X2v$`yC4)eH6}nIMwOw`c$#Jw~?>p>{k`P -P1qz;jif5Tw0)okn@C$<)rKkR^3mJVaW@~kRtsx?vxZN#VP~CLwINZ>HgBfK9Lx)0I~*mi`<UR{4q8} -s-AHtyw-@0MUA5j#S=Zk_&L3JZ4R5m8rEbuIsrhWl24A*P1|F?$@c+h0`F%rdg;Bl>Yy3KX<Br!RmJC -UtZEz2I2r|d&&ySdI4j?2}TdsGJI?kq)UF9n6$q{#Lv1i_;iJ49BpJzCYUf4Zzz9Y=oxS|0J0tN-Kd$ -rjUB(-m2FjXvRStDro&3Fha1Pro#q;)FHGT*7(ghH-js@H|^rc#_m#t9s85dMom)?|OC+Mr_t%;;v<^ -0an8PtgUnvCKc%h~+ym@{AEe3p9pRC#puDFd6OLLU2ksG3G>Gr*v)MH>5tX{5g~cw0m9A)CPS!_{A~> -k*RUd;uNRry^?TcJ62!z04SSYU$zkM)p_||9PaPYm&GgX52QrWMElS2_QtX)1e%9Cb@mem`wlHV7#oc -@!_mrkXu0e0A#FTKzmx8d*;PJWvB1TCT4y)q+b_kJoVR)C?FyYe#qHAbtje)hhPxiu+N-cDEBZ#s-`( -9w12zWWC`l3*RWzW4y|JF(kgO`HT=XDrNgZ8dxb!>JeizI5aplGVYCQ;2&_>U@Q(vxC!BAnIE6yMn)z -nM)dM@6JQ4Rw^?E2o_=TTL~t`1QrIWE5U+DE?l0#kXP8r_s~>R2HM0(JbJc=jxCS8-v5k*yfnNKY$R! -9VDTj>Ov!L%+)IWpwL|6T|iLMGD%DNL_qMqjjh~(TuBMI3XGHv+4;qHZd8WfwjZoUyHW{v4h@QJK-zn -1mj#Zn=`Jz)W8^@4*lO<YD3Kac|&BTz4VTRV!ZFYCV0o*0SBD;gz-LCng8*Q%d^|d{O?k;d#*r!$Z@8 -o%<5Qdzq1qWI>vji?D1w?sbrU0AHfGSaPk_5p=|0J#k@LSu|%H1*ny;^0UaO#?e#GDtS=mfaoXG^*L! -gP$@nINUlO6W*b9w;QXhF(G8<WQ1^pWoPCFFNa+6w~aeCl}cW%unO)}Xa$zaE050d6l2(37HBP(^Qf- -6}w2-Z6A7mLyrSmJR(HWUS%-Pp!wbwfeBn)%yj|CF^`yRL$Gv>-S`2n{KswK75yn+^8+)dqWBpuv7Fx -n&)T#X1(=qK@4?Rjy;iZp*-%T51#VZKo?G4YqbrUF>GJOAnYK`Jsk%J<duXR1~ZuPj$dLQX}dJUM{(4 -wj=Ww8)ItbO^13B?5G!m+bSZj{NX4f;h60oIEu&5Mn~~bITa7~^aMC8O|<W3_p2wmR!R#W!TX~R%XP+ -nguTijN{r;k8oK}^-g6DL5_fDKr2+jq;N|_z3c{6fkW>30-wEb>e!`#0_Y_CI$7=DV<3=fTK5iyj#qt -yKaiz%jSj_iuUNDP;D|lOE#0=&=Q~Y(7!_!3$Cpq;;X0{T*<bRAG>+yN$V<t6S@voHb8pm$wS4#sp5- -0_8L?d<ONT}3-BjJ)KL%bygH;9!Q6ZqQz(nXFWN#Ai~y7UD{Qlyg{$&e0lBwE_Z5wo<3Bl*&r1jp+D( -yJUVMSLa4k!xug$1z=`f&|Co0g{#Dm~2u8$FX`yGdRAH^}QU&x+Lj1j;SO?a~!X$l=^cV=g}n%$FU`o -{5dWmuH<+<;#Um}Z$!MF<0x-P=Q*xK{4~eehQ%t5<Mu|WlH<4;Qd(<h+Q|5(p=k%=DvskGMyZ11I4qE -g4UUbBQog~lfl<ohI3B2wQaFxBlcmWVFF;(+aa^&MMsU0W@o<i>L_C<|8HfjR{7uAtIKBpP!f_N2q~G -*BZ4s9^j)wxJvmCERyqe>y5#P;mT(6Nfa=ZrdcR4O0zMA9ph(E>gM#M`wjtjxk0*)&YH*;K#cpAq85u -eU+wgKD7@leELIUbI96vv|x59N3);@voox5G$kjwd1R#_{QhH;!d^3gQ<yo`HA`$MHyubduxwi0|ik0 -peRZUW)h{j#nW5D#uqMzLMjs5nsmfHxV!3_!`8m9LKwwq>Qm_kjw9ffDvwbQ(gDe$M~*GhH-+sG@AJs -rv#ICxJfuSQG>}#+~f{!G964#aT6bIk^&}&xyh9=a%`+^!P4*4wgiI18QkHqF}z6ulZo79J2wdh6FoP -1kDG*p$=%%KIc^dSCQ;m^jGM%Q$(`I}9yig0iH4h)xJd?>4CE%0xQQ7|g1L#7o8*H@7j80WjH3YpLtk -##WsIXG0z<+L-N!hZBryE-L1tJV@09NHx=WyZaf#0UwcdVEZ~t7XhoOvpQXq(04Lg^BbZ>pYaf`^fKn ->r)i50$KXROs%n#ye1#6nFZZP=->29-UkY}lz*6|<=(JaYHVb$yv@*`z>wTp-vL)m$vv?@|^Q_!fI`e -vtGxmPPE5dTV>BgzMM?_1-Why>~ww5V1}6m-kV6DJ~G3Eq=eZJxp((qz;>-1}V-3BC*E>7fBGdvgF4_ -K|1>$@IQYOd)aSV(LoK6P&)$Wg053*@1pD1t#{zvksuY72PB*MCD-!lK3AWebsqY1-+AMKQLR#A?Tk| -l?3%TTz49RW0-Mc=Q>W|7G<DtBQxiBOfj}W@b~%<_y0Q_YkGZBQ*@jzxR2z0XCKjCTTWQ|!h8t$>FxX -GqufX`A<iH{r!c`;pcr624Zp4M!6p#*eTq?wqK&N!}{dlqESKfp;oj4HBMzucv2|H%AAH*r#u1gi8m- ->4S-)Wnwr#p%(t<&_EcHp)e+jkXB*OMlc`+KGrenVC1g;yF?^A3S9m0<UWD!bFR-LP4{&eZ4%L%n*+r -r9HR8cKFq_tmNNU18vGn(m6M#7WzV;^Wr7#SPZp;sVpIc!8<FRe*bQ)UCL|X2(}igy&Z1XS2|~kOlwr -ilvI-ZeF(jd<GxPY(I&qWm^xN166T*A2GxKvmS!(T8RNyfFl>{P~b-&11|2@+qKZ_=)9CRBcN(T)wYp -<1|k}08;BGBxQ1{T=Z)q0>*r+uUF9W)pKu1dt_ZabW%u#ZtM=<v2S9M-v9~!sMWSsylbSLCdF{co3mA -bMn}*j@-UE4-Am`cFEi&quQ%3D!v=vFprVN|whxrBBCbDZsosZrr)o(wqO3@piSJ3mxRrnW5_!|jOmC -p8NFHPcZ^H?1pis42qeVM!EJ~jiam*2qjO}&o~`f(TS<?GgVGyr!liVL{elL(dU3ea@jFa;Ycvx~rDc -3OV=bypP)nTXpQLngET4|=c(2i)g7MNA~(8vxSYI6M;o6%fQ;W)seBQlxi<O}K0${DezSw)Deo6d)wq -mD0*(t=RH6l@4dLVpa4pw&cX>&9<XSZ?)z|KPyp#i*NRT>-g%5-T$C;uM-jS*CM(HTMf$Y`}R1TD7or -R$PKobBtySxjR7`w=#$YR(k6R0WqM)uO^AXNiabyl4bfJrp4wsG!7h?-mhMFh!-+LgZ=Yf=S{Oy}{Q) -nr<Y+8+-~Eu|{Q+Eg<nIr7No8NRl1)VmQwY02{QlXk@FFShZN=1{7%PqVx=q&oS__GD-H_gz6<Z=c)3 -#M*dYfs<7Ef0@*^|G%|2v;b!9aTfH3AM7&?sPvfO7?WQo#2G+%4ee0yYTfqZZ)`7%pI}fYSwhNWd2ad -|SZv0v-|YI{_O7^z!5I4grS?I9<Rj0Sg3tR>1cK+$!LC0e=(FtpkT$1Pm4ME&=rd&JZv|z()iu74TUB -KNN7YfO`czE#OZADmw~(1dJANjDV8`d{Dp~0gDB!5b$jQHw#!T;12>e3aIqwu#<p&1dJBYDByGfX9}1 -jV1a-Y0<ISDLjku5ctk+?draM2-`01!D?ZKy>0H2J)ax7;r*qiy(|yLxH+E~?zO`@I_Y<cfL{WGqsAz -?PME}a|Y9bXZoPsD0XTdKI;1n{Mj3EO^v<O4i4<>gJBZ+r}J%!vu3?z<>Cpu;tmurd7&$K34a%Y+HAf -RjrZ5GKT7Gi?mK$1qX2yWZ75F5!MR+0%WOhg090zY)8Vd44`F9s(=Y~#r!_&K|gZDH65vEM_+wqXnD1 --=uBmbq%p%|zfQoJ7J8O$LA)El_0zm)XP&Py;F#{@Z{Lq%)DlXao$oN@Hf}EX-`?HUl`y11uH(=dn;` -0>AUYBn`r_fNc($4Z0j~f!xn!AvA@B_L<Bk75rtAM})gvF!zGgki$oJY4Cp*vp0!2H4vMPg^%_ch&Pw -TigsrBWjTEC5C?*dfpN)0%?8svrbm}^AY4v6@`cn{SWGrBMK`&?xrT+8#oTkwQd!J$It^gFVOnN_8xz -p1A)#atm}Ws}{aET@NtorJ$vHh!TTQ7PMkAJ>SuA%fj225XpE^cUBKXZ@e74N*2uFVBfDbDx8#yesW& -^Jph`|hgXNmmfp=SZ)+{!t{ZL*zG)Vb_A$2a&E<?F_LH#wzy9E3Aj<d4N+!&5q!r5@I;|3vv{nQq|@K -4hBY^lOcSv^LTs0@@Wh92?8wnIcthmKvBANT+j{a(F}k#r&MdIK6qjYc0OJ{)PCk)TaH5@eOgrXJ$Eu -;m!s37Vu?bVYF70<ht1uq8wh-zd(O73)MvO8RdgS$>KW9IXM?^q<=6OcGLXMh1g7jVqU*<g*~>4b6Kf -0-B6aC!*5=mkSYvu7NaoDsqD1XPqYkg=q<v_7Oh|=tBDpCdYYq+nA2uFa`^vB`Dq?g8cYAw7F@{TH`P -;2>s(e&LRov8!TKg_2~3VO=cT0W`Wo((f45IBy5MCL^E8|3t*z1<?v#JGAATzQpA9bLkn>u}Q91mk_C -B5E5wC5$$1;OHlZBvRy_=btSeRa>hWkmoA&p#Q<N}w+ltR0@j_W;zK33>upY=a*y;|rigx*i+!-c+s( -AU&*eMg}$5c)u&R||cR&{s-a-$m$?gubgB-uGPJO^#pa?+|*u(D#tz`;O~1a(qJHQ|LA4xjtV`522qg -$9InFACc)3`l~{}QRu1AuN3-3R`)GTE<t$%^I|IN<K$K^j)cKa13BGXqBH_F6MSMR;Z%4z<=a5^BV+{ -RHHJQ$xy%;w1`h$lo5M=LJotY%^Vc$#ct<Vo$-+-+7TRz}dWC{78>?mgxIV|0l?7-!{8L~#aBWB0xv1 -UZ<Kx}&8xjs-p+ik{(sU0c85$lwEy)8CTEmK%G9@DgK1gtLK72}WK|F|3sl+0vBpyog*N30xhF_@Tcc -a~nKRx8k&3?tL{F=Kcbowc7^XKe;iPO*JHh;2T&Hr@r|1bD%%+rkj?h>GA`rYo=tOO{UelEB9YbpW%) -!(i7$Dcp^oORB2x6QKPySe^$`EBC6r3v0a*7Ow=E-5N5dF=7hvZeNA<;$O_Sn=fFp8EUK|5*9Vv(K%1 -{)HD;zx47eufF#B8*je#_B-#s_x?ZEeDL8%YuBycuyNDoEn7d{w!L!4&Rx6r?A^Ejz`;XRhmRbsK6d= -X$xl8#b^5c<&z$|@%dcv_{^s2IZ@>Fqs{Ntv!jC^)tpE9!Uw`|(;Zoz}D}P+QcAXN1i>sS^I}fF&m$# -2^dzIR+Lr4FBPMrgTx^(T<{f-`*p1pbphxF+i+V9S={sRUM3LhL188zgtq0z&J$BY<x_o&#^nX}SN>9 -aF3ADWYuos(;R*pg?p&7GG&|B?G=Jn&$0O5662E?Br|@&7dc|I_jRm(yQ6I!+fqW~|<jFwU5G&-kPX6 -DLicGIiSYd++1v-?sh#iuA|z9&e}m&>i${PWq=?=*vOxEK4kJp?{)<zM_SGMGO6tE%bkDp<nCLT)(b` -9+xdqrmh5q%ROUF@?7Jz%$&5`d6TTE*38@-G@p`ZvW%bkkZG3HkdvNk$z~SQL^xn?OwF@uXIV4nnv!z -OHnYQ=oAKaCB7~ee+cY{ipZlCbCV|X1k<B0tBs!2Xjl}tDS5WX+L16(1bgqvTJhr63-`yP~x{{I-Nci -yZf~0~{kj_H;Mkh@x0C^3Bx}+rBC87x}C@lbA1jM?Gj0~mHBj0SEXExs;&*|Ye93)GWE%Vq+E&tNQuR -p=LH~!N&Oy-LpVdjIF`5<8eV*@b5Pb(mPIyTzn^Orc1mA`vHx}DpK`FJrGC!0<JXcqHa&MviVL}z1jA -^0UQsd&C4oCGo6CJy&zHfx$C^odNKp9Ot5|HgpZnQShwNzUitq%w(HHs$=t^vm?hbjoze^vHDZ_~tw4 -kmHx*mE*y1QrS$5g^kOb=orJOZ!*IfI&_uS!re4Bvdm#Kb<Q@E!L_qlA{$FLxtPT0bk?UbzIeQHd~*1 -5cyc(he<)Y_;n~^4^Be^#4Zi-GMEEp_%!iMsf8wCDv_V{x1jR)wij2-Q%alFS<R}pL<j!rTA3w{Qi`q -#hvsJdx+GgAGfY=0E77H)Imcue$Yqn%!9weq(W;ycNG}B^BwKx(iAvK3-Azq9N!^f~OObidh0{`<dED -Q(zqaQLU)oQb(rLu6wSTY3$>5^fy<T-SZUZ%7hlas+@8`mY~<}kxaHUU$u7!LYJKj;qKpgr^VpYCpM( -cQC^nR`It`b{wMoN7(Y(wHokT#F_%N0XIm%bAs7vJBUR<gvlAg_UY_mziZs(^zvgxn@(2#*}ZGWwWNv -%#v&7lpNHceL6Ihn$#Rksu>)nfgj8@Xg~+HaAz^4rfJeGx!K@@2h&@gJiz?SoeA_fnrY3$Hj`z3X3lI -)IwRx;`#h7?>SRswtZBebn$4V*Ig7iHZTJWFxi)Lt4!|A~rEU8rK4t+UR+GledmW7}56S2olGnFIy3I -COA=xsmnpwGNCQWX-?1P6lkj*JJwR7?LX6UH6PoARSFFQLGFi2I50@&+25b~ifVtE;+nW<oym6;<F`i -5{!mh8-&RF+7<IuJkLVOuT`4r%C=oi_~(%e_-D-2c2xYX&A|o;B6tWPF>!Hl+{aQn+b_f0=$>PMyQLA --&Q}EQy`nh-{fMdCY+5*3-9d@4lK;!3E|{ix_Tn-?K09n3a_~kL7po8?vE|d~7>S+Q@gyY+JS|$C{@J -HO+;Zmzl0HWt*+@``tRenI?@~NK=8(Sy)WvLc|g!+mxLvn$TV(1bUTTARC0R+2H1SLMBeqO*;D$?U$S -6H+EB{{f&E!C4F(OGj8|{l&kV)OohyuKLcbh6tMDU<Yi`?vrNfydom;cuBaIkO<AVYJkyLgqhS)WHVW -H;=CqmQ_C6fEDcZS^b`dT~ejSyhW10`?80AemPE=L<R(hK^_TzJ~czW_%P^&-V{(b=bx|3dn5w7r75O -0WF;qOKKqg2E{LS5g!#;4k=Qfc-`X_v&@O@z3DyhzY)ZxUn$nC3}>qLd_PVn8*<hcs1c2>A@uW)Z$$H -+Rx)bYNvCb3lrJI3cpT0%+sz?&U;BcOTN->P@<*d6DjuJxO;6w|hiTP3P)>N<WnwQAK$WRRre?{l5o| -_6ATVW&i$4;-3a;vIo%L4(T`h`M2X{;1~6>-(w+!)PywoZ7uxmeF!<wr^$_{mmBel@+4jp+d14k1x;I -IC?P+6#-YN;h4?7^h(hB-G--ZBGg(bEQSFJw(yhKrO<;AWN`JGWn-A%hrXt-Yw<q1A0G}9G->JsGx<e -(<t7=D7kfti&T{W?ZmJgwoI6esE`p-EnK?5Ou(sn}{?IPV3+erILAG3E7A;k-UFLyaDARi$e{UI#>iE -6XLO+nl+e?44?hvGS2eq_b?Z^!ue>*mGj1G>9enrM@08G9GB`9lfmE7LN-n{-W^K)Oy&B3+}#ldg&c! -hLXhaO1zCn>XoZ4FsM$L%5wtH$?{$P}8y6uM+IAJXxU}K|TdR-UR_2K@phet*6EEQBba9o6>@nN2?F` -hcX%Eg=MiGLzc^bf)@OM8YjC4{0&f#3cVsgNdl~((mY52#2pafSLt`7nWKC^9!JO?P*2PLS^N+;q<7F -{M}4SNbXJniK!4}S0HJJkj_7E1)Z4CJq^ng8>864-Yfrj9$x<vy5$Ht%p&kcL_9lVAOW;JFl8SDgq}$ -8DSB+n_s?yi&lj0rj1^MlV;eh+DQ181&bgt)Vs&b^2aS9=eK&_Q&RktH*s|Qg7PwEJtN`<Ej@r-Z}R| -F~{UQm$!fnXOH;csSX0O11fHM~XfN|D3u4xRt_w5D+V{Mr#epw};=xx0TtTYLi4KhKExS)O`Bo_eu7R -j@kMj(A11Gy6H=a^6h^Q85M7VG$3Cj;lcZD978;4ca^p(lJ8i@N+enkbdSSKQVw?%uRlHoJtmtC)SD4 -O>NRN5Wbg!QlH^a5$r{Rqk>5AFJ0;bYdTf?S9UP_rKpoQtzN{-($p3_{|K~wpdw^mS-J3qasg#?vM8I -DfXbF}Zh|`U@j{Lx^y};e<)%H98DG+QV#j(p^=0=H78CLns7KE@mw%_WID(e~+5OG}LP`q>c}AuS>+B -s+r=Ik#@vQc!bT_-DxF)%TV_nsw-Cf=!B<f+;5JkFc^B#cLXH8d#^Co4Z><L1)JaOx?aeoCNFIF^_ji -7LE(jzL3^ibSKT8nqT%gy8cc@-fc&o{*zG{}?OVO>Y=NLx$pi28`!p;$xIA}lkskvtDQ9OVteII<eTc -nRW?(+c}Mi%WP=4<*zYHBnodsKRif<@CQve;D-|w8^hEh3O~yTiO1_w+LAW>YSVoJ(Z-xWEJTE?Lr3& -YuQsUu5h{C*bQxl721q6U#Ry!*mj6^0~EABfe=5`U)FB$G<_Y?bXBWqTJ0w4B-DFH`_K3RKA`;zN^`W -wH8Q;~Y=yoN)b(cNuRXYhvJUh>8Lx3}e?R`1kn^B|&T{u@fV*!eWZ2oJ@~8-aHWt!1;KTN2-xQyuX6= -Lp+KJX>gL;$=6z(p>JxW0o9o!(zd`X8Vy^|E43gRgQDc0|Gz<$a%zK68~q?;eqEj8&F*ZxVbdSy+!YP -U)kksf+S8|4RatBLBkw;B8m=^@(c&X6Y^BimbA`U`jXQ-QzsMD-!i+}?$>kMIgtc)4I13s-c&eDwkv0 -Y>nARkY~i<n(9>84pY3IGXY*sJ{#8qA24uKwbugKtE%R0y-l}XGJ)XWdc0FsOaHCdRYBPk2E!u2^Hzl -)VC)EMfehp)dn()6=W8WdZR2vqsSp#`r=`vxC%O;?aKFQS~|$b{hT#~)VFUkdlJm@zag!Ef9*SF@UMN -x9R5%3JMN)y-i}+Y7;Cb|@gboRMugMIBDYB<=lSu3+?jmNoV-cm*i45!y$)&1eA_G*7@o=@D&420W?I -MOS|-7;ILjpbW`oNdlLdUo<>ut&W|`uwmaKRf&RQWwh&C@Tb9RmhVRCL$l;k^%0SS(S0li}naTgabP0 -UTRWtqlgW|{6u%?85B8?F;@j;K}IGhGvHS=P+a^R1@IxzjS!OmP{h7V>w&k;5Ix$8#|3N!BzyqzKMRD -P6?MKs-*7fn0^@<HQ7aXCW7ePD~Y<gx85AE-N=r){Tpwcu%}BGGbs_Ru+uX6_czM_%lqygRaJD+9U(B -IOU=@rJBcBOejGzT#EyD@(YR2v6?J#mP{)|ku?cu#YGJg<7zae&Nba&ZsuHAAP*+bH)HB7Ymw7ha>Px -Z%V|p4Z``KjWH5r$;`3*j%orLZu@$FhKSIviw03bd<mpT^ZL?>aEJ+qq9%gMHw~5xQshJk5Ej4RO&b- -VVkez#=nK3taj?Fv<2LBiWu!fTmfoKz#YPQ-eSW2v>d@Bh-GwwA$pVYY+a)8m)tjtGRvaHQXn`F++iO -aP?ygxx|;S5kxZYHK0IfS#qPWm$}Wt*3CsL7aSQ%#mUru&4s;pGErr;Auu(x#<ZSW4Z|R0eqtLmEf9P -Xnr0nIsD^wYUu@id?}QKs(G4@(|CVR7e~%k}-`O2P(5n)*CXj(rr?f$z&$GTql}R(^%ldilHMavqXY! -tP@b0XDhHQ#ple;wB+XCED|phP<b`(ay6Ko>!=&#YgXS{aZc`2jLFKw1WL`anaKU9n<VS*MI9@&1xS} -uZ8_xBLQKxU8D9gGf$8X;7i{ttueC`g3(Ja}Sv<LbrDu_&$(gg}i1gccV`~F}6|i)ipJz2?PtF9M^H> -T4MxGG08x5urt*bFN6-xe0OR8l)@bfv#--#wp#%f+Wc&!HM;X@}qBr2r%13<GaF9QP`ZA(vwVgfP%bC -rbIM{*F?qTjobqVe&Gi2FdTfHcZXW9?V!Y!i73Q^=`(Nkx5pPTKf%p0g8NnpQB8LPE~+(h6mskVsy_1 -ZC66AXj5tB3QC)nnwQmZuu4H`MH*s`ewUA)Z~^Q%J_;~x@zv;<(97g`u_U<`fm2gbuQxNuLe95M#$j@ -G{@6VQtE7vcihSK%~e3$!-9LG@u@RBF^q4h;Jy(&jF0<9lmdDR=q2pDo$NXZzX(+#T(vO6ecBy_Li3) -&e2CC%g+5N`lZ2m%!hDi|(?t09inz0cc{ahFi-he>z&+X)L2EnVzCh4iDBu!dUnJ~{ML2jLHSRcmLFi -u+^t>wKdqbFS5cC}p_NRn>pa)M2InAi}3T`|)@o)WFwzaovd;i_;|E&N2bohVP|6kw#&F@zGV_jN&uH -uvZul$Lhn<y2K)N|<ai#T6Fo7ztN`XAut|1S8S{nTxK++Ne>_a7(izvXLtw-2{(d$-X4EZzUk@BjBQ( -Bk_)UL?%@#CXibjcswo_uW&L%wN(|*uVZ2hcCUxVd0B4?8sQ`q5=lr1ot~$`TP}48{rpT=P*{lb+_qW -E8u!?fAr<^FLxo|zAU|bf7{_NdWm5ZK;WG4`GcQpNb=_oeI9Y6`xB?Xthr3c;6>c$b!d;{ob2<j@^;i -Jpjp5y0W$<l6EH=<=>jGRs24C=z)%6Z38)s(M?j^3ZUPbkul~Vdqkz8&STEoO0VM&?3s@uIX#w{OxK+ -Tle>4yOT>)PeaFu`+0+tGxFJOj%DFV(AFiF5@0Ye4!bZag%X@q&8fNBAi0uq_;D}rAEYXqzouu{M`1* -{OTK)?(EQv{qYV3L4(0b>P>7BF1EPysap1`4PaP$^*JWkH{S)dE&tZXW&`p<gXvg@E}2W(b%hV6=e!1 -q>EYEuhpW;uG+{OD=tNVDovM|84fSOpC}i{0n)l;y01b4I<w}eCEN;{kaLbPM&KTD3lz2eFTT+<NiHx -vG{%y;YxA;8dL~6Tc*KvF}@_@+}qtO`EL8er+h%|_Er!pz%!uM0)7_Y5g5GJ16~a<rX#dDUJ5b-U<#- -x9|eOG0|+?@ZYBeyfzV#!ns5+|xr4YH4Zu;LDisP63$S|^LaG4Q0L<%x>q!do6u@JkG9a9j00X*m^FV -+{x^j9>cV&0_Fmr@ob>rdJ0F3L-&2<260>^{ey+Ek}4+eO@2HFO|X8?4C&NCWtH-J4s)w_ZlfD?NG4P -ZVQ;O1VOo~-~a!BF17+zPM?)VqKqToeNJ8t?*uS3sQy{3^h?eF!OTry%(NzwCpv-ase7X`#?=0X`kzL -!q4hEP(6#5i%Lfaj(R>Fleh02l#g=0QrEg1bA@}Ax{C`2rzCi^b>&V0NMugaPk3u59%zKO90zNaK4fN -nj^RygcSlu_-O=Bt9pR`k<dnhdkw(oNUS)JUjVhB+yGAkI02Lr@W}w*j^yFI3vf&n=T{G~Fp7s+4DeZ -juLXEX;Ee#ohCrG?IQ;>dhH$?b06X8s@j!rY48;{NNH>7(qPgEFfGdVWp8)1h0X#KalmUPpW4IfCfZv -S-c>vr<0MqY=z7g;YfOP`D0Px{a9Jd0zBNp0wz%>A$iRI;ORV-d+%)>-@QVV@F(gQGUG?=?97_1x3%Y -YjQDL;Vf2Idz4hU+*l2s_0SvH;8j0j7)r`T<9{XbjJz0)W1Humf{7zz_61-fDoG4NwNad@I0D6L>hM0 -frc%JOCaF@R3AL^8$b`PKNRc=Boj2nF941{Q~@E3Qw!^0Ow5Q?y~@noCY!rxQPWg50o30TYv{Z`2b!8 -Fm*bVdr#mOpn4XRA*F)B*Jtr?-URq~8uY>7zBCQbx^UhRdZZI#1Y8MlR66G?7GPmIr>7X;DuE-+%HZj -Va8)KR&j{zt;dL+z;LI$L{~*jXfYY-f-8>WwR%G*d5$+fGNr0ELdH7cWevkw1z<e#h=v?jw;f!2P8^R -~dkZu?bK);7YxdONkR3n%tS)d$(a)WrE0yqMO62X8YZ2u_e0apVY{V3009l-k*a5`rI{B40~8y6B%v{ -2L+fG;iN=C1<W2Pz-j?+5s;Fb`ZrNJ0T2D={2^FBWjWs{y`U2t0%Ny8w3;a`(FdUMb`}s+U0f391p?A -gn9~*%EMs@g+PQJ;2V7iMj^xMS-sdSo4^uYXCoboag&mfc{TFJ%#ds@K;bH0RIi(p$cd}0j~nsVTDLT -fajj$<>x%W`Kvf>3jikLo;@&60r=7LqTK-4@dX~QKfu*5@UnrhVl~hN?hz)u1nm`+Pb0vypn?HMIN?> -0%K)DYFyeKncYsF$obfsjbJ-h&xWC1DQ36bUi^rP+@Dot^;QlngQ|~~U16~i%^d7he+zfEtdpxd<0I9 -&q`-BXApNA6-u<U(akCp-K^G{xnLIEz>4E+V*#Q+Cy;e15_{1TKB`q>(Qlecm@5ncur2<E{b15ew57r -<iyT6aP_1~|g#-GnRy9HDVHFM9~z+s)}&12Ak4@5f^Sp56;>1>gu@-v{Lf@HYXT+Q;KP4e-7FKpU8^0 -a(AEn<MOZfaB2sSAaT;ZUA0CfX@LzIvj+*D)0k1z9TX7FwhU_oCa{`5s=#f-wkl|QIMqp*8z+;0d)lM -D1fU^@ctL!+b6mCy8vT8h5iii5dfb7RSftVfGMXSj{r9V9C{l31D*uX{WBPQVEzJ(1NAP(1u*?HPCuS -Iz%vTFK_)?n`~1Tptq}es%n{-~bHow$6*$6i0!Nr9aNJY=w7?Or6*$7f0!Jtb9QPzE&u|>~97hNoA@1 -)*dJsM%%n|-m;0X5%9N{^EBfKtfgt+e#afDF<$Gw-61^(Cf|M$nww7atPK@dp`+7q_6R)A}SrF=Qf$( -;uqm#hYJ99L}wi2kYpqP+wV*A>B00S;0E0pi+WxT0k^3U<Oz--<b#6KKU8zkH|S>TF)xhWW}i%-?Lod -}ABt``a)--G;f;iaE}+;DZ}V3&@p_c<04s0`*qt7ZgqUz`4*CE1UF{i$I2TZ_<YrgMCPozWOcDtDE%s -o58(XlfGt~f}IJM_4@4!a-UOtkmp1LDwa{{e8a(w-@t(b$=I=D$+T(HNM>dxvDs`qqY4V(uYjyvxstr -`#v5eQrcI=>vXY!Sb&6cSew~P=l>+7%Uj#*+4|$@hz=x>z&6{_WX^+y2R||Zu&YQPj0Xn!ytF9iURhP -heUp>ylfj#&I{k(aomyT9dRWUsq7AxW3MS3-z+0R>0ue<=B>0Y6qcU0Mk{?pU1a{Xd-Uv)G+{pdcSzs -l{i!2BxeA^fXH`J1iaW-$++>$5H~_f=I#_i}?vEc~x9ey)f3DYYN1Lejtt>AQOL@>ig1Kzm02lB-Lru -2wZ*7^uHKafSgLT+M>;LGQlxfPcSLRY!q^bW9)R>GujdUgUEC_&|>GT1kYTvFa$eScb`^y!zI&gQK|v -rf)oa^wnPPRx!7z!2E)C1Z@QGY|R?zKk~}ts>Z8F3o4oWqm*8ovc2&tvqtxjzO}0wDYItjk3mS>8r`$ -&z)y2)7CxhmTN7oe__#H>+M{xDjcdUuC;~m4lq)Dj0pSfz8%iPEIr|&chFT1Y77zs}S5O|HRG@lLEaz -%b)^AnLqoSfnVqzkhG-(of<dH|3mGO#-3i9^bZ<Doa*RnGH>8GEPZ@>N4QO?b{Jzx#Ap=&mHU`{-0ew -40H-%b{9zqmbpPA*vtS(Lt=(#6~BlA$EbS^U%Q$?E}G{KB{QQ~F2x!UNw<nKEU2x-se<fXQ<b9v)BWx -@5Yjtnc>wrzDfb^p)-FreJuRmSgyfDgE)%r8R_=Vi<2M>d}L$J$g{$DipbilHGU+rQ+#?X%x%S>E^ek -g@lBVu&^)^9v)6cjvPs}S}idc3@q&?Oqf8XPMu2bz4u=7zylAEMQLNm?Af!)Lk~Sfva_>^#bROY$HIj -R$xF6T<ef)Gl8+X}kfPb~WZ9fJ@>H&tJZFg|TMCDh_X-T;*}|D*!%8#R`@}d>{mL8?x{Z?lJ1H5wmy% -JtDH(E*k`YHJnQ@qsxRVs*GD;?VMM)m0Dc?|X|M!&4s-a}&1xgAF3rSg78CkJn1^LH6{z0C3<{7eT)h -e=j^=k6kYp=2VU9)BlS+{N-Ys<E7-AYdET0@rnOv$=>O7`s8Lk=7`Kn@>1OpYBpMoykQNk0GlbMnO(U -yzI6o+c-Lq2%kYzh>p4wzii1cJT*t?lL9y_4VY^rAw@=;O8<3`iCS!+CiaF!g$FG%8fTv_V!SLHM9d6 -Ne7er=>#&LK1^296=WU#fSjbq<o1;Kga2OOKOFpz1ph|xe=qo-4gT|~A6W|iSAqZc!G9(AKMwxSJNfS -e{$s)aec;~;{+EOQx4{2S@P7>ap9cS5g8y^izZU#o1pf_A{s;8|8D0xz{eBpiSqWLQoRFh1ZmQn}mGH -P9p{EBE`o#o7&p%A)4=V_*|A5d2C;$H7zZduq2mg12|3vT)Vb#O9pUwyWOTqv1;QycCe+T$K4*tJ&@( -;pC5>#a~2pbii;NJ`U``}p=@UQ7W=-uFd2Kavj{Qm>|uLu7po&1ybB#Cr}I@^;}kT9sWcaft|^6QC#P -`~>K9c(6a!efL!yo%5j9}@b(enO9Z<>X%j{_g_+M({rq{O5!J<>3ES@c$9`-v<8ofq#f|#aZzGE%>i@ -`0o!PjDrv|A%w>vgx4U1-4Mdp5JJ5lCBF=&<hKcwG(1enr4^K1{(zD{j!}pIuHb(F_#XxSCxZW3;D0X -oF9rY4fdALQ|61_B6Z{_q|7XE}os)m1NPz(G-xd7#1pj@&e}C|QH~60p{vQVa%fSEZ;D0;#|J=!c^Dm -iy&PH)@qqU>8I))qX3=IkH)vM1~hpl#Wg2ABECB%&yrPU=52<_W9BzWxD-f{>!16aeK0T7)oIjkQ#7& -}%Y>=P2>;uA(e@bPilQKPlV{n0^4NUxs4-jEopP0+^a;=n)BHL!nJ*xkuZL?$FA$lsW*ft`~F4&)&O_ -v)$XJr?~#_z4MyQ3=W2I|c=UJvayz4*Dd6|4~}>9G8&XwPVL1ZqH~8?xg`D4UX`W1N=L795<3V2xAU< -YS4e24sEq)@87ZeI6<26PK*KkCy&x5-jk3JpOD-I0|*N2+_{sFk54xv#(?&T?1S*TG;@%Q$$<88@rj0 -ngv9v79?cwpecwA-_@fhb3Gs=##4&et2@np@zF+77BjMr4u_)wJOCEs^MEbGt2gf8r5+}wdBr+yg408 -Gd{mHt)u}DG!gwbWpn2sGgf&+(r@?GtcV+X}U1owdb9b?8Y61q9;<5cdd==S093A#i`<uN@N6Wzy%;x -THtRvY1}at|MsoS2+wh!<2kZfY{bMU9Rd<fibtM_6E58FX5Qee$qDYR`5Gg`XZML=qDdMnOSpveynB5 -+3R4s_b9@%ec`{mZPHL;+pJ}lSgaE$F%owzYEZ~WDMP)Yl=TP4xNmT@pbWtMf<o>P+Sv8lRc&n6tGxt -zxLyk;}S>3Kv^TiIeh-<)qcYgwUCYmCu<B}$E?A8Xk=WBp}93LKM=kS3Zfx?$nX}{PT@n+7_`G%Sd)b -2Ut$YuN-GyPstQKcfFM!%?~&&gx1w5=<qF8C7V_N9<rG<-n>cYIlSdYr#yVt=H}dZ$rJ3<$r6rE6T@p -{$JiCYt-48Mav~&7XluZ4G%MAGdpMLsj^4xRJk>{U(p1kzZOXSs8UuCkwM<0E}<iX9GH#1q`lgc;9b0 -BZ50a;=9?%m|bkt0ktIRDL8<eP84A?MGZCv|mo<idpu<d>f>GTGqw-+w39u3aN5E>ZFU=#Ty3)Xom-2 -_4-~=;)wcR?LEqZa#E$Pe4caI`N}x$zZyTOrZP8!}J7MLC=y8=(o^+*E{)#4lxNv^k(R6EBb@~yTE@e -_)h@;_k;h3!T;mn|9SBLA^1N4{+s%_zvPs^<dpxba*BM<cb6_*dLj&B7lC&P3>h?N(4B~Bx^xNb((}$ -9>h|sLfN~bpD>NjeZ^$4&wW^;l=)3gn-M25e^;7p46gDV~bnA6z=%DUigZ#ijdtcu>y7deR9pvp5dWS -I3XhQECq*VHZf}egJ+WU41?0n}SZ>7@9)7{;tpGwumtzDNpyL&6W&|r|dM}UXIqt_t(x_i1~_?-e>I) -cu-x0k197}T$xAzfX&fh~CH4tj_`tebz|-eH3Vh2hOw5dWQFVZmWxJ;NA(-QdGLeLZ_JEm^F>bt%FR0 -JxI2H(w~6+@O2h*x!TC58?Ut6y`*8({}bYKKTejJ16BXV*T&<{*?)Dq!+jR2lVLC0}~Y$UK!WN)6)}L -7WSMdUI&j?$U{rPjt$5u{_px+MYuk<=^oP+yGJbknipSuaT@eHTP|L__}x!G{q#NbJ>UHJ<B#70{OY& -ge!B?c((`A}p8a6ozI}FuLJ>A%#E3zHr$7-79-+W=_%rE;d5s-&hdzD!^ahA&)&4g92Ht=F{iE)J5Ad -$1PMvxJ#?f^9_U-ih@4u(epVCi1{S+st=vQBTMPd9+(H?l9(9eD$Nm4EF`t|YS$6wg7W5?prqetV;2F -xcsGSZpwBOOQ!=Bt-bh|5P<@Tf?4beo->9og8}c!gjyc>DARL3$sBIv9mv3>`YO57Gy8G5QZ4JV-Zf+ -C+gqx^d%1M)$YheoMdm?mJptT}_W2JI36hACM8y{5<%1@q-UOSh!)shJ_%q#TOM7jW?Uky5-B4CxKjz -wBd1<u+E)3N0yb9-4_uNfoT`0)9FGn+&@eIufP6EL6%w3yLay)kcP{D_~8dySy|~w=c7lD($7BojL`} -C!)Qmmrly9TIdg{TktbP!%)=m*x!->N`R7I`cYi>b(v>S$=r6zg^6Mv`e6s1>xpQAZT$j-u@cB2WZ$p -5F<>>d%(hu?!#^q2*zpRi4Sz(^Y3h9^mka1bH<V99MvqM3iJCw6Is(*$4UAuNIgM91-Wuh2)*tv5jqa -Vx1=bwMh^5E;Qzh-)*5$gohVFpi}IKdRw4a^UOm~U8j(9fYmhZy~shfx11=EL>t@-8#}f&LFLzl!!yh -a>(B{S6Hb6uKc+{-dL#`(Qanh4ddje3)+8vV}sPQ;?Zi9me#>{5Wvn08>c&{{8z|T{(UFG{cbxYy+^o -VLib-LfY2<M5*a>N=F@`H0l7QgZ5Awwu91vm6T3ANa@?(Qu=#C!wIM>-EK*_6aCw^ZCeo>96SVM_~p= -EVtz0lkX}r4OjqOw^8#r{9P|FmFTZ38aZGbeZ=@H?0rG-$WBOwrzkGpG-KUhs9;Y<sD5XQID2?0?JnW -|QPT-->$CUQkOzHBolwQ4hb=9AtAKH3{Li%MT=Y_2Pm3o5p0L#m?FDV^+n$oyWApMaC$b-8MQ5pd}<e -Z|k;VPx+$0!Zo=2)7zE&4BAx`btUS!85nFDMJe$OGiV4ZI*NSdNg!*7(45$27-0!g7P<AKP6RvoV6k1 -O4O9a2`gVr1Wl}bvW=a1j>#1G^aoF1f{`S#s16Nq#ybWD!2bw{-Hmjs9NTUT+T6FF)y%OVcC%Rz&eiQ -49h*%3mIa)z;Dvml->h8BtZEebBgmYvYOIihdB@7P#5~|q%?H<pQj(%;uRqwAwwV^mSa7`wxu;bu&lR -LzA*jK9{UCKhwY5>H}yQ!QRLwZN)5n6Jn*pQM|wNo&!C=di~h@(FH`7enknQ#Rx%&0<w<LN{PD*h^w_ -57>1zuT=(7)xqEF|>G9vE#j?yXTD4kG4X(ICQnW)cDW=6>M`2era*e3Pa#_RKdt-MY{i`&|}xr~0u=V -eh*QN5r&FGl*YoV4Tv%RQFsmVC&(U|Gj<^i|bb`o_Ew^cCAk`a<5_j0gN4sHOB?!9&tllp291{bx?~8 -F>)(c_6k)(58k!o759{=&_Nvt?(7LMt`qfy&UBq`grW;Z^#d<zt|thd4cr-^)e4gKeT(a@*ipRo%ti^ ->+?p^mw|`pfd~9jq5YfzJWK~VCV#_ukn1z@AlGMXlLqgDbl*j3KjZ<@U$Y77|9%$Ck=E#k_MVl0sB6n -n9>O{&^C9zsJYav&R@p-Ov7KC3sHN{e8bjX(9$o_;Ub1rf^Da`FQU^RplurAW*Jo^#63#T$XXHVy&&Y -#ZpRr8}-NJ&o)RKOzXV|}hoaIo+gRENe(OMmmdBJbP;$if|1;gq4kHpZo@_~oBBkAw;KhRTGI1kCd!~ -Nd_4^H(tLDXmM3En0}ALjkD+$Qw}9(r$SwOwNLgM7bi$dDnuKt?G>`mtR^h-C(OK$%D81<kOpmE|(D! -~Pa!2K+V`45RB84Wl0b5AOjFZvqcnpUI`aU97#W#-<kd%!WLPmg}>SG5T(6oqlXD<nlj!`0zfM7qY_o -igY7wNW07nw*A=N<G2RfP3)_%Z^Lifl4!aKcv!b+I9;<KhQ13tw5-p6hc;<Nww5lNGn$rW#?hkLaddH --j@oVa(JxO`Gaj5}jDbSNXp4Sm?^*c=dX^*INEbq+3F*fAfON}wf^EFBe2o1s@`&YsSLxmKW8h&U@UV -6v@BnoI>ofB3vf$wv!9xY|@X%=bcn0v0uA__6;u#P4VVgAENyZqmr}grWZ3gyXC`X`r^UXKuJMX+hQ7 -)2|bDrF+o?N?jjaI*qN_P|urCSSu2dE1l0T2Ha^%>iwmuz>_=Ph^BmF7|Oshn8)M3$D?frrO{hb6$nL -f`?vmNLeJCt7cRkbWo&to%c{E=FD+d+ag#?z`_Yer|^knHTgc9s7vxEFMZLfrl-?1FO%#1GY(WeO?W1 -(kja+`VVs~{TuMG9C%m?Jd{8=Dm3XBq1YyAon(xU>RNCAk$$=S$Hc_+K^l<0($Z1~4=wq)886qaU8P^ -|c$V&27Du-iMbj;!K7Z&`pI;R`JSTW~63Wr?Ia*ql$$7w!$r#W-8$mt)J?noDksH4t%yZ~}S4@~NAt5 -Ix=OEIG^%3j9qD6}s56<Q5R(XOD>r~4zR%_p>-S0bO46M)PqCU6yZYuvE{h0T9y&m&{zV+5yO!h)qrm -U=t&Ye5g!Nbk?xLKayhi%f@MYmC(frnPwnYO+lOs9&9iXG5)(!PEB(&Xf1`r2!+QS6uV^75$FYNgATE -o1fii!Z)l?GDO9t?`0%W8Z*n70N;=kK%X$KdjG3U$@b#S75yH%3Mc%mSv1*M18J+x^OG{w{G340$FFW -O#grZ1MW&sPtQq9ORIx+l;y+AFTYI3j~`DbO`1f@%ggE0Pd`ncdg>`g503AVUgQD$0_-PbK5z_!JYai -@<q-QqjAOT5M~}aO^f%Chug-0fG3Ig^1M4%kNzdjdBKfx*e~lP1qAW2nu@K7-l=T%b?jN#l-MV+74pX -qB`T6-2>I6moxN+l{jId|V9#$TZcBB>aNG?}$ejtBX_HdkoavkOc)(5Q9tUg0NIM?U5TGZ#N4KJb`_} -uLjo?*j=J@w2p&#-wAj9b)YT2N3xr%s(pd-v{5`}ONbLAGYJARSmYoE7pQtCqZ=!ZIa?jcx1U=V#KbC -9%*ya~T8s=XVyy(G7o_P0t)!PaA&!{RHIqZO=cfT)C1K7Z?A!V#Nx&WXY1>@4N3lnw6Es(jCT?tSli9 -STB%Iqz(CK$qUXwU_XrI9{XslD>xs4<480^842?ad1>VX_Ah^lY4m63f6z13-PQlEy>kzas=DL&LZo3 -j(~*DdWIFAzlkpEm28i0B85>9tlt39K)ggoel_jnukQWJo1VR!XZ9o`6s|5ti-Ce}Q?(PjK0@d=eDN@ -_9sUSnGttqwBh(%D)X4K*I_c?pda<k?|OsD^NW)6pa+<SiKcYg2h*_*PmvUk?3S#twA=gyt0J34LFaM -xXTsa301>3zUwnA(n62lPU}srix{Frp9W2>Oty@AzzY?m_<SxyAY$x`q6UECtrBTXzmUojG%+s;Q~b` -@kBY|Ni^$S9y7P`hE6*HJHvCOx{Z_MtqIjLnk9L#M<1lMNGx_#g;sI=bd*>Jap*Lc5;Zp(2s1=ktOQQ -ya!#>oGU9Uwf;_>I#p$5WvTJw$LoFIbFN8TM^Cb4bi<6u5%vJN!XC4CroJIG0k;hlztHr{y0=c8I5Aa -txDkCmcI=p51N@<GDEgt-;Pd&^tXZ?PZ0+B_U(*k-;W__@Zu9{A!~4Xh$PckLdVmg~6WkXYEVSQ{`)o -`}Ny(CZ54N?nb$Vi$Px3(NXI^*wWB5uZUxXgnTP3jtr;4>c$bKu4H!TDBD0pnHG4(|3C_Kgfx3;#bXf -&#Qpl#dwI(RL7>J;0yP<&*K(Ef_N*Wiia9s|X1bo@sAgZ&qM+{SD4jS*VdZ**4VRL2s<#l_mTimq$_h -OI%qjU1u}=p}oCoUjMjWOqEo|G6)F#D3t<WxYJ%0=qe4fV9Wycgw0<hTXCaZLA9!LKhku8kE>9?Wf%h -+Dzvf><qSuhWwBd(V?AnH8wU<W3+}3AAYN}$LTlmzwmn_YcO`Pr**(@Y>@bFohKku_}U(7`kH?B#>5c -dI><e;1kcf-T^#1Wb-s6_-!1>xh(sToxE4lg><bnwP&;?-)bj1-yXkxnSwhx%jSql!gO5mDyYEZTuIY -E@zv6qgA(!|d)?w=X*bi(S{>Z%!czgKpVfD;2&uDozI!tHXrZ!L9#A{^6;0IzepHE6k`ZBb~>391@cM -Ri>ZTi|1x@B4Vde+7FSsU~sTi8z4VrZB6^uQqH{R{L%i|Ch@fAQZNP5#x_T1?H;;CJi|@39XClVi`YM -PLbFP^<;oWsbqvnLg=v*MCed)z_X7-xL4v8eEQ!Y%!ibeOlXHc!0hl@6eAPh&=8eLfSR`?)s<LiFo~o -HQ+mmU$B430saWz36IG+;XV6c>bvX%ud(^qTI`tQ6dKo%H4ioInto)rFFEf`-rcr{&rRI|KC?z-UF7J -7#0Z_TSNPR$4KeLB9-sNm|8Zvy&OHpt<9JoQIF}QvR(<YCRyQ(Nt?KZ2GOxx)`QH$aNzORT89hTZ4ok -SdYu<WiJUJBf*Eyq#jl-NV$r+QK@pfk%?TneuSm%r?HV$L#{<|HoXAq6^J;_cV;prn*q~0g}chWye$Q -OAHqLNq-?5#0Zip0KY;`3+v{r(?HygyBBKF6>*c1Fy7hsPzS-21OxO0B%8RQCB8#zrj|OyQp2D7D~qr -Otn(Y3Yjw*81%cBSw5ra=YcC(_Ppzi8((Od;6Z)rGJZEdQ0N-pv1OIB?jg<40lUUm3ZUIl6PY`8MRPw -zVAD=+;i8I`s0U6Wwz=0Kj>rr?}!Z#$(&toJl&i%G4*pN=D#8Rn%La4VmDvn#$cx4jo@71E7ZiP#lCr -6srHWsg!PWbPOo3T-uKi~Pvt@bu@m_N{t>&5FTz$6%Mz#X8ULrv@4Sf@g7JWNQqu<Cp(YQ;*5CZ(0Fr -~2NWQSt<oD#c%u5^%PfX53+~jWHWk32?4DSOgJ9M?D(nYs+B|#qa{O+?4iDw?*3I6NyKi^W%Z^+ek%x -z8$aPeiO9=R05O&`7(!+p*90k=GY4}mjg$oOV=nH-Hzk^I#sac-{r90vPO3=A#!pO<$R>lzsKU~2Mae -)^9u#c)sXHZ6}AVptm(5Ap~`1=a~pIPdrR(lcg${J7-%C2QBNUFycWO+3p;Y#ptgs%weVbEzY`=LdTQ -Kc1T)k68{z1J(z|gglNt7PAj#e&QcDR+@;vLkq3N!6!m1WA)hUS1ze_A9kk!dCX0a$4mz^z1NY)1e{L -KFL{!0_wL=fZaSD7IcKDSw^36CU!W#@cxPF^nBk>Ql`0onCjBXfwV@N>o$mRGE2^ujOX}+Cmb$T5XrO -KaFKE=)!I~lt-UrS^JrsEaV*=aQ;NVL&`LX`<^@W-SEsyOtvG2tB6S3e#44C~t)sU(2F0dkMn$*UPJW ->}2UjduY7?(5u+D9MMb4_>2<D@@y-+yAV&6_v-_U_%Ai!PGy6Q8qgXn_ZeZ-fdpZU|mQUG*1EZM)II7 -tjgt5wOB~|Fk#{Xl@$~cI%dZbZhnM)g@y8ml}M4ynx&eo?v_6#r4iVtJi*(qj3W2(=ASYeZNa5z?rr< -I9Z)T15L}L%)3DP+yCjV|0X{}4~hBRIEx#*gHQcoMrU8KHO2x~w^3-Qb+ATP`-1&r{w-U!_?~_C*<7$ -8;&JFOd9^t=2p#YOd&Fln@Z0F>n>x{xJi279NBd8VT~kw2($LUQ3?H^{->&T*b{F4={YMty2eQcAZp` -U}i|5qki|0ir66CRHN*pWeYkqtRbq;E}@R<BcbTM8_PsGB^-mn+HeIiF)efONY@{jX3<#EMLdE8SwkL -i2#|8oD~X8zpV+`ngLX6m{t*mPlGp?duB$8~-OO~w`&Tgm>wn`@nKsn-L`)UP&7(PsgSJO-;DRIN{!s -rTP~Td7{+pUIOa-<y?{Rn0nTYimmvFJAm=T3VV~wrrWM18>{5P1i0=?gP&m;lDZC2tN{iGL3u6_udfM ->NEZuH*VY<(R-Z-;_Ja>z?LM=QuF7}*X!=B)||LE#*dq`m2!K|J@@?sf8jrKOZ;&OERnkLj2Sa@{S_L -PFJG?tjy*6KiID+QLpJgte&X|@qM{`t%M}tM@xyL%{{C{R(eO%mzoVd_;4~NyHTpSo<|y_8d`<jv94~ -<HMh?vx5i^Rf`c(M2M())p`T1o}>?a%jwb7==&pn9k;5W5gWRO}qxCZ*+#u3;9>;l(83%tN?V>6-i#E -BEzJp;oiwEl11y44p51aeKz%|1iJk|j&j*s){P?Afz5ZKm#L@FBj3+!%Yoxy07iR-OiS#{lNm^D`&*X -TydKOSvC4d3-)L2W(;C!i5@RMlbj-4IY>pFYz*%3URxvVec)>9iKn3hUKnF;E&47%e8Ibtg5LivS09; -bz_syo;`cu7U$OUGmqFBZU1|s!^FS`4<1ze_U+TPVr(NdCxa;ta&A38^BDh&EU{h_gQI%}mxKmn42*; -N(~%=b%sIiq&K+O>Kx&}a8EhZ>+|ts5{9P7aZ1%+JCxdPL)@0NmJNnh1ee1P-KDs`$V_3J}-qQQ~&93 -{myYcHhv7Y$+m0S4TuD4e@#UGCD?K6?bsf~?|hl0W2Ct{;Mc<#C9o;+~iKsUP+4u`MEJxX7A;RXG^eC -M`MC^W;etmBbLMDM5ZVeGT$^m+I7;Ay8$oubbAncSm8<nKCqNN$Y0MkNP%_%E?@P?-{6@42XNb;MlHc -adpgI1|qpox+wq@?I=wB0haX!kX{C+ATiz;Deb9T{Ah6I~Md^j^)5dKKg<i{#g29Y!i9}t>*U~?Z4iy -o+ypQhWSqJME*$rO0Gbzk|w#*ZlMdTm7E;fk$>iGuAQM{oNJPU?YSPi2e~-87r7sKA9-iG<ekJY#8l9 -Y-J+4h5HJ4n>E-$!?)Ls?v6>Eb1ada`$3EeM%o)^|fBJxqw}|(M^@ufzb;&ovdpGNQkaJ`U9qiw{dGj ->RjSYhj9c=-1xPFq(CyCvO+sPZqo!0uN>p32NN2w;^%bq=ZbUerz5pXs35_w6C#oJG{=(vAvemv%8u` -j|u@eA5+fyr@x!1z+y!P?2{QpZ`%PjaZA6zch}oBc=ju=U6(d->2q4{4rar`gNDy%JQd>!<7UpZltQp -k90Fd9HuaTz~xdaUH9f^ElXTVlMUrd+Mfz|KrQu^3V6p{+lyN+zUU+{P-jC1n!Mp7T;gzz8*Ub-P{LW -fEBSOd^YtYt|iaLcek~*b-R{Un;f1pO1dY>>7G8i`A)LaZ|D7Co@9^LJ4!$8i6^cN<1b|BS3GZRxO^6 -SasW?TOY-nnGI+(a)^78prNyihPg)z{eABC+v-UOTn_m5twPa6*ucE?Vytt^^TUA_CQZXsDvb^NJiu? -k9v9DrWabbRWX+`N{E5_xQ7T@QqC?3D^?o@BFucYuXe}(xQo0C%S9-o#v`5RyNdNWp(S61l1#yP;d-5 -a}3uB`CqSC$v9sCHh<JLUf6l`@O}(VX(am4!wACH{)|hwhIbsFF+h3!Ah2EB!^@BL1C}>Z_Phva)oUz -dY4jSvV!1Kf^dF^)X*jg+Fz2#)MujzB&1X-e=F4(2drN3GqeC>x>D8pObT@<V=}1ZN}{Bd3nx%zIr`$ -ulbwZ6t%5jQ?Mm?G}s=z5cGz|gbKn{;Z5OP;imA>@R{(1aA&wHJTj6J852p5WJmHM1(B-ArpT^HQ{-s -G<8>a?XpOS2Hgz?5nnyN!o5wV#HK#XcHD@>HH0L!hYA$HDA}!IQ(UZ|L(e~(tXh*a&dNtY=_1GirQFe -;$wa3_LcDkKqXWKb;p1sH}u*>W!yWZYp@342-mfd8x*hlS?_8Gg~zF>FQo%U6`%l7C8OImvV6w7OkvC -^z`E6d8Za;!XSkyT)oSyfiOwaMCH?Gm@&WVKjFt&`RntKGU_by%I&RjbSL1V#o%1yTauz?eW<AU%*3$ -PVNL@&bzj1%V5Ju0TpKJ(w5VrFnERct-ft5$p<jLL)<?LMb6QmKI76Wreasd7(w2f>2qgDpViZ6xtE$ -EqeK?ebxT|?Y~e<0|XQR000O8Q5kVeH`oCsw>kg-|IPpa8vp<RaA|NaUv_0~WN&gWWNCABY-wUIb#!T -LE^v9xeSLr1Hj?oF{uFF{IZ}>HJLz`sIbW4*>be_W6WeDy-My2&DlJkLYl>7!$}fG{&wld)fOw<qw7b -81^lKf71O|h_U@#cW3^q45gZ*mxQ0Le4Hi-5I!K>YuueRaOAA|FG7Mwh^^QsKas#$xN)LHONwJOu3&8 -sqonrB%Syg%GOI66Cs+xs?1$~4$NJ~}@={OaTR@#z^pgmN4CVp-K~Fs;&T+HB0~Y60JiBAX(hCJ?XF? -8jBsl`Y%szAf@A^`yDws@FwzCF|t$BWZ%BO(*n27SAjB?T4l+<@chxzRt^Q`Lk-|x8=iRS}m4&p)jb` -w`RU-^FsZqrZ-u;(bf-p8v%Ue<EGfi?x)$Z4G!taL0wn%UJz^s%R0GUBzr+wLAP$RnyNwhU=$oxW!KE -=YFSs)tWiic59({1)H4maHd`#s-}miZoh&yTyxMu4B`Nm#Q?QdmvRW)2CJF=+x`QVh$QRiLk4!A<eVs -QrbO+QTjInr)6i!-MC~Ddo;7r<wW!4O-3-o;`2tEwz<ZhCe%T+rJ&Zz9+@sQASKGS46&nDQ)q^VZ*6o -9PiqFQDpefgov;mf>jmw?qUxL*|Ya*AL5&>AS#GAi%R&rjX~Ul&<D48BU5Y`-dJ`Sq$!+6tcBCPfa6m -u6+#0}INxNnT?0DOFu2b%Vb?p1!9+7zY27FTa7Y90s!nCJ0QD9#E_D$5qv4gN+Sj<E#e$5&RrqXYG4> -7ELB)vdAVAD76Vw^b{slUS|tHFu;~^6tRh5R@DKP3|<5kjZsn{f-ok4ZQJONVPNW{A#hoI9S7m8s)E; -};AQ-37<?JLig$zYRRSHkN`ATwsT|6VI=jy9VPwjn$+AU|1Xp<*%#*x+fDx{OyDYd`<wY96)73JlRxl -lBL9<9eFx0^^&tN71q`P@Ood+m;7D<_0XUSEOp-kD>KmPFHEs&rNFPg0({2%h8$>{+;&0;a1BYFztIQ -;tH=$tA<7k9sm<L%4Ai*V!Muji+4C;GdsU-t0N#odd+-Y+2#f?vJ}!a=z4-NEVE$-zDpl~1AltvBJu# -_7TP;}duuM&mDEk3ReR<!JB=d;@|gip=u5LBRry8RShz;O!uv1<6%|Tol~pMG;(OFyn8s5@%fa_Yo5H -tGA~I6OgWFfbZea`5817g%RS%Eh8p_H$Vq^Ch<h9=>d}qe&R1Le`#QRPzGBe5b^87(}VqUpz$}<Rh)4 -b&5P*G$(Jdx+3a<^H5iB<ALQ*EMiTx2W5D?7+*S2F&r9S|pu;?CaQHW@4g;|xL=M`UzI=@+I%EM{Y1A -}Ko&ItcF9yF5pjW+spwIw&%}nzC@C<oG=NLgxMP2J1(2VPzF{6$J?%6#xsex6acL5A@dhlN#0s9ZklQ -7Ci-V&;4%&3i$XyFA<g~1!7kY|vsz75{|3v^9u%9%LYJ0VRzHdz|9RnXw9hLxaNUC(JCwK0T(#7SyS5 -&G5gwZ*D}6u0GTo6|xafCnq}4zNnI8OgP5Qg@OrY6g27)O~ynvT@Sk7cB;RiZUsHUc}eXk7b%q+i0NP -)LFZ#%OD+x)iS&s;+NYpykw|#)~t$FF5mcM0Y6Mq#*3t#&H)o%PiMj6Db12Z9${-Kwk97V`uuqMGQ7m -ugI`~1C7^+_YN;a5!|-y?7=Bm-b#(EQ6-{Oq+6=Jn6eZLwgGo5ejMoAQ14swEYdOYseW`Uy;D+`0o&= -Fc3t1;Lp4W|sHf}$lJ%ljcy`*+Qri5R<{%jQPIbu&BfD#rs4}Y0}+KkqD8eE+t<5^y&_%^~i17D}c4% -^X^yFhd#+)KB2;qxYlo;QOqcpgN^4Z|RW|6<f&qA|XG-rzfcOz`kufQSuU4jhsLt+IQY7kD{;oE=m-x -va*d7exZ7K3BwaP`VCbK4SDW(J;dALjici|MciO60(}pqq;%00d>1kLrUEU{vU|>NRyTE*kGZ6<c9}T -p_!yv(>77}yRIr&YU@>zH9{Obd-m)b7}Nku=4HY=6Qr=J6rjT0Ksi&iz;ZqTt#%$=fp$0y@T(?aHeno -U&}s6Y008cf7+3fn6f{qkS-QQm-DDudk`|;Z)>pL=B+wQAiR)}xB-1Rani$K(Pz4xcC+x-nA46$+`*` -W30X4Mc(hY1c+U717y>P@J78(~>$#3^AW5zuqfRY><-A2LBztU4AAk(E;&1U)ikjf#)674%WEkShT_f -SzHObl-in28($2d!yBRKjV6`@e`G4NP9fVzgDX8j#f`e&$q`4G>{f0}|H2l_wJ439<^bW$=gH83}pdf -PvY|WNK)R(l!ld0qo9bv4z=CKVTuyobO<Uf|iweXOTW8@v>S*27W^V?zZkqg06eq6}x9075n=n>r=-@ -gjzq7#<j*@kM(S9^y-qd1<}q6gof&dz*LtOItU>%@^W&UmA8=?S)lMdX_B_BBiM-pX0Y=GIK*F}F~@K -7x?LqOL2d&C(72-Uyk7Abnbh43P7Y3jKkR<dR}UJF#oYLesIH-dB$wz6wUX<FVs@WRS1oR%u%Em!nM_ -Xp`@4gq?<VixemvTLcW^qH1Ze^a0J31RWR<*lKpR0(mALgRvn<V07;xO9P3H+bY)~^q{%qRSRZt|Wa* -F!@A|qWfA#+CDwH_qJUGmTb%Zjx|qc*H+i)4Cy29J3lsCPxu!juGE3)aarsqgYKB$*n8o(_au_t6i`Y -v4bieqL84QN$ht?fux>(j`~op>^w<{pJGZ=orQ2Y`}$M3PT*3^_4<Nx(#gTL3qPRMO<IAqi7teU`q>w -DBaH~WQodBkfxw^qp&K9>MlzsFx0pZXK1;Y@XHa35ftpR1nSc-(ex5mBPv5bVJi>Ajx(Xd4A%-}=82Z -tVrJIW`poO7XwDQ=q#yDNy_T(Z;+TMT7-N^}$doXsJR(mR9d^ax707}cyP{4Nx5|>#yXhWia2F+Oana -Ny<xq6l7?-IS64IBZ?d0lVa+5toF!|u0rju0~FW?K12%3FOV+MQ)sNg?BqZ^nEsIA>l2#JAZ_jHPi=c -(CChA@Vgm!zoU7axaVZ_tVevIs4K4O#-TWYKj6IsP`Q8<5Sw8M6vi`PZZ1b3?BJ_9T&W1)_wwK435%Z -_!V{gbmMVB*Ru=$ir1T+x~yyKsLO=AkSf0ZBfJ}DH>k>^X&L&7|ehZ&}w#-Om9#w71?z%eL(8K4v$rz -q)m{e2v&?u2#P8Mr1dhwqWn(TY4P)e0D-3J7@Ic`GX{r>q6Xe(CDNw}FUR4M%=ED!Cq7YM4Q+|GoI_F -|@{Fu43^#@y$)brYjfNOt7~EnxQN>@7`YJXrBe6k=u%<`3Al+poRwBf4LXV=xEh{usq3$#^`JKI@1Pa -KFZ;<V%xUIlya#onZm2G;@;up|DvYTjk80-!@MW48p-$&EsFfbTaFs;-T@O?-XP#*~`T1}U+dgqL?t9 -pszv!yD#!H<cpJ9~1>cIgxP5qVgwrw2Mo40s>%293pMd`R<-<_#Yj*z}qf6)aL+Cj>9cBZ(OF1hmO?t -l!o3PmOixJ|?MvUX3_cikt;dN+!ww3V;N{JJ#EzSY-kj^E=cVxGRmp?pjrolb_1*PvZ7XdL5@ZDbY<< -%$&AxA|Nv6T=1>&cQy1*$zbuX#oPZ(VNC7!2;(O)xFMhzeOEw%SU>*y7<AMO<TsVZYIJbJ!_{fsFy2W -DY{v`~-I!ZVF*0Rv8*@Ed459`=!^3+?wSDu-N-oI?yE%s5?U&%UJ;7~y?V-`Cqs{QkS&>|O)ELRe<LA -vK0d91AlU8+L!lh}}qKxM<%>9iVyO@Ty6ImO7>dtdx@s*ErYT`sZ&P?-K60}W8e((`zytqm6yHBV+<X -MqIapnft%@u|AmX8tRdI4x;QJW4P#bY{0EK-5S^e$y}9C#JJ`w)PavW|(AA0t&9z&(L1eAGO_6V?i}W -8llGOq<cmFC>C6;YOkqA}Lf~S>A)MDBCz?1?(sFq8A9@gT0y-Aj|kjHbupD33BZrs;+*3c_lE%-c3N7 -<n3e<p%?=_3-*iJgu;h0KEquL{L{^6vdX|hi&GJIeth1ETsxU8s&rMTUuiXkuZAoj$YK*s&EnUg+E`; -t@)>PpG#y|vK@l#|h3*W4Y0>EW9WmqJm4EIFA#8|kUTj8Pf00n#Ffi5P$wXic?NiIDcq|FvEIyl15Z> -Ym!(=jcE8qh0Nb3S&D#dFCa0#phE!%zY55nq9sHa>Zly5@RqZ2;XAR7RkZr)WjsnWRJM+?kt#<tam1} -1vU6i2fJ+ua&IkH-pV&B4td>=jubZz~uRv@#^u39!S8&bR46YE`4nf(MUIH7XF^!pvILaS$Al1p^kWX -|ie<0YsCuVzNU(SC&CDt#eR~5@BHzHj8Gp1eBmQl>JzOsBhW_G^inN^90Rwv=Rzp@tGOIEUIZz@YKau -B`z~i5I8!+^Kd*>gB{)qr(1wXL7j!fN25>>oF;iA7OwAba7Z&l3YAs4jTmj`%{<`Z4f3QmA{n2{vduT -B*x@6C$seEr7)Gms`8$v0kV-WGWEYT+Y%e?Ep3Nc>yl$M3&mJu-f1_sMz{j3yos6ClSA@6_0==*u)H$ -x2s#vwzGg!kES32OgU;ZZeKpQ3vR5Tl4D+l~+gxwt<i%qq%U9#B&MgOV>R^&5osG=Fa@n_5y-bfW3*t -BdMLaMSG=EKgwy+su}sf>;$$4fqbdQ>E*^~0oIm7{NxqRDL8EMDS9pTC)}VRyQ!vy^0ue!@vFxfz(1R -gKGP*S`K7OWKX{D*#F;S&IcukO^uYur>C#3zTXmQ&37;4Kr<%hrlO^0wTy@9qFJ-+~Hzv3mimHqm0-j -t{N&cv^z0y>8=E`5k#5R3{1WA41^^#htr?m)5ZX6qcjzAiU0_yiJwz(!qnEdi-D=nC1B#;!?uB~X8>k -_LI?W5mR(pl^BGDsgsVV>+$yZ5AYFPu$udD&Wlb5j9!zF9SXlq6f>}g$&8m6BUBP7nv>$Bkp<1D#S;3 -<I%JyRxfWZl@0SP)lAzQNy)Uia2X!cN(8e&IPE7qfSj%|y>7Ay(^`vHXT6g|AMJ(jwGWEr_MNZG|hj+ -zrMY%Kd_Po6<np2hlr>O6#v$*IcZj2LfgSHS|x_Na@V(GgSlytcau63S8YJs;ULNKRVIMcd91vW23<r -i3C39y;Ujh$vWTS_vP1Octmw2CvmC0aLx|Cd#y0J_t(*O%~XG(!mudoBV}#bt7!poH^*z3M(1W2==^7 -+|hw%0Fr7OWfn3YEV@%zRdI9UA0thSO;Bf-lz{Ij<|BcGMlyEGi*b`2g@^*S`JDE}u$(yPJG9p2s!8E -RbM14KKw~vhz}?vKf=&45O_7&33SIxv9yfqnK|JvR&0&F+a7!raIkmDvYeR5{Y=a1_b5GvTD1H(SsLI -sY^{Pl}8pu9m(6^?!_8i9AD?7q}5ro2}@UB`FsQv}$^eTk4b=oL4kjRCEe((5c>w&&}sB$Jl3$vDFY5 -u7(byiL*^su$J7Q#Yg(v>*Vi_h<8U175^IM~AW6L^?x5!|zW(+Gf7mLhcDjTBYFyDMvW{FV|Og0MB&f -I^MN@{0-D*fjUB187f?K@Z!Siyvq6?4aq`PoK<8Y`?pL7HUIE;!qFC3~Q@TYgmF*lusB<QizGL+#C%L -?)GMGUuVJ|WSM~d{j_u??j#**db`*S<^PABjS06bQYe0E??FRFn}+Q6RgMPQMbg|1Su?Q=4^7Mtgdjz -iRg>R`s7Xco;~$dSg!j<!bYhjZ<T3_$wCr)xo!TP`0P>DJ+QoSif`dJMkq%%BYJmXm@3yZ2uEeBg#^x -*mG|~NnOL<qb{=tzSU4%U&mjskFNIi5cf8IO;nth753)LJE`AAKfv4(<Ae<3mqf`6s4_)XZ5NUad3Aw -Bi`xsbsSUPr1F6>AJXj)}muNETNqtla=}FTmZp;GNy-i!Z(y2D{b2!H0;T_)D83-o1|S_OX>k)5S+@v -8A)6vHi0Z0ih^Z&2XQ(YTBkrFOmZC8aBMoc8l4wKQ&*QOC4(VtfqxxYwuXl*UJVmOp6<A%3Hs8x2TZS -_ocoK<JAMmK<NOjOF#@ESmZxtyhR_fQY(M(@qn#Gq+(2+kQpJ{XtV^_9{u1eKxdoLu{2yEmmU6iR5M_ -09K-;X;tjG6%qtVfFhZU5&)_squ0?PC=f=HrzsEUJ_pe&hm~xktzKEuyZx?H(oZ7Xn4i%&!?WhJ+XH% -%N<Sp{pB4W{BI=qnwoIUl~>Xi1HIv$_6##Td30?!tJwjn*EDflbRu2$Dkc#25ThE17n@eC(`4ZC79ui -NC~Q<cbO91QgWTRU$>8R;78Ok;lyHE70+7nVO45kG^vd%GT@Qfs)SqP^TFus>CzJ=aqQiXGF3xcL0e! -Ks>ldI&(DJTQhu?var(t#<}0YVPD*fSf436GwR{n087w1tT4}K<`BApKS(oD4t9)VpIqa`2Cm3@wYC~ -Tz570>C{$JLpQeZlBHR;J;fbPi9&S@!<ZXx2$G&41{Zm2TYPn6%s!P6CR)%dgv;qLU?bB^T5o|DhoTi -#SCsWzd4#0bSjrtlmoJ9yEH;I*W#N9L|8-Rqc%Efb;L%B=6z2l?C35lfubUQ^&3Z&fHxn(rnF57CnV* -vhCE<9*Y_V+7L-=ke{fU-YJx`VtMPXH+OqLI<e@rm!8KGGv>I_{@(7G*rhq)9wBWFo1&&*(Bk=KI9Ob -ApM&&KiiEpi5HC>vngp+i$L^<o9j{;pu>8=ww;^C*~t%2aTzdLclK0(2`@6bUcAb(+);UO;siA&hq~d -v_1@f^>TihU#T1H4HJHvm`H=^U7@+)U})~oH?7S06r1N@9YhdR=|PjM3Z4?sq0FRbbbKMnI37Bh6loH -TD%%-wU{{O(!~`f6Amn&OmsZdDVm0kYkpEw9cp?SSkh7HNQWU$`QmWkLXqwS0By*XDg0tr+y5h%Ek(R -*Yq6OFNBVXz{SMoFw0A%rPzU5&_SnfDkC5~qlCe4L>0_BuL`Y(3o_W9v6|!SFG0{um0yPq_&6m^;`gP -#HECv5$xr->o$@jpPiyZ-o?KE_Tdh>?!Mx8Bd(f>hz;sXtO_@zeCK=}IYk)rdOeWfIMhB`sk2DEuU8p -cD7KnC{NkDccU9^bo*gy#NDC5AdfI0rUf^~6;ORl!K(g%P8`zd+6J>9D~hvX1!uNG-`dvX=P$NG-uuv -XUTT*A-{!olNFQGlw;3)cM))6PQ#7N9U*i?L;5fVMy`J*!S0zM_@aCaXEP57r;Sq(QJ)mz&b3Hs4-%- -7lUZLcM)IWx2-jGBNZ}Ey?G7gqY+km6Jg4O?k7N@;PJtm9$<hsE_(5I2d7^hpB)VJfFRu|l?`-Lii;9 -lgO+qjjktm37vq|Za#F@3A1*vn)!2RG3GFx}>8}I9&3}05K7ZP2=wZnoohHa<PnnC)(ANX~Iy`+cXT( -$Dw#mn)Tfv1IjN#g1_>Hjcf}<sAL77&o5*C!b(6F4yGNWMEq=YHF1(4xmLA@Qs&ql$^zC*KrD19HJ@! -Af_Wmcz(Tt0xP^wkW5=eOPirr*VR|HsskogS}?d{>2LG6-KYt<y=jAm=a~T)NX#*C5tu2wo*brCJ~@_ -KE`6sFrSklshlsCx{0F!iSV&ozX##Xh%vo)0r)mO&lDuCroD(LdORJr<@;#7!#W-hm9CBR<J_`GZm;8 -w>j<~XDS0pqe0}gTMI8k!)6!@L_!gBo1>eH0wvr^j?3ULd6`ysuqTCL?~nK2zJGgi^7Y&Ew}=qH%gfG -#M1&JADB}w}C>bs{-!!WQ`wWsdeTN+%w8;E0<RD4g@{S@ElSoAMNW@N#&kp~}wJU|D4@=4!z?c$R=!9 -5@O)#&7^4GPrEu1YeHu8Q6ps{Ea{yiMPt4DAoP&%IU;9NaGRDM`Btu@^GK$L#iNh5ToHmesz@Z<_~JM -v$mLp*jl1!1jDqWJmu-!q4N|Gne**yqi!<Wz^3tfHT|l`WsQg*vfAGwjr}WOjRWB<^ieH&OU6<Ua~qU -_4t4eJj*v@RqnIpaVVXb_H8HG31Z6qK0sTVcih}1R<GqLpuD=k`$RNWYYnt6w-ed%HAa<P8d;HZX;0_ -%fd!_<A_m!ExqmmY8sG5aBA1BRYPZwy1`3si5!!cP(!$iDISIG@-C@MVBIMETJeqWXS-S{KQL+E+he< -?9xrQ>+;J7a!=U6QL+gPNX6tlD#e@@3wwZuxW(HaL@cvj51P~A`=X4aw`a*F!9@B<uy3_l6$fY=>Ck( -?&P9Zau5MPxHb|_?pLrI^<s_cf^!igL|?R?T!Vs%lc4Cbn`&;Hf{x={;<U{=6@QkooP0e~yOiW5g9yu -@g7C@HQhV1W4oi=ext$S1TJ8-hM5A3$<|a`OH6QY57{y0ZfliR1=KzJ%M`+o2RM0Ou{#t)}d!KBYt9@ -4sgsYXs)4uUCf$F<~8YaWssTsXSPh6hZTYePT)&M&2Xc&RAk9y{Sso0DT<>)D<pEVcL2k2hQQ3-pjM6 --~|+Y5lEb6NHd>7k;8eUg))=TGe)0uI(9=>YG?D`aCQg1m1aXv2nBNk0}pdx^{C8R;7S1m#hg&sm$2C -0u}85|oKZ{s6A5UprI~?*HpI`-C_-PPQuQYw%}YZN0k!0*xbK`&N5r(DxT>8jJJfOJTAhxp+7|?ID@o -)vg-s-#oUG87L55)ID+IsTtzNxi;OfzuBm&};M1-I>nA#I96Y#}uKuN(|9|WA8IS2ucJ%$wx-Ep<*8l -z~2kN%){qe;{1fuHXDLYQWACj`^#;K}Lne`0>QqqiRpCU1|vo?r&E!{Z~<To6X%Wc#Px?SG$KzKAg8A -pV?Os)t*!Z{Kzg+5DdlSo~u9^2LBR^oN6ulm9+{cYNf>pboc}579+>5x==e-%vI?jx9r;naHS@NPeLV -1ZWB&<Ec+|Kj1V3GFFxYL!laHiWR>DO8A+msG1-ut3bu93(J<+1UP`;D=IFE^0H;uoWNyuwvp|PWVTG -zvq2}rD8x}pD70>v1e7)oRa1%u&9os~7UqCRoA(+H^6PkS!EOYR*mmVJgU+NNqQih{GI$-Z13_1400K -|ju`hU>In5k=$(m`h%$yo^cySdD1G6t~fACXMe?aP5DKWb2A*ws&We0Lx5@MHP=w$yoRo+yaiQYYvNA -%_?$aWTcH3CER{qup2j5TvXN5<S9Fawe)hkMZwNJSPFVv*t@C7rOyZ?fRo`5pX##dyD}vu7KGx4_wBB -2)&#@x@&b<5Z>eq-!U)me~^Uem(x%MKi#P1I*H>t!fmz2kbHt6DC?(^Yd+h&JB6{5G*p7k|}F2paEg{ -h+;Ntp0d;w3eY$Bj556@!3pnjn{70DurXeg+QU$~MX=n17FEQ2LU}PbLu~Xi-W_nS_jm~QNVjrupb)` -!wZz1(dQXs3EJ_OoS@v2S{RW!wuqd_>GoS=EzayLGe(wbr;q&GqBo8nK?KkyxSs~fXC#@_plMLsHge~ -)>ZeGPScM+zt%Nja*Om1OoM5%nNrLc=wQl-Vy?l%a=u{iEia73Z*w^j(XkgbqYeFzx3DkUDtgWhn<J< -j@N)U~A6=DG(WPJG(-Zil}4O3rPyp6~)I=q^?$mo3ew#Em79q8`7re5s(idM`9Bg>0{vk=n7WKx3X32 -|6m$FzpF9Knc?EgHUa$)G2-58IqzdD6dhr{s&@T`^2|Sc~c-#u3lW4(JlruBcTKy7!1tmi9wWLzGXUx -5)6%6Wii2W5hh`@*jOahFgC`UG9P!apj7kHI)FYME6f33f`qCw-lJjmj-ggn6U`zaecm)6a5i6l{>Oj -+V;p>w-}8{r&a={-2{y&f6Lxs3rUkJkn+WEd)H~L>9XB%q%}6De#Lt}4pHQwUD8*io-P<X4S`@)Bd<> -v~AurqQbI?Lfb3P?PZ4HJ`FqW8i%sZF>$mW03<LYCX-D5aYmJ%*NDc;IrvLZPlh0S8xu46h*g%qsIj) -V<Zo*yE)3zrnRj$)BhOx81NbeW4}a-+ry1TdJVOM%2~7#V7mM8`El>yIE&)(QM?fWNwBPqHlMra^K&Z -v>HGoQFZ?-NTriPA2UMC%X+Xm3*_evvYTM2SiA>Q<&<g0PHLumidm*!5Y||>boq`%V^SQLGuFO^JWMB -6NO@81DRC@GnK7icTej}rxtNVk=#D&!Ik<qFsEnFB<|bA5%LsgnRUo3ecjs&F1`J{d88v9l;7ARLbk6 -z(l25kEe@tfM5ilpk$eHl2O8srtiT#p@>e!lX3SFs*?79Rd=Y8Stcr?LGbgbON=Thh-Yn33@K}Oc!<? -Pubj#Y8)<#9SJe9o5*>P?vBh^TgyL#aBZQ)9T$@s8EMCERtWrcX&sZy-ZxIQ49%T>)G-6`%6%H<&W8& -uQ+xxLl`Xod2JAXuq0&ruK)cFz*D6s|>A;)F+!|Ipk0T_$G+@N}~?eyku@Ha|0A*1Cw`N4N8uiD?0<i -W;FeDsbdqDGFnNhp)R{DetjOvu-Nw5z9Ki1p<b4GF<Y25cz^_+n%0Lk{(c1&A){0NN8WxB0=mtx~4lO -Sz3|2l6_?gU!Sd2Och~e^#Rl}Ls({B;c~BVoffb=U+XH01s-b;NGV<4%|lf>FD=FKjCAl*#I-Zzm9|f -wDhc~z>jc*uQ|S6~Lp3_KF(YSZK37isXil0|d-ySebeX$*A(>wBHnje<c^;C+Y>hU6h!NIGb)IXO3gt -t75A^F1(-f88keCjZt1B3n`A)OC!t5+pQu<n!Z(HEmer*#~zZRL`R6SIcc@ku|bVAz|9STFcC+1vzf1 -9SbrB-z~k95hvTp>!2wXHG8x~{NQwgbu)v_`~naf(`egxhO$IKkrsJY9y_u+IEIjiH1Qw1w@8(=_*cF -Zj!xGw$F#r$@-GFiYuc>)@1>eGQX5r!eEL0y)IWvw4dIMr=M*k&fB=K<XlxJ0*kCpo|r722aLRhLV+{ -<{XVXP?zg;=jKQ9Y*Ya3-JGD6)AQy>IWxM3o)Yn)>J{0nHR>v!6+)ngZF@NNl#`18Uooqc7XPdvb}|5 -jN0o*JZUJi4P6^DwXju%bl&xNpqu!}O(`nyJZ<2vYcLjuEc3m2oL(o40+<n?O^ZAzvW9>>ysTUpM()L -wwPc$%81eOdYgKZ`CH7KB4TQ_(3t*6%~Tou@i5$>)*z*`V-##h46w-L`-&CNBRejUekOsPmB@O8x);K -@bNMM7M_1P@oJ{*wxhM`bc$7l8{KXF|F-S<Ns(xS^ZufzIoGTPr>7m_sVIc9tHaO*k0|W%I1ft@!aOD -k@W)svPw&!6&K>?%uuI<)<q&&x%2%5oJ4x=T-oTpA+aQ&0j2ctsHr#ZAI`583(W{<ncWeV<~<pTBG&A -KVpI|Oct(ex;-#j=Ai^$r^xz^I4s30_BMrrbSBPEA4}Qg=s2)0r&gX@Ip?QS?~4+)DUGy6({sGS1fS6 -s3U)#SbB6#JDic+e@dX&GZX-ir$PQU{q3qq-W!DEOlU`?ylYNZ#Y-y%gn&Ena$wh-ggqKE;JuV&y-3_ -N&GGGx+#S|p5$T*=??1|!*v4W!e4&=s!OceYi$Xw2vVViOl$5@>_Yn*0fhTJYhOms@5%I%M>zU>LC&I -+Bq#y6KwX_LGA``aWq*rrEaM|@E2nd+HDWh^%uWIh|wTi-0v@|i|hX2?@u!14ICZo$_(q}39wceMzS9 -u@7AQFWxUoZI?PU=4FL<V4qrhh;T4ViwWgW)F{C3MxOYTJ@ZdFA{1kYZ~0YqGI^a&OwZ!ip8W@-xoE3 -YWw7cNv(7-9n?P!dsYnvD-cR%05EJhmokSRe03d^B7EFQDIP8q1IA+>A1gwV`fL;<QD*C&P(o^*lxL_ -Xa#SK~m+@2MV|i0nccs*gxzbuyqpi})e9~l|42)Pz83s(K92boREHREW7;#MwptE;c9hH26-J7%-<3e -b4O$t0zc%ahm;=M^$Sv-=GdKum=(^PcN5_&X?;8Xa&$TN4uHhHftB1_5Fnpt5G#Bof{r8p)+<M&i2st -~qAzG@c}=1RjUCPU}LEIXc-E2FQMt3pZ=eKum~e(7o+SrR+1D<}7`PPv}lYbMfQ`T;)%6h9tWM=K}OD -jK*oh-b*-h^4nL5{$=5xv^1!KRFSIO<PyxHQwb{%9{l&U27AMgZ6fIpqqF3O}@<1Jc+CNdIx{)oG0}U -N%{QMzmYo}fGQp&FuY%;S}Z|jg<Zi!Ih}U1xJ<MA2?YkxQQde~n`12|KsKgbQQe^l(bDS(i1|pL#p>a -8oh;|(O3}US2q939EESLFfHPhMbu20U0=CTjPUh=0Q@1?PJ-@K^Lmy!}yoI9X<i;mstb_I$gAzI!^nO -3BwEZ%8F$!K<Vh2bo8B)_#yMFEi7vy++s+J6M>iP4>sj?W_i_~U>KXJokfEl~GSGS6hQA8H@YFu4eVM -LLn^vem@qo@k=gbyShGR(jXa_=^W{dDG!&@@>`wd$8L&TuaBGBO_y)lUV>69Z4yZ<8E2vVDDHGmI+TW -df&}M!CJoRa>5BXeq{BU~;MlYN`inst3{8{{C<8JI@Tg;}&-w&Vui;C_9D+c-^4bQNbc=b?G`Q$+s2_ -PJorYzS{VV^m*wL(j(U_DI-6=%fR$cHxMH+A5j7D6V20VXJ=i@Y6gEm=dfFQo@^%EO4lRuR*O9Cy3HU -fRJF`YuU$l>f6O&dgJ#%s<hGY&hvPy-Zy%k;9wF}J?A2qW-Ssf7oJ=j<dJ?8NuOojBehzJG)O2d8!@p -%iGvniiR5;b!KwN5u0S51HzlOj6K`Onr^%{8T+iO<v049*;e%~tfYv`yR;YAth(Ju0O?GpWtb4sXW_+ -JrrKjlkG6Api_e}X?(@aJw`pl{aO)BSgc-yKX2{(63Jgszf&JA4eK<LjU3LKpmc_0uc)o&E)geKssCC -2L;sztEO+MO_I*vq=0q>HNp>UQIl?9f~W`#Pxtire?)U^t8K7Vy$yO$2a?~HzeliQm^&;Bk7?q_SraR -R8hG5GlVX6$1Pcyj%$}=5D4WZ>e(Cw^Vl|v@WmvsphoC-k;;A7Qf>CQ6%XnP0V;^?Lm~7UH(!V$vO-* -Va9sCn+%Q>V+6Cf7f@dT*xEIDD%ux_xscws2JO)(fQ~0+ZF1|HhiPV>2y{Er<T8nBrT&->Ls<%l5@YF -VW*7dgnFa53PEi~D0v2TbSy=;x#--yR-Y?)sS-L>PCkr-C92OV?$Prk$~{2qw_eQ@^eJ!#AN29}WoOH -s6BLv+_wd0(4!;O|jcH3?&e6u5iUt}iee6!S=)pl*lUe63IK5$sy&(LbR_-B^7l#)>pN-~DZ0>esj72 -Xp;qrg!bje|!1G=Uvo2Zq`U>P5GAh25-JWIXkof3F687N-4@9$%_W<A)<j-@jY8+7TE$%r#OAA?wG}( -R8yFX>h0P7;UOk-L#TMfxs8UIB1`z@IXqNdpeJqKT2L^1Dk%UfMp)d-LjeG6QDM*kgjWtXIWhDJNk<O -a-9R$--s>>k<x7AN34{8UG5OI;GefGMy~~@#Ob{M6*xE`!rJQW!oyhV|1(lnemwjL<PN*xryE;D|cxA -YKQMyiY>P`Yo7uy^jiyS*nG*@25qJ)?eskV}-mgo%~K}kU)1BIX6J)>OQKWWLh$#;`(Sx5Igkt|y{b= -@V!jnf6aqMU<0$*5<mqOje*xGi%!%1@nPaV#;$p6$8m-Nc>fRv2{A2k<AEVjMAHh0E)`tDPx=5`PVko -8T&`QDOXeba>7>BCden;-3%r=g;9VJcs{J!p?v8MAS9U9#>*f0ZH@m=-Z>?zZ`|Vo~E#ey-kYIE~YNO -$8RrpcimGDekU~&RI0?2*CPR;vwfk04$tIf0k+~nPoV@&Uku26Lz-M>ME<IGS&=Lodbex7ND(s`K&ra -C!h{U+U<YuyHO%aKhDpTv%aJJKFOl5qB;b-*N4_-?;+|XZU|>*Y<RB~XPh>0+M(4e0axC%yv^9&SMK5 -f6+kl`Qnv~O;ysXvL7t`9M6F$Wuw<xdCm^%G}t81z9DZbKo3a(d$0dRI>_(F$MEj@WS^}&&G!5&H&Z6 -#W&Xq|n!i*nrEHB`zMt3^-7J8nZvJqs&h862RFReIWhUwG|Pa_uD6Q;GIHcNYqA9m3=do?CjajYnVI; -LRJeuFX!jPzoA|cZ02<8|-a0dj`Qyps1@q?`iP)=V|c#IV!ui>#Q6|71o_5Dc<~qekjbO@~26pNIu4y -xy#9}ebcv_qa%fCA8p>e*`xnD@@x`qyQcK;-%Ydf_VynAw~n@5P7jm}O<T`MI)u;P?LGgn_xubN0D5y -xw=k(L4m>9(>+C}Z=Wn0RRw{{P_%*yUw?HcOt`IM#TF1#ggJpX4ANYr^J3zfh7k4fVy7mCgz-;ePK9) -#ro5uy+3{Y|qn1Zg}@QuGm<7<tT#*g`vJFNqq6;;wcK3}-_j<%Y1CB1N?7D~Jvz$En!kTi3NC@W!f)A -CzdQ>`8JpS~@#%()BDNADh92T}5rDbXiuyxpVJF=bAcR??*0a88E%CCaj0cN|><v#78`(oe@(krL!s^ -VJR$Q>wm*gs>g{xu~w(pv}|6{dbc;zd!!U4pG1OIU4`%*UPQJ1)3)(`|l3+znz>O?0-BxLqnpk%J^?P -7Z<~yFE6$(wtm4s{NUHi4#0=Qvk!02p~<s@bG!QA#((?ya_i#PUoL*8mj6YiqR6iScQWry@LRX3P*JJ -)_)52m%B0Xsy7W8P+9C=3bG2+=4&l!${PX#*v6jWl+eMk_!EPHrd>a`+$VGBLd>=fo_n=$ACk<K(=+U -#St!Kdk)0N2(t)u|aVK`{|t|H^xMz~oEOP!9t4aY^^P^dil*Jr3)*Eg`y4u7UAfx=(IPe)IN+u6e<M$ -vgLqJs13e4-u#wu&XS`&;OpN?wD<PO$egYhp%>myWXND+j{h^P$zQs@I93R?9TmQ<##_w0s3`gEwBQ< -cS`)L2=)JAVVnZ`%3O19F^3{=l{lcnbRE|_|ueC6ve;QB@>dUx_Bsj+q7py+(vU5yXZEo)2vR?e3}%( -%1$69NdPw^_mRN4%l;dNZsXlr96JlKYRg}>LnX8lYxFFf7%V8n1>Hir2BP>D7o6Nd-Q)YT(iaz2amgH -Hittz>oH#p0p2WC&Nd@ouuf^!%*2J(I)&xdC;OgT({4g`j%8d<NUmM{oL@}x)$MLv;^^fS?`T5D&I}V -{o+sju;lj+ZJrw`I+GOrpkcdki_y$|!4bDpyBL3x4;8iCtaPB-G##@npMtc^`D?W#39)EGQWs|A`1ap -gnMY`?GoMd++k<X5rvTqDXfnM^az_)dzv^lQnL$G*%eM}7cQluVvcyv(!<0NGN@NQrG9z^Y2V-8&_#v -203DH>D~0C5#?lUrN@~6QLfxr88?)PTb7S&K0JrgrBA&Pa*sVq!{N6)clzuR(^1-WF~VM<bn8(dx2`z -I&)j*rsr)^IB8b^ub>eJSztSDD^$ob(Bb1RAb>@dXM-@R&Xa~)ZVG7l?Cd?ITexp+vCI_w1}4U<_}+O -Vbx1h^J;rvt?7q%^q;u(}i1!ap&q0a!uaAeP2VXli`ft?n!Z|uVI#^F3D0x>W%Lxx%g#U<Pxyks>NAZ -*3)9?P7whpb4`u1r607IFHXoT3FoF1Pa?;pRPz_8rD`ur2I5koOD2FBxJ_~;=RL1V5EWbD`^^5E&pQ& -Bsv$P25%EI3&2_yk6cEA?}f9E%=S5Rfs+1@&+;ohLGMxEn`vm|X-_REp-;=U}p)w*?|3Qy=6lf{$~#( -+L4U=KXA<X@WSf8%7ONB}iyGzk7Q&IXgOBBSK69j6+Za0RgqtgqPB6fKS#=FWCuqiur??Y_fJ{A6?RW -w)Z}7K>V1CWTbGz!zI}F*4RoU1u+)ua~jj5nBG-QE7!?XWI0&_KsX%Q%kb0Ym_gAPBgoV0u8hP=bN22 -du+i6lIrXF6RkW|b)jza3an^I8XGFH*p<i_99z@828yZWq9m|a$8*XgIS((eL!4o6Zil>mN5a>TmS6f -=0CzxJBF0lQfmiW<kbNHcbBbac6W5Byi!Aa1q`(0uWP&;aL$bASNs#Rzj+9*)bsK	r=`^dPsoRyH@ -T&J?3fxonYJr}Mjdqg)f0xm3CStXH>WhBX2dNCaqzYQzQ%Mc4eIV!**t*_H<d<5egh!j2HN)u&+~-8J -Qg03&aV=W9Dhq^*?=bcealP1<ONd(JgB#Y8~QEPdB*oH3yVTgvJ5_!O)|@DMU@Jh@JMwf+(D6SOuZ23 -NRm#ul@fI+3p<6U4xMXHrt_-8^d|%r^;0dJR18VHmOGTy%T|rohH^f>s0hb5Z7LWQddr)$!kH-+?v4o ->KR9V9DHC;H%$eFq7mFXSB-YPX1pP$JS~m+Bn5l`d;QV;{o&=_ql1igmsO?o)Fh7t-M3(ZM6R`GWm`b -au`ciYSfyNfmdLnQEme)dka}+!^yDWV|&W%M`<gy?8R*YUPSCiG7{5LqKfKiV7zQ)a28!Rx>$2Bn@3` -jBqMEPW&*fEH*`vecI8_X>EAt|>H%kA@dwk-gD$kUWhwC^8;`vyTmH=(Q~FB96M{^1XwQ~rBOV1#i93 -n&0XiMuZ%QzHPrJOA)rdYW+lClStZ|L{|QUbGz61A?OyCNlpQ6d4Q!91xu#z9{K3Cx)sp%_u??x#pA@ -p^1yalH<-O8>vo>*r4Dc1_9MK4TZ#)a~NpKnnC+=tR=VM+bGMfR(X*U3uh<`Ng8815&=tMg2PNL<}Go -$)}Xe?9s{l9LTm2swRWu)7b&xT4l*;#X=7xxBa}oEyMXrmiB9zd25!2lAK~e+TdMXtUKVEZzkYbXeR{ -Gl@<H*|mh1(n#FBedFmgSn_Fi3*QA8^=3ZhrT;E$qj9nlQ)!g_54XV(ZFFpyt`n{3bej<z&pYC7nkk= -zXySpw{i+(xf<`RZo<N)>$Wnw1ES8z(Qqen1v3HR;E6oKXKFwh$ly4N<h$2o#mg$l@c@<YIO0_YvkFO -q_KD`n^PAf}GcY7`~0}7e&3CB3ab4{tNpAtKv-xl!h<E2P55!MmN@oGhX<nUVB=Ltu}Pfnqvj7f4a4( -8zZgt`7p@f|NAd?|6MNO7@~@$Xu?G1QnGF?$&aC>L~})hk>4!kO{=P6V6_h5qJY>?gthf<yz2>S;X>q -9H|a8gX08p{X=xNNH|YGYTOxbB796Zz>X$Vc`j0;AM6L)>NqtOaJYO%E9%r^EFr3MBM(a;tyia02jRB -Qa<WUyXI7B3Cd9sN`S{_7~JBx#l22WviWAuf{B*w91-xE$c{!vV?M))a=-xYp@`3*a~=-wxp2zx(%8s -X<j(~1lFu2nrFmHGtLO?@_XPy2=Ts?NO&mw)EKH!ew$Zi=~>N?o@$`GOj}){19**6@+Sv|0$4+hvhFu -z$79keg@}P*-2+;#eZl@7@MmGW1-=+cN3Y551Qo=%Pt+eJ*!BqO8dJE9jOdn4g-UGe1(WJqLg7v_Kv- -#K{w8g{bDQqNcNaOB0$#2C7AVX=utUgHSZO5*9-7EW#T9IMUGI8dh8P&%QIAJ7Q(xQCHfjEZO8=&-b@ -Yn_H0&7Pls0yCJs#(s@4)-c@&K5Fu-c%x{}!Nx>?zC`Q+?V4B&}gZ<;vulW=+R%yYZ8P@q{B}Yd%Y>% -V+SR4WwpkKh?i;L9Ep_HRkW*FMYX5P@a{-+OvE)($CcWBphk|?1*NMc?!7N%K|FEB@1xJMgwJoF#(JD -z~>unCe{Cgtr?(h?0Zmg}}tA49r|1Va}jxMvzTc%Y0wFkWv@4q=gq@5S~F_pBWt>^k3VhuPyKw2Lwv1 -e<cOm>qxB-LW%_b$63Qc^zP(^u5N8Tk<|JTYxo~FMOee2q+?-avpI(?tb~`5shdrVZdY?@vY4KTFI8N -EbnAt^fBD)ksbNMV}PU9s4Exg+=#)tN}g=KKW{o0@kj+#*Mi;SR;`M66HN9Q51_+KE4GR%b$Q*JTk#{ -(pdr=S(k1xbxMn(kI-8Vqlx7zcORaht>sj2_jEfVHBrbrG?kwFMP|oFm8e}WvhJ9`x3$<Z@<D3#lU>@ -1N_!{pG(%4hFK^nhkbKoyEWmtT44xqg1QxQDlkHy0~d(0^uM2<QCc<PvQ>FQ3JYpOfT&+;jQRr@nh$i -V}k-r@S>p(21{l(Mq_(gDIr24G`pYokT+5w(wov7!f3f)`&(cRkCmS0ZDl?PMv&Tq{GzQu+fK^GxXnC -mes)vN}!I%h=^(yWqfEeH`ZHlvhIdB46|e;!LRtP93h_?L|abVP<|E2|hL)bovQb_vaj^e>iV7NW|$~ -8fi>66;J_px`x9*$J&dEPDGV!0@JU!9|loD7yeQz2A@k)=kAV*YBh+)5_HbjBIo3Wb!qRaoQ80O{PHG -@27Ht2I?1ArG;AVNpJZCMZdb8Clyz?nE**^V%_X0GGnwJ%Q}&fkU&J7-+d;|4Q*IA>&s&>l;JFk<9Q; -L7i_}xuCMKFMZn1!RkKW>q1w8ibnD*s4WWa8+Ib941TOciMkJ#$#pvIS>nOus(C2f5~ROFN(<Bl@ao( -LJeZZslO4n&lg(alhe1GkHVG3dsUA7ZnF_k{3{ZnV3*m5GAH2toEFYn%3;?D0)>OHU%qQsi)?*D`UV& -pO8L8`3Ae?D}-OK6Hcy6i5q%tz^_q_TbYfv?(-(BF2^P+H{pz(46Iam&F|QUDsp-C7<=RbM}!muCiO2 -G#1_B#Is%V&z?P#_vI>iu987R^}U@Pq<mXVt0LA9aGfhFlB*`Nq2otp#O=GEz)FQn+dZMvlBz-PNy8i -lwAkk5^++zac-lF$lmPb%pII-Va9yR0{~W5jDoc?GUff2Sv2)EdS+*;gJSVR)Va9URc8l(rs^Gakz_S -1Xov&cK!Z~G!DlFDn3z15qEObbGGheHa+K~dIr}|WS_b`x3m~c1h%?+O5g)t@cTwcnjIv0wL%gqOpCd -(-ezdZO)IxHkaDN=(dpLIqbN>@T!P8Su7iXBGeP-I0#I$zU52YOP7Yh5=;p$c@Q(<#}pT2Jn$M(vDf+ -knJ~yarp3t=0{xVaX;s*k{$!yMx!q$}xJviYOD-a_4$1s2wFaWE+;JPg(Vy`i;FiaiM8-X2q(RYb3O{ -?D&k>byZ>tt3^`EOuExW>fM)M3Z0HG;}en;R2Z71!x`=6;mN@x)?LQaspMIw+LyS-&XF(hrpj~rhDjA -*{TOLGP0qVLiZE4AN@lx|zv!fDU&`xPyGO5n1AM@p;lmdL{woLmGQLZ4qrsOfk&Rl`6X|mEI3F9uq7V -ZuQ4tE!e@5fDE>zLWwl2F8po`Mo1usR|Pf4C*`A>W^seZE=NQ@)-62%jz{t%agiCaK}A_-0oPJ%CXKb -Hb#Gte(r<64wVGtF*ymf5nwKij)dV`oz}o^DgZ6x|wFXECr9C~@19`0@qc_$x9h$m=>c{ufY70|XQR0 -00O8Q5kVep#23_uNeRUpIiU{9smFUaA|NaUv_0~WN&gWWNCABY-wUIc4cyNX>V>WaCzN4Yj@kWlHc_! -5IZ>}V~UYvr)jjY)84Gxn?0@T6Q|v~D=E4Z1<7nAk|inGZr%L$of!Zmz=v%2aeL3YjZG53U@#cW3j^% -4?$a&{;&~V?hisECx}W2h&VFZ~y@`{XG+bWh%zoprL9ajP!mrQR`%BKwZ}Q7HVi)luzw%SgzKS=|+|R -=}@}T7f=j@xeZ%)rHPQCm(XMQwiZ@xQw|L*PIzJLGSy9@jX^*Vcdd!4uIWX0D!%BeMr7tCji6~7K=E6 -%n&&EP8_$FkrOs<9-Ex8a;VY?35SbGC?6c7A%^Jv!>Sos8$3B#+}&)(zry0x%H__Mh>!ALU`7!So1$P -PisGt9ZGDkLoq$oz5bS*US@unEamQDb$+gHwn)=o$1tHt)^3U%tqE(oUZ*<_%omXAiA(zrhWX@&tV9u -<#t&4V|~MyesH5T5FeT=U&t|N)zzow2H!`LN(D}*X&R^4aLMzjps6+Kba3!Ig<(i4cu@QeeY2<2$Y1m -6)ai6O!OG7v)&kZ3!C!4SJvu`|1IYXSGRzqK??-G?HdB+};RImK1mG6%B~Uw_{m6q{!kY61n@+<h%%@ -X3<Ew?sGFgN__{E!w$$?>H_|L=F#C9r`5<ktcT>Yi5@RD&mE9(Lx9Hu+W!YIrADBw2LcNs9)ir4C`cq -A$~?1c3?1<Dd`4d2ucGtSQ9yx@O67gV(1-G{PJ6|gXZHIZ#*L><d1flp!nf{)XZ(`83-4y>Sc7A_d_E -0sFz(Xn`|)+*6@55*Fhz>lIhXVe9(^Cu}SrYEVzo-m^~9jz(<shFf{FJcaAh>L0^d0-u<kvU<<0+xK& -yNh^hcM=eeK>!oD$?h~5tNf2g`Bf{%%l6(hjBSZB;U?-akaqQfm?OE98utZjV0>Sw%lknUTH-R#li{; -x^Ek-7gmj7*r^{z4U+|Q}qI(8P#b3vBzS<Yk06<;(+2wSqp(Z{E?yg~lg|;>+#-LK3q^&LYo@BQ51Qy -($;&tep*5GvNDXHihlE(lJpITw-jYOL-K(i$vNp1=VVKz-tAOnem8k~0dao!+5l=R@4XO)6nDh*T6O3 -^Gv3gYoBj<_6FnB_n+_?B|giXp6mbnk;bz8a0Q@s;IuCr=%FY}?*bXY4qy_r&VJs`Yl(2m96W?aA@&t -J{;?N5{9vzYN^NUvEDhJFmytQ+xDboVk+&=dmS#M4NRJjPd-y9((ZHdHUEYSZj-#2-OY`k>x;q2B4>X -v;}}A;S<Bz6UN4x1KZ81;S^`U&*K!w{Yyb>>y<TRD}Ozk`)up7z-7shZDDl>rM9(B8ta@GbzU7eRszW -uAYL_)cU3o`AGcRGYTc*WKAYVj6Z)G~?lR4kIzC}1$6g8U)5CCl)Li{h(fP0X3ToB%pwMUqnY;?~jm+ -Al(Mr>#SRYx!gK%*J93Y`ErC(Lkd)X9gWkJZ*;jM8|>6Qc_i^6<;7hbTKk#WQMQ0i9=#xjjJ2_mre#G -`Fh5had3mNiGcNwf9yk>4nUv4OXWuRs7eV$RW&4uCdYuz7ftg?YH;QuT*f9AyQlU<HFkqj#c@Qg%I<m -?I6KWe&rQ$l4kO3Ng_gN~fZsmnEw(w=LIlCI*b6ss_yL#h42zapYVCPOWD1oV3r)+lXcc?H@ownm++D -WgT{XuIhE-M4u{LDY%kq)v~fyf6_FF%;V8Ky8<a^Ti#R4X&w($gbs1QfV_=@!lk9yQoWf3W9VRP5fqT -6z&3N5l{(U`KNe6=n?IysoYZN9Kj?jKR&zE3=Zy^Y&|ekn)aKsO6P*um(Cq3m3@%&XT!EjI3o{&S^>V -et+{Nr8=LrjQQ6RN(6PPVj2VJ}fuaUz>!|q_>viIqRw~@QBH-*}gjJS<<P<)^L*9I0<9y78uK}&(txs -Awq5^_PI-U^~F6S2!$b-v1YGag`+T@u|}=ye6+06e)M<$jKCbqf&XGSM8Nwk>7IJ;+-hMCQ2cD<80~w -I)I2`AGuHz_#PW)nGYojvsk&HZ|1@HYvAB*U0X**;0-w{=A|2L8t0c1tdzBR>0wz9CyL(UZ-e31VsF` -YA~dLifRqhPXL&|^pT7J1|4Wg&{FXZ(S<8PTnHrv<Q@{qhX0gK^gkQg>SGBPx{F)RwHD>5@T|hLai$d -EiWbNL%BpfTdK42L8ZMLB)k1Yr8fF-nu+^K%+U8IeI|rel12jL+Q#tL68bDmfiv~rLp+R7yKqIMI+Ti -W-&_Yr?A*pAV6lrlQ8q`X=#ShptBVNvDo$w6=k-mw!(&R@Hb}fzyzxIQCD*LKCJQ>)K%8$@6#E6ORm! -Zwrm!Z1iD=0_QkDA&-`?VUhP+e3SYAREXLe%_Y11N=)O9t2@6{Wzp2gX)15nIXrg|QVf2NlZrQlbB!7 -j^m9`~NUJhaLRRfWVXV&kqN5&QH&ej(XD{PTyU;{qAh~?zHCiZeQEr^FDIuk8*$=+xBl~x4~^1IQShr -@H?%u)PmM_5`!v~P4Iorw-17FV2}Ln&tG=`cRZgUI@+7_8i0^%-XS_9JelI)U^Z+emFu1rTJkk2n66d -bgcl2}Ejms9RmGAT%GD-8wps3A#Fcgf$WVJLoR_WUyz~p_#j~XJ2D21AW|VUX00YB9zTw-b+n?a#>Xq -orUZ`{k#T|W^g|AT7=Sd890)U_|rctNL5ZR)sz$!^KH}PornGll50p;fx!<Q4ux?9Z!=?(h>@qHBsV3 -3z3hZBV?fd}1);@%~pud%!6TT<1;SQNo;K-49?@wq=KCR<?G3R&Ra3|f@opAtB}XwYe(ZNLQ;8exkf_ -+3E8XAQ8RR4p{22-u9UG*mVB8rcm$Bgau&joVB$vyV0;c<&n^DESb;P&^F-rDrlU>rWVNu?6um^%HQO -T;^}%a9)8Ut#+_0L2j?vJWN3VuWnp6+vLzg0Ad*y6s-#3g2`^P8k`hcf&&45T*bo*X^SNH!fYNcVLT0 -H2@M-4)t55|uNCvC*`ZPGdM-VhO^C$GaWIS3)QIISb%ewfmm=_G+1b7dG0r$l5xN7sD?_#}S_X?S0$} -nBt$u%z^RyZqA{NC`;GXJq)*+iC5o^lw!8+>postKT+^VtPD@8+%SPH_=mg|(=DhPxxy8Jo@nbhG?d< -FE1KQccjhX;)BoZ_nbfINeGP*7jC)>QPpZ(t2$(wiEzk!#W-0z+eIRU|3$hy}J(_oOhTTuq=$){%;r< -fKb7mkeW<Fme&PD;NRv)-)<Mai=1FrfabxnqJ%gwSO?&NN~Hp1RaIj++{FBx`kiI@w^;c-y3N2&wtv4 -ptUfP4|B2yg<fw@uj}>nH@|O`9r^?FeO4(CD(~J=@&5k1|NL$UEDUo`ZfLxbw)5Y79b1i+_Srg&!u4j -&@~arhI)h;v*p)TaqFC`QU$Hd?KQ8?(iWF6nf!u-_Fws}EEKIA`Emq|gROU~Q&F)tVVbU{n-ochwq2& -9Sr!hwdoY=d%{`N6uyuqaoj%Og`t(CEebBqX7<nTYd|3MW4f4pAtpv~Pr`+Ix^v;eOVOdkg9rF>+vdk -`B049Mg|(g)yop)06I?d?zCM0rQvbFb$Vk%)P?AafdIH{zt#fm&r)V7JXx%rDMUwh012rD(b<<SA@hN -x7+@*KaVU#EjOwxbt_X?@qs&zW?&;3vvK+dqk4Zn&Gbif2H&rR<t#7e%oG~=+=*J>|A=IG$_4qigZ<i -8RRw=hA$CvDrVHacG->Wfnr{HYF~?S-pJRRLg!o~v)t6sDZ-CZI$nbTjlEJZ_@<72>DFWH2CdQ?Llj< -*BC<$<<P9QCZ57JDt$T$P5%?!<$kDEoB}rO(x|Y7zrqx*GR%NG7l`M^tS2|b|+=*VaG>VS(BL0(A+iX -*1emV<5u%tIubw^Cqh!kLb8_b{o2y1Ri+Q^Jg-VxUk);N4K)jj!HQ)T5?2bS6yD1njYRvJnMRJvL?rE -WujnF8K@3kU{gXQg(HQ;Ilc=2fb`UFcxvD2@?fsVl@dkO#oN1~OC{7Xr8pu_A=X0)h!%^mY(OglAOW8 -YS)`5N^$skSg>Cz(rHx^DAk00FtWjfQ&I3?2Nc(HSyTM92z&N74aZWYN%C&+YI*H1x_c98q&$JR<jz_ -Ym7!#)QCPiW?^Y#E>OgRSo402!^j??bPa{h36bs1W|JB{kqJ!cU5pYyJ2l!a|4nH7>i;2aiwNysL0fZ -une?r5!M_ovCp$6aKmE1*Dt+pjo+|8jyAXi-I7%3GZB&~6&AinFrEQC#qPrhND;3^_RiSpqa1i*eqfq -TE`YU<oK{N8`!85XB#Xo#jY8y9yvB*8XQ{);+1G=!jpRC?*nWg=^y811`U2f8ur4+`lVpxG~eh|TIRr -&X7jGfv79M<!1zI=1~?djQj^apKfZEJfc*2p{PP99qhxP<tt=?6m->lm!dA_|afq9D&|z*6hO$eY;Xx -r3lmtLKgTRiOLKJHuF15B~Ugd;o04I#vLuJK2d;i51Xiz8fi(f%#aV)r6FUg#qCRtY8(<s{q>CQfg63 -CT<8xhyw|+hE&m_30!LPZ7Zk;f`f^i{4#KVC8BxFRKsY+Di1L}oo=EG-AnXt>zIvaw!d2Vw|;WzJL4I -_^jGjwz{S8;mL+_J*-uc=3<M*jRD26h^dO*hs+d_&?wLI_V2=*b+)wABT$Gjm>>1B}Im;G4-)ow2nOu -DT)mLx-agWvVVKn^YO<~0x>|oCOa;7zMpYA#KXgt})>IJk-bmdb@MR4h-P0&6K52j2mn-&frXvxYCI1 -5)RzC>5C1==6UPTp<-L*aELTMz`!$=Ubcp1yngW_tea6y~P7<7@2mmb<ChX1U~`uGHzKG7F;&I@90xD -aHO|eav=K=b=FIu1WlsiLm%q=F}CPXpzz)Wfrr=Fu@Kmg&9j2MxQWJmS55VD;<S0O+#(<s_auL7CT&^ -Uva`v6Bz8-5Y~mtUbdOpSl^YOjg1=dsi7qZYWUAm!KpK~iGe7n-7=wIT$vDo8CyBWRKa+YGdve2+lr` -gmW!e8%R^$xeD)vs%gcB^g_#bxwy#~8X>{z+c<iF0$hk>Z%~yEJT5{knme=V^!2BW3!YUT*O!FHAf -hh)s?a+DV2D+vn`DwuwM>qn@UiicG!A`xuiD)ld00OGNjQOb6jm_xGVfrv}rdiM2Dlp;bekoAg#a+O2 -|gT!%4$b+|iY0yA<e&2P4%1Lq+se+f=-ZjRfzl{VemBBDf_17p3*p)FAU)XlO1h@!2u55vmB6Ym!FZz -=g1ckYrs8K~OMW97~}tu_^{4+u*@;VfzDFU&kcOQ1*d1QVVET=2^v=Fhyuxy6Hmnq7a;AJ?-E?3<Ci1 -iZihcx4d+{WqeOi@9l!!#2Xd4G^>a`q7WmK<tCvWdfaP>sv|HN#$>DTBMK%5JC6wdnhxz^>NLjJ0j(v -+aIC(OXk$J-VlB4-D!Y;-;l!Tb0(E)0QAy`HDF*Ay?LAb38D&5gq#<aTNf0qgm(9Sq7r}iz?K{hOx-C -xr%HA^;Y*M*j1x$iI1(cuPoWJ$h*96RG^UXSeCIl$IMDiEm-3^iR{N@e340^qnE;|~0{sQ4+8iSb8E* -l*72h4tc=)F9ABDcyKg3_qYP~wBp5G|EwL^=*f=5O*CT7tHaOr++f%MOoT95MUzzSlb{z+d46Z89<0K -*q9>+Vh~sUx@VJjQs*M`;~neu`sPokm4(9Aox0C_3h<?>@eRVwIy7XN_)<8p02|P>B~)Jou}H4(~b>P -72zO(<gdW$o!=B#2sv;a@FZ_b%hHoxGMQeOihM9-97s(|=^QkPKsp)%amL#J$U!v9!zq+*oQBI%?%B2 -_Omf@=Bnufnkg-ggg!FEd*KBq9V_TJ0VqY<kAY~o`8GY>_x**V0s~xqZ6D+~O7q9lE3(f&;dEL<?ZYc -<ZmXa)rXQlzaAMRQ$UCQEQrI{zqY`dg>F>|QlV&rh-d_1orRuE=zpq9d{iz`@6^Es^RUdaJq|B@EkgB -p+b046^4@ImsQSqs34TJWH1l?XrwBz8+gNN(=Ux`RE$V$b*BL1wW4j#6Am07aNV3Te#xp8@%A81jTGT -tb)eJdh1m9P<EF7y&@e{p=F^na6np?)J!^1ryBM9F4nU3Mm{oVl?CacwmkOWJ(vt*i8>#^f9sk?;gCv -o2=0D`l7;%mm>1e$MP318#<QVVZNt$e4W15I``_mzX3jshHL<x`re^S53{}ty}a~#pJXygr4#Sd<h2; -0GxlD~VKsu?_7LW_FViAm;?hjt*S5A+o%crl;lzMbIHFb$W&xz2Ohl1Jx=3r;L}2B@OoJZJ!a48q#R8 -MmaF+3Wk<0c#c^rDZ=U(sSo`jA%h;p2=A$#$H*`Ed=+<^sDMwdD6@vL`1#I#>O8qb~faWntf>{%dIMH -CmCgX|Q~Iqd;4{5_mVdg|?Y?4r2k0wml*W!UUfvWnM$>fq=(vtM}6Kih>ZVk+iHGT!o4|D>{zkdrN9t -+TT;i{<`O98bcf3@=SI@Lt>0;1+(5y%ZThXE6L);jn;6f?ai$%7i(hvq+e!Hs`Bw9X5}lD-xico$JSE -LhFH+L|Gx0{~VK$_ULpI7*0an&oSRHW`v~7xT>xmZ``HTb4%^DLG|wF^I;tU1Bt$zLdxCI2?=X4G@&S -pE`?B<H}yh|Zbf|>%bwW*9#pbYi+o~Yg)Z?xhWq;>l}}}E;aAy+foM4L`(E1b$z=<yEWcr!eow3T(mO -ot_FoJJgR&xi6E*RBwQ{Ozw^pt*WP01Z?bcWkTQy2M8Z)LRfK;KN54kTJ^u2}^bPk%(f$Apeu#WND;7 -}uol;ZGFujVboyr{RM+U)1_u4<qLeC*bf6$OIu&8(=)4fd)3ya!V5Xs47DEBqEPy#+MxvA`u!J+y_Gt -@%^rbqE^?d>7zS#~^#qK=c7ZDKZenm<B;#uh9+448?i{pcFvZhWtv<MN%(lrpTv3pV>X{v)ytZC;%{T -CEVMtA&>$Ptb>!v!U|T;-hV_vm$AL%dQTmk3{!Jit^M?)689Awsm95MqS<NAD|_m`mU@~sIn`ji@6$e -%xWTCKK)_TAct&22jc4T3aJI?0c0H2=?K(xu;rW;E-q(Vkc%Ec(a0^4c1vv;}&_WZ_d+T(xR7Hww6nS -D8VaLp>KxR}~ayE=_U3?>{*Hxdus@H4aQiu01)H}S8A0^(r;`LV*PFT_CjpHr&9j{xWG$Fe&MYWpgPZ -1lPBr;xCctw>wc?_;pNkK;?6PHzvSYuXLJy{;3GCd1(8j{hlKfwp<rPX{&7&}Y6pD{1k{`?`wizx*3) -M5uLsg(;-6dCzWr@6p-D%_BrJH%D879?$+1*C{!WY!MSV-5C-sm|-869G}#FRDiwUX-VNWW#O?LFEvW -IH_C}a2ME~{AqyO2(yvMl7J#1SB0Tf2B>jAStX%;ck;E^tu>azZ_K`xlWArv;hgS1Jq(j(YX^d_D+hv -!p4ZiR$FDV7UTbsTcy3l=*mxtrEam>kHf}Yje7_u9V@3o;jWpSL7~~3sc5vFM)Er?F?F1KOJ&jgCl{+ -D|TX(Dvwaq9sk-sl3<KgKL>SJ;7M~SmaTsKo~?z)vl+=J&``6*ryXj^Z}Bf6lp^owvrNRJZNCC*Q>-I -rkqyID&)d6HR;q;Z-CZ19$uYOm*uhO{S1>!O}@nt5rl?Nd!O-JM>6YgcIZi~2o^q`xmtzXko%bXJutl -d-4&X{Qq?`z~txUiW2jk`$i16J)g=hf(PiYJ0=Sg~1@ybh&Mygq9kAF^=-IsoE$|d#qL6jv>gY5TBU~ -hHJ*7++^#vyNQZ?D$&T@l|fZpSBT+`rtLfY*=PSvS9DnAv2wb1hjuYZ`eh=PPS<xH(xo1Y&3uVF2o*r -H8;U1%QO(oY6S*-;sr(r>%)<3%MHhio&KTA%`X~k}s5C0A2cdk6(|=+sC@D2Ijk=x%q-%Rz{Q7*V$kB -sN2j6i5c<uj)w>5xsjeina`wjb~^7zW|a57QBjLVqzhR|ES6%qg~pe&a6yQm!xI`$?HO0I-vq`>HG6R -zfnPswAllf#LNARV`%>^YV_wG91kH;ln?wO$HsRJmsKH)#FJQu#fnZuC1H`g9q@qhlO*4cq%^&&t@Uc -aC1rji`6tJPN~d<?$-K!$a)j@btKHZdki<3l9n!pJi*BT6!{z3z)QNET20%<>(;0aqEUT7lzAM?Y8|8 -fw5c-rE_2R(16f*nMgI8vlxxU?xCakx52;E;ZwX_s9_xX-8<iB@(wM{MaKOJ+zs^c;tRG2`D&guHrAI -%jegdAvtHlOofOP|k~#8@g92g6Q9EwdEBSA?<}z+|*^%~Z0&UnqR5YDly!rd-x2G4SBVR@<z}q(0X(f -{3)(@<;?q?N0I}!loZkQ#Un0oJ}bK{yOysPdwlms3EjU_B48tc$>q3Kq|+Fj#l%>;8OHle6GvgD<XWc -rt1H5yN(y;EKgZ6hB^9znf|TqTc;DF{_Ht6v<qi9Sa0Ritk4ri*dp6?z2NG`}Q9STgDSA5cpJ1QY-O0 -0;n48F5V5eE^ACrT_o{P5}TL0001RX>c!Jc4cm4Z*nhWX>)XJX<{#TGcqn^cxCLpZFp4GwE%qPD>+Ff -IRhjZz9R$+1~odw5{KXbnGluWK*$U!hS)2{=}21)=K!_@5>JNaWHV}8?5+3Kd*vd%dbKUL%7;~PhS*H -vXF#i1P@|^0$3rzrOa=%!?^^qunFOl$-sgFLynkLE=A5(lUi*8kwbxpE?VYOcJ;+%&j<do~(>U%hr~h -+v|NB1*znmF=%Hf{Lc<u7Trsc0)zB=%OO$8epe|%Tt_kUP$$M=8qqaTX}|8!?Tqx7SKAN;7G{MPD%AO -3j#omXdPXBHY|9Ln18`!hlFh2-z{!hgB&6};)t6Bqu@-oLpp%-)Y*_zk?zjsN+DK?ZBN@Lw$cDFgo3# -{1vdd({u_2w-{1wt77rx7=joKKyi*KN;7{nN3-yOpbdB0{^DRZMp&;4){fkQNV9A$Jsa&OHaPJ2Tg3y -Hhp4(WOoY#MA+0j^<w{?`iSEe;zxmrd(8U{gV}829_69fD926xAI5yn`<KiOw6oIm?eJHNcWxEoeZ!M -RgRrmGi(v{l?)Ix2*MDF9KF3{grP23!@Y{be9MtQ+S_k9$u7*dyQRb<CfQww+xT*0D_-1{DK69(!efk -^9YrJ#Aj{z_(hht;F%3EZ*6mH44_wfJ!_y6W!4LR)#6#v!DX?f)lH%I#Sh}ny|P(+#(8WgV&EQA!Fmg -k0~y?TN;IdC|O<APkk0i+P{VpfR{a$1j?0g!fpbVk<IbwI%_r>%f#d#wEs^=HL1EI09-G(YTdcs0o$4 -h^5zw15W8Cx8g)rI%mFaeAzm-l=Jt{8E0<q~&qgtg2z>YqTYu<GQh6QpNk7TDW4^D;%-)jJP@PO1jt1 -aq>%cXyBA*F^Xikc*#r>;Yt(n@I}#ZdGWCN28q?Prpc%0`2zuHd)PDV)B=I5#hh1Z8djS6DTP{`-L9C -hI~v#s5G(1m(3qgvuSvtSYCNz>c>Bh2+{228+J;B4p@mA#X~mOp#hNTiQ=-}jun7d4u7f{k1%$4K&PY -6+C}0#%`l*xkvA`7*r;+}ktv1~B)|q{zi7$#-Jc)-%Ka?2<zQP>=qOkhtEEsjgGeDqHpuF?7qxB_g+d -q!g=EI5x=<jkcGyoO73~eO+&WLMBcqkIs1$|Pa(_Z>LjP{%^@(cuRP-86sKdiR_tEQ#E7@;-tOY@4Pz -9Ol&=*+!l=U@=f0jl!oRY9Npv>Ym8#dl7L44nw<hw{Dj!UZ-i;qpb=y0vOf193e2DkL<x#);{buGpr} -Rg2>3$D%%lqKK!zww_I`kMwJKxiIDO6<p99G(mlUExcFDTh7okG$`4%yoCsmNRvzzq*KQ=hFjzJY}9c -yBgjFHsSFq0dU{`?<uvjs9UWg%S_@BbSTPT?<<$IsrMz&emNy?OIT0=|ba;as;kDHp%&6A#=0P+RYnQ -hbIyOo+C{#5&BZ0SASI0wFTXq$;AvqOuTx~7ODe5_S$Qc-5aGwnW8kMi}LE?PBm;S<q2%D>jg>y*B0s -spRYHxcXaXlS?nTc5ob5CNnry(1Z`L&)Hpzr93#Vqkxdg6edxPksjPh8Ft@6{7cfj^ITbFuQm+i>mD@ -+zS&0M5r8^Spk)A12YSiO?u5&jD%hnHvbO621#15P$;0g4q1MIK0rQ0v!s*%Zu&S^zVGVT%c|iEX1Dg -V#V~I$A&<(Lnr4~VM12IxRWw>)XhD&AAqW1lGWMa3Lf}`aENPw(VihEW{Q)8yq9WOIIO^w>;N{by~EJ -pO=l!DhzR{Wt78|`0q9y=D|hk@@{Kct=C#rcXQV-1G&8`Ra&yA&h?m|4K+Z^QgOX-BQ)@YIBv)ecLy% -kv$-<$u+FGoBHr5<6Y8Ed8SS3x(!N`rt$V|%_00&@+5|3Re2JW(MZMV+)3N2$<AF_lzD|Ed<UNBR%1` -AYMaHbrw)~@u@BbH?EVxe9b@E*VxwJ^NVtd7Il%*ooa<W93u-KWX{gw*-U5#(Mz;J|rvSOsMmo+<Lm0 -SYi`b}WSNAVkX4Odi63v%5jDFA0bG;oIA(vrziCb1;Gl7*!1h1CVI<DU6*Dv9;l!VNK4#TJnY~u_>>8 -T=ThX(cXM6Q%qm%>T3K#HIpxs)A1C`cHt~ed3886Z~?1G<BEoS{vaQSUqBQrX0+^#I8VCHV4f2!Pxo1 -zod%^<!c4Wb;RE<?D18K9;w0!hj>lIS#(3~B9u1|_rBB&3&I(xHGiJGk)g3g~>(dp@NKMxej-RVTqAb -hhf%(ZSD_9mC{^#ES9}b<yq4Ft@;F~Ul1}ULF9LY%OBlr#k-ZPNMa#oK;z`*Wg?B5eGxGV=OYvD>WFh -onN!S$vzSQI^$ApL|@@DB+}=oFG5o56p~)kPS>guRfE4+)`@kZ|-^!qR04V?KXayq5RTCt!I^O>Cg&J -sj&gXphE_NMmTC9XQRNtS{F0Vb%Bf>97r1RI#5v2T1TLEredb>dHo>mds~5;$^`2gZ4l_KvU~wfFGLD -)aQ(lI^OjG)Z~gux%4*^IWES*gQGXX(-~2J3J{W=twpf(y$>@{x=8;%PU|P&8plJ<Z2C_uXFlXqyJ2Z -=D0N8%v?^6xa3t*M_Xe;rbW1*4`_(<LR5*OqwBCVXhvMmrd2oT&Xa?i;ee^#dYX>gF$6y(*?I0RkawH -!3$pqS;2gOcYrxerO@I^Y+!ay^J>zo7R6*`_R*LEchFvAM{NT(5m;$Zz@#lTY1Kx*tN-{5*#94|+JR{ -4fdx76QI>JVYIFu(%OM^V^Xt*<C~fu|to)g>$l+n{Y)j{%D9?1EZrF;ZuoL7w_1W6R+~oTPWbM<-9i7 -1&2lg680(RTJ<TVc$=(=cAMHsZ7RE$zM0xYv_dl+{8h0LfxWSJ0^EpU6Q@=bh1lw*{SJ^IZm7uz&E{p -7F39I!P<jSwe;bcAio8m4*@Sc=pJk?^0L)Ff8fwUh{*$h!<CSBWH~%)Ny62+Ng(M^j9KfEV^-Hl<Ck( --FV<7PPMi|JFFH6=ugM-nApnL8V{r(B1p&tgQ0hauFjYLg8HYf=a~PNTQkz2qVr#`^eXkup+dYo|;Nd -Md**PKfD9&WbTTl)uS%d4>+vJ2&*AqG^2DFkMh=z!S()5;6cS>nGA%9_oZ`b+8Tj&c@IIc8Z{5u2|Y2 -U?c^uHiVN!Q-g%fqN-5v6sfBwMNHgqVZn)b%Ky6RcEH*P}ie^Ym?iF=%P(+X}Bu;{YKEXAFd=&#HbB^ -Ym_G0KLryK<_9(F9Xogxd1vNH#s<IZjALB^(7dNe*z*zWT7vh^abf653$QJwuAmBpoKoIFsLYk(mycS -)n1p1WdiEM$ygM=f*e)!Fa{xl{=^8fJoNopOq!+N!3hg!NalZl2EMAJ56EQVRl0Ui!ezqv<lV;5T*~) -Rc|78*F3NeS6GF90S`zVA;+*<GHb+eX%YSVaLZf^?DCL)WhQ$eV31mTJq@`F=)v&^YEZD8*uLd3@pYP -rBW1n9x!<soMpI!%L1gFz&mjlMKmi{x7j{pO#q(ij;3VBBxdONOAiI65;5wx!>wOJuj%&w+wlNe%3PX -PHxL2w0L@hA4erC-ghrgtF#{p~npQ=pLmVy><0cy;t2NK^J|X!a_yx{!CCY`?A0K6DffFyh4aO!=tkx ->v+TnVQ7w^jPULnOYmi`^ov}$GqhOd^s#1s8i}eb`W!tIoyy#`f6<l!v2k9I$wEF8yVSdIV*puIp2_v -T3bHkOr{pGm)txI(6g>n#Yxe)13vBWX;!=H!%MWa9pNP-_4vHNp2P5DV;T13<G4t<Iv>Q@*!msDNs?U -Rv;!0}7;-yEbWIMWDxuU3hct1r+?30SxxfN1qYpV!%fJE$jtUc$h?Eanrd{sRoX3ZTN<F!oFPG12qP; -o@T32JSuFwsN(NTac2ZTQ~<qlQY?SS&2t&tBzo>b(6UZkeSJOgMwfK{&buTYTzB$ks3D-3v<(DoHB0_ -R;P8bK{|H4O_tdk!M}+Vv<?N(uV2YdCK1cB^TTsVPzP0jwW$n}$hKe>?<GuDXH7+vKJJPMq;9;P(#aa -o4+>Ge~p@6s)M4PCD?Tqv)ubbr_RfC$^YLhs!g(Wi4QE!bfdTcCDB4S0|O!pUMeMTyOFuicZY+46B7c -I^jFW%OG}@+%(LIGf7oK^Ca3#(7jtUKyS}L=%f(3LPMo3H~u`5VG~H@I43$eFTREqPUi|Z)<BS4`~ie -oVJ{%Dq7E2A$q{eWV;t&fKt@=+i;<fy6HvHQq`p$gAzo7|<%(C9O8L@NtO5Zl@L~BM>W!z}IjOnakb` -qcmkVrF&8Iw%WQ@a^e-XmG#k9fPF$=OyUyxOnt(;FS#;I(eRY1n?u|+pG$rcWyiL#;8!%MINcXu2{#) -rX84&ji8C)uk9VFfs3U93(+-Vro~J-iof2<vsWW4Roa3;b2tXGOb{=xeVAyai%(orkul*{R;$51)W~@ -jIawkcJjtg**tlmnf~bg5q6o4VtQbbVSEf5b|9e!mjh!FF(*U51AysXqh!W8@@<7xs@j;ir!V~1_qB> -#D(PT=s6q7edtlpsN_#(L_bLzEWgg$EKVfHTs@l{q`&!wOv$u#iR<mguOSbjgfxY8#Bp_NJ-+n|x-`| -!_|M=mxXf-6TAyLHTSLbs{_>iE_&yBQC5V(Lidv3F&)cA;@YF}JPLQ&Qh1FUNwcg8CS)hSy_09n1N(E -#Y4|HwmQZt$tWJ(sz!@FJ4#xq09>}WAm-I#+B&hRw`R^Mxb;ZheIMuREL$`%K?)jk;IMSduXCLYm3mg -TdGu~w^yMS|1>_)k0o7SHgydf*9wlU~Hhr|pPZPzuO~Fm-u!l|3~vUuUt2QRg6v?6w&)00yoE<f{D!x -$nR1hTQkA?IO94RM;PvB?l`}FC5FgOYZ#wmQRyXVV81z^e=$DCXZdd)4|pH=tt07$X44LxtEuFhXF>N -__#?N|2Qw^Jb~Sm(qk3*I0QN(`zT+;i2pBFqhSdK3W!{IC>ma@!Ey)P-H6?NDeIE%-jQk%O*6WCBas} -y4m0HulW3Di%+g<3|E)&<eFm}3Fa*_q9EHcSj8S;gdeJEO<u^1~Saa#;nW;*D4xd>uwS2I`E{h9%RE5 -_2NP@n7Ey|K5SE9u(?OG;hvx$F0Q^%8vsi>!d_BRAgXqXD^YOr&-G_sC9h#fr%<;qok8fpPN(->KI#n -GBC%hbD@4OP3vY*qv`{!@tV@X>viWOwO8?c&Kso}#`5#ro)1mQ)AjvZ*K`Nj7@z6kS;P$)uzN@X!EC0 -MNKKf&JLHMNmiB^J|dDH=^xmu(YHL#5yU<=L?#ATHXeTJY4lX<T*ApON%z(nd<d>7Q%PSVT{3T2I;eB -vlw4$%ZC{0lzdo(ch2TFo!zDTDTfMSRH^EtCnuu-1Jcn{T8%xS%X5tg2VKG<`e8hPo6-;GV#2+Aa0(3 -#qCSupK!fZ{C@SwM0dY4MdPq;rH=uZ0k5IJcIwK;3uE2<(iO$9jyE?^mFLg1P<1mGTo|jBw8ZgB!)e_ -9CUFr1&urD<0E6{R1y`@s0lm=?_*D%Bs9_rP^bDHoZL#aCDT}dmL&8vglNr~qafXhvN9K!!6!pGoYOb --aNbQWM@2Ms}!<0w|L`Dr;l2PSLp91fULb|F6V3h+5?Dn3i{@mZD&&xT!jZuZKa&tB6U>}9jF*KD4>u -Cl`GHxJkrz>9dez4O@Hy0;kKuo~=Lh+(ER$81}f<ZR;hVB+3+5Q^Cf;F)3NA~9Q`Ay+dajuJWnS@!Vk -6IE+1uNkLcBLKm$u7DoZqMou1jb3jt4R0&jD9aE4)&YRI5@7;Zwr=1ABopBUtC#~y?bs8Uj#ix9b$|i -sjDxCauFj@((zzE?f>tjr!4hisK9<7_^wWb@pHhNpbm~P3w&3J7>tMNm7Ryy_doWtDo8@Q$ih^e!{L0 -O3`z$!J4j>8u!cUGy6E<QE;j%!^$)C=Mews$C=_rcufGQw7NoM6*$iAfIY%^ro_IkZDvaW;PF^}V#%T -U7tLZH``pnipQQSA(1)+l#j{d4s<&TJXk2z76nOkOYQik`K}QO8Q!1}v#%g`ERMyH?GVI}3o!T47kmX -w`Bew`rmrad_$4EaYSMmP#ESK!7Vp3cPxj(HyMjuvX0|V-@DN+-}!)Xj)MeI?4({+csp^^R|u2Tg79M -XLFk-7<pJDGrt8KB;P%`S)iF7uZE7I2%yvqC^ZSCreC$7bxK}TAfgRPPJCZ1mJ^NQEIF}7yo~O&rMTT -(8#4a*_hG`HGXWu}+0K)4)v!s;crL?)ta8|_+x?u~i~S9*qeAQ35FNgE$DeRtEYvNuPKB^=C?Y4Sg$I -6#n#2y776`3_xR}u_aaE<bRHpgjRWi*KF9#Jt2<<W9`kW9#uL4ZWlRz|=Uvb1c;GOkB{CSioI^06&cP -!o=f0BXqBUt=lmS`4253)sNSpIkfRzdj{b5;!cA8%%wX@Zl)RJjG}k7T-9{GLp6L{BA*12ig6rfEWG5 -&#T!;C7?r$@;6h3<Ye-)pF;s_9C*40nD#n%VK9|)C?zMW*B+KwY-9OpbCeX+<!u}I=fYK)`^szR0y47 -Vsbwxw4(kWEU4G#rF4;)2wHrBQ)si;zt9k0gb>>B<<7KGAeg~2NlIn01^OU|kAC1XvPfBSXC^cQ)_rw -xkPq~;<jB}$2PT_2b!IR<U_FY-ds4|$<jx#SHgRL{#i?Os<LUP;DI~EXVoVL-{wN3)VGr8Dc`vQLfo& -le2B`wj3p87~c`?(5EA6Dpu57g`3zV(AvURFb>0mln&=KgtrLG!^be?1;J77*GCb-uPqZZKXVq8TCzl -_`uDLQQ3Uz#tjB^+_1xK#NB4!g8CTya58IJS%rR{%*}NMo9@(7HRBOPjyn$952EYgw3B_Yb;3n6P_&^ -nMmyq5d4LBYo-}!3A_Yt|KIyaVzV8yE?=bfky?SD9EZ4-!3M|vp8u2R6u|E1r(&SxT*WqDJei?2zu6q -`=JJ<-tIatPHef0aSjmOm3m&8q0~>6Z*?RWD4K;B9i!XLXeeRBGA=D8MgUvcTM1)pkiNcZjWO_(IuN5 -kc}=gTZdCT<eYnVQ!R29Q^$mi!^yuZd!HLoOauN;|U(iK0wxlSbUNkF*PvP^S6Zm`t6({9D4?bUb6^- -G$9!juR_%wSx(#2k(m)L7xguQ<EJiLDMK&bx$uDaH6l~oC&2|dQ@!xc{nQB1pOSPA#x2VhDV+eNAz5X -0JXI<?3JIg-#<wlHh9S6|!Ea2NuS)9CaqSL5_m4c9wgTT9=GYZ|IoAT}Mj3|2f}&`kfV8;*Pzt$v0vQ -Y*os)$-QpR!~cw)_bW6$;?X5h!_9Sn64J4X2#j=vc853n>b;yeD<owFT<68m(Pydk`v5c0~2O_ZTDBm -v~A_MlbciP>Y5Un6_q1=T?fs}U_w{g;lvqOg(0qknv+q(dX!=80?{AEm@0my!qfXuKqLM1d3Y<u>ryt -J!2WC8+<L79Hv>s|p+nhF=m^8FsJGhZXXtXRXW02?uW}~^)d~2gfqaT55%%=2-;4P=NLBxOB^y6$>w# -#=-|AK-%Qx1Yd}eMTn|No5m961vogR%d7-aaT4mmL*W|I|G%NtJn0$NF--7D;*g4e?fFzn$6-PQ)33B -$aHYp7B^OxD6GMwP15^7#?5K7139{#vqpXKuKBr$h1d6VMwIp>8pkyhE`nsMHjSY<2HgMmz~}0&10BZ -*I~!v5=%)+=M@WsyD&Mns5U>fML&o-n$Mo-7rHxjBZQm9h-jGE6tV59?e1Hb3p*#^kcTakCq&P)POv- -O3TA|`6W<N?GQtEo0xD=y2dV!59ovPCh4NT(xXXL0$JiEt-9utR?T3o>L-;vbnr^ZiTkNqX|-Kwy;Z} -F5mxLgbTK5wCm}}SF6Qb&2TXM?Szef5v&y@2WuWKU6b>Y}o68IN^~!7mD~ib)9-!wrCy|YId1OR%K^g -Pqb0ebF_0{I9!}B+XZ+qH7vY^HCPpzEvYQTiOSjy8?-{rVxagH&t9s=tA^$(!lgZ4NW%nm5lI<(jde2 -Y7baH13H<Do;&F1q*=4X`JWuWhtz8y(ulT)IeC73&xbbVD&8Myq2-4HUzZx!OHbwR`fld*;wQ1MsMot -MU1($!EBC=REElbZXkMwW!~b&&Zb~3Ow@<*P}oKsojvSX`i4u*5?m$s{)&^LvM;BZD{FVi@Wk03i(wl -al4rwFpSPec@DUS-#PfA7Z`%P@N4S;>Tc7*)~`AEQWmf^K`WMH`N_pVv{%R@h1=eAM%?x5I^;qIh#O5 -`60Mp{`!xXhj$oXhEDCAj1bMsFBxd`yH~rKHY)Za@!!6^Mk%F&5v^~Wj>j`f1WFVwu@oI05rhl?-ZHn -n=^Z$&%Nr@15!f;_dhkMN0GTaI~Svn1^$x=Q&XlJ%(E-R^dPWc2EK#-2Z^I3ySr;An+Q-2uDrx|lOwo -h_i5@;P1mNX=*-e4wO!|4lk>2#@xjfFos4$@_Q8ltGv%}Hfa>iX0yWs#chr$J1*)FALnfb4)$=V~d59 -XjR<>phbf!6NIWvoMkArQ>KCmZDvslF>orar8o`ZBP(hiu;W2tuS;GnLVaQO@~QA%`jQ-0Z>utbgVRR -<9r;t2T_T7)UucxU1T4F(B8-K@f1GxTNaOz>`C^(TQHxcUMsMHFYg|-TO=MBw5zl6^xfTdOBKJ)72Ra -RWVYj`m0%hAx`KO0#n{%`b2vdL6f~V+`vh4#ZV~fHN6=hb6cuN}kB1+8OH1jH8MjUW5LUWev<0pPqB? -?2+=CCbM%!{5d6U-R5QR7LBu!mOI%Fz{*MWd5US0`e+`pW~*<fN^8GNeG9>F&4!G}8W2zGQ2KGe)3*w -sDwh<W;ucD;JTL8o>`<fdK|i2fW3?!8ia&_b6129<jHP?cYbRxf7+U98UYVkY!Rw8`hK(iC#*?Ml^K% -Cg%bURp$MU9VL2#Fnk!h5Q0y=8<d)!wGsk$vzDq78We6I@L6ZRGoqWCH~u#@^QT8Ii<cw(YUCjC8sja -C}W1UWqq|)(_5=fg25zBCs6+v`5;H%LK&}vrCr>tam15sQyTH~D9hG6Bb0}+8AXD_7tQ+K=PwRMMuS> -O#4<*55ZL}HZXMc~=MUR6H1MngRt$In3j-FTl@xxB2>4jit7wW=(v>QS^rrwG$6)8Wjy*{Ks1r~0Y9& -1>NUcZC#uRN&p^=^g)AkhV{@JX6_+~(NAQLa5-upwah~yqkZU6)M$0}}H17j{X@EkIY?YYYKjh#EYU~ -rdq?z{!CU}>x(;5Z9XST?;42b59P=75&B9|}lL#v)X1?9_z-O4Bepqf~4_lHJ2YR`}L7Z=hcR@zsu<K -Dry4(*e~&JD~VN^wI$~MyH(DxdHmD;P#wWf;}V&`VwaCVZ*f|kPD;%?EcY0W)-gu4T?ATbV#k_)iL7( -bCDkettT<UoPhEU<JhdQYD$`#;iGSUjHo*ZH9ZqS#@o4$?P%{nNek;iW7y9T22)@dx8gAV^B|-$>tSm -GIax&^R04FclL1!D(?eVJ(0n}<)I$sP&~19it%p|Vp>jRs)<czg=sG=gTNzFhMqG{&FkG*nGiHNq58! -SWbm4iO5eqFE&X@>Xci^KjT-UG9(nII;IJS&$-vD`M`DvdMCdXBV(<SD%XvGP5+vOWM2@3iC*om9Yq5 -btYST23*YfVFRX47})SvG6%ZKt*Rx8@&<Y`B}5LFZpU_muh$A1OhfgMb$R{My@ra(wT72`BFDzycQN( -gVdTz^3$VxeOsVQi5c$7s&v4eHj9BVzylND*Hf-QQ;n>ELOxGq=uLcGoHR4u#sWMUY&%HAom)SBeX`@ -9zEvqYHy=1i4Mqg@(0lG63k9Y9%MWBI*id+9ovk?>ZEBjmeoO@0wjm2yn~b>J_dfb01=dBeMjrro22U -UBtG|Cp2Fwii}Cp#hRahBm*)*%ip%H{m`>ke{$=axjqR#xpYChmPdW<dZUX3dFs!{z`dw#)`_RLaj1- -*@FSE)CYok<6?{abIgSgCE>pHQi@-PRgIeeH&ho!^S(I|M)X>#-BhR@i<@KOiFE@H8_8?oXwQO)cP&p -&J|u&i>4CuMB--ci!zPODFQXD@4vheuyVeLofyHfykezFL6gAQK$T&wzm-ZNdCCAZA^GUcM;vJc<OFb -_Ou>_V+-VGWKDHzhxh0CIEKO8{bRvdW1a$07ECxceJ(=xw`Lg@B41<2tNGZ=q^&vc*J3fQ1pL+@`DI^ -XwKJ3Sws05eglN8&1w9keqGA!XPEU(Xi0%aEM91dwk%-Q{4box4SRlNzOef!IePJaeo`>0TxjVM4lT~ -D_6djXNpl|ehs$}~-JU|4?4;7}I@_25QorS0*ZIcGC30kr>+MF$hW(=A^zwoufd~w%u1oGg>E0`!=0_ -FC1SpUxZBb$36@KYf`zx8Kj*8N1XxCM2S3*zmvJ@UtZXoW$D4j9XBlnt;=J_!?r>>MSE5Gx23+{D9Sk -K3Za?Z#%WWcs#0`Ic_x%Xw@V3}??F|qM;Hl)@+_r2^MHJ>2+8|xp5+fY7=o9iUuJXx!}V1;U2=Y`e{0 -0`pF%?sJ~I0!-MdPM0$-4z4a4hO|R!spPImJu8Zq4jzI3QT<!1~C^jnio$10sHA*SIW|d=Uf8l)OaM* -x|s7-H|!msw%Bl?eD1uN831MkPQT*js(tkCWIoZJv_KSmp}{isT}W_4s}^p)(nqg^K-lWpjf|?R==Gr -G*x5iI6j1bTH7qJgQ=Rle;1on2!DjjV^y$*1EpVT90J{uv|DKBbdB9O%;sOss20xv;K=*Q6SB?MT_o6 -LhK+9Xe<Q3N$5!4_}T<nar+n2TNvhgG6IyrTj$h*r>Rd1x#;Sg5f4Tmtz+g5j;F8VI+Od1hD?GfGAzJ -47VamJrOBMyx88#m}fFXlnu=neX?&oG8vni#+lr?W@Uo1dvRY@r9SD}ZKMl)hfV&9rV9_J^W-Q6VDH6 -y1fofur_1kFOc}(&e#l66oEZk7_)19l{@~>^|}(@EubH2*D%0TPFB|{8%R)Xv%eR8T#jN;#42~^lM#N -IZiwdn6I>y@{~=g98g(W%!Cms54Y0=)qdy6ASf!eVbBQbde1yrT9*qN+sA)TiS0Y#6J>v9@osXUso!; -8oa8zq<<aLy!RmD|^={?@0?f~q*kS=SLzAY4J!sF0c~0Xw7SJRViFy^OSF7Qfn_@1^UWuz?+f1#hZ)- -a7^tR=z;~<Z>n$9yJE5;SdMm)Ky;Ea^k^|jr$NE053$kfcX%nfI&Tn^eZZ?rvcoM!E*>!>Dm4n|+0le -mE_IZ7qFG~OAB{}+G(i%JI;1+syIesMaPnfVmZ4<HP!*G+M*^P8_E3zk;<0<ZiOn8^!FW6wvE&oX)tt -6DHqs-;iCm$E?hl6=1bxLXJ8EMKH?2t7$|a%j?J^gbicY`PWm<f~Idk$b0frZFG~y@R!7CfonkJHmLS -v1;UB;*oS#uO#Uwf>Y$953&;zcHFFg{647B!HUGC2z_F3Mz4X<ecUZ()34QJZR*F>&XbRu#EHr}>*Ef -g6$gT>;N{*CB}b{i!q7RO%M9ND0SoyP=w&3$qa}UNgh+v_U$oP??Az_?m$K1ybjAvuX3~B1l`8lgs<5 -Mbh+k-JX5uSP7KJNKN)B0(UzE5>Sz&dZ-#*QczHc<PJn3DcR>@rjP%EO?y`;)6pVh=E^4Sq_B8keqGs -v;%Ia{<h&0=LfC93W4nn5===(ZM!xj}Pv^-B6sImgX93J8bTG#hGduj1Qybs{JLesq+<>ei&HD{UGUG -mLRk(M@AE5_kRDq>CNe3CNe76?UY+JLs|jm_z7D<p$_RWdQm>a$MO=oE=ZH7mNU*R&JEi=~YFjM3M@t -%eLSGBu>QMr_y=)1T0ueg%x54-5brIb60LOLnS6PlkiZo+lq;u>*|;m_dgQw%+FGk@aMQrz|UVqz*B* -M^Xd6`3hdtuu-$CCi_t0&D$r>Qkb!pN<_yrwk+jvcu=Pfu?-XGJDtgD#vJYr^3DR;Vqh-z0n<VEt=Gc -xC@C~%?P9-v0cQ9ISP|CNDd<(JPINJ7)=>JCSzrTdo&8f_Bf+c)KzmeFBeg!oA^HE~IiFQ++aO>!clo -9)CM(hkQFoK5*0JK3_zI|jYx&PA0^&P5EM()#r+^69|gdCmV8)=H*^XMf6Z@6gZ(JGqiasQ{97C*=6$ -Nso1w0^-MEeoMf@og5fbZTJ^Q*sx&^5}#LI_I*RakJS5IHsg&oAb5JypOI=XFfW2rRn&OE`vfVjtf&v -?!!&b3j2N1N*}!;-SE>Z_R*{L?-8*OWS7e!5KY*8;e~7~osNSr5N0hBWqNJBL6PllYvFwh?~~GT*Bj* -QmhH?}NXo-*T<k&wt0&3PR#=6Dro~E*nu|iR-0P4djtpP}4OaA$8C}Sxk{UMg!I3qJ=d@DO2i#{0vvA -7=9L@bS#rpumn?R(i#={recvnd?G`4XDwS9`yLe)=_fb{-Pbb44}LvMKKnjihg^xl#5=qG9I%ZsgpQI -nKQyFOu=f1k>%23pP`t!!DL)D5`a6k5}ukin=~2wi~wmDbtClJ@fALUW`i(dHQujzlVh)>?5=rIbUC4 -)q}al|LF$Y8<4_uGICbKha~QNpziFQ~4(;MELY?nx<Y)jvk{*mBSTnv?v}2B6xHH>QS|j9Y|q19sfyE -u%MIKCvObKkF2QpC7q%_TLifTr95X2lJn}Ec|@?hKDgLgNjk)zwBKZFKAR~vGT-VAT9u=@X@qObB0_k -n$=H19EYGoJie4hLFVC5cz#ayCV;fHdx1Iw*%{u7pOldX)y#hfeGtk^5D1cdXuq!fyT)2v^gl>6Bx;8 -&e%j;sYkI=f+g4;JV)Gf6A5I$X14&i6(F)rOyH4rXOvkr32LMz%6p=PttifS&%L7C02Ov%>FTUASQ!F -f{Gk1lu}N*!>p0oMsZKE|<Kp?1^4$wKQNAh0l7w6|H7E`~9V|D0)a1C_3>P5I%)CUg(XlA~rw>a=945 -{$q4L(SuWHhU=Z!qhHqwUntFmf#CUhr;NP^g(E9rI_2?q-BcFc3QGYdV7`Dwmi+I&UV%HOKB|OQJ5!9 -_Y7T9#(d9Mv=!i&LW4>@4&lBEKsz;$r0acmV<*k3t=$BTCmlteew+a4q!8*sh6p2w#<pA9vs$~irY() -{WYVHrIM}TUppWmE0F^i9+#(#zayLKg1>KPoY5N4>;LE}h1%sh(DVrYp81V^DPOCpz?CO%NmJ_O*2!r -L<LYHPQZCib<O-`7%WwcKqLfh(`*-PbwMM{RQSXy*K9Y1v9;h<?19(AMv=8xb2b-Adn{}{z}xmuI@L7 -pBxJcZuC5ovzXeV&=K<f_xSc?DuLnyG%$gLW&=Y2Z#mh_Fqtfw-){$z{%NR|iPrmIxH2ET34cb^=ahH -OT)nQm|bp7~?~{d=}8+T_m8h+2XhcB}?uw%MmloeEa~zoB=sH;)-sXj)#`y(oE3OB34KZX2$QwWfhR9 -6?1zWW&=yiVNc>)v1Bd7lA0uz%xRFD5}D#3gV}2u6boWX0x<<Y&cerRlHOUKc15OoC1Osx4jf{rGlB! -0&eS=F9-pBX0_{&C&}2lQNkG$Lj&(2%5h%y3W;75^2ZKogmKOg7YQe01LEAc4C#-P){b7o8KKmi=3de -)EY$kpvgz%`XeCKH{e%lDMzM&KqbOd_QcJea7vTcYFVAstb>g@W?5680WgNUgoxALxOj8{*lwFcOt(J -DXeg;pOY9l)lOEc%S@SWMD|Bjv?bQ1!)5-8<dmm=bZrYC7I1W~evGOw~ixw7kafu*Bgmwwgpk&aS4vI -Ggk=RWGAQdsB74+{?;Ax6Y)&$8H#WuKf^AJ#~CF-BmNzmx4Kc?nu>3XZ9NM3voL}7yVpV^wG8D`|Nn{ -1iAvC^b=ZNeE_4@sa7(MIT2)>#&JH@Ox`%>WLIM;&-m}K{ZTuEeGXtZ<xne@G_zLW$(QOMgA>;zcks# -TLObrEhK`Fr09CrYkZ+Ah6I;%qpx&4xmu<~PMbj4F?gROqoR!a68?PODSN_l<+KZ00rOPps95+dWq$} -FXTcY@K!0ToCBTF=H7Sql=2?b~BaGxO@R8ZdmPit}+U+xQgo-rIygYIC#Iv*{|Mja4HHY)Lm4g#?7@P -oL1?PadqYz226-E_SivB{O^wT75m<1&>>3w+GrGCSRuL%`Wqc?~IH?&cA9*n7UElNlD@ZhWoU-%wihi -O`zEsGGW?LaPNo^BKtwTRM&)Bpx?^f18=SU&@fM>FyUFgBP}tK4Le_jw@vwrWJ(SSdMgH0M{CAl5e+g -&9~2JmTz}*di&s6kO_^u29{fBlI3-1l<QdIaXDtytJwA*Y8qi*PAznDdn39SFk9_yC~^5o)o^<TNFQR -=V3e1#V90v(J)kl&1c*;!KnZ~Tmiam{U}jJ}Jj3l=TZNTvorWvyDVHLl6_o?6f|orB>oUzV>^i^ge&< -PY28&?BhQ0$Dh?P)xTJs8PvwBZwg|!7l3tMn-jhY!=%8ZzD<ZG{ClS#;$CN2qS;v#>lZBC{|DT`n^kg -ycDnt^M96+ZcYXp=Y(+M{M7SS$^xYN>qQBJ2vFHp1py%X<|qD>^?xJ#8>0E&FKhN?lF`N$9fo#&8q0$ -`5f!7+BL=$(G`gKICR-3`Rqjm!`jmiwb0z!h}D=LsaJ}VLUcaaKUixb_BQ&fs=9Xjp1YmPwBknUr&wY -WV<irWDgi%VhW62cIyAa$*SpZyx+#B21my5smY@y&ph?5d`dZ$<Wqg#6rZX#jtG#h<_|5-lg($%lKTn -N+{IE*9{glcQ6i*mpXc}b^vyFb%`el>PsAhv^0h|p73AIvctjwbsnV}#^^g%ocO`8d>9|C_0o4S3Mrz -e-d~}<>=`OMp6*GoF%|_89*T;_HdTIA6G$Wj-of5(M!a2wd6yO|eJDJ+tJ{2_4xxM<1;6;9YGB?JrZ- -KauaLg~y2i<6U3sq3(@g+*laMJURRN4olvUp8t4KI!J(wnhmND9+67~e^yO}vx~g1sns=`}`@WXbTHf -?6qx*cEE4QzKIEs88U}StT9GDHxBq(Zriz8bk~6oT3;0ie3pO`pfs(hNOv|Xc&83!AHNl!cfAzdl*uV -n52xsW)vw*Ac~HdrKyANa!?|IW@=x7;yp=F3+AbH#n4PRgk~78et*HJq(KrenwpPRR~ZV=ML1vE30TG -fJ=^_Meb=B3wspctpc04w!n<Qg;OTdD-2U~uV@aU(QWDr@fZdY<qq*<?-$>x$s!K=!kpC~n){8388KV -_{1IqvE-6YC?S@n;HV#Mj7jZOyLm=<?xT1$g{NWVKlNmD>?uCR`A&?a2V0_L-IrM%T)kqU`Bx2(YS%S -mEh+2#1kDVvF}^fJ!<FrLGRy@w^C2`8}7=Qh0Nosp!Mo&2G`_baqshs)54+ei&hqW)5c2tuSi{4APbU -9rY5TB7VLy2+{^u*Usb;^jlfrF3T`{x$acoK3RJxAQ2`$NN}>Nk1S=s_fNd-R;VX+exKWKFbRsl(B+^ -wPgEk^7>MqlcV;QvsnJNzY~sZUtb1dYedS3RjfzqQMZ>pm<;0vp8BJ*pC`jOzv{ZOUnawNd{A9c7EXr -ImY^;wdmtG`jYGY<>=(&!JBFv19WWc=Fotu=p22WBgi(IhHm?uz+VNUt`+DFk(7}}$Sa<tcW;LlZHoi -*BPT=Vk8y%XCTedG58+b<&Z@Iblw1ov*K(-OD281qLI8(}Sc84@!ca)qJ4o19m_pSN~Y*R&r`X+#;SG -1>rB=j}gp_f^~Sn?y&@l;R=o<D&K@o+ApIO>NB%S6*MA3X&CwP7*M#Ik=Dv@Y}0AF}%hYHO9Uezf~(; -wyRy)vD7+pM(s}i^^)lYfR$IpsAYPh-Z~*72Mpr(O2!I<8Mvwjw}OF!E&Z~5hrzNtN<G708*NbpPc+1 -E@pcbnrUJhUG3WXbsbs>R!Hj^6n?VxurIl%v-~f~lgleX^{sYBd`dd`iqzO+sQBQCHZcQ<+rwLx2_P9 -YFPbT#k<K&x^h{xQqymk!3$=8R@c8z$HZ$;0d;4_ZV28JYdUOl0I6+It<LF{0AYgl%=CQY#Dxd<WuJx -pN9XsXsMDzIq(bjxEL;80p$=bO@<B-Ckn?h?Gnt?MXS{G(WX%*_373#+<p-1PT95m3QH_)M(oF|u}Lw -v>J=0&%OXR)<cptWWOJ6~!KSAgO^Q?inNH5>i)pc~K$=)<u%=z`;KVwIb3TLK;GmcGQkzzm8ttc^T0; -g*FN;<C_5u}nA;@dEHHdV7`L$?Wzt=$_s=Eq%17YBnu1KrD~|Nj3J0xDR*|WKZujb2ws{!4c142Zs1{ -YY`Thqh=a&TGM&b=P#XR;P#ZM$&EZd6F2hOrrEPlGCF|{;E3`{2?zM#>JZbRZwvAziy{q^nqgEotE<C -J12mJ}gOmWADnm2xrkhcFJ*#b6LK4wW&0(wHiZ)*FrHv-$7~nc1&NZ@IM*Kc3p!-6yfXcmnBk18kN06 -bZ7Tt(Brs+N{uMZcR6V5@``%Jaj(opIY9iTfmlom?~<K6EkWxeRQ=<^kI_>Lvq-fEu@lyL1G6vI2k1z -!3wN(y-Bv{Ss&2dYoPt4RX@rM-hU$)GpD)(9>H(r~qwcM9tS?94E}Q~UkKAr{<+mG4Y2M633{xZ)G{b -I;*@fUsC*hdRWJp`N{X^hv$bhyB*_2AK2Guv1ECdHq;kzwQfx@6+s!mvd-&l+`=n^z=LXT|-j(kz1i; -)e$-)*-2;ixMds%`cYQD!kn0g-d0Mm7G~y_XKzDI%UBcq&Oy}U3L>~WTpQA)@08jcFwL81z<?&uGkqs -T<Ch+Z!%q594tZG@P*a64sTWIX`WQ<>Hu8TitK*WgjFLXOS!ZTY(7aNQUHm_m7EOuH0hAm5d<>SvlS& -;PI*{JRd8-=^TI!XiURN0kZB47m5EGzEr|uU$$&(Zya_#Fhq%jLfW3raJZO+99CVrhf2Z4tr8jg%PEU -`@8bE$Vm>oHyMn*5iPyd|HW5A-(ZaWwl#zfyOqt!_lAOT;{{>h7gIVun)pR;NdEsF^X(TgWEc>a?)ul -$U<GTt5&JdOr=Xl>`Mk<Z(#jhdd6>ozCGc8K*>RbCuRiJPx_nQq=J*WRCm^9?jy?N^wr5SU~UTL1V9+ -qtVqpNzFg;25SEC_n8@KK%D|@1HO#Ka!~AP-Id&}T9ldr;>is<(5dsg@VgRz)8OZjsax7tS~I}7-D!1 -t%ySyetZE*7pjlS6!v{NPWKrrszH$5s3g%`VeHJbA{ugmUaYc7H#W}!J3V}i{D?<amxVj84(v+@>c_= -GoHGJSji|Q@#!75l%#@PUHei;WN0$GoWbLj(bBzxHSMzV(!Sq~Y7#yt9|)^zw_{$d_S%+rs?h)_(NNV -0o@(F`4%Rh8e`y*1r9qV>329N$ufcQaaBss`|Ikz94!`UGw#h?b0|{>KZ%3_YD!vmSSd>3YCH$Ccx8E -lo*tbx4=fuU}_ksWP3Ocpb$^yorat2A_nB->$P~QZ~%ahiFoNjIFbpM8lp}ffJnuW`qO+{Hhm9+XyTb -JuV`%x?EjS5lop$oZWKg09vD1cE|;J|1slt$@Sl+e2yfIpY^Y!FPxLL4A^5Fv@0mGH>q<=<^O9Lcz4d -E*V#ooy@pOODE*H1zJ~oq7Z>$WU16`%QVM&O#v}CgbRUQjB#rdQy)#CS^y8*aZ95=$x2bKp+4>LZkQ^ ->I7d96(w^dzezVkw5Ta_m57>qUxt&f}WM6SauZVZ~Mq5Qf12CH(NmnPAAXj97qltD!=B+{=mEv_-^;t -38d?I$qyv%fL@7y3TAL2f!RS(-p%53j<M4=Z&2v_m|~HaxDUFMq*cA!h%eM}zw3K>aTwi9U-eXQ;^ms -;uYKte9lWsB);F**O3SXT@AmvAhhCOPmXGJ-lX?;W0NBGV38L$7FshCr$74jF{AXSlJKb8ApZ%nGk1I -t?=Xw;uTt-!du2PXonj#SRwR?ZmwpGVOF#Z>00**EMr{a9#>Qd-D_B_V#3ZJ;d#k~d2^1Oux>7r6E-2 -V7SBc=@r*dNN}+W+1S*BlG81m^_Gu#^@SEe~(VNKZ_rp+pQONAVSx3cJ{Vd}BLSx6=)giRr52GBkggt -#Yj%|I$s0po`nUU8l1_3XG5MHm^($x3Gb1!nz8tipkzh;m%@HMudXcl(<06no1R^exU{c1_9?4D%pLM -y7+dJAsTBWE3jnnEb~$J3d#(l;A#!YCVohcp@Bdi#+Eu6e~^A&QiU*F(q3u#?ghf6$CDe^0gfC`c@9_ -!qHSI`tIwUtn0U<w46@(oq!ihRe%XZ<ox|?WedE`ZLICNw_}P@gA@Wz-v6oOYC7rS%Be)*QUaD{<^A> -<_~ui^WO%6drOXJ+!6UOz4@aZnJ+gtUEtby>2k)+r(iCGO=Z+`S)2KSi#W-4#!0rO$TrDKf)->YfI73 -0!>~()@{m;lM@j9O%z0VUzO^3U4A;};fM&JvJ$SL;_2l(2y<i+fvF3o#7q2;|Y0M#uW_N@75X=p<;et -NUZP;P(o`Zbjwlir0-PN7s^2OcEf?W%|A9RQ&-nb8~v}vjc1eZH|$B6D0=@wsBnuf=EyC4pdPI_CyxK -yQgtW!4uz8M3V8CH}7-ORlk>Mw2T6X%pR_39&wXRp~r82uUTF)d3O0@!6xV-Mlc%eApSHXt@SBh`M~F -=@qP#Gn|3PD+#MlU*sB{tEbH8xHIMG4neRKLAlRH(b?E5532ZTFF~;Icagx2f`t%OHM3q%$5`1+roqF -A{^>h&7@yAl#bC^7@fwVBXZ2FRXN1+hR~pRV}q+->`)h=xG5a6c<H~D<6-E2J)G{P_m?vQ!tE)R4f2b -bnA3(iyM#mVzq2UX3|h@P5mb+a{QZp=M*S?xmV?;F`J{VM&4ZpYZ(U}ryNpI-sh+Nn89i0+0Cfk{r;m -!hgdXKw(xV>eQIBxQ^bb9XvK~RZj$^xe#17W3qeW45LXaEva*~-{(~;Wq#~Z+Oe^pc=c`PFjipSe4vm -0DyiHCyaqh|FJh!hTG7Dd@rsMS7y4Kn`#A7FR)(s|V!SC{nRy!8Cob?j(c<*>7hn)b8vV-Dh-vx;~NS -J7OyufqSs@i9CUS6=9-@dif%j=-g7;qcy3tM0oBP;>As9G-&H#2e&oh4VBq%_SDj+k91c{$^r-T3KFb -$768Yo`z-QGW{G}`O`eTi8DUx*{&5f+wev;4#GJj>j?|D+-t=)NDi{nPFC4VSMrjLb*-a%<#Ue?f>x7 -dd=RYb7G7CuRqnRetn{v_t*c#o)XHf+9rTZ{FfVdGIFUXBpS6QF5WzXKI4)=k0NJ^N7TVXrxF~!*^+( -_Y`ac+NKl&R1zavdNiIQWMPS?n0-jxvUdlXvHa+d8ZO-=4BP4N5VPX+lC!8Nk3Ub4l1w1ne^V(cog+- -Te^e`Jx*@{M!P?9&P#>Ip)dV}HU#Ic{yVgA{G)(h5U;KY)2H4EI9vgYaID?*WJ_fRA$c%{tbe)|TF0V -QO1uYOgRuv2DxDa;HU(vBF<X6&}866qZ4m<W8g`g!*j?>Ombw?nD^e*n-ryv1P>I^$h%;g5P8C`wjed -!*3V-TCor1_xCB~5A?yC!kfbTG`vs4yC2^D@E(Bo0K60MPQZH@-os%l+Qv9bza^0z4GlX@;Wq$3{%+J -h`E~W(9S>p)$A0U*H)5cT7mWxEM-nzHUOOD#Ryu6VLE-2eWM4S5Zy4&`umS5GdKX4|>IT-|<eZ$<=cE -YdWaHgzP7wIPX83*#ey_r>y}~l<Slcp-{5c!FFWBh)aZJ(JHUnmKu097yHVbWIARin92SB59_PIs=0- -G${hqjiB%PxS|9QYN(Zvp(=@T-KM7k+naU~@AS#(FBe^WmKj?_7B2!rK9F2fXd@w!@o;HxF+sysa0{j -Xp-(;Moel-SB&S!<f0Lut2NF%moWyJP%{zE}Fa14P|k>O!<}t@4biqQ(k)SAAn5jQX4rXcwP$c`SNRT -lb@jwiKZnl1`dx6JTo>B84ZN%y)h4ue6i)Hi3rfXm_aN?n*7sYH0dq1Cc_;Lt%{eRfVTkNhDAc`s5=` -r1Fxw=F&>-tJUb)u|53Am@8hNDV>Y~Y;#R2hq#tyGAD68G4O0w|o!B&pSXY`aeUI!stcNax&;&2d`90 -v(LCi%@EMZ4Sc0O|vz~6tD0$9NSw1ezu&tFF4U;Z6C5W6#?XDo+|ZnE<w2wgRT4W&;20NIJ6#*4@@K| -H0uVo^OtsErkd`DxSd*g{EmVn@rma9F04{u<katy#SY6vTs=L|3y~!`oAXxI-VraU>lYkp+zaOu7bvO -6!Nk@no5GG&&!n<ro{&n2%;)@S-_JdB>%r=6oM1b`6Ph{K^6vL^n@78RDa#<NXhdxLQeQ8DU4h(tUIj -?%$BuI<~dMjuk(S0_ENpLBRX43%5r0Fn8ICjp9ss`vy*&N?*q4jT_i;xdQr6PqE{2^x%tV&9T$jFC~u -+mY_eb+_}L=YuP=mV-Dyrlf@B$p5B4ErM`}<9s?!@RZy#VnM|`qd!=Y`Mmi4To&Ft%$FrxE$LBaJGt| -MN-_I6kyqbTi-%IzukNZ3z%8;nC-KuQomF@QEhmNdhc)R1tC!c&456QuT3BX0Kzla&zb4_gy_pQ=Uc; -_^<=yEKMhqx8eQ1Y-&%jv1Mi;j-?!y$^BqS|Jwmd8ci95d12mi{m^{kOHUTl(FuSmQu@=yL$=3}Hk;Y -eXy#Kk@}c2nV}_gBDlUmWf4Cw>P{y8`FaYtLWd~V{3Z*QWHp!tr6*M5XUy--!4Gs#?4kQ)QzBCb~Wnf -OOb4<As%93X8oyTKV+(=dzPSdQf>eYj|B*@`{EF28v`oDaogp=YS6_Yr+InWG)Ma`8y2gM!|m2Qj4Hq -=D5z~$8V;D6-u4^zfqi{ZU8N6WEYt_Z{5u}n>7L8J$wT-Ix8`87r6>Ho0{Q%;Et$>BbEY}MD+|<Y`P` -%}b_^DTSN67n*5Ao-i(PLtb|x?Q7~IFshS&pLh@0sz00wzF(N3Y`=CY0AG<gT$=4E6{z(C7ap3u>9#t -Vp++4TNs^8DnMfFkv|N|-<R^*|VtePfPNj_5}zee?;;zXySoWdXvVA)D{wgRsn4c0ZsmRIoZS#)|2vh -M7UV<Hlo}rcBGn+t5cwr0Fpmelput9uK&)pl(?77;1pJP#(D;jUNkQ1rYV5JTfee$9p2&*3m@uCCr<S -8v(a(yg)if?dt^>T@zzxTiA5He$r`BY2sZYQV!{$e`42($MJF|=oly*hus(OLSx)bL*s6wxD4%dji0t -?^a7r75>bBC;_N%XE`f@9wLE)N_h<3pHBlZ4xW|YBqrQuWqL9$SOQ-t0)PcSN$Csd|#80itCVOcO6?P -)cG&g+?MZO7NVd;zZoYrok6%c?E4psoAbjP3IE-I$`uXuW_4~n_FyI7HW!~gBo=SD4pl^Td_u5fUXa4 -@36koC4VFN8$C+%*kKGc9u^Hh+eHWTMlI+ju=Nahj)B?&RgBUMrN)7$-4kTWl#hU2yaVc$7L#S!xe2b -%d32DCm0)<k|+M81<Zp`DW=$a)zD3j6Va|(7fC-&FXeVHxFX*+ci!I6~my1mrj2cSCnR+ci$wPh2@cs -gDg<0Qq8LtWfO1kES**T6j_z}pQR-@&q8SR2=h}*9g_O{e=tJG4NxS6k!K;bs#l{6I&gNCrc)Ge%pvs -wm~(m$UgP88T}!P(s~@MLz>LnwpCVnH2%QvKD<JY&yn_lzf}B6IPoBm8E&_e#g3hgb(VRZaRM1oG47f -oh<48rIOs5ksZTT&3AFK;hld}EnxaVNSMzaw546+T{kUC952t*`2P@Z)pNrFqQd*?v^$WngqJodKlEy -jz@BCtfr30sq+fh=F@Xi)5)sSxc}DN89sBxuTRU!Fg;t*!VxNRMh<Pe6)j0)~~39Hy;p!7!$MqA{vXH -G2Z1=2XMG_F==PVO+KL&P5ATF*G*xJd(3I8+T6%TF&das_8E<7cDuQ@?f;eclM$cgdT*r)K>NQ;05Z# -l{IENk=hhas?j_irugbmN}Ye`kl~DY(cRUKD7)svOifs&acYz4%TacLb78wljv~IV&?BTT*u^a2#|p> -1i0M!4Zss1jUvnOnqt++b)y$ME9)_IPwf2dHKwcUsf=FeWXjWefFV?V@qG(5W@kr|HLh5VS_%gUn;V8 -Gkzit9pLp*k$A7+JqbwqbVmCNR%SwrzqsVT7k1Ww6s*sdfZp#xRyGIlonu@h`6kae(w7VP*nh>U^Vn6 -MWM(cZyuGYc<Bh1aw2!en@Fc^3P#ERMi(y+n+2L);#GkSeMllXgYLWu@5&E8ghE!_xRk5_rElNK*4cC -&f9~7;#d#>eR}h9k}_*pvkMfiRb(VJqeSP(Ng8WKWC*n_h4IG9xBddC&|T`T94v6jd}MhG*SdTg~vSy -Ow>wPe=yF$OfG$BR>VY<#8L!5{BQczR!Lu^(IYi^^bZG;#=YtT`W6ldgLv!^JyP(`hrCDLZjf)_#5DP -+`BrHFdi811F|^ny)=c1GXt=T5Dt(TBszEvm8ED;sQ8(59(p8-rylOkwr=RaRE;&kT*!dnNdE!30-k1 -q=W~wor&oE2ldys>*!>sm<X_Z-hiyW2DYf?V>3awVym>i=q-+{)cGs%}lUkQioX$=aG`_p)e@>bDui= -?9SBc9+vWhQhlI~9xtIY^Z~=xtESZys3_$8`=Wp}%}4)suKoGw%Lme>1@-RQkHe!yijj)_u$1u6icfp -TVb7gNuheB^wUy2juOd9{iIFc-5ue%G6N4g+n=hv;pe#qsLFTPM6P`x7+2j7AbcR-V|Hc!Cp$X9-x1H -I>i^7o;LWx;9|QQCh=Y#s9w9tx;2Z8Ycp#mT;%M+k;qCf6=TL(F3FOS)}f^t2NMUE+TA|VPtX@Z%$9! -&oChQZyD3dwB!7qfrGo9nFevSuR%Iuz(B0_j>EY!?nv^5oc%>weSN7jXw`=U~Z*Iq5@PY^%@eC{J$zy -pfr<=`}+)HQI|I`C0BxuPEho2gAr(7TVLne>2XFq#(u_tBESK0G1_QV_Js2LOu+Wkii{|3S!*%i@0{V -_E@b@18z!eK~3y)%T%7Ro~C67>Bnc7n<+t@F_Yh+wsU!oyIwaXke+YA2E|`NJ8cKRRNIewb#lA7Ez~& -E)05#f3Yhe?_=S2$!3**Rzw3VFT*upu4bH2;GAiIOuv`XuS)*+9xOn*j0K5*j0K5o@dWT;o0`k7w~L7 -F0}qJljD{ukKna=r3_furQj97OL`Zs*&+x>jtU2x3*Lox_6m#%gt3sjBN@WMR^AQqK|V^Y>y!{iyE=u -|FHmhruXRO*pA|qkT4CsepP{#f9L52KQQI|UM7zd}aer!z<DX{Wmeo<27KoKHwTSbJI>o}uN--A#LZ} -;3GY%kl{0Mx?Vf?hl|CstV#eWOmE$kch<oG|QlFV@e-_7T)l;+7Xt3LT;$FTAOwggC6*)Uq-5W870{y -m5xtfhBHGKC{Ahs*gMz2)&65qKZ=i;Fvra<90!Txyh?%gSX#5a(Hm^pX-W9RE9yrQ9UeG@lEI<;~|di -22Ruwg{oW@W~FLTY0<_!CV`piA#-0;Q9I-#-HSq9dN||J@s7>|0R64TNYj~O>h3GX}**X%AAq6IhFUv -0JG4^Ag<FP_8|mb0&752A;fy2)r0RJ2(4xK{;|+nf^SJ^y$au3h1S{lUL&+l!xrpA+<+I(Ef)?U@p*- -VN4@l_Jmw$K9ztZS6=#w#l4O{nA^lg7NZTz2YPQ1q`w)teV<GNEG55K29aj?Tg$E9y2GCk##x2Hb;Q@ -4{5SPnzvFHHgK?LF}D}~VGAd@s7Er>BpWbPV_7~<8CZ-}8`F|=9;;h)1CGv*I)W0R%K(Imp=RX(dpHu -jeh00VSD2Oa?!#Ra_EQfNJI#Xry>W$l@dep2khOTwNphWzY?*={RdTnpnj6{IL=_l}~d(E2p)-9r1(r -Gl_hzo8<rSU9w7SXZWvzdRKVA@zIdrzOT!<>HJOqd%syO=w>>+!oUB#ynv}>KXO6#qY)H(o<Ls*%y*Z -E37Rgdfhkz!i$^|MrbkjVf^b$W4baQyP{8hd=CCC#Nt%9^$WFY<7hmQ6B~sGt~cZS&1Ca;r?3nEFru8 -eOSu1OwrTtWajTs8k$9z?_^}ZB7}5q={muGV=sZr`U`z{?q24ZsFvUvPi)<XGo5$%^k(<$|z;YLe_68 -C{bix&s*FTlC(E*AtvZaQb746o?DHEkZ7BLh>5)xY9LrcO4S(YIF;dqAml3X%l1zec@B`<clwekqN>@ -@UicsAK%i~*nlP7O-qn$O)O-JwUZS@M^%@9k+ipJ-u);r`L~GID^$bk>>hR-`xH1*&2AT&sj0)#uA$T -&sEjYa%DqOub;tPSSO`Q;zXUs2P)&4J)Bmq%oaNwF5{cKwuiHM#lk&{WSx@9MxW}#Qin9lc<NhfPIx; -n%eRyGG1|-(Q7H!D6U#7S#H4A);7O@?Yv9M$D8Fw0V+oUTvtisj0rWdWeWRI9e;`ShP5Y*3%7cuOg9O -wA}|Obkk+-RpyEn##FU(b7+c`+5R`#5`Xu6CS_S3>@a+u1y0SBb_stf!h5o{F;nIZaSA5(En`j3zhRa -46=?z8;#C&}~2BRPg2`?@iR;@^W533Vk95K@JFf5wKM}ek<j_<f^n>7^KG;ZjGe4HEl>uC23a(WQje2 -$!u%udZ1y(DrlOqeV)o;;-gg^7!>f^=lXq_oRfqr=h}eTmT+a|%Uvq+zmn6=5BJc$L>*P0jd6!lK2>B -RXP`bMo2J?P(S^rfoSZ)EB~@Gew;hM#B(gL%JZrNc|4xZT@<5X|cFQW7JRBv(r@UR^2x>$O}L_1vwPt -+OLWj1|CbOa~SI@zJ&Fu={Ge4w9U<AU>#doRq_i+hcM>2U8$2B4r2*S1)f34(5LGvbuyX=jZl$lN9*7 -?Jyf7iBJ&($t9B79xX6$?e$7g>OS4Hroi=uL*<Wxg&Hox(fFVt^hO`|YXa_JCc>yIq@(2TFl>m=rE7I -hzlYE7*trf4<Kdn&s3s{djNiP~C*y3C1a|0I_{;~W5<C6LWiBc%C{T^~aABqPru)oTvh4I51ObdGkpv -pE3$em`IU2Jf6>H1O@D_*S~XuGtfEDvkuCRR0;#nskIzg1_+?8aqHovdd7`tD_YW6&P<7b5hga@(#mI -wj6EI`t2u_R*P3MooSJ84>978k0TgM<CP7`&e8pVat2FrH#n|t$4L9BNpdidry2l8-FG}fTqAc(uGiX -;2TA3opq;_RR4phq=s+e?%Ltz);GDiU%~Gy_$}J*=5B`HgYY}L!>!+;v2rC^2tY|tJPFXK{65ed=wI* -@<r`Y9D<+MjZ~r!Vkc7m@JL=8Mhhump^Ezfn$k-pFl_n$)?1~v)+J$x~^^I>oI|h~2Kzo_>jQ_~Z(Fo -)~|3m!CX}#>?{}E{_{o!x*<1wp7+t5MYjPGH4U|V^Y%{WHmG2pID!O_?D!4w^14lm(_Oj#iP#xWWY?w -4O{l|M9zonE?X@+HS;re1Wp%saZ<h2lA-)by&8n4!w3p=Y1&B*~h5@d2Atq^6f%2aREWapnHWDbJe2e -eg{?t{SVR857`l0>01x8!j~q*s~a(rA-cYqUHB#c<x1-LD%lXYd7fPeJRDO?=k(R29lOMxHM87o~j=l -vgm)&p?&#+LUVV|S>=&JD6=hmBRreWnnhdlS(Ee~Qso#rhKB>D(F>31<M`2Isp3QM8J`Aa50)>m7Kj4 -=wII9(?+9D(96q`z-MIYyVO;qwgXQVgW}$T#nm4chJ>aE#gR{G|5|+6Fs8!e<^%9FVKb?H3<>g25YA8 -H&dOJY7z7*{XSkr`7FYbus<w81ngbfMH?2IU(c{nH@hp=;&4Y{)WZ@7YCCJ>ZEcj2B<7CBJJfSb=|qM -L7M>fg}W%Mz2f0;kPu_s(yt8EC8eTE2Y&hbPYmyy`8&k*JsUWa#G;ZXjW-v*;B|mBSfvySjv(`<SC(I -8^>OT=wbej8UJsUw{m^RAUWMrvy#aI*^wZkAcBkCh(w1&=#&5SQ#{h!w9nyxD9s8$gSn|M)dngLA$_f -DL@*<-g<r5MiRnK5e|k<zp4vIJQF2UmYIYRTP#r}gt$|B05b}^22qZD0s9Y&Jvtz!%0ze3(Ly^t1KAf -9{NF4iLYjnK`yrr(uzZb`9>=Zgg(lIu&@5dp9CA9l<q;U^DEe8k#+a1@*gqwVH5-7dG!{p<UI~NT;9` -R$gl@umSfOU4o#NbJ_8PCk(&;T10Z(P^SistWtpRpb%IXvDJ9`1OOT76ar+tDB)3#cePjZxUVL|*0Gy -d@<M9l?=ntLGF`~u<($nJX4k0aGGOe?Jd+`536{EBn1h#^8aR0&U4m1ENt?Gu(RRvy7gYd)7LW$Eqc< -g(orZ4P%u%ZN6C;~M`$`t>YD{W#up^f_cP-#m>=u{s84Voi5-3cFkw*HOe6f(vgZ*nkT3>{QduLg@c# -?@IuptiHZ4o8pq7S)o~uic8@#tTW6EFbJrSD2jsSf+&NcY{HCUsbD~gqo)5hElo=;TmEH>TB!+Y?xm) -cskx;&h$ST{C3(N|yU+6s1A<xq-uM09@9Tjx_da($=iGDGbDw)ZtBdpi%pTT)AB4MvIYbuOjs@}&9-H -oVIpy-XgnuF7-`;5h@Sl9wsMHcKt8jMN<+K4wNWZBio-VuQY=!kEDEsiwQkLd)D`m+}^(gBP${rCRrM -lizA;}`fK6sT0b0F(inJm5aSt0D3+BgZRcljKowUUTxl$>?cpyibMUrR`sH2f}__bsffpbEKgA(Hhe6 -H~c3Ygt@^eC&p(na8lY^t@b)1noq|uDFFofr#7?1I#U5HXxw>RQ~=7`RZ~>w8>?(RS@bU6RlO)(E{U< -Fv0~faq0`-fDk-DYfttbiKm5YBZUx)xOLMn6nzM@q!(@#Va&ZIyNwMNRnXGb=Cab>iM3dX(<&;$<m&0 -M5*@d%LJJymBaKW1js@EG;;SWZ+m4qIzXRg$e@XhRdJiFB6^QtVN-;{(7LT><nJbiJo|Af@oB!q|hi_ -z`dP)BN`=#4{CO%0H7Hbb?t6Xts-^g0pH1?TzX0^j-;#XJLQ@*jH(a*%kzodLKyR}X2orU7k6>-|3Z6 -G!WT4UWy!m;h+uEOY+?z_XqQBD=D>BV(ncw6!!CrqrY;qHaWuB^n#@v@_v77tsh9U1KIbQtEeu{~0Y= -a0*Y1E+4?!A#UU5%tC~bwBX3AGFyL3$ckF#X(}yJQ;em&B|(Q?*!Y(E#i}+o9505wpg+|o@o_A@3m)I -RXAIB%r|;_=Np_oifjz2b=V?*k3<Q1Iwa&;FQKZ<4JYK}QM6JdbYydFLc2HDCbW5T-Gtt}C829Z*8=k -xu}`{cvKtOcjkDRhD9b-h#T}9rWBh4cRXJPD2f608vC`-$q-vhKwUvC-Rx4s*NL50d?ceVxN3!kdub) -*p^H3_z%T*QjbG?~&m$eo27bQ-GO`I$4!UdER;XZG%|4A8$e_jO1m%gvt<3xiXw*gQiKT~EctKFG^BE -ex?=6iz2c$z)64`OqHyMBjRQm*)y;!7ZT+jPNtv28kdL|e;)QlKUt8(UE*$IS;gjCjA;0==<GoDF-Z# -PJ-nuw`K$zECLq)oFHDYF=lm{J#hu<L>e7_MybDAqkV4@oZP=grVY63Jq0`r(Q(KQEA6IneVq2;Ds{t -C`uKl#)_R1<+!KQw*Cd>7$iqzP@nZeHzaZ@#TiGG^kk>Hxp@@p(CB?E-$h(I`u<WHeb)*zxq}na-od_ -|D0gdYrL_cSIN{>Yu2_x2W^Vgl?!7zgDY}c}WpUqM?RmQi*xuZt)Y8K`P~76t(*KL=KUt4qM>Cm~)*a -VV$bFA>7fhGK75&LRnp|*9423yde)z=UONWoO*lVe}e$`q@q1sZ2NN>;U-@6>nX{D!d)7^7C^b~elvq -3)OasM#yw*Du`=1#Vj*N<O6R(PCQ_gRlvzd=4@w|h#nvTH`6W6E=9=Jw)Ts6OJ*>5s$}sQNOCTVX3`s -GE%WL)B7*qFM?hiSgJ3-4b<Mw&$QmigI@@4CNy&9#AiNP7WjY+2Rxj=$8&Pq+iN&t*2jVE9;k__?y*o -;ldBFn_|OJ{H{2U-{QB#Z?*V6CVs2L?@95yUi==y4HB>Xn|{)k3jNXzS-<q?Qu{pQ_vbPBExjR6ez)A -H)i3?f99P)tZ<-H!Y`U*xgH7OYS^Vx4zw7Y(>>2t^)qmwtw5B;m^CMk;E!n#221d(>;jti3(*C3tRzv -@@slNV4q$TNp)Q<WeI79z4SbW#h)MM^llJ;l+%aZm7<YK+Wf!<>d9H_Q)p!^K9Kbz`le|*Yh?axM`{X -y{ZO+u#vt84k2cDqygN}>IMU1)z6BZhb_FD7eh;cpLHd}vO%!&NC9AVSrzB(*ld>nq?`K1`@;j@^({H -JfBrjqnN<${&!$%6lp4cCC|cm7H!Xk*?rCxwA;Is$PnCFTdz65ndf_9#U96$!sjFPB(iMR!{dRKH#p9 -By<s5-H~5dx}~+tud*|BujQ}0EBJeszhJkk$`^@*n-*3FS=yx*<~s*i+7#|~l_L_5$}<qS+F$bZlYH0 -07pkA~!NNDiqo|*-$Z8)f!xsezi^ZeJM_BSaiaHC+2#=z6LiGc&AbL?1hAtEmwp*04*vxbvs&jc|Q<> -}(kEeWv24I__!NI+LxXUlx>`4OfsB|xhNAX#j^cF&cvs6w=l4`49u|%|S;ntcP%0m0rN>LoB3&ndqN) -|a|M<BvtxxM_9(EA{gr1#m&YB{%+Ir>?e%I?;!A}1O}x@{90pB=8(L@1S1^wv=|B`c7rN71iP_nfe=d -BU-9?PbB04R|T$9*bJL;Y<VQxSG0Q6prS@V<U9vEq)XCvx`G0xF8^SD}HAlDnF^{h)xs!&<{NeylqWA -imGm6^zKpou`3u0f%L!DPr+})A%|9J%?+H-G_QEi4b1P5Esft{>?+<16#4qMggOZRaSMyV(KuUwF=oV --w;m-MP?IZ~rj`glDTG9%)bx}GVQyYqC&apf&>s0qY_)5T5XanxrX02MQT`L=#cL0VDt6Jut~;s}XcV -7-@EmfHbw?M3?(Z`vS$Fh_qC2{X1)AzKb0&00-a>cuiqIX2_Mv101jjsHt_#o_CD@UrQnW>is}nqm@` -T1nuuy1>AjzpEF3=c>hSp`bXw(GS*Ig9>GVU%$`pxZ9Bx#D4K~r?f8c}VHuPOf$N3yn|)?=b2QIblr& -i{yh&un+8VX*F*^Q+MHXcoRJX?e=GVFxRc9$8Yn?uMe}spY%18d@Gi7Fr$`S<AD7Qd|u0h?<h(XKD+b -Z$M2FTAnJqc#!L55d<+39ko0wKnk=x-zi!i(F{U~Ba%yW)bgYjZUv%H^PF%D;h^RT6KWp8A0n^6R9_R -z+uZ~?Rie#6|Jf9L@fNC{$7_U$7cEy*J)etRz6d2Lc|_?-+?SL*GqEp0J%S|l02m;G7M2d7_s?&LD+e -L1iO}*CEA6RAG2UzIwz-33F-rV_#wS8(d?IR=Roo~05o;B#j|e3@H>mkhD3-IVqxlgWh33aD5$y{_ld -Ncd;111?kPun(10oh~xFPf^qPtlrbwRbtA238x{<vMk)voH26$@_EQT~82lJch*2?_m=QaPkHv_v#q= -CMNmv#UU>Hpg>Of2~3SrFLo;Q&$*7!xvz$w32^q1+Qo}SZIlwxRe!h%T*uYeYjf6rEn`M6cxfcu_gi( -))~z{uM5SG>*QV)t=2h_=~K~UowK>^WYx&jl7$CE@+alwty|Gi`-le9XR8=z2vJ<u(&An5pwuZ%R!P0 -mVB375Y=E7Q6ncwOd;{WGw_+S-U2#;@g#%Jch+ww4zbM5EZBHM`>T2m`6}eQjpRAVBw(b~g>sdebbA? -+)!)BRcT_HNA6SI@8Lh$P}#7YaiM%2MaZ2Nwe7UGK+h=QH%%{QzOoE7Ma>};h~oV#pAfRV)~^4C}NE? -g)wuIMV&Xo(^&N>QOpMBFHAdho(#`pX2FAC?Kag=L9V^;uT96|Ip_^}u4g{usJD;WpALhM87TD`+(0f -32ig8jJ2CF*;N}^%smmF<yYK2WC@`Vy9mk9PUbuu6>F*Wtyz(8NbZP#y@Xl&k$T8&@VNz{sapNik8W` -9vs`ASX`PnQd&^R9U^_6T`5j>mQ*AjW#2a`G_>NDK>3OX>>;x}SZHHrPwXPG+#Nr;s=_^f@-G!G@sqF -ddpcl^zG+E^CjO<PD(<ztzQDdh@$Ld;WypSXiZ#|<9N?qhKXa7+E`dY56&EvGf2w!7w6t0iRA^9hvs$ -@r;sKxiX3uD|dvqgM6t-+aGtG*7Y+Y)x@L3?v*l;{hTwZDMvUx}t+N!J$>rZu-T-w_ztWuam_As_wvQ -~U~>!<D4BHan+&#bQQ;>(=@Snn#Qu=w^92U3coDQi!qlrMVoKM_3E-4ZytxoyT`>FgK0x4Y#)NQ+C!n -De}!yRs^!W;jawy!io<wsLcKvGh&1wxxUxF4nEyu;Nqj6NCn3qJPTqw!a3yfNyEP=z6l(q)DKn3z!gl -UVPMka&imXT~Eok0*c*z(2caPZGK8RZLnn4u|jV2Sg1$i6|fb_LZg9m97-%_tggbvO`Jbk=~4I``mBD -gPL@%HvuV<*B@A<rkpGDY;)HO!|5jGGm5e!A;erD@O*PEc0|hthB(vPNaBRzXiEgB6zCT_fq;Qw9qR= -|)nALKI(hpt)4u}Zf@1kHdmG+VFEW6o+n0dy{rLx3wz7Usp%;;a<6Q?xbq|^5|**D^wlNYuWF-n}|Q% -|j}=WG`=ZO^@Lm(i6Ky7OH|x8^vWt+3Qckt)6|yXaOj>%1fh2Mf=3EIX@|*DeT7q76EFaMjgu@liRR= -Ryg-oM~Zud?Bz;^|(?xBp!D^cu<6V>-NHP`DM1IW{telJk=xLi6Gn)KPvpF@nghK9Dc^(CwpNDhA{&y -hl;;2YpmO8K5O=<aG~Y|@fSvW4zOG+Jm+EVVBPM2qU@5h*}bIQ!f4kROLgHH7ju(&?ZO9Gej7DnhxOR -?6NNiGeUA8-4z(UBJO@9g@EFT)Wfh1+DY-skseZJ4I9S=7-=m`1x*DH6`<G&2c(Ks`&a*EJ-));P&v8 -Nc<+=;PZETTtZ`;MWR2Ppox)9t%EChcZZ%bFM&y$Xkb~5|M+peIWAffUWU&vTm$m{1(=kXcAc_!{MY- -hVPSA5}8;%@tF?(I%g1X9xK@X8v;Z;!AR8Cz-Fxm>JRwY0`o%^%*jXqeLj)T-i4;x={Gu)0Kf%7?JJ_ -?H?RT+DJ6%UP3|?FH_*IA$G=#@%5L_=9tmJ=5Et6nnt^r5)3*^PDTrS%3DaobNubWfNnO*eiXNqO{)S -%xtzNYj;ZTlFqlR{ZOI>j)HjJEWWM9!e#L_+;QS=Yi<^IP*%hyR;a~wJqdL_p6F2~-#|Au*bSHUn2iZ -G{UYg%(+3J~o|(2k!RCW^+vF!}F91T;wvj-+QaQGx*^_8vnpB*#h1YTasaUvMcUSDQ-;tbvn?ao7@eN -IhIJMi>@-#ldv57-nN`_y?!tO}ijsglQPhqyvWgm`<_?4T(@zwq;PoK*BfAg4!&!6($^;bQ_x3QZsK# -rg6&hJr|iL0!~38AUMC9JkLitYCdtSp8CMI7Wb36me>a*vZZ&M=C2F|&ETtNv<^t93_(vvn74a6^D&r --fDms0A%U?s-k}j}S)>S}m2_QjH*o#fmP4$K^^g3ZrrC+6i%fy-in)yEfb`Eo=`ID@Pa=e$GoQRTW$H -H}a>>q-=Ai#MiE|{_-v7%GEF)MYts!u3uD3m7^!+AYITlU|C62WtZ(G!>h2f{UO^YMN0CvT}8E}LB(L -H>|&`Zyh*9yFy44^u#*jm&aaczH{v|>av0JF$nth|v58?}Td6iTm;21m=ZAYcmnM2_oZ;&6NvX8U?r` -;-8#t%P97iTOnER56Q;E94bY|uUVY)I)NI|q~fwlR<fxh1JTNj+0Q?SozUh9hPbzPq**ymhfD@b<Due -ht$r=U|oF~$y-rs5d0F+0GFuB?<%A7*3@7n6!Z&EF`ruUEzvqWa+m^1H^hpq|2AoYf)rfM6B3@N(PK; -3#+Lj-mJjv95jD_R>;ZZh6@{sIC7A{eH_ml<vX-+foaEZ8zODRXQ)E;*k$A5t!_R=(!JqttZW*E<p=1 -(%jR!2;WJ2Y;<+1P%Ru@Gjy`k!r|^i<A&HSi(9n4q=06cy+ze%$5f+zsY3e#Nlmow5?zW%aT%Jm!-Z$ -_%PuuFn<|<td{OFGvYHSKqJAYSf%=uKvFKNt5)4LHlZdV+iJY=hsjJD#q^>4w8g(^Uv$M%#BD$X}bU) -M4{p4pa+=x<KC_d?qv8*oMYmT-aF1v*D*Y9)8FTd%+X`T!7J!33a3eS3&y=ll;?rgrxdT+^n3#Yj*%y -*5pT*Ws8F6L%9%AsHXXv_5xW0S`0_!u)_pF=+ThFG^N0q&i5p9oN9tCPe4%hi$PP`x_b$2Vl*KyP;+i -s#`{cK_ZMWh2X*H)qW5+Ej6^!pdgtS<W6s6R=ZZnyc;SOnfQqZo4GRmbP=k^t2rpW?S1A!t}E3gBfJo -AzoFs&BFAyy)Vojwl{^@)3#ceYTJv#46r>d%nmlIFtxTqVH#|YXQCA`@@Ym}ws4BHO%mn++c;qkw2cs -EoGnh6!)ybDIl^WX=4hK%nB#0}VW!x62y>E6CCqf2moT$!p29TS+=ZEEW5S$itIm*65G8E8l!34FaX7 -B+w6NkkN83?h#eKxKy~2tkcWs{tE0n;t_l0#Stm}kzIjk#$brr1t64o`a&J|Yd<FL)lupcZiHN$=^K& -r4pA7&dRtmtxWal(oUV~bKy#+d>(jqt!x2ezKVile-2orLuytoI7*8KFZLR-7?xW5Nn`sO=Z**w}bk& -@Zgw(1Fv!S}Euk)+#~2uvQEDg;iXu_r9>Aw%gVTD~>v~tq@jx6l?oex{NYzH?kE84}8LBn<1=iVa*g) -FIXoCE0&gRBZO52Ypk$(!`fF^d%&s@R@^{m>nW^iSUU-80Ic^4s}|N4!fJq(39Av-U#7qs3F{?c9RTa -;DKg3f@pf2v#KF2tSaHR+ZL_eBfOWmFj)rxuu#SWE1(Ar?*g8k3n@3uk=-tGT6;0!8)2E25dtLQzqh% -M9<U&)sak5Li<f7KQ&68cih0C-6ec*zd(wFCb;8Hguk0N|eYwg!k@0KFRYbK@Ssdt+syIh|vT-xg0(q -)$ml8cw#En9XuBDr+XyP0K|GRZ}ycgvGq-jQ6q^=>m|mlcwWR`0f0cCkt>2EE%evdav~#i(~%D!WXST -q5;u%Vn40lFI<S+bY>5LbyyDs1IBtQ|~+3f%-ao39Q4tq^bOo*&VG>ZLRyFwO(d-BXwHW3iopBcAv5V -`t7rvXzJrtGNw9sjJKtQI4vBvxJ7we1J&Xr+TbxgF#huLc(xQeZr4vSBc{QSH~$J>P*>`2h~1Av$$55 -!bXDZ_!fNLn&BDkq_Yj=PIsI-MPGPg|)bB8N*v$?cz-Eg$+s|o)I5{=j&2T16VX1pbR29zjtO_1eWqv -DBoHU8^&2ZG2w{+n!>asO3fCfDA@lpUWMEVN*TX#qo6pLd(i(@^_4_TvBaKsu_a8$L&Q>!J!J2*xZ*W -FlWRqJoe?(2Yj5RliGO~2Rn;;)2xjsAvt((b0fyl}UBMf*5g;4R2YhtpHQFd79?7L^XU;0xFI_~0=ri -)(y*MH6mOiJRQ26XQXd*t$d%B-##sC=R)-vf&~aYgF~fg{Jd3_$#)?|1(?X6#JL0wR0BF#TX0rSQu4_ -l;m`44}~L<7JERw8=9sJ8RDQPhM)*3=-?;?9craO1u1ANq`<RQ3OYavNCdFyD1WwL4zI+eVgZh2KeGD -PvcER*7WN%0K4JcNp=(&&WEO9`=LIpy27f>aB%p&}V{4)=E?yiMm?Cj4-nML$!mP`7X8kh00cL%-2+Z -;p%&Nzx3bBi!Lqlw;-2#$G^9}t~OKbg&X?IDRJDf|ri15dy7neeJF0LZXpLVw`VumucyO<}Yb~JwU0u -o~vDLX_wiqV^<Qq}wjw~nOh%cceCubMq5`4)-s2{zAVf(f?jJZ0a8?FXbKZ{Lv5!o!%5Vs+Esn69#Ym -WQb!a-B*xge#V}d5HUH=QWY{q)5lXiftkWE}f2zFyj1$*p@@$6BB4i8rybAe94%WViU+2aXO>9ZSa_u -9>wDO;8=J4e)HB6r;3lHNkw7xV;;r0!kA`ZMY&vD4*Vqg1CSE6RFG0Wipvv;diR4qE!f{y*(*^PQcA7 -cO^chYCp2q#!GuQI8?<)^E?cX?9^F{?A-K&&EDo5@Veil0I=3}T<3m@UJv2Ew)Mbx#XIDn@so#^++*& -sB87nJs_1@77lf`0IQSNv(=`YV=9;#eT+RkQ~?szq+K%+dwNxqzP#B}@Rq-WPTneW5>A-I|pCv4Tbni -Q7;;tcP}&V^^LjB2sNe(hmT+p}4<_mh@n)w!QE{~Kx5iCTLfSZnVmEoAolNuA~UNqzR0400{z$_1s}j ->((oYAOcFS1yK#;`<X9l-?7M{p3SzR}a?C4b8of?-=*g60eE}ut&QF*;#K0r!h6Qx4%~M#Z9Fx>};!O -YTY3YM|Hfav~6+e>=tpj3Ma=&nmVI;#@XeA-xDAXcM#|GCCK*y&|@9m66cXQH!n3eE8Onn@usVH#ZNQ -<pze*_3(K75HxXXDoIF;$dguN~gzi+0b(9h7FmG2YO%|?i7e_)Etj;<oOK*zQO_%Is>Dv6f`GGQ<r!L -&t(vBQk>ylk8o`q$uh1*@5pSOHrrOEM*#rKyUK2uogwB!1AaU!GFd}qRilDS9-P^6RBw_`J*c}=Pnr# -+I#=j6Hz>3>S;Z!Iiyu9&Cbb7%Bfxge~iLfB6W`*Ddfv4!1*{wGnE#!0H<I6MMJtFA^R+M!e>idub># -uL)9tjf*c!BH)zwV{fgS{TgC&5VSYKB{HTPmcSs#CeJF)>zLLd(E-HWLC>f;qO1XQ3X7^H9tSUsku90 -)`c)D-0h^hnA1e}-E?Q??{&M$wu5ZDbZ0Cra0l06|Gm01=4ROP#dDmme`75hh4bR-R^J2S=*ofKo-Ov -^^hZlGT*Y<$>~>EUfBmey4J^gGt&3zk>vCiidGW5#5K;ecJZhS<gc8INOeV-9m{0H$!3P9~2rd&iUtr -9OAb=o-U@So<!EA!X1gi)>B-lrAlc3G_jCCgHO`szfNHCVbOz<SZ3j`YpjuO}i*hNa8z(^2BFq*(jP( --kp;3a~$2sRRYPH>8#il8OUv%Cnp5%>{A5)36sA$W}78G<(mb`qQ-_>sW1oUsQ9x)B5r7ztts5(p*{m -<e#z#&ZO(5^N{<ir_p!6+sgk``>#>;@|fdZslo7cO$#YU}R^e(FpogBb%LIwEGSI*vND}jJHN|c+OrN -ng|oMdMrWqDT2=#i^$4}%1blH<z!7T<>oS$!E)IImc??IiT--C6qZhZjH$Sh<q=GvKMKZ%vtg_s>&3J -Vc3&362C^uT-*7gFMY9Mtm_-VgN9cDbxkXV3f96LiN0M!z2-`0`w_lFQ1T)@bPDoC-2z!4Adw6<!)&z -vjVHTFj%q)#CH8B-I4*daNl}PI@)?ApwDDA;4p8g!eNWSre*&x=x0Us)BiWSSkMTmy{@eCz8)kKBAaP -39m!U-cYh0b8vWU2_V=+{D=0*<jF$AM%6XH$e*sz^6Ogq=jx<dQ9!ese`C<B8`p$R&l+$RXcMHj&;kD -Fi5=CQ_(P3;t=sCz;}<vB%_aS>)cFIH9DEa4GaVLHL{GJXMsNMWhdZ73G^Ha)n<u{iWMuNGbLvpJ+j) -lxhaK=8AWOoI>eJxPvZWmm_krkSoGu5#=h8Ub+Y`QI;%nR`}FQ&<0+nQ5X~9tYSS_A978n)E*MtgA`1 -#<K)QC<OVsFDR6}JOc14$BXG&76Ejla6iac_1f5EmE9LEHFYio>VHWa{DY!L}XjM@T*%WtzT)tB3>10 -aODkUZPWH@lNem=f`AXm4Rx5<Iu5tPm_xm<GWJ`#ts1lLfn|10F8J{@X19STkg-x{JIrCxkLYFm`}7E -z+(WiH;13*Z6pyS2XhG0k5rzv+U)+t;&(@(cP4`9Vrk{$hTC_WZI%Ng>^76h4PySwtEQ)f}ZR)~2YW7 -w{MGPZFt`Sf0SVk1SEr8%j<o#ar?BWx=;C?<~sABx5Yq=PcPDt>82vjSZ(;SB`)UQkozzOL35y+qd_= -4)W7*IvH{+mnLdljz~4d-Udwh!}R}(ywuGpMesXWPF+d2wjP3~SwbFqh<0?6=yOohO?KW&(r{~iR6CT -<o#TfPk_@8EGQ_*N4t{Ef^11VLlj(ONg-}w=y+wZ24()ZSC<CeXNIgzAy{CzoD$zS-3zr=6u3#a>NvX -pNWeioY&nPZ???EP}*oXESMTmK1LOY};vo+lJ7#S|3oJZ!}a3>SD-jwb(vUV7Uk=Y)Jl6gNFi+35t2X -IC*AA~!Z9m&vsY7`@!LpzPE6PahW(|C-`Eo9Cha}}A7ky%707WrqAi3OU`WX6iRkt6zP^uM4jLA3o!s -}R9_=ubtQt2??HNVf456WpF5Xm2j_p||*B%s_lY$`eJX47u->Vk507f}7LnH&ia0x;aGIYeXlJc3hp* -bb{vp-yhX2e?9DfxBA`sH-IGac7H_;{M8LH$KlWE4*wkEKjHA_e20HZT-E<H`~NR^ZY|SE|J@ScRQq? -QPaO$xs{M1m!@pVy_)q`-h<^OFr9a0vN54BJS*E-0`<>ETOLu)2aaSlSnDazoQSp;==atO2E?Btesl` -kF_4G5(KKK06WiPzAe8o#ESH1ko>NRU$eQn+AZ@l@|zu$gm{k!kI|G|chn?C&L<IP*PezL8!Z2OL#pY -GbdXYaoK2R{4!;Gx4`969>sS6?6d=J<(|-<~>s=Ipue&R_WcqOJT=#pNG<yi)no&sVE{xpuw!*WYf`{ -C<-&CubK|w<b;9n>BCI@~&1Mo~_&5-S(b)@AGQc{{9XRJlIjysdE?auHCx#c<5oDp1peaQTzJ&2LuLb -w81*PAtW@+m^^+$iYayCq_oLX(lau%vZv<cnl00&=goL*)aWr|lg2gf|M<*Vv-AI_>HnY3|3Bt`c;AS -~sDAwiM8`ZbFm}-3xFJL1hYe3i95M1yiT{oJ|6jp>HySpzkXytD$nGlJpL4L|N@RE0zR1D;l!JY-gME -pE{a+6DrycCLCRwp>aIj<by_uAr*qeuE0R8D`<bttFu2?B!G<uZ&dNQnWNPjB3%MAIC3HLt2y^rj|Xg -m}v%y8L^6f+KKjR>;|JcDS&G_9W7V0oQGafv50TV6|0+``2O+al(icw)r-Wrp33IgXTfwpfKq7dT=pI -DuiQz90FI7i%iD<HH!S(opLn;j7@N;HBWB;GpEK<SXSf!=AU2uac*d57J2%v)ddo_mObuC$O!3$4Uo6 -<T|(|icx*0SnW_;hfyfU_gFD!sf`maaC3Z57PLtDDfuXAE9oieDDiRTq%I>vmn(!Lg`S?OSb9{j%%F$ -G#`Z}`=`%xQ5=X@zP7rCDV9FS85`{Y`Ynt6Yc!D_#)_7C4S#b=vOtj>hvG*-qq!DAu6a^Wcos%ZYFga -&}C_mHq97}SJ6ec-SSScT*k93hH(n2~&gW}CV8i<d$h{NKO&6b>$WRXU{oHSt@Hp!BcE4w9{QZh~Q%P -@;%i_OXu4)GS*Og1Af;vqc3Aq@Okf0ME{otT!Hk~KZvoNP|Z67IuuO*w<dPc}_3M`xyH<zxsCEOL|Iz -~o$W_ylv>G*etwwk2D*N$*lJES6GCo@nZum6yndQ^{a;y8gO!4<X5z4L>BkXIj$J$=U?})FXQ`mnN)< -v!`oRRFoT@KsD7@1XO9`Ml^M28nrqxt|<-QRHDgnA2(?nJ&fgL=h5R%Ay`x9?oNg~{WVqEl_muRPZrE -6pbT7|EO_#Xg0^mMltXcGF*Sf{bwOOgJPO^TyEZPdfZ|goadFuArs`2JuYh7P%4X7}N$&1V^Rlz2XJ_ -A%{(p5h@(10x&<YG9fZhO~6<DYs{r!5Uq?2&gmdmiT3{#fH98PkTY)(#BMdjpV<*3p!RRfbPnG+_NFm -D_$)%WDIbW@7ToTbXjHf5?zd8P>#bMp9f2>tL(Sm2jR1+PlZR3&FqpcD#^T0jEP+aXMjDLF-znv<15p -+$7orIW<7n5^-Xw_VIsQ!S>P8EKglRjDHLTl{lPX0wAg%QdGE>M54&^t1_52*pSE5upuxlAkFjr(wTZ -yeAOiW|JygswpZ<F0$_4HMhG1Zzh_|#F{j-YC=|uNtKnVgvMMRYgtlTAC;F)6-tUBag4%eWF(V~xQ1k -jjPAXO$K7Geon#uHOpfVknWo;dcsZnD%E?H}OcsnF5((K}Q!QD9DDlamm>NrHm_u|a-t;u{B(N&ioSf -s}d<V(Z@<C7~`!_(Zg0m!Rj_K41n_?1dbo7_mK73feUfNsJ?cSxkDp|%H+^>^z19)`r)Sc)`PtTez%C -gHX>~0`V<2-1fTyrK`GEAA~TvZR#G^#aesVY-Owt2=wx6fz1Nu>x~GIVkfJ4HYQ6EaL0S=5hoW?iW#? -M&mFu409;?z{91V1NC=Ca^=NjA9HnG(Ix^wO*TIj8Vr2J{_?7vHRAZJ%=^A2;FG(5xJuis6c0orhWvS -MegX_w2bU@Q&PIzj*K2^N;f6vnnw2@9vv^dloqCUb_!aU^?evS<V(%*q=s?9_c}0-%BJ#O<z=knUs}) -q`2EJ)#-F3Qz5nITxA*_K%kBNY@UH7W&%r;in~_C#tLuNLUVN`!w@=?CpsxQh2md7Un^4ccK7R%VH69 -<Pv({+0w|21C54SV8*6)ymy*|EXL*x0~A8KU1LvPOy)1ce?-xXii|3E$eWy2(Yk=8I{qv^1O+vn3}?C -tY8Yr1{8waUJ||Cc$pPye-PxA#vexjp^?OKzY4<<)il_tf)$cWo^ne^}EvABVnXWVUnmpzIj-U6j)B? -R>4<&*Ww-V+}t4>~r~h_PMlka@>M4*NMjJ5mJ{jkb0CvHq|xW<T%Esv6eLMXXBl)ab#fH_#Dh#*0BgN -4pJrzRG1<yOHK}TbV~Zax+W&4nfqns#8bzbZjw`)NFg&#ITSl0D>FAM-4tQYNspqAk>*kNvhdv8w27H -=3d6E$5n!j01JIA4;edS?O<QMjjm=82q?`KDxMNUq29d$mx(vanu|Y~Ey2M)2&1rpSm`%g764O#l5tC -?^^{h;hJsgdOQ;>GNIb{Ix2V+!cXL-IO2FTP~JIiyX@RXDsfsMgsU{-R9%q2>p7x?Kwrj$|+v$05dm} -!y|AIc)qvvQTUN1}!fiW;bl)T5l@%{lZRO_aqC7?>Cy7cD%zYH63^k^er-E5V?wv`iXcv4hS7Ov%||( -+}G(?9v9GG>NtxDw$z3vJvyideRWij)?GeC4#XDQcN0LS+e1g$Vy$6@ndbd9C00<IY}Uu5|uZBrpy$V -3J55%wctwQ-Y(I(k*4vMi4#pZal}>##*Zut)I{W@nTcuX@l-wnmtdEHrsQd+Tim~Mj?N^f<n*-1>U)M -~ro?BbWkzIKDBVkxt|Pa+T!)&|hiB42Fohi^PNtj8w<I3sSjNP+PhE%EcTMev-M*V@58mwitajl|6vP -$6j&h?IQ%ot*nKY%y5YnFuzBtI&rw(;$*d)xDqG>Wx;TW3=TZ!G(Es-!4wSavlN=}k!s+%rDDX#EfS; -#|@7KsJyDsq7*<bb8ZA8!gv*xk3*Fp}(K(H=x)PD{(l$^-(EEKyU?+D)lc!?Nr(jU5-Yw}Ig7HL0$~n -R0}XWloR~qpY7s&co6sOp!4yyS0rWhRhK1I3w3=%D_Z6JXg>{Huj!te7eb$&7P9$Harqpjz}dAqRS@1 -9v%_Lm<Fi~j*5l7IY}UuSz3x{X=skjj!HFwq>1_jsh&u6nnJ(j@J?)^5Ocvphjzo2(v$Jc%IRmqI*v( -^>_n%2>6Y9{K&`JOHI>HDG+Gq74K+zZ6_3=SGE)YpN+lTMT)R?(aMa4U42*~+^aM+Zqu!Dv$T%f7+@= -2W{6Fwu?ltIp<K}nUZHvTvX{&Iin35(-emonF>vXGg9e?M)3(<d`|1TcM6TY2SWXDA|p)<l>99*f1^9 -FEuA@n&o77h9wciC(vo6Tjv77l**%5h<O$mx2@ZrK0RMh3WdlHCL4_i*_=LVk~v;|!JE<7G2ZPJg7Fc -e?DJ!I;<`0X+)#4CTnUHj%>@$T-iD%_n64LfOAaP6w9(V}<)A`Tb=XpEYuRugUJ4Wc)st{lAv|y_!nA -P<W>B+|guz(!DYNKO4R=|NqH{%a8ALBfAs$-~Rm3ehKG#kBj^$@#8)-vY`i!f^P-QZ<o`ZJu0`S+d01 -1?@uCRbHFhpizF}-7znfk0R(D-9t0`^FM^f?jG+2!BfCssBREfRhTtT@F@mE6hX@W3>>=1mP)e|c-~) -nn1gi*^%HbCi%p)iuFcYK`j3XFE5JxbOz(~-OKt<5ZwN}Qx=-rdRoq!Qke`REq1U7<W1bYZRBv?bRn4 -o|logjr^G{G=}fdr8R27&;Bo&??m9SGVIv?QqclF}qNNpR>(Df~_{KO|U3@C-o_K{ml?f?)&$3A6;B1 -T{yEl6?H<McUv~dd>K^zB{p7amBd+$^$t)cG$>993dW4Ty?dP{ntO9jXsjUs?q1a0lEK%r*Ung<lnfq -@_!cZzw`P3T?XXmf4L~&`gtd3SNAp4^No9A#uKvYnZ0^iGGAURnR8a2!4_|3oLwNybrimA_3_oJM$(; -gQ!<URx#14Ohs)+h3V-mG^RKjL7hbWwGOF?PXTL0LLuf!f<oMX*DwcG7@^Qag!yh?z>ddc<`OcPN9;3 -c<&#~Hd`eD@9J3hT-h@-YPu0{ACLcaVAqwvG%y)jVQZYMc?rERzCS(N7yw<e9S>YwK}kF+PxMa;K)&~ -&5~6LXaU%(>=C(-VhqO$Gl~kvqm?ACif9hscD#jZDnbC{O_k!;4JJ#nevq({U0z83r`qj`YVh;EpHHp -<{P+pVx@{(nj3ZHRAqZBkp?|aX;3GyR89tjQy&~-MzCDvk~*o%bOu9y`2~iT~gk?x;e3R?zQiwy`9)3 -x7zm}0p#Dc_WjUEdiSh-&znr)U2EUZWIBm`fXe%TEGPD;Lw-0wRYhPFSSmX-8-9BC?#=r5@6Qqw6Ioh -X8naj|Qb83I(0>72x^yXf?X}m~M<0E}N=r-G*I$3lZr;4f<f>XA0@Djlz@mxhQwIuKGLPNUrymrr2l< -tnf|fPYr_Y>;09W{dnuGknb@JX#@9y++h2qlt^yzrF9XxR0fOyB0gSpes6<(7n{HM>XbiYiI`7Zf=`a -$<<#7|AFk>2wW{=mW1)PuX__ZrC`XIRzXozkx%e>@Z>UrJwkProk0A2@Jum*j9=q<<RuOYf9F=hlNzs -=^KU)g1iwG`(Gezrg>An)wH64qQVTc)vMxbTkF1NvHJb-EGU>wht{oaF9qy1%KR+{d>;cSEM;9&I)t? -z1Xkyzyk*<!~(F(z2@~7e6>;l@m~Ge!8M)VIv~OV$o+D-fmc&>u?9f+f4+Lyf$Exr1*IbVLC$|4zOA} -Ocq2UVw|sdu7v6&ZNWvz0BfL0A;h5wt(igbNn{3_Z$&cjCYC4wYpK&P&BN6E604@Yh1x#va8UZIcoMX -JOMj)Sn7ceIR7lNh)9t0gZ<lIx1^*@sHfPerN8ym~w<Kx+5k3CjL#uqPM%-(q84feqY9|#%$>Z`BVg$ -oz#a-NOlmi5$zuHV!YCGmLn<9uW4HkQBb%C^)gSuCH5D0Lg>`P(XzND`*x|M*MNMzZ9;bYT?dH&SQqy -)b<E@NKCB1KuPvX-dr0!JKbM;<HP-ZyPl{iRJUv+cpeGdLJ!9`uUvyaQ*svCZzar#%6cy$UU2O<jh3| -b{kN_G?l?a;uCme6nt`ToJsU_?b?<3`1mljTFpX2LRffsIE#*s7Q7oWWC%-0NMIvJj$~uTjA64=`mu= -<C$h<tC$o%<43?9VBifHyvu3fEEn)1<$3ocqv-PZSVia32C4xPZ70zDFF|y5bbnM>+(d>me<JqRA*=* -NSkFZ0lr?4KMaMp7>XTG~Q3){(A;6Ba_pK~_)GtMH8a`wn^&W4=kESF&TInG91<ZQwj&c<KnY|flHtf -ZubEm^XJJ^%dkY}vA9Z29u#Y}Kk&Z0*{$qI}n{U(Ysd*dW@nEnBv*BRkf!Cw}5=LnUXQe)=ifyLT`9? -6c3<;lqd7(W6J%@#DwYx8Hutu3R|Aj{MBo*|TSbT$GoWv#KkX*mu8jR#{oeu3x_{WCf3NAL<|C7;8d8 -<Gz@&<|H>QsIs@B3asL7SP1uJqxcXugHL5k`4YB)zsrvD!%BO~+EV<^6kkp8Ln!`0ia(O#Po(&HyfvF -o@t0Hlw<&%p#s7lhpLdAgjp7?A{-YG%Oz{^{{MRY|c8Y(P;vb{<rzrk+6u+F}U!nNd9OC!sM&rG3l64 -wxE;ci^ei4m9U#C882UWr^S~Gskm+^0hFn)e2<Cm5&UimKL*Bs)vrTCpGzMA5PQv6toPia-AQT!Pce? -G-uLGj<A_+=FT3yOciAwCU0;;1TT(_jPl9j$Lp@u~f(q(KZ<wP8Gz;*X~Ik5T;RDgH)^f7Bs9YsKQ&e -N<;VvBk`Xs%;QENRnU4q8V@fDC54_j1PH|@u|xhU-BN~@9tsz@M(wmDvBRO@dr};@f1Ig;xD53YbgHv -6#o;7znkJyo=Z+r{0kJn(jLDjrSJ%)kVYxYr4-gu3Ogx<vy?(*YtDZ5<*aH5XV<23c6|wFzrM@ajl<j -?|9*<!i{gh-{Gk+o0>z(3@#j(eWfcEaivIz{-%jxlQv8z?zrrEDyUc-mDE|EvzZ1ppM)7-6{7{NNg5p -o5_zNihs}z45#Xs&4zwVPHJ&sNh5q-n^h70`?8~AXKuHKzHck6HW4euKh9UU1N6A=~`9+}juNB8bsz5 -Dm?qNETRP2Th$O_s>WB%g;6pnrdr>>m>w5fu|g$wx(mhxH9l>WKhdyLRp*`$xwb!(+lDA|oh1@ao;u$ -0szY7Ri{{80G1Azt??9y?aY3cz5ok>e3(aDgBt3=&+ci2kvg?MgA0^ha8|=62%V-N92f@r2Fr_yPf1O -aP;o1A|#{j=_lRO_U^kM2@wH&M1W2z#E*!CZ#ewh-u=KMGHL@KMh+A|DJ(p8P)tlzOj3I!(9Y|=`|fS -ovSo*X$N~Pb;-U20*9njWHo!k3DmFSMCN?UzW1Rrx-~C~ce&5*0n5fvu*nSVTzef%L|A%_?8px#dBSa -Po*OCkfAoEY8@2ig`7RN@##0nxr4hsJX|D;G?BT$H;G}`y;clX_QQvkbvQc#m5W1lF>U=aB~*sq^Jp@ -ZE&!o$r&+e#f36B$cf?$=Qe@jyRWJi>J0;eIY2ZtAe4*reF#C>hIGMY^IR0{TYuadm1wNcI4)q9eoY{ -z<`oJexIfa%w$*Fa(ORF<~S~wf^CnK(&7}7xy;N<QdVIWH}%pBBItmDXDMxV128mZb4*?NJ8q-k+u0J -MIgvv{awyYjqr~MBXNykwf^7_37D}(>sEu4B4WezBx{U0rY}7MJX;6Hh7%v79lVi#r0^zpjemqbx~{h -*Ka_qX31W0qpst>`L;A#;=x|*<Zx&PciLK|&d1-#NM?u&b8c3A>J>$9j2B5*QTmcKKH=euwI7J!H4IM -gEj7Mgh`rF4IujPfZd1+B>X-)+D;E5=<{)O30vxmkM)Xoj~nzMv+(wHHS%;%naj=lKei)_V;73}4gUu -J98tPx{{_uqeCj0Zpd_+v3v__Fjh_9Bfp*3(#F=gyt%^UpsQV}tYOPP238&aw07&$Eh(3U>MOW%lz=S -H#%hmtTHizyJO_TXLPVcj^7`4TpBNPbcc=G}O^iy<9wjI=UIu(LF^S-K(rM|A6`OPuLK?hfU>2*b;t{ -y~{69|6S=2pE|@in$c%dXS=v3#SfzRMv5Op@kdeosT6-M#a}`3-=p|@DSmA~_s=-xpK;3n)^SRExeaL -FzP(tgZ6~yf?Y+A8>C*=%pSD-EZ|~K<)59G-TeW(S<g8ui9$mY3@7kxer^iEg(R=$&UAlLtu&q5i_VM -ZC!#Z?+xJRD{n)hi<0b1R4*Ml88b?wooMe`mH$_^@3kB9rXySMB?aUN>Z>aO-)_dVRFg}Zz6W^QgRAM -)^M@7kpO!w<A@Zw`k(o*nOL>eRGzA3P5<b3^*~dO6=sZ!NksZ`RC*>Q|?(_q%i;UyAYoy;J@^9oly9; -?t*(4=#P9{2%u5@%HiQ<Rj?oKo4{VojOS?)A=5Z8L$ZFB12<}JST@R2#<{t9i{alTsJgM1X10#oxOuc -+0xO(0o>$V|2v+)qQ(Ti*g|nn$BrGrQ~*AS>(;DUGiq7H0j<O-aWo9I6k;2O!tuZBagoz)`9}fe2Yf~ -M2=P~~T)8rl`kl>Ju3Y*4#~**ZNPW+_AAb1Z0-2|)s;aKgy!8CZlPBNZy?eLS$;rvbU@-KNY4VcO!Il -*8;m`07WsQ!xO}B2{x{wK8wYtN&UZX~h3Jao#?Dv2D_190)JeqIYwvAuBc#%_o%D?*RD=bj))2B~!nt -yZn6AhgD*>7z&TRG8s_KPpRc&V(cEWdBxzWz)qCv3sFk4al(fD6jCxeTx?TY|9l<^hDw$jI=ouCD%#p -&7h${M!+~4^kZrKpGm2rW^1hyafLH_U+>zee@A0{P>3-ekkz1aNz>~{`>Fwp+krG;lqbTIK-hb0^HA2 -oR#ms`|hkwn>Nj&AzM^oVd3EH?Ci)zix$PvxEi=&dyvn4_uc1TQd07$pPwIi=M@<l*#qhRS^TeFy~=4 -Uv!qLxE`h|uMVBsJ;-#gfc0M0Gc#wbd%{Ky1Dj$J6>}SrL;U`X<5bvN#0UGlNlVq;yr=NbRCb_#oY1) -4K?Kl4O&p%)N^2;wj`tG~$PE%gLA{^2AG}X62!eJ5O{#pEKJcYdM0Q?mI4GN%46afAT9g1Cn`m`uOIN -O2B+zyWJfWLzOjvYG|P&sxcnJ5Ac+qZ8Q_(ML9A3rY2;OyD6;vG1mPEZ{d=8+>u1fXu9JYb^SP<Ie#| -Ni{~f0QBBe~xmvdGjWBeCYiKx!1s->agFR!T;K|Yn-|vA^%#fwj1Oa0Q^7u>@&W3^JY$E&S}gn>M;0^ -^4Pm~uK?h_XU`r{SB@P!ChVXAZ2;sA^#o-E+&2Emx#>9PVV`pzu$S{bpW>cW&U=?~K6D@FZ(QK~muuI -KP+jTpXYl{zlTVg-dwU1c7=978mnaWG1MmgU!B^0OvH<R|qwG(eIwb&h@ErUGzK{dZ0=&V0l<_N<Igk -8`bK@7B>ko3SIl#I99-?6<=MNJN-L`Vx`D4x(o#ecxre^t{!JpcCI{<$Ll(JCZuhbLN1ISC_DbD*J<2 ->R^;y-AhG6>qwxgXJx`8DU)YB*0l%(?m#yK3T&@V|cjI%Ii)zrTNHl7%ABK;>`?Ex-kG1RNWp1AGV1Q -AUs($UoX$nzIRn1{3~|oRDbfdzAA~!c|8!1d`ljACvG;JHom57O76$DgM-FaHai+{8N9#0rks7k#q1B -WdXT@Y$$Y~jzi8M_ox?&iF$!2{w(K%h=v%F|9)RfG=v=DJoqz-1~t`%p4&O^vF*>}Pi^s%u3ftZQaLO -_Jww~l5FL>9#^ek9hd=rS#6vsd_#~XCItm)T<vf~bh$0%+|G@9$`HA3##_<33*IzmHGj#woD4@{MP?< -DD$Bi2|_~DOM@U=5z_zP3R_;XoCfyATVb3Xh#&WD`gJQg&3BiCn=8G}-v_e%8{ZBn;Sr25=zi&Uqn#X -Zm%{#4Ej0s;a$Q+r+n{2?dx>44lruItmG&;nV99GyP!0e@|}fv>iN@RxE!1r2z{lyg2(rXlV$=K~3+0 -pB>(XV4(m=iX?Os7>ukZBi$qq2q^A+e*)zhVbv)xwBpVsgFlLe@l6w{-Qrn$^!KP?+OjTpV~cM`g{t1 -bB2MxIz5EHLNu%(8t^1j`#G9u7(sXpJ15bg)MwD3)MvCwzPpL<J2-y`G!Xw)A5s0^Ba->NA^fSm7xGV -aZ4t&psB;P(3N4@k{Xt{01^m%YZkQ9!-+o-r-yj;+5)Ch#CH!-*a6YbrXs~gfctNVqXp>@2)YfOvpww -s3pwwryNj)};WUkl8AN36V3yrhv02&miPe(&_M4<)Gru<<3-b@{T`!PL#J&$OZ7Q%n2yu`o$O`;)*Xc -%>oXmF^{F>-wlKO(hB+Rvo^S!t8H6AfK9H`p!-{Aql@ATThnGmTM-fIr$rn2;IJfH99k3*6AxD&sQvp -})nL0nf(;!F=QFVE!)A@Nc4F9nr95Sr)IlQhrB`O*zq-L1m&<>a#q?=>AE=_@lj0<X@-LbwgPwfcgr& -fg5mFXhGYL_8#*Zw43Ow(6{0F<OwbRh-la_TgTVW)bqE9hWhpSS!$D(WQ6ktQ~L6GX%W0|Vg%1miR4z -xqx{s@hXf6dV~pPN7^5-#sl6BSPxveX-oOhca01?_55QX~6SVP;<74!{pb_%FV_qoVN;G^(G<-0NXrQ -`)`V1Ogk!e^a)36vcOzz9)P9hpoBl+x<C_w`rv`IRLF-G904a+~;4D?|bM*!BXTgTsg^G%L%kphloa= -Uu+`|rQ=LoX%svO*2tGKXlOy6`^H@Qz%c(I&lY3FRwtLiy6{F#b%Ykw29l&aFhllSIQ4M8hni0Z;ug# -@Hhbw?Dw2WI@P3$#oHEdGg68`CD(jCFr>mIuu$E*LL`QzP(7pONoZfM1!c$L<8C+r9Q8sHfecI7=J$7 -$e$(}77-2eiH2g5qd6vVJE&-r!X3sK?^iV3{sVtS{`Go&H{byL=FOXDr=dO_x1;6v-)s2UvKRQL3nKW -oLM`7c*XQ>f>hl_zh8JZT{zY=MXi7LQNt0;6BgPoiKMy2WaZ&WY``N8eJCr%~ze|P;84{D3nYj<RqCT -Py%$_}4(BLRve^e$gQK#z9u^M{5-ubqDjDh;RP_EDQp4*OpfIrH9z<>cL2mbo&uZyu4#xf-(C4AbnX? -7ZJN5}2T1P|Jz4`$y%eI^<jXlELG+JR4t7cVZOwv%`7-km2UCGoXu*K+jBxw*OAY&P=+3l@la{q48ki -gpKMp@wJy-sl_9R$(lJ@hIj4cu=1YzG~q$ztMbS^)!2ZR>m01<odjr>cSu4zh%o74;t$XQ}FNAt5;BJ -YHDUmN=gN_qoN#MdF2&8c<^8zA0N*bE?mf;d+s^@%rnmjd@#QUzMuhp0s0Ar4$NUd1KLx_A^Jk(vC|s -KzjzJ!U*r4MOsgGZOq0eKsLyDVUdW3D`hPh8G8hacv9YmpAU`DQOK9F7xM9PFx2O(t^5c1Vd7SD5$NM -9XJR-&jpMLtOkO$xnTv0}fTq)%N`XGCl=U`livOs-6ofh?(%E7Tdzh19CAK0`K<G>g1M0kROgP&QpY? -)XGLEds*<^=@>JRu>0cj?lFKlIQ;oW|Ay7vO=q;Rv8Xf%>!nAX7@(Xj?y9F`jQJHd6mAjWN(azd0*{Z -+dznKe2x!zxK;7N2t8-c>Q7N(xtqpsOajFB}@1dPdxF<qmMqy)6>%h-)UYcWC=8&UVu*E20H4~f;9;A -!;pLQ(Wom}kH9<<ZWtq>>_AHc50U@tDe&meuKyr1)!kLu+1aNbfBf;Az%wy1Q2^?+Lc_xkKg_33pDxM -)eTK5OqtF3-fxoimi@5<z)CbfN)Q9@@9euXr+ynDx_9xfhP`4oeBug*PnKS1o>S;_&44*l3rYHx{0Q~ -#*?aN1u7$MwI2B1L!(4fqFF&D%58gdUjVM2yLo1<)DOoi~&mi)`x+dJrk4?cJbbBMo!KV%aCS;BfV+< -+I>oGliMsJ{^r5!`4r^4`6Bi*kTJ;?$?3A=y&uhGIgF&>ldp&>o}gl=Th53F@{x)n5qwiS7kKK|!5~h -efE*Teof%G=M)?H>CO@Xh=>@<^u-~6tcBu%^HC}cnzMz4!lth(Eh+3V^hcv#@eU{r~{}INEdA|;eM0S -Df062GE%v}vU4X+*AY6Orgw@z@^u{lD0~HAz6gA%Y&nfBu&Y?q2P$t)@+M>eeH3`C#8K80(T;+rX#d} -P?>+wZ+i#0L@SS(w5%Iul;**WqwlUO4&LrHolN)Xthu-5(^*3VthVc*Df2xm*@Q(Th6S$zfQD;d`#aJ -REBSW;URM$oShPDRst;iwj0qP~n1ag8hK%4A19)ca|qKr@;=+B8>d{KjT)9ns%x8v_9tBx}4DBHjdbU -}tt7v|2L%c;#0{j}o)+!R0@v@>Xn@IZbrCjtO>(6w^qN~|%ia&~t9v$)&wSH}Ou?;_Bkw2KYV0e+(mq -P|<q6ChLQYa3Y87x<%WlraSKI*@zF5_pa}v=p29|2*I8;O{8^Xd~+PvGr+zi8c1oqet`SpMPG+w<F&b -Ksd+}WF7D51Ax1tAE9yWivIw2fxqMYm-?PXkW2JIphH>jNBe=c4*iiM9pLT8jT`w3FT5b+S*gPS(5<Y -^W88#y$c&;tpf>Y07Z;cR1a~|Bj{TzJ7{+mIbGtGDtXj27#0Omn588k)WD9L4Xi;#d@#(97QQmLCAGl -Ec67o;|cabvxx*aXbnx~?_L)pL$<)G-~P-bY0pi6)b3bX)s%HyxJGq=Uxas5Y`OWm$aFuuq52k+3!0U -%p2ckS9G+FkGf^%e3C{80}`9@qShxC{Ip*FUM9u&@7s2K1d6zo7kt9H2i!-w7UL&I#V59F+B4lmp(;= -A*4eJ4SN~q1Paq|8Cp`{*c|<$$4Y)?${Q=Us<;RpFtyJo#f~yjS*~AR_IsT|IN7L!Eq$_{ucxCz`lpS -<)|KBK%L9B>C<aiQ+_jS`t&o5g;h!>+5TqJMK+yell@JmQ@!*Z@-2|f(!T@$eA(oZ=_H#jve{HNJ!G? -^Y=+5ZzHD;Ibb?v;yB!t#3lH}9G?l@P-Da$a^*(~V1lQ`#7x4~_O8xb~#vbJ5MPpwz_4zR-lW7Qz_am -vz$2M$iJHwd!9_ApYNc-Dr&ZnK@e85+djty(U&?)%s;C%GwoPYJRz~y#0fYuIfZf+Wy+fAi9U5)mP#+ -<)Uds|NJ(q(Fwj??)36&l-4rZF(SVelpBOyi9!6VFR}GOUF{&!?Bya*tl+{NPWVhwT*k|9G4HAD}jTH -RW0Ds83h+nkeh%@|gc7!BuK=k5Ie$F%pK(6#7Q!xu9RcnmE>CzpUc?(9d_I>+Ohk`iUo=NPgy-XA*z| -#!i?&pnpWWj=l(OHO8_Sr@#+(Jfm#2`a<Y<pzp+*HuO7KlZTG&kMhSHfaai?G+&sk%<nPJMZOqEgD1+ -I2jeEk2l}!{FG~78=*m8*Y-s7C&U2-nJc#@q_de9$^8lWp|N7y=asFCif>_5~B(DLE|AF(QOOoC+{+y -)uRrU`!$|Lkc&@&py{Iaf0c0`{-^Veh==O#Gr!$A3C3=CY*|7>2CA=bdK9*i}4C4a!!OOoCb`Zght$0 -S`FbUctp=%}FUgr0EZei3z#l0W)!n(t@Mnl)>(qrO`i&%(sm`t8{fVl5HtxmZVZ%pbZ}=#LZY$)i!$( -LmP+9TViyXRFjcDEVXj<ESgGuYU(Fc-G7MiPh7j_1LN_m-w8Y>f!)-OsFT1VY1HDUzW#udODFm&6ARs -EnAl0hzIh9oWsNeeH+$Pp<lq7@W$t}|4?Um={L@E2$zt<lCBMP0{TwJ{4uVWF=Iw%et!OBN8KxMz`6- -|fd}jB&^7&A*7rfrg!NF!BXmsAZ4}D-rI`~Xc<zZbfrF68L$$i^`uW$_1=rUBqx{R}h6#NabVXRx#M- -zbk60Ineg(P-q2rSCpOw;2<kjCn9zzb)Eq{#3N=izSmoHzQfVznJKE~&u8@PZ6Fuz!xCiI5TS7BZCO? -hp5rL12-oq&D>y21ieq@4$N9NTE<ZXM+xb?dRm9?PWmf3l(<z`Ou+JMaW;4|q{!`-bm(I!@>bus*$BU -SD71P$!^gvdVh0d>IEkLLMpK(F7;2*RB7`{0#LFV}3_Hi=*xieEK7u(UI-%2ptP_bwz~3Y+2Xn@Z8e= -A%CmYn*7pBFC{=Xgz-4=Q0CRjzCqvtUZ6dKA0Fs$-+rvNPBbKs4zku@`;Rg9%$YMY=gys*0X{tS)Kj9 -}L%WN<5A8o>0sMe0B5y~X(~swl@*mE9MRlT{Jf?@+b!E59AAJheIk2V+9%Ft*b<w_-USAiclnu(_(<O -1d^88VL<-4zH<<VR#k1x(1iR>Hf|0#WECI5tkgtK8`VPf4Cy6LpEG(La+d@;WRPD)##w3R3y@aC%RIR -E_RDg2|taIqIak;hkN^yBY6o6RfEpX9ue@lR-IsK3!@oB=v!&z_w%e*E~|YPFhAnKDJJ120;%NUU8bb -06>=Cit)HZ3I8+_sMvWCWZTgWb3x$zh1q14X1i9=7H$zp_hSfiN;xc)TmK{?#9-d>z9qvk1KmCDS7OB -zWoRO#DC;X<Bv<wC1Tw;IyzdczXFG;Q>O~Pqdib`B#I0uYsiW`P(M+Vo}NCDWI30{NcgZDbN)Y?Q*{K -di1&*pO`5a|Iv%Xi4<A09qb#6bqkh@0F96>aIaKzDC?@q)zY#wlr?ghm{QL(deX{XKPe)~qA8BB02Yz -EM7cz*obm%ouKOFT4C<C+$hzDH23$)v4GlA!}ZQGt=cc!Bd^?$*F1<5bJ{BnXa=SDdLhlvv>avvWbK4 -{P&ft#}Kr|5?e4sxTk7uc8h-h1!iNX&cgAa9XB@<jVnSXek2>0wPCeLmV8=oZF|86$Mes22!}2Ru;Lc -rjjvP6gw3qG9=;$lIQO{WUDdH3{@bIXO9^ZNOetWnB^F1zv-0w8=+~9C`Im<}LC^KGfET_P-%KlriwT -@4m}dtXLt|iqSS=%}LQI{>8jS{>Vq^e<4etR~dt&?kRdn-~btejsxpYn>KAy_6h#gyzTVg$r>oy8MJ* -U=k@E?L;ijsUX(Ct{p7Dc_}0YpF9Pb<AGL3dJ~bT+!p=C=`Sup@N8ju^e!FXr$0VqK{>q>DZdcVPp41 -<9Y|M}3F=FM)l^?wF$}88Xjrwuz+O_|B_0?DFv^#IT_0|<iBkPSf-Vp8-#&z}T)zPa~t@`BO|NgfqPo -)n-Ia8hf$}v9lX=P<)SZBRKX`CVXt3o}*+!*ruHqAlePe}Wq!f1T`;yIDjCM7<?LZ&f>Q^qq&okCldR -4&b#Fh2c)hBX1Z>x_>X`e5XRx~9yD9LIvmKS*=nO+Vk#4gW&05p5Id5pY$$?>Mw&4PTNajSVNrb0^Fn -F@MEe0do~K&6SoBUeL8-P7d55|H$|C+0kN*bCu>`FIGuuU@nfi7v_GL_hH_trFkdDFc?z-Z?s!@Fo(f --@%?9~iZmRbiW}0J4%QJcX9NFGPUwS_J*b<Xj1uE5jQ23s!&nnzUCcM$T3#a3z?@?M;eqlSIdY`XbE6 -FdAI|K2nQtrz5%Wom-7#**ya98kS*HFXkNDG^uOq&^_~MIVJcvCa(5s;=AusjE;)lxCi*f&~3HC8Jh} -{7GQNJMCE$HO1e?aL=@w_`blwUe?MDP=HsNyt{f0a`HkUg~ZkW-Z9(4j*GPti`JEKhBJg}?Vif3g2_M -cyNP-^Z^Z{stxfC!c&G#%jub9JJdQbD=!Yo;u<JJNj}*`A2xA{FOaPNDKWW@<)G!c>>Z#yG(t5zGHl} -)4&_)fEUmefhP3XSWiM+%(KyV@7%ewPFy^*o4yt9Nx)oWV7CD!Oj8*=;O@klGL_0xoc4qh*PL(yr+CA -8Yt9VkYU1PooVMn|a0(~haMqeDQ>&%c2`8<&$stwZoV6x$NR>Ecttm4k=jNI+#;4Cv<z=L2=7w~(<Ye -k{CrmPBB<J?ZNSlz8m7A4n?lmDRLzkSJ(R-S2XH`aWW?HH#*PLL=$xX}34C(CKTirSIuI4J0!JK2s6? -dlGVQT(TJc^lXnqbLEGtZFU$tA}$)k3+LQsQ#brlqBuCYo~Xo{rv8;zBw?WT0u9DP5J0-;mD9xzU-^v -Zk1FI;$*c;S+FWL`dh<<n&xq=TJkRMk3c{-ly^04Snk1YUpDpn%)h46n=)rg~x?QMn(_nKVpPz`RD!b -dq*dHhU%G{x`n!px}&<A+DC0v$Ehc%Ur}#Yf2pofH}QSY_h;XsepCFO^?So_qu)WllYT$@dH8qp5Ah% -8Z}Ok(zuf;L|F8Tn_+Rz+2=EH%9S|507Vt>GqX9_)Qv>n?iUM{7TnKOt92=M(_;ldTz|R7Y29^i91>G -MsG-z7TlR^7~ZU#kbk~BYS?$P>dBebR3oZ!6RIl=RS-w5ug>#o!3qI5C3(YjRK6y03i65VUM_jCtzU+ -YfmuIPTzHPMIZqxD((Y5K+b=k?q5X@)Gr9K&~pHX&Xi-9wldV2CTi)Ss)rR~PtJ`99-U=${^NKA>5kS -D-4eS72~pRNy0lV**Wq*@2q^w*>AAyf3IE=&7J*gI)}JIq0>Zw}UnWZ3)^Dv@hsz(6OL1LAIdEpqd~z -O>>Q>roE<%rng3?3DXSL4AVTS8K;@1nWZVx%-5{Zyss(M9MGK9d`Fbs)U?p{(S~aWYg4qD+Gn)8wO?s -ZYh8l<g2RJv>eTwd`b_;{eU<)RLnlL`VWMG);T6L>hK+_@hGT|r4ZT9bLOO;%6dDw24t+dyUg)CG{h= -2_n}<CRHY6-FY<n0qB%`S<TdrQC-lG0m-P?D#Z?bQ?-!i{dRAO8Fj`*GRyXe>4zqS9v{-OSn{;^bUMg -BYey#llWeFJ8QGWu7*^8w2PUJiIS;7q{x0Y3%=2I>OMfinUN0*eC|1TG0&8OVZ~1$hKLAM`5mV|&n^p -o>922K^SqG%Yo4H1}&dX&%-DX$+c3O^hZ%Gg_0T$<@rz6l&ILKGvMksI=X*aoPm!Xl;&mzIMI#;o#Wd -#NelbpASA0{C#juu#>Kt&O>*vu7j?N?jfD8POA%{QXiyyRF|Yn(M{H6>dd+sx_n)c?rGiYx_5M&bX#; -gb$fM(bzkYe)m_&8q`R(TdX>JLK2)EqpQO*$pV42?|ET|6uQGHsJZuOzJZpHtu-Q;*xL~L-{A5@fvLf -W2kk3NShFlC88JZqCJM`1gZ;7YQVa>xl!yXJ98kQ7h4qFS}8W|fw;?qiPP@B|K)tl5?)w|UJeq;QO`k -(M08;~0Cc)*hZoq}S55;Pea7j1y{qu?yUwU^$Ye_vm!f7Y<l5Ee3va{D?&9kwiNTiB;zSHhUMK;i>30 -@Qk{ZO^M;Rv%EGS3CQ5^G)!b<olfON50#9ncrQ0z5M$7&G38KZ@>SK{=fQn2$&MEJ%E$!b_$FMoEf+# -Fh8g`=#-{HQ>D>p`)Oxu=V|w9k7`e8uV{bMeyrQCJEHqWcS?6&7pG6q=jdP1f3N>p-^B2cA;{3z5Mvl ->7;Bhoc#3%Qv0;bdprJ{KN67sl!$QV{q=h^YvO46gkRu^yLN0_{4cP{q$4NMcsox+joK*j)cJjU3H{L -hbcR;}8fYkx}0xktq1+)lM2gZ}Ms5CX2WNn7_f|hIDgLT34gSP}94L%Y4U9c_qa&TpEJ6)J=43+LAUA -iut$~R9pQ&*tdr#qxOsyn7Tsq3qcrIO6joAr76nfev_-TGhk%;0KpH?%Z(8rmAX3>^%qhIB)=!EDGgT -rvcO6jO<I3Oyg%CTxD#ny?LFKLY1$#@3NBQ~i<pklN@s#Lw!t)bAC)^?o1u?eM$q=j`9ozpH;A|GxgI -{ww^ypjK>nKu*BsfQJL413wAe7x-=9mB8jfZGzed`BE9D24w|Vf@TL52K_7Oqo8v^SA)80d^ATj*EP; -scdeK90c~$>kk&vYF;GZ*sy0jem^PnE<zLzr+GE<EwJn2N>F?3sum4*Am|>~m6GP_^UC21JQw7qUB6; -d8U*;d-pXI;UKR56+wH_C#bgyWxQXV%n5mbxPv~#sPv=!Rf!QTcK=vL_#>p#-BF%*P68v1b9sIaMF?} -Z%(-HRDBkddigrQW0N=lh25XTBGG-TfZ+%cT|})qkr0JpqLQnxM|qdX3dg)V-<y-tbV!@Q~>t<HB&TZ -yv?n?|abqi0{|FCwx!)en+uy__p%v=ojgi@AofiSN8cm;2-5b*8eg8*ZhzApZ32i;Qj#bfRun~0q+HT -P3>#Tz|g>cfklCNL9>G92E9wIXH!jU&3Nr3ty%jfQ4ki~FL-<K-e7Ot5Zy}MBt2!gUaD(Hsim$~H}~z -}+t+uPZ>n#e?|k3ozHj@M`hMYi-uD_&(caJBZ>HZpR9Z;^PXyc_IFDMTYHE|cH5TnmlD06>XT<4}bwN -nCRJy-*nC}SR(Z1t+Q+%_1&Avx{kNKXbwxdc{qjS}_)VI}l(0l89>I10eM(PLZhv`S_Q}pR1e>3$(`U -ObmkThRS37r(`9@ZmlK-i?Pd133qc82W<vw`PlB)z-4+FRX2JwQE4ZB{Q<FIRu4KB_)O6nXh-eIqIV0 -^e0c%NeTQDnFy&IKKkF1%B(WtGbf0wz#WY?WOJ!*puo}K%h3z5NHgH3>*+RFfcA?7`3|xf(`{8rJm>{ -^+o5YH@ZyyQ58{NLv69E#+}+@Pfc5mm!^Y8Mf~WY>8Vj`0yJ7`n~l^u56}$M#8F>0g4*bDniS0>O}Zv -qQ$T&zJk0{lV$Cy}rJCiMRn&j2)4ZiwulYdpp=Jy9WIHu`s5d)AvVM&Ev@@FX8k^>_rjpv7YO3c<>q_ -$9QtPR0OSPbbR;BgU_8_TWs$Hl3P`gKaSzE2G(XwFIVE15ch&nVN)EGJ<bad#rQ1CK6G@E+1ywI7{w= -D==9QsV?($M9ht3ua=t_!U{ANc3_=lSRP=lSRP=lSRP&!7JTP)h>@6aWAK2mnzTaZFy!OYaS}0001R0 -RS5S003}la4%nWWo~3|axY|Qb98KJVlQ_#G%jU$W#qkkd{agC0DjXXZTjK{ArKyw2m#Tm)QykUP|c+Y -+(@b@qE$iBYL{J6+4e?IL0fO54P$oMhpxM;`%rfmU#sq}w18mKLLWR!MJeJ!eKO&K6wp2>^#0D7Nz#J -2`~Cg?{qdo>cV^DK&YU@O&Y3fFi|<$^7zIHv!Jn=RLY=_>d4&J{uNVG?O;|Tf_;>pD3+fDk?HAm#=qD -A9CFKwQxcr_69i{g?^w7hK<KFun<-vy>KY7UEy>YJN!H4g=|FZ1t3}?KI^DlqNcE_9(GZTNU=RYv>PI -yY&OJ;i6^Y)onvFC#`=fZRD)P*zeX0XR+8d>~;IQ&oI&xhFa=AV=<!t#Eo?Q?vBaNpCZ!q$T~-<F8$5 -+(|nDH(#$0D;$eT**c7W929@2=Vt6K``TwF!&TY4Gf9XMx;QDrz(*t@%VoDj8{R<G6>W0Wr;y}bq+ii -8iX&?hXAx0g!`Zh>lcDB{(le6;J;2mcp>G7lP^>5U#7tG?)rFxu<xcbVI0t!%gXP&N4W>;zLJ+ITm^q -kXTo{l|79FZsL98S(BP5qJoP=e`pcGZK-Nd-tB`^98@^v&c}00Cyfd5tZiJiRIrdy|_b+}J053seZsT -JiEdCzcj336t|3CkQTE!3!d4PQC56`t0hl}jR;n|M4x5-t9Wx%0K%%6z{L3VAD!`03_6GCoThuHN;it -KVE;LP(zX6P<m4tt#r8oU~^M6y3V4BW&vwGH!kKoNht5{d}b2QQIB`;_bDh;8#>Oxmj3PVI!3usIY5$ -YhaELZmh+5HYVou*faWJZY^}FbJ;JX0LN<U8W$Eg_k=WdfQqYVBK~#z;A2ZCWq%cEpk|KT5prp!wzEJ -GZ9K9CuMTXwJ$(g1Cbf0#Eor!(n`M@h8<~vDwP~!ew)GVklY5p=-unrqyAg~_7<Gd+GL_Q^JUT~lljg -(S>5Ego7ZE-dh9YbW1e)2G*7x!x=kjBp<Yjb#GvUTSkrAU{s@YW6zBO|Uk1YW=g};ncZqBZ)k9jZCJ5 -qhqIB7SuFC{qB3@^TtDSBdiO4C=qi>JkFM-l7DYEetfQ58Plu!9w^<)oyX(aXmvn_WTB(g`UGXXmMWI -MfjID5*ZjZ#*22X=G<w4)R27>NlgOcuFR_vfCLjs3Bw0FUco0-DHHdO<d?6{-ZD*dK!YU4yk=7_Ze!8 -vSGsV2!p~5q<|2`WVy(y@S3@hrU6jP__76ls<nNS^>4o<U^?rIRZ8D>M>vL0JMN!m?a3gE4r}a+!cqb -j$&U1YkhYFuQk!fJ=o1TR)$Nct^3f>+NMHnH$>*=>c#H=l#dl_%_ktaOe!!c8O6B=AhP1PW-KOOFdW~ -A{fW$Xdi-RQpWK=6Cl&Dexa=oiNOwzjNeiU;3mUhbMOz-3d?J%R-S*Wss92pO0A1!Gm)&S!a|v3~5+G -Y;vIlZZRqt~;fJ!ggE(oLph&)TTorZjBZ>s3sj|5i2>1z(qmj~%fJv=qk8a$6=mjU&JS`~|{UAL`-EO -l5sKuv9o)8KNaeV!ay?5u?8T4`X@^+#Fp>FQeoO?0)pT6NnK+pv?qPHF8bfzL@GgE{NcSzs%hy1LB|K -tLwLtCl<GAXqSsO)o9Q)e0zHAA?cb(XZ=O#a%+)(Bcxs=(Z2GGMaw}KuHVz3jn*?kwq*47O{v%Vd+@g -t?N1<Ysn%ualc_1<{`T1?~zg?wqNti_d({h-vO|0Yvn*K2o&T%Kj%Q#A<(xB=v5BXhCp*TP?!Ua?Z;5 -|-yw1x_NUqRCa@By{Fht#$d?2Fmoj2xi4VF8$neN8WcdRA<_YjKRRAi4!DRf$!FkRXTUcMcF&yt^sOO -(2b=?c2xJV|qI7<K@-f+&}@(cjlfuJPdT&UYF-O67})Gg5Hx8n&V$m8bdwpw1Moj3d*C=e1M{x*o;1~ -f=uR7-#g7s1Fc0p_#J!C4Os{t_b_{3|n(yn3M#o9TqCA54T6mlfnI=E#i$TAEn9Q&#IuV(l(O)=psMu -5NFn%!2$kJrKFH^&scIi&C@^64@=*w$RjUMjFHX>gE(ltn~?H0Q*HCa^;3g4Z;STlCD-i`PfS~>$a1v -SXtpKkV4vmnE>>Ac$L*dDRSgl=bRLris376Z8GQQ7=$_WZS3U^==F@)&^dfxAC8)8Vl+K~MC$IS7+qP -At%#Kc8A^t%M`d?Q`8S#oh#c~VaKuML5t#Wx$n2@P8i&-A+aDl}(2cdR(}Lh7JHv~eQ{x1`5L!xhFjk -z6m6!Hn=0m-@UKUoCdvIQP$_f;xM*${M46J51J)OxAks$*j$_j!)@ar;lg)oVAppSBP{u&gZiE+$r;~ -BCsLjrMMVx9|Fp6}v$f<yDXaIQQ6JoO+VW4mtK34^+RBI7ij$k~5XR<OjPTvAq0Vo|1uwX$WM1$pcoR -!(pvWIggVF4zI5MYsJ5GHXp_M{x+t{PJs#vTu8I-LG!4loc!xf|Gz*j(4&KW*y`W+zshCZcYG7VZBd+ -6ddG5yvsleu5c>TfJU;Myb)V7SZBtw%-V1kiJkmcMuMa^AxW8>*vrpwB#%IuHp<If(1X;$n|gUX&JS^ -}dcWGL!%FTary_Gw%8tJ+lhbm~u0TY>SP1)BSk_wu#%LmD;H(%3`Xlo#X+U1|pqb6REE=c6UXS=3V2S -Pnjuil+$qxW4&kIDdCsM>aFzgRyvNI6A56NjUh&~%raddXldx4<0F&<85pTgI3{3|OHCsZ@}OLk{hr5 -c3ba5);ami0t+J(zN$QI57+W7|cT^@Fm;Z8+DV*gP5PbogN8nPlU09g)ap8RWR<>H&kJ>CeXjj}t~A? -#IEat3C$Gh`?al8I1BN1j@Vx7xT~#`s!%DCcvzigG?ZsUeC&~BlrIRATJ9}q*o`4MJx%NaXIMw5WQ-Z -t6rM`;*<{<6qgBp#zdH2MC?f>#5CgqSAvV(LRi1@a9M?wZre7`Tol#(q#nddne2sr1Z{NdSfFpLDr~2 ->!8>WxoKjsStCWdvUn7SP8<F-+P<I;r9YW#C=(w|So0eYYZcv8HY80lA0qN=}L<CJTi8i|G8{>6CWs& -T{7G#ot+RO%B83SD#*MhaQ=(c;~ksuQ3ZSj(~CG*l+SaopCTfd3%=Cw%IvGa2<z~9dskMA6w7CKm|fM -wb}fvuMG>CybTKOWu@f8LwJ7iFw5b|n@lySG$a$^;N5*RpZnD-+iJ6l`0gMRp%3KXSH=%E58vVi};6( -SVB)GRXuqL(W}^oUx%fw++cFtA#gD2Nq2BDj@4;&w_V)$7D8fE!g?1Fe2n+H1Sju6aDAHgFXSsfvWC+ -@H9xJpG?BEoC_I9;Z%5N!_L(KwNP_IbttN4e-3Z-h?7+&!usoKm0+gpwk;5keLAbJOg8fZ3G<1<<Z%$ -xV4jdqyrhqf34H>oRV^Gf+8`LjY6Dc&Y)-)dBzkKm_lyE@Yo8d}%_uEfcH`>3vJnGaI6Ly7!D96*Jar -;VUEIhC9aoe9>Bd$}4G@aqd|5qeVH$$$9w=Wz3(g17g0x_Y_BBS_EfZ0<UBdEr(D9fUPSb&@WVc;|C7 -;(A*PgQLSU3g30r!cZIpC(s`vGzSyFFFr&%9)v@wRBchanL+vmxmM5~a0F1h-}JsM8qrDnzaFg}zioj --7>L1ObA<Db40%HjWgYFl!7lke#&g6pHsdbz4&u$r6TO3C`$cD7PkrWf%_}toB&h05U&#hha0sN(N9E -bhUycXo$^bN!yq>22rFTR)8_dxz!9L1~XwHPz~f?t0Vt{Lg)yd52^QR1{)wzz|X2lKoKAz(<oc-MpH7 -1p-#6wA7zr13&OxH&YZ&_*Lgtx0}+9qn9NZPna34Cgkq!eC_ei$>9z0%tj-g*pc<Gc<1Aeh=a<^oxpe -slOhON}%A&6in)V%PmcY{-^aN1y+Vc^cVOY6YpXl2tn!<Pk5Xg|&g-fHH*ict4Fn<6E$}nUKt>d^zpu -Iu=VM9iY9GJe6e3eO)b{>5Npy<z&k%?KtRM`0BE{0OF@`o!H5TN{eOYmENPlr6NUY-<f+!i38qV5m<$ -p__rsy|%R<yT9oK*dX#){!6AgB<g29XiJxsPK|wayWpp@0McHSB#6(aXEa8a|zZrwipJ?RvhXMUP!w} -CRe8wBNI(T0&*k?=&l8@xW4aX>^`I`!$5~nTXcWVw*hy{BNxf)fUZ~rq{-EeI^g1qxbg{ruM7d~UHY7 -#eCik9KF~AEp2dVnO-c2V8=YFJv=$9rUTE$@8D@KR2_(m%q;<f!o>cA%lrFXSLfy(7u?EF`zxx}nIO9 -7X*%5HJiq9Nkk{3t~yKoI$L{EWY<GpC9MIucB!1W?Im&%4TOk3hbu|Ht!l5<;Pe_`1m-AAH+H!WY}1G -G4x8}37oWJ;vLM~+K9$Fy{rZ1$4x{5@UX+~ZmXzPb<j#97Coc-b9Y`Y;L^_du1tcy%CnBaL5y6e3omS -fTdn$^)Q;=F-?BI+EB<`eH7RE@92W8FZmk!w@3t+x>bIh(!z|DCI1|p#+#Cu>-iyBEqwi2=BiThVJ4K -IEpBN#;ybq^+vlx&ixPIpELscV^evYRXgM-&9SjKYm>Um5|Cz=*#qH)4ld33$+2SKUF2kde1^ob5Q*h -ZqzW9J;6zzHsVf-)(%@>RPh#EwI4?;-Zg|zE;ruua(&Q>en*k6PLDoSF!8UpWGCeMaRAe$S1hiR3avq -!&vP?kN4UqdlGGRgq)4f5`1IeZsHTVV@^fc;09CGsCRt9Mn#y{%NTrSprQs!<6q7dS%Lyifd3M(jLFP -aUI*b0KJtW9BhbO6L}4>M+YNmRGZ-hjLhI&2neAwjH-inUuOMH39>hjqO;w*jVNr!Nmr;$j-S0`<r4f -V$`m7X%)+2!Ybh6(+UR0_;&D+mQFtqN{<Ob%pAewUfE_o(2nm2QzXjETkzm0ato=AYx7fzC(`YK49%` -Fe=jlk$z}RwAZYDHo;F!_3{I)CEZ?&rBboUq{ymeROV*{Q}oTUUN5_i<;P&6k0YC7ZP2Xh_GQQDDQlv -Yu{!{j-3_qzzAf+;2Gd+eVlP7=_i<}6Ib2M>H9l_fM+eN3`qhNl#MD*%z>yNE+iQl}mM40VLRVZR2=1 -ofB&?t8l#MNkMl`cVM9Yu$6xq>mtrejG>0`)8{a3LWQu8s;V;!39flCbUF0xycOaul!nDi<}^0-run9 -Ua$gzKSpR<j9&l;+%?i1$h%PCAQ`bQF-5fqqID^J1(k&L6Efe-g6VUZA&xaBic=#N>cIA+iC}#!`<3i -5F-z4O+&jbu&b9nK{n6<Lk}hgfhTZO35yfUSPCj?`kz@rN2oQj^+MT?L6u_5(XHx*APsnuftp*r-2ng -@#kNKy6~NLU-iC6GbHtkQ{M2Mc5STG-Dpro!mmXcCW-65$S6;1E^;EOFw>Dd%+$=d&FL!`I{_VObHt~ -|mzl*Vekf=?;cLxMJ81$T66wGO_nm>2eZ!JiSu~8d{?gDsB}45uC}y=kCHNmYJ`Hf>C5_}`<YwO>qB< -B~OGEX5BkJtBd5!8$Jw9JX((=KI^lU-MY}RIWOLkSchGt#KI!SuzjC|hRfoV*3c=&3hnn%r0j0U3f?5 -W5*Gw8A&<O!uy1+~;3AE~^v`aOgOAoGw8kEDmPlkHfVjU%m1fp&P5RP`Rapmov9QsWeHrJkUOe?gS?@ -eqoL*Mo-oKQpZ?;LOu)rnRt&tuMZV3EC4nKqL1S<cx+VC`$XZ%jHt@ObE!v=Bj+$0t+5mn~4^g0@)rs -;M%9w;qo!;k@SKWaC1+5t}*<g^BrvFvhhr|ny3~Y%LLIdXr>b(W-V?-(Yi4SfoA`4U8iG4B|w|vpgka -$ti{bG8cBlw3qd~t9cUHxPGcy}SUV0Ay3y)qyP}Tm3%oTAlz^H-_WlznjaE;O!!p5i3&7H!6~v>^4oP -bvit$@|<q1?mlr$K`ml19|3~aa8x!54qf?y)8#T_TF=-Uz?^|*5Fq;eM`8>MGhcrcp_v(1DbZ7k_k-) -EQ*f)+@b43XQY8-7>e;J@g^eN(w=6OIJep-}&CEacYO*v(9EWh4Q^Rl|lW`=(43>q#v$+)YQTEmU2Cm -PS}47Baga?SDlOxL&TpN+l?g+zdiKGaP{ADs!a-WmtTh3XJPi1}_KJ!2m98UR1iFI9Dru4a(9c%B0%K -8W1+OWa8dLJgC+Kdoj<$C}RExKEmb+SQx;s;_wcLZ8mqO8-#R|P~U9sO6N)fWZ3W>Zzl+V=C$$nB_My -V0m0k65Q^bLQdWqIo^E?&4a2~mI@G@Jfq+_gO$J+uINY^`m{9W`8keCerjP$<4Z|=t77)z#tM0V;!w= -Z~;R*-tU7ex#6_ZCT#pH4#nf&C@{Nmi6V)9vl9Fj?Fb(t7C0)_ZXe<u6Gvs;S8MQtEHyRR12Dijorfd -Bc;S)`~p;O-KiS`DD2=oG%IFS13;B#70&!Z)`;83RfzPCP&P$Zu@c+i-meL)sHc)e51s;=#_~R8VU7U -xG^Q`OxE!;Emcxansj2j=b%<Z6idJ*(QnE_gPsx>8~>I6^53~H3dqG8A_*O#8kg=Pk?O34IXaCoCA2G -zXos+<J3kg_M{dU+X5X8Wih1MVj?+QM|`d$#ktL^9g5r4UNHKRE9J<I79v64>dVuJ0UnQJ=^*k%t?tn -kcI_(=e~k4c&};?XnMxKnXK6++i6P!(vfq7m#XMPWl%rpmWa9x+1VVRLc>%{-#pS-x5yk9v=PH-ui~E -67%2d@Y1jisPE{n`Gylar4?XnjzTWoBW^tMFP%ipWx!V=q&xf2lk06Z&(ZpZNX6*1p)0w^J_Gn$oLgR -mZVmVoo5vDIBOyBozoqg>j;Y>r{`O#ng{yBR4@9>@0^osl`9)@=>vT!D!<@<dBKF|BSaTEHG*`yVHcW -7<fAtTq6nkAnWRRRK}myl<>Q(7tA~)}{fBFCrWLAUj5EQM&;KuzpZ*YCyp$Kt>w;DAQ)b?|@=14z&kU -n^S;6=zb7gpme|98r%ToF-ef|kx8)fRu-0|A{CkGdv0cbxOc39GnXS>N!?jyMlBhe>fT#^Eg)$dPDXd -f(jTF{vhI!7*}seB++A|dAvt=|2nw4Vja?TB47bvSKtkfW2kc_J>d0)iq}?g&lfU~XDEx^!K2iHdt{4 -GiLN7Zz$Mwk^jsN6(77^RpW7vc(<v?!cLe`v?r5B0oeg?U6w+v}hPwcD)#dcbdF-7yBxaCkBR+}xZE4 -PbKckG{-h!yIS?~d1%kdf>tbU23cgFJHO&qo>rpR3zXV!p@|+<y8AXs)2t`N+pUvL6=8Yl0a-g(>jnR -=UMnBcG3I?>$PM+FPznQhS#wqv@ro$;Eq}nHgA%fZRSX7=c!@B{Cpoc4?LmfHw;2jub3UB5hDu8ER*Z -5F2V2tH0$|aJ6sllaDGtm2!8A)w{5&Sf(;dZ&j{UV|L|2HI|`_QTt56XMK<-^mhSuzBYBIHTGA`zV2v -R3^|ggyV)a#kn5;BJ+YMxszX~2(J8@4)Pn=+*QeB-DdM_s(zGQ|Q1D(TM9S2)QZ;sqa-$j>rc8$_FUG -n@t9_|rXe`iTPqR=D{P-%UWtdg~nrblDM_R;n-NUq84CS!UH^a1?IAj(;ikc{{JD62rmdMAN2_mwv`| --YqOi-*374D5Vt4xEK29o^`jG$C!Wc=_$dZ36&>Y-mU^|LW`C~%qTE)+vcc}lVX+pDYqGvA4%sjL7tn -i<fH^RycP<d+P@5(oKWMiRsdAj7p>0C}2$q{Tt%XYgiZ@XCe(nDvaNcne%&=rA*^1yHTu2I4VrZ`>rr -%~<M^cmaC>L^od!x)!kSMd6@5>>KY52Q7hc5GvXX4=eml<w`Gz(MhXX-kCh_44YG)YhPrxfxdyFqDx0 -Jqr32-DWG*m4rBXEdw@AzI|_Nk^e#aulR=y5_Sn_nydIBTsDu#<L}r~<d#y{YksGaaxtW^}-eG;WnK2 -_7c^sso)Kj`1AUP*&$jwYAunZ+jCT)=P03>N<8L3Tgjy(#UTw8+E;+ZSCwHx>M&FgF^OJwz;+&m9w^S -VEaxVr!IA8Y{52Uhl51R+^{bmC!F*E3j`>g*RZClv4~PwmCLy6u5~pcN(OKGvM^{V0B;Q%O!$DeDy~y -C9ca*{(bn&}Wa23xt)-pQUk#`VSap_T%iAfVVad>MQercgT@9omMo^RUPg!Ga;t~T{>`cHPmTBgD9w8 -Almooz>_1W58dZn!o+X|^whfFV2wLQ@uh5u9PwG@NU@b~HKRbM+kW{L_T;aqfuqC+%N$xuspa?F@_2Q -86B<@b50<(R#m78+D?!f{2u#Hii_uUJa5_N1Yxy0_tMM`kS+Kp~5HC3qTFpk5g`kT|fM66k?5osm$KF -JtjP&ZZ18;IYLe_2D-ejX=4e7xwwO<D*dMjP+!V)6bdD*p%N?*ZXMP76wc3`On*`y*5m+AR;b34jZ&O -X<T1_@4z$Oif%E^@Yiz7dZ@3W4<t`1fsZp2@!lbzIOYV?ZDSCIjGmuOC&R<GQWq4b()p22k_{m1sMn> -w*A^xq<L4=ofUhn$E^qhRL^(yD8nJ$M@*+W#*jWbG0&~H6U^6ps^<q$=>h{GI&4P<&AhO?hGYYulF0< -)ZR<Wk4K~<YVYu+sdd>Xkyb^$kg<*_-+iDw&#Z5hUyz75YT~${7pAdc4W`2?xbrAyfb~}H%Yo@>L(>1 -1NFT}4lXmehQU_svk%S4`>6TQaGuzUm@hz)BWR4XE%nePF!YN6k^||&Rs}6U-cow_ri_!N1kP$#Rlh* -u}N!yqf&k0$)NJyx|0G92z*JAZIM;+#0kI^h~m{o(oy!<oy7IRpEsf9-4$mBLeZntZnpPW*kv>1X@<k -BY29Gc`vRwZ<Dm=QIUETDE#w^hB)#O5g=bgIo(wcokCmHWdC8o9}GZUK<ygWT5$(kpP0O)!AkzH`}6K -5#NUDo2KP5MY<NG6<{V)W<CbG;D!bKH+sHpHp%WX#)94qgB>-1b0KGao=FtY{u3yK@|w5>b9e=32~U6 -!7t8j6p>3om^6QU1Qm@|;A$;E{(r`7XW?ib6SYeBZsZ<6g>NwRXf%B@OAsPA<WO%$LXrOI7ii<`myIw -PFI@oz`_<*AK~OZ2ChgI+QxT+RT5^9wqz}Pjl-M88N|+W*%LHz3;8}y0##yxZ8sAXC#qgQ0K^OkfVBT -&m+aI2PTF_GIVn~AA*?&HQnc9KTXzIBJWx*MC8R(oGDcpuU)wmB9sRKfAIQ?#bZ5&!6@^E_OE9_X-fk -E2};A-(|L<h{5I~g;tY2({1ib>z43G~+KT;b+(4&;hm%sJ@B)l9DMN-@M!u^rhl42H80@rTAAhvC7}N -%mfh(I>C`J2I!U_TiIa<zBY*E_8L1UFx9}v3fHyfI}(Dz4%j%KPBoRqcT@LWKu3u52Y%j^exJjG}e!Z -WHRI<@Tz%WI^2Wxk?cF*5qp;DK$Gv{QMbWETMprwJbWF77t`G-$;~1QntsdKKF2C%4I*0trRG0u5QKu -;P09$=>6j|g3CdanI?m8Df)!>2OL4UZBKLsWe2G)T`PpJ%wMF5<wzaUMy6v&Q;j%^j>S;qT4TN8G?kx -@-31&!<Vk6D^5;$u}S1iCvtuUCY)P9RHT<y<PU>PwfX#t>ysoEt0vJuy#02B!d^55`X0Lb77FIj^kNb -}S9i&)UiUUVA3!~&AN;eD8@yKucD=J(*;*y7%`;$pdU3!6<(v#zW6wO9nb0apT&{VV`!AJPq|SBFhbX -jvMx>=6)LK0ry(eIS@kp2xb#PD%erGn1|Ga34^HVUyFL$zsT^qX!6Uuls-)N{65~%vu>c&Acm_&lfDI -XA5jVPHzcJt~m2KsH>6e7X>r|P5CQl+*Wj>YeS<|UEK99t_E%c=B!VC=C6F61llIq?HVpMx{|Hiehcw -xc0EMsOd}Ng`9A5{E&~zshIKd-st`}=JyxMv8qZwfs#@R|-<qlvcoa2N_22_CEI-CFpm}R;HrsPK#U{ -IoF<p8*atb=)u`S8*EIGWsp3O@=I1J>bsjLi@MG=AzS^yJu70+?#q^|#v|AB7X{R#|C_Sc8dIIr9O_- -c}o$skdzYk?U+f0vtxR9qx`{UPQh0(8n?w?gbFS3B)uvd0q`r_Q$MVWXBt|NWV+yY}IJ_Fb<gCBt|#; -(i-H(-ZEq$djz}_RlaJ-v&m5ZuLb5&b$Zrfr&pKIg**)!hmPXJT#MsN_Z%rhZgbB#XPixhsN{JG9DVn -LZmXz=*;wVCyU@lU$a)nG-`<d3gSP=W~5A?JIO|gFta3+8zJlXE<GKXdBps8loJTXLdI13W+$34chZG -@iBY_jXHSfxl8ffi;b?bo7v2Gxm9bFDF<ivly)ad-6F?*Zh+n&tqdF4(_h8wW)5%9SVYH6p^{Y=|HTk -lK8E6**pMIAO&%u|`PJ@1QxK$~$;pL+Hdlx0g_;QlHhsMYF`InhUa6Z~^x6&+BvuwYAIXT9B5~b0tr_ -c~~*8V@U3PrBB)7vi+;=Vb$ZSu=(rMO`XvwvQPkI=rLIZ|ZTQc(g(mhwHBCb2gcAjjy@eSASo8-tVE{ -}=A4N3xIFF<kH$))&8fllash*qrF~=bj2g9<~5awTMqW!)$=t=w2^l?|%2@ih1jB%UX6f$l{DP+1Mt# -+scO{%mvVP*FGfAvA`_$$&p(fvisw5Kc<;4;!I__9Mz3-WPC3(qZa*z^>8sWPVLZbE*6G#z?f|cPn^X -P_hX54+CEP4XYQGvx#xxJv4*U$r(;}wPlw(TUxNqvPbBB@DBF@yqCe#OGdTCo$Tyeg3;e&$*Z8#{e2~ -G=o2lE1|IB-dxj;D6&SW@4{>db|7I#m|3M`7z1wwqOJY6=nxazA4*nUaYI=)|WlU@8x{fWkHfl_HYXb -%C>9xz5FvDP!vC)SpvULOevb|2`a=aZYV0`B(m3?f;K4FMQ8QPQKZ9#8eTx0Zj7HIV3#HXtqoBnqm>y -&H9OWu!l4zEsM@;@qg8d%x8nQ$nvO;&Ddlgq}9F(-2=Om~0b>n4f!{>n&}dvkYTqMXTC7s{9z%_X5hr -#9MDk@LKCxHZ#x(<}lI1{Pll?ggdbZVn`qTGuo89`BW6EzcHXRYNVrP;gmIq)xmg#c@~o#v(>`iLlKZ -L9}=o`loiD4I;NLi`feX6(eIBmqNHQq{RR`Y(Z_bdOujQNhDI7N?b3A!$Q=L6!dJf6&n)D+?N=|MSI~ -0jL8#|qDB)fxfu9Q)Ka+6<+n`p*`bHNWgJlr`4!}s_KC#+6{gGK1vBSq2F&c`H)-o$pB;b1=M#i7JS> -Dwv=fd3CLp!|ZF4v0XLiTO1W7Bq{#xR+I2BiR=l3+0-cnmO3TgmI#AFIQ_l#AmM2oh+}JG<DmXxBYE^ -3|b{JnEMi6?cPw=|#p*kUBtv0491P`Iz}Qt<02aEM)~QWw_qJ?97cRRVTj%l$L*m8o$R=^KYjMSJU+# -?y8W-Y!c|=3W6fmqub`ZgoQuLNC6E1o{zWz0EvYg03OKmlZt#a0wir#K+g=L^thMNh%%Z7zu@@DQ45# -t0}2U_T#Lj(7XuIHdd<D3nIayS<)Ocf2Qn9YcGN<*b-c*9)h|zTK6jCB+Xyk!Q!B;-uYLTqz`VQiq_u -by44tc9cyZ_nilK6bA2*Xv;u@KQCl+RO%00(qcXNeEJzYbzr3JG1b{{Vxq|2hW7w4SbxzrBzWkP+CIh -Fuv)@?uj1J~0pRSWyESIQV%9nIZLx7mv3s(&^cu}tlC45aeF_x6y7tS{`05kFrv$F;ARbOz8aa$JrSc -X%U3Q_(f2PYy3=qw`H%?y}LRk0w=&5%7we>W>tMzEsR|s9X6gK#Ju6@p;yw!&AWhnZ#Uo#aU4(vaQ)i -XE4Db*a?4aVP6Lb#Yk1%iYrvV>;k>GW0^%JzP1{>X2nw%AX5Lqz*lV(Y1W1nEa;d~Gk=OMzSI~g8bAx -!93T)ta|IB|<9TrcS@1)CF5E9D<_Fz|owF%MLF+KnGwOpj+{zz=&di~`Y*=DnanVSuZe=g+Vl~Pwes| -j=#kBGpq|uoMkTJe00tR76E6}0<-#eSiO+sW3w+hvu+fwg9a523ea;f<f#SpH=bUK8>cI^r3`i31Pd9 -er=^zB~ah!@s)j>6nfSd({xE?|jc(TOT(r^k=5a)T~PkDwOe&@KwqKRUH3jX~wm_9HlE=vSp>(#=Pb1 -9<ZhHh@3ieUgXf4zy(@3|v#WRg3;<AZg3ucm^CV0vs=Kgyn={umw;|&jWRz%(ly=UER^Af}`p6tZLj( -S7+NDs9RnE!`mJ8DB1L~!8U&G(z~MuWlZ>SOLx>NR)-lC7g^QM24Jxb&$g2yJEW<dN7a^;aFP8r^sx( -0qt|_j?WzayvqKq1FXy3!5DI3J9W>`Q#u;#5j&8VB5PFL2Xvq|-BPiQ~C_2}g`v8#L3<Fd`ikx~&xX2 -PZ^28V~*$mlVpNG1FcAMJjfEL8A0|G}6wn^&1fO0-Nr`7~K*a_2B{cHkm&f%_{Y|LuV(qL>4AAo*J7K -bw0)lPOWUn5&Fa*SSGtUk)rz1h~4z*cGu+NceT6`)HOfRfF08mroUS`2LlNO28r&U4R{#e)`S#}L1FP -#2mcG+?&}pQPav=+s^WI^ZfMcZWyFq=pOdvq9Feef9-#l2N1*b+wRrQVd-Y=(m@1!G@SqP$(`avMA%2 -Q&bHD%RU9M!E_qE0>O$bnAFWmNC}Qq8B9u3k=>xBiPn@8;**A<KCb7q7s8sT_FBs4ifh{aYYp*#e(~* -H5bY^HU+&qfewL=B26Cfv*b0(UF=_Fuo!9xJvD9Dz52QiBs0=SFD_aGsBKqlDaL@BwbpOk!86Njc?QR -q&cmxE3|Ng2zJoa3Xhw$N>fM48Xg?t`(cEDdJ<c9}^zb^Re4R&b1iQ6m1#^LY>IpBw9ftL>aVVU4b@u -v%adV_6Um03<9b_=%;|9|Ac9Y`i2obM@zl2iB>F*b!`e`jng&W87&#cBOjpsDEBJ(Aw+>p;e=r4>a?P -T;=@c8%N_SWJ=~&j)twM|M1dvt#^4$tLV;(?-TQv*8r7HC?#?6A{)lgl&J>&l8bti@>(aW`yUL4g4SY -_F4AS#Nia5>&W*w_p$GD?){u|A4+iU9SP38InKG~&?cJX-0MpcoO{_&&b=hbY;TTp?j>{;jdO0a9nq& -Ka_(3qv$IjgydN$Z%Dk5iW!{73;dXqPH@x`nfuY>{3SM^b3VJc+-1}nS-WLJjG|s+9&>`$Ql_tmj*9V -jAdk*q~bDV?uo<DgXKMGTSFj-15yv9bLkEUc_t%}vi6jyu15E^b)rzn|fiz6)AV~B0F#Q?9I-KNoHH= -!0R6A8x3fRf0hblg9g<&?>7R?<Ry(?IQ>Wl5ZEV65)<@X|fY{#5X8%y8Vo7x(EH_=*JvlxY~~z+HH<Q -;uBO-h;c29dfkaOdBj%L5HM%F`@W@eI)_o`2AX1Ad>U*PeAfrS!8iOHT|ieSzPz9J-g~j=3p2c2enxg -8?>rt7IVgAUfQBJ8pd{t`i&NGjR8;ng+*;7>X~Y%Rjs$C&$6pOwg_?Tp6Tn3+Z0yZub4M?h{HOYz$J2 -NR3aVCzD_hegcp2?12~43e+}A=9?qx!uM-PkY;!7*st!b2^D4Z#&0lvzv(y*ZX|JvT=>=7-_8m~wqPk -iAdcth-Y@cH$NcInOm#p+&Zdnbw&tibB>c{!~$Y?4;$xs3PDlx9HyHgQa2XSZo+Eg4$F?1E%=xJAWc~ ->sJJRfu)R1Z>)NNuMjapQJx&4UZ|R%Imc%uLeQ)3(~6tX97m2$192!g%<FU7F<Xki;1su!#1KMv`ZC; -&JrhuMz?+t!A(6uu`WP$f{U&wKE@K!qlPc&bM(lwqrJ_W?c$|=jVA60YCXzszdd<+nWcxwHgf>D+77y -(lsq&_0MtXf$lsFPpM{DB9EkQ(Iw+2{>ZHcUu0pAx5k^7?yEkc+?xP^0t%o2<t7k{i)%8H`HY{)dIMz -X#ViF<<!M9kvLSh{!8|#TXUt$8o}mx2VxDUf!xD%Tf9geRM%Lx*WR7n8!z#Y<U4w#i>AX*Y3Dqn&F{e -^@oA}JnOiVNU=pQiQjh{p5y;ux(x>BsZ61RaXPp630&!(VXhmtK-UYik2s|@5>Oq#j!zC266zjTwI>@ -OzY_>E1#mML>28;55N-bY)Vw9+R`A1hWPCzP()q-56^Wxdg_Z;owatF4d9dP~4fD@OYxJ_GtVr{W=8? -TG-PF`TW?v))9{fTx#W*W!L;`sR2aYk$Fg9dujh=j^SlV8y4(J<zYyZ|VBbPRYvH$`vIU$^>uCq(sRp -eI+&C%hNTt-@QMWiOE58lQBcf1%i>{`qUPk-U?DNCPJxyhf)<0XT14Ec!jc{PXYIXRD3E6rhztLXq6t -0uM{mEalyLpC13b*zph-d&>)6(rLaRuVl^5AWqoV6u@Xc>y)pJKRLnf+G*LZidU7<huKYXz&>O@x#u@ -qV3tbl)1m#O{P38=7W3>T8c>0Y#^f^-f#mMNk>aie{s@J<4pv=+++1Q~iI1?RisHz6&T0NPveE3RZ0w -);jy}Up@X$*cZ_8KfHw?i8N`04p1j-k?adL^v%#P?-@JUB<n-M@=^$<|`hgo}@>ot;j`W2P`#t<NGq= -)?t6x9xtGc_H_G1}g|OcMBBeZX^pj<%n5&Q`fJLH`XIQ*X%QX8D5?z$Nt8AjMm}gRI<yYf>HmKAQv)% -ynm1&*@<Jd7ijV_w75v_O^UUQna)y>@?!injSrTu`T-=&u|Sw9Wd+t?IwYH7ZwYLBDE6Q4(`E;!O;p~ -oq&RVojWCiNrrRjt?lR8<01zk__<@E>-Z+~`-K=+I1@k%-4=lfvR{A;;bs?#)^z9uIEJ)<7xh3x!Er3 -*PP38}p%fchHt6`|*<_25~fB_omN)OOh2Cw~-*FhG*nnr0^iMXcMnS3w_kpgtRP<#pner@78={k#}l% -tT7HVhz=L9zQg#o`B@<>FQt-u?ke^nOYjwcB;ue^%leYX*M(!GXj|M0c}S^l^$wr%~W}FlZtNwD*8M_ -CiwZlGAAB*2dB|4zM+*dNAwo16%@8H<b*Yv$}J^(7Q~SzxvQ)T@o&Dhvd>eRmZjQ)&sa(61LMzlf}l+ -lgqUa*T$FN&0V<VD6WmaWF&AfKzi^XM<7yI3(=DLCCCC_mdqxm9+;2;heiF&p!|e1N>#nMG>Xr2*Z8C -RQDmbn`xEP<b{onZcM8HPmbKgKuo#r#Uee?zA3@6KUOWn*+3558lf8X|l>zew(&x@+=ZD9#bSU`YL9k -Q*Ns47jiOex%1CQ+?Gb!wvWNT<M&!icNG=8WZX;60aqoWGQzb8TXWhaAf<%N6)ITNRvtKc14H62x+^J -Mpj<=N~=`N#Bd4)k~{Kkl^ZIO-AI%4XT!Uy()M!~9IR+{pY)z9;YumB|P9B&rUt;s#BeY+uy?VWW>$< -fkoUJH5+_X2))sv?Vu@A4p+FH50lwn1xJ0-u7_zakkadR^gM?hICoIzDF->o}mjF-f+1Q-lho|O*1aX -&@69Fc@Ze1n=ymhP$EaJ@8QMZrt@Z!y&4kAyakH$Ua|TL#!1j=92ejzXzVR@tVe+)5Lsj@HhxuL7Xx< -pRx$Dn>p|htBk|Uw-SlOVoBb9M+gz+IQp2hVrx`yA+a%WDXoVz4=I{nr-aD=Gj7H~W3~6xM_Z!<vZ2j -n*pf+3FA1<%aQb~?>7~Q@GLi?Ur?pLQfb!8Dg29$fGZl7RK?!bp7ILuG7oVxAi8fGo_$)!g@?f5rjWn -L9B*{psQw>umuk&Tx`{lw%1M$AM3^ysSbS#;ZPp5bE2Pmm}1vh-$H&GCK)cmMKgANd+MxJ(M~X6>8q* -730WboYRgQ5kSsDq|t!;}Ne@Z}Pe=RXrVbc<aizRyFz^uB6@;-4=WrTSA$MxEQf0v(2GDvRW0lxCT_n -OWbO23NkUb#iM1Yy~dy!-z`8&Zfo2_<jB*!nGLx0=5=Rj*$iB6Hlh6sy(UW}eUn_(&n!64%6Ob5`&Hb -iwq5)Ts(@%eUd1-NP|bWGsb&s6Pc>98D&5Qd?zYmqZsTT|pq2jNlcc!{X6DUavXdS9VqN<1X|%~89AN -e75Z_dXKBfcLd<F7p+wibGOumTCigy-qZ*4j5tzCJa#d11vyyr~aVm{X`5}HMvV|vNwagJ%HPAFb=0H -4{LWSGA|$+&e{g}d-iAn{c^Ad>?Da?~F^4Q%qtRS*RllMEUYu)1%6N!l5c^Z^_D@>b3Ozv=ec<NQw|y -CGp8I|`+ZqR;Og<bQiv#hd}+{dT}=#?j|^EPZeg@MOmj4w&51yZf&1-=!tlkxlG%8mFfOuj`SRMNYYj -6y!c?4e3u@O54~j{#>h<-Gws+L>+f?P$Wh6>iS1Twexhi$gZU^W8w~GLPI}I(!^03&OCEFZqPph_+|# -b2;mBB?vMFam>EaefoJw$nMPNwt@I|mMW%&556l5|!$HT1bM4bI&mAv`xw>6?<OTy>gxj^QeUiFU#}l -OPoD2JbSR-gP2$X&S+^h!%=6ZE{r=Tplo{a45o?%y&yP#IBjqUTA_h357>SSlhToQW5oJX%h=R0?^GD -&ZO>Yds+U+7416o8~CRyu|!!h)|e7Z_suH7jG}=TPiO^jd0+EzuJvnVMn5uvF1Iz-e&~yEO{!zYF6|C -pcRea4cicb`_s8eLw|yxA57b+z#!%kb-)RVwkEMg6W>>I<ztdGu(Z_oNmuTgEE>LZi(-_<J|<`&P9&c -sGJYw(76J?9;5WBgidk!Q+TfxZWcrO__?_DA3&2pw9kwN0GL>{?BbfNEocjv(c~Rt0qs!9f}T#?!xz( -(GcI(%w%ZePD?aN%I)WM1{xK)v*FR3qs470A?sw-DLoF2x&=roHkeT2y`C5ol55kPnOMuIM3o|O8&8V -xP?q5MmS7B_oHy>tHCPX!}^OxE%dVR8dpb1DAb_+YCH;&#EZ@@)K0J`R*A;ul%dx-Og(=ZYQ(6KTRUM -$LZnfR^r+7EQSs?^@o&wLU<DhwA{(J~wND?pip7^?Ew;h|i0ncWneOgxT4bhA`!g%{vsSm8u`q!kLD- -x-3bRD)@}ZE*iL?)&yG+Y!vH5`=itxqKjH;H7<Z<)^U7xLOn2y3d~BNLEmwSmnr5%qFcyt++NGPK4bp -6(&eG`bjIZ<K2vlIFT&HSd0&k&Z88Y9SHj^Qp9tLZ6o;cJSvklrm%Y6V4lh0f8j%Y)MODu-Kg5-vD#J -E2(`f)2nSMn<*Jid?ec?F1)#{*llAC@6%?CQe5yixBekjkR+RcgG!jVc=Pde{7@ftV(VVS4R#oupA#u -2FYGqXgks)z-GoE&HRlzTY#Gze7ySA#}S3~0P+=X^=Rl$2HgK?<8XrrnM{ta=Yc^x)F^frW98u>N;vS -W;r-WFy((J~NG#BYKaIn3}9+daVO<Xq0AL+*Id3kqKbtOd>V@rj7G9HpCi2fg$h3Q7B9(c4k!b}UV=b -PI|rq$?Lyx+ezHVIkDT-_(;{P?G6CZeeRb>fi8RYnu+>@UqfaT^~Gg)(wc~_SIGkb8zIK5#1NCM%3;? -(;0fujKksnHzZCk#KY9cvTw$QM&=t0tcHV;SqA2jBbT<&W;5T#4x6vs#f3aTK+aF#9os(#bB~;efx^f -VgL0W%`c2{}9etKLyQg8E3MNv2gqNIsJ(n@7*(l7(rA?scLqWk>D0Jj5<|Rf~uSaQRvS}A1w+n@4^Ht -w*m$>A80cUxWpY1rFv5Q@Eko{B}FooNBaY1xXjS0+&?7y7n4?x)qi^(xR>6O&`aRz-3TtjL$@U7-{B` -pw6LFvzR1jlVSjN1{<nu#!UFhGQA1(NP#ep+cOjWubq-Yl+hVag7=_hvSzBhChZR8MucG7grcw>*^t4 -kZ<S(}RCOnDnMux}X6aY;|=5n#Afa1jMyNF;}|NgJvX-V=R8Fz_&6i{_u3X7tA8*sqs5qGz8P5mG1dU -H#YgI>Mg+>P-TY6ks?E7{=^_VHIj*_3w0w2cI}F3!}V6IKeZ`sJ~R=V4C}v!<e}Uc>JD0_JCs?|)0HA -X$kpP;7JBL??wvLc4^ys0!exEKjPY)2ndnOi2^hz40PE`Q%zcK{BgDaDBO#9M%J@~M6ChLn*Fk@_Msb -%JPWls1aMJHTpQ$P%|C8`pLAJW5$()K?9=a{CoXw1n*lEJTM|QC3iI^3FMi2(ssa|$d1b6U=U(QH3pf -f}%&V1ak$A1%K_pyrka%liJ75nsxo8-vIW3qc!IW%|+HK!!~K=K0-Q`ca*?1HX%sXso=uPpRHQ`T=sM -zqyc?+xd?0q>e|aK}R7+st?Wm;HK=ZVNw-%H)^4TCw^yE<J#<=TJt*4^2%9b|>Es<K1cba&8Ac^W<Iq ->>Rc?GTY#4_2RW^7!NAz#g8LXpwN?>aDwNuH3N;=io{A_*)bctLdVrQ<buDWkFjZ=i8qop*P=Vsw=%k -W?tBc(XwouSDEe4pk`LXSfdOB{?lqdv<&pSmY5oxXE!oA8@&`Y9`M{;j`xL~yEV&1Gw)y=!JTV$SjQ` -um;##_HtA32_i1=OmbX)JEgYWk}#&z@jM8xdJaQ@GSe!2F^b$qNLW>SY-=ZaSsa32T&Ll1;=W<qWLo) -6*8TPMUXr{Ek~om_wf*Z4!@<sgNR?t^|Gk;ySh-G&#j(y6scXV<APKb&|3;!|iVDZBwdy^)uw5gzUX6 -44}a)?vwgIM^~|O#+O`L)Qtezx`1CurA<55HYNr-L8oTdFW3*O*Y};0`s0v1mTg1I7agjWsyJe2IPEz -+eoAz8gWW;p9<Fhk4F4(8@icebc`cl4>rJYL&DKCI1QNuwBjb-iXA{V%di!HjJKkIwc-S{;#<l6ZE)l -NLdEya@9B{n4OH6!Iz;4dBiB6M`bH2|+%K2Hf@`kYFT@Y;0bOQwG3CNa|FnT`*rw{upgB0z{*lWs2jE --wGZDLsACfCuDzI|`Jn|Ub@^5yoZrXm7zMLlnVBx>us>R~%Ao4bU??@ciZ}BJ)zq@1JnHy+Thfz6l>C -$_Z5;-Q5PnvxcZwvHBeryP@=<w96D3QY}x_s5!6-#(UuT*Q*(!AmOd%Y|18sHAveIvK@UX+G6&O=$Du -AsH2N${ir3oY<<C`Mn#X|jX+;-PX<FHLHd@TF3@Q*Tuy_{*o8wxF3)&D81dw+x!rrffme8s5o(-VJiq -CT!}^%cZ=eOB>_qZn7vAs8WC`k4R|9^k_yO=_17oz2RWJw1MeIF{^SZ{!GH3G58~@eV$;o&)r4#h`(v -jhD&6ZmL-vov^3DiwG^_4G_4hILv`M!Nl}U238c)F-1SO9A?|Z37Z>7v`^x!+xW}nnQi%3kWon_23Xf -s#sFD+NqQ!@NrHzo@M_aF!DZP*Tf7rUu)?#PE#oMG%mojRld7xPky4xoD7Ok#~NL8Y@1(Kj=9%YocE; -d#Y*L`DEx0s+Q5RbhQ*L|H;kt$`z;b7SZxN%wryjzttcpnc5RGx*`rJ>2>0=lp@f#a)MQRTr=rn&G+g -xCwr9mePJ65l476whg9@)GfFLsdHuH#P#1Vk(i3y_}Q35X42#*U6k|LIlNMHngN^Qq&y{7O|ZYPj#14 -0A(Z!g-&!&IA?*_A>CFqq|o3saw%RoJ8Lg<R2kym1A1N)+HwYT+fx;6N9FG=x=!zfACe#YgDI}m{!xj -`iL4mmzZK(V#ejBvR|~tnyHmH#slaW|;A=Fq1yO~&DcXyYdvh>Vs@&<(($R!wf>(=7=5>-x>M6pN4Qq -P7BT-X)y9ny@W%OcoSgp5axdr6b%yTv-zfxM+?38PKZDI&jAYZjEhW`qrCRKl@1WBfkY{u=me;tN_^t -B+C#?Y0`po8Wkv{DQW*?CmgW9ZyOGUdp;-MkHD;T5~-+D_)PIJ!(-v3qRLDwob{L3lrR2iOFqqnJW(J -<OTXzj#*Ggo)6EbvUEfqM0UiJeW;<9g`Y@rp#knN@f=fdIOMqQ6Wm%%0-3vc?D%+A%0u|r-KI`7Zl<( -{!Gm^3Beq1jju!-y%x{e$0;VmTk~LvW<qwuXR=uRCT?VPHv>(ss1L7b5kr5%2-3_bZBn!lDNL-+hR8z -3O_sQ$V(4*0e2)=NQ2E?nJz|yAQ>I5Qg<rE6T7ag@jm0Hia!>~q*9Jj&hGrV@F6kD103`fj=#_z(23* -`Qg{v&v638i>lJFn<Wdg-5{H!~@;{d~(SdHh|fl`!lNF(=Dt!O#A{sSSH?TvT_u-mZ%s5;jAS_%h17z -mDqF&Os^(C^EelYEc#$97|{usy*EtZv{+^!-Ee8f*i&5&K{XQ-u>v`y)@)3h@@mWzci+>GRMs1-%!a8 -DOpDoqBXK>y%i1f=9C4_f3vlV6Tng?UH~DY_+t($ZGJHZi2jW<Q8*_FLx6iaar86<XIFtjh#OC;U_=Q -OgK)7Ez(Ty%KJ;=)1dOpC%;GMUJLxnr6Xk0pne{o2JMiX)kFYbc>a@7YOU`~vv`N+d-7Mb1s#mZk3IL -q30N$SIQwZvViH5o;W|;>1ubNfE6(UA9%lS3!Hbe?2$)jO1ms0{)E~Pmkv+PtZb=*;SL(L$4>K+!ZGw -fjbex|wGE*2d0BvB{fEktd*)0PwkcX}V0xHLY=Ge0>tY>|Rp6!ssrVP>?yR?rPXp*kr%RzeoT>~nd2^ -)Zi$)qSqEyuh2bbi&8oj%z(xHM)q;?l^B(5g7(Mk-~my4<-;05!2E`Xsv@4aw~{nDPPM3OE(d`Z~O13 -%hS~50h@`CwMh;2P9kpne$*N!$a6|sR+1ch>qCmKjc1^=wC@p4UBOTkw!h-JER;vGetf2Q(aG5&pdbY -^CbBaiL$#BeWWb_;sxNG(FmUW^AZ@dc0VZX`q}=i=g><)Bk{BQ1yRr?o0ws03sb9GgJbDE4atqYZ=%p -~+=-065!bpuW1D7vvWwpEG0IOMq4^3*M+UExb9=<v@z<8A{Ze@b{NAzDRHimM#M-nnwU<TpvZ#88tTv -~}`gX-r23nrG%-x|hX;+A~!_aBeK_|?@SuL`FSldCxSx7)lDT!Pen9Gd0wu!YZVr^q?)SC|~58l53L! -kZzC7jd$MRVb{Kvz8;Pa%5?%=>o&b6AR-j*rFrA06y}eZ2qNR*3x%<bF~l)@F?;Q~Ox2`dF``4oR#%u -S`A3;!d)-28Um5Nb&0}*ydJj^A=^3Slb}hw&u2wC@T`^m(ClAJN2VKpxss9$S-JC&MR}L1hetRW|@~0 -{2Efk+Kk+2!j|eo55P|Xq!ngTuhcD=0%R9ZEb&;1OXrw+Is(RBa%oFo(k_2#<Mm{um3hI+7TGx4(k&T -9B}-f*8P(1%`GtV7CE(hECQG)p@aU^Jj{r}_L<0GJ3l4Y~5AzQ>D!|V;9c<(WZ!*?0j8O=7n}`1!)+} -XY{IUZZtS?eTPN8puoX$@=^sWBhE#QOxv@k4k?k@4EKXSvUrTm`mXqs{rx>aYcG-UuLYS8PgJDQ@1Wd -tHrno<@vAf~#bCMBCknOKYo-D{&UbMPkqVg$V#(q)#&Tx`40`xa4e0glA{YoQKS0iyf_Mwan^iS`Zgz -jX*g#SAPkKyJyfK#>kPEOiFZ?Ur~mx-hnv`Qb`k0rbJ$4V6uZ;R(v2<*kydPNHXD`FnK^<T7?shG_R@ -c;u=m%C^u9P%mN#QRiX!$>Q||#K!ahI`RfcAj67Lb_n{d7-z>g2gXfB4_}P$#CVGFykU9^#&!jmm+$N -TDvCAut9qG}p^A;<p1*4cSaZ+nKm4uo8(YpEAX#rsj1e0kS&gL(86-A95NApbQeuGS3=WVQvmj0x;tY -cWl*R{07*fUmaeTZPz1U;W1Y<Zr_5iv{Lo6U}B(FxY1j56EAF<)7(9h~G8=o#+U&_Y^#-eiQF!Aw;4j -G?7ygtNlFXFcg<0!`AAowZ9bz)ox#<fAa*a+e9-DJgh)-paoILyQU+xV=5@#)eHGO5CkMd4&LcImKMS -2@lM+RqH;4Gl)55~(f~I~TFde+Rwh=XAkf5-T!2fB+t}tXDuLJI68@Rqwz#0t-zQUKre^SK?Qz_!;2e -q6DC}>Rnz#`jD2HAZ!`Zv_#l`RygmB@X*$6d^_H{ta$4XB!f3EJJGy&9B<#2MEksknuW|%7H#~VZ*kR -Bma-QseN>KQ_pmd>QRP9IsENkkqvi|2`7$BA^{vV%wE%Buc=A<t`WQ=~{dkU!5c`=B3x+^E$RV&$>Kh -VYz~0qF&u3v}K)WR0z({TY`KFD-%MkSe(x9BXlNxy390Ly?e}x6H82UATFJXrZ&A<5v+nrLzs%sGq*s -fz9))oYyYY{l|c*#bNX!AS-FPPP(oF@~J-SCNhG1Ffnocbi78)UN^Ekjb4vXo{A-UqUgxe%P;A`rXn6 -~^_Gcc$S;Ntl0nfD8|~+m&f}l!0uamz_q_bGtIZ4}rH%qx5|Zeh(sIUiA*z`q~sTy@qMpjYIAOh@YdL -7iIRc#A%OVwV=`2Wwovz=dv=4Udhs5z@V1PPi8;%K5kk^*g1Te*vPwh-kTqD=KyT)0`yo*WVVAYdU?o -!_jB+2IONFf<7E=tXkb*e)r(g}(+{_!#JW$8tguRv*{L8hG<w4evI5}+rm_=n$dST{@8TGqUTK<8!}p -wa1W(A3NR9#3M)+B2Dqt&<tZ%{nr*rLpCC)T)d2gN^S-p&3*i^|cY`PF{&tw-iEnyn|G2%DHKeaRRe* -EB-fqSpuCl2rezkqW|jX|%6O5Kg+->vjIZ*B5Amq7oPJ8#u464%^j@QQ2dz3zskqomw6iPT>o37GKXM -uvYn=;zxQL8PoqtF8}zNM>fS>znWh;u5^2lgtENXDh#@GqfZn?z_srH{_sIGP^&@BLEn=HH+QkAMq{0 -oBd^O_h6TaH@aHUPDt;Vc@FRpeje}491^<;F`jAiOeFPrO9C8H&iyzLc?nx0M{dXo<Tgp&MuU=GnQmR -_&G<qa2Ei1?TAA*UR(dU8)Knp|w6vxwe&r`f3~D0?sau0B+I4tl@`fD1!=I#x$D#I)S!#h|A~PIXmV} -{UP)cM*=UHXw4T$Iu%bR5qSrWff>d5c;k<v<jr<C1KDnI~#e5#*(v7mAAngzOGBfHo;LHDCT2E$uU;& -cy8_yyEqw8i{-if7g`KaD@}!&HbNcg~0Z1i%@%`7*9c&kT;j`G!m&aV>(GKKCcA!~FU`G1D_FFEPK!L -NK0eU4f!_4U_AJ%$Y0xlsqz@^cQ0D)q{6%;9Xtq^b~r0PCng;s#yO(aB{Qxn?}ChsM~7p6@<#=Ks?Ia -p>n?FQ~OT`&ucbsN<!WWklJpw|5R`!I?_3s&8y>S#ADLd^Fp#PDNp?~D}+sD5BH0)$E~{jgJ$NwKgDM -Y`;5eK>et!z7`=Fo8@C7W98qjk3Okbh*LU#?4KmUEWV7@>R#=eFUHBy9Hox&Op6*lo%;m8vou0<Cdq# -HtJI3C7m@#9gZu|Q^eExmSm@wYg0+El!BR8|i8^+^hYRFk=6`CTSFoo~R@)q0&3e(d}Plx$6C4atiig -Iawi9wkvuE`hI$Od=cQd{m$DD&zZXi#N_$#2~4&)pXM4jPt{Zx4PbM`oVC7MGbyi^Xr;#L~zOrmEPhX -q~+fgf?ZI8p~Ehy;U)x|7e{FNK_k9cOE{n>P!~Anx<|zgu*kkyx}s7W(?m2tM?OD;B;$oSphc3>^22C -qZ^>Zp}GNn0_>x+JGQz7iT;)c0kJt=;Q9XO=cWy4^1U(Qz1Zp}EmFQ+xjg@NgK~+uW;m!Z26x-iF)+b -@lq0P)O2*xi#elKJ#%=DlM-HQIkUu84)34TBijAN8a}NjC1Kz5RV%M;x$|UuuNg1sk%~mq?ox!o|dDq -tSuC3=?TaR4}<bDk3hQ?ZFN0wjw?YdMpawajZf%tQG2fL6o%1?49g#b_v%;F1wixU85F;}2G3CsJ?Z< -w9^9RSiNsoQm0y$-W>QR^vu{t;&#*-1B^!i~yKcae!-F|gKwN7Wtdf~XGkFaUbFm#sd}^Lg4L)iIElj -swlO@w0<u8?~_QPRg!yWWYa1;6P;ZZ(m1&E*%zK9_4p$!}<RQJdgQDe$kDw`)PJqQVgAhN4NQvxA9s7 -c9HN#cIV0tdck{mjY^RzY<Ab<oxzr{`6~936*gavFM9$J^RvsLK|ty1N%IPuT)IW9_0G1IN#Sa_rpN# -+QTv?i!St$=NE$0f0LV)3nDH}estxti7{F&}{HfA$maiBkm+o9yJqFiIglNOh%{6QLVKRUF7Pi`gUCO -3!CA!q`d+buq9+qf?Hb3|;UDtBaW;F%y@Qc?F@Kc2yy?q{Fsq}8r4cqJj<Q>KDNd1@3Conx(Ewtembb -=$-qE{$Q2fA-I>mMfFDH3<yvEzVr|2s(&!~^f(657Ho1pM1B|HjWGw8!rWd~yN*))H>b#CH5{P^~`We -5%~DSAGre@C1!{)k>?Z*H^bIcdt$Z{i#kLVE>-*!`jdORe@k#j298sTLQ){a!<S8waY*0Lj`o&IlYkY -rs{5GmK;4~h4%t@pB8_=0NzLQ*Np1!;9B5A1`uN4cYyt#X1}M{Z$JAz$$tCTZ*QY#?z|zMqjO-y9{YW -g{mK#n{poms#HeWvGGVzO=fnoKqc4Uy`^eUUxB!IiOzeh>)xTzvudN{%-^}>S9dVoOV}^LltUDRRDh9 -Db4x9hD0Sj4nM?C#Po?ennf10J2B+}D(x;>fx5KGTbq#wKk6~YckxPJo|>?Z>FE`@>XHfsXz1AGaa^8 -rZ1k7Z2Tz%O?(PuajO_q=ce-&4Og;69)%U|CEoZ+14rLYHp)_V)PK@4A)g?6yq(V|-l9Y?BfbWKs0WX -BI;#a?^Ln6ZGBa4$|#)dJMr-aorJ{26UYLm-n%@oyrxu?T@z$@v9`-k{?Ya*)?&15xQ+f9KgaZ>f)bg -y8V4bLTNn3>LuHY+2I5R!d)BDNdx$z_$y}pnv>j%yfc2!l+V>3U><bJFw_&$(E^ZD<_!<0^=}QDZv$_ -!olPc+mw5|@gPel~Gmwvu;R*88GGBPOw%woG0>ZXXHY02@z!H#x<~1_{#SqAfK=h|?C5{rTcGYWdCG` -|M*4&227KX|Er#<KZfN9vW(b%%{FwtBV9-~og<9K+ZIYXNG+M9z-43ND6(%@J7^x*j7+)toUDP=`r(+ -IQ_Vxy*^z8ce}26A^5!J;x2xS$b*N=!qGhhj#P)tBrP1*DBb({1P>yeAur%q$Dfzi9yE%{kgCY{hTij -CUy()R`kzRIIhitpDx7Z{^%5-s7UT4Eh)UFwO&S4tA*HjlmB6UodM;G(&3u#5Kpi<+{wF_N6?Lt@as% -qloz(SZ=fnh<P<U!`UxmXawE!Mv@KQ_eSEdPU7y*?iqHEpLBpIr#@x{?NibPZL)s7Wf=%&DK!>ZPZ8H -dHH)~hm5$iRwseA~bfcD{CqH@>YJVbdF5S&f`uwDeeBxOd<JYNrR&Lj~(h%C_uhSJ%Xy20uf8g^TKXe -A%A$5D~9(I{Al<p;y{Dd-QreyimWvuyz;o7z8Bmo+Ag|xC*U^RcF@1VojE$Ew}=HPj%`{Lkmp7QQ>^j -o|bvir$hc#FIdPhNe`C(m)lS!(-GkA=va&b$Gp7`E|yjfOp!Pz+nR>IZ^3`{ofWy^G{Xait%o0qFx)d ->;r5_*n+_T?pI;L7#~E@OKL>08CTI>!{|o%VFQ2QU1S#imxZf@x|Ae3hd2a@B*5be5>LzI0}LL($HkI -L+>uKdjgT{prY$y=&x)6+e+1~>|1RM@rEOJlQI=gTTcp<)&pQbK{uurN$q6YM8yx(mlPYTTk+7DhF?h -nkc$8Wh9LjR;6<4Ge9S#YE^Rw&+syczC_Ab)BfnC)gqFOPZ1z{H&)sZ^G{u~0=;PInml7|+S<~!YIZ- -0Vy?{3l{>VOPLU`UgzUnW<>Mz+D=>>JtdiDt!(Dx9%p>DBeeJVeo(mB0k>3M!}<E9znnrAJJQ@CFwYD -S4{kxQd;B&*(ES}z-0W{PX7(>;(XMX3n~VIioM7O{FJ?p2Z&A1-pGX>41z`dJHqUJ-wuh{x}bKVOVLt -5f+lt`nOAEl_*!6Ms>`?iqO~1-B|Cu{xjKX;UOt<C?4X`nZOp_RbQkbJ)vVMNxZ8#OjY(=njynd+*`9 -%W7|_Sp6olqg?z}I!W`R>nU<QnSl5UYUdR31E_f2SD6*({jM4435BEFhF!g}ZYHMR;=Cnxn0?eYXX;- -$SvYz?0s9Ezq@K-r7W6iR{6{kVWP;=#AkFM5AJH4dngGIT!M>z33){X#1+wVP`HWwT82eoKUP*&Fl?# -1h?Tx+c<IH#?bTMh9j%(Q9<A*Y#y!rg>t+aAhFNDxaC)D@=ctL$EAKD0U%P>x=gqf*s_h5oVPK0zZe0 -~Z`_M$cso6nGazxb@th%Y~WqFwF%2|o|5_CCZfBv*SM=0;YvcZpJ}_Ew11X~>{@gYgSjdzXo!MkuK6L -Tu9<y@f50xJQu!T)j)q-74?u(;VCrI;Z0mh5#)?Z}H|2NB__$KpoHB3M@d5J&u?8<Hu?cB_g{F9{GU8 -K49akKJw^%(@jlY=bSu{DvsB9oi}MWO3aNL(>%URO>_Inb%;v(uk+#v6RZD#pHA%F>`-9wyjn{MU!A~ -U48Por2;v{4fr%Ah9#P&94W=P|WL2aWbMnzHV*`YxjD%m0l2$B!FsoM^4MPPFD~n4lE`@iKkId?2;cQ -sf9<}&;I<PwyEH#6bT5j}_`jGx;8oSz6%aqiwdL(zhB;ME$4D~*|9yan4rs1W2t&_F@ZUUg5?+mp*X~ -qr233%TL%+FT2=U9N$M`q-yy#-IC7@N?Vw^iHCR*FanO8|w%n~P56DBAi$npi!W8QzriN_U=E&2%w+s -}6}x#=KZRst#7E^3;!mMMx#Ac?I#NVNq2&o_l{{N>wv@W`G7nNAE$k#`liQynRUr>Cr5h72*8&p}y>| -p2zJqK%Thqlw8^kz;(Lqof}b{Ew1#Eo$QWG5Yv_gNE2>&!>bpxMid?aqE2s<$myzssLv|ryXp&|?BFO -U_HWOl=(mWKGp~{fe5~PPLpn=;f~Ctt(<|MV1}$tX(C7)X`uY<fVJPVE+s;0TQgDm&|6%V-;G(S7|Ie -_<2<YHK;y&&qE~scInvBfYfRMPQl?KQn6avAFV!5C|7aTDyE8DHCY`I-4b1ARlzU1EKwT((^h!)xq*Y -khA=bU#K5X|~@f6M28-{Ivs`+1({Jm;L}Eblqf4aK*KeJoUdgHT%fJRgW$e=4S$Jvv(eEFs#Nys=fS$ -koFpf*7luG$@NTi$NI<r8S47P@*B<P!NB6Yq145R(w15y3zT~S+Rj@jk=mnTo|-hI|HRlt&mu~Er|Ym -)sGtLd=;zz^LttaGbY<+74wD3R>v=9v9|qCxfqJXt&<BG{3sT+onH)9wZT5nF=ZWf9>F4S9K50sC=>B -S?rYA9ewFz6YE`hwQDY_zBNDe4DQqR8+D7JF85(RXuF3BPgl!$`QkK-7t8p=!k`cmUz{df9cZkU7wum -CL=-bRVN=x=z)T4fs$vJg&=+ugbVkZVPRO*6!sMR4ZnZu`uo-%HQnyJHwZDr6bp!9dRPfmtlpNMtwZf -GFxyAerVqHUw-f4Xe|{m;Z15*O#%SBM6=s<dE4ro9Dqov`{>&J~+;4hK|bNrSO6l?+QgL{l|#n7wVmJ --RT`+eyO~PL=2(M-CD0gI(^w87c?BJ%#!+Kx%Hg08%4+9U!%;P{c;&8;Y6%QU`~<K<JYaA;%`e#zUfm -a^7jcN#Mkd5O6I=oHS@!dPv-vCHc6tyVmaum7tv%in<5w_?xR#Di>oHRKdl*cB4tQps4QXF|aAc<hTq -WFjwZ1rObajI_<Lg)?)}$d4~va9$1+xCuqrZG|7e&3LG`UrQw$a*SyZ2tTNzctTO)sk&2m8A!}ujjA* -o(=zkBYdIc9lY~AU9e_I>+A8IJB5$iLD^_AaCgIDEgY0y=E3<ELUr}DUT@~GT@NpdY8|EA;LH2jOTIK -I`WksbZh6wvv>(=HWkCK)5c?W-&At#RMuqdtEHJHx5vnBGb4H)`d4^l9yTG|Zn=O(hnGgT*7!wqg8yX -q@QA!Vw(f*cjOWllVVHQL7HPK7#dI&l>#*7L&-~SAGN3*f+4TZr{KfpOzoY)js9=Vh?v`(U53P#Hh#r -!B}2ay>DQb{iE@3U~$$^MaO#Iz_u1=0BGO9;(L;I&XulgoG&~ja<<B^U}M26$F8bQ&gIhGnN}C{mnYS -{Q{&&k8XJryj-BCrb13fGy%|?uhg8srVrz*uqA+&A&S;A`JfR!fljMI{u%M5F3gxjr_O8z6lzF#s=a) -~qiah&CIXk=qS2;K?#5%sRmU%CH4YR=)y-kJRbj1gz_|_pl?k+yfwA5w@$LZ;bksdXX$1X<}T=o#(@a -XK#NlzDN06k`^F&p$oTMKF!-xVj>y@@Lz-*s;Fku&TE#oCW|``7U0saFLB_ra+)Z(`!~;#x89R7P@Zb -(ECLRni~-j`QT(0+VQmzrnC-7Z1D;EfZUS6L3DZHIFQ+F%)4{i3gq}FXF(oXve1*G+9XVFN*WP7T+2} -aS@jI{DzblobxrTD#yTzGFbk1@eyo=sc?R~cxJ=WQ@hxb*q%x9)Q}RP`KOSVxFWAA8Ux+|enOPPqN&v -l*%j@%$BL6^m;YUKL1_F%R9q{x!B=fTd_!m)Bn)cjq2oOfQrw{?H)<k)ynaP&t0Q$_I#wDIWwRx=&JQ -_(U1{RRA-+p}aI(;<j&3m&-K>*~N%8VSF(U4D+^*vA-;XY7njip7v^aM2z?z#R6T4#{=>=2BB~KC@ta -3~<Ec3=_g1U5uiPm_vE~2G5gVLmKKe2_7j(Q18+IZk&D($^Yq%%!tSoQ`yNQdG3s_ucz2+8rVcQI`8v -<x|&R#@wsRth=|t9FYsOGxTsaSlHLx8Nhh#kI~Z190mt1-H*C+~<Lfq}|j>GLA!Oh#Kj<&|eEeSt4UW -ier~4WDku{^Lkf)OM<!7lUkp$R|vCxM9i0_60;$e#PUniKC@4}Skju_Gq&=akgRPMd~#g*oriL*l9D| -B75N>u5PXv4%UJyUIL>iKNE|*_6EfJDdg8K4EzF{~FMG>~1HKNJ9J>`deN0QedPeizBYo|DCD)novD{ -v<4!xtK8H|h1@ivU*9<g?t4(+hmD9-QNYYr(#8yRmcYq3w<8{)sijJ^ps9*6=#@mNVYLU<nNIaU_SK< -Z&V@wtdh$Qn{@O~%cR5qk~G{Gls2cE2sSDUdTPL62Vf3-JSGU?@JR5oN`aG6FV5)?kxilNUbI^FRUH4 -QZv<nXu1L>^IyY-n7zY!n*j}Wl*@QX$sH0^!pTcvq%c#E;mhKU)_}y;?|nVRysu&ma0wSjvcW+k1K#R -iU!uF$e*N5r)?p`t5&J3i_fp4d~^4@*J#w{oRIxuc^>t63a(+@A&y~sG-T(H6US@Kj{O?OvT{FT1{Z3 -@Xb$ziMlwTI#pEN_vQ;e*+Tz$p4BEX;GDw`sD*58@*PBE3^1$Zu7->IG8!6@ymltiW((}OYa5&USSOZ -Oti;`e!2WVh#SmKEbD8OS<g^H0iwX@R;FL>L>IiGo??mP5H#94=%&xv!OMRHXKP%2hxgN*_Oi<p<@fq -#?ts};R@Q7Q2sSFNRfVHKrNnJ*6Rm!-^K1QA|4M9&au^D`AJU>yuagDHqu<J-r?{jVb*5j|?<C~^-Wd -BB`q8M;BJza8(D>TgL$q5h)VtasD<HRuqZJS=<c4G%YRj>gm%uQ*4;`eM`PXgty8igPri4$-DoouhHH -D;H<-!*1tj__kH&Xv8UWdesGd<DsU`(U9}E+&c`bJC1*eLk*p?_N$X#Neo&PjtkP`mgN9U1CzzeS{7v -_2hnSZ<6xu2X&K`9de<2Nh378YTR5M6NJF7&46$QCL<{Q+#E#zLmZ8AN7g&SuSD?`uwwd+%!ivbM*3M -*CbZ7M{bwxt3>)Y1Mo<?;519k^|yvVgY6^iL-tK+<3(@%!tV$shXbROM^Im`a9mWUPAJ<rQ8M213d+p -tlb&WZ8fQRj;r#f9|RNs+5JVola{Qe>QGr%$RpV;!HGmPUp5Tr|={&ZZ$^)<*e_iAXZZJ;}-SleAntN -u8nSZ6=fKsFEB6OG}kxPgr#Ill=KD5)LQM?YZmwY0;kjKB=*we<@Y_7J7<Z9W?emBCjBH*7O$VV$mp3 -+!9}jfWxURU3jClEVE}%K3<=Hoz-E$d3QRi!^f~uFAi<>scLE17RPYbeC!K2&;<9p{1bbl_C!$Z`TGo -;_Etq&lgDFb>vHLMJ(YQHN++#!P*tEc`6fNiWD_TO=F`a5C#{rpbsrBz^26cYn~pdS_tv(!P}MA$D>v -TfU>-eRZW$LkucO8H3*<`e0iAVti#5-PuK{*7vUabXhbwm3SF3AgXlUOCQ$#Jz;oa@M#O+MfG<TEV*d -}6DB3*o?04)I7##1v;7FU6N*JoZpQ#YeR?6dD74o5d^BtksR;i<J^Ho98PM$5ZB{%+W4pdo36vx3Pc? -GaJ5aTR7qDGsVL6`s>A3^hgkG(QB#Di8t19~&Mjk9F*OySbd$3l<ta51cegMkH0ewKaLMIOQ&)I=8nu -e3s5;bO;9^VJI3VHp|6TtHFLH#?a272eeZKufP;qy@!~o-YqppiG!&Odztsi!)GlO0u6`Niw7PUDL;< -HMMG6D&^XI7<UnNsb)xn55INs|UN+PucN;$@9X%480H{N}wHKxjU0Z+Lz7r4|e-2%_7b)jYrquM>)OF -6yxDg1lpBAyh?p^4|-4>&MZ!OBONv%a0HeoI5p?~{YRFqtc8czCz+hSB_vDCQ71FKPiSdD7CWi*zRg} -?arq_}3$p=(%>YHU5qcu}lJiMtdX-V5*1Mvuol-PWV>t)){6sA{Yb%TYhYl2be`)}|qbYfZ|k)}%7AK -IMG=Ig-U?_iJlXo8_9+z4yC@nfm*+#hrCRNY}Ut>2zOEXDLA4eb-{x6l`*wusF_J90xHsh9#afOY!%H -qHexoU8lV82rs+&R&&`M-LM)OTWTr5;i<LF#UYY=(o7+{sPN|ok|Ocp6zOKz7^|<iVu@#m)pI|_M^kV -g`$m7AX-B0OK08XM+N(Dd{fGn|2Q1iW9ivut;+jiXtL)D!xI#gTf_>y_PjS3LYD)?c8?nQ1e`^n{jtu -owD?Nv_m7WPYwbJvpw$k&uT<I|s?GP&s(+oxTddStD@nW^-32n6pgEun?fO&g=Gy}sY_sldD&%p9h&F -)B2^u5KB!fCysu*M6YSI+M_-8F?<87MY9Hj6IYtB);({7@MT*OrPxMT&^*mv^0EJ2RJMzyGM2gx!n<B -hpE$R+<gl!!3?)#RM2`-|PI#Qn_eU^@*I_bktTRpb<K|TP*l^TKv8mPJLapqswNwZdB{a+fwwEp=gp^ -IHK~$lF9QTHLTt&$I(^h@aqgk0UT%Cx1{EGg)`}boURq;$Ly73CUXRz|6%2~m+NOrr68y@iNo_T&P)` -PXgS-$Xq2CVWk++#<esUq$pvV6W2q9Lr%k~D=+3-zDz|xlh?`mEl~!swW-Xg>%;LCIxd8i(EF~g&i)Y -oASq$HhV<=U42+L5%9Mzap#KMzlJLab`h_O~asVzidmQX~B*s*ZmmJBH{VwFNHNbM$vE!oQTS+yvYBo -?J!K}@^y!U3pT@};HtH%h$B^p7elu~bqHu1+mQ=9!pt-c{w#kEWT22Vm8z+@qLd)oPbjly2oKG(6Upq -`s3&QgS&8jlnjMW+}@sT8d83o1a!#J^?3}_neO9DX{mBs=KuHsnhc&h|p%gud8CC9XGm4+}XTVanw*$ -KrF$v^OmyPj3^K9G}22vN_}XQlqnXhR(MKQ$^|Qtpy{8X_1CT{Y|Z1OG*=CW-1_HM!-DkMiyToW#QN3 -P+Nw^})({93Zq4G7$BOl<v9)yp-50UG(^K+d5$klrMXctg!qaDI#5Ddg?hMS4Ygk8{Uc)jrx`yRx(iX -Aaixo|IS@BW1ie(k6SX3hB;;%{mFN)LXnw!Hz3`L%3&-uF~`R0<4%HOCu*juHUBP#8qO#-*dN2m-VYE -9d*CS@33i_}aJd|{uuRjdhHU8`7zqV!90WB*wU=dD$qW(TL{fi$y@^Rbep%FSfhc1bR0mGi(a!o;G>3 -b~dQS7LS?RhI;lzO&crc+V^j+&xC)OSP2M(W2I=KD!qK_BA4bDJ#S}m8b!N0&OwtbrI-Z_duduiVTks -D_Y-aD_Z#{g)pIA@|JBOTE$9S^hc$svl%vrsH#7`^1O8Pu(c7N8wtm<{4d0^R&%Um31_oB?#|XT-x6} -x9CDUoXp32n{bEh(L+1-}F>AAHF>AWpV%Dc;MK*d{NBZw&4-|p6go^H5#7@TwQt|h8>f!jpB&*|s2{* -!8R>+1Ymd5b1AtF7RRD+*?m5nNnrCHbu3mW;D43pD?&eJudICx${eX3dXwm`e8zW{{?vH3Hys)q|vk$ -v4l)=;&OMS+S><R<`G+pQ8=V;!>Z)Idu{dpYEU=^dl2dXZ{Ti<)k+$z{Lu{Tw;GSBqQJT_c!`P&pJ!T -S!CNt8jVQp2FH_TYO<{x-Du;rf9irLE=X5!rHlp;#MBA0rIQ#!4+tx;d<d`Z;9R?9{!a-2$lO#K;;=s --}rr1c~Ykutu#|%_%Qo*1oAz?L=-RKUb#_+v<kzAD9^zz&tDCdkCNwRblH>}b=ON_&2U-q+5YBimldt -kX0*O#)~}>Xf)1^&QCcSIB+`Z=>{T#}ojxcyIi*XgrncDZ?D?B0gvulM7SL39sjr<hA<<Y0f<?_k{Y5 -W=>zy2z$;B!zUJ&b2oA#)6DQo3PF%K%%rL2|j3RIC^Ka*@6-O^J_RM;{?9P~PSQmjbfSY_8r6{V}KR2 -49(&zK^1*={VX?O_|dB}5ijk1hSBp{)?_h#j(!rc$E%stHKCYApTNRYijTKGZxH9`dLfVlJIh0xUD#S -E;^~lu4x`0HQ=PgwL|mp(cuip(YBgu(%dnqp@By(%O9Nqs-w`goYWnMq3o!X?2uAy~WVeJ44P2g?fuw -A#tC&+pLiDK#@yhy``vejn%QY>a`}mM{=B^f$^+}77-6ImX}~nK4&fKKLlI89A|MF<c`bUI1!SDJip< -99UpFwC>-^37H%Qyh0oad0h=E`U~ez(RIBpe@*9BnmKt%MVjEnzBVv|z@)=T2L!Hh=u3419MRLN(bsN -Q1#wh|-!t?Hk77wl>JTt_F$o(Cwkp2a6S^)RP92VtviOK0I3!xjtsl-P`33U6oq1&+$baCt1%us>wB_ -h?|lM9URDs*97P}m5@+8MWMo+;3In+)X~?21?wN2m{qXmRpELj8Jc@^RAgk3EQ-+&7tF^03AnK$uh4< -rPrX$r+$haxQV9U|-_4>$|b<18z}EpRtawuoxCwHZ<))w;8^$uSE}AIDd#gvxk+9Z|;1g7#9x<dk1Q~ -hiIo2j~*b7hdt5bJU0*VmselkMMYN3ZH93U|F0=*`v4xOAAr+78{A-x$qK8S+Y{v|DE{n$#wey_0s^e -O*Z%(OihI4aInGE~mA<wN`M&H99EEzJP@J^l<Jc>jL~=P^gkxzrjg00#Ak>eZg*?(w=72h!d^X0>sTv -ar;&vVJQB#b=t6Dq0`lO){m!Z`}>2-!;oM%vYFEL}JBsm`m3x{sjvT+)7y7!ldrJ2jpbx<IKt2}v>V$ -#?`**m5nJP-V)pG=y@{KEb@*-5n}iV$e@Uh=Y*4v8)E-nNplaUq20=I0y(-gZ9g7+^hH73=ttiqR{YN -_vNLbgXBEW8aPnZ?k8GIMt^LXT?oJT3G+2_?2D7(b8WVigB(y-&cv7M&%jiG5eiQya}ZV7j5ChM{6>^ -v9PWbmpvaV^u~#w#%PECF?_Nt7_%d<!`?_triSi~Z0=i_=ug$6e40q1>cbu1ctb@ZWlSAnp-!)ec6gQ -VHS6^{$5H3)mrzayGpU&0An+DHFsRoOF~8Gbf=f)P$pZr$In!3mZU;C&TjZM6ep1Y88%l5vX~d`nE2w -HMz@dPoipcY9vsSp|UY%zvXSQ)f{!ZMyEYGt=QxQT=5#l47{X8(OpLSSpQD5z_UK&>hIu|bzhvMJn!a ->e;cex~vr*GplxjdXl7B+UyZT)YHBXQ}|aWSuCa-1_cs-0~glyghLm|HRx&G+nV?^;}gLz_w6ai44Iu -~!|;?JZ{Z8k==;Ka3Cug*cAOyB%>V%7MyUaqhAD-j>?M7MO?Bi(TsG5}kAI!n#e}o(tV~sUL_7*>76P -qDs7U(Y(A!?dkp=3-v8aS~+iAsO{+9LyhOb#_no5rLJr8#YFg*v#9yK6R~}q6JefiEj(W_H;OdqZ<cB -oP|71&#fgQnq(}!I?yG&rVb31!y^q4lV@{8YR>2lxExb@M=bv!dPA<-u7u4NK+3;*~XW0TVbl`!jgT) -y%L&;w1S@nU_rg<!q9-V{-4nlmV@$*yES=mJ4w?jD2X1qz~_{ll@Q)r*^?D%+c^T17c&Z(cG6(^@rR> -!B-kdtVemSf6<2Vz>(v>gi^WmEMej~3jK85InQouGJ-^VEFTr9?;P<7}}ekKdFhUB8V{CT04W7#mcW9 -lN3<sG59WF~sd7=bJv0^ZNeQ)e@719jiWeJ~SWKcX`|WoOjLF&gZfg9_2Vk{fP5Hf$Eg&p%w2TB++#~ -(uYcY%Dfrke8La#o!cjpNJ9~Bh{O4+wW@}-y&heQwIjEl{oINTZ!`ex<@9i6<ZL%zG2f#PPFF(!xy{O -gdwP+0peymS;>_Pl03mC!m?`Ug_cF%f<ks(Kwe>s3;s5TKrDk3DSi{EYI=x4^Y4KN34b6sa$4tl1FFr -3$NS{WKTx~en0f%h`19~u<5zvd-tz!yeb@~G8Ki(Zvkix<jlbwa@szMvMFA?q@RY7Fa=@(T6X#W22*M -%2Yia)mdh#7z?gX!$4j^({rIb+^H0tKp9It8jqJLlK;xKzA6GKwoLs(c;Zx0Moqbna_W0cqk0LbcSeS -<Wi&Hx#|h#DKTL`H$t`?Tm`Td)qR5AH$|80cB&hr{T+EaWqZAf?6h2QEkfJuxV#ij$u<=fcVfnE#hEa -FYz_DvrD?@gqs;QSpup?A%xXYh~a`^qnEy_pJQBGYnjC;XYs|sNU>#>06B8=G>BPyifHqq|5s)T4y4P -~jzbL}x9`^qzYB;hZQC;z<sLWW<JhvvJ%eIHj>Q?qyq6m5=+q0-K5-H6<<V$q@t3SRuIzD~)?wP~30H -e{tb^i$*OXHL_>Ec9)1-B~&eV5A>z!}Ulowe#Uzdg;=Q?RHI-iz?VCTcq5b7)w20v%9bcl4$mj<gdPa -5K#cS^%FXOc7|I;TlPx^uiVggeJdLymKlG~_$OX1Z>+cLqyy3Cx|O8P`HM1EhI1%w98H7vDQ;lY|*ZW -IMl;X6zJqR!B2G+H}4z&E+ufmu8fNbE`DtY-Z<rX~sCsxmKDhU|ucFPMDWTbG6WyrMVVnn>0g)oaxex -YZ08&rCA($5iiX+BExBxW*n&D3{R>%45MFC-6<AEX~vfa&bHEwF4Cz_avg@@yqM@Z1jAV^&DbU3JT1- -GcJDkX%>^(Yl4i_^I?JVb1<V_ydA0ZkS(?*fenOhp!MsA6*TY;S&FI0L`O=IHyUt8$#)emCqBI|ad9p -OGf!Qj}m=AD{l;#SUL#5dXb5CimhB-)@Yhm`6W=u3XnKbKR{xw1J8D^(62f_S_G>Z>_k4bYd%)6x-w? -{iSOLI8PuSzqnwRWzNX6&YMu99Y4Z|y9R=4mj`m*zy6bEG*P<`ikh<~QdwY0if^R+<Z7j+EvSn8T!b1 -<b+Hyc*_C(!2)d0BK$avzIilhq?9+Sr#yVcZc|_P<-bF%_ps{t~a+vv}m74ZNIm3uZV%0WLp@d%LeHZ -KrY_W<yq-6ja(w6%L?g|NG^k<%R*OfqHTfnyR|Jr6tFy31e_wH8p&m&bcvEK!Q}F)bQvUFLdoS>>C#o -Ygp<o^>C!^FM3T#L>2hI)Y=Fq6NV-%?mvnM@K)QS+U2@2!M7r#eF8SoLP`bQ1!_@$h<K5EnsTr=8h#X -U-W9bZ6lSGbFrK4>|9p59TxLutUk5&FiYv~Mn?N)2)0({^5*d3Vq*kdiV=p8c>hwwPZPZmdQ=@drlNn -f+$y=cb{6F(Rkj?>+ExrOw{YFwCzU2;45{)k;=({%Ga94F0=)O^QTOYv#DkJX_wI}*LlJ}J6<ahqJn6 -DG$Y+$d7`rC#2zwvz|ucfp9!sWze3P=Q5nu9hcD8;Z*p-XX6%k3RbwX&)ZB<Hwc7_7AWwK8FKp=k~Rh -nG7^+n(K+#^umg2=WW;^6jFghQ6h0d@~iuN4jmGoFgmA$N#f9P-+k=UPtlw03qY6>iJj<V2|=?wqg!1 -6_Hk#qa33pH&+M$5jlAd|4IqwK9EV9o7H2E&?utqBYHgFGX*0016xZ5raKz<64ly|!@sr_xFEL4LNk{ -MOif_W#%3>4O{I0m|6637$g|oD~-fINm(`ei>EFd~!|J<P((Y{s}qXg}D)GFGconr8ftLpZ7YV_YOR6 -Nk%Qlo!Y0LEHa#LIHWrqt%zc<^l(?9-z-BOR6;tlEmhz>kQFX=(6-A-R~w$G0d|E!1{_bU_ZWk_Y-yd ->T2FjjLWf9C_Nkogd#uh?I@5b2vy2SOSRCTZbHWmP`@q66x0@oDLGsveW==_RZ~XUp2nT!7<%pOcx*R -!1i-zWHF^y)N`|tx+i*;Gr2b}-c0c#vB{h~(HV<jIhogqnQJk_9Zc3WBHlj7heB`KMPpPN?4_&0UZT> -LaQARdwBz=GXh&X9wBxIUhIK3wbu6?&9UFGLR>zpbo{nAEm2tR}>3ngGy%|*(M~>Io89Bs$sv#Xu2nn -Q$f;uv}BkD+nsv|fca^Wmj;V+7fsF*vA>P1giy%^M#h(y%5L?jf&{<=#%4&3Sz4}+U{h-3dLU`d=~w> -a@X&a>S45GFmvhvcHpIF5)D@s-4^>mW7|2FBv7YO0ku-Qp+@Jl6p?UDXqW6Vv4B-f;}&zGBiJDfdKIx -ks9Cqg|~NV-^%R%9F}*wJP^WlzXTY%p!4_7uEJy6tL8cEtf?JPg5lv@1_suh*c44Lld=q68bdg)!1<_ -)%`@uSR53OZAEsutq6UbN4Hi~PD{mD`hd-|usM&G_Xy4jbS}%P8|nvTiJ6QPt7A%}7%LPmkvoh`7%Ui -yu@#!s_3$m6iM=XwVsNBDYcyId#PA%)oA_YNJuFMx;o}S;BlLSmLk-_`<Vm8~+ej&e;v(?to#$qAUY5 -|E5c=C}eA=;~)=-q%U>_0HN?y`T?0MSfDds>Z3qw($2<F;NROyZFFsZ@Rj*j!9(MYg7uSaZZrO`;Zwm -Dr~D~0<hc%ZYryac3hK`>D~L|lLIvF({s&#EVRU|tZGckVG1cNFed(C$b4a*mj-=0J#my_u4DL($sH^ -)Xu|4)^>nTyBYV_Sa5l6~i~-;b<}PF7W5vWxK!gQL*=>MPKQ{Y2=8JT~#j`UF{{tf|c6Hen67(FT*CY -m{1R|H=iD)O{|$6UsxRnt&UU9ku)rHObViIqh{w4dwZuX(>2RAF32c%=0VY}*%@hT;k+f&b$NHi5MHx -WXKP=2ufAqyfT2i;8Ma}5dD&X(Svo1m5fwy!g%v**?)NB-QWtFxbk0f!#pR^UoV2xc-YRXRI-Rup5hp -DliovBgT;<FMoS%&nx2VbUh8-ceJuT#}0P2xEC=*9i&q61qtuOw5VSBS<55+(JzPO!gYT-d6p-?#za& -Vd3dK6y1Z0myaIH-j$3mi9J9=faT`1JJOS><CbYtbfw2sP=Awsx4V5ubyMJfuxHd?!jWDj*G)ns*XM- --Gp(C}k}+@mrk}MfMSw48_~9rNgjkw`-E7$@#$0=;R&Ij+2h_r0WzPSm=j~CUI^r_8?#x2@7zE)YF+| -4~G+=J~BJ@<FJtT+A((JwFFm=mqU)nIu7DU&W=lUW0tmUK4Pc+7AxOTRBoGUJ-Y*2CG20Xs5|Z@rmSu -Aw8dX?L)zl=wT8LxQl}8(XiIAHPW$%gx3%M8Vm(h-3#+*}Hg(9(=;B?reN_f)M^b=J@?As9aR}#%q7$ -}0MK!h_>Oh!|I1ome4P^F{Mz5k8yMtnAksHBZoGRKKB(zOiu~aw0%h%pdp2$jW_8-(yq4ut5`wY_GU! -B<cla-S0SdN5OP#_Q64MdMMf<oMGb(l!iH~Z@CvEt@;G6vX3kueCyAo~Cu;EDq_4&xk9?L5-QwfG&iB -V&KSiKJD9u)1D{e=DnDztwPnIzX9wlk*us+Aa&Jt`I<LS6N&{2$k4W9QScEm065dW?wWYsN-%0wMXDq -=+xI0*ql}<FDf=wTsx}#t!`Yu_OdELG<n{yRW_>hj~ZKXUOQEz?*?MN`2cnhN1CNdxuY!>V7zChiI(5 -0-Qm_^LYi#Yuru=9Wm_{IIIs=V4ipy0vzLn_RnpAEbwcMCA1g%c%>Ch)U59wDnG~4!N)i9F+K7XXuy= -EcnvlhL<j$uOaj+d#KI*<*K8628Cq!M7*!AOFn$aLksEnN`#_I41b&pLxq0X_5r3=w;9CzrQ8&)>z+h -WaBG}9+qGj=6T3lf=4KjeV(VtONS<r#WkxOvs5Rh~<^qp_&Y`(x|Ha>sVafyLq8jFlT!?QrZ6hfvpx3 -I+~6-54p!aYifvIRY=|qY-L*(78CF0dDos6LW{%8$-_#7wJ6yRbwQJI6us4q-+WogfiO@Qdn{d7lbjK -sqU+mqhiavGv~O@RL826JX77*Is2<dic+#|X~R6~IG)|8mss(e+_cy5SxuIcSPN_K=Fk4~{O^8@2AzN -d6pU2xHU-layhp+13a(YKT)|Hi{8>SLfP_629HHRN3f`e$mVyNeu268Df^RGMgMuEdBy6o<7X|w&I8w -oz6--pnrr-(%UsG_Wf*&eat)N$Hm5+jb6&$1BoeJKg-~$RitKfPCw<)+^!IKL9px}80o3)X!lY)H}3| -G*s;4KQKC^$#KWeUEa;8q1cRIpk>)>gvn6bw}`T*0vlPE>HZg6Rt0qu_lCKCIw61ve{rNWoJIeyiX`1 -^ojRKI-`}puWASr@S97iec>68zqb{lJNZm2^&6>4@>to{Tugh?0NSa+?k9eGR9`oo3GQc{BNXRRCcZ< -Kf@NEo1L7Rm&e#_mdBD=Hp^wH^c%oZSSG{PxzI43$nThf$@HV(Yzmvq#<Kn_T;-+N2eDx+mRVdlOkp> -(XcooBGqZ5bWp<XuY%GIvOl3xTbLoeCjUs#t<}2x?RK~MO^m7lR`7&~krj&1L!k6TXV#hI)2-R4aiG* -h;8$v(0^rtW;!pcS=XR{oFMtZa9zn!QBo^c|_STcc2DZ(vHq&ZuJO(%--$dp9?^F%5$iGTCRC56(+CE -qMIi)>jG0@TkDDb%F}{|w=iMDa4%Jt|x_x%(0~wDb`!h5jcC|5TNyk#e((^x<!$e6vNa@XMiJrYnX_a -RB*53o2!*v&l72*b(wBN>}0zx`17-$jMHw2$M~e8%27VBD|z5N#v~YslT8Nyv(35sf4qU1+#(Vnn|f$ -FSrLuNOs}m&d;PqIh7@Fgajpv(#aLL<kpL67C6OG+zdfy!}1>ND(@_cVH2{ECAc+<Xf;v}ITSZpm9I= -alc1zlD=FzS+l`~{vge-Ppx=?NE6Y9Ajqg#E&SX_Sxh@~c>1@G0)YX57d^F@+sEZB_CyjrNQIOIEKL% -5Kp`~LNB|KAc^=jMzFMy|enp%1{{K@j1D=58sy=yGLVSge&NNviW%x|bGzZ_9wNOul}&!t#)kw#-RNv -oT6DQfA3{R#XNM5?JQUtm5^NtU#s<g`+}68}ML_*Kh0n{rE47|Z&dt^Cm{&Jj|XdW9^xr(a*5fE7|q7 -8s_u$xc)KM8ouM_?`4-t5z^W)WlqodWx%!xU0#0wDkXs{M64WMeskV0To*Mb@ddy&K7bKEZW<2(Kn$b -NOkdCN=ei8HPo&At{q>5kTQxgoh|IPM)3`GE5B<`KZ*X&q7Yijd5x5)mVRA(pC-yk);8H=<&Zr?q+k@ -iTaIwa6?P3987Jim9(gDj@SW7h^vb@zO4^$%d%Uu{Vk&!pvab17+FL1mq_VeG_UcM$Z=>uhls!n<jmq -9$*^fD;y@RqRDtkvQy>Fzwla{}-cTx6f%HCDW?`vr{YWXR9H)Rh!E$#UlKa_o*mfu&>evgKqvR_p8{m -RajeVww$iMpRF^b+VBD2rP}AE&i?Q7nXhMk?w08f7e*W>QQ@iNwO!t=tBPAC0f5tdaUG5puTDH)IM(? -=B$$bLsz$B3{E>EUsGKO{5=RFSQXae*Nc>kMW9Mu<LiF-<3Zr)tIaOiW>RV53$(or@O|Vd;BGCKaXqt -X>pDJ)9n9W@LXA@>HpmlpsV{`>r+nxbag+EYy8zoz<>4kd-UVimVWLwcfV^US<zkJey#M@(cRDm_dwJ -=1&fyy78T$3x02GOj%8)b?_aU<fd^MT^zb9AAARicC!T!j={3(h``p^+UwCodOE16j>fc}c$NJabcyq -&B8#is<^7cDh|G8~@`Hr2tcJJA{Z~uXV?;bjQ<mj>EC*FJigAYGC`L9zSfAZ;PpI3bG<yWWAeEp5H^4 -qHKzW?FJ>Ysl8<=5Y8&eongf8pY#%be*vJiWY|`RJSb`uVqLX$WZ5x=q`_>)Hji@6fSR=Pq51-MaVa* -{gS-;OqN_^y@!hVCbO1L&Am*yCHn|h=`G+ZX6w%G&4CRHEmXU#+`R%&d$otxjQ${W}h=Rf8IT}PoHr| -LSobY_s(CiaMAxX{r}VX|Cjl18WUx<jJ?Sk9WyRA?&k6F6DCfYJmr?D({8;@^1o^S{}ueldXAr4edtV -fFE{(c4eVuP*Sp!5H?ZH|z`mk^ePsjt0}bpCHn4B-sBeF(fgQ_;&~eM@^>=f((r*N5K+u8m#7v=lQq- ->>!yJ+P8C@>()Q<`Gfx>;Dav>d>-0+wb#A6ntGC9wN5tsJdOj_8SM%>4%IU~(=62TlbALAa<Bt{-~F= -odTBgT94T<OH9aUpYs&k?hGnaUm~^v-1J+vGEr!p;<PR(1NQOb4?#b*_>g4Sx+^4Nna(4Id2;ncqAY9 -$NldzFIy=CrQj0<cjfQ9Ufx^_H}NUNkXW+2H~cP5m1(xQF8a0OrhP~;>4J*F2p2(r@K8#&?WQL^3&4S -($mt>;*(riN6el*BF`mIDfIL+#?fPhVIDn_|8WCTQU*#(Jc)}*iHtclId%5TRF^>9oIR(WeSESl8`ep -wIX2D1WS?cvBV=RjnIgRydzL78Q%-IM${;Q&H`!IrsWWr!Nx3eD#Uy13E9Hy4kUr8znn(|6QT%yG3+W -&};;>0cHhXSLl1OK4ZiX@uU()Tlc`h6AD>Wr6)y-kDUE1QZvxMU$yMjqJq=Wc~gK!7~e-ZDdRBa7lYD -QK{_S{LfBwGggllzps)ZFni?@Ud$MQ5dD=gt-$Q&oQCADfhCGbP(H=A_1F=h$;x?$S*r$KojEq*<wBv -h!ukDO92s8cks)b^u9zEdB5Vi`szMi0h?2%buBey-WO9GyLf=ZuV@(nt23xSu7TBJVQgNeLw_bc>FXU -J-Z<^bZWd0shdX8T<H_j6X~G=YEC{qdJ4gOm|m~PkX_Gwv^K3-LBV|miwh_N&-)7QTT;;0+naJIE-t2 -qIyAH(zMzCc2lok&pISiiDU<kk?5s8h7nBrGEJoR+r>E=nKKVI0b8~X8NdMp6-TjWbAy!~+rWflpJqa -H>74DG115z?o!&O&KlQU+gX4`EhCD%!|q)ekFH#a-in2}|SO|oYtr>A1<J5%{*WTvJVZP~``oYX91YJ -O_6-Ig>nQ)?loWWfUeG!h77QkF3(hXSTh9Mm2XlmQLG<)$X37}IjIXHyKBOb>0c0re_-CgI@{N8{c0) -ZBR)S+k630+B2H^HOa#H*c0_OCd5+>^Yek$uflIBOmf7;+qaY{;9dSP5al;kxYcxQjIyXb{Xw?K%-Bu -ygm*1HY?ReY|F42le1G&joE2h44K{lF$Y=K-&pc<s6xt^lA{!F_Ut4w5m%7~k=JJcl|vtx^3qdhCXr) -iMwVjq73rkr&d$h65=<h}3Hkna+p`IA;-On{UNtd#Cc7mg<Il~orGu4uwxnD)=W9&1jz5A*6{ZpTHT< -P~x~Fvozfw{Ki`~PhVwo~|Z2$1a`P-*QA7hfD0;SU+hbzN(>q9hVW@gV7<=x|oVrZfqo90Oq<(@msK0 -7tbmS+r3okKM*Bh8pPJI6Nf`rprQW~xyW(j-DO8DgplkzmT~)Y;jpE9=gBQSaWJbhKV#_PD;Cv5Aw+l -U{!0z}MN^HjRB?R$*1v#BMz>HySl!I{J^i>9<hf%$rVq3_6m$>3JEmb23vCGF3Y=J%3o(^ogmNsY!XM -({Gv*JxO?Lt;~R&l$q?>9x;d7M$g)$__H=)eyq(z!?70SemR@_%DLL^9f$|?u0O2W5i;N5X4e_Km?5k -gGYt02Y1PS>bxJX?PGK!sr`(|G>nhqFYh4~7(n3DJbRyV=v4dJ%Uk~OxxLK&qPsjWSVO?8a);7$*+71 -q=Zdu`f%(q;h<CEAdUf0ZnHJj)W->SVYYror%wYL#WY0lb*=~?@UfycD;4|Qkk481?7^jitsd<1S<n9 -^RPv(u|TqQbOo#@eRnDPJGt>k9Yx-i&SST^CO0>&1MDPQo{*v2-7&=IQx9b>W-0@MbN-+OZb8wyYWT@ -mjdTVCr(If9`%nLY=<{^VhXvI-@@`rnF+l$pOqr{4?fus_sw`bnLqFwmG^^{*tegiLYT~o><4*RtDld -@xnm7Fifn&XYU}!z8=h2_ECvX`vJ{a=ak*7bJ#A{S+|X~EcegxBLzTDN@RsMcuzb?A^uNpPP`!V!~mh -0=zKhwkM41irt1yVvp^fYDLyQacoI0cRe7r`-CX73M@>XDy^$JkymZWKOdU@Skl*2OX$EZ7&X=`IY02 -7!wP5WgwyADaQ74lKlQe>{AL+eAD?_)k(d2g6NXn1i`6|p5nCX2&i_^x7<lTq08EkOH`D7H~c4J+fj% -1#Aqgx!vpS$c04y<T%tW~*&*KMOov591CQxkMPLb}00dXF8Euzi0&)-h!Q>o_@{bqpKNI_hGWELB-9_ -#jay@+6t3vS~lrCG+Jvq>Vb$PEWjQ&e}~TNc6ND+$Kk>*Se0rtfMV}@-R^PEm_A0MC$RnAYT?l^*v~^ -9}5a2^F*1eu2XZ?>Dj>QHWjUo8OmGa_$T^>`jU*aLOK+_Bef452e+%1R2y97@#-y%eMaxkT3zYn$2!@ -9NM75Kyk5sT=~^=xhth(aP&y<Zs#JXwU3Knu#y-E@EgjVR!K&Wd{D}v|2f~-=uh#gEavL*)vHR%tQ?l -Ni%umxBq3o?%HDj$PUaP_N^W%4rj+DUIEh?O@vp?%hyzWfA?o7PyOuX(qxP3*tW5jP!&-|#K`HFfb+X -KCjIax+jHq?%^pX@_8HiK-GH&r+9qXFFcjJmq1>*>pShP7usf9_BnRB_$0w&ksJS|tX=OS$%CzPZg@a -l6p~%S`W5Ew0GB1?5frnXLGeOZZCOg^KoFnYA>|-pg2v`Ha1%wG9KCvo5x`SeKLytV`INtcz|v3s7xC -j<;67d|dSlX?(ko#&e6Pt<}=#s%HUV0W2W5uH8obaIM~4rQMD%Wb9&LU0Ry_w(mlGd%&-v`7xhz?;Nj -0&v=heq-lkJke+0iUgCEU@jGa6+nn~HeynR)3hS!7jn(f#BrW?rt}cJCKTQ3{!*%l4ewZKY6?V60FI} -2vW9b<?UOm0vo?@)e({AZ?)3er-4XicQ#n!o^1x`ddp;}$tP4(19^)#gg)ir<ASK0UFQaOq`OE1Y~5b -=-b6?In9`~uPZM58nx^U~UOdWlzUiC5_7ggleo)pv_BqOzejynTvGhAT8$PQAg{1$vtwb8ib<Qdp8b! -j)vM!o5zOdz1LHfw7({{2H>G-Xhu6;x|zzk5ZU68{O)ps6%ylHc>~bMIH6_VBTRmrfcm*JZ`~SKj0TH -+R4_GPD>Bga<Fe``~EE~U2Uz2$E~Qn3}9`dT0Y=gt*>Zy%&Xi(@yzPVw-x0Zzziq+awy)=uBt6<N9EU -MNXy)Y@j_kk3>2>=GrU3g22x*0X#~E}GN(nNf4r`_jx|TS-5RpsOL!6-EM-C0puN!QK|?5LTB7Bp+N4 -~<aj+LN>PlJroFGw8LaFTA_o6<*7DhM^VeNFGOzZP;V1TZxKkI61#k!^hkPI1E*E*dozWv}9%xJTdPG -TdSgf!T&TuM8O$<|P&k?5&#p+2s}ziydgKlXA~Fcx5_bNiCqO1@-GKL6Q=Ea89lAxrqbWgl`^o%?p*G -Tlw7wkSE|i=`3YRJPD-QmXqrUrhE)IrqoXbz^f=Q)4q`=3+i`9g7n48rq~GY3L#?du}cbMz!?y-cyq@ -Y-6)?C($4{GgYNDn?h!#=2Gma?5w=(%+x4bZl;9>uQuWzGv(!F%*s+JOwO)DfPIY|fPNGW-(5SFJ9v< -5Ty}~*Gj(i6X6nsJvxyA$qUQw62sKJchG(2T)0Q!2o-K89_SB4&)Ts2NT=tNn$Q6z>+PjeUBwLD=_=7 -npy@#6b6cb^L#d@fDQ&UPxuE6F-&)Dpw6vZV<Ap-n#BU7f7%f4e~HFcD#5}(MTGPCnE+c?X_n=P^0%$ -!9x$(Boh(Nl3aMeI~le6;ZBQb)UtNB-|(t{Du<&d9P+P9J$#Q<HK~cBCN*vk8NJmLqA)rIMLEF9$J~H -IN1qyHkcq%C*^Zz{;uYh?h3QQ&$3CdQHhn7uly+@{?0@z-=lDWX|3M{Y`p%ct+=$Q)k*|%}ULUCk8?U -dV5W@W!{oOSteyp$(oyyl|oVrx7h6LyX-k*?ODl4!IEXe)I<<`qLOlK_FPDlEj8c9dcjRbwdAv(nFV} -^%FVD5yE7-His)1_p0TM(b5gHxukwh_BB!LxjC&e-nzB+R<z!?<W!nkQA1GaSKA#}IXQtY&NYLai5ya -)&bYnB~h^@CIW!h8O?XXSKY`4NDimCv7bCa}p-D=n5bj*!L6JMqwyev)@<~@~i7IlDqEXuilO=j$6l; -$m|xp~6&fe0gIp0Qn?6Dds*naxMuQl2EK>^yRZCnSa0;18QdI%|Jr9VFSGC0Yzi)|`yo>@3VtNok|T! -sxA4yUE$Ey2!o|^}CVa>?K*7<5P15Ia$dPG0OTe<UBbe`7VX&zAIZHVpM^U<9T_u)Y+KUHsuLg$i&LM -CS|6k=CJ!!?T5!ymM>C?2lrSO%%&*PGj2pG<1KM8`;+8SnPsGiwkT;<D*Ht8oTP@dLs^q#t*6j$xY>z -K6k-*4=+?5#ppvxbr6c<>_OvuABx>VDiW5_10Vg4bB`alonk=OW9(8Lr2*=n!&)BFqLP4;NxHd#egvx -g+`~Tt5_G1oy_VfOahA?(`hVew&`&`>r$Re%s`;~_Fdb?5r*zZ2bNB6s->WBCE-BAB|{`36jx!Qv|ho -exm`sAq~_Q+r_G_I?{x4^gu1N&0&@jdpX=oM_Pps(`tbMw1S#RW8|bOV$d_GPzLFWkE+_o2#eQuZiik -5_RfD)&hWPF3mOs`AcM?z0(oMl!L-1ADS_6|T)x_yUFVVg;8d|3c+oq|(8e!dNbUO4*-L_^eg=y{Ozb -Dg2Ho|BsY^kdNer#xr-mH!O#%J%4rhKN|nvo&Fz<|NrZQgQVQ;8`Sr$e--?{{`}tlTaN~hr+T#bYkrh -`c=jjt{e*f7uKcv=zw~IjOH>2*&<ir(ehLOF*i%8Hf}Io$QZPV4y@E`^>hls-DEPjD`xV@+V7Y=@72K -@g1_jqE_^N{I6kMy|8U>$FaJ7Of6f98CreJ1+^ivd^uHa+^tqMje7^<LA!5{_ODyUbm`kbO$!RB7|+m -w^a{g{IL6)ab9vx4gtT&Lh_1xpmnS1?gQtAgPQ8WjvuFhD`Qf=t2MT7|cQP6aCzJgML@1@|jhuHbqFS -1VYeV18}=^wSlbrl3{9Pz8+&>NR}MN_bkqPZZp*;2H%>6#VaMLlUpAKkoS7=Ks6A7}9urt^Eo8Rh8>+ -66UD<Li=4k-@o<=X!4Q%#wMTtHWdG@Pt&{qq<_=92mfdB{wtsV-({e|^M70<*7R5NGag=III@;BpTs5 -emUL78FMKZHGtW!7_~{DqNonN50s+@i_#Mxkdd}EH`in117^&b}*BIWU;6@66^x4zTc3@|obv}E0)9E -jKMwlkh0CmEtJ5Cu{!l^q?4Zbq`dnZ359e@p5C}SQ|dQrK8mz6%fR_S{K)T_16)q^E`KkBc6i`4V0O7 -~>cpMx5%4f}%2N?&E;yqh(_@;~-aEq|BZLw-7Th~N+!<gW46u`q(Y+c0*K+=B@|NbgoMuOhga-bjC)f -G-D<4nyv*5}ewe^dNGdMsQ|(8K!{X)A-2RL&w$-T+o3rFESSpe2?CfK05X*!Tuek8TZ4FRpvy3&nfd- -f**Cno+uqViG3F|=nwYPv9<(vDf4cElW^8Gg;_@MjV?0o27*7)JD=QtB{;OJbPp%^Lsv<!zmfP&ZxMw -FB{-`)W6Q{#PSDVU^kOmx5bRIyW^W2Z@ZlaZ&D8{N?!}ltr5R6f9lf8BJK$}-Nw;dQW77$KNG~HiPZF -HiN8&u0;M??uk$EdYTtG67%+m<odA;Nz_VaJ-OFA~WW1qxZ{YW1pb9p~;u92Vxa9@8J9`{a#43O^q2+ -mOELj+$Mgf@Z7i=gKaswZUjCpa~XbW-F?ury4jvy9*cdi7p9c9CF*p_29#f<;4R7{Im44EXI(nHL*IV -;Xvm6gQNhmEK@7#}k}DZ$C085=<I~eF~H&K_|UoWCqN>LGrDHU{*NAC-)qJ8^R^u06(JFM(!sG{uVBA -2pkHC6?j@byl7@=f<;J+edm`@0<97$s%3bTq}&?uQE;K)%jJYe>Xq*o(ff<N7;WR>6zqm}#+91}^ -j5KqhmZ;zDePbau4Ql<%bNSOgWOwzo9;Bk7VQ(QKN%E(NzMCL?-&zTiJ37%Kxiv%CG$hfNsE*wiTM&S -zx?!SrTfXskj-z3Y(Nzfim<xA##g6(5e{UX?59GS_z6TxAzGM#XO#c_=NO6C%Rr*4+@;uC^=3dwde!t -)l!I!>i>C37c&W2Q>n%veR8D#ITl_!M=8lPSy^f;f>I?%@R6O(#8<+=B?NoG#s05v-UlaRWRwgXD?Ao -FusF4#h))QxixY$bA~Y`x9jN6$FnbNF3fL_?<EXZcUQ%12}Z1OedURda{&fz#CF!oed{AAdSL+KLmTu -BEFFs@FRM|fg8a)(it<OT_X6EGM^@xks-~Q1h2c3%9PAO1k3NHdO~JE+)D5SnO70qn=8v`Kf%xPWL^~ -n^KGi!3HsP2jo4??%dTXbV7f9F5ZsVYyaNvNNPg~>{7fXc>0TLkGr|7zi4UNQ;MVzyCj?(zNbRs*Ct% -tlqM6L;1Z(MCLty}CFQIxz?l}Z+E}}6!nd1rO7fBodUsvX1a4)9uDTM(n_#4qnW<c)}MGL`?l=)YJ38 -ku?C%C3mrUUr3a(5COjw`b$osk5O)4Psvd!OKQ50R{p`&xp-AC~1il3>?Is81(%Bf)~F80$pg0TZ64^ -vRq^@Xe=Hn?SJ58kuiff^D8<ER(|YBlyg7)W(weRf0b~CwcNK!HBieJd$AETA7ZG;GVS-&;0~vJ}>c1 -A-HWll`omg3C@09@;`@Qhc}4VWbQ<8#Tya_z@cxFe4-o)roTn9M`pm$8;QSUjwJZbM%fo1BRFW2#378 -J&t@qDdcZ9-wj?uP*4xA@GUpI{`fbH$g7$YvZz1;;1V5v<g3J{Jk8G#5n9Rorjx3jb9N^d;(%nk1^={ -%bncEV4ncg7i00e#aQdyAMpWsq@<H@`Xa6jpxWCl#xulf;!|D-pE+{+1$KS(qp48gzCyA19GbKWI-$X -r11rbEPAGA9xYJWMo_If&pSdN+`HGQl~AC5`w-0pA)tLG1?M56TRPefn#OE<o(XhdW@TG6UYB%z*Qi8 -SoKh#=h`P$_#i|nX$k7XJrP&zGRpIhbS}lCf}mWfZ56nxKx<|u}2qp0{)=f0kIDgX271x3^-buvClF= -nXl!M-%NXo^`T&@IxU%4TPeUAQHfkmaSP`o^irxaxYLGhhH65PvMYeUlOWcWC=f0aXF&w9b`+{>n2t_ --p=E8vUCg;P;*KZZjU;#Xk|x|&H{rgn3HQxSxbJVm{bUpF&PLoZPl-#7^tsf&5%W%~kJYPf)V}NL>_K -x#f7I96%NJ5R;9X}AE|U7CW<T~4*#qkA`EOHruR43hHl6skTC-cX>)35>`B9lOBfXIVOZPA6uY3j!7{ -G42=_WRH>Qw6cGML?NmjzW&Kz{{n_3G8^#TQ>>TefUr<>lq<qmMpfmoHytYA9A90+R(7YB7Iy|DghZX -4p4(?onYq%746A;D2%M-1+kn;75Mw;!%F+EP3xEyPhmRQe3jnoeR73=%GW0gk21a^z`pXelbn>&z)bb -|BfQ_y~;lKsJ<5Q)6y<V`yzxtbTlpP=ssn?DE%|Z{UYp?{zdY~Ltz%l^rb!XtO$ST(9ylp;jBpibL21 -Wlt1T=qlbVRxdFe6N6&puwi@^g{Fhu@dg$Vz8l(aH<%!dyDZs@{N}ufBTMx9o{)t0JiG(!pM}P9~i`) -Dt$AGwmOn<3(aI4ruM=8WIuuFgOrN;(^%K*Y&d-&+u?ynvaVeyjtccziNmZFO_OTz!ibCVC%UOZY*F2 -Wz>{L+-|wHJjq!V`ZhpQz=+Tks!AIHfnji!-24N^g<Az)c-)pf6F6^kx^kmM^OCEEr89(ADkrq*qtKW -JA-$t5f0J<Be|OT|_T0U^;p|>Gh%4KyOzLIS){>{(EvB78b_h;^Nq(Nt4(;_uNxY##gLZ!Crp(Wwv3% -1|j1ge)u6fbLNao&U3IlOnrXN`b|D4iF<SI<r~wsvqjr~+@5w<Hd{nRl(wDoMcb<qND}T^^uuon8_BT -fsWZ28ej#nafiqL4Oxd0m8}<spgu7zy9?$t(34CE`pY69#NnnfkbKBpVg7mg5NBWC6|NiXR^-M@H>3s -{kcI5#+T{-hqFT2XCh4E3ZLGlSaiWGd(H_aq^diCnXLPA1VXlN)KHEI+ynM^D?I$H2<!h{LzmRoLNx8 -8ayn=xYsTbMGI&6+if-FfGoZ1(KgEH^h-v>yu=EMU*rN3&P%8O7dQ7{Ll>S=h3>qS&fz6MH;2lD)Hd1 -p9kIG<$6EOtxut4%>VGICkv0yIAlx&id`-Y|viLM(^fq=t0g#9^q{IVa}r7=WN_5&L(`$SsuMpzU1uo -Z#YY?;B4l1oGo6wn3a~6vXv`WvPT|yggyG`qwI+%o?vU%tYObT|GX&Q_3PKOx88b7v}IejZe{Q7TF;j -J#MxWbobB1OhaEU@fE_-3m>oZUoW1}4`|Q-IQ|!}EKV?6jImzDpnX@mx_(I4<Wo0G%^~Z17SLZmZuC8 -Wh&z=>sg2!VZ^$+n(d?%=1K|0iWsWY^s3T))9*(g4U-OeYldHim+ny+MU@z>e={J7ShvbGezJH-#B_@ -gL(EXBW-;?JV^`MecdO7Wkd_^(m?a*BU~;-7Yl-<#q`QvBN}zK!B9r}!^X{GAm4IK@9n@js*ZUs3!@i -vJ_UuW^e%us7*<G?vYwG2RLqyR2W%*wL4$PuoS6@I))dPYz=I(+P~9zMJuHS2AAxI^#8N@!L}T?i4?i -;?wwgJ&iw)Qd-qCp5pT;{!)tnB*p&+#os~kPf+|bZt+R^i1)(SlHxaq-b?YR{i!A;h8tTmej~-7PVw) -d_>WNhjTHZVxA?3ji)Zbq&URxfSO`_yVeBYLel?3`ywz=t56WSD!hMY2{RHDH-(dXp{fr;~+%3M5;t! -+vu@rwM#m}es%PIa^ivK3X-$wEGQGCjC<tG&X48^Z@#qUQcjH47XD22aK3eQstyD5b)D23`)oc%nAvt -K80R&zIJXIFA|?sd*C9Oth19Vvc)ia(m-Po((C6n_rIFQNF4Qv4Sv{sxM_lj0wx_@7YxD!2H0#eqPI- -;v^Xqxiikem{zTBgLOa@$aVi%P9T}6n{I#Kjjv`{*xddcc-YRF{UvlvoOc@4er&md-vWqxqMAyVxptX -=9s9_qfO?7{=t3v^y+!jO+B;}%+cgcf6-(xn-fB=M}V7dGAjR=xF}1^XiDA^Wg0!kl+X_WdiCnwP5DR -1MVewvQRXO$54;BS3kkU~p$^HIxESpj+cBtJ!hiuXg`VBJ8GGD>_>_K3O!VlOgwAc+2a!Jo2vz}lCs6 -#+CPa>kN$A+7O?&AtaO~OLNJvJz(oYC%+osL9Q6fNy2++-l_)%u~n&98IP3Lh6wb;JMf#N5OHpSf>6J -v=<=zs*;2eoT=oxi_-r�w|2Xkb`W@;8NB|q)A7zP)j){r0#C5F~fc*RP73q(OGsjrs%yDD8bO=-d; -D3E^|5zr|j}lpETuT^<0E&Mi{Xr3N#Ns$hOq?J><e>4N@J}!giUbNVltzcKW81W8Ljhd=3B#HtL=Lo2 -1~-#`m$7373Y}d3Q3h{Ac*{^rj5&_DJhrPKqVrfK9-~K?OoKfQ-l3xt;u7MbEecE5iAT{<VPm2Odg** -`RvzG0wAtkHPZ&Nhpm{T$u9cNA1d4Gnqe+nJ{7p9u4IR?lQ{Ot8Jfp^tEQf_fMb-HyB#beQk7()RJ&c -S|2}nKKT$g`B6oQP8XyM@#3IC|kB(5>6&L8|C0gLo&)pC47RNUwYk~PNM)0dAmpw;j=6Y(+H%^T^Pg* -Un1FeEA>y1uuRA4=a$f*5TXI--HMTl&PBXw!%W-Ylm66W73-^YTTthJw)*q)3$iHTvA5M&3qsxdJx2f -j)P2Jw?;!CQh6v^pS<BH@S3=7xQmqB^egBIyZ`KSYl!8A6v+7*iSkIwR6^wIJ@ObsWapgeE8vq+2fBt -&YpboN%qV$&#<*?*9u+X%{Si^`rzAdzb$ly56WL;kCVQ!o^*xXyLYoAM~(>H;PjWDvoF8=lAS(%npIU -*vG2b7j{W@8k3u*2?YH09rAwFC%CnrkPWIy$+}hcJ-Ke9xfjT;>mn)K~qnk$^-Tl<jy}(-W4QvqK#wP -In>~8)ZTgg9Ruk$n1e^<N3rw%cmM)Wz<*{<kE@rP0TNQxgr@o%U2cT@boQT!(<{u>nk0L8EC=l-Lo{6 -|muzpAHb=Q?-j&_OJPw-*OLcL?e=aNt1P>Da;8p+iuIZhgB3v~1ah<g9)7;9kA@^cvVIz;JyFvUlj#q -fZ|S+bW>zz>t9<tW)>C!2>({4s1mMTDEA>rBk<F!2|t#gS#jPqcOPeK)v2SnBrXDx@C(FLGAhu^waBo -n|pivUvDsU@M_kfZ)ZQfFB}F2bPe>;`E(zMr*m^}q<>wIM;o&F_3&-pJcR03w_Y7RJCQF%=}dOYKcrL -JK0QJP4h+G`NR)rykdU4sA>Bd*eVypR9*u6@<jVgd17jmG3FoQarltjTZeb7}8@s#8`5}DYoG5}AuiD -OD!=r6MZ|3%Tt6cv(o<Fn23ix8ncVO49UBOhmI1;RP^XAR5vWu%Dar`%q45yYtY#Y}&{#QMoDqa8I3# -cCO72PAm-}v;?Pfw+O=baya{PF7_e)!=V>U+NY{`>FG5d8etUw{3P#-*n}`Q($=_wC!~(CKs`BS(%Ls -AvjO>0k>z`0z*ghq6Y;+`4z~-aQC{S1qqGZqV(w-#&U6J!J0q(MKQMPvdC5efxI)%{Sk0>QDKHAAX1l -D*pNBpK}_2bNCYtoch^Mola*Z(fY-S6DOY9v17-gF=NIIVX~a?$v`_MxAX%Sl&i0LVb(rjz^4M85q9? -M*+Xh;YtJ(@gV&CKd*b&|s)J!j<Axh<=neb`FM<ETg9rJREn7I@$2V`@Ebu;a<_!P(>#zB-W5@XM<Ht -of#33C4?x!iv)33k&`hrcHHZ35P%~DucI6fyQ$Gm*`@_5p#fg3(&2x-@@-H_7K(%S|P9t_?Ena$>4r2 -9wl|K*ooIO#Ggd-Uirlz6!O+i$<+<>lorJ|8`Ll>h5r{}Omo`3T%$uBfQsAAkI@u!AP;C7nk=lDS`h` -st@ylDi9(rt|#y^Ze(ZfBxlz4?fuP)mLAAPI;X}IHL1Gs&7LHhvkU-NAV|p3VFF+;IF-)L3>dq+6(+O -IyAHPHl#&+31`<!W$t?2-SPez{CDlzwT#NKJIO>5XxO=Pr@$Zbaq845Q3hXp@rAGhN7M<b!vend-h1L -j-9UK&qTEn-5a-=@-xc_y45|Kel*8rA+Abscko^L=UxYu^;lY0d|C*W_PTi1@|M2ke-jHLw!2j^!!~C -6h-r-c{oOEVUhrxf8$AJR}#0%W_@82)#%E^-_g&8!U4S>9%o}i3?+r}R_Pd&x?=p&qm9pHT69?nB{a6 -X`%^N9yJfB6jOztz;dM|Gvs?_%zT|F&)0R`%@Kb13QX%c;FYc?cSSFL(~Vf*zCwaEBRX|Ji4si5F(@9 -Q+2pkOR;Hyup8z@w4A?ZvK$-$P=7L9Oe9mL!1xUPc-c2yf4wv`=6Y5f1C5=pKyNh;>9Qa2>#U8yI$b0 -y;@ml@1LnBs0Wajsh@Fv(@D;wJ|O;s1}cML?{YqvXvq4A^O}pCryb`!ben5w;+pV3d-g13dD)O5L%Ne -J6oCdRhbw3SE|4SO*cct)J9v&Vg4{s<(eBciO&~O$@E`ZFq+!haoZm>ejvyL_lHBB+l=x@7$9d1KYX9 -9e;!k}B*V=!`KlMi(Z^JUt<Q#lOSwOBJ8yX#`<B&7RJ?e!9Q7`aJ`hxSDiG~=G|FIuQ8b%%CeE4BWLn -zgSemgl2-u}n&r?z-yuU@@|QaLO~Jww~l7#)!HrsNC!hd=rS#6vsd{@ik!>L_UVl=En!!9p~w|DIpV^ -Ao*~HHH7VbLTkqGxc83puHL$jg?7bbX>S_fgj)UB!7N>41etI(fr};NP)y{Uvoa?E6yiWa2^L5{-x?O -$;?QtJ|B?v8EsPUZL&W1-zw`gwYZI4mMZY4a$Xh|7S^5G^CI96IcZ1-<Q{U}kPeL&$U5Zc^Ftf>i*rZ -v=j@~SQ+YQE8t}}h<os4eL;UBQ#}ZD~f4S9X(4gw`0JKTeruL#XsT<MIb+c?+=~>(u{@uHGcga8X@#y -ETC=b+M^aom5pgzE^(E$9Z-Q(qtr0`efjpQ%P9mSs|8lEH?@FY?DIh|;jMtDsAQqrK+XV9S4XS7L!_7 -UHAaeh5$ApRS-Q2pO8k~z{C{?y(J`KP+J9QqLIoJNO63ur)p(3ETef3%ZtEjIDj?v3Ct6AjN34bRvl{ -&_!go>)aRI60qsM%HJvNiiSS)o0M4)o0M4)n~Lx!S9G<&Njp!^$h(B=~=E9G-z)_IvT4Z8ZCG>EgH_> -m_LHQc25L<DW7PVGm8IK{Vo6Kyrdz4Xt@0wqQR{`$Ef;jdQY}V;fH1athGsfh=v~TG}<l+{7JuGHgxF -F?xdp>0e`fMfRGu`0G&sp1#akTHN6ae=x?Dj;CZ`XIN!K%IDegJ_&d?Cj%e8WXg2@#$I5GJY$}P)*;F -RsT76bJMxSks<B#@2lm8JTM)XEmXfNt3@CI(cU84nUKiYeYYtU|@uR`C3XWNo+zJ+LbYvBmKetrahm1 -t;KpC6(&Y2|DaUv}3RUXl^T3ui^~MJZ<Pu;0c%`{<aU!Cl7~pmdC;@Tc}($Uot;9C!mSK;Q(tQ6GS}R -wiiU-SuPizn~HFzpLa%{!gM|GtsbN0ntEp0reR)JgaDURMD^kG~79c|1F(pNHg<=DHcHk9<)g#+;ohg -dm5L2v>E8bphw_cw{9JO<&{@B^djwbFO#d)lS`K_@ncUV@g0RX@U4r92C55h5)J=Q^%-r_Gxi(#lest -Y)j6a2s;o$Uf2N5$h=%)!h9yM90-^y=LmlIe_Zn}1fIrECkbjcvBG7W*efRNKUwu{3b1igev>>kY_?v -uZ(G9$uXn2Qc5cQd8K%1o1=QY$OJ&`+_Kavy4A0!%<6Aep=hGLSV#i?e2DB2{Gn~w2jRpaeH@Ym!&A| -j$UZ~%TKB_%Ez8q#q!S}t9>$iLX}7~iujif=Cr=kKWc{Dxb7UaM$$T+#3V$<gw=OuRHh(tt<k7}P(<( -);8$qW^uDUHP;}nN$C}a>9fOF<Dtz2Z1Z<BkI7yg$o4@?(+3}Wdevg)o_f}*z?iu*IYUV>T{W@&kdfd ->Oa6AWpA}wQ4aj2mtGRO7j&7@(o#NW&KwsFSEJ)<Wr7E7(uRfCP@jp0M%tOCp7!9=iWMt%P}|A-^y$M -B5)%0H&p*%6FX!duahuJ?mn~Z+>h-6eek$4>=t7Or0=&^Tpsj)~1br0a0X(SBM_;h>i|1*)@!T9&eb# -i0M^$}ZL3QEx@ZY+1tATW#$r}Fs`}ZG~mX?;4l9EzI?Wib+XP<qRj~_ptPntA|mz9<AhaY~JuUfTA;D -hl!@C6O%3(!w!bYKhv8ql6X4$&7PkKGP4Kk*{)ui*#R&Z*Ne=13g_^%-r_WBGAF|98h<BS(%bjf;z04 -EZ5hUrFQsp>MtQ)~i&9Ir;JY{CrMzg2O&;+&G~l?AfzN$OCW(t|%i-uC($1eULqjbD-CuEKna%r$v3H -a&WKDFEyyohc-P8J@D~s5uV}0hp&3{(MQER2=Z2SnHLlk@LO)Vh4<*ugI|CB^_+BTfeY|J-Ee<FgZ4J -01utYuOB-$L;U{PEt;LblKT910{qrjeqWGo<XYr5U-N<Wx`|Uj{?`xiaSiO2RFDfefW#!71e94j}zuk -7*Z9FqGQ}CU}l|q(41L_6n1a6?CAuX7LKtBw*M<0#4g82xHBjE-e31tUb8hMEPbDx1ne{}u_k*V&k$; -rw2{N8)-y$n33PMs=V)M<@|zJ2@hxpU`=azLM<&FyG(0AJv*&G}+%0Eqg4I)eJpu)d?ub{~6S{LKE~{ -2S^P<ey~enZ=72zmIwv6BEPd&z~>K0W<*rF=NK?Y15_&ca#BW&|c7>je9W`gMJOU2cCeCA<*V7ThOTx -p4yTJdiLx&Y{P~P_hSt4XYhw?;)N_>z8P-73v<qPyIs`ZsHi9&85zk33>YBF0se^7kdDS=ORF0igdCw -gfLx(HM%iie8-x><+pcx}Lf}tyFB>*&Sa;%K5$f|l|M^cr1Neh^L#iKwhNPq<9vd4gWNYo(wE}<e8a# -&?c%vSm{ee4lQ^*f=ZPWwQ0n`bki#C{Wzf9>A1qB5~Qn^37d-rZ9lWRUc*NQ*#b=QA1zT(Ar5%^Hqa? -&lZt60<rDsN8mCS(A86nLz~(dHA;j)JFX|KE7y4gT6|uZceJAOHA=hzDL1pPbaT&7eMVKH<KT-2TSoy -2rJy-w6E;`VZQFs*lTIM|}eXE+}u*S&~zsOU#}<TePiI*G2z^wg&R8$sy_i>Ltnqa)L5Io9wO+!HjfK -Mko*T=R_~QSVp_)eT}%g@OPJ0cNun<ZQusFAVa7NfBW0tIJH@#pLTzMoAx3O+8MM(cpyI*6X6B!pzG< -UpT->H8V?VTKZ?5xe@*`<eiwlTtzB%44)7ao5cS<+oB)|ZU)#u>zQ7-4qv;S>*MZzamcVn=q1D*T|Ht -`W4}W+0M;p<wk8MZ`Am-SoPoK^odE^lx-|l?ZUW9`zLDpeM9{}97^%2r*pZqW2F7S6B|5D$x9CC?12y -|%k{b)bX)}cRgrvtp*xN#$Y?6Jp$JZp6rFX-0h=Ak#i4w=!`52($2(bLoOzk<69fA@aTU59bkZLU@(c --O31BjSTDga>WF7qW%66SQc!lYaWbpOp72@CPnbzl8i#|6Qbwzph4$Hs`6W-=S>ahH}u><WOd4i?Eh} -H7L*m+$oPg)6QHKfA{$xZ7g-QGJ$>%{Reie%i)D=0q)(qSG2p}0qQH{9r&XjkUXya3vn0tyU%}8JK>u -D0S)Lop}(O0gB+kgLf;7<W6TNOqa3vPU6cdtX!Ft5q8+0#g;>`hn*VCt1^$rTtI2s&^6uUi!C#xV0G~ -l4WS!*bGU*6TDl7D>9sXk6@!<Hx>;BCz^1!}_zvQ@8UO=78_PKK}G9P|<^xU}>jE%0AkW7Cu^i)u%Ap -47;u0i^4`4%Wx{#W3?NI@>4PC-uveH1h(*j2&N3NBKROQ-{^|J{y}{fP(rdwkUE&90&=V!n^w1N7E37 -%#$(6_tkbflWQgD~NR8Q0ntzQd3hW{J-|jH8zUtisM5P3aV7qUn==SDzE$r2@#f3sVMbRA;DHFWPxx^ -2@Q+0*lYY=uxyHri`!xz0;eS{$UN+wz<OtPsi6rtkMc-qW2IH<VuD<nwl1Zr<J91Q(^^T?+xxpS*B); -$22`nExYBrcy)*ZmIrrT2`ro-L<Nc-5=Ccf&WoN|PUot#;O5cAP7ozT(5P4S|jE!0_n8H_nDa5ny2yx -|>;^l5UaIcTgo;~|(GPkRdb9x+mCS%Tzq`iG#+NFO=yL45?=Mfp(mdO~HXBZaABVEQDH%qQNI2pB2aK -5j*wcN|Mh4|fvLS$c5^l#jS{+Fc<Hzmz+FP^T~n&|qu8}t819=D~<?U#1*H97_}1#blB0$-sfPA&G`F -(LYH-4oWEhMnHNeS2X4{{4mUK<q^RfPciU<BPD>#InRGe8+p*nxRR&5R3=BlbSa84mEi&wwdUY1IQe- -QsxU~I=?5+g)VV4GSN8?ag(=!mwo#m4&Db=_VVbRN*7bw%_MzL^u22zlGi*S6a3f6->-^jOQEV`?saQ -`>qmrmZrH(1S6*{)U%h_7tB>GA;EWma_1&pDnTAi1`D;MNxrN?!7>qwLFudS@UO!l&YGBlZsmW{l9N! -ssa8K|yrH=y+)&|CdK7vt!b%GPF{*Ah{SJTIj%Y47Gv9Ynti+AgImRDly6HQO4S|asa>WE(YV6WiE-% -8TQ92cVj>jPs#ALswVu@9O)@sAfPO~&8hh1Tuj6K0)Lj~%-?EWY>QR36aB!X$mnb}`e%u0AH=bc(*rl -L7}19xU|o0d4f0R~mR5HC6BhYQm>~T0J9XIQ+2?wUU?2-#b_va{|26OP{!+p`oF2+qP|GUhEYfsGA@Q -8ufLsri6?4fiqDLMIXVKz&2W3d}(X3bNpm`Nb#Wbv2POlPNtuX1t(*`jQ@ol*$VFhE25@JZCvXkb#d? -&unC26x%3;Ke@4+-=F!K@-%cHWVzQk(cLoj}I#kG9B;O}K=f2?u8Sr|^3@O|Yyo$Q2?bf!By7&Tf0(= -ClusOJNLIyOijRw2*>OXU9%a$#b(*Boee1N=w+zy#wdyvK0&>zIxKQ2%>0rlx_x4!<8XHI}K?RIgpZ7 -vTqrH_*Cv+{WF-&5zm&d->K#Qa{I#f#k`r<pLL{x^T7Fcz@7?@Jz<T&&U4K4br&zkB!Yz>y<I3c-em$ -KgZg)q33^d>{+#5#Q0kZ%=HQoD+A_M~|-E(f$)-Z{51Ja>tGx706-VzJ1E>VR!L;*ne~Zd7z8X_F_&q -u3Z)**RIGpk))61xf58~-RR>}sB=)$MaJY;axPBP(vz_;JvNNRuU;q+qt`Esn}549sgIi`^|8HaHRSK -;|7HJ=X!?bPg@4V?&Q^6-u<1}JBzEoErSdy?(zZa`O2!A-+#b3r-s#*ZUTw)$YXP)AMjD<Gr(UcUA6$ -P=h-u=VtgNiXIXO8E+(%PWQ`P$Q>)-PG{bJ+Bjj9g3ckf<RyU@80GUpZf>$Q!@BiSd@=u@6|N$S>J<G -%$97Oax<Ugd%KdT<%AB^hUlHEY(W`<|}WoIEz#kL$IShT4H_h6ntm{Gl!5k72Mx>c;u``Kta34>dJ4O -77SLjge>_&^2VO57JM3T3%jWB6T?|V<aBzCg-0ir%FRsQub}7rKP_H<Do{sYSk*iSb(odzdV5#Aa|{Y -dX0#FmA>j@DbMf9zK+WLe8g}b*_f%N=^8(M5ZfVdYPskjwRCU|=7$$YU<|MeTn8`60=tdPgwJ#5&h0b -q4Wm%=f6tyhfzHm(LY;Fn&hSuDQX=NhpD&g#U#@u5bw7;{aUOc3?FH)+Pn|l|X*jvUy)<S2us<y=EoJ -maO&*_*%>i3jyLPR@n3)%xOG5^_#!I{mrb65<@8QsW(4L^5T*LC#B=ASIwYADNuvS&q6&WvN&3$8&`} -_Nk-zRNFA3D<3DEogWK6DIx^5jWz`0!y>E5<fbbJCdN1JYLXp`-mTy2SnJ7@WDMaY=YU$G|wKKb<*qM -z0fmP}&pse=jvq><qS#aqjN!M*l{nEOr`B{p3L#&zht>;KBTw$-Yh7K22-R9-KAh*;|g8p4s(2yE}26 -;T*~PuiVFTyS{1pl>RVny6>buK6Uiy(U&8U$iJkGx^e8-u^$~jete4EiO1tNWgk_RWvTzma~?BIGryy -w<7^_4P~)k67~?GG^cC;*;As~wT%gYSiR@!g>fadiklYx3Jt1?Dm49^BL1oMMy8W8!>WsdgbJ1yHI33 -UEIfX5I?tLd`B0jw&!<w(YH6=ba@WIexuIZe}8w&<ToE-Sft<SjOkK}P0+r&JASN(iP-y1K97pk1tu- -MI=$REjH$rZ>|{4!TMDER_wB`1e>^dGvhrhFCS+?F|5`<T-Qxj4BOxgU8SdFK+DcM`)8Q^7ZOi$)GZy -!i7MYg8ZJ_Q5AkO@}%HIUDk0obW+<4eIMZd|Jg@#Cybg#G1sq<QwrrJ5?X#9C?xt#&7lN)e7gvh9QT+ -i=E<hbEe8CiQS3Y$s5R>8iUIejg@~9qD#u9y}ez<gRBt&S7R*Em*iNy??ShV`x}cVVs38s733%Vg0fp -+a;zWFzLa*dDN76w_A7akL;WD6=#S~~NB6Mx=qY2lV#Nw2Q|vTj`R6wy;?(wKYW?To`frH0UyE}6EBg -AgXV0owO|QqnZWD7c9@tYaFTBT>d-b35_4w;GN%V!Egg*X=Jb}Kk%hLC6^IngghHv^o7GOo(6F!@I64 -#Pv<GU|jyg21rTGO0(Zi+mNN8Q7?%c0Mi;~rn+|FeuahR>Ixc6(ySwOQ<Vu0FBf+9L-0n6q;LyRAKHu -<JRW*lX=E!|!*j6FaTVcF**webzqbp6OG&tj#ep0^xA5VtsjoufC$ZGMt&dxwi7jaB*p{A`o6s5h|{& -3Ri8|w4k`E;>kd`;)%LN>As3UWoSb%tbbuJGkwt${`9ObeBS5F*i^eYtbU8|9(!BtTqmy#2a7k?hBh_ -0pXGmQgEgBamEiLQwV}FDd9WlHp7_%H_0#q8QhxaGo58wZxv!kRndyOWeq~+N#$au_Z*wTOm><u}Oy3 -YF4+qn;G8RsA@g(tu(^Jn_IEB}Yg%dX|KW8k|^2{p8Ey!KEG=KTBq9XUr!_WV_&-_j^MeXiLPvm^0H! ->I*iWHga%=&n1{6M@b-V^VQ55$M!<MFwP)Wp2Rl0;sjC{dcIPqZcuB)SqkiQa_ao5h}whOfil(Gl&6c -1L@n=cB#RzUV-7Fgg?+?Hcc@j@8GSW392a*nwC_tSi<X>xrF@^~U;Q1F^x_P;4|d9y6@DR*IEs`K)=C --&$hjSb0`~Rb;KRO08<E-fFg5tv2g`)nRp6-Byov-Wsq5ts!gF8n+C4uAO41+CF=p?YEcMId-01U>Di -z>{7ehuD6@*R=dqUV0YMEcDLPQpSOGMK6}6(w1@0bd)zkSbK@!T)VMD`Pu_Qryyx+Fs=U)`d8f_tUfU -9e+Q5?Ev+wKdiwsCPjYkY~u9;${nm%)$={J{{IcA=T^h(WYv)*hrTg^6ey6EL$d)WT}?Y~e<0|XQR00 -0O8Q5kVeU(}$f4J7~o%a{NF8~^|SaA|NaUv_0~WN&gWWNCABY-wUIcW7m0Y%Xwl?LGZ>+cuKF>#tzz% -_9{{%tv#*eSYiiIf>KyHnII|r`=u0Whe=<8A~J|Nm)^L_kX|n06>5QCE0EF_TDXD8%q>07z}{Hd||NT -4IdA^aW+ZP>pgE#O^3h7H@%(Sj`u3dS4DDtQ+dIwzW4m;vu}p*&$r%>NgA)b^Y~MehfwToG8SnmCSH| -!)s65@SJh3Hdgs}+TE>O&-eik(5?2YlgAbzcVrVa|ie$8?GWd2~2r(CFg|N<r@ZKK1Iy^o<46DzT7pD -{N)yeV2+0o1Q7bj=u_!7$XrbRaQqG-CP7KMl+FPZ0AQ33n}x+0=kQi&p-mA#()VHB6*+ZXB^mKm4o8{ -j6YWG?jgq^uTIGAl#;mzxsvIGL$d=Ata)YZ2iu(KMOqnm2KIGfPJ5EBsL(Kb2XkKF_l2YoNCJnrTGxt -V}-Vado3!6dH1QL%67KD_y4&^V~$?OTu3n?NFf{MR%eoVF;pV;Jt<p0-A@P$0EmJk!8o(92)oPHei&d -$@RedYm&bKm;-NG0^NXi18DYh6;-PoUnVmkwuAw+jFHv~%28TY@oXk0*d~p5-QHYOF_u?l-^uR-@7>| -W!Rv#IgXqoC+r#67cZaeD(m<6C5T%nGh8ZT&0B02Ru!@j;1Mk)Ok7pu=xkev<DsVc$$9Q}r20gF+jPa -LAlouHQtX2c>T2v9ejIcKY7>RfiiO<+_IUu4>lA<rslB89b9cRTno+V$z<VXHt;Jr`FMUFq}cZWrh6} -=wL1y~XLYEp#I@LPHpL{S>gVQ%+(J;DSE9cQUPba%WlAOyg?<&8+aREUX~z+9i=42-L)2w?OEo}aJsl -^*ycoo0T2kGg;K?ld|*JA8BWXMpPGx!)5rs13Ekd=^(z=s^er2c2Ce)lJ}kitl1~-A^k=U2h+L8P5{m -RU@I+O5yr#48Qe$JUole-@oBkdK!i_B=j-5i;KWFx|U{>tn&LvfHbST8o(YAD=*^fdAtX|!8Cz7)Uef -x|EPRa`raezg-Ni>z2{fG)4xDrBGk(Fc8!`nz@C3Hx?vUQ9h|-T0e-i63iU-1E9i%XfG=Ya_(LB?E%J ->wp?m|7ULLKb$N34AU?N~q<ec!=8pd%>ta+%0l0jlA-JUKopwZ|XLp2doFM>6d+=(b2C4mHjPmXN>s7 -tIfFbHs^i|`cb!2NU;y*_;T{(Ikmso{oko{Mx6_!B^9D{wy@UHlN8{^i}l+qWmL*2A1{3lmU$e|+@n< -n>{6e)QKvzmJpr#X8Un19Tx^qe?yB4?kr|8c@N$F$NZ0CADYf+g?xc!szS}DinhFHSoZo@O{4*{PFY; ->HNFPpNChw{oWA2-lgAtnC#-4$NgSFuSUkJ{vWwmzWVONau;3)A42}ne=H%468uSii3|L~g|NhjaCtN -PT@M;Z_81<0e|&Ow`0C*N(EB@nhdJ=_<opmOE+GwH&yP-ye?8>4Y5Dwz!<Prg-?tha75<0v@y=J5KYu -7bq*sq&pj6S<u=O0hb=CMepgO_Vmp^}fwfptoKb-IO`ya~PAbi~aodMzWFBd<Y97FYyzw;HZCcp9HPu -8zXpICQRhNZ}fbv}`dv&tfp32=Xi=c7sNWqV#`EJ=3(y_y;1009CudgEDKmfkxM$6z}Qve73ouKLE>2 -9B3hQ52M7HZ>Lvehp!7LrDwv8)zMx``bV4-$9;`uQj}QG9gd{4>x7p%myBa4InE5cP-a8aH(os0nEBi -yUB2oqxcpWaBBn#F$Z?vz`<y@u7r%Wg+!QVd7!K5TEMft+ktoIC8+_yW&|*txA?opbFU?J;QH1-U*2B -TXit-L63w&8Vy1APE@m^PAEL95Vt~;NXiODY(`F&c#jKJYtx2G#QmY)c(&S(KV~y%8i#t$VgCA_MT%{ -Aky2Pcbd9?;*vjN=y*Au>o6Od1jNLC{$3^;Wfk7fe(7o>eXsx;Ot80dbvQHF^V5-}z#D3y$ZddTWQ)_ -rjS38M%Bhyt{k#vtLNc31@?EXo|T92O9s^_%pV3AM?1-+9j*L{M$!@%R>X8Elj)Tt2<(8ujQV%Wk2Z; -vh9o`3V<{%~8Jo`fK|8iV6T}M~h@OA+aQ3rNATUnW~}^AxbYeJv{YZJpa#rs6o&NT8~QF0|bI+y3eR` -MYlL=z&FdA`1yZ)>(}$sVritR2qYe@AQ+kCI^BN*Y9f3F;K_8w-;BAddV$XofJ#8HhuIUS+=+B7yhRC -eJLt5*9sD-w>qbH+5Sk6xFb*>OY5Z`LEoPI5k%1EY!7f8|yd$LnwodD(e8ulCNn*XSe*__dB(xOz?l* -rc#y9k1oUWR`fuchzYae$gkc!63NnpuLs>5DV64S6}8^MqO{K;ZIU-|9d>!J0ZhR+-YBHf7O)av^hwl -GH~X3HMoJg&w!fvVhEHuLsMK`j6P&BN;=gUu!x!<zH^tzu?3NpbMgxj{+w?09E_W=<u@Rx-=R@yt`*h -s`=Bebx=WrV_Vsm-<(=<Q}2OKI}rxm^EB^lseGclGbi|<0B_az0`Qx;I<Vq!*bIe9~>`3$Xz>DG%~F1 -ImQehX7f!`N8lf&v`#%j4%oZztljbW3Y$IeQ9;|nI_xAd-1xQE77-~PmH0Q1zjTbIIYiFUAq;-incF! -7fAM@%T#L(rj(rvCy{!XX=4BFavP}hMa9krU>>5<%zm)OEki(d;O?lX4=P&i9Cilv?p82%B;UWk9G07 -IChsp%-#}sr#Cot4MP1@NL$K?A%v_n{B*YH92hM}kq6kwgS9*dfWOlP|YyfX?gT^l9fWnE;)lPt;`dT -565A}=n1PMcU?J=e^s*S3|kbnHjv5Y0J5^&je~xK;x_(+3LpKoiGl7IZ&EqXE)p;Bi+wCXo0H+^1|#A -6(wXg0IP@d8fs6Tm4fNlM;)Ng3^gW6<@d7N12ufU&+bz&7Lz@2nSykfzNF=Mul(!=u+^-&Fxl+fOXQO -oJ6}}ebv}21F?&O4Ys*G70IY7r#?-O=F~7}n<3`_=ZF9{R}0aeHzbQH)K(yM;bnm~AS}zC1{9kLvPXl -ifi4zf*3y!Y7WSZ4l>Nf*<2v~=wF%0iur{5`#ev2u`<LL$)MkatJ1A_Ix%5f+9!it6$rM{U1rpMbz^g -?L=w2pi6(oI{2sBrgcULW$%BuMXDZ4u+6G?x{@^A0TZdrqBv|R;ek*Zj=>#6RWo2YiZ@Jv#p4RTD{-c -e}CzDz@yu4&MMM#DCmy4S&Sile~OBN$EFu<_AarSgc75Cq!Q{<2X+kX+;aNvued?NWAsjAsiWbzLR@& -{P2aC&uvtiaaV&eBVMC^5;p38V^Z7X^T5GEd-94$-3AVb4C9%7UjK$-T&!_!^5}DWqQ9cr?Kv20IkuN -UPYAHn*PPW9Ct}*lILW}{su;h{rXjz=slU1WqaDhtU4wVbZQK}jmjG_iqmU3i?FuQDO4e9qp#E;sEjF -OH8ci6#)El?MtgfmWLw-!6i+KrsP@sPgDi9pYF%-GOZd2F%eXt<DfB}WcW5$L!Jc=$Ku<S_KM0G2!vs -w!IdodsS|8v!@|A&@c35sWoMlV2y|mZ5ED&)egA&r{yah|$0HUQ{x2)!p<Py#{`Zds`By+fjGObir%A -kKae0H@3#=5%i8abSDc9(XkhE-N=q_WDcW3<;u*W*G?g%E9r!N~tmG?b9pv{@qcTa*DXfAF57LJFV0g -F5Z50zPx<D%9VCGN^#!tQ;460CLxReucgT#1HDbcc;3AqS;1wJB^CIi?$8l$Szl4O1BsrzO(iZwDB41 -eNY?y9H#KvAm}tlnf5~BM*4*=))E@92<=UP40+dOoQHu(J)Uw)KBzd{K{z(%F4Ke&B|wn9cy^r?z-s5 -p+~8<W^H#=^xg9X@Yf)B#qZmiRgo|QU##0fEzI`E5+@u07(GLp@)W~6)?)w0T;ynUCF2_mI*0nS~gBH -JDV$elYK>b3wf%r?QKFC-NM93IISqME^K%hW=?E@>F$G3uFhw>FkoFz~yG1g{|a;bEP1!_+##Ek4I?I -!!pCY9qhK#v(Jm%gJ6HX1ZGLLFjawn7^r5y7Ea71<J5x&+!@Q(Q0PKiM*X|NCyzmXfx(#SegFBNAUwx -kAS=B2qeuds#DA6q~rZAy45)U7~vd*h|QElEpyB9J^^@(~yynek4;N(Tfqw4-V!h8Obz6F{-gm^JHfs -a9_r8C_#gGhb;l%Qzl<b$p=c}n;>s`X6%W9J>td&1feenMa@1-kgCb*pB=tBIeTp^A41PsA$o1(Y7`A -4i*sf-C05mlZJg0`w>pvcjp;-tkmw7n`KGtFYZ`Tle@j?3G5{_7>(MEQ1#jLSTpYf33WeKF5qvmI3b@ -f|aUJ+S6<I|ZOO=t{lCm=66Y=7_tyF!H#17=|cGrz=V{BJ^T}uCu<#uXrH4ZBvS75szJG4-2%f&dECc -x5V186K<lq?X|KVq{reKD$Qf+FEONzuE6f+8ENr}UW`>NFxEEcfn5ztmoOB5g9d6)VMVIhZdnf(ft>6 -7#@E?>JOI=7`}-__5#bn=V82JxYlCb)km8wu}%EF4!sh+ZrN+n8vV^MB16fK~`7JLei;q@bakRcj?%| -Fs!vM<Qk=_SZu<m;a+nf)bz5saFWh8n<=O^aHNneVVoPh0g78#G*}6@TGxT^Mh(kiYnsE23h=_LQJXd -89N}GoCc-5Tuz~pl)pwG!4fP$qIyLvL)O<JB<DE|bw&T4?3gX_?VhS7SO@h|TQb!E{j~Ggic)c1a-~% -Q!6bO7m5~lwRY4at1EXN=(Rb?~I3}Zl`mIU3w*f0<}Nf);BMp}rO*hJ|D+}Z>TRACFS+d5lhS%q6xQ4 -VU31htp(?6#|(syjs=H`j6(B2;ltmQlg>&csbm)4torg->DbnMzR0nG<){TC*Ff2{k~<gP57GX?*?W* -i}moD)Kfp?8MM<lykHo$Vkgjd=||K(R{X+eVWfYS*W8d^OlAQr7ae%M{&75ifY5<CXDrWoGn|cuetID -URK?Zc_dD8yECdQp^8D&JD^-L%&1zDZ8MtbAxi^B9;@Kc<F9QJ?10Wkn{$=r-b~zqB#@;un1*G1Cu&r -%ZP*n>+sD5{GpW2yKq9KBT$(MN%Q^wXX?2QpF~<maf&SvMW4=vNbCFIQ25s5DNovmEn$516#|DKRtG} -x)stNQ#q%V`UTUb3KnBcc<lTTR+c}zpf*EOyPQjDvtSb-uA!WF2}16rI@JcQ!+EMObC+zz^I(O~Cgi^ -@yI=gKP=Nkx%jGl9bj`}J5)AD0P6(;YZrO<f=_RK(2#{sMtJDD2!F@M$R<n%lOD7HidF#ckX5-2AaHl -?NsftY|$Jp?6T0FeT|M&`5YwnCYNah9X3CQNqM+9G1LDv&HpIy?&X5`$j3PKiNuU=XfElQ?=U$N*e+S -A03}x9K3ydc!poje>gZhq}S5G-zI$bmR8R==eD+$n&z&#Sy98M<@>v|Alcr$J@3&Zd^90R%#NQ!(+TO -H=G(sQ0QbKaDIcxbqrnBnDgz<SlSFovGnj+JqjGr4O2VG3AVurC@Rc>7O`ouKCZlk=&iAR~>@VVLY-? -Cco-Gf3P4abWy3^-V?|#nBPi=H)lx2W6mi_yx@e+x9Y4P~Ttu?M-cR>l47eHwIeo6u{kQeq=P(SH^0? -m@9H^kL*gX$*gM`Ug*VJOnl2xV*;F3KQi+mHHPmZ&DSD8Q`h;85H>zrglKC)o6e{Srr29V0^qjxN(i) -2^w?)s_MovufK4kVMeO$B%E9=vC;98|83UWgn2oBpZf-&^rRz65)6sKf)haejh)=;;Fl$$`4RH;7C#A -v9UJ>=or8}kRsJGf!5%cF`c~QX<RL9a~?VGaVAWXaa<|;0wbrH1R5HEQJ3lzC(0(em<FYfzLB6t12-T -O1kJGo<9uLxj0=&+>3F4z$y!Dj)CIOR261nM0kyn;B(RmRnFPrJXp+H)jpz7QD9gD4$Dkq1zz78}qM~ -;JTK#|oGQvO_GM-2Sh1`FjpN7&YPc9C0*QL$}lZ{1xc1O_9wE&{ovk45hC0sR?NW-4dX`v?E9eU`QUV -9W$z4y_1bn>GScbo#s_4N4oF_Xk_b)0NuI5)<4IJ0sz{P81-$R9u2R;5~$E>=;oKuMA&eJH=zypm=t{ -LD*%tqT0o;HV0<MmhBw_GJ#h?)^He|6j^3p@RlC#U8XmT8tgZ+FLe4YVBy!Ke4f%Hdxm!ZxPb8(LUT2 -(`3e0IJ(Hu6-$TOX@}D^qhpxr+eK9nw7a_4KPNUSu&REw?-I<2zwk<O5P;qX?P>!HtA4N9vhHR>YV*l -U%tla$9o{wsYJ2cDp88f@X&b(>ajRWa#t}2>syR!HiQE})rF?UI5<DnzzRveYQ>wsox7+%qJ#^j0@Ij -FdikcSi<|8|FnO|{PySp^W^XcdIa;%M6&8Tf!sLndZ5^mJtEo);-%BaNvEC|{Gn~G(<3xSTHO*PUt3! -($<5q>#n06>o@2$l;v{*Y9yMU){q&2#;M+-COW-}bu8@{kD(HF2xshRO^ZLV2RdX0uT|zNOOw@|?U0V ->E_}xIN>cvkB<i5lgqDRYe*g!+V`A@PJq<u0dY96CkX;&F;i(^_2}Q15PLv*~=@ch*OD~DeeF0u5QqT -JlRBbq8^lZq9ReGz0UM;<Fm|)TV6>j`9nCro#5w&EfDA+DzAclR-n1WWp~;^I!UWP9@va#@gg0=h?1- -&&ql$pnN~QiC$oIKmE{eAl;k&@Ah33<N-Q~)*`gQ=xo^t8IEpdavY2JP!^aueiKP5OLKv)E;1u|gyjm -UR70?0XPDr)f=UmhS^Cv0Qv=3xeBN4_LBiSOVTaurgWxL~RI-uzAjAl@=`RtIKiD%7XOqN2c2I!vp6% -H0qisz?00G@4<Fh{%z)fg{|LZlT)aQuCep(xH;Bk|kDsy3*n@i&Z&Po$RmY1wk0m`|r23?Jmw`<lz@R -@@Akthmd|=T~fNt%{%?`iNZmxC?WUZhX1|cqpo1o|F^>N7M0Mr;G6MSxD90=rq<Mj?dQM$Wb{g-tWuO -N`~2Q%P{6+?X(Jyby3agk!GpUM$bevsDn1zp&A3v4kmH*Ue<=Oq8_eCt82I<kY6@n_{c%iL)JBBTK%C -I0KFcJ6di%u+Xq@Q=rRuDW5-1(@O$J$$Z<_R!mWJ6WWs0d3QNjJ?oj();6%HYF4p^#=u!SM7eipbSvL -ipt!qkk6Dp!;jsi3Jpp0RF;T7=&$n?A$ce$}Ql~9&s3GkJjf+*<pJ+5c+AY_R+W$%yW6ARa^hI(s2+q -Xl58km~j2Djwesj!9^%Hn5{p`Lo3jEqe7YKC>A_F$$Yr9>32BGv(d(R84Cv2o0`$#r7|Ehd6I1Og`-S -tN&1Q9En_vdx<v6jAmTI$F4a)obz)Z6uzCOL-H8@Y$Mms|QvTC<4ELi<=$RfWF$7G~0|ZKHGBk2XS@v -_#ozzQt<E%LWAOsV&hc8;Quj=y)0_7$b7XavcM@FHy`v|?yJ>->Q1DR-E2fpJ<TNoAlFxt!O?o8He-p -43I)w;^iwQyq72|VWL!C`;51HV<>mvNJKktP+4s<Xj<f|O^Cr$qGNRA|1<j@HmTx|C&y_amz<=pNM@; -;CoG9f7h(kHY_EC?0$mT%@;uKHD7-u@YZ1Lmu+!!C!$Xo_jsj0c0%)0Wg%%l}E9RdM96Et<19p@c=;~ -aKqnUl5$-^33QDYXF{{|(mBLUsvM@CbyO@uET(4JOMGI;TOo#qLANXeMTrRvkmKbW^!YOk^Jb%8968c -j%93)^@4j_;k<59Z!0Yh4PlThY+;Wf;@m|qsUj-Scu6o4HHf&MD0>Cy(%^wbO~X&2CVFo0do7~SR-E+ -@d+;w;dQ9aJ$Ar?4LkN`;yNC$*yfHN%?z`=$YoEgWMXnAw}7S*>L4IK4f8Q4qM}3v4HI;i1Z4x*_xxw -!(~c89+`ad(Y0BPNasJH*(~+$)F^Uv6nka|2Rf&mNJ0=i58+Rm&bBMg#<ln|oiY{h~PPZ?>e2jr<*qN -J;75)j#w9IA#?W5O=WYa#3&n<h0A{{RH2%&8w6;TE;?%sCNkm}Q=k1mnuk!lPL&y&p^H9LG)w|#kg6_ -S!&cG=NfPs!chlRme*FfYV30k!rnEEiMww1uK5A0WkDIGwe^K{lhX3pmIq6bWH#0F%qRP$i)2u5~|or -YSkR*J;Oa?y40jRqgxbrJ3v8xxhDpX`%|D7~nlY>2T%;NFeuH=36@XS}-;`{hE)l*l};6Ol|1>WAAgF -#BU7)Qx6{1l+f<CD9LlmA5~mG8qh=aa!uR6>MZ;3^OIxGnlAU79?i+Me!6T$F3D6Ci)>MfxLM74|Mrh -=QUOz54+gpRdJu%NjSw(I1MqtCOH-KP>g3jK&)PZ&(gI)y`PX2#V8ZRJ4?j}Q2gzC}SQ?vnfG+FnFr* -E=aLCtnA2x5eGQnnJBtp=_=UeSV+F%Kr5d15*Aq2a5jduw9405~bn+5+(Q()@}hmQ>X!9AYjl0Ei?Zr -<-rS{p5HPiK6739Si<b@U#n&TS9tfy8fxhANAu4r^SeA34Ldg1n=x9gj{7dmNAKMn|4sqC_7YrYNgQS -KLjUUSsTL$^KR<=*CdY)(3333hL;LPTVei886a2c43wDIQh8@8ZB=?fty5_`-=uOkdc&5|Gs))HRRnh -v1NqXKyr3Db`GUPREPgjs8Ffw3FSZ&h~!!S>fUCa&aUdjE~Pz;t?j=vr@i?|F+kKtQQ0NaNaf0xr=lu -k;Do~zOxsJ(u9E^}hwR7qR)od8DuhrrB;x>XM7zTZO%jy6rkSPYdX|mi8Q;&KU*Zl;HzGLCxUzbiQlJ -KUcqzU$^WwWKnQ%-gZ0M=?Jp8;zrUe<uu=D)svlmZoEuL<&XfOr)W{99aATP2{eHhXYet+|vFzy++-2 -0{x7^bd!p!+HUN>-qMmy?7EVw16!WB<=3OsgXsx~&a|f4(?8#yqa)W{CbhGOg(p7)I`cdqyfc^_zPeJ --12%W+f-Lv=+CaNzNHg587N+?mEoEkak!|YUoi#1a~ApZ#5UW)(6AlTT>X~TF;*?<<?-=h#pV{<pVrC -W>#?9*6<Xabb!){Cp&BVW;tiV?yYtg<;5_z)0f*=e}2^LwagHSjcky$0OukeS2D`2TUA`Eo)bmTScum -haj!5HF}DvNqdDD!v~6{DaZ;#1U~DaZ0I2gk&}BF1JA8id3;7QzRhgpWdQ$?qxw}va9#dQoe%%6vnz{ -zm@9NI38&6qxJ=LLevYhJNz}qx;@sWAj)u|tz$~0W}OazExVsjH|rtC?|i0^<(Mzgh9Z(qyQ6l9lI$6 -69jaLcvjp%Xl3ut>>Z4m%#KHFwSmiI1aw3%NPwosS=g8=o2lNf{Wk2IP%aUIGffK2x?1JyNN5)WKYDS -ReJ6zz1|KT)cc;BTS9R^Flm+t?crSeOcvy-g=+5GTTugEBOyBQZ{(Yyu`$4>|MYFDp;#MbU-r}jY8bA -^@%8JcDmi~0KXHfdJH!p1<lXn;+6-D@_ehBzZf4)c6l2``#iVpFavDj86Q=XnH+rMJ`r8fc`*f#yhAW -vsR5T-i*vi}$kM0kf<zB<I(X{BhN`zNIB5!strH1dH=4+w`3eY?E(7oB5Ey&qJP@x?)kRca2}qmg(d! -Uzjj07O=e;hAv|d}k<!aIZjs9*iSB#7wTh0?bpz_8V_h>d|E|bf;v8Fu+Txb(m#CR)kdImgX^d%N@^z -~@+9T)!!D$Bpmef|5~*FWLh*N%5_^7=#{ou&Dous!Vm^--w%9N*ab=*9z&ZESO7qg&T{$WaYI)DJ_-^ -sB48p?3v6CNi@(g=HX|`#JV#0jfl!M#y*z$b%1*{2GTz9)6IdGp>2-10=uv@W^j;aAfnLkqrk%9(Y*f -LE(N|MH)Z+fXICghy11oL!5^~NPOih3t2OqXA|_M7Od6dHY}4*Zb&Neo`8^sjT4)aif4wxi>EQkN1u$ -nWxNV$&8o)aVLc7Z$|4~X1#tQ#PT(*`vcyH5z<iIi=3B9{b0)~78bjtl(zQc3zCme@A>zCvqcWQ<DrO -yQ7~s;Tz*97O$6tVBlzEm;=*~5nz66^~gw7v9sh+6AwG5^@j!}SxplAr`KWkD@rLibI3T&fP6azdOSx -c8<shi}Re^9PfukcC*m@lFZt_(T51&B5`*@TjF)T)5AJ7J?xKPlR{=$s)j9rw%%90%n;8_=j}aFsE}I -&DQt*+wbp1-l9Ziha(?614r5oQ=j}GKL#k<-m77^vhXCF`V+_M>ShH$%K)cgi@7?r8$ypfKjI(IF55T -<Rov)1g)r8DJzm|bR*R@(68mrn$eiZmW2j){7QAJCgFgy+K>sRk#|In3<KebR^sN({Lmz-D$|uDLnbV -jq8*9A(Hv9tXcw~0jB4RgCa`M-iE?gM;3ZF_7PFPUfKNOBB%;!0hII?4fBJrSbo}OovNp+PTp-tilO0 -h7+W9N(e(Nhvu);oBeU)O?kcBy2iOOz(C2hj<h-=zgB^zW{lVjV1#dlP)ajSdK(jPUMynTfzr~G$b%Z -Kw6bN+XTkQzl8ncZg;!ss9iKHYMtzLpzxl9F{2$^fNYkBPVIJ=-%cL+kSQ<ISMMXIB_f`D_b>RoJI;a -VGcilh?P2frw?QQhcMS)ADWP&X?oUVF<U)HLp0Djgg17lF~_zS%PQq@HW!nix*G(oA!QRP3K3Lr`I_x -5;Z>^roj2cy$&1&jSKiBxOV?Iij<QYu#-ti$r~7kY(i$rR%i?)#C`tLu3{5Z5?@aTN{0QYpj6!kbvDc -fy(#^#+Jo-p!oIhOMO9>TJ8bRf0OeZ)I84G}EZN?+qG*OZ*d6-)?`#Pjh#OV+&0&3DeuC{4dwhNy<sP -3-1>aTJ@K=7}+<rQC$5mWz`tAc`_c{=)<%U`hm(oNtamtyPi}^_2qNKK4tBjH;>zqh<%k>5Ut<lOGQU -xR}1gI6SFqNMv6WVRcw{)YFEMT;vmAdBUpsKlY(4J=~prXRVD$4{jH42$yRo*;Mi{~u>(#jH90?|F`A -hB$KA`K&GzJx{7Bz(te-|-G66AZ4F+pm2iDD)0(On4DC_q*c^d_(SYcDLP|9q%=$EE8d9nwo~*b>?ae -EelfXaYvr1XF8#?(UQ(alAe;1^ziwYeV^_ny?6K^J{(uG&ntS!1Q<RH6dD}XE^S!T<5^aUVCpcqbn{? -mc#k6A8t&i4|BeAzTxWMyY)nIR0;~tYPWdV;b;=9sX<j8j+oM`5Dt4${tt%<E=7?(+8CPqkRBe@XWMZ -`#b!UoG3qYM3Rnlr>wXIiy4E@9-z2tS#4Yb{mQn^!1u-8L<u8v5E=o(u&X_OJ{jO(;>{i^h)>mnK~NG -cmCDoQ^do<-;H-@G~cGb=*#_)~`RU;SSBH&A?<Cuv64=oZMI0wbuC4su_DzBKfn4dg%Ot*1Hzs!C!kH -J(dqkYh>-djCpgLxCO|7dMeAM~q~E#?lC}Nai`&N%_5fUJvh<rq^cT6dx}RY1+%N9fg*vQoF#O_n}vP -jgWaC7Bq42@(9hYeEUfamP*#a3Q)>`peT^mN07}(O)dxn%W2i>i(Ifr=r^Cm6%b=i2VW;~u}sX{?dD| -Jm$wr7!H4B;KMFofjDO+H@1S1@*K+<ht}0~tRgMmg%s^d!UEf(~O9C`G@FuNF4yFAwqQredIITNAR4! -}~{l5AAw{+u9K6d#wBp^-4Y1}-B+X)T+eE$8n(YG(Qg!|1pzyJ^c-4`Sl+>Gq@Akkzyy9Y@4#8qmNa7 -VUiYmp|nj^k!~%Nz8F@%VqY@3Qa^^B~s(;3UCza8Y@DSp7$ut7|e6lun(d#AS(de9t34oD63oTWsfE% -&SiG0*AGLx;R9W5dF5}z01l<S%b&G_p(Ky0_?RwhD-t_N4f!AQA1ufjvS#Tgn7X@BV!Y(5gn<RXmIrI -G&(&y1a7Sj4khsIe&5asFL7oGFwF?DC*0sfAV`spR|7igUqdv0(#R(RGZA)uDTiv?x`A(Nlo4I#itrc -jin61V66APKA50KQk7fgsCO{3d4pK&q#c$JpKVSL3Mb9m`9ew8dBu<o~QWs(Ndc9XC?@kXcj$Xb!j4l -qoKj#yrworny%B=ai#}bSkgekoc`hGb{6rBM}TT5g?ibF9k-6PdxpWkz#J`Yw*cW!t|<)gdKvdie5l> -8p5LH7l5@^ZLFr}ZGWuW7JvXh<lOOW(#PZ!)8W&TE@r;}^C1jkoa4HK49|_xe^CJC6B(08mQ<1QY-O0 -0;n48F5S_?`QnO0000I0RR9g0001RX>c!Jc4cm4Z*nhWX>)XJX<{#5Vqs%zaBp&SFJE72ZfSI1UoLQY -C6B>Q12GIl@A-;R&JYB>@drI1@dqfIc)NzIQ^gL|{yi?e&5S&w=NRKhud|V&^ea=vI{J>!!?rFsK`l$ -oqoVOL@?g>@tbKsRXh?3DO6by#6vA05|8kw4mX=k0)5}<=6yq-L26=gU#)A5mzLs2mu6<bASxW-WzAB -Y!n3^vHR#-=Fw|ppgzhA;OmW#p*>f%9rO0N%LTQ=<f|Gc}QuuN|D%<`gE{R8ynn~EuJ+!_|T(>u)iph -_Xe82$iIO9KQH0000808trnOs|SBWzGQr0Luda03`qb0B~t=FJE?LZe(wAFJx(RbZlv2FJEF|V{344a -&#|kX>(&PaCv=G!EW0y487|shy;b5Eity9h5|XPK?VdE(xFLD!yw2qooG`eL!!6%?<d(&>!#Rr5l!+v -JwC}(SiD<+w3RZ4J7}q1e2N)1Wm8z$rgQ3WB*<4Yxc%_)7WPMkZyg=2ft{`Ck8lWIY-=h(%9<j8c8Kt -Gvs!O=>w?Y%!c?$&*zO-U_fPwW$6ZW@J~o+5?uGo-SVtae>p+=G{Z>^gG)OJHN8e-X*2u{1i-2HEogx -CPPm%9DW1I`EIfo^D&!mt?<h8RW?rrNNW^)KhtwpK(xb|qmz?l7DjFIc^7=#r85IEt&`-X<$Sz<%5>F -aCftQ(LO)^EG>rsK8JI1lBrJuErzcg|-6C@u{4EQfkOY9=!XMr1a7ZgEJhGjJh;_YpHzo#qNWDNH)I; -)ElW{e04Djf0(O&Q*eqW*IWMEq{*GUZg0mj3;4aU!OnYXRpk>SR7<oU!<?3>@$&5WlMNvV(QD|tR~1G -ov!Nf$*ExuWk={oeIuo*>BVpTFBVVk{~X0dS$J*50V$?KNO<b=;or$;v(Y&ouh@k02>Y%XM$RXAZo)k -b>f@aU0dp{x;Konj<`wpOQDAv-sNg*A;a#!6P)h>@6aWAK2mnzTaZKW3J<vxS001v!001Wd003}la4% -nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mb7*yRX>2ZVdDT2?ZyU*x-}Ngx6bueG^u*R37I$9g4vyDGj3 -jHrkL+Fqff|xcYNFu`GY`x3-v0NiXFq0!lGX`uh(6dPr@OkUy53zqr{?iDkIkxD=jHa9>DtZX|G-~PP -EStFi)w$U^X+wOk{2^`_T=fA`EYH`+e3R@mF9i5X>YUInpag<uCq3;$`mHOx7PgW^^2E3ynmUtpIeia -YxCmG4<FvW{{6=fZ{EGfA7R|dWHR~K=0)Bf%%&?>IK45Oss>#42SA1<X7%bi|AgN*d0`v+ZJpP4)mHV -vw6(QOdUEp9Pd^c29?rD|yw+7YZ3&!d;c0D~s;gHP7r8O8PzAr%W@p<Bu+I#T^yh2^-~h9elYF<Y>ef -_^ergW>W1F=no4VS;<8+_3*G3*>%Lc#dxJ|js+Limds*1ugg8GxK>#|}{sRC)U8i_qQY3swY69a$pVE -N^YzAk?M*R#d@k8j_;dH3Pv_vYMus5^UNKd<b*HLq#x%et=WXXB$^WknN0r`7kjYh7k*+x=~s?T$j!0 -RZcVsvLmY*82d|w!Q}x4RD|qi>xRX3;2F9!JR`+RLj3j=Ei;1&%0{vKI4w)XZ`<dGN(1<kA6dm!RNc` -6a8QB^cO-3KfK@DRh|{EU?ur2g7WgSUAeKl?8YuwMhOUzqhA*wWw85AZ+dOFdDGguHw-6t<<W-`2wbE -q_u1;kuMq%_9`&XMOZ0}}Gx{N*Cf}A-Z5JTXFrjQFmnSEyB5N8$^d~RNPkCLHJ6rOO&Uj1rFhU3Rd3k -IOXxzIjZ|vIKUfUA%nhZc&feM?<+~lD3)y7nNTa%eFiA}eu8j2ZA%2%L+4Z$iaP|$9Vf(GzlaAq1tgK -UV*%?wB#Jm2SgJ0pb`(sX+th-wB{>~?6DR#jK5Y4xQw7Ql3{egOHM&DOsPaw*o&npIW`+!}yHFmX5Qg -TN&v1O6OCwU*%lCvS7GUT7VirKPDz5DNrugv`sq0B^FqXb1zZ^*_S?RJRQwp_={!a5vENaER0OwcVIN -$CFJ{ujXd6ZrZsiY`JZ(&!2w#&C@4m|LzGQYfk2xYz<C*T;w;_006M924SG!3?Bek#2ev&ynrA)edcs -y*=+zToSPzt6JCAhp646h*lzPI)F-oq(KqfFTq3=#^VTLXa>fKM8sG$ClMr<<M2I;>Z<Cj8)m+cb$1? -w%p2$+ySpzCpC*oY@W~wlzGrzuLzy8&>?dnopQaW7Mjg~!n^FG+29u#pBjOg>C5NEkBvKCE7^USQS?d -pacHm+oFO;jnSLZB!KDHxL7Dr>C!K|CcQH=CLB^9YA~XCXDSSu8<){=#Ozh=oN&BM^lAj{PArP<_PQO -|Bj_SELyH0Rjxv8zP?El6ho2j2ZI|*|RB4UYZMiba}@XHZ6!D5R2|C*_034u~UQg)$A&mjS^n~%@wFB -O04}1iW`k4^X$OFCij71F!keghQUnLwX*M_1#SKt=&V*ZwrzkQ`zc>R5SFI12o7)-iAdisUcZ0!`qi5 -RRHJDZ=(A_>ik{B{Z^10jo5)%tpOH1J$!Na7nw8A?X}z4zOxBPp`(^wnvMtkF9R*)wWX8==AZbXzF-g -N`W|_Cm9pdJ78}L|N!<0~`qy0zKa8C&Kx#Q`d-+ccvWT_hmlL;zQ%Fi6~3U&;62)hV6$m*stiKAt1z) -|chz~cWlMYe5b$0!^p;33HOdDG!?A#VUG{l=8Ze8EkC;g{JsxB;uj7&ShTC`N$+)z?QPMzEwjyF;aE9 -U8_fF{;ePBkGN!d3)W119&B<(TV|O4uHhVH*bG<^8w>~KoR_JU$p>GN@LA$&N<yk{gh*>=tbsEtBM@) -LZ3`ldlCthhgr%BifP%}Hf>&Vys^s;7{_Eji<5zYj;OWI8yJ+t7J01_MkD@K<)YL2%M#oL+6s0oC!tR -F9N|!#J=JITlHF4mB>nNf8uhU`VCs7@fAWof@{D*TSvI&opdVsWB&owN6XaHttYjvjz~R(@5x@{q-wH -ss>y7<;XG=)RA->-h)$(!E9tw&kXb{byb<p3^B4BVpU5akaZnsg^QLxoVpW`QFNfWS<N39q1JEoeKK8 -6GJliBFC6;MwX!}+QG+}d)TNV1;-QZOZ<XLAKG^SUmfQDfUAf-?&Pr#>NGG>N&oX<$wcyCN@dnsW-+= -7QQe2H0~NztEz{ISKYWR(M%vot0Yvvt7jCf;<A!nYw{o1cD0+!Lwc&=7_-iLAwrQ7Y$feV2FL-(1fGK -*Bh~bFeL%!QmtUMIc7j?4?$9DNo3HIXAtH9FpwC4)Kq07ivt*p$SQ&Z!HN<?J_~`gb!UlX%c{s%h9Bl -A$d<hq*N2cEtQK_zs`vQ#h)SIB9q2BraEnWAcsp?9swzQ1z(7`vA6K&Wpu8=M^YY-<APBq;3Ouknx9e -0Xqx@ATF1e~DL{i9CPC3>i))N05TY+<6vC#Ic*DzU#P(E5@vtx2zN)9OO_dq}oahm0PoQVTr*w+=rfV -vI;Q*~q&K*HnwI3{eoKfnmwA2fl7s^jP`D_i`%0lLvfwAa8{hfNA;WSi5^gcm#m=Lj-p>}G>0U&VB|o -P`H+RZuDf6ss^Afduz3hOO9kn60zPT7m7)mW8El*@8}#pmxl7c#cn1P?7p8(A6t%1m~_;!BV99LDQEO -v+YlLlgkEsYdYu5gDk~W3_~`NAn<A`adWiDY*82<P>Z9{v4CznQ=k;FU14iv9{*Qt=Xm)095*7g@{Z) -%+XxYS0jsiiqH9rIh6}OAW<W_`OK^+w#!G%H1OVqnIap-bcGng*7fU24J&xNwaLqNAW?XS->GW!3$0L -(@WaAmCDik^;c2gB=15t#kO4#eLzFdf{q3SVit=gc_uJFUgq0yw~_Xl)z8JMQIL@Kleh{W71J1n=eEN -vn$E#ltzl(m7)&497iBvdA$U=LF9z@PVG6ZMvX5V;6H*T?~pK_;UEI__}!dnj&fx1w~kKM6giq<w$_m -R<n`imGKc8!_k3QMzz08asj!fZn(#(JK99u!ODXtWVGC6;11fV2%v$<N>L%k>s-Dk%NRG3IWkDC9>>D -u#S&G>}VDAs?qSlXw1pQ<PJdzTV+7PkmpLs5ZJJEpns<-3To(`kIKc3i8~hiJc1@lkTQXsStAH>7Iw^ -$jN^lUgRP7arXt5J)*uRTTBOMohcsMhK4VShN(FjWs&<aA6_^m+jU$}2#USE8zT08=7s2#lpay`w*ss -6n*w&qz9|Hmh#TZhjuJo043P#$)-ZrC%K7<3OU~M2|CWgx*SXSV}I&mhBYOt7Mc&Q*B0+G#?Iu8}BD9 -GyP*Dkw;&5IepwnIaC_?CjrZ7!Z%4s!H<@qRQ}7jW5rkKo4k3o>|^HIuv`G6Ey1S+M@G8Ue^rRAdkAF -zZZ{mjD&qE-pNe2KQu*4}SH~)nqFS?hF=J8p>et3;+*S1jMf?FUEWh^O%?+xyGd9wOD>8DJ!4hNvbEN -fd^<(1U$g+logHVG;0frZ;xd)uQxGVWG;B4xw;$-)y0o|=WWTHOnK=Ih0fv(K>`9W-`B7|1y_@4uw*& -v^i6`Q#EBad38JvTx&xkk;XyY(Cxhxd^PD{b9&^s=s2jfR;P>ww6pbETh|`LCZF=cFCEYna$Bq9ErAY -;nu;AdR?e>L@g3acD8_i>qSvq8+GKF#_5>nw7{>T|@l)|_)a9A{n;0E;)>vkad1~s}T=}ubN4#%rM91 -PdY28ulN<oJ1@Y%UGLQmTj_9<`xVfze&&kg-9E(SQkDc3X4$^xJR$bGW=3hGg=BPYY4LL^tFVG|XcsV -@4&YjtaFg{&SJPcxPjK&Mg;WkS!!fffktSs=Cp5zE=>5LQIL^B5sa^pTy3P4tQpd65>?jI1zV*jGL|~ -#zHz@VY(xxlL9y*!ACm+Y^F8vzLyyi5`cLUN|-xk`Tq60WaM~7tfQ{jvyjd<27Yc}v<Ku6W7WQRVq!~ -w7a_f!QA6dC9NU}-4K--LQU++wF$s_ZTUSI4wDr_HH}3bD`IOZ;)+RU)-#{9IO+j_OXPerBMsna=WO% -v@+qADO%$9oBDde18gMmy|+-8Rc+h91A&l=R8-5yXbTdlE((MMfE0S#<Kbl5s50@Jse@N$aW*u5T{(& -i28+@V{<Az(Qu3<y>}psC7Aj<kwu#l2rZRNiP8Mw9RIBC9no$MbD7*?pR5yF^^F3zJ^*CVnLhbzB00% -lc>YAdyyIf*4~3tI5|kuCSzo;v~7jeqGWR(2k=Rl`tDhyCvL;umh*b1%J+2KS5Yf=Pg7&01N{|l#r@q -O%lOsEHJ0dSIwRL!AV_hV4rFf6N+^qWVActNNF56sSL1~yzzkvo>RCYi|$cGAy*_26mgUxJcrE&nkuS -HVz<kZn(QpK+ofsBBf!LCz259Tr7Ntx+~S7fM5$5XT6xoSw&9{(zJtgCLl9niTU1R0&yZg|M-N;t7JL -S>mSgRE4ovPl;Ad_8(V88#IWEOjV$%T%kp(%T@>0O!-rT*dvA8Hn3wemFJb+fG(Lle+!*&d>!@eXJkU -Fd&EJn_Gdd!flS;342EZW!beP1P}kD6&u#_`bI!5X*50d?`nV==~9=G(&)w~xgVo*mo20YMS~iShELg -y_PK8_>+g7908@?e}ejVB-T9B`Y{}!OqLxM(%XNT`n~^WQ>^=aI`D6oTIHoM_GaTd~U*?8m=Xh{De(2 -sx#CiSFcjALJejck$(vK5diLQy#&I;5CFD2-2(tI7y%$2YfXpYS=};-fKu#n+~(^fsDzMfl1i|FXLGK --<CnVX_7sApK}z6SOC_8)F1G83_ks;Ir42+|&VkMyyu`;kBH4emhn{G=Ne*VdaVJV+1yVtQhg_Upp7i -nZZ0U}(r8Hg07cl+x7+bh`_n*fWg7^Q)7HY!<Ia)%>lb~%}a1==&Dd5AH3ZOLSlkJy$KbaeFF3YO1=T -AV5>cgV$O87W1E1-wB5Io9pD#@9AE~@R;_A3f6K$oeCknF*S<x4s&<%R8fhK=1EN>P;y(=&e@*p+L`R -f4HvJr(aaRTxtaR=`Oy6((V~O~(PVxtT2C*Ru&F{D_#&CmN>Y)2BqkG&;4%v=ba8)rpv1?r;#j!jMxB -C$u3|PigqTYT4yQOQ&JDgZsMr1i{x@&VVFF@o)($K?_e%!n2sJ-FL0$mJZ_<u&LYMsrfB%J%w>VvSaw -Z=(KA92-*WSdx+Ir>vjU&9MzxbQ!+`nUzlZ+bou4XwQi_VwH_nH#<w`CPQm(%5cawGd5YUJeFohAGM% -$Xo9Xly8m>bZfI~DE@PHwz6>-;o&|eg<b}^+rpI!ne_;@yT1H*NqQ7H|RJcRm?<kp2J0hqR}Gl(YXD9 -dtmhS>-mzPXcRe?F#IE096;(LKOlA-N8*>zDZck`<jc04}pNBwO&EaP*o$8y2F>ee48&GNQ)vH}U1`X -XfW8zf4k|mnbOh+tdbp$@rbjfyhl!;!yTN8d5NW4#*rfdlrEKZ4LrC_(ri(xX8@y{K(ly049!Y*$R!@ -PW<ENDJ8g*6<R0M*GG6^AcPr$B*)GcanQ)-&fKEOB1#TCWx#BVPac40h~xBy0|MGFt4w7H@NK|E=L5; -2FzQ?X1cL^$Ffxf-uz3nS1i(}}jrfQFjxteZq`V6JJN{He#hW*Q-8}?0)7Bk<-D%+oN$xvG85GISU;~ -kz=X$d!rB>Kb`miVVe=$0KG%zsw`SOnP7R*Vr^*ZtXmYbl?L(cp8;A=oOMqsQU^|N}$E98Y}io3_kCM -ul;H7XWh*@A`P+d}QM_wsTMpq@T#ZsLY#EUp6YZmsJ%xv_T7<!4@p>#3ONDx(FsCj-{zJ_0OLP9E26h -~nVCKj!Z|h$4bDD0|oDg%q$Fy+!rC{_ZZPjLm@{|F+aA^ko>e(a*`ngkvC&OP_Db&r8oU`9F&AhKTv4 -n6H@JfK%oU3_=!^yUUwva3Jlig)ntOl?1FBgIKJC>5lPJbdXv%nvgp|0_Zftt|vavmL$;K;F*BlP`gI -O#>pC*hA{<Ze$RTIVj?$qY)*A8y^ROf3^AbV7g&MqV0ww+LOdC<$4XTT_+<t9JzT8g8;+A1XjaJLFmM -&%<ALjFoO)06>8LywXAWb`AntOr?~1!7DT+{P%ttKM2*)%^oCrk|y(ubOOF(I|Pq1saE7+_|c)bSW_1 -D*LY1Tv;MsRRE9a_>s8SeWAZ<?A)JMbv*1>Hp(L8S{hWzsEdtE$j~q+58-auQtiO5<pcjIESjJx^HW( -0WGEU%08gK!JJmfH=TS`qvKvfcdidy6IXN_3XzBXk>`^l5bDZHJZ>e@xX?OUdl3|IU3w9l?@_v^wOD7 -s6P*~-e2!soMw(TF@5d+a1jn|%6jd-Q|W3lmZv&mN38hl<UxCjihr(*N&lMfvG*g1K~8S(Sl#~x0mQi -j`1<YQ`<Ji&^c?b;03-a9Qw=`n5UptDF5jY_TadilthjNTF;WB!Pw(8^@tz>6b9zn0i)K_Ki)*cl66x -l!1xgs|i<o4_N6vVAT$Ve64BMYy9RYuz`1JoGaSDWIGPV|CGZuBlzH0IO-HSiG{>#h7t2gid{QSdv%v --s%u>FF`&@+=nHJG`%NWxr=bKKeGoC_CIEIMTMWAYKRxl}zK28k0{0>vN4U@;_f4=nPYmvr;lS7}_?! -2#p++yN7D24FZ99alIS68Iy@d!L6FLNVs#52g8D%^TwhhZ-X{)045ns<zh#eO^48w9CJafiDQV?-EA5 -?9~hSP()fn+*OaDUnG&fDBG;+eD7P;)V=EB=fD#ls&|+#&Ms$8<NeRtydM1ZIiG^^?ST5raD}u1YLn; -=hCGobqw%Zxf|T~mU~5iWXAA5RkwRfW+WB-EvYY`n;YDu-D$LZXY(FNELB3H(#*DTnbLK2%K8b>5wT4 -P|zFg-~A6(7ha7?@&mSbkTe@)y9jqNmi4ahey$>E}FnwPBHF-1#}iU*e?@$u3I<Z}PJE~GL=z~mytsD -wKv#Zeo!mqpaZW;J-`dQrr425oeH(}Nd#q%VZf!7btshrLv_rWkEMYV>BhSa#(QCgE}4=5T3`;M^p%6 -LZqs*<Gs!RF&4QX=~^*nr`&eH^Hb5=Vic*xPQ8b5l`r&gF!xc5q&%}zd1h}JBl1fQ)Y216u1WXaS;lk -R)z+)6$g=F9aGGnxgqsF`tFVJsAX-7BTGp`MesI|Fq=~euB)oW&_yhRMl$l%XL>_3AEbU?bs!N~7=8u -DHl=V6Q?RVol6RQmjoF<%%%$gMmzNz{uY(Zym@bKL<PwuBv43Z#{M-SJt=%(2r%)RsRf!1~^e5yVSzR -&PrbuI=m?|r${dSSa9+CU0Fy8g;B%A(W#&;&SDOP^k!#-b8xngyVi5i_02P-Y@hB_aDI%fzc4UcXH_j -{yM6PBR^&+x@Ykfd{4CgKr*2&uqyhzj#|lYd4cFspa3L}KX-S_kENSAdx(gN}jxD$5EYVM(Pq*{Y(0o -1lN@XqFrb*BysW?g}Tpj>PdX3yZzc4HtD@&0R-Hv1M;EP~Fw-nuB}r3Gg{_W>mRw<d({VbG5Zyc3Vi+ -uCsEBB(SJ(kgaR@K-(7ue8!=N@<Hz3Gp@(-ZxYVLucEZ+mJZ#SdqT?t8{sogySWu7_w!VigHTsKLEy> -M!cY7`PN$-5oOPJ{fX|24ksn`%S^CJa@Zi{|D{o5J=ANZs4x@XdulkA&Y<@lu5xIEcF8~33<Si&C42C -=nUc<p$xPX7qXTV^`Q(5;n=aL5Wr-+na4r=rIoF)I#oePXG&=-%8lJP3wH{UQoanSwx`Mr|;K<U0i!k -5{K+V4cjRm}!XD=eM<aTHLygwmxX@q4VkA|r7xDf-F`B#dmG%j$;+g42<VL_|(L{9BZkaDV(TCHeTn+ -vhL-_zz_y3wi;Ma!?BSNl3$3@Ds!aI2|vMWb~f4#-%tC!I#2Y5C*0FR9amz(1HD^u@ElzZFDR(>3cxj -JV3X01uroLd=jwm=%Nw&#i?z?y<_Z(tPrk1_xX4?de=^d>s`P{)Jqn~0EjdO<UyA}9QpRf3?TP<wwo= -Ux<BHiN}B3=9GX08CevsZo5c9_UI^)t@jLvGLfl={^T*3sTy_4ZB{(6CnyG64ioZ)c)wb*L7t@Vs=J8 -znE`B^H4d<ofES#=fU)`05UwQ20Wkv2<y?a2QRuu#=&A#H!Ux~Bg#gw?KhbQ%dv`^|k46a^71ZUBW>K -H%Gy?-HZr+7G|=Vfvw$tMof&Fs=fy(H+~X%{$nO12fOuP$8q-MadhtuOT5)jzMi@Rin_=f>vIWxw~$j -=bC;4<71as5RJJ+sN$%r!wL7O}1RAe>+Ptj;A;?K(wnV+Tm;?ETaRAm-JZQ^gu6_iINl4wkw=+r47rv -E}tfhoVxj9c<;PT`p9`${KhDM>0F))_QESY$@S+Y#OzfY99ZCMZ&_n80l(6rS16ZP!SJg{qW+N+F!d$ -+`pM~+B45U@$(-veCdHVL%hrr+8aoI*&&itsy#trv7o9wEO=13knqqmK%ZrR3Lis@hW}yGnH~~*H@H5 -)qq<01*Qb7GQJ`fE@oXV>~WD~G&x+=Ps@82|Zi?Rfnr^}gXDmnJ9A7fL4V9?Y&{T;oR%S_XBs@KZKu6 -E1)^ympd!J9$7D*%CzKxV+}?Tfsnr3P=|Lyj|?hpsx*MV>zjnwED>;E2K4&2lHF;UB$Ai}spdx*2WF@ -JI~b&`FI;jE%g;Z!m21vKq~oV>euO1o~J{lAo$)WMfa!v?0*(+$=g_3yp;|V?EGV!06v$i`4cD{kQyb -_I0)cCRfY9^?Si$u8T3z5g)Sp9*YvOCDQcZV2zTsv4ghA2pmB;73#3TJ7m*1&t;Bdd(ZKV9A92gS7%E -7y6_SHhkUNLQ*z{Y^aRtLIx?{15FU8m2w?DY0Or`)BTc;H=&|Q_!;{Ag?gu`C>%AGq@dL*NHbnJ;h@P -ML`b5v?U!&<BR&KOc+u0^JZS49G=hx&Dg75x{LHu&;ah;VyJk#1M#ETaDc-jU0PKQS_jNaH#!^eh;y9 -jO|a?v>e#g4qubbWnK*Zyr)(+i+|oaJs53i?Fs)vv1T2i1J@rgkqZ;yOZ{8B=~Wz%bqn4%z`JSCDrlH -7_X`+)IyVP}nfH*+{h_)0e2pWX)zuz7|*_QTWyZ>_vmLAt+piZzzzBkMe<4J6@m-AI5d-ULkU{ayRgJ -y_#%K`@@nfFMgyfONuZk&3=^9Y?LdT>CaDonYwOzsm}&oJ|jiir<c*wah<}_=Q>|0NS=9iIU8%WI>pl -!Oi|Gt>NV6hu0-h0H$geEm!*3SBJ=LDVqsCpZ_u!;I*5fo9w~3fOw?tDY&^21Axm9lpSX8y!dcMOefK -74{rUd@P)h>@6aWAK2mnzTaZGO(0Il``0021(001ih003}la4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z* -p`mb9r-PZ*FF3XD(xAXYEzXj+;Obyw6vRlxt$7+;hq)QVx+eIawAOpn=xnX*4}-j4bEd(>&H79&6ZRl -#Au*?&_K<7x-8b<0UK|q<A^05Be+F6tl`1k7RX%4q{IZfe%_g(HS(Q+ULNa<L1QP8O(C8sq%eGmc;!M ->BkOBFW8?s)Y?cTC8zOR7H|gZ(Pj-qlYBV+VjP;N0RE^gdF@G7MW8E&q`yf~Yqa|4fT?mZgayUzMfr4 -44XI4&FFF7ptHgNIA1ihN=R&Ruj7Bv%DfY%gUlV>|{KayWSBAR-wQ9Hu8T%6)+ONSiL6MJ9)!g7<%^7 -Y=_9e1b#;%cJxHTL>S^J#qwXDMza4f?i=j8lNm4)#GpgC;;iLaX}0!9y?N)tbu47erS#WumCjf*OQfx -9oP;;$ycv@jWWVn_Iaf5(pIN4=9Pb?nlcOA=3SI6v`u-d=Zf?AWaLz>TTm#hLB_;h`U)oyoL*F7La9c -S%=Up9+%VdJ@(~W>^2#6_$0qHfMsKy24Bp@#lY2)hv(l0&~0H23tXcDccb1j=c*%a%{jqdZNd64ybYR -@6|T_VRKw|^v8_CQbKRIxei!za&3BxiyN_v4z6Ms0y&_jp&Yx|y(-s@{2$GCM3eXurcVC(f0KLOWbOt -l9~rmLrX8m2(f$`uO9KQH0000808trnOg0Zv*61Dp0842A04e|g0B~t=FJE?LZe(wAFJx(RbZlv2FJE -F|V{344a&#|qd2?fLZf0p`E^v9>J^gpvHj=;lufR&lBb7*W;<&z?Ter`#oz~YR_OskHd$w1hD9B<=ky -?WE$M$-E`^^jh5+Fg_*>>-T)q8Cu5*Q4C`JMsXXQO8$7G<+Iz1(JHF(19gCu{w+KHJMycX@odD44%DU ->h%9Zm`n@XUBKNB1_pgn-@1>&e_|nOlM&cXK4VP#+<WvhkFMf#s@)hTd**lvAv@YrzeMRemOll8RJ7} -x7O?RcB6<3!HP_Q^aLQ1&g086CvYrI=UKj#prQTRTD)9kd4cHiNa$Z#^)2W6o46Be^E_L^%U~523#Oj -0!h9CzLueT$_<XI%@3z+%d@9h005lUkU*oqCUlr_-ULE9lmRoK2sO>SeWudV9uB}ZbVUkQHY=@muFYl -5U6WM06n9SpZr{R)&!`92|Fn2!{=Hq2}#Sw@T63(spdxDKb^QrwH2@70u>ly9M<eKLK_Q8B3q6J@a8! -XMfnk78FfR&i>Ih%-Z&L?`^ef-}*u4c6b_{n)u<|(t=(Ob0{M`L3nj2^U`Kp}J7`+(o_s4T*1!eztB@ -yXGD9qgS>-t3MKU`G^L1V9XkzTd#k1~C|{@kA&{{RVs%g(;hI#+R$&j=}I@etCWN;({%JBBq?DELw!= -C7%%|DBg*Mf>ovj16Tm2k;nWRz5|OPB5ajsmwC8kh@f*44WwaCuq)Bc%m;*VA>aY_Wji~pmli!jptp* -qWt_}<z+5)Kv(fAAiy+Bvc<v9}tJWTn7V%3Kr@qy8s2B|p>9ga#^^fEK2wrxgbbh{y&d;x1D7}2~r{m -PbZTJ2D*5<vq(Sn_yhs)X4rW47{e<hNVePW>*k+9JN0kg6>3QFep#=r<GplDI_hD`lRvM5Y?gPL39JZ -bb;pyaq0ncn+sRwi5kz<D|_z!;2onwOG1)$g|<@Cr!3<G-H%bo62J=9j~F`>+J92|$x*eu;}RgV(ATN -eZ5dGUwG>J=e=5n*v)@&)3v^(yXW-)+mzr4}zSFtjs~tXsJDq(;3KT-E100SNI%+VRRK<a@;KvX_HBi -i&YXAz882y_HqDBUG<tsD9~7b@ta@<byGkM7a9S}#sU80dmu-ooD86aS9b^n=#Qf6H)M885QMPB!mHZ -f#Gv1F>mU>pQNT(p{Q>GEVei>wy!X?=`-5?SYc*f_Vqj8+wP$umBs3}SiP*eVCgR)4DhCyG3#+4kFEU -U=4KlHY6}<2z80ZtHQBux0cK=P}5s>@u>xb&u;E^y;W0`P3Xnx^QF%1R(eLVm$);?%zBbo&QR3PDrsk -?)d@W#~bK&z9FyC;*AgX4G5H0ME-Emz1pxp)4XfA+WEE}s1`IR70-lLUOb0^u={1S@<ATZ@Jkb!$3ST -fD#>geics^*sf`TvPR^!a0Zwz7$4NsVysoW%mK00C=lqQNtLp^b>^@?Yew~+pgbQ;zYj(v033@Qvkq* -JyKFagUwdhYsjv{q$HYBeeJIHvdBKZ8gZy#IOwf4qIxK&STrFhEaaS3vz#xpYwp;IHKn@K?1ssW2Gg0 -5pan2_j0#;apo2ICr4JKBg^qlS>?!-Y*0!|)^{i^BJ8Tw5g>P-V>M<}#oro~!z#9=zFBs6#BAb3`tdr -DrOur2-^Q>I?F9*%_r*?o~g++V0mE^BloME4fHAj=iXfF(;okZcBX^Xl#x3yy1K$KIzS`xkAFnYhqtX -d`@W_|Yd@YDMPHUqmCy^G|I!DgZTr>tSN;5kU4xDZTwDxl`TZa`I&fP6{|>Br1?5ylC^%jRrP+JHk=3 -U0!hptr-2DB#(G->S!`NGBf;PR55vA7HzT4uRB8q?e3FlkrbSC#QDPv+Y-oHj@uWll>!XYP>?z^||$6 -1G}Caz)~27a|+X~Ol7GCKuR8bI@o)lEn3c#ssnh2Zx4UOZ9*aZAxrt%<d^Zmi8h?*iFP2$sVK+|BClX -5d5#_^k^mp^Q1Tn7K;+8L*zhyDd$jRjXJ3K%Wl4O+*>3`rRZuLT-S1L|LPsS5a<Cd!ndEFqi)2k8<Yl -;GpX-r72a<vh=lB-9VIY7sbAbSSd8q7r!UK$d<r)MU`?W`L?}MCcaBYpL(|D_2H+YsO1`yato?gd!mO -6pduNy!*ncjHW$)eKpt2AoCfk{dF72sik_le(u({a`5yY?pK+be!Y>aK1Z;3Gq?!B0cb)Nqurv2A8(O -rpF7{(y=z20nx47k~?mwPu?LM9tcmF(^4FVgK9j+BU#fNLt7bmSQlPS&M|PhO7}j@U@a?&%d&+l&B?? -T7H8j2xb4F#g!IKgHOV&*<VhzL_^9@vuc)laayv%WOv0sv_2N`006b1Qv6P+rPY4>&*!O5ZgTL^A7TN -uT#96fp7=a06CHZdL~1*)YHw-``y_KzS8c^32~a~ME7O{9qHde|Cf;gH13%nkG`%%qAQmS0TW+ut5*V -fMd(zcFS&yO~984r_MV<%_-BF^MXTV9q*r|H(CUse!tn5}<Yc~r}&fzpG3+82FgD;7A^B5c};jtea%Z -M?6den|t>>eNQ@1E}V2B^4u|JyUkMNi&ID*B}%a64L73xUnSC70$yPt8olyL8}=5TAwlO`ICY&vTg5O -_pE53~Z60_u=iy?)!sZk4}E>SrlJ&Y+2>*$=x?W_at2tg>{5^zKf@MnBQUOL1O_=pU#4(vmSfe0@D06 -EvvKbjf;BC+UUE`w$XK?sY5K93uFLP2WNd9oR!jOhlso~R>-|%A$zY{k3?~oaB>usS+Pq7Kg<DEf|N` -cr)W_i$aN`bS79u5gTxQ439?4QlmJLe7+ezr4l+Cj8OS>cg*2ErK%ZgovP8QTZCV|rEM-ekpzjO@Y{* -i6W5Bbmmp(h;mtf?98N~SvdXk`li6Yv1qRhwOnuwQi5~9Hi^MW2j1%S-6ESah0phy-iiWtbTCfd`O<h -Qm%-t*7G(LZ)a|9zqUeKGpa$;I=*xp=k%|M|hQfueAV#Q>a_Ef{(4{K>iRpFwYcaiRVtK+gu}&HfwC{ -=ao}|J~r*$LMtMJb3*p&5HT~Jt4bQrbB{k#Z!accq+3xJ04|qK-_T*oQs{FDB;UxSa2?)aK(ERD4N$O -B;dIs4s(hU(J$XH9Pj~|miWT55b#ML!1O5uBIbL2j|8K7p2sVHKpN_y0KpP{5@VAC(w{!UvE<XT;nD( -^p%T~Hd&o9ycNX7XYfP*+efIgu6OY_CK)2vIu*_$CfV%t2mSV+nB>^c-?R(G_w22vQQV8~*P{0^_wB? -@K&a;%P!$$~8D^t>(SDb>?*AAPhw8=-56^+b^J%8YE3_BW=cQ!OIZqEOSBWmZKNCS{o(zC3JA>ed)zR -D8mL8EI$jm%g`5{trDi>R#oO5cC1+7XL{%ma_sW73MzQ5h|z1I%lJBu0q^zL^3s#RfBw&)49*6HW*UE -r<e*2?eTH0IgjvSRJEP-N!2)#juc3sJucc4vUP*2%v;g&6n&LiYcI`1KXWn^HhO~$+<L|fJl~Nn~W8W -R;X|al#zxnXA^V9d~fgVyWJnhxLfb`tFL><$MU;czMBQgXb>cR)p@|aXD<wk0=Qb6!!o2;w{&|06|uK -MLrWbQSJF5TJj{XHrS*&Q!<4o5+a|v)rT<+tgsT3ergUf%>l`!LIy~Hbi4FixcjkmlEx>icxJ!}yinv -|;py8+m>0(E)(@+P)W`_)2A^!Ig^fJp4MQ0a{yv(F@kK5(U*Fysv#)Z_v$RXQo9wrGTN+k7CXS5RTTL -m*HaItm|J}o-!Sll`Dv7x13kf#TjsOvNbvCG-3?F;8fj>vIi7FcxPdQIp{k@EZz+le20e>$Lc2}=W|i -oB}fF9xpleOT_^Ge@-j5nnfma9&XEi+J#C2^)<`x(jDp&Hu9P_EPSjKfov>A@E#+>)LdsL8(pm+E~)1 -inX{}-oM738n!td(zb08WR3JV&8t6c{GEo%<LBZA+S$C~3YGdGZgWtU{``{+iJym<^1;riPZW%M+v=b -VYJ_`5xA}3b*&}Q-uotq+Qq&3^R52JWX#~y=4=w}NlgfGL$vXIC>nr8Of9nABr4$95<=G0wF!)UX;)d -!>Jb28*q}AmSyL{j7_9<MxVq#V1aRze`E3oQB9VtY!S}mV5IvNXf4?{rIzaAp6hF~T9t}ZO&TaO%8B` -=~(3ZYFimF%y*Ol|#%pj^$scOe;Qh0*Y(^1_|<QGV@spU56K5LJg|(!kR0X`r3i?woid3gs@IP~du1i -gyu;umJfD#v+(q;WVBn;iZ+`RiT+#oKF;?d-Bofsdy?p_LTXpJkF4U9U7V||Jw<*8PBUHqwB+bPZZz- -PQAgf2?nO1r|4Djk2sB?BZdt9W@aWXz#fkOA@_Spl_ltThN~6OI*?}}qmsu*<HJulC8V^Vjw>WtIHRs -aY)Jyfv>sj#qIX<Hxf}#Q%`6$;jMwNdDtau}Qk4N7krYRijip_ROVpup3VavW1zr+Ga$dHLDlhcW*;C -PjebghFjHKxU<9t}ff#dZW%p?cI|37Cv=06n!ghtAO+Seo+#^BQ^tbOP(=w8UxoldjM!E^zi9WY$nyO -iW;Q4m5mZw40dV;2be^MCz9>#_d-7y2k=yN92KDl>?F;0@Trmn3tj?iDv7iPI~N#Wf%oYx(!yq>ertj -qs`9sw;xZInMf;YdC5_WVO?fO~E0&S@5*pWCe<%eQGdrO~JTIDg6b~Hs?{1>5yKx^rJ)vc#z|tc25rW -J*jr^(VP02B@ogq{bNGm!)YxD1h_`iP{fg*TZMS6w3fo}@Xh|g_>|CVi!-C)o5K(8wis4-v_Jf?_wJY -dgX6z8n#Wf0l59IZqDEe@x|?~%^Mg+Z>IJ{$<_jg->19{S-o}0Z@WeB7Xpb#wr6TWDIZa?CcaIMR{FZ -yx<k8i=(Q7R^{vD#%j}6OGbx%9`+?OvHMSrc(@ACn};PZK^i~;bi_`D5Z{p{HV>(fg&5O}|SUS)q|pa -#PgcJvm5x2r08>)Tn(te`fwu$w~Tt6J7#rIDWFpA~#{`c@s0%SZT5NCb^Y6J}rSSZdo=$EoSXch1Z`y -J~<se1s#txW@o>D9!r}&{_pQ!u-51RY~vD2+cG@C^#+D<2@ta*Iug{iq+9!VAd^d;b}`mmz}A4Vku{} -0F^b_JY~>c!BB=DP3a;P9Ci{UX=)o%jV}Y1BFhUt^Nq4nU3oV!hp$ggJbG}cqwS&l?DqB+<P^uP18?p -oOfg_9utF@NNVbV#g_IP4qET<##8202>^N%#4B<Ug6^lD4G91%cg4)Gd7!wLB3qmcblI@>A%b%Y=qp& -orNnKz-u>q9jC~!cTU&k{(BguRdCyBKm?&<`pn=JDj!=5_7ZA<I!T3R{Hmb=zncH^LF)rZPy+~qONee -k7M^e1fw2?o26OqqKB#70=_re@Y8ABmerYoJ2)ErCXhXI5nZ*k951PqRt`i=iGQG<7%XUqH+{<)v*Im -81Z(mR}=tbdvz}0NeVPG`>aS8m7JEVJa|X0)tc$7^4QaI$+lJ9lzD!evQ*vb|dKA$NMm1M`IvX4-<mR -GFmXP#C}+_TPPH0(ykdJJL6o*#1S&lBjX#gjxfoxE8Na<CCM&~YB*KJuyqoyo>Pb6q7O$H1(lTwF^eo -)hE1acQyDl?WPQM*Dm2b#OqEgy(o{0@h3jNgbCNT$fQNTTri<{Je`|n(S<OQ%*pqHdm~&O92_3@RfKT -??G844nbZjH73Ns}rJmFFnaUwR9zYsVlbLJ^&DGg~VO6_Q9%tE#{>R7vA-&H5#8ix9V9VTJ{s>f~LKi -oOZW?8GVvuM{13X5AFu_VZCb<;<zM}6)>LvI)i_-UDdHjpYHcA?6b^@G|*k#^xO`0g=yxGvkUZ}kL~c -1Id$TFV2>seu&I0!0LmMalE(NN}?tGA%HZnu(2OIb_oTHsKFk;9MnqHK6-|;OX0<K*{3iN<1oQprVl} -PqG^+T5$GKl~^1Ks(D_f@<ak9`bgrGRJqeUp9;;5zEbPN#Yp!L%!!!=^WVedHiE6@)T}kHa3?~t$_lO -Z_vE1=PlxwSDEGlv-MY!NZ3%Y+uzhTII|FSzRh?dAp@n>j&QFF$RyY+|0u(LPJ_gkb41#d<J5!Dar7M -{);Yi_}+(}=z6%L|Pc1A>pv7fRVRFFe9E3r7<+&(UlYKEk9`E7`&7lvr1F6s0)uufj4(i()dPDf_k5c -R47iu4=m{5fSmie^knZJm8O5H*SE&Jc|^JQ`Ji>E1B>INi(WW+r_geKOYNWwwqK+r8-wg87&-Us+)sq -=e1u+InX)j3)D!9UQ=sgYH+fVQed|(T!A`irh(m;*wQM?0}>KBz4>;V7o$qrC~h6aTGkF8V8ta2*LwH -*BVDnw?V6yYS3^&Wff}|pEO}~@?HCE3B9ugM6)v1la;Xz;d90FlqXujO4z0J*FlZq?0=>f+D2ji>tHi -@Wh1)`zht=q17jLC;GjB8iYIp3rD8UO@7QY>VH{yOS_GEql*6Prd-)>R95S%pqbr0l!qOPpqEQT!&$F -yuqtVw<Us(!-^);##h&syjAQHn;)g9eohxYdN*(qAyb!8Jpn~8u>QqW-pWip~o44A%BNgW3$sboS{rZ -KJnSh7-nQCtK?OnZEFhCymyqnHT=gRXLFbut!#rR8!8_B;$R<2ejFGm@lsK^Uy|J&;xyM1pqZ3c2luC -rKMw{W0pVz*wt))N%8UniOfw?AQ!}XD9A$4f}>i3Ou5VbMgHA=J~n6@fiHi$QC}>UsDr1`x`qiE}lIC -MhjC6N?OJoe!7zByNR||Q2A3v2M8mNXVP!L`G6}P6<A0ou_Y36QG05ZELD5#BIplCrw7}TtYu+ch=Q@ -m!OMtXgQs_FceSG0M9>+ZkfgtHiuXQp1vxU%MWE6R6P0tJv!Y>oS%#N*N;DSAkeyNb%mIm<M__pLi$Q -d@(MCgP_hj!UNlTBZ@FF2$RcILiItc3Dmf1Rce;vn}J^op)GhxVopJN}akODxRUAh^~K~9Glee{57GJ -}S(L_5TiE>r+D&tW=Em&4jnRK9}Fx>kZ-3-OeV_kWgjtBNtfwHB^&!9HSP#&|%tEvUMjx=z8Fk-U#U@ -VKmm?dB5lS>|EvAc($Gd2y+75paa|m<%{cm4*u-Dy<}=M?sdm<jXXcX(?qB=ge5zt!=dq)l010b>c5| -d5QCr$y@4(E2$Q-Ho8HmsIZ~~5^3SPtgNDdpYV9VW7b6312)CeF(-qO93|dMMe?#Px7HOv`TqI%`2f1 -f{_U<0SM1_P%&zXQ+f|@Un_OO!;X~JZiah_2RFkXtr-?QN?rY>5e*Tz@qeb{?IcN52SqLca#<20?f1V -5;Df962fDn`SDjB80*YY}xvl>gYB;9VS+Xv`Rr!&7r-&6}{9!pi}yhL=T1*}M`D@HD%x-xz;^G&&E6f -g;|!@E-AP(q}Rn(Nd!Fg`(R-U{XqJQa~X_<I=xbQGmPZLMbYWV_M<UCoU=hw`Uf*)VnLUW&XKU=hz_b -x@%riho+mTXZYqG@<A*+C>1VjK!krF%o#7Vjf40&_+yZNE%`8wnc4cp+6G9uy?CClED+1pp;00nN?l3 -g{n|HV_Gd*R;Q1*>y%&*#!@7EwcF?oq}T`(JeYC0P%d~F73P(8dTf{qN4gYR8y=0nW&AQAiatD1A=lR -UvA}xJRhSoXR3>4Llc5`qFnQu*KY#}h^HREC;~x(R&?3xdcyHf8su>*QU7VJ;G{Tkb>9)s^+^EOVWG6 -#LlpLstRVF_wzDaP5QT)y8E&EBBtQH~jf2i0`WH3-HMjOG_NR;Vjsb9o-d^`FkcxC?H+8k{K8#)~$^E -a4YtWwP>GFpWMIR7KM#*6t|n^UkdbRU>2-2(=@dKI$U*ISb<@T(8gf+zUp;QiL->5%av8knHs&<W`fm -L@KjX46+202$DtIxE3OOcN*);m{6L7{xFuO7Ir1MxhEVjK0bG$SQh0)Vu|IO_js4v!H9EDyUwo&czHj -r-gM~T%_^b4%;G?nABG*C6)ZyVLgV+;2TGv8`qW4tylWykE+oe+wHK?OXuNda|+e_FD}5nL2t<78ZhS -A8keBN&+$l;!eIMLb!VH2jO+$WLS*7Ok@6}s@|;~`x&QZcM#8E4y5`#4rN2~RQMA_4($OW18I}^0;4x -zdefH_oC-c;MQ-1uwKAa+{5sf3vU1Y?e0YK+K1$)2s`U;yIAMX(p1P`MQ26o;O<*4Scz8n<$bynsiFE -EKqJu)G)=Zj1fL+$PkwI~`^zJVE^(_`tFx*^1IY}((5z^Jg6x9;J6j5&y6fUA1@7=e$#r&(rLS<c>!_ -t%fcARkHY=V2<)J5p8g%tv169V2L5B8=aQg({<wb08Ec>#hi_J}9|v*wFQa)VI1B8cp8h;dTUW<P8jR -p>q-2-&{~2okVQUq>9}Fub~liu#Ck1IuQVXQNTT2MX<^<%sRkiM<WA3{Oa{qg9uu*CP|5nk9SWb!Tiu -97}k3#MzTED*Bh@8(4`pd*?>04gfW|VuE_-RpWj1^Z+hDX$MxB`Oo1G}!QNx3R@jEcl+}jyl-lVvc$U -E9d%So+;)|i(dfWjB^H&wUo^5PjnE5z5Ij4_^0-06$ZaMHsbsOnDhMkqZa$Oo>t;D8W2~>U7RGIY3OR -$TkT)yAh?ER&=?2c7e7&un_l^iRyQZW{wpaHAm)o!3$5@>XHX<t!MZ-jbfjF?Pv-Z*0Kot@8ui|2+nD -!ou_s;c@d92B`Mn<80nuXZlGF>YO|(Koi46m*%hRhfg3<^q#v9_)N5Q!Qi=Q@V!Y-<5fV$ua{<RoLLM -6|`7kLE1HCXNb4n@9rIqKTY-zj^7>q_5Hzz)5+=X$&Uvl#RV@6Kt&cv%Ni3k%KpwUO%hMzBrfiN3@Md -E8heR(1QAk(I0`Y!V&{dcn2cbTnJPk3`#=H`>(|j&l_|>`eNbC=?!vhi9?|?#)z-HBk9u#z=$Z~3s>U -)X(FNPHlR$QLtVC-!xe4zCCc@FIE%XT_Ne${SkWP83`41Z)>f_uq4!UGXOEgypwUmo8hh3xa5c()mZ3 -nh94!{i}q-i$B`H{OwCtxQ$lqF%f&nv1pqRR_rSwwY2eAWO2GgeNaixhn<O(efl^_MQnJZs{EZGPk!S -^|m;)9{k#k0|q<qfW%5A>R6!23}X!yR7d4`Hgvg9fPt_?>?$I(yTmZ%2pk=aAgjD)#1$$ZDc&QMx4v0 -+3nCi$!ydey5f3#5nhA2lD7jet<vMKysp8HnC0GgSN!h#V@fj=zX+axj72<6xLSwr*75bZc;>#4!Tta -+>4ksq2hV;Oe7CNCVH75iHIj~V??9vAhje6~f+)!ZcN{}~T=dQ&aWC*>8n}+;nR!vVqo)a=FPFD-@9L -eh_#Uy69JSqKIVntP#H@a<KKJryt-9c4CT@GJ)UNLvi|`y5VL*j281W4}X9`Is4=A1Ej>}jvS$(R~Sx -kVD?q*(<eB`!}k|6<#qoxi>>P()Qd~UaLVW3<Aj=l%m9HA&`U?i|I5Xg)Q2er%{6?dz4#I%p@j_T~0M ->{;2iWjt_owWf?En4p*9n8Fcr5$IXagS6K6rE5Y&^qg*W8YCn^i%h>s?qTlQ+hENIEF(f6J)4tfL6)N -PL@*>rl#h_)%rswjzR(N1wpf(?r~m4T`A~?maz+@jHWySDqi`LJRUBh`ZeGI=~oX!2dDt;E8&{n{3Fr -+`f+NacZ}6_5r90KSf8WuyL3ozpDww*!fTE7pz7*V75fo8PjfQ&>Bq21pfukKUEEHba7Pgf=Evj>JhD -A9x*6wYr3~eRMI%i$(<ZGUz1kR|2}|K~Jobfm=G3?4RP{}bxTymWcG%i9fw`Cu!yL=-R^V|(kl!26p1 -s<5aNE@W-m_SgexiWF@g5~|@av?CEx1Ud&yHhIgrPLtX{~g<{PFQ#N2spujDMs>?hlKacl7;{xk{q`3 -i7o3sztJV%npCm2p1T+3F}Xl=nREU*tBY`^^JXCAQkFr*|@;U$5~i}#vfR~OZ&lg^y?c_2e@ZE1w%Q< -s|b|v#%}t41XC5GXM`Y-D_+>^Kx6yfQ?bqHY(F7jSZM0~dGS<G5JL2*nSn`l@E)@#Mp9-!2D=LMEE-K -_(xJMiO5RGH)<=}oSjQ@kw_Ocqr+o%iV|nOUt$3qLV>hghdnzAfp5ImnR%$5D6Er3mbrqkngWj?Hn>N -PbmWO&&SA}`*3v=;rgXljAL4s{UYdx7L;igu8?f(E!O9KQH0000808trnOhiH-Lt<F~0Muy#04M+e0B -~t=FJE?LZe(wAFJx(RbZlv2FJEF|V{344a&#|rVRB|^Y-KKRdELEzd)qd$IQqXo1y?>fmJ(TOIWJ9p> -)zuePU@$QoyT@I>880VCDAfBGO0sSaopYg?swh*;*FG?wCCRQ({5vl1O@|OFqjz(W;VCK{j;$dRdI2d -&Xd97c4PC8f%rUM+!pEVs*1YLd(rOB&Te!Z7iIKnSypi}PUg`MbNKyVGxd8gO@4%W2lIJE^~$J7%B1+ -5Oa~jA@ZwEUT&HE3=2;Y_WfWZ{MKZpPW<{J;$+RCumqn69QGOXsuHs^rz>_MEqBy&a7D-X&8NkTLRh( -vNHjCmYngE7aJgTk$UYTE3H*t|*jcF8@Wj;w`031#8$?`hMs<=uC296Un->t5oZ0B66b$ZfXG)>|;V3 -;9XC~>agMmK47l`kuR0X?gVbb=83SavdBP7y0rB$}t!DYqzKWJs`uWtsE=2BP1OuJdVniGLI7@?trjr -{z^Ynx@#ocv->25+6>I4C-O${+bt2nat-5BgM|}C>YrGc^I&{1&(_a$sm^8%bTnG8fyTIx`Q|?m&+mp -1Yq2#+!X#RbASdo{3DrE{FIuy%;)p`26|0+WYZLTTkg?ZUqFF)oPSQJmrO=cmRHaV#tUbRF=L95cjZ+ -K<P(h%FCJAu1f~L?N?)<_%Q4VgR;4gei@czAaR?AC)f=X{i=Pgo^V63X?+(rmqoeca&DrVSj$RzTh&l -)75j^PhqjyIaKb^k4h@i;X!O6uh(do<R;N+Jm`uXVO1<upq`!{EY=jYMsS#<RJ&GFIUi+*%;^8EPii= -&fQQS=Pzo}6Ap$49S^E&%eyX++HmyraW&fB`V0*N11%e}X3m&yJ3dE`EVAeR*_of{@`G0FMr$=*_{|# -nJP(#|Q8;dh_<|&FT3eyf}FQFiuWSj!s^lL8FJS4^J)zfd5GZPowDYZ}2-h|LNfPnA?sH-a@C&05ZUR -e){H@v!ho(T>y-qPLE$4;`3*RfbhYy<3nznI{f_j;OKQfdU5dj;MF15Jq2ih3KnIg0mi$Z4*4lGe*hR -9Jij<PJ)tf>KRvlPgWr7^g|mwq!n>pML+J0p+0i+m4=`SyokB}E>`)B{_5|ym95N`J5_{^P2>yP1j$d -&+34<4h2gd;K9IKnfaqce*An?)Xa#<~lWHgG>YowHDQKVS~PcvG(8ylTY=PZe*5fw+uyeZNuK_Ul^3M -5`!$5j*;ldJS|QVy{A#>Qy$8I}@M2eA85=ReMp&nf==4|peUBK*L+ox%5moetE9m%tYasDMv3AN_T?v -y(hRUfT6|X%DMSfrDWss`ei*;MX3o;^A<6XLoz|aWwpH@6qnw&M<ng0}MLqzAVyy1kYb4V=C5*{sW;* -K9}i~z#x>P>7KD&L{FbSe)_}$`j~<KJ-UXDZ^NL#YMLk4<7F`uctrxMz2xrGe(*VuPSWH$xlM{bew#b -}>qloPa`kC+k>3Cx%ccVutW9&jIid+F&4)5)<!!0H=K32nTB+|zQDnLLQKi>OU8q=2bTMQ_>U)uFY*f -YV-Ug1XJew5@V8A!ijpWNDSyY12VNv7-mxBV(V<-Xtp5z&TfE}qEl(*OOH2W06w7*NUX?{~8nE{^yDt -a>5iHbNafpMMW6+nc6OmM#=up3f!#4RG>>_^>$N;p52>4z%zYUDRnqx2%`4j&F5^<W<YjyX=aZD66y9 -4Ej>lLDAJpaUE?y2|HM+65TUdGfqSfX2>mug5v;ILCn6n<D)Tlrl@OPyCHa`<Oof)J;_SJvERg@pWPh -;{rBk96DNaLWyb)?&DgS&xy1?bS~oJCA<VKjbD$l%N)O^<w$DD3xeJGxUm7<1Y#Me<(Wc-4?7>DAEJl -WM2|+}Wje1?T)=S|$&Yda$TqPG>Ngvse39Vfs3!yZO@jveR1$6B?=9Rx1!pR-@eRTl3w5}&(q3173#g -N~$B299*PTuj`fL()WJ}y-VU@;{Dk(Oe9iKk``TXebhfwwLa5qqCo@BG?3U}T`kxvrX$w34f&-2Nra^ -vjq`RUmUsa}J+51huUT_lsdn3fx_PTr1S?>Tx-$Rb}UqR7B`6FAZ=okX*2Nn?W&5{MtLNglm-EB^Xr2 -R<FM+9EI0FJ{G!<HM6z7e9?o4qhXc!<`+ki`Vg&^m=)1ARChanE^?w>aYj>e240|Y|QE)UA#Pcj{qJ& -URfRIX;CDX(2+}Ev(pV2=vNoNyg8(vho%>W)!A~6yBXlUabT7Y(1TO__~d6@dKiRGtgj18BAq5`HTO2 -oe|fFz?FQ?W!ej`*#`B-fboqzD@|rNCa*<3>^qa!IJ4t{}YZM;^s}f1N)m|LcEj|ubo2EdRRbJd~ygY -h&stZ5y3!_qTnY%5ZG^A^N7pet|yGm!vd|C2n;|jnUqvO+)S3;HJ&T+@60wsuq=Xo|GDl)4GC5}5kH& -vm*R#nbH+&t$t&N~)js!F*4u_O`X-v9JMcjrrR#AqcBhT9;F45Q>r1^YZ~K35=M0Y7>F>R4Bwt*$<s= -VKU4seFEVjMC%C#NmC%tbCpW(E|T<o85SOesOR%0x9?P!3ETF7pc+i@cXAvqb{+Jp2&X0lXTr-2x~P~ -QsK?P`?`Y9HQjD@7x5R}*o(uL2XBur>iTu--@cX5Hv5NcCm_Egtm<|Fazu3n60!ncE*B)l?QNXDee(u -%fWsFfoUe0~YlQRkqXYd-*h_!IAE!uI2q+}HQu~owhQZ=$we=(6CH+V^L$J8J()y9RkXozp(&=pk#zK -i+70FU)iU6i>GSva{Y}E1EhQ@Ea?%*0opgs?4w^DnCO{4=NYu);t$0CRT>_(;NQPA`kS$~X94kB5B8$ -=w5AQ#0-${p~MIXXOkLD+N_adm}~9r7ymy-a^6Y3~}v`;I$0on<=3w=@2;M8-(J>B}1U;c&&5m%#2}! -p67J)wIC<rc5fv4o9U%5gvELXu2(%O`{nj*l@PI9)rZ%Co4w|vsLik4r`R&8-&DyODRabef{k4tVZjf -G%B5#hG;Lkoab@HBh{G%o?Qo?;W+LArt0_1`AyS64>tb&jU4G2Xpm?MBl`}L=yg6#xa0lkb39)rG-Ua -tisyrGY3h7*^zxYY#hrY(i&A0DifthTOTzl&k~?-uODe*Gz+9-{&J(*J3mYN=U_oGCT=0=yuof?{6fi -9=<zQHgJqAeNgIsuM7e*;$W8>od?a_-Uq7sjGOsRAeNjJi`psyuglF5>+AQ$JabcNkOg;#!szg@hS3P -Y!YGWr4@Z_f@7UT8cbyHrdIEx*ZNkG^>O?(FE|P$6KIWP^-R^zi-RbKSI6lo3q+S|(_*G3vak5rJ6<A -~GxT<pN69i0te(Afk%ah`>CoKt$@C8i?#X3Xcdf04Ql7va=gTL=`m<*%_`tgzJ3U(oM4zZLjI?Vp9Kl -SfH@y<p6mluJvvwtB`q4fOE1Qet7cyl+3LAz?-Ve?WY|>NjF}i);~)sGVR}%6`D#WIa=hqy>IO6c@DS -%o4Q=iBV{)HCgEvgnp^@O&$__yS+DCy3fn%Kvht#o-gi2k=XnNOC+ri#`q8Eolcv61q4hkAdB>{IGEN -ryfvU=88XTMf!B4tgGgPEVs%4Qy<%c~+=VSCB>Wap>jVN}@UJn%alefo=JV=j-{5nXtA<A9hZrMmL2< -gi-n|4V@Wjuja7SUh!qwV3I-u|h3ANCd>t)2{~Nke}H|FqkHEpEiT2QhYw+v*BWC+LNZBpq^~*nm6qO -^()uG97~yrdlmg*m9uufuAaCTM9JL13__~-wad-OEgzOA17Bumsnx1?yI)=sSnztU?=X%e01V+lBOgq -(b-g|hi4_79eDDzrz?s{?r*rk8a6rgA$wtTl)(m^PJbdng-UfhDL)hGMdqYlj0&M0{R?}a;<7H{Y?gG -Hkbt6wJ+~V_{IDNAb)G%g2kfWa@<R&bIQ(dlYR2=31DN4S*$hO9{il5qZuf01Dm2m7w5lal&yqXQq_C -lV=b=&(i{!tTuzi<Gc0(9rnR+Gi%Yw}>1qw+rf~_2$v9Kx21lLBNPsU<=St==Lxd8A2r2F*#{Vv1U9` -<_M!+{p<rBVqZ1-7d&o00TL;$|j5Nb&?~%Mvu&#l`I)I)H^9(-9``z=#aY-87xV73ma!73ve|1f?K>Q -?D<S-}HH4r0|pFPQrCGPG{Son5P<xB3YoUAP2JpSWe-dN8R1WPuyOs1+x<Y?EnQuPow+yBPrt$SxH*O -y`B4cC%R{r=|@?wr<kKGpB|7Kayp;7p*1-V`irTU<08wVA3@iD{G=I&dTrG!uiHVj2*mFjTqPy}qRL` -4i~ZZNVQoh5-@lLEfz+H{gZL^muvG#TUd5l&d|A*@G)(afhWB%=WH?Z0Vkh|$7#^c{Dku?#1CQVEiOO -J^E#k?iZs!=7i#*~7^9~Ivu(1tm{E-skqKI$1y(R|HIBw-2%|NECx;p?n`cI(Hhu?kIb5Q&7N0Wz`Rh -W-j8wB%@Nj#s7CRd-z<#pK|FE0&F0dIiL@gNXSO|Fs&77~7bo#05qP>UW1D;Qp0BjE$R0s$*5wCG+cu -8RN|BEzGN=H@B|(F~@+(DTwu1thJao0!alb9hB_TEb8#C9K&An$1NhFqQlgrXNb^xh_$LsqoOTd%n!* -nDZogf6=26;C>253_qP^&=#VvK`@fav@uOVS1w@b%E6LsgQPMmbq)p;$`C{a1Rr0eGmt}}SEyTqbQRq -s1{%1Ls^Nw$ZJ7x!fU@okJ+WD|DkrlU@nU>{^U`%FcKGP&GoVqx?!z8@|A_0|De~~~6IEpR_{rYm;qJ -#C)6ZR68Lw_-9BxIZ)ag{;Ze2(?U)-Y53ldegEGDoSmX#7K_wk6*-2E1}>L7vnGTB0;b_BJNjMPtnqZ -j|trK*>fbne+_*BhKppn<d?vtk8b?O926z5RWYe{uhuA_BTD1r!Iu)J3sOY;FJphJ2`)3{Ye04xii~? -(9CY*#Yv*9FOlV?YdMSs(rGaVqZz8A|~LXNxz@HeJMv-Ltyd|wn)$Uu&WPcuVdIPf!_CFaeThcr(Gr6 -OI3!83}9TdJg#oAJEwD2-FmzTPuLUWbx?vkl`RIgT(kj_brxX4;+l49cuv>VoYdX<i#2l&db(H>g1W# -ThoU(%SOcv_qbf$h8+Lhm-R+9Wr_T^zQ|bvL>xzj-z1g<kJUiBP#`c>RM`!BI)PD2)C;et(zd3q&s@^ -O*J$NP9v0X%7MIDf(`%(|zk>0QB-PrF?(f=2jcTmc&Ta!l$;<@pL>gcw<Sa`f@!Q)j69<KzCS3VxEn( -%nlg2!nK9;YpMoC+R)yLb<HR3;wuNI|?X-kf@PY=~N@sHuzpgtP`M0NXy<DGl9Knb=V{R8+fN+<f8xY -cBe>WNBad2h7v55@AT|y`U(g-@`}EE10l>U)ZExFDGIsDe!#Udui*n-{S|?B;ov@wC@5hhCe=E#Ks5l -VgakMi@<tb37d1;!m$ehSC+Y%bvlE8<Z0H$GBDngd0djK1harc<wQ~s`?DBWgmx|&=pjPi5w3msr9$z -FAt+EafLBSD6rga`4k|cS30D$>KnN_lgEhfCv|ueW<bpIqq<<+du>jEL`86s#=#{cA?D%t>&I$OWt_; -E_Xs**>8|NrLUat#YPU?UrbC{D@d?+)dX@IglPd_D!RD-RVwgJC2d-kYFk(QeW{_uKH-I`#H?@j$ku# -SKZ0tNXYLlt&<N5GY;*9QFX^yOXgHMY7IzybTq8o+G}O_)ZO<1+d0C5UQwgiU_B=ysh=bvw>UyVGE+j -g*YYpc!SbK$+tB_a$gH?G?EnqvQPMIQg8+kv_X@Ppnagm)moE%L6TTQRqA$PLru!bp}NXZGeQ&QH7$Y -oJ*Az8s*7r$2|X02230n#vZ+i1VB7Nqe?9a(-+)dMkBPFk4D`xnO}k?8($~n{+$@|AMt5*lBYhfBkrM -@{B(5o;`HSB7h8viJyG7iJHxlpzxda4*i<jnkBhUnC(rA8|NejteKe)EtGL7y*=~-O#M9BUqmzTPUpk -H^PU!t>pJ8&5TIGgb4KC3&GH36&Zrwvv!k;{O(yIq!GSAC|M#5+UD%Q^dmQkMMO&&NrgY3E51lHAMps -EzB0k8-u5bQSVS6or=Pa|fj9(_Hhw`4`5v#yd1exO)S;{}@9#z}RPB$?u$ruG_J3|3Jl`OEt+fFI9qR -n06(retTlia#erkkDH)@iP8B*&BF?mO_V#ZkcqA8xXt)B#R(b&wfuA2w)6<cdcy(t$kw8)+^&6gdv-b -#))jMG5V?Q(Q!;!!5XVg5d0)xf~W#x0H`GNt%?_koNPu(H5q8Dk&HcJf}DZ)3>#T#ZQ{si7BauR%W~^ -ePtjMRuhd;q!yUR}(T|mOKvdyl9<r!5ttBu5wy3n|ebQgeWv1SE>MnljYBql}ScPpE^V@qFgIH!64^? -MT@Y}k-<(d%>GZtV#Aw_2|wCR|HFiomtQtygaiBsKU-VOcX(R)+mUv9hd*zQY>rmBVqdg^J{Fo;sG>B -ta2`!ut3(&0=5F)J>DU+tGhbLy+Z$prTrAN#!!Ohi7x^woPGN$X=5Ggw;c-HwA6vcD<4ac0sx{c)zYG -yA>c3-w+tU7H=8f1jsg?|qZ|yZd1^-V<#*2o#5WiK+`bnrmUU<Es_aajLT)#)n6yn8<tl`f#@kqw2#_ -styiF5f~2*j+q1U(9!Jot`Er9ZUWVb@pApvsTu#i`xSEowf^v_0ho7~nYBlA%7!76(7iH~YdqEk1P0I -kzWX9kOa`#J^XOZko`(SOIC%>OJM1z|za4Y^i$D_KyRuXr7LOkqd~+k3CUe<`jQz!sxp;@_FvL!ec5s -a<Kiz9UplgUY4pBPo!A5nY{5E*I7SWfD{v-<+oWEs<<KfrKcA%$n{EzPUedEQ8!<WYg7l$u`o|KKB?H -a)AgZHC%&yFt6?*_rbVD$R%_2~HUZ->Ws1F}=kIXcRfRm|NsPrH7=^DjJt#}Whlr`zlG?9m#H#CqBJb -?4!CzwQnn{<<^V!T&nZ0|WE}^2guV{q^B@-*qg5s^0JhAO@8<Tiwn8*u8s9ruW7D`um5y?T59TzZspq -d_MgC@orScw<R9ETrbNCC93G?{B-;2)5qU$5A`Y4OY%TBPQ<-FnV9h*YFg$31|1QKWHFD?n}-io*AT~ -n*xr$Qli1cub+*NVMwlwq7`5+*#x`QmF6|{{U%z!`54Y+E`{D)D+~8lJ!76rnWT~2h6{A;)3CA8xb19 -F$a)1!E7;pCihtHB5mikSkQdWO&MVQ8BK)P;O?a10;1WNss4`ygY<b5yt(GrRR<F44LK{s?bW>)(c;I -eY!pvqgVd|aVUlBNdFX?Ps@9i;Et@D-I;qQ;mAOhG<Ji&zSq<Ryr=H*qm7R}f%;SDVL3W?8+n-gJoJu -SHPigebzgoG;6(Zg0&Nyfd+u>1mt~ccWi#0pf?RhG*=PKtdm`$duG)ecJnQcN;C$s8r1GLg{!}1pwi! -zF|k6n*z<w1xilybdpw}8&2Y~QkN6RR?ncH2LR!{m;qj$@8fjGs`+vLrREve@om(Z=lLh?QQ<kElWQi -e4O))Kh_NPteDX+xtRdljG=ek;4HF>!IZr{AFFw)vJ&<3<US$Pe-H(3bz34ZQ=*a)c(ZCp1N@HNPNoe -6=e*PsX{q{pd;ca|+aQ-ve`En_rUW0(Y7BJ+t3fN2d^c+8!mEv1abPK9jBDXohlTrv)%1+vZXbVmNSh -c>s{4`BW2`VK1I6H<RZW~*B6@N-HrVhku@CyDR^AkIDAPvRyO4<57ZZV?HcXxZpdun0DS;MSY)Mq3e( -jj;d=ti!;NebYh1`Lu<2&k{En5Pu}A&BWDbvch`k$4PRZF+kxJ%3`;71jRF=#h=pmpR?|4Zs9xhMc`x -+tY2*8wA!1wE5I-v&rd!fGMKUjfE68S|b!B1DP-gU12@SKFh1|89w>{8A7{(1+Gc8UcOZ_p9fa$85@U -d`Dlx8S^^&=la=tpCUr;oiwSS4n=6y#lL%+<e1FGo^*pIsnykoI7$gwonuoxQ0|e?nIS-H1>9k2ULvQ -FDz2!9H{BhrP5^V8KvFr9N@y(t_$4k$1S+QoOHo*sB)nx*%Bfiqle8D`|?8sO}W7s)JAk%gX_NO)YPv -hh{X9=dClutGpY&BF&IcVmWru$S#HHpY&is}e*&}y1tj3dE`c3yUczcfIY5ZLwg@bqP~#3>E<cI2vdB -2b^Ub!^DkqZJb<O*cAM5jfAmif~e%0iImR%_|3is*NCgOf3vujV<8Lg&>Sgzxi0HrUDx06;r-a8}(&* -lRQUeZ*(ctRJEElwK~JoIf;IVe0|Ftq*e2IH%Gak#nNaFwUJtw@n>3DFHajRm!5E;PMQtzY8qE@C%{# -vq88!&nlC3oVla@NvL1^1XHd$j3yIRHu?-Q_S5cHu6LJlGDlYD`c%dE1$Wk`ws#u)yRZ+fgxE5tv1ob -uaq-5Jal&Van_Rh1{G<mMwpmFLpBkQc!Ir`-TEBE~O{2Cef0^dn((lZk}N-LYr(p2l-ky>=_9HK?!f) -;HR|GK}`TYa>t&eQhnA*fH^nhvmn)2d^&tabXXck~df;8tv{7xReEw~wpx1B}Q}vE|b?qq;Uw<!v_m- -RH+1pl5%-`hM610ncn){E3UNFggV_P(@@0QE5VZ_V?YdqB8WpAx>d<q$n&zZ6X5e6noegvH*2%_&btU -DK~D&RiIkpDY~j2M>l!#DK7FQ)Zt4HMm$3h1?yuZ5N@FZsAj6lj4Iz3=q@vI7O?cu9-eyugD|nITQ>b -`;$lXT8=WP<A}I1u(;a)o>hN4`)>$Lsj^iI6i<uqBS0CUEbVD5p0zh)5T@Nuck8J3-OZfirpB8M)17p -w37q%AuzRMk4ee!0JE@?PBYgqt&IW5?-bx^kkYx%NbxB3#?t%~@jWw%n46Wp($>RQ(YKmyTw3-!?ydH -_hnputXtRc#xC+TZYvA^Lsu4tHl!*w$!mK8$dF&>#a-Eo5yyqfxij%oX~2qrzsMh0s9lHTILoF+dD5Q -+l54f&mjHO=LT-4;b1TiBZ~D#(HlE1C49ZL~Ri*K9v}!lwF%iurRiS<|+amdGb*fbfi4M`+>E2U3P>R -LqVh^ogJI(8n-9aG1#^~r&IKd(_v`vav!Z7c9z4-rBGxkJD95IUSeO#*7M8D5`D>V0rYuqz_@>|R=*C -rXHaPKqc8SL*>HSMA7w%!=4{f2#wDz!*RMfa$BT-@m_C{&UDE;WI$p3Pm&Xw1;rFD-WixcnXQAu}tt( -%A4<iI)SqFd!DtBvvwL9l$#<=LWC=r;WP7;CYjOTM9gZiUtsKIgscqt1(mt3FvszN=*G^K&HW7b6zM_ -of2e<0K${c>Qa-ac?<*B%`UlsV0+$PYE01XyHS|8zawMT;$?ycb|S6u{H)ATb0GRm&A_`PQ&~I)IcUJ -G3dr$;c2#wme)+E^P`6gyo$qvXf;&I+9pN?_h{cIe4!*NcG;88W%|f&N&p2fDUT0$}Lrn#}#VQUE6-M ->(~)vwpi5qd2@rUCOyS{G$-12216AL2xDCJI?cLFV~s#O0mPK@Sm>f^Ke~qIHtQmGA1{f+E`WdXg<h5 -WdS!gDxz<My2#yUxz}x=z#QZ=o?_!Bu;apbpPT&W_U^%_-*KF1hRpDvCJl@cT$#wCgF3g(K1^x49%E1 -Rmd4(q%trE?}y7n+`^Y{i%Z%uatOQL2}9SdJ@Yy|{Hp}j9X^eJ?EKlsYR@_|>zwB&g5%*KYkDuzE#Nw -n~U9DHT@v|H!9nYz~{_x|gPBBeBLU+a?#W;jyao_!zM(p%e9R*9xaUvN)t7Gq4|O~v$9+dv};8Xsvuc -K8vk)w|Rq3cXVW3MlFb-l9#bG8ER-Dj<3|Xt?%seU{J8($+f}XcJS%6TlMOtT$qOHICR7zYp!j<}PXJ -EG>l%@9ws3e%;M>&8;Y|qU*e@f=3!eJI=wCIkOV11y6E01^`>3=X2iRmRXg~@w`er%<vZXS2#;~AySV -1dTKao!T)8>#o3@`!!qoCm+lSp*1fg{XVee#R*O)~x6O>ug6eAaVc=#3)AMa*Pa1jmszbJ5B@r2vIl* -<TakzB5$$=%&3*eSVr|(3)T$U7Rh=Kr2hx$SjQxQFbu^_v$MfdYGOHA6|9tJ2MefcC-1(t6id!ci4NZ -21c+g7e$^*OHc!X(8^tu9j!rqQ8ooGqg0{WVTl|3zEGJgFF?|H-vtsCG<MI@Vf7uDV0BeJbp^7HpycH -%o4KFwrbvJCUt<-n_PnPE(mIiojWs;43FjbgvCNMA~W7S@rrO;j|JSmAj0PkA`XNyi5WY@M-W!ruCM; -6Bn-rTFa5O0gmAKtOyGDHb$QVp$_jG8rNU?=DIDLHAFmfC@Wc6m{W>8MsTrF#U?$mT+SW$hbB^_iP^7 ->mBdGahGBfO7tkiSHKo>LDX-UD<WJIy{~Ydc7hN0KT9QqY{k$BUA0GZZIzPPlcGdgO=@&p{WO3md_y& -wMhGdBA=Q{q<rOxj34DH$6LxZrNzdiG$4mK18*oN0GwCSv^NN`v~&<OP+2yOk|9G<*bF;alBZikqX*M -^0ClfRcWx8eYzP69iw&=C~Ce6=@Z=2-9EfEhs`NUXLZ;y4wL(kdzZyI&NZq#`MR9CFd1`Z+0dgIi@Al -ly}hn!hi54DOZ!)M06*U7MP8@Hm1FBE)Bx?#U;?Xt{L+7z_sQ>E!qjLoLE=#dGUO8B-RqlsHYQIGvZ6 -XKsmOsW7+o^=Jm)GY+$fQCd{cJ`^+b@T!>fj0Q)n3@P`sq++PuUf-x|zbm_ZgU@&&N~pX5=&JIvq=WZ -pBBB2pZ?um_<vf>^TU~X)+(EsV!p>Xa@7rVLBUBC{hh@<7LItr`P@N$5Apq0l^L6}>yuecUJ<afYpdc -F-u$W<Dz@Llw%Shse5YA*52!b$jJ&m~7hz~`m;)t?PRhTeRbBBiO|NEVev&xO*6`KSGe5*WVO3N2Qh? -Zp{ij?=JV;S<<gBUpUrS*uC`!IbrT03^~CyyTK(ku?>go&kH1qdK=Qk!g|K2=2N)Gj#-m89t8UQw~2* -rClYl@-{*8EMTfyveyOF@h{^5R{kAs-wdw?ih7seX1akb`80)uTmIU<LF=ES2RuDr3yZ!EAq#D=@hI7 -&@Vd+mE|Gy3#*l4baPV$yx<q?SM1lqH5IHyFQk@TO&iwD5k(3$I3K$}QTEkP<&n5I?9`QIN1_*IZHHP -oRS;*!Q*FybnWD7j>W=<UGXntd&wo>0BUOf3QOpNNnNfh3DYHd(bkh7xf~-<_Qp|ogmHM2%qb^K82Q~ -Wuc7l)E403w1sX}Q~V1DD8Z4E9!FR(ZsEEOodR<~W%W?us{`5C-ac(x&>vx}LCSrz*_1DT7Uv0yAPs= -AA;dfvAhv6wIhdG_TW<xls+y)wF2pyA}+=9eESIx`_M8qt<N8o@WjVl?XO5$vaIDKJk-0T)X4*REL!i -w9EHxo0?XPc-FJz8DERtdQ_2y%Uy+=xfiOUne#bZO}#$iNm*(e+M6@EazUS%ffG`#LOu%^GZm57G1)( -&+D`=k;%E8G9n-BMHZ)a3X$kwv_%nh>>_#<?%4$9_Pid+ni;!&cgoBHWwcbXXY<}bF%nqzY-X!V{o7I -+DT^fc_9H4pDsh~O(!lQty^qEX{lB`0?`AnPlt2kj>BcgKu^<QaM)|vhV%yhA81_{%43+C(zf&&Z%M8 -TIq@2Wyq|;z!F}4OfY&|7?q&V=dk4a!@@SLb+=v=SksOd0tW-7Mk+Yl@ak0=kDYztik8%Q}}E3I`yb$ -Irb&CIgpS2j{-dRy5@y}>z++)W);_aPVuQ``-W852%Jr<$0ga=k@T;0&BWjme{d4;@OfiAy9h5^`FEf -Tlq%s~N*bj2&R)(OfkGdW%BQJkROwwqxX}Tk%@JfEJ-e$r&{}AN%$qRkvs;aVY2>b5JPol?^^@IUC80 -ShH@@e~8fB=`?8bn<o>4!<$nXaUjS^lMT+9Q=OZ2#gW^c=h!@M8X5h@nKehx1Q<wA*EE`6Llo<y6hen -H=(V6z8^qC@tdUr19<~mt7#t=<Dqp+a=}uAwqH{*)Dwg)E6L?@~KD<hB6W{jn{0z<ElIzZi5vqyKgv0 -mKmkUX8ZA$xh=Qpa1tx~vJ#sCA@o7>c8bdi*m+WamhSs>_Hl8J<`UVND()K|$<r}Od_GC&46%)M=lPn -tys=g*Ih^n}zs!&W%L-xdE+5%DvLXKsFK+mECiG>Ev@kGhs2$H+`*EWe&_Wa-v6ANA$oE`gglwjg{Cw -B#BUuT%;zV~l+RBM1L5^g6r<LaEZz>efFUqwKiZGO=3&AO%IQ;gCb>(i=JJlsw2bsNk(dA|XWjqm%!| -NS|a?lDms<vlL4oQk{ltjK&yzpn*Xets7jkpC;3yddRYvH16J{OXp^?nRVzKZ~sKPlmU&(lk*hE6T<9 -6oWg|CN`|Oh^1L8<cg1q~lxfZQE;h^|Q=wQg@uw?PUq*ib=|u+=YDJ~v@ky~BO3!1jc?MyynkQZ?@sz -&^3kEV6;ee-QN(p->Nf%1>c~k@Lg(d+gJb{j}Qs4%+-5X;%pVMa2z`L!CQRe2_IP&IIWMiM2VQBVrqV -_AJdOwl`&+AFZfjB5@ZmzZ@R<C^>v5X=97ug}$4<)qYa*}EVdNPL&7`<6*)5Vdta$T<_o=G>M#q~#)^ -KbVllj2j$R_+P7K_eEP=3)^{ScYp3#UV*7hRM-%`X4^+C6U^kEjs$(ns_B7+%L&(&sMSzd$Mi4IXirL -^qvyI>5_a3Cgl+}fBmpMqzrnXT|4d&3bK^jgMu~L7`C|&$ac9<&v0~TuP@743c<piO91RvLDSc70=kV -e<=g~Mju2^yH!~*=l?KV41*<hRh}aPY)m0YLUdF<kd4Y#Uqn6-Qn;dCyoRBA$oSWQNDb#dU@&=+HoAZ -A3!5Tcwp-HZtv!trUq7G~rK#YMd+G0;?)s};_onCF6i*!Q4)|$M5p<}>$<!5&+FB>6N81AlBLv5C=Rm -S@40!nTgDb8@e_cUY%EN6vs`r-hzXTy|2*PfBO2PE0|O}W0cwWZnA!`+oF*|lePtZk3BaT2=zq}E5Kt -(9y%#Ymw>^zq|1Q`JXTO}8Sh-J6zZY}Z%)`?!Znf)-qB#x($aNatqD`>?I6?|r0%e|Cd(Z*}|OlSh<K -wsUXiN&f2&w#qO<c^3)l!^hvX1lefkb&L2G<fCa<{<g(}LVZDsS;_VIQXRTRn^VEjcyv6V+A^9K)25T -(_S|3^$9`l)T+rlV=HT+K+bFyr>_>ID1`rwRph}Xi*BM2r*CN_9SvyFwVey><=dZbexONfT8C}y&&?c -bNh49cCyLDr3W69&`8mj;KZ^w+FZGD}=Uk88vuVd)-F>o)}+Mw+J_Bk`ZBOd)xJUD67zl#}dQv^y+-h -ROSbgl0J(eExsMgaS(ufSMxBrhWF$ZA>%$eper>{3kwwGh7_47Yc8cAnOw0hD0N$02$lJrvb2SOBH+9 -R)GtQ*wI)YqZarE8vtC6!;=>Ray8b35B^sgDe6%67H3Bv$d9FM3L4A=(86y2`CDwlq_?6Yk;Gmon>@2 -El7S&s(ntZLaCxbG%xZA4so}~d3Zp*4jahEDam8*T^Ow741%pI57H_Dj_&A`L8A#(*L<6_h(Ewwq7nB -3snc8A-?>OI=V|HNof(Sjr2b~fk@)J-RsI0{e4NbEEHje0@u1iS0M#b?oOgDI{#5;%84BoE4!Bf-j>$ -KBoIN+bP=C44Vje3Jvc<5zS)|a<n1jwaiI=hGzY(5Wp*XZBNiv-$C54$T(Z0(eb+76?=e%x!94A-C=I -X=ZvDmk%sAf<8d8JKIK|j|ZOiRC2pSiGS8C_(9_>(H)kB8LTE%@JqXltMT{WaUNK+r8<&;HYP(*bMDr -6sh+ECTl{DZleRK)%ZzRzxFfBvO=Kq&;ohAo;2jVa$0&YWQFuAMhwX;QJEh#`KP|?VutU7gJ7c&b#EB -_zNcu>xd};Er4`-FwHIdppiq12r)~TfH<W(B7J?0XXb`IX}x{A#^7r=Y8kQSy*hY|scmG2E%AYj{x@# -b0V~wno3-vt^L~w2p3t9wHfQ*<N{DOrj^x`@u^|R?EXx)zX)`aZe{Y8EAYKB%j+x%ijx4N!{bj$FpF= -={2>?58dOsUDMhctc%dF~R(gMV{wFxH;V8>7LXEGzLP-Rt0derdI)4k#2Cm$^oq!jy?G-WEc(Fi0B?2 -O~7*6mFs`1UYRg5e*I&hkpIu2{v}*#pJ>W1F6dmBe3F_h$#IJ^g4GVh`224D@;U#3?hg%M73F4R;?oW -yC2}7utQaH+<*<Qr@V#)Wav7hTAGttF~8`t0}${Pt&nv=N>-(?xXeIaFtVo1!eYjq1>wBS~~T1pFG~% -{eE@5nOpDs@Ae+<e!sGw;eo2g1FG#keE8i*zo0ms>VglUjYp4-g0+EG(16!_j~l4O;F_l(bp7o+@-`B -KpcX^eq6i!e<ds`Cic7XdQ%u&8%wr6&n9eEr1+cj*>nNh0yZz`u`3a-ot*E=rL(7<Waq_Yb&T#*NUZ5 -j|__az;^2ubmNPz=VkagMWmf6zCzQ?|>lSEy9l6xzZi<N8(j}%Pixy!=5{jnLHW70qJ<h@F+soFfI_| ->2uB%GQPAhWi>fK>E>z`!UC{QS+q*}22g_}1XVr%xP96gk{SUR+@(I`pH!(NtreEA6eUs10uxQXrmax -ckwUl<<QGm$cbfwWx+vwK#_Qh&obR+V3K4N#}L=9u-_j;Svz)B%F|BiB})s(n_fX){^IQ!vE1zx3eg& -JACfZ(}#PHzJKf%gh_SoMBx1p`Pw%c>}#Obsys`s^UtUeOqba-&MIC}DlC9nl&MLJLQ820Z(SwE*h2J -rD^MR;&}y?=o*424d!C@h$u|1n;bMKlqiI;SMKq=$A)hy5A(bECaS;5g-nar9MgnUWoa7P;3s3T+J!W -`FWKs!1?P#6&QNcUHmP9hBI`KWcXst%~d2b&miI0RmRlVlY`bl8Z&}-9el`gRMqU~BF3Jm6e8IjzTQo -|*#`z_gh@AzSO#F#I0jQ>tfAVs3GWV5PKyZ*y$;tD2ppJ$4w3G@33D7nc)AYo^M?TDiG<EfX`rJmeIo -5UHNX?=z<q+tC>mI_$89828RJc_3vhyj%Y5ip?pI=(?Uhz`7m(QD8R1P*4kVb7?_?5Vu1(|7O5li?u3 -3<Tb#4zXbCE1NfHi{h(v_?nd$Hi`5F6fZ$CTHzQl7#vi_LfFD)w98E@ViD?TZje?8kL6aW)To<uKCjy -)JQVzggXpYwu0)fd3V+QGvCi$S+D2(kniX8f(RHqJb>S1(<W*(vt1=-b?bwz_AtU5aNM}*ntOM1zn9% -*j_ZoC<<Kf`M;+2YBn`KMnn)Mn}Mafs$xHQ$i>-&I3h*$*|yP;h+w1>g@>G8qY(fLT;tn3BaHv=ts4$ -)r4@iLuPm^Hv+G4;%=_bpTZhG!Z!At@|Oq2QEMpR)W$9?_CF5ki8+<zLC|O;dDT6<N-{Z58ISHAl7rr -WsW|+Dc1kpVLCulO)^a`P(;dPR}k5UxYSI5HUZc3!B53e8INosW4*7xrfTsH@}V4i8e>jp*0Oj;ElE% -I$I|Dg@WKal>-2yl7BJGO;HHa+WeLdC+JFoLc~6mSh**<n;XJ*iA=4*HHeHvf9A8qM)5YY_+~5N#~kO -JWg@z>*mlXZML-D8k0pw|Ow<GrTUM7r$fbtSHaVIn&Qm27&&3dx`~}TIxM83OnK90nV?N-iEK3I6dqw -73L}=6~b*X@frG=(++#j>6NN7f7e6409Okr4g5L%RBUT-j8#p?YbbZjqo5!jk}z1l|t&G{CLuUQWW%3 -Tk#b*#m64P{y;V=-S+aQi~JA2lAty~BiNoXm0pEDNR=I0dQTo+^#(Pf5duUfilEY0pJl!P1qd$vj-ZK -=C=_6+nmx(LM2XSuLL})X0UrAJ<h2@Z-k$#gC)G?+*V@RN?D5#B^&<FldMZ`sb?qk9W-8*;l7M3c9<f -;BB}bhzG0oZ1eKJS`6##g9`~+vue?2Eob{6LQRu$Qlw+LG+~aX=^fC-5-8SNeU963QvOZ5<$-zfLr1K -oad`!LVzfz%D@jpNarT#5#v;RJSB(fsZm2}q1<WJ0E{~XP-m|#B$l<Qjka-~{AP%(%-Ye?{?$c;DiOP -1oH=H!wQ+dfqf)rgw%hDM#ecqfan0WKNzJtzobzI-PbF)tdX8J8KlZuf-iQtvmYXc1gZ!cbMKb0#bQ% -pD;fwVD6Y?qYEvPf&SoV9NPBU$L^uw0$KUn5atCIE4C5cd)o8mEJlH)t-=GIBxb5@X!dQ_aWh7zS}rC -K&0aJ1#oEP9K;~3EdC>&#&3X2fbgj4juGa2TKe<^3wScBh7mRof;;chf>u61-j@CdzADdblMIArQ|iD -Q<!l=g2YXN36;0-DjANG#O%4n`~oneq{@>cd52vpI;QcPEbrO;Hqt8pQjU?K9}+JO-m1YL--;gs&_Y} -Q8!;)VgNe?M&Z6PYlSfY?nARO0Xo?fa@NeiKou1ZM7__=?d2^6&rZH01Xq&b6b>HkE*L1z_$zLr?(x} -BVV2i)FpM(QwptVVkt1%;RDYtiEH22J5x;KsPmHYQfjG%Zgl3>q$$Frq3(3jO%x3RX0O|?>Wpi5~NR@ -Qt;$djne5ZEs#t;oOwGv_Q0iKIBt-V3<UnG%qo#xQlxBKF+4Kr^O@+pu;JBh*n~@pNJJ^deX@`><s8j -p=iRr6xy@dPxHK0sUfWngTAGCFPO;6=@2;Wj%IA-Cl#G6WdFN4o|Zx7@S)<%b*m(a8SP4r8t*+{D8u{ -V5;5+3fy*NUUT62&>R(4^@LKV{{wx1&{u?s5m}zavnkGsc#1jDR8f@aB47d2x#avt=;NfqV=f#v%x^3 -fy7JQinT!J{`4S_Ykrj;&8h_Z2hJ)RQNStEEQEVAk8Ez6~eYw>ErkHV3vtnW6ihp;PxTq@Fc3{Keix9 --r96+A8n5@a(z$y3+(JC;0Y@rw!4p+^`YOM@MlXh0L#8MEno5X>3NjXMi*n-8>jlqnzN_$4EF}LxlNs -eVA=JsSyp_SUzoIpDQ^539L-K4qVC)Hk>$bvDb0xHO(mq&-kFV6jCqNun5EqZO9MSD7J5W!VQw!5FT< -Fd{Gh1zf2m}R&=D#tfZ$E)MyuQK!eZ?o%&4q=!Lf+9Z9R0qn4W`+3{I;~ekHwmIvOYGzQ&rlp?vYo-u -UL&?0UaSB+!!C}TeG#zk1KDa!+{h>Gk3eo`9prX=<U~faG4v!HYc%n`3;9KLh8#kxwK&~$;o@%Q_qDn -<T&rutVAt$}0U?cs<BRrFi&chd+QZx%vv_&OH@&&G={wq_J$OM&q|0MFs|k&}d2|`<i})ngavn=;K0D -jQeLG873j&ERo==v%k)jySsM;ri0T5QOI^UPLwma4RA9>mJq~}z|I2fVdYafg_O+Jt|#YjNk!{N$T9( -}Z!P^}d!mvO`Ew#BZBB9ObZxNbkpHcVRzBkOql&<zAuAThKx1xv>Wwn_;#Rz26>C+S)%qK=;iH=zt|D -7M-vreSF_jD}x_j{?w&kt(zvN;LJ#bcYvCy1%CjF&CDWy|8(9hfTBl?Grm}IDJ$Yf56^-;cF#d9KP_u --90}J=yrIw)9>^?t{MV<@?mdp_hVn$`!K{`Z9_3^A@ns45!M-#VH2^7A&6sF21d%g+qkaHo#FQD8<8@ -K<Y?cIhHgnw-uQ=`@02bPaQd9+2UX#IwCe@L;Is$A+rmk>Il$3fjt)3t$U0rAht6C^T;E+jcQS2%6SX -;8E|Z!?WUH<;()Opu-HBP`ntj<neo-W!(|l=NGP43}xaRK$>ioJJMTTC5qL;}FDU_l|6{V5QxDGJHh8 -{;5YKF}bC|ALjTkS{~41fIwFk9mv--u|QO-g4#M}7PH+2L7Z1^hIgn&C&Ojvg$n-E{*auW?`RFwAVok -6Po5G0k@vj(yF_^yqX;+Ed_I3*Cf4)~Q0%X#%ZYPqk+Fp0bZt4>Wp=LXQHg`USzosFzT7uEHIu<qJ!d -EtcVR>CLYQbUaF89yc$zxfdnvOOlLBNPiB1U8AGM@YM%e{fI8MIJ}M0`Yspf1BKUls0f<T>&xY+<f#~ -?l_m2hgV{i}@buv$(DQzz>~?p)6i=<LybbRhfwM1-m8nsM4B%Jy4M$ZyAgm0uL{V1C;o0G<x1bcVUSL -!wLr6<~(Kd`4=q<gf!8*9CQL((eUZ>*uFRz`7^X$_)6^~DTb}CM;)<X69PcEwC`C2VLJ9b;VO#Rr+p_ -(s`UY@$cQ#+e9R91GP`pC<imgMs~bkLQ~_7(DdjZ2-UTdV>bb#9AbQtb;iAdn+CWymm+WoMiL;u0kd^ -q!3imCmB{Qeuync=%&Q@|VwM^qSL*(a9<@vz@4$<<WIHD|-m{Vbn$QF#T5GisTahqogl<h1>v#CIQN; -Om56MpqSC^dOUoUOgrN2+qezYz$$T$?2}QIkAMKqfDuV&SzaU~48u{nm>7tZpVCDc@%=z_V3EMMvgpm -@qh>@@)V9*__7yCMh0c@D30@l>x)lM79ptwt_A#^N<4F{EV?>5$XAKmtF`C*8Fz8|qSDMlvVNQD#ck@ -SVh2gIO3Qxfnm~UmO{I1FAom?t-qrp>Z>7NQ>9NF=t1r$5fQwactr#hGph{IIaNm12s)rXNP4z+>Vp? -Zsg?9=Tr9=WKf2=yslJ?=^o^SXFw9#`<)Dc(A9Dn-c?K$39<qY8+v&IEKp>0>Tq%oV2IYgc{fuNo!RL -(s&xZ)LvmfLJdBkeV`*a3)Q>K)K(+Xh71UJeQc?^uwY6>75ia)~-A;7m+;Dfx>-gO##C#{YbY3G^#-A -MH0w2dJ38!5=wVTc@B#NDYIvCwCFb+f~`UH8}@$-88o}fL|erc44;W3<r-zN484ay_2a7^1gIZv#and -Ag4E4OU3M^vny@&d6SQ(el_o0WVV2y;J0K-Y-zuc8o6GU|nUOW&2@TMU1Ll^o5?1kVGN;r*N=DSjL&p -?7T#~7kY#6?(cCil<eAk30_f4irg_&S7bXTlL&$xvGvYT$VB>J+@vT(v(k@Ht^HaERFp>qX2Z@touz% -j_(Frx4zQ*Bl46!DFtPx$ffsDcW-0;9)s$+OdOT+-y8G5)b%jO5KfI~dcyQ;hMjEvByz==%+RzZrM_{ -Q*n*Vf$n_JpI{db{`??nE!b>Ky_(Av{81QK#A(3V+CYDI#^QW^&@{&p;m8lybc5U;rAn5U~HGD6GV^a -RW`~O5|^lN)N>3r^gQ`e)m7~{GX4Rm4!z2mXK8G%;*!)qm4jN6WCX@WT#uEh$Mt+C=NS(eh3N|bvqnR -KwCJRvk5<STox~&B*ApC%OG=!=p&V70NpP`kg~{B^%Prr`qsyZVBWLQwBi31^Y_^SFSqxq6+5E+<uXe -k30QH_I-%Jpu0N4)378Q+OCOAusYlr7ZeCAIRqLwk*p&6ox=S9T@l!zgcmDz@AkuaJe(zfQHIr&4oWu -s*|1uFj2PDH};;i}1DwZIlYarkP9cEtdiqHq1fBW2v7LU+|U?L|vscFB@Qc6AL>#p_Zp<I*`~brPP9F -zQL&0t306$206J={5rB3NOx&lO*HJ(H0Q<+_b^!-1OPhnOfb%rb@oCqM|aXXZbYIDXs*J5lnRwPp*_( -oRrP|B*#7`cFMz2UyA^BEt%Fc=NYWLEv^V!RcUaFQt}(R$0RM~n4<#6?e@I$Xm@W7ZJ)34a=K_U5>>? -*;Ly?YIJs0ouh^N2RYWIwiTbp~ZZf*$CK6@336n^x(YNNnCPTKoYseVU2*6xG>U2e*v>J--5H-yRenp -4z6TWm|v~M&{`e-u-EFz*GKTC)h#>(=*$B#umC~A6=rtVD5DC*R#AyBPO5!A;zmbsd@#z5dML@{WG2h -bXGl>ZYuf3{b)_C)Y<ZS!#Za#~(_(of?;XGAzNZa_%1Q{9@cY3ly0Oa9N2d45Ai4l-@jVH#9o*jNIp& -nbf{S+OO)1a9|+b!t;9I0S_+`;&;QFW;-YpX76%)xPHF)xtWPKw2!v^K^om-2Wv?9VH?xmy4w6Y#SJ` -%O)nPWm6dpB}IVG1Q3wPe=iYhs5`c6qJ|h#4D575H;a`%ja$yLRQts>u!A}(0O`u7Zw^mJuMaPNl56y -;`*_I$TA-ClPV*)AGOt4xs3B5btuX1TA!r``Ue(UT?%C916K!-e2WVDLpxGjsp&mpzB2f8>@$}_$oX& -Az1m2i7E)w;03<2pKE_S0=R3R9%gXU95tzBVffhB}zh5KiR&ri=@a6shy_dngl#jFfjH7qNJp}_aG`i -@h!kaz(qbb+~6Vp9K#d{Lx0={7-HObT(fmMR)YP(LpA?r%{yEfWH}qM`3H5DW?@2C>*s_O|p74+^l6I -Z)PT^lLWlHx7i^?^{g}2#?wC>7oUJ@$b7^ZPmw6eYdf`m<eL+hpw*&y<b}^brx?ke}x6=Ml22%C^eO8 -1vKGt6B-7ya{DmcgoeSY?hk`Kj{mx^XEJB<EHNO#HAzdcx>R}x%J`Q<859ShCW0_{WA+?q&hW(ccr?I -sU^rtGJA<+gkefBTWsJX5f8CBWLs+{TArKui&53O4`pR3Q6)TWpBIiq2z*!LsCwra}sk+1`JHTaJgUe -?0GDTS&FKE!tdtWwB+};ePhJC;{<{Gp`a4dm+SEp<kvq*DyUp~2n=>oZ9CN2iV-K{Dg6tKYc;q+2l#T -xZr^`V#(BfkH$LMv<(_vI83aTe2?x$zkLi&tAj=B}23`_c1ysnU~Pix7R6j?$=F(!T0>Sp3v^j;x+K5 -_^Z3Enf@bq;W(BNZiW_vfs<)e16;UeB$@WIoaFq2tj<>uW5yiz{(|Y&-Xu5bz}nRD-c_!u<fJ<K>Zbq -0SoDDI7ENW5*y_$5rW6bCB;9UpqB_QDyJG*{7qhKF98ho`9H7%!q-=L=3L^!d>VXR$`mvS!+QlKaF90 -aCVYagCoVws&gB2=YbXC-{{xdROUgdn2x*+F&o}C$4O_Efw!a^Z&gq*sf(k=pEJbRy`yS*+6~}|~fO4 -x%yeOng*0=^0L_G#JPOS$ER7YaxIaJZC-W!3HVY-a-jn(w#&(RVj#&QB$V~WZdpE0zk7OFubCq|QE(V -|3HqKBzZ@ZI&`so?+j=WzA7uQlGm@tgg=?(nG*;xp#&TgTIt#qK<$@HtT0gW5UeM)}u{``w2<z#e>~? -ezlHZ|t!393Ko`!9OoeyR(uej;NN%69?)TilvDVmj13lBMb;H=lX<5Ywp%=Zm#u!DAL@sx|-D&gVZpR -C!Xk9l%dJSVTBR}b4>=}4A{|Wz*H(yx6wnCz1I@A+U#n!$QG{evsF*-q8Z_ZfZ#kw)Blma*m%0Ezy9H -}l&XbefZFtDunbT6`d`g62J0{l7)g)NYsRo19{?EZuz_{-keV<?&;GvqrpUkC)~EfplY%e78cq(s?+& -28!z)~3uzt0T)weN@u5gY%9=e41>&n&RuW6=KXHmC{Rra#lj1J~=t+yz{Ia<>VgDl?3WU|%z1Rhn^gp -88$9{nN1L7xD-f=pd}_B)iuKe{yPL;gNp*MNz{24uZ=xJGE1Qk8%InE{2xvTvU;C_Alk*xfVIu+wZhu -EZEwcCG@;O65Uxlo2OMwwa`=n;fP#OG~oKaQ-=QV=XL>&&JK#zf=2Q8qJx@&p56LNzeY3=w^94a7K0V -_Bgt4=AXMC?e+raMfGWwQ`S+GFEN<va-q+9bvC|j-<XF{uqbRzPF}6i_IP)Pn6=74V*_uwbYP%}nJtz -5-`k&CvhlT#PYu&b(AV=!dF|(Ot!HzAbGcgDPAV(>v7ggdr(bhJW#Zn%C;7@#6Wtl<D>)*vamPgSk}i -_iZV>(G=j4`8e)0SV8Qhd0#R@v6Pbf-CZDs<aa8P+x=S<K5F+nzn37mML&^}8bI4rMud5ja+8T~rP05 -yy4D&L->byB+v8zWJ(R{NZOR1cz)-OqBp^7l7p=c@l~86&~s9*4A{@j{b|4Oa1P@zV0=vJ5a9BmTT{1 -F_vDI6Sd(v~j#^=oHk%oyuKFY@QNvrc{?IT90bNo|=|;$0JHZ)9r=Ho)78w@cAabxk;iMOh<q=>M@3k -t1<VN1=WUaO+K5Z{||*IVownA1aj<iq0eSiB6VZ8Zm#lqpmXL85oyPoB#JEb?NbCVQqF=2({n_#VXu$ -S#872MkVByvMAHk;k96mQa%<3{ucmG3s|o6()nh5?yS78ej9;d#?rf9F3p>Ds#4B8%;|UAO>qq9WNX6 -R4xyxtdc{#Ym<gpkJ2^k21;#iZ53WT&l^h>@(zGiccX?l5U<#iDRw@SmAQ@I`80tCDwlU95%Z|&aGDL -MG?-41aC|4qhcD=HVsB)v@e5|DCYuoMx8q4AOC9hV>O>{dXXcj)kK$mxQY1pAN#q*l60?NyE!ah)8k> -&W~e$6o{fvt>Hhq2Z{kjJs?WO+AL1@dQQksm@_Si67`<NX5GXjG|e<3<!BJF7x@a;;52bRhAG1F`4sR -&`YbkGJj$AuU>MdTK#HTeC`|Xl&dirw5J8M)0LMsv#d+Yw}H%17iyQuq90keasA@+a2A%6{HD*6S3_7 -EqpW$sU8r@U2-7*-3;Vg*QEG|Rh}WAGG%<S%8z=USR&0S^=lH#E=kS0rs1PfoqQpikZ?ExISs9gAF-P -eK?IE9kHZ}8Ab{E43J%^p7Ll|^=`oPt7hYs1w<EkK!Pt^fOg1}GsaK@?{s2T7eHfs>CQ_3_+j#+Mcpc -&!6&2#0lx~7<K3<}yES#I<=u<&YdJ~}!-JABo};%?Z1jE`Qr1`K%CH(^eb&%wxuo_{$xUf1<9iiD4L6 -MW%kMy%UcTb6jyVsW)7{<3er`apj^1_L2cbU;piNe%OzB5|$_R1l`bR<!@yD<FqW=7n4HW6X$;-x>tN -daHE5WZz$QVMBj>*zxF!WGKfg#%sMvvxmFl!xqnP;@dLX@ykjVB(a+J8XLm)KkNhs6hD5)Y93`!wn=6 -$j?O}4=HzJ$*Tp-!EtRe7#C~m<sFup+g=_UOrVy4Ok_kTX7OvUI^Pk$fXWp^)>pnYfL(sft&2<~{sgP -0L;Gi#C_5+ly8}<Z@1q#apq(N^Z7}&d!_gYSCu`k{`P8?}40eIjQnz@B$Mj_PF<N~=6t}|W&L<Rk?p; -+N;{qb`u?)d$ZJd`Fo#Yg@=$WvyetX1y}qEcVYt}SjH>rVIxSdFGijCM0caei?FquDivx(7?w<~3~9R -648=8SfmM_{@sM9q>^}Euj|TGb?5WKC`dJ$D8}m9ezJvj<wsXFo)*7Hh#eY4Vyb<WZVQcKwr(>u<*7& -x3Xm6#LD=!xpI@GfPy1QjFhAp=Vh{wW+69#7N#~sZ&p0_&M(!?e$MrMi_J~*WyNM60Yf)N$<o}Xy~R~ -XIjF8Bva>Y3z{bS#!@JA{M-<4S-{xhsJ>S|!i=L&)Evv<niY|(Lx|}o}s@V1g{Wze(dJ`_a3Q$qOfw< -UJqH8j$9$u!N?r%j~fkY5gt#hyZ>%EfVX4~to#t7G1b0k=gC}wVTTpBHS)P|`6$Mfi!l{r#JfPl>|40 -pH(oqN;%y=kXG+HyZem(?ohd!*fKLp?0q*qD*c%;dgnOv!Zn-p(%n6X8F5`k&^$-J=lpgLysyjU2vpE -ymvau=nJn(ej4hthN6=h*1Bs=Z2DK@_o`yr`H6mjZ!Ue7%ZlJUblbj^u4WRT}r}`GVS0+PF}wau4e=* -0=d;NBe@o&B0*a*2-*A0KFCvjYS@>mqzIUo4yIGje&n2@sK?hFIwj6-b#_SC#MIT<im^#d<PPIL&hfk -mdka`qlR?<dV}e=B<kN2FfzOLNNh_zIAh}<U6NvxgTNR@~5^P8mf%tQtQnm|=i<e17zURMb5HwW8^I? -!=z-b?dYY#}eAyZzV)29hc_9vVxHs!^WD;<1Y4D|vLwuaw${v6o$789e(!U9d!zOgVaW=qPGSx2j4qv -+%ca~oNh*;V_jBk4*feCsD50+TJl1f<ZfQ;U7AHSUh)Btr~8WE{vo#r9$os9@M^k`w2Eo47z{ZTqB6J -sjYdZf9Al%au4&^@yigS%JFK5Z(L*ruv?cn(&U{_1y!&8qcO^3KC>}JnQcE=@1&}XixQhD$c3Cc?Cc2 -iKk>cL}e<!PR98Z7CWsVRPn_YZ%*aFPqw4x$+{#S4jZt)Usnkn>-l{`<Q6Sma=TN58OjNtm5Haxwyp@ -a)p%!E_brBO6K?A<n1x>5%eNT@(9GF7Te}yp?k*-5!Uc^ojUsM;vAT9Xq}RqJP<NV3hHurb>S)W9ekG -Z*dl6^Ti3>9~qnXmz<2cr?O`+%<ACy375R97=IKNlt76K1;JjdHwA4l6(3P;8XP=o_HaON%>P{0EX?? -qC^o^pV?4mQ!iHq7R_YJL7APgS=sLF%#|3w_g@R+(4hr^OI0f$$$|NP_Vmydf~fAblTP3sY?;XiCI!7 -Wr>d)t7gi*hD6BBDGld4GzD}E<-99Q_5Q{iyTd~2p>6FQ?ZtuvuC-)YA_l*H_B-iy-TwxUQ<=}eo(_} -+*#~UR?GUj3E8XMC@@>am}5nu@Drs)k#hbnNlB$8F6{H2ckr5v;Dv9#^=(fresm0JHvQz7l+uVU(zgS -dsGm;o|5dlfn{J95yyZwTdvBGRnQ+#*zKTthdQ7zaY!5pug=#-O6H}X}*7nk|RlSA?)!*W!Q+p=aPC7 -1xP`uH=Xg9?k)kT{^IOye12~a0hJfG`O)z#I0X8?+o)D5tJL#|}SKXIi}9UM@Cm)zvVC+DPEYc~@2ri -${L3}b)OX?Qx340WkoJzQWYGI9_toz&=4Q#H8+hKQ%HCCK^M8SBU!ieA#0PgS>W$^E$+5%`Kh*tmBb_ -KbYM;yGU^7r)q;Gs!4F3KP~>cu1HXp>Xi#s?e@5A&H<4c4HrKI>sp}=GmuOH&Ohc?9bz3;>eczsEjX@ -hWKJe>6LLrTDe+7VP(?a$-mpNBTsKeFLF8Tt43&4Elp(l=*NQIKd5L;b4hWvEXV@{wt&oEc0w4nfWqk -@HTZo_9%c=s#Rtz4bOr;Kk4lg^FroP$U@1&~wLg!q$J029_o8@Ui*si2f`Qw)G0zjceqCTGy|(mvs_( -32VQd`QG0NEV0WWYU3>O2EZ+Li2%hVcI$k@g33XrYGS>T6)fJ5P>X)s$=cyeX1`G&$OlnqaJTPzu+q8 -XvAevF0<_jJ8`71UOv5wby-VRLWdb8unbyucM3@0jH28|F11S57Z$GVz*sT7oN!SLE}woQum&bfjFM% -p<(CRA^&-juP*+E(=O;XTpOQiyRpKc%EohT-(iR^A5!=adfhflNIj+x8Yqtu;(pf5Rv<};ds^M<zs@Q -l_b{(NM6NlV42M^SIBRA*z1FgHKe@4G1H_a+B@QGl62L?mX+)0@9WXxL&|^JJUQyBT-Hv3mMl~l9JaQ -`#Viqb-S|^NC(gYFRWM+{RWC<aaU{T6S%$Lcw%wu7-poi$Bk8za->dl18Yd(5`qAIKs~Csb=d{Q(G*C -6Miy*5Ah>kv+2(t(@V-55QXfzVkL)64c26)YuZjbyC%t@>c-5PA)z_aI%TsxCpm%*+(YIkL-hGr~_>5 -lx9{A`K+DZb?JF^k`=U}>mGtJ-9_E|M7qYQk!LJ0U1O+UBbZte;a%B$h=3koY(uuB(}_Y6v>Wl4*v<x -}e(eiuPb*NLt66ng(c`qdkKRnkH&yxeL*e{eHyLZ4QKvYJm!BZ>2l87&YIm*`tcxUOy6tnZ*2F;tz^V -!6)%f9FG45EPItL&h#c1<uuW9gKs^sjB9IWvD-9nTp(4DQ$!g_s0S62x*`J&@BL1Flc)!OSO;WFvQMW -2r<nE(+9m~wnGn>D4x;j!{6Ci<1I#c@FNjKULHAVD3ELztCBz#Z2GGe53ey2-h8h}2T|l!(JFw;^+oo -kb#x=H$q^o0_+0a5Ei+oK@vZqp6xkkbXi!~}1A_h})thr5Ig9kN$Evr5f1WJv}LF{({JPj&v+4Nw9nf -Xi!Lo1MNYsxZFWjR}^;<C&qDN(7;yD4nmJeQqZp{GpWfj6Fi!l!&d+czEH)Cm?&N8H>~&t;Ax`#W-uW -3%NRyIN_p*dMUsD(-@Y%V=?RTc(qE?(Qp`@L_7S7Zz>JRKS7j7WkN>)>y7)>{&fV_k1b>ti4Jz)*IBh -qq;a?GWt!|?H)U!?6|cfd5KbOjIkQ6lPKv3+e=liLJ6oE%Zi^o6ehV7+6f+x(dEMh8W}<=H@$*4r6C! -^PwaEIZp^yeR99&T8m|j@@wEge)1pJ{3B`T{gs~vqn?shfK7&!oDGURhP0Zw+_9;Oe3~U;9uJ!n|Ey; -o4x&340xI!_Zc*;bpXS)g2wp^^e&9dDUx@(_ig=TNf^D7y<JHet%N6nbQ%ez2Z&$FvWHu-!f@OPMUt$ -D5we{I=CHz2~wsy2eu(?0Vi6=@b7fZ|xdLhTC_+vwQfmld*oHNn*79mAT}jXyi~Zf&HYO-H17x<Go%c -dmFF`kcm6-`yX3oM%K?$S86kR}v`Vpd`GTZWJq6Izlb%BI&iH-;8py4=azMc%D|bM&=#0P#gDUdmnxc -#mN|@Oi*j?tDX^rZ!sBmc)h<Gf(rhmt8~|LaRYNi+fXojHr;&l2GZx}pM)c6iGwWgUuhbloZ}#P{e?0 -CWclFm@cq&GMU$d$4S4AEdc}y}MTjZ$WiiorW!#`L{FY-Hs#R#@nsvnn%NxQRJj|>Ty6zoFD(5&@;GH -!ID?rERY39@ox{sr#PDnRJTsKcxxsz&Cxt%sX*j6`uENf!aTB0go=>e5?y*HL~h@uU}$iIR-M76pIT} -{c9I%{8~fKOblCaCr0gGPTQZk+HGhbDO6<XzmcOzoC>ZMrveq(x_G>8sZ3j~%8sTW@K37a=}jZTG?hF -&ibZtg#ET9%~vFF&@IDoCRt}u<<QkJ*blFj?-zCsd4>2*GcAbQLh2m=XA0*kCAQM8H_BSc1SAn-!Yo* -NQHV%dJiytMyOmh2>6i`Rr7!~Ec^yUK&tz%eSLN8<+J0TTjt6u{`{x28WEcLjAa(hDJhnXPv}a;s3p( -Vdja;8lR$a5Iqxb@>>eME_%kgRP{f7;QU*IEna;sot)9-)Yw-{2Q6vf2;!*Ip76Jo?s`M~@XLahji(7 -^T&U6_fwt)12_cECdL;(~Esol-_ZW8F$bl2GnExS?xMTM9zO6%#V{q>t9(I!LEd6LvJoo^rld>jopbo -A8V!AE|629{=(cA0tAX-U9#(_*e#<77&Gf^3ncFB$WZ&db^2_|Y(PSU+^SAFxi`>0GTw-Z|?t--gH3K -*_D%!fTq{4gQ>|X{72^7Yjpde3_|)9ui%ExehG(bgFGL=1#^6<eEI~T)AF}jaV7D%y83ssGD}M#m&^e -!U&L(WjdAHjX*Q<pi9o`J1!%7m#FADq?YA5Mdq32AZHI&Pv*?L-wD)E-|r;K`mlS)8=f<Rz|4ETjR-8 -w3$G>u%dbOVX&|s%2LXRU`%^L}(g<BE#Sij7ZG6z1?y?`v?!xgXE(S0NwY`B}*U8J><oZh>n6=ULIxV -lSSmGzNnCg)66LIfH+P7DairKd2>LF3wa!~yGg=Egw7GbjG9v_D0o`&z*k(Nv$?oS^^Gom$)A{&tIFp -9q4=Qj+aD>ZKsI_^*wcFG)YWMNdb9ZZj^eLd3{WxB2TH8zlS$JZX7&Yxt7!^xv;daa?wu!Ih+7YHwQ; -oN*fTb$YHi#q+UIMN$oa8)uRIWv>vIktm%5&U#q*mYd2V%yLnW}P~lV56z!x;6so(pCWvR3L$&oa<fN -exdQS9#JQSpyf;6oGGu;ZUI)4O^FBFVkO)yYhW<(-wJ<8Gxh2!2P3@PwDaZOd*!8LN778%a^2N_^0j+ ->sBkdbh>BXAQ8b(Xv-(E;n=6b}c2Z9sQ=g_(iGkrd#Ox8R86dy9)edLabb=EbZC{9O@D7vpM|S-j?*a -Vx5}5qz_SXT+xh?~imlb(+S7q&NI`wSGUm1%0@yDP19H&(UjOr?x<I%Ws*fKmHLg8ig#w)k-GxRT>V} -d>Mx3xDe$|Z&O->nq3XaVC}@M!KG=T(JHZRr27uoR9XYxL#X8oM$rOE#=hn9K^ZCxU#k02R4v@`^aj% -4H#*K;aa^JQsC+`*w#FAJg1Oj?s!_I;xZjc9(CWV94Wu)U*y=)y>Pd4||Hr@B-5pO=NDydzlX#niGx? -OVxLn?VBrgEJnHBFcl9u*O#HWwHp6XQ^Wi^a6=)i;MmZN%3drDF0yad2=D@t2n=sNqIe268xp`sSSa% -4>`G!-S7~7<gC?bKp68#mMCE#hsp$(+Xrs_z%LkHg+3B-EOktN~JBM#0@1ZeZnN1vUa|yrU1a!qB*sv -i^mKEOWL7}p*!ZcQ#d$l0pd8_oUYtk*5a*=0KI`I`?Qt&GxpA&<Z2>lqRhmM}9Aa3;B>k%C=k4EqfNn -<p!1XFcP>nDdd6FK;qtemFDXc1N&=S79p*-u-8Gqg6}@MSw#`dn2mjpO-dtq#P>_=qPMI<lb^T-6fcS -HzfawNql&0lJeb{LWt%w)MykpVw^0#4Ip>?ZCf{W=4jFT-Oo2Lr#Y0HFj#X8fnDY1$&%K;w2sCYjeAE -XBq(g11}%O^-+KwFwzbW+1T^7`ebeU__0&28{4vF&ZkY8V3@lyc_LaQt~IXJA<Z@BZb)<Aa@@pGM`;C -Icobl&Z`g+%2NBDld!Xl)8Cv=(o_I*bLqJ_qB5OUgl=wBEGOKFll0;>JSD_>#x-MsS58mM|V<<dc&Sn -&|mSdXL0oIbDXh{`=H!FVFS8-7Rh>acxPl84{Fu;Bd)5LNFYc4dvcHA_l%k_0tf$=4+1VlgLOmv?yDN -P@9%1)ATJo#jR)?xP=!-2Rt3_=U@AdB<~iHh|<9iTOuuKAJ)1_d>Nr533JCB^%3XtI&RJG%Id!Kk+L% -Wb{jCF2HOT;Sx>-eKCGmqdLtvXX9ZZ0MgvbxiRxx<DdFYAHOo(?vV?LIqlPFc{c;xm>~ksE{@~tE?== -%$#PnE;t*zx@#h)BsyPjS(D0UA#tANoBf)kRUJWd1yeYy*YQe*&_K*6BDKNRMjvS8T5cfLq6Z6Dq77M -OLebR2ssnBT<o>M%BG64nu0r9sX{TRkQqNyTo5SJG&ZFJ$(aQwm8x-Vdmll)dHQ$LS<xtzGenqM#>oc -ZmQoGwl(`CVTLq!lVL!xua8@h<id!L$ZWL}_%0ryF+V;HYwerxG1dZEZ%huN`j)uOUt>DBP2Y*=zmTW -V>!Wz}tpd~u}u+`@v^G{;fHN(HM4I(Vvdgl}3;7{kaJ>%@va5wZgi>F#SfXBYhF%`MPt7VQqcY-|KA1 -;B@rFXDlsTq(<jqPULIa-{5!M(mw>6;aeTrEZbt&GEJ9x=S5p3#ju(PZUM4lOxqD;Kq1?j-n$<KaCr^ -YOPq4L|0c;Od~T_mdlEb$aEXV^Z<=JlVdi#v7y}rrJW7=E{l3V&;DOfO9KQH0000808trnOro2aoUZ` -@01N{F03ZMW0B~t=FJE?LZe(wAFKBdaY&C3YVlQ7`X>MtBUtcb8d1aDMYuqpp#qatQgL+B8HOXNwfgD -n3n?nmdEbO5KA=zVFWGor|S!es{JF>mI3Gv0&_|3eZo+PCd&->rMVA3I4*8^D-bU1<05nJ#M(tvPye% -c>?f-K6N6mi1FcDB*UdRN1q6{Q^m*a$5~+dJ+}9t=X`$BA`@5N4YOz&9Hc8?COL&#nc#y3CeZ&}BVNg -d@5XVMd~_Eq1m{#1MRdfQ>&QBc?$o!H%Ruk97KEHTo8VD?qQwPdv(i34UhISPSv}O&1%;QTO;D1e^Mh -U`QkFI0VtbBlrp3jT}#^^-V57b@?rCMGA=g|17ST?ca2_LUNv>3w{Kpx}0)ArC=MaP4tu#s&!pKYmYW -^gcW3G8>Urc69!Fjo3YsK&e^V0N^XCaO0}lGy?zAU7sRcz5Sq-1@@~(qJ*GXEzpdqW!dcVnXWe0`ZZh -_>n(V(T$fY8LQksZ2`UrpJl}}b67qrXAnXwc;!pKU%^^qS4iuz(EUxfI=N6+Uz=(t@not6t!PMPqCR5 -2XF;AeiPJk`@_%_uI7jLY|@1iv85`})q@-%0TwP)h>@6aWAK2mnzTaZJ^C4&o&g002Qj001EX003}la -4%nWWo~3|axZ9fZEQ7cX<{#5X=q_|Wq56DE^vA6TWxdXwvqm>U%|}A<r%M}C5NxjWiR1tRjO<!=a-5r -lB@$sa5bCJjKZOIb!Yp(AMi8*%$u}pJC}Tks<sDcG#cFx8bFiacK!O!xw+{chKF9<+&GK7`*lA!yxy# -r4}-X&`l-_{-YqtZ_3G4lSS^}$D{hvHLG*mNIXM~o^g@^3^M18hy^&3wQh(m8SDS&ahK*KV@PU86-fa -Ftf+r_6--!H{_s(l)GMSuQzIb%qz&levVS4TS=ztRuC$^m21*eD%r%1r56o>RwBd5|bo{L_d?-`CC5T -`U88r=≪Y*eaAGTyke=K(oV)<1at)^<%~fdhRM0c`Vl6Wdp=X{ZhLdIB<gied{3IH?`w86flhicjV -=q4`(Ucm${L}|0FZJktfw6o-45d^Ta$P9LLg{Kf<s7{#U+W26;1jsH9xHG$dJq_#gOFrGD-)7T;u$>* -_5^ugWb&9eiREO(v3kghpv;V(k~9NnlA(DIDyBK14|~E;`yPgD>>g5Rg^3BIkcJ3L6Kr8coNBH)(Hy- -ZKh<VL6gE*{dPOmDGBe##mJ-JVQbb`K*=dSs^r-MhQ==l(!exl2(wNFzaG1|VVdfX39u@)w7MYM>2?- -~;<y7D>6SRyWY*=c7pQW&wWv(6~n`_}Lq9%hgD{^p(!gMcah|-!tV6w_^Qt~2oQ_DfG)N{3-)PrH^+{ -8vYhheF2j8FYJaeT`m&A!<aQa>S%u{jMHI25ZWmAWY=g>hiI6NYJ$Y2l>M!USf@tX~9XYQani%rvt$X -Ea1+ZO&+jOwVbW6=OlIO6bW5vCOW)j1bE_qd6nQGK*M7h-JP(H6z3_i&*AI#L=T?zIHGRF}Yc2CN~Rd -P#a?z;gcn)<zRVcHpVhWgEF%*W{eR>?`#>%jqupr>@6AXY*}h1B})_H*g;e3m6<&u%VOe~dCv*M92lM -u2fcEOVeY}y++vs$hPg#7rx?qD80m=+;kkt+Cs=a3^m2kFx3J^{OKzhjr)bG-Y~&OhxrvRu(6O4AG-z -oy*n%7^Y>*V>U|}6B$ic!oSdfE-b*CVA3hPcuM?g6*M>9%apBE)XROy@Zq72Zz49r}V33X5Ax_c6srk -I)%(<Be66BKkDmJA1L$;`f5Qv8%QNXnFkNcApSrs1e3jg3r7GMVjF5XbnH8NX<qmY56Z$&5X;hnMyst -H|Xlh%E;eR*^>4lY88m`pGpco?8&78V@N?W-DWp=c>`=k49A%L*m3nm>J=Wn)JNOVhN5n*TQ}dFJz${ -If1JSxi09Y(3lYh&=ZDQk3L3asX|la>88lng-{n_T`;Cb1@$V8Uom+a`&v(|yEAQ1n&?8N^`zurS{Xf -9@A4<nda_gtXE~a3gGQN+g-U}^X}?Njj9$rfka#6cTxqfk*$bS?GgDc4332pR=~Z)*39L*&GC^TDA<2 -Y#PAdg36*8KyDlCjJ0Iy=(J)!PdU^qCS<xj2^W~H_#2hLS)g>w=%xt3Q^KvsosIV4kL#;=lOO53X<&6 -U+$QLkz=WA4qzoK}|98k9eoX&N`QIpx^$M<-oAJs0>c(>uTKro^fA&hOK@@V&XVC(SWCMJ%@h^?-4*X -vO+X&+l&+4Lx&6p@62DRp}VnzI@iuqt0oJIivo~`mSE6XBYL<!W;Q0wDsuX(*uTYH#?tpPv7pIL4pG; -*vdE=<)EqAyF)tULVH|=^k5KXg-&6!N;l=yT?e!*1tu#+uPD?_QLJ~g2y-ca%<&Kv1#$E$lBp&oqovu -}qB15<VmXx5mO2n+RtkHVtM^Lg>*JjHIDuH8lPwnLZIsb70}IVqESggaYt9lzCkIRPw$8F#7fM~wurS -(}S#A;qMh_UwK436<z+kyXl@<DUVD#j}N<CKU&dHtB9|ujx-BT9ypeb$rX<!}|(jX>|%>rpsQnT`9hD -p6*n>&)Hsqr*bo>KP=7^ddrkVP6Iw@EGemF8xMj3y;BlaiT9$!Jotz-EDDa~9a#k!;R_t>lj~#n2pbS -we|jV)c-zS#HqCa_W^EG_stsQZoganSz{b&fTqKi_)gR%xNA(#IY$FJ+9{#-aMqVDKslCCsXspgjP<b -=JpiN$<*9NOHQWd7S+5U&4qcuC|t^@tjz`4Tv&JuvbnG}7i4om@TyW6>(t6KsTJitzDaXSnx-<a`HH8 -ru8f5322#=nQf6komw7^oi*bj}E&0PnGb*1>Us;HCf$2i23p)5Kdg84TGdooh5y#|M6+QM>Y}{#ODK< -@%B&8<Cs*Dt7u@=t8)L~B9lKjz!id%YS$4+U-uE+~{Vz6;nXDRmZcJXF0Y`<~x>1~pIDvW5`jv~vU=h -n!+RbUZ4|3+rNWF>J*lZd7ylSY<9GO3lxNG7v-GTLP`E0dE<ZuR7(C$};M$rM&kN$;1+&_)5hUMLI0q -0B`7jOUwp9K@<Mr<#H#8|QvrxVqpu<147KDH`)f8H~|b$RmA}BK5}1_;i-~dh3!iQqY-R8cvndnO>4T -OEHXRtQ44>zg;g@(@Xu<@YLBl&aY=DCoi18EQZ_l!{7|J;$+3|#9mKQr(SEy5IB|Wi6m!=+(>eGxSyU -lhkqI)Iieb(TJ)RYiE*S_Wmm6Xa`xg}4syR(ifKQ2@i@J_YJW`6s_P$u)8MDsWHw5E#aC~{zWCMUL5H -&g&egS4B12qsP9qh4J@nF@Z`PkLHp5ggHnR)3)aX$*a+u4-AnwjLQucm2bGmi!D2B6GL2PrrxnC}ZDg -2vVqkI2Ob))jWJgL1f$aU+7Rr>`Wnp@eY;>(TLYU-trZ^Yxh>OAeoS=|C*cCj-9ccU8WbdKs&4L;iuT -Xdu3V&kmVgY)HjB`yx8vVV8Z@9*VQPA_l8<2UO+t_ISz;}R5|zv<Tx_nYbLdUl{j4z?7lY5(r>%)6dB -uU|Xf;aD`Dl2F!D;WKA`Ah!e7H~oV+kf?jX|7N&yaOI%wwmUT6Y(zi6KJrXicd{e0g~GaTNes5l>`br -L{T*K}Xw@N>`gdcq7#{kSlp2HXP_h{dTY;ylQtM{j52CdKN25u#Sf56Jl)$A#@IPNu(LIdHg)F)#y}y -;~N7jD_81~Fje{UTH${`+F^m4H^>ss4O*=<jw!&j|iJ1LQCX`1spJ>$ycm;2FSn_eGu_O5qC-#Rb1En -TSU+x=;fd!TUI_3Be~GsBn5|8X`C_qcs&^scsXc)fln)F$a<U;Np*n4aA6$D8qnN7}KFD`8T}Ke;J-k -={`57MqRSO=x}Z1G$5JXFZYr|3=Ql#Swfj-P3J3C3@y~*IRLLYC=J*9_~cX2VrOBLM^wWdUbe6tWS3_ -_4Y>Dwsf2YY3&vmNA>S_!8lu;u8*$`xh#fn)?Z=kk{k1L2tL0Gq}5~CtMxp3yB}5BTCr*Py`WL$ko|P -*I-A*`7IIVm`TeEe^6Ye89^LGu(xV+cGw=w{<noiv^~Cu^<{NZ)s;z|pGrO`Z+{oie14SJdwqZL;cZS -{I{2Tji?nSfU%iJ!5*UpqufbSLgts<W(@=}rCEAoRPKTVG20rWSyR3g`k{HVxOks0L`Hk8#Qs>wXC!N -N|qs(lfK^IqI9c|!p&wOw6FsG(<evJC@Ct938)o_m@4;O<o|Z7lMW)q3^a-SSJBsK}*Gu<T|QpI%<cE -br{})y3H#uC6Z6uCBiS@2jgH&aNKoNd8Myp}Tr)<EzImzIt#ye}0A^AGAXya6y@(ai?e#prL6L?L1UE -bm=0hDB-z$=1@O@>NDpIm6|KsV3>J>mX<1=s`vpE_#rA0TKpsgtwCEw`CL(S_uCjkEdzy63!xUx!c(+ -^#ewUBs^%a>IYc>`gF;h~sD42cqS8d5j4B+or3%DEgNlF}@;(5RLB~}k^wlt72-RVjfKp3@78*2UsKB -of7=^V^v;n{IL19vefkRQFB2ejkRf*<GIP%dF`Kl!fsRejO5eAMTRBFslR5MVppgC#-MFsdmKnSBm<P -igi%vDm%Czh{ZX90v6fMsDw6@>+h06&Y=M6%dLC4pE1HAzb><uYRkD8>{Pj4Lx(?SaA<RzpioBi9(YR -`4^zhhfSXO&P<Kv4$*b(b6VVLC+RL3bIc?bBCzot_SK<B>=6dqWW+TW^zxN$>+*U?xTwjSw9Aal^pnR -Us=fm(ilXbj4B)yR&oRhM_}?0OOOLN9>YHl;5dNeNdpRl02l{g9Dwl}GK3TdQXJrLpu!0ij&;HXxdRA -zhbgKt(=~jr-IiEtsG5AQ;d>3=YxrLK0J8Q&P)-#!a2-$!+^)&(8gAF*b{(Qmm{0|MLJUT`Kn)CP3Z6 -Q_XuzOOYGNtCYK8`eg;=u$6uKCiId#W6t9eM37?iYdh}E!?fU6N)b%SZE8(7i6Wx}sURMiw!wLpdNYk -*$^{2FXJji=0OfLMb#X$YhSvC#w}D4GeDCWI929}SjqLx3~@q#-~W0MY=E21qnOqCq$`2!w|GY2Z%-M -;bWNkRuHienb0dgFUoCY&3!fL~JzVTZ`q<!nYQ_weYQlZ!LM%!mF01zJ+rwoNLLsHjF?Ms;IGAa;}AQ -EjcHEqnN99LA#s4?j~@w2-;5t)`duX(2!UWC<CRASTQ2O_<}(gVInxX^8gh6IP4ODP;m6)7!Vt@s7VL -5P60SY6N6F%c2m*9xXz0~$BJs{=2Sr#bbbVyfQ}6cye<HXcJ3}#Hg-4<y96gshtsNK=nh9Zj^Vo+vNc -$kc~5R_iZ&4{4JuuXiaLBfPtB>M0cZlsL0d&VwE`rqLBaCTE%49~pdmm*fQFD7LLW4u3iM*i<d0A^nu -B84C<290L_$#m+MyD|#2B(MX=E6YQM+2qk}|5mdfre4VzrA(jbYT;Cn@Z1$UA{9g1QKJ(UBJ&Y{D7nw -ZKa-hzY<ds70Wq^I#fgT~a|6v;@==pe3Ldpw$7HF65vMsDh`9NhpSpI{YMULE&=Oc%W!NZX$mm+Xkq# -XlWa&phb{ahn^kUJH?tKD&}rW72$%a6*>3jA!tk$2HH@i1?^B#X3ES@q3OFSlq8Kn6R=c{;=4Z42&@1 -V7NVkJSkjs*4QPi7hgesGf`w4^<@mA^U`|-al}=u(N*i;9KqvpMKb<+w3um?dJ3rY<oAG|{`P_LwZ~o -V%%Q_E^um0b&VKo0s^5Bn5ZUJ%>PzAf<hw|ALHbsJxTMV|B!#1E}4ohh(fcVup>Q1IfD&d*QG=E)kc_ -d$qA*=JnpPeZ}v_8xZe|;+0fQ|{@VUG7tN$5T<A=^o{J}R#|%$Pou9&KklyGf1*8f>RJ(LX!Mfekg;f -RNbFcqmIj{;`#%{5#F~cbf5`G~<^g6NhO8Qs}(|LZ=D8B0+fJe7(54Uy9xtZt<TUWXAC4hkDWC?&?Uc -FuDBx>QS2X=oa!{%Fq5cJ^QPB#;(q;KAp~9o}RzDc>VkT_|0c8{_xwIPv{!2S@O-s`QxfvZ^Te7mV@Z -0>-w!|%sXRxM|dYz!?7Xz$+wqREp7+H)9|Os_~uZ(CcU{?tQNz~&2%G{-I3RuZNI*k3D9cu`MTlAgI? -qA?m5wP82T?aPs-i*;+-_KSU=QDQSi-ezP?kIf4GN~O@~psT(wWik8o7${;m?DwQpHptE;r92l!e};8 -Oh8!+H>yLK;9~Y+uewl+F(^k#HX}pXfyBZ1*6}-XKq+Bzr#Dc3j0CY+DNUTJ}tM5=KPV6K%)c*hkjdu --|grhMYII3gsVuvZ33oMc)Vo-lBdO1Vyl;uHuPq?q$c<>dtqzb7%6@9I9(O)$e>W@P635Ukta?$)l3F -nC#s@>;K_&t_stMv0>vhe5Ed8Yw>2Wa+C@O8YZXv|LJM>0(pFiuZ-QgjgiJqj|Pu4buWmG!|Ez%aytz -77q4EufB*jcy??&$-@KZ;uKNn6y!r*ss4EL~l^_+^k$#y^2RBUP^@VbCSdY(IQ#HtJf2zwRcDSvH-oE -$ycs*mlk9u0^!;t`aa*geQhkM}3+1W&4q;wr#`tJd37V-#hvtA8ccINF{iRx;QS~j=hgCPT-q=4E<<d -3;0QnsjDCr95qZFvSkv1-TQKHCq4kFZwuR-STL`O!AMRNuu+_9sg<9ZZhdNuHmdCpVy7kJP2xjWW1b* -VR)1(5xTS#kM?s^U3VP2z(<RhyA(w_N81;`G?#;Iz1TnRKa0|UpRk~%d3|u#p+D0F?&V-F_2;3JdT#C -{)z4b$&Q_GZuD*BVajseEmkdGE~k6?js}RdLETs?<G=gjbLU>E`taspG8T2!sb=(zkjabTnhBlKUFSZ -oJ6=&`@2Yfbh}l!i``}zshrpIb1;cdm>13w9F>#;8f%@;o$p-qJzpDX0CR(2JN}6%{JW|Tg*|CTrO*U -@q26=QZ-Ts_SmGy@;y6r1ro4gC#c870-j=wM)KhiR)cc$d-=S7%O@*y<MKnBuhp*v#N;aPR4({N4>0N -RmJjID{GoJM_A2fK#pk=uE*1a<$dsoh?@+uHu|F#f7_`Xm$|zh1{6-beoBo+=yKPgzHS4jXq46Z1vJe -zv)vrX1j~EsSr0uAd2=BmL<M6=mTbbozrK+r_%4zUp{(?QVZEq#|qERQr6m6I}ae;P}BTa$!A1O69ow -Jgl}X$9IB9r_0*BC4O`kcCnd!`-vNVr@jPI-y!ZI^91hpc?4j6430ZaSgX`$TZc&{zFJz*H;hU`ZF>0 -DXm;{{P)h>@6aWAK2mnzTaZDZzZ8cjT000z!001Na003}la4%nWWo~3|axZ9fZEQ7cX<{#5X>M?JbaQ -laWnpbDaCz-LYjfL3a^LkUW~tf|xhA=i{8m{`S+ATcUR!0$xl73k3j~K0Rv>`ILzMP%|2^G356lY`?O -j(=$+7Od;$Ws{rl;TC1J28Q$tII|Q#U1_Ojxok^0H>pw93<_<`eOK$Y#lHQYCpdWKEXD`HWA}q~>LmR -$E(hgi$2Lcyi0LSzeB-<W2#q`CUD!?+ZR;(<F<^d-@U_GG6Alyix<N>$;f4X~Hv@y(!Z)nQm>#XE=Xc -sc$9sm!P1m_>^bRJ;@eoq2oBusyfPQJ=N)lvmvXBDCWo4Q5nUsuWHDmDo&Djyf(glE(%`8QN_C;edI+ -{R{ZoX=0y$IlKs@<NmC~pVM(r<Kh-6y@9l@Jt-8EF*kbT;dK}%?yn+s#0JFE$dRmrwDZ0z&?9hO<&ED -tPNS+qEg<ZgcDwfY#yX-k&s;M|jGFD%6R+M~18z{FNbkGC<9@h0c&njN`FX8x?V?r+P_Xs_`0RhAZ2+ -;v?HP|vy`YjO6@d}(ilWzv7Apl5PbM+=$r2GiheZy-68AQf^nKMm$uX{k@y;nT|0(6?)MrkseC|=3(N -!7q{EuxwOyx!%PW_NdYZ$$rjLH{1nzo*o+cZUByKcg=%;mg^{$?gdMbBbTi&Q9syvoD_!3Vm09iMD;+ -wy)bB>$b<b?TK!CqT8P8wx_!7nQnWg+n(#T=eq5MZhN8IUh1}&y6uf_d!yTqblZ_`JJxN-y6r@_o#?h -x-FB+m&UD+EYTMgYZS>dKRgbZ4mgT=iaAb4Ip5v-1kiDu&nrFN{w@R?uHv0?=15X%8wlZQ>%?o6zB%3 -8AkCE$Hl+9RNay;yII9nz4wFJR|JjTGEHE<uWD==SDSrArvlg^-}F7sIvbAZT_H06sZl@JtPODPNsVn -rI&K-|j;c2qOD3xr-Z@ioKE$g%C3#?%s3!0|O(N3@rty(@MIlnW@s-L2~jVzJ5UK6D-6kUg5i9Z(`4l --PG!Bq{H&o%{f2e?)K|`XFZeJH0Ponv)m1z%%e)IOyKafIY&k7xyV3^<b7%(KO|U*n0#5aJCU_+|d?K -D}L~Yw**2W%d^RJSxi(n>{H}PCL|6DmEAky?I9C?oZ%n)s%2lb5MK{B*nsFtW1c7|PgKiO)j~|a8MtR -^%rgb$xoUZ?T3&3vx)*B9O9kbnYI&nt-fX_QBQ@qoK{-|}$ExLI^VOZGF{cX3scJb>EoYmrPKctR`s) -nU25F;7(PVMmL?{M4l9Gz!rBECv`0xHMec30K@%RmWd9sWDK0Tr@&*;l@@#Xm`(lFQt$59LlA9Z02da -e4Lf#~ZGw%RWr`Qr2rX8-#?K%d1a$Ov}S%;&u1Gq5puwCv~8UqM<81T*w{J@FU?4uY+yQw5?es@W_jn -RFf9ayHf7Kx%^3k(4Z7Wm^R0;#xgt2^m!>UxES1XCR|k1j4SW$$+_TvYQHJ9$GE1v}Q@>7EMNgeg#It -DV9-ok4r)O4+L<UvMI>qG+!~0yC7GS8YlYD&wl!8f1oxZ)-vOu5r8|BdNS!(Je?2ap5%`4gUw^nicCv -?*bn7y4%y|E{h-LJgw_m?MteXAS16xoXDn-$Q(g{Xt8)+p?Q&|KrnD4e2>=H`?CS60ND&H}VC@nv53F -e~cdxDvEJ{T{j}BSNvp$U<Y&lQt@q6ulN)FCLhTYnwR-E5RtU<f6Ua4#l<|_$vGL?iyhE>0vSnMCRho -DtsVr_SI4SYe1Husub4cIF=+}@=GIXVoDv3e%B=e_PjOVs&XwY!G%pUGWMaWBTc!M-51+|Fn(Od?Sr1 -mQ?76L54_o&uo0dz7eWo&5|@PdlQ>J;A^*RP=+vH!e+S#?FCf;MNE+p$50CW)p!!<qA@>>|f%F(SUcn -jdl-LCRk&=;e(k)b;J%$RvyzaI=eIAk0bCHvRNNT4#EV2XVOhRgnGif4MOe`8=V~(hzswc<jaUeo^pe -zL;LvF7C~YoZ?hS{V=ia!y4^k~HtduDf(uQcuY&aGF7pRqWt(KAcyRi?HaNar7oVLNXD8{`ScGIu^-1 -O~*jM5ZOlSi(vUYvoun-f7y~sbpsgQCuA$pxXsbMT{XruR$3Hi!`<a3t4kcT$%l}q!$UHS7H$8FI%e# -%?LB_@<h3$<&uKXBxTb!?+Uv+q`bGBm~Rwokp|Kj>JnC+F;8gTa=|u+v^|j21_~yhZOHx%Mv?zr1^!6 --}*VPu`R<AF`i*x>-f#Lb2{P`)gj_u&4x=X~xd)>uWfRX|rJ4`{-C72#vBkU~!sPydrxi&a+IoiDL-^ -V`T?F{|w`*aX~P~dAayG0mFzBoGpofegb9>#(rY1S7Zd*#(%lEIRD72BF`#5V0o!Gy3O9CRSt#)k8eo -qMzdLx%>hKpRwW<~jV*Ju9vPZag!4emioRn2HjQvbOJ#Wj$Ma&%a!sw3fDJ4B<3n~9rE)o>JFlZEs_R -m(rH2^qb&U0wAkSmi1~vy0w#lMvVOV3;$><R+5FNNg=DZ`U-=U@x1cZa`#z3zX#ufU#iR#`nSQYwcC= -R(tNyXU(tbxLa{oZku3HzkRV1pV(K?|_FRk$HRk{(j8AIl#5u?6pQ1+swL)LKpm;Lm_?L{a1Q0F;B$F -{A6KoR|4+GUJu8FKNS*Z=u3`tj>ww5b8yK!?Waf(EZ9$0k=U+T1PhkDvrQcGl#b*lzI>5M4zXGzl$`A -;fstS#CeHfAChUKivQNYNL(BYi;(FGwcI#Qo27^@rAfwFjS)(KBiE!omk9`<s7dQ%G~++Ps)2y^cK4s -`b~`qNQiBNq)?4V1MBs8svExXzaeLlfvhGr$0Ic!RYxX`bmjLf~@a81CDatK+TmB1%q^I}5>dW*g3W| -0r(HXFvp(DqEI04fUn}hi=62}axE03d;nzCrg5#y0`0S!RtY3AfKLSKDU1svXz<LNCMa5Z5HHB|Vq7@ -~_KQ_&-4)bKH5Z^82^c$~}=J{yWL1}h2o6XQ)ogVYyMIZJs(p?P#yk3Rf@i%uh4$BYA&l@tvCvmXO_Q -ALq!2J4Ir+nXF^g9$Y?NI8Jay-|QueYV*roUV;3()!7Tk5Uwa_d*@Oagx6eot^P*$eW{#sgTZK9W3K8 -2AFG>i@+y=q2n>flNttIftBjeJIN}PhwoK1Q*0jghXzZp4eiR<<H6=2>0xX)e?I>7WQ~9GE%5f+Q`u( -kWI$sDWXu6CD`IS*gg9<m<x7y@;X8T;%3#;9Z1ps!ip~yMKh5)-rcf>YUQ^FUFM6Q0dNEknV9fL!zXe -^6Pdbi)Ejidi7C#T1IYE2#x<4?TUu<w3H@Q5FM;ro82HK^7+6_E1%sA^IS2(`BGO;PbCWy~I2Fy}m<b -gyea7<D1+azx)89j15GkEyESt<<g2B8Z1Td8arNdH<0ViCx4W(ZDjoTrs-mTt2X4kC#3?D0qT?u_KSk -v6D`Gyx*H<tnZ-MO!f{6YlImd(fH|6{F}QG7q&=@SlsELnY-Z6LQrQ)|&}r_EiG8XAlQkn?k}^kW6vr -nsGbWf5!=2w2?Vm#{@W8^;G#&pXgNxLIn9*O{!cdiBS;~G8UqUza?w^C{y%C%`$JY^CjCEvRw_y48ze -xI7mC=Cfz=g0QCr@P;5ER+eykfD6#HIP?DOX4%ukWixbi^j)gUH=+pNj6}ariw+BSU<v?~B(?4Q+UUZ -~y;$i4OGQ^Q}E;faKBuEv^MIeB$2a1P5?v|iP^=QTHGBRXRsUECwV3UF=!u(B;+<@(g+1pj4BoC~Zk( -ZBI$JW3khHTe{d<C{+!|@EG+bBsf#WiMPvljMGKb)b;$><MIz%U$i@NC?{j5K#d>PZl@o|)VMH9r~|9 -OOm?_PR+=o;-hj=!k!tHq1yVay6N;{ed3<k+_6SY}wpq2ds=Hqgzy3&o7N$PNd!jX?}zA^W+0UwgbXq -{X#nEEgzy_w!_1%HiRR=$M%j*WhuzbHS-+>ZOVpWNDFlmEdq1Z{hy%2gCW<}@({jtXaNuE$Z3iG8H?g -FuRH~>NYK}hHiFGn1$5~n5tlVbJfL<}H?mKWq!EB?WdD^5n;PumWe!Fl_QCKjAHo0Kl#)SbBCKJ_Z52 -;uuU*3zWhzF1^HM~uDa!9Mo$LfBb+>zh(q#7zbLbQ$rAM#u(aF)-na_&dm{8MsLnONCIVSkGyaNkb)| -*=3GPG`qG4#8+%G(>BzDt<+pRsV$IXD&Nm#hb-^B2=<?&zueg_*~qAdh|8gn%nlF3N`6I>K>Mq<EpxE -r!r9o1g|Oqin(ZlsNH<7RG20L}@Cfc5^?5y{+P-Jqcr^D;9c#b&J~%FAn_6e92Lz6$yEfs8CjA4jzn5 -cS{G|81Wx@!!Quq;_xOZtQeo#_A;u$c}=oFl?H7X%Vzq{iWKbuOrOHzJgbwe;ahg2#DL^2nsvM=^QPz -zYz7l~TG64Zqq6P~97%8vhh5*JSmTHb__w;IG9WapVZ~9FVU&QPx)s9??#iWqpH!ceXgrS+vCT`E|9} -#?Z2u~tOItw{8Gd^K!+-Em0Y^LmtipbDM8TNvB0pAW2~6!lOXe*=IIr%q7=O|D*_1%Nae{J)v&?ppU~ -Lcf^`Vl3RMn;1g)lrjI}7Al^?4gS4W{j00Po+j{BSxb$O>OOjm5^YDnwZ>ZE0*?kkP;oX)@1J6~?uWo -Y_HD*J^DF3<XWWj06qYs(>s`8yP*lH*8)YkewFT4r(bd|HgKsjNNHq5ixHBc2Froaw-5u>)1)M9So*j -=QB~-h6QzG`jgL{)UA4GC$UXsLqcJ3Ak0VAH96XU3w~EnC>f;=O<3~Zngq0DNCD{rU~@|0yjg`gm;KO -r7?FQjDg1Bz-Y65+*u?<wj8B`zWa1MNRgfU2+bP1VCvvrY6nrt(TkP$>aPxKx$}g+**k$j_m%AT#_wO -)sAcqBJ^Gy>pp428oet?|jKYy$cGJXFeSagf7eypw@X~3p-zI9?yA`gx-#WnNJ)aj?7;5g7HX#$Elmw -cYs%U!Caj;WVnnGZe7+QZc{>^_KPyd_*-i_)kXoxY(YdbWzHYzO%!jxhed;%GInylE@0{K~d%+!Dq_@ -**VHJul#g^`4*lOhGc-Y#{PLjG<1&ELh){@M^chu(-}sF5OqXb7@_1;PZPzN&tqCPZZvZ@IC{Tvn4Y` -6~PJZ8`rhrR-Lr7@I_s`9l-N|=EP6H(c(dU6v8TDsKt)RbI(MulY$`@x}2eOZ=hyiIm!%IBnUj?ceN7 -%-F%~A)_*t@KtT#zB}D_mJ8#+65J{M^*X@EF4EMbOUabuUXqm4cvh>~w$pGg8KJt~wZ(yz`TjX_(t|_ -n)795TcXQ-eIKvT-;SIrXZ92al|&@x9~5Ov?YDJiBJBccH)Ey)fWL^LrX%4ho!7an?5H}XUgG=jppU@ -f4gYLo&cPwy#rlhiw?*B3dc%4EhPk;Dl=B2RXOl?`OaVtyM=F}kIo@-z`S4}2`6Yx9!Qo^^U3047&M` -y?Ao3-NKF_osZwenkTS<SLRI!Pm#o9u-&wxf$^bO^i6}FxiwxN2_`i3hw&d$<6aBWjd@m_s~Y}IQ+<J -sWlu$HGU!{WhBY{q<T1Y{{JUu-kB61k{MV6FkN9mvAZFH$||%Yod>?~t)eBL<Ylr*vI%Grpf(p)n%n@ -BJqSof{MvrK6$tEnRgL!cpYHdDD3mb{GUN3jS|R_;=>H$f=&Qd$-$g4XGqxjvV#$^QX_ZK=(+b56I8q -*%2NuCoZfYQ#TD^=i7T*`ZQbn1-7VH348Lc)?9EYXM*kwEmt`)=6OM07OQ9|Uzhu-U4EfomTmeH0)BN -cPv>T-g>wZd_GGfP0x=bHp35y|*wNwt8#aEbzAam|LS5cj=+Ke2)j{?c=a2eDw@@NAN^X+kqYeQ`}yV -#Iq`5M__{#23b@+%|iNFWF#>-)Ik7Bjk`Yx}Vx$97%{_QM<+N?n*=qvN}z69syWziHaZ$&MBmjQ^+y8 -o}!hqt?_89;uZ>4f*aPExtL=#>8b{ApQ2WD_-ga=3cq;6S-_YsOiz%UWr;f))3TPl<uuBoQz(09@DR% -ytNCYn!RF-!@}jmc8NI-dOgM{sG~#c%{$qrdMU3YlaIbL+95xb<JJw-e<*Hms+fnS`vqI||1#FIO)O^ -C)LvuXlGc?mgTrJ>qZwnKVbQW20<Wm+{W`jx@wJ01-fuxt&soW6D#x)G+n>A0a*VMtH!8<Hwf0Kv7JX -rA^yw=8frsZlj47PTy*(uiwi|y~dllS>b)^{VawX_GT<(`*cvvOZieD9^dgH?#EkD=AYh3oaoyqk7ZD -{6QmBJdt-7<|jW%MQ*-C4w^@H)N4`+Gzv4uTinzv;ndc@r$cXP|S)PmaIKTvvTiQFMMsRYs)>M*L&Zz -SH~v!{s;804chZWQBv3qtvVZb&Y634$P@7RA*Cm~kHLV)w{%3QpuqMeCZE-V6Zyc7A9TDE#QYSdc|n8 -1H;PCrRQ6Rd_0g+3^cNI}zKT#dRXxZ~<5@5$-A=4HP#Yv;eV@{`fy2R2^&*4z#)SZ^uFC}n$rxkkPNu -a)FM8@=&A#sxo=c-*&UtrF-HR^$1aQkcnL`f+B?&h0<&NsQ6Nn!>$R<-`H<+Mpg=iQ1sE-P%%K<iDnw -q}6Cp{yL^=}dauA%?^rN9|j?9&KUWUgZwJC)u9V(ONQYv^b~Vv+#EoW}bl<OFVkwiU)11h6J^vf08ly -)wR1E&eTQ-x=7u!pwxPjSVn9w#_+Aw3>s0NvG1TJ+z0A9>K_mQXo@~<ul^%l)LI=?Fv<eyEQ^0!C9sD -#8fv?o@GK0dr^VH7`N^|G%Q$j-*uN@Ei(qEG!`D5sf8^aO6z>+7MT0is(w#TAV_W|6xELu$`Co$j;)% -MGO+yyVUPQzt#9g@FN>OBi+-3aL1RCvWuX8j-egKjx<X)gx3q3tSCfvS_ETnUy#Yd$+(&6D@)Zeadny -V{j(+9}aU(|{!I&=OG+&-1F@|FPZXuK$?P?5jO+H_oy*OYyM3_6nHNEzpP2Qc#o=EsRL%+jO+hNMrLV -LX5LVLU)fCe3o+719s1N(<%@Z=(e1=eIHt2oG4*10}l+$YX0a~W6-tMMmZti-$-Nh7tMb`(V$E>j07q -GckyW>%D#8pP0&^0>y7&7)qI2am4?teplBGkRf!RX8Sh9$S(tZ?%-0-G8rcGzt1eV2}4z77xGeJ+sZP -bxU)X^?2W5W?I`5t8wl6HbBNcB4azWRAWl(>e44(%W4+%(N(p)>#U<2v5N3Tb4@lIwtQs(!sJ#`tHe= -&+08=;Z!jb~@gKJuC8T<}r`WzpHXCxn6?>K|8M=%hUX*C09b}FGXlg2~B-5`AhO{;}pm7!JII+WG7Ow -?_3Dj=Rsll^hA3&8sh5{l|p*{<P@jHx85<mRg42W*4Sz8aTnbwAoW%5)F5icn*U%~;WA?^;1&^J|4O> -uo1Uo=?dF(yw8Ucs&0MkU=C6Yr7}RcJz<%F2xP9!f<aGq#}j%26R(W=K6OG+e-3RF8uiQ7Lm6NbpG2& -lJswbSG$Qopia4QY&`nQwH_$2t&OB0b9obkYg-|DEp>0;G}!pnZ0OclVO5w6qSp{VgUR80>i6H)+B%? -IZ5D6GSIqZq2jLgI~U$93BTcyk(bBtBvy>7cb~Ws5i++v)p_w&6&c!AXu)2&r5Vme{m?!xi-Q7}VZ4Y -4x8ts0o1Ne9Q*Curhro<A7R*~z@=oK!nE9VTf_F9r{eNT}$$C72@;SHf?<rvR-5h74Z`+-}T7^2jo`t -iX@34v>92egvRd@&7`J$&*`<a_8^8zHvec#yI&_w*e+WxU9$3X$RhIK`qi<-rLwV83maSO~@i7|~aKh -{tiDUIqd^yXJveSgBTYchMx_tU8XrjFJuqZev_L`j`mB*nAIC_suIsXOu-nuxCz#*3C58i?g|E!CS(F -(^V>RaV{xN_>5C^}48ViS?iey!k2&CTKL_8MuY#RY>x9bopnX<bNGHsQR*fCz}7}FCa0U|A?5Xg=(u0 -TrXNDN0o_T`*2v3Mb^4`_ed00&2G^Su+0)_wj&G{&4ppoTKD3*3;W=@({yh@6lHO|b7FyvQpefuK5^s -9o;*`}Zxvz4ct7E-x~XL(EgUlj-wt&fu=-n}a%jMIkF30H5A4@wSzP2B9F{JY_0LQfhevFYU_?=Mu>& -9KmXq|a)}9c(t$>b6I#)E-L^GIf=eCvONZBj8ITgU1Ir6o4VSJnY?QefO5V>9WU$ek!QoQi-7Q;0=xP -Pq5%90qUXBFLx%My1~z%+I_)MX$4etM9}cKwr`m`B?;w_s8cUE2xiI_u(4KqCe;u<Jxf7s`D-(Jx>fD -}M{=q>X+A3MDD{VWmCSl{7jR-k_`W9!4S<kL(24r_x+N1kP^wq_ueKSkJuzEV<D3jRG%6G#oHn#+g2# -BesQ0bdrD~MpB29ve4Y0_Fnxk8uet+82Ci9lpp6yDxDj8T@g`sUvh{2jz8PIfHbNET#?gkb`dQC{eQ6 -glfVmf`<KnSg(v@n!V9Nw(W)<a>T|HE@P_jOsZ1c<yX%I-Z#ZzHy#54$Y<&BirC5-}siB(yOrR_uKf% -Ojc!6T_K*CFXx|47+3u-akrqhP6%yrKxgKY+oKq}R_a$p$Lc3m3MzeToz5E0p!;tepOk7ZYyu<2N&2A -cLpqu1u0zLw&<d<z<G8qLx|44J{MkWa7@MqD8!KBKYoTwaHmVzCv0!HWb`ppW=ti#&0z-Gt<;c{^2H- -nQ#EG02!v46))-337srp&Dcx=o!PfxsIyyGFmJn@6<7M3oAKwM3j2meX)xYna1rt(&&2X)+X}aEMmdI -0m{k&Y4}EscX$CS4zOqE4X+UL@DtAWOK|c9!qXnUTXBT96K{KA-ZAk<BlqM;ykH5N8{tb0d%>Zis7{V -X%g@F5gQ;cwxO&6^(mBq0X@dKZq7D`!$OYha2Nra0)}R)NjbMMuzxYu{4@_r$f&lPM2%@2X8d}6Dcc4 -W+Jy((9WAPnnSz0=_g&<Kj2yZ)tWNU^onMfVVBAEvOY=po+c35)muQ)I{Li5J@p7{B?BUYcaM{Rz>qQ -d?7@=`3rQ8upavL>YCSUcERTrcl}DU2}}qK<rygYVYvn28EkyCzbz4Do6u8er{g?wf2(joPJ5y<b6cR -f_b>Nt2MrCJ8B$W5GSC$q5kU(8(gp>6H;l<p7!^MWN2YcV^L6WEh~1FjX$z@yjq%Ln*i@j`NaEv(6nz -hP~=4B!Ls3Vrct1eB4oeWWaSx6WlkS;3w9Od>bV4f3eB(O=BUtUiDlot6Biz9?z4qs>P4_$UBK>Z()I -cuU_T!pvR(gk(Yq<r3b1gbA0oaN>RU}bF+GNp~Gi4^};Qzg7!@q{A_3~2%|+A4Bet=18~9j(3pp}hOc -d#)Urse*+QvNf)Y`&#*p$v^hy#te9{_Q*1Ot<CKX`nFlp1!rB~3=$;jK_Qvgxyu|B<ELqsFP1lix@cf -x+|nHo=K*<xkU(KRvr1rFn<lZ;jD+mwx|Pw~rR&fCO{Be2X^38t-UK-|5@EUH!ViLL)m*tVMG=qCoo@ -n9Y_l3Ol36u%y&X6<sD%oegj;?0~8W0B7SudT7p$`?rM=I-Oc;SapMcC*U(abE+k_BX&0y$+CpU#|<Z -CPGrhrE!~14MBatEwE@oj0@>{Z&LS7MTFs}RwE*pRIjadW#8vE-TokG!Jc`YzSt1Ka<;aPr+Y;&J6PE -3xVIbPxg8{iot}FmXdAkZ?Q7b<HF-@`izZS)Jp1gT0qqA#IIt&c)MKw%@t<Bw*t}Z<7(eUJplu_;(Xq -BCUh`M-1Ag=*4={zE^=V+%E*sYe?)>(Slw_}aL23ICg?`0$H`(Soz7O%dzwdSXRUFU~bQj64p-W48+j -iR53evSS_6>q{6C(QaC98{Vl@;*aWh*i8a5Ueq*irA2^nb|6czvN!>p>2+V}^O*+iiACx5N_RrI7I`3 -b86C<0ejjx0=>^954}8^d(TlER=+ixY_II6VUPI%Va#?>@cK~#PWqZR!TPvjYROcMD)_SQx1sme*mb9 -KK}4-j9YJJ0rZsDE4*{4Gl(Sg;cIzQx!4F}f)pI6He|V-khMb)e*u7|y=;OAyLu077C(79b25<jsE}s -!=tnQFBOl?qCYQ#n2mYLXNUvLYe4Q}ZW}h=!>`auv{c&`3rdn)DG8|{OwB<WtY~$q2wtRh{_f{$-<uH -~WT%q?;yfy2vN-*e$oVv<|b-LDAu=wpI8T})fNbjk^A1IPx6^mD;8!9C!!ISCOS<dP5P&=H)%G`&pe^ -m}F{eF;^`t98-;}_T0NpvHYs6oRH%wNrRQ7GRCa6-KTmkzyBmIp79d8?8j%wKRHi^B-jY>Q>-V8R1Sq -9LJQ9HOWH4Nyx11QY-O00;n48F5U+Mrszn8~^|$D**r^0001RX>c!Jc4cm4Z*nhabZu-kY-wUIUvzJ4 -Wo~JDWpXZXdF@?$bK5qy|39AsWoBx*wN$6O+ecbwCyDK8X8XuC?%nKlJ-##vNvtVSB}hAJo9}+l0SFQ -#!Iwn6Vsbi-ECC0=dHl}70SJr(e@3pa$59vs^!l1Ov$-FH#Jpj?8-?^*{Cz}h=gwh{?;VlIb1dJc*RB -)Nz;xN8M`NThcjlw(JL=hfFk;R-NeD|%17b1)|HMTt-*u@K0yQR!+4T2_#y^iN_#rgCF!`0uO^d#qnt -^FSo2;xD^+G3fXzA}JvmEDp8X}D&@z*c&ISoGl-oK|oSuNX{I3bju(s!rv$FrZ#%Swm-E%h!Ia|*>mb -8?aVSymySa~DQ8gU%}>j7wiT-aHCf7*KO2D|~nH!}qW7>o@%Cq-Yp8RF=7b&yOBSe&Ao^gnv1Z-yJ@B -^vH5e#yCCRP3I394E&qlKs1L>9}##A!yp$^2V}=fhUP7W&t^c0KNcf({&2hrCoy`&t9(Kjb;lzs3Ib? -~)8*e2@}2M6Kx0ZpP55Mn1Zj(+?t<J<BsLFxi!w&-EJfg2NHe5N;N6%)T?<Ka$}<{HeH;I}0bY1_(2z -YEjmX=#Z*#;r>jbsezJv0BN;%dN!HkjQg&<+mF&K>FIpOv70I3}jLGFmm&4AJ1<VWA5N92=FZtu-t!h -n}?Lqu&H1d?lRAju>(v-JdZs3$(8R3DQ!G>qn)1K2Oebft8lyvn$k5@nV-r{}IY0cz)9!@1u<+Tpn$1 -*nh=id<ghM*t+@d;W)QhUS~HHWK<uXD^_evCv~x5Q4X0^dYsgWK=~0V#wOGKm^7+$ms78uXQ*|1az1Y -8rW7Wv{=J4S`Po+PeGxCDwz|<B2yCp!egVf|No)H_6abDL@Y90P}^8xaR}iw@T19;6W~k&E%j`q>XCa -2)b1##ZKzlULA?t=d;u@9aHwl5Mshy|_ymDR3`i*rMPSA*FXz#BVU8k<BS1W5AsUe~%q(kprGG~>LMd -?o9$a1>s#+DAfF)_GBk~^{2%w*6!nCH;RyE?@aa}o>tXe$=#f0vdHX_GG08Juau>Y>_&qYNL&dl+EPT -FS}zDt!B28!4UzoYStXb|`T%a+1NF!oO)1S~e5DlmO%yhd|6!+OTm5iwAop+u4BXztGk$A|CBdXVz7t -od9qB<Rv{s46M?hiFEBjAl19I76^r#319a@94X%+H$QOM;`a3G2<Db4)8S~zkGUrett^)fV0_>zJ=VF -fUU$w08Zs&Q_GnFY(Q!7bEf<goKrv<*q@0ljL0i+qAv5nCxUecfWgK$264tDE|m)I)tGpGD8DZZoLiM -Ws1?WiL)0`0<QY{?{s0>U_idvNbN8J55STW^At&U?acUW3!N#nBQVNNW&-|Vc`XX%=`3d%6-3oYA6#b -=;AX3e8o(Y$S?$ZHjncjrP>N7KM(Wn`OU;qLNE!+1FLNaxr7Pq^U1(t;0SVggw!C}sDENn=Q4h_yicA -{W_R+b0Jc%*Es!|d<+_Oj!?qZk1p_R$axT^V|;*W5S5SR7SZu-J3<3iRXze;63X=r{1mgQQP~M?wbK_ -MkBn#-}tgp-DUipbKU|d^827%0F!kg`f+*ij0ANX-i%v#I7=RmR0uzeG2%Ydkg?gIx*cLhU0S#VuoWs -7<$0wz_Err(pwlu&1hk}chD8+-JeD>Ech$={QiBa5!3}v4hF~XPQN-nCf}YYT!la2Yk;0Z0FzwXgS6N -)DD~v{9LpVQ8E*U<A$}PTjj=4}J-`i5{Ro}MoPt*KFb|{VDFy6d{)|rjdorLS@Xj;;jwa@Zc1GlEBWu -gC?2eC*pJ-$UUw@^M9Y~M=cBZZJL?`aJ%9rQbDqojYIX^wsDb@MunZ8QKq+vGn2SjW%99;7LzBt0F=j -UhfzvuYx6aGab0pcSn@S2}XQlHCj{??Y(-(=0dOIm-I-~6L3t$)axUr1VC$Zx)EOY2Kn^D9Z~EBVdWZ -E1ZiYd)8>p384uw59bz)_f^xy_Daawxx9{Yo1A3XY!l#wzSR@Z91031fpH#Aq}6Up{sF^+CUsH-yzH; -?Kg)ye8ON+>@Um^gT-g`okiy%OmC=-!3!h5ynHkKoV;GZ3?F8Uk>lFzK%|$zU-%wO#P0pzmTAagB;fF -Pm%RAl^+<~!1mPw~9aOfTacBO=bR!{`Vz2Lr3Rpv~4DeJn7Q4^C$l#7Vdj@gp;UW1{{_;}(^09!7!%X -mVDgtmmrf<{;ocx3l&%MLw5t&DTh#>_0;3-7BPk!gqJqQIeGcydYMOJ|i4hxGML&__RoXAHf81O&chD -*+B<q$>cN8ymsnPd5`?-@DGQe)K!BJB_Z+H`6l=BOx(!qh7>>57AA4Ef@;4rbe)hhgB{L?J!lvs}g6A -Cp%i0RsY%NhzRhMlJ-zQHT-&8xsiu&lefX1qS6aGsM|+LMSc_4FA|DnROJy@heqaY5073e1)Ddmqo?7 -UcSfx<^>>_Z;c~tSMQ${mdM!za)!?@)Zb1{GUW4^s1cA_Ivq2QH8ULr%En_OA13{b*@Yw{lFoNQ3XD= -d^$QOePVsQ$@eDUZ1Aofr!!lf#%3b7qA;3yIJbWTpYrI3QzBM$yK{SkM5iMNQww>cdwrwWD#~TqEj-7 -zTIqgDBh~40`#C+eAY4IWXRco%m&;cq!DFrb#*9`qJc^(p%n$Rg!B3=$mB=YPdh;F4#@~+=ceVEgFJT -szquO;dPeK;&sNDNG*88vAa7);I!6oPXxf*<{Oe4^vqbN$4i@8%S=-p+gR_eBO&aExcV4l8&D-~gVgI -8Rrtwm6Y_9*VgOk2Of_k>m6tnK_ebC^Dp;iHQQy^AS0dt2$X?m_}itA3({N(!}*|OqW0e;+Qv}DTZ9@ -FtRTHagLHq*eHnvuEYLpj*SQu7jSM87To~PFk6F5AXA#76$3hsfXRM=F9?-{ZAt+g0C=tmV3a_AmhGp -=;S6%Nl;m$T#^i{so4W2ZnwsqTmM+*ey3A_`6UNRvO@>874WAoOkK0Z_DJ%Rm86NY3r^Xm2oSDen;M7 -(TNsbyXJ~J1BbC^*QoX-`5KoZ3^c9LW>u$zTaOd?Is+vgc*K@0_MLO_HIT{(In^N)eU4tL@XpIcirD> -ZFME86=Jv;vGLBc8ZNrGmM9is)4|MM3d<>P>)GCxD>dAZ<h&y#9+WN<!C6@AwK!-ZdyC6qm16z_cjWS -6#>`pUs4h@-aB9G!7u+;S99n;Q*0|1T!(U`Y57QWyZatx*)BKwfIv}KlVCpYhwI#Vw9Qu5`F=ndf$+* -p?9YlTGCW5Qz=}nq0^t96#JXu+0&~gk-+BkS@H9VQg7bNgMnnMKojDt3%HkJoL6W`mtai5chOiy*Z@t -$9V$*?iVRCwjNN~eEp0RqVWxgr)fRG2J}N7VVmR-WMZY)(5^?7%FJWhK5~^AMi}yUl3luD#0zp`WK1# -$uDovil;Oq59#oBOoF09UimCyOfFiv2UQ30}sFBR!)*4@<sIJl!@LOl#yAvo}C7Xl+31JVgaj6iWu4N -KP{8C90*l0|p);DXsO>#=a{oW~0XxV+E*kx8X7&JW}DcxaMAab+2uw_CP?9>yCI%67Z(kjJ*=UKd}<z -KGo^d_`E9@T0E@g^_SI;sBr7L6pPmxG(|$6h6uRJqiQUV=gY4=l3}krmERiPfjv8b>`U@=ES(t`ub2c ->W+PUJKrwnKc-YhHgr6IMSBP=EOG5|@3Dt3T^~0%?8qRnxuGSxG#tC;Waw+hQqnE{O|DeQjvZd;F?m7 -3rumEtwG<~%e#G)yh#1eW;?{vEUb{sjPiW<>8-J)?qjtt|A?|6k*&(IV0?1Aan~ivSD53LhEgj(DPr# --sBELqMx$P>?*(|>)W$$=*rt8>gPF|bXY}gOQfwk>N%!B-zFXs^;bz%Pi%(aBN@SP$MxY@bctae+FLb -JxXW6C>#kjGubu$_1XiQfx9A`HTMn8ERkcZ|7wL^)DSxIZx`g^8q?ljifIe4_^6Pif+>oZNyGCxx+}0 -LjduZb;q5XlaS%Lzb4YA!p^M1*2oXVD@2<8{iSoI3DKoi>I@A`~VD$<~Ev6c0V9)kvk#)PL`Td<iz<j -I!8{-^IhnSz2FX(2nL82vZVQDIh={}N;g5qp$c-Qw;<nsG#p~iaX5SiV+F4YU15q+<s&;Q-p5$NmjS? -!%zDRqf7p@HEh9bNGes(~<?!@y8eC=JFps{PAg-B5sBAQ_HU{@e=I3X*$M==@vz4*sw#YAf|2+iS7Z6 -^)aVAwxpmTuh9gB1<d|Qv+vGh)$cLKc=XzT>aL2^ZZpa6Z1M=<Y0`Y!CiB{aZq(N;qM@4>bPY`b)Ft! --_u%#2xqGY?B+t*-SvZLU}K=KbhZz3geD>T}lw5q5&;eFVKhP0wrPMm4KM^%JG9Q#v&zw;H&9R12;%G -q{cBr_^#WOb0!zO9p;cKUH;oMlY(<in+z!nsqXute+U*{s^9qZ=f<_CEzJ<KV5vfY*bavi9Zzv*|OSm ->(=w{U20FLElIquVI=4QuJBe#<5^+b-`lru$t%9m#t#;_-PMxY-Eap9Zv36VAI!1wT})IpzBy+^UPNJ -zlI`QR6i_jIsS`JU{IeUBX}8feS=oiI^3~npO%x6%emD$pht%)}Z1t9Qhdn8-eEY0q6K!RpC@Y_TK4A -IqH*Nt@hKMos`;oEHI(FaqlZd_aXZYG#p6$i`b@-P1E^uTWy4ejs8_sGAh`zj6>IV4bD(q1f)f+%^3j -11AUjrm>TI=LODQaJHsBDaCy2Y+t7$Wt@>#(!WmgANdj06KM6AySG*9X_5(egRbb+Hl6cBxl6V~*iJ` -L~+7#`?0LIkC)@;Hfg>uIVNn`vFZh{VatJg`Gi7SD81ZG5#30k5u}zR$)>7BtpSv8RhSH#wWY)FW#l} -sph@zlF4gXea%YF;FKSefcw1C>1Vt`k!%2q152h^ySbwfnX)NABFeMHYeHj_#V-%xZf6@0Em(+Pb!>X -pqGm>0vedZR<W{RhA;rZhGg!Qc#$$dukfGVEs7daNkU}?S?L3#zS@_m`Swc6&bp~;HG3XSvS`s=SU56 -yf9Q-CkQR=W@Ab~#*95t(=hQ(->rKm8%4XGeDG!mUK<nNuhNAa3t+TB$H`sR5Y-Ox5L18C{*KQkU2hg -!PsXAgoy6(OFUi<NV*mGQSjENvGo0p7|Cd9IHehT)RM^BoCEMDO-8CQ)`kG!nt?M<r@M_bn`0P8xk+v -KLOJ4@~;NWK|CJfyrh9lg2<?vE6Amf|Im^<?%`FCWIB;<45&5NTr+n=w)v5`x8gyHrX}RnVpZO@?G7t -fNCYN^kLOrxWqoJ>cgs4In;+$8wsnHh2vaAuv%a>>^{I5E*amPnrzz0n{I*AN#8yMZreDT9p$$DVR5< -2nY4L(BqrIvMAEz;ZC@g3=GK;bWn{Qd?~Rlz@&{v<y=m^4X*OhX1!Ft1=hc-G|5<fp&FykeY;$AgwaO -0Wl7TdMm7*-<=}kZ1kKXh<G5y_7uZw=xXW1L%2UbjJL)=p)nBovyWr0uq=*Fdco}ynt3%8iCZ=0`IJG -{4P`;|r2C-L_p0oy0>`y~FV9O{$!8&2Xc1J3#YVkJMCKNO7orCg&o0C+e;3pmtX;nQ{S3*D;n2izJ3G -c;+erh!+E<9cOVN_ZO!Qk#aS4UKAxO8g<D?=$0BDpR<g2*19weGamDKbBe^*x2i;Lcr;#Zr<eX9I4tM -!=7X+_1vu(Q;!f21|eFpx^=>`2bXr~(+Y04#ic#LrVjvE`t_O2(}P|QdfNcKjjSK7WYzlQ`ATb2DhJN -Ig06Nwm+nSXvZH-csE*$qrh^(`+Ji|7wN>P@6^peWZPo04gr!8OyZTTH^%DOC!5LR|JT=#U)K=$5RPp -=H4*($!jDsV*Y?R-uumV!7;LDRJNy-%cdBW841HLvaz1<HaD;Xk#!0wo`3kNS|)ui_9#pOc5wJVwyaE -s;JL#<2AJ3s@x#q&+v7v4xRU;rPv8k#-TUDf=PTI9(&hx7{5&S06}NPC<dFh@T9waoYD{e{|C-dU9Js -Oo_Gk^`>Cc=R!{lOJoxZ`?_*y5yG>S-y8igHT+kV-nl3^5-YVS6+jw#bfNODYfu6M}FJRl!~kB5dh$K -ybUslJjNSE3(8TFhw4c?70vOJ@=Si+eKwR*v>>Y<jW2%Es5{>O)MA4}ht6$((OS{+!ZD2aw9wU@hwsk -0x8cR+1ArV(EX}<xeOo*2iBlU5#^0ScTZ(I{ugDk5W90KJ7V;xI10NU&_=eZJ0l#516FMRnc-7mK^Oh -yJm!rlI0QiZaoaZR5<a#%s+@bej{8(ca;x%P>l)X8ocqv_cr&*330&>#9BLe>*u;Ov{c&8lv8c@7ojw -A3KB`ZLeUjXgQsOHe*Dkh(hf!=pjRI0izI;$CYAvbEw5xM55T}t>VP%av%oXA%W;DooJx9-hEfbucyX -zn@|@Fg`E-EGqN+(2Y-tMT3E&O6RE^TxlUg){n{aq1sS@(mSJIDKTNca6I{lkPqUT=C@TU7OkW;mg`5 -o9hZ^Rt;6SG4EKqVi#uSKzs<1Op_ZC_GwmL3Ua%R-oF~P2xVr*B+|qGj{LB4{jb4A(OJ5`csiQ-Vd@g -v*>(?Fw)+Nvx5;?6eOXEhBs`35abZg1MDl+679M;)DW4iIr+7IBbCTRJ{C`_=F!c8bCRaECjJ)4@hx0 -12495zSx|O-L10JT#RMziiy60?l23U{CtF7)g@d%lDN^Lx^bp`Xlw<u%cO6yl%LTvzX+`|E=-7uVdVo -8{d&Gl-?!Dh2|(;|sKKz%(T;tKfUnJW#<rw{<FW<Cw#k9ArPwBK9LibLzfdKg!$owuHY)r=?Ow08J1v -zA8mtkj5B%1sSKj)L=i`w?a2rT6Qp3oL7kFMBxJ9vpeTfFibOEGmPZ!f4bjiXV$DiZZEJFc=lC$X|Kv -Xq9E(V4`Mu_}ZlnV%t+~1+btCg#>FkNOf@A@M@dEyGH3X4!u@0^}Cr%6lk?rTC4V1)KMBXuJYSdk~*8 -ewzQ2uT0#4n4{j`C@tvm+N%_|?^5t~DaQ$yy=^v9H%v(xK;?a9ziGuM41>D0maqcK_LSizpLxGsCEB1 -6H?nEIK@hejC=dly8kUS%PfO<;?$_=V~ix}gJ*Z7keh5pP89SbNc7oa}o&GWr!PB^Nw(b#WiV&k|d{x -b^b+yx&vke>M{36RqAC2Erqi+<C*;F@N~yfT_IGtBah*iHc2gZn$i{7zW-kxMI)!u`~-rhJ=-13w1DR -LJ4cF}V8gArD8{G3c?Yi7jbWXl4et(fpKJF7!Nfe6RGBEo>2fux_D+%VJlqR2)spVo;`iWicrsB~heU -c%7r3YQl;p$LeS#YZ&kK^fIiq5{t{9#HM4l{EowYb_jf8W<#8LaC(rNiGk68DcL%|g0>~WiIW%{_(<c -YgTo`BXW{3U;&X_fFW_@E=nW1QSn$81(i}g(7N048K0C<2u(Ol|wNk`wS1<-S9z8mz%*bwzQ=j5i8fP -pkuAn5RzQw<7=vR{in2d%O#1ms4-MEhR%7#im`X0rDmliCfv-F#Wge*Tm%z;{{GEEfO7K3Z4!-Jw7Uh -<=^9%<U+d(#5MIg~UGr@G__^oNdoP^dGPqLs0><*`#Eer-2SjL1hP#o_>bX5@xH%0kQA9-s)i8@{dNI -sWe=`E+S$_Of+jG%%*E7)%xgxrc#HfYYegpgKp~Vf>aZ$Jr*EQa1F1VXWzf>bAiHyENr&-Meh5=;r=h -6_X~K%g1HaKDgjd)^IvNsROG!R%AbuWi?r{EpDrDycnm4u@oA<fL|EuO6TltJxjQS!8gt%He5uvmNM{ -l9s#23p5_Jg55&BOy?yugy{vtM0mbKauffVUY1|Lee{cU?s9o3ZcnPe<dVI;<K~<`*s$cKUx^`!keAs -#9=ezB30=BazvOX8E`dK<H0+>z%hkdu9Zj5Nv8@an#ce*jXNxb9~Z-_*5s&hUip!ve|D&Ou}<w(J9hR -X-ndbo||Z@UPO${4qakdF&*mu_c)by+!s$*&Q`6RX)zB-a{s1t&jhh?^hwv;+9?0fu7SoAB=Ma6kqc* -tIdMYh0V(XBRIY?)satF_W5|Sd|r@Ty?zCE;emkx7N=zj{?KEG9=MTvbLld#8Ml9O4X*~1>k(0^(p(@ -WK5&TyYQ~6R*~ypRNWPo-e(Ug?r0;8--We%XxygTO~lo}+m?!|%HwY85Sfx;mHt+BZcz;%INmpK=?!- -fciq<>l*(A#{0;pbM<o&0tC-Xc4(+94Hb=R9La6-hoPCO-I<@Xnt!}MLO=8|no60ulyqV)X=D5oCI{) -4!J{7wT@hR^5H6o<-i-8+;jT`*@LVR}d^Y=#Gu3vlxhJ%G)iHa6}erf1-`{Glt`?_H_+TojJK>4Oce2 -N<v<K{{?FXB_}&0q6Pxc{Pydq2<|1SB8bo>+WxXSOip<C|`Tyg*w274ngE@pCA4n>G_N#lmNz;tW6k@ -DPRkhVQFxCFD$j$K-k8{TL{1+VKor{3OtW93Wo~$h|o2Ge_sr9RBfq_`iT@%*R@b1E@VQgBx=~`4OJU ->mo6J@%Lr$_|O6=+hLX&*wp@p_@2AqRnafAP<b0=hBIJ1boAiaLHyQEjttVr%m%}=MWG-^?=W{P=`O* -$oS%tIj2~oY`6~3sl<%OihSdMeyy??PfK}Wde5!7~ZyuQxk!ovM&DZgp3&03x?9iYzv``L8+=&AR>H> -q+vUZKxvMck5{Yz!6Q$Y18R&D*QOceAdW@SZ}ykEp~a}DRe`5`tvdr^A^(Hi=*<7X!-coQEwx(}w-15 -+Dr?Z%7gopY-uP?2S;GQYLpv6*86Te{<YOm8Y!y0b4l^;q~ov9L;2>$9;<9sfqoOzfeghmsyjHo~nnK -uN6$Z#IJx-c#yjy7Sz#-^6D=$bPX7W;I=}{vH?y+cx|5A#ZY+Mw{toUK%S+e;)#an#{+0{OhNcOHC_V -LFR*5urCGVUBkaE!434MhnpU5+QUutlJVA7+X^<&ueP;fOCNn~XSJ<bK=rF_+WI@Y+V+s$?GB`c*5XY -1ywDDCs}EF4Uu~>IkBu(3HTB2)m?Kxfw9k?ESh!nQSf#3sm)mMR|0b8)dMN3kq)@Ael3j<AS`&USDcW -8IKb**Zr3H+9@%=kaNT<sD>?m^f!>fzsaz-1{rwl0Q4}9Wel%woR<a3!`av~0oM>5&Quw>cU{_-B1D< -gNvf0Ihj@|Ez%`WLn0y92bVA@~&EvnnzWAK)Pk!h{xdr%)tT6@Cxj@bjnQW{9h+5_^<I;}ZyYt*67!u -e62rZ-eQ3Dv3*mVwaUu|6@@a#^^T))r4xID$f@#L~c)QhnX;YJ_#r&hT{P^+?j!cUk%ZE6Ecs<DK%Yk -?}St0MXpPxG@v9f`CUHY)b!+QT;kq|q#l-i=|^4|k9%a{AIa548G}#DJ|oB3f#QpT*Vsg0f`tu|lA4$ -L)*A%l(>xH4na>B_<kqHGrIz;(X`s+Hs>gqn-Zz0B6<huvP)h>@6aWAK2mnzTaZD!Tu2?(<0000G001 -5U003}la4%nWWo~3|axZ9fZEQ7cX<{#5b#!TLb1rasl~-+V+cpsXu3vFbQB=wlHOY!~GnN5cT4U|dEk -IKYLmCLQbh5d~q(D-!-J<_}ccg5~cG6}-QCYmZhsS$)j;W2FLs8V7>kJkJ$a$-c12M6>=^Pf}JA+EzN -h`I=pi{Ec6&8(jXhdV9sJF2z8`TWwRxR2!(mP#s4PMbw6r`<e^WqLwrA=<-a;@iZ=?dr7oLP+`pr;ot -=S_~zAm-)k2Ir{U6@7rPP+={)#uZ)~;j+Zm!5eS&+8AvffcYv)6cvSN8j8g^T*o`IID_~dx|yzCN!to -n&d~6hwC_9GZYmsJ3Q0?T+y05|P<Ev+D0r=w%CY6#M`tWbr_HK=9hkT5zAYN9u-JfEHoyGm>}7mIF7p -ramr{`5q2WXoQq}tU<Oa^q;S7YT4uz*T@XI;8jG`xS*$7u_Gq<2LWio6j)f9MB*lr5R$L`gSCnv}B8j -r^**qQE{3MNP(rRb(J2a^@J8PZat7nD}(a(JU)ii*pHMAE{dHzL1Q(Dr*1LT7o;4_D*k(;ql9(pf-7< -;KgpUe_L2XK2M{<XJf*MKXQ6qP(aat{9*GO_1ENxCSF6Y-%qM7Aw%oJINY^%P@qoJ!j@4Mj8g$MroL1 -ITK1+DsK&SXIKVkOVQ%mJbc-FTfoJVl7e@lNuI?YL*(LTDZmqGR}GcGsFGGp8a!v6V{)bn1zY<xP{S$ -fgeoy9mf5yL($S_sp1|J-3bE?rD%}jaINqF|&Ng$d9X)?O>83XSHv~zW>2qmqhi50>|FppxINSXnZ}} -0{qWOx)eQ%EL0h<Ve$3g7j9;$b8ZcKDTZBGA<zNLC)I&S5%A<tmHXOl{nu8(3I$FJxsgzgM%i>0J8ZH -;c}L=x>N@_K(MkV-l!oM*vXTv>{_AgZJiX{2>rjY##X4Y;mt$P1Q~T2aqAPLTFEb7B)o;(%Z^h_XcM> -z<o|+l`XOwMqO+{U}4BY9psoiN<5_cE^pprRB-LNX{E1`c~F!&iRZCM@ixs_)RMc$w3r8CvmMc^9bc2 -PDk|m6n{y3i)%0R{NV)w>DM(|26$M^Bz0gZ6n8V7pIk7SXu!L&Ruzu=bwcALUxz$^k(_1^hqWjY?$0b -7`aDT@YW#x_Pr+Gxtq6*z3)LBliepttLosMpT!eC}Se06I-R@$dJ2${`3t4*BuLU#HWrM^AP-!}Y!Md -Z&qhU7UBKGXXcoU>0N+vM?WnnsiqntS(ZKjHR+e<@VX^z}%Bm@LX%rWZ&Ncr_=9t}yK8DP*$K|kTNXQ -8+<pjr9}6-C^a-7sFmofw+8V1z@BeNS`IwltWNgw1*f({#sd+kD>y8Juze!kYPB(ud~hKBqLOyjseY$ -RGD>vr4`$xO4cE8fjQ$Q*?Z&&6d=CgOG*(3BHl$RwvuRO(UL_@AaGphm&*xTG1p>B{PEMnyZkQ!xPB@ -rKuG4HIabsXq0@ocz*_WmftTT=0GN5m~^tK=my0;?p-31N;uKG*t?hT>HYF%sPAM#o63u6>Zd%}PnJy -Kev<8oe)gi@#^Z+(PB#b_`v|8S1ik=7!TE>oIKxv=_n3mpfwGgFEKg79f$t#MaqYNwI)x+p^@24HiY? -i3<+yjUFR?yU>%BN%;RXu*?P~K*l+MD`lvX`+@K)T34Bo)4(u<VLe&^ZGMB;QC^d`uSUQz$aQZS{{H4 -!w?yC*xk#+1YWAs+YL>ykRW`)~x63qe#&5&8UOTdh0B3Ex-35i&RuhHpJbN4E?9HK^cS!q{HAsnxg-i -z4&a@+6M;se;AiKwLbvMekt@Phq?524Z7&NCG{`<S{54!*Gbg6B-%&cM=wJ&xte!w%VIZ)n3yM;&{zF -+*~uj&Gis{OTYc!2!G&e@CU;BAt;`co8Wm0+vPtRxJ>BvBa*WZO%Y&%DT=&nseCbEtaP9DW8O0k_rIO -P9kTAh$wM9O1F|#s0S22#z=nX{4<63?Fnq9m^d`GmJKXZIW~BE(twho8_qNm4t&4LlKVibmzGkj_nsi -}!&Q;07ElJ~psV<bYmu2_YcslH2w(5gf9;V$dU6T$Ul07`we}ATJEp|@cyC3}rP)h>@6aWAK2mnzTaZ -Jdhef|kZ006s10RSNY003}la4%nWWo~3|axZ9fZEQ7cX<{#9Z*FsRVQzGDE^v9xeQA3eIg;jg{|b(0X -Kn9TE*>H!7N>hxWy!X><zsBQuCChJWM-1gQZkduLx*SQzb}vn-ZzjSDOdMCyZ!W279#>cAP@)y0s-VA -OV_>Mep{49nT5ao){EAgG%I@EJWu1Y2!E@8Kko(6O_WDz^1N3jk)H<PZ*f$FnHT4e9yMk1B8!scqeo} -&U-kafdzU7m`dj_=ACG$Ke~*(gjt~5mmwCP_`1sojT4CNPOwV9?QKJ68DXR)YZ~eTNg`3#(!=QH?6|3 -Ioe|`1p)#;1J&+BTV<i?Am;6U@VNu#9Tn$K%w&meW>b+uH1pJrL;7xDc;-OhpPdlZy8*Yv3d^`3t7tV -bn!4QHy_!drIhJn*xFB)pBIBs>U{A}a1BdktCd<;Pw_)~m_vUSGUI<#8M?z4+iZN`mw@KNt+hLr3Lj6 -{J_@Z52(qUQ({-O3Y8WylQO`W?|xo&rCbMmni<z<R;9D163%@BHz)@yBgE*twdeMLGq;N&BI<(STRtf -G{BEh_$fx_^S}PfQ%!S{pC`q${_)+jPLB=o!6MBb&XSU37Ut?l-t!V822<I$%ut65!-Q<^K#Mdji-SB -|tN9S8$qojBsFFySG$Zk3_QX^h-fffuD5bONpR2l;X>kyyiybw$rC;=3r*#AAqPK|RP-$ddgkG?(od? -w2Q>^q7HJy8lv`kQA;;mJ64-$u_{5oM!-CJvto!1<iio8M@BgJ=^A4G|&Cpb{kQ_hY+&seRZg{Net%$ -n&h3b*w=$-{VY;KymMEZo5&_Lc{!srJbOtK~X+x{hwQRne;JX7saYxhf9kYT{gl!m^#Uwd&S%ky;2({ -`_S7$aiYLF2lS~M*U#zWmgZW{lBC3-qSaiZ!da58s>U9X$s}#rdkg+S?Y&*)mvRCD}CKo{^HqI#vZ^z -p02}UrRxmi+-P~H#&)Q5%@3DlJ2={ucf{E{UnZ$u;d)R0?VCS4bk^0THGADHeTI(E41QPx+E#s43oye -^{^e=l72dP_i8Zkm(|XppM#ar)wfwC@3{{79Go_>gTH@Ivh~8OeW>(E~HN9qBHuf;~WzAjhqLte2`i; -NA&Wx<OtvM(+apZfd5`*WOPP25gQEVDAswS1rh7q#1M@j;nY5uiR{!=f_T9mUP2takW{6`FDRnNm4+C -P=;s<&CkC*gIeoLD`qWpZ7nj#i(zyYweLwrv@-*VYTeFO}yjTM?SHwKa#HdW-76519&Rqbjs*E;xH+H -&gZHtJ|@L-=4<x;0I|rkHdpX1YbL;s~UPwe|h|DUn|;Z{++En+1p5x)(zx;s0G)Es7+Th7R~0RvEUCh --g=QRbLY<w81V<SVh{K?JK8cW1zx^VZkuxOgVZnXH*T-s$-%)BZKj@_zJGc7(}%MsFVv2+uog1nf9|P -;vu3@~Bi)W>-%r=;P;MKk3;)!xesG|9Z)v;r=Nq+G`y&lh1$Q+<d&zD^*g-Z(Tl01|ZmGfUI;!<Wcj~ -Ju>peYq=8#t<oIfD0Cu-PhVO1JXjrRjsr#8Np`-9GGW_i@(o)_Ljt;GXmT<PlHQKdC)_X|}lGHuVT&0 -g41^3LRZmkMoe0z^$*h-PYc%GY&0aO*>i{~4^4O=%k1;)*&O`&!S%-9$Z<+`z*I@By`bRYl!S*CVHFs -*viI`p=|o(pFaOcWMvH>=_)&*7%<f;@IZYp|iW|5jxxHcP+apNy2PZtYfa@#~**}RfuZ;s@6@Hb=ui< -+giON3~7?6t+a0LAWKuBvKrXaQz+Mwuz6VRmKIT#>maA6_R3B-yH%w9N_w_SNlC_6NqXxZ@+?b}FfH@ -#Dr9q`2Vk53q6JYaj~S+X2V+~?sD!h_!7#$>J^h!bdiFfapZ$?`904LrWgp%~T~%WxqqW+;sRnI@*ja -mHKediLZ7O)y(>3(MIFyTrjF&wi0<qV!IXc_6R@|lsE46pZ54=qKu*!~vh3;js@{$9kKYK?>m)7$&yo ->TeFA6I}Rzj!W_VpvPqcWpT2Rc-#Y{dG$>d;qcml_pMIa^+$XR+!@-GR61&7Ky&MuFRU)=?EbbIIUsj -oLL@R_T04@!VD3DYsf3^F6~NdR6^+*GP}TgiTf41@-5<hj5_}aH=izHv1zONY$DbC0^WC-Mg%d_q@EP -x*guu2-9Ssj|+US2~6&7p_SZ=-f5~Mp`{K>7XP$cjJ1w_McuYmn@ZE_WGN7H-cxgPCC}L0lSUC6sXX4 -PU2SQ5eA=dqG(8BtEVhoII;JfTL$w7=(_TePcBkUFZE<_`wWa&Ip1Ew>gZtwes|WPU9xpFQH&v+JTZV -~$e=vA4*i++8l*UR4bEOX9rZ;%b1GG_#>N4{-tKOgr(y5iAZJ<{-(DUM@Qv71I-oe7~AHu@$?_pu|4` -E^S$5}Xharjj%9ByIZ@Zl_Um$&^Eja2t*?OBq#%=P6e%3FVed%IG#Bxz?N63?wq)AC-0fYk1K3+D~F% -g-^#2C8&#qgr-`wzjo*Fi(T~zq3(Y#rBr#ok+9f)otFSX^^I0;r8nGNMY(`_3>bMr~QcPc)qT*w@w2m -8>=V?LcN>Wl*L|YSD6#l!K(Ifdv)15?nW)UnpvdTdSCUL=0TNpU4{q9&*^ae{qi%4^Keewdh>Vk;fHb -jAnk1`SLAMyuov|e+N_&*SOUGTrxqPur}l1FI@FMb*JYGJPI*u52zrgjxpN2}(EG2Lv%8%At!5)jZ~s -oKp=#JJ=C5e);qC0))hH|OSB9bfYun_ikfcyeQw_XoM`$=!m4;;3n$X&&oh-CzT{}3~V@vk+(NtZeSI -X=e!8)7b-tOOm?rnVgXv$W1G*v51vnsp#z0W?^debiJ+w3XvWNi6X=}VqE!uUFl_R45KKh>gKM^|<jk -!?$H<)KyKmEFb?vfta(R;7DJ`t>z!%Mj87Eag9_-8S&L$W%4?)}VV=plyLx!(S4`L!vSJ+x#jS+wAO^ -a4jjb;0_ya7kgXIwJu9mdQVN@*%{%W$+brwUorAuAq|>Zd)nVMy@-ce>%M{md)hr%Egqo!U%`f)fe## -u|C=o6iThx^#9VLmO%>@T-RU!uZCPXw59RMnSmP%CNF<cx_(z)j+Su_|G}mUxZD04?(RJE3bkBhIdKc -aLnpJa4g%42NZk0wyw{hub(Wby(U&n7%WGlaFGN=XPAoh~r0jV*}bX~Hom=EM`(kL+Qi{2O?6qy&rIy -COc^S^9xy#}ZBzvy{!oZjjfWnvteR%u+@b$tTZHb}i{dE;o4Rhwu{C;s%>BgJ;Bxx-S-L*3HB0}KRtU -v;6LF68#>^#R90k~X7mXHoCv->SgwMl<k&=BozYSw9q@b!i^bfWy)~yrCa|{PCbnf^ZQfdPuS?wG3*5 ->Q$)T(?W;e^3uQ3cM{aRSm|pM`b=pN-Gza+*8lnFkrryjQI2ag_3-L{i_N#+d~<ty`{H)=BF&cH45ri -RH+L1jJp%HI)eh?8Z{8|`>OXHU+A{gg(p_NK@Atpa*oN><O_Qr#oK*OhcpDo(zP+efF@2>XNxp-X3jf -VxEvMX1H)_r{+Ng!K$kH!iqO91{zg4w8g(&}4i}2Uy%01a^Vr3nlJ>Nm&dsQ@dH&OM+PKvdcU6*0Fn< -$<Ct`~rvH1(RZn<UtSUpeuOwp83kdnwYr6mFR@MZTA!vK4!XyhK?YuZrp4Z5alwwwkmt#qYPvxup!k+ -}}x1L`6Lgzdn2PNQXteqWD8PxO=STd(hExkNT#;9&HKNyYUNU=yp@MmBpZwbe`>|aO(lkYqg~8At|!x -YEMTMO`7ZxSFxw7<>P17fahveh`jjgM>`0zFyGVPhnOWV3-@S_a;GDIpQ-TjXrF$})lOwU#eOZBFLRw -yxQ8fC{i{0ndN-X8itMJ?qjPGLQ0z1753>EfQh;zzV}80ve-*(pOUunZs`c92C&FMKJ}i`ryGI3sXit -xV=w=VWo*oB#)FoWc!#zD&L}47{`)0}_T9(-!by}q9-Z9iReh-D-IX!@6FUzaJ9{g|*ezXUFxCcMpgP --id>zt~+6#E3e+K1okbVXuB{#oA;2<rr{XzeY-o^rvPY-hc>D+?2gR@PmgdpxeZ^r*Vv=p{`h?GDf+g -6WM(xv6et>9U3AUp-gb$6i#J+mYHi2(#ypck!w@+S8r&p4F>5U)e*FM`|l_x0@*5v!Yj?{T_-czwaO5 -6DwJl`zVS%OJU;eF;+?X0CSV1_3Yh8)oe2VZcl&Tnz3iG(5WeV4Av(0qGYR!4YGaa^C3OXLx2BT+C;$ -ixN-M;H$V^ABklJf_HLt;;P$&=g<f0!(0+{Yd+n*&jqD)VV@}IG>UO)&qq<wWHFC@5tMa3D;d7;e%dF -bKebDbQJk+V~Yytn@>;S8N)Vy3Ojra%j=Kr(Zchx~J_`S@FPv5^jF^?l4CS~p?>WXy8#sJ=VxbbX&_2 -mNsTxvi=Rc$78eu++=(^MMp$^eLJlchQs*wTDxezuW6FZOjJjz;Uh-|D|xTpVpSs-I;N6;+5y13oCg= -L*nL)e*khxV1btz)uyB`EIGTb+U;yjA?^tu_%>6OcUiT=!mcZy=*}ZWf&~Owio(u?u8nhFiX5xZ79<+ -Q-jxL<y6EC@?(qq*dm+KN>+*@3#<OuKNPLR8u`>eg>;tj{brSg3yrS+{;2+LahVrHs^dlGC3)pHe+%H -H0b10iwH6@SyHec=W2K#0bf<~x-*4;Rf=1U9hsjczRYRw%x~O4>_P%=kC9jF@Kh!^f%{Tfvo)-P7`2~ -Cttqu0F`n$o^ZPyb<<Lloi_3xG@T1VPJQYsL7`oeKV*Z`FhgeMiSq1MlHgxM<8cegZQ{rgS*ThJI8)< -1;=YtU^J)Pkvh{!sli6!}%7vs6)j^|FRpwdGfWNMMt4o%)4$Q%gwwdf)tN@Ot)PjPx%#I-AO2PHbixu -#2AtB~-3~bu_Ml+tteYDt+*ZO4;fkC&iC8_MWjn+1M|P{n=pkV?^0a=*63rS5Y*8lL}x{>CH${EhvJv -0)MQ)rbMMbHzE4fLPXEhq^&xo{{4|)_YLePz&4>*_-R>NsQTy2>ZhOx$_)5Z^}}Fmi=$0ZqTde7YqA= -82B<~9P}P);VQOKoT3AD?dtb(0#wN6d**3I=hj$w_u_WzT3p2FJp$qgAGigxM>ECbb-z|+ksZJM*>R` -3``M&;XD1sooi7F?cCJ9c>Z$lFm{;E(bR$i0npO@9omZHoSdQDcVS7jcW-=C`AEzNyigzH$DkWz0Szi -lBGEu^8VJmTu{fU33X=lAtbLy;}RTHEVCf0USeV2p-n{{XXC|B|!#CJJxoX;r8G^SktpF?D4v^0NNb; -P3pE^6B&wKYBxuRtk3avW9(XVGZrQgZ6$4?Uyvw5wwk0jf?(uk^~>rFMW(uo9y~HOu9LbtJAwkk6)Qp -Cs_b|{&?}&6n<5^mo6u%IuHBS^NX^&*xh^DoS<p<wE;fwu_soee|`2`l+XMujqUOc@B!tUC7TLYkO!3 -PHv7;v^Oeqk<&qWT0VQh}TNJH94=GzaVO+Fw!FHBh$KO`*?y8(VNNwWZRw?Zua~VAWxlHwYPnr6#lM2 -;<-K8oU`c%KI_`LnyDWG7o$hYlL?Nd|42*p)a&xJDCuFyf`t1Zmar%C?27pKY`J$v4}))hU|c^LJd&w -Edm>0Cs24T);0%Jr<++Wo&R4Znz#UCW<7tB+q4$CPE*-CI5W#n_TxjLrR}?DzXG+h08c&K_5LoXRSmt -4gv$``J5oZcT)tHG@?wq5V<q_uC&UdYr6in(=Z!iZ0UIF!OazAlF_$mGGjX_$_Wpp4CM@Z#Mgilr2e9 -<f6Kto9}3&CV2KJh?Y^|B&;#d9<9Q=)2&1b+0qfS!>X6im^2HX`bt@<e_vGnd;09zv+X*e)yZ$(>~!= -}OY@(5Z<LJd2jQCW(iiQUd-kfOP`M9}Ry7R`>C<{pR)cnURzvgG$ozF^{u-OVCXXMfc6D0OE)A*8M!P -qx&u!X`+f9|-UG2-TAwaT370_&3GfUUp{H5c-ZB<p+(zvxc;@9rBb!5u4Z&E_)5OM202o?(cC`7HIzJ -BDv-Mc510e<ql_oR(~J<%ny9Yw0@pHw^JC(oN7)&9Btb+_KMf7T)U_E!^^#m_ndi{DK>71Q%ntw)}7? -Nzpq_<0<ueXn+hl;3A8WgS+ObULp@iPz9*!CN)uYi|PruM8?Tok_g1NH?)}|M+<w5KyZo8R(lR2*0jG -o5LiE1p4{b$`#1(6CcFwVV|T{y-J8i4csz|0*h!}#znNL*4oEGlxu@WqG(lGmZ@)>i4wXGtI)ry|5SW ->s$SHy%B(8Xn5w;V2#V?epevxfoU6SJ$jo7&B^csEyYgug-=k1{Q}ZE3OmLcopo-V0wqMg`bMU;qi0< -7Y^-CJ_de%OSO%nwYRmown)V57LeNg?PPNO7{Nm)FQS6$>kwE?f5bB)6Mhx$R{>OEq84YfAmzcn`ew< -=N2JfgDlZo=w0UwxeQqIX`Xiu4uoI-k+^nkR@o@bTi2tD$x!I37(7pZD|uU;pm7-&6k`_D^2+dS{<Mz -VCfHfBmkanvBPz(es9CfQ9PwyVJ8*=kLx=>$--6V^i0#u4{18Q`NkCeR0;ic>lw}wD<3y-(Q|wp1*(B -dwcTnuT{Cj{!kaI%Z+ro{$Q%gUnshFy-#mXE-rc(XP1{}AA7HQKb&8_>AiXX{;y4w!=Y*NuxawF*E@a -x`MX_B9uG%-Q*K<B8%}zv;*aM)zkhdma?v}xxH$jt>HJgM4#YHR=#{umPhP)1``D6<4areMGBB(V<<X -#z{vKET9llhRzI}gs{_0%yvgz#0^N%k-zkPLa_G9nl<;$~omrXl|V0~J*Gg7R4P$k};U#O<cu#Ltf*p -phYlYT4MmnR?2bw``lKGmXqdGhi7ySAaJY3RGAp(%#*?A7JLhxh02R9&xoCl$;g>CxyIJiM%V7!Nx<o -WDM~{QU8(_x`M_aHrc8Zgf0A-Dh>(N2go*_p{wU(Z;K7Z7|iezeDvWt*oYlMi14{Y9X}(bE@Is$P{a5 -j1uw3^Ve^7mm3-#n2wrqFPr8Xg>x4hm}2d0Ic=NUSq{BxXNzL@yU$A9TCE(Q>Slrr6lZ7el;(eW)6$s -9I&EgiK(TT57BojAsO+?v8>gygwH3HLzc{TG<oNIyb=9+Apjo>7cyfAHan93VggV=4FmT!z$0Qg-((N -RGO{*mLpjj{l3+*fzSuE_B1JfOIfCSdgfiq|4Ix}E&H0hbLubQ&QTjtMCb?MXdle3R!+Ab>JQ*E8kn# -IL(m*Zllo#kcykGI~`|8CN}`a|cs%_<K%MES;RJvob`DjEBiJAcx8=@oF+fxi8qLI0J0&m_R}s~3i=V -gm`Cb-?pX?NMrQ*&p=H&gjICGQXjgz*!f1-&Sxq=o{!FtD&FOPJ9rI`(}f6vdq+q-qg~U&{+qpBjs)N -qbV3)dwvGKL7xN-bm)!E?(QUArU|IQO1fDHE=R`(wb{h?ugav#WoWDHPr!iQrZ(J;1#s4Z=Dv`{;nW8 -zkCvwT;TW71Q5>{F8cFD^11{^Ndj&gW*vtlgr}lk$?By%d;$Q+?c4I^r9ufF9G%_9aLC?c(#PVHOy^v -t)AB};@lC+HDC~uL2p$}w1qij^`J6nlRTW92^2E{5p49tjrXNEyGU9LCbwPE<s?2=!;p&ky6KwiH8@K -Y^UZ_2P)2S`&+YuyBhjcG0z5;Q8j_%vEn-{&YI^|xX7a11iFd%Y(anxMc--^*CbeIUXhY8B*2LT6pDn -d7>WW5ClSN(v0DnQ||Kv_Jt9ig>B3kDF1wo1>yCi}tiFb2mrRi_F!nRb({71FhmR4oxkJq3KlO-bP88 -13Qt}4>2Rh5?LMc0*gj<&hl+k9o`pdnKc<8F@!QCQbkr~@%?G_Anm{FOlM<820@q3qCju-H#X41k${^ -5-q9ft$ucWL8Y@_>mvRt?3qm-1G{kf;GfoW;777K<(xCKFDb|4M2r<m|i_KWFmsy${$$P|J$Ap5fl4j -G0pgheEjlfS`lj>9{Qs%9UnVZ6(o&JTa0J?qpiNUDoX9gSgPrc<bG|H{^NI+!Jd5^&Pij1)t+EZ(ahd -_`q26+e>_m2q5#un7Ju|<hUEw;*K@xAzj+=%(1g8)-f+1{y>K+lI0wvEFea1g#W4#EF&U@x%}>I!@!S -*LIUhCVUrw5-N3oOYI!IZ&;&@{S2c=BG~_q{W&3)BslXK2W;vTj$zB(z#o$F}KM{mZi6*8_@ik;v!rW -7Dc~H@lofMSY(G?vdb`ZDPxUS)~3_g(c;)m)ot)-;dMz}WK&7zVtwc!A>N0!7(Z{U3I;abA?UHB`991 -leN=uD29jv(^3zcVM@6TDF52dDA!--i&WP-m!WoHwUmcB`Mpz+hDkUYGCbVfJ!C)S^3Ai`o3DdOWVYj -sC5Lr$6gDn)Its^E9!+vOCq&z)Q(AzexIx7&^*7wb>j8(?^clPeJfgTz)Kf8QW&uYv_1)6nWypNko=& -S>l3&Q}7(LPQBXI&_{yJm3D*t^4S;mlqv%+xyL?VSakb-?v85>_c-#0GCL1bkE6f715^KPe-dnNc1u= -7L1cODCBJGO;NfpykdwU`+ejCXe8asm0SwMPc#1BMIlVO8Fu~LPl{k&!Tb-T}NZQUxB-QmPczeWc2fl -*L0)NXV@9e88+(x^*hb*dHblh$(z!5AhBqg241n!n0fZf)()enuk=Ux0_XVol4k1w8ijq;8K?lL>?9` -Vrw>G#MapDn@MTBFy1Wt+H{jR81vHX*eW_u8#?P7j?XA}|BqIS23<7?`YZ;3f7z6y8c4`VS90I|6wE= -2kZx9XhOdcAEytc>6$oKUUj<p%U*BzmQ&*~kyOgcZ4u?u|>!p$EBbBp9v8OK&FM;1x*kC_PG&>|2m9N -EP`#a>cabJp&MoVA!~ukDq9+NM31>C~H(kL;cgjeOsDerT4BA-3Reyt<nIX#irJG0oo4h8f%aH&HxS8 -vaRV&HxQ|#6B(nIE%jMZyClH5w?|M%$zqoIjB0h_zlep@upl??vwr(wl8F~9OFZ?pq}$mG%yNu{udJv -RV`t!eg2;3r<u0rynqH0I_rRGoeTwV)`b#tX4N?7*#&ETPD2Fe?3~v~UqWXc@Y+>_SRSEM3a+0F&hF1 -)tifabEULp{KIfo-Pf%-zGG|oQ-1Nd;i|W%K5w7++u!6(>WYi%Lv6lV>HHg(2VTg0v{v1NqDX)RXVx6 -<%!Z|xHcn3KcLQ3To>(c~qvz9IxHnV|$5z}>a2skN@Vec=t{WUuImrhsB@c*S_gT_FG8S`)Y^%vPM!` -5F#oYU0vSF!3Do%pM_*^rct;{8=FQlkkF)N7F2y*2~<*G{jEPW-jgYtzbw;MNHDqFST>4L@h{w+zuDh -J4|z=K*zd4n$&B#UtchU3k?eoY}2_%X+~<9t5r~q|XlL<-!sr8fQ@gs(0V|63KV<w|>Chu^^G#(0&I; -o2dbI`3CLSaN|@;Q@sqU_q1B<s4tqYcgr0XCz7Vxo>}`tL@!$!dwV!?6Nug6lxbeYDaw!F@ob5SOb<H -*7LQohta!=L8(A1@^Lc2Y?ai^^?J|q1J4B}T`Ot;tj>9Z5g<N^(f{8lnVe>JNB#vR~OA0$&uyCQp5D9 -&;i~C)qC@ciwZHatoT=iWnZ%fQedySQBEdO#CcueAOP$!JHOCJd=yQZEuV3f-*4Vb`kO3`cEo<iJU5@ -%r-aaT&{;W`q|461U+`o=ci6}~%SA{W7g2|DaiM6tzp2a;lmn#e@}GtgOPFi~~7vcqIf1%b;>fJfnTV -3ct3I+#N%r3;N!{(`m>re|+)tTDyG!&_b&%v^b^7Lsx;b^?8b+unw;GT34(Y-I4((kJ*$)w!BDKEoFC -ZAYkPX1x`AYm_Ll$QriaiN)OX{GD8_F<|fHN{Z;jJGqkLz~>!{%S^C$;nLHW=v-pMj;E!%Tt)uX1BjA -+G&<6;n=UWHz`gOMeP&H&8yM1@ci}DecIK+YJA0&!`n^lPQ;l62j$q;6rAdWS%RMoD=Me#IGO>euhXW -HY^a<)Xvm7#7p5{#g!tDsdPl&7&X`C`r+VZ}QvIBTpU6CrHsjTqXA>leBw&)@y14n}{g)1h~VPmU~Y@ -?J>l4+N~87SFSo3%Lcuy2V5bZT;i1v*4dR|w9yMIpVRot4R!g@(#G6<Qc;{Q4HU;}0BL1lEjoFuBDya -8g?1z{<GGmUv!QvE4>Rc`Y5v4_T<JE#*xd_Z?Wtzt<g(mayB~VaOGJ3~zJ*qBE^|%<2QDj-t%Bk+7x& -{SIq_)?$q<QXR1VRL*nkbcV;>t}>lf-Oxd{(fy@-mo9^n(yDUAgcff@ZQg@nheB3yEZQo4UuWn8J8)p --aL*kqH-xU?c2#JpwnM14oQ_A1&bcIX%;wLs_yZed*{DMs-!<3dl{7R~8{E8eIYT3zI0(v8-XM;%-*M -g`fywzY3jF?zqpa9hy{B+0jz!;dIF-N%r($#Up2DdNC0ESY)%U?X_7FtFiS>KiT>*m>R1GZXtOFMD(? -cI{<&+tzK(6oCk)QF&pIOA;cYI#scD&z&$@UyDze8pb7`1*66O9bf_Z=nhfQqZnpI2Qzme5%T%o;P6( -3t~F;aU&bXzxvMG?*}K)&VNBO<LW@@ll1z$ORq+9UR4uMu=Ky><3S$_N>Aj`K5HW_CddqN@+hsWO99A -{WGKb!B#V)+8;O{(RAwr0gbNeT@s}s-p$R-({IqIO-r~@W{(bOz_0M1jTU}@BFyIiS_|)yXQS*@*Ty@ -n?~!j4S*AAxUg-qJ6N0kx0{hf#x=Ax}bO22PlDNSh?L$ZHA&8s?!RWWXnovO>Gh}9g?BO=L_3vUNjAZ -}4!-kR9$L}cKJH^KN<Js$Gn-mgg)`7`gE++g(5qh2j%qfI@1{X2dFq-;NZk7>s`zSZdV=6)C184wx3s -bhuE1TN{uFMCU=<~)wHpTYoBcH8-g;feIFcYqh);Oc&Q%NHuI>Rnf#L359d^d809K?#M6DXG)Y>AW~S -wyZ-`8enh*|GBB777temA$f}<#T})vF@RbvVz?c8*lS()!hkqkDPevw>wF!fVb?RGvbZo=!V9@u5Xdp -LF>?o7owJ`VUJedffdE2K)fyakROE+gOccHx~)UuDK@VkU7>P}kO*-Sm_nSGeq|h<hOu{#t0dEf>H4Q -P@~*`c2nHKV_38bqOGcPs_+;5mW3E57uB2KxK`kvI!akoYOBe#dC%a>+iMTPH{$wvIM*Tmn)C#vNH?$ -(yb!t};>@-*vg`GQ!3sj$?C8a0fl&VU(s;@y{^@Zd+&MriJozWct0?X{JfkZg-2uKd@t+Wd*XZUnr({ -#4aZUU>Cp``kp2tJ{~9d`gaQ_vm`C#H&N1BK19dTJxA4J%b<ZN`u0Hp<?K+jy4?7}!Mi?wjzd%a!L^@ -IPVc9wM~-i7#z1)ZV+>C`$rIgcpJ{bzZ)C|M6Y32?+&o)`9Aav}URx&F)f|A$09hOnWmJmtHfn1t8dH -<G}aQGCzb6<_D2*Ve|mC&5RMsW&273-0VZbakk7c;GI*A@k0L>=P-`53S+UQh9Gm+6*L(Mq$6T776ew -f1RQs45=JP~PgaO)8o+g?>;fopAcwQv&m05sBy`pVbK1v(!KqqD;Aj}(eV&WVosi(189Fgi{Y+t&xd6 -_(P|_VE`Oh-Ug0=s%tyD(bpE=AjmC#uSEW#`}iqc=nGLFn|5-LLgiw;u60LB9C3<3lo5y@&J0T(Bl#} -K_pL&JId=Z?~0P`0kQ4MyDe7+T1#SAdJeuKOrc!aBE0=*mX;>SF=79Cbok{vUNF=w6qgavSFv`a}@89 -GD|e(0)D`GMIDliC5gd*2;#C+cO=j-)ETwIDwWUp5-%aW&^)J<?GZ4MtncVD0|qgf6vh-)2HtPQOQ)m -v1%h*>U$bV+>ZG^%&67=fXLySS>R5Td1PbFneqR&F`q*H5E*S)ju1^~X)LSVC%o&>+gOP2Z36_Mbf%t -};oo;g8nU^OGByqUAbffpmi?e#;f9b6<3HGpp{5RFMg@Q9FlNU7N4q|wD?dX0ku~^Zrx9Zzf9y13#_} -hAqyhH~f8tzb-1q!REEcBepLq2PBy`pROR-J>r>ad?f3k&O=GRYle{mG>Q>VXX@P0B=RX1*w@@IDBFb -{r~+eVy&|14cJIK+I-7yj1IoHhj){O2%BtJk-;C3yTSTrsf4_u<h8-pk`m=;w|wj9v6-+;FJo@wgG#d -J)8^kZ}`~iNH(${ux25!#FB{Te!#}^Wd`Jl+z=Zg`tLRjI8Ipfb7wDAo<=4&9f>nofUA_ff||88y}vn -mFPD)K{%H7*a;$V94_*E1Um61hQe%CPB_1M0wd<hS5Fuon|Pu}!d~ka>+m*=*Cby6KsTlF#D#)-{Eo_ -)5CrxKoX6<~mxQqlC=@QTBOXJc>>)zR3To<@VxuHufP#FT6aNE=@I2IYY@y~rO)ZoUlxLw3yTUr(pon -kZLM?y_EYuRH&_b<%S`dn3EE0Z$c)~oiFkpPjEaXtWA@-9R(Ox|FY3P?<XhSo?`H&|c*FlMn<wg^f1B -9X37+d0DBjRm5+AMj9{(Bp8D=<=<2pWNnVD$=<20sC0lcje~HZ+1?ghAza^9O-{kKX(tXvZAG)HKrlZ -vfn{odVHtW&~qLXSPV}@c7J@z{ZtDR=)>VmVmeR8!xEimf#-ZICGKFXZV||U7D&3a~!)PjS4Ln9=X37 -yOHOKW5&_l*WoCzFeECUaM=wx%X3DEhmFP(0ZYWFd1lffY454Qg+QT0+r+>N7Q`7`m#OJGmYaF?suFr -WmI&8#OY>0Qf;P5yiapOf<c$@{zIvbut_65y_XLis0@K<>)fBg3h<!Gq6?1zzHFJ3$Eq$^HIHb}D_>s -eLD2h-J5xaSXNCVPJ++ft04Q=y1ET9@CQycosLw-$ddAJg$Q54>tkfub-qB(lf+ho%L(mzn3?(v-aQA -%zP33cP#04l`omTk-Y%A;-e6t~QD0O%^#&)Cu8iw$dq&bM8`uCRr5OgDyKCh$@ap_4`@_8S_~1E#5tr -BKl^5hZ30QjlvNUk!$aemZ3MA>adoj|finq`s+tjBL1hvp@cmp0rp36!^M~ZZHuBHXd3!LYlz5vuuI^ -dhQBg4+SmKwG(k$M5GH~IK4Z)Fdf0e85;f(@I!{jfKM2n0Zx40y#ct-V3UC}o^Um9J_9~wcmO!F^QHu -x+5b%43K&k^@)%Ct@)=IuVt&2{c)(zEcf!?t4|XOjo$tZUgvImy3h+6@!6r@vG@RI65PS~LX6iHl0m) -~~aFP!<5TIe!(7ON)_qoI1zt7|=8g_1WMZ?b8iI=#>Ls313eZ=apmT$eWC^q7uw~#Qx-VZ(Iw<Iy~IF -uwN=C>p<2{^<wV192PCYJUMsS#`G4XF{U-3_tBJ-fj$j97d(U~?$gAvQt3)eqb9zT!N)QLa<%R3g)(h -R!<Rj(?14oQLbkw2Sc8e2ep!6PxV#<!RI1Ul@d)ANDpHzRGbRdqk$P#4{p&?2$AW#}ESHeC<GkvAgjE -oVGCw0l#)2eCtukBOuT&5-1duck;+nR)~4VPR${gp~^gLqBMd_aNF#0A;_x`IdSz%xd{7&%t(Ytu@*5 -mdKSay+B|HAeCts>Lg3xY@JK>uU9fof64FpzrdE9c&+!rumN{R%hY9I{8MrLW3qvj6eF#kbRWmh}1Z? -I4hFRcvWz)C3aKuym6>UmrboJK+%+x?4Yz5cf7IfmU!=MqwMt+QJKLs^YV+uc>$Aj`FG?-?_m@D_=us -V-oCvq_N92CNZ9L(pEq+JauE3-j-GVUczM1yL#_0>9KSIC=~;nd<N5GNCe&?s!^?&u;B+wnf3)`)+2* -exkU&S%c>to^v08~vWZOR3;xRJc&)Mbd8th?qT;h-)XNeHrAr0M#x24}!t4VZ)}u3v4p6>S~0YeL9fH -J9+{I>#y9Xj~UFy4R;T%U<uAi{Ei1toz}0Vg6%#b?i-z(GHm7o=9G8`wa7T%0Ko~LpHw{}`pyar8PZz -l;Q;{+MvNCH!3vI50VzuwOym%BLGm1uj+TMy0aBK6t*6F7d*O@tWw@bB`XRw{Ot^sBh=r6U5`ml5@Gm -&ZfOmEjRIQ)9OcJ+p{hTm@*H5mDMRLq-<8aj@r7U?}^{jQZl$vlP5l9VyZ|LjWC*k!b3w@_BD{Nl+Zj -mai2uH|*RzQNwWnt2&_o0N&9N-(5ZJ%@rEYnWC-^L_`0hzx}G!z<qE8v(2_px8JOQ@nZ;~1RKfZ&!?@ -P;x$urUg(*Mj>%#3JT)3<Redp?+Fd`hz}$5tcyeXJE&O7Qj%J5WUtLSgsceaCp;<A`Xw}+1<eI?tn1V -Ej&~isL7IJP4V!$TM#zkc|<!EXx4@C3&@C81-9P>Ru)kXt(qe9F|fTU6j^yNX7omlhP(3dgUG}71~&$ -Rt?wB(7`aGK7@Irc=C(f6Ct8Zf3Tc3&Ji;owAZ8mW-Qi&m1&i842^+eFI8Edx+-H26+_@0HlWHMW5yX -C)8BRwCohw9^8lyYH?jT6xxS4+c1u%Q%#-wz<YptN{-1G&UZ92k53M#`DG>y|jgewp;&>AmdutSe3)b -~ZYrxqCUPM#K-2!%6vxJ5MC6jEvICQTDzdi{}uLfT%^?aVSQWQ;O7a0^0+fisI$&~aR*gd*j@*qKm(z -IFh)Snu{iqQXO25Ii%1i7_5D(%=Q)P`#38I-bc1$`#vv)N?Ds=u<>Xf-l@J6!;P?d96QM7*u#lS+8Uv -#U~S>lp&{xOeJ*I1?T)~021v&>lNZT5ZHSR5kC$o7sM05Sr;lkgMhIOdC!UuZ;Dro(R<uk!~Qm02$>8 -4w@f=Q$hE*;F65MuV+oyg!H6j!;YUGvtAV6!yyNfT6{1i--V<iXbVV>DM9^x0O?enoqho@KMp21;ff? -24MbgL%M_v`2lkhFnjT4b?1|zff<A|$590DOq01T!m^Ai!PFkxbhpM3cl6786O49$jeB$4K-!8vRT4& -6g>bcY9B#M$e7%wRqdmzWy^hY<;{MNEM>z1})it~r8=XB8D(U;bDYnM)^YWX!LBkn-q+{TlHnf`t?df -w{7e!vq}P<?xWN7hd030!GW3n6(f*8^kFIUVQxrJmq4Q?gQ=?75j~tDMfSHe$gk;tOG+L#++fZE-*tD -0P=~#JHMv=CqN>SG|h&)P3RXMU#g-vX+u2e?XrgpPd^K`lukC;#RXejGhr9XT%fuMV!(?<ga;)Sb1=D -B2sjmp1p-aj1{qb!Cd{BOesAH6-wiDG$X^Zs7FD3Pagi9!A7e+bNYZxA@6)ZjMaP6du4(2u-y~NE6GI -*1VGIpM?i_s1#YR77K=D8Lw2RF12g6#O<`#731RL8sz!a(whYh(ep))6Vj9SJ5F#%#K5XV5w88IY=4h -4eRm@s10avDnL%n7Dijs$`j5`8<Q632`fQ{Oy+psIwhj|jnB!M^orK4p|GF@o>0=y<<IeoN%y;!u2f2 -H)Y>^lT}Qk+7`DjUcj7me#BF0T762;X>lldduF}+od>W!BylX2Mo}vc(UHiJ&GqGYO<t{9pT#3l1v!W -USGRp)hu>ci9(=qHxw~34?)_cSXMl|gjFL_V1^ck2J4Ve+%*~P(@5eCS5lX@wFCxnZe$rOm#)|Tmuh< -sR}znOEX6Jy<3*Q8L5mMZcrcX9*n{9OF!Aqzg5iWT8@wf~dLDy0wNs!Fk4E~=lFlbA@U^p9b`9WjFFT -eWRdv5)wG^-EgF~(xpBz~78MlYqX&O#j11LpxNcd;`oLRqFYmW#_nYMUEW+}GA0nx`FXd?@+a9Ic!&_ -k}U@-gkvnJ|uBw_`$VV;~E!WA~>dDx5&F`75&6{e1|9*)jw-VOCfwVa>!Fp{5eK5)ojd*()!~c#Glz5 -idF`_R3pFG2$yYTV8n?M_do78V(E}GFV(eJ!TBu14Pqwv5expEBR##qXDZ>`6v{Av=Aa>NjT+$K^VAE -y$Um*b~K3htZW;Hx~}q2M4SZbR-({QDk3)MX1XpA*c#$R_Enl*b)QnkLZI=ES2U17x$0OADl2dEp#vQ -k0K+7{?#csYeWt@G{OVq$xZqOu>VC6A8ZR9mL>wy$By`pR8$&}Me~2jV6AIw03njn6XlcYzADjk8dWT -fkfbeK!woL-Mz$Ge7$H>+vqZtuLcYFz*b-*S{NFU#b)c@FNCu(tw4ADi&0>SrbKn3uj3$>Ru3KRV<zK -;TN%Ws9u2@X$+!k-!*(??+FqZt~dw;%3O=4`4@Ur&nGW}~F0?h(KnbL`fq<7zr?zy}2C$I_tIL`@<ZB -I;kkDfx8@hc!x4_9}@{9)&qUeSSH}BSg5Q@EhI5tKxE7OT}KcGW$Ib!AXVU<Ny!Hvr)?478sVFNLc`G -+Y~g<pGbinjkYyht>euyw2;tQ2i!4B7>?XMtO|@J6K}I?xQM`y8G~gTF9=m|#FiE#M%=iXM&=nZY9s5 -DFknc0ItBaB2oaqH!)7+{clk+}G2mp!Omn~6X2|Hs?>x!q(Y)U~Lv9rK_s+0@EBUDyIIO?R{u(h~iI2 -ZPt1CD~DUH3jvOZ;U1O#;)_1GOZ99=ClTq^0)(f5@|S~G&Z5*rkw&{rKf0cFbxcPHW#b_?*rM=YE=A} -_oMF-shS#NuT@yzdc{-#7sfrwqraLZl2B&5f-O*?>jQKGQw~O08aq4-Tj@@$nl37-I1P;W2~hhT(wW2 -nmV;v~e2)dR?Z?Iz1P_Sr^J~ZJ)s=af!ZRQ^6N_;tb&kjbTK<2v}+I=rkhU03mqVQ1+52L3@fR_7t&r -qjBKT2*6R`7NlNL3wSox^8yCblih*bk;HSMj6UFWlkEsEp2TzWFw1`kSWWylf?Z+VCCydvJcgd&6|Wj -o0)rk{pGd-tvFwUZ2#AP2K@|H<N*j1*3j{6$AJ>L)sV$Zl^Lzm(9~}$^Ss+e%j|fxdj5?&o`SCnRp2A -(w>CUc$=0S^NePQ)d_~yi(?_|*@eTf1YYxEHwjW?}O+Q1PLI5s}hLpK3cG3ih=j1bMdLz7>Z(bC#viQ -W_|wSZXJCR7atzhFB#c1VnK41l<`V~5my?uK#{=9u6dJ4C8cY{w1<76!2!yql&_+%?MtC?v-Yxm0e)X -~v8c@t6r?!fQH56vEUvM)InrkX-CYR4D>7P+}`33%a@3@^!D+_AX#Rm#(Il6t{$|b*#lTV-&n}%@hrX -(Z;==cr}mdHX-y&crIX(KKy|?#6n23ugZo(jt1pJ#i9dK1c2k1vs>^brC5Fq3I}`fIxP|88_g|*=dVH -+l7nPWdJ)T=GFWOMp(r4FM9}Lk;A>~IB9@DxPlc!B6P)8i82psiOs>cIDXX!KcYUeqh>6zTCdbr2TKJ -4~l_nO_O*e6toQf7NbGJNdfl?o)WCl8}G>JoGKMV<By&n&)PjC4G#ejN$JGbA7i_<SgQIV-;-C>p(Ji ->uv_PFiXQ-&bGIwgZBQmSc<%It{-bDhy5&r4P&Cm@7_)a*X(4KkXRL+st+++&x7+|ABD2DZ!j`LTG5e -U)bp0mEr$LJVEcEl)5PPSde~lhcH8vOa_cUaA<xzv1W1`pqlpgur~B0SOgbmaoc3aJdJT-#|670iM#@ -VV{6dU70vEp(12{kzJ|5^nAr3!;y4|RLi)`0_k3Qgp!$uXuEs3acsE?;&8)4t~uFoh|Q;tJ66y;ykUb -_qyTd2$dJHz03B)Y8XV%$3xT1X*@U2EJUa;C0^>BSMoO!BD3RnE;|NpVh=V~G;|kf@=Wii<@IKbO6ES -voEwlI0bm-+}76#U<NM@3+Z7&DIv4Ri~QmQ^|QV$5CuoZCDh0<$FBZ79Gv{5jgdk6?AgqnO!#YYl4>w --B?8Ucz5j^~bW-@8K4t7FF!Q9}3-O6=3+r8&U3;!Y<~>ty5p^5HrSD7|t>YSdXKp%5EaMIG~vZs$e&j -8WA)RD|b+;drh~ZMNuEFz$D)OE)}u%{c(Sh)*je;@kGWh)*gh+>Jnrg53|Y;*xf<<%_Jio|B00m)ceH -2Qn?5E|@3li)xAEwS3(CNvt<L2_fH*1e4wz=?p_$%1*2=RvrQ&9ze5L=jXAe1m*X!tPWZ4UUjfWZxk0 -?rF;a7Fa_Q&m`p+e$H7JygH1ZlE0cM?X)J!9VY4o9*Vh3P`?9=+7MJcu1Qy>0C3^X7&<POYCg_oX%d4 -O^2YkB^!^!3ynlH^e_@!VE1QUu#Ggu1wENO}pD2<>9sVLxnZ8r&JBCORlD|Z*23-viWIG_?TgVwH3X0 -9GegzHP1iM_5FTb+o+H>)Aa6+<#`!f9a=e7&oxPI_2}BHw`&el}*ul8o4bpqUFS@<_-^ibM}GOe@;Fd -AProU`v54k|d&|HJ_lcEC>rEqz+Vt2ws3#oRpCH7bhQ<ykwA{>f)6dVkBn>uLmZMFsUbyuI!AED6ZYL -iWs2HcsCT-p~!b4U0)ha<US4aA}*ZNylo6U0f(dz+DL?RhuS;t3v{vd;}9z_FIq_$AO21SoKJr(F=(_ -r1a=VIc-v~G=P(gUsWG@UfiQ`}@SN}koLjLl)JiBZ)C%;SZ;`;O)L<`;DS=hukpAf{f?vcVVhLwssQF -;YXp_d`r3j2GU7JUGs)G6@X$K?dgvnlc#l3M+TS#wpbjxMJDnPMBumx{vRB$}cIvUy4iQKiRJ+EBH5m -dLBFA`1?!BEos0*J&bs1P6{AVB*&s7c4?hdYq#&-iSan-y-C?uaFLz+m#D4h8($iP*-#7JbgI`Kbu{o -Na|6CoZIp(g$&l4;c)%*SBqeXy#bJcYWZt!Bb~DWy!+3n)ThIufLOXy<?o|EeS+YHJJKnFDF7^2!Lz& -uJ7D7c<!TJR`k(sw%}xLl%$tuaWOXGmuDHw2P;&y<FQ9xqZm*8(_-a(3X-R-AmBPMfoaoBz<R>`GXX+ -e#v0(wc!l7^T`Vy-a`T9)Z{COlcc}Oc@Am?06s^w|Km<497KB}@P5HLrR!$+-tQ&UGrhO_Rj-T!N+E8 -p4F2j~KJ`=5t2q6o0Iwl^0^DXSH*d}4DZsj&<#0XkxL;?3_OOo3}?03w#r>>`=Qc9IYPFl*TvJ7^<Aj -RJbqNk%$<j^7wE~Ok=hSCPqjCi``)v46_^6~%(xcnXr1wXbs#O>r%U%JOJ2jWs`D84U^?k_ka9S0q$z -3)R!l>SJW|0$*FV#kwmsxE_Z+=GLXl+)d(2!N)mR{8kb(5d?ws8l{RgprFyM~PlM)ig!kRm$18^u^?q -&Z>~Dmda0CV_?Ont#OEvTA#Ki(bKX&#alb6_1q>9_GSSQ3~`8v2yeOx>Cq)5q^9!OP7DCK8_+=c-Vwx -xV>S<mlM0IP`~WAA6&$I`60>M_H6Fue4&b_m%>``M1x8EGiiQL;%HkLk*!sQ#1enq170`3OT|^zB?}9 -ImC3MyW<1*S1PZ6Z-0E{Jc<^c1-8KO-!!lRR5^ws3lE(C1W0p8Fg9U-zNe9|#Ny=E9D44b)t(x2u!X! --GAy6rt0!Fh9Lz-*AsY*SOgZw$%55G-mkvtJNwjkK;l?sfBAqGzBLxCrqub{`q<8{4#kaelvXLQo|6; -t_<+$~@aw=^MndqDKKIIMd!x<={Rl{MDAL&>L<S?8IJzmnrG8OO2pwFd<`bsah0i?9IP2M0|PzZi7bA -@l(ifQDVrLz_^k0uup}cbEz>SFyW6xP3z{_G~7n7p)(hlHFh{*OmT~3GB`4ub+;P5!ihKn*zA~mDpe* -yV<JZaIO{+u^~(bgo1!_9QkWkLi40sI8BE442<kgq41Fu%h+7E#<|RCLJ2KS42s?`j>s*E9Z5Vuw3MJ -B$ju|C_fzUwtX7f<M>1>7=NY0#%b3zvLyOkw+){>@`T2Z~2%=9p16#F%!!H`jTnJs{#;ZNz*G+=O%Iu -Y9hRc2)4kqxuy#9|;6db$NZ{-#WP-U%ASwQXHZ<JazsVAq|wWF&Ge2Nvu9b%$Lu#ji`R2s8a{OM31!V -62$ZRIbfj`R@Y6kAW<JX`;Z788VZgOx~ZE1J2+fz%tL>2q=^HCkzvrxD;V*D}P9III6>e144>Vg^z&< -aA}b~WSw<xQjCD&Y{4mm>0ZQ;;q=PanBjb1f+{jMBjDX;bTfjXyrCU37!!JWG-d={nUHY08G#%dI|$2 -gzDf}?g0E6|jNq#jJ|pNV#i8IzT%|Z<3}2-XY;jN+aH(X(RT06Gz%Q-fi8$d#8F`lijmWzcU<!9B{!_ -qe;$I2IcPV^^i@Ow|#NaLkE(K)rARL*+nf0~%BSP?93M$ZqYQa0-!9t7TE(NL$VtF+J70X)|fq-XD1Z -OltydhE)24p@ISX^tJGe%x(6@_TX(RAqJ8#Eq)n-@rNh?todNC{>oucN$`ybc!a)dbd0WTYdAk%^3SI -NF(&k&dpK{4lk?Q8g*u>;u?wnlkJn<qedPAaGql@dqvvO0=VXXad(Il*0~1_XdeCXq*>Orh>$A!Gw&7 -rf}Ubp=R(v9o>q^^!?P%Q(F*|%<o6XVv$>nR$@vahJsj$`U8oOiTXe$;wgEkuFQ=O2+q0jL@#pVVFqM -g`Gnw>7c?T2$SbEdth{op7;PiZ7(zim+(^nc_Gu~fS*CwOGpr<RjBCd&L%-Q%LE3Hh^sfYAV>lJ?%!R -Phm!TDwQi4nIp6Qgq9D-*!y>oiZa85UvA}>W58kus8LS{QOfUA&OPMNWO`CJIY^neawkz$?uw52%&ly -@}81m<NC+gEv#3kxj|atSIH(FG8E^LtFy@WyLGU}lp#DmPwJAZ)E20VVc6#1gI6=r70dvFXuZ#5z1d4 -nZK5JeR3zkh7JlHf995tfGLhwuJH9%#$OA&APzmLqan^^xH4s0%8oUSD6PBMkP-89kSEmC+5~djrd%? -?M*kGuWtr@f^4sRB|phBB?N&Xm`<+1NT7CvHuF{c`H6r)vkoj;((`agQ>fqzAcg{Q<3#W|9zjKhrAG) -#Sr{?++6|{SdP4@&XPEi~r)RVR2GbqD1;Hsz6Pcq5E*Gdn!pO(1Acrk?+4Hp;s$E*S_VN`h1@>Y2+J2 -N4Tx`*eb%br_h~ab#-6JT4)O-fhWpiKN5XsX;!77Vl%^|}#1fWlJ9Wt1s{TPdmyMQtqF91&y97fd$@d -y>;T*n9bHGg0W7sDzzop6k-e)ESzhwwEjI2Ajzi-~NQg@8lza4WS!h-{FBjiPxX%MpKq0m?doXI~+>A -*+nl5S7EH`)CodzAGvb@HI&Lu1hC)OWY&x_+c=XTkZPR`Jlh`ic>p8+T=H21$Y5Cbg9U^DlNtS404Bp -k6{AFwp$sxLnSn3NKj6nA~4%oB*4gostJR+09pQWu5X$EGawAPIJixx;naplaA7^?+%;)Er-YGtUJ}8 -{PZJw;?Uswe@dv8}e>Lvf-6=k3fxE8}^fjeGG{xUdB8mD=ueS6%hZDz)>>N%6j1_5VjOZLrcmgX9Cnf -^5#UWLwEq-SS=z!D&+sO$n_~m9$tN47%u$cqczIZ%j*vtVOHLwxGW)2{RpP`(jM_@6NLPm&@r@`Wcz9 -R;UId({x6`jT(`BQ=6Mz}V4H<c7=BWEm2h-a+NaN?M25;N8(#j<h}C4%SIk&U``OWB^6^A7IX&AOPEJ -P1N?hXO(K5<JN4GK_(hT{d9^ElQ$**x3*!5!(~YhA(l{1Qzk-tqM4^p=!}tLi8i7YlVl5N9dOPZau)( -ws;JL*ytiSBm6s~Qhe3AkCUGwjOhq=g!AOW-aQ#RQLMr&G+%@mBCDlBEK>S5j==GQcgF&r-y@qV7zos -j6A}4W_Kmq?fpu?c6iR%DVhY3+r+!jhTWd<Q=IkE<whB1wK=~=VAs&ycVnL1090}me38lS%Un1yY5si -{Y(Nls{#`(x)k%l-UKuT9Zr@Xjzt)TP?^bz*l3L&l=4+vrH4#te4Y!eSb*&@w}CybVLxDK{5FTkk+w) -Jfevhi0DN^4OZ`=&1nxe}!5O@J-=(KLG-0*Wd7Hcq5YQ}l0J=Coj*X7xDaszY~+Vi)TnPO4C11sO3LI -c)?3f*1TS1)lCIvQ79Uf{!u6wS%Iw4VV&&>=raigjf)WEaVdvc-E`9jSvnR;!vfyO;@28IPRf^7K!U7 -nwdVOSbL0qm*V8xC`ie9$DV}Fx?o<VQ1x8A4H*)gpZ3T5B_(Af&joPSg_6v{wfx@S7;ur1jQg6UJVyk -J*6A7{tkuP6NXbdVQwg1Qz~a+>n6{<3g$Y-%lutcjP_2*F`4Yj;$}mcN77dNd_nV9<Ek!yo-g`1>mL8 -FshmrvkkIdo-yX;t2Gk403rRf;3jpJK%80U@aLvtkF7H@sx6LJ<=!^Z^Y%$+fV&10$~<e!w*zMM-meW -PPSNXq(>T_6!Wnv4>o36}Z5aDb3-Db8$2B|8=l^ILw+4%#PQyTvhlDUOB445s5Bv)GivfRH?p$m=s~) -&bhzy)#DjMp!+=$<24<dmsl*gOLr59jSFA2lT4hj7|c5AhPYT8HJS3;6kDbm89C+!>y-2mve`6G=kt0 -hHp!2yAd{<tKvg^_(3;1b6JG$hm3MWJ!C+Vi8%b>pz3bawiEG=twSY!_kjE2yg)V|Iw<4?G3@bgI0YL -8<z*|t>0A{~s)CXeJVX+fLa^)Q0nQ&d7~)L*CNxj||8Ig77Q|k?&>L~vn*<?mRa&<oZ{&SM>;B+P$G~ -G+Zpp&Dk#CiOy^e8$sO%`Ar3QAeu!EKn3kN#fu8Ciw<rmM))hRAl-HJn7WXs)#0dIS7$}2x|jb!QyPO -2~kBBE^l0Uk%YwFlYQ+1t*5ppdgBs3vl<ZnF?Chzmq#jEp(F<D(B4jywJU;TUh7-|>+LHZ6DZ>#0U*? -(7a5Y2Wc<7e{bd@7T?vhZ67T%Zg@d-NmAkW57ivXq28tqIVYW#N!x7eed}8n+Mgp>x|WuP`u;8$Lj7< -v9ZB*k-JQE0X4~QznX>Pt}~Pnwm6XTa8_|wO0Eup5W|My6kk(EC#=uC8;RWWmL!nSnFCB41fyB^a#|h -%PSj>>?#<Wb#{`;nV7C4lncVZoN01hI-x*t@nfD#Z8$G-idmaKCCuza3nGO6RQ)6&x;fsvaVY9>E3`X -|l7k<nY_ZPl|VS&S{0T#J0B7kOO^Tn1L8sLpHglT=Mcz_RbeCf#34B?lKJRy%;^QEvp5^lfTCIr^K`_ -D&@lryLHkKsB@ikHfCc)tE>ZtqXM|ES9J@A?(}t5>g1n`#s&s5{W_19seR>OFZ0*r1^^j{qpxu%R2A0 -5)nQZjL4u?69Rf18m&DOcYtcCM~QF*ij3kc8}{ehA*k?w4obO*^}1eC)jr_-4w8w4c(Y{K5hF;aye_Y -iD0i<x>p7^?KiL~+MNzs85{#<<Og1+qZS6)PmTQ0?$pQ+JWpHsnan5!YvpHdVkuZFzf)>s+D-_n&&Ut -5pBnjL%%?_v)NU)kDe-LN2R)d+YGKE<4j1WFm|Wg(LMZOz)6_2%M5%kfQGckn0uCDBr;Sp6ff=@#LOI -Hpo<3L@HK4O3r~!v9Kwo;OLF2ZSbgk!-f=n972j$a;XKG`tpZh$j`1O{T%<>}Buk$Le|LNb*mA`?5U! -V6F-mvj&UH_K<i2^N~zyA8{(W6J3EL=o)Rm(x-t45#RJnvmS>n+l(clEq?(~FW`;;qA6%O-yj72!I6` -b-sV3;yl#swg(!e)G-k?d^-((Tg-&elwU(kH2}V+^6b4Z!aGIs;YmizsT}fHR;D*p7&0@!n;WG{0Fra -RQtfEpYt$l{(kmt)tQYVGvptuT%GXj&JQ>Gdcjlk7gPTqP)h>@6aWAK2mnzTaZF>_cihZE006Sd0RST -a003}la4%nWWo~3|axZ9fZEQ7cX<{#EbZu-kaA9(DWpXZXdF_4uciT3y=<oR}So!RWeAiNvrtR+L)_p -fgldjKgK2GfYxX0JWj}jr7Yl>7!%8J_4|NYGj01^NJ5|m`e=~gEvmPlX#3<iVw!eEwXi{SEdwklUSyS -xnI#WKswAe<CgvMSjn|9uoh@l9OBS$Y(#(s-Ih>@tZ<mWN64V1^);@p625!_p|r$3^^6!db`V)#ZYf; -WP=0;wZR@+4`Do;M@EEdHUdiC{=Ejta$LC%s0;-1n?n<(=18Yw1hSb3GH1Tv7ANU$J6ow`#5FGGB}|( -ukt+0mAYzgGF~ZyN;WvW`(yd)GESGPvM6&FF3eYDcFofGXO^3lpfsDT;sl@ybd1$U<4IUBS@unsUpFC -KuF6=Vay*40mtk5~;~vt;ie)%uFR#KpoC4+ng<&y`<G(GJEdTPyY|Zi`QH)LFFnN`*1p^pI!4(UmIGx -uIrcqdi_0L@YO+aX<XE-fKK^e}^>YwyF4Ht~MBYt0%i{vCN**p(%!ro_bTGkCL!t!d7oUxCkvkXBAqk -pZ6@^zN8c%D8l%RHU{2^KI;*Q+<-Qmy(18hZ0%{rX5eKmGd;%0sH~ivRh*mSJA7S42$Es|SY<9z2NHE -TG53D4QOsvwJ*X_-k-fW8kl6Z+?`+I6li)>?rt;|F~X<`Mfyf6ge0S-XpXi41lg+CW0&vW^uwsNqo(M -Z1OLLq?wi(lpyef0iT3PaIDeRc+Sc*`2B+a9xCq+sm2m2V27wZct3G<)cTae$QiJLG+2%m6jUQpvGY0 -)=U9&y0irF#I7J)*uNdr(w)-%8*AT03P1FFhyUL==h)pvf^enHr-*C1{iJyr9(!=0;UXVpY<bvWAeh} -E@Wy;o<mqUbc#4BLmj{@W<g?NH&OsPjq5GX8^6#tfLR6l{z>Uv{f;)`NvRL4&|3xMGhBbu^dRr`oD>+ -x$bmNUK6>Zfk;IFLiH0Rg_u3RSPpwZ30K{px{MNlX^@XzY(Fb)GBi!|d_-PzZ>x%z72$D^B|PIQW6V^ -oPWrh)Qv7uco+*@-2uKJ8U9BHVcN!tSI71vZ;E%2osp21&a=;L0s_<>Pe5&xP+k;ESd3jbo@3;VJOHx -rseT#*mYU^T8dz0%y~g&b|hn=ZGvD0qaY7s<V|V7BohqQS1g4A&`<-0dn?dFz|v{90tTKVwj>xD`bgk -FtVTiExJYu?#F68bSB$0!u|ZYJs}QAwBnc+<obpLw(Kx_0jyzFg0KpV`If1@TVdE)S1VHj^HNUFr<2L -kl5>LimY=fv)LreAJAo$Qk2>inl%;LN#1wvG8R5*nR8w<o93k=tgV=;6<B~GWlXy{ElzY|RKP;XADIB -el-Re9=t0X5Dq9_VkDSGZE(4T?&`^C4e8)1(lDST%QeNDQWW5A$SY0P+Llcu%m0M3#q=>0BHtM9+5{( -GsnkBY+EQ496l#zOl&^(>#VLO6RhKvWe)Ut6;qW;S~m1{nm?BEkKd#yD`DCO`K!--Ix?9DMFE2Y#d{A -XY$ujj*@efV?OkHJJA5<tYGEvP+fN$oq(v=0=oNSmMw>Mbs;C4f{vxKY@-coHDA0izE=24MIjAX^oEw -tX&L6_S%}D^DRWb&_9DsV^b{9pmL{8Eg$w}I3(o6;1x%~5hzCEd;{3W81doD25-)(_qCk0+X7ZOg{fl -K-3KCIEsjIk2PZn%e?~zJ0%7U?gus$?4zy@5}r&Y<kxy$Ob2An6P&DMC#<@-~7sX<_gwat7#jfU$I1b -)9(kB@_g%LI^vRUU5JWCg+2Xu+Cb4+0J;Okg2K8)VElbpF&<+N&FOWaDQEyJC}2i0w)+oClu|CJZ<%` -z!2cg9}F$z#p)U63d9mvaMZOh$mDMRz1?H${QMJX^<|hQ5^ho0~>kyEQ*V8lCWdg_Sg)lIU3!Bd5n)n -xW9W24+R|1Q3vK01abr4Dxd=Hk;ZF|l@Bk!2Nbsyo8`C<vhv-3!+Vs6`1}7_<{9Y9<)&g{Al0uBaj#% -6M-|!RXCN4y!M2YZ9SJV*eJb^D5&$BV^K+2~lvQF)pv|EU5HYGoRt34QRW)D}eFj42v;T*K_<tlIAPk -_xG%KMxG_yb)2OCz7AE@0@*%6inWT1#F_RohEH9j<Cb0PK;(u`*f>c+l~al8^e=Z`POh>Lm`hzleWQ> -z!fV4NzI9zbV@;wb^bg+B;W7ywlseFSm`!7FO49JLY&I9RhbLYxn{iD7VIA1;VaVh97|a1vUmm>4XLs -twmg&uds0u-AoYk-%CXIt3upNOS0tmWBi5U5`+P1;J(zE|*C>CA>WPh!6jW*g0%lymGV+Y#nI`#2&O- -Y}EPXCKa3Q#yQJ<y3uVKsykDOA;v1LO=2Wlp)g#TtIh}YTZNOJ>ZUYXJ)?+PSx7L}TH>8j{8bt`3iCH -g(U;i*$7~%2f29=uKAR%PwG|exl)|LZl9kj}zJ9B6WR&r#6iyUzhZI!SFah=u5tN4AV41TUF78UktiD -D4yi{A)-mb6WgeheN6KrZqjfSc^O@qQJ&jD#~xj0u#r?3sAlD^JIPcACqtMQgrS#u}`@V7NvQXebq3K -~#5;|<jU&<(2rj5KZqLFWTO7B*`SFMMp0iru!uck`;`P-z0?pTWgZ-74y_LwXFNLIJ$(mtPMLtx#18v -0}$A$B6+96P6C`(|Cvjdkp)nlTF)aQzaT;LE$PX>$fe?csE+Pr_$h|bNk`IhH`3j&eK{+nDEaBNHT*9 -T1&8uXL<HBEL@ln*fZzJW_g8s4KC_=x(M@Y*g+551}10<APo)nd1Pg(hwb2oF0|YB_Vxic7LKQAp%1J -dl64egi^a`+&^}^88CJQ;pC+nV(0Y4h?uE`tu`eS0H05=NVB}hfb|5753;)ea(1iJ3=32^fE{u-58&o -+5*N#BgM=N0sq2^I`=0l2UMFbYKZPB^`re7D-ncb#sQNLHCim<Xple~7X233(~o9X4%do`&FPFpl7s; -f<!h8#D;RwS460j`dhNmh_9;au;?xgE8hPp{K#ov>)mqK58+A9I@?q`(SqvN#$ENqmGBv=OK=F`DT|M -V7?T3ijw$doF%{;au;T)-}!ue?3&K>Hk1q0;<3Xi0;7*H2>lX6t1{@SOl-$y;igafnTY!%NLbdS}_T7 -VX>-WNTF0=3<?xWqhZa0bkb1UQ;aH-lHa{HtSRx#)gFGr0xc}6#Y1ekyfd{D(-5HzWu_@~S1P&Q>LzA -MWQgSia;Oqz?aJ0I>;Hi^=7!4^KZ>`SOhD2`A|2FgmLwzYyCSE9Vte8KE_4Q=cUyIC!=QxgTUbG*Pl% -cTxD&>^sd$#q@{*CQI!r2K3zh;RL;K5ORg~lnlAyWmB#lsOX0@RWn~~MWL2xqT5fZbQMMu0&1zh-}$b -fUCQ06?$qXbDMo53>O1TWsb!6BjIpQDv03HdG#yZdT-h4Bh8`p?i6si^B*Pgd|%`4L8lN$5zL@n^Cyg -+2h`{R<>#@doWn+({N>sXA%82~4_E#B>Yi2=^kIb8j~Up~wq@`}bn{hbBQ)uJLUNYbF4=2&*bkW2|=0 -j5MR1Ko@{`m^0{qSxWk<O_`eUPb_FCiNwdzBIJ8~@Gy#R9{x_)p8;Wu$dNu2T@kKH(R_;(RxSLF*4yL -3KmYm9(JGbJZh8SalT>HPGp|tjK>+1xisOidXvF{`ScKQC1_?jY2tz|QW0e>sM7w{udV37&vyKw(Gn4 -z>&~C?Fg1|rl7>CN>>R~7fxwM6F_qAbRB-eOtAsD_ouYg?yf2hG(HaxyLiI@i3qBPz>E9PrS!qci=$R -hv&ixfjZTccQzn%^D;Jk`d5;+NerXAWsC?NQQpp}p7MKuINba0qo9LIN5g@OkhZebuU4B(wuyTESHaJ -9!5DELw4+FDwEj;${|qgx4baU>&DL1B%wlc(shsBn`bdfA(zj<U(1RGGd0zWz`(nqvsrR#S3577I8kt -BL|d2vl%TIZ@V@$5RC>JQG(kwVhc9Z9N@$>h^pTbtvZ@%xXxB7vf&YMD%x4~#Vo>$NNjBQ+jT#lAvqo -dx~~e@2#-ZWhO)?tGT8+15cm#ISTYWVCn$o0V32W#RZL>K0!}VPT7l!5(9ucP@ZN(qgq<S(q>(4;E3i -|7rZ9-pQ~q67F9v1A-@XJ1pz-di<z3F-eaP00SCcH-@V94(^cVQE0h)zTSD9Isl^tcKA#LWOpW=sECQ -IgdwpxlpS+ZKBKhOiSL2N~7(0pI_+18bM)V8<MFUm{2mcPsv&;bP{gbNzms|wUR4+Q|>W)`O|!#eREo -#UmoSv!^X?1qnEsd{$Rm*ne=4704(<l~EW)vOuxBR_(uHO<q~>lP>n!OJT)y(Y|nFc`&R<3d5KxXM;Z -!~<8ZXrmU(%@T&hVNFfLn;1Ox0}X$2T^%XJbtLHHNX(*Tzp-PZ*;2_df+mYpcV&FhW)yEWh;nh9u9&5 -bdNh)IG^?uwp;{AVjdKa+;-XP^0#d@Y_LS^EI57W)<XUopH`up;P(d?fOdh-Nfd|K^8wQVULra(*Pzy -2+MVf*{1a+UEJ%9A!`9IEH{qu~ZFqE;wWDYF7yjo~#l7IvfIIo6cy{Kswt_5AFRf)<(9V96ZXmDr@nd -pGWqR2QD(=3J_D+Mqb$|YP&_{ny$MUGgOUeQtdzyPcB7<9DvO^djF(lxTd9-@W&!GH0y9peRCWY8i7i -JK9T&nhZOvbh;2E~e_oY(59AjQB~8Varj0b}&%Oc>BUO1zRu+;USGsonaJ<FKHRe5YORFn4tP}%{Dxu -6TTb;^sqgovzDu6D5o;nIEr<SOfC`x?zRaC;*bNzAa3a3<t0v5UKVJa91g_52ILYUp_-t8fc?0+jHSs -Ii@<i!d~e20R^3Qv84534eR!sz>zqs15An&vi;G_y)p>}e9V}@~jW?CDB7o9vpdPbv_px?2Nf7w^p~a -V?%9B7=x`HU48_T1bfNle@trc!Uy}YFOZ<xg`q3r^oK}!Br5xW-0v{0F<6AX5mHntg?bF3#IQCuvgdL -IGa@uoUb0+PFWysr9siLL07S6WeP;84ra6$5Y!*HzAB@IHI#Km5c1@x-BiW^kyDm)PYIa!JjJ34HDa@ -<0v-S=kj!mcT8AnT}h~7RxHCBdpja=t_dYsIh#SX~A+RgA+VIoN;K`cKCaA9nlxdzEp?p>kTOm2t&am -?2-ZIZC0Mh!LW!dF;*bbJ7!l*`Q(6_OWL9Iv(Pz*EJ?C83KuaR<H%vVDaYu^$r*RtkaMGXeuG2IZdjh -jQN+@*ecVD?ki8S~k2^f)&^kEjhjR~3V@-+^Y?ZQ)pxXlKMv;h=vNxf4ZaZ30hK11{hS|po-1H6KLJQ -IZ>;|nGNDEQ?udvM~EI-$rdKV3$4jZbffVR=niqI(3`Owb-;Ktqzrr?@r>%M0CHnGYmN1gr9ph`5$zG -Y}w3#O!}5jB??fMY!JR-W&nLE&~RgbB8YOSH(vg#nUmEIh<%JVyJwTpM_D<p!R+x_YQD40&3wmc0yvU -fUr(tSFt0POVspUu}u!>ZnPl@=)%eUOHEr{gj85$MJ9hKk8&u*n>9t9&o}V%=wN&{~Jdud#^%@-rtVP -dUHPMY~7aQ@t|sbDd~e)O_F$e64iy|6Z4$GrU0T-3(6-(L9sp5<-`Lsx(CA|sC!??m5nNC)gL9?(-l5 -dbxAFYoTGYypu<VFDxW269!@tSew@c<2XXHW7*dhiHU=>Ywabp^)EddE7-6FXIi-$3k_r-z%)$zlmgH -9@CcP1QZkds+tY%O~9#lM7ohj>#RBbBinp4~!4*vM)Q4uGLFprZ*kD@Z7Aao?|;O24u<Vo=4FMs*d<0 -p@wJbKg?fHD|8dK5-CVUf+sASojS)YI|fAS~7_0@>t`pq7;^#hev|2f$)4U}9Fz6hL1BpoHD9B=8uMv -+kE$)fLB3cWGV&u}d$usk%j-C#-j+r&~1ibo?d8F@?!CHT&1;U4ze8|8Z?gD%;Wruh)Nk8d>%q=8g+v -$3>x4-*)VMt96$Lbvut&f(eQr7}{5WFcR`m6%QcsG|!MNb1--qGf!Cw9CVpvIjF<P5qb^78{(cok@wA -m&vycQy7!Sj-QP%`_82KtET-X-ft0XVj8Rrtj{6XnyS`WneqgePIg68IL-HO7;@LFDSg5{RMmHGR?IY -0kp6nT3&XVw>FI=3xpH>tVGAq|%&IH7)M7tQ5nZ6l6e)bGRroTM?=JAtf&uTFRm0D{1t3FLxTKGz|@F -$ST9`De?ax+Jr%n%JEW;_7=WK^ws*-ttvR%yT&2Pq7NM$K7?!Dyc3=mV)2eXpNR)jc0Y;jc%JpN_u#s -&`$GPNF=VdGMTOMNhG&QE`hZ#df^}iVI{M!!~tEJBodGG`&7r4f7cFb09sKp>H1l=}GUQYd}EX`RYp# -8KeTSe(Ft7nO4J3(p|Gj$);CQ4#<86<`(wgukQL#*L@VMR;khDZ0o&POf(3Vws%D75aP`}{mcy0v4i2 -E6noNvZAAHG7m9vjlJueb=$L9j@v^k2))kqyM3`pF<umBbdOeOO3rw5x2yK<vvqv{io;-qwbZGs_NbT -JiUUwN|^b9O!k{0|>5XaCP?>f$@SGWm#;M`HMiEk?!dl1GhWU(Vr*o<nuX2?jcV=;HB&fzLbLV0GUJJ -C#^VY(@=D0^kmh<I%8n2mIH?@w>fkj2JmdY?v<RXLhx<p`5)6az~Z7Yz&MIVLlr*XXK;7pQkfiKItmI -QL<o%3(3{oY-Cm+UZW{Jxq{K@7*Bne&PN@%VygVTAfdaJ6c{;OU3SMIgqY+9$ipqgKDNQa*a)~nSaQ# -a){3Sm{o^WhXa{6rHb=Ev<%OG>0=nBvh)vvth`eE_?|P;m7=MEQv>#$xt8|f2J>c#o><w5rPaql`Z<( -M?`0z(ct0cP<W-IS3m5OOitwdaZyD)}zw>^6u8K7XE;r(oKjQFwI39kyxSl;8$_tZrY-+3r@Zomz`p5 -0O7r|@p@)p^~h?&52k38D*4RO2g;{qg-DR7SAd1F`=&(a~mv%@C(t9jQ8!!sRU7Z$E(bW#RwO9m)kza -tLUtgd<9`;D-jT8~ut7|^uw8;{l@b2R*=F&0mDt)kVk!-%1{c9<?^ey2QkFGI2LFVBb{HFCq)U}ZdgB -Tq$ZfDsPEe-|_Y(d|VM36yt*sM;NVwv`wWr=|#@4u{C|Q%#|<-ac(Nyf9%CY{jM(&S3gRqFX%jYd2|K -*<Vi5f0w<bj7vOfrk6g$hqmGvYR63zIP*ohfx3rA<+m9>Uv`Rbt!>IP;byaM#dB*VdzDjXh2a3xzte^ -Te`i@r2c{<TB3q>qKRdO+<JkB$iPP(W1&H1j#u@(zC13K2)?T7>!t5i)F#l%ub*<9^4tCi-1G%>GBlF -j{ek4oW6JF%EvG*TPXlKsCBp}tcuTaoOB{snNZ`WIy1n%)(Y~k4DIvXL`6r&Kd3{Yo4;V6-Lmsepr%F -;#<wqwQZTMSUQ`|(oCosOTbtV>#oVYBPF=<j=f@uOtIZOerqQ$tt|4>gkoKjAue$s<T^m__jhcmuL|v -XT<>dPOO>G@i~`mC9Mo*elz(XzG^SnJ^H?6OCT9<lrL@$cX*4if{ZYseMxFUudos(UlPoKeZ#`Adut4 -V;Er({O#=Z=+8W)J;obJuEOaxUJylmFWF#{32_Fwk%YX4iF`7g06KwZ1%Kn$e2E-1N8}2^v<P^PNJ|u -;!w|XsFlz$8MTOs;5tc^*3>+$BpLuUXJY<3y2olPw?d%mL(V<i}EE0hhFv91jFHcTJ#cIiLYJ+u_Ul( -I52+HYxtljK2mgsx2!MqO|t;pnrW8UO&uqtPxKbvx`{8R^hH1G{946ze-2-wK9Iw>S>U9uPLL;nQU!B -I)F>%+qJW6Q#}XgLt9Hlj&@tw)gPSO(9R9s|X#uNdy&_@p|rMYLJv6&i`7WKr{&yl>aV@ndJ-d0XuUI -<>8;ZyqMNt}dySTTEwu8%LuDol2`5yi0jK?Ltl8ZOwib)##)0mfHW`dd-4b!+w5S8Sz$%y*$@#!;F_Q -yOpR{%h+wFKa@Pz5^Ek3gE;zMrFr0{a-rA15>{fmMKG9WW$=e$5d6WBzQY%Zq_x`&B&I@ei^$y8^3b% -LV@m5*bAoKx%bBfAwcXlsXfaaAHT!R1tQfjfdD7o8n>E+IJ&Y6{x_oWns_Yde6czslh<m2Bn<f_ytJU -B_%DYk+boA~a-kO2lW(dq?qc|naa#T;ze%1I+FKnxd&H0>}vDl_z?<2SbMd>{uq{RX2?aJtZ858IZ2a -fk`^6)o7^ck<OvBg6g_1LVGm>tjUs+U;P-gum9^w`yn{Sd3p-tI_nQh01FJXQHm_a#8t-Aj^1f3|aV4 -`s50;ANO3GA%F9zoA}?N&zEZxc0z`_!^>I&6+iF?zxnV{|zKL85E$)Wbn*dxXNB=RFHWLw{riq%8X(i -TTC%Ro`gc&bJpoKdYxwrmxtu8JV1@w-lF7iXpi4;m^r;ZcK^?vN|V2Pc8un*iYNEg?pV}Q!B$24n}FK -4Jduad+I7hV_HUMI?^BgU)!8q;@b@IUjj~la0*z;}8F8-RvjqLO?xxhE-lAbf&2-?*L*!NKZ<kRPKO& -i^VZ7>-=w_U=MRvo62*z%DH<Eqs!5?~eqWLZs$A4!_oP}33#5lPx?izM(%`)p`xMmRk3DtH6;Ma$>)> -mP<o{zJ9{s_~17kFZC1Z%u_B<>y?p(E|l!ICGJ9pRmupb+3F6@W6JBH4`eKQ}Dj1k*hHd86OQeY;}oL -2!x}dGKsp)Hx|6Tydenf>f)?p_&`(+qYTzK4<s9_SqwxsS<6iLTsg|_7!K}a|ChQ^QRK+!zjuzFDzb` -o0svFk031Kh+`<prq@5MvXXvHF;yZ3B1M1?m>fGwqL`P7Z|Dz+x--0KiT4h^&t<xI{%e(+DcS`jOdQV -}#N9}ItI~Aiy5f_Qu1N0)slkjIG?T*1>0(paaIu1E&WZ7?lJ4okKoIuchDGcfu|d8MT9goYYe)YwXPn -FmbbB_e;;>YH<ge^gp5=?ibi*@yTS-jQL3AB8E%4aTNy)602i3LkW^?c53v0DT0N-=Rf+Sjt=X~{X(q -jvv4zWC`?_8r?gh|5JTOMCK2nXI}DS<1g`l>Np#8X&0QJZG9(Y|(QPfWu-FFaY5CDD|=Qt7E<*)5j|U -kpHkKdl&znCDq-^z=EEeZ$MWqcYZBd|WKeF8p(`w1=wlTM_iabX9_*yRbD0g_UMz!ib9E1)=zwZRU)Y -)Y_rZYVG_zi=%ez1HIuzPBh8cDxY$$3OmSkbA@2RQz~Q~DFu|6BR#=~b}K?-(*J6o@^}%>8yGynhxXz -i2t@2-qXKY$cx;~|SX2V<`ZS5>_I79&Xf#86z}^Cgu~tO`m9fX184;Rck3g2!E@(AQ>8ZWNoH%~oTpb -^l9~@P(YKwtyeA6&1zjF-`ugh(e##?#p#p%Xcb2K*&+E(_yDc`HqyC>uX4xFl~xR>RK?tD3t*Q*@SH7 -`f<MizU;yg4S2s}hjV?sufLDhLVtyh{vHCBa(#+Jo>@G5JaivdTVEFhcn!OtLxub~gf%6eBuiBNzA<= -}1F9BBoO!;bmR&$Y80Lvr1OOT3n&w8U1JzS?oet9T(!<diX}?Cy)p!K@&_I;s}W<ZGuUSuC|TQM{wYf -e8q-43{IfC+^1+VsE4VZSwA8Z)D!;aOS_$x%u7!yGZmHOzub5K$_n+(=v6KLsJ*Hh*e&aZ=GAHVk;n9 -PD@hc&M!TbdRo>XydhSlEu@LB&CG-n{@nbh2g6<yQu*NXDjENXV4Fq^?Ub`zl&AWy8uw+<h8@;4-^`g -8t(+=Mpt~A7Q3#C>?xS{c46tmW0@a=K%R4Xm6C~TGl`gqzFY3f3xw4Is|dFK9}u*4{vcZw>fcp~_(hp -UIe%vp5FYQmZ2+0QIRZ$X1gbM@O0RD6u=;^Po$NPv;2pL)UL*{5#BR4!5qm<Z}VdtuEmGUcaDcq##Bm -J#`BuAhV8w9J-)usr&N9etl?%eQQu#A$nc`DwObWsDae4S8<=Y!-YAg2Z=6!M8&0_>LcN_*QBz-vuN= -!LnGJ*ITT^lr9O5pmkVEv>oGpU)T-(41+j$;66{Yt0~f$Svq8(U7hs5>A;@&$<1{+X;7vK!@`3^EEPL -<j<M>Z2Rrnuun>nMhKCl`Cs2le&YwJMoIb+mZ9EF^#Y#a=Sxw954i;lMT4C;6biW2auwkP@FW+ySzeC -;}dmIe@cl8)P7S9yFyR!;$muGdtWF2k_x_}}`S4o0rX=31D*}8c<7nd;{{I)+{tT@p|WL~gwMmLU%yQ -?Q*L|h6a3Y4qEblRj=hj+t9SYf&uo?~QVb<>5u9_$R2Zeqkr=7ky;Hqz_xZhP<}zAC*0q}!Pgt&dh){ -T)Uw_6R2E;}+#xsNuXua!SPQ(oM!gvdt4`vO_zwlAI7PLEvYWn<S%NrYVMEzt6Mf6pvp#1%9@_CPtvh -<Eoe^-B-o5<IH(ojFm=wqc*molgg>I9j)9EUD&Qhsz||d;fHy8(@t4Z3$b<|nt`vq?g6T531R=`Rh&c -)44#`}KYrFwfptn9U$}F0xjSbG%+(9;`G{Os#1D72d7K=i&IzIWBt4zNptx!2Cd^|HGLNO*&b3(y>r* -o*VQGy*@VKZ|-#4TK@3R_<Yf^mz*0vGF6(z*M<6vj^#URQ`BDiX+RBjGVh?Y&Slx+K$&Ml_2=d|j@6` -XmRlhoOfcG&I19`&-I!qR2fZ^9+rCY!`C1LyeXqFwDr69kszmWU|oE*}}?f3^1nk)rg<xH`>gSIF57o -~(CqdHZE_wQT`K4B4uOL4hKE^xTNf(VO&CHHs%LsIKd<zTIfY@4*r<&Q{BW_a2s19LlVOZCM?Hrb$Kf -&j{ZMQhl2(@pkxXUj$ngtA^Iyw-p(6@tfFHe9x>`K`5vCMdM~1>Al-+-IAngD>6J*``f$PB9`@O>ktX -IA=T$CQxVSC^H&xpMl~x=wSEu|8Yotv?S?y%39smvx*9*f3<$_uAv2IG5rEXcUD!9Be@&taZTwgtwOb -|KCX8DF+^=DmU!toMUA_@#hjz9ISzUB(M6FEJEgGtNcMAj5ZmC19T$9}3+vQE(|DuyVd1c+vBiGW?_j -Ah;LmXSPu5uZ2$%?Yz*Q1wtJfCCQ9rXh6z1rHhqYNI4xb3d!DIVR`4A+r3${dS_Th6i^VMpF<^+i`wq -5Zf~dRSb#?CmY_q<3U)_e#yz<<{l_1-)z(Ry6!`vAkbW;?9`vW2D(NxfcZs`)Br2Zk73>zE<XzZ6_UT -{!WczK1NZ(smmg&M@`?S1-qwQnmy2KMGysbx8OyCV{f3@2M6{o_@E4!ly0)&Q*xR;v{L81_C?#><NRP -|97W7Z`3C`oy9Ws9m=_D8j1}p_GT@mF1IJ)nk*?ISTO;Zi{QI7#RWlW|$;zLB_2gbHK0Nu*o}V%krya --Rv70}3iIAA36Q6|kqi2oJF9VstP|At&;Km?j>-yQ;6dW~Yh4j=n=1?4fsm`r#k<6j?^&V^NU<**nEF -U)~esFQ<*vrK!lr8+n5nIA0Lo;IfOXP`{rsLStQ)7w6!Sa`gFto@2@~a7W5c25t1_N#auOXewS{G)NS -^Z`U$`FC@`y!3Hzt*GCUA>`WO&!OpyI>^YgtcA{#x>#}vuT*bKhu5Zfw|UklAxi*vh<lGUa~nY0)jp* -c6F=*F`&pQO6y#(Fo)f6LM{p*(Q)vK{9gQdaLqRBERPDHVJDW9=(R?Zzwmurm|f4{JJ48N0akXvNAgV -c&R8MtG~ysdFE>rQj7s)xaVHT=wB*@V>NaMm4?OF%s0HLDVl{KvhUJO_efwHj_1D|sxULbpv=Y9|Zh4 -iv8Yiyh+9u?|!%vsAIG;u>35$1(J8*T*TLhw*mOW<vF%D98Sbq1NYunMfTCT+crl(eE>$!yQ?)YFJj< -w>sAUby%$U~<`RZ_qq4o?m#U@2ubKZL5cVEcIIh36J$A8K*pbZUQ(b7Rp8NVjB7>gnz~r8B(u#601** -o=k2Z8R8v&}yae+%4=dUW(J6J3`5l)gt|YPJiwOiN?fp=j;UML$=;^Oe{%Y-}G1(PBR)O!IR3Irb6kC -A@+goveDsL^lfbl`D$VfgRN`KS;}(Q`c60l;OxNWL-620XoRH}d!19-JsJRy(BCF=5Pc3Kyk!L&d-LP --O2F&l6TB8Q#Nv6{UQG$9pi>ki)>glOR4{=6U3}gHV`|a*LXSD)7k8-nQuBCzRZ^rGzQOxD@WPLr?v$ -~(st$rHy6&Yu@QNW;?57o8=f#sfeOx4IQOm_9-P(lPHd^(FE#Ap?cY1THCUA`)PXGSHr=cOtD)Bo3-3 -|d&c`w=p&!7rjB=^2JQZ@mUVeo#=QalDpx0=hN$fD#`c*BBF0~f`!8OwRN3{D;zNHD?Me+Clsn;^uyr -{*b;kM1$>O&X#k0kb6#vE@WD&*^$46cHzJtL!l*-nO^!iqW^lui1ripZtfnBX?^3k@o&pF+e}xxr=+j -I51(4Jaw4_JSWGJ7ZTvMhqAf4VvjBEiluOfKIlW)R{B}?6MeSAhnf=Km#gtZK6Nm3TVH+PTZpscP+=# -1x=w6)NsaiinD*<W4;}MHjav=+U8niKd}i5kssS6p=k3`IYUbJBW~gytp4Cd`w%QJwoqKNwYA@*)YIq -{=g8K|4`UQd1R<!?d13d{OSq@yfBzdEfQWW{c3C}@-t(~v4FJvi`i@VCc5T>-fcOc-G0hFym(Zqa6xZ --(5V-`*!Kh47xzPc&h24+j{T_?e6_0RqT6N4;S$Yn(gX{->B<3TV1;Dy%)35c%E<a;&AFaDZtEBjD5l -s!#wSBRdC-(ePt*1^B0TQ!48IK3vn6lO^w2^qL?DI{J>gNviqlJbhtY9b2R_b~5+i$(4!Sp`R^J#wDo -TI*KBaU=ljY;*AA+*)7!BT40YEVFFH!aUjdo@{6v;GQ<-jv@KBWFgs(^NtOuiYMJ6x#}nUfSejMEHgI -YyCBQkg#b#Sv{gLt7SX@`&tUG`YKF6oL++W@$E4j_yXmu?wj)3vt~(*Wg~~k6ZCZI7p2uwTL1-+&F;8 -|g@R+5#ik%)?=uhiZtuBebJ5r_}gV~bu*vDzIir8@rZx#sHovF4A+)02oj_WM!ea7tGbKLHOgD4JRb` -Y<#dTkOA0%?m|?#H+A(-a%;&z^keI3)NzNew@o+_1K$33hgK*LE$pqBM>Jwi+oh?bTv6y&BD6GVpr$h -%1;u2t+j91Yt7I^0>TOn1;FPR*T{$Rd2OevkAY>BEzf0OEyM5?m&Wl&Y|Y)CN8j*KmGZeKN(;#5bOmj -QP!yGCRl)23tcJ#0G{K)aA3OQ#w`>jTLw?GhuI1M{g`FTm)T0lFORL&zSJJ_`D|4FHu&?i2aSmk5S}( -(H0uBH7`o@G|CJT=kHP{!t0uI{-8tbV_ap>;OFoO6iOG28M%-7?;LMN6Sio`Pvn?=ugp%Eam21YheuM -fPfU3Y^=Dw;Y1+Fm*lm(r=kt!0_JEEhY>E<X9%3_rqP?oTOA&q(+7wpIy8jrn2e*=NTm56#LPw`sR4v -KN3-psV)_B>Q<U7g+A^bi?Evu%f!V%RL{G+DXxCA7*$jTVTX9lGo=2f+!=R!-7?ngs>$l7Qz|g~z}~C -Rt7dT;TMwr9D&J0g+IgLWwX!62;ky7&-_rWJl1<0BD8JzXOP{GYsHMnQwq(lWg6bYWyhn0xitQR#sRX -Eu{9Yro~u61K}VPSeW3M3iRp-70CidY!+e#Os~l=1XEe9Oo2;j<q9n@6a&|P23&UMOI6UxEYB9o!m}@ -(#$+{-N4C}`8MY=h>!<k0tzyJ?pwW}@mwgfvRG_`ig*QfW8zjKlV=D=SNs)EY0H>sCN-a=m3G#`+#cY -y|P9$8NbnF%)nhksIOBCC%mE9=gtMONTDZ^_bt62<fyRMu~3yf+LF7&x1=2lemG8Rm;9RlK$?AiQYu! -^Z_lW7Bi$bu$P+*-*!f5g*e0wcwwv;?#g>wwW(V65R?38W)NQJqG26M#*f#gCO+e9@LBsw3&47sq(&t -yJ*wlKk~`yZp7vaSfC_FR_%p%51sFin4Ma*=N<hqB&21xy0<xxkfS8RT;|3FiG-A5?Gja%Yh=TQh+CK -fCe^W%zO*vz95@55*-XJOIdT0!x^KqK5jjQ0`q-%szfGP*KH;oDwO5Qa9k84d)4BgV+zZ0rI&J3o!M6 -x`;{L{GAWLIBC>C+L}mz4I;~Y~oCSY-P6>W35a<@{02D>cCQfCMB#V0ApJZhTUxje(qO#_$Qvp!<P_S -BJ?2cWEh*LCDA$_{YmBv#GDYoG>`K~6x)S8S}<$^Df86M_KHa=S#@-1!Rg>l<XC$f)QTMk&w85_&TO` -1D2>n|d)?F1vD_CGaV;QfeM`aGQiVzZWfffchE1?EK*3j9CY)YUVh_UsxJPA-crms!E%+3=1H^wz}@v -=YxYGI9+MnDY1>t9*_ti4y9eec|gdIy@;z3+k~{c%XrouUQ2~R3gu+gA>z2nlPAezLz*P^D#QQnOMbq -To#bi5JSRlSk=+LjGO4M@N(=!0ZxAInvcIUUZ6?fEw`!)<Epl-n(GeJ^tRe-cqxy4$bOfwu+*8&d~3U -V!`dOT;n+%IJOcNE)dm`xTqzuAoYm17k-V#gR`c{ZRlcyp6&|{Vn$|Dh7Jhu(MXtKj3>ICwYVvH3K2A -d8Z(4_N+>1ln6HaQ)H5Z9!t|ncBXj_`wVtEnDf<HQmN_6wj*4NVn9j<(Bjp+yW*unD;f)9)WS2-q08K -62_?hwt}*8J<LgU4uFpMGf6-j_hV+Y^h-U7(thCb#3SKXA#Wq92l6@Y)ET!n=@m&o07iO%#qFqo9@>T -)wlD0?`XkisVzg8uF9J*7pXNckU0C>IcDVP@uT6A9-d43J_rk3l7s4T}TQ-C5HIG9}Hn55i^XqVL8Wr -ITZozGiuCkK*Q#x8T+jnsDmHhx$&D98+d)hReDb~qEOzys>JTqG1qnQoy%g&yL2St$Y1asN@Z7bR?_L -GH*t|dFIa@VeV-LEs@M+BBF3r0tOlw#)vWKf9T>>4ldF@|n*3BU%ce0(<(y7{UpC%oy8_HIN5e}I-aj -O$EdZMiBORbR;4WBSHQwyi2<pYqah8X23p@(Cy8LxZD>m7pS2qpbPhIP=y-3kloe$cio5QMouKkkZwR -xy@$I)*n$Zl^K*i!Y?wCz5TAzQXr7oH}7oR%{q7J7Qoc_zgxCTS0ek9by8CF{|oGR;|&AMN?9Of#CdJ -6lDM@SU#XKYP0E@7O=&Y7a4BqWS&AfmI#bYY?3LwB1d^XRSSi5<iW5dF01+PiTw7qVq0-Pl2R*EcAK` -5>OFfT9x-0#6P6}6}m<0zPyanxV*d+q|LhpBn~(>D4c4K+sZc=m~o|d+pXL?-w58Qy~~B*`la<8(kZ{ -Net*{$_qnRjWP6=A%eCLP>fER$1tOifuM73uA_VDn@E7Oi;B#9*%gGhFK@s6<HN}Ar_vzg(ZZGZ*qg) -@b$(-de*Bk}XMUWDP75#yX!XI9K|NQLvBa!!oPIwH0KZrH`5RvfEdaCBME9p+(uvgJ>ZNnMZ&e(2`Ty -9*?Ss|jd@WM%2a-^Fl2_R=Rn{i`!mL{9vigXyj)69SqWz!YOVCZUQ!8*&Yi*5GiTcRk1$BJYib~al@L -9W+pH3||pi~?gJM?4sk`_4u<%tr@tIwB?hellwd$E2fpM+PK#X1x=>K5ed*7inwkRqEsDdL8lHRmoD` -R&?kzl^hxXK4j}3Tn!H88ObYYVKFMBoVGc`maP4ib{nk@k(Rx+qTFyhk66NHbEo)T>|3_>WU@QGkND7 -9TqK>;N~6H86VuK+`F^)@4W}GX3q~aowC6(*#NK%UdD}(fhgz3TDAKAMk^Lo&19E7xTyWt+<0zzYo}# -1wEF-MYz0V?DTH_ewfQl<YOLU+So&4OuO3oXot#2iM*Gg8Ga#glVez@1>z4efwg*sU2x00V)rs+TtRe -H)Q)wKBRE(gIsWQ>LuCjr~yw>Z}Cg1CH00Xo$^q!gN^PNfhq=$NQwI@^Ul&lB*D%RQYUV>YX?>vMw1` -{LF9m(8~b0ovYeJLB9-5-?Jmp)_ty<Ey6GGkf3`p_+9a!?h&{>7!NrCXmvB4@F;cBZ9)K){Jr)$!s|o -@Fs3b2T>I`A4;?-a;kKsoZFtt<_&<~^SnizF)qS+JpH0oqkEla3&LAh&h#41{5ZZF55CQ{WE~YES(kL -}+(-6)3rqj>jP0aarAl;+U+nsON5DRZpyp|G4x?)XjS)92s;UI!va7mtC7AN_ea5JguhMlNft2HY(OM -0=f!0ch+#aW0x8-;UOgmnqWn7_E3318|TKt*y9)up*XoZ~7a9)`gv{xd9EAxLFJ{7&G1*-y%orLhbZ_ -S&lq}pxCE4yx(xer&scu*3rJR;rFB^g$r{8lc0_^D429y2=G$wQM+Bi&vi-%En&j#L^R2*W|R5aqhh! -X0be6RmdWt#@?y!uMA8)vfpyp>K4PWl@&-dQLupm}as9-^MILnqtk^HZ8DZ)Kxw}L4<diD3~|7Yw8p7 -SoBSNqGZ)_nFrcFW(uzU)&oD|h!>Xn#~b(-7WmIG^XG}oE&8SzL~7@!2c|v4EZ}VrFgv6r0ko_PZdBV -#fP{Cx&>k)czsQWwjJ*lDZF}aXc~m~7^V&2`G!CF~HAQOOB%flIwR1yfm?f*?$}q<m-9zyV6B`Z2|AG -y8c#f$)D$!2OX<}=#nRqQsHylP4%x|QEQ$b=Yw&*FIi0`=1eM9)?*Y*`_UUSfJXPX=ahJ#?c<s1TmMJ --d=JxS7rk}XJB>R7qvlzQr!ogQh6O5)+izpdUh{o{RXi*;r%LC2_A{O{^9d@Q?|C1tB^=A?P3#qjBG5 -=L`6E6WYf54vVD{dUT3Km^WNIK677p7iJyhb=y8sDQn{QXag2G{;%_r|*~C5`?X8zixKn>ASs+#cdP1 -eNX$a!;#sRncX63S{<005y~2Nea}3?M)Uy()fRiOr3=~9Z@eYiZ`*H7z7vA}N=1-u7ZNMBJ*#((byL^ -eI&jS;f<o0DoMNqJy)KuF+dM1nFuj!mQ=~^T*k8rT;%EiR0j6mPk_=?~K%P{d#h89;Rf>c&6pDsPK`d -84sB<g{!Zz<a+HK|Z+by?hgWDKvyY#IdbJ}XEWsRlKo#Wn$Oq-hg{EUaoO+{3|Pb&<2E8<0*VAMsX+I -vuPAILkX?$A~vr?IECX7>!}#z!;VRIKIR8gD$%c6;U<ud^lAn*Po*uY1rwoh4{X2if6ohg05ni&zg1t -(%y14WV|0?^#PA!1};`Gg^WxPWE04@kTtb*qJ?}fveJYA~~xuBrRm$vWFbYxV%2Hvgb{)j(ERbyx4l< -j%^F*<e?H*t+zjU#Hd*A@$llH%B1XQ|JrV(JB@Nr(zHjkP>+ZkA6Z3gAXvWtU3*<y%V#(ftjRdqoxAq -&d@>PCE!1_7K~FEFpD=32<`#lan%M*%+Do<*bUq_$)Ld~WgWbXbr^gx!e={eX=xQ_FJeqf$7_!<^@xJ -Qa47=uOrsj^<Y?WyEK8t_d$F&r_ukFOv?H&(`T8+B*^$ZZM^p<l#eb4h46V=N`W1>vj!9T^>p#JtD?> -+7oC3S@cN^vfCXLGys-FMpC{e7{m>c7$6zE8pQY1`N0-x>VVy6WyA#2uKTE4aPdcy_ZBO#wo+wnqN9e -0oJT8C$C*PP{e!i)ToEmn_GfG0)F}=jjIX#fC+YrNLFUMr(a>70PQzDOOq8T>h`Q`iE}6ndG0Q*UWYS -NDCCfIenmXKoa|{3CR^Q+Jn%mI+o4bo|(&>_6{!Eb-Abd;{KSh_u}L-d1$wnOGkgV3fkiuy^bj3ZAj+ -!RLO3l@Hd)o!w>P($I|W*5B@v5(dzupZe)pD@f7V<2-w2n(uXg$_?Cb)_G|yhv-NM%_;J@ZjV|r_^D= -EHrX#_ZtcIhWhKoI!OSZOvIPFe%ZTbj?D6+3oyx5_Z%_#y!oRZMXA8JdqvAY1W_Gl`}+iV*<ST>N=Y$ -0sy+2WyLQnf`3ZF!rhLPD84pzwF2$6XpdeC-BptLQHBB|sN#iAj1Trr6$S(B%L+GaYE!USPF!7=k7@O -Q0Dd6bBpdfCJAil&r%|6$mOX6w`&whIQhTM`&)LytdAOBRUf?@2gfgNmeJP{cEHmErkl<zUdB~8t5IY -fDcS2<5UxFQ5>`giO%I+u)#Vk6dI52?OOWOc9}ji&=`sOqL&%v?$lFnDd`?+r?{!@Iph%_{zmoFJ3bV -3?{!X##;))hx4zy(8ML~(?W(Hh<uy7$OvrSb`lF!+W<@RO_R6<mvx>H}+e)f#a^1+}x^!N;%`Cgm)~~ -Sj+fcPWhvQtGQhvLYeNV=5+kCo3SV^>>rCIvZ9QE?iY4<N^wH@8kAZ~k(O9RsHESKrw@0BJ_ezvL -J?~J;hJoMEC~E`rg1IKYecw>8}{x^5HEW2GZSme{s6!xu8#XB8fzXJN9eukpmamf|c=tZXIsr#eLMOy -E&zG3fP?9RbHP@sc8%{>pchW+^Ghjg7un%cjCFVQbG7Mt8gsaWo()Fe{jt<u+NZ4%|1d!7B=rJaNY-? --;z_c%kLYw$LfwTErRs@C#9<3J0-k=n2_61Qnpg@c`tj&>$jRhUf^u!9P(SM3j0Y})aRBaog=hH8vdi -cpcYlJP4Mj_PR8G1zrU@%7mXVR#(k#{hn=|&tb2<v9ljeE9(+$c-FpB18{*92j#0(A$&N`>35Ij+HF# -Ik2q5cinbO#!k5wLFYZqJ19TgL<<TDAQ)#lMXR<m+X;mx0W>3ixO=AzzjhTdxO_HSMH$i#9t>|!6Gp? -$EVVM_MjiKH&Bdce06D)t?ZbDYK{>@uXY6xIIHV&m#Wt}{uw3&xi=Hrr}5>AZsHqzuBO$f{x0gZ@;!{ -~&m=!hO2D!drciitZO#@d4Tit8)+98++cyzQgTCwP^<>Q_+ImI<rk9>P&og36l4jrg)z`UN;o9-mZAx -?FE{%(bKi%6*#G14|tEY?OVfu8uWS#O7*thD^9d`<G(W7>f^!MZQb*T3Bl5BvYv9Rw#Sh^l`nY;;I|x -mW}?{FX|zxDHkfR0<la^=P_LP4pRGMupc_liZG(QD<t(136vLM~Y|-T1$yQPw$GqXQJo}l!4qpz>2NP -salXy;ll5BeY(<&>8xk=tO@y}{Fm@>S1g~v`r1SKL47{xdAhr%i%e<^Oj@UB+)f5P~Y`6u-Mm-PQre= -t{HQH`(Z|8MAjc?h3+8`FOae+S?op(;sSpcf0j0&-XUZyDm>H0y&n9&kdDCd-@<m#-#-{(}Bngh}EL4 -R$ixsERVrc<<m_e9dp!T}}9(r9ZrS!=p`(#<`*%!#Zo&18+x?LC9hBuT@c={{0775SZ|?eal%U;k2Up -Uj|`P&XdjZ3RMF5{sVn)M?qBw8ds}*&$_OUuWI5A1!~n3{M}VIjTd3brdg8ZRG0sLNx%K-E;4Qks2;q -@JhF?*!gRG3U6fn{IIEs@z?dfS5+o_YGk$*`I%3Y0Ix_|YmPS}*#$M3Z&KiUs=vf|r<n;(YZ}<a`+KX -kD0&(!MvRuLtkI&>|KS%}4vjTyBdelsBvgC&8gW%76#}UP|*$P%cJij7NL_ogh4}X*oJ)jiTYFUI!38 -jAcChTGt97+kBF7>4XflsI--SuZlmI)eoO<%iftkP*HYQWd$el;d_jTe43=5>u9{A%QNjSt;5=HaR+K -wz09D^c+W@#F<Q>8uYcbS~)cguZsxSg>5yctc<PYM^yNsr8n2`OcbIzPy6PIp2t?_3zHQ*=z=a3a|H$ -fA6fb#0%gQDx?eHJZTWUjjJTg^#ye*p8Bt-VwtI3IE9~{Jpi3lp!h8Ayvz&Buky(XSmspLs(*LY<>F& -D`4^d!st51*gO1v?z2$skr0*ZPcf}-5S(wlBFp7bxU`_ty2l=F<J{AiTwLX91TOZ>C<lcneX>a;fHx< -+lRIW_mnFv*wXsQx=@nfy@x%Sd=VbA{kx<*kf`TF(i@AWL}6lgnCwUAkkQWY!T{kOx;jkhx4#W8J{GS -PeUa!+SOXR~E_la^Zaz2mZM6<^!lOe5UPZ`%x~jXNU|a}6?~x($WP5)o@u#i^Wu66f$Ppr)oFb9~J<# -qjVj_&)*H;<%^?^7t&Aaw$Ll86zvZu<lUYG4!F*+d)egd|@=@isl|tewYQhnY+so!!IlU;@H)EU0vA5 --d2@dZkr%z-nv_$P5K0e3XF#C>cRb^rEiD*po3_4_2x$mtLW2)WhV6@d)WEyb_@JC5*^Rf#i2|A5N!3 -MI3Iujd$mY>f^fM8$1(66Wbb&gDw*}Jcit=C9uzn8*5;d<qoYZChoNG3Z=2PGeWtsrvOH)+#IvmfZ}H -K2U6osJBUn-7DQ-nwpGf2;Xpa=gzBhHD?0J$#>?1%)oQZ1=gHiCLQLh(cue@!ocT9Ijp!<8CyrO>b(- -ubV-E+V2aDHf%(o4ie`mmH|Ls3EwCU`9mGB&m-f|TL>h55z`M_O(5Q0~^_!N?oiqShN#J1%f*t!oP_Z -@Jk`pNX~=f)s)i;vR?U6Kw#o)=Js>lIG5Km#6&L1N!UbGdhM9VtwykCROd`)!8cD$sM|7E4HHpMT<CH -H3#HAhoIu3IfI>7xw^3>lXgh>s?q)V4Cu?9M*6;ca@~>NTG>zOeAW9Xs$mcB$|HIZoR-;=<^eV^?bQ- -UV9PsK4}vq!N+|-CMZttk!xgX}x;GaiUNd+U@C+S1L>9U2w}_1I0wIhW5b35g7&{4>PywT+>E2JgfQw -5H$tJ*cJZ_>+kr`y~sozH~7Vy|K^!HI;J@!J>8%H6oFP>v<+tetQ<PzQPRiv;xIFNTMp@|C4_MDt{|M -;%gvlu<)7_<jmnPEaZg^<-q8WBK#pxZ+U@<jwSP;C$P>l^kMtMoZcdgZ4U#-07<c915c-@xW;JAEUEX -I7BNbXT(0uoh1<-ile{t$2Qaqyi5Faaa|4I=g-wvcs*OEvg3m=}s5<ZsU4yty`d+sO@iQa)Z5to1d(W -%XRa)N)qa{?fsa8$As^8heT%#vIj2Y@Ksc7BQSU#&Kfq%!_^4-9yCz-OTG4NSUQ;nYxXd&l6KZ@F3<* -m3Wa(6j`S8N9a_NEtw}W{7>4O)fyr?Y5D@!11~xu!pN}rlN|Mj5OICYc1d83@7UUp8&C}ng2=rNtCk` -vdClO1wGHL8zt?v>EcHKTd^%+59lzZPnJB$?lHPt)gsr$!_!d8E`$@XJ!-TYz)JEym8G0LVZd~>S_s1 -1R7&-tgF`dUT)ptwy|<!GLj#0P)3Y5HQTVygGox@AyIr~kUw_<Lm}`*gOw=Z&r8x5k6}$)&GvRWALVa -eqR_eIHn?B(TpwK)zM3{yFjAgJ8Ky;<S9mQjBdmUZtx78VmC|ts*`aF>Ak6tqqX(#bE+KPxv=tigkAe -6NX`#e<f2`@S^(RD25YX6@wpUF+m&Hn)~(JOk_)w#pDCCIEniL;B)!C36oX;!m5OK<u%4<!%K_>YS!d -A#h(T0vHE6#GY;aU{?#n_Qk?6?V&c1{P?oF~=?^?j1{SP;JDRSBrr$fR6~w%i&y-8K^d|9wk7sI9bnW -%2$N`~eBD54aQE;U_X;#pWlTr=K2~%^L#YlA}OouDgzGtQ{(1fLwYzh@-;pb-S&MsIK-e)e+rLM*U;H -a+nU-LNr`ryHX`cUF!Xasp4X~zHrD~e~q`~P_wWVw`0-v7^+f2z3@MurrZ93a_IkAs_-ttr}@vzCV#E -%NXJBfqORS~~<ww@X`~)+c})VCz>+xESeW0IQqPAVC}N@`&XO<gRHs)L@P00Q~wWxIR1zZrp)->IaV% -K#iOFSb=C~jOQyc6kbe*d59Z1G3*ALB|9GQ4FY7gda8~whR)97akmgLtjBa7p`OCJKAOc5M2!XI-Er{ -CuNre7U_az8aR%Rub9{1vr-k|c!Mn?&{GTbX^e$?lyU)~~B299^{C&N_z4|z1JTD~g=3p?O7l=&S2ct -lWbnuFbkQn*@0Z>Z=1QY-O00;n48F5V9$GbFh4*&pRHvj-40001RX>c!Jc4cm4Z*nhabZu-kY-wUIb7 -gXAVQgu7WpXZXdCgmYbKABV{@<ShWiAo5%5v;BZE9QDWr@4>mNvcES+k3CEJZ>VYKr6t(zd$pyYG1ck -OWCcR?^;W%8`~p;Qfsk&kHb%B3rQ_SX5<I@E~Afm1jlC!nw?ns^o$GJz=r95mIF7gjK1CvX}>nD0vYk -a&JK-a*<Di8=l5lF_q%3rc?5}GAP$M-`g`S1-_~gL?n`|X}%H?1Or|aSutUEt0Y>6MZp&Z&yz6X`hhf -qr%{&5GEB>cz)dFNvxKiW+9qtCWeE?{=Ve)lIrKo2%t7S^XoeB^$W3&LC=Sc8rG&dE1rdNqXXb|)+-O -;Fej6s&AUk0}Rf^gw7&4XN9bKxm9>8T3l1+ktRawa!DbI5rk%W@XnCDG@$wcb+#2&NHnRn@pW~a}7_F -UsJwBS%{m5YS?-g^%NHnIV&58k*><`usRqxHuT+GF>Byvw`Ck8vI1I>Pk@t}k&t!SxlcuW>!SEH6`US -88)y(Pe=<$F;b;I|Thh&_4wIL(o42{lh1_(mR9{hmhj%DXwpDg}A`uFv1n%0+++ZuGEeo%MoPy3V*}L -m(}4{PwD;?veJEVSsguo{CG!d)b~)`kJSAOb^lV`pQ!s+>i+dd(0i)x->7>?_aoJEq*{)Yd{1`Ow)z6 -PP%I&+d8!hGnmOxW73K(~fB$DM5HhGD`6YfOJoUZHw@~TvxA=HtHk+}-y+u~A>j}GIB4r8EfnQI)DRR -w9`s4AjlI8)E*CJ=DDk;T&RL_lOs;WL>!F<1A8K$vfdNXFv*x{IEMMo_^%}VC(d{i@~53)rm(u&s{Zr -Ep-sgJz22O7;#XmoVk;c^4bb#|D_3fb%`EcuV2C@!)Wuvd=RUSeP~geQ^@31mfVcTz%-^e~yj@MO@bk -V$sS3xC|D_JHL`udv&rqS4SjocaiY|hVkMHWNY;#e@+e&8ClmJQs>Gd_(X>Nn$oBos2S|F2Scv(8 -Ez4D+pLJ8Y&+j55612eTqB3#BseQuyw|bp9Q^e2os$kkKiZGQ4tf!i72Nj%h=lc(q$Bbor?J9s~>{~2 -gylEs|#e_v<OrBONtZ$_fXPV7_;ZgaXzCy^NJf?40?LPEu3Pp(W@nF(8`8mU?A(h7b4nqX;Zo{|F%!H -GW=XOBZA}cb-E372%jm#56`g3;lVcb`sW3wINb->A@y~zj{MNidXr1!<3sE@h?ThC6zJcnL>(=zUOG| -I`JZTBuGPD&0UczVT4Kg!2_dppEL$khTM6AYEMp7Y^T(4^VR$uaU)luO?`@f<$sb2{m9a+|Ot+k?A@^ -2B2gnZM+Bq}=<X;}7GpHFtmkQ|8ym1B1sCW`ag{>vAyzHbFHtzxVdK$j<i$>A;(8Oc7&~LL@Iln22Aw -FVegM93{jx^EmzS2&2J$BE6dZkfnUW{`9A&e-UJPDVt^E-Me?k?0lJ3Nz86Ji^6EhS-BMQ&#HsQa0mz -s&`~5@;O9^3r%z9`EhwS<?c)1a=M67^$av4PlbjYXB)VzJT9t7tJt-R{p_F~HdVWC(qeWQbFGg?-BN= -!Bo9l&7L9~GS1UF$)sf6ey3etHrdd^|a2xy<p*9^uDv5Hy)$(0x}@<yt$l02AmSq7b_Y6cr=%J7QGby -|jZ9Wk<%C<EOPCILE0d*&k_VTJh>v^7u<8l5`bh<jOtB7u?tDiRS_vXey>I);Fl=gywCpbB*Nt)-E8k -d%SYLUiey$GRx!Ji+Y9k{gpV1n)Cj2^sMu2~(ay5SwF|<jZi*OA)~?9kpBHA|;OpD_(}m<dT=RStJJK -!R->LNEx7Ok}!opzqXCq9a;i3`raTyFonF<zx2!Dc5l*8FW%6{G<J(`9W-1nCMsJ!>!34qBvI-3j~e= -Jb5PpgAR6uPi-SPlJxU$p6++0=iLzP%QDMNqmpoZe+Pc0Ciz{hmf6w#2qj4$`^wPp~uj%%8zP`l@**M -uZ)0$lgl;mt73R$9VPdIXmM9n4^g2!V-S(H>UKW+&*^qW!C{np1VKP`E=M5+`7JdyND7BU)z6+#uxtj -tJ7ky3g^qHQobMRK;FMvGdUMHP)|apfRHXLSnu%_9x)Croa`we%c9fwvlOB}$VC%Vk)CTRNf*hksR~X -i}&}CI<=4jLnPe7TO_aF2fs<Re+$kOIXwljwywbegs_OumH3I-q3>ebs-bXDx}rlDsN;<{Z?}0CoObq -D*`WrTt8(mjdKO`$t*&cNzkpDC)`jn9`9K}q0JCpgUjshb{qpQA$+4HR!9&9GQX;OVHAu8Rxvrg<YC+ -@I-G(t6*s^20H5V2J%pVS$G*1)g!L@mm1bi{<Mxz8W<19Fr+WYb0B?bDniZ=sv51)<mURb{{+ni5!89 -TMmg|JKV)k>(_NfC=%m9{#D@ZdeWVPS~;IQgKj_$0Hh)3jpLL^gmfhc_U{VOWz^t_8(DyqJt;!PKF>= -AjAe&m@vu?Q;9rr~0N98kwLf(%nu1zuY__43=j9x3<=<s}HM!c?VI)Ril&3@WY=p)IK?^Dn^DB10Qcu -#=?7OA@Oq5f1Cv)GYv<JTGgnVc4`qw_8>vx1RtLi;`oSm;uaMtHGM4Ec>NGVx<Joi(Pvz(Jbb7Fg(OO -RhW;(LWY=k@yx5gdCw4+P!+U$eV(;;cP*7}+kdAsJ5BK@$t2%bAPv|OVXFlO5;b|4slrmhI5f~Us%s| -re3h4LYi2A#R#BmWh!Utd7jewf@syoSk)}?U#epUK*7e-&fgh<7ARV-K#R{`Tpaw<sXgYdrfr5nUw0e -|BNTg0)q{nDAOqpTY%E=%od!uu@beh@H!z|=(!=KaCP=Q*dGF)(4532M!&2FgzMZzqq2-Z`Z!&z0r(e -_@-Ip^$Ws)e2;Voq`t&C(ds%KmfEbRI%4w+&yTpZ4&9aaNsGV7_{ME5iot<5u<!2k78MZ(<<7k`pXKO -m(yH%5=(tEovU49xU_Yg99qcr&n2q8BQC~2l+ug>flyfivuj3#Y=mn4V>C(lk&S<rL=(H6(BIo|0`xT -N_>O3*uK?9Xl!brRA-}&HuieNXov7|x9&#dU}jvbbG<v|dkxGRvn!PP$RsThc5R>=h$%JL=%E}@k&Z5 -<Pe&{RmgA04qZVF_$naXDu1HEFcO^I603&Y_A=?anawT;#u$8_}3|qBrq8qLToovAsab4s0_T}gSEih -5pEno;R>unlCk~*PiZbd`o3?S-T8;QEhq&<b|nobL0s_&i?P06kZOf9}me_;CIPR6#)+YZUTPUlMF{~ -OJ;13pEacBe+`((a`6wrMQ&9<Y3kWLqAaHE&jC**>7cdOt<H@_2uqWYM+k1&<+yD5<|%WlS(E*qvc#8 -?B+JHo&Q;qa5lQK_3GyL_#pr)xAFO`&M=7jBPDLVyfr9%UWa0PS5SEYNcJQzkphV-Y6d{Kq6(eQj^!9 -Uzi;0yG4t7(H=VL3@twk<CxYfh@M_?owNxOw0use-Xk1s61_#uT9E4%62)HDK<x%N5XhmW4_}G`=1SI -sz}>J2Z8N<+#J0;PTHm($PYvSK-I&z-hjUW~8O>jtwe%vq>alyE(&{R_6RT>)_+lX<0aF0QC;$fEk;s -i72IlC)?QM3j;PLO*y%E4TbQ|N=>3<yGA;#GzLETY7oKF{`vlf=wHR^JzyqX?e5h(T2elhiX@6j*sL# -G3D(S2sj15{BxhWqrfenLC7r=Pui{o>-EKc2CNl5l__O(mjd<tv-M?vbOE7twdI_rZO7Q1keF#zySNw -|{x{-3#V{$Ean}k{D3nNy|yDk(F0Faq`&tKhH1Dz8{_<?@rFu6JAeaf8>n-z-D~}w%cHD<lQ%zK6(b! -tD1py=ZY2+F)jaegxc(>%(HS?7p1h0bT(w#EeXdtQT^$_v+h<=`*9!lI7!qy`TbAFOAjUeQ-?$C;K|T -*6N~nE7>zc~XG6)?f+w-HeAlqY4C@ipAxGo{ol3Ruz|el`dH1y#*O8e$_4?guovTs8#;9vx1Ub@}LhU -2h5p;TRZwNWV=WUDsPY+1D7cZY*Jl_x#1EcvJQHFyy$HtJ9UY>gtxBKCoib<?;<b^ZZ6rk@8^HauZQ= -`dW_ex|U!aLQ`NW<KRrbNBjnyX*eQl6soR87&|Hr(Ll7AX!+r5oM12g-dOj+P>6@Q=b%+TC@N!|k;6_ -<^pP0%Zd8U2ovhden(V^LC6|z6b2$^~=}C>^aaK(bDKZR=HXs2{t;1UBe^|e`k-Ix`&c#w}3P59kG!k -du$tV?VcRw_+0hhcBTk}UT&PD{&oEZ&ET~`RnU?JkPE9k;r@6`F}8WdxQCSIwS+eKYnv6k*_MT)hE0w -G;2EorOUM%K3rhE_eJ!O;^P~Q#d9sDOI<xr*W{wvPF~`CpT9V{|%w%OMBR^RpbDZ?)GU>M@KU%77>o$ -G#_R&8`P?JlB@~>#y8TE&*>5kb>@94E3Z={1^G+`rh%t#$ujkHBZTOy2R{LR#CcF@}{SOV0M!VXb6JR -I6?haRs}#VaZAVb$7d7snceWJL+JY#msu<Je8x&e048prh<?qgE<FvpQYe+&_9C_a<a#f7CP}J`Gcn; -CC?Hgh(wN?fz=O{cL*P9w~1>_~M&w?$+wvH=l;oVGW|L4#DmrzbOyfAo!!k+pli^(G2gm#ZKZ_;L3id -zTFjbosVq9&>9_WJNx;BRgfKQ@Y{A1Y^3KRH?$QhnvKYq;`}U)2?~EA65fbu?**>zcS`>^$aOQGKX@p -gwTOO;8DC^8MclDVqV?@yUzZ)}iK)=`_qSGPP74?T+M1q-e1xW-?e9O7`}@zV-J7~p+ZsJ|knpL|bIs -}hYpAZDGw;N?-9mj#;;&x~_z0_L`Pf4Zata=0S1F#xTdOohY4D~TWfDsm>;Khk*iX`augAZ~Sl0&Crm -1g+dymZPug-#I<JJTQ5B%oh<T9Ge`*cWR-UHqJgv2_XaGt`<>vwk5|C;EE;yzRu?{K!W8`1H2>^T0>2 -GAO+w|2aD@7}SqH*a3QVc(yfpFjWW8T;Yv?B&@@uX7Saz35#Q5%W;L;lx(qHP=pD(OXt!R;;b#`1VAn -e$!dI%rc#Irsz7VJ@3feyoB3r_RrM2B_d0WxSr>!2l}Ygbd8la>%-?9WcL0GP)h>@6aWAK2mnzTaZK; -iuMegG001EY001Tc003}la4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFJE72ZfSI1UoLQYeU7mXf<O$0_j` -&auHXZZFqr7z=HPxgpqM7d-K8xmZ!d7j;9#fzX}+(2&v5{2`%y<mYk`IoS-~|D{itYjE})|)3B^#r7^ -saMT2G4Xycp9jj$@j>@SO?43EZY-GiJ^89uJTvPeH4W#5Er47sv1@GhC)9r1K-AJXHqf$@<ReqWO7oK -CMoCx0n>J>+!-IIitym81#ZUZbdd|?}6b@jSo;u0|XQR000O8Q5kVe%#}WtoB;p;(*pniBLDyZaA|Na -Uv_0~WN&gWXmo9CHEd~OFJE+WX=N{8VqtS-E^v8;Q$26nFc97OD-O;gp^AZY=wQG@hjuAibjW4|1Z^G -dLn%_YqgwmlmlWk#b{vG8#CPvYC(EG&t?dv8My-LmK5zuHmEeYmx;!_~(q9q^zJbBhF0`l}MP%bdDVs -TV!8zQ;1d%hzPt*70_e!aqGa~TJgw^!2UMWatu~>ZFN@TN(ur-2EkTx*HgqC!#MqrB;{@_U}L1!E287 -&>xzk<h!DW3=EPmX+CwIpWiaBX-$bm*fzwqz~xD>75T8f55^tL&?ROk6KVjat0|$xd280$J{&mJeg<& -8OK|<;mIL1N=V4L-6o<`DFz@WK1flOKb=9xk^!YST@Hoe3J9UWHNAEN;DkhAH_pe+|)1irI&*dov}It -bOBuTG^;3+Cv2wAh$-)NC>pE2BYF*+Ie+E>)oq;bX*uxX(gnXqi68iz^<5m^?YltKRVvC8Y?4Uz)PO^ -Ob`784>21Ptxmi8Z%YCUgawB$@(oovhA9(u49QZ8uUS6I4mhQdKZi>7v-{hvLGxLq9YMLsWyP2NSUi= -48O9KQH0000808trnOe9sEsipw{0Gb2<03-ka0B~t=FJE?LZe(wAFKBdaY&C3YVlQ8Ga%p8RWMOo2X= -N^Od7V<rj@vK{y!$JNoMgc82Q09M^l|8APkSp0L9yvXtt=TLoz4FJidGUk@ghab6D7`!I25}WdeFKXd -5owv*nS9+!R#owkx}P!1+6_=vcXp{dfS8+wX=-TI4X)xG+M*a;)VYzxgq$rl`JC$JJkA!z74S^d%8dw -PptWUz_U=TcZOC%+b>@yrJ`t@A)4;h`LcW}AVrH^a$>z@trel`Drw4`s}jw@M1p4^WK~{oyAa_IzJv7 ->zD_x*1xvzq-~&S%fhRV;L6uO|-1{9|A{v`)yr$y!7(-N>t#k4YK|d114uR6d{GK-D4OiNcMx~zwUkg -tzYSXq#va+}W#B;61L-Lp>uQr?dcd&kfQn@l+!O^%8uin$2_AB$V?$1Q|mBc4fv6y-jJexF|>*Nz~p% -O8zm%mJT)>}$A^k?>(m}+Wfl}nmz;U~Ol_%DHf^n=45J!6}{;fB0N7RQgfzOz5`r$x!cA!27w&o9B_B -Z0hI8N6uZU`R_vzga%$T)q*0sQD>-^@a<6kHr71e#iTZu6#%Tzv7vEdEo<4O9KQH0000808trnOiNF0 -&K&{(0Ph9>03ZMW0B~t=FJE?LZe(wAFKBdaY&C3YVlQ8Ga%p8RaCt6pdA(K3Zrd;ryz46#K2fM3wATP -Sq(yt|$+sXNXlWHMN|ORfCC=Y>sfR_$PWnJmo-EGpaArA#TW3!oW!s0|p_D+U&bk2V;H~Zh%JI8^hMv -ijH3jsBYTKaH6woQ{vo=z6)RpoXO=Df@={)lUJO>$GJIuzi19_~&jE-MYV;d&Cln3Q;#`lg8l!yDzU* -gX!%WAE>ANIwxncro=tHG9Skf9)@@Tgmstb&@*xTpnV*_qaYofsdKsZpGZMPm-Fb->!q&|Ch%S1<B}A -}*&`H0-(jt8><g-M!WjE8*08wuIn=BlF~Ud3I@xf=U@lp&Gb1$k1PbXVch-^zcn#t?DE40bIP>-NHIc -CPXgru>g%`Aj>By<B)1=g5m*O2E|7uCLMAVOx%ovSd^y}Ogwd8H^xJkuGPsgF>m%o@U6xt3=E&%SG@E --F#fpo52G9#JBKZutMAs}IvOJY<RN0fIhb~;IO+Hu!?WDhCKR)RAeNHk{x1iV96J~M3x%Ut-{>Z0+7@ -u6n2GJ(uF3{Fu8Nh(Yf4nio{NccNfc_2cYn#2c$>4!-t*M(L{=q%7^ZS_auHc5Uyh_P8TJD`rh}U#tc -hY>shUQt+VWKm!G{VyZJ%ZGrbg!X-_;<b07^!1Wg@2TsQjQpM$K|$UZwDM0Mi`b9M#_S_#cw>ZxZ!KN -n$VbyMg(}|2%kg1HXz)_7hM`0|XQR000O8Q5kVe000000ssI200000C;$KeaA|NaUv_0~WN&gWXmo9C -HEd~OFJ@_MbY*gLFJE72ZfSI1UoLQY0{~D<0|XQR000O8Q5kVeZqR&y9{~UWZ2|xQHUIzsaA|NaUv_0 -~WN&gWXmo9CHEd~OFJ@_MbY*gLFJWwOXklVybZKK@Y+-bCa%p09bY*icaCvo)O>4t242JLi6(XkuLfE -;`+d9~3hwfH_QDSA7I&qMd()|0`NjuuL)yW_4BR%Ta_n>t*$;6~J*nadZfKBjj64L9v1Y=J&SU;374Y -u`$w6j8tE-2Nd9@Q0XFpyHh^F~3e<+Jt9Q7e%T*Vq>uVlwZx6-DQkMuE@eXUFXMhV^UE#Nablsn%f#@ -L^r_$<y>|Jr`>eLtR`j$!eVka^2;98Q>YjA87zPzztfx0#ey-We%ClBV~1B^K383@{K=P3E8e6WlraR -WGWQl0NdLg^5P+t#0KoCgcG`n(ufc@CzD@B8x+jyDq8j-FUp4ouj@$j)?wcmg!2Z@hqwBP<)7&xS=7; -Y@p#DH*~HYs+@)qq&a6503s6e~1QY-O00;n48F5S^fcwOi0000U0RR9b0001RX>c!Jc4cm4Z*nhabZu --kY-wUIW@&76WpZ;bVqtS-E^v8ejzJ2;Fbo9meua(+gg&6qYri2JM-D2ERV=yhuR}~RbZ^?#jueX=fE -cUQLWsb}TZ(~SRZ=y=YhGaE4=YPvpk@xT5hgY&KB;pqB(DljPR*HQeNnLa?x1O-*yx<u5GSP+7f`7sP -|r`D_U&@v(PKBZ8@0EGR-yKBhBKT7!aO#2GH+IXr?WrkAJMl)N?&zfP)h>@6aWAK2mnzTaZDk=JdC#j -006cM001)p003}la4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?fZfa#?bYE>{bYWj(Xkl`5WpplZd8Jm -tZlo{_z4H|jt7<@^?4D=UV|(1o_EwFe6ikU45}Jf|M^*oQ<B(yX!%*7h6u^Fd_H!I6tr|jU)!9x1rGz -)F(w4A$qeN$c_Rkq9`7<|M$&7T87pep*xCPCGiJ}TI@`LL=GY~~lA(%1bh6`tv;Jduvr`w3QRYK*$a> -*^Fi2+e%#HdaekP(m$pUa0}iEHGa&w8bUDZb4Q5aen=i^gFcP5>AMF_u|y9&zg`Q3EUE;Zp;a(Mol)b -l;O{2yVz9B}WWekRkTnE*joeN)xLdK@u+C=QB$Om)*C>$ot*J_!RFZ2D}P3j`m;6w7q2y@f71=)?-N4 -IE-AV7bi>V{d}sYK9iDg87eX{12K+&-L!W9h4@(9Gx2{A4Xt1WkfLVVfF&>7)`S(dW8x_7oNLVtt*vb --Jazn;7D`%>mWGPnxW<K9Kh!BfmZoLcjkrxS^2|gBC|$^-WRCPMchWT`N$1&z%m*-R6{)Omm-8ODkS& -+pJVRW*@(4Vx<R%npvkX4T;O->Xoh#3z!xzCOC*xKxP{wtyfjxelluri5yY%912y^gWfoZzErkAMc2R -Scy!&%<ox@1w?C0rz(pw=0Q!-qIMX`xSP^&Sni+F1B!f7Z4UzYnM6>cVWu#kW*EG4Id%@(}SUV}~E{& -Yf#64d~v`?X4n!(}N()tjC^%D9LL-1Gl4L=gQ&fYy*dEDbc==+i6+fRs|fU+bE!)T&n`U4$}1s#p!k` -&)Z5CvYbnL-g({G9A?eZXz#;*<zn$Y5w675&48XH!D#>m7{l~F^*EL2Og&t%PaT}esV`fw%UjhZztUM -l46&kLkC@+W2wdN7ikF%TSgz@(im<Lvj=x9B*tx#}SIb~C`e8VwcOb-C+$Fw!(s#W#H+B1Tym|B=P)h ->@6aWAK2mnzTaZG*d(zW*j001Qo001Na003}la4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?iX>N2baC -z-k&2F495We#iuBAvIAs!&op3<$<OD{=#iB`ygA#npXwN09Bm3Qyhu#5TIf)w>spTINo&3NXUu?r<Dl -BPvt8U<-ecvVYf2z$`7Yz(CBe@t@z!Znv7CXL{k%pong0mVuk1ck+@d7Y#$Aabb^&0kMI23}2Sjx}^@ -$w~0QG;~`@CWSUk7=027R)MZr20A7$lIQypDnNO#XyLSPo|s}8hNXkiKiLsVlkbv?a3qO>AjnFlHTlF -#+z4%8N&6jL2Lx9R1*V7#ZqhW=P!=)KvQZhtM8S`SW8x}ivL`McQ^Owh?oKt(+1jO>8gW}lG(~_Y>G2 -#=)GMPnnT5qO%<cz%km#Zd(hES=AX4aZh%onuv#5}Y82Jo>a6!DICrem%*?J<3v%9DEj~)gJyl8b0Go --hMDRajjX-w$8s?E`Uj}YxT7rlo*Z;kLz>O;*LC9Es>d?H+vFH!)(V<Vp(i82V!^0+5#^mniimQ_n?B -lxw*t3kVi=gcsAunn4-DKHiy6w;3w5AG#;=e62BeKJ)^4-sJ^Z)3sw`RzBYnHO41ik(;Ei8hoP)?u7E -Gk2n?mWz0~bLM>xx*}mU{^p@i1^XFIb81^=qK0#dm5s~TpfCw`QKiEfx_ifdA9~IL&a=r=-9pomhfUx -vJp=TCA(Vb$_ae7t{XZi%CH@~a`zO5kF<kl$4M^8Rcstpv7;;o1Z3WxRUz4j4+c46UT#?_@*vdMWZ!; -4D53#k8wH*Uk=3ztEvJNj&xHH>LoB0woZ)9chXSit_z9(DT{woS^71#8IyG#3bi@i;6hfkTgOZB~iS} -<|&i)`!%^(fGb+_IR7Hj3Aix0(Z^m&)@|X6`*QKRUL|f(v6{O=dbjb@Nd2>~l^J?}Mk08ZVSBco)a4; -pRA#tHswwo3^$1x1cyH`7cm=rKH;8==7{vb~N{t7)__I;#tU_-Hq(Ra-+zioo12aiW9vJ9UM87d21Q` -0Z>Z=1QY-O00;n48F5S@?VTja1^@siDF6U00001RX>c!Jc4cm4Z*nhabZu-kY-wUIW@&76WpZ;bZ*X* -JZ*F01bYW+6E^vA6Sxb-GHW0q=uV9^n)_~w*H;+S*6exn^*h_K<kOl@V(rY2I=#unq{O>z6lq`y(Y{` -#p4iz9-kKu40-wcQ2rB-V;pD(v|tL1#o^7Te(%lN{mVr%8xJ*Q0MkGaWJnX+w}XG+L<kz1*GVQy}g$Y -WLyU2r3BZf>%I8^b>31yJ4MyP3P6zP({^2)SgY$OU{fvRGDc@z`kjn5(V1WAFF(_i+E0D&?MNsWh|dh -b&oMGGs6_YO6EZu)!l=dfaluN@a;nn+lIzE(_62mp0>4H&1JXFV>zgN`XqW#}AX~kUV6Fy%Fbg^uv4} -nh`Bj52|!XSt)<o#$wL=)Ar1Ew~@8b-zNAp`5qe8(Y$Aq&z5WZg+ENX76r1~iizNsPrfsyJ4E$?Mj)A -TGgli6IOE0KAoH3>$=4uA>ZydfOsCz68}oG?CktQtkEQ69Jt~nbMJNwRF;)oEi$F)ccW&1lC=<AoKcD -~|b2Mx#H<H77Dd?tlCwQVAO=uLy5y6qH?7B$W624%6mJHv6^l~jrn;1p{;Xt<LJGPKat#fOoAa*Osmb -o_YeU+CF0k6C?06ik|dDh{;nc476vTVgQ&j8&hFlU)sBh{?MOiM^yrBfHjg8a9W4~}w@0z#3~hnkU@O -!uQ57Amy?4#`S#(N&w_>x*mc@kFh8SwGE!L0`XqeaoICgG8%nDjMGiQOz1Ml<SS%MZ=a1w2xb`&_^W2 -`v{CH>weK&c}g5r!yWcq#LxhgcGB;Ng%Z1nBk=X59pUpF2ER05CVysfV<VFung*uGbiT0xFPO*JT_N| -R7`ZsUgasGY*R>Qmx3bt_+-L9rv()TEvHZze=y+Nw12Z6Ju-%FqupO+UmGx%*pg9y(y}thhz&(VW11m -@aexb-Qg;GBlcM;GSKt7^Z7=#B<mhhxWmk7Ji6D<&dP&vL?s-jR&0Heij@21$&^#Z^8&YBH^f1RTe$2 -mz^LR^yRfHfi(j-BYqRPmtIb`y!9`qQPODCFx<2XE^aDIvLHS-lI{x!~)9ymAG6T!CvlQxTj)@Q(-g( -2O`5lwc-{;a7t*!f~J0BmSvXd0JtuOP2La6k*oFZ;#Pt?6Z_CsBDJe7h@LKO@^bjodG&<wLRJ1UL)Px -ZX&k&5J-V0;C2wCZh{m!aFJp@w@U>B;*dWj6Ccf)doYm<ZUymWFi9IzKn8+q8DZtC*-ncsI}SvXxA7s -V>W6O$DwYtm5?4wjMDTa-cA*)HFoL0!Q5}*Xp_1lwgNi3T<$3P{<$VmHpIDuoiu~5gXoZj4i=e*0Tvd -PT%KEgbbJMEKnjWw7Yq-SY&L=*e(u39YxyyXALy@EQV0E`lrsUPG9axbMHbO(%O&GoESIOBM3;H{TTE --F&TPux=L}_WF(yciVyQPg6A>_?k(ZR~p1Ntk<V=9GHhBb3r&l5HCGWSuH8q)Fp@fV0oJ7{25@5x3Ls -)r|}aK}aq6qP`xojSTfBdAmrA{HpZ4t7LCI^Gf9SV|N^^kYMa;UbAML=u5W_Ii*%11o_CBik{rAQNE| -<P-oMh2oK_Ft&Rcp20S!c$9G=v@{0FKyCA^fYp~{;TU>yQK;<4KU-yi06UuxIv3a<=Y@K}Uro(&xD+W -ArLqu4cF=%zi3Gx>((9D1?%=$K^Cg_G;Cv0|o0PWgNVS3!wAqGSN)FQ~m}WzbK-g}`%u<iu@&(Ed-r2 -(EcKQmKTmq7(^pv^)t?Z8|tvo=t=z}Efu<1LJ#y^Dj%0qNdJ{rRdyy*r$(hrqSwNL4u{5XaqdYp=|JG -$P}^(9?j(e*W5-;Ckua6;qgidey4zz0=2#TaH(5CNK~GvV+=B@!YEZ??slR>f&64rTyX7024p?#q~R2 -FTAUX1wX*dA+kS4|B^q{LAc*x-NS6J3Yo_3agC6ff?s<*_ESmg<mvZ9Rf75rXbUs=q^PMuR8QeRR<0O -S@q_6^`BE@_`;@7TiLF!$hi<}JpCNGWn7E&uuJLz{Rw959ys9Cvm^dRTJ!Y36!k#y4`;wyS5xeVMy=G -cRJV&n9lv2+$=`gZUZRoi8cO><QctU->ah*ph5FRpUdgd`Ti8vE?1+P&=@D^!>hs09e0fPK`BNNM=|H -!2fJ*%<aKLN4CUv|te^9wLbI^+QLZ&y-SJDm&nDg@TH?OBkt<>+4baAAY@3DWj-J=sW60ZM)=|2KfgN -|n@9IZ>+t7y(1k+4r`4dE!1bamCT(c?d0-T5`uIJanQynF>vwKC1WP)h>@6aWAK2mnzTaZH*XRG9A-0 -00<b001cf003}la4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?pVQy)3X?kUHE^v9RJpFeYH;%viub7pa -l@v=#+S}WE=fufNQ*Sr#(k3rX+wIwoj+&t))-%Hi$<as7_rD*&`4%yvvv+!}qX9q=1OX5rIa(^21oQb -aH@V{Tc_5NZDig4UmT_+Qym+1jk=O_=WI74*RD?3(^H><JSgcP@$~KChERowTiD#Pa@c-P1SXVr`4q3 -*LLGkURAkRcLn{Rj;Nj1}AH%sJ(*KKkY$6_(hn9@988lUa=vhA#*TQFVrKAVLy)rO^}W|Fdm>x_k5Pl -8PGrPy(hdOl}y3?se>t_Ob;F$`vKdvbCDK)L17oX0%j$mAjbzF&B%xfzX40{Dy?hS$TjN#fz{Bp9;cc -ybKASSSxgsARfNJVa5XxYiyb#eLE!Bf^+_h_r}&BzYv{agv1xEmj_aScZ3>b7?%H_|&_|jgjebnvkU% -=20$~t`S~FU^?6*P$+yuLO=6S#9o4xl6mH%N)nbv$B80l*h+~9P{l$U50#G#_lzszhCyuc5G_5^6bTk -fkNri$Gmj7&Jp{h7c$CFGF@Zz$G*c~e6?)8NDR>+~AoEeJ9%SS|2aAS>MoO<EEM@AGNGgvG)|^GYe%9 -Z5@ZWjx|Kh>_#e@G>5B{$nyk~sEgHAk_F48RbOoT{1E_cWGEAFwIyM@R5W47@5f6Sp99~+NCJSLSePt -=6`Aoo#tjX%j_Sc-jNJY}93lk%PMg=SwTGB;iWkePYFdLkbXJv=NjUu4OYT=`R>&&Sc8)|w?AF*OhUL -)DN>h91T01Ts$#iOhW_|Byw%0z6g;0N<F55_i6y3}m#Pprdn7f~bAQX4t})$(n_X_8t<CW(_!)Kd&|- -@ri;fqK9Pd!^2|dA@R(w@rdAwYq`f#H_X%j1}Y1>Zb+C}*8#ZSw>o4!3TxAFr6es=n`)_8=p~|8l{ST -q={i&*GjxDy6Z^;KR}_@Y{=sEXJ964?I%I38oh7|CcIY7ZK5&St&*ZyATQ7};`KdlDe|OsKd!j~%swX --f(DcQqE}5UEKa_Q-{F8{$%1`9C8CY;0U|E*xAvT!Glpdbmtd4A=)Yw!2GY^M?=CzD_{QZFNC)pcg4k -$k=mg?S0q#_Puk-hJWNHvjAeY-CeNyL}5V>JYtj#U)_k3kfDycaCJrprF3a;T<=eITh;$Hk-bf*Kp|v -*S8k-*I((-eQq*rhZf`61=CvY?B@(NSM0ovG1CM8-}|d$BBg2B3(`W<AZqZu_8Z#jQ1;#aU+d)^r%7> -KS-0RFVn3E`nDfxypeREtO+*9O-FBq36CqLH$2t^!g&1C^rpxaMPB&cc-(9%GXq)kA~&4cRz3~>{_&@ -`K|@op{uyHC<Y51}f`uW^3=N%zYuqR&v06i!?jkyYu!6>7MF3s4xsjnvvY5Bxa|^eWVXhs-PB^dy3-7 -SPY*jinCT3~qa9^y#POPuNP#|Vp8NuB?q-rl~9VpGLK}8S<j-WwZYezW?X&|G*{7baTp%NKFoIZj=tD -;bA7Xnts)0LwjGz1DJmrEB+0!c#(*F3!A&Mb9ywJTW6v@;2?01|Rh+6SQ9TE-m*tihn>(3KTdCESsZL -^s1~p%vK)OsoU##P}9$89T~AaK=_#i!V;6h-<Hr4VZVT$O_JvEO-4b;xThvxxHmwgEWrZl~A$Oiqc86 -PYLOG8k&9P5OddCJ4r<abLX~`PgO9*-0`o_y4AkDiCJNCV_a`8HiVtYTXV`m*HDg<5eg6ycdTp;JRF$ -fj^`i@VwNNEx?9JTP!YP}S2%jLo3u&$V5maq_J(B%gg8&lS9gQ80`jHli8j<AI)^+JOs1<&URuMYBO1 -a&i1P#!h}*6~Ay^xx2>LAnB8)d-I|76;(>T+aK&)`Q95TGMbOcL;Gi`PQAak86B@8>2l<A~WubDf^so -W}emQi0W45CQx_!i`hrkyueU}DlUDezc{2wj=fgvVu{T^5SRk~tcKl{s<q7R)YXcXPSIfG^85cH*3Jj -ac!FGczToy27}#1(=xdN5wzqLb)MR@r?t*pwi<z3T%;r5v!NVV>emRp>!R%*im+61EV2`i7BMICtQYf -IGB8Ain`k=6);brZgQqg=ULX-xi8_cHj6ak&dh-fD>wfz9I{R3CL7(<y#mUtC&!|~W1bfJrPf8r>WMg -;yDqgMQ)htY4$lo!g6eA{<J=7x8*=s7sKjxGt%%&n)(If(x@A|NzBO7p4Ss?m^GH=<iv~)E<mf{jQ2P -Il!uplU5CPSfK37PGV+6I6qcg~!GBVGyVAA#>c(AzahQv{EVabUC2e(wnE)cOL^BFROqEjE#omq?UE+ -srNCQS`D^!m#*#FA+|BCMsmOa4*Rj*4Fp#woBgYj<G+O_Rp+Pryk_E24Q{?5E;9sn%jQJ?0yCRV%^~Q -J!m_F~y9lY;6=b;o31-IwW*}otOXvzAG;uw2~B>M6Y|c@EekLq&N+(e*LjOu;3M{DQ&ZW%pt`hf<MN1 -BQ``d%GQwc8sV&PpuU9&r&JxnbjV$UtOfp=@Ua^CkqC)+N%1|D-NJR{#X>sE-h!{(TxH?RXb55EC!!t -*S=OVzo^o7d)6R}!6DrA)T&k(!xbaVhS6gp8U}ub>8&e&C(<pKqadN8q!glVAhbmx2?D!$VrV@SKI9x -3bGdL<tPnRqaZUSpjR2(Z1g%9`OdKQFfPaL(lzSTmyHMpbor6c|7TL<!;1HpanDOLBZ%H8B&QeoV>8* -&iBu6n9>sl=Bli#Ah7=mG_QfSZdYs_TeD3Bt0q8z`JzKd7zWV~OMl4~VObTqywaQ6w&$s;`R^hbdv1B -_?sjFEM1+Uf}*tYOuhOGf|*^qm~U^wILaXpvoLip=xb6no)KkmrG)|vB&9PW(mJ9=G%d8xWZYPLisAF -#k3~q&4*wumzqx<yQktN!rqd53mIuOSQ2ry;jeTCYyAgMt2`ueGaJ7A2Lb!tg<<Xcn%ZqCP(QdKu_}K -rcM!_)>c5-!loWph2Du{gB2F5jl7?8hm0Pg8g=0*W!cYi0Dn_7FrQ^xclw8g%rpLsJi%w<@$?j_1Ydc --4UIW4#QFp`;5IT(*l<!Kp3swtHdq+ut#v8iDX$$*@bp4`4C-^=`Ea0CWf`0uVmP{=59w*{0M7Nx|2N -QjD{mx8T8m`@GGLA<W=S;prP-VU2x4E-k*{cjkqeMf|JIm!OGCkla$m}X3$KX57FycFdv6}`?FA%LXA ->T&u?e}griLdW0L`+Oze@WnU>2Tfkq?kKL)jRrfbyFI!(ByrWJ6cpKRI=x2_N$7O2XJ{vJ=1$mOxHZ* -h6~mOM+rLV0YyO8lg>o%ok`g{_Wwo7<W(BIFN#)sb`2%X94v4y^gLIBdLODvwupUfVo#AeA*2tV`;HU -n{pbEIiN2#Y@`#H*JLqhXf349S%rk0LZ&veKv-Wy`o<sX1+C5&NO*6W%40EN4Q#ZP{A(VP>@8!XH=8^ -1_%xJZfUN=i+tuIv5JeH7d&ezA4#bWbg=Y~xMKe$2G1;3_p1Nxp=7wKLNJFb5ICLz{CdIoxKF*R8xb) -M66VW+jkQkG;W2X<Fzd$FZ+uO-xa-dwjJ=4Hsfh$M#|3r;OxEfcZ|Zf{adiwhGZ3ScqAYi$nLA;kkt5 -@C;PNKBI<mhj@1LiNzW6jNJ1MM9N3bTy#Zdng}y%r~r!U&fM|`T^g7YJIP^3)&#NP0#_@Er2$pD*fBA -vg9v8>&{cm(RilS=4A!N+@?#2mC+K<S<B~)<;@J(hbdd4?RG#54ldD<*;`rdhcXc=K}v*cn@p9@PzJH -P&cn2P$*TiP^8{Z*?gFzswb?{V-+<t@OH=oV`zuX<Mc!%mecO<Thf;MoSuh?{HJYw6yM>5E1>2xAK&a -~S+(;4fgXt}gdCI5l8rH{Yv7%QXo1sk{m%HQpE#6Qe9WIA#xopoq=d3pL7+kM;knM-O<yCRid~f-!b< -Fxn$!$Hd@|D-dRXT2pwF|FVM!=?dTIS(ei(0~!YTRa}IIny7Q}I4`%fbb|YZ^A@ylhNcG#Z6<M>f-kC -;NFlgcL$r{he+04O}ISRh7r?l{dt=!(3T17V|C3&sElVrD_JL+Ww@0MUBxS-ZTshZ@R^skkwaQVKSyV -MpqUh9m}a6_B<{ewrw=HiXM;CHZzzs-|MQc4YRwPjT7NA-Fcc;2HS>J#i<LmMQIn@^x765M8{i(F)2B -ZzN<}nY3hE~ru)72ccH?@Kw#yqy(Q(_nrJ1nbu%|<+VC<wPI)~STfPXJdD|sfO$Xo>?<H?60?&*q2Nk -tJD!or@!3?XTveu14Tf<XE*WcN)mfPM@I|vxXp8Ook5mJEybCM@nvk(-3KQev*S&3yA0He>kkVVo`)X -qGCrO?hX3Uq?Pb;JQ_6rbVUJ;-23YB(I)rpG>?ycG86I$Q@VD7y-5SI=3NLCmlb{l$~#2z%k>HG28}d -0XHY*HbqA@@o2@PpAJryFGi-eH=erwsarh^-3szxC&q{01^c}g~bFG<Ohg#4*xwXFKAxC_m&_a2O{Br -tULbtm+|<eU$7v!KWucghllVy4PI#t3tV8<JitA{K<EH%z}s>%d+eq8#!CU_H1QFE`TctN;rn-2muR5 -&fGj9}6l8>om=)j0=a$c4FbFhc{ziPUW)#R}@DIGZeO6qSIJ4)PFp&Tk_HsgCbG6o4=L~pQUJ;Zr^SJ -<K^Z7{gcu9y_ywph`4u7lU;t+78O(V;N3p&!So9bWCU{CuhZ@Hj=N7{CmuL~M{q<y`9TsV+p61M~A1q -r2EcehP04xXuLrndwxdf<H=4vORp3RoJlZIgrEMumM(0<^&KtT9Myd5w!BdPe+0&LN0y(0Tj81=5Y2( -vn8>H*O`#6qs)4BuX@bZrn~&99WN_2a7WaKWOUg%N;<v<oz2?Js6_7yZ=IgPuhVEtf~xbEt`X~Fffqj -r4Sy2R(zfHHNa2N;Gz_#2)}%8p(FdZyAp|I(c;{3lRf?jN`WjyJq@l(c6Nz6!?%>rCdKbn!7_}K5!A+ ->N`q3rdi(a>Z<jyJFW+ANboukgs|g1Dk{g}{Wwxcvjct9}3jK#1UVZ%d;m!BIe7wAx1y{IClw4XZAng -zA&t65g8%Swz8HIuwiYUw)CfI4lL$MS9SnNv<RS&PPuIBGQynBE7;p3ajE6bsc`j5-se|z`g2OI+QQ( -9h79%ap3X;5~MdH(CGxAQkw^Itx^u?<06X<A8$w{-)==x_~+(~Wo~zm@_(w2$vzzk7St?!WA}qz;05! -f|p&!{^0isTV;c=P85Lb*@dmT#m-U^Cu;0IIbH97cYW8$L3jYBScp1db?zSji-Y@*oGCf=MX)^I|!fS -XM-27A*;L#pjzP8zQ6hQ>C@*=*r6EDSs!8TH3znBlY+ur!6RyGhA9d0XPYFxFcK77hdO`~5YozA^P)k -KT}NWM<XAbz`?`4xeNjAI5AbPlTa#2CR8YZ$jRse^;ro%T29scLnMT#OBr|*be&DgV2i|bUrxy2$z;1 -MOsVwM#6oeTyo9YwWbc{mLOOjNM+c&K-|HQ4#+GTs_^z{IzesJsSZaj9QjN%3gye@rju;Q`i$64U}JI -A>2xI0}J7s22)m<NbA=yJ{=w{0~$?6~Z-6&}$hyM1>}vNc5mOzQ`zCnEM@2+_?<Thd#HVs6!M<GdN!C -No&7^$07+HtlKff#dHUpbstVTRMkV39C=B+Q5=#$<dBm{Y?8(6k<vv9(RSmuG!u?#7!Twf@D+^_l=|# -W4FSrgJ#Yll)ep$Q($Lk*y?ape<o7|Vn|>M9DnYy<YD#g5S<2ZAY`UP6Ra7E8H6ARgc^)sW)04y_=@i -`sI#$e`zwqf*LJ-Rgb5NXbOCJEQgecJUH)qDva;Eh2e@rg|5D@(1o$I|!tpMZTVOhbB{ANzy$%)}<{b -r@5v;G)GKZCZFLR&^Alp;L@>mER7T#fpUB_JYGWZ>4EO?jNRKQ**hEb=uti>_Whh?=DAZ#Q9s|q`nj} -xi*W5BW$m0<a7g+?hrBv)9Rq-wNLu^poG#b|K-UpKp_Pp3D#@1EZ5{%r|g*wY(*dj?_m0ab1FsW=z@b -d7&+$Kx5A7OY*wsLD~4FUD9kHS<)=a3gJl@eZr=JS*9c1~;$@FC$z^2Cg(l?OnUIqq0eF^^2gh>dUCp -iOY}g@b&26SM;V!{8gA^+;N#8(HIL_+H`0j7$OJEh2Y;=kp|H{6{ICel^xOr1<l|g^0*zr3Q=qm_A^a -D1I}jM%zE?)IpG;%|Nakjhl5G_`9D-}{MZF9nc4TlM#Hv1!!fC}PU-Y@GW5pSW0jQK1qj>;th5lVjvL -2ULonwX{rF}Cf382Bg3n)n8sDD1ycs{-?So(#d<``nCY&^^lh1Xva#$cz3D(iu6Sc0a=b$n;Q($ewPq -iLqkH2P2$3Dd{kIHjPrFM<E9B=DruD;n|?`|Kli;{bn{?;jeL#;<NX?NB-NlUp=&;)Bb<8u;DI_dlBI -sy~ZvUDKo`<9S{=T9E#7lYtYPXW<nyj7!vbhAipj+QWW;X)>=*SAg}7^S)_1}4F#&T}gPX2S3UQq`Ub -ov{pGY#t4RNBUy$NDtsk;SM%d>bfq$tULgMbD%+z>PM@uQ+-=^U;651JU%|zgXfQQsmQMDVhS<Cv$w* -A#_eL_uqvRK9+{hJW@al$;s<CsuVab7dvjPK9`fy`*XPr3Z-cX7@Z`nd<m8}9VPq)E>pK5vQMGdQ1KD -VE@Ay<<>eiQ9@}AZ{fk{VeH_q<ucaE^S(fdZ*$PLe9_%j^a2#=w;?4n)NuUHOsIyY@q;_9ZVb$2ird> -UP!PoAAVn%(I7Eap$Q_cz<=&GvqHeWP!-w`arqLHTWPe>1wii6)pg-i*hOzX2BR=vu029ltrfV;mk`P -mwQtJHP&P{_OVg=ox&!|Hkt6ajwC5vnK6&8G0CQu1<<t2mK3rUWzmVwT}j6zo^7>D~9cS+|y+#y5;0L -BxVO9&G}&y?7m8j-ISuU<xDWeAyr<EgkZeGb6ADX$^pUSv*BUsU-hc9SeVgpIvig=y=}{I-M-p5seit -vxKX#N&(6Q*Gpyc*zI8`|vrz7iWA9e-QaB>Am3pfhkeOI}7arI3o1^j`7~JUe8tj`*m$zs4YPA5Liq0 -OroZLi@;qOcP&&~Md{Y~`WPbc5~&&}**`E3*?_Z<G)-HY@-N$#`oJ~Q{(?*7sJ<o*UvF40&^xyI+{e5 -w50e<-<7oZY$A1i5pApZ}XN^qFAy{NbNB!NYI};iy;(EQ9gM{{m1;0|XQR000O8Q5kVepN?v+&;bAda -|8eYDgXcgaA|NaUv_0~WN&gWXmo9CHEd~OFJ@_MbY*gLFL!8ZbY*jJVPj=3aCwzfO;6k~5WV|XjEoS8 -HjUbAB@PIsy`nCMO52s?O(tM)?8tVY^w)Qs4_IeuC48{r`FQWmc%0VR4uoijFgO$fRM%S<Kpwo+LqIW -|3ux4n^2(Y52BT`*pwKFyliD*j=Qw1njd10Ha*!TpQ(0T%gEYY}PFFWF$Vy{}WG%q=vc~Is>10j7o~_ -Ps37nS?R+((&$r;<;TwPaN@uT`){iHyLMA!97W5##qe!t;xzQ(64R%_`!d{deXSrl7N-}zU@fYz9D<I -tmf!bK_JQ%Qf&cnsN&_YQdhJmBvj9ZJ534QS;<me!Z&6J&!ewL7*>h|HsIi3{e{&rHPd`PJB32f;p~0 -cGGwWBD(XxWY>xQO3L-k0-uQ0#rN4P*=AkJlx7V4!@F^Wl7UO_Nr}>v*Si~1RG^V1?9WVTIouv++4yJ -mbg(L>#9sMs*3ze(tqGSy$@$>c#DZpZ*`{wF%iwR#jE4{Q?@g>MIXSLG?3nlCHP=RI%R^h%~0bsKpvj -&(UEuDpW{YRC(tP%=>z_ua*irF)x8F<t=6*lC?<tj;?Gmw7lnFm4855+z$e)>{PRsaq#uca;|E##;gD -UxMFC?R`wLJ@0|XQR000O8Q5kVef-++yj{pDw&;S4cEdT%jaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWn -pAtaCBvIb1z?CX>MtBUtcb8c~y)(4#F@Dg?FFA3JXZ62S8$E;0y>^rgb4wnglyR<@OW;18;kO->7Lqq -Oq2$LWF+GNelADQm93!`7I9q;mxPG#TtE|2BF}KC<g-=-;C~eHJ$;8ID`ea$CFzEcLpf>+yO57pI;@~ -%_FWbraOboz2t(&PkB&H+D@6xK!QoLUw+3qOB~j&QQQVzP)h>@6aWAK2mnzTaZE8M$G#B)000vP001i -h003}la4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*<WMOc0WpZ;bXJu}4XlX8RdCgScYuhjoe)nH-s03v2!un -bWqa-f$A?dal))I_SZMo5EOU9DBg|YvAI?GA@BQ1TLAVl(gce?NH)8(})AxZMaG&N5W5M`xm1ME?&qA -@&i=KwPCBD7F4fJTZ`WjrZ_;WaC?=j9mViA%i~^HkOR806cAl{|oJV`}{-Xd7LBj{*ocs{o?#-fow7> -vg!Xo7LSidiWZ8o|o|)j7pq4{l$uBUi()b*k$-{0}I&2?I~Ba1wL~LLW09NSPMN=+(KLXj^K&JC!@%n --TG0o+_RdcmY*g8kZr|M-uvXghCF64XH~^zM!VP<GmOOk3C0TyZ*fD<gWyHhu_k2xQwd2C<p)4FO4{0 -ey2PJ9xz8~^pZwOa+C=OLQxD6^9B@C%868}z()LIrK@txkxX@^?B7bK3?@SYz0iC)9{ZM_@j=AP<#vS -+#Knyiw5v_LUj<!;wy*v<rEbxE#IR>FYDg#)x_D*NGjBP1jSkZ8Ql0$EyY7pOHv5bR8&aKo-P5lu!*F -M@QxXTgA*h^ailRo;BCbW`V^cpoSRwr8$$_xS1t}kAV|9_XyRIq*fgX)dcKYB+;&P!F6TpDujQJsd!p -phSqyi#d99?nJXrcy8{Qm;N$^H_-VHnX4J)7%lR588?g;qUSu*SBI?16;t(?fp8uf**TkY(&V^7w0vZ -Hy@uh{{T=+0|XQR000O8Q5kVe<Xm468Ug?SeFgvkC;$KeaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWnpA -taCBvIb1!pYcrI{xwNy=S+b|5h>sJsu*?{LCP@sn*Yk?gW6vze)C;~&V=~Rs@8Is(l81~;s`75@QU_E -p?*p^5>K0eVbt*Ic(%EmVqvkYWa8|y*roKcO(tlKA0$XDs4(FrtK=BB_*Nsm@2$5<IKj+IKCIHvTrC< -?R#)SdTM?g-1RH{YsS_5Nv^8|}Q%-i=9%m&W-AV^Qw)DJ-PCVq&beSjuBoiMp1054Z694=as@?mPiya --r6u!UQxuT`h71sjuZqUxjMWMez*-TC(hcKswOI!`f)<OkvHFKXuzJkr-1k#tJOKn~b!H-h?`!P2gGR -LZR)GaL!jkDcIco`l93kfrRm>{on>W;jjRs!CS-*1G*Q5wh+B%N_txV)#Ob@@lo8`rfSS2n6ppmI;*k -pGtkG@`FrOZo#Dl7%;n7ib-?c^p78v8jigO$f8t@sx1*7i?(Da~sesmc3Joi$B6Wk~A*vyWl0|$IX#N -m;o&dkEYX2U-<2i<)i+03e*^^OEst{iAZ8D3wx~_I*Jd2;nc&{*A&3Y3JDMtw@FHFw(HvSNgS;&VXS` -p?Pr|OT|-JF39rJyc8zmP>K@r8SC>FMH}+<zqYPf~63t)7JyISoV?+HVuGO^)KrZ1d4$-hbChUzsYDw -y3=p&P@UwE?V9>q}lpFlbU8A|EUk!yy^ZgZGSWNIb(vfzceIbws4w^r@v530|XQR000O8Q5kVeN7*-S -;{*TzP7MG6EdT%jaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWny({Y-D9}b1z?CX>MtBUtcb8d7V~GZ{s! -)z4KQLyjav;I0E`{GT=j+4cY~o6xen5QWOR)jcqoR=yE7KY0>}Q8B&sEIdOyJ65AR+KEC&6sL^P24Y{ -)x^I%*BZVja?YKsJG=V4VFTbODCg;}rBV-?`RR0T<0@QASXu2erS?tX#7<#ovglqt1vkbBetLC3NPgF -ZrPsPF*cX@@Py6rNnozhVKwF^)3j&Z1xe;U2xV5VlN$W=efKfouLX$lBa$qK4>Rd*f<~xRD(u1e(Feh -S*d-$@8hYab^1DHdSS?*dig6H3c~C9<~Uk3h3857q)7-(u7&>M3mjT0%5Fe*t&YNWho;vRQxl+R_{fE -PCP|sQ|VB9jHDUgcwSOb@O2)XpYqWVPViB_WewqpTHs@-SrA?nWS>$$fwtseg-7Bnq$bdn;|+YI5_Oq -^lW%-%O^PM=$--`#jtTJiS8Y6sjo*pbegE9*PtFO9bIpM%V8M@mY#yzigwvj37-Ygn(?OYv_cwuJN=} -cJl<WbB1x6Gj_@U*%#|XijRUMGMZv%ECw!>9)Cq_V0Q&T4?tXv4Jm!o8Zq(OJ_R8250qQpQq*&x+;dT -~WlL&8$DzF6GUkopvod2(u3;qlxha-NEr+F)qo%V3|8qf=1?_0AoS7k6>uBez_8(kQr6-%sGvI(FE>& -{k;px{536%5V`<pwxje{gF@Gyh@&aVGp%6f3wMn7E^^TK5aA(Ta#}==Q-}!aGj{>s!+Zmt$|Z6qeP;s -O(h@in<9{q<XcAKF5w<%HY^0sc^N>8c?)Njuhc=5<VDA0#8arzXrxrk+H$$BrOlR0iMR87t`#}UL0YE -oQ*O$=A<pVl0CFa>v?j=~p#~$%mUS?eT7&}Ey0&47N!M`9?v2iw#~l9oS1HA1z_#_GJ(ki%Y{1iAo8P -nPQ~2=V;h_D7CNl;6$EWy-2b?}>uau!@CtYmfg9+O>t-}?|LiJ84tBBX`-lVb8WtW+_G>+mfdEDECj6 -qnD31*Lz489~dEFxa-Z?A35B(%qw8a^8pt{m~6*Q`dxj^@z61wQ_IHxPqE*eEQ?2yTei{%LqDZN}hP$ -sywZAfu!hpk-%tqHQk|dS(<7;N#Ab(9zXPbfBFR;?|Wl54|hnl_!FDqBQ999vT=PTzhS-UfI-3uK*aV -=W%~7h2`?3L|k)~1njF}JHROqr>d~hf-h}uO=()iI9Rgw8#?nNE+5=AS1`V*z1)nJud&_E8jOQdve_C -Y;~{0KODl0EuV0{(-d>IyMd?qXj@jl+l8Z939?u(;#epLWyB?c&A2aI?-20Ps?)9;REs3LRFh6D;r+) -E#o(?}dVVveuH<<VptpD^K@aqE4#a)^TJa{$VElm_*yz{uunk$)wp}_90CMO8YVBi#A%`&WJXTn9CrX -yQIO=F(b4lw7>7QTb~+po8uA&*0qUm!Sw@>z^z7KPlC&E%IYsa_?^Pe9V8BL!K!Ld&~YGd^X|8@>Hkk -q!y%(2CeOm%NA}SxVVS(a`MQThu>Th2xr6vPhlrzck)z>6uNZH{To0ii<DXl{$<KyA>VYXc-Mo<h9|~ -uCH=a-Fol*n49*u%46;}m65sEe~THtr;%L1@V-+#bw<N*=%bJwA1nU@P)h>@6aWAK2mnzTaZE(YR;qF -i004G2001cf003}la4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bVqtS-E^v9>8*6VH$ML&<#fF -9v5~a>of<7#iEfU3U1yqI+32gvH6_&>(x$*Jte7k3gN%P-3GyAyRyCp^0`B0QVWb$rzUOVrdESqY>?( -dhaZX0ob&*Y}A8qN4zRYj}Cz4<+53;9thS(Q`PmNKsv;=YhtG`vtJO9WBNI=lZU%0<;=N<KI^T0H1`y -{pBES(asaRVvL(t=tloSG6oxuM4pe@Oa8JpBLh?RHD&WfT(*>@{Le6&xJZUdB$$mg7ylw;mv!|D8?JX -B<&Lmwq1*o!9LLda8}KK61ir=!Gis;>q9GqL&$Pb6!3$W3-^H68aTGk5O}Kqu&!9$2w+vSWz}rB)_?% -u5r3mX@b~b01cbms0t5j1=n0}DAUnAt2H1?ftxAwoA(eJqU-25A|8m0MgKy8-7!ds|fK5H_iEc7wZ{R -@0WJ=3N^H%Gs939%i{=@L;?YNWe?P#qx#prJ80Zi^Deb7kaX8^8>k%e^pCk?4BQsj}`WBT?`LSGKilH -O(z0OlTI1xK9gqcB&sUNu!)AC|=4z0w@al-)F~n4J82a&nRvTq)3!g%}%!o17Emg;;`#%Tnt5`!P_sG -^S+V65XQ_ZexuA)mCtRXfwQIVB#ClWTwH^bR$IOcOU?EN=B&p%KQZERW3PMpVVvGRRUPQsRkngvoYK3 -k7`Nl^0uL$xSoxxhLjx*jNUG)yxq9h6A$krFIq>1`JRNv>$;Faq2;1KqNfT?&;!b=4QZ`^09M^dP=8o -=$~bsGu-<i5EKn}U>(t__xdg|9WClAd5fSV8S{949gct#${op!!Yza!xo&jr8u}!PAha}6qXn`$W6yB -jQKnxq;KLLuOcq5A)s{mSKM1UT+WA1)g@D<YWji+NH75YD3imC;E=)GQZ4NkCRbAh(Zs&dE{D31S*nw -60v%t%J@3wzww$3?G<C{u3&p@I|qHGUb0bjEJ);+K|3dJ!0b(v7u&K>Ir^*BZU>h>fzJDp`(iN6*#lN -BHyOXvCfyTeK%XIl_CPT7=3X%Of`R_|DJ-)fg<jQ-Ebm@p%Nb5fI5sHv02(#h$Cb5Z(S{rt!`WrT`zd -7fuhzBorumjG;u2+6-n1`N9RBqVq~<-H}%^X@F5;4mN8ICSfW`m29|F0`y8>ZfavHV)43Zs-~mDBn&s -;7c3DAuKCnH{#L*liWw?qk}h0}bdg)JeljF#%IZo<^wr=K=L8JbbgHU(L-t1uhBz5|zKQ^XkV2R8r9q -c{9>WGpAonR8+VbsZ9Kh5uXyI6Scwh;am$C1WUd8^2_Ca)_c6$Jdd|HRo!|LOHq6iwXsXmIsn)f}eF^ -p4cM>uf{VEru>5G;sX<AsIoC=%Ou^gJf(3W-A3{}?%_Jsw7<EEG>rutF?ACsk$KJO+2`@fTJ3C1mBAb -QSfQD;uClAmNclYF`0vh>}~rOG@Gy`{9QlAm*rb)xu$FifclzD>Mwqg@NJ?qFjj*%Zk7Hjp#*<0sy9- -<Bwfd$8P9aXm#i5lA*&NMqYraQU=xYXrvM3)HtvJ2T*N+<$9MCz04qTbMxJ2LMjZ2CSSs`qKj}C!)bL -{`Q)ex&E-=yY|Yh01<y;ppDW#9fa<&qZVL3Pp|hT{B__Kjv)BUOr&457)NgVvKZ-ZLdU8d>7=1*Lw3= -f~o2dBE^5UXuDW`ZD21g?Qiy1RjRjeYYOg3q9>U4X4etLEnFSC%`%2^ti`^+0C`cnH%)Wf5Djns}Uya -6xaC*bRMGj^6FD`0)bzD~m-+{V#4yy=`JrXEiq8_K;?rhuL9{h9gatAHmu2xAXt6!~vj&;}%!R(6k)X -$KWmCuv||Qs|&{&yE3SpJL_Yb@B#0;I}R4yJ+I-2~_)Au1x(iHw&<JVMNL?wj0^l66J!Rof@Y=-@y^L -s;gz@6%^H*O{J`}00+YTZUSYG>ma1R-(3BJIlG}<wuU*lE2?t<C)NcAH`q1GNrL`;#_C-mOMSkO3hUq -*oXu$tJ`sPM*d^b&l8s;{MC7_1X8BE$Tu@C@igpn;63$a#M7&4BdJ2?CAdv)PC~q3R>aoAHkA}<l6zE -j;<3aldPi$VPC9(RG69DMEE%aNr94nl)*7f;|7u)SN+kTx@&FaP3t5>gHJWz+>Kvl30;IMSVK7t-k!a -RrCL~#J3r4@J^-!~eTa(qv;fTeo_$)q!Omv}%N!=MXlt|&QL3%+>m95QzD?2i~Zu6hTxpziu}(R<w3d -mk?_>Gm7QAaAIvIO{tjBT{EAv-mgZN+?CE{+H!7wmz-0KozkP8q3T^@>08cB@n^ol5MeDp_I!@Ao^`F -@6!32^1cjJs#^nvGPX542xcWOcTrjc`C?S+iw8I@O5SIfL7-b6JL*Q><&UCb7CpP)7poh*l}b{>I2Rs -}Zz?B3s96KplZ`X;Hjab9FIG4yJV<MxNnu|WE5whuZ^nA<+FN@Hcil#61X!VC>$p+EMAu05Cj;I)X=1 -8K5Fp|i@`kL3Q7wEfioTFNxHvF>65z3w!@oh|F+^ZC6wM@YTIuj?PlTSL>itW&s-Z;T!7ffp3l&6-rW -g7cx?X77T<>)aJr4xnL6xb90eHMvRSo<$<zCfbu!jJxw5SzeP&s57V$m;cpD|U7TrOo!`G6~2KeSQ{p -ZimvU<h;oDyP2RrFJ|kEuq|7R2?8Fn%dPm3+?+FV6n4vEZb^Y*fByEA(*gZ=K#oBV;BSfx2Uqd6&`fA -sl;kP!dIkP$Qk6N=uS+B!xur|&ipk<#;z+SQCO#E0V!xvwhG=$%LM#+mm0&9X6HQTzAd-%E@ap4afv- -vIOdTnGDFKeiuFJE2U{qcgazm85E6`ehN6BP4f;ML@a52Ko|!U!i;6K9CbHs@zJy;;m=0?O5YFkalo- -}6lAZQz4$Ix|&*4<GWdLwucV6(OkeCgd4gi%7v4c4FV0xlMPjjB4;*ULQsX|IE{L`n=5pJSZ0BoYoS= -ShtAd)LC%VLKz$7sW`^$@iKx_Tr@-m9J;6=Cc*8G|Kj{L2U<-RPW+uF;fk_-gc&n==Z!u$$;NJ>aMAr -XU)DpeIj)gN;%Tq7%-qlcadgUPezJJ2pHdo4X~Uo%QW1sOt~IPBsRN*#s>ku!Ccx%~6_|)m1&7^lajA -D%?4jJ&lj2ARZ>02iZ&ACSI&X{+@0sN-u5k01iTd^UzyiLQ>e;HZ+APlf~6ta?#bi3nJ#yKf}ycV$%| -@*=;%@A$P;lrC;w;^9qaDC^2()oQE|b(Ik4t43`MR`uL@6fV8>DITnuS!S$DzP21O&Q0%X+IredT@Jv -_GSx44aTcY$pFKXz|DMQ0;_Fm3h%<av?aAjX;L2lOF9(-R_?z%)*??oAEc<jumaCS2sW3zaF_2)WIgN -9X96h-Y_zqCi<ccwPqL#4f@q{p|$M|R%7Zs&!}FBjbc_as=Pc97+4!bR@MD2QjaLlBg8zF}Z*6CLQOh -j<Lv7SMp}3)9yKxt`i)a{m?!G{bh8r81)>ky`ls+QA{AS3HTAW&OLnENrlht$-*9+)V<aW9>*E6?zj| -7WxwGm79wS!#A21)TUcZbHiTr!E-Ky1_rIjAefJXm^V%LJ0|;-J?u@{<1P1YiZ8b#5%p~_if+^_0zxn -2#=@Q}SaTWPYeEEoR2q=G<&KWw8q)aO<nhb4%&F9IBT@Dkf+KR5W}Udvs}__w+MCUdRHaZjFJdOH@D) -1wIS04OSCC^3<_r3)far+QP_5}fqHh%?R>^G3NT)lfWc%xJFmH)dBjq8zbpzJa=-oJRiqq7I46Hmt^C -=!~*z+*j+I3c@Y~(n6ZmL;3_lMW{QOoCl--?nREFDDlZrK}|_L=BVub$%H&<Z-wW@ZWP3|43oPYJf}K -58Hc(iB^h?wP$zUaIWV`#$2K8HFvKxf>K<m!+|gO)&T*c&V_Bu;ryTO^Y5NYP^6~+3=Ojy*xk;O~cDo -*uun*iB|D+hZ7!XE#bd%P6?~McXoVZ9QO=mJVud@pdG@)x|WtvusfRA@OOye)5*|F{RYZA7>Y?J65W& -t%>&@lEL76ZOEf|-W8b9edsRrm$H^Drl;5MD{q}J@jKhZ1Z-PcAO!7wY{a@Qon&rMedsRFPdN|MUH*A -GrhEgfKld;<6t%ll@5>jr{1hqcaOfGpaZvJ#)nx|%wxrgkhEdA*tbAOmbj_OYhV90WyriV-ll4P9w@N -;1dZ-oO;jmTjij&g!ddX&yuyLIM*OWV;NIKZO7MkXv=@n9j=%`ORvZn6xy?~)Umz2olf!)c05vYDBxn -5p&B)uL`pdth84p|IhRLKmR=4SicNlG%ETv9igja5s}rbdBKs6VG)^O9r($4aJB?^f~gl?TG7;ot}96 -8;0%LSmb{F5fP(@YIrJ1M>Y%?vRsIVvBymP_PYaK=~28d2SrV|CAR+1_;DCa3!Eg9V)43M-0+p_I*A7 -wgzkqUoA@5#%Z++yD82RCG?yCs-#lpO(CL90l#8PfVgQ}*M*PR4#RBr&(L&?jLXNr_{czGBzSEz^{MD -n$BpILx!51^f;UrOnM5h(^3p>{QuwO-;d)WwJXlt}y^zN(_->IyNEj?&>$)~hjVVVjFDNX9-MFphnvL -SJMj?J+XId?ZFGH~T?Fb&<QEFnx$@|&!0{q#%-*iB$O4%iK5gkIcMNH(Vcc5uj|b9`>P!|GWy+A%&*M -t~h;gMm-Cdytp87ad<v=ICqDK-88$i)Qces$XIbx}Br!f;nRwA+gH|xIVO?8IVovu*TDbqnkCP9jDz~ -AeHqdd_nv)*L%vM!~gN=s6oL00#Hi>1QY-O00;n48F5Sq>Mr=(2LJ$rA^-p=0001RX>c!Jc4cm4Z*nh -abZu-kY-wUIbaG{7Vs&Y3WMy)5FJy0RE^v9x8f$OcHt@TD1*;&4yeUH0kHK6ZP13E{k`%2wY)Auxk?4 -f09-c_$G3>|hNRbjrk+PF7n}EhOc`x1_?<KFBx<sqhy5(&{Rx3oyP2F&WZ&+QloUFR<3Cig`Wwfpm)K -)aBbFwNZCk-yxY&Kg9B3WG&B;x?XG?nv~<C}t<<IRRvw;kAHS)@69Dv**^6uu_t0%*?E;se3o8nRY|Q -w@8A8Bt69S_bSmt~k>h{ep(5a7ow(XQT&NwVW3Hep%;jLEhtx*UgjqfHUP}jcy4)t;=^UEppPt@ZS&R -rXVG$I2PxeAI%Uvu#OgJv^$fVS%Dct$DB96QpRIjBZ`1{1iRG=l)+c4n2}<gAkq;tfW#yAQndwa)&FK -LA+U`i<lr|1EL|Z15Sz483^LLiusKV=ktY_<=Ppr3IG~lifI_ngy2nLJ942&)z+0ptG7@)iyanwza8e -*l83FV2UVS7#Ynr;TAW6Z<7+1&)O0dpRKUAbSt+Q5s%Nl|?Io4;Bvdq17Qh5-dCO=0Y0bN}Qg4cj0mR -yAuq?$AW?1yaNC|~HEO;Hlg6*6as?AlWv^Tjk3_Si{oJx=l;d51d3q~*GUxQEC|@qal4h%$WwGtP)0s ->79tmZ?~HNtEf4Q$KiG!QRE_E^P}=eJqB}O;c}3!=K^;mp3_<xJT#?GjTx6?-CUCh+jT^h~@}a`AAXL -V`<DpMs)*Ps)*ya5RXZfpWK1!w8?GFN$G_?Hn`~yC%}S-PfdanPwUya*A)XDEXgBRY;(+UqL$y0b={D -K6xWu71HvwGPY@PXj0M^G$bStkW5=_Io1n4aZp%2F&ZOXX=%AVeS+9B&+rcggT<!J6*g#>CO%wFkeyK -fHwq$BZS>KZ_t^(RMSt@#hDO%We+oB+oTeYLi!eLyQyG==_QCSBBCl4Rxx+DDqfDu~`xR(-H909`qSn -5pdx<0w44eOZheo9GboT7VKy}si?k_@t5W)SV_+SUrBs=hFoN`!s&X3Fe%DjU&Ckde(t-ZAWrRS6zz) ->d!}x?Jo@>0@L?f9Kp};0VC0*Vljx4#lM#h2h2XSBnd}rX&}c02CZ+3g4sXD1yK8`w!P+YwE`zBBppK -l0h8HuS~04eD1`1bDh{klj&3vc)GIJi#mO%pn&nD9A>fI0}dWxCREF>6WcW%x6KMLvdj=+_cx0QOZWl -#J@kRZtp!EMsG-!U_yqB(ATzqH!dgq=$3B8|-4PpV49WsNtauNd;Z=0U%Obi?1`^M#FMC=h39Igrf;( -pF4>UKcxMf4^D$ZD#A0f1dHcthG)R9vry2(XbwT$G4_qd_ryQQ{VRRkx3v`=qR++6ptspxqx&+S$=o~ -wF7mlv_nYl4QqbDwQh8=u07AD=qbzVr@6`O`+{cV2%Zm0NgqS6^;j$yzY71Hh)eDQNZ~AAt0V1IV5jL -{1Y>uS7<2kn+_f1tm;s#X*qA00f2V=xiy@*xh0+T+++qNnP4-R-QBOqGC87)pc?pvCyLxPfO7u+7+Wt --GE^mNnOste{|#DyS%SLRq4dKh@xy)OvoCyg>?TdSGAHQQ!kp*=~*X}r<?cR)JZBTF{s<yk=zysWy$A -+(z<l@B&+V-V(K8(Nk^wE*&QD12H#Fz=I!LQz27TRqZWRrR;VYsW1j<=hkqszo(lT6k}1@Bsv|fUezI -~vr$W+}95eE3!0mMq#&zRwIzmfFUG79<*OlSE3nTVL?0^sVBB{duRp-EC?;goG$$XdlvWI>?KKbPc;i -9M?x^A<QMKoqzp$~*m4Q9O~eS(n?BT95_xAbz>d$5v3Rsv%sLJ>O%RHma;2f2ikj6=4=86<8Ns()pFw -><lOxw^PKJ(Kk;9Xuf&39zMJ^WuQHh8dX`B3$@}anzNH?GubCd9R>z+3o({xIEO#WZv<$235&-XevGT -d3=+HIZ;zeAR}8g_nu~qX=*yQ_uV?Ja&c!~k28!pj9SXvyXXvmdU^8Y{On@6TK@6zOzLlJUlSjW80@6 -_7GBpF(4F<=yGq|-?=dP9AE77;d&p3#xa_uIHuu_xqA2=jpZ)j>^dU5X_8E%yStS3wg-x`-L+=wGpab --sGDBi1&0EU6q$x5)b_9M4LQaX`VHai<V&h>lcjM$v{^oZzgYBLUm(h#pzyEan(=!<z>Z0LU98WIKcj -F`Vcz7sW>+o>WSU~nS*}gtUjy?cx6XI(m{=JC5&s#vISSPL*jiJ56XJfJwNO&sR!eNlOsBoJ8g(mb-W -KAETTlLYt-gS&IJ;4ua#E{M<vCTjHw>WTn4Q~Jg7(=yy#;h60m47fKCTdg^01d8gNi5#Gd0x3qOvluV -#=y(9n1&O*Qki_i7}S@3^ef2WePoy}>!})EFgf0vC~^!*r(LgN*WF+<E$R#xeh1Re_UYcUv}0&pc~@* -s#hk89Kb~nSs~e~w<KTSOd<IuO09W2;3z0hy25*i#cShf%H*@=yxYL&_umyT!tqbwG**OT-PuBV=nD6 -y~Qz%JbT_z1o!v)oALsP2FiN01*`e#k6xVcxm`Yo_9vmD0F_RtdQeVp+Y7pNo{T#(nIk3v}eisIF*`^ -m(){04^g{kS5wepWG`{R>b_0|XQR000O8Q5kVep?#O|GYS9z+%W(EDgXcgaA|NaUv_0~WN&gWXmo9CH -Ed~OFLZKcWny({Y-D9}b1!9da%E*MaCz+;+iu&)^<7^v%fJYgrP*vAgO!1eFNJ}wV`Lp5h2jchaU`>) -NP#nQ>~8b#J#!;xhKCg8P5RO$5?dnA{WfRL(5t%Iki}xP6T6x%79`(nt6C6x$E#u|*g}6#NR~h3Jg>@ -x?8<yuWo%L8g4ML(lNV(BROF?2o8_F|6>PSxE5Vk6Wyf^6WSmbXE6HV>Z_~vCE3>LjdH!fw3HB%!;%U -n!6LY6#1|zjFca$@8tGTzx?<wGJitxd*D!HJg;Pydt!$OpF!}ykhY!+m(6M4}*-&EPIU>9^Ls`|<Nno -I;;FKV`Ck6SVW8G-C(n-?sOevjw>_<H+l`ZZ2pO{3{#GRfGAteH5!sTq5>%ZrTF@p-{EtQ7Lr<z}nDP -@zn^+7*SoKf3^Xvgz9ify;phe!bWs>}j=8AHkqLT56ue5#?DlO+lTBLS7b>a|;<uQ>RzpU?YaSq&ka5 -Ugl!4h&d}(i85i*8gh13l`e+7Bw)IbARvhR)$>#lFd*tP0>`v;fkswl4Py;{L)Wnq&!h9atC49s^{C~ -m_7TZBk?Ozg@KbV0xSJig%vF)kqkFL_qT9qVgon={5=KxA%-Bm#-QLn#8&QgjSb2F5p(=gP0cL)SK&% -S7HV^&iaE*^fNDv(349EnKTtK8^5rkXFMTvet;$M$=M2<-8m`Hx~-B~jze`SjsD94$&0vt!NXN0;5;Z -%#(4cV4P5_)yoHFhIUAc@h$iGt>_5f7^Kmet}Zwq%k<!H|!+tz>YN$Nc%MbpD36Xl2}I5G|8u6)SSbG -$vp?Lm&eDB1E0v!E(v>N?<jo3Z-lBfK)<gb0Z-8f}8;{!3cZIxyZ}414>qT%|!tI>C-22OvF8_8QIV$ -a>odT9|D$f@&&$&iewc$&v}}r9`35D$-meW$xBiIuNYG$1pppTr`?RqSb-`(2aH>cPeLAOv15{5t5OQ ->#s(O4=|d@j)<iAw5CRHc$m)oIT89U<0dVGTpcKpBKiy8dH3h9S4lzK)OLe0%xK=MpS~n+%9Ipit*v3 -K<#0C<Br%mnN8-s0`@5Wz1#)|7x>v(kj7F#TamJ{h}yQqVo6_=jn4qOW+QG&$=#nInm;+d~iB?(ju%y -&=uX;li_Nd(G9QS?DuPt-CfS2Bf233Mc)<`2s%0fl5M3*eaL@2aW@@<u{Stb&#PlW8Cy-EN_4)&?+D* -zeCUlcyRhR-gkV*a2$=@Zi;>rgf0mzIfU{?-;n0Ir1f-`s%7HXkKRQ5eRiF$uw2ZVuRNsjxWAu9xFu6 -_nBJMY*Rh3LyfGl_8Qp%8zr9V&k!TuK*$*BGAd}|*&ge`Wt&xr7zr`7jsk4BLIX#<^dZ3vRW;gE2Nm3 -pGbMh|&E<Y5^>>9Y$fbf)iKqxd9;(kYFG!^m6gD+NC#S75qZFPW|8$#5IwO>BU`Ht4!s5zf3rttfJ8c ->Hop0GPU*#-Qq0_-_$`YDrT~nB(v}h(1U4IN=uMB|`@*1}rYHE#hOa?99wPb*X8-G6<=7)Y?^eHirAR -Q3~lB5UL%IKAXWdT_s%MZ3%wHswQQqd4`vujM+4W#L1U0k^)J3WeAmlgP!Cd_Z`B<x(0x&=WLF?73S@ --nEyx(c3}NVLV6eYsZmkpgEQrEOvE3W!0eq;xhTIx4z;7?G<cHd-zt0;C5Rj}Tyh1PIhf$ri7ZLp=8D -IVN<QVNtr*ZSJhePNK~GW_Z#h6QHy8`N&Nb+(EymiK;1Iy_3T_xs`#2kI<s9EnyD*VO2_;fYO&*c0e_ -{NDR%MtPV=N|MjTl4497IYAVlm8vTX@-r}R)*O}as0uo`<eWuzH%fR#cS+(5R(d0PS>teLs-4*%rGK1 -pv#G(FNW`V4RRvKVOKmTy{{`BVW*XJkEP;+LK>lv9D=2B1du?uA7l8vSL*!9`9K_Bfmz=<QvGy;7hWI -p3j#a#)N!_@PkV$t2My1c_pt7{h5{nw4JT;Y)I>TkwQhgri~x6c|L)o*MKhj(ZV$N!!+tT>4$9GVnk5 -@KZ7L(qTx_5A8)@!|dZn+WB0QPcJJ;(GDnm%qvnma`-X?SS}=)j2Klf3v#T#kZ8}2c*(*i(%*d1}{<F -W+`T`@!bw=%VitVf=7a`BW%mlmUbu1>I!Id#{J&Na^@8mv>U*)cuLy2M-b9I<0>c921xd`lx<-4Fdaa -yAM9`-iduEa5hszHo5>$1@Pr)ocE9?H-9n3&^Ft<Xj#REpCu)%AaSF()4QA*?KUcaO9d0i&lROc+0Xn -QLbLjr(h<}dcf2F}o@{+tFu?}$ZBY87TJkp4*Jhh;O-Orrn&_2m!_`I&GI*x2v&{M4?EhYXveb75<T; -Fbz>DC`Yik6ugYWaJDp7=gMn09Xw?RPDHBs%C}@WjtQ93RUFKR!Nj+@ZZO=m<Puq2|i{yEC44q)ghQZ -*cNw)H>1m<5nG|+hg~Htic>dJRxRwt+sg%RX1MXTX!GCH&iU|<p!}i&ra1XkIDq|xy9|B%qRwWB<>J9 -AiGPRSOSJwx~{9;md9O9<h8BYDp!LGd&ZyYTXO%&Z-)egoU=C6DA>WEyn+a^wZ;z(g^F9PKT~iUcn1P -=TnA*U9vsK??$ldT_XYxP2S+6*5Qa-l%j__}+Uq&~wU;!+0=9(mXzT!Y+p9lFaR#0JLkMa{C?=L-2it -a(Nc_kPo6A%+6ot6=aL~Ql_<afSd&FmQ<$l?>*tmyOdl$OzySQ1n8F|y0Q|ZZW8}?WWA9Rlj#rBQ^{T -()m9I4W=uM&`QRO)YMUptOBo1f@&8KwWM@-nU;+(x?65!1HNa)uGSf3+)joMp!k6!^jShBP#5O%o1_b -kqIH^*R^kC`&E7Tux9Z(Y)LfE!(FzuE+~{d^~I4#!4^CRRz193-u(Pj%(?=jeK{_Ot5!<<mUq$`#(GT -{?7jT<Ga6Ip8g*-_<x{t_bS()UAgMYJH*D-YI))HIw1LtI(^yZA935{4+j-~GIw(i4uyZv;e%Z=SugK -YQLXAMFKPX>@6^$E!~RsT8K5g}D&JfEv?<hUU|#osP_9YlvNs}Tt(im4&z#k*H}MfER5#Vk#(ELQHm= -BPI9-!;>w?@?NkV_Tck$Evdk1!?+g~uv!Upkxw#Dm7oXKV1dfaVD!gfSY6x}zR)oGA(<DllmPFGG9*; -zBHbOGdEH+(L0y@4^(TbT181(&)!*vF<?w9Sl}iiRxgw6p=ty*IE2-_G{BpI{8CC#QG^WUSsZIQ7ZOV -;4I{MkclpCH4h#Bto27yLCY`_#ROS?Xe`tL3c&_mgI=_ZisWbf{wbs{HT}r)C<&*A}IfZI*$F4=(n}I -c5eph{l^$#R-_%Y*4`5buc(%^ko)7w#J(E)tNObHh&SvH6yo3y4yKd;0#Hi>1QY-O00;n48F5V7{z}k -n4FCX9Hvj-H0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7Vs&Y3WMy)5FJ*LcWo2J%cx`MhaCyBOYj4 -{|^1FV;mWCm!m034m4#-sj65F{3NYfy3u2;A|Vok0r))cAZl6G{x{P&yL7k8IS`hnaDXd{#J-kI5%*; -N!pKi7FzGP154!n@tBZrY-{Chdli^7FP#Slcl8T3j`>*(c;2o)<ZzWWyTx#z|X~jx$0z*>>4xR<8wWM -cd-mpyAtH&3SQEvL(4I+D+ZHfQF3L4ZSXa|AuBa91w08$vWQFTf$1VWmP+?=#~MW4Q<I)!{`mUV(lGc -6=?v1a>k`pd3{%L5RC{CK(az1-2p{fRdovpyM}S3Nz2kmL{LNiSHgEJE7nB@@Ag88bzPSA9STW7*P99 -$pt>1Fg?CL2xLf{wHalmZTLR|G>MaV)QC*}An4BnsG&S(o8lBeJeg`_CB}i2h)NnTYbptxlYOhd$2dE -)PWLeiNQ4h8)T0+SwZRuN({#V*m05OZAXf|6nV6!w`cWu|OG$q9r*OJgHUYA|VQu+6i<i%~li@I8pt} -3!RXK7iqtf3{J9gy7~q;8+*1*f3h3Y2VF*0TJFW*OsrHd9pZBxkPwZkYbY_gu-6Xc4Ypk<_Ckt1I48G -?IGh>!RTFYXk4mlx_)z7GKh<t|)WXa34J_zylcgv60+zYK=VufxEIi$7d^Y-gIo%((ANg*X;8So-_=^ --tNFl<LJ-$;-6nGzg>KZlW!N%Vm4EYp0==}04oS4C-Pw&QJzPO1gHUztfZV1So;p&odbMaU;P2*T|A! -=_~dL2>sM4oo2D^m<$5U`V@Y-$_)_*JU!rkawtbT;4E!Kqf^fiG_>uEMqryx5)dkQL0YHBph<cBhzA& -kBb7jwWb>#__W*b<oci?&)-d|kK3|+e0u_`~o*UAEl))bHA8jKF%6)zH+=M@BFtlk>1Mb9Dy=o7==SD -;}KJ=H)=iSCFEp|N94yN_Lhz-fkTTE^RttSM+&{F^ngt44Dx^~Uc-wXQj9Ul%0=Av`u7o4m2##E`jef -x>AG%g9bC-zXpBD|A>(L9V%;NuHYb5?JN%@9Nmnw^$QQj2p^n+crID1TGs{a0+$^r)=-T;^%<8hNu$R -6>=tL1Ayi>kqaJ22f6Y!2q_;7`0DipD704sIf^wEEl<x+hkPx)VjockL0aUHuY-vC<0H!8NV}#CXsSP -Xo2R_RRg8Z8=Jc17^WWZ|kwg9>B8LNlXtmS{SeHF#58@L!oJe%YBk{i%@CLZXk5baew0snrG3w*cERz -QDEcf`&AxFhPpE;S6Z%Hg&nS4i{Etc9Giy;|I208~|a#j+UgfT$4+h8qXqaiTHUQu^EUSLsyj)h4ryg -nYwaZ(T9eLuHBu-oW5;)R)>BCN=zE+#7>w4i<vyK=_*On?i3MNsJ7)gIDeFhhvaserOa)PbTn@_}F{f -;>CP6Fe!oh20;jniO5@;`oxRR^-`K#sQc5J;MJix02@SHyvN~P)tIWQ<6VC$sK8B1KAGiaMuSaEzehT -0kMdBogvesvFtj=W#k&|$8U~~Fw-0zy%@J#0y~&*zTo!J(xQwOQ1#}PJViOw^l>XEh%9V{{iU1mDp|s -%XS#H-(JH>BZMM;co~b*NzF<rQL~NONU<XZQGQ2CSG8ANT-PGMK{$c1YV)Z<*K(IsFSr?zls;{RL`H1 -n0ieKJi?jK>j)i&nYTN0Vh`|ii7cM>eu|FJFK!JZSNr5+S=1K|RaJyfD`aqI<LsQSuag?t(REUrS8kb -DD881L&o`y*mrl=`={?3fkui9}7HL)*fhF|y?tryO`8QVpm6hq__UM7ATow}o~xgCpU`Z9Fa>eje+z` -hzyZf&e@B6;?w;6%Wc=$vE5Ty2~Z}6t#L!&@LQXMAiEH-iDumi*RUXSswQ!N8F<im$|5;R#+d-$BHS7 -Nx<vv{Ql@9?J}C$DioZ*g`*Kf6E?Xi4mL!AqIbgo<EEtbJ#zK!x2Ew{?O2&!^`p`6Rh0Zu7ggNcnhvv -;PUH2KQ1_d@6I9S_g*HXYmHjHw#kMsRUXluqkfcgpOFky!)0@agHFE)Y_;*;O=uh7oji3#%#zX$=v~# -_a=sv{(8MANSq*zh-<iZWBwnMIKHaql|E`8q?P@=0@DpX8RyyoaMSHiRECNC<S?&`6ow{BHG@l@N`WC -WRg+|qCPpn3p_<026iBNq^eD=Ql9ly-kz@Zin(a!AZohlDf|(hf`GhbC4hYtFt}cJxTudVD{!E_V1oF -^2}!!sIxcOpab=bn>E{TjEggl`PC-oINMj13ko4o!E&$Sea3$eu=^4zdP62LkXhan*pba#KCjj?FE?? -+nppwTWDW(V`0rJhZAAGqZ#|@{O7mIGEkZ6`St2Gg%GiFu4+(*4GW}~GsKX`Ke2dg(a~ReNA(AlVn+J -4rkA~Us%iE>M>XCaJn#KbF8)hX4#jzqwchp<u&D7_5$-EowLl>SPOj1cpD2_i$cp^=B@lPk*t*}I25= -~J;)y6z7bauxe5R_aqaAH<q<{!Vcy`6|0Zq&dH*9a$j$-kqnhJN!Be2^JTy<jnsmlH6&qMx2RosAg@$ -7Qx)yi4Tnv9v15>P)}2IhD8nJ&qLEk=NTn6|Sh{TG?%FOc>n5EoXP1^fs&q7BVD^)?PzNiFOIPRQvVv -j$(^{^PcPy4{~-a~a!uCs0W&(Ic9BV_fd%CVvF%H=&Q2s|C9{PZmFPJ<h9Mh7rR!vjQubiG!+u6N0p& -=j_=9w3DQttfRYRa^xhR>0RWUUWbnwdd^GhyRyJgn`=v(fF5eoAMd<-79Mq_yK`#yPDrIKI3kX}1fxR -v%NJfNkKB?>w(s}5ghRk(>7Y4^_cWHCPyr)A{sBZB)GLNLZRt`ye#KyK8QnAya>U_IHngD`{0-YQK;0 -i#4-g|D{O~|omb*h)eSTw@eooRy{Tg5WeSc08YCq0qiq*8i6qKKcBvQ~P@e0QONGLCJ;AziFPzwi}k> -tKGvnhI{q^OR+p9)ves#;bM#JqC;%qz?Uj91z#r47u1gz^i0y(GHef9;=f`Q1rq_ZU>X)>%K^W@>$d4 -TxG$u2wR5lrnuuZ#{ei(m)sHqlt&9x$oo*wFQW3p>!8y1oo~)jNS22Ydvy_q9=!It1qc|R)E?`_b^`5 -Y59?E1D*RM6Vs4;ajm0eTS&d|zL45sTnqM1f?x!WT<NvHIKDLeY*oj{2bx8AfG~i9rwCORyl=P{K~95 -iew35w={*yg<6dJX>365nag=AY^$n{md#PPqJidtVuc$Yhb=OG&=qDDCb>B$==_k>pGt$866*6#j)c4 -*J{1QianQU;mkg)Bp-RmhrwDhmI`SZVFxQsiX%(?kHX@_A8es4Jkn%OkISp}4Qu%g(0;)@AY-P~-{w6 -zx5GPa}&-guibnjY<XzU1aGr)-c-vtPHULt*(+clvn2pnu|ozK=Mb7c{ZyL}~`b{Vp}o=4V<|4^RcxI -aX4yR<2+;lnZav_oTFoqaQ9qQ|HAKVua>@z_x~$CiEt9#rAcT4=&5{sQ}^~Z1S<S*U2Vh;cjBFZK#1= -KcH^mbQ49<NyBK%gjB|U;=-FcFTu|NdBx<VV0GE|j_&d5GbsLy+||tul-WfK_>5O`^b)pJQ}q4{a&1w -gVwi?;-E8GlP+W^vG6<iiYXre3;(FbNqWxHfI&zjL7O``@sEySz-XE@*9N>3clEVT8M@JH`5x1MA!gY -rdxSRh0kwZes{BBcZ8+ExFmeb66)g|r<h3|1e@Q>=on(d=@AO|mK*Z|4kd___H&O4#O(Z@6*hKB=THV -^ACeC&>(gJ?Ds3o%qd8%g6idH?Cv+czijvfi8=jt;lr6OZQj_uW;Ik0=2tD~kNf6akYP=|`>>?Rk-V+ -1j9tO$`N7vM%uOU>+^VixoK*=K$7=c{G<V#s_;|7SW3<x$AtA)fH41P>=y+$pn{NjF`#4x*Dp-`!?U8 -vO-MAR3#)RRAEWxpN@}@pZ#S%dXplg^ThQ{;|p_r6fX!oVf<+Y!2FQUqft^5r<@jvc{CPYFCssF1_6e -}gj1P4v8vEHPW(E8lDt^2nb^n#6G&117BRKTc7{0r>CMOV<4?bQdV89_JNx_DhxFz9_h&CZq%t1g{`S -44rC^}%^W%s~owiGYR$+5MUW#2?h^11d+10F4zyE<qDy-Cx;k_!rulStq%x*+uhu%em+g#+GN}?KgE# -BNa&GdM{?WUwA)@~>Cw@U_*<MGXzRo1|26ke-raJ;fZio6H|`#%~GVynUfS0Hx8{2TtZ$oB&Ipt#<&? -(ZNbdj`{BYY1c-N9J*)rj}4H(5@77LT`GDt%4yEJRFh-Z|b6+E!i+8ZBToRZ#ejOmxP@pyuo!`Gapt| -I)wDS3pv>O9@|VgJpoVeGW-=0cle}UUuw@yVt>LO#I(=9@cEc8^gp!F6|qglb0NDu4uf0v_<*AjZ2+~ -Xstz=fw(hD7tFFh+O0Y7Y{TEP60|XQR000O8Q5kVeb3`GQO$Gn}s1*PJEC2uiaA|NaUv_0~WN&gWXmo -9CHEd~OFLZKcWp`n0Yh`kCFJE72ZfSI1UoLQY%~)-3+cpsXu3vFg5!C8zVc17wE>NUd(GPt=>vbK{z+ -fcWW=)YANhS4){`Vb8SrR4Lb+#`PkXRP)o_pbQ$CKkYeh!)BoMwhe0dft6%qvbctfc~Gs3L}m4VbNx) -n*GhTd%32!oZG+T%$r{6s1$xP|?WB9Tgf_j$$k$93P;*)D%jE;2F)~c8^b}mt=oa6?v;^6fGrWiV{PC -fJKIT!go|TcL)f24`yFd>!`Q8mlZxmNHmhmh!rKLh4n8~m$zRqM3|sE9EF#-^oL(TS28K?tglie=oT? -8ibj|xnkq&(y7>eOih-alva^BKCWr<tIew~5<xPt`Qq)vRI4M!*5hEC6DUISdj-s`a1*}%<3YF+;1?Y -fO2y~0Um7y#DeTwP7V;cROLM2!xbGqUVo9h}QO%J*llr{uII4rCx!?->y=X6afZdTNW5JjsMCI$^J;5 -yz=)8;3hLR^-L31jbaS=bM!WN$DYy=Bd#75`fB_$G3k@cNe|!;N0Rx9?FDp-~9XCsuHY8#;w1=frNr; -*Ave@afatJ*HJB^9b<5T)m`rYdiawaiTq2?}%cu(vBedz!11+W(&6!<7UPL=&H2gM-J{eB70za9bAEl -HY%Arf(lZ2u355LG)F!~|Eicm8X=uDMOck#V20h%ByHgA^}$<1$veU;bc!fCj{=dIPwE_&XacjB;<vP -5g5f8;c>B7Sm%gswi8(y?)M8n;UYy6Fz6ScWl-lz$0P9@TD_HdzXFJ3YNU}A_FgH6P?}aV4d#QFVxyM -khJj&9QY1a8>>jNxPQs;dyXBd=Y(H!2Eh80+Lc{iq3udh{eagOwO>23k{k&>d#_p2ZkHfg@?v^nyvuD -jPX-Gu%%_S0@i=vffr<g!w>P4YdEvg8c+-gUvy>w5b-=A_{JIw7tx1jJl4w<(wRSUrhbXX{o(NQ1itz -4~iO-j!V}YVHL-`EJp)30VZIJ>csD*bO>oncEg-qegk(=wYW$*!3c3oA%=8S@-NZVY_W*XWMU8&hw!z -+aEa*tRqHP%fK|)HaQ<uU{7w*>-JsI$MEUXr#Za2`grvoGS{rPc)(BHy)6eclA{sFDqM63*hX)C=>%B -*%=02C_W3KDi`PzW61vps?EQq*AiZo`xaP1(>Z1gYxC|!+fq$1<qDY2aYUz&Ei9cQIW22-Z$50v>ZI8 -Jdx8&NSm38qsrOt^^7oB~49ouj5O;Aa89rY%03vJKB4<)wB&Z8vUp@BOowg`MSsSV}CkoYF)&`0<77; -O(ghAh}K%5(VU9iKzbNoNJ0#_1Qy#AJY%d>;Uw$YW^J1#;+3Cp`Vn9(o@5`DEfxiFQ<Yhg33qaEsj&( -aUMuU#+C9Oj(&W6r5}A5VwGzhYUHvxWM|u*z>^<WtL=PgT5+Cv$yv>(mckYbK~ZbJ`-vKc1c^}#W(JN -9eMm{(N2YFv!Jizt+8X<NFNzR_j#ycN=4V~D;=Sqy@aL6Q22U?dNa@;(mp^PLJVZx^oHH`Lc@iQ;Q}T -?PrHiUDm!knh6(fnA<v*g6{ERdFZ45KFNPSN){L4upd_?dlkKMk{L<TQg7X)<#o=G$K<bA`OGTSZrj1 -pSD#wXWY(hk<*U67>CgDMYFq0;4Q{WQcikxp#Kd0Iq_9iC|EyZ_?LQj%plpzh$_-1t_9zq?L`6Kjc0E -c^Suj9;VKpTW{f{hZV&C^4;>Y*ClfzW_F7kcp-KR(At7*uakk4TR}Q@);M+zt1G9&s2vn)WiXm7a<-O -U2&k(rAl(sC$Oqr7Y~x-%}ix&7;{26ArW4SoMUbV{**a3z_-j<V2r5-RsKgmb2_tJ|;EdckDcW@%D20 -=esNGer!2o|2>QC9v&rPdxepnp%4c15REpthiK_Nww%Ihb@J4CX!(yvZZcLGV+#K=vH#z+wxNyY;8=G -UDS<ZLks>(9qaVhVoO9@%@NC4d<K@^H>3&fCN1NW6h2NjLLvuuHimz3_5sVhctmA_m=&h`9D&3Mh3LA -W#RxGza0TIr@nW$eA;;tY43@XB~AU@hYeWjFCllXUW_~pcolE(ey<<A!5-)NkgfA@($i+bkuNlK!B08 -mQ<1QY-O00;n48F5TaBbdOV1ONa_6951x0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bV -qtS-E^v9RSKV*hHV}W;U%{y__U0Met1<5-ae-i~Q>@OqA_xRVqHQ*mWKeWkZ^-|?JAOzfOO}(gd=bgJ -``ricj?`M0IZKlD-t4tV5+?IqsSV@zRjKwyByK%nnS7L$EQ<--7cwm~ktk_|=BkRKHDY|t)ii^z2Ur4 -&BTT1hSyYA>rV7M@=c3y2R8$l8SjudnL@t0nVRrXo%Qa5{9k7#xD+PAV*=>AzeR1<{v0TLyhV#{@_Y0 -h^7XR3-#h;5ny|{iCrtrC1eZtwz@{i^9$7MW;STo|47UCmU4?-i)vMl}*>0VdzQ4q>q6b0pA3Hmk->t -uO-xrn?u9U^Wz4zx0maqf1#&4J*Tj^>>RG{5w6)~i~~t{laC38eV9H-7Qv_c)4<LW>OX^m8eT(Gg`FM -Nz7FRk0=lqw@Z<NX>X=W0#3F<cut&Ns>_|)Ox}UuzD&E+??VbsKHM}<v@v-BNCd+N`O1&D&M(u5ZOZO -Qa7RkmtJ39ZK$w-^exzbu{rESJY(?(p(R)HUtuBeWHW9!P(bd9Am%%BSn-Vqt@F}NCyX1TAuG4My4Xs -UX;IAILdsK54^pU%XkK_o)QKRlXR&C~*~F`rc@C$z!{+U_mORx|xu!<VT2js;djc+E@!wEmOt`3`980 -}mJZ@qEC92K2SPaJ81H>ICh9mLZP#njiImIG7Y4?!93oG}X%q8|1@zr>1&|+c&E}<guQ}5+6%ariDQ& -kx)cioZ<+)AvC=e?aNQH-nx_A|q|gBst_G(myB{2=Gn)<ud1WuK0XcS=r}ug{pT<z`#kPfVV*Y<8Q&R -`(k01Y2cdHNG|gR+yY@TIN_o{fFDhuM5Xb@bE+6vNA<plDQMM+utjhUS)H*ieOnCDkE~g98z}auwI_c -K_PI2X%APh1GvJpRe?sD1My?H?2!4WKN7Hg@lcdsihu?e+zKSSh_u7qI2p^$P!Z^1KQ+SjmDYd3kD4j -D;x@wI^?E4`m#QN6yzJTnn70xN!*=U$L0Ljy`5@tlip{scyywvQt!J-BIdzFcU;{Q3dHo2e>0clOqQx -aEP>;{W;;7y;7xe&hbQT0++!DjHpAca`yZz;^-o5>mbQ>JxCItz5!AC6yXd{Tr=5yvBdb3W2kXtvD^^ -acRxQ!+h!NaFu7i?W>X37V!NBTUscS;S|m1s<`aswLu8?y`1d*jP{_zP%1ftsjxAVAFskF$ni;7GFo? -akBwHr|?C#dl-Ii_Gq$v-EeM-^*@n>Q~&52fbJWgE)L5+{Yn5gHor~F^_=Fp#!x()~~YxABXbH|2+)m -ZMfZ<ni)cLKOKXB{#tk*UifF~BDRCL(tB|X(-%NuN4QZ=8Zz{p#<8yZH|a;Dsh?~|{ie0xu=RDUAsi< -=B#w5&ZKR%I#0z?H7_aQfVZ5d{lbD=sU}1cRMn=>&6<0SZxB8*KoB57sL;0+R7DlUZvYuM+k1Ckh{B6 -S#l4CfnubnqG1y8ZwYr!9SsYUZ1p(#OLDQ8mxjHf7PGq7tr5r2gXr+aT#Q*e;HpIZL?4^T@31QY-O00 -;n48F5Tyif^g+0RRAn1poji0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bWN&RQaCwzf$ -!^;)5WVXwc$5G_A5g#tLskl-4HY<Y)1oK@S{fxps0Act#3=gjC24B2VyERn%gmd{Hw#&crb1a(cB&JQ -Wr$U6BNU<s+3-$5cK*kxU`HldQ)ATCEN=?PI8z`fm!4M|j<<@3g?>8%q9M)`_O=6++UDh)N{Lbd@I?7 -52;bO4($qW1J0aN-MqlvBLwXfZqGwQsbOVYqE`15S#HiL5hcSzl))JaWdTIf!R#r*4NuvFIOwug<@ep -Su*~DXzSpszawN+@a28A6Jt-yV@-GQ@wTex3&k_xJA;SEf{7Xny~e5)Xhzo&L%d{z`~*6BKXjH7g$5b -Fr8OESTDWd25Z2RFCv^Nzp9Htl7`R4F0R3jO{wGnb99E+d>XseH?8EbO4?L58nzl74WZwI|ek7O#7?? -n8_Y-#CLsh?Z>}w#KrhIqY}aCGnv4r@uhsGXZaM%89lIzqABvI@%gt@&K1`a|b<!fJarg_*{d|<Le4N -8Jbbz&>Eu<U*Fv!U#N^;7%xoWOsW5=(NS`LrP0$la;X0rrD1}HGc=jv!FIP>e;%CgPqN>iE*pVod0lp -8Dtb@8kmQNrxh`*dG2AgBl`Y!)_kyFd1m%F8Q4n}jk4zu%`uSsydIZl%9;krYUQ-`)v;)@r3s6e~1QY --O00;n48F5S^!4NSL1poj{5&!@x0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bWpr|7Wi -D`e-B@jJ+cpsXu3y2bU!+bE>UN*9dO(*rMSvwKG7sBeWCA0dZ6cH?kdzx^=zrfG^%B{Z@={>HHX(pz^ -6t6k9^R3Rms;g4NtTtZG$aWVd8xEz{MIO0SxD;d5zE9z7@>-YRfR}Z28k3FG?&Kntll1b44)-|rAkUj -E!vtE?Mi2$Av+bR_252*(z0_mGt*k>+P4GgfK=_3q1O-)*^PnG)3aq$Mkt=wz-aJ17orqpoNS=Tl#Y$ -KZ^Ia?MX^fkwgl5y#_ilKH_!~lNo9rXvdmRhNjT%FReIZepg4S$Xjs90i7Yh4sme<sA@KhS7Jq)dc@u -sO;y0lmdY+fTlC8kb<{IFqN=W1%%p~McSQ^4C>o1(d4eLyM^N2rcy>EM>a`%cE?z+XzOyF~q`C*LoJ? -ETCZVV%n-?+R(W+X&>sfuezD{aIE9_GSh#$K~>D@9?CGhz6xglSb&2C}0K*Mh!x>*V|XC-g3uT>~q*w -j!-0*E^YMC^eWinFvjVlf9Q=)B#$>_(qA0RR&iPeH}k?(|}cuW$71Kz{Y3XFk2yrVPAw@I|56rUiAh2 -I=EC77K0pn-N+<nb2LR*jS~!N77z39>UmLQaL?4z;WkD{K_cA^5KCbVCA{PNK4u@W{&;#vp1erGU>&v -Y=E3lLGF(c&V!nlY>qq#>h4is)7_Lekpun={7OB)ETE>(<Lj`$<MzSG_oB4qOssY-$xKV^8>^7IZ#91 -&2`>WZ#H}!mpn5RGhCNLnEk&6-@_k$Bd++PaJ98(U+Agb4<uBCHqFR@x<`+=jNm9lMx?BKXvLE?s$xI -ZV*)CD{+!;o%T6fD@)aF1L2)aB!LfOtOpeI8ME+*%#Dhy)f6kTEa}=T>1#Y`uLc3T1;eHx9ej0*S5sa -DZ5YLLV{GAz^}W01&5bo9yY;$*&i)%XxBrbv37~yMeRokDuseNP;H)y760&XfGDXezfV7`5#`P?fj3= -vmgDZG084!{BcF1LE+l8Dc`^^t6M43bKI<=-l*9c3ptHGMR0gm9Hr`*o?KnH<R6&s2N_y)+&}@(iM=` -}9?{N`gNe{*H+xuAuW^H+9ncVFl|x3|j;+B9IyFVX^|srV_I-11(=}Gi!@(50p+~}@V$Niwj(HBI<SB -Km>o#W_ue7R46TGM+S|kLaJ#5g(b{*{wrvs6(XABzjj{gA;OWe{ZTEsS7R<u_$DU7W(AP8|A<NYQ_{v -(^gxQqyU7?7UFW$ef=f}Vi5w?=(IgLh$ggJB)*L7Z`Udl5+8$SLp$+D>!Mex5ZYzq8!q9qJ-QOhVyQ4 -e1o=+NIZ&%_(svw6P~^y!Cw3Au&*8uKXi*2ivGQX3hA4Fs$0sAQ7vjT-?-e2RrZckC;a8gTf!ChR_W= -C+MRm)<_yPqk*Imo0hF{8)<+BCgx>{7wFFT89WwmQLMK;B7?m?UdMf*4lWy*(k}u}gktqCs-r>14U-y -a+N{RlLjPA5<7tn6)zXcU7g;U9t7+31-&V-vIb6tS$v!v*8}r4{<R)ZCZ1QNNp7DYpzGIUc7na`snbQ -62FzL4Z|EXNO$hMK6v#>8$awN%TmSb&?YP9`Rs&e4A@Pb5||L2~cM{_B3w~u~>#;K}`b|@s7Cr`(X25 -{WJp)Jn7L|zX<s+3E*uzBr|5Et$j4Z6_{{In75{ZtWpe*;iU0|XQR000O8Q5kVemJOUoXa)cPr5FGJE -&u=kaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWp`n0Yh`kCFJ*LcWo2J%cx`MhaCzleTW{Mo6n^)wARKg+ -Fh{8Om@NZ_!~qJdY0-ITiog(PiMF}Ql0Z_fjbZ<N=a9OP5@okrUxxW1k;QX99)9OaZ$z;talENiC0HC -2zAp=*2wlq}s}zgP_Zdm~flFTGGg9R|DN+_^Troj2IoTjY$;&7{uskh9B>AzyQS7K<bt>7!h-Jrp)~q -ol7&EV<2%py#&r&92q*q!9x{U?fvSV3eM9s>Y$_6)TU&ee#Vb^^&nM_i)AuN}8GO0u$!<z|#58n_;xF -nB7&deM92nH17`lWuyGLVBa=Tgx;VS$`=rwIpYveuD9L>Z+F84IRVCY(=aWD3^sL`_4mG0CWu<b6@7p -jiLG5>;cP?QzU=uHrb5EZfY0Fl%3Y6|s!%S*|o)x3KQ6COhC$upE}2SCe*4iBktt^TAY<775QcMZ|OP -YfiKK<-IF5z>R2Gg2#jVB0*A&l>?QtAIm$I2?E%NbGm2YH-Rgwb;gsJr{4xno}^;?xDr_yhAkjFCahH -C7jOn&L*^`mD1=L337$UVh8$u<dokKV0$@OV6?&`QZSff##q<I~mVzC4QOO|0;Li)yO8^UGsN%sKNAX -4ps)Xk@%OSg9BR7UI<v^y*%5H)3tXZ%U25>lfr^%U5?Bq#S+rDQIS#=PNAt*D{>~EK`yxwXkJ8!eQNs -vnkZsH#3m=TQr8EGSTM(U`8Anw(GRteZ>pIs3IL!#lIyU^mpYWwVpwEKcc`~0t*be>`NOr4kJtCr3OL -AO};bkW2=<BT@yebVgG*uZ@d7^%Y649TVt=8^EcMO%4~|4&bBWP4|8jJXstn_50b%4P(_&&7u$?TUdW -2*BU=HME5tl~gH12};b!OFZn$(39^q3wFP)we*rz%bX^8Hi$+{0FM1881lU)z|v(CMr#V1&~mOj)4+| -jlx3)vyBGzML*C_E*+kGV_B%S#BTCf@(5X{)G;lU!DD@M8$`mw`A-N`V_q<KE)e_IB^gWrc&QLT`0>8 -ZC0x7*>8^`OS$VMwDF1CESOqLXg`O+#aTjzN!vs@P1O3j@6)r#kOg7!+MR44rs=C=<t`vm!pGi?O+zh -_A$BtNijZM+EJ{AcZTMamO+Ro$dq(sjme1p_6Xv-J8v1;<y{dM3AnrW<q-ZALOKl`qGd5^~p7P|1{5a -=Uvylsd)Ql^V&yksZ9~9@H}oMn2x$GPvOxjK6@~-Xo&dF!X@|4|*kV!|)Lz<ep*OkWF#GG3RE4TGQKA -Rc0WAj#^^Ta~d{&j2NU!JsmlV5HJkxIk*ZfDVSp2#5)BVF%99N#gqh+L|<A6bTM3qeo<6;N?yn*d4Uk -V1lI&E7f;KXT}hkr*4h?Yqgwy2WQ45N+}py0`Tg6w-`^}Am$QpV^#J7uYp|9d-z^OPk(r+KqcuY5@17 -aPzh|!#hlB!gIPW$c$%p~(+vyp@21IHrx|-1%px*-+xxF=4<LIu~qXFaCcW>Wl{s!=-;a<XD<WRX!<M -06ediik#{ds<KJzrrA<7Kua-~Bi_lh_dHJFYL?5Wdx(r9>5E&45z~&6MX<oJf6{b@cXBB|FH1?ni(~z -X}F6(QW8f2spA99bRHFI%G)`Ohx3w$VFRGRHf|Inc-0!g#N(Nd<?G7NH>=uj<E6n`Iqw=hfWj12bxt3 -^Bl{u0ipU17-7!^V?)1jz0LI?(w8&Xj-Y-ulpOVfA9$Sk_RP<L#d$D?vSok&Aq-crowjCx;rEDzj1H- -XFF%S?gciRpOb%I5VReECe_ndpXOFNNp#S_oA?U4Vy1nZLKz=5#u;}))v2Gg=Tu9U3{9U82@mOs}x`$ -imcl3aF^7eu<o%EqP%WSIv1v?m)G*{hnWh?Bj<V_XCE_AN7*YYU-{K~y=KZ5RWW)S`FH&L)v?|EBuG7 -Qx#^7Qm{Lq0Q-&>US{NhpM5s;6D!BhzX$Q@ATe^pqq8Fd(V~IuH}XytsmTnoz`QH1~YFQ-omxz$k+i_ -kn_6G@Z)vxwrP#r)eX{pL9LH_Ls-Awf}poqk+dkt_PadcD~<?`cbLf*+ntl?-1XsUq|CReY3!{_&)@r -#b>W!8$WDlmaS>>38QD47h+GdDJeyfFbO1Vha(0a!8^uZxJ-JSTi@}*$=^^*0|XQR000O8Q5kVe6JKo -*$N~TW1qlEEDgXcgaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWp`n0Yh`kCFK1<Lb7*NUaCwzg!EW0y487 -+o*zPcA5Q6PGAcri;VZf4htATYW3PZK&RIn@smYl8__U{vICzfk_O?9y)k&k@jlav-ZhbT%*TNW5aAo -9H~Ebs@TWoa?0=L`~Y5JqUlpj0B(2}V*_EVwk2NlF+yROV64VqM@7<olNAIJ$ciE`Edz*4q_>+s(IVy -V$I6t{2NSgVohC{B`Yq!u4(Ve}HIvQ(;u!dS$s<go}Ey`Mv(iV0pFKthZs4?d%BhzzrVP9J(@=D{GFs -2Q8Ad#2nok1Lf$LJ&)0Gp2U(H17U&qlgkW?fRJYGeEN9;ZX}qx@=~dyC@?6~W}U`6_)?}R7GNI{@IXP -pXm~=1xq?063sr5VT1x#S)DE=5lmEWJgV3dcIc)v)R2MZIxl_!Ub!oM6X^6CS7Y3BJ6-L+S2xfJLss* -E&36Acpjy3JO(s&jqlNzA2@8w>(PrRzEw0dtT@D6QFUnnkXyNi?ESq#p|o}31f_Y*&LvT-J$hPG1${` -SddLM86FaLXA)Cw5-aWB~JdE!J*a%XbX8wS{<~!VpMjp9JXEo!Lz4m`j@X3@U{-R;PK#%E|nIg~cRlW -BvKtt6Rq4KxJ!;`XzE?+?`MznHU3SULE)mA@qXY1zDRPgRG@Ay>|&6dMGH(fIdgCsjCjOfqE%@uTFFC -Sl?Yf+FV}V19vT|itXt8cfdKv1M|Io4*4$d$k8wBr^yD{j0_SuX$@RN`rduKhl@E~b8h8LK;-<Xa&{V -d<GCGfLTz2qcWNl?dGx1kUr>4{!%_M?q<cCKX9&MC8&-a&^%sM!r|METD)+11_jsd923U_#Y+j=-qK6 -jioI(b~WekHJ$5(GV*XtVOj2o^Op?QZ#vrKespZ6Gi7){gV5sW?Vz4v=W#N)5}3sUrA`boT0s+W1GGN -qqXKuJy~{{T=+0|XQR000O8Q5kVe07qP#GXMYpIsgCw8~^|SaA|NaUv_0~WN&gWX=H9;FJE72ZfSI1U -oLQYODoFHRnRL)OwLYBPmNDWEJ;+z%q_?-Dp81!FH0>d&dkq?kLOAQt4hu<N`=X4aRC5OO9KQH00008 -08trnO!G+8=^6t70OJe*02u%P0B~t=FJE?LZe(wAFKJ|MVJ~BEWMyM6aCzldOK;Oa5Wf3YEbhU!YOE9 -_4v~B)Z4Uv#fvV!rRMFNRCyO?_);?4U;=i-6#E-Z|99mJ~L!9h<GxN=O=kul!e2a>T3qWMsa-k5gir0 -{%8vGqod<!&3I@}lMpHDA@;35hR7FNmKF9A`s(u~;ERn3)Lnb4(KHc7TEp^)n2dZ}l#H?Y)i&26chW( -M~2-N{XoMNvhul<3SxO?~Xb{mAA~gv?b#6G)~KXk(aSg>wX!lPnXd1gTWAL)(iq!HQm$Xa|_@&Gr(QN -a$)y<0~e0Yb%1<JEIL|H6?6~mhsQouVow;4HsLiQXf0Z1_>Egj@T#-C@mO@;~dR8cvuZZS+6Wd6qx_o -RqY?ii>+EummR7)EZc8{1*-&XfhkNcT!X}JSG+fS1_acHh-|*^+3MDzRuAr&95sYtn$7>+#-*-tJqI_ -6(u~!3(hAv9qCx|AXl2-1CKhCTbdvNl`&h%gfsi*{zdpGcnkRxLMREYCf%ZZS%s@j5*ZafhN9ZF!i(0 -PCV<ni<d!(7c61g!Ac0tX8A{40&AO_!!3>nnlP<W*LM{4YCUa6^Fz3#$F^22J~Y`<WhcpyvIWF{Y_z- -<exPQBEo?la5APsBz)<mqxAm*^y#TD8;U!*$G$&<Ael+!3`wSI0(yFAj@}i@5k^P^n+Z(D9%d(Nvy3A -R7;P2$VaIso6e<Kh1VPOw9I!y7&@iTaSnP$mKTgUCQsIS4W#lal~5?SOMY;UHQ33wgR>`g(}XAeo`U{ -lM1uSE30{bdyj0$;_sBiKu25f2z}C0p<6(wmuHJb;4^^O5GH}KjH1~qWDOi+EGt6dY?`9Q1X^Z)_B!? -)0;m56h0{+iar#*#ZqHmlxsU}VyHo=3_NySuXqY>$=HXym^i5&<TH`YG`~tXsz|)%so>u(UV61DidBl -AhjDceR(7a#`Pxm!2yoE9$HN#2X4YfNNmHxn;72*89H+ym2o5SCNZooQ$_MW0VJdaJneWU?ANPGvEt^ -;?jcV)kkV~B7~D*GMtkSzKQP)h>@6aWAK2mnzTaZG%HmT->%008I!000^Q003}la4%nWWo~3|axZCQZ -ecHDZ*6d4bS`jtU5q;p!Y~j8`<!Bx%21$)3eiPC;U*1mfDpe(mTa%J+1#H*ip6Kk*?BVxM>-5FARjY} -(!Lru<}iF<<uKBN+xx{@6Z#jz?p)Dw0-Yrh(mL2a#eOFLMSuJy{_m$gA`7yairV`L)Un!_10s^b-9%V -SZLeKR$EG=vV@#A-X;vRrzho#2D-Rs%rT+#{O9KQH0000808trnObIUfakL5m0Dde002lxO0B~t=FJE -?LZe(wAFKJ|MVJ~BEa%C=XdDU85Z`(K)e)q3ny$`Zc+i>E<vkmG6+BDgAHj^&ebTHV|Fld>IIguqTDK -*I!^WXRICXu4#OK0b@0wPBgdCqsPJR}vdbc05SZnBi+h^`X6!a45f=OyJN%*|7g&@f#Qy8|QUKmNo!k -t9ZwoZ;k-@RF)&ScGYkW14h2i!YSn4Tgrzk|s2{TZA#@9L>;+&H~4HN#aGuNJJl@X&F2w!(q@_XaI{< -n)3xC@QRTUkjQ9EdPQ*ixfqX+$>(AMKc9;z8WVA!9?gS(r$ZxwarA{SPSa#TlPJ9%&(Um#CTAT4m!=L ->dCtm~HG>AYcRC8;yEoUbE*MK$@002;ANq<!x7$UpF(-&Th9t{@4~kNTa2(5VLz2J<kQQ*qI43KVv2+ -=e4HqLNg$#IfY+kSFiYk63XN%cI$>(8B60p~bGO!pl;24<vyMV_HNpg-b=qpLVPB^DLqQJYEW%32bba -f7bWhoeLAFdd!C<htS2cQb#7KwNWrGTL!geXS^-<Rz<I0|{(i+jE%E*BxCqy~<s-%4VLwt`rZ2-SVD7 -iO9%BYD9R+x<sn-=6Xj(YdebP`=<Hqgf7(1El_SDR}|WOW8`07?cq>Qselo`kfo%S&=*m6g}>e<Rj@@ -q!*YTff-VOLh9XvPtU)O&&DS|{Su78LpNCT(29_{Tc{X}NphF3d-4G&ND>f8(5&0g-_TUYk463x$DG* -wZdgGa@(^M|(>DD90<F+kG(&*5aqAtQo`^=fFCxGW9iLA62O$a9B)ngUm@xoUOPsTr9A_~61&Js`tcW -40@pW3n;O9yFgq8&1EQ>`niS#06LfWPreYm*-ikRUrhomDZ31&*QkX0&dB1!b<>JboRec`qwDK>;b1Q -}#UmS|;+0}b0Lo#+?tRE_{})}R>*f{L0F@T0;W(|ZDPfqR3bGM!_TkO#t$&YLKWkWPFK1+WH~z)e`er -{q3K9};B2qWP1MPpRPR_!oq8l%<?XWM7XecVr}E+Ug=I9{VlQ0I}QPLoh(Wt1EfG4(6_Kj?Sg|owtnO -d*f*$by(eTvXV`uTX^oJys73R=%};5nItEei24RYi)fZmEO#U!v1i_^px(RkH4!V;+a|kRQpR&TsoDn -H6z~olzh=~{0s0`4KR|6Tp-7H`oeF-E$Vt#f1^&JyY>_`@<adb-+nGQ^^>C<cdF;H=KC;#Q;C`X*AI1 -G#-Y;&%{k?2|E$`PKf2ezEt3mYiXz>+#sSM-<5!i@|Ntw~Rbw13~VN9Z28L%{s8&GwbCv}<I<yDgULD -yhxFZ61T`)sC^vXfBd9Zld*c7QJ})PPu<*K$U`kGNcKEg5)y-B_!0vWPshs5B1{SEFy7<3xhqK&`A|B -SwNIZ})=A@;*RYm8X07{?(tx--UoeP$}_2{yyE|GFR;$^V|BkJulfEcI59XnXI8JM-Mb#BO1r#4&0(r -pqsn{oe$eeB&c+Aiep_N6Xw-}PH7Ce`7UKo)y$@sS%EEfh1<crBzK~6lBmJ2E8x1^uIef6#BGq*PZ=x -@7U{iTyGmHcXD132EG&1TT4Qc6aTIMCUlX>HRl*72H69uCT~=E9VIZbQ)igXZZ993(=~gb>atv!}AOU -vO3ere+s3M8Ntp-a(h{W_iuy(k<JO@|TwKn*w{BJ*qP!WJWt~D(zz5NoN(0Sl4Ec9yZXET3;+6=HTTR -@*e<W#XBQo4fo^L`1u>M}#)$K&xhJagu9=nad6@mW2hz15w=01eU6yx$i@TXrTI5?8$f6jyrh%}*k8Q -K1{T<m&;q;n4u8zrIWM=Tvdj^GdlEwA=aUj^q}4I<F-*5Z0xmlo{LveP0M+44Tw(R-J;#fs({k0JXUM -?@iEeNQP2+F9nKARoS+ogiELQE)8eRc9>3|gFdTu;{TamKm1C)*7TR&w};E>&k!!{_Ez;sO9wxRq*f9 -cRGV(@>iyuXG9E9#JF~SkMlYqNURo|TJo1#*pd&+Y8p>(H?eX00@$EYEC7677dRDiyi(cY!c2<rWgVE -Z~a*;zx^mj(cy;V)_hwU_)h-u7gJ@F8Gp1BRvP+@vYASNCT1vME*%QGjvgju=l^$ZQ~U{n!^o#trSP| -UT3e{F9tcniUEhZ7w1g+}Uc{{cDbzV+=}oHS*g1AJ!uIGuuP&njKKoXN%)`>O)FN0Nr#!Biy1)96JjG -&hxd)2M+KH9?CGgEnn~HvJ}ORzW4%c_kI)P`Tzf3Co>{-ts9Yke9>{W(+^s^OD(+lE0%BQJc3#9u5C$ -6_8bY3OC(SiCt_mu?eG>cPj7Isz0l-UL9MnT5A1HwHqUIZS!u7C0{M;)^;QP9dOg%+5#_^D{4+5{5JU -KkFT!Yy$R+u$M@n*I?=Z>Ie&kBbMe#7_Z}N(CDvTWdXA+G)pEQMe4h#(%QdW^Y*rYxO;MrgugBHisM^ -vu!t^C?Q2@CcZvRVNyx&U~>95j7+45VfqrT<QjH?c)4kC>N2pi{tfUKaa&LGTM2{$B}oISPW4|Di~c} -S@>`8h+xRoHYZoyf|m$|sHbsgljjnphjc`p6CIL$_B$ck4yVTd)1MoHA|Yt(Kg5nxZ&O?)-UP66sh%n -Pb|dJgluasN+8i)vg8abqaox6}ic=#tM2p?Wa>u-DX5}lGpUoJpzBOrSi9fw(4)U?(BU7%|d!#(cpcW -?}5{t=Yae9?H;z<qT@!F==j`4)UuwtT{DvVEL?1`^jtHvP2RU+macc5Tg#a}(Ar4LV!$Y+0lDd79rkY -F&}8A9pG+5wY;e|Fr5l(K28idY$wD4-&P2^4&tnsn@o-$OsRY4pxBGz%VXQh|FV8s5iMu`t#bF3@zxX -dt(Wje_CsXmkLr6II(A~(K!K<%EBp@*hnXg952H7bsatJ#SX?m37SfVabWeGrW>k=iLS1+u{LZx<Hp1 -?TQcO-k3J_wcu$*na`ECZ^im+1I(D$VUL(d9QZBlWWoo7BCMAOufEWPrN=>cXm8EMy!i;E{R34G_R|T -k8PxN{mDKp@-e;cy4M)(<IBti8?O7P7`l^(le}PsQY6VG~-DlF1y#8Zh1;-drN<xu@g16ay$8G3j<S& -fLY(qu^i(0OxoOeEeoC+839m`k}PZxKkOx@2X!w2wQ?NAY!$@<?MtKyKLf(=y6x4~iae@x?`4<fP2cY -I<#~6YLG<mJv!dnADfL>(LDN07lIxmU!6Boos4_lO9VPZ2bS0%jyKibHJ(=)<%s*kSQr18Pgn6)%oNj -5%at*6GzGJEr5z0+w?#krdE$0@A!R>3OU~U6*A@y~-vp#p3IiI!gA{I@zbHhtXUz@EII-bQ8D%+8sFW -mX5>{tKLP7mX1(8HR>#B?^nuO4s5*6!sB=Bu*VE3){`#jG-K?KFj#XD2};r=gV^YdR~pL?UwzQ|=wuV -5B}rILk<~>N#b2iNq${HgXwg<XnEiI11!$b5C{Z+v;fgAc}h*L$xaFjZ{;;A~v6e>Cn(#d01%t;bEXq -9PIz<w5%ltw)=KVK$yTO%E<Yng1}+}uKs(3K=I8XPz0_s7G4zm7f?$B1QY-O00;n48F5Twy!sIj8~_0 -4fB*m-0001RX>c!Jc4cm4Z*nhbWNu+EX=H9;WMOn+E^v9JT}!VfIa1yCuPDJ{K!PFtwnt)t0Pz&VVua -YW!mpv2rhC-gJVt2#JHFTF-l}tYdNHD;lI6(nI?u5qBf`$G^AA7#;@>`g_hEnhYJE7R{pa`J{D*!2ao -AU1{pQ0j*VpS?`+m(2{Wl-J|K^*ozWcL}^K1LlY2VuyUwrxHf30u7`}ob*Uw--F&p-S@{%QE>^9NsiH -@^M&>+ioilK=hU!}<4<zxj5pU;X4~AO7gI`ttAjpHQCHf1$)bA#sAZve+PAB(Cv_YhrPRxUjfF+*v#z -o-AHhY@Wmxu6VI{UpfcR=VCYgE0j}qmZy2;*|R+3_gQ}5_mvNBAGdYeWtO`N`C_@p@1y)a;`dR0pYZ! -sMcyDck$1?4$S365{^hlc$SdyK6U+PUpFKoAAfJ)t^Gz;zCh%<O&)Y$#l=e5;+52<3cXxbGNvh@^_o| -tvtTK=ofa%{x;E!+dlfSjE<r(qo_JUuHdim7*m2YC}p$-19Cgpsd*I_)R$_wQDv>iTI?v3T4UU{J23= -zsdJGCG06ZEt_=+WBk%C}`2^=$?6$$TI1vOKAqJ^sM=5@@`RAl?g=9{>-<^4s1ny!Zd=->(0bAxQ1DC -!RE@hpsjs@uJa97=Xmuv%7o!{qCW#{PyQ5r^pxNo8`BoPw7P-AeZ~beC6p8t{=a(U)tBEM)`>t_{Ns= -Y4ggBAD8~3;^+S<*^a&28UHxG^*<cX@vGl;Ys0NKTjyurTRXO_0j4i_k^2cbKdIrG?I#4bWaq)YeYDH -N^5U+%Ev5W`@+W4${o>!h`S|t6uYdXF_rLk|`sDha|2d8S?8BRTdZ{|DdaeepMy^(_cB=Ywqg+2#`9} -WbM*dSZa5Zu@aW!+xg|Ak=+W4yR)y~zy)ydVx)lDsjhpUdO%r^vTDnza(t}@?HxXOG(<0|tF%r`LKz< -dMq4V$X*Wqix0s^hDktIRht-^hF;^Nq|mR_e*fd?WMCOd&Ic!edl;j0)>yVdXEZlO=PNb+Ygn6~<f`b -Kx;6JVu4bs4&681S>y-mB*;^7*!sl%41Y{j4F>&<uR%}MwOqzYFzDH9bBDUU0mg7u<<k4czhd=Z{zW8 -Y;ziqZ{zW8Jid+jHs;%Sd>fB%<MC}gzKzGX@%S2#ukrXAkFW9g8jr8>_!^I|@%S3+v#~xK^EKvc%-5K -&F<)c8o%wd=+nH}?zMc7Y=G&QXXTF{JcIMleZ)d)p`F7^pnQv#lgY|hZ-@$wb>+@iJ9<0xU^?9&957y -_w`aJmg9sK+b<~#WL9n5#|^E-KbC-a^B{7&XOnc$pct{2;l#rNGjf}2NhGowvobi%UFn<~!p)xg!r)x ->|Bxmvhdx!SmD+;ZpY;OgY+;-;7&2Xe(bt}<WGd_D8^iL05bg{#chH@<3omHGO?SD7yda)krA5+_&r$ -B{cHapxrNoWz}zxN{PBPU6l<+&PImCsnSpG9>Pt)Va#akhpUa^G(b*GvCa7GxN>NH#6VNd^7XS%r`UN -%*v2i`7`s)tPGj?a)?+sL@b5*a>Q5)^W})Kl*m=)TbOTQzJ-;)@c44XSU6%V95EJ-7z;;?g(Jo?xaGk -uvu!VfTV~r{2Di+%y|8UBlY4Tq=1kU{$vru_CnxvhWX+kZIg|NL<~y11WWJO6PUgFq?_$1-`7Y+WnD1 -h~i}^0*yO{4{zKi+3I==TwT#e+*D$nUE&*>`9=_=3ZD$nU^%-nL}tCg#be{6iUb9Hcaa&>W)OnqhRUD -<k9w%(PkcTJI-V!kid`&0N)U#$1%Ra!Zz9L86U+bhTImE-oxaeL*sy>i@MIc~2Uw^t*tQLS^8tf;FGF -+6p;)v1$eo%-V6b69cePU>FjLF!TJN$OeZf{)jUPQ6Lpq~4`Iq&}s-q`tWxgntnJLHGyZAB2Ap{z3Q$ -;U9#55dJ~<2jL%te-Qpb_y^%1g?|+OQTRvUABBGu{!#cx;U9&66#h~8N8ulZe-!>v_($QNgnttLN%$w ->pM-xB{z>>J;h%(m68=f}C*hxje-i#l_$T3?g?|?QS@>t+pM`%G{#p2E;h%+n7XDfIXW^fPe-{2(_-E -l?gntqKMfextUxa@V{zdo~;a?xN$JI&QOFc+EN<B$k{6p3IOaE8t|0?}orT?q+f0h2P(*ITZze)c$>H -jAE-=zPW^na87Z_@uw_&4F-gntwMP53wA--Le?{!RFs@HgRa!rz3y34as*Cj3qKoABpVL;pPEbNxB>` -FT9ypPc!6E>f>jZ=csq{EvzMG4Vep{>Q}snD`$P|6}5RO#F|D|1t4DCjQ67|Csn66aQo4e@y(3iT^S2 -KPLXi#Q&K19~1v$;(tv1kBR>=@joX1$Hf1b_#YGhW8!~I{EvzMG4Vep{>Q}snD`$P|6}5RO#F|D|1t4 -DCjQ67|Csn66aQo4e@y(3iT|-z|5Ng3b=d#kelfn8>(}3W{QCPZ$5-~<cb~mq{>eZ8%U}HC-~E;5jUY -S0bFvh&C<5hH<eT5{6ng7Ek;t$)Uja!ulH>F^h&ct|2@rEe&V!61PDODy6Xl32iyOq8X7qH3IjiTH5c -4bh=dy8*aXa94jN1XXW84n7CDF<Ow`1H6xE<q0_JDJY+X1&EYazwKdB*L5+cRzt+@5iJ;P#B$1Gi_~9 -=JL2$9drPj2nvPSkWBvkWNREH~@EG+yMXs14M$L3ysAFF{f390r6z<f|znaTts$C3@nZibMDtoqB&wt -@rrmFA_I)*s>odx(N&UP7tvLTyDFip5_eU?5GNkugdR-Xg9$w-se1`SESY-=xFvB9nNCjf_K@l1GUJ9 -dagx=Tfjcwq4BVM<XW-6^I|FxS+!?qt<Icd%8D=g6Hz)hJ0^Egh7vSa`Rfil^R~UBzZcbfwNL_VoVO@ -d77S`ATjV-LPSJxg_9g6|5GQbLel>s9E^@OG@29nBM)$ousen=YHZrpam=rkUN20D%D82X!YYaMcHoi -QE5Esbw!pkqwO(BH;L3<_aClFr2)i%dHw>8Bm0ptC9HAm90x9k(1zXP{38_X(V~n~dZ=VU&kq0^nqT6 -973+(oJ;L<gS|Nswp|DP>9K0g`mJKes&hdk`toc!dNaQzc7}I$8zD>S^VrQbnN11e&Ly4+}{iRy%_fb -?#&(hp4u##(75H6#Ae)bYaTJglD>RzDY=Ork&@>~$s<zo94UE3N}eMnk4VXLq~sAP`A1S`JH&&<6JpM -eMWp08Qu2tDJV#0%k&@>~$s<zo94UE3N}eMnk4VXLq~!5ndXAJlo)Rxvy@-@NM@k-%lIKXtBU17lDS1 -Rno+BlXNXc`g<Pj-(j+8tiCC`zPN2KIAQu2tDJV#0%k&@>~$s>o=a|G`Z`*@ChJhmkGNNVp9`*@Chd< -4tLEF)M(z9oVj&q0nykmEVX@d$EG*N_-i(+_5OGx;AsS-ik<G0U|e=4{{R{tJ<lgF!wp`G5#7L~bOZ5 -e^mtf`!1rLO`(agAFYO;>zL<G0)ME86O%AS}<%;VV4mm+Me9@Y!Gwy{=_YLD@2$`m}YAqVC@52`v7aN -+h5k(t{5f{YaiI!2Uz>S);_@62e$SB);_Sc53u%ut$l#C54^D>YyjjP69H4&up5hU%T3A_p;nQj-iW9 --a?~3U^+t|*Bck5OQEx=l8#(HYh<YPOy%AAw<fu0y>Wv)rMnt`l6*)qYBP()*B1cx_h^RMm)ElASk@Y -(k;4X|CY99;ZF2K!CLoC2u8FvNl%D52>$I3`5Zdv)36}RN5H&)!T@h!0pBsRWf!z~+k6=LMbF>-9^s> -T2jI!E5*6B}@IL>(J&^R|T8fSWgHL<HKA1MP@FJ93~M5okvav?F%eL}T0r+{U;KxH<lgh`%Gp-_d}Ze -M9WP-5GZW?#{S7aLe|i4&0q_!|%k-xI1uj5FZi5$IiGraPxk=I6TCG#S!Af;tX+NafP_C*dXpK9uTvw -!Yt#sWD-wwEPK~D(XqUJE>3hT?<b4!JCXfPgx`tmcOv{wWWN*PcOv_p2)`5A??m{W$bKin??m=H5q>8 -w*^dU?>~|vkPGr9m;ddhYod~}Z+3!U7oydMCZs6XG8}2BwJBpZ-M4pqx4cwb?W2zE)suJP6B2QH!rYe -!ADiKqa#8Z`osY>FhO2Skn@l+*Ys*-rBk}y?CJXJ}UswAGOBurHjPgN48Dv75m2~(BCQ<a3NO5&+X!c --;kR3%}ml6b0;FjYxBRY{ntB%Z1yOjQz3RT8EuiKi+FQ<cP1m4vBE;;Bl)R3-6LC1I+Pc&d^xRY^QmN -m%hqyyBM-wj|yq{l4Ro4PJu5OKkAcc-tQtSR5f{fCB)3&)t;N_S+ka?C94SyF@dG{Q2%^d@{#uIbZXb -3t8lhuqCq{%&>!bP8MH;d6A*c>l*6JrXcStF8rjGw-+#x=oHMQ3VT4T8a{<B1eOP%%JWNXkAEsJ>Q;l -;9E&}~#Imm2O63ien5jICmzP_Hn4{iycUeA-L(m5HjibkgVQ3uqH3WW*mpdDlI~#A{ZwTcY&!rk-w#L -hb4a<g&7Xn-N5C;~64#yC!-{EQO=Nr_%u|sd8L(Clu@7mbAwztjH?CRPA5_T{K`)zEf4TjpD&f?ou=7 -_w(YMLk9=5JS7;9mz1abPiS$?tdUZhbytWAT7^viPz$p12!UEsWp67?vlD*C7mVRgB-NSi&t6-x3;YJ -l`?sps@}bbkKM@VbDS2d4oX*jdjqVgT^{&&_Uy<*AVp@>!3jgjZLpX2W{}Lp@TLUH!QO8VzfaAjdjqV -gT@B0LkBzSV22L&XR`QqRc9US(810+*r9`+b+AJRd*E9_2RkcUhqB4G`3|k>tW_Oa)mf{0y5u|C!4B` -$*$#GSRcAZcVFx=;#d`%ER<;gh>wLCE$B8AK4PM8KoX)e+j%jCa+(<*8G#(w8pU(5kj)`P9?m@ho>Be -nCe>!Vy?+|kg(J?#fY&AQkL7g=g)3m3v#&#If&c?JuV>@f?fW{8i*a3|ltg+*{xCd+OaJRn)YwUo=4p -z+p)f}vvBV0a%RdZmaa<FQSh_+cZ2VM-1R9IXg=3ByZ57yWLjUBA91FAV#H3w94urD4^&B3ZUpqhj2; -D8+*Z14sQ-eC0^FnEKV?f{>`>NB7|gVkps!W;bJY)s&u<f1XReg@mY0j(OMRhR<~j$`L@$xl|c31yqC -Y!k{hS=lC(ZE`-ug!)WYp9%GutUeR!GkN`cB7tDCWy34RXR@B)<f3P?o=m*{o*c?esLy2enNXj}=a0; -WMmQLrSPq)JWHVt4CeL8-R`Z#>+A^UKlb2QIxb}PU3)Tttll5fc1?%Khi-}`UCQtJh%*^6QY2h55#bb -%^`&m3XSmJmVKgA32$*SBorUHvk%38HR+*oW7GZL(sE)H^5L)*Nrx!_<HyNrb;$;E4r3u}*y*B%$v9v -81YE?9`gi;N3#%i?H#;cfn6!?Cd9w^&c`qUl*|PZsRSV)a>AtXphPut@YQUJF~WCyVt26WtR5ITm+_i -6zeVdN!{^K-ZqlZzMMy%;xxeBfn~g%HjsGG;(ooj=wiDrZ&Gd+<0raBOhyo^Po1z-y2y?o4wSAmy(mj -aFE!uGimJ31~K0fan&x2y8t)O{x@vZ<}8~HTebPw**IlxbArsq)3Etz*mxRtlcTWEC%izv5m#;FK0#c -yS?xE}es}JZ4mzE02}RyRjx4+X+{5pBKP7C+K}he(mV987!+}js(?p@3&P&3azuw2mTjNiOi>w!?ULl -uu655eeHII}SFKJJ{;`fsG^qvAKDM9{D!%iuglpT0F=ks`E(fA?l474+(oq={FcgJ7f;sSgAQ}>Wd;v -|m#3rSKWaRgtGoIOm$U1%bI%e0iE@Z$AeF7u;y>h~zW%%1+#@q3<VI6Sc~FG-Apo|H#2<8B1xieo$l2 -~u(doWnEjieyU`=tB|wC8Pbq{ao%1PATo6-%1xbjwmd06k)kjkyA>3;0;Vp$$I#n2`I@=aPX%TIr^bW -{^5JpA5X>{-ix{_2~b$rbIo!8yypW-5-`>>PAT#mY`P{Xn0O0%N*=EUoJ|t<@E+7PUb%315qe6NV{y} -&Bw1s1(^-;SMCgM_CZ^rD&(5l}5Bp$E<Tq3~CHMb(hM{BxV>WY2Zl~XO`>u<=b@Wf?VA3I6af3a%!xH -={P2|@O3^{Uhyk#p&rs24$hHh-hDa3uJ=)?3ls#May&lCl6`TY$GoXkF6jzGO~(dT&=huv&HmbEB2_k -F&W_#;H&r<BCS`;P0BlDT*t;VC6`@xJ9crQ|N&*IcKR<i#7+ol>$FuR}ehq%Youv6nncmOJ2={R_(hz -iePw4*11iEC>9ug<(117dx{Y@XPbH9PrC7hUI`?wlORZ{IZW>dEl3g49f$*>||IT_+=}@^1v^98I}ir -(c9&LUv@Jr=<^bNUIF-nCcXlH5c~o7WuwCiz%S453cw!(Kc1r{&(R9N9|V5@{wVk(@JGQPfj<iV2>fz -%@QT161%Cv7u|F#Uzu3bCyR;+@ToL$XkHkvAFPkJ*0)FxPD*?Z3lUND(WuL^t5yvvYK6T)ioe~T2)sp -yg;fUiUao5VgFPkM+27cKsu`=+>c8QgNU-nC^4E(ZTV!^I1*)g#)@Qc4*i0hW@nOFt*Wz)nez%Tx572 -ua`6RQBf*!cxJzlz{5z+VJ^0e<mo3x0e_T#A*FQwshH{IaQHRp6Ih6<9+#rQol?FY&{wz+VM_1%8>2t -P1=RpRWe|P4GA1Z-T!8zr-!8!9U9UZZ+Ij&ius!&MD=-hWpCy4Xo@qS=n(|+Htb9bL!|f6P$*AllTye -KBpA?2K-&{ci``WzXQL-^Q!~D%==ac{x0}C@OQ!AfnRostPcEL@Z-q$B}cxm0sKSo58#*WCTjq{%s1B -n{vr4W@JqbC2JjETKY)J-{sH_`@K4~Mf`0<P%$wE({weq|pIS1XS`+wXUa%(c%Te$PN5L<df2|4py5D -61zixP0z^^-A7Vztqmj(Q~=VbxEZhBe3ue)9r@awjh1^jZv{o2641^)(qnP038{4!5m8~C^2-@q?BXx -0XP*+R3hUbJKn&D!`hfW*~!oASd?9=snpF2Be8R8~6O#{B39pF;StPaa^NxW&&RIq#IRzX<CFvi9h(_ -~>Nu@zn8&fl@?{PcxJza)Z2!d_d0g+4mhxV)x!ZsUVx$-an}z>xA!Ho@Ac*=~D~RKUl}uOMbu552F8{ -KDEGS{kuC)Jf(bs;lA29C4T~7V7JWR`Mw`F?mDIJJ4uiikypr@$PMx?@&P&TR2c>LEpp!*FP&2GUwt? -wZ?YK`?Nn)}q8*M~JYLD3GK;)GUPay@H<5S970-lxiF{u<$1SH0{7vvT;BSJz0e=(x4fvbjZ@@1f%^3 -J-#%O}S0e=(x4fsv)8}OUpH{dtHZ@_PY-+<o)zX87qegl3J{096c_zn1F+tuj6-vxgM{x0}C@OQ!Afx -ip>4*Xs4ci``WzXN|4{2lm*;2*%R`^E<F55Yfxe+d2o{6p{$;2(m20RIsD1NevFAHY8a{{(*7;5H`kP -r*Nde+vEy{8R8x;Fpi6j0yZx@K4~Mf`0=468sDJm*8K(zr>C$*hAU5H}2LwKen{9(T;rF=Iv0EDf=_$ -UH>^{75Rjmd10%ApILr?=ZRi&4?H$WpHk%&a`rFS?r=)^eaG*+{2m({B`@LB@%tga$0kcjLGZ{yIHmm -lZHJ_6M#j39mvybrJ{H8g^PZc)6n=25%*~=ZC4WEb$G;`hAeRrlynSP)$yUxE{V)vfD<68n3(Fv<k_5 -aM2(EKGKlUM+-}9qJc<u05<kTlaBDcxL3*<XImLJJGMS^MO^+`h}`zgK11LRTU3GyuR0(ljAgWN>kAy -+&T@+I<p<-A^Z>cB7Qw>bfS68s7Hli*Llp9Fsb{v`Ml@F&5afIkWT1pHa>XW-9*KLdXj{2BPO;LpIH1 -%C$qEci3<XThI=zX;Adzc{7vD&SS+_Z7UV@T%Y?na;U_R~23rysGf3;8lfJ1+OZ+DtJjMb*{kQ1b+j5 -$+6B2_?zHwz~2Oa1O6uX8}7U0_ekx|l6hb5`xGnuzT?yb<Wb}a@+|VVcB;r5<R<bC`4IVpe2M(>Dnal -E;0%H@0H-AKmjIkWa0cL%4F3{<GYHNAoI!8~;Ed9ru!lwLVSzm?Vh;=KVG(;+U=NGf!vcF)#2yyd!y@ -(&J9bVf_+bx=*uw&QSi~L{*h9%%ICbC`dstu(i`c^gdsxIC7TCig_OQSn7O{r~_OOUOEU<?~>|udDEM -gA}>|qgmSYQu}*uw&QSi~L{*ux_Bu)rRcEci3<i=8Y5_<3FB)D7}3@&Wl2IocPyT3}a;*wq5NTEwmv* -wrF-wZN{HDmW|fNW4*QuJtK5%V8&r*vSGrS;S5j!|zRgZ}`3G?}6V0zX89=_!`F7WPI;FIjds#kilw| --zypNTdZ=vrXgANl-xd2(XDQ2|1OZ7lJyGtFxJF=zU|>@@|+@%#Tw^*o%+=i$yY%p>tn_rhcp9U-Nl5 -!@s!dIHsM&2cA(G3>qv%NLNnfWVRk1lr<D7m-(;81se8!zzS#bAN|iUrSwFkO@16YqZTFK`d4*is!Tz -Vtd1a?QAZK3K*m_FY8Fj~Hik=_sydUQ@&c`@)2f3tj-h7NxCXw$e_tK6>J6_uHXva%CH%>Sur|fozkB -B<{i0DE#>*D_0cyGJ)z3uIW*TEcmVcrY+@!RKhXih1oG(LB(_);#tu<wPa7ZPrs^g_i2O+UR0)b0moa -$Qg_$CPpkuEWIklydai`w6CjyYL7CE=2u{*As?bN=c#(xOvbl+JKt}d2M$Dw-bZBKYJp2H)>Nzq}3BS --1ByBYt=(n>r-)|=>@wNg8s#8wD(f#Utnmf9Km@6cWA5RUA!Od+MHhSxFDG?PeUg*dF6Tp>t2v|r4Mp -Ubsy}DAmKvM3zvsE{R@Y`kUXg)X!k<UzX%l<x?Z?lVo~8{z?FA5@8{ii9gmLhOn2>Fyw!QSyncF+CZ~ -JIaB#v)-nJZc>YmrFJ?`a<Ub#^57rdn6kQ;u=rT5slATI~s&*F8G#p_=3m0vGNUpb^XJ2&(%aC0XwfL -+F4WKkb?-`KpAa_lX-#D~lV00%+2^SJYcj7Ke-JRffdkLE3>%VxY@&0CKA%=>l1>t4<cpbMXUfmqHFy -#M}RpUHmvO!Hs<{GWdD*Z=y9zt^LspQ}Ho{M~=>bNK_D!SisJ2OK69I2S14U9EgS8#~J$Ss6i>KACmt -Wufr3?dL6!d;LK3{{c`-0|XQR000O8Q5kVew`26O<^li!)dm0n9RL6TaA|NaUv_0~WN&gWX=H9;FKKR -ca$#;~WpgfYd3{t(kJ>O0z2{eqSgA@xh{*P~g6*YhkCj$?Lns(B5KD=j+D_S(`r|ue8$!@_bAb5cJ-_ -#6oY`!a{FHxCfq+(82l@z7IXt1UIdq~%7<!&e8{Ok^XxsOUw%Sg#EvTW}qv6$7s}q<(*@OlMtt=h}N3 -=Iw2i^69LjoJ@4O&!AIH?uGU4wAcrc2V)I$>Oy1FE{ratPx`KYq-hD2l9r*M{{fd#1w~`g=g@sb*(k; -SC~vB9&j(MxLY+tvC2>20Sf0gkNc^Pw9i#on=Kbqbw5H_1ZYtOS0gSq(+~I5$c4tIvU+o%#!j?l|3au -58+-emOh9PNE0Q7q*5J_R{~oAN5|FDTdbB>&s7Ma;uP3+4t6*+WJtJ)E6*~XWf1U999;WOyR=1$W5fk -w39B_tuROiv;K6FjLl%iAd-3uDl{)AeYqnseI<;d#qe@t<;Ois&WiFDawBx;Q=v%bKC7nQPDOaq0e6W -tAn4@10snF79>&LC2rL&RLGiz9sevY+DE}-9>wy4q@+AJ2tCqf07mt^vO&$uOSyII`GEv(nmnR&Tglv -5Bt)Z|X80j~>(!5C_Q$}58@$!KL>J~87J6-*bR?<v5v3V8>Pbi%k<Zu99Gn?<>WIh0v;Wt&7ML+l3KU -{okc8jj0CUr$f-<@7BVBZ|P=I%lEK5nkgB+}xoIJU=rc=hrXP=H-QA;U(W+EzVO&mC{U=$5_Vu^&K6W -PAcSr?Rd`)j`Rt#%%DLlynIGt7g3As!t1W!4rCr5K}E?-jfWGLA;n&E2Zq~UguklAql?MqktA$>fHP7 -f3~dd2Qr2}?OW}~No@h|iEJ*|a+{SysO4mRPmu*yhEjiuTmn`KOmSgL&4vI#e8ooex@q2k2!cbRax3_ ->%%p6V#@M$~8lD(SP%@6c#`LDA*Hd582uaMr=R@5D?-K2`6gX$CYA820(?VoFo;~%26nEV4!O9KQH00 -00808trnOdIEYq89)F02KfL03ZMW0B~t=FJE?LZe(wAFKJ|MVJ~oDV{2h&WnW}rbYU)Vd5e!POD!tS% -+HIDSFlx3H_|gx=i&kYP)h>@6aWAK2mnzTaZJgDg@ta4003~(0stKV003}la4%nWWo~3|axZCQZecHV -baON|WMOn+E^v8#y;+kT*LCOnu1^8W-EFEZ+m*wa<W{@$oXm{yL*JL{zTpVlR}FC%N0HRnw{HM7Vk7_ -pAjTpIVxCbb%vA+Oh!en&2m&BQf_y=tSQ8~j=p%HZAlCl<*E$CZNQ&CO%siQE?X~vWYfpc<;-8*+`sE -c*JpJtBE2{rr`LkDEcy8q@Pd~cy*=K*X;>pLKfBdDDuRQ+PiXZ=K#Vaqo@a)Tf_w-}Wul$?GR=%?GJA -b+2=TATPgB347{>swbk3awD3y(eh{F6WY*(*={O>@N$zVn^$e)qfonEzkdivPay#TP5E;-6OjxcZSNU -V7oV760R({_nK@x77vT`ObHK^rN3Y{?f}&zwrEzezf9;E52L*+vIQizWbfW9)DuRk6wQK$shGS^1UB? -XGQg&mmYuRXD>a!;$N2jc%<)_ecxa4SIJ*}@B82W9htvl^LJwYPR-vn^LO3+-7tSQ&EGBacV_->o4-5 -e@7(-dn7>Q=y-omD0+AI#WMvRpAw*URkrhK^<q%mxL{<`!6-8ua5m{kGRvM8NM`Yy@TY1E;Mp${oRvx -jHM{MO0TY1D*9<h~2Y~>MKdBj#8v6V-BUmpJt3kq9c<&pH6E0V|-#I_)@1*t8l*@C()XxM_LEoj*SE0 -4s=BeC*GZ2d@V{Yb1lQd>XL`||kjfA#$pKl`hdERL6pf6U@!x%g2Qr_05UvADKe{5Xs2%f(NyxUpRPB -#WEN#ZR%gwOsr(i?ik8pRl;ST>K1+JIlq-vN&HZevZY(a`E#lE|-g6peOBHE`E{4LEb-Qagg^*EDrL1 -nZ-fgudq1C`)4c;^8PuCgS>yi;vnx|vN*{5S1b<l{xyqj-L2WWTeEeyX6tUv*4?_TyLD^Jb!*FYvE_g -JPH0i1UM*_fT6^7Ed)-=l-CBFyT6^7Edp)xSZClW>1=jo3t@o>!rl4WHU&BhQVI|hE-mhWh(XjGpSa~ -$8JQ`LW4J(g^l}E$YpoXnM4O@d6wgxq94Qk$($3L?mvIVg%NNhoB3u?BYZVMW=plJ(Qwji?wZClW>1- -UIKY(Z%XT2>w{E030yN6X5iW#!Sb@@QFkw5&W@Rvs-YkCv53%gUo=<<YY8Xjyr*tUR&@9_GF`Tft&$H -JP=V%vw!mttPWplUb|Dtkq=A@HW3)Ltw2Z3tpIwcxHV{W_?O_Uq=7P0_#(<5-%|b(6+v%ZKc!>ZCcFY -(56YxAjJ=@CJ3$C$CE6#0&H6Wwkg2F1femDSRBO2mb`7n*bZSsbZ_-wN|Xzd?+)QZV(+q!yAy(kci&= -ph#ubE$MPWRci(1tkoCL!Ssnt2cMq^U$ok!bEDs^XyN6gFVu*K_1<YnP?$yk8LYVRH5k4`f=G~(#54w -5x7|TOs_wI3)2OYh8g5^O$@1A6N(9XN3SRSIgcTb}{hlb9u92y#9IW%;Z<<QVL%b}rjEQf~9vm6?_z; -bI8IRt-+<q-U3mP7DYSPsEYupEM?x#kf36w4v_t1Q1S`20cW%h<QDey6a0r?B3+u->__-np>exv<Wqu -yQPHOjB5|T-cbVu#Tj#{<yF)USa)lVO>RO<xyIBlvW<4l}BmiQCfMFRvx95M``6zT6vUK9;KB>Y2{H` -d6ZTjrIkn27cBF=)dH+wqP}31?+pmB5{mkQJ-#<2z=|sB3#RzqhyW|Is4p1fdus();YEGH4&PfZz)CU -d3nuv9MgdlwQD3mW_cjS|a*ZI@EdrceBgl2D04LW7a@{V#$u)vpcL;EDjUd-u0-RhU$aRkZC)Wsa9Tn -i@8bPja3UG3bA=iBZoLpnbb-w^7*BEj=D8R`zhFlK|aB__y*P{ZQTw}=fxB!tWgN3A5un@(N{7HG3lY -9)xpBCUGp9IN2{adkAmnDpnAo{0&A^?IuFTe>pfuJu6aDq-kYy9370oI8|Noa`Qn-pNZX_SOE_`RzFt -Xqwe5cfR$8+ln|4Bzh;VB47p>B9F11=t2BLay-rVF9+~iI6CKe~kd!1VzXael+>KkWf9}7k8REvqzTj -eQ~F$t9(cizAx@Hb(IhK!S}_T)?D2~a`1g|r!{Bx$PB(O?zHA=BhrHJi#x5k+K8Os`{GV(&g_v8d|%v -Y&B?U}xr#fjIl0y#S8=B`C)YaUD(=)}3!^&ZD(<xI<XVSZ#htqBU{r@(#htn|VN{1)#hto*VN{1)#ht -puVN{1)#aX%xVpNA*#aX&kV$^_K#{@XJHXzq=0Zy(B$W^?j%Q8j{$W<JYOE*Rh^l{!15d6XW;#OV$F= -_<2`o6f;hI6Zp;8x!kx7u)SwGrGZJ2g?$M)6TIxY_Gs^vxjM4<u-9I_WlpbU%=wwdthW4AQ;6O+fIrA -BeYYI&a$y(!Kt=fKYj_i>qk{A%CzzfD>{vRMii~TQq}6uZwePg&KQZTv02C_Jh|1xE8DxTCnTOi5SK# -Y0sFY6@-6Xyi3aozXjooA7};PUq2!s)bJ1Vqn+ny1$S^=Y`hh!?e(()T(xaM#$u*fknsoNZC%bZ%201 -b9xizrWvI8}ZCw^M%7W-VS|tGWRz#P%dYd6i5R1y3SIB}eKM>!VIp3Ov3j2{5P8Nju0aHhjOQ}ZfP*X -ozCm;y(BMD!SUH#yk02gv0vHHOU0WRcf2Vs6B7Sl#Oyez=gLu5@qm=fSbhxFuQ>QRw!d{)A6<OiQu5N -i2{uL^Lr9J#&^HxuMeF-Y@$C<4iy3qgkOL-DM+(+HA#ABqFboksE?h!1xPaMc@`y$^Q_aMc@0y$|;aa -Q+y1yALHK%U$SD1Sj#KI0=`!i;7UMKNKh7a(Gb@D#?f9BwR8tDuR>vP(m`7)r*Qyp+6K??9zKt5vtsW -5|X(*UsQy;|Dm`Im+*@U$W`36%lt)UsDzLGS^z{N?%L(`qB4l)1L-i7@ShSxm5`8_yi52+B_uQ<z)7f -tgv2|z6kt?BLi%P_LNRiI*H#O#H7`ak@Y;X?Tk~S%0<R4Tu;Pu83%oWWz}CDNxxi~{1z5Sp$OT?oFTl -z*MlSH$a_5x+Os!V{6T56-jBMexO#+<ckuAKoMSzn$vW3^S3UHD~w(#0^0Z#JB7GB#Sz)2q2!fU$(IL -RYhcx{gWCwXKGuZ;?Daz(cA+M5ELT#+sO;0*yzuE-W%+b_V$71_dT2L(8}B3pRvumC4lWDBny72xEGY -~i)z0-Rit3%qtxfRih7f!9t8aB@X1@Y<LFCs(8buZ;_Ea!tZ#-5V3ZB5QYTQh;q~V`S|<*e#&I(+>%8 ---oQ-^?m_1V2P2n`(TxTP)j}%4~692M;ip7V<YY_b(ID4{I2W6U1dS;?z*@?m%EFRySu(ofU7LX-CY; -w=5lv&J5-jZq#QyPeIQ)_iIfLXza-`8J6;wLBz=8C0Qy1F(zUx!^NSI=|4Pc8xN}aU7#7k35&h;F$T} -fykRw7mAkqZqIf!UHcQb$yY)ZE~E`oBNmGYpQm!&-D=9f|qE08wG#hpnS-sQKe1cY~yxh{#b#st>*+p -Pk^d;E5dc?zb?To&LaDlb)T&HzekZpt)Lf4>_O;3iWe_4m7R0d7_`Qhy)GOS;rwg4EydE(#Dg!my^^E -38QxcCuO0KxI{VHLOEP{yfR>{<VKE<#sMv((E;%DQVU~jOvhw`}l-_V8=2ZlQe@Ne|%Cv==XhmN<i?R -AD<RrC)Fj*;6HC{5MXE5B}mZS*eD=$t8cIep0r#|LuT${scEfHuRcC2AehI;QsIz(`}mvy7{_@55d8% -KLG&Ms=#ho{_>usKUMf@zqQ4>_!~-8s2nZUG>2C?rcOOp)2#Wals(_$~kJ)ibkj1+peku$4xFOXvv-3 -ieEGXi}fPkQg8-oIZB5n)`2#UBdEFdW2#)yERh#PAJ1V!9fD<CN1#ySB(5jWNguz^{!H0v(!^2r_N?2 -uZz!QM!Md1P9#kzvxhg_&e3HYA$V05O+LKMDCJ6*Oj(X@zjp$r8*byRl1vTj7GKWH<H*aBdc}$Zm`Zu -yI?0MAVHp1=zSPL2Phip8(g8Au71BUx3ps0)iU{1-OO`iKrWg1vt4P5q0CJ04G-@qHY`);N*%#)D3AY -Tp}t#BI<^;5-t&yl&Hkw)yiJ}ql9?Hbllvu1j#HlgtC_-cazl;B(rYlGu*nYveoO&AZ78;E}4~-!8QL -*FAXyNojCI{_=n%onWxBL-P|l7i1y|d0YS7kUlS1g!_DPLk}*@GSIm?m<8^bJJTvIv=5_(0rr&&BKv2 -ca9RfmyzqwOD(8$eQ0)j?v?iLVy_{}{6LiNA7S3uC%%~1hCV>jOr5Hxm^ZYM?N>ytAAg2p}>6A(1^$y -otGW1ox*2>STsoPeN@PtFSn`uOC6fS`|0E(!?x_~ep+ppQ>33kdr7<cffxk54891buumDIn<M6R`)R% -09U&An4;01~(}(W;a&}fCa4<01N6D01Fxr0Q(pe0Q(pc0Q(pg0Q(pb0Q*=Y0QRv~0PJI(0NBTR0kDq^ -0$?8-1;9RD6#)BSIwf^Wa#Kv%xw%h(ZI)9^*}1u2fNeKYOxd}4P=IZgQ%u>pd02pLmQzgGxp`E8ZI)9 -^*|~XKfNd~ROxd}4Qh;riQ%u>pd0K#NmQ(cGZ;Hcl{q_|7_M75qT)#a<zx}4T7}sx4(Qm&gzQs-1Nik -*TrZ^S1R4{EouHsExZ#`{5uHr@-POc5eRs2W8$+a2edP^Kf)5#TG?OS4LP4}+oYTptQYr1zuSNoROR@ -1#JCc)g2Frnq%6@BbmTLri}fX?+TY4+XRmK43}ThiXQTpd7n`j#~GZc<B%e)KJA;ag6w=s@3+roH9li -k|bW<u;uWQnP1-)N+zXr}~z7H8(XT#nhNv;?>;Lm=wL~TjJH+)R+|A=v(5|+)Bd~{pVZa)!b6U6dmVV -;?>-0!xWQcZi!cOlVws&mboQfEpu{3^8J>0HMamUMcVzAc(t~ZD>Cl4#H+QPT#;(OC0@-fKunQjza?J -HW!Y0KKD;Gf%`HDnF_Y$&cr`bZCdHz|TjJH+lEbuP7XznQZFpPappMN_r&wrsTLPeto#c{Yjp1#Hd^) -z<mSVQgZ3%fgw%e9s-QaDBbvkyEONu3fw<XBw*bGmK$wRj#x^a_-QY3P2i=)k5wL}Kzwm90{RZFC9Zi -}PMUA08c=C(Lmm$ONcv$-vf*5zzc<ZNz>qjfo(6givQ;%HsYCPmKXwsf9c&L&09=C-&|m$ONcv$-v9) -a7ha<ZNz>8+AFG6givQ;znK0CPmKXwzyH3vq_P&xh-zg<!n;qY;KDibvc_9Ih)(!MqSP(Mb757xKX!$ -Fh#QFwzyH3tVxlqxh-zg%{)pm^XRs?QMa@(#gwDl;zr$+qZC=1+u}xDmL|oNqub&}-ISvgd7InfM%|R -78WJ|2t`=bBT0^Gh(*XfJw=HS)3P5T|(R?~253`c5Avg2shyW}38j>=ft`%S<Uqd$L)Aa(Z<ZDR7e7a -G9m3$5PmrpkdaFR#j<<l(!oaB*l`E;uQTcc}8wS2l=fRih7ET8TW;N*(r%BQ;oIJqLL^64G{POeC&d^ -#$?$rX8&Pu~>a<cb8!r~3prxgvA&>3#uDu1J}DdQgCqD{>{D9v0x_8r#9$S`vbo&*befjpwts1%z1UG -x-QC_519AfDqDrCf|Y;f1e!^5F(q;<dc$6F+MvYAOtv{9TgDj$7ja`ggEE3;{rl8`Rs&%5bk_-Qb4FJ -pPdpAvOJ%$!Kq>D!)Ip%Kp$fQppUZxppS6@(8oCe(8qZJ(8mP<(8omq(8nbK(8px~(8m=4(8q)T=wng -<^f4s>`nW0p`d~v<!*avluM!aS@q1~nu<G#l{Q`nMelN`y79ak8P(aYf@1<?R8pPiZ3$R-R)!b6UTHS -V7YA#<`!>ozV4(eyPO_*v;_Y-bHM9pPbYHkyynoF(JI_|gJl7d>{e#>p`P%G`;O7%Xs8ChgELaIk@qp -(I$$QOt2oD&pOa%YV}L6~2S7!=Ip&N_qK-e<YY9g$txdTw-DcQd^jeRe;mM&$N8ORZ2FZsK2~ZRavHI -_^28+kUIhUek=-ep@cp-AwE>p=Ro?skxoKYWCZkHTRs%JtuRUo4I|fnwj4;%y!tDrQbHp{#FYsgzp~M -e)qtnz!u=^7G{7uENlbrwXg%Y&%zw=Z3_#);}({Hrwy#TFL%?)TCT#k+`e-ymnm+!edStik!H(Hx@tL -h)bd-nx%6!-^V_T0EJ>^Fp3}Cqr`2|w!MUYlt+wB}&8Ase9k*p%$3}Loj(g{hjelDmS5sZ?qm?^-A#Z -W_(7wBeMB&)B=<cDnEp$7|<)}P|PMgc!)<vztDcx;6)GDnz$Xrh{>$A_vT(2+dvo0)iU8pRwO3z$}D2 -uHkve;IhEOF0q+w5itv+o``d-uqsK=(mzJB<v%_1z<v>;r57k-05+v&2@-%uT+}5^Hjq+bbhWtr=u)d -V7{SskzDOS!%0O=JtZfYPPY;=v|MzZp1+EdSr)%@UBPpTIfVkbE2RhJ#ySWK#WmZ`JS7vW^QlQtYLSL -%$)DcobSw>@66n8n3?mPncM9$bG|ckzB6;aGjqN(bG|ccyLWaY4Vm+une&}l$H~X}&aC5}<9uh<aq@8 -?YL>h2axN`%E-iB|Ei0{@+s>u6ol9#wm)7pHHL~qoTHCp_wsUE1=hE8FrL~<)Yde?Lc3!LPyjI&eowj -p2?bNo1ZRb$h&Y`rOLuosQ(yqBpGi$azY%{JpvG48)*>sa})rq$)^uOoyQFk(OHs5wJRlDhA?QFj7Y` -*QfZ|$aa-fb5zwcRcdZMTDM+l@%K-G;R7meZ@-lD6%(T4-lBR&2XL;CANfhuhSkow@gMd%L!se`&YfH -67cywcR*f+r?&WH|o}Q{-y2wOWXOEwu|4|E`Dn}|I&87wT|;I9p_&<&cAe=f9dpD`E;Cr=|r~vbew<b -IRDadzN4eQLmJTD+p0SE(n)NGx8vMP$E^$MIQP;?-77oy(s8>?bzCB+Q?pgIQ*-a^x>+6PHagC2bQ;! -lI&S0fj_ZnboNMVg*V1vWrQ^C{9p_p)&b4%$Yw5UfqT|Aejtdn!E>!3^Q|`D>q2sz)9cRiNXUZLC${l -CQ9XA@?$(`O^0;iMP?pnu%6CD>$bey?&N~cpdhS@2t8_WBwE^_A*a_16q=Mr+~5_0Dfa_18A#JZ^5*= -g?VG<SBIJ3Gyto#v^PbMCfy%Uu|dI~&ZM4d%`Ua~H1XE*+9P8_b;z=FSFlXM?%hM?P=4Z+FSP+|B*T+ -qQ?DyNNV;+t&HqB?<G6dmm>zdB^F!V?(4ocY1gGzvRxoa<}nIUN||st$=fvQ7&9lS+J*mdE?znX9c>w -lwH*>+;a57<v0u1t1H~m3q{lYmOFf*X!cwZ8ui>?v~cGy6iv5zvkN8*H!-ttoy?-;UfCUXP`F^Sa6w? -<CJh#uwUEM10W30WjfI>0S7h#eTnkiWPF-#aUxBskcPBR9y&|>5?LJkw2CHxr-3n)Pg)_RsHEM-x)Cy -;qg_}TDxJIpT@oAB}cV_PJ%JI8bb_vWC?i1*C_IBo4x;%S{nG<&>*9&o5Wn<j*?o|KXs}}{jEx%J+4@ -$T5LWu#%yHgwNBi-KI7(%=|wZ&ZSHZLu4BGKKc*X`wQe{uFxr}o&(ojB^qlTEF<d-c3Pw>Np+HuR;NH -D5L;;jz0@X9YS5W7KWw@^b=_&AfW{?$uQS8v?7F4ae}y)o}}30{zYI+p+hgzudLeCDvfyz51F_gmZwU -bAY9DfF%|;-@UrmKGIb*OrXAdb)UK1^`Fa(;yh$8cNGounD1UaZZCHgtxb7vHWjVyH^Fxm&2_@dj=RQ -9KrM6IK1F@be?)z*Wr_MQ%l6*6!-}k`s-hfMpHyUBXw>I-&g;XpyXk?wiu^w6ZlE*jvXO7>qTncYVQ> -_?{%RDv%`U1U+gMaZQY9p&=)M1ET=Oqg^DpIcW>M@S?<jTwN>${a<-(6Bc6%&DvCB?Ju}e=!4>puBSG -lbP<F->z?3(DR$p507LS7a5Uv$lM6uZDTiv5;{iR*$@MeY}q$o*mx`DfLfVI_Wt>ZD;!G)nxYzKJ`>D -oWhIeU!MMJW9PO*IhTND)M_=yPRWG_rF*#oxB?U7aOkg8#P?-H)=%g?HjRwmK&gp8g42?)Tr4YH)?q6 -Xt=hzD)R5u@Zac;zpIM;FM2&TTuP=Ya(i?(-1u<Ra2bxO$kmC4oB2}}xvTsXl&Z+p=%zn)q`5Q{{Eu4 -XUbX3F(^N(NCA?~zE`1+0yX<f664X)CZ-Cn@-3R&ECs8YM6`<wcs}<W`Ow@8SbgCkMm9Lns)K#XIKh& -UAcT#P+Ga0KQXD}@<ua@hBMJ+F{mK*AeTD}c#`B<Ul`Xf>1W|CD!{wm)>XWm3J?;bO^urkWrv4>IS8? -a2Bs5Hktce9K#@Ab0Gsi*BLS37lLX#23C?LV;XmDnzw-)Or-kD^ZE45*X19aA49<n=0lB85+QM;+fnc -YL7N@zthNI-i|;dF5C{zES~>06U~4OeFZR0#`?J?9}*}g3xPuTmd!}9#s;0E>9{5Q(2!<5c+UWD+v9! -pC}07^)m`Wr|nq<p#$-p0&H@vz}1c%le}M05VRoMf>tDG;Y9^uR?|xYFw6TD1wj`-QxJ6V3k6A!T7y~ -M*L7EJO!L0JMM+S`^tpaTjUH7EGrhH5VWzj%EAB(NOG%hnqel<q+>lat*hX$e>!Qo6L^-B;Yn{S0Z>> -6*=B?-5<VezJMZr98JrW|vMDOWyuPdqn?NC(jQN57&(OQIArCN(H=V|(!nlxrS>2U`+raS#y0eYn84l -2SXYiE^Um$h*v*k(<(;Lowqh3vOg5p0w+q67y|Dd@g;Xq02)3zb^E)<Xc;|H6D_z0vC{u@Q!B?NpIg& -#%mSex-L{$Z5$IFp(coigIk9cU|}6$MXM272x=b?MiSY<ryV72ScqFtNou)fIVS#pL`^(uJ2O<%hURZ -<^OshNRHj~^bC<4`v6=&rX*;0`uv2VApMWjz_6v>_2vAJ1Yte*-mGp8HDLO}kUlr4@FOEA_{=dS(4lG -y8w%**COMAZxUN+iI}2P_!{x@l=aoQ-my`r0exywh_8QRhMsgm>aa;-Z_g$+5XLGDm5_C9yPOB?&lzM -(hj(rGZFXxH`1^rq<(9cKOLgP5(kF<rx#sqqzNZy9~REheyH7|Tb>f`AGYjUSAtybiZpun=+=}QBO{3 -#SzcRPJ)NRdB?0!weFFO4YjXHj7F?ewL!iu`dDSb#fyX}uzUA_Yd0rY~(&<PW95GTiA)n-ux;J|fC{i -y|-Yi1Oa5$jdvTytgaz@{TC)9g4iXBg%W1A}{ZV^4_D!%R8dHM-_Q_N0j%QioCpI%3DuZ@rQ^OG3Bj? -toU<8i<t7(b5{IOqD4%3>rpHIG|?iay!Esdf1qd)Q{H;uiaRBsDx$pg%oTrVXc1H1dhCktf))woJ*LR -ZJE6SC6?u6ll=pc>Ufv1ieNmB@cS3nzR^;WKP~H=Yyu1_2drFa)cS3o;qsYq}-OTCB>c3MjZ*(!IFRT -AfyPP5fd0$rloqBn*V|iKqx0|9}6+zyY)qlIO^{NQ+zP#+eC9>+dLuYljR|)!>)0fr7`$SQJHO14H)y -4bMON$y+qAuPaU|Q6u5_R$Z4AX+$%ggHG{V}FRjVe(W?@ux<YE+53cz>8_QKL%K#ryM23-%)~tBdyoM -n#SCRu}J2H7)9tx4L*g9$M5XZ*}qhY}2And8>=}$D0;)%3EE$KjE~fQ{L+0{UN7Co$^)}?|X<vo$^)} -?~ghy>Xf&-cz@by(V)E5#rp$Kiw5PbF5aJcS~Mtcb@Be#)1pCntBdz1pB4?uTV1^GHWv-bTV1@{OtC7 -Wyw%0K{S>Pr%3EE$&-@qIQ*ru=x_CdRS>O!R=_~5u{VAvgjzOKiqAuPagj(PPhUqKn;+tOHIDKLIin@ -5Woj_DzJILuP8lt-mA*&+D`-=K+H}x<ouqov974_e4rCU_AC~x)OZu^3&i1Jqd?N-P|MT_!Q|LxB{Ew -Gj2%8#xpYJb0%({qb!s-hr(mtR)mzdz&m>!bbArA5Z?SAXhHFD){Dzxq>ufN7DjzNtTTlQp9vV|`P9> -h@}k3Z`4Gs6TbvHAY3o`lkNWA8%S@tZ(X1-KLFE(WboBpSpb;t0Kx<{i#mhmguPG?wnE4rb^W1y0sKl -5mllt*X{9G6;UPXa{Vc&MVl&7m+L0LRz*~ax?F#3YSE@j)aAPU9-{|yY5#ongu2|0S4jsdnNXMOj=QL -eAnyrvxg9U>4&*(dF4rw)jULS1{q|~gxg9TW91J@>p)S`gf~|@m?+JCe9WU<=<UOG-*UjpWik$LRm+S -V3tcoaab-8Yv$f}6)R+sD6=2S(Lw}#Aa!Ch5Ed27h*_KS>)obuL?*=-paasKr5goey+*T|^IDQ^v#yP -P^(P~Pg|yBs`QP~Pg|yPQ2+P~Pg|yBt4TP~Pg|yPQB<P~Pg|yBtDWP~Pg|yPQK?P~Pg|yB$SKd8>=}r -_mNA<*hE>t;ed0C~tM~Zd=K!i1Jqd?a#C=O3GXPx7%E@Dx$pAfBPeCi<0tI|Lsq;EjZbALjAX&>{^tR -xB73l(PUIIJ3P5c5ynR+S1ZE%PxdQ9xHUPT2;VU|s3->-QiSiB99C2UiOVnjytC3z)GV2+o!qR5U%y2 -Wzy38v{Q9km`1RWq@$2;f<;cx0D*dFik~z@Hw-oU^_9^0byse1ev0o9t<A5T5$Ff6{@T%wDqt)G1^dW -sP6)nE6^po#OW+*4mD55mR6j2&y6;T@FiYSe9iYN^|L7SP&$qS13sp57@KZCGLeVt~$a7ry2lTfCo)S -{U;oKlO%Je27vwP+>>r_`b`6J>fzE!t0^Fa2D&(k&*fiunF&lWzHURmAsJTXZW2qq4^LRU7oP>q|_}n -4Xg0r}Xm{OXjbp)I96_BsEXwv8L2K>-;n|Pv*0x)I96_#Dj`ZA*a;#>ikr-JwFZg!TP2LSIg0p6>-y~ -x%5d+os9gtr-%!m<Rr@I!Kx>7F{YfHR^sO7b8VBHPZ{}DO;r(&_S>k$WfRIqkhq*$SrK2Sn7x`@B}YC -+TuoIq#ug$Bn(VhQ0UWRpA<^WZg_wplIb<Qiqsd_lF(+hl#KPvozO(hP@5~<do$ZHxXXjzxnLq41i-& -z@`H=5qc5L!33#re27E+&YTS$HGw~+cgU?KH+&_e3-kcHIeVGElN`_9(GzB7B+ceWq)ot=k$Xa2D7EF -Siq<wL%c*}f_JotU9j`Ed)O&nf$zn5R|watoo)Df^w6tyTGR3!%>``<<M#HRZmu`LOS7J?uNPhka-JV -c*$#*mvd+`_7{KcQWdXd+rEZ-CsUL6n<?)$*khk8GAh%v@y$Y1my|K+~SSWuLLSFNo)G*1^WnS?WzX7 -n5Q*;RfAq85~s{vI80bua^w^JSMro~4Z4t6v^SMKZ(7PP{u%vF<I<)4;_?aD7E(>;%<ti#nU6181~r| -s%&W=m6HpaFP4CzigL%g(?PcKf850dL{Wzta44gw_q9SA={YQ$HeyhENP9aeH2^~?D5xQUPQQ|z|kF| -rHyHzZu+o7Z?g1p`_4?wkkM|%UzA5LliDu=){GR%FaAg7$R89C*JK$TNYIc+m?^6U4?0&-G2bbBdRMH -GtmCkhHh`x8v^O<hscGpJ>*?;Y(k6co-HBb=i6ey`){D;R|HKLxl=n5rTg@}#N9B~GheYZ*>de$_H>$ -nLz~s)&Yc{VfxIQ<oI=>`yT7H#MmUD$uS1(trLVsRI>qDb-VvU2PXXSmpocs}<N~o>kHP7kY4Hxt7~L -P2A_wa8*%=l<uwCtjKl|tD*+JVqB5!$;ExK^(j@6&DB;#HnUI_l|4S+rI)Ir1Rrp=`lmEC)Lmdx%~eq -y_nfc(DQy_)F7Sd_N=rTXp1=4DB{pMR6|traDY6;kxGxPF`G<c{(hNj@bSd%l=hrd!*dBJ=S8I3)S|R -q{Od;;MFK~5NFD)<SY_yWs?b_U`DD_uaM-um8(odg)Q1PEuV7C{mib5?)6@-|-rXbXzx`H6ihJxV1nh -JvdYAMK;<@eVLg7dn!<~2p3CjL-Ca9xim2-Wd>3PPy<yntpekt1soDG04ftRNV7qM(;Xn!PmA?4^-rF -O4*NX{6apBh6kKY4+AgvzJDiy)@G7rIDs@NRahdsi6DH+6r`EJ6M6Bi(e|h0;XL`f-;^`5R~zZf}o6N -6$E8Gr=ZoN8X}$XqJp4|mlcGj{S^gvA$Z*9mY!Ed;T2!f2fJxJabMdm*N^?iI&q)d!y}Fm8m#=gM-@d -tFDnXKHTMLq{^pE9Hq@<(YRkXy=-<7ds1EcqMM0^ubhaX{t&A|v`I|FOC<+>VQbD_WJ&Q0T`QBk6SkL -mbg1CDPj3O_NsMfviMOdTqyo$*!QK^br-79K@k<Fhf2;cjX0=up_j<AsA<>!<H7x2pC`mI<`@`}014& -+xw!Tx`(z{OS(7L(jqtHcWi<EZAr&YmKSo<5@>$m-pLN`krnSV72esYS$H#2adu_|XVk7icX`TznBBh -E-`JeAQ}%Jqtcxj@l*g>bakEb#qX{=Ueo#!BRheO-azj=UbJ8>Z_KNxL`8E(Crf|f2j!ls#Qv`V0&Ci -+3OxGFS)lyztJr(sfvO$A5+lip<N8?>PKTx_a_RxG_c?zy0?0;p)eBIQWy)2`jjR@6NRBl#U9q=&YHr -y+-YEtRN`TfR_b9(ezUGHn03v=w%plN*pU}9Fqg*~7&4;`4@>z?Vf9{Z3bq1x+7N67U{TQG(?3@dRA> -Np127M(gBa8xG7QyR%@rf%1_X`$(mbpUVo*?)HbnJat{6k)YO)w0S6|xbrJY7k?KFC8r_ob8jb7Sm^w -dtHw{{v2(N3eMb{f63)99(4MsMvjdTFQ8OFNBT+G+ICj@wwNDzckJS4BPsLuahd`7^iqR2;d@r{Wlaz -`ZrctA9#!L)`@~Du@vk+*@<1`X@B$Gt^z+ny3dGNG4j;<*LG6<z|J%2_~V<tXiWe16r%dPKAsUxAj%* -H#LmY*e>XgQ#W_2Dsmm76#g_)5G*!U5DYd^5X?1I5UjPPAXsZ%K`_>af?%pm1;I{R3efcRDG7Rr%(tV -_TmE>7{Ce(*UfmpOdSnC?YI$TN6l^&%B0^iJGJ>y-R7h~PkxB{9Hc~Oc*TyQQC13mJ97*&&MWL(uNNi -B(sy>n!6w;}Wqy~k2>LWFSLPGVCx<Mf&^hm>?c0f&oLQ?3FmO)4hMSX@9U{)R_m=Q>`56noU8G#v*Ea -mOKWkx1T-uqi-gwmwij8vM?TV%x2gyJG2mnJk98@af1f#b9V39r<vTafUN4T69lH3;&3Oi>2$K5h`C` --DLd?vn;Vwoe%Z(LQYuB>NMCAlPRNf?S_92o~|2L9mGD4T43yU=S?gMT4NPpBe;xy<`yd^|C?G*DH$J -(AUolg1&xk5cKs6gP^Zp8U%g)${^_L*9L_)Xr+SgTj5n8v_X$52yM_~3PKa~xB_(I6@=F1Nd=*Cc}hW -OTb@=BnilCsr&!_kjDpaxJgXqIE6*ti&C2r%dSqSFPKXI!R1oy>Qw2dEFDVH6cv(Tv$14hgK7OX4`zC -l52>SSif}oFIDhT@cm4cuTNyVjkj{$}>k9yR^yhkcJ#pD#NiC77zH8HRCsEJq&r!_He^r(q>kAzN|_e -kiZd5?@^ia9M>6R|Q*Ya&h+(VB?Waat2`D6!T=tdP^1SVTQ)B38*Q*F=dYd+vu{-JA5NtXNE^m9^-;V -POU8Jt}L_=uufQ??x*tX5DCI#he?BBi*vP_`zQ3|Exu>!<F^fuA}cCW^V7TI78g}gCG1*QSkadG^7q< -kV~FtsBHI+kN)<OLibAT)QxfZEs?7t*P-rUC$@WM&M3m<k~3q9VxY5%Fr(wlxFSsFICD->4d}cgOz1d -sK@ny*oVlo|33N$O3+S?<4Csm?3<95-Py}V2nN)=I!<i{X1<+MRNI;x<M-WE7?v1Td1bvOIRs?;G^(% -tD#s(BYUt@!cps%qZMbOvSup;PdY(x?CHMT|(^fk6t5%e{-P7(Aqwq6nRHMT(!^fk6o5%e|osv_uXY? -Gjv`r53B`r4w1`g%<f^|e(I^|ehA^|f6Q_4T?U>T8E0>T9PW>T8!G>T9<m>T8c8>T9ne>T6UH_4S4#H -`Su!=caYsKKgN|PHpZ}<eHZb@>$o9E5SO2^Xe9m(z<Sl8<6ePsh}f@+~9ntPQ@Hk<i@u;bt>e9BD*@P -D#FIET9=W5x~{DVGEmpmG?0P1uGQb|^;8wnShU4)dp%V}v;=KV+}gLQC{(?lC<x#Ca|PjZuc_-s_WZh -fZp^v5cUC>O+iNNAV7}G8v&$Y^g1(-oE>w4WkzhL3y|e1f-F8e>5&Xqjb>eP2rm6^j;;cGvw;fYe1pj -bWownPKsVahBIIGUuZO0UMu=woWS#{EGJEpkPqDr(vyX~0bPKzp0r|h<4s){IYb;fQxrmBeYRwvx@@@ -`Sy>U`ayZdDQGtxmV)<=vvZ)!DYZyjzs_n~J==Gs;^%tK0smDx$piEAsNrDDQ)cyu35Y`>-M}?~L+3s ->sVbqrA0AaN9psMU?kRMPA++<$YR_mv@`;R=4c7f2xWoZ*{Tm^xnABro1(ncY8ZkMU=M&@osOYs)+K| -;N9)*6nEN`w+8KQZ>PA^ro6T7b$dHiMU=OCdbhVz+(G8+-nhDWx3^PO1bL5ZQ1142s)``*arNJBZ>P9 -}Y}dVU_1|u9r?`Vm*S&G|-)?WGxPvU$y>a#5Zf~cm2=X3R|Lyj6iaW?|-5Xc`?e=zxJ2~a8{@d;CR25 -O)>c8FIPE`@*t^V8X?Nk*}-s->I-cD5!<*okP?d?<*QQqpm-QG@B5#_D^+ou#dIpwYX+wJWXcM8f|{k -PlOsVbtp)qlIaovI>4qT?Eg7CsU!&?OjO9+{W$sONbI)!lA7K&Rx(s`GOjBUMFiRK4RiEsFEl?ln>sx -yq3H#WlIxDm#8~R+C=kdovG?2hpn#f8RSVI?MgMgWR3gR~5N>;E#Zhb3fVo!8sS^D%W3ma4>{k<rWdg -4~|<fSNUhTb1`FodO_?DjIWCPvpW7+e)hLN5I*)N!dFH9S#CvRT(~3f;=)h4Dco6>ap9x50_*bUPK(z -qyrv4Q3S7MUrXp9<OJozjzO+hF1aw4E40J(J0`!ie;Dx`IjiW0R`gmW<{<0OS18q>$0D4PN6X=Sf(5a -psG;bKZ^X$+;MQxztih`G(9qw0@1HG=O05T5@3ZEU(??N_lcI3RGps(3As!C)NXV>jf6!bN_{<5N=uh -|XT71e-tE2;xsQWW$xyK%LmCeU6*(AUPJilDDoRr1It&c3Qu6xqbtO=}cEUz_$Tg1+|bPy~JL6_YEGO -`P4YT1GZ;_JF=TvWc??)+vI%4yaO)O`JV&SP}Gfa9k1eb#k*J=<Af$C}b07Ppg)ZO`JWmNfGpQ=50mL -*BSFb=xgkhBIs*uOcC^TQR_UW3(j6tGsj%P*^Bx>tT33pcvTVfb@{9!=<BjNBCIx;y{wK1>kVcn&MAV -vCd_L<Uz6(<L0_^pU(8+MW~aI@Zs>VvLd=chW@QVnm>b8<PHCmX>Vw&L1{4LA&aF}F#Kv)RYt*K(G+} -P7emd4B%xycZC<0P3;|Pqo*GCj3K<Wu_6vo`^2NczS)Y0NdjJX}^@3A6cZiiM?tcjT0b4F26>D*qGA- -1}k+pDcQwz``;VO}HXYwn~PF1EUxJ88ZP`Z}c*AZ1LW`oc1exzpPeL0_lUrm;k0&UhWH&zL)79teHu0 -B4D{8S|^vb7N)3{F-Bm8bDe_u_|MJ&4i*Bka_~F$e3TN^$_bZ=GSUGh1D4IYmK0SzUJ4RP!#kv|LUNk -5=gQNC5Bk$w`$XkiNo_-4=D=zn%}llQ39mRDaKmnw`uLg1mgK^Y7Uq}JpZ~@HjKy2zy6vc=xdj%65}% -SyQUODU%R!j!uZVmZq+g-3eWE`cR^ooswy#1GykSqC3=eUZ>s5GsAm3vwn&&QJby?VVT{?#AJS$A^M& -V+su5vv#{6-WJcf1VkE`Fn`i%K8^YYNwxOqe9Yf|-v^%?WBb!J>*g~t3<4YjaDWB#gY8KX=Kt2C0uIM -c!^?XO^@X<?OCHVic_tkO@$SkuC4tu|QUztFE%i7}^z5shTA%70-*-4_Oy7Dmi#)PN=x1$`~7(ND%|| -AjSLdoj?outv=si%b^QsySf5X<@B~T3GeJuvY5^2A&pnZBzt(?NUFF0jPz28vkPN!-akN$ry-Q*r$@m -E&vM$)rc@4wQxu+1v>#O9M)=sfvJTf`i9sHU_qzaaJRz+o$$fE4i|LV0e3oF7*p|LQ-B2>XW}l03+FW -=!o~m#=hb6l;A-K5)<f)XxDXEHkZ`r<DHbs|KwOwmb4QwG;i^_ujCCzs)i=e~hYMG=Lyj@8#eVfV*!F -O7NDUWbUyCEE9Bg^GIHHvfV_=IT=C^`M7q@Fgz*yMg>so!V)#2h!ZPhU*wzyjzEw(va+^tR>V`GbZwC -Tnchl``;<qM!U6qP{Q`eCeWaa2<VIEQxeO|>(OnJvC~QW5lJnp2FOExx5q0nVabd|N*mV`z)}wX$JO` -Qm={ix^8=Jf!I)%qw3!q`@G@)D{nE#D}@%i^t3xLSM%<K*Rj<#pC7;p|2C#U%?#n#S_{O!&uwm33ck2 -XTEqsn;nd~EuPdQ6y};Qj_Ye+>}~O~8Z73UFPaWH#^4sOm<K{%S2V82Slr@-c5^ZBd~rfsB#g-|PN+F -x?)l<`+84&=7AG`X!Tj^Z$yXIYUnVbrIp~X%+8xAL-QuKvGUlN#PN{>%nBC%(wqrSy)+!B*-7Q{KM}+ -z4i&xDX+Tog{*CuZju)|$dQFztARba=D67F9%BT-$_=ME4}`k0839B74@=p0mpEX&3rMRvd-=}YZg>Z --_pqZ{~1`rL$*<iYMef0o)z|1M=6vfaw;uvb+SD%4E>nwkD}LfueC(pU0^@tFZ;GLp#67*8U1Tyzq-v -9^R;g-j2wQiS~$2Ujb?48Y-Iim*@dV80^lQapS@5%wq^KB)+MFAfeU!p@6>gNm^G<=~JaY`r*qMiF)< -9v)MK?JtMVD#EVB!{dsuC-Lw(Mc8h5_`Dz<P&>F=5%o2!i252)1bq!^&EbKygUdNf2_bu))RA!alIg* -<`e3MZaGfHmbiE>~bb}(QbfY4ubnsP0Q0d?%MNsMBW<^lx;1)$t>ELUMpwgjzf_T8~(A$cj(xLr|pwg -iOil9;%o=dpR%Jk47MbOvKVMWl_&=Ez@*U(W#(ASW90-n(!ql5{!R+%1BPr$P}hSU@AK-{5IilDEd(~ -6+4AvJfN-7%!*&I59X)ZFXTmzp~d${kX3=cMT&HTSw5icYwj%JkqiMYOB!ilC<v^#DA0WJEmx4;~p&l -jFf7BWhPXcw}U&BIs#kha%`{WS1h^)m}x=)5xeG9;`d^rXspZa~ECZ8;a;E-%><ZsW#l8zSM?!;O?NB -T!Vg4?TQEQ4yy4q=m*t!cmVI98c&0MP>qKN@eZo-H0TG_40s^#-~~mrD-9}mw8@ZGQ66kEr1g-;nvAH -S@=%izeM25;GNkp82bv7+R75|hRg{OB3~Ri>qfCZ1-rzwd!)kgw#$;HV86ILXtj!FMFd0_ozynN%wPN -%5l3{I}+~%E$->Rl6;zSqKDzb7qFQr15=yFLT1Z3rA_v}%Gi7uBkctBR}>q}b4k(K-UlExLt%FS=nYJ -#ksPQ|HE8xJ(71EkS0vU0Nr)U1(mo87C85qbnVODBnZcOY_mcqWmX5tc-SZ&^xrRgBKyBULBhdkQ1Me -gk8|0Rt1lAp=vw;bq9cGwFF)M|FRV_m7x|*9q4e*dSbQV3Tlzfi1#U4a^8P8Q3P=Y+#3Qi-9@eYX)MA -iEqwW#bJ|)KlJZZ7(wNKSbxAksQeG3lLkWNe>l9xK&bo=XSNv#mH)B-gn`iKAGZ%02z~zX4I@763;)O -;&m1uj`uyYNa|S}6|2|;E7eSx@zQNRl2>Sf@?N+wX=O6c5@j;(|+<D-SZ`n^Rg#Y^<%blx^W9YJS%zA -wcT~@Byz?gR$JBgvo$~_yH^07wIF?2aQbke{&f77^(xWPM*8wg!~eR<SC=yG=BY6GFmxxJ>&#?a;bYW -the<=h!lf8v~vH8n4WA{R%DRpXF>M`riFsW5>)=XM-45c-^Z>zIKtU&!b)fj;LCTs08-oZY<9K<IOR? -PUX@&xN!541_-C4;qyv(C6$rBijV}{CZ-)fzapd7Gq%v^f`O-kb%(W{2u#Q==1AIQ-^Rg!Xpdgrol<5 -&yB_$(mo2om_thYoHW%Wg+3QXjIz^&aNIylr`x_s5u&cklZr6+O6GZ02y+cinFrc=;Yo~a$BVB#t_b_ -*MM|&}f2;(Xuq8^cqim`qd}drzg1uzxO2S9R4J9G6jGIbAU>UcRgt#*4Qxd|;#K-_U#~K-gpfWKs2r* -@1WDr8iL}kGAhNgXErZ+T!8#BG3so0q54b8X4b#|MF6|vi_6;9F|YZdiOAI9~b>BE?54$Tq9Omk?CFl -L%VbA&O|9GWAHndZ<OVT?3K6|yM`>Z$^^t`Tw1BTbSRnUE@?lLsRcQpIzMf=a7sPEk<lA7rXvg@Q_}N -KR2uX%)vQ3M#FlI7LCFRSc&nsI-dU6a|%5@tdNc(kgmW6jWNpZi+g1jZ5E*zoj&2wTkQhIBM<<iv8p6 -Gm7j=qa;Qi#B`=(<UvelI&QKHu10}8i0Mqn$b(d|nj$m?nr)4n?1HPYBM+kMKPrSS_~lVW9MW5@h!b( -O79tO#Q%@^|iMVI9W*`ruGkYt9QQi?X+h(t|3rUQLOgi_tLYRpA)-gqxh`U$yg_KDZjVVIoy?LV|OcY -#uSrH~O$r|(uq47SbN<qq`iop~iWpY^SI#MR{+b$}?M0Z(TQ6Y@VuRf{>DU(4XL!?YLs$Fq0*tlvLvy ->L!()I|ml&XkJ5!NmY?^1+`(<k>UVv1{>BCO@oWL2EezO)s?ET!3thZI3yn^e4*r8K)?LJ@|{Pwh|ye -VsJF#fiA)lXJ*WZ5gwa7RI$r$1J5PN*07!O0x&{Dhm2aG+x6br9|U3%uz}-Uc(fnMB_EgP)apk!vv*N -<2B4rN;O`?^rTedHOx**HD1Hyq*UWI%uPy-41$tUBZHu$)W{&HC^a$&8mg%bFfA#vJ{t3qV#lB($FMW -DW7r(qG3<}+7`DiE47+4IhK;fv<6hYga=UB?xns72L3K|(sU)cG@s|t=x_kWRN`mg5edRGhn4>h)|F) -tCNW(_VQJU#j*MK=nGyTh+S3=dEhrm>Kr?^|aJ*F|u^lNjEtq5lN)t6#x&6)nwikd)Uim(@bzxq;aO) -%4cUQruJ+dgbjFw?KCGq%~B=~w5BtqNxPrxbD0&pU#!Wx>pVdSGm~IWwRkIJPdB8PL8M_R}=8i(>4kI -WwRQ9QM?l8PHY?yK2r1XdH`uHD?Ai!okj(GXvU9!`_-R1KLf)?wT_L+Tp_f3o`@T6+vGE8sT6chM55k -rwiz7;0;C4*MJ6)CH1BKijw-$$gQNl)No7cOAWWAzSM9_>PthWlKRr{tfaowU`y&t4Ys7dw3k>?Uuw% -G^`*94QePShmeiM;c}abpRpheiNuRjNnSm`c1Cz!clD<f<IbKz)nf`rxO{~|9&kXD~zBlPh^qNT{!K9 -Cl@<3%^_n*^$Mz5*qHRHw|Bz^Rohi3YZR@dkS^qxm5&sF)*rI%T&mo??G>Vp32!zc9`y3}J!Z+lrU$n -=6qV+=_j-RtqCFFK|dbmW48>T?F1f^xm)Wc3jDs&u<2maZ{kDfNPJW9>=As&Z;Z6Cp_y3B9j7eSwHIr -26%PU0yOu^dZ%^ta8_+`ka$WYlc?!XGv%(_NZ<z8`$@t=G!_MHQbe_yQm;yZRz@pEq}q%w7R+!WG -CD1>)R4dG9w)L`;OE14suVKv@TdKfXIU`n^@g-@m(+di{p!$hXy?}M*{QdV_dS|&N?vrbl47Q6Q#H>F -Tm+FSI{g_o~qKoaviMv466tk&V)kP*T8;lVX@gy<ZjJ57d*=#t?#%wv(nZ{lY3L1E|O9kU`K?9qXs>G -mPz=mYWjdzzo$6jWi!=`2P(gi2nm$Hr7cHfy-Uew!8T<T@6ZX|trfl4f4ps>~5%UI!ld-SbuR5zX^df -EOi4P3%n@%sITR5h^wu=~ZDJZiwTEL;vSu=D=+_P^7mnM+ttb|VOu4n@zig{lWM<pKA7?Q8lAEqRgqm -aR%oGJS$;xRSPBP}QbOdI9UvuB8j!(F<6QM!#*Vjo?|2_Ab4rxqvljkCk`YCqHrj`KtUh(%YRX(%4;K -euCBKjc+}iI^#68*VtdF$p!Z-=_b9Pt`{6P-MS=g=mq0TKJu`8TULxWzik=JH7&Wugd1sQ=(j$=d=ab -1J{t?99Yedg!!(y`y0*P3tH*&ZF<M%>3-k#!){sLFB2&G9HRRX>zv~_n>orG}vW6VL@5W5PQcLxM$t5 -3Seu6dRgl!vZb*1<1Xr}+H`xaJ`Zb1r$b^GRx!SifT$3mru9mC+RV@TFHhI2t33wp0R7F6D_48y!l$A -Y3;j^R8sCm0O%Mouyq?2VjgFx(qC*<ipoa>BuoZ{(zdLEp%Uhv(dR`5<@a1%%w4mr&4T>?IUb8G8u@U -B+HQL7B0W5Jq@oCn1dSKK0^CMM0a784^^v@@Gnd9)G;@B}GAtFZ^6dP~nS@Dhc{~>^UV(kXR9phk7ni -6cqQgd2x(qTppiWvso#I40oQKeQkqMPTW0ghItYU@XqagbxwBVttiH#-a0lrx#{c4-DY4f!Jw~E5ypI -<HzX+U<4J>XbhjZvd(RjWl=sY!l?3HIXGl=qlZN1Aua(a#3d(!Nv7o&dpHLFC_q-t;$iW~S(mna4qM) -<q3<>&rMhS*`pZc|uprvOl!bx8i1vNcsQP9&X7S-@kDn5+#K4%Eb%#fg|XAB97dO}STqrA@>(#FdzBZ -<~~p4?R3jkBoCb8)DzAwiMP7=mMcjRV0T@S_$5Raz3`mkffz8Ha>1;72VAnzW>jpE4+D^0|9!w!f^fs -nEP-P^j@T7zTdEqM*^|EW*)x76pC1wDK`U1(E-R(qjDxj0eA{cVamBc|+(b4T9zj35t7BTQiIYKW|7K -KV%T}W(X|MkXFxo;3$8g1dh@WI!c3rx}Gxx=4D9P>mDA5ctg7(7!ZEWqWenHlskrjfBaJ=uqq8GFa-R -lRy+&<KU&o*<J{dI$yE^|5N+Nt?)&7glmx{*r6z$9-=|(w5)||F^GbqVo_R(|Pq&BB-e+DBg2CQr^&X -7%KC5qlq26a-P>Erv_t{@63ED9c14eP5ds>?tjN(4`f<eJ{UVKW4-Tu2Of|q;Id?u_$LsyL5zHCTP&d -X|p7`gq0`O2W2pI0@_yhPB?N(T#0rqJnRNx{h!mT@wLWt>c587EU%#>o_xaWaKvoJ?UECsSA^lPN5e$ -rKjKWC{y;ytsorVcbC;GVUPH8MhE)x{;F)Ms*`6AdKrqPC^*jjh%!rwi`PMVRSck62kay>?DK{-q=Y9 -W4y7G5Jq`pFCipKyo7>2V=p0eu)TyZ8Qx0>^WnXOf<B)Ny%LFBdmcZPq<wbrWSY0_<~ph0n!oj6*CAe -&^|@zdY13Vmx^=i&>YA`DbsP9+_1JE@pVg5a{$|%|MRrS^swl?Q1B&d%KUGnRtA`ZXjcBT(I<6j3WVZ ->biki53ts=WgPgRuR>h+53_CQrp2Ul-YWOwbUiZFS9*Cs`Fj(1kCQQlh=d3o0;@2!fwyla&Ac12#^HO -hO3A}{Y6<-JRhmv@cw-lNFNyGD7BD)REKQQmJV^75`z-uo1JdDkiL{ffN2>y-CFMPA-@%KNY)FYh|#e -N>T`cb)P+uE@)~PI;eH<mHV7)i=A<L%5^-sv<~mw|WS7PG4073GP-8;m+x+iXg$=>LJ`YeN_=8xLZAh -JEyNIf&_P~hj8cgRYj2CZuJoEoW80EHFmdp2zO3jR&P<>>LJ`YeN_?VtscUi(^nNy-s&OTIek?T<*gp -Vozqtp*?7Dv@?TfFs~W!1YhVt;H+%Oha$nWJe1&iJ9#rJMs)6YV-|RiC$bD4<6B54JdsLCDMGee9_-5 -~MMXnY#Fw5YZy(bm9TGYUFf^YVoR^;T|NGQQ^MIu27b9x>lRoz7)pVtR^Atw~_MMYl7359%Fkr#48Ax -|jsLQW{;DMen$35EQQA}?eHPot|9Ia6&gcp4p0<SR9Ur_murUfv9zMn@ERc{6w#U8~5;o59oQdPQE|4 -4y_eD)RDX@HDzfk(W1vC)o$LLSEhso<_GS^73ZzG`d}pmp6l_(H)Asycs-=?o#CC&ERQtk0LK`22Z1- -ioCoTJdM7o$jh6-)95}$Ufv9zM%8Ki;HkmjX;huI51twfo<`Ma`{1d;;AvEywhx{f44y{SY5U-*!Qg3 -Bowg628eG{ss!qG^<=yD(d9^zwx+-en>MM%u;n!7B8&^*%vPTY9MOdtSUOjSypQJ9*t!d2~j2_=m7wM -zN2BXI})J6K}vBBu^4Rw(|dTcOyd_!HNj~*Ksbo}Ox4T`+DFxq%s>vGeczE~C63FcXYG2a{N*nG^_V9 -fW1IyN8kHClGRr>v3j=hUv<(Zp2|e@^Y%9Zg&nQ7I}5cQkQTM5U-*yQ7J#BG~mCYS->);;Jav_4Pwa> -_%Bx1L>^ymfu5Sqn>9xRW}Dqd|&lZIzw#wBuvvCZdn!ClMl0I>aS|JXu9c6QOuf4<05)h$5qQ_?tjsp -+n6;=_x3Fxzqe|x&b55=(rUQWR?EMAt7A7Pu8RD#{M)y3_l>Q>Zi$>_{_V5GCDSr5`z&?umDT)JHTPa -w&H0b4;iQ^*Nn}f7VtSQ36F19B_x5eKfp=BZ<tk@F?LOzK+L3=&<ewG0w{OQ?uClwtR7L(5UFtMz7f$ -wVw})L-<YeD*+Rh(1tbdjwcP4Aza0%9`$jUx%IO`}|SUa>Zwnh;)3D|Q^5l%aiV>l{=(@w_C194iHY> -ZzaE;>J}2nXhEI;aR+_sib$6~fB$gXXueKmUk9n29C32~`M3-W@dGg`FElE-1ngPm(9A5RQ1dIwT0Ib -QX5LqX_4fym3Vll(PSlBJ9uKzey34a-?4oj=Vd!M-h&A8rY=>J2z~4LlKUk**v8P=PAgh%oT#Z4v#6q -W|vpY%R^rq&ntqyP7Er7zSfve#`!WkPYS~Fn8i!_$vh?W{ANYiY2%&aieN-LHY&oAK?e^gg1*+TRfL^ -3Ms_N~kwI_0sR%na7&FIOm$|(=6k%tS^Qua$Z<${|sR%o5$hw*eVdsXc%PW8-`ssOOP<1yC>b<BB#^w -&|Rc~0;GPhOh2$r<W9p9=5r>w0}ZDS3~{GP*#pi()FtU@>iYUi*bsC1V)KP*mJxOiF-jx^b;jus0}7E -hYHV1gIb>tK<|{M#E8VKa_{>c+6JWd6ciim(~SCauL-NwT;>m4aNCp8ZlGxXk0PE5ha}`?c<4(a7wi` -7NA^H>NL-RU!+kuPTDeT>G{nxXk@(XUK&ujH`#kB9O&BTCtH6o87PGj#VGCW9Bt5)A)#1Y@QN&aknDO -F`m@61xq{T&uNW9u5A92zC4z5EXrtTg`ltXuPK7d>^FB|bD|No6s*~p9nsp$Q$mlJyP&TNs%7NT7B*> -Ph1D60yR=0@PHjO>YOWAYbzQIGtx;cEH?T5e;kbFjps%klT~-8tcv^iFa&2>~RPsC}^i>U-cuMH@Gm2 -ne8?*u8DWUr(6d_K$s%DNH-0W2iwXhW9>r2|4A{RF|t`z{wFy^*vJjGK&h%3C8TE0YwN&_Gxp&Q$ -qJ@6M!7u!WQ+1SbDK=Oj}yy>gG<V$HuY?Jq@oy2uaRrkc)K}bL+K6Vd2HXdX3Pr@M7*&b(K6Nbi26=` -nqyT5kit7)iM%}vm+`fti70fTgA&$LdUhv^OVrF>b`hN=y5d%Bp??@)L<KoH`D_l5jnd>Z5azKbbGQ2 -!5>bXPy~JL(C!5ilXLH=DzVmL{(#mfBq$eO*Z3E!Ef$ZOyAW?&Q8UMKi^U0z_%Pf(yH3M!WIpHiXhg) -#^-gM=!c#)0)L=3EJ$qTZxma*9H>}|tH`iOE9-Eu%y|&y|O1Rqdc%tfVnBe4oeK11EA+6vTIiG*cAgJ -`P1{WAXpTDS|&Vxi(Yu)ETqLYUd;ULkiYPeXLvAD{77f!|7Xx<PmbB$IX?!ULrJP;~<P5YTxdNDts9* -(Dk?pG7!DWS&Ea{s*vl|0s7%)X=Mjx_Y#Ms4D-_G0do$`I-3`7>&`SbQ;Wy1PhAe?6f+M()42M`Ho*z -h`0r?!R|I+ZHUmm|LYm6Bb^~zp6bCEWDWCqE0<ymP7+jthZQLt)76Vgs#zw%~L}6XtIW<gpO+6kW)f6 -pl&lH(ZCanF6IxZDtSuiuz5qc%-tGyVA;i-Y`at;90_v8NCWyBFfxRFoi=X>`#Phc7M5Pjy{_3Gti7- -?DHdPMkEp-L;*0rR<}PHlwra|Nr-ZIHh^J0!#D`@VbGuc`JSB9eN(1}w&8|~3$6}1RQMF~P#+Z9ko9+ -&?BpQ-nJ;vM>H6kp?nBQz(1NOCDm4YQ1^ZPW@)L|D*n>d~lYQj~l%FsP{D}?rIjmnUxgznOcjddBbtM -m=AFk|+deis&I%w1HsjD;BslLjG#GzN<m8goP1>BkC<xwo_>!V(SJ0m2%M#ocO^Sfnw#Mx7p3Y0Pfc5 -E5%NX2&#Y#tMzOo!WiJ0*$#*H9f4)n3F?}D})eo-24{ejm`R9Se!AxLqjdB&6uCk<_1eM7WV5WV`av| -esy|Sn6YTO?^u?xxW~K({NV=mY*>;pcSV~vEXbJMJgNxxHKIm@#TfIiX~Th~7z;b}x3Canaks`cScb7 -Uru7huFcz<9HVaEI=H4)O!5>~+HV1~QY0pEAs=Jw3*6M@x8S}^0&M=%ke?q&37_6Q@t34~M%$Q%VF*n -v_%=fF4z^aUelSTtbEKisRqSw7a!vw6ym|Y`!%P^WYyJkcYT;`QSieQ54w<<!&KmNKRxXe>Sia2odh9 -bDk-RBh1Wlku93GUmVh*_<TijdVhv|bTRaKd~tLJ~QNuR<`v9R}Ia^fJRJ+U&mFitH$HRRksMQo%%a8 -c9{eyrD{%Lt`6`DS}1pS*HjVabQvrEaIT~Em*|CgNk4ghc+ofqcp0O3PWS_XRj)Ple;>l$WC}DvzSAe -uPO4v$57b9@k@%l@G;J{xXN6O2yQ@M(#@W(iqJ;vKdlIT(*3Frj#M2uq6jCoU(iZ~VW`Cc)gp$W7I#b -DBEvA$*H=#|f<qZNtO$M5A+<>iL(S?KVTNI-SvifPLa6Q=w<to|_4QFjh?#ZpD&sNgyHtieMtz?eIge -3)+uX%r4fFDFC}T#37}n_DrU-qUA@f^I3rRGUVHj#oj`pk&VzBLMkQj!V(~v2{Fx1>`l{|)_=HAu@0K --so=e0)hz@$s+6)_AoH)&o2?rBJ6h+(MtHOCdfJ#97*<glUnF7$B@s1L$0)cirMy%>g?*ZCP4hoKHic -$RS(>Y%zp3`6M&6cxg-#v!#Y3`5Ny(z=0RsQIH>u`vuae{8iPG$*IcU1&};eV1VvYW|W63d2zIm(6cM -UsGCpF$}e^N-G<Np%z9?Dni;-&i<$n#xAxjN2C&V_B=VL%rG3aa6nax;i!c}s!|L`Eu7F#$8glb34K! -xM=gwNtb*aFg>zczFdVgT^@1YgeoXs?;iyG9zoJ42wBCG25!$i0G;+gm)ZFUxih|z$bYQ(2HO8YB*6d -VdC%2Uu2AjUVq_Hgqn`Vdg_Zw`b)Wc%1>FcXn=`q+eJERp6gH5x;<}S2S>oqXPVAJe+4d*%7WZE_kHf -`Uo2(6T6$1?8pWgLBjgM;dqxyRSr<BE_eI5?;X-IRmcwsElOsJ;dVn@*@wWUxs?I-cY-p`VPwrrD{Zi -lDEn>NqgiG&i924}(o}L+W8M*fck&=7_;2+h+45r=hnL!Fo({&cP;4F=sr<X_G1igH3ar_bNhEu|>tp -!KUr%(m2>;x-D{&(+)+5D)#PCgs8%F4lt55cT#;MMv}~MbB2*5ljzJak~BAAUIY4?(7q!^l5CiQk)-) -m8f0T6$wn|3Nt%B{Bk30B1FHMtNYXm(JYXcrb^$SxG{0p`5u%E18ZKibX?~kJc#I^??^GX!k)-*ZZz@ -7mVS1t*N!p`I!AR1)&Iryhk~BYR9*C%7RNXR0lIHhoUV$e$9W#Q0zD!8Ok)$yrDCq0FeiufPY#@b^r1 -?n=Mlq6PLn4eMEo@X<#z@k_CapFYNm>|H`@%@l!a+46j3g}_(rSZ|BpV80Bx&K8MiUrGvYl~^BrRx4F -T+TZjjh@}CnIGTNm@9rO#nucY($2Uq=i#j*)Wo1BQlO8P3m{aNRs+_jwFTi)g(^sd2CR1H&PXAH45Zl -(=N?0V6e$Xff#JExtk6HM6KW$Y_hQ<2AdY&Qk7z`$%d5}Y+5{_6&!<2W>S8J!KOdGy-yW~(WZ)NtBK* -JKkeV7(H2j9I;H*(<4s?$(jWrkO<%9l%7yW!KOJ1FeJ2b!{psMi_B$}*^ryonr->n_#i;>B(ArfEOx& -WOvW*1u6Hh1!GJ4`^B|$<@JgX$Z)67jNkhv=e=;c?G*i|TH8!Hb!JNMZIWhvP~Wi_(n%7PX?yK0}=;C -&~R+2v?eQK-kC@A~~YWiF-M#u|Xn&;DK#D{W*vKYv?EP|fF?l?2s%zEw$(+vnSq1gU+#M@f*`=X;d|i -G4n*B*^RYBT7P@{rs4caM1Z*D+q4p^P``yR@Nr#SJnah{iMA!S8DDpAY7}Gl1yBF8=2LLO)7)Jwpa$0 -y=EDdw$(DIZJT9K+;+>Ly4Nl9_J+jj=R57?Emn5Jpt{|bL3Mj9gX;ELW*1OaMbOq8_Hw(nu52Tn`uSV -ta^zD#-)EWKv9l_IZuZ;Dp_>Di+10645ma)>UJiRYY#DTO#IlxDa%IrXG0WPlI+vAoSdHINmQ$yO6%> -bIG%4d{kW9TZrX(26oe3pDmUpfy319u?Dkb6l?nqy=jRfBveQ%`W?x>WIJp1y1lJGlUN>;0l)YX@RO2 -Y4aIiLi;Gpq!^Be|(IQZ8RE=b0t;?0LdWb#tiIUvALH;w4{I5~}EzYn0&icPa_h?8_}m@L`hrX(KoB< -!L2&w{azS1Fc@@rGKdv0zL6Bwc?@Q{FPQO^o_sLmIyuBFSW9w-}#k<!)^2}ztSdtssE_)h1+SkY$J&M -Qo|VpoL_0RK}`9TRy9mj`bzbS=}2FV+|ft~^O3%iE<zh~j=maF5;XkPS|yOYhC`U?bI05hB>%;sFAgi -~fPJ-HSpjxOzZmmxs{2%em}OHjl_BQRRLnfHPNrXnnJv}3==Wig%2#5moj$(h7blcOWG9vJ3+@alOM1 -RZr;lHEXPvSTr+jh5zDu3Vyi0@Zl(Ht6ea{w|dC!c@yl1H8UmUaV*&#FUnUk6KL`^zo-?Jps_rxreis -^e|G4~h8&3j@#$`{AY@1avwG4p#VnfX2F?}YhwbgI5MVSf+$J89n&`a5awgZ@t0`!X`~F3{g8`%LI>+ -&(iWGtVr@RJZ8XeKBr+58b*i&YNeVWB0{*dmr?7!MrCrcNH_wOv&^;(ZT!Tg8e<{@1lJs^mozT2mM{L -4EnolzXAHYZ102quGssazbp2>puan-?R^EA`M#1&Wrlv<oz>>|(9f%w+7bGB6;nGxKkrVzc^CBa?)2N -=tC5-CtCN}E3;Me=psimA9lnaG%+TShn0e2P%*d<_c4tsohs=CmPG-KZAY1-E31)j9z*5}~6%U%vL@% -*o`kCk@R!lz=({AnznomJ@v10lu=q^@FRfU;1cZTeH*2&C!Hpt9-Ld8S&JzHevJu@=%o>1|yea{Y=dC -#28yeCvVY~Qma)AwY*aoD^kX5ri!G4IJ<<%sz`%)_ae`Ms3P{2uhT&i-DVOyz>PI2BX5U^32~b@n}5W -ad3HGV`8rv1jg_Q3e+~W*PLi*0THhdyv;#ac9GwEecD(jRr1F$N3h%YGDMp$-)?LvxN!Z7W1}s2C83- -DXWp4RmKqAXah5IDmJXFNv4{rOK7i}sxwfv@7X3Z?+Gp1z!=kWDrVlZAT#e-lIeRk7^s@}#4MhQ>3bp -<;sRsL<EfawCnoZ^pcylHT+oaROBFPm_iT`v_k{jzK#kcv6*KRdk(u{wlbQE~7q!7fgMp5{4_?#;37F -I4f&@(JaX|uR^|%HdIVRVjV_uJI(2-tZgZ_ZQi`teI$tTycVs4LXS(|JH?e|G5Xnqe~blB9FrnG`uUz -%(M?K9a5n)=d|R?vK(w1WD5nB?O;GiLczt&4sGQfU>_Z@@es*YaSZPsQ{bT5JW)H?-Ia+Hau$G_7Zg{ -?oLcE&5N>dbXJQvER@p8&O98Y2StZ)4mJ+r+pXkpZYFHHC9aDB@_Rt?~>7fhIf&`xaavU)$Me#=5;f1 -vF3Hf#hTZpi?#Pb#Wsh4`9Us+fC)k_hk(4Q%OPaU1=#zbVw)$(Bo|=rlU#uL2Ic~cJdw+Fd4e``0p^* -QDO54@Oz6+%5ZaOp&~Ion7hr#{PG)`&`m;F%%olPw1WXumd4e``0rowiKbt3LGZ$d*gZ^xupe?xobD! -h_^cy<N1sJ(>Bp0B+hnYjJzu#dlz~09u(!3{T2D!dDrUtpbd55_G)0B6Z3$X8kCen7GF+Iq2pfNwlb) -Ydp$TjnrAyhH-FPI|aI?0$L<T}ZiBjh^Cm?Pvu0L&3`on4HtxXvzS3AxTLrU|+50Mmpjrr(ZH8`q)5G -$Gfa#h6aTG(5=JQMAu&lbP@9keTm;{%q)g@t}&C?}Pue&2_=C409irsJo^WV@a-QEu@QK?vwV<+z0<@ -+qgp7KXV`ar)>i;epNAZAN=PzdtXLo?t4fsu6Rf;t`Pe(>>-JoqU>FFF=FQGL>cw26Btdqv&!WMux!1 -eHbH>Vwu;&e0T!=+anS^-9E-bX0#&R{uUaK@Uz5z-2Q6N)_hn?}zBX%yxsM|n_P(4o!`xSpnfqXcC-u -IZBZ?>WzMLb9C+vMOnYj;Ec*@?Fl9~IUzw`FKI$8IOanBQhs@o;dF^_JNnOCBrsx!?w=y*<@Y0g2%bL -vcU4muj+&pGILPWyIwp9HFgLB;0{<DlaO%c7nplXK9~m`u(=$IJG<w5Q4B9CW;5@2mGTnLKLrG?_eV_ -B5G1YV|akJj!~SOwK_^Ycd>kv?jwrM{6=1bhIYJK}Tyc9CWlMql1p-zPPK&JYY$0dyqj#dta@$J#f&` -+5-n2tvzti(b_}Y>TM4kbhP%sK}Ty39CWny5a$p1zTzR@SN8rs3_7~+!=R%L5^@YW+CU)3prakc%`xa -`JG(gs9c^bf$DpI_?B+?Mw_K8DZ@DC`hsY&+$TvWLmn?(+4&Pa?%uUnIQ+tj^nb#z{ZITmtP4Y7)J(1 -TW#d6Z#%OKOHA@Z7}S%&PB>q=FU7*krJD$ANCTkO4>QZY7NYb#Z6P?ISZP8yn6vA-)Vmi31<ooHe1tw -&1rcQLo~J~eXYXwdoUoz0UalyLV-O}F~3Ydl~iS(g^Y>Zq>mzI`%eb-}ec9ILtD>QzHpaVyD&`U-n*s -#L#-V=tGTrEv7+vVU?@seVyIf@gPcrqsMuTd8?6$6CCsWJJZuO2$;|TQzlVfu)gBeP@oW3_AUCY-O;r -BdzT+g5thN$4TrL$!LhPUyg?i@rxv|?s=S4^?<fMz<hLv)Vc=_oD8|j)s(!@Df{A*8L}d2d7sabk^8T -rw%L*y0@mBKWR8HX6&xQKcC~^dB*RYc7$do#jI#H(l$v`vmgQ`u)mCcmWwOVAk&b%UCv$?M^MRRZTlI -H!?881;M?Y*FoN02$-mAkK_FhhQ^!IYQqtlTLa`-2+_u=0eUhcdzk4$@zmcq+j@RaFRuLVu`Sjv>0e{ -xA`pWN28kENP;wUnuIPc`{!sZOOcuB0s<(%N9#v{UBEl0<j3DK=<-SG=pO&+SZgWZtT+ziVjcq4(wwe -XBz2vw16~gPeXll2&(A2SzMqYS#U3CwbWSc9=DA-`kPYkh@oVF7|hgk2Tb-1I@V>;QXCIUBi(xx7qJ0 -L~yt=Ju}*oBfnYk0XqpOXNGgBLH^>jauLL!9YxET=Nzj-<29Nk&NbILXtT39@|}0qRQC_s=eOkdjk{a -QdM2PNz7@iXZ+~q?_s6!wjVJC5uDJg{OShW0<7Bq4Hr&5LxjogkDsnp%6-znKf0Uvq%vt-sf}rggJ&v -h}-1?j%3Ukzcpdeiaf3Kjn4E{nveHr|Nf(G8`bwy2}9g14+W!<@lRgqgmS|CGlZ`C$MG0;{;K@dMu5W -e>j1>t+Yr=YP6{+EL0GWg#LS`dSI<qT-MqBhWGMIE3migKWJiVC3ad+GK*sjR>p=b2TquBgBi=b2S&6 -|uT*P=vh^R&7+20KKXx1=^&@9+6uW1zr7%f}pE^QxKMqulVhdqP#~Ps`WC~T5n^md1I~hvdLPgqiV&q -UN%_^->p`Ryo|M;TC0a8)UqCyP;2+Fgryu!H%qAHJuRVD^t1%b?)^&vnA!WE6ogs5|5-tp(fij5LY4a -)1wkwSMM2QYe^n5)@<RpQo7F=-{MUa~64db@6a;nrM+HG0|4o5AS+!_zPV{<3h$mKA#tG4C&JDK}ZqZ -0_wOV+?EnF`ebzH4RkD0UghiH{Gaho~>q;&3&-73p)n|fDdbM6o7D(m1j^}L)myUH?7UVlwd$=j46zw -^aDCFr-ltpowxekBOi4k$qoc2EiDJ}N<`^{^7oLllCn#urDGFcYnWv!9i4Y)c4x^(U3!cTOq6@0?b`) -eK7T24hMf1DW+&a4O!o5{_jlVUVi?Zy<Zk6dmSZmEd<SDdCbjC7kdkgj1WeiQ^=sekEM`rG$9`Aq9K# -N|^6b!f8oL@H-mJaEgh>GBSxoiS+i>9!q9JjYXC+?M*GOl&NiMVWr!<q*$6$A$^Fl&m|qpzR)iIg@WM -NzuPr3?0qO$*%xB#zto2Y|NkEpgr@U9DhO@Be^L+vnt%N(CBgqcq98P&-%}7=|9@5x8qmL15WN2P6@+ -T^Hwr>D^S25@Ec15)Fe{=@L8x|-f)GH*3WA$W6olY8RS+t0O+o0s*A;|n-B1uB%%*}+*;@*NK7ODe=; -QAd1bzG$1tCQLp@Pr=|5pV;9}+^Bafp!qn}VQ^l?sABeykwq<52}cACD;r`gmMH(8m)Bf<B&95cKhsf -}oG56@)(NPZR`~^o)YgAAMFqu#e{y1p9biL2$n>2*9j`7Zn73{8T~E$4d%=K3-N3^zn*<ppTy^2>STB -f}oFIC<yxarGlW3UnvOs__cyyAOE5t*oXEi$|M-bzbOa?^8YFb1|q%QG7SduKNa*ckhGV9q`eFz?PVZ -oF9S(?8A#g8K+;|YlJ+u?w3mUTy$mGnWguxU14(-sNZQLlYP}4k*2_R@y$qz*%Rp+q45Ze}Kx(}Vq}I -zoYP}4k*2_R@y$qyRf}%u%;{Q_+?Bjnc2=?*+D+v0ycSr)$66XNi)6H*7%qG$Jpw6t=21U$@ZB)dp*l -I;VGcyAdit0eiy%dIhwcdwom6(_^)4xw2jJ$9EenrTI_8(M)TxkDcMaYHrA60~0=z#exWSa)eZz0<>V -15gU&H?G2lvss4Gcc(LslNWV6+xx_2NXf2{f87mrTs?~L8bl26hWo^#}!duClyg&rxj6OV~VJ+aYfYE -c}37y|3yX6SN~;2&{x0KVkA&z`sGxm68V#v{&y5XUju3}m>DxOFsKOn8c>VIisKnQySHr81lK8|39eT -JeGRB5z-r@}0rdn(*vt&PstEcT*rW*h8hA|+?Q6Rt+Sg7+w68siXkW4oe%YdZy{U-$dP@=YrH-gYeW_ -Kps4un37WJi8*`mJGDqGZ-`luH5r3TxgzSLk_)Yl0`)R)?Fi~3SqZc$%qur1oxE=9C2Is2o`e1-w3x9 -P!Eieex&IZUOQ9##Qi9?kS%zoHuMQUPHG&GfJe2-9b#2i3o0?#%R{T0YW)(}UW~W7f>{@EJvIAoZS@F -Ec%SR#6V5dcsVZX+4>_M9Oh`SbZ+$$V?Ba3ft6|dbBq6HKGXm(z8s;Hua^}hy>^K;95n{*Pyz{Hua@0 -vQ2%di)>S0>LM`<W_nOvB&NVj52}mA{Fmv$&5EF}!7YlQuR(RJZMUOviTNtiLn=E=R+%1BPllN)(?c2 -oA=NuQq)rZVRHlbCIKl*#=^^!hes)TU^|{kS8cJb#?zA4FRAP1R^pJW><eI04mYsowrM(Z|DzSWbdPp -5AR_{&^slUj*C(Ee}bs;&GaY_-Dq3$=QGSpAxREGMAoXSu?k$Yw2RED~aoXSwwky9D!I&zn4F0oMdH( -C>sqyLRoL@bj1jY_`2HcG!$pNkc;ztL)ll>cwE?qYT9J=0St-0*9OHL>@$Y2$*igL}hj?^qFgZ&>Xe3 -u5mLtG#1A?7iWwib9RQ_qql*SPgq`hkC!lI*_QZug}h*xnE|7fA5#siAhzNn{0Extm&^?N;{eBmNHKE -Iy=+pewjUtwJJ-yTvzMz9knjkHM?9_`uB^v$R%1Dx3JgQb6BggrL3U2F6nYzv&-+cy8Ld->m$m$T<2z -rMU^`Ib#cp@XjPVVxo&BsPOnS4$R&w<y-M8NtovnNE=khmy41@h>GB;(%YSdu^7SR@bot$mucyh9Q`P -HIEHD1k=FLY8j0le!7!w{dFd;l{U`lwxz#8F61M7sR3~UgdHn2%}#=sWgn1LDLSp(aI;|6vJ&l#8#o; -R={ykKBScu`>_`n+VI=<~9HqR%S^iasX{6n#z_DEgc-Q1p4#K+)$r22!6}RvAcrZdq+0^|__rK<abLf -PvKKmO%rl&n;b->C}22J$3(ns(j0^c{o+RWkg|2m2X*NAXUC)t$|eemURYF<y+PpNR@BdU?5e#Wut*q -`Ic7=q{_E!GSIuUw2O;OySVx^vxhT9RZHowYxa2;+3fSb+w8Nmb?=vD{<@^g^SU&Z&7{lox`Yr-cSy_ -qGT$ULYh8Y~*5!BWHq4LuT3zJQihL8@a_7ibWr>$_tIPYf+?wC2tV<KvYTJnZewkfDT$OeF^Rh1Ak@f -keGV8O`Wbc>x&@b!r`pBX#&x^V|&mCrUzpUl2>k?W$IDOq-=R=6Bi<}>v1a7YD5=uTeX4+g=?{Zz!%e -mb}&h0Ms{=tDp=DIHRv|aPx+iv*KwB6`(U6=Rkba}rA8!_v3MVIe=Fd0#<i@J0vqAnqO)K{}7hE!z@_ -kK~AkiGg4XXjO!tM}E1*jdw6nGc<-4{_fc^_5+&E1msDUAhWUl-TL2_si=3y42O@DC+XPQOCbumo7k6 -=HIX0<#~1QH==r{%XJ<1yts>g<D~BDL7aBEF0H$I8mEme*EO76k}kiSq_O<21QR{a61p!D_o#a2o0xj -p<+{=xp;eW6mr*ahY1AJKWti(+PCRON`P8b+Rpq?Pb$MUuTt?odisq5;y;o(<1?3Uu+5c&DXh-$mgXV -&g7wq&GU|9Rx3#$K~G8aYNE;?;4io0EO#$1$iyJ*Z@ly<x5thvawRC(k*ZB^Fx*C8|fr_tfdUMk2BR~ -KCAazXB%;KkN1+*7(-RCarkk!`21+mq}?k^j=%`Sv{SQsLs%SIjQyggmMFikbMfCr=vQAlO}BX-KGFK -Q<&(sz(h8HR&-!LiKsvkPzHIVMvJVpEM+d^-mcRx^Yh%68dmIF(h>0o-riU$!84-mGL=4LM?pWkWlqr -FeKEs7nPv<{Zm7Ne*RBgXVTrqc3t6leuanfN(Mj`?k&_H1AsuSm4A?_V<&MMCyw8<op_{PR7>?w4fP% -+N~EZ#o}zl`O)|(xno1dltO7X0PY5J=sW!gCUP}|zt^zLZ+2=NUAKv;MkUBo!0IB2iEs#1szXwvs=MO -;Y`1}z_9iRUMQpe}NfYkB%6Of+csO+x6QQ2C9qq46CM`gzhj>>i!9F@H?I4T=ua8!25;HYeo!BN>CgQ -K!J21jLQ435gS7#x*iR&Z3RS;0{$X9Y*4o)sLGf>v-;Dq6u&DQN{qrKS}em7-Q~RH|CRQ7LN$N2RV69 -F@XWa8xQ=!BHt~1xKZ}6&#h~R&Z3RTftE&Zv{u?FJQq@`2*Om9GzJ$+L!fwdU)VyEPo*j8p~h5g2wX4 -ub{Ei!Ggw82n!lZB`jzxrLdr})WU+sQVa_kOEoNLEakAEvDCwY#!?Uq8cRhiXe=eMpt01%g2qx53mQv -RENCocv7oWk#e&9C7z-LpWh`hcrLmxKXzVbi*J6{ve?~ILPAQB9JEbxf?3B`2uv1Q113Tq}HLz3ud>8 -DLT?N=F+X=8!_7PyGY#zW)*)f2fvP}RxWp4m>N^LCIDW$Psr<A>dol^A*c1qDJ*eNxyV5gM4f}K+F3U -*4tE7&RZu3)E>yJC=)YFBVnie14`sdWWMrPLK1l}cA|R0>_eQK@qUN2Saa9F;0pa8!z1!BMGk1xKaC6 -&#fcS8!AcT)|PPZv{uCycHak>Q-=6id(@^sci*ErL+|smC9CdR0><cQK@SMN2RP49F?k8a8!y~!BMGc -1xKZ%6&#g{R&Z1bTES7NX9Y*4oE03EYF2Pmidn%?sbvL6rIZyMl}c7{R0>(aQK@4EN2QDv9F;0oa8!y -|!BMGU1xKZX6&#fcR&cag=`iR><to@Ig{xratVTDpaI`P8`Se)g2-<6^NFAw81p%cv6$I=xwUUlho`P -UfcnX3^-6;qrWv3umZ%*e*xhbe6)uy196q|xtQfmroNvSEQC6%V2mK2(TT2f~UYDt+Xs3ldV82+Tl6a -<qRQxL4*(AlTg>X=~Q>o?rS>9u+&!jLBtA%;BB1;IEG1Hm{sCICa86r*CulUh_TvRRrly%ro7r34jRl -nPV~cJdY(Fj5XL03)SB6^xVuRWMTOQ^80nPX!~T^c0Mg%2P0MU=_}RRX7J$;T%|nb6^$DfmJvMR^c32 -g>zsP&Vf}p2Ug)6ScP+770!WGI0shY99V^OXcf+(RXB%M;T&3pb7&RLp;b7CR^c34g>z^X&Y@K}hgRV -nT7`3H70#hmIEPl@99o65unK2k70$vcoP||53#)JzR^cqH!dX~_v#<(hVHM88Dx8H?I18(A7FOXbtio -A1g)_9A!Wmjl;S4ROaE6vsI77=RoT23u&d{uWnqHfuZO$wZ?Mq!gJ?!Mq&~ox;XgT>av>HV((`!z<3@ -xW!hL+PVL)&SWq3yKG(01BoXglpPw4HVt+D&aNw4G`h+D^3$ZKqm>wo@%b+o_hJ?NrOqcB*A)H<!<$? -exmfc6wz<oL(6cr&or=>6IaIdSytQUKzx)`85!yT86}_mLYMfWk{TA84{;jhQz6sA#ti@NStaJ5~o^* -#Hp4cb*g1ZooX3Ur&@;8sg@yis%1!>Y8g_eT87lAmLYYjWk{WB8JcB}(`!zz45`yAL+bR(kUG6Gq>Vb -9LFhQ8GIX3$89Gj>3>~LbhK^GzL$iu#dd+E+q0`*vhmKPkL&qtNq2rXs&~Zv*=s2Y@bez%{f>RnpX#7 -pd^qSKcLvR{n2u@=R!D);kIE^s`r!j`$G{z8|#u$Rr7(;LxV+c-T48duPAvldO1g9~E=rqO<oyHiV(- -=c^8e@n~V+_%0j3GLWF+`^^hUhfL5S_*tqSF{dbQ)ubPGbz>p@5@tj?y@@G_<cJ`Sh?8BZJs1pt0C2p -mFAu$RIWgXe>4hXq-8vGGtDv3}Ul@#$vO8#+g$xL*|sskU1qYWKPKpVzYq8nbR{v=Jd?ab$Vv#Iz2OV -ot_!GPR|Tor)P$)(=$WY>6xMH^vuw8dS>W4Ju`^S0*-c_su{#)0Y|$|+YDW&ZHBJXHbd^T&5%27GvrR -&47t-bgV-$KXzmowkUNDl<WAuXxl=ep?i9|DJB2gkPT>r>Q#eEJ6wZ)4g)`(%;S4>eaE6{!I781VoT2 -9w&d_rTXXrVFGxVIo8G26P3_YiChMrS6L(eIkq30CN&~plB=sATm^qj&OdQRaCeW!4SzEe0u-zl7-?- -b6^cM50dJB2g!ox&OVPT>rFr*MY8Q#eE4DV(A26wc6h3TNm$g){V>!WsHb;S38-;S38-;S38-;S38-; -S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38-;S38_;T%|nb6^$D!5oEiW+`c3 -#PR82D}oNJ2s*GL=)jeEhJh>d3<Ilk4y?{OusY|!m3fB2oHEZpBUT3;SRHg=b<m;JL5Efc9a<f9Xm!w -`)j@}@hBFMU8alLU=+LU6L#u`ktr|MCYUt3ap+i^08HQF99a>Gau$pLLHPOOqqJ`B&3#*A1Rue6(CR$ -icw6L0JVKvdhYNCbJL<_5l7FH82tR`AGO*FQgCK_8#6OApWiN==GL}SZoqOs*P(b#gDXlyx6G`5^38e -2{ijV)Kn8Cy;njV-5)#+Fk?W6LR{vE?c`W83MYvF-HH*mnA8Y&(54ww*p2+pdx`ww+2E+pdx`wp}G>Y -`aR%*mnAAY&(55ww=Bj+fHANZKtosw$oQ*;`G&+xJu5LIF&UfPGyaWQ(0r;RMwa{l{F?#WsQkbS!3c< -)|fbzH6~7FjfqoPW8zfSm^hU+CQfCIsZ&{F>QvU4I+Zo1PGya$Q(0r`RMwczQCVk}lJ?CVpB{EXY)qX -H8&fC5#?%S1F?B+0Oq~!LQzyj6)Rlb3)Tyko<5bqzaVl%<IF&VaoXQ$IPGyZ9r?SS5Q(0rjsjRW%RMy -yWDr@XGl{I#p${IUPWsM!Dvc`^6S!2hktT8y1H3p}$#^6-e7@W!)gHu^!a4KsIPGyb3sjM+Ll{E&Zvc -}+4))<`18iP|=V{j^K3{GW@!Kth<I+Zm>r?STARMr@s${M3nSz~l6Ym821jnS#BF*=nsMyImI=v3Aio -yr=cQ(0qlDr<~RWsT9PtTA&cYs{R=8Z)P|#>}a#F>@+w%$&*^GpDk~%&Dv~b1G}hoXQ$Ar?SS(sjM+` -Dr?M~${I7Lvc}A*tg-7<*4T9_YwS9eHFllK8oN$qja{d*#;#LYW7nyyvFlXU*mWvv>^hY-cAd%^yG~_ -|U8l0fu2WfK*Qu;AcPeYloyr<>r?SS}sjM+~Dr?N0${KU0vc}x0tTA^gYs{U>8uK|St1cy@eH+N9hn) -}`b0@^c+zGKUcS3B;oe&#)PKb>?C&b2{D>aQhr?N&dn*RF{pgM;C^9)e4*fffj^p2lYN9o;TKy{ejZ3 -3!;@a_qqItuT$0M%i5_Y_bahj;uzbs*k7pM}IydiMfQ9g24^0oAd1_X<!QjCZdA)zNtO22dT1cW(jJD -fR9rKy^;N-wUXY*ZX~da^D+uyxt!GRLAT6K|po9-X8)~$LsxJKy|#{9|2Uy>;2*^Bo@>Aqk!af>x=kA -ahXV8v6)C;@tH_pF`7tUahgb9v6@I<@tR2A1s^bRn@C@=n@C^rn@C?VoJe1BoJe1>oJe2soJe0Wok(A -Cok(Btl*m!Bj>u8*j>u6lkH}GRkH}H6kH}H+kH}Fmkp6FRKQKS+iHAf6h>657i;Kh`CN>iLcj%)s^jS -3YSv2%nH1t_C^jS3YSv2%nH1t_C^jS3YSv2%nH1t_C^jS3YSycEeDtx>OpGD#<u{Xq8VuBSu!3v*Xg- -@`;Cs^SVtndj|XoB$*7c70nWFmdVWg>mWW&(XP@tJD+&a6=Fi$Oj;-F6Jm#Eb&NvzCo%CUz7Uo{1j?h -G$|(f#I1rQeb!{mJ}GCi6;eyXJSf$;hDHnV0b3B6d0a~F9jNBVn2b#nfOnjaV7>7Xq<@y1sZ2!L4n4Z -cu=5mCMFc;iL7l$#!P%DGC+(dhFP4b#t-Y+{%!lHv~8kgZJTIW+a_Ap_KB9vOSC^jK8q5cMTyU%#Ai| -BvncUdl=v)4d=@1>ixQtjiH}#}vna7Ek4)?-CRpMVEcFSN`UFdTf~7veQlDU{CKx|4TKb9$Mf!>jMf! ->lMf!>nMf!>pMf!>rMf#>bU}8p*zT!razG6p_zT!ubzG6s`zT!xczG6v{zT!!dzG6y|zT!%eqhdahqv -Af1qhddiqvAi2qhdgjqvAl3qhdidCV}9GJ#nGP0I{JMX7Qo;!^DVU{{|nG;Ik<BEDAo0g3qGhvncp13 -O<X1&!XV7DEKUjK8vEyqUf_I`Yeh*i=vNLoR>v2D^~xKl<Cuc<stqRb1?cGj6MgW&%x+(F!~&fJ_n=b -AU;uyEHYf2EHYfIEHYfYEHYfoEHYf&EHYf|EHXUv0TV-u3>Qa>3>Qm_3>Qy}3>Q<23>R063>RCA3>RO -E4DVXeBNJzf92EnL92EzP92E<T92F0X92FCb92FOf92Fa@F;8^;$S6)086Z{`!`!usZYE|{qknx=a-T -)H&!XICQSP%S_gR$tEXsWr<vxpYpGCRPqTFXu?z1TOS(N)M%6%5)K3+YaMLoar5ci4+*7FJ0^9k1T3D -)xo*7FJ0^9k0|1mh?6EPd7D0)5ru0)5ru0)5ru0)5ru0)5ru0)6{FU}|xJzG`uSzG`uSzG`uSzG`uSz -G88azG88azG88azJ0G~sKo`2s*eSZs*eSZ_N@S)sgDIliH}8&ij75%ijCEn1Qz_Tr#==KpgtDDykHgG -Y{43j*@BOX_*n0+0csvOn28nDn!8l>ui%+JTt}rn`?2CxB|z$!q(JJBbb!<m2|((2L?CrIG9Yy{x<Kk -+<UqR3Zu&El+dk;oKIq#%Sg?ICuzfJJeNebQ5Z4NQAf^@iKs+n-fml}P197a-2Vz*E55%uRABbIrJ`l -GGeIRBP`=Dq0pl|zN!S=zx_QBBhLE-v9Tq^W|m{jNk@u<)TVo{+F#GyhTh(U!u5Pu4NAodjcK-?+xft -XY5gP!e!zU_kr+Xn;N2SeKjh3SJYFCUv3N{2%+sy?g(s)P37HlR9cAMOIG!}j3;pvIZ2(`$9aJ}v^PL --ye@pgLwB?g6TU_Td?zI%*$}0jk6H@c^JYZXXW<sss1&5TH789}fenL-%15P#wDuFJ>WeratZiB!Suj -R0rzgen1kaM}X=C`|t!%9j^~}07<-l1SIjg4@lzm5KtYj4^IKr@%r!_P#v!iF9Aus*o-<}|I4T9c>V8 -nKy|!6g6zqhWJ`QTB|f8)#*y9AYjuP^9s$%i;A?u#=S$LfA>;I#Pn5(bO5zhG@rjc7L`i(2BtB76pD3 -wMlyqLA%&aN>i+ZL{&k0fLlPL8`l=>t}eG;W}f|&a3X`YHVz2?&<Z7jiu!;a@`XHI8yJOP_;!ku381n -kUdd&e`cGq3HQave{(j;CChlk35AE%-q>%;~$}iPU^y&-9w7Ntn~s!P6wn>FVHV66SPu@WX0oyuERH& -5x(e7h+GZ`SCP*el}kPJH6(|(>SM(qo;H9>yPMJ9sRHx8;9#ouleybdU8ik?&!&#`SCRK9M3$*n=dk* -Uh^E!{9u{+!7}q%kj=@0%x6L7ml~N*hRiQDvc~zl(`$Z>(R`inaM<;$_O8!~uFr|CU$u9AYIObLz3Uh -6U7tK%pFCZkJl#3tRM$@lU7tK%pFCZkJYAnWxlf+lCr|E^C-<xN+~-j4b13&Yl=~dY{i;3psg(Ov%6% -&3bLN$vXL--Fyyscoo7tPrEd2b7cBYT{4Cwg`==luj`3&g!4Cu|tfS%8Qp3i`u&w!rKfS%8QzR!TZ&w -#$qfWFUwzR!TZ&w#$qfWFUwzR!TZ&w#$qfWFUw=4*F`!=mwG>glz{i>Zq_Z)z`EN#pa1Ryyatydl^Wt -=^pbdW|WnX!RQ}?4Dkmb6@kt-bHKBSnEx%&AD&bys!OPwMsvCW9zQ~C10U7q4X=15bAt|QbOS?)FBkV -LV-~B6^ewqU!jap{uSyH>V1WBLXE{^(f+I?eYt(lFMbZJ?!7&KN38C?J-;MY_urmh5vx0J&)*ZPdvMP -`5Uaaz&p#5Y`*6>%iPfFB=bwnxy}0L}iPhb>=U<5RYwTZ%E!5a=hz)A&--r!s?B9tMHTGLziNx<eh)M -i@M@-`P4Kaz|x5OlVzb7W~`vWnF-yexd{Qi@e#P7d|N&NmqtR7pp_n!Y|d+!C{^#J=zAoYCsJ0SIR_{ -(1blH-&91gJUAwMCZt1rT%W!4xsa9!wE)?7<W<#~w@(bL_zsF~=TE5p(Rp6fwshOc8VJ!4xsa9!wE)? -7<W<#~w@(bL_zsF~=TE5p(Q8(Uv;r{{Ui+J(wbMjy;%JI{H`eOdmEUBTNx<GQt!wCnHP|b27pdF()HT -5py!a6fq|wOp!W-zh)Ea82*Nk{9!%#Dq`F>-vFw^_}ky|6YD_!5xEhXE0nhAE5E_*Qcn6Cv@JH*N$qU -Tr^_zySD<{}T(-3HIg|2d|9JMkM7+7}eXq9n9S2<Va(n;g^dI0v;4NSc38qNIV5*MdtHfa{?|lcX{+@ -E_1hAUp+Xs#St69GDlF!vVFK=D}Rx^FPz6vap=Qe<K<@;^|tNC7CS^-v5XLRs7u$nv7#mm5I&X-3|0; -@@1zU6PPSzjLJbA^20!&yxJ5~^Ih2CR<XXlp;PI)0<`KLD%aH-3!%6bq_cWm_bEr(Xc8<5#^t53G(~b -?gGLI)2qjVs-p>p6><L6YMCkI)1zRjscVSJzE1dkk7maOyakMoD|!tI)QwU1;Tg>{V7X?>gYLO62G;5 -!0PyoHeLdg_?=z^R>!Y;iT;$uLbZ(kl;uLT%+Kr!&(JTjWGIh523E(fy!aGYb0ke<BA+e;tL3{~2qrS -2Pw$wLqIpL$bH~dQ%{x-Pqr5-oGdg<5X#b1m9bu-WN6$6yh%=vY^}FUB*-Sf*Uu)jco%xmvb3P+)_M- -fOQTY}lzF1r3(gR>k2_l^%L8M9JbxcJ%M}kPx#$hzmYgzNYrl?+|-8r8(N76{=NE+!v!}Xb7YtGT>LX -&~%aL(ry&EMOZ(=VOoOT&szXXd_{1*U(I&-Af5U-_BX_{yT;hZJ94;mP}&T^#28gfDMI!+o7O_jQ_~2 -y@nMU*5EY`#u*_&E6O1{N67|S>nE?TU*3ARQYm{%j|vGoZtK9Z*%m%>B6mXU()+>(8$bvz2@g7{V#u; -`nR*!8vU2_yKVM!Qgmg>xbyrCu(n{&fz<=v&WnA(>Y;A3a_|N~S;f6s0alN1J8$m;i-NrZCabu;`+?P -?S-I~eFquX6Uj`<#$bofWeZiK1)vJK*v)=<7NXJ}aV`Ld{=p?X0u=BH+EW^t~H-X8(d*~UkL>hB`8KB -HoXI}u5b-*F?jIP5E<44Fke6n)kI6w*E;qQP+2oLiY%0lkd31AY!!*_v62oG-ot3x>1IPwEPS&1LvgA -&5U1HkGKZlA+v&aA}2ZCQzzM-Ky&oz%=K=o6L-hS1AOeEa+bU=qROM}S4ajslYa9!HR5C0-r}?PVoio -;U<d0(gSIT>^Llgwd7wNw!nsck&D{iQma9z$67vZq8z|5-(3;5S5j9dGaS<9m$B>V5lsqNBbTElRzvT -115o30?}kiJz2T83Q!`k^dm5d#L^>R5{c7@l8A97M?;b0%F~!$M35`bECQ2AoVh)V$y&ZVi<w7O@#VR -vz$BB-p9UtGbm1H@84E9<KV`LEUOWg)f^-oxkF3ATi-?2hY~@9;P?WavJIsP2wUx^kfk})mA$}sZmCI -kVY-UAi-{<q`aS7vPB%26w<>e={m~JK(F$n2qVik)7DU>UJI0a0?_yfOB!nlHIOO7lkzsIa4XBLzz7= -Wd$u3SON$f*V84dlJl*G;aU!$>Lz7nG~~LW%JzMtnKCpuC9~OUd1=cJ>LA0NzACN$p*E3z!^VFu8sON -h(!%lj~RS0F)4}qif_0gYx!OU=qUHSe3{r2IcxCU=qTOHDIz=z6z=}HW{C;Np{}Fs3n4OdG{?aS#Vrm -=YtZS2Ut`{fnNE5KTN{&039MFdgTKQBbi3$E<RMM^vVaA&EzzK@*z0Z-11DXNmL$!KT@c-{XMo9QmI! -y!VW@?A}AjrVp6hKZtevp(RqvkK#KMz*PkIFrEIU<LUiOng6V_cmK5-nTWqO>ZVNMjRPvQuuYt+X`0P -3`iQF^vwiNSiuRH)IdG!oy8!6{2pCieop0DJ_QVROY7aPDteY(ze%FuY@FnU`~F4(@#j*+49CDu|>-B --RuE=YM_`4US8sqZUaVGSk)ev><=&d!2j{*<pU5=f2T<i-ii8dAzPUPMwzEnoQ>-6j=#+pCyOrDSiid -JL;DDcYN?9l_KfWqaitexsz*8xU9u_qJEDWRi0U%D4PJiN#MyQ8}5Q{0W-@IhvsS30qk?o1of{9+is0 -?VH%NNXg*#O>CW|X0Y0iy}F!FFu8G+plIj^5GJV&tPWv<kmA7V5VpWl9atU0f=J2(o6q$G<Bt~)>o7l -aK`^XOq*AcrHeN~vtHT(9q*kyxf<1&33sy()eNru09YOL+xnQ-3^}f^#R*P6=NWoxr^s8q!vmUlDCHn -NZg!mY;TdE4H<DiC=6;>zNTuIU!cM(UaEUZpo6qeG$>No~WsV%HdVq}-&yQ@<egyr0WY6&rxgAXP*9` -M&okWXVYk+Tn~B}fEv_(63FQ;D2@uzed-tQ>z(o#As5<TDtc<@|%{>@{E#!82HZ%LxeE8(7xL5eU@<$ -cb_WLUn=9)d8HW?!^=&$9Y%ZVVITkysN7i^W{MA>N2zwIYwdoE_SVQN<wu7TRk}^VVmn>IVoZLM=(at -N+=Iw7M0Ty%EQpG<h+Dx87n<GF`>GGp<B*O81KIatPbGL5`Md!n@}xd`jL|ps%4BOa&|(sjP;tFo={! -Gs3+$qRM((L$O#IQ)g`2-9HOv&55bjV6sjLE<jX+{)%VCiIZC0rjv&cl3e^ohCoaM28T7WCs8HR&93y -8cR4Wj;<Wz;~CI(SCS7G};Qddq^sBS?!k+T)5HDr>Uu28LGCoAVGRCh3j$_WdT)hql^Nx>gM898QQ`y -n=Ga?nC`7j%-N7AC7VupN}s7OH#bH92o#`w=1`CoWX?F#F1x3)Ou@Nlsm;?t^M_?m~4RT6m$0)jL=N% -Ha!>>rWum$oUJC)gSql62!(&l+EAjW6Y9r4ny@AyJ0zrq1t3qWwrB&v5+7>nN{j?G3%-)Z-Ge+x1Ir$ -G~C(;Ok%jT0Zd}J^&FVQ@aZ97;`FRO`5vIGWu80%CTaNm0We9!7x#h5-tWmKFiFE#$AL)zUmXFa1L>< -X040LYUI3E_zClCVnuc%CGvd}wR^OfiC^7u$Ffggw*^AbQTQ}OvFBFSm?^R&3X?zMEidi?>cMO<R?d< -!y;?xy#X5Y2+>G5112aUC`4%2fke%@r|{4IcWm`8`eRq^vCH;=9YtiwDyybO$m7t?EE<c$_@1Cx@v#V -ue`l6CYnFqtQBURnew(LJ^om_+y31z?h)H<#HO8D?*;oChfJJ^2!t1n(45O^fYc-UZf|=MX#b^0r@M3 -=+R?bOz}we%<H{LMMLR=*%Nv5~j1@idN2@1Mj7BZu>QINqoN1`J2FkboRri0HZvJ0YB9!Jw6LiqIBUQ -uo)HY2Y`}em%v0Z`X)EuUI)0KAOa;;-{jW5g8*eo^V4f!brg5@g8Sn2jjm!M5wCA@>i}j1G5e<AV}O! -ww+>zg*in!lEBUsJkyh&RM$71O@%u*Cz$)?kb~v(&-#3CWm5blEvk$X{_<cM3F|v0wP^Yf}lytj}=}F -wY(T!OVA{RGrv`S2Bj1FM*4H~CQYXD`=yM<p7G)z~n0F;Egbrl&dhTdpx37E`!>pudMTJeKexQL-Q+Q -1kse%@#Uu@^sYw86GWw%xjgqzM|tJL>@FOk3jC?JVvGrkQjfKU>VY(F4#-%(~HoqrjvHY!MBN8lT7LF -LCQen;7%Nt=l=a0!(sj6BDzzcB4&DP+Ysw6ShT$!&`6p>t)HY#SfKY@Do^$i=#JshAB-Pz0q@oNgTb= -3y@kIy`2*nD8<m5tZ~UAj^1SLC|V;YaO|AKI4RcNWbHUXiQyZpAjI37tewD&C+6PhEfzFl?u~xpht@$ -H?`7Xe5ZBIOs1S2+vUVO(6nAgD4|EfAZ?blgy;{hFU+3nT6|#NT)AaGKZXr%$E)fTCX9-;-4&Zn{W<7 -BL#|IAplR%%wJR=U^_#nci4&WUuF}oV)?=b>&)pq)xPwGzo)H#5vh@Qf#PfS4CXStYw<3+4b!~`6_#k -?*i;LaHgj$#6ik755P9^m*G`cyo?@i9!na?nS44C@cI2VpMcVh@fR&q)lAy#XeQ=yA-zY8|fK#T+Eo; -rKX~^x_<jPw)pyuAW53iE}tUh5es6hvO4`P6Bv}Kd=tqcnLfd=Wu*xR@TkMIUJt^3&lAcqdG4a=Wx7) -wU9W6<0X(+ox?S56M8z_qF^8w>u|ERi7`RE!=3YdP(pYPd=l?)d=7jP?{It`D>Ly9C+m&Akr-aUHc8C -G$=Yk|AH_Y~xd1|md$@A}dlqpICu?u<6U9E9tRKKyL;S;?3+OlT5673Wg%ba8d>J7Yb8vhaR1|Y?d>J -a8n1kah#3Y7SuzwP7aJ-D=ym*7-t2cm28eYSmM7+WAGUh$;2FKUfXOf2BV=2`*1Y~+mEWz;)h^knE;} -wkaVhQeihqj9)IKGYvT`a-zbqp_J2~O4-IPnC>s~AJX6CAH%Vi8Yp=Mtts@dU@KSnG%<xPA5&FipN2P -$tC_oUGr%P%oz7&J|4aVhZkD#Trpe!SNk*shEP}A2FJXDLB55Q9?|?@godpVhT>yAA^753XUIxf8q*` -H^CWo1)o6K5m#_b)m>b{$@*(-3dI(jtgK+gA->@F8CD143yz;+(iLBD{0yp(`hqKDoA`p`R}lQf7aYH -at|PwS<o0(MBgGh;f{3s<gS)7b$;BDmJ@9o@o>?H<S4(|*ypHqkL9DyPJDl8JMhb{|xO)(R7V~g-k-b -m{diOYTT+GAW<ClQdVctE8P>OlDyM%#C%){N&$N=#UC$}G9a1irw_ab;D=Hbp7K2*%Z-HTv(p;2ZEh< -UiPjxj~d!`-Xca)^0YKE+l=%){Mf48>v|PBy6Yt9!Vyh^?NuhdUeKg_wss8(4aYcewilMmY5jH%?<16 -Yp^64u7HqapNqOP+}hLuFM9pCkEl}$_6kA)W*f903{t)Zvd+UwR3k9nB>|`exU?vZ5^1T+WLNAl4|R3 -fk~JioB}38>c-uN03}X$&jOQNd$bpr<l5#NU@|LivN19%Zr%e{r`qloIz|n`I|uNgVi4|ZJ_ja3&Ygp -Y0Lr|0XOW*OTZ=o`sP@Dn+<o~9nEXlR)<s|v#8)qX$#{tZ*q-=*yRZ2xB!;h-fJqErvn>+C*Zd8VYIi -On_>Di99k$w^Q|xbMuN5<YAUvI@e*f(^o%pL?eEW-^{q@hj{rzwM_3!t5Mn2D7tvx^g{GY%4^56FCf0 -Nn&rnCR;%>Fmb{x{D4H=F%$clN(In!#qFU2Qb1jh401v^Lt-M&sIOT^r47qkRe5m$2W^z69+{(7puiO -VGXq?Mu+U1no=Fz7*|C8CbM0Mf*~;FGc%Ov@b>bQnasw_I1#{4%*it^U%Hy+Sft*I%r=9?dza@0qqND -UqJf;+83A_XkS440@@eQzJT^cv@fE45$%g;Uqt&Na~JK4XkSG8BHEXseHq&KX~p~(KmUvW2T)4`1QY- -O00;n48F5VWnInLL3IG6`Bme*)0001RX>c!Jc4cm4Z*nheZ)0m_X>4ULUtei%X>?y-E^v9pT5XTpI1c -{qUm>KJi!+zF-NhcT7;K8|URz**-J;hQ?1ye)D7G?D$F@>Qo=pDzk(6Z1d7Jb)hc$|su|!cM^^hXzK4 -G)V87ovNo0}`v+U4wL97&SVXp~f{xLwLhWa}-Pv9}esOQq|XY)Y{f@T0Memv_=Ay=6$paDmB^<em81N --Yd~yR|FTuphI3v9_s%F>I?^#@Fj=3xhvprCctP-(eMO&!l0cY6OD?oUMhP*_9T&WD9O!N;bygn_BwW -wN?dkq-ognqv1E=DoLI{e@=q1IYZ8`L9ldeR4q`%@r35B-d-hHmN9&gIO7G0oK9$1+!tbP*^3GV*diN -I_6ycpg6cibDI0@;6;Uzn)@0+D5edS9_B5A*H-G&#wrn9hx4@+`VsGJ%vP3mb!e6ACn<bs3$sHTe>Vs -}YXPQilN^pbPo@K5hJYRE=iwHK-u4ulK@*y!!vOG(uC+ylHX4Ea;GOHZD-N-_)rB*ewE5Qt}1#>V0xs -Hf>004f24=dH)tXQMKL)yj)jr-lgflirG1Z6leI4{69ZeF*Qm22<=D{El_o70-UB7jKM7=SJc^Ga)_! -QBAXf)y19goD>H1?p%IC!{7?e9%5e*6^yLebKoNti)%4aNzKwaT|Hp117=EJg(VFRiz>0669iLJ<5R- -zObcxLt*grycWR7sHR)`k*s$@2WQ@gwQ!7RcSH=^a06#&gD(x1yixWKQadL0%NMPsb&D<OS+rVXtaCP -b>J35>G9jep`LeaG7J1HOy;d5+;=-t^wIX-#N#e(sZBtmKDia1&_m{!FZFqBgfy!ZE!*v6%CP|*KKb5 -|9IDY%;?az!iC5YS1=;cmmgZ9BV*)d_YDqD!-iCmImD{i>8I_(IiY~;1f-PmYyMds=#vf(^9=HAo?8a -TQ~=H_9m8)5SXJac~&N0J4C!7lyW8<<LxJO^xm$>;3Tn81S(wDX4W@&Q~?wH99oSRYSgIE;JfB4va~d -<Cq8MfBo;v&%s?6sO!28~<@zN*xcp|IhEzihg8o|K9-lNa#>F{+uL<^8*qj?IMM@8sZOs|8_c1WG<|9 -w;sN@z^A!{mBhRo_4ie`S4_W#Ee1Q&KoGLCd`dr03n|Fixt0deNlpY{5%t;{4COu+cTwgc9lE{u^uWP -y)4>BK?RfT@yu-~(wpoeB-8KaP3avzO&X7w=OkP?8`AG?vRRiRZt4Kw83tkK7sNzM~Ri=~Ze1!&(Kcv -$8J}M8x8}k_ro(~=a<$({#KG^LMr0<>bkm&A$!O%T8hGW;wIfi$eJ%Z#>06E(o%yED4>Dt-;5N-dR9? -^xqG~#*KBX|>JM(otQ6ezk+jbO43xAQqr>h|50KN91cv~V%|d$n+QLu_H8f@yh|Ts)|cli*SG$=|QI7 -A2x6Rf{j8uwEI6IgpLWM%p}2ji{DWSZG&%79SkUa18EE{FQX;LIUiTSr>!mZ$Qy#c@PJm7l)%XK9}rz -8CXz`UP~})$x;A2ahyUzBQ1ho++pm|TM9HGi(iT8c8u_{$NM>ZHpSJ4ZVhrRyW$p(vDt#=g=$Iz*1cX -v+&gL?r^Wr6N>|LPLf}IcjFmo}7LdcxsYYC)uzgI_U*;(5fk+8SV=YR_t$?anF5_LJ9YX%So6N>1(qZ -kohBBmvoD3XyB*P2T(9E<8!q8~apM0nW@#K%3^}E9n2%qbL#8JXM-Sy>16*|w6QhS^q5&Pc?XzmFB{0 -4Al+BIg=hXo<m=*z%PJ^{IXL$ib3?;|I>gxBKHWQeNsem^bN2bA@~jefZ>SL{MRAF&HYG+CaL$?_cj! -dyDfr@iw}26rsQktnA0k#XmqT89>pS&Kq0W#Q8xB!Gf9C~_nUO?`?X$~m?H&WbTRjR2A~ZUmf17wt@C -_vEncTL=MZSnjMf$vQ=x-3AARJLUxZIaG3F*$hfQ{O!ouKiP<=c20PujP(VMtNXC534`g*E^Apj{y+n -NN7HiIDb|}0AA6`i^QBv~9v|#-xLThs5^S{fZM&Z+3<|C*3CJy#uk7x?)3N=x!wBm=jIU6iLjIyvOCg -loVdYILK|avN6^Kv~(%5K<MdK>9lc9uUgkY}G?Bbq4?%4c;J-c7}r(fmzWyg8+rvWvZ9}MT`N7CT|Px -^TG1hN77wH1sOVv+#o29cXDFv`ab1D{Gysi9D}#zs5<hS*hVEC+kzBD#}jGncb&Bm&TG;8H8U@Io{pr -bZl4EQ2hTl`Je=t&I=DU|7?IV3!-i-HHP<nujCZR|aRMB#29zk=p}|Vr}506<p*SEp4b6!i5Ea(hL{U -J`HXWv7pUDjyQ!FQVCkMP`+Q+2|o~dV33AamFw9+L~<qzxiy|my9Q9Z;EHZB^fJdZ-$BC{C7aYkVo<T -4d`1`M!escPkH^8g&*!r9^br0&77#-IX9nb-{Vg)tiBuugnTOEcUtoRf^Tc)iK|qQHX}Ck6rf3uA7XO -FbN9MfFeW80g0iuf*FD@5$F{`DBdAL%3L=hL@N4F&7X#s2SKqyftJ!9;n5zDqhS$QNLMS5Q*cXiDp=V -fPQDj4d{%U2@DJPWsjB!?tgR{2U)c)1r9MB`dPe7WTM2L8Uhyxo+>iy3;X8UB%uu6@rItMLotd#Leus -PKIZVs~*1xg9El%nwNU5^N$0>Qemab^+}yEUTdYspdaAN5Z>UQtO4Yg`{@z?bcl%(vAUe4TLx9if>kk -GVquccCKB_14Dtk2xE<B2KgM`560@Y!0L-YOD$+@mTV+cLl6@gH?BNi(1l%NB2v-^4rv3U!nQ87@>^j -DMu0RjAi3y9;jNF7V4GaQKjR`Uodq%RU14l+fZk0ZQe6M(*=Mwaj&Sk>8KLB;3E7F?DH&=p4PhM?cGS -oO!VU5I;p%hPsuB(HpRoCy{op&~mf>0VJK@`>QAnUhpMej3o{G>4cu9vy@tBIcz3Cw=fhWBNv(cx~U~ -$L??jUV(4XOnkKH#jxE4&7{%7v_?-TK1nrAxJ1gMed=*x)x>Jn(A=ziIf=fP#ciWZic!ViC}pRY1}~H -GBz(y`7e2fn!V_+ahwKm?VoOfK=|_wxeU7d(gOp*7@IRU6SMh^VUf74fY+-A2INNCL2f*n|MI>Z8jc$ -jrd!Q>_mBFE1Rz%ig>`xL!xXbNNngK;kQ}Zr#-#`-Y<DU{+FUqnuDbw`H{tniH0vQxyPlh@-7_(8r~m -;xAF^p)8cg;;@XS~i7Qu5;L1*iFdve%RM8h6UQMo;Z(X^&g*qT1VGoTS|Gz6bRe$wrji26e{ZzNj(|U -_n^tjjYSyaZMAsj)PW!Yp{oMF#%aFj?*8mFjjMEz^`0X5rbzBX<?iFd(qJlp6j=q4C$>3ano{)eaIe^ -2(79B2>W)3to#$HNUJ+!JO%?CX|&4zy$64BBDr6^)@yHUrqf4H!PZDuXzNP#iwC9uM}I2;^1enxmaN& -S`8A<&(a?J`vi8U44KZj15Ctl7w@J{=Y}^Ur<W}1QY-O00;n48F5T2-ts3R0{{SA3IG5k0001RX>c!J -c4cm4Z*nheZ)0m_X>4ULY-w(5Y;R+0W@&6?E^v93R?BYNFc7@!D;6q(NT{nOIR>zc7HEI~c^n#`M}f9 -hHW5m6NUDzizDrV)t(TqXVw&O(XJ=<g<w_Qirg>#5g=q@B*h*!9EwvPt!PNf`f_mQY0-LeaL6F<<q=| -|i<m&Yo(>Mb=x?@~mHiIW=?B9C$xVL}&iWh>Dm6-+5eSQjsEZh62I0%B3U|PciFJB!n;kJ9lw=OyiLp -uX(wL)5IBrwQn9aNf^YhXqed<9!2x2Vh>WDbJRqMJAgT>N6O0AT^<-EA(lEYJd7#vfca1GBO8F`M5pK -?ECqexnR?BKcNvg^@;)&zz{F!u&~=O*Zy1YJb}ihNzb=B&kaNR$*GQf}{?2%P>w>LTZfSHUQsOxHWM9 -{97rhx<HC?jYlPl!rc8@)mB8^AYAAWE}*|z930qr(j-GO;`w2yp_B$}LVzTJ2ddv5D3)1j=V}c1{wRY -9JXU7y`~t4JnYEB#TV4msyN&h3i>k02^o8d34!2I8!G@{K8N^D$P10FED2ywPPMo2J^>H)SGO4vk+~w -=5^!#U}N}ifEndil23BFDVz$4o)5q5a_4<VD)Qs6h?y5+|JqqMv<iA)r=VP-%vrs>qJ8pKi!n(#T?4E -fdaZ4jj5YhE(pRojY+deBZ&#qMieGY3NC|Kg>>39Pl0&WCH6jIK~fCsjFkWnDH!@0p0GowdAW<eIlH= -xF2_1J-^e6E?0JCtx3vzA8uk5l_Y(Z9nk&K$W(m>mxM^>jCT-H}(XyC!#-g!jn+LC-j=-Qu$-yli@Do -Ei;?xRHv)gJU+qBy%2>L+7^cSN$~#vJioIHU9q)5+(zdPr0;NjMXdl=$#t*MM>FiVx31{+!pwEJYm$@ -gP`5&Rt0)vm7oxM+(LG{&n7FzmxlX-IQ9O1fv^RC5tqp8-9n%R#4NnfYZxVdx+UTLpC${rn1I>1#{!C -bslooWkhXN;d{zyyp)*Kzet!M{Dda`+SNAnuRNm=2LsMjW-qJ9aib;d4|lR{1fojKaw*?YuyNuGOkOh -){2I_ch5$)v{r0Z>Z=1QY-O00;n48F5S@CcJ)g0{{RR3;+Nn0001RX>c!Jc4cm4Z*nheZ)0m_X>4ULZ -EIv{a%^v7Yi4O|WiD`erB>f-+b|G*_g`_igxV~4?Q0>0ZL~00w?X?b7{e&BylAndRFc=`zu%o?D{*XR -3)4#^=kB{--<?!yRYRVajcqi~a}f1bX$x#=RMl9X`|}(M@mm<7WE8a$R@A)PE7R@FE^N8hQbkco2C@z -}`J`5x_ssA)(C(gziWhVEtSlYd?Zb`^Ug8POsK(AC=&yH`=B(Ixtu%_FRmF^fhfN{0Lq_0WEWL5+aU9 -bZDDgj7?qG!wR>+^gFg(pyR_R@aLQc5gCFVs)Ve>pOyej9gWp+IWyC%!LSUl+l!?51L#b+fuJFTs-zr -DSMiVQD~{JS)&=H$&~dXDgc5BIFX@J6k6!DlC<2m$OtE?}P}VMz&u>E#IEYsFR^K{zy0JU84+OID+bw -CVs$*esj~EAtAulU*QnGIA*UrG#`2W)yr*aD$ppu6Sm$nVFdwX5c~A%2=}S?-;%1F#a20D~c4UNoQgc -TRk_J!nO<(ylFpUX1bjy_ge!}Ss)eQSoqdY|8IccvdHOMi{buH_T`<xW3mX}Z{g~u7k7Ys6a0!M012$ -G{K5pqbCq51T}0<cg=+SiT!rMoTe!YT_m*DP#4_r;zOvQ3n?aqBSv57#5v$UEV6Q8_weaQfPHUxyAUM -R(E1YT>N@5?CDoMXz{}{+&4p206GY=LEKm4-0yKf&KpN6QkF1iusx}6u<s1)LM9l~FQu_ih0p>!O6%m -mFm<in)A=6DInDL+n;rsWtCr(?>rR|il7o(()=0$F}=4<vEBafG4SZB^G;@tLg}`#D=G4Q_OtsqR}GE -0azt4rzY8F5nTTdg$jhGj6DoW7Bn_<ulW}1rr>DZc_J(etuwo4b4^DRGe=Us=`ocI_?Yjpqi?Xm)76D -JcR4&Kvx_n{G^eL%&2iP?pfjA4@q3QU*bZG>hFS+oj>ZM+HyH)u{p#q%Q($el`@BuH2CBDCJcJbD|Fr -u`h)gF;#1=|bYXH|p5&;1eQe=9)YX&}Lp{gp!>bnlym1lC`8QW*u4*4+OKda(b%SHVG8$}TCFEvk>rh -75W3xEqY@d*$toh`QhBb<lv)UoyY?y#bjw?W8Z0!0tna2a0OXS?fp^cRMwB!A1Pz$tgDAKD?V<c&#S6 -y3zQ_m@A{XWthFU%iMO9KQH0000808trnOdvdREgA>_0Lm8t03!eZ0B~t=FJE?LZe(wAFKlmPYi4O|W -iN1PWNdF^Yi4O|WiD`erC953<G2<6Z}cGu2ZPvMN6BWl#Wrn%X0k~eAe#&lx4Q)j$h1Vo#7Lr-q~dtd -AM+0V+de>FqmMFA(sK?;U2Hj-=?DQLQ#>Ef{lYzV@aqGXs8p7ZC#<sB!FRYa80@j7OmmgI&txv5<$AC -OOBZUn*79*-*?<4Tj*pJM`}pCX@b7o*tti=*EK9Lwf0&E%tL54*RQX4E&1f}}X~e5D0+}wPVepq}A(& -B_U2!c=*jiPr;A`Mzxt_2BILhEZFVjP%St^aya$Z@%ERwI3eh*MpnF<Xnuqt$6n9AtKJ35^`cx-m1U? -aB@)^21XN+TxhNoa!$$4qHJ$~hn~ZrHM#=h7@h%I51=z#^c#RSZ@&FYTI%=cN|L04Z=Ri)AiF8nFi<2 -nY4ZZmusbZyzqBcMn$w$1Fq1gyk|f(O@tf4%v-YIGc+Ff0C+lK%x+(1>7ge*<VWe%-&spPk=zj-~rOX -Ak(T~ahz4Q(jtzLP-)Bf+^8HB7rWnsfnOI|mn!^FCcIf$2#*y7h!L{&mZRFvb1itf#s!g1h~F#VAK!1 -44a@NQ1MQg*d#wi-r*MR-?07Kv)gZ~aF(?ip0Z@I`_#}wdXr-+Su+@e#K!->%1!be-I*m)*Rw`Za+%1 -&6XpGBkaI4vp+r`YO^PK4SO^pmrS%R5L#4->mu#(GCkiUs%I|<+669FLfQmX{KfdRw_aK^zo!@6B?Fi -!GwB{lG4J=0!>v$HcN!)Zr1`$iQ48QLFz&Ngxnd`U$H9s+#YI35|1XA_2EPvCeot4L3;c#dYa&P1oTs -tks}hmrydS;4SWmHU>NYUy0ZgD|xenj&NZ@y&R?;%kG>o`@C_orG4T@C~F~KSuSY;0jSM&s|o>H5KlO -s#5-3i5QIy%AqBsYSe(|#UKqqwnRjK`;)LP^wInn3AXK0QOBoIx8Yq22)(j~j*%8$kZM%(Fm9NTCeA5 -j`nZ@1W0}mF!@-r4N^5Zce9aajPrb8*XWH6`p9692#h7m>ebO%R3`x~&VDyNi46z-#{rz&pydX&+06t -X|;?Reo7c0a@i>G_y!LZqEsw**@1(Xd6jIx5;WFg3(YVxuw=8)HoRTyNl?C2vJydX7++1O`{l?YYwC@ -gx-n4NmJsvW7N4<FXvU3UZ%D(2j6+zfwwE&$j%adud6f^|l7X<!#GF`;AK$!dgJ+li_`*QK&hR_c_~m -A)Zz%tFwFH`I7|HH3nKFoEGq8t`9h2vMdnu6YdlK5F7~2OjD-te>%?la5=~kYCk&H7u_ds2cQ-E|Jyi -?gDMr5^5nvr&WEi**Wz&5lhSN9xh3>kgH&28xjP9^@s{8x&^&NmzO_XKTNlG<FnVqYJz6QMkJ#$8Zq_ -*UxS%UF2oYb&0N~37sIR3YZp`&bku+3|Eu}Uhy1Nw#z#Z{0*#QgkN}uf!O4a%LTx`opJhSWZ_JRr`Aq -U1W^6y`wVxtjr_UJ;-%!WO-6C^2;q&=>l|wQpS$_1Ip$^&CM;QM{(bwBpyQOT*=i0W>(D@x2ja*SU&F -|v0AKB&1c5%%G)a|}faPL0#WjuWDMWLQHvmWrKH^{oVugjv(gS~YkRl+HBq4KS+tHozKTjBQ2a?sU*( -`wxS2Y*4r+E@BC+5vCZ&|Ubhs}A_NZ?~a=b=iH*3bErTO^S`Fh{Fjlwk30Lg!jZtp9SCIS1LFj>yzyW -;!0abk?SYGkg!LuP(U<J2L*&$zyUAzD6fk(X!m>Frp*73X=gKV+{5OYbuAL5)24lJ1H{JA;baCXj8Wf -0(B`TTS|(i}Y<gjA=m6FzH88v0Xx|cE`WlYHPy_@ohw%fwTsG>%ot!=KToSL7z|?Gpsbn^5@g4Muz5O -X=8aKqW%coZqe23<~?C5R6_O%~0e8IfFqk`F@h9S>w=%kN5=zmZpzG$E%SATwB$I&<7!3kAG_^W4K)Y -st?*N3_)TOchs*8>xyMFlM<=*56zY>r+s1!c)hLT4z;4*B`R#r5@pC=-QtN<|`JZk#|t%5$}HV<SwHV -nx$mvf!F0R_JI4Gw-x|)V%Ps9vZDBj9E}uhNT{+wH5Bja`5AME;=9}G<^gC;P3<${Cg%N5l!5Z$B~aP -<U&{WY&GxDLw5vi<dP>aD?tt=W&a{HgxUn}20&I3^aG?a4>N3__tKKP@idia7MP`R&1`qnH7RN6H24j -5$+$EcM|hL7Z1sa%ZJP5#S=td&G#kBl{gvmH*l@6plePRcN^)gHXw7{Hz&D>1dYi!=IpIg#TTA;|E(j -xJi2wF&z{d~&0*a3x{$1Y*Y*eWl1(ON!h<VdTh&z&eoUTCH7ZE){jo}(+Ie#>u(-90Xck#vj<@uETgV -B%6pDu2~`;Yf`w>N(qH*^Jr0gxT3-+ue;przJ0Lkj^-Pcmo@oHQWgHnk(o(hhM332lG1?=AJknPG46g -&E-svH`nNy2cRC951aVn5q-4(4ctB=+E`@>G5wSHUEdSD?%r&Lzp7m-!ai$N$WUs!t6=`SMo{FeQDsx -JA;d+*5ukYMMU0({lwo(Y#d;@`@N1IUqt(>?anfa+j|1VcLG~C5JZ4B=dI=slOJ{lc-7SD9oVw6hE*X -8)hMYjbf;!4w6k;twGtse`fBOYSSX)#PUs9<=?2c|iKtG#0=+t=bal|KhP%ec9b@C|-R14{h0M0yfm3 -%l_#aS90|XQR000O8Q5kVeyM^$*2?YQEf)xM&CIA2caA|NaUv_0~WN&gWY;R+0W@&6?FLQBhX>?_5Z) -0m_X>4UKaCz-mOK;pZ5WeeI5DE-St*YA1E$G_lE2qRon*c#k6arV8^%ADUHA#8B|Gq<tlBmbN93Ofp0 -V7;-o*(BMl37Vnk}O-*x|Wb-gq0g1HK9u-c&#C8ekY`0PfRgU1%Z>$tb}$hR1j#ndlwKKb;WW~KmgA< -Y&5x}CHy9(kb_mSAWF+1SQ+<e>-B@kAAY6^5^^WB`2mHUe%zTKiCzDUenpKD{lq2EV%LZTL6CE*6#4Y -W2d2S%e9t&Ut;M+U9{viYsL(UjU_`%L;#xsCO0nub4FfBsLFr<NA>N4!nok9+5G7VIon?^%zDmf3>UB -c&+C%}x;<KzVZrwz;Fq+P%^&5uW{O0DyIz;=UU@w&@VTH5H_$+BJiuaUbva^0$DAI#@bSd;kj96-7$c -#4(#O+};To@^!&|?i*h1)+?@s{GC(_*VphN;^JrtC)aXj*Akg-~vc^TArSGHJA%*ovg(gEI3d9taDS= -3FR<P;0VMSDaN3QDbYkS^#ey&4e(Y$-+hDCEcW<9yyA?9U_>Es)Af2=?q&MiS}bO>%c=ZH#$QrX<kbu -q?dok*-k5kXULKFQJ7;rAW1Y`;+~sLR^dRjA7Qk21^@cOd7?63QyIPeAx;iy_?6@7>{W@wJ|ow3TC{% -O08$-ur`+p7?bu+$=rxfz!{rHlqAZynl~3C*H9RvtSZO|`67Ct+os7D2O6IF0?mG?5A8RJT5p+*aai2 -|5xfwF3n<`QXZFyreYm#xRea=;pnQzX9UH9_aV~<uv_x*-k4MFQne%r+r>@hec^_DV|&sBQuZHuS$<6 -`Wt)i|(?PNcQ*J-NQ}XksaGh%24wc5RB-wE0mdT3KkU0j4r;&!Z@QH!0UQ<|rf0dP>mJj%d*|cdV0%c -oRWSNLDGpN@JB%+RMjoAeo|$eu>Yky=3xrpD3^4G%vRaxsAi*nCR%lNG2ym98XN_W#J6IzpMelM0^y0 -*_SOAtHd6*1|llHYp`AmUVuD~H#$a_<Qrn|C?_MnT?4uto_@EdLgT3=GgwHmRcOvdx&n>8k@ILOh`Dp -9A|oFoN3W;F*Z_7XHh`u032zczr?|%=)g}pC_!F;7PY7NuEdW!{=77VK5%A<V1GcY&&Ww}bGvlPDZpO -5cwBrr=tKJ|uU*HnMEf6>?WP!M0X<-wc)scYr>uT63XC3@s#N8Ma@nW&Rikpov0NLg$Pu`ATXy+r{Ey -3We)}rP`b8=9!WTtCZ_hY<|9FOiaMf$a8;xvBG#N;IH<GK^16quoj$2?Q!Q=$yX>%EYo&`nxBQ&a9{a -S|hmDFs_?D?B1ER7fsPRI_DZ-WBK3YS4z(RCQZwF?Bq^3m4w#pwj6f90rfWD7;W+i)i!F9l@B6ALytS -z5wS55f60NFr9O9&#)C9tO&d9iUVvSgSmI3lgLASds%{bSA&!84oybgi@43E>Mj$bOlFN|w9MQycdz~ -Cncdpw?)|;Q3Nm(<JA!>6!hbGQe5@9xouG*$+pb0CGPR+24dVD+Y$*AX6X*QicCe=%zMR<qG#Dj3Du9 ->g>^i%j$2s}?@A;$I_ct~#_ojyq`Z$s|ivPa)r%%5x>eo*Eq$BM$(>-=<IXnzi%%73>aPax}UxMO*II -(T_Oro52xgTLQ1+@cii7orVBKLZ*y`Wuuef{ih75@TIO9KQH0000808trnOpzlA**yaQ05}Q&04D$d0 -B~t=FJE?LZe(wAFKlmPYi4O|WiNAiZER_7Yiw_0Yi4O|WiD`el~!AC(=Zf%&#yRS8YH5GjmJp^fy4w7 -FeE1NfKcS5C#zLAF1AC-zsJW;+~(3wv#Qo{&gDDbxww^*TgdaOF^$4J2fp1&Wq=i0ipF5>pQETdm%85 ->zQri2NImPdk}tB{d|(<E@J$+ez?Iv6ZRueF^nGs?Wn&f*4A*<1kgZy;l}1ri3Z^yuXt#pb8#=z_0)v -b6#u<p?m`;F|C0c1Cfk9>EpwYa30PVGtH)&=iBd4;$%0|p<Zt^_QD5?eQm{~8ttO)_GmiMZ$As7#I`A -ycnH(D2<n;oiT1T4+G%_PgRGzj--v$GC^uk_f<PH+SEQ?PRLEW9B7tf~2*2J@P25tcS78QII6Mlu#ie -_j7R1kTDo4OiH~I2qz6xx=avqJ^fek*H;=g-WWP(d<arsP<TwmQ}AONEQ(9i#W|nAvGq)vEsiHcLqM+ -eN;-Su`$KCMn~l>vrMm&xN^Ug?b0%65H58LmlJLdF1kQ1S^bVzhpmQM8Xyt?g>~iZbZ>(RtXDambvE4 -lqaaS$WA!SWzlE!tLDdJ7F9WV92<+EX##D+!r3-u3I=fx$jB-*)!Aqdb5G&kd1D!#J`en<eZ;xrF+=; -N1=hRK<5Vp_O-H%bW4hX*x4hN6R8ho}gfUm4A5cc@uFTzSTg}_(Bwfnn?4NIqkz;m|ENyv6{l1_ac{P -}tyo_!!dfn@Mq$r7#iSxtp@?A4Q3R0OA7-I+D2Jr$(g03n+MI;;6eeRSnyYosrVc>p6*laiW57<#9hy -Gh(_V9&Ur8A&tKPlfobsp*P+{4^F^13ppRC732xdQ$OpCi>+A99$kre5r|K<`2Qw*wgVniqIua3&dU0 -C*(C;U!9#TSK0Nbn`T2C_mFN%Dr471Kk<b^c#zUn{DYhpTvyj&>MImzZz0#`M@?jL5;)&zI`=${yUY_ -D?(?2pQVhh-5rtx4{!AYS5B_gL??H6`9|}t&*(qAs;t6MVmNoTZlpPJOz`-HF5euHIaEo&Nh@Im|=1n -D!*czvchJaO}YMqmZ<#Og~3xEo%w{eJO@_Qc1jlX=kHX5Ekch|=N+-X|>15ir?1QY-O00;n48F5TJDO -kpd0RRBd0ssIa0001RX>c!Jc4cm4Z*nhiVPk7yXK8L{FJE6_VsCYHUtcb8d391vYveEtz2{eml-|-zT -b5E57Peo9g|aM6>7^{jlPD9hj%94Qkbl3nleBYb4so8WCq2FB3|>YGFpxn=XCJizLmk?HJw)512N@9r -{S<(Q0`8pd(($~cHSmf)5ZmeuuG`B7wCzjU{r+*wX<?68g3rGmo__D2)`qskJhLpdlLC*90}1;%)f?D -D$CEQC2tA4>6WVI<Jb_X}l;}|@pvkcp(1*Y#3aSM+(9=6*VGTG>RuaK>l7&`EX=4)e2fS5~o?0m(F{x -PHWDw#sX+Li;dfGnUmsvNcqm1k`+UnqxL~hrslN;>V&7O{<6vE%EV{Mz1)XCL<`bhRzS0@Vc%>#RcC} -c<oLviKLoElqLI2baesLbi3hzs9$yCcaM4{b7V=VqsOCk?8TNiyZ?roAoEZJ-={WUEaNdx^s!<+qZ}o -|Yx)*ovn^On<6$U+2!ezVLpA!fT03;SVcvMqZ6H#21T{*C>}fv1@T*g>Zd&_3a|PZs0uBa1NictN&0- -0|XQR000O8Q5kVefp(V47y$qP0RjL3ApigXaA|NaUv_0~WN&gWaA9L>VP|P>XD?r0X>MtBUtcb8c}<W -%Ys4@N#dm)SaksP(Lh0V2e{LuoU9NN~#kh&m7;G!Z^1*%kI#DjI7wbJsKR<g9@1xH!_<&INzPJFvcbG -EvP*RT!G9n0a%s|5;9w*n;?Wk=Hd?05}$?W02y=%awerbC;y<B@*I3X_P@%8!eb~>yVrp03-QFcwhI8 -pXOe5t&F7&?kmKtbqHoDaD*15*TRha!d1TJUiq7I5F0LJ_p88|eMn&%qj)*e9t2sgpUV5?X8BHx>CK+ -!&~<+C@fUYnxhkG+o&LjG_`_&7kG_O)7GU(eXuvcnPz=;tG59&-zi;np<P)HKCH=0X~<$-8Q#tX0Z`f -E)Xp@jLK`;U32BEA@z8Rsq)`@>cE%z1yD-^1QY-O00;n48F5VJX-ebE0RRA80{{RZ0001RX>c!Jc4cm -4Z*nhiVPk7yXK8L{FJEJCZE#_9E^v8uQcY_cF%Z4$R}A(cb`eW(F2&$Oo8(XkrQlL1rHIMyY%QXdHqx -xqrS!jdBsnH2tuB&g-h1=8gwF??ptp`d?ruT{&bH(ebujskBJhELDGmujUq0_fY~{MEFb!WQCL6q3!l -t>@fW9lR_xqb?OaptOV!Zosefx2LdkW}_Er!5VTQZ0=hGaR!S@il4p$)_6hzUAkv@SKOk6{2~`iZAV# -(*8h5E<}31vfF7`q$9eqs@tF7^C$p1mAK_RGk=UPD-gyUpKJJ@8(zwG1m9t+vRuI?O-GBtN**NRL;`j -1HIjX505C?JqTs1Ku%%_{KN1(QpzG6wIY}3pWb^+R83m4>Zpe&%Lg+^*{#ErR{5pjO~I|J#A2~1_jM$ -c7GV*A0xxW_ocYZw#<C7R(&J>K#22b9Q=p%tLyx&p+cF-Jv@O_<FmDJ47^GamchfM;C#`dkGP2+a939 -DJy=t~TF?zN|S7ed%q#d>r+HxXSt3Ao(u-I~5#=p|9YOi~8>P0@eYsPqbGG^7fq`~7L8=5!El)lMUyn -yEuN!G|0$yG(4f$D`nPpNs9KF8N^!IYN?<7|rMLc?mU;n(lA`U6l)0|XQR000O8Q5kVe`u(I5a{&MVh -y?%uBme*aaA|NaUv_0~WN&gWaA9L>VP|P>XD?rKbaHiLbairNb1ras-IG0UgD?<=cmIl0vw%cV)v;2C -exy>QC`+QQmIDX4GB&l3Ncs0Q5Sj#(qIBp`FUG!m&M)WJGuRZ;K_(S~pVL|>P%=U7FojyDXn_g@LR&g -8S-W_uMB=AqmlnZ0S|^QWGq{iMA`m)l)1KF_eNGH(#CCJJc$u%(^TUC<-Lu9}SKBMFSQ#hD*uAfp84H -OiD}{uRA_=Kn%ra|A;5@6Tw#YfivND!HY@JaxA@9}^q;e-4VG&eTYVv?is1eFoqJ(p>(3#Yd_JP@cU_ -#*oW8g=MnJ@2!Sk427D)Rw242%9y4L3b{bBYwg6&H~v7&Jw@cz6mbI$#kP-w`{e--L2_hTzo*eoi62U -D}b*2?lLO1WkI(dD}0}&qV7<1=`>1RVDMuK5T4#_D}hwh#{ddzj#M0%mv9E_P5Je{{@dnw}jsY8s`7P -NVk9Oq+vg%jWi_wgO5g!W7<d~<R>Q`9W?Zachbl<A^QSQO9KQH0000808trnOnodXR|N_H045*+03ZM -W0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rTVRCC_a&s<ld8HZKZreEa-Cx0~50+4kkk0G?1EVhBc0G$=k|v -vUg2ft!ph$GARu(lRl{A}XzkSc)MIvQ6$?W7ImdJDG;koHG`MfO!*_0I}@LRN5MXEBVwV(xQ>w<D3x0 -FcAcY?5udRa7C4nHRvEGAc!i;~ro*W}0KC?;85D6kKgf449RxujGro*aK%e!5&5hP7Jbj7d!!B;d4Rq -Lhr^1HBF7Bxk#(qLPw=%B-wJGTCspBWb#6Wy@)rl5*EDE=hJRSk+3J>i3uw<!y<A#iZe7Edim<B?>w* -7_6Z@16JL;uun~uNnpOS@8VueG~cFdlJu6=1>;F`-(;YAePcxkCj|b^VUaGs<+PECyL!K%qOGKeiI5= -7&85sxME$a?i+B>ffd0QJXJ`DBaj^P7IBT1j{L1)U#*3Kzvt^PNmx|yENS%~$rf}GqASZ;pCN=vbGb$ -!2+B}mMR12BP`-TbwAsU*On-UJ*0$tjbm>k!)SydL@%49N0)2yoCsODs)OcWTH(~N(mJcvo~JNVkBtZ -DHPdGk`R+FM@Mw<Txwj@I&1wxdC;>GT8uE&~gvv<C#BH89VsObFs}46m}PrAy8kk7k-u5UAfp4Q{C*$ -xeZiJ226P!Ci<+D^O#xWo=b}r*80eFmk>;CqEzkl5}(|%MqPk#8~?!_>SV8NlAANoGpQcjNBptxGQiz -1*4*#!U467I)hR^A;Z9cPY6P4*dMS4HLoe^U-YcOXC$HDN&%c}Q5Mt$2t~y?hJB$vv4V!|`U}k^Fjw0 -kCEV$<E@hgAf>xVYYifkUKU__;`g6VMqJoziOb3Nih!Hh<aM)u<E*iv}!+62Fhoi^v;q5E_7`+b?j0l -<3l+skGlBV#4_Da*ZV-q<Xz+*}{)c?>u7Fj7MSVA6Sd_z0I8R2nsR=NV0$*wCJqPbi<9j5848#$yv?> -|jv8i4x2)YZEudDi?Txvmx$$BPdqOE^j$HBZ8zw3blL51~utl^`PDErgBBX>%{P0ODh~kONwHL>?iHz -iA;XJ;jI9ie`e2?mdOKgA@t3ZgdZl30$iYX+{VFY-$nRbtd*yVj{6i7|<aq{qWP@es%~YE};<+yPY_4 -JO$?H_!QW|qZ&hc3Kl{z%UgX@z}IBkNX9BbDteRU_m%|xCV3V_kWUvU$BWD5C3x6_+MF5-O=tM1>^Ie -EWa?T6w_USan4x(PZs-epu*OCntX&(zjw<hAjzd^F|0nw7vAc{3SXEUk3soqERkph>G6Gdg6%#q@Ba$ -&~azkY(S4V5uh5r!-zN_WM<?-34^yBHdd$;HFx$CU{+k5Zro%i<2d;71C=b@=XpPVi(ep_CoXUN@^<v -YS)#wxW#VT^#M9{xGyA>e5xJ04eylix9bxusVaOci-=Z5m7?59xVBW4yNPKAfGMD1AU?sIIN}j0dhP7 -pSm}s^5vru7f)MygUUkRXc_b<{Q$R?M;t*5xI!Z2@Myr>V-ZzUtBCdX`#a)O0Y=bRERK|TsT{izh(I? -|8<V~nCdp{<XC(@Lj_!Qz8iH6!%lof;tkQvB9HL9cf_Ul#wn~rV{DI1Cl|1G>i0cfT{#a4PL&rqqdcc -6*4`9y3AO;C{t+fUmK*51pnQ^9om0E#_YC`qbTvx2j8wx^Vqawlt#vI{3A#taKv+q2j!$*X8|t4J+B7 -cY{4?+BFv$EAE6rYH3mR5X2*%n8Vy|bg<<M(#$#zthJ18CRDA{JW6zW-kY;)}7pzr)j$!e7($$Cxhwq -?G>mJ}d>5_XG_Gzl^>#O}6~>!#8L0E|*%kpVwbXj$)Sg_A)2uPfIa(mArf%W9~czm|<5r#ew8`cBlgi -$pMu2}lLQdK;o1QE8^8tQ91TurjxW?`y(ZiPdmo&o>;g7RnT<R=J|JS&hhiPTt~TcUFqR5L?At*W3_y -_l|e;K=Eo$M%>PmswY*}HFP)-#D~PJWBi(dXKAn7q1PEbdIB2_IP(;;#We|%FRZLX#imE{z12ks1Gr- -YG+c=S<L2X9X&dbq_m<FVm-LnEo;K^~@Ey_+*x%Ywg6OIZ%q}xxVq~?2JI%LZhEM8#!h!}fDd_;H-gU -s=0i<P?RMM`_y=7{a=iV~?!z{n@mTL?B-dn!umc3Qr_-JDWg?0)w50%KQQDPfAOMdS(ZVk=BF5N&N46 -Nl@<C<O(z~rF}t_CQ3!-Sq{1F`7v(IC$xXHevTKcIxh@lg|yr9UuL!}xMU_KGOr68qJf4m-E8=HBz#e -s)0~j-Z3YAfZ}Gb?qO1gr}tIDbafN<ol~&WHu_HG+_?}Ue|UU=0vyCm_qg8fLb^U37tkfR-L^$A=^m1 -jXIhFL1NOA?gNI#0CV)42aPhEHu#p&_Sl;t5Ok<kPd;3+Ix8vh4_L<x1bWW|LexYoVPXN8&Y^1zaf8( -Z-rLn`z1AdE2+-4?E)IxZ*T0ekjV+%KzP)IxAKtE$tZ8UngoiZq6?22>%VHw_xz`xXVS}3s;uBK{wkH -@6GXzuXX5;<{5OyXrMCJ}Mw_qOBexevMtw!;N)W=2Ry=X5v6B7qD(awzeHF_$!8E5L<ZKZ1bm|%Us9$ -MdkL7{-#``T;itYoXTe@C+VKFq2r#7fB&i>hX-4W11iCf&Q!5lFWiW<!Tw0@F<&j-bW;!XT94Q(1RUI -cJaE<VfKv)URcY!3q}=Gh3<XEv;;fQTwleFhr58n)V7>o^R#~1}Yg{Z!6j+ct>75FkdCKMkCYVu&=<k -naCs#r|!X_r-T03Er@Pa@)$D@P7r)VJ120;q5YW@HWd4qxHFR44EyQP^cj-VsdwxT9r);2Y&J$EK8Rz -dLo+3h17~MaP%h{}i?g>k7@Lvdj0E!k2)rG@Iq+s_9NrAq9B{od4&CcAobLGWBhx|$#UI~|a~hv)?Gy -0<#-w<G0IS(gYX{LABF>0A?9xz=-Bj0n9(i^)Zz}!XH@$)n|MZmHWGRfYV=b$0pA)raW+jHQ6Ebxn=z -mqi?^c6AN;$`m0Km$AT{2S6bo~_*#RlOZ@IgPPim|S?*bAjLRhrg`CKbzP>OVxDU)Fxc(&dl;jmZcUz -4R-^pv&?M_-DRZ81_nO_p`;w*9luqm{WD4;~Z;Vhk6hMO9Kooxt1#FGvkG3j!pD6V{kufqP`T`imtv< -dp8g=Y(Yh`8?4P`*Ey?0bjm*WMNI;*1jfV1&zAf~O@i^m6a&BK`1uJ^8)4jO5V*A8tP6^tuvMw-eVOW -jKLgN!pM#@xK{|QMIc}e;8%G+>aw<gPnyGs>ux`!)=N!#MZfQ7>0t;ln|2RN9X`2F%(k%ohdp@>TKYD -H!j}eY0{{v7<0|XQR000O8Q5kVet`VQ}cLo3e=MVq@B>(^baA|NaUv_0~WN&gWaA9L>VP|P>XD@PPad -l~OWo>0{baO6nd6idLbK5o$e&?@1>4%UbhU0e9nT%4`VPq!NL{~{UM;(^~i;#_!A{YSj(Io%93xK3Ri -OHmXut@Cgw<mU&M`(FN1zOXBAo$I<xIhJ6ky4NxZOfc+ByR|kgl`05YyA>ccm+Qb!xo@7gbT__=Lr20 -9tQ}Qxn_Hjo;5rnN(s@2lkq5?rE#sW)MuPAX|TZpPAVp-Wc&f}){LVS+f)US1m#3xT8PkDbGAWQw%*D -uCs~H*rea(od?i@1l_WFo0m|tuRfYwq;<S_?P_Cph)Tt$eg!Aj>jT6T}SF{SVTT<qXht)%c!MpOh(c( -D>{)}WQvC?B+;xZ2q<Mf)AxLA^V`I7MfEkK&Y_bXCq&HfK)_=|8h=TpWZv~L*))VUVMMSv1=P3{9UVw -)>kk{<w@P)Hr*6bm##=m?eU6Fw9Z^gi6MTOz_OFA93qNGmX+WZ_sp*AWUgnEwM=Z}_HB@;Xkk_}wB2& -{WfEMp2O!T~mv9Lay=ZA#KhB)c2SY={U}+z(SyLd5a60C*;$Xa<U<%^xoiNOJdF$_lG(kuIuXGsDz@@ -?2yiuAKifqYqnJx+6rZhxMABu@vK#WGqi{o=-1<?VGHIs(PZ&QG&`T76P*RmWI4oQMQH{FDHYD3PJWm -}-lgyzXYwM6Mz7-~h)q2A!u3P3ttw80@O&rf5HGvL$s$VPnIU<5au&(&l1B6CG%}Q+OG)GDcr>5PYq@ -7#YE&EXynE~{&S#_Ld9)mBIqkXoI163h8K1?o<@n`TC3<!S#5O`-khd#Z&qDAaKn<4-0K#<%do9SoDt -xc2%Llt=(KH6J9l>);ydhv${BD^<9g^dmCu2C#x5eX+F8)TBgGavSLK%a=c`^Z_2N4(`U<7atk!F)|s --j{5JNB3;4-BbRnJSPr-Gla)dKQ`rK$CRP4_$#{0VX(a;v|ItWl(reo*cKfwih7GxH`z7yaFiG5cprr -p>KXsFXLCUc@mGJH1=DdN&G4ry>Ef`ZrKmRwRrQH3iqCwf1|FtmU|k_-djnvL3-n8G5CSLbUl9`87)( -Ny-uLEVX)*MF^m&=@)8$<KsYmw?=sb4Afj0VnJ(fHn9^p$^XiMW)2gk7#OQM$f?yN;J*-d=sk?Zjhlf -|-%~g((2oUsRIYcsS&4Big9zC*xSlhBU6}%2U_|Y~=*LVJx>WiN*L7UZmdz4vJ&j)3ub%Q30u&+pGWM -7-<>z=p(j~gXWP%r|A_6bZBFsg-5<3*fA%egYG?MO8djt;m6_AuE+GMb%btxzYt*2Oan`hs@_)Q#`q( -@o_pOX5Gz$4NYe_5r*fwDY>%9NcMjoxMHuUG?k^0lEun?F#^LsCKYhBHFoU4?K4Dk*wry*e%RpwufBk -XktUTrZC$(L(ph|`3Un4W|bQ55|S&ns~a`qRX2sVb{K0k@YO7IrgMcT!BmjGnT%KoTCZ?kJUoWAZ9_T -}*jk#b8LJ+S&~kn@AEFU1(Vbc}1&r$(0(&7xf^FbI8!ccDEMfmE0r!ro!>;$IHJJGuuR#{wusf79g$n -=W4VI_qOuv={P#_9g8NLQo_*I)|rh<^cF4{rU3$Qi=!gNOpy-lgZTeJ9{qPGAJ`zPBPn0h-p?Q^h%*g -)w1HS4g_w~McSJvDL3$r^TCT2h&1o*>0Ku-(l}EbD^MM)HSYr;!4;ng+Wf3-tzP8miZW)k+h+uI{a_% -4f2tLDfRvdUnvz-SOd47S!7%QEME6_<e9cAOFO^esJAT6%g*hsr}ls{DOo9TMhMpxJgeh)xOZMtI&ly -%qL1zKej}=)@QI5bUo9S<r$oVRI~er&4X9V_#GL*D&afE+sTFkK9lPFTBjwEV5qN#MZbp%rXOXGQX>r -yP`;U&HW8{L>K5U4z0lz@e%D^^$^wS&@LS9?R+4VaO~+8Zk4PP{x`kjdp+b6o6a1P_p`(jSzYEf~BQ- -s&j{^<Z68D76^{YLoUutFbn^vYxw(c4fQ+?H}i0UQ@P#0|-T{?F8SgszFkOXI|3g#hv2Yf#MdfC=BY% -`%+Zae`WL?rht5Z||pw^7h~`W+o$zSm{$L+UGa%g*Nr3~lXfB>I3%B)^CC>=4Tc*>Ie|M|=t6zyw4i_ -;yw}se01Vi2Y_4w{9Q)?>m)sL_ptvP)h>@6aWAK2mnzTaZG$ggN%<D004Py001KZ003}la4%nWWo~3| -axZXUV{2h&X>MmPb8uy2X=Z6<a&s<ldF?%Ga~n63-}NiT)K;04={ecAU(RRBaT4#As&Y;$P9=3ED_U> -}k+T}ka0f$CjOG0H>ux-zfx%Fe;#_vKVU;a$252-I{X#d;I!wM><SMz$3z@*r*;*7yk!P}0a+a*inXH -p$A(KYdOO;fY^yT$RWborF-E5qEFKd-o<-uX{JUt#KqMT8)&)<D%+oZ`mDe2)?r(e8z`|gbyu%u^oRW -%wmU{K3drShh#w*c?5s*|i*t_s=6WF{Mt7b-ottgB^madEkB*0sF2Nb=>Xs+&YiRaLATd7;0LlUaV9B -VyxZRp(^`9m=dhL=Rk#%>GL6s;W@-K@L;)9@O$ckDOj0N}{pjss^CXFPiO2s&TT(o5jTvP|XUVl<9G; -DP(&Xf{l}}<XmK1_jM&|1*05L*W|Rk7DYaLw~|?Ynag_ky(rf5O<h;@=*2+-pTS^2KVJi6-8fOUb+Qq -#tQ9QbI9V$gAyJEJUCdw}m$;}^^39uXl0X0XICY@xz@G~x+fn@q4S{Cq>(9UVA9yfMs_EZl){Foh0`e -KYgk@-Iku}g|QO)T2OkToz!Q+dIp_0X=L7z_nKi^7N&{7dkKx1TuS}IvK0$0s(h(iq+^-3BXQsQF=%F -J~tJs{W8vTzF{ZxEx@Luil5EQDI@Hye>)+vFM-j~IH#B<_oa{D;8-mI9_#--*f;I9iIbr3!FvvRO#%o -B(bmNFvGmrV3DWz%;4=td@!V2k47?V_nMM7He$27v`(FT7eeWI^1FSS^_Fcs(qF|KoNRBwcQhe6Wc6c -VuX_@ifRKYce*A1Xc^f~Cx$CSCsncmjn#|kSTkS`!tZ4B>tnlvC$b9UGcPTwpnI2NK84BKs_eu4ONqu -QF9FM33-=rZy(A!L(hO|C7Bv}}9C-RrOu=r!a4nv-m=<zxT)z`nNX*jpM16#aDzcgyI4QtoqAK_aR;D -V8t!cAa<k`Xj!-cqGa^7O)IBYOoqwz0JOEi{f{aeNFnE|WfFHj-`m}iwtk`Esbm{{j!-Z;TV6efegPR -cArlPv%YDd3A*&gBiTv8c1f5WA0DLs(bjNNV49$4@PCCA*e#a2lG!7s=xf#~&XLQqaHvM-MPMXgQZ~z -^8!F&>Mq>P3LvBUJVC!`h!u5c7HV-jr$uLvma~AhCWQ*0YKSRXr7rc7ENTCTs54k!4%jVm<eykmI@VV -*Lp$Y&g6p?{BZoJ{@4-`M`W)@URPMPE=n*boE&n3*H{*?j!aS*eQMIC$>1d{;PAsUK;XmkkE0WZg$GB -EctLD^aRI-TVhQHPUnE!!J$L^x;MrNA9j=ST3()%TtR>1(%Ss-MxW{0C;LBl8#~nr<NDLlssTxsca!7 -B-o<BPB#igmY{sa6_Hz$UcbQ+q!qVk5AFBG>fNHeRqRdb5Y`w~pHoVixAFajOH-NPZkJ`Ob`C70xho} -B*5X}ZG&`GclAY5J&-rgPai<6ud<>T)_X6HQ}V4D?<Kws9auzFui9%~`cNA90b$Dp_ap!l+m4-{^1tN -(L0UwmYq1u=6s%i~{P|ecMED&20ZsI4Seoxn+Ud=#iyMl9sw>$LD=8_+)p2c-9MIhxh7%=@^Y)=4i(3 -61Cw1X+1zEmgw>HAn3eBYSTiwuNQgP`i{se97FV*V2eC$y(evzQ_ft0T|?+T`}lJXttIyW-Xh}{`A<^ -2tuVB(Jc%O*+)AziA*Nt&kF6KtS~73~-G#cz)(!1A|Ms`R^YnOt9w76PPA1O>%*VoUt-=ZfjL|tlw~b -`mZM9xuhyyoh9(h8~lmXL}9UD-yiiFm{@qmCkTw;?9e$f1qEU&Y5-Y{TAHP17>5rE-b+y%EUoQXYc53 -@^i#W<9lakB@qU7~99FQQPA6Xtc+fDa80`>dj^h}Leo0vuqKW}Iw<U}uxUU~!MW^#emb^dz^VgH!u$G -}Pii51ktO1>2f!E{hq+#l#T7KBtgVAnj-8Esd@=xN#V;27?zqt8@g*I*i&${H|Whj~>lIA1%Rz0)Ywh -26k1~xc4avS_9HG$_5+V&I{KV#uDWgHen1LZNA8jAL~idlax)cZuzR+$pw;+=3;iy+K;GQ`Rl+~(pPg -nuyJy9bhR0E9fZT=6im&!?&EqLnFaaTND~ABRZgk~HAw^<TL#oQ5{2(E5LMB3CD*#80D9Lzhz#WhfC9 -_TBd}=ch^i#W@f|p$KrrdJe0Dn8&yaHvAlccdM98PtHelXVtX8s|bq#+zvo|^UdRm+{v-(tr@mm#%iW ->B!EF+Ng-Y!&~6hTJLoys|EvCDavUP#>dgjy*@vFUH(doUWEx79{RAYj$6rIoFj7A^_@ZE3N`zFO0b& -A8koft+bc99z)?st`GdWSTYUJ2vGMAby)A>y<C1WD7PqFytI~cp=4%pg5WBRrolbB@BgK!d3Ta83_Cx -ts^8gK^ASqTLT;my0|b4MMH4k>FvmC9!wg(`sSro?<d2_<o40z_T}XE1pdE08MUnXULART3|=Q5+Gjt -G|NFffogZO10;E|wh8D@7Aj}7?$hJuyJINSl;X3J!6PaxA4*tGYn02YvxZsw3HbyZpp6Uf>c1yS<n+0 -&BT8Ru58%X#vf0|WARnp6)sIM?+qP>W5FFcWCMWsmOz~uuoN>ewJQWkAlVk-)v^+G};p~)i9>Mw<Xl{ -b%(hL(Ypgn@9yT8?a2%C7E+GXXF_EmL$P@<MV}_z@O%kUZhM@&q2k(?1Qy*ysB<-+un}yEn-#emVW?+ -poWU^Tq3TZ$`05UW>zI0tR_N@$o@RxWOZO45D+<dG(TB6%w|W=%RHSoKS;#Ezwr=w0Y^l@Op=x&C8FU -bVum9*uC38uhkIaNOq9jdqRVx-s;la4UVu$L#e{tln$D9_dKi#Ml_<HL>M%(L%H>O*l>^TIb6U44;%F -5JqPXb)x*X;dFW&xIL(L8@`3Z)Ip6_}Rs;R=+P$=+4==4qeC876>82Jdg>M|P_+%w#d!W}9M6Y#R482 -WP@bI#qC<m;W!O+>{U&|W*Jh=@FGJKyfCDCh$hp%Fu{dc%?nPKL$*(R;xCeNJ=9vCXAGO<Dz3T>%&+` -u`C0E4|LHop;>J-lEHut|<vb+@h7075NjXNBuj6kXr*P#+*6KMa=?%%yhSF*#_C7+CKP%qcc;{$k7r2 -Hy{Cxqz8w$x;e*c(n_hn;gHJKAl&|RR&ugF=xJJ3v3F01{mRDjh-G74_vk_<uZM0b!Rnv^>Ts>hETr7 -1e_+2PTxnCq62_CUG{SZ78@KaLhT3R427Q0IPT)~?sUk<B1dDRQ?ryVgkH3dKp?onu+SD|f3E(9=5|j -`9F`!Pq-p!u5!hh{%Ux>+yQne|V?^g?=}?<>FK3whw3`76n_S}N0tl}t#~*>z;$R#sTxjSjOWNzBH1s -VpNa@H27A!bTRJoXt{(7+2ieJBq4Eo~i`00P0KY28I#RrwEisg3gM>mB&?^FHj=!jaIy+;gs_$V=3`Q -AP>&eMzc>3J7hf+=pNx7lr--HKwhfG@HUw*V0TUFUMs-4x#ik*3n6)+kD?_<SnW?3@sEd}=6mizL_B4 -6)xWpnY49%p;9UcMgC|gwOsLRHD&hYm7q#j4pszuW`dq9N)V+g55$j*U4VsbV?TMuoH&-0LU!?TZ${G -A6F|p03{;YHzuRzxtSjz<j=I_x<kVD4l2HXaweYsWZ6)Ia!*DG?yyI`@pBt}`aXSsL`u*RPi@Oa+@Jw -U@8pYz=`4L_FQ+pX)_@pq2V}cRkO&Q(Ae!a#ys`1Z2s9gnQgV*zvbbLP*;gt_k0FU*^_yvyC*JIm;SV -+(1KUb8{}^C_1rkX_TK+xsPWbtM(nArLcMJCp>At@Jy$0t_r?gu`OOA%N_##p3DMgckKQ`!j#wDlEZ< -tl7^~5vEo<R4l%>?yDr#%(hbs<WSFr9?4SelUFWquQZMq)|F3aw63QNezs-FhzG<jj$z(CC0vrUSQH# -(Nl}`|-ROa)37A2IIuY5~y`e=3u)wxLH*`wjL&|olO65TK-TTpH6xFlf^B6rXXW$P<aUPUnZt$uqD`{ -p5{$0>a8E|{H!lX(~TLm#MmPwbC`V5IwLOkViGdA>&dT00sap9EYrMnXYx-b<gHF7xIGs<7oRH~hWL5 -%JbjMe7!c5EC-`_gf&Y)p&YmA>;Bf58B$JaU{p%>&FuB}>V$Mno2rBu!!9*$0<XWnf+(W%>))qh}r34 -FtJI~4_=YdJr8J}Bh;FM?2elY60-P%()0{a!{Y3j^>$pbE9YSHR_j{UsEoGWPzq&AaI<<h#wS~SR3*4 -jOFDO1J4VN#;nxO7CsnbnpOL~M`_(!W=E>7TPKauuAs#E-i)lQv+oHVaSkz3yT;or&b;1^NU{a+9h?) -Q!UZ&v1aV9E|Qv@|us|7YH*Ljp7L(CopOS4u}qXc3b*dbaeLO>9cdD^B5Ih&t}Z2KwPy@H2Um^EXiNS -jJ%Grg|vNw#622xPTLJ5hdEH+jD}tLMJjcs5bHnb^w(I}gLU^%EBnUSNeD=ktYf54=g@hja#lFXS?A0 -3#3K;UB?S_ibp<*F(cr`6R7($?Jg6>1U|b}O_-L0gx^MH6EH?hk>6Nb5(<0AC0S@nwmGq4zJROOd%_+ -LBjY)F@QjMfssg}u_uGtB?3I^cvCV)4?s5mAan~jtuc-Fyg(}WqgWJl*?PO?W>9vJ%hIR!SqmCNc{U& -{kKlNU%d*naoUkkiP<i1(Oq0MDQP11226+haLHDl|1;+0m#oWjtIa%ic-ry#_71SOQzga*lBu<@g{(v -9bp#D5D%41C#8&hCQ-_jI7OD04ll$!I7{o0ob>*7l5wTedpo4zd@t9Cfi7n5S7oQ(m|=8B!F-ep<UG! -?4OQ?I#LAiG-0}oIS$unC1zee%4^VyT=$#{IxQvi)HoB<n~X+Y@<Ws{+4#PjacjYzhAT6xq(0nZVj`X -{amS-Nrdvb9Op9>$lVWQq3RT6&*oWOsI*oKDb?R>7_g8SCISTX7?%4M|OvVH9(E5OyPFQlg6G`yh7n@ -I&rjBsXJ+SzMdFx+>$bAyo5rOj#E8BeT*kz^g#Gtjqo2tGded76|`gWl`>E~YU7E?fEA+sxls-)Z{TA -)*LhWhw$M?<?TREjcBjxlmx?3gi`BFftFOf)p#@aeRX(piOyNZx>PP1YqkLU>OPNYFWr7Mu%!U-vt1{ -GB^UX`)UzS#mOrrXIt<X7Zkyp-aym)|4ex&Hy>@!tG701+!r}cM+{)msw)Z#<}fU&<3n3^=(8Sr=d*e -Y4Y+v(`V+aB!lN}|0VD`1t0%d@0HA<O8e@VUX42BCB4`^LCTe%_x44oTx05T3JtAnjZiUiM)lwJUgqg -6=&3zGIj<V>Kq^{JJd;h?aI>TCVRN*|3|N=zUE?E||53~B{*s%0wP(-|`4LD9u5${V4w?QEJ@~uTKxU -HvDoW_&pFjy!s@YQuF&MF4_fbO(lvYS5twQqD&~b`G#r4p0{ceXMg4eq=QTzJ0Q$=q|lX36~ZW2CT_9 -Z+x<jCtSu21N(zRgZSLWvu8o%!K%GS;~d?|=^74rynu(O`E(ekZCssxI!My%{Xpqux(@d-~bMq4#%B! -yR^tcj)RN(V8w_V=w#g0oN7n{>(*F<c$d@c=rZm;|i{L7g$hzGFY(fDQCcYc%s8UDRkEr_NapFxkRbQ -`l_m~@VEh9PO`zlHgc^)yMA<FOUJrMH>%vb<>wM1?nXu1JnT9{E5HcFRi?wVowx-(W@n$<JEojI?P<I -+Im0O9m~tayN}-G?Ei=|Bjq`Bpj&XOhq0|-ujh!(9z|<@zHP-j^^agnoh8e7FuXQ|YDlaKkE^5`eEyE -Fpp%GuAoi)F^0*?4;sbPMjXj(UpQY-04_RRw2P1nOVGS14VXecdROkRXnWa&)Hzo5L!pJlAtN<4eWG~ -2Is@%P|D2f1RY!g}!I&}2P_!&fhCB6nn-{b}G%EBj$RUuD-)t&2uqKE&^+2yD*9uD0$sNcl?Jq9h)Iw -k(Oh2+OD*D@j5Fr{Hnn#W7Y7L=8u~LRqGtxp3BwWL8DLwln7evqD~ii&f|IMPufHPc%`?bNz*gF?P2x -50k%29oP*+u9bI>Pz5k8ij)G1WqjJ?&JFM(9j6+O#spzxNWidqC^$V~8@%O{QG3q-o}6Jgw0(7Ud_H< -{-istXqAu*E?PCx*EtTD!z%tEjUV{yvQ;Rk;_N>i9oeho$=gAQ;*3Ix3Y1SDjd75-lHhHWr-uD~I2Wm -zN#&<(;?raALmN8q1yc{02fO&E*-j<EW1`7}DzmrY8LQzjKB5h&sDoJG19iZaL`<#Lwc9lqhj%qo}XZ -baTyV)M5q+7=(o2su^^NgIn0Jky_%+-ElrvL+Fj{k6Wu08JUZ$XW70Me^$At8OT8+92=KO1#69*oFwv -2D+}|M87Jo9||%Z#;N6`}B2cIzFD)sy%>&dryy0&OG5AO0ZFs;}&{HEW+!KEVHapK!*YZ**&HiF~YK$ -?NM+=15H8RhV7jW2VwNUnkx)yczct>=9^)Z1}*wDOYc|$(dDwPe!`oEQg7vzxHhMJ-EC^N`p)IT<<~u -tY8rT?h7^s=46d#^s85rjcZDu4tfRiP9aJP>!0;|Xr_fX<&-A-5IOQoD!sNp<UU{mmBZWBcUomQIPE; -sNGtM*^F4FC)du4C#RYFR6J%Q6cS-~S)+sLC%P}yilIU?Tee#MAd?GOw;>Nbf<4VR`{Ud2eU#qVPxDn -Nk(Yx?cABV_3KV$ucTlWr#;??B@oD0H`}cVIAyq5TO4>o~$x)2}Ud+dV-v_(EU7&?nKP#|$Q4jXN8nl -Mauv$p4@V4l5eenCnjcmtCFE#tE5leZm55d&^cAYR?76JE5cY(IfoI;@c@zrGf%&p2hft725vIi2A6X -sNl}`+7CJw(qlf*NAK;J+sZ+H&-(}T?3F((k7A0r#zT9_vYHuhwT<fWh?Y>w9#nyy_uL+TXAJa-!+NK -tb`>7DcQs5}-_Moa;VsbMXW$}|k2Yq&f=Fe{0-);LT~7_^s;oAym=r59<A?X2_PTI3FVU`E5BHT`tov -)^uMMhcQxQn#zjQ4nR)d#^HanRbUR}uRyu@UK2F&7AMi0=aq|`g{Yk)9R+&zrDRKN3@c06x`+W}i*ti -Pa~OPO}~f@vx}@}6}QO))tglf0{X+~b<+qGuGL=2GqzhI?#kR+*Lz9Eydjs}4gpdA2S@ZEBh&m{;<m| -F{RjOG<b$J4lsqJxr&;uavon?Um+j%Q;2L)csl|0)L1c9@J!+Q;OFX^6~|Kx=o6zy3!4JSfV4b^v52G -tv()))uzqdbUA8DOqWRNRz?{(T@Hv9v<pMr`gEL^M9f{)CzuyU%}aL^AN%SXOH(!Sg-$%P)Y>zB0OVP -+aoO4_FOiLUpu&3IKL6+smEk{`7#L!jC5vi9ECNVuY<WWfVcSfh&G_Wl96AXl$15g@vHwny!Tpl!KcL -D7!@tE+2P<9Lp$gYa+kHxh1-He5t9XY-FSEpBr-Hc2O!-CcJd&?<mJu2bM|xDY2xzgFt7dDj1GXlhLv -pGaA&QOIDqqpN(o@X(gLj_Kk^QsWKcr!mKVakUMSPv=Yt7ymLd;@>F@lE`O#DOdaXRm>_n2cCI#t1;T -dMA2ZJsXj7+m5$w8YU>{dIW<421%IhV3*{X68r`U04uB^7`$UiC9+U+)Er&*LKg_^)DkHl?`(SJl2gp -x;f|!X=*qw&TIG=GI-I$AmGV7b?h5)T-mYX9wOU2QO0@Ieziu5M-J&w2NBVb+7x^9%o0BlR7>+mIiN! -+xEtTLCOZ*@96B<|T$V6NRw|(zV9?zu1bucMEY9xYrFH>rA~9b4Q)3^TpFzu$fE}hoSr%WN({MseMxx -6Izswi2pH4|q?wy5=`zuOzz#xEFsf@q)%TFY8M}ACnoMg<KMr`)HN>oq^byw9k`$031mpswkBB`V1UH -p9arLA*n*p?3ZM8JunmSVQme1tnZ<Y<0R!xZU>R{D%heV;0*{Z)z?ATl9_@8gZ|(_8=azFcC5^80&D* -@-DluCg+YC#!(uD-CAM=AA1Rt^nxToW0<E!#n{eN4y58z09=RjN!*tAPXTJ#8j{y^x*#hP)h>@6aWAK -2mnzTaZJVPCl3(;005-{0015U003}la4%nWWo~3|axZXUV{2h&X>MmPb#!TLb1rasZBR=~#4r%P=U04 -mFJ0`0Me!nd@UaJBk%bj6A|cyM-C&xON$Ts@o2GgY3`2&Qd@r)V!_h``))8_yqjqq%B_GLP^oAJeNJz -weMCi(JHRv|C?F?)1NE~hOVu4e+ZlJv>u<QNpFGgZdRF>Pjo6Y@x^JD1CjzdVZc22-FglJRX&#c!4Mj -QIUQ6d;h+PWx3$DxN(-IzuurC|FZaDqO>;KoF1o*NkZW~X2c2DUzBf^X9lRQxcQgb=FLK6u+|XTL}>z -0e0P^OKy6bIO{lr<Ib=C)F~e4R!cK@VcjZx|SCL`7GuS&6V^kd6clb%?{`5Gg%N!Ik(3@zA}!7x>{8Y -ilB7iow#0#Z%|7E1QY-O00;n48F5Sw@5Z5F4FCWnEdT%@0001RX>c!Jc4cm4Z*nhiVPk7yXK8L{FLq^ -eb7^mGE^v9}T5WUNHWL1>UxCs$6S0<AIqluGo;YdJ`Z}J;xSlwZez1KiMM5%bieN#?FRA<A@7V=F5v1 -hEZN8l*6HCNmv2R#ByWoy^f0b2YmgQ35Z@P?gk!Oi4Dw&F9kxDJ<D=BKJ7nM*m{_(nu6a0B=$VTFW)K -#X6!H#$yjYlFbQYL$I_M@YT#F>=*@a^#rM<-`TcEN(5X{Bnz8xm+)sw%6Mz6ZaV(jrldGMBX!sjTBHu -cE<BtA&_MX3Ki1<zynVMX7Wx;%TMwWi2P>_eiAKO-6!^M5(i)#)KlNNzj3vk*GYE{HSt|GH6;Wl{XKx -9GC^8Nmc7*LTgrT$>U;{6<K{h7z`$pIL{%>p*SB1e1bC8l?+BAu;!t!Z{<8r?pqIzi<>yl($<p?NAJ# -#e?FO<zJCAy=-o*$xFqJ50Nh(LM@77lX}yGbhGxx4!-#*M2QX%GMQpXqWo+b0<qiEQHUEOOYx<k3B+i -4&(ICWnshkOxe|TdUh6iSWAmG2JG{(N0XE(ACmP)`vSuy7b&=Qs^gv>ytMJx`IJg%yPU#*0{3N`%=dN -4cHCh%<J$l&}^7AY~uGTCg++F8ZCV!;*_r$?van{UR=Ft3p_Z}%+nbgK2eQIbAZdMia^1s<1oi7d(YZ -P)dtdTOi~3<j)bXZG+zoG;~()=GCQ{ThlH(ngcp82eRWZ;r&W!ZT4_sbx+UpV4krPW6>~Zqdmbgn(Pp -7#7Ph8F_p%xr(c+$z)i`d=~aJqCp;tCfD*lY|qPUJ8L8q`MW>a%%i;=YdK`1k;vo4G>t`tSqGvLFNE^ -B%Fn{}u)|jV{yEqlcG=E9i?lC$Y(I->Uv{__pGDX&I>I{Y7UPjv$ofj9tp%`q3nYA`=Ax?OB5Am{!?Q -)-66!?N$8;JjWKqj>(3RONwTe+IgNs+Y3;dngS+r#%%IuAmZhB&wRc@NZjNIqvi4_r+2f@T-pGmSP@n -Go9_nZSx8#kdht33(l=H^+!3t#C!#(#z{g9yj#BCdxtbx7j#<j~6UeW_K6!|=XYq+Ct`4Yn7o&tVE%J -DR`4hYza_3{F%bH_gkc364E`7H*jTpE$1`Wq<>7D-HwaaH|Y&4+sY&q9x)%%ZQ$2?)28d@FLw658^!D -`*=xTE}{pq7vgjVDR9A?pU;l?eC{%a1M@iHT`^h2C3yc~F$m810}&+lyuZohZS#ANz5%|(`5ps=q!}T -AfbZV}Mf_>Oz=Y92vmk!e)v&Uv6H22egy$a9IjYJ$tD9-`;c17xSsjI<xvYmoI^qf8pqopWjgtbIIfw -#3e<Z4?vtlW|nM8eluzyK%2jl(cUw`w@fBpO0?>bX=K$o(P#d0BamI#yPvI_CpCcMuiPGMpieFVJChu -^O9fJ8(btf3CR48$(aF_P^Fz-1sz;F}nTHZQN@ucpAgUnRg)SsDWdBf*NPggjEP_Xcfl{3LKr^AnDr! -gj<j5=XjD6P1D~kQzZng5i7n0!b5?{dEsSK?>ln{2mi;Fv-lZ?B-fRJSrDrMqBcCswDtN#*wKpZebH4 -XEQ>tHxf+BWo>GLc5WJ3cDGj<!~wvmm<Ia937FA|kwR*$kj+V1@X1z3f|%YTg8&jUhIhOGn5@M>-&Lw -IILWAg2<@FGSm+9s&Voy$I=%+l<Wiu#o+CsnwbY5MB5!N7R;Q{%5g@btvieyi;#8G2<57cQQA%CMbHc -TGHr27dH`4G1qgvv!zr)sTMTcl}bu0BS^iNw3Nf-`<w}9hA1YOvTaV-}LE=5*oOeI#S63WlL36?7$n~ -OQ0A${P%Tv|=2BH(Z5d)RNZL%+1Cr$4XJKPpu@Y;AT=(psY!B)ff-T2;m`5_KsYpfky}s@t#3%;WO7X -k+_XBimZJ%)_{(3T0>#RNIH9K;vI_lB<m<<VIFJRJ%V)#DLV;MF?t2YXC=Aa79YHh=PTE$O2;}7eS`x -8WGI`A&M{qD>yB~UZlABS{wcD1@Cl_X^Cw$=oFfCAi1LB<`w@LzFHXo--oYGU$Dq8&&PY;UG9cogs;~ -5uJP0=I~We9FKjqj2H<%SSzcd;>o~aZtK^*ax5o?7`SOwFd%QruXZd+<J>Q#LM3=9;XO{mYe>sdFrVq -)3P98WJKTtA$z|ey|PQ!3(W`(ocYPj{4sQ@ju*9j_tUaZpzmfdp<C&j*7*q8O8JEa%x>$GXh3j5HX2b -khPhfkkgJnx%?KH(+<0hv6>=b&F}pG|H8J#@nV+j*79H+wa7o9JSfh#9lKBy8t`->_|-U=K7KYR5oac -Sa4`Rs3U>3y!6^yjue<>7#@HUQ`S?x_f^YV;K5}?He(1133Xi@#FZXlb_!m{qUL~sL^iwQfWtgpbiG1 -7s^=fsI-~4qMU`34VkITBu><39*Pq_lTA&)szsHIb#m3Ov@8<jDV^Fe&agzM;o>@PPM8Dn3`NnirY3U -yTWNkroYhK8du(fJkSZV;BeToK&S7p+w@P#!x}hf`XUapEV94@EbFG%;(01>_kd#|Dz_3z`N4~ly-Ve ->OLp-yP4}y%)gU7}-1w)I>0h`0n=Z3^}Xc0#)Yv8-4eCus%k2Pn{pu=n}RnevDN`Or9*F@k9^=TPQj) -XN~qctPXKOrBIz+V!NbIm8E;}r7=2{=_WGSH7k1do?#@wPqeMfXp#VDJItM-2-Dz!|hpB>{0$1XW6-l -A3n{+;%u@rQu2E?SRN&o<|65Og=_}sCjf4ZhLGTCVgy}t<*EoR!x?tv{xQ!^|Zi$%RNUPnnFfcV_53Q -js5KBfztqzebETEhJl~&-fe(iKF=tKep6Y&D&Cn?b4RIWtzZ2GPS;?vo@Q`2)nAm|skif(dRs{XejO< -gFk6U0U~5Y`m>9O+U}_pY-@o*w_)(%LRwWs_hgo{U5U|-+7SL`M1%o|F-nOAf&-p!B3{u%nnqIOCcH6 -RT8B4rk2hE1PZm^4ncIEZdrl#Aq?tt74Mq)oaA7B2J4(I>NzJ8MZ*S2z9bHm;z9<ChGHWa);^7zDS?+ -tvCjx+Z+I&+(L@l>h2zo!UG^s~<2>ME~Uh$e-8hqePj%+C?ELZ;0v4@_sCw-Nd;lA5GdW^ep8cM7K58 -KnMNmH?xV$=q?flD1c|oS|FHxOrjvFGvk2T2zw7)SjdM6VQI-!FHC75=cLJ*fB)^z?Ze4P|vfEB;dVO -r?P#LObhOViG(DiP0`FXgy3hsxPIASgCQ!lkm6S9v~t$SF{>buRFyKP{u3jAzGkw7sA^i=_!S2QF-Vq -5+=5+<1P^X24Y-Tbu)~mAYBKUnYAxH$9Fb=}r_!MaxJA+FS~VI6anKCN+@DBYjg9lB>*qnU^X6uueZg -?KiIGko;iS!533~H%ep8{BWn6?)p<|=m1vy2bold2u8STV8Vsp9RFupadb@Ng|Y^g_LiW1Kb5kEI<__ -lb#iG_KC1^<>6r7iMnvv=CP8d2RBb$lm=GMYzXKN|1thy4(Jg2Hqq)W-djN|uD>m9G3=fDX<tqRHN6& -`ld&)nLw7|3!rN@ipQ%cCUEk*)@zZO``p%zLh!M2GDCi5U^^h`C$M8%CYdPAws3;G0klLUymNF!mSrv -+=n~bcJH?DfTFBQvpI6REse=WtA?!m`1e&C>}C%MV~Tb)V9aJK9oxcnMGNiP5xaUsb>T>~Es1!e7`c` -90*MMO7Z7&+Q9D66DwvbgCf!|_E`w#)X@Q%@cp8Z_1vbw>jiQa$Anqp3<Qa>G1Blttqe9(Ueh?*Hv0D -~(mRo80FrZ|J00%(<SV%-88}-z7<`=nSRa;(sM3{9U|1?gnO-vA3qL9}Ty0A;_*0hal2+PjqXUnS5lk -UREX_Oaj{YfRNi6v*k!)~D1_0u6K?Z;2^mRCfk;M;&cG_@}~+#LY+AW4q<m3p&+13{fKeHAugyJuz&F -lqYw0rpdJ9hgJF>K5m7rQz}g5zs9eQUsxjvAdhW@7TWIL(It6sWRDTdXH_n%0E;*S(w-4vI$+`O`15f -GcC8)fo_j+V!>}uaSF4{B5}+qlP?0XYfWS-6J|x@ICoGts_A7e?N#6vyqrrTHJ{WrE^_Nwx??hOP+Bn -ELR*714>s08C10`cH81EHfoy?Z@rI)2oeyS)_SLSKIl@2j6gw((FIZLlmf_6h{T-_?Z%!<3?-6rf?yg -9yR|YqW)Uva;w)OtHWogltaaya=)3zlxubZ|i&~?kR>YG-#p70l^hh3H1Ip3#VE0m#qqBVH?^2BZo_! -se=6?@B>O-kv<J+X~nY@6oR*#`lgNXHR#dUV>njc3UA#A`xo%>|`pUU_<T2e+P|%eyR5a~+pgSwa`&- -prG=b1bJG_1P6h;dFOb?n#)dV%{FRH4uoC&Mdo=ZIN9wU*5&E!+Ty@bI1=f;D&(D_tv{&86zKiz7HGc -;%Wbo=Z-h8&~4}WH?WT%--G`FP)h>@6aWAK2mnzTaZJfAKqgIX002Id0RSZc003}la4%nWWo~3|axZX -eXJ2w<b8mHWV`XzMUtei%X>?y-E^v9xz3X}#$FV5-pHDF%mp1?j99<l*WGS0Y6iIfpV@ukSY$uE628O -_poDjsoGXN<#%a3-x^GN3vPF=gJdwM|1cJ{aMB^H6{sjlv>uCA`@K{l)B)$;sFwppJY{(f(Ne}C^yF} -p0z%d9Eedeh9x?CG1Adxwe7-riH+sA{t!Th!;(tXO1c)uIH*%XLvL%XxNFtuLx2JYO;BaaK3J^<KL<o -mWjcTi4AtTVIq-S)b)u_Wq*O7Xn<e^1})mxBkavaaFc^>pHtAu1kbaHSp&80{+uLyS9XXi?tw<O{Wj0 -({XlhS+DP9Hy7~Wx@_<*KnT&HH{~6`vuXjC=XD0nvrSuOb(>R*dR0P$s$RAk^n6t;tJP)!z#Lk8gjRN -1!u$dzZ3_rgOK6K-!8r20z1|_hY|hKJI>*_AH*V_Yl96B5&6P}WyKUFymA>DO_ww@moS%%dVmZ$?OMC -_p`~w)u%XKy@U@;c0z@?R0R96+vP_d<s_VORA6~9BUsPoyTUDsFHn-_1gPai&p=_=-B1H*?o%-YRrRX -1xI+;n<gt|#+iT?|Ll>E2bjzNqIp5!c>X0}v*Yv(0+bl#@wTUD0dBX<IKg>vF>1_x9v>7^MDLyT7Vh| -5{g9rT*Qxzt-DT=^Dd0a2V#RbRj?76wMM=$hB|Rg?o0kSprqo3-@q!dA?a!3x^WXK;5{<Kmcd3Li&AH -FBU+mNF=^V)vg!SseUi7ifREA)wHDp1IrrVye>biZ<=D|#=kBbMvG=skkYBdx#vFt;@-O1KH1CQBTw< -sUio2GuGZO0`sqc})D5>e$lh#Wt(MuR`C~x-3JASAtrpdKYeB$2S<x~i!Jt~@lk0Lh$NeJHSbgX`%i+ -iTs=fxAl2)5$0dp~i?XwyqwGqk(K%grm4<shoaj*eSx440_7D(~5{s7Cxuxk&9D8UUjdU|yU3}y@zf? -IM78)H!|FR9^oZ(qKDF?sjRn>VlDzR!-b_syo<F+EGzGYw3?lKVJYHT7w6y4V6x*bLd1PhTYAegXTf+ ->5aW`dQ*s*6jrU)W^(VbhcZ<y#>NqcbAj@fjP{tiWxB35?E-_`kyE6XBj~;o0Tw=#d_UTr?BC0c7bG( -gUd|PIOgS|*doJ{2`pz9z~S1fHaEQo@bk$8XLmB`oxa3NFf*^}W!X<g#cBn^Z+o9J_d|l12+>a_!-1t -a*CGct-@;ZLjPB63g(IdqtKf}0HE+rvHgJSpmCN<rUbrfnO9l?C?kpRAI?f)Bvj2(vPVt;n%d;AO!e^ -h3cnYuDbC|Lr{f(dfcfxjI3H{!Ec!>M=qQJuk2yEWet5rGAvoDD0W&*#>_C1`NY5}JTu%Zml-<+R}=) -cM!bNpin7>sa>&db@N0AOu>Rc7Z4*aQnX2?*3_2`$d(^v6RH&es}VYJs1$XInmO;VcA1@;#Y5B?UZ_p -u0(1t{rvkL0>?$aPa*0w-3K#e1>l~OWgGGRVE0}82tAeJZ*0-VDuzVka)6$|F)Zw&$2?N0c8=l+H}ez -<6CU;)TWaV!QqhyUFWV3MQQS`TyIvyjK5`gUsu4NhV|(`fbk1bFcWa(!FpT(LA2%KOn%2t1MfFW<R@h -_?12WmA79EH3|IjVcd-_zAXedE4RD~Ws;!oAq%CLVke-e+=wVTsMg|Ld#25nMQG3^{1O}FT>5ixqnv7 -t8efh7!{^-|6zf7WE{_rnB|LE67pYZIWfBvtT{m*}G^v~0?fBvr_{m*}G?9-&b{MStWZ+`8`U-nFXxd -ut-%8lW&+;;hzLF^bBoLB%T#&#JZa$jKj%k_lL1UQWF7m$XB&0zTb{C@Ud*>Q3B;|c!peg0qB;b?%8U -H<Khw|{>9?#0Mp0OI%zVf-@~{9x6TgD2TwHW+t)zpl!g<g-Kk70$C_aTq^pX300^<u(5PC-eJHIn3Ff -`%1GwlK(`He7dj>+h~#TaK|TjRkPERlTg@cjvs1%q;oLDuVeag)M*N|hNm9Ap&bGL8RUa5SY9AFcb6b -0CjjBg$4?%eAf|(dj~;*e+t2>}cfbFS9!Lk!eomuXZm!Cvn(>{ZsoHv(d|_Lai#c_Y{|L8*#qjst;dH -4ze0y+jkliO3dqJy%tX#Hy=>Q?7SgbCJ2dCw_cmTKMc{RtIJ<2<$CE#0TL<)N;==5X|u5!JYhYQ_VGu -BibWydGIE1xEnd{N)PCLSedK-MD%E&@$amKnm}6AgLzAil!Y3`t!FS-|ZEgr`MW;4Q2;PrfL<fV`k%P -j`Tyn+sG7@mNu-Kz|({0=*!?-IM**|Gt~4d{wW8-L($}vTi_}MJevbvVkiX-5^T1cmQ8(D!78yXO8R$ -W)j+Nj33Hp2g<w9<!5lkf!o2byEy|EN^M7;tPV01e2G9vD|H5R3qmewEGn~oLg_t#zyJ4o!zwf6#H1j -rRTb8h?Pjq?u>0XVtIP9=s;b&NAjv#?k0`JvusknjTOcHWUjdFVk1+F98-uHsz)sq#T?0pB!5n*EmN! -m3XE_@#3r#)W%t(g@E2t+{4Da{(!#sPr%&zJd^;|9L!k`BQ2AAD}ClqnnESDwTh6}j8W?ul75irk<a3 -b{D1P7xky5zjf^rUVxR%9*!-pkI^ZFRbfC7q_UaEN2ZS0JQSgi81Ux8{9Ey3`_ub-FqC(`BY()zo<LK -<(iSF8B-*_}Q|A3*dfuM1>cq@EMF}cDX38%f-<n|HROr<xC0owr==bkGPFz;O++1kv{qblFn5=m*>(8 ->WC6>zam<^4f;-|lO_5Nz=jwg&krZ$S{gY04Sr;UcW2<58G$HLx?R6qUKfjMF3ooU42OP=+J*@#H~}$ -04@IM&1l@^T==t#w9-|g@oZY*3c_X;XEq^%5H!D03hwy|R7?ApCUd`4yvRn}QT4*@V1mb9<9ijlqFT# -bEd!Vn36?F)Ix=#0$>Mj8mork7Z6hzyhAvSt;e0hQpjt7$#m7;j=U!M%m;b(@XVlcLKShXH2`d0_P6B -laP#e%wSrE7yPU~n>ocM%nU(2ot_jdKYLvJk-14t@a1c(on638kK>F-$t#DNe_k9YKAX&w!;gf<Anew -c<uWm#n@>cN#8S(7C+U*L`Agi6F7ZB?z@J#SBNjEQ+hsd6C^Kn)CLFs)DdLd_gp@C9odRy6epE@9)2r -qZ7{~eLQHhtKvg-wYhSt?S)f@<#I8BlL&R`K*#W36xR)OF}^IeC|1`f5g_xus+I&(0P$GQvagF-_WE7 -+H_?gJ8{m7V%IVpva}W6cJ=o-M_OU*0rAOT9Ho_*${=8X}u`0VM;Y`QF5|vxCi*knAvQSx%XB)u3T-G -;;BEfRnt`2G}*WPR3Gz3WZ(DDYS<O1YMIH1rnRi8N{6TKq53GN=VYE84j3cLc(Z8+8vU5&Aut4+IRyH -kMKY|}J&`kU8qUSGeHHF+tb4IJb1YE3O>@J>q`uvl*Sw(FKTR`0>?tVFnTP2hM!nP?o!Oj&!O%S4MZh -m|O1v${bGDIDp6f)QaMO8^Qv-Bb%pg{-NChgZd{R-XQjy3DVN_3UDZZMhjp&sVrycmqQMCm|D+zz$cC -Gxz63b5kw%J!1)u5rfWvy8LkXNellQWS?Y1xW?uGs4F=4_z|5*!_o1R$0wt4c9owu^=38vbmT=(Id#4 -*7Ms#&@AY#)xaz`2mzcJ-+yarp4L$*CnoRI^v&RtrT(lr{JBz2<Bw*-B@?@BRDSH4^(QLC7V86x(Gn7 -twXAFeq;OajB!kwV7vs&Xf+Okc3UCqlzzgwVk9Uq|aazY(Ur~_@wKV228@CVez>#L-<Ft4`yKnFBo`X -c1aPi1ix{DhJnnoK&cqlpj%$)Iuh0e)<QpU5%<FUzF9SYB66y+j*Cv7lReQ}Y#dpl3T-q+u`9yctD1e -l6znNdf!dnvB|nL%GB`WDsySn+Fp~xFEBJz0wr4fhK6T!k_V+S#DPTqM%S{HOjLB?iQ07+{H?d{+p({ -0zn)NI}0+T5FRZ4mrPazGeqp>J08J19>81a?CW9)tjZz&JXm~e=1evC^#!iu8>Rp^le7cKYD*vx@`3= -+e!$mcS3j$lXTSytlI`eKz5b%!Ea!^EH%nxB%NICR)T^5_fv8=7r`BkCEiibPsR9uKnZ7bE-a1TlXbF -WgpwcO0F*LAGjrCVGh~YvOXG|XMi+ku-&Yh&V#O?@nKNDn<@PT@kB@+m0sDQ*~LNW}DIw*BA*0tFRu) -SEgov?`ve<|UI4N49AlTL(jgNTOBx}1sgD?u=Pd{;k~LZ=GFE*xBN;f-=$!fkFJHxXX!)=GX~emQym^ -4)s`_UD(cp1%FN`}*$nH*cT4a9^MO<;AnVzW(OD`{DVEZ(n@%`i*?op7-Afr`pfR8g>R-6HcXY3y3#I -Q=TK9^wWbyU0-fi=qe(pz5Kdd7wB>E#_+zEx+Uz7U%;GcV_lCoFdzOm80h(V@bzl7-dY$X{$SWFLwU7 -XENm-)V!uA;eQ$sI&uaB10>Z-t28#@*6dou)IrcTVfEigtPuU%1f|m@>v_1eA@~^2Fqr6?+Bn&N-xc; -aMd2kAiZ;ECf$yW7pp=S^rJXb|U`{(I(Q7sDC4bMXsxp(3&q!AYxIxgeI)~BZ}@rCS^ZvHje;ZZpR)V -QVNlHbot1kjQl65r&D3kanNb-Lav;8&2p36sgh+3Mk1g0Im_If~gMhi=5-h7tOaz4a-26u}8M-yV`OW -U&C@$*FJzM(b4;$dJl*?Hh@(_s)r6AXcv{+OBi|nui^1THGH2RDxwVy)oS49~1PjS@2zR|DQB?JlcLj -Nz8Wvz%zabaOs&!?*iseume_QBi=E%3J7J_3g8qUKRoGs9pK;k_9J6M;d{u=CD)PW$f1k%@ZLT0asv_ -27;|ubCnzxhPZn#A4s~*Btvb5g_<4C|8?g|(JS5gIRvZc|)gxfObD)aQ!Fk60Zi+=ja(S{_F;|$b)3z -<>%>9lN2TScH5y*aM0E|cR-1Xu#ych10{)W-_c)!H^OUw>4<O!%ig_}u3nljj@YqI{aqED_zB4+zjo! -|G@%ihhhV=Kh-@1Nbz25>3$yFq8}r@;<V)<(CI^kdH?Q$kcf>v?MUh?Py@hRj#0GkiZe*5N)nUk?2K9 -_)Y+X<wNpk?9zo(3zj6MWO$v{n0Pk?K^n|_i|^Bu>;1$DQus_8!a4Ca<2`L+KLq_1V}s?#JJ!I$+yrD -+UVD3WfL6A?qg88@|)O7=l#SMoH+BkY?p(z>hrUGl4i5BvOpKBeN|$dSJ&l|{FB*f$jM9-5cNPVMLQH -LVc-0H^7YgI_4+NcDenVz{N&S<Jrz6Q(WiSx?u74;_l)2P-yiJ-k|+G~aL<aK@WbIFQKF>;r=j_qd>b -vYTdQB=ce82SX3E~sm!*4~6*W@>dCJQb{6sn{G=9JrG(+>sz%&-l-*`H`s^^<UiQYK;=43i$Ne}m80u -?evIrR>5$gz527uh|Ab}wVC<=AL0$XRSU?a0s5DUF3#t>6-H^~CZXn?a&BI!4lHH1*MtLBDQ5fa$0-0 -kIBRf)qQ#&jmA_L~}qWilJwT>1k}`rS8r#+JYQK^8iWH7ny$Svk~$z1Qh731V<)z{?Z<s*G@#qNUEs6 -mfJ`XWgIMRUmppcmxi@?=nyNgfLVD81J;Flxj;ovcasTRk5+5+pXo08SU`^iqSKOF9ULn_j*d@cvW4I -B&wi*XKpi>tCA#_|h@qQW{J?D(4tu<`5IKBZ%-+=2s$HFVP)FHd5bF<NKcfQi!8^K7KlrLTZHi|5;91 -?2@5<)7f}5#46EPvDcLo6%=tSI?b5>XlsZrWF;i711*3~7RE_22F4T0@(Q=qmisxH?wC;V>i-jp7bZ$ -qbpH>6}=%OD1*9}a-_oAT{Sm=}&?kSE?s%8RKce!c3j+s+^#j6$-a#&qNd)KWCFi=ntohvt}n4&I>m$ -D3#9X|!6+@SLSzCb0Y%Ytmlm6Y@P$DCls{;0*hT)!4TgQ$*iHhG6;iP#kGzfh^VXeEjWif6Jb+u79y* -Xu|VbU|Z<5KArBgzhKl3-pMMqK%hyxW&h&~pn5)LzN(g+4|E);hC1ZX0TXiJ4v+KSAq)Hb=+peMdrA% -?z(4TzTAkbI3K!;q&HB9E9f)vDNjQ5<+Rma7*%E+k`%D5fRC3>fhk>V$SOV-u>R1gtMTgdbpplRYG=i -<Y!6OD3&u>q1^)1`a_Q%=&WIyS=vabe-dH%`#@RN2QZ4yA4x)*@jN8`-?@CbhBY{BGK_z05)&L9v98d -y+dXHyp%tl-9qgu=6#u`W@}LgEs?SVXYa7fro6zsMw#OVrts(k^7KX}d_*JQVpm>g1u@<LLXG{y7}x_ -eL<+jPcI5xk>PL1mu7=Wu)lZvlN&#aS78%sep%a7|y*0!84L)1?qz4rIS}wWSdXDZ4MSEBVi35D+vGi -k9(rpVKHspY)V|*vI=d06*3b%w~=Q^XAVcQcLL;Mk$cYcinvLr>LcrF%vZ#9XIXvN0)HvnkiVceoQw& -PAd{XKj)LD@yQ3rb-14TfXt(4Z6pLaMqa^xDXUiqdi*}zvtt9{xpYAY2x)oB?`4x`@qIe4o9Yx@pMtq -%wZ+u&{u78YgmI6KAt9mjhS;nivo=0MjM#5Z+zhVT(ctt(T|2@y1!gh|{E6yl1g$_2dGUA?(z@U?s`l -RuGl+et=Yg6oeJ!e*OlqGg(XU^=)LOT3@R|=VXW{vF9Hx(1^qfuApA$<LN`=7MAuwY(k_v$zcet4XK1 -?bI<0Qo!G3_%B<Ll2K0=AZ5(b${P0Mp-Do?}hT){j?xv_dvK%801>frCgQ?un;#yUW(NDByo8jO2J`= -TQ8Vg75}KcQ-k13CnDbI0;(2@cGHT!_|Z(K=O%pd)9#C(j*^;}4*DWdIer7Yf$?WwADms{h01$?7X>3 -w(h6uH`<#A{N#rgVC0G`6+nAkt6Jp57)FtD*rnt1dZbz)ja4rBtl(r@aW1R6XWa;o{&{s8DcS2p?)V( -xiQ`?4oMzX1aFcomh=$EbBF3}t647IedxcS*ce8jj7lFtz|JszmRWpE;I2fkQg3w#Csv?^XdEWGpOX1 -oT)F~C8A{vbZlHHKFWRwyVq2<8T0Cxv?KY9E}pPB4M2L1Bj+t45&MI^uk3^#cMKW2kV>tw>8^UE}9`E -47v!GF>xvy%5uy3;`CXS^_wDD0N_2wVzds6cro{?*U)7=Iy_rtOTXn;R7T{2C;xZV)i`?LE{gy7_oDT -ph7!uoP`7}D>G#xwJtODSvI9tSZhU8J|$^{a5py=T^+$BO$&JkD~pdIBj-Y6(LN$AO7~7#1}MWzj4R{ -qWVf>o9Nydzn%oWD5ETO0#S;B`?l8NEgZC7%^e&j*=lLguRr35;GzphzPFW4wvF`i0(u<;<T*=d+!Cm -lwUYC3#h~zV9!<{QhI;{3kfc-HrFC&&ax_RGu-FSDQ9O$_~5+pl}Bmn=N9L9HmCcPDga==aQbWtoX=` -Y}W#D55^JB_|7i#gr<&|Iw1AvYJ*n%x8N@I*W@SlWb(EJ$I3?=Un0Cb>iorc*?Nh_q?|7mvv7qCjIl9 -B(L8)K}GdjZXM>4&3<3mn$*;mu+HcU_PB=%OA6BxTr2M>4s|F7}jVy9i{sc_p(H9U&&;;jyQ#h(1%ab -VtQ0yo$h+iDD}n&yMFPZoKZRgH(Gv6J4bilMODuI`x&}A0}U6=)<$G^wBy6h?lA^LcXp9ZUyg-VJrd! -HAE#$&J2c$!=Nn$J2in-ZH0e&YJ5cEg8{~5Vx+2aJygl_Y)l}e5*`xNfjI0&n0LKg{jVgO1ejK8xVMP -xYLiUg-!1BR=Ew&i&|54bAc2fA8hSrG6mJCb3GRDY=72<FQhA~G@uwZ>VWWk}|=dLaSrs0|8&tV#|Pw -K92m3xGFnLdtt$R_rlona;gvibY0I%FS2pVd&HZ&86n8dKa$Ly}6{>Z)244V@R^5GNCKHF9ChcotV>Y -vmQ``5Ej0;80=-BWDacCG-fQ-sJUcD0;yo#bachSjY~oO@pXU_hdW4&>0^L;~t*Ulf;9W*nb3~z1C@0 -qJ9c*ZXOTCH4O7&xeJz28isGPpTS%t!y)}wT^?vLIsKELZq_AU6=**m&K7Mr$?oqr4W{7Y1A!acnNRx -$-QXZ*3#-BI=)5HX72bn<`l*R}$hMP7tW{2G_VIH-Daz<V1qa7D+yTigfUXfl6BwLeeRNXy<(t-C-(3 -iD8N5gW1k7XqsBT*Isu<d_bXDY`i%;?j4-=TnD&b@W&chM(_@1w$*|qXrn9w09p!kBDCWk-cyReTtyR -Wb_McRWLu3nU-sdWUMCYOVZ2%7^>>&;qq`K|ggT0UalI^AYuY0(rhcs`KdTNX5Q)OdVi9n5~fpSy0^L -pK4zg%umq;<okT8V{BqV6KcG{LrZC$YB%-uj1Qe+o2KIr*h@BDzEvRNcE~}$*o-Zff~TV;RhT+pN1U? -!`bqM8mS^rvJQ__f_caSQIu1?+LBHK1+or8`or;)6P_#StB*F36n&ST=|_H!PjOb5r(;|nc0HXcY&0v -N69C^Pw%yaGGT8;D({Att4|Pn6F*y7v8oA}LFl-#zPZiRvZh#P0HFqoqD0l2^$La{XC58cm#H>%*lpb -Oq4p6bUDd2EnyEJzj4z5JMB~-1jv!-l^74+`BY4J1Ei0{*KR-mSQI@RTXLCuQrf=TLB^yLR;R&%BWua -vEqv(gP9z($>^0@z+cP#qzU$um4O@C5JVqa+uIPTU+gi|_$mB)fm@$*p#MAzQmcbQ|8X^68^g6cW;q6 -rF*Go6KqJWEP{VlhM5w!<Z<2L@k_<l?Yo@c1q;9of+#i$5ID55#Z}NW_v*mK5MNMH}VW}4#Xi!Um#r< -VdrEIL0Yyv9L;`49H;m{pTnzf453%KjD}6Q(STZ{YE&K6xO?f_Rar_nr|S9RLj}`=xxh@?)rchrW{z> -D?~0>F=#%@XKha5Y;GCq0jI)1EEhb~2=ja4y-a#6@d7hlJW&N>prV1=CLAEk=whv1wqFRk91z;1QSW% -RBMilW#KgwwVFU4{enhfxiBCdgIvQTUxb!O~;&3mY^USWZvRY|rJ%_sD06mf~W0PCd!Z7bbV<kVEXtE -2B}bjO4R5{<2h<YUf_fV_5L;nMxdsc}i*F(%6J+z~cwL?p>9b%PUxfh%b5X&qJ$%xR6fEa`-NDH%6BM -F=gRj-dz@Ug_VUDkV)1mIdN;_FXuLl_V9lwmqum@#sk2UbMS%Wv(bWoiafzzWs0-igFcVwQ&9PTy@N= -{P-A~pQLqOHj1K68KY#*QU)nesPMbqCbi2Rg`d0Fq^Mo5U5cRuwkiIp&pw48>(i}11?}y2DxI{xL||^ -0g+xy2qUz=0e8c|cj-#gN-)}g)s`1(p-Rg-bUzU=fhQcN=i^Cwi&EJ&9y@2E@mA-DhleU<GGq|kti3= -j7Y>u>WOu`p560R6YDP6)mAXJKm;uVUFd<i+>Wv8jj;1ynsF`q@bO>}mQh@2#SIPnFCVVQ7S&?%toZ{ -(q#YQZaGj*lo=912BV)Dh9>i1{W6LS?f)LWyUr3D1sLXzB>`A`VGPZO0_xu3FD3lOmiY=8#=GDLUIMo -kTE3>A_tag(g7M#K;7sSC(G6TTdUafx&#J<N{0XC$Ma5vNM=&0y-<vR(@tl&QRET(1sH8kVW^Kg8U&O -@qLt=yNQzz>3HZPZKlS7<XmtvjLQZ=>m(r&+8c*Pgp5ru0yycL<pOo=Q(ZD#z-b`DP>+Ptm~L5K!KJY -aHZ~AM{mm(5Jt|S3m>KN@el#uZj6$M%W6PMDLOP~XiXTjBiD8ksc2c^ILjE0f)Nk8<<=a+ILZuqlLR5 -escSXS_k9WTn^cKGD;_EnjqDp7EWevPXJ5HA8OO($pDp)a*73!4EYtK-w-|*VWiA+W;Gv<cXbU7dmP_ -AR{esUX#$6XkY`+;x}5|QI%S>9MZifYPHLlYeQq}f3lx%SM8V)7dP9?cF-`9#BIVeh5*7^&G&N(|3Mb -cg1>3uiFqM*)d{0e3XIO-wC5*3=RF?(H2gShy9yjhwjG)VMMrLt{yoH4E3%v7Kf$(~V6s6|$Zfl@(rD -#K!{b5%@4o3O92ABF5SsaiKBSuE507U(a}7i5MF5AA4xSDBPk<$H5pnyrWuP*O$t3$T)1TiDW{Y6-yk -(Dd}rbQ)pBi-3V!m+#hhnGHWh;b~?3gBRKg!ud80u3_JfO<f#EE5q}-?Z3#{CaR6$m@#ruI9_2`dO;- -Yri4-SYl9OoYT784nQ~;6WOu*c$t#R%fymq^kf!S-lpwQeSt@!02i@X|sE0<c_6P&CEkVk#$)J)oalu -*bn6>>F6c4DAK5}Z*(;t{x6@!5r$@vJ)6&&?63{fG9q(eaZfhmTGoP&K&<qKTOdbO{TAe;kO82PAMEe -jakj(~@rArro;MTrOo~3_>k4#VR7Y6WG`k_1F#rt?Spo1aW`VXCZ;tihZ~d!_ebu{RabT)0StO1<4H@ -cZqN*vwd-jDtDI~AdlyiqRNkK4UJs*0p&OYObpJPr_)Yld^*XD`iu%F*Pr5sTwffL>qf+kf5?skfRx1 -ZVdrLw4cP+33zm}1U-HQ~+s<I9><>PNEre;jEIM}-)O`fJtfW>Gm|&p6FjTzl1|@nMB%rjyM*35wP5S -zMkdbZ=cL$MTz;bD;&1w6JTnV@Q4v4!dka}>!IUPnyB*~i6VT3(8fg2UHl21v9yY8QYJI|H<AjG4<m} -5oDbO;;0*PG&4KL=O<!JDN@-vw9m;qwnSGoGy1bv3^Q9G(Mbn}(cq6X`t6^xgu<(#A(lj+IhVA6h}<I -ndYM5dE<b7z&-xVUE8|TyVq~KpK&)H>U7zEAFD+Jzqf<r*v-POp~vZmNS_jf!;Pj_3^9bG_c}rdYAWU -Vexa2y{=a+=c3rhx!TX#Iy);mG*OtuHQl`~kI=*Chj21*Jx)3=+@|2ogZw1{_|aZ`3~XATV>mdyYpu- -{p78jAwv*_jr~82_yNFLQFOCm<v+{h3aB9I}46=i$3$afkE7JZcNoO53P6Qm+Gw!duxON$$)+c0@!a> -T-pY@n25OO4SAn-cNB!y#jM<=bm7GW|ngh<2cXCpUDVqLKer#Z7d#fQeJ$!f7VhaD}~H2yY$tv@Co<H -_A_Y8q*M6dCcHl?%jF>7VW=9X0*bcWiEBFFq6)M9673pFHUv)egp3Qb3`>I||HqBkZh><)za9ylT49( -xZqH@$?p;_ZQV^o3z5?2i5l$9e8mZ;vIvAhj2b`Wi%00po{t78Qq7-rKT?C10DD%)a=^%yxYxFZfjym -b-+jqmXK}>GCWxW-k{C)xmWMnwr{Uz`YW0v7)hnD=$g3`VFyl8CE}WC9QC2U1P55>th01Iip9+<GhF8 -q6FVd4HXz;2x`qP~3p2t@h=LN8YyMz`Sq!YItY{-3e5*y366@3H!nWS71l(0wa2gKuFKD*LC(sB3ftg -=#-Ywp%%egZw`GFc`MtE^VA5ai>Fbu{$a4JN!`;x=O>DHxF;?7l%<5h^ddh+TtJ6jZZhnbW4p~XzRBp -2P3vXcJxyvCe0BxDI#%$4p_<Vu1QAtN>-Qxe^F9pn?H^>>N|0X5I<9)JPMI=B=j+2cb>CI2KFPJ=m{q -M8}E5rrH~N4Q$nz!9~UjQ+xX*_Si4$e=nP=4uK|k_<N`ZD6F-F_3WWU8gjGZ_lpdlg`|1-Bhlr(5JmX -kxI%Bj1l*4;>e&@Rz%$_6{pN?<p7DAWN5D#QRWe(*Y^`geKYEmqqsr;n{V0;5x);ACk<Pu*-=?8*6<{ -({i-@k>ndakoJ~x05`JYo3qGJ-<&^o(TbF8|oR(|4s?JRzp$K-~N*bkL_*}Lw&_;xl%K47;84$fPsXh -hy-7iVl_WqGM)jevRD-*+Yec!ilc{X`b%<CJeMHl8!46YX_SF%#J-Zb9Zc4+{(wzM92RQhLpQgXqBsK -kPiw>VWvumn%KCOkE}`{5j0AScl)_+c@eHSpxc?!>m?=%m}c<9zDj(8gp}Vm~<JyGW|=;7Zj2B#x?48 -ZPA5*XdrdtRQd$-g_PA5C_)LCXExt%<E)BBuL@({dYO`9A$3(VI4Ac(eB}l_rBj-Ly1t`dA&cNq++Oz -tTiW#`t4kn<tjU`cU{6!;dPmq^xiIesnsoZB32wf;VGRg3t>U@E$xOPamMJygeL*%kg&!n`m5Hqn59< -0*){di=wrS_W9^Yw!{Nl7&v+KaGCI+mH4{miEV_T(3$B1+K$NLQ6(Z`LibCrR`FzT)XMPtO4~NK*MR& -NW+qOCdfpSUCU?XP%vdVj`%sm!&xUI(2L`IqA+^>mVDY=?=JX`Du%95HfH+5mU3O2m{#sJ`kOOCUf#T -m()k@x%`h%sXwtLtJJPiE0rbHZ$~A#1a`zmhL42`_5Z_B~dz{ciOD5zLR&QHHr;+5_AZLv#=*TW4T9{ -6@P}DH4<;L2o8!B2<}poKem$wG~A%MPzEprZX=EBjLnGxyWV0!kfC77?a><MrY=dz22lXIjNyj2F(0o -(QB!9qP$wAoqIqks=*)WK~vR-=?@({xFWR^=5BX4g&kXrjV(Fp#*0wzI>_EWY_XPfPRwDKmejrN$;r6 -mMZh&@#(}C{e(M5q*a9f`G|bi+q6aiMxtyF%Y#4}hwZQ(z8TUEPY`BxWw3iwMsdjZd-4-s+%8V{-<pQ -pP(e@A&TCD7#U7=uaYMXb{0e@Yr682>A{9$Vy9|Yx9K@R&>oYI;ie61O%#|zsln<S~ez9lBQAF|>c)e -LLKhtrydem)il_v>4el|yf`2<?Kxzqt=O9I(i=@zQ53$P{cW!6t1;djAt%6MVZ33Su)|{~#8zTq_3*| -2g1t15fzPpF)|1{6}e|y3L$YemELowrJ7;jtmL=&X~utK~DP3xH8SqVCjST?NufYZhTi_hBLa5w##DG -UepP5YfbU3)RL_4yP_Gn85KMby{4vGIqEB-6mH`cWym|y^t2%{y;B_f95Z56J-s~bM9ny_f~i4z>LXd -aC!Cu<PaEMoMxhpYvKZA8`FXOQEUg&}TeH5%s+)AmrsDNqlaioVs9+VzNpyu1`6kF9h#w9=-<?L$iEg -HR73xqzCz{)w6E%U0%O;8=p+%N)cwJ~T9vFa=`O21T{pQLesT7B0exAeB4L;339ZaVq?+dU4m#_u^ey -}v<6)J{(nJK)4n>il>GkJi1(t`YmgP7PQ2075S-Z*f;RW3L&@hZCq?D<|Ss^k9s2Tm`*YCAI=D0wt{p -i4FfNXX#bILsai&k2eJLM*!ByC&schdj6ecXA|qGJJ@toT1qS=8%OalhA>-6D}TD?8PUPbJ26ee=S+k -%-;KBsDTf|dT=J`ni5buS5OV6%J5NR-SPo9ROKx0nv%1N!kRL!a4slEXtzbHsNiE~)i@H69%QxE3OM> -GV2g=nM@M#<Mp2e89C|WgB7>2y<B${r_d+ac+q;Hux#q1bom1PJN$Vv=?|GR^Cy@*(q?I~OqT>M7i6J -NM=<CtAg(OvVm-Y6;;lJ5gfR5Z9a}ip?Vd*$P(_Wt4Hh2(j0i5FsZ5vn^LyMkp@hcz2*>?#tLrtqsZG -*l5e;<tC+D0++yCWL${e)Ld>ROsE9UoYg)A>BuDss544^i3Hu0v~Z5FIkL;EZ|o8}xg`v~uWxi8U7~C -@ySmDv(oHz=jsGV6B3K<V}DvZL3wnx1eL6OAw2m!Uk|r^=_&G%t?eQioq}kVH{<roynENBCn;uV?Gz` -b{D~E0kH?TTcBNsg^8j7^1DIHpq?)j$E<;kB>3a0s*00SjDsO!?x$tCNHH+#*?XU3b``Cq8<845cTVz -dn6b0F8>M|U@_8XhiOie$bHC$^Z$er@=;#Q`Y!vId$uYk<OgLt`7{CxNW>>2LCELWYaL9w1cjJBJZf| -32;E%l$60QfqIZWPofx3``$%F^vS#O|E?TIed+*Yi=6xfTGNoN&xQP~y(yNJ>SurOS->bgPLuyPJh%{ -81H<vw!x@f<y62P0=;kaiV%<nF6xE#FV5HFWlTFKh%u$wzb?6lwI0ut6~|1W^)4M|N0a(@prI8!d;IZ -@9pOi%E_h@X^#N(Z_UPITVwe0%w4ZPmZqdajzb8s)e<!{T^uPRP;A^Qq&PUUh`$y+jTsd#6H`13MB4S -n+W1~6H&y;L?(fgbgZLuu791dJ8hM8flGlFYfzod>l?BtKahz?a^m!ac`hK&J8>ktH~(w)fA5R0w?=@ -eT+*(q!eMN*#v!Cyh!FvmZJ?h@KtYNO$(kzJ#ZEY+2pI>FZ+!cbJ!3Y$8?)7pQz-zA9}DSOowvjRCCH -!sO7p)93DSfDXUIbb3bIIC)b*t}Az&$F+$g8E7Ab!4EEf+Cc445T8nrGVr<jizGA61f10y~?wT^}wJZ -Q#KH0K+VZM#8g;?Hv17D!LuM+Dy@N}FW`a&zP;AZ)hB|0oUyx6xznj3y)CsI&iQcXoFsemG7Po&_VoY -%VHF(n7?hi$jTJn`;5-vv^@BsZH{(6y}#D@V!Z4@#Cak#>DgYMG}(P7^AMx?GCXe4=f$}t_+KssI@;a -djWc(Ak#GfcM{w_E9j&H`R|hkiPg>*rWEG^jgsQ0U9MYJi}LO)gX1uc;u5!<^m?JIY{FN=C_Y6G%8Jd -<>6()pT`Q@MQ?rg8+$VSOjuN=Mq4dj%q6(UVIbA0-ba3&S;;>5a@a<-~uCB_s2%gjfbuLGlR%9mrquK -a)2~bsYRwGBFr)$Qc<hU-smq~%3r0Q+!&J#+UNF-5Wpa^o=|Ky=W2T_8O2nqwCNcBnJOp0*m;P4KDY@ -HC$zT`B6sGI7%S{925O+)}D;k+erdgT7+A&~_c#;?;F)NM6sAKkq3_Y_jB=aNzbN}ExcY*=zqDy0?oW -=qJe2<B)`8Ah!GRgj@k3NFcwntPwr%_I;Z?vj`?${R^=|CrF91&OrN9ggxHX)$|KTmI}J^d!DqdegE` -f%$U>6yX{jx&}4(BsEZ%EB0rP_4Wj^{$itGe(splX>L2m-uNRXKr+z&^5O4JOZzXH1Ht~6&H!e${iQR -|9buet`_~vPV)~0ltC?PZ_HZfeJ<j2q*zMjK|CerXMfu~lxZ(438YLv_FDot@%EvYc(-`le@*a@#Rcn -uMr0ZepbJpUgUd(~t&qSjOe{u5o(Xoj<^5?3{1rZ%V&><zIXFVC0pR-<V>#NlQ-o>b@n+D|dd5K|FLp -!nfVZl&<E4m~ho}V)op?6;>gG90m2lB#wS~46az~Z8d!3}x{Kuhh!Nb>!sOxI6cJUkr9nByf5)PT8ib -sQ?$h3qFe0{*6KE{au)R>%fTY4rwO&on(Oh00ToQj=<&gd>}y8I7Q`A`Fw9T@=f63A2w7J|#5Qs;GJM -_xFE!{c3{MW1l^J_Lmodsl|f4E}DusD5g87TxKj_GiDXv?WB{i-Vsp3C|^*{e4}=T6-9wI5?+y*5|w* -{*K(B^qextQ6p(X5X2dq39EcU`c;P)Cpi2!r4Ks~<aKfL^4g#ChrmR02j?yR4DLE=*cmt<X!OH_L4H+ -XWD3e^R4YaM8MnTG|xQLiDql_baGY;Klv5{~c&hvwG<u5=+=}vMFTKGdOyiIJalD3}ew!Sz`>vFcJIV -~*gks)hUP(v%hD6waQZ~tSpLZH7f4khehNf`iufA8l2azCShNJ$1EQ!}=8)PndZBNls89?c9PvBLU?+ -5Tn;41S;SIX@q?RyNmV>WQ9_z9<gNWeegsOF3YCU1R5$YAt<|h=PR9PN%GbCEygNNtzULGOh4X3joRM -V@XkoUoKg`JujDNU(jL*d~(#XRWWzla<j^?Qg*Y$d1|))IcI}{SQiZ)rVK%o$Ww`L3q9OPSVsO3_`qP -C-6PC*r0JfVZqbcx!WpqAZeI*d&vAC^gd(PM8k^&dbp&upUrsj5wm2&%(If;ziC?r=vSWi(nB+|3QT= -mCkd01{)hy1Cy$cyaBJIofQoN?66r~|NH4N9+FnmtTgcPWe|8y(HY(aj*ds1yTu+@S19>9{3D^a~F(a -5=CXD4(V+bp#rAD$O$44lRre{IIEX`~b@4C1TQuZAo*#Rev!seZ&1q{SBX$a(f%Ays$amhLa~X!FUaR -=dO7u-%S_*1OUK%$M20r@#A*aHYV3dAUYU#9qrf&@|^sJjw>k^}rWeMM5`)R%=W+O$Y1o;0A*No54w> -$veP=Z{NYQ8uJOP%7!v+i}$(gW{eO676Z7laSAw&EN29YQzVyHD;r?Sk#c|?$`o{#pK4egP9Wx=tYbL -5!8j)m%r=%MOlXkZPghvDleRjNE>mNU_DcBO&KtG+9~gVN&fiU5e)szQUox8W@aHezz6mGks>K4P!~I -VvpR^qZWdwadqmlT6%>t)PL>4ByER;!ULCJY2@jGdLi2jln+dO*)YeR+A3#JtzwFD?feVC7iVWR0d-n -?4JDgj}anC3*YQI0Cskmun?7Ou_lk0DIq7`+^t@AzkPD}m!-EphfD;vfmJc%$PEnF|Q8;<L3)I3^l+k -|=1Z0An+9)pB?#)dIaJspNX&67;*HeO@oiKg8t#@z;Uh0i05Bxm{m4|H@*)=cfRg*MU!R=g5|3Gxq54 -$NuYAU;SOmfl9~`Mh2R6VpgS!D&0ntH*psn;j(4Vw^y&<a}UTfm#&R59BFW?%4uSX_F5e4XX++ala{L -6<Pe|KSf+gx$Y2OYjJ>+HK`v(}v-y--fF$3eF}`Li*9)>RnHs5Ls*4V{wkHxb;-Nq>)rUdM7{4wqwcL -eMH)0{Ez?zL8VL!v6G9aB5$Am`Ne`OEr&p!KX1bpUU{X6&s5a7kx1vDIb%BR<iqg!|5I(<ca_P&!G-6 -TA-Xih}#7Te9NKlj!(3AP-MV^;VjIjaKg5)1dVsisk}8sbj$=)p4L+|ltm4!x5Qo7mMhh`A#7w}f~%M -VEr%cPQgqdciTed~eff%(14^B+nW%JH)T`#$-0@@DdHTL<c-Pve{t3V@DUOdbV+OwcYvc;ORL&>h61~ -^lauIt+@8sbU}kSWjxHy%6fM!`NoPpW7y?VH-{+)rB%gf^3-pc1T2J%2bACUx?lZ0k4xH<?*-BT@eiV -a=~N_ncR;n|VP%A?dATU1WLhX(wd^;GER`9P%LISEDVhSV8f6&M(bt&^SC_Mv9YiHsE9lXX^YB%@E}! -sl<f3S_7O`;38D)8Lovq64deH}9aR{@u=o}!2GKYop2f%K*65q^vVDyZzrzV8=M)N{`$~@{T&Ue$Th{ -05b9u0de>*O!$GLBF}h%X&oBa**TkgIoRjLg4alG90%-QUldmco^FOj(d6|1!6GG)#vN#f9~VF$Yob* -4ABlDfx<~cEJQ6=F}B3GcH0TNStk!Jb|GajWPoRfzY8i!z{-@elxkk)IO=E1Lg(p=$3z@9#Dx3RN*(T --+yjYaQ|FvFykui_Y7sCMX8C6y6z>`$2d&5!kGLa;sw>(211Y}RFXq+C5yslPl0>?hYG!H+<b8`gbRX -@B2%g;AZLhOgClX-g-A&%#v~Du>Dv|*4v&{G=FOB=z4MtuFLDZMJw{wyFJ5%KPSjmWSDb8+rJH@$_a4 -4DKX3Q*0G&=Wq`%ma&+H&Zao|}8cC}hTuWgQ4h&~Z*2k<jhkQkVb<wY$<OP75zsD-6xpRvy{4Wc=%)^ -u)2C=OGZrnd>4Bgig6Fwl#>*>Gq)X3VF&9!oe&;g0zr_vK0Xn3S9PTobqn4G#_n$$4tZ9M00=;Q0SMJ -^at&@W+RT|B;{EAB^#Zup}^zPkndg--s0MK2&w`<c9%}K!tPwBZh-}QT@oLPB+|yjc04M1L5^o!*{-o -kmdD~#1!4;FP9)yRdadE<KO~ATwIXM@o<pgMCF5yugvaQRebEk(w<~R)z2Xv35&cV)!db4CIi;_YBeY -EC?!{1@{x0H@AEqo*CEft1XF;~Xq~$|&ℑmg%02<lL!hpR9xKC+nIN()#{k+0Kd;GrcQ6E3gLf1b7 -2cI2C|qa$uxha8z)}1JV&xOh*%rAswRGE!rpF;&Y7I#b<2hee>c?_SwVV2i%eY{6RalDU1kA<@$2LQ@ -&12-oL3dnl`}D?u~a_5Ys=nge}IStjwK(;V6uzDswEWysYEj1^LoWAIEv|Y^9J9(uit})4wj<dDoQX_ -FyWq)4IkpQd51YVNGIum8iRcOag`^L^~ywhG^qXkQK<)FAIOd?0^2MvuVX4XRz90wg~8dfLGSdV%H)` -4@ZVkNrZR)b-Zk5YU6<E9-gP5gy(%NaoxdMH}SxSrj+?B5b(k(=2WeW+^606ji`?-#Fe9_Gu<&XT*pr -zKBl~4fRj@`l;`J@n9}e!NlfK_<M(zuVvS|OV}~sFE{F!`MK|PTxSuEdY=WFB^e&_~xnXQM0a<}KR{| -Vv90E2Nj7Fi|vd^99)=J4iWYC$Ev@n>(Z}xN>IPu)I)2hz@yj_>=%hy8<wZChr=N))>SDKF-Jc@RAo( -9u@;MbOLhUx1M-uv18={}JDc68&&osB)|j<u0MiY9k=XObNyfRl7UH@5@UJstH<d<UNh6uqC%%UL~#! -*jDfJN*4%L|66dL;mLPpOO<Zw@MFXf+tP8bN0x=+_cMssfgz(>9=?%GVm{aEFrkT*gijw6jGh{6GM*+ -*PVuGU-{Vs4g2j9;_XDZ3z^%f?s!*yx3H=isy0?w{Kp&?)BuQnz<;$52HAc4T5?B)o1GeuQtGEDN#1b -(RjobpefN_F?MAltT!h(#B*~+!OY73DmsY=TzF*=g1pn=Y;=kGV`ra}kVc(hv7Vb?q$H)F;Jn=m%L_4 -c`#HxRE*fNgZV13sS*}6Mzb5zz1LlfML4HIY+A{R9RFpd!#<4voa4Z?Tvry&9`#AE5m3(1}E45>W7ET -zyJ*D+^ry8u1><v7CTq?0oTKMOx%5)sGQ!*Q^r?P^i2hqRQP0Y+-eU{1MZJW(F-$IO-i);DQhlG8J<W -5D6<^QvCIRFSisC)Bv2!d;0el;nJl?Nw96W@$>1iBP!Su1bIES$snG_WuqT#csL(9dJ6+;72sb^dB_U -S@<Z)`2)`+hIcP`ONsiypv(HPy}?T*md-p?B%YDnZY~Ev#H0fSW;%$uw>g%$ajs2=p^^VrTLQTxxl;E -Ix8Z0IEW@5ImEL1;p(Ih&IJmx<lvd~G`r|NY;cj^Pi?<~f8QhoGSfkrpy?14@>fFO@M|rw&c=N(&;>~ -KZYRa?f!_ZP(@F4QnKENaglnJ8D$dJbAoi~lYmZFvG6ob55&I^gYBQU;w80%%Zw(9X3#2R$x#4P`C$h -ChUXals@VV+4!AYm_v5}=Cj<>E=_pjq!d^NxF7FXpjMg`KPE#ov%~Y$x^-Skz>*#QT0Zp8$rj*I6*3= -Ay0p440QKqFrB=;5E662iue7!NH3!zdU^T>WkNd9j`Zay;kE_+=!FB+Fy7kI*qwMGT?hmm>r12pOE)+ -He)yvH{{--@YXnVON4>ZW_0{KLW=J{uR?AnqD++MY3K100^pYM`@0VV2SJ-fum5t*0Lxr=y($2yG^c~ -nT^Ka!WC^;^7`}*FD@HTToavEDeAMDkL=Lgfrt-_-Y++OQ3iq5*f<jg6u$Z=}PA69d2IiOO05Et*qxu -4f;wyS-5T@WG227eHdqO3cwC{49%{b*?M7p`h)^KmE5p`GoEw$b_wFO*Q$P-Ib!AdQ8uZm-m#7c7)RB -&!lT%FE~%rDXtle-JoFWqJ^;08i@=|;yK`V#8b?iOQ-j*u`NR4mH{2w@CEFf)F}{<B(rT`a3J9BV3_= -a1D2iJlr{r<-b_S@hk+BuR-{4r%#zIQ#w?TZMHE+UlxW6pi}&K=*PVa7JABHr)p>H#KW^%>hHTBG6NG -jm}0e#FxmUwb*BnM#<V=y-Og@cw4RtN_~@&qgJ^ZN%A;3b};1ML81h=Hawa)>T0_})4Y1jrcKS%@)?( -W0wDs>#r?xP33v97$YZ194U>E&Z$8~$@Dmzq9>6VDhBQt#ryfy`qfjhnQJsd}Gfm?F@N8fZ_>EGL?<& -jV@{r8dlz&Sr;vf&eRJBMXj$XemuWIzK4(Qf?iPO<adyV06#N3942mKlS@1jzTq<<ii8V+nT)CIV$af -RXRmW3nsy)Jj|Z{(7cR93(g?3K-q5n{V>S$ljdakU{X*^_=I(#oR^+56tRR)lua7aAV~9*`WG;!C(Aj -+EbmLIrY$1hN?Y5jjLF;#wAwxI<U2^5C2_Xy$vUU&h==H$AvTN7_2V>25Hgh+Mu$g!2xw39$)B8gQ-` -cD-A%j)Gx2->x&CKl5?^?;)FHrj56rM2?c4{1WK>;w}PsE{<6zJf;wulCpfq;q{BUErS~YX5|JT#Eb7 -0%{l&a4--0^w>?COKI7|VGebMGjvYqUnL#q!uHcYaHI=Pg7P+74g)*9NvIy}AdoGpH3&R-u&h%~Io;d -8F$r40vCL%cgcFV%f@mkj$*BB6Ea~@uNys-{xptTp32{fEIh67KM+-r3Ai=sjCPWMFYAMS#>o8*En*R -SlpoC2nQJa2*LPmBfbtd02Bfp>BVF22P2hv@bum6U7xd4vIB=&7L`xZRuv7nlQ0;^t~_CQf}5hlm$ej -zY@fizHS&Y2&aKI}>R_<9Ci1Dzm%BJ_MPy7f;(3#_g2Uq2hwWJt$^T$B4qnCoSca;XcN}y4Wn-ehnz{ -PbQxl_D_E_r83hL1dQHf1;yXc69h_*jky7|YRk>MK0Ir~8zrNvM58ox-yw5{>2^0;rLntByuOBs${#& -Bkt?h~_!q5(>oZ=AKOtv>F1BuIWOwY~-g&s?b0-Bvd+*n>e#gekg!b@mYB!p-E*c|tEOp7%X#-+UoM# -$|BX;xk<YfxoEb7^1<ajwoA1h$2qAQ{}Fj9Rx2ug3xsN(Qj*Er8{5*B^WF=A()ozPF#U)s(f2*j+m;r -6`$+|EP(B_O+5tyJ7iJ;x72)Zj~JWq0c;&j~vjRN8iT8z6`7&Y(=ul$H}Xye2K2L^MonYvl;^G(5`m3 -AsB_W3#l|tNF!Md;ex$z^#8v|D7ABY3f5nO9#jQct0CHB$LeHBTFxj{^R!#VV9m^#DR*qbF1{jmjToj -<{Zbr^Q%kzXXqezrp>)ErePT_+nLH}#~IFRX~of`O92O0yYfSv`_0lu(Ck<NB$AqeMB<CHb?{5x)Ev5 -j`ceB(@74INxOS;dRuFv=I=ZL0ckJ<l_}iQt;oJxNF(g7gXQ-x`o1oEN%;vs(`||yZ$-8gfym|fheTv -P!e9f$Fun)L#9N0byYWRJ#TvW@;eHUQrnc5&ZxBMBn+GL_8Fv?u=R*Pn)SSZhuwaKHj3~3&r%v)JP#D -pRq8!7|NoHN8kyf}vrkE93@t)puk!mT%JymnB88S1^RE>X?98t&)+CRDPIX_cF!m<}AgsGb_MqgcryL -r&U^Jll<5<(mz@8a~<(3t%+I+0am(`!fQj3u7Zm^?i?fI2p-GflOhyzAFkU^ukB#?7}go{i>z(FdkGo -_u<c9bNw9nu$I$uhOA0sG5J`oq&C4ti3XIcIIXYCw6=($VSoxvrd3FECoCekG%OcjJ}(z!@^H~N0HEo -XVaE?8rHmro`$x~bz)bTFl>65BXAhDyLVIy#7kMCarkhYfQ6YzCO;s-E3#l`mB<o#?BGNlvOfHU+<l< -L3b47xl>?QxLuW_UWlibTD`H(NZ(YZ-jXutg2P)KrYM0?AjmcEmO6*y3GG5Rt8uI+@xn|4h|p$d%tMf -I5c?sQ{rXm{xOfcGAoDS~Wal)*TVlHH@DTezxw%iEF6GCN~ZRQ8RUm_E*8?;)?SG0l#`_d@GdM<S2zR -L&WWW%+bHU6u2XPeOE!@HHGP=@vY}a_{;2!y2`=QQ!1)f>kOGfe%~4(<;O#rz}A8uFs|TVn*^k5t$k3 -k$_2F0OXO`v?NtVbJsbmqUs3^y%qDHr<y_aMVAX<I{u){k4|$S3d>IHP7dcXI?9Y$I=<8ENA3Des(gX -KLRNAldIhz&L;K?=hmTIuY?;*8^j<|V5d8-OJUr&6Ct4?gf%n43PuEbdpWPL3O>aoX)Dws$D=b!Q+l4 -C!P2u0v3gge7IJ^zMqr>Z5tpmlMG*4~s)PiTM5>4NWdW`xVjAA892b*1xLvw#0Y_dcJAad`zo$8Wm=G -lINi~2`64|mk6p@S%@pLVzpck~{=PS3l2m($KuPBWXkzwq{H)aYKfj=J}+m2C$0XRlt@=h+1u>I*TUa -7f<*Q{2D#D|^tep9xRNH<)AciMe<=@1>)#&;18Dwg>C_fr8l|nHVK!9dAl5Fi$055l#@Pqn-fDC&|bo -@K_+`OmdhZK~mXa5Rs(m<>V!rd?1zdlVw}hok+D0N)~6*yUAqr+6f|Zr`46+9SV7O4!v+vw2qXsMn#g -8>*%8cE((^1JowaY{;%cMJA=FRkY#X`QJE@@`$p6y38$)a?~22eUM^=fChj|uxC<$6-5%|WfqXwD0vQ -_XNI$%-DB&5%+yaG)V(MGn7&UodmNfOg=%f^iH3E1$BdyG*`D1ZFKmvV|87LEs^hCe?|L_0(e+CATPJ -`3I_aDl$??0U4|L21^KE*Cz=k3amDV#XTyt@BSw*)_h=@MAWj>X5QJE}(g&HFD7e;+EAIjL4p>dl~KC -zDhUb^dBGG{W!Rz}Ot`iM*8(9M7>IQj4FT+k6x~jP4+NUS5}rdPQbwG(MV##uw2rKK9#th5jFC6v766 -UeRH2!d^(R4o9JlQd~9|sR9{i-FGmYKlZC6`442|VaL(Zy+1mBcoM*X*KL&n>XW*(MZ=C<Z+^=h`5kC -x@f&dqji)`DO<|$Q**v_4%lK-G|1H-uO8<H5OexGrTkC!{{-UE@!_P5d!rN#(*u<!X>UJI-X62$oB=k -TFZtSuDtNv*{solt}d~nN7K$v{m??PKek5D1;jLu*5r|E*mAd@09QcIBGE3%ero35!mc)^9vYJ1Bf9S -nBHj)HT#vm4MvjKDYsw=19~0X&8mon5gz`Q8MW@d7R;WVwMO0G+eoqztMhPOzL6Tt|=o`IE-|JDHImx -nWG$c_s0-^|X*gFw;b{DSHz{RpH1BSqnk3QyeepH0ao6o5L@7Sz!XDY%v;nz5i0lA{zz}37$x&BS}S< -M36G;V2&HkFm+L^$K;KP@}S>3RG?CmNhp@CpvRa`94tm=H#`+e(+Vb9Tv`N1^%z6Il67o4U0t3V^#;| -slsrq*siu=DKNM&Yb_JP|YkM3_BwkVztz_{N<utKJEX#B?COdMFw#n6HiYjjVRNYvQYwAEu6;U^9<cv -Jguf8+h8;lzoE(kH;2P<rq9HwC?^sc%mgjCGj(u`+hM~=raFe$pA^}Z3$0R2nV4)JwzoUB&N{{Enekh -eb2LgF&8ZRoye`HgJxyj;%NBV&-?Tr38G^mubo0^dlO!o&v$b5!x#`gbTfC1tVXY*kJIS8gkJ9cqDPA -?d1v8Ke>4NVKA_=Ag8vMYtA~kDm=SasKjPhQ?*JcAS=GL3)l$v?IV$+3Dg@Gi+G{E-9BB7TsYtr&^2F -Vc!Wq#!#)`Uet+M5ioIRr+Bm^qE2LJ`d&w27u3GBB%8e152dHkSo=(<KDTZcTdjfYogRfj+<mZ<#25d -LyGXNLjS{_Utd|9=T}@71!D~3}+8JyY?37$kq7C{brSvOYp<X2>mp2ag2CcOR1m}!ypVO_+(X+Wa#pE -pX`{$p3E=lCza&}r!aPe7P<3EyP>v8_O{Lw=ciJ~7L({B#S&aqId<2!=%C?G;7T|D2RsIac<MSJ)N-u -d+Ok-ir{`FIqQ5E783&tHZeT7Mt?3OIT=w_&Q}6j5JnQn0qLH${V09ty1g2)FxsNk!zm;wW&<2x`aCH -Hc%`J2$V;D@3*PSU!<Z&*4U2F<Kf^dWdn-$MEh+N0o8hO(TXWeoE4tkHkvQ5YwTaBng3PDe2f5%5K7n -!)9hW<%K<u(4@9^K51`}H7JbJ34Wc*I}SL?6D}VcyLHU1<l#<`PIwwOP&FEN9SBHm{&w>EueTfs9#Y7 -NZ$0-qY&&%j2G`Xd^NU3|dG_oId+dt?>0V+EvUXN1{gn{s&8aZB#C04H6yS%h_LLa+sBc?G@qaw4-4h -exY?*o^&<PJN%;ScaVSJ}k#9Tks88@^NnvQHR$|%G+dW>`{&(qc<bi2MqCLpAG?PDRqD!82vByKfK3S -cTRi*h;T7;|dQJ|H+1<<c&N>v@Fw=ZF3MGY(`|2=q9BM0;7S`khelgOX{r+?2hI`gAyEJ{_h>AiE8Je -I|?DF#9&SS_;xz7C$i=jE&F^*Zvun!<v;x&tH7|;;YwhCeL5Kd!K~W#f$uI$jbs9g>jd5coq|0dNQ=+ -ed6-Cn~u{nWJO#8-M<7zY`uL<$^D8hM1A|w`&ZmD3^EqspObEwUw{*}Ayu?87<z+@5v-x^pAvjdZpt3 -W4x==W9b4s65Nr1?ymd3(!kDP1M!M=ZvhN_3-40ne19};|g(&dDgyD2QsSn%xyZ4RN<vC!q$X{NqUWR -uakyk)KFcDGd7;0n)Ul6>3yW*tOYQcNCf2-4DpEA!Snwf}xi&c5IH`ju&Da~I8XsiV6G)SocJB>&ID2 -RCwt~Blc6}4XisZi-hB|A}hVvRO9JN=U)a;q|BQrf;Mq@qI@{DmLqt6iA)aB47wf`X7QFr+%1mRD}Nb -e&1@L(EO`g^SmoQ>{teQ4Dn#Pke$@oHrEEfm+83b2Kdlq~ykx{MBw2$Exbw+G=E0{`cWIf&vdan-K9% -CO$*DMg*u*Niv0Fz02!jL5`~oDbKPm0u`sB7nuNbK4x~+)s-&F$+C4TJPq}1i9OR*k#^ds#(}?1h+#Q -PlDWC~o$!Jan{!z<%73OAIJod!*@l5l{(draWjTDE%{yvLjS{iza3|~4O*!iHj>L6%`Rw={Y<c5W$U* -^J5R|{P<fxMZDvdipQ$UUl09+?ruQvah9%6O)ZU-Jx?g%n)H$=<Hggv;TWtFV6DoH5IH`!1bo)sWEh3 -a2X0GmL4vhS+R`VQ1@rlaQW5^AjE_FBXqro=lqAXOV>itdrRcX^A3OCZ3b`3oMai=8SL-9vF;#eaH9i -srv5DVQ7^`Py<jkanTM9D^zwvjYXoZ%zVGYFM^h+2{YK*E^&_<q0^~GFC~#f)sKoCH{*F!jk>?W_1HR -XjQZ7kdt3jjaNu`Wuo>8kJPw#oX|*!;>8-sO!i00x2_Px87`L6tv2bqy16VGGCU#JgU=p6B+h>D*`rU ->=?8j!P^Ht{cIwpt?AzmOk))$Wfh^X;0bD(8!Ue3#L^hpj>4vte(x55Y0JDp=R#mY^)9SK&VLEk%ZKp -E{l;-me?yk-{t1Uf^<y2sIh&lB!3bv!B^IaT2Ika$0u(Hf`VwJn3(($8pE{|>#<fx?^qH-=Z$s@zH9q -k`KIk}xOT?Z$!5moYZ%q!USZqq#%IZ&*hd@v47(*X-+9XZit^SN5(#f)lY<MsJcE>8j3lGm_<i3lfT; -1q@K1@tiXKFdlw<1m>S#-Qc{)-k#MLck6LG}N{7u05iq1(HcPL8m4afrYKSi?rnUxOJ>Fk0MM=CP|>l -s43xE;la!v*PTNGKX>p?r>Vcg;mH`fR}ZrHSc*2gF?1wGQ5`$go8)pj%ksucw%n|kV^v=Rk3?M*i%-j -Jv%+W<@28!ZP%N-0m1Si9#vomcyyto9$h!@UIr)xl5T*L-PxLN~U*hY92%cQHO=~$1+IZkid4~CM*jt -ahTJhd7j)1X9zr`dWi%?B_yC}?fpCMniwpiM@c+o(wGugOm7WlAPB__ve8hAKSQ3We&ubT22YrHMChq -7(viQA?M;T~OgKe!8D;e}9fKDnSQ?lM6H)w=QH1-I@r22*HX^3qy&>-0{Yyy1kP(Z?@JaGkolgy~l2S -$(y_lDDv@mhGWVn@$0jT=Pi?B@}^tsymKex0}s-c&cNm?lhYx?LdJTYqd_%;TW2DI$+pPbaZ683)jqt -n}k|stj<dXT%2U1H|q-bu)RfNjg(G>5-%0+Q0MgMxPo;a?E=v25)gs-MVhicjms{jS=>KS@N%<Q`~nK -Lm)o7ws;&xAe+~^tBqY~HIlqC#U%4VtydNH*UoW}dy4-Y4)nXaAO#@OKyH^?vZK5zNXXNzO7%Lj~={z -Vpl<Tuz^Dn3%e9~or(j~V!cB#CXqWQE}-+#koqSmkjrEbkp@9e}q@(YUojs&qfInT>A*0^3$Tq{?0q% -DO9bkR^Uu+x%je|wkWTdJ|qtcq<gGATs$)OKhW7|rPZ5b-T$S?qmnLd*2>9tGK@Buu;wxCX6c{!9pNW -AQiWQ?}@U0)P5-)5hj`tkOlPD<9xrK(yrO&PET?+e+mxN<H_(25nZ>1FlssNdi8mY8w0o>E>*{GxE`* ->m0P?ITIsFbk?Gzs%DT#yg@T#cDg8*myF^ALAVXt;lb-luD3Q*(%>LvJ!11in_%yRvqQR@aD*NOQ{3) -=zqj}G>*wEm^@8?MuDR@+{qJw?55LdhzoUEqwm-@_*ceL%zIys~)R^g8S77+ZH~$mK;Pd1Eb9i!pWGM -a+A6=JC_X#~+ZSgrd)2CZF7?^|O^Zb6~MexVH=ui0v5F5)D%)fo{_Rp{1y~zFxzr6hN)$6w}o;`i{V! -Wp#bZ+aYk$3~-zZRD4Y4kNK#hVgKW|vDYp}mAl0A}N=P+h=>1K9%j<y}7PR-q)?CEQ=_(QqWyzxYoyS -y_=)hziMxS8!-xB#Ud9+OGRj?n)J;lp-a-B8qDg{t-ADSqF1@ZoY-hXh^7Rr39MvE$V@X3QgXYBsWvt -F?Jyu?teJ`q&>l;U4yZ3C2l?%jpW4;n1oBPH=>_-*f8C!i`XY-3OmxgU~a(U&Je?Re>bq0S=<Nq`2_2 -tI40`bc0up}QZO<c_P`F?ywFV!WrvF7*_&Z<-;=jY@h8oQ3ad!Q|8xe^hF6B%u<n{gQdZMnnq2k=kHe -VDMWgv;ag8}g(#k}kcEN&bltRDwFJlnSU>N_^VI=!+iUt;x3LjEtGR(jVQ0KU<XLw`Jv+NmOfOEx*G6 -;16<%*D`3N9Dhe7~C`<+%W^>g9KgTDJ|H3bV@v26r7j4xdJ0chq4b+(Vw+o+FbR)3|I1wf+>5O}L;u8 -<ZxB?2ap3Lk_J$Evc{+oGl{w^kO>8jL{v%yKPKB(Iw~ztK;BLSRH4a@f1CbQZU)sP#rN=3?^qrxWaE{ -t{mOiY~F6t%%rM`!+B>Z#>y8U=B&7bpjlXNiWh}9QMtS(Ha_NHjs-~f3AS!oqLUhwv!!tOW_h`+Z<a5 -pda6{<(2hs0NJbI3KJN20SnBw}B@e-dN>6Q??`Zz%o4UC~=?X+cM^p%k25ZJ?3_BQue^so8_SIrOA2U -pyJ&=)MgDw-|24Oq+zP)EcSqDz^$nXDg6g@jiwB>dG{P_Eu9Hfo7!4voaTOpBXo6#Q=V0c<S|Nc0?_x -%aA__u)y@c2(MH9E6hO2^wav-I(fY3j-I*A=4eY&emGrvPK>b$l;OvzE$M0^3EGJobdZ$k``R$}%~?+ -Zyxf(Y!pNzj5^B^4k=TL>_s3;$MC5xBvm5ka;gsh?0<K2-X&;PO4)+p`ACK;tLMebjtm-C-8vpG-M#7 -I<Lhd%|<Xw_k!-INGUAE4PiDq>3^c42pmXk4nnR@eoDHy0R@uEG_dHRs0}iXJKj(1K_g%Rcv@Jyw{WX -m<>yVkSy7gA%Wy>Y!J$luG&u8Li^(mIxu$VDFdBW8r|2<$8Jw6apOg~PCtOFco2UnRWB52+<g4_BhmB -u_J#z0%qB{#m1c(!9^WPIpsoxb_&BG+~4iNq!DH#qvpp<2MiO$I!e~hg&@nR(u1V5-)dCLx-&~ox%=} --1!Yj4}o%U~<hn+Z`z1bcdXXOW&-t3=PQ`g0NmuONkw^$WC@M*45mXSs5_4JRL)C{@^IfPA^)8-vsm? -laR^^q<4c0E-d_Om5%Jsz8hkO91;=o}ebkMCLl}XLb7;;z2|!$eysbuwrP9T8Pg2wb23^J%qxY#Z?c* -`Iq9t=;X6Zq2oF%t!babiOGcthGAw2z%H@EmNd!#v6G+y6<b6&$sAkKLLEYTTqk=yK)b7LPN>##UX%* -hmLwAzt~TR$#Q!FhF@6wBnuw31yImVcr}mhBKe78jSU`98chh|U0PkyZRbK<?%|Dx*HN`pQ`A`RLArh -T%`L%P4lOi&N1X?0C&0<lVGEzBwkzJ}l6(+YwYet}j0!)qu-K$~@6g8X@)`L*c&WwqC2ZQk_aIMj9b- -WsR;lfb@4ikmgEh!3#6)0yywGz7T(gmDRPJa_`iIN3Z<P`^wZzbC94B6V4hRzzBG2R)G$oq=KSFOXBc -%v)NgWsO8r?RSU?HtNWPekczVX({c0-drV=t496igdTc_$-`*VE|)9HM6PVWQ_mQ3dDpFicI8|F&roc -)&)f4%(&{X`dRB#_}XAL!$z$8`mO=yhsv%Q<@-kqW{qi#D){2Ol$bN#JkZzzoz*vg{c=K)!ZzbiuU<? -ENG?k*IElXo89(T!V5`blwXqBQIePQ=$=6T+*Xy@qm&iBqwh4tmjVFddbn+^h{*fi)1an}qeE{<_kc( -NEI7b6PlOA)f6UACPa4X3FMhY}PN>uc_FHs{IH8zny!v;F-NL0Foqmk?6APn~<Y-DRrxgZyeq6!L9?K -qgjfEGHO^&3~XixRx>LZiOJR>3lBG0t2x;mSl7n)x_J7$@1i?6(ep@2Dq)QX2$|i<M=CJCI@DUb!*-e -z?+HPp#AF*g!c6uWEG1!C-mO#wV~4OsHkT_2#4Ig@Ew2B^_DB*9Txt*ChonlM0{y03h9@+R1B3(8{m0 -4No!~J~@CRMLyiie($HoccgzX@wit<SZ09yPIc3TnfQW7x0UhfmXNq8+KbuMs^`sNmlg1FJ4p^P+Lno -jm*qD6H7R}s`+t<`!*dwqY=cx2rJJZhP~8Sc->aL(heJ)cijx$)y6^`Co!vbN59QVDe{w7R9zZHT4$@ -ISsPm6Q>hm3tJ`SnRcOX^%&<jcgOLIY?7MgT^LJWB_=>(m;bnYX8lt8|5?BOMeMBtuo^fd<iFt>4PNJ -l${w7hk8R88u@@aqStr)o9H+!|f4DR&9m?H9$5TOLBO#yTV>xrwt3EVly4on{-5dKM2h%LUd(CC3^Ti -WXZ5yvVa`Smk9tCZ$>!bFRROEuoAOg7|u?+@KpxHMfWcYWh@g>a9)#d;Q}w0mBPM5p}DRrF#jE2L5kH -AWDWjOP|<V59T3{OQeFf5fn@Y`;+jc{n&1=RTNAcc7tfkprhQ$R7vWLK*aeP7v*^|+xB7p)wj+!!=^| -0ieCCQlG5OEz|b(J#&|L$uowg6j+)cGzuP1EAp7ouv+1);W+l>fIlEX^Ga_ZU@-Q~~+$wAje03#OJz+ -fEZ-4vHixj*s7O=T6)&6C<z$i8IzS}Z0+#;;ehQIJ?hN@&O=2_vmvMVg(sZcJ8wZ&si5agEFy7U{U!o -=}OIK@g-IId1vG#c{f#J1I1JzA+)R`#wIyCrdm!D5k}qsD;LX<}$JaBv#=3TkE*SP0jal^77rPF@>Jr ->)_n_sE?~C@D2j4!wbESw6?(e?7EXDEtimX}9K2+3=qN{ihN6$DfvnlqeC<+9WF;9_~vRgsg7zrj=)Z -uQ$ZcC_P&}p95fEp%sPT%_+eLhp&VY`7b#gNHyDFxmT<<Avtn6BM2fy3>Id7nLW%O=5PpwQf><q!yY$ -tE;4mhoj0^NwWCL^$+{?0xVIrnFo7ez9{Xyk-!D<3%?5@+gcjy7C+RiJC-VWgvjZA{g;;%i8Fvr&*v- -7-OWqwAxMzb2rHrq!5M=Mo_3l3E+%XJ^r}c)K`t|FoMJrY|_*S(f*+ogQfIuJ*fKEPXX=8Rx>>Z^Yf& -3&3FpF)OW~u_N-JST!yj+nE_@icC-};!TpI^C5>-swCYH8lG<CAV;eO00l)DWw+3*c?^8KkcXPi`%-H -fED9`ig~0<HS0%Q)gPU%eUI5NI#Vp=<<Tu1$H;&sUqC2isq6NrQmn9Up;~GJsRzNAGPaj?U*o(A^&qr -h64N?WPkhH-)QUJ+ElFJQCW%3STwe?M8z5wCiz&DZtsWYN3}roh5etr_Ad3-{K`gz$ed$biIk>bDX8& -AwU(^*qvRf%Uv(TBG-<MPQVZ=RUrCxYW3_8VH1<wFoIej2bjo0+bcxu&VPp?7vvJ~W2j8RF!(ViaFb5 -b!!RjGO<FBn`k2s2rj0MS<r4aIQxE!M>;HuY!+0AU%aU;2o=$wWj_)9D~Ji8ETI4g@a2CRJ2IHxsQie -1^3bS=wOT!-b>T<v;E+gSp|8WTH-vTfm$K7Ukf;xWVWMc0^o!Y3&fMV}nYL3S^iDi_CNuUmLFS)a@$= -M$Y~L)jchs=FRVHarb$?w)KWd@TqArD22I3Mb5@UP>IYqAUN7Qe7ydXhwTuasp*dXBAeL=e|-#u)u>v -oKb(}8-?RNy3_nD5nXs`Gp=i4yM$+%MBv_Vfg|M!vUG5L;5rb^+~<U*Q&BQWoR)UU+*5MtJcR$Pw&K+ -p?(RCQu^L=oL1ODX*X!Y}S}`>+#F{Ue&p=5QFSX!~o}Y*4*AO(0H?hn6XA~r9r%&y+Ye+QUkjV@`X-9 -^c^pIHBF0FD=*Lk$Z<+j6Iy-a$p;RS?(TGR#{DtqS;aStyz9sSQ{#rBUk%!2jDll^$EadND4a8my~3K -e-Y45zQcFCp1KFY%tW<{-<>5-&05ONuF5ZB7@}j9wu@k{nd?PBQa|RblhM7}>3-&IOYL`IKC-I|qba1 -aHfcQQT&=aT|xMHa-?;x2?w80(K=c>yI@W`Ameal7M;U3<&|aP~~q9p4N&*{XDD4rc)!{OsA|NAd3ku -Tg=Tc70qnD*!Fvhq?G*$-H}|OVr|!|oH6G+I_f9aL>D{L$Qz&^3pHNdt^*hQY`KXivkIptBi|6&J>pv -ti4J}p$f*#YP6M|b5I(2$>J;~R$5+>`0=YIhk%cj!BHy-ayJlsNr%cx)*!sGFv_^LY%HB>>8FVo2R(v -j3Ts=IhUcwmarB!Aq;k0BX$j%I2JW))L=^=**@(kTbc9JbN*_p}1U0<0=eEelN2>{KSQEUQ@vLke)Bp -X9GBGWKk1}_Jz=v<!CR(Q7thyz_DWVJBkS+Y@Tm0Yp-yAiT+NtOItW~J^knbU$zr-<=%YM05XC_*}6h -b9^X6SKqAORHYaCUg6ph3(LD0H(8Envzrad3hFsaiVv`!Va;eg`|<nm4;j{w>KEHJkI8ICb_)x2*is- -(oF))>S)SD&-!Id>cRn!zRtBrzZ;;zQ<eP#9o7oeUioA(2qn%oDyU$B2+8IHn`^F_y7JWQU~J7Dr=*U -iBpZ?%;@rl2@CS(HqB@5*AUsrcQ?0kGP&MNprr!H+IK|x;$dt`Ncw5fUdFVzdiI#S)OSRUe0l9+@jc{ ->-3Nf$_>>0zsr-tk;TM@Ut-TM0_!|IAO@Vj4#({y2`WzcA;DWHZc&b^w-w}ZDrlXb`Bg2E5|K6a@J%H -`&&L^b+wnMeRksRS?!_7RODd2<wkPG1+(l`{L2<!bE(xPw+_TPFKqc}+oMvifuN<7~<Oo$I4$=!_tfg -l$|1JtAg=v;t(qh~1yq1qa>3x>z5$d<(D{@a8(Ez;Pru1ER+I7`R2!X{;I0H?O{W@$Q}4(s=Kmmgpxr -7n6r`z2oB8hR>!}W@u)FGm#T1!m86+AFrOAq*oy^Qv!0g5<@>UfmF`eSsrHf@@x?XL+D5HgCRE<uIN1 -Kwpm7vmdREjwRNfNP6N0*^1F!N;`=Z$sPq=FN%A_cbWOV}O?ld`V5RwNxGA+{P$MjsYfJtiL*D~-2Qq -ueLE}oi-BT&4A6=sSrfY(E#&A7Apuh}fN#$tY{T)AD9+93LtPanFyIh^H^n!mSHqu4$o9@&S#_>(X3r -9UG-lJk6hlrzW;4RRRbq3hN`Lb>}e6m`W*A?p|jma7T9co8ymOUBnT<&GNqDbf2nl8?OLDIU@tM;?m7 -H8cg8a+xNJT8D4t9>ff;ksT;C{Qz{UPLye?@OjJqhriM=rF`2KM7kUw4@20W->;BGl(jn;UGu`i{>`7 -p7;%phLpZE3HvP2YMIO!(&Gtb0j0Dvla888kUJy43uN43f|F(7evX_0<|H{)gote%uIrsAs%<yrL=4} -FplZ&dik94)!pQDdQdWw*Gd^iK67ZAOyC2X=mWZvkhZ|j&Wzxnlnpi;@2TZ#yj8==g8rQ9|_pZvua8m -ZaSz;Pc62xhn>;v~h#jLmkq%N3Aw>advh7VyOWVxV4sxwNDwc2*oO;oO_U03T3Ilxf1<SlTtVtEdW0i -5EdZsrt3AJ>ebDmsBHyDChLw%hr7y32`|Yz6_RpdiwU>j_Jml{mx7<&8B~a*TGU3+CTwfA~oZUmGa*8 -K^Jg%GINeW;b+o9MY8bIS5EZW7=Q!cwVwD1^;!dP_6qFX0u$K*m9UJmuGblWMRJu{5yCVhxLJ6Mmi3) -o@2EsBn8aT)q<#;pXXS03aA9{EwgI1HT#7tS8v*qgw-1J!kBP_u{iMfO+$`~VJ)kc(jCHrWmg48D$gl -dqI(6H$u)}{RKQW{W-(sl>{0&cQT{NWm)8&PKmPRbf0RXO-Nek}i98<V;?Wsa@*(FTE-38Y7SATFFYJ -Dw*EcX(z@V;huIw7{c!L?Rqc1MmZH}z4?YiVEmn2}v8L*CDJUhhr?EHB*QqEDgCZ|<(cZ(`J^(0WR4v -oLelLwDK2W@v8if@<NP(cvUUFiJhh7^r6UkeA;V7n+&K}KJ{c>nbI)AvuA8NK-5FaCF&<!E^P{cwDOq -5s40=lMO#8ZbN_e?K}I?f0?+b;Cp{!RhwWQNHtx?%!D)3PohF)4fQ6$A{1^jjAap)3Lrsi=S9z?GgQP -u8L~G+Sewhv0$VdeMci-x1M=F`h9cwf6eEr<8H-2%s8RsgdM5i$f`P}Q_@}gAtXVhY(>&AY2CIj=RGb -jX<sq30b~E6gY2bqWu+q@Gm47=3S%H!=Yx(PJiIW#zKWckbq$G*;8Yn7#D3Er;#TGwRmUgsdi~Jub}$ -+lyO4MjwG+T0aBS-Ol?aB|x;Hi%<Mzd=jNg!Nx%y@e|H-)&22YrO|CA7X@x$II0KlV)KBmM1fyMq<!V -P*oj4+Qxllc`#l<90RfG86$pCY%<ywuHZ56Mp`J@xIR&ri%ndj{>%gNa+6PzY(e9`=rnS7nqPW}RUe2 -eG|Q7#or-wdBNxPr|?v|AecWJxR$&+R7I{dy+g~xZO_@a2yKdCLfZlINeMEJI<_*xj@br^(n~VsZ_lO -?A6SNa?`FkQ4>%CO2%9UrOoaE1>S?{nd2qWyh^%jd!fv<`hzLhf{kKFa#p?I8HmR?bv7ilNBP-Au*Ht -gLo(oz-PfV*xV&IpYWfm-GMg+^0xNqIr287VbKV$q>6l=Pr|-*(vuRfljb+b*L}`?>iWf4$L{d2;V?# -Wf&N$r|70yIUb9Gj!8D*JG5sW0w;lEuX0?jZ<X0{?5Y6<2;uKGLj;pvn>w>}HQ#}BfZmY_%Za78WYm3 -7^4Ch^i%&H4UNF586<4$_!$3IgvW%+$Qt#@{Z=%W#lAhch?RT$I`2Az*_sRVEh{r?W<<eNKB*WZ%5~D -u_rJWCsHU9#NUZ#lt_xPbmBxx5yA*7zGE>8P5@?;-|OlV8_`U(X7^d%U~TR?FI~i=eTx@5dGk@rGEc? -tcMBkI(&SR%o9P4?n{`xiN41VvwlNN)F4UnL+_Yj=`%M?f(;PFx0^R6Ol^^W(Ch5g>-X8Sr(b=Qz5mP -0ciA_up1*$f&DSqpy?^mM1JU*`ub=;c_(#{PV)UDxf@Zq`VQgq#6W{sVp_o7}mbrSyE?H;{a7vt(a*{ -|h4@#hBPAXyuo284eSE(q-G1(iA@0!NJ@?GZ@4rU7<?2Kxow<y05N?*YM$*(0xnOC+vepR;^&eDo*HG -1v~Zz`LU5V*?=#c4B1UUo<O*tUr$40rl745v&56L-RaLnOjyUL>&HMenPxnE1RqeYgl?lz%GBvk>9SL -BUjn$cFzui^6|*1hpn(r@JApc5epZU)`y*k*M&4LET{Vvtv^Ebtz-kIv`O|-_SdZ(~KwX(Y86XAzJ>; -kz4JA@3~bxh9J1SF@XsJXYg~7J*CR7aEXva|ET4?DYh*aa=~aG48fud1tj=LB?TW1R-YMYbR%LX!W?7 -4*avCNg&5Err%t|E3#7E>SRu(}r_o&o97PBgv)M+{a3+<0j?QzPe3@4>D6KT@7iwqBx*_3ScU<R7+GW -@2<g0(e!i&``nK!TvaQI>DVp>BvDV5kv6Y`L9psCSI)5}s{mTT0-!0%F1At;(y&G=uFY&(i0CznrrXJ -pa~^0|pw9_Vq9Q${}|ipJPdHatXfGC6+qgn484kq#&*e8wsEu{=P1YAZ{!+a{XMsa<wfuty5HSk<RfH -c?FVb>~|}GCEnAbly}sU7wNxM-<5e9zOg!8im_<&9_&Eo78dW!{fCULZZrH<-|D$M7im0$rA4&WBhE; -0g@vf$`4ra)RmrRFOq~`i7#BCwQqxh(9+C|44z*VmnA%C-BVqW(=9IR<d#vqgDrhpe>mjUsIqX**@+n -#Ma1{r+n4WOOx}I-=FRK3#tlQ<FkiDwG1x~mF9FIvv*XQ5EK)V6h;z0K&6h7j8QX{gwp#=<q!US8$pj -V4zDQ45@4UGA)0Twt(Bbm1{@rJv>FmY<eP%-ONsuK!zODc%0+$}j%VUzr=|Ef+u#UVBU*M%_I+Zq4DR -N5E^a>`<tPyz{a5IhQ9PS^>FDH`34JV~!kkXriTu7Xl1I<?-5Hm%CWpeAg6I<>zhg7|k9_5+8Yfw?9< -(9*x_{G!mOwI0cg=hQ-8e>gqsJ8=3S&AEyQ_&UD-cAMXD{;OIZ+<!rChkB+>lJi;85i4-Ur6C)XRzHr -j*}a7u0#7LaT95#Xi*6eLT8uSD<+FhQ$I?&W<7esx#YU{tmOFhllJE5&ueK(49H@i^QP@`U6-z%=M3N -D@X0}jA@kX0l>ysETA&O#dpqVpSlZPk))!hO6iPKLBv$%nriy>1^ho$}-4sm)WXo&-E-S?Utma1m5U7 -a*MbjgG!T^TKey8wZDvPT#9cU3=to=fDdr#p8m+Ddm0z*E?-XT+)@xBSd*vY`iX4kPxo`QFGxRExkxa -*-c>;ik*LVp0Q0Tk*h82Ue0(K0LW{z|E1@Q<(tZ}uIk#FpfqY4ifkW>EqtefdTjl|{1vnU1ZP^_k?_Q -^gj!c%tDh_PwM0pqR0t%=erYEPQvk&n`PaaOfI!4xIWZn2NEWr$QsZBPrq^MN`b`+~pw89_61h6=80T -NzqpGa(LF4NdGLI#9gDmpqoD#I8w?6ZtoR2hz!q<oIX=ehIg<UK=J&0rW1_@+u|H~_PktFrzMNdd`x2 -H@58pZ#wx-DL)#uv8hCvDYyL$x{`v7>B5ejIlsk<6c6?7=Z17l<XWbMpblKh+$#j0K8DCWj6JQ#sv3q -g=MJm5!l8+Dl@k#%_X)u{T(>=G=Ea&K|#d)ra%Tm%=yF}~LDZTyl&C9H~E-I=Ao-@mNk75SV0x>blCX -e2BuszDNGtyPod;yXLqS<HGau#omm!xs7kTr=5C~5Gn>r0YpU{xhO3cH!fz*+T4Cw8S;Xu%GctU7VPW -~FPYsdLw6o28eTaPV_I-dOak;9hqF5^U98h6kdVVpy&3_!|&nK9N$pG`B)MamjhUDS$|Apd6XMg_&#p -g*XvC{mPOWuC|R1iQ0Ca^U&sSpWqPWiZXBls!Jk%`!2fJ%-}lCJvE!<1i!A<F*@#n96-o@Z!oM?lao{ -+wQU`cD=cn)lyzQvDlyR%HW+$8n79CEIL8eXMP8@~bs)mEFH0POQ}1H3O&H>@>^)sTv4_biSCXfU^mb -E>*fRr<1C8mX)GjyWVlmbO88MBc6oxh|Vw8($PPJVqf2$t^{fg$*5>7tJFo2$+^!sVKsBat-;-*WxJf -6K!*#j4N9)`ZiC7gloB9Wn_i=|=>Js@dBW4@RH7PbpZH(Dy%iBAWjUGcS``-&+rMUNdZh>p;m3ptl2r -3}GzPVD{vP)h>@6aWAK2mnzTaZLJJag34#007Sm001BW003}la4%nWWo~3|axZXlZ)b94b8|0WUukY> -bYEXCaCxm(TXUjF6n^(toSHm{S>l*HZf&N9C@NJ5S-?!q6Gfmky#bo-ZjJu?J>4LpiP@d1^&!H!eCIn -?a|L5o?Kxe)NHEd?+>LJUU`82VGXYNo70D|V@W-}({Jt&{nh#S}eCu8HuHcdIf(k)d36jA^5ED|wGof -G^UEz09W{^=KIep$p0`djH1Y60sgcDdXjs|<gsW!Y~g1{S<FMv|@%{CHNgaCTH5Kf-=u;xiANoGRD*_ -LJ`L%c-d9|FlU+Y$sy+iXfEX-YH!9kn`AJ*cXRBphf7NuDcDO2km770qo3{b}^W3T$vfcntg}XJSv_i -xuMg7qGmEHnNt{+z(*lgk#ro79m)!3+NSCUgX#zLj7=}IRy613edwxCxkmfdt-MwalD!Ka~6-TgF%k| -;7<`^VF%+m3akgmb)ug-_|%C!I}C>i0iF-`lkG(i&J|3D*MkkNV?DSwO#J|nEbk|TkM`KHToXwL_Bb* -T;qZhWW8VwyKbMGxHZZXk)=bd|v}^OKvYJ~_=ws9Xa|@Slq;i-B{sLS-RJ36k+8Dx$Eai;#L&Bknem2 -qz6l=><gvOEMd&(XIM}ehSc=pV7X0|uBm8-AqBR@dHW!N~FU<FR7V*1OdE|RZ75yi7>OkH?Y3uK}>*Z -~${VQJjyX(NWc-iosV;&`=@8&2XFXi+gPadx*<%}isEvOFiLM1g26$ln`MYqLZWNegmNsppL3GO5)?g -2UaYQbO}uD)udukQw2;7N6tvdc8QtEmUNX-aYhhhj)FHrg<U+IOU3#R1$+d|AhnxzxMz?E1DBDZE%%D -6iNI>%Z$CD{C3pS!i=mib>$z&h9LRMgzJQ_1%6$>zNx1MPa~jyhzMkd2%}T6kO`Nu6sS?0jlrq9)|^< -L8DtU-bVZFK+2y3XudQ3wM?`fzUJ0I<ZIY`Uu89t@28A#>d~0x-NXeVr4qk(9_G|1My0!&CqYemNDM8 -IzsN-bx<NjF?PH=Qe@K{NDXR`JC_{yvy@Ey+?UMIP4=_K2=w(Ue{ki@1i4y78vSHKc=-jQZoN0Q?`9b -Jk*@}v?ZyAXwz(x@8<H>dr&NVx%w<t5B^8Bm|HG81)c8^2C3HkI0=bCe3F{Ai=;d~TxlLA-o!Q<9x*n -o{21p7y(hZ!kLTaH+TEY_c_$8e2oDZ`w&$-6_weux`yz{qU5TfgSrmuXhBYdLM6G=jFE!z7{u?>(mlQ -`Y?4=cJfopvr}6`<!Oq0O7aYL?|JD`o$Yf|;z4_b9ywccB7|``M@`6IJ1`rZEaL!W>QIAW>wfNdN(rw -97OA-fxOPS#C4Cc5-RSb@>Y2Q>2kKJSD~4MM*L4_9@c*Eamg~W1sK34pGP#I{Zz(C?4gKLRDEF$V8M4 -HDF9IE!^f6LFOXJq;&e_+tv=_;>^|%C@?2NWQHyv;jMuUG@>kFg3W|AF7TOoC~w@f)sLCwA!?G#gww6 -gsV3nTgd{3oTIHg$t(XP3z?C6$C|UlE&g#!nrO7f5~n=SBPnP)h>@6aWAK2mnzTaZC@xMguei004ao0 -00{R003}la4%nWWo~3|axZXlZ)b94b8|0ZVR9~Td9_vBZrer>edkvUVi=YLN_E_qB4~or)Jh^ikuFKu -2m-^P#ig_@MKVj$wt#$q(<|Bn3HsW8K>w*<(%I#by2MFS6cJ#Lc6QF0v$Hd+1L*hqFwY{EE}lSD#{Dm -ZN7D|#%<?s7i)9I&c^6KOAD_UOWqgqpa87X}{FW8)<xTzdtHmm0$zYzXo@oaNKBIiaih^Y+lo?b7)iF -uF)?tOIVzglzLBxuZv+Js)P%e?I$l~%g<P_qJW561D@`~qKLE)B_OF*x%Sye(zDIj7=IlW%Pf`@5IBO -P*{-LQy8$QPFQk3x8z-B2W&x2H+7lFg|UAhYHhsm)fN(~tv8Axsj1WV9H_V+9iezB>vo43B{2!<pxvT -SGF0M~08<M_@QZ8Dz|YiR;18@=e>Yral<94T$m#C$NZ*R2Nn-0gsFg4-qbckZwcmnD%UFIb(^lrf0T= -Nj7+JM@TUxo;g8>acbFC@LVPzS%E`*e}EL=xIoT{6M#PvG+Vk(3D}l#Y7-c_9x@rubMViIX&JVTqCH{ -;Ix;lh5MjEGPrjZZ8^*xUm>Odt!;?_86sMXPf$w5g56|Y$>_D7h<hfI@U0=wCnNKi<5f}oD^+UnFjyQ -tyJfYffgdj7pTt~!X;=nV63WtnsYfK!I2&gOL1J}dAnXdpk7@p;eobD{Bi{wgDWN}E%DGM)Zfl8zX;$ -ab{hU6XXUc^AtVxFyF0Bn_Kyo58JEjTR-<zCVR+ox!DFE}e{l1|wjOEpcKCt*>*X~;X<8+uF9eWC$=Z -druQ{S-bwk;@hCgbRv}qa*1ksyJqMVtv?QX+-b3(PxL9Rfx6@xDNSM&Z!E5R~zpJ`U+|<UFGHaDrVT& -BDQum%Y%Bk#1XohSG>T1dkO)ss3!dpjiJh;u%w-WCb5#=5YXr<q3J>%g{7qo8PsR%fn4Oxxm#SVriE= -m`n#N33)z%MMmNhtxoo5G@J)m~TyKwVM?e#~Rh!<9v^Ko0r;Jytz0?Uy>&qK_ld-h(LMha1%;v6iAyT -jNY;D%0dP}$esrN58HLQzPH&{m`@3yUHE<?V+mtC|V{;3Pw?kDWtIZexMba?n+FFn*s4|P&?^!NSmJI -#ciH}^-alo5JSiT|>~2fh%3w!|r6`;2e?c!%-NcNk5^=gG%1zWr;T@$Kskqm|A%U12%GWVd4ZGAw9;f -KG*{*QJu5mHkQCAC>(<+3%J8PTAMW-XC@UZJN?HAGTjTN3~~baPD&a0oxzB2H1m-8NN?Hv<*Va!q9!y -edz3p=rw2W{*QsL8D8`sU%q$j@p0pL&wB`IE`h~L@H03Dn&21p5P$f=zz4Z=tnXH*FK<v~>vlioJED> -_56b)BkG+THKRqb^GK|(@Hg-ql17q@wvcD?(+twKT15ir?1QY-O00;n48F5T1fAKI60{{Tt1poja000 -1RX>c!Jc4cm4Z*nhia&KpHWpi^cV{dhCbY*fbaCxm%&5qkP5Wedv2HAt{Kx;HP6+sh}E7LXsS#n8v7e -P@JT8pxY*rGsEyV+yfq%F`xQ6N9>mnZ2^rq@{@=%J_%9&tF|&x|Ra!TIBJSnEnPn`h9u`utm;iJ~(|b -bDviX6s<M9>LRZo;-z_(q^MATuR(1UnvXU-5g%O-|S1Z8?W{LMRbPXr8IkGt<nuR4V{%SinMnz>`|)5 -ST+?@$~vR2J14<yk<9Aa-Ihi|tqm63Ay3<xR$B?T%54F&KI+avEhQjgD~-IqgN-R0C#x7*qi<9tE95I -3{zxdV^^HWL^?f&uc4{qq1HEc{vU=QVTUi=V4V1f`M=EK@eOtwxg2<=E72y<^fF;i_*@RBu5fQk41SF -gEMPyaXa}E<Gl9aH80FtJFC{D71QGrxfte69*Gr|#(BM9kE)LD|QCM=uvIJQ`(3`I_O$froLpgfslf? -Tka6)$`7DJwE6#26_c%Yk0ftN=0hG++3-ppY_hky4oE9GOV=62y`wjHEG|<}@i{WH`PdBFQsBe^?<K* -1&`;$jsZ|Jv1zRS94N`9922?CRS<TdzkWk0ckG0ZCDA45~Ls=jPpaoB1RlVd)&JwnKzUaEYEyB3KyJs -7a5(UY(}$$dT8F)7dgkml?Z?s2xr1;=Bwf`q`W6ZmW&=a`@#EJpp)JM<v4@|>3OFQ|A=uE)kg1O3~Jw -M<A61_YLvs{yfk`aq_v@7D|dL1?6L03V9`RoR!tN|>s@Ireoq}9QZqbl#rJfhXA$7DN4|0+;W-QjePW -A;`R8?KEFS&mP?%0eeZG=4bZu2SIka+D2e^Oya(wG0hWK&yyJOW<^7Ux+&`G6ln+INw4F$6QN7_id7a -F`=zK|ELT)+A^>2_OMX;F394PX#MH~9SVO^CmQ_-lx7LwpzFZz293;va+2e{83@x3QDWp_@ZybYG%yb -FZ4=vGg3C#CUDEP#wC0$49Qw=&QpzQU9oZI?ZXR<glOBSH|-B)1QY1KfMp}?+`zP_!l<*4^T@31QY-O -00;n48F5U`><>=+0{{Rf3jhEg0001RX>c!Jc4cm4Z*nhia&KpHWpi^cXk~10WpZ;aaCyB}QE%c#5PtW -s7?B4cwNNfnUrwd%1{Sbt?9^)#oq7^7W(|91Y~)>s@b5djHel|!l&Dqx0Je9&Z@&3<#`X;i^6kD5tF? -ko+=ctQ5BD$@d9lhRJaJrzz6uGyyi}*ZuQriLdvU(`)w;26;E@*_A*IMOP&t&6+Ylq44V!!^68w*{B` -k$hg;<n|gIXh*%oDYX3JytLV89-Ewq>!+C5N3*YrwnuKQ9#|oC6}(yx@yHtcoa8d}+hB$X~>gFOe@&_ -`@Mu<S!hF;$t;gu0+g@0F!lll6qL$Zh2II$RJ8njTBt=Oj+TC0`o`VGYKd-3?2jj$r;iiv<SoN77%Y} -g2*hK_yG(ZHgJhEWk6gP5ET$FbSOirXD6IMK*uCNgpVMkJ5hTBcQ$mqvB5dhN7un5Cp`Egq?poRFu@z --!Ev4NlSw{uLXR@mLkjSGpik5bflV|`L)QZZ*C7usg^?d16Y)L)d!z%0xHgIo=peL_;c$kCf$uT;=M3 -2}28Lux##%;Tp!KD$YC=NhW7Ys`V>36@HH-p(3a-zzY?v{MDM&~(82v-R%tjnVd4X0<JS}JtI=-jlF> -x3Wt-_;Y*BMi9KsD4i@u44J;EdG(8%W?VoztI%l}WxKMHY`%oW^+V1u8KbXn-b6iQyfcZ$!_sk|N*0e -4do5Eckp5VzbQ)g`Flcg?F=9Vdq$uHNifZ4`u;F%09F|zkXQ!_1pc=Y1?8G|M|kox{atfjiiL<LMT2J -uOjQ@i!VG@-H#UFvBqAW$7Lb0^ZPK0Qpqi|u;dA95}8o*c}Maz!NKBEMl0U;@(hRV_Vz1I(n{7u`j91 -ddgqkN1`X`?jyy-q34#H=`A#fx`1){nyf2bNx)c2|zFt8<eP%UrCL|Fl?+F<xweNJ#DGnix($53*Va) -F|9JhgI%YM6UgQo5ulXR``VNH?O;ZB;9w3O>k_p}K+ZD+j$O|!44bYYrd(T3Zm&u1YqhR9y}rIfYoD& -|sE3-}4*ca(G7)lKx;<hCK@Sx0uSb|As-!8@jx{-J*J%zb-zt6~}x^W&1vh9}Mb$MLC?T`@ra>7ZO~- -&KQgG$Ky%WtV1G?ck+s?azgIr2WypBH6C;uQoju8Gm0&vwl!~X$~~yzn<!M^z<c1-pcxp=i8N2U|vvC -tg<LQyqu~l8<;b8ys(bg%fm8%73w%XOst$tU6`I$s}=ASexmV0LUhQm#wJX8QGH;=_<ba6w*bGNs(c9 -i;h5d(`FLZ#8fv~DuWzs?sFBvGvfK6Z4R7i<bgj3sx!<fD9^S}NZqVN%+BAEzw%YW=DWi6<bJw;022e -`_1QY-O00;n48F5T^2vU3K0ssIa1poja0001RX>c!Jc4cm4Z*nhia&KpHWpi^cb8u;HZe?;VaCwbW&5 -qkP5Wedv23Ztd2U_Rn6a-08u1wnmWXU1vT?9!`Xf4VnVv7PP?Ph^KL(n9LyhxG)P5Ux^k`8IDciU5R; -D|Hx{mfWCf|L6vurj5t*H58qtCJ@_6GcamnC9B*^`?d6)es&(eDoNm+Ss*maHg<Oywwh#UG86hS?>zH -9j(mn=jaH*3uSlOIc;ia4RlV$DAHWVutTW|V^Nn-YS&tQ(X|TN4U#!iwO55zP#KF2*T~a!wlPk@m2Nk -HSszW;LZuWSVxz3OxQ4YY>Q<F8G}c_|QkBS8w0I~eF3hDuqSaxV+O&G5f`Opg+*-XUHH|7P=o*Uc)+4 -oYqcE17Q4sk=o)b=i30Uy_jE(6S?h%3adqA>rXd+8F%Q=jhNK(S)0!W$yqBzMUqXMbUnVbQqQ^FCEBM -9kksk0<qj#)MhI5uCT3`K77kWY|ePI)rJ1UY3XlP`n#gvpEwF+vK+a-e54lOSfE=8msZ3MnI}DTPVSk -%?q4K`dy(NE)MQP7@g;!_6Bak~|ai#S+=D2gYPhrrrh*(EjSDnh_~-ROL9ESf<j?FyZ+e(p-4kuoM&} -h$J42`$NMbMjS<Z+`A^3H<U=0XTBeWB`4lRMyDy8(k!7KnumUwb8K9S9uNcJOnA+FDfdgt11Yj(bk7+ -U?{|Stf(OcR33C#7C;$B+Mp0B*vx5=nU1MwutgdveTh*sGYKxzbyQ!XAEY0;hT}M&0+7`}%XmnjGdwg -4p4<y5<5#X~^&J}9~&tWhKiDpwc<?wzyI2pt+c>UU+zxm_AU>I69_?7><>a4^6#B-3gQ&Gs5s)DX5i& -h;wwXJ#u|7h&<sgbTr^$vc5t*S%MXfHQBbcW=W_j|YgO1~K%rdnuqGgu#crGxcX-Qb_kf1qU_zxDBJA -HNLV9H{2T)IY-Yp~rsg<L`a^bcZX|^^f>^|K}e2{(B$)>f_)4yMIUSe*sWS0|XQR000O8Q5kVeAI9!5 -y#)XO_YD95AOHXWaA|NaUv_0~WN&gWa%FLKWpi|MFJE72ZfSI1UoLQYtygVt+cpsX&R=nLKUmrnI&y% -uFzNtZm#)RqEJ(cWLs6)-MB8j6Q6;IQUeW#b9bY6nwi9f?49B95cgMSj_m-z{^urP4vJmxh0<BpbJ+~ -A>o&rFY*~ci$VqCi~_}>h&k$vFy2qIiXM-YwN_XsRE?q;#m5k4bA27>{);$K>>jfOX~*(IEdxngQf{y -y{}8)l(_)n26ZA_?3nVGOT9)Nr{rD_JM7kP239g{*Uq?q~`>Gc9uX^=w93&6a#Z2%2(wdJ3Xyq%xqw2 -_0F%w5QP}H_>oqOrs~G(cRr0ZQMCjs^u{5C8##cv^qlwxh0N|kGs90H_Vw2jgm{nstOH*lGV!=?HO9@ -70qRho){}OQ!OWiQVQtH<?q+CjmZsLmy#7|VIgu8-SBlf9p19C<>@d1d>x0^@s@Sl{xnhthtMDUm<#9 -3$ZnvDf*Cdqr}P>cC2A8XYWP><h~J32Pc+dl28en!m~?a`SW}QN@Wu?1?TxhGNC%$&J-MgwJ0Y_b2We -JZ`5Uh|f><Dgii2(&dvCmeBhZ|~r`|c%h))z=w`B>1%-ag_WJbuESnv(J2yXi;JnF^J{ZmTFB$v%viR -H>nAj)IB#Pk`=*YF#!YdjvVxG;ZFGATvQYt1L{vSB%zIi|;nGvxg3tFw#iGZ%uDL`w^9m?$-MQBM|1R -?vusX1Ba9kSD}nt4a*$lLz<n6;r5*gx5Q!Y8%*|pYpFcZ>*EL<L@%&7v7*AUgzsSy$B(s;0x5p^BWA+ -szGq(q7-Hw1sm{WrG-tSaA-$}C+>oF*f6kmC{#D7FB(!Ge!#Tm8y9=ICsX(^Ecos4BfwL5&y`rLJ0{G -OdT1~yFsI5AZ`t{|6o$GiK>llq;UFrmlU_#F<r;(B`j0r^Uw0DIkp4tdAE#mgC9ij#jbS>4@uZ8;J(p -Nxag2t?=u@!Zm4&cB+}`&+IQ?lA`z%!gnC$j}yZLG#FsrSWU)Tg*KTp#~<ZK4IojCDpyB*e!Cl0oCR- -H~ErQ?*Q3A}L2@%D{4Ro3zJ9@Q$flH&tp)Pg$hArPYEzag*_T3aFWVRG{E|A3$~3mrM3$8?Mc;3B2R2 -N5_q;Oc!?ya5&#Vtb<Z-DexdXVK-E;Q9~}My-8tJ(74d>)^<;KKZtZG4Y8G(Mx9&63>*f=)AXu)U893 -b_IgkMKtK*A^LXwJ+>XCLnr!{BB7An<y+-^WLwpB&}YQvGYAGf8BkmDnfdn)BnQ+zSgK-+^GodQ6}oI -B@S4p_-o^G%!}Z16&eX)_HMTD;kOjpY-hS%XEvdA#)^=MZ=3U8b))EcSx(sstI~Db3o|_CqOlCnivNK -J%jkiwTq2Ha^V9;3WH@5D1r$Mh|TNXH?fEHMia$eBA`rjM7U*h*mdw=N~SxUYTrQs?XiY10K$G(0DVc -$Tu?x<6rWk#5i+nda?g6mufcfKc}S$@&WJ*H{iin8$hti`^o?yY%+4boFWTYX$x-=e)t&Tgzgkmwt#! -KS-I!&ZHR!&XPGa8N6EJ7$6l-5|_7flF*AIBXPQD~REMu`@L$fD>W@E6$3<2B8V%3Lh=5@f2=Qo%Ht? -)M&2t_H~B$1g`y}W7`asJ*#_pu=Ph|E33}B?F44nEv2>RkE?ULE6_8ak25LXv3h;Q3#8=+TdJM6LTPy -=aq`JGwZ=)j#(;f?R)jd}x%xA%5R33aTpnLzvBANEwWWblE|+%tU9q|-ak|6YX17vcwYiWzaUt8f7;F -kzH~Iu&S5a-952N*%KKqgM>E4|XWG-+TeB<?!LrLojbBQ^-%^3wHG`z=~>A+4<yuya1dAUe1405T8t^ -G|2=yYI!oZ}L;W?9WD4A_{mqUes=J~noE?I5gSDM2o<##y{pyu*?{l=NXAvwrWc{46uI|6#=BA5cpJ1 -QY-O00;n48F5VCe0e1T0RRBB0RR9a0001RX>c!Jc4cm4Z*nhkWpQ<7b98erUte}*a&u{KZeL$6aCv2q -&1%Ci5QOi3iiI51ixpW7*c1vay##s*CA|e~*V#lOw(RPsG{p~J$%-3F5X<h)e9WQ+(3D;a=>I*X$pXe -ZfHCz&N0^?UEARR-bWaffsx(wZV~^$K(37Mrt+XwcB|HMr`03DCL%h64(`Y$Z*{f)7&Q|ma*4ym{4!w -r8>uP0aV4ZFwBdi@Bmdjy6(>adz`WUb;)aEaa)2yJYAb&X7?kACbGoBS}<;B|h2p!Q^R0^$tH<b2=Tu -tn1c{$wS(<xFqK=Z{`HmJ<ych5uJ2n0@9u$q22Yk3qlnlJMToMk!OoNVe-jB#Y=c+Lyhy)(wL!+p*mD -kS*@P)h>@6aWAK2mnzTaZHG*IlB}B002k?001Wd003}la4%nWWo~3|axZdaadl;LbaO9XX>N37a&BR4 -Uv+e8Y;!Jfd1X?;Zrd;nz3VH8?9gOLeCTN~(8I8GLk|OrtvkDlP1o9N$)l*IzU<paNw(8wI>Zt6_(;C -TcW`)rfZ8?2K9vx-J$#4}r8b+5BK#B3vo9)R8OiFt3T%3>{=PX%-IIGZ4SI;rh9_u)t=Ty1fjiBh38j -YhVZa6!u6}~!1mEWx>eQLKg9b;m4LA$<!h{0~s>M^hr6lOEACWw4eGs_z!aIzbcd233k{h7NAuz+}NI -t$Ar|Uf&gX!7W$}{ajew0!Tw!p5kn$0uD2T@_0KYKu%Wx2W1zBcA+S1OPrb-oJPf`*I)cl?Dl?}6}1Q -`4jO;DmP?F~&HM$e`ulNa)eBj=~5cu_bwC9%JQ-kh@uenP%w)w20H-d^vSUm}o54QdZMcz(Z%GoR3<2 -`1s?~-5ms*nqt?BvQmOh#$&NelfI@Eos9LYZH=o0uOyqNkH-auo4LOf#NOliIZ;K)&!Nk#BF%%_Wvtz -bd`tCTUK;&%UV>(kBXagMSQBxT^pU*VhS}V+ho4avYA_aKzcYR{)XLV$zOoiYW)163lddJl7rAITN?? -d7u&|exMC>FF>)!=@3!dSK3t*iv`e_}*{luMY#Wg%i>SOk%q-cH#N9X!CW{JC)7JD^p=^!n3R+DKu3% -R^6!Y?bm0%i#xDCFMorN)urXKwd4W!(}vDlb#MXt7NF15ir?1QY-O00;n48F5S_P~K7z6aWAiQUCxT0 -001RX>c!Jc4cm4Z*nhkWpQ<7b98erVPs)&bY*gLE^vA6JZo>;NRr?6EBfpYl4fPDlL77)!YF{_cy5eK -?40fF0-Ft(me{g-O_4f2tY`*vzx}GJAM7TZikxKjuyZFMjzo4>SJ%6$i#%p0-<_~Up2+Ne%Ia!)@+Z7 -97#tlP4GQsJwJ57H;tAhWq9_Od-Tn*)cPm-4b)M9z061C2Wmd9kC0JGPtlZ>9#mscL%qw=Ip|ZLZa4B -brSjtQcc$Tm=%ti<ZDHDrI=2;mLE(5tHSa}(3c(pP=%Y5-5s=;7c<ZHH(n<#!1S&|n~U8Jd;e;;k~JY -DmQ-;09jId9?88+B>IHbwqv7vuC8ru4%p1nea%g#q%@-QC+8eXW01UCGqUxRYy<*FcTZe7)uM;xm(B- -Ky9b5I6Xve}ee55F4VInQ)%wrATnY7e$d5PnxPYpizDDbfgbW!u`hf*Hb{e;h$*3Po8)sw&zxUo;>?4 -N<@Qt^Ye*7s(kSUWWNzS`BIwS-o9?|Hb0)WxDseJQO%4%w?*0+qHiwpHK?Px36M9uD8+=$IVg8kfK|~ -0QJ5`|(W{Fe&)&Vhi_g#Em+!7#y}pRwp56U4VfUhnMW)P=Qpy$315C$czyhC5AvUn5xLmBnTEuc0XF? -<*QGj?|t*mBG5IL|k1;5AZVR)rTL1<#K31f{o?4n*&HR!+94A|QxkRU5%B_G8rxu`5P@(0-r6raEb0z -7>=uJZWrTr(s<{ZUJ3CoLVExWX~9+zxMrK8@^7Sfff4c9}i$R3^7bHf}bGWHG43z(2WA6a)ec1~7L@> --0(!+Wtb$BeckkL|&i&$1P!@4emf~n_bd<LPx;`)^taYzT?GxIbq*@_prrp<Eh<i!6g`DZzH3lH?k~2 -asU{L1qc!{V+jgDkXc!8aMkE&JQx@We0zQU`sHi5&1URJo`PVzcWy8LdI2|{o!YB67k4+87q@Wn)EgP -!UB0=ves>2qu5$2ZgTW%@WyxNGu$(FXH_GRK2X5+3fK$5zFNycropqIZD0w_XmN=G~tm1eC;<<E40NV -ke&H@ugBO*It+yDV_O$fk*X}1oet3vSgjJ7>tl@hEOqCa7eqL9no?5?OqOTZSQFoRH0fW-96K@70Jh2 -=_+KLPeYB--UOMSuupu`WRHjWIDd1{TB==JB;bb;^)bQ=;hfV;kxZtqU(cvbjJpfIS1u7D%<}DI4Xae -LNkrzpMlVECt3Q>Mq4EdTk17LVz^AJV-y~TbAaqG=SQ2S&{G|uu>F{dIg}2N6>^<91w<)g5AqUM7-Wi -(1vriOmhy5LX*y>g;-8Mj&x*XmiL(h$S3B`nEjx?l|YfI-lW3WL$%w8W(%|qE<?lGJ5{paZS+DC#Q<@ -LEd<Xd41%`pN-kDxff6kh-HIHH{#KKBD>Nhz<%T*#2#j9el6=XfT<}WhohwHYSYllRf93*)P)z87&Ee -|#8JpKx0+A{FgmAOHF<i>q)>*d0am5Kp_M-$(f>zeW2m#G8wuO~N(vb<R5FShvU45M;lFU1YkPZ>tY* -PB-h+E`pQOnw0<rUb?6kHuhWTKt4QSb$ZdTkQ{FwT)Z5NvNu7|zO#Sm1Vmf?{1p2d<;-8Afu(o;jw+H -)``*rqv0s3r8E9M!I0Ug~I!-qB2VQy~sqt(-Xy7Shra6g`hb$VStdLB!>wkqf}#|;!MW1O5u-NT%%-j -3Yyg(P^FN>9W&c36fw$U)E>7oO$lCI);t9k0mm1hT0jhhTRFDqR-wdx&|g5)6bukML8?!H7CFdwsdsH -;1vDpi@*HL4vU)v-iTToy%1MQ2irPH~j~8{It@)=?{wx$E_#xNz+JWdSMwW;_BB^OVINgH>vt!IXNSe -do^lc_Ms-%V8_@`A~rwQW~h}j0LK8O{%8Kg5xK2FUur2tDVQy}iEt6MOi`9r+{r>|2x1I<MqQ$>d?#> -`DvCbX3`sVf>Eu&ZQaSG=^))(};q1<}f<3{b>g?ogL_ol>x+K_od~n&lN!xtPK=gjd8amu#2U45LtX5 -7JhryfB84<&R1t@IoThPDo5FEM?ucLa)RdSKS2IC=*~QKYpZu?xT@6B*_N8SXh*6LoQx{OXy0<JO%1b -8_%b(a^=jhk4BOndO0~kd{;u0Hk}%`{o=(7gQ%gubEkyR$W|1zx<G`|4B+knQ!|KMgX0M0?0a`=30X> -=Riojmsy5R<{&5KYb8IXU{U665hea93u*mzN0|<r=VP{KukKf|9RyG&4at#CVwjM#G8h+@B+$J53pS4 -5H0BCpV?s!*CXRQ#m4;W!N>%_l~*N{sWE}P9*3-r_jjhl<S2`bqbolYnqQ32-I&Vg)F90nnx><x^x%l -QTnO;fys8NdAM-%ynuQ~RO&t<c#Kt-jFNLhA?yKx|(M&CskfqxH|wNTp~qhe<6I2s5XiHEORv@z$6q) -txo)#;#;ShFn(Q(z<y?LD4zIDx(o<4W-lgMa!|eMnV6WECXHuTho_Q!w!x1c_@@V3Yd_<F9(xj$hEU! -1(utFIPkqZ!O{R5ddwZFxY}I@T=s&y5#O;E3a1=M^+(Q9zMdx#YS$T2aiXoTEOF(HTs%MkHFsm@KI!T -eOMA!A3eqc{*5rI?%MnFlqj6g+x<sdWZQ1MyMp$Ae0lC~$JfM#fp|+GdTnw%~VcxPWf$W$bOz;VKC(8 -%xeF+OlNb-LsW|^SKso^?VqpC%NOUo1EzR+)D_y%zt_++YHV1SP$Z$JpWrc_}_W1c>3uxP5nRR~5Qf& -ezvbMmt~lx*UD9S1t5g#EDBiM{yPO>@6K3Uq*diy+Verz3@zWSxi>8N_Ra5Pn1kK^A|6$jDa}H{?*vo -w5t8im?Z=+vWvChsAx3F*+RwB#4o;3@4<J)6BBk5e!$gaT72YxJ3%0iaw;fSb_AEC1l7Cw&4eu?~vto -t<KDq-4XDGrkAsj#>@`X(w4f?Un=i_30EbYmWDO@>)Ejw$Yx>{yiU_-Ku9xH6{k^2r*LQM9{2JQB!*! -84)m1vF|`@}PGuTI1>Q@CV3A;VusSG5QWshqXxWZBOcfRY&MUSyx3Szawb^%YkgHNs3kG?pj=S^SR3q -5kk?-l(2PgD1kfSu;g8YvoaDYWsZe_I^4XJiKY`H-cgN(1S+z2crD$Tm}{gE!(KM^yy*R48tv`r~P=d -!_UW>M_U)F{u)m+p|p1oXJ=&J1H64sqvU2i_g$E4p`kU*xVP=|dWy(E8$+GsZufJ(w%r>ND@xKL_!h@ -J<^SO&X`zCyFXo#Z)KYqBAa2x}VS>-(vrn?traoRW+k0SY)U0(X!0{TalA8$bmpfohmR`CSORZ-l3UM -#SYkf$1np31xup=6W-mt?hG^K@ZVDn9CsZkbt_!MVV9)fG-$`M3IleWghNwn;9*Ac3%X!W%iNpC>?{S -SWE)O&u^L!`a~RCw$lJ)90jQ{DP!v&aG3J?e)XZ5`GocLy=bBM_=Z6ol_rgOy;&0u-5{XX|Bz<IVkGt -#XGtO(Oz>kj3ty(T65Ef*jmKDa^Br?EfmwAfk6L!>r>VJ-;IzlDsnX+F_e?5vof7iTfFdMg+2O1X9P0 -$lG`or^!8>|ie=ex_Bi&w)S70j+>naE<_rWJG^;}D9?^-ynM*Aca+#;{Cic6VmacCN0kE{1`D4Q3>{p -IP6RZmBHyG(;d-VzHKI3qjOzTPS*|gzGG2D)dI*pMD4rgy_;6_w2*L)NC#BS@<2I$YmQ6T7{4zc%z=I -4s^idn@)y+zD@;voW{YO+1>Bkm>KlN`vL&pXg?MeCk@0CyCgPEZcU>A{wX(p6!8+rVll?JaC?m3_-}L -R#Yf|XDS)t9k`v*mfjR_vYBp$M4zI-ao5UWW-h?OjC77g6opx42pZsbPbXO=hesEK?8z$@wo#AyD5Om -!Z%*?i6xCQTH?1V|@eDQ#|qDG^vWBek9=wGR5S(mZm22y;xg3aLZRv~!ldS|;gXNpSSsI-Z<Cv2#04s -}i0MdS^C5X__(81kIRrt>PWOp}QOy0k{EW%XcK_m^MC-m<r%Vx|u*u!^~*6VYJD+Nh1wxC^J?TRQV9H --URZNqyUl)>l1`;y4cAenct2d{>FGWoj%O7@<zu@LQA!<jH7Ay}!eKxn3B6OSZEFR99@7>4PK1b<S6v -+D)i4t|6Je?wTNXoqw0A-q$n`mHAq=9|Pn7!%Qy^Vcos$<P0h$?POqPXk#&v@y$GKF^Ty7T~Vg*iHEW -kzhs7qN5CXD+1J6Q@gJFv*$fKM*TpN<tdt+rDsyHJ-A~GD2Oibwm&up5i-xQyp8F$tI(;+kVpr2uiG| -moJyf->nb-e0a(OxSG)|QPyLAw%S%f=MN4lO$snKxUog43~iBMfOP)9-X+CqsQ>j-mGJAr@uH2aucqr -fPn?ZLlbl-rTn^%2G%U#!BJeqSFxew2w&1EYHs`*ak<y<H#gN58F-IPmlBPp@Q&T2P|=@NB0#en8mt! -CM3Mye<lnRq0N*s1U%?9zmFbE-Dzp0qccE$gLYTbse3dD+o9mHz?eml`@=Dcd3yIu!{}l=v<?}G8?Jm -kM>ETs<;|hmS$RYh{UbdP$TyqEwAVFY(}L55?xPFW@XJEOqUfztw3I@mKMMzg%E5lO6(dzE7f#q!kr? -o?^j?Msi8}23xTWCl+4MB<AIe02jYo#AY#`Tm~17sux_pJk^w~Q=v)ipV1{ieR1{KZP+`Xc`>NQ}7+8 -n>zqz6P4H{#uK|X7lU1b(ZtY4U~NQG67%~2o(N*;lrW!DH}^LR+mgBI7wjBk0ZZYb;ISRH5lI8wJAJ6 -*;KL=vOTjhhfaSyI}AhWRfuW@=V;evO=q=|mzn*s2C`yF$Mwh`Y!t^R3Y|RWsja23B;Tg^o&^{o0_6N -P;3y4>UQ*_EE&7t)2C!0h8`MMd5LvW1wwth_;3&iH(d~wkFWs52AvxB$`eW(JMb{`Y#(x8nH7n?vKx- -Q)RiaU(Z5<jjd4R=T2weyvA}1OT|((Xk%kuArn0em0droW^~v>b6Y>ZP=Wu?m>R4;0}l=V0wJI|0!6^ -x15lehAbCvZ{Ae6@oYeYgh0Q;Jat^fn!g1f=;i3)Nv<v(Xgwd!B8c;_ljPFu@R<Rg%^H8b-2NUeC`Mq -2qC`d}xfi6eSCwACA(M0w+1R{$H<1zA#szX(K#DeR7O`c%{z*$v;B9QnP+~l%}X|AuXF3#^7UrQeIpI -8>HkJ3dE!!2bln?34eYF~PQEDwrOQ$lchx}J6j?OI(k(>JDik@rIiAWzN!N?ypH>1<<&ho7w{utxny% -uo6l?7P-lWAtsF82bN*gnsuA39;sB4*O`c;!v9g-{$clZwvMq^=pn!J&67>>hIw3p~EV|j@N0@@m6Uo -9G3eztJ{#ES`oZiUQ0qNWTp9TD%wdx{iWPUQV(^oS*+^pfr=C8&@ArrJfXv3DrSRJ49}Iqp1c;>eYF~ -*aG0^SUfWY;HA<!Qpp|Od2W8!lCZ=kK2h=o#&NzJ?M!0VXFxouxz|8QEpFrqmYyXTj0Q(?#;AHPuxyC -i$>9Z%JBTO9=(F0Qg0Ysg-a2ZpmBmLy9MfsQ0UnBOGo<w0I57BY|fz^?jO_Vh13af+4DQiQvu-XG*o} -;#E6J{Uh0Y|AiLG8(xv3KJRBt?RTXd~F7TP*8gzRRI@xy4Nxy4AMNaM`XvTsC+&!q|~8(`TS0KXASXi -m#hoQ5*A($hyr`_)+~oGouIUXE@*hI5X7j;7wGvnX7r>VWvf^rFY@M;JGD+#X9x~jsdcx8A9&ISe@86 -c2futuq4)wd*4uXLUPDR^CV9Dd6w{K6F&7>gI3!Go=WNS;Eu7!Pxurcgk!}^I`vX^SwA{~MaFigrTJ) -IKmyZ@9(2a0`8IaP#>R0NEt!R$kRNve1&yY=LbRzXz3I^*;u-q%ifiaoKFCeX7idrI@g9Y?0qpUEA)J -z5=h=>yV27Xb=-aNEH1dG<EN-WPd>GHT2T$qZhU$3$LX-@w#HUdT#zT(B@1IXUsAJIP=&);A!(isazZ -HMWhKCN9-vn-Z=qZlX<AW29A@NuUbI@o{%v(pAVa4tfX9f31;KAD+2ye!oNB{N*430|G_KyYYdA(c;a ->kI`VmiDBlEJF%9fQu=ZXMLqc6iujv{Z*C>v-Z0;z;LB9sQe9FN2YDnaXOXN*{Kg|7y2MwFGP~cskNO -tkMq7eI=86auCa$kf4OU9nI{w2x#&s;_4sL#K<#)?jCrDI~@FkoKA3XmvxG5VP+lUF$`o+D_N<7sUn} -JV3im)cR+lO$r!#XpjBh-fd#n<Mfxg)DsxrQ+F}(cGY{<{B)+I>o-+H&n=m}fa&?v$mPuNw5d$rvBkz -4n=GpOxV%RZ7!9`1Y70RtQ?qKL=GnZL6xzMY5FQy8_*nY%lS~=RU^P$-RX8>fqesw(s^Rv#$`aq}-2K -)QyG&-Gv*%9pc`JbLW3wiohA7Qg{_l;ORUdSVhMsy_h(PZC-z4uA=cD^;V{PLBY*L3x+(+v5Fb<A6r! -i+;+%?p@=&yTt<ykL*dqUX=a^rgHKfy7GTXuy9S!yW-XKzv&-g$oGqm&11W&<oe)Ll?rxl6d00H*WlS -HTxRo7}q3tkxElvCzgE)pWNZ?{84ys@%o%%*ntPE6N>&@)>4;xDLrX*eA=RmYPR|xP)h>@6aWAK2mnz -TaZH$F=r0up003PW000{R003}la4%nWWo~3|axZdaadl;LbaO9ZaA_`ZdF@wGZ`(Eye)q39v=6ca#qP -2_3_=qiO}r&rkOYl`J+wtdOJ|#nBzhzj&l|SizB`gqA}3ASp$}_N1GWW;{O<0%?~bSEu)VbnnaX7~Po -TE5?H~D0ulMZPv!2G^Yc$pj#ZvbEx%KJwCJSkxRC!$>$Z}a=iIp{A7YMJzF4#Xm9`<@krj~0h=L?%aK -O4Z#i|=+|x`tn|s?aWIxwL-{dr2WPtPCcwzZBU5cVaMzaB_SwKD`*jOldNw5puLb7G~%i?9H?)VaOgR -ZE1rsQdOqc>*Y9u;C{a(Gb)dv)<q0kTURTg=Vp-ffIftBKs&6iGxAteIe}C;T|tr+!k8ot;lRsqv6oU -%yfs-0ElTj{N%(h;G7A;1HX%|_(+`;0;qC3@R05Z;Pd<C2`!&R=T3QNP6azSvnY+|$Ah7A$B4tFu6ge -mhvT_Cpk`_?Nl=9Z<rp1n_Tv+jdp+XWpY6i9@9T-T{H~lMI$8ar*8VB#v6#6S!6zm6?E4Q&Cy<t9xy^ -Aqp%w&Pvg}lNLD*MfuXq=v^eC=#J=IaNes*bOG!$t6)Ar~le)E}pM21k?0IUM<At(lc1bw3K8DRm|BE -;y5N;GX>=^d>2v2F;v4<aL@xl_)VvZrI=Uh79M797xl@I!j!J|4!3^ugAKul1y1}8D%-qb0u=`1%J}? -W*=c@qGA;Y*zvdMc|YP6&PeQxkOzY_jp6$Tm&6cds<I^O_jbL+h_<vw$u$8#eAf0Dvf5Zxz7M%}9;_C -q8K7CZ?Uqs)lKX=%pw=ig99c01oR+WwctazxxxB{8*>`OwO}iEeRzObq=~Mv&36CrCT>3mVf^2P*Ea+ -)l%WR_~1X0^XM+f^g>&Nj!dx@JVUA+=UW}`znCn1dvoO52-yt;#DWr?b`9mpfKf>Kn}Sdg5~T^X!|w5 -?YL^)>2N!d#JU08^ZCZzqbph++^-@r=Y|W1r7N<19)0gk8Bx@GivE<VAi%gugq0m*L9nr9RH!ze`B#z -QbpDx1_^ZQK;2>jk(lZ4xLC}DOI4ThA?)#jdE!me?N~WqqFnL@!9Fc==|(rGCIGc@BZZAXmmI}8BfNe -qw)SBG@yhwghQMOsv^f$noe|0RdU<aJAO>bc;^(*>W}-{N2u~rESF3vEwd_91>50d@PQL_$q4ICdMQn -Ew(dZVso@}}Vd{gAxrwe8GFwnh8yW$;RJAG$myKJz!hqDK$EB#1LS$faase4?D`zqj7DK9iW!+<<BvJ -bQu@rXEg{2aJgMFCRRqj<?8+?#oA1m2HQFdaL+!=oog+Xot?5{?%q#@y^uAAdbmL;WzJTKOet5wC#5A -$w+r|>r6FG7GEg)0bCKvqab=H<Rg^oL6<2SYfX!Gz@*LqFoD)T<&oUZVkRmpa(eXlqU9-pzRsJbu|+? -KMM0*ue5ipq=oVWq!1|G-8fP(hC&t?d>%qR<q&O6S@VvH%QIY6;VB~uM2CJ$!NrXQ&|m_o{#2eqd`Du -9fUVKFJ8RcYo;=9`#HQ?Qzo0f8u7swQPPO=(j|h#K#jxH^y8J~CP41cS)mN(oWPnii2+VrE13gH*mWA -CvMVHYs3qQLjiv({SLaUd<eaK?hQA5znlMSysImcLUDEi%?Yy9)8eHcVGzrqAx@IF+yg_j_7@sJ2a5r -P>@WNm82i)$$-K3SZ&uMdi*qvr~Zw<A(-N80YzeIB1J@A9#?y0Kq&iJc|>5DM%Qofojb|>7gVMKkq^) -^J7z*(?H(wNuHdkHoAG!5a=S!=}=nlD~F9qoE|h6Zi!yHG#cXy;TO+>(4Lgmky%!$lI_SwaT=-`z}mc -1{1j_nTV@t{|LFUpUK8kNQApwE4;y_~!BJF|r|?_1}n&!JVb|GtE?fjOL{>p@Z?P82T5#%{|`Ac>Map -<UjNd{B^(H{tsofDHE1LBNHbE{t05>pL@hp-__1Tg1P*rm#3tc`aZeb(TK3w;<Hr3FLU2?@`QB43it% -2<XE7^N6&o!n*a1q{Y@G@J$KLXe*sWS0|XQR000O8Q5kVe1FiCsL<;}_044wc8~^|SaA|NaUv_0~WN& -gWa%FLKWpi|MFJX0bXfAMh<r-^m+c@&Oe+AD$A*r>M$F|)fSYwfGvfH3-TBKQA54}R5ZQ5odiz-RQ$u -9PO`_1qnQL-JUw>aG4&MjP7oEPUkWcSGM@sLc!lo#`3Qt8?71-|L^`u%=Svac0WTBWqoi{3xNPp@~i; -EF88w8|Oa7n<@y5xrmpfmxyXglaAdvY^E@XHt=wkmS-+H1vCXSqiC%Q2t3W|D^e{eqK<u$oaTlT1ZAw -VE<x8WdT1`uQ!uoNyb#M=TC`S96x``3fLfXtLa26ORD{HCG(O>#Rf!aIWV~JfW$qtxaLfGaCWODo#@Q -H&a}wBQ0ZVZUT7u@nrD^fd5r@w1?b|2Wi84r7$ZYA<v@A?n`5%qd-?9->g?hwyZYPvv+U=0mv6IQFW; -P9ynJ_hc1lJhqGg#oCGX!3SF6<!G`t+bhU|W)QJciuU*BAvXYWrguMm4#<(dOmy>GClRMV)}>rL5=WS -|5-$<U4{aa<|f)Dl!wQl(ZxPLtyvfe+a5lIco<;VJnEk;n-k5xdRQm>A*qNdFv+RDia@MFc4;4G3dCA -BsEz=UFbnUkLb$79|lg!qLW5J6uKYl=%%`;BsTOpf_AplE9B?wH%W%kXtcQFg7*RB?EzPm_r9*V>Y3% -2~sjqg11u1z|rzMkP(@3o%S6pe1_yrbxjquZ`}K<1&}m&3kF|G<baO6mf-d1`QSH`YjDG<BG$e5nCD# -IIec_|5FT8V<oucuKvF3&5wzlY4g!KeOK}4m09xOr2k^(B@);=v_^N{7(zKYcz!;6II&<L1heC=EasA -p@>p~Pmi$FXT$G;FH7sZ@Oltfh}x}=rG2Q2BgX;~S``<#Ik82>lSL?$C*{Dn<4xf4}%!;HsRO7ZUpf0 -2JAsI?9)>KulEmd1A)gmN?h3n><iN;0d!(HLUW8^Nbt8l@EDoGn$_Ptl*Lt`(IGT96PhY%b*8=#+t@* -zozQRayg>)K8uYgiII;NpFjJe1!Zt^LQ%%!{(_|$)7Thr{c_06LoPn9FntQ3R;5LqB;Dm&9*V3fJ9)c -!1VqxwV5@JauBRIjFL_C8W(8O3uN_=Tj*it1zb$iHmgSD$yya@yr-^k@i;n;(l3G+@usAmBq^enu~m; -_CQSzSJfQ?kazHSN9GJ7%8oSB(KN*iQFeWKea8N|XN(Lr|Om2(@xtU3jmSC}~D}gC5*#vO1ELJR^4M? -aWNjVU|5c=HHV$(Azg^VLpSQb!qq3Ng;=5&H&D7aOMdUImGy1IIAbcXP;-$Wz*iPm%i+1vmIH7jUXz= -zST=OBC?V9w>!&PI5_b-j_TWfDIKl5X&*HoyiK3E8o)H8TMswlwFgnCJ1QRzP(akI0;Xfgn~4g#n5DS -~LK~7u|H(5o;aYuX*$u`*RYCUa(!FV<JTWWMV)b<}s;lm((ZYAwu%sj1{BLpu=t>)6&JDy|<(*k8JtW -dns=3j8C;ZY@1^l@C}YdALLdK*{$I){I~A;l+QuN2L+M^{V$Is53omGGgd-&hFXI~tYmU%X9_5@pnF& -mlFmC6GYgVgkWn**q~=W=xVza5Q1vK=li6Fak3A?&3Tvj5Lm4zqbN(At<S&@x1eB9Nx*FBB9WWM|P+S -)e;u48P0lUrnND&M+b0sUb3l#i9XN8do3RAQT+(5#dR29hJU>EpgVYK@DAG-icp#TnZ%}xobW%l&o(1 -cTsQyXbq@q7vs7doz+xt#kg83YxSZ<wS41){_H=VPhwN_LC|zO^326U~>{lx*JUr^o<ApKAoK*R2Q!A -VByEqtaIJ6tZ+20Z7z@IL)E2;(Bq9SQf1Y43I@hA$oUVTBraG2X~l-XD?dXcP`ur1ip`}ZD-9wfupyl -&l-<oxw;RyeomoP2CF7P%;j`Bo>G`sm8u|pSo6DM3}q%fJCH*NQrj@&Oq#PBmWQ&3{G4>y9<RS1emMK -^A!-YY-nX1SGm43CJ2C1Q1pVY~w~-7#x3J&ax{WmFH-Y~B$EA07j*<d%;0v|n*6u%UV}w@oat69z-~N -YJCmXh?7W6;2MPPpT&^>xV8}EFL2Q1cAh#HXTaRVRsAF1O<s!tw~7?+Zy<<t$`jZW>PY{$YL`S|gp9V -DB!m)tSkD810Ii*DL0GjnQ$HO`-6#h9}i!pBhjurpW09pw!x$<a8xaP#BOFUisK!{=nR;FAStLR9(Gh -ywjJTbAww!*D}Nqnc@IeuK~V_xqs&>UH2J@7lXJC{Ms)e#C*M4cVyU<PZbiXc_)SM$zpi#w5?Jz0Ao` -jc<^BI!Eq-v0fQIja^R;lVI(ry>`^Lvdh*R(_vF4cNX8UM1ool?@4ew3v7d2OkmbE$vS#;@ZuJAa6fj -_=eRNYe(+>#EGpcEfxI6C&vw%Ze#bkA36)lo7E`f|Uj!zY_;MMy;$5}k{nPQ`^Uq0WwuhzXu4A-a5mp -Cwj{_%0()A6E#km{zs<aXO`qYvL(uku5PM0Ks3ji%s<ngE%`f5{P+!I7DETyW<Ih5T&x6d;K$ELCCd* -P28ervhY3E&*Z?`z<=8Od5W$&S5w{>eQKZIhn895CkxLtf}~ce32on3{jPxz*)0Ea!OS4NbPI{L17xd -t45cUi{b`s^Brls2Pt(pvk^VJ?`1Ca?g-g-BU#V-c@jfDiVdV!1rV{r+3U$1FzSX2ip#-tw|#(X4QdP -uDRHs8+)#;Bx;D7O8q7zWGm8EDptES2@4(KuSH0J3~Qr4x&-QYGJ2%EM>gu~xM~u1-o|MnH<7xiMe4z -TX5B86Y|14JqkhsJkjIbl6o0PTeg7p>Oq2FFVNxNJc!A)_s5G1rV3RWCs%Ek~pLfQU!!>zfb(g61^A) -{jDj2`L3lbnjw8SedYosA+dSEgaV-N;uqf0;L)c1gwj>zVrXOEoE8a~i;U@Cli3(ehBm}hg1*g$_^j4 -ZS+)$#uR92~3~<K5i8=hi%MXx5q9|L*(mk3#ht@&^axhY@HRr|3#$7|G-Z^6cQ?U(k1m(42?_9Jh?4Z -ma9<-X6JRD_+>lGvkoy0Gyk%5qOKoB#_g^%q)+^)Lbd8@QSHJh2tHkxjMtUEl1C(r;{^N{~GC~im~fW -<s8HaDy=y!BBSPb$&Pb)r5If1;t63CwToS3eaKWKOD4_53TH0kXFIk2135bGeVd`4bS;IKxga|;7rUV -2SURaNm&|fHS0h+F|K;M{<=M-V4`<0Pe(oq@?MgNVPN}NKaRh|zZU;6Gj1I#lz}oC3L;;SNcsGvMo2U -=T?1hZEh>?8G3*ZC*1>^^CiVg)lFU&!m1TQ-aw(=IYeo#3&3Xj3S^SXZE_;%ms0;Ytv3QEaJV}0*B6H -(rEU^d@-$B3HxmxG3cd8Dg#J}G{|nC)@e6go;YYxkV*8ry9;$64!e45fMyz#pwa2|t-MI%uqsVx$@Qf -@Ir4Nf#Us3-3}|mIy7^0KCmchHY<Cj>+V`?alT))y`2n&W<5F*XN7jk*7I+4Dx?ll+8z(NjvASAdk}< -C@tWOc!%xU7<J7{<Dww_jx4%uXu9`!f2;XrZED%Jv+ho$ThAAz&7Yd(d9Yh{J7J|JCmIUqxYEqrO?6Z -LxxE&hV4y>8Z=a+?zlm3=CVZ#17W>>UX5IM5c2zR`&kpqfZ|VRwwPa}iD}g;uA7Ej@nFWzLWZHGdRhy -cw*`_~=<~mXYdmSx0L@w4c%)^dmF#zTeBj7=Jc^B8MaOCFqrnO1F8OgU+$+v~iz47yZcE|QlP)h>@6a -WAK2mnzTaZClF+Vu-M0s!zL1OOiZ003}la4%nWWo~3|axZdaadl;LbaO9bVPj=-bS`jZZOpw{lbg)CC -VJ1WaCG174)tDQ9u%=Jn1v*eK#aOM!7L^rF^J*UpF~w<m;IHO*SB_`IPLIIPBN1OK|aI#W(xYB-;}oP -<7V@X*ZxZ`>%cG1S$g|s)OGibXTKdk7v7%#+4|p()_=Vph5qNab06e!*!{cB4}K7rn{WT)uTB5Q(s|r -uJ~)ii7(u}pO3^sMP%uT33=9(}jDtF=Kzx(3TN*d_CcA-wVDSbgHUzpshz-na2xP;cn;6*y)P{&Q7`0 -)NO@M4@YJ)Nx+FwqyWs#rz0LO!H!;l*~*hKgy!8c5_A<+%$Z+v>g_!}D8ByVRxmQ(ro28lK_x?#e%{! -oJaxySg`5dv>;coXBBAlQI$hSUZ}HzBi$v8Bfd+aU4M@6w&W!RbvvZb*7VyoM4}n-CnuHX*2)Y{+ow5 -CcuXQ3m?Y<rgQ)iuR2c4O5X6o;Af+DWocj5ScvBmT1Zj3dg3(fn#64ILYe#fzSs*_jddGqFkS$#_FQP ->Fi+7;z4B#8DbGj<gO~O7uG17tjndE&9Sv9icuS&yK5k6_X~=r!OiPJR2)TtJ-*dxO%B;Tp#alU9TrD -<W-o6CR8uT|ZfsS|GvYZxH`!PkVB#pSger)mnzI9>3Y-rLCr}6q(pTY9rb^++&+P84Q_p0JounGYAPt -^i>-t_Cxosdb8RR*m={r%c$OL+DwX15dgOI)|9mF9z2Pgw8qQ<F4JIMO09GrXiYP__CUX7*Q^ZinWG! --+Ig=PNykk3kh3A)I!y2Y}%!U+Sr9N)7wxY@ek3%!4V@{r7Nc(qTS&oRT*(qG+`?OJ@ahsqZ9GegTK1 -FxcL9_MHtJ7vEjwag>^W~$hW|GY!v1fM6e4b3gPtxb5Zs<53~YaENts>N9$g$Vt~Q`q`gp6R>9;4)@w -CVzAbZKjLu9YUNYZ|j1z^8ybBkIv*W*cX^|N6vVl+|+7a&{OX+Sz?_}yB%J3K^V!TX~<h62R}jW%{pH -D^pbUU7icyv-JOgK)BW-IoOYac3X!uZ;ua}WL#!Q~1LsXdg!dyl(rMwhJIF#weZI9=bSMXd5HrhBo!B -SGrVuM$O)q;!k{?CxT=>RKXLEhv8!q5V;he@2!DuwZWKvD7n#sB|>w*wYY^s7MS<dwwJW?z!gC{i-29 -aA2y0|>*T+W`BXJc!CdI>E;oXHBTzFn&v{8l;D9gZ{781;NZN8PC|^#cZrvw5!9>zO&vtj49q<62}gG -r$}KK4Xbxk34uuSmbuPB_e~u3c98akL;P7(q7mj$!TnF{Lno0Dz+%5aUZpDJ_IGdKhDsUBUdxhWIj+= -11aPlVg+>5JR9?N)u{rnSKc$rJc=SY-G1I={t4rAs2@T}wn`!uA&l0NQnT#IFu0p)M3JN0Lc-YUagy^ -jtx?lNcyNF|o^$e)Z_MGkQ!cwEEfc<?rs@Q-foOO75Zx2vevpeI=E(Uzj-%I8`)L=q5`ylB=XHCn@W& -{5V;OO`%(I%6GgYqTN06|8@Wie(Fqg+r#ACeJc;NQzFi)Jpiml3#L~b>VX|45!3=^h%#=MKWXWhtyG* -Crot6Irj;hxf2*kS3U@K?;aly0^b^WFY@x#R4A{ny)+CThZ8Cp74HsPz-v0HFB-k^b|Wf&L!1{`C%ik -6f=BzlAT7MroQL2^v9(ui%RTb3eYJs0|e_5J7+`A0SJz!Qf30ZEyfg@Fq+aG>BkO_$7Q%#3qI}ez4#N -0-%N1AOO3l1u9^GW&lx=O%!b+a0dE?MgR-(4GK;b{|3H7e?h9~H2?~KwFl#&7rY9X4UBFua)XAOgxN# -@wUP~mEQskN%b1bi1#1AN@C})4h+u;+khP#HXabHh@gL!<&jEZr_J4sd0rx5*g};O^QxL)IfWN^PKdP ->Qj!&<WS_>_2LB@Tb^A#RWty~$!nKeG3jsJvB5P+vo2i2brf@8z>8fvQG0aOwZRY(Ccv4gXe<>IRh`d -*lGs(NOJ?FaIV(RYOT1z^&{nLC5VrV4J$+a+Ap{ZE(hesDPkQ1O>z;C`Kz@An0IzcC!RF#>?56DxoUd -d-8MId&hMb}YF%RCHZgHb3s$m13U*p3&CVtw4&+=>R?PC>d`n8K#uM)dHqTBnmsaxVQ6m#Z^FH=@hT9 -ZWZELYt>ik{0R1E{}Mm;vFco98j9;f^Q`B4OHR&CkKOaVcyQAS-rnMMmaY)?HUwppOTAgQPt7~`ad%1 -LgU;2L#4XAP)R|?R31<7;rYgV7#9*ImXX>0L`bd}wj~~MJI(2sIVA!?hE3r;)W+~ndJ9%#?hdF|H#=X -p^+haG>O-O9zo6)zE`mFK203QhcU?%;bU7x7zJ|qC1lV=<icehT9;ck@p-G}DKszH+Y!Tb008O;}$VW -x+}nr_N+lhu$X(tL1(dSz>ppVAXw;WW<<BFp+m?k4aYRGDwYXsgpNI06q7_!PWBSm=rYn+q~=tOe);f -Uud3-s<9_l<HQsQnrwdhT*p59$ZIUx?SC2%y7A8_@Je)4ib*1hl9yB;QG@Y?v?)5fJ32v9#Cxxc;W`V -KW+2!v>hs<jCf{R-h+dyOos|o64>N**0U<g0_&vUHNn%!y^KRV$h8b%Wd&CmmS9{ZAM&5U@iR77o@8F -fu`Y4nppM+W7xlvfms@BDubm-CLmkUzVb{=PHqb#O2By{CnF}p#&jHsTD}j}FQuip7f~xK++<H}ez_0 -lA2%!uzYFxwF+Fd@a1atrBI-5Tr$LgRd@`~JhHy68Xdl;Fr(?bgM#7zjt5DxLpKKjoyRCg;ZV+1zkiq -HtzE<fh@!8c&LxJg`KpQMQBjcrO?$?K|LYlOU$DMnsJL&B??H%1VfJcS^*Jq;Nlj9gmrPx79&+ciaYy -`mcWWUnIg(z-c2muy%8igBN<^`o>7M!(b76l8KaytWUQysAc$6Hi#3d#e%IF=P{$A)UtRE)~1B)RpnE --V*##<O=Z_$7w8^hxBh?qYWVFg-v|vx9vCV+o=!AEc|wAvI;QEZ+zTzS(1f*m({m#Y~Nk$ChH~uVKN5 -5@T2+v{-)f*e=LCby+gC<+wPkdci?3z*8dUyuWty$FyDS@@t@zMy7}h6^*hJWx4w<P)wgo`1%m%?9_I -(rFHPEibBv$q01A^Njgt(CQVdR^7y_dNj#3m&!3YgABnirJ<V$i8MvEQ<sP0pXcntAH62755(4RN}SD -+{X%Dyx&%zQ}>03kr54II5xGPc2k4asa6&{?zz0K^lU5ZhotlA;@e*ib-#!W$-7G-ycvUfTj%0Z0iTD -?m8|i3${Q;xCQSWP=7vAqp?T7RcBz*!aZqUm#-vb)cf<C;>z@u_1{Ur3jaDKpm)HL!sbu{zMK$c>%jY -;YFPflJv5xXCmt(w=cx&xQ`k4SDD5EnWie+y{fkZ#J`C>SsZq@HH)swS@JvD9_`AWeEWs*ts<7aH{s* -<eOg|$tyEr0D6GnN>^7#z)c~Uav+6c_hE+Qra~A)ote&s={>+X?vmg}dQhv094m`IDDz#r|h*2?<B1= -dl1Hi6I^5W=V^3_U3X8K@TjE2bxA1vhb-pQLZ6}8rLwOJ9=)Y{rvAeXr!ag*;L*YH-PI%-dmTvooLUB -SOkz<;>NHR=G{-Jxh(EOcY5&hOIO6aifkUzFutdCywTVyfv)>TD63S^6J0aJhfbf9D4NxP*W61}^sx` -tRJp*QfB`xq-|5gWhi7&$R2GvM#kJZ_<H|IojV=bO34Cky)u_Q*z2+u36MryLzEFh(u?l7mAK9VpLYi -I^lZhV2E-8W})B_AfhE7R~gzt`%1dp<*+g}fcVlb2zgd?G>M#i<Nj1s_p*njjGA>vCAIwIHnh0g@dWD -b&~OTRxrd6;3d6&YnrGU>?t6ulC&?Z~pLD5wca^NVa2(q^?N#MgV_KF2lE<DfhPc?_N;-2D#Pch=pjH -oKTGhrq8N~ju8q&J4;tNVNk=(5m?cPrH0FM{jyH%v5h1=sJqGiS5$z%t)!#rT^4xJxs%zqw8-S;zfG< -Sr1&tZbdG{%uG7yL++Y7uc=yft>FLx(MaYrEs<^iWo1giVBRw9EWGJrRwwGx+_PKZWZ9T}|uW@NcLYL -+B)(uJ;0t@{5Z_tbL%JE*Y&vLwED3GjA@9yDZZptLzyx6}xjsBFRyb;%DsPT-6v7WbWC8JfciW&kfJR -!!-{E)kZ@Ump(l_;o`uYBlMPqjM;ZJ>txwF?bdjIRU=FBd1&q7Lq3&q%i)X`)wp-{yz>LAx>9Pf2a}P -*R^MjkDz53XeBIUksjDhOw+wsgfv~(o5-v7Qp6uMLfyaJ-b)|D~FLica3*!*Rp32pfb`63Wr5<Y^orb -P?vPEcStuVH;+(G6zUrl0q3d0mJSgN5X9kFY{?@-vy2{=w2^SW+rsed3%uir_tU=G(KaiGB+6ZOAAPs -Cfd!1F(DarayJ{0|hy>Hh^l{&Qu3@WU|tBmPme=1=GUXQ}!vyM=Xg|Hrpr`qsqBKfe7(2_A~B{Z?jv@ -Q?rXg93c+@32&fqhDCb|AoW*AS0iTo|?GI`s&-O`*R%jO}vneXWabaqcb=OlMIT(UvY~#UJP;U<$Po4 -Vm|;BkI7982nVrAsKrSS@C}B)#QoRC1F={V8<<>-cR)x0t61D~V&lgPr2u^Z^pB~9oB-ShzX9R{E&{s -5kl%0%GFn&;I3u6}3(E<Y;RW#GF_7rO8vv1^nZ=L*gaxn%KU{_#y<83o+tBdhJ;34OyaQGd(n|m!LSM -cG=#%;*x7aV-V*GAAh({U7T;Yp(1<1Qj5G|EcKG5#~84dx5H+znFqQAKMs0-}s9nCBai?C=S%HZ~fdh -cRPup})}a~3}G+#R5r_6%=qugE(>+3w0qhNpXZya!GRhZEQOj+7m;V%(W*{sEI){s&9~RI~eNyF)@u? -}N$)*!tEOz~Ttde*A#Keer8OtqgC*9lBIy?zzT2K=D*}ZP=HY$#)Gx;nPVKbbN1qrwo&t>!UVXgJw!^ -X1&Q`(5p}o5!KuQ&LG1;9t~pp?#>UL^waeV5~~XM+YKD`<ql!cq564f2UycBgnpe}kpZVbnJMJ))B_+ -LR(5sB*cyO$2Szz7;9fzVqx5@IELC28?^zA^vU*np5e&OXfBBSB^R01t5yTm=pf~e{9o5IL75_vD_JT -5KLV8~wBu@E@Ru<pEh-R1Le7b)DQ)3~Ahq0I2{*fzeXiJs;fcEgycn;m(^r$Y~`sIa+a9!nQy}j0h)| -q<-iTkbZX_w<cz9Y0a*T*f=W7~FJ?l?V$T2H>`E{cQM{lKn8UeKoIZm|WsW#DozM?7E68T&-8SRC0QR -ty;B`qjC)8fUq*dlynm?s*C`@{-Q^`heo+P(m}SxU56IetK1Ynbz`+8b{gT@k3m+(}hDXx8A}Z431Q` -3AyI%+zyA+UOy2B($L$^Q0CN{Y_DP3%20*=>~WYIB+QE7B|E*E?0w~S%3ZEx9H?h#TVJC1R@={*X7j6 -+*<8pLyl*~PV(0JV^-4_4+r{PwozO6pu4Y>G6lYiInBX8GyM=IF5m=q&YFHU`;qMzU(1#Oa$7c>UWcJ -x*yI#+7HL0#Uws3lv{mO_GUTjb311LxQKs`og<&I?RM_S2*7x0)-+;zQIu~GK$m2=5VQs>(1j&7>(cA -CsJK2`|^9@epjEZS$&>(N^^0E<hQp+ll)u9i_Mib~}xyBXz1V8SPMrG*>`+ihD>)%7lxaqF3+mq4?Nx -FWv_IJWe!2fIf(n8YJLhMkdcZ$&7nZVro+c|<LmifHEf2+GoEgwD7LPn!s!eof~TnqH=HZ|;ymI5;$T -m`PNA%(3%KjK?Fr-Jb-Jh6VwMsM}xn!z1SSV0YTv9kqf2Pe1TVx60$jt@y1>uR=OLGx1H6RLR4x6t7_ -O?k?~|5~e#|Ytc9e;8c<9;PhOJ4U|ZvANA#>P;EM$E#qQ~|2pB|{Ibic8UQ3e1#$Cc4!nH(<ELW)zJD -D4g%kXHJ$%6SZ(DzcX$&I>oJ6RvP#WMHkpB$6h-e1D8nvKe1R(Vlhh|<{8^A7rU>`s?{v}ESbd2Iff= -BQo*-3IS=Lu|+#7o#2U^q=L&OAkLqF{s4OUI$V#0e<;Hz<vO)4j|GAD}$B2>;*}e?ZWeeE<l6|1t;s< -;2M=jvine1lb_WCL$NhV!>@<@gVSE!(hva6KttTf)fXSj&3iyt6Y6YX*Olq{wwysgpA)s>$_&%L53-w -RgV3D?VVmpEtt+bFpZb0p$?+{5hlJ1v9l|~@(r<6AoLXWP5pwmv*bNzgn?WHy3<N^tjsR%&U(X(w^)P -9;jUmVlG<9r0=Oo4gDTZ7B$x{FR;bLHSuBNvlfMPuKVt7^%NoU;)xQTQtlc%(0$_HS3A&g+LID8Y_CK -9n5Hm2jeS`@vpDz!<JmCS24%u%2`xb;3{)UL%t71Rx8>kWxm*g)~)z}2W-!eST?DQZHIMN^YQ{`W@)z -ytraOdp~ozi};_L=u2;Y_Q~<eWE<a=}>r+;Y~fS0Y9Yb2=t_FGKwFb_-Xjq3;u8R_|GU#>#x?D@)tgm -a5j|(`j~Iyoaj07e1UAKMk|Ztjn`Ft$CTThw#Lo2JW!u+TO>b8<=SC81l^9K9Ooe+$kb+V28)Khulh7 -bq`NkAIykD3LcRPuaZy5-8rQNJ2Gyd$no<ik^R$RNg}=qM6w>;&JSk5BQ6sZg$!mD*gRd>wl}eII&0= ->q>GA|LXIfz&(I^OW7J>sdsAXYu2M)X3)>-95cIj8Vkj@+$Mq3ug*M#eym*ftfQeC5f#!Q5(~;vmQ93 -%2WAeO#<Z5%O6<hG-czz%dCt|}p1C7MDFu0<!-U4ypBU9fp9t`;O25$faQ&IlxjzJ&x*pkJ->bxXK=# -h{a!xt5))=<iv!t%-<83r|(Llh1;sq50}>F>`K8k-CXG1tOWs8r{lrFYkiYj}V~&#BMZHL>{ylb!-cB -YmOnJXF@jbvy61)lu~@(OP$yla5ec%;$EHV5%VyH;oke#tiH65?)n~xCW`Tc2}#5A?E_k^4;lr*5*P) -{9=r+*}CQ%7!vO{tcC#%na7y9pm7&wal%u|eMbOJZ5)CG83L#EJqjs^>k6Bn!gQNRN~V&@Qm!*pw1*5 -IeXYtB{(<8j78kl06D!T{^=8J0a@*+YjNUH#8d)o3?6u6+;0MkP+Nd)RXUJd_{Ll%jG#V!V3MTS=w%5 -m)+X4{XiHC<bSNDGzvDhejLkV&0;^yX;ON99yZ@wR6xdn0lTGcd9AJ+FTF!q12+YfB}YrS8A4fzVufK -J4S4S_EnGEFR~1F!>2mU#2>J6fb3z$zf-U>}r!iD)po_{{(@fCvOgh+|8CB)xzS=nvo$$t*nqB??fC2 -$n-jP#jdCf2TWvd`y-^ETDQZ0Eg((QIc#DcoC5RWRYY;N6VR_H<$bsT_@wkLk9{q_7|;;00;{<G^oQY -QWwB2kh3W01pTA#)Ly!i{6IABOD{{{p1+`(3Bb&PK8sM@F^Z4bUAL5Rm$Supsc1>X<-6-@<B@Dn0e}Z -ckqpb?x#Pt(Fn|-y2h_bI9e0t94`h?#tx<**csG~at@9hwL7$**(NK#FnvVeL0Mh+hHU#s}NN2&;2uT -8a{tk8U=V3~`diI7L`w>A$z8nn%hGW?ho0>o}MnEF^^Di*?>Ao256$WtGd(Q9*y)P&T{Vf<gB$%9^Dm -rDwgLzBM^4URKYHS4>MON7nojWoR&7*tgOEtM1lc)8dixn)${qZ!f?9P%Jr<^LwsrljTHo@WUGElER* -4mtQ+Z^a69~ta68O(WIt9JsP+Dx~PH`yH+{C2ssCzfnI{~k-qD!!7^!_sCKstWSS1;;A9oWn5CbdPPe -A_3zZ?(vUfRr_bpEB2k*igf;%@29JlC-Z%M^_>-kzy}xdVY3)XtPd<H3CsJ)3o)SiPT}~xrL9BuFkpO -fJNU40ozU@I8=(>HZz$Gjfk-`O4HDrqHl3f5J^*@F$%OCRJ!O=!`+PjvH~Yeb@Ew7DjL*8V>oh(XovG -hGDQZ<l7GuGXlZD?y=$OEBsQGhLya`Y*&d>1fnUEuYv8dt5;JkUTxq9G-g`5Gn`vG<IXK0jE_LUVjq? -gyz7b(M;D@>ltYxaA`&|iCgTtm_rRhj-d^{@m${j<68dNQH+N0ZZYu~K>cgQP{jdjf6A&_BmOASGwh5 -2Hr@%`5xLV|itdoEID6r>7SBNr)c!09UMX=)4?HR}OdINBSiTQO_XKsED0W-zxK^%qhW(sJ_*maSM5h -X0)ebI>iaiWS%+VtaA?-f2|~^cw6n1OOu&wxWDEOO?QMbYI~<+#+BI<!`c`Kh#UsqGW0HQU<X&XiE(p -pyFJ!2;vT+Uv_X_(@}_&p`I?)1tWhm%e~qh?K{Wk!JU@9zYj9JDeZ~XYC?><5VDXCvK4t9*W$MA#Q`< -m97rBv9rZ}msh$>yh5&b-y-s2*=P>82%``V62E`vjT<<DVyyw!LwuVl4SPKWKh9Sw1oxvjQ~D)uz4Ge -*L>=Fs0%lO=qpx)mpdt$XA`<hv_j7kAT3uRuF9JU!yf@tW#?+xUJ@8T*a3{M}Rj5!U{~RsNQ>@1AlE? -noTH8_RJM-@^E1C!;V-e*3AbuYK<SA4l_xt^H3&@)M&#NSq{L8vWAJ2GY`h#k1pR$^DL^C8G|0g`Tl! -$pB~21;-Z#lKf6A2iUt=98j;^ZEVTBrtu}`Edp{jd>P94JG%fs03v`hi)2oi-%tzcmBI};10WB0vLwK -T<iaBSXi13!>;#UNqcOFl>;d^rg$vV&Uo-;<ZP0dc<;f*Y5Xf~jShPBz92B^sc!P(3q!z`J3XWCZ#j@ -day8RnVyA^)MX2`bHQOa5C1DgfwyF2?m!n^ps--EW>pKWgFhtI91z6<_1L=Gs%0RCLTWLA8)x`8acfM -Y<~Chy6*%dF`@Z`SQXBfL-6?U0^9<wGuZD&Ky9eDUM>_iVosT72!_+1l^C1yxOP(q?dyT!q#0#aq6YL -7Mq09MXXO1p#bRHM~J$KM(-<VQ;?&`BfnAA#HdkFEfWlSlC~FHkO|{!kLO(&fo2AFgkB>q<Joj&m7SE -&Jww{!9nZiczX8o{wGyn(NEU@_fKX?4SQLc3zY1BRQR5J4=@P!oy*-rCGaoP1G@DQN{3_f2O)y~%!qu -uD>Q!9Ub=n7C>UX=M>~|LRwG19sv)h%+V#EWa#F<irx_E)OLZvVSZ+k$Yy)H1IZCVE)~eUeEYo8t)~* -!Ah^b)b?Dq){;fIn9%|x2u@K{cF0QY;_ySjnF+z^<5uG8YVYfLIOwO&spcFlVakv#$&%3*I#o(!}vD_ -<cj_aHj)7A1t(fmL^xug?2KQs5|bpGZ%PB+OJ-3HE%!A@}<{*yejrSnXU{ftrA%b8<YFMgOootPp4ML -W+cTWBRs58~Z7gRv6yN__oq97miY`;(Da0hU<1k+)o+A;6iapT38$Kd%EScX3pfpomkuCDwas9*{UrN -_bYU(<+nQ3vsHBRQMLU}h@cj{qRrpSDQw=-;aPDfuo;xH^y^{y`FVeE!s};mR80j_a~4r&eRA?&Qv;0 -}DvrkOzQ35M8q1f5IWjO1zWA95e&K2U4qPgEt}I;GUMs(#ljxwYdl7m%@ZxQ}la&j@!6M6X>>ylQ#m+ -<U!qo5~X90gZ>t7}EK<`$Ci3t3F3~IXX1j1WohQM0s!=^9Ot((m5JfaNmtPsPO&x6XJ;_0b4_045E=! -op+efPW}%31Z+-f5aVuCTe5k!TCQYw*AwV^z58IAx@xF%L>{)<P?8C$8C%m)?hfs4&+Uw{k~GI~)Bh* -*j{oP5()tc7yglx})xNYzTR*7>4jzHxw%9H|?B}59&VMP7vehAzxs|bN^^>Q=_jjW{uvkM;pV#E|f(y -H_r~133fk)TB}z0b&Fo$A}Suex>`NgP~4N!`4Q>qiNCqx!#b3-RGH&hj|HuhPbbzok~ifP<|s?i$OG= -SeUGNSe%!jx)Icf-enxI6`15lOL_H>!SGzUWS7PlnI{mLF;>Y!y0q~X+|Gxg~qwovf@h>&_o@oD<%0C -eS9LK3INkBp^8FGHGM7Mz&2YMcl7ci%&S8{!_fr$<FN=OIrnGjz)=J5i=0G)k&X#ub}U=|_o11KjpFc -A32@-qN_pIVaO8FI0>X}~Vf-;e;%3r#HUHX3bEVxb^mwD|53w)pV``Jw{w%RmP-g<i7jz$N%E10B#1i -do!$3SFAV_!7|$h{ZI=Ua5hY|3}B%Ugqk2`XB)Un;XuTd2*ui7mR~`0lDqPVLk--8_4~#i0aevkJVT& -q5YmXuMC>0jH;l2N}T_tEa&*oP6za!Z04w({^4|J25LV)^wc{U2vn~4AOq*m$Dxm8`PZ7SzY(5A+rjf -@fq@t<%;oa3au}KpguDoY2rr^DT}M}SwZ95odb*ouamy>Y@9<1@JXZ|oW`~=Z*IW=ipyVbOL~Eq?MtG -*j^KQ?s;$0MU>H65+@7ryqmb@%j*3Adf?5^}C-HcbDWu?3A9&F(WWoML)%ebR^BJml8&4a>Pak{NVH` -aJ)RM=+5lP>K&jp^kKG*e}&7)=VYyWN{W(nE;b-{laou{Lkv634BT9h&&itxGo7o?}I{{qYW_ZT1k`Y -+f1sK&_5EWo&iFX9{=)1p~d^`gFUkne-SRNUc=OV`Rj;>=~T=)OwnSMrPI8N{x~5+xZlWct3>bRo;hj -Tsx3@GLnIR)}iw(Rv+P6L>(;i=Ve=8ui7$MD866o+`Cba!7c<&Vjef7?A1m!|AJK}`&C`&z4CAK#I#t -w`@Qva?elSO^VW?heCc>T#r!=h_sR{r5R^WT_t;q7xb|V5FiZ3~iww>yVjm#(xt-2eZD^Xy)_WYXd0v -|xQXJM~80FiOnVg|ccWkezDy%LT?bhNEoVm^3OY@1WCVl4HdnvJMaujVbQ+mE68_zzoWkHt2DLRD`bZ -X<hmCk__0NA}e%dwFxe}BvU3y)S0>(n2LwX#L~bK~H*qaJmSXI1W9Zp4ory0&i6b-=|ybJv*9MU)qvy -Q#I=2Tt6pJ4{B6NKm7uapc_<;n^jW-2uN=t{c1Kh@c{Qvmqi89o`TT#GixRRvHewD|qA!x6`({bp|Rh -&TUv5PudaVImc(~@L8$D-&x}IG51@y>=`%h-vXCEwD}9Ze6IgT_Zlcjl34PPXfQjYiy*^Zxk^Cfy{+6 -0UZGmb-@rf^(qEzr&~oT2Z5ksMO$g?807;DhO3kL1genF=gTLSng)dGtLM+-f2J`>#B&H89+1*UAtaT -=_#ghgYLoka(P5ea)<KbdO18tkU(y|s$8d>75IJ%%2_OjuVm+2n7^f3^r_$zlC;2!cv_geB7bV2w(x! -2M!?)7U*hyF09$0|2`%<1;$<F-TGqa~ObqVMzio0x-DK^-&!kk}=i`OSnTekmIa^M}xd7Nz@Fp&OL}@ -?pHar!wbk_+iXRpN>O{WcR)cG}=vj^TikGl>N?2R^F6Tx+o`bulAk|**>3-J)7h^_-bhh_sqJW^UrY| -m6LOTSs9+zURYRL%i$li2c(6^kRu-+A56D9Wi%A(a?Cw#+8rrQDBXQZ+%M`Lzf3cylrfxXI0m2Z_vw< -8T^S0glnOw#(T%E8ZYh~2r02&}<KWnEgUF<7Pg_lr<klDdG}|LF5A>tx#eH=qa>P6Nh2smuGdhc2GF` -EIEL|aqiYqcn<0|Ur;HmHHOlqm_@wi@gRkOa3K7R1~Oi?s_ebS#IvZ|Us$=Y%jYJ-r`ClpdUbn654db -{4_hfZuI@o+(WVQpR`A*3Su&^G0D9mn(Tyf#p()BS6kN%1}MZGXESpz1<}hMuknM%f9bV__b5w1~v*^ -iou0-I0J0FeO#<HOhY6c3Od=ywLUGGhD$mGDeWSz2Esu;GpA{%U!4LRGOGnoPP2KO;m?H9w5w}Lfnh~ -EY_LZbycBbeCitw%xxpyg}PYwjx>v1z{gV_@dKV%b(40^6O#|hRC0M8NM~e6p<B7x;<bIxd%@`<kF~e -5DQ+)N!d$rvw$Jt&lcr=9PunMLVcO&*ju~GgRA?!Tu;&YpSaAKg2c2`bi1D<ySCbngMhtNoBV|Z#DWi -WTxJ$p6wTr4TI(r%O%y=Z|7+dL$#fIq|S4HAD?fv+Wt6g|q8G+WVpxd?Y#*vw^^LUaSmq`eX6?y7RA7 -T2I;q|F1DwVdWkCoWo4BnnkK0EZ;X#XjQtv#s2<1q+_OxcwZ?8>kJ(}I^{4WM=OyCJW8U_S8Ke_HvAb ->G)dkPiKX>8Z%7ZeER)oAf(_o!qVX5Zu<dV*E8xYe(@1emx!AygC_@(_9oIgna*|S9waWdMnXlTf}jW -DCMl^>2m@&4LqBioFRHs`tFmNSC{JvMu?Uk$8LN)$;5?}A-`4<B{=C7efa(}npT*1Kt!Wzp5>aE%TPX -&yA!oGWsH(SL$sVgJ&ArM+&FWdZV;=v+x5QdQhqnw^*MEQ{mwq0hkCa)5-kvtQm}7!w$jbK>0OJKqAH -lIhu{EFXRYBG>SxcZaO)&RSby+Gw4iPm)<c#ASBfz+nU321*q~xPX&lyFumE?ht1;^Mo-nfJp+Toxko -94Gqsvu7p~OYd18+aZ1$-Nu9-%F{$WC%G-&!~f^J0|tlhB{F^$pXjqrA_3NLSGF?kbs{t3@P*-9{0<Y -v{IVgrd7lxPv?`HpQLmyk)@qh7}#$Rn(wKo?M}Vw0EGQHsbr^h};FdLBrXT;rKxprf;qbfdmqFn%8s6 -Q2Jn-dACaU8jKzksSs4Ix*pVwfkb1SG;O&b6ZLkfe7TV`W6j(uYaC7)GTtwGT}>Pg4+vt!Onkqw{#EN -RJG-1|G}b#vknml=W^S@qnPhibpGeWV(<{V{p8-0~V$`jaK0qYyVg=1}l>K6Qo{y(vldjK6|E!>3H=a -`GPG0sCb?V&Pgn9kwgU8&Sbb)><r*#A5ldQ?;svv60Tb)ZKYl(TC4gX!Tg#KG}>8n=%lrVim|45lIe9 -1Qp=+^>va#5{JyqMX5jfCiu^94%i#gAXo+(PP0%Cv0b;xE}_RIn^b2T~gF9Y9;)aLIcE6ozD8geqKCw -fo5irxvSyNhA0tlnH(L@mR1#_z86J-2rnW(Zv@4WQ#@?haPYz(DjmW9=(pf641j}wmb5=C~zh!S@vaF -642>|FD;J#A5++*;6<6vf1*s=e}^)?mchSMCikCGro~u)6Xig7&kJ?3K8f<;=d%3AXg;q1`;#dDax~E -A;d~wqphUmhXN7;;XGK}|S>Yj8=Vx0waFa<*Xf%x$c%k=kJPxo`6H#JNp(~w9`4Me9w}I<wt>uXOh<Z -8dU_qo2$eEP`8=nFayJK4XcsTuH`ATki;`JIcoKn;Wb|gYG>!sc8%*W}7)-tmsAaylo$&e(i09!$*9J -yXKZFumfq8|piQVKl;@{=dZ=Mfg~G^eSTa7u>9{klFpm?MdY@opPEAU6nV2X;tIJzhD7aq^nhcMp3vO -q8p8VTOw<d8&AXd`S7g%C5Mr7*-h0!MU|te>^~KjC;LBI+!-1>$zXe2rUe!fg%rtEU(wTuI|pvn#zyQ -=n>7Xj@DS?Uat=|4C6i@0%)&Y8e8=r4ijewuD#5Ag=g;F<!MIEwXwUjX*{wmo#(zlofEv0lT#<~{=Jx -U+ytltDQTdWD^NGQ*tjA#dqpKzPlHlyk$sj5KDS5}`#GH2K?W=8&OoHVlA99>r@m`a7&NUfC4<gmnWX -%2-Z^Prk`4twGoxSEfmyGym6mI?Ks(&g0Sba7)wRg?LX}E0dNDfa%Cfi1V;(}0-RbvzXA-LB>7}vLvN -NLhmKW@|ZI7+1++AO7b5B`@&~Pm+Rh@E9>kt4{niMT~7Fc&pw<&n=&W}epUCR6LbdDT@2PDNYW5R8Bp -=z1}CD9!&AVt9+Dmb2S=+GgTrmL<R#aLQ2&T6qzISyQUTLPTDhLdFLlan!zLyhtut_P|P-n;7o{d3#H -KxxFit{ytNTJwo3??%d;VPj79{ru*7K%Xr7e^&XgaRbl$OL*r!a{$apa=?w*X+~qV56X2tljP9ywzgl -Vl(XyDoe=pG**fQBHA9hG%=MY+LN0`hgt#U3x~*1roIXl>JFP=R61U=$Y^5A;weXU!wLvEbG=Fp)J!@ -MX0_><CIm5^L^n#m|Jn!{8F_GdU^@ezRvBD|y95YW@7Rg|E$0(Ooe=;8`lH4)DNE=8>iA3wS^uDo%ow -^3iM#|xuRTbQMv5^gCJJxuc*UdCPCYS8{sb&Pj4Yi$v%G+}d`RRJwopf_N8Udv@=ld>F_dWa!xc%;wh -_`Tmf3S#hy}^8aL4=7$>I7rxoasi~?0pY15sS1|rzib9CnGj{&Yr$2_ZY_ysBvgGbYXh)ioP4C)BWn+ -Q*UKNDqgs#DL>FIm?2rPrx_2M1FGg%2^DjJacd=~tBY9gs_KF$E7v%XN5sm;JD=WZ!-4VGiLoR*-7C6 -+kfETD*TE1TmsVTHouP#7UQN76+0U@d>}{$=_UAawR_XPQM}<~mD$4ooNGUgcx3i%mpJ|puMUotu!Bz -@)wV_4!15GN<d01$-BHFlIs~Q^ZU3;7OCu5J{9QEW`zg>CG79#ya*kHIP)+ffkM%<yZ?&%G^Fv1oM{o -ColinqJ&5RYc3m|63@5!%_hShRIJ9_?aqAzfv6`{ViG7grNq&6;hy<M_<)bvCN^POMyvd^*MKZ^>ZV^ -5d#W6$dT@{eVQKvC7W>`c?^9>wk;+x~k$Pj6ZTAZRO0q_7hl+Dz{f+<C2a5$j-9FE(0~$wyneLRr>3$ -2LETe{JsIfU%UHhUjc$4P=tmlibQFG#z+{aVHBqs@E1bB1VIuM^W~O#fQ})^i;)33LoYtivWo95Tk&N -PQGfvjuRZnR4UB%h=McOsMqmJSBR6!ov|eH*{wx3gwKf4omn;h=S#mHiblDgvh8LrY{9TA-p>Y1ftw2 -?RSYkJ@zwCNIN6TV`AlSt5Vz4F1l03n@q9n{~Un1Xsg?r$|kRy=Sy2WUzMq$gjmz|RkFq%JxNa`g8vw -nOqGF`+y#5CYF_dIYb$C8i>8+u<^#{$<tU(hs7W!n#4B-%x3>ZbTq`R}O>m0gvycjk7%%~-Y-Al??0E -kO!tS&g?u<*ihAwK+hw`+N4nxD{Cc`<8mh<sPD9da<-86gWs3R$BSKr_hgBORk{c-|;A@==WGlt^iuc -j#@5GfYvo%?TqlZhW|>z{O=5Z89nrQ`2YHTd;HU82xnW7R|u{6vE-A3#I)NJ&Pyhpg<U7W0lYp{QGP| -~o#G0Q_Gq5ATl8_*<#3}Vw$fg<99!TbRNf`36;4BI7)Q}rA^M&U4By^U7>PEgeY!=`wOCxzlY(CHEq1 -bJeBM60E$!EKIYc&ec{s@7OnIqPP4@xCjDEO!YZ`fw7C%o7Y@WbNc`>4^h}Lw)pU?p>PdjD~!<B`>%> -zOiW;!bKTsGJ!QS-UaJIQJN8`FAjHptPMtLlBN0<wBn)&;(*_pL0)rAgzg$*tfHdd~FzBw6Y4JhZG_! -lm_~mBaoX$Cj5}<Qn5fjiS1hHgwTCugXl?tE@b?@^<8&iGKi49+Tb<6^S+8{k-4a*V&Z6E;4{#sh2-d -7~MW9>ghBM>rhbR*$P%1KBTyo2;KbG7Yh0a#<**VOWZN!4@HA(&e>SsZ|>eQhe5qoQ>SKDaB?hcw|>} -cSDiG>73<Oo4QS@iEesoN=;NFsw?bXhUN;qF5?hWZY4}OypOSaNazvST2SDYBq|eq#An&hT7@RQZz$J -Rb+jnM7G^gEpWm+AVi&PdeLSFE@S*Nj?THWWlaQ5x~vRlI=b8}^7+<H+VwGl);F_l?SjJJ2j_<9*(Bh -V90p#!;cQIbfGm-}!SELyfau{yITEOWi5`;=7d)$kM!&}t<Fmxs!-0ahKfhvAZ(oWaQBCcq4)+w%J6u -WPoZ30A0fRI<MESlnmIt-Nw0IUPC(P?PzluJgtRgh8Py6Oo_N{gApRZ!7$rU<}K$pHlPU5724>v;l0Y -qk6FczFtuOH=BL{-}|wp_4gLdzp}OfXI{}1d|6Te0F0&<%fJs8k-n@Uf5G0eL2R%@R-&)hv;(jJO#u! -9JOh9TKrSK|e<EU*pbCk<ObcZBO}-!ylmHlwmu!IF09!;YL3$s4r6WWOxT4e&HUi}oI2p6-{JP{Qgs; -_d)Z#4=$zp9R*^B;?$AG`Q1@z@qERY5-3l5fTd_es_@0X*#))qYeWHnH~VAxjA#Q^$<sPpV_Hn3f}<f -Vlfr+Gl!`?5VR3CW)}R|WHXWO~k61=y}oje3CO_rw8#lY{_8o)?*ZCEb5oc71*Ke?@i}JTMsUV>$Ygw -g)X|`~fNU{3FaG4(e;o!S^r^uA0ic{L#z;IokCQ&*B04oX}{%%BNjvQ&lXY>EcN6#Z^+%k$MlkmLUc% -F&FiBqgjNwVc1%z)LtrP0>kxHE`7Tv>0sz6(*>yUeEAojR@*D)n>GXUrV7c6syhFiZg)9zCip+<JK)m -(u#XJ%bE+M|-V&q7<2!mCN6oO#$7c~J>EK7hxmn5F>PWB$k|w*zQff!ldmrLDK?3urc0MDPM^9)_U1c -6QJtlZ4hQm0SeKSfv1>3v&%(oiZ=30t(kDZ;UnR7bD5T>r5Deh<a&N$uBe5!VweC3mE)U5Mau-Xj4w- -?#r2QeESyDi~e7*vt?x(K7Hi#r_hQq7^2+80;#SdU~{B{0rBy_;HIpWNDR`crG|$rbi!XU9XBIoE2b@ ->Bewwr(t345&F)F|$p{Jfu&k1!fI)Y7PW_WFrd5h;m1tv834=noMMfLA&KX+7bnqZ@v4pO6jnI;+fp< -!i2>xSfx3suI$hgs!`_wKZk-%)d#xxo@zG;Joo%1rwyt(aj(pzL+eS4Kj=G!@5_W?hx<YQ%~HFc5fl1 -=%y@X;zHh4!Vb0>U;HR46O}}j4m%qI)OzxeRpW!F8yc|DoLty`Sh$bQrt6|U{EL;nFS(UGFv}MV|#4P -1YW@!g4kLr6$E(bdM`H8fDykzft1O6VHc`2aTCm)cfRk7+W)L5L^xmb&1;<1i8Rb4Y!XD1b-KCh?}Yu -S`Zks8s#yFgcFy3L7(FR5llN0Pxk*BC7}`PM`lICEGjL3xa`nwfcS`6qoQBE?4!F4D}}VTOzjevUo&7 --$t{r;#Z;#2-@f#@}xo=k<-iuV+_iPJs~Fyaym3=33{trn^U12C0cc;9_W8s_pSkU1+;hR9-4sbZ*JB -G*dgk7Gf4_eAbqgHQA?!<9(X$BB!><(NcDgHiJr3zzd0hk^SDcC~SH-d0JN#kD$|753BgO>S_WBrsjF -b_j5|}o{ado>pnBAJB<$vYO7PmI7*v##)B0loi;1sM!0wF?t8)C+3!#9Yuk^q_D`w&-|M}D?T=mAzi# -pij{kpnnh(tX<rF{fV?z@#N|Fro73KphT{gBQm*wmfx@7tREed1H-^?q+K6&j4L%#OHMSrtGK7Or0d~ -LZ)z^?`A*uoM(BLMOVxupIBc!sGZJOCq0-!!x2=ZC)yFW^hI;nHugNLMfhCR~y_Vr0><%jP!8CWMzCN -O~a{;FL=`$ty3BOcsT^jG0;%;)Am;JL$s9#=zt&X^_JH7+!z@U~q@*$38aAMbEzA+5q?0zu-O(nWlJA -x$r~%>6U9h?Mf<^{QXa`{nHLBpEJs#-=~y|y~=-2=O{mS{4aL!+J0uieSq`DB5G%K)?VAsyp@HoGH5A -OxAd=@#cRK87H>oj<9Lp74<}Cb9pt_&Nl?$$04X0i`{Ve1DZxKoNpQx8!^e`z$u^)*J^yPR{F0Rj{j; ->hCn_VQeI)JmOwv_&I9{7X^thr7Oyj8{<h=IoP?_O{EwaV&6#Ca_^h~uccJSVXcPk-lPs_5<fZf~1_Q -s0Q@xUR%qd`cR;>J|UpQr#3_g<k!8u&_s*yF?NpKcfB2#rRh<>%c&qPKQVA>~nc*sy@uT0teT9gh1e< -vEVMgB%`Az>h9T?&~{JU~P(>?;|>UR95b<=USFdrA2fn|DwkSZw}80BeVmkrd#Kn3i}k2R?>J0@#vCo -u_zTU(-sz-gKwV=v=XzR9@7!Uk6JaY?$JF9dLkT?rxV}Ub9k)Vy9JGbM3x3JZj1V!rQk*sE_dh3IG6) -%AooMJCc@)!cYdC(qQ3I=et7riafP=4Z-&?cA5OZb><4d2kllj2FM=oS<%ICd(vt;}XO_EWQXOrLA)F -WZ28fHXeFz?JD0)5L+VfIf=H;`#ykYro^7R4DGwQco2=)wq76%A$KJE3{FXV6;1uL%{mgQ7sOMyQYm! -=JuE(|l|*_`Lb@xhJKt_<Yz8dO>dEqfs<TcZYy)A++vS-zIz$WkAlxxoW(BKY?Tg_wo}jy;0|IUol^B -rinSN(0nO!JApWI(P8YbGc#JN6~Y3EjZb{)Vs*i1YLM;S?<_@vw|V%DWD?YK>2#TLD}<?aY%?-ts?*R -9SOI)E97Cu8!h4AI(VH`l8^woTrbPYnO`qM;-1S$V(?Zfsi#2SKfY9Sr0P2{dM(FUKBl)%N$tG~{yA$ -!=?+1Rnb1BcWH}y)qkkJp+;~i@b)qVA|B-c?`reTGNA{z^ul1p&LG8)nU6HweXJ&#vrlx;)W`aJZroT -HgrKwJKCBF!%FTZi&x5>0wr(0b@!PR|#lcRG1B{#*(nX*nKrNEr%d2}1`QQ{0<W`pVS-c{b#@=CkQEO -lJLkzR|`n&$Q7861wxIiVqnXUxY<qu3dNgWhv)eP15h^V-fLeUI+RXVHcy$qsb`E}pfL8VCmFH-eO^J -V`9XfWqz7-I{8=*7uhiJ8OJupGK-b-nTA!uFx@6@SWXMp<D?oH{7~$HyE)dIBqCoh!0OtrK@Dtj@AyK -PwKX&Qp%)JP1l~FNKPJiyW9B$-%iae@EOtHFG`)@<=Q%~<3=qWx&w`p;*r_**e2WRs%*>tQOWz$P5`> -`eDjAG_4AUi9=C+#xBGBCWfo>ps+$qFM%S|A9y;H2boF<3UHp|=y|O%hrE342@%^^V@95hvc_AqMC3h -oU`vg+KvQ#snm;Hj4#0zxsMEr2!TA&0DUz<h18#MTmy8(uT`HQs@Cd={({FP*a2g@cy0lF-pL|+>m(e -UD;fU_aYLbj-IlTg3mZZxr&HPLIw!iahW7NUh$zO5Yr<HVw6Na!o(061p&I)oFiH6t&(h@xI!IfN}N5 -ztbfSeB54_~O^l<R7_Px1a#=eRm_C(~B>^@ZfU}>)Y4$z$5h2_x1cVL;mn4e)?LT@>3n@$9MOnYW_yG -wAYs!=zvx!*vIC;pxH;+i+-u1^?g2r{ub5xdF9Bf4)n|1^taMNSe^GFS-l@h7G@7VE$qE!5b&+i6vO3 -ez{-tm?}p;e2VCydE2$gJD!*o)zkL#`Etit+ZUnSrs>w(J)N+elZEky@{AWsZ`z(3dO)zE{pSImPE>_ -gg$n7ZHF?A<P>ua?3O@B=gfcV_!N?mzH`3%>6**4p4jSSu8wtjS#rF7k1W*dr$(t(c6rvjrzqODh2Yl -!qYjIe-%nkMA^S|T5oBjBl9_4e|;IPvMcm2#yYT)>#@tav6leewC;8E}M&{be_}QzenGd52c4G1L8R< -?b?-agR@*GFEeBgkVxukFh+J7pv3j#6^Omu2WGfuD3Ck1ma35*0Ad$P|+R@#Cs_4PG~V1i?eW7h8O=J -=qKiOU;^neozYdZiruLr$u%am&tN`V4PmUQ>b}k(D;!8`7!@KVnJF+(t~^wtag@ReJVr-W)Uq~}^+O% -)!=!6V=knx`T{PYXow#~RHbbXQuGjmMzYPSVJ!=*Q8)y(C9IDEb(p=1~MkCv3x<*qy5<G?wu^UWBVNG -~~%cI8>TF=L;K-H~exQ~)Lo$JO~(e>nPuaDE#nF`O0iR(?BK}+YBX-xVs)HL2-;oyFA32O`0Q)p0EPm -iflIv3N#X?yUoxr`ufkCt33YEl_!I-M>OpmX!%pa@K#|G&h&S(BUC)-C$Zuc&w8UePx@;yloaP9TXM- -st;A5(2@mzaZOLwkut(+TZ!&?ucEHCKu9@Qd(m+V~*j*^m&ZH%z4Vd;*jJjN^!aBC<I*>{o0hQBD>p* -PZcO5&x=%n=SSjxgq`BNMHS<>$`SB$vxWN-HU24a@nfGQEJT$ug?Ux3mQ9X40x;AyFh<c1SN0=T30Ah -rKUw^-mN+Vd5Wf!?;O7(O-ySf)&nL{s0n`8TX#2uH;W71CBN@Op&;H&WlhbTZ0q9$Xe-ZTU!!~oi#z& -4698qkPPKt4}d67$;(ktlXd2@A{@nn7Nfc#ME2PVakhSpDQx)c{QFfK3DmZdg3Sqgt07yD2k?3}O$?r -R{(amt`O)def1?Q;uc$3v&wFQ_(fzO7%;*zu6MJYqEN;NX;xN}se&#iB!%U>Yo6T@^d{KDmT<X%Zz|1 -zh){R-xj;VLVMoKU>$1#ioaPW9`Qlmk>S`JR0aqLG6Jzi&zB}-gF2#utR%nASnb`2pnwvcC7+K#4K`d -F3|QiRqz=s7%VcLPSNM9Nc&X^Jq`ch5`lKWN#TL6cUSJ$7${DUGNO45*L<9~n({?E69nuKk<SIn#d$E -<gf%2*yWm7`yLcr?uIui#x}OTCzg`T$vgH816tL@r6&Myunw1lOuZ><>(C`UC(8+K8Di4c!#fS^^gmC -u2;=)Zz0??CP9%v&5<M_kiO*PDdmg2X#ml4Ue$x>obrnb7t>?;Y{32h2$ontI&Iq!(%GuZj&2?~I|5N -y#UmZBK@OP!-)U!q<Rq@9*c3L?wcAOxO%ddUew93ho!P?5D)ap(>K?ceDIz{0a7#fz#my>iz1Gdv^A@ -or#)b(1U^QHR74n}hriPA%ndCx&s@;fj;c<4KR;c?|(7J-<jAG%EOd;}(xqicYW#<`^U{C!Ft`7DLbf -J}g83i?Hk$_xv&}Lw_8iC8<vtyKjaq`i{V8Z0B0+Lq+sXw8-A_%h;P_OJsW|D*jxe3(ofOSQvXpMAY7 -Iqu*n%TUZtDq>{b*6}`=_(DzX67WI+%-khWGUx`jq@4j2S^KG}l3x9`<;rkKOXur7gOUV77IJx)ZwjH -A6fADaxykW^sBO$-&ghlVFAiPIrd$SMTe}&?|3(LgL;y6}z{|w7w|NoD$Z2c)Ldxv8Bk71d`AUbdSuZ -LyYzX;2C4R9dYb(FPj^^0YtBuK_-c3m4ah%WuH&mm-ngW9t$^*tA^D#V$qc%Nj%2=zSYi=G9rVj!&|N -wEHgUhq0x)3LZwN;4E7I+6%l9acJ)sZ%eeAQLLVib^fNG{}KGx~Xm70SU(m=Ui5*<@5t{yzs>Jse@EB -f#-{$7RwDTJRCN~MeA0V?jJ~loTF-~F5{idpI!n`%@zb$`cziY8DjPGfuvQQH?-lQ6_djVPWpU3ag;O -+ygnwl!}v3o+`Ut8(OekK6EL|2e{4cUt&*b7koI1a%<?jthEGm)9!;#y%bi?B9QtJMq(G|=qd9jaLXH -dbNKO{e1~WmnV;GWWecS@OPE$8zcudE;n1=jAj0l|W4pmBO^Dy9LrP$g;9*&vv6lE(bQXm?$;3#5&hP -2%oGnJY$EXOz(wpTFVsZ#nalYKS{m*bdCULDhI8h5}ms<S9nO{y5MaN#VFYubcXR^lyqR~~D52H`xUw -%Ay)mP;g&Lu@}Zhf0qpnbPoQf^fp{tZzxlkATYvo~B#|v7ho7xdh>$+NMoFcl&mHsamOBW`%U~GA2Tq -KiY+>dBu64ZfJZj>N6hzF)=>!Q`K{bY4ysYi5a*;`TD5MP%7`|67#sriMcnc3-@+9g_qeml<O9K!ms< -Gp&0-xPx5#&YKsnu%+A4^SZgr(6yvyApFBl&rgK6jnj!wI2C~gQ(-#Qux*hOI;f}?=l#Oy$mI6(d-0l -Aso7a17PGBP3XPE8#65DegXd>`YI-F&03;0B_7x}A;<Fe$ef%&e8LE&eGEpdx{IvoN+&w#hD>aS~Z$6 -rKU%TFct?b)so@)~@!&QHrHk}yYh@m(F-Ta5BihxT1WuJZ&E4x3NkS4MNemEB*J*7WX+71@_Q<O$JdA -YPf%S4Q%OipdYPx1BAzg<{v0B*~KQw84ix{fRBx(`w=uqrXI+jZPC?=I<8wc3T_kU&c@Waiil0S%L4@ -03Rl{CbMp5-SPFSYFI8X7J=j^VI}5^GSNuj+!hT2$Y(qt4?P<19FHXYbqhF23gNml4CnTemhHip<?`N -51iRqDT!)qTs-?a|u&Ys;X$vH9kHIAPD5mx4`DcoKL`H%<E|GbiOmuh*bLuY7v(OQUT)vR|v4^9e*p7 -h7JmvZ+0l<@j%!e5hh+ac$Wl#}vy_}znLQn8eU-b?i9QQgoyramk?dw97AoEK5#pZ3ZS;*~F&JHgbD~ -z*pSb`=%@R>Fm!ZCRPR_wq=E)iIo^L&;3FtF778W*C4pYKRZ-+C`hbYR3W?%rw4qW2X8Rya{Kke_q*v -dH-~n4KHBTzDsf)VmE--PiV%K!<2J<F`CvTH*!pJ}b;2X~}DnJu!z;arsF|L{n~WGZs-@w7|)&drF7= -o|uQ_Oq)?1bu1TEmxmVMBv4aQy|{IFiP^hVDkFIteJhTx*I2j{HDwksc{h^cK?gYp5xnpCz1SLU*-M$ -BDZ~R<CGVLZ+}W?XOLWXiOIHnU#$lCxhSLEGuLns@4iB<IL@YFO_nI4N%=NLHlou?5D!^S}=&GCo|5f -WT4G)v3NYj~xRPuDsBAgXTk1-x@AwR~<dI)_zV*YcqZ|dn`l&^Hd1*OTG<6Nz9-!(9H+R{5qe_>>3Mf -Y2P7t+r9=(p^oyMpOl*GPUu4eCm+mZ`OwrvjMi6dI`nBB(s!HSxwA8HBO_hh@g||1kybtbMUx`{s%A_ -9odo!#juh*?nvO?y)Gxz~6_q|K081qTIh(_){nObH$jq2g(-W65$>nZee7E?-Z@<El{44`;`CA?@D&P -SL|~Kag=zwo<)1mo6-C57@h9L!`=GyP3=Od|3KNU{D!~TWcxT-ycZ~cS%pmBdNq5eIN5p5+ilQ$E^XJ -G#rAS0^q$ubvAuO2qkAL_zpI;D#Ea59{hE6Bs>!$4+7`oO;oe-{B5z`EZ2y)H?e46xTK$tX_NinXd;R -H9Rc&6_XL$W@hw8<K9NvPU-1*MbLo?%9`KGh}!mYs7;dg)6WOtI-2qZ549Rls}W$;()n}UospDk_H`0 -MTpf`4H(|9A~>tIxOgPj?3VYHPpR+0TS!;BOeq>*IhQAOv}luYht0TZ_C<JweYya2YkSzt7atPyn4Bp -6Zhyh-iocP7T|ZdYsE(u&-{QjH@Gw!|OE+v^1beCaz*7CY@Q4SR65dLevVttD!SNPmR9}PRma|!KsCb -3RoI0Ufs59>5;cBp%GiwbPHN3^!sa6;4pPSl9`VY4QLOrMtqW!=~Ta6F21teh)WDcpL}9eAhKBkz9&S -=behHDw7Hm%K3x-_Bo=OPJLtgGLFESo-5fi-OLU)NHA5p5Og{sa>G&++m7wmDc{`}h6N*UbF)++y$kO -(sIo&u(0bX}$T&T0->%xUn#~IWQC(9!r@N~N)5qxkiYD0J%xFrFiaK-wKuzXn=dasQEe-_8gJcimJ)R -&`+cvZXPlY@h_M$VGS|1}W#)}94^(o_3ovnv$1;dYv83x@H>?7~M<&joN2fx1C+DA8|+=?S(7a(K<o= -x*pJT{sl!4WDT*gvmyeMc5}Ay7^QErXm4LA#yo$LUsr2ipDyX*6&m0SQHqxTz|b<jrr2ipq<I7p2g>* -B-K!m>ubBrkF^Kav<pq`>MUS~1MCc%w$Q4mC3+s!4LZ@2uIqXYe^MSe1)f{Qf7$Km=lE-|)Z2*)m88} -g;iY$%P_Y5U;7^owUy$q`nNCO!6VY8QkH_SqSo}&tSN|#xML^tH6@+~^Mu>-%#bs}UqvZ7?V3=8>X~& -crduv%7&JLXIWAu8+@e8^>Ve7D-Pt{Cs80Swb5j_`=DUT<Vp4$1u{2Q{e*>~wZ{9@UOd=Y^8a_Of+%H -OT~fR*po{DFK1C&;H=tq^^Swcz`KkECyvuWTP}!KnQ_#?t>lZ-340pTu_k^R5<3?u8Q~*@ZtLa&K4B( -5^kUfef1N4Xh25c7;;-?R16hW7PWqb-3ZyuVhH+eb#4N3ZZ*hCVuOjZ#P44jWjCRp9aNuU?KNi?S+=z -IUL?uOVHcY14VbfGKBA4x$WK!MqqsJh3(Af-#TmY@>}!dgOS8apR$k{{HH@(G%eu*><8=DQ(Lrm@_?r -l-xV@=;l)}Jf;Vw1<X7ZX#HhA>CkgWc_5tU&rDat^U&+F+pRR5A@nhk}sOuO1{>Hz{C%wfsTk_R9i~n -8Pu%!goZ#(+tDXEoTC1C!sBe%kMX5}W!#OTc<5x~Mn4?;;#9>|<5o5WnO2Lhr!Ft3+hiPU1y4jZahi` -4{}S8l@f@QS4jR32dNi5g;fho^#pw}aKdl(<Az;&mf{_g3YA?x@BVbS|rI@ScLc!N9@6ktx*1HaTCdQ -tLCLs3_-3Dg%tTc)~p<@JR{e13<0TvHCsTPL!)w9hpe6-PTVo*@_d^taiPK#TSMx!E5D6t9+lztCVwY -JR0_j2o*4$?__sX9ViO%*ct|or!M39$i1)%zTjm)kbR6v#}^3~Uhc4jCytPj6Wgbv;;UQn1gOqmqB7; -@?y{n6)sM>Mme|If6`4GCQmM<%V6QOM#qVn@=?jF?zEXO%w+21%3zbac8_$=^ud;dLZmw)uUN!%v-vW -Fln)gMLk`32B!;hWpIM5?Of~o6Ee<l^ZLur46Ds!UOvH{lH!+nO2DdWA<U1u(%Fy9X{KZV$0cx!;r^m -7$o-HkrU#=$+lj1$#wCwelGI!`Fz0YG^{jw3Fq5+5>F_4;b<nkHB^V~n+0o9T$XmN9})i*(0Q?82)85 -p(I#T}Y*4*@*{^`W?fex~>x@38$err}Q0Pjxd{NzHq-5vcz(+FNGJSN2Xg4@$T?w3(!ap9Zo_j0a!JW -u3Ng+=xbmEuap$Fh>0K}FE(GoxT<F&e|CluvYv~QdQxHc9v-(hwoa?C3swXO?zVqtZmq-lkVebVoEQh -Ox}7<qU!rlMti{a`>m)VJFyD1r`^U$>XN2wWp&0o~p6ZunA8EtKkcr&I-*m2D_if4J>x%z3?%SUL<bU -^>zCqBB&%*rGVFMyzh@v5if=~j7afl{pgr*=E!4MQBw?8wC(fH@iQt*ECV_$SQ!W{|rX;5g-FX&{4uH ->Du?8egJe-ij}vFtaZQN(|~49)Bm*S7@s21{QYqETqis4{fVgYY*wH+`$8{nA@HPWPNEdBfe##HIIb? -84jGSM*DEqwD>F&@b+i$c|)GydxI!wtbADH&Nrw2Z54(^ptuVUTuIG{@#Z}+fU`!2TEOS#dwfxb%TSK -4hPwk_+Wnj6uCGS$ba&1+BL=g)C_xANAE3;jm7P8j3vGCQRhvtI<*_FSV9eG+=r1z<Q|nG@|fI4oGS6 -YI1Ji5^}lVZz|-F98kz~s>Nf~n3?H!fNB*k1`4-*$d&|Oa+8-}%!^oXG3+Oxpz4NKnp5GUFd(~F~-?B -mWpS(Qa?_S?Od3nI!y}p0)@__GO-@lk5^%a(&kC90LD3xl1nIdOq94In4-?;fH8*pssRN;A8m0a*NyB -q3Agrh`|Ia@?!3r|6S8h6j<E`S;!qDZ$f9~5I!Fui*=nukQIt<+|iroFPBxsU$3LCV7@M*h_IKH{sEq -shvMxa1Y!U)v`UPcjQRhSb@@>u~BM>q!yX0SXrg%Fc@H8_StOj>0N}xp`~thk%ASQA24bW57+2w2N{z -vUHM%enE@Jq-yIFT&(m2qCHrYYZue8>JYEGeRX%5p#)C8J(yP<1Q#O&6jRl8ZdvFyPlOh=$^x^Ihj|& -Ea#bV_!AI~7J9pc6BPFlJ*xgERG<>Z%Xp)lYP6=G5`|>hT>yQ}Dx1=l&cJGaO7UmBoE2qD%9LxAA%dk -8n2p@n8d_i3CmnI%RREo9W(pQk^V^^iq@DgXt2T(Z+OhkU9@$Za3k>=~p+MQK`8G0@i75B&am{i(7k? -i^{;Rn*MQ#Y=V@K^K8aE-uxzjd4ak}e9Lk{Ez5p`GBIuNo^N8EF<P&b4gRCxhM~CtNvd9gHcpH89T^s -v{M@#|O2*g4KIT8=M1El*rhNNBD#~K#vx=HEwO5dJduS;8Zx#8He1=&O99)GRyN#{r<>cLS$LN&->*y -0=EETvx*wloU_mas?^<CDP1$gm#LN%;Q`&da~9*17IYSVCrxSKXU;Hik2~M3<P-w3LF=v8CRj{$-HVG -PIoBWZP+u((<J;w`sAl9z;^lcCL5ZEBuxBoEv<?UnqSuSL0434B@G}^SBSVKl_q=gsg;~o=ZQ)I)(bV --EB{-zh{g@MD*y>beZb$9)id`d`^RHLn43dI%u^tNg;^xkv^1fG==*lb6Kh?-O{~xPJ{}B5>_%KP9Kg -4_g9R4)5__+Qp&-(`>G5^;d@k3kdFSq=@Y)QlWd<jJCW2s@ZgJkxGJDA)#lTq~6nI_-D)Voc^rvQ$Sy -LNT-HhxC4-63nk^9@tU?LJ~x0S(`7liNQ@XfGX7@78;oez<4+6~NK=(?xqmioK=2=y!ZUV0%e*3j?5Z -uYzs~Exi2@?={Ztaj|TN=rG>lJ$V~%!1P<+E8R<}S^DnV@1B&u1@L!T^(=o^wyZu8Y$$+lbEq3Y`Oe- -%6Ou_5j3N*XeEWHcP-p(r*+H03->BG2Aw>%->^<`OT__ZfYrHVaZ@JkYv#kEIrJpFU|L`S0)jlqMy*B -&nU-9?PG1J}>kH(fIn(TWkUw0zKEe*$i+GV^nj`}vU(;Ent8{)AJHthYHHRr&dy#C%6;xEp(-||}h># -S=2C9&0s1O^9B6xzZCC(naQk+_q|0ko#zwL*bgt_~{ZUYC+&Fe-${F~G&~eSa<{WIAaOPal}(S~@K6K -YGcYC7U+UgOpGjn5vJEA?-X|=$lGP$5JAN=ZlzuIVp|`0^W4ELW?Ex5DrCdMv6+Pj953{yCAM#kB?i_ -AmyR2a*oCixDPp4I-Sm=R|3LKwoXZTzQdGx2^pEamWZc1&6zQdtwB`2$U-k$Y~ogq{D+-IFcn_!7-zf -g_RZFOAe>$pLo|AZ@jQ4N!-INc2CWZ{6R|93I*n)anUF|Gcdb921Sue7hfk2))dC@%dl2x;B74??WW& -`(@GvaVJnTR^LoI_sa=v*Yu{%7Tt32L<nCPdO1^pxd4_!52VK(AOFP0T44kOZsqg83LsDI2X`1YLpDz -o44^LpUh4ZWMzf%W+p=I_2Qz(4uI{N48j_<R;YU^Hg_8WDUaLh(!d<&_gfp47`AQNklESZp~b1hcY*5 -!Wo{({tHgu6+RdDI>V}fGfVIT_~t_^#wSeNln@U7b&>*11}-z!?58))M!r5Z%O&tAD_12o#6@c6y@YO -d9IE!+6+}xB34XZ088sv8O-BSy(J}dd>$Wlj{9x8T2mNb60kM>{CK=JHw0gcG>qf`QX^SD-!2u$U-~N -`wTnw)vHoJ{q9o8~zC0aJCd@*Tabn?bIf(FUkUY85dbi3Di8o+}4uN(kgBR8c29OB%gY&vcJnG1&2W^ -B#nlpt`G+UT_J;_(=ObU0F<%gS_a--|`L$9w`$-OLD!?|Y$7^$y!OBp|+`sOz2sL$Xed535UsDIuY9K -(B7rcLsPmBvNaH+^2Fk3SLf&)@$m5dOdUupdR=zuxnEDBe&Pd+T>cZ;1xttw*_=GpBFjTljW-N_P4iM -*M09HGC^W!0|ps5J5X$rrD0S#Cw``L&Obu_qr{*OCF`@p8sy>7~%h+!e0^QuwAP>3*T%xbZ-G}`8rAL -S3+VRNe$_}tV^Z4+|rhBr`Wqi`6k$f;f~2$njItWSM)a3*j3A;U7I2zwj}<yP|WXh3{(0$DDFQwSsLJ -DwzSY<8#Ri!4Tivd)$-A3e580r$ZHCariqsiY}=h}zG2${{BYCP!mP~8|1>3@0lkv(Ehk<#2>v3RwC? -5N@2*v!Z~fcOf&X^v-|hka?bf&RF8_54^7>A9<*(^3sy!-@@Whst-H~UHHA>++N#(pK$A><g$cq|g0H -vJ^WVHOK9Ig8Ds0W@9D241jaBURGf>qT&q%@hU6EELkZR#HVkqNZ4Lj3r=b34H8Xp84-6Ff&W1C!uY- -vY%jY+{Kd3Z(+rV&{qgXQR9y?&)J7lQg^Krqt6GUWPUVc=X8EzKm>;O+BI#&nF~4SJ-vor-^NyHXR;; -$fJkY5h#trv#Em7m{bzBU3nP}LqNsswl0>AxnJtbj7*%=a!=l;iD9+$=uCz29bOf*Ke(oT#F#Z|aMcS -sMe0+iGwuukyO^b$dWzy>c1aH|jYb?%5oF3h@wH9vtX^U8I85b15qd_vGr7R`m~_-+iTk+)dGN^0SVt -%;CL?mfHHKe2$KP5RUpcn^A|X++vZ!t_E#+U=1E1bN93O+&&msTUpir@x>RV7K9d&3!Qf2$lIFEp1?J -d3Sqn3U|NHPST_Td$#Rm}XYlA}61&+FqJ9{8v6?62S%_?+aweL5L8xnN}i#dYX};v>v1tDD>+#*ae_P -KVyB6?L3Y;6%#lswL@ma`OctdL&fCmo65sPEk%6?mwBKyMW7zn#We68XN3R+Qoh`h%8PCPVhi_f0nO< -4IMEu5NsYgaP!SFoWp=9$*J@#hI!;-0r#MhV)O|)ZP|K&+K^kmQhqrp4e(lEVhC@PjRhm>r1di8`Sm* -X)Wsr`6YhH6fYVu>6sa~g5edh^ZmR`lZO*9M=WhTUQ}G$@a>HH<uR5c|>4<i9hlagXjT{c_sMtjlH8f -<IcYzMaNngv0)#;Ok!?7y(fP1|t^4+|2x|6D7+Kl5>jj|HGvPZEkXq<1=1CM79jH9w6{!i^G&s)MerT -4B)yT3PL{1JTr`Ay%T)e6fw?EVmq9}yKpAOwX-Xjd|XC~_Asq-h$4vA2XFLP7*VeQx!%LEx?gjqT{RL -omL(J8odNL0g9I(3Zk`5*%Z1>&5g_*v+ur%43&9%=UCTe1kTPy$AfDw>}fGm$SED5$|77ZylyxD&m)Z -kHmXgk=|3=4Z>4uSA^arud{tL5W#l6>wV4JGiui^On0je>fLC?-`-B-J5f%sH%I=>l;8G;zNzZb@1-B -&owx)4sbeVNaNv&dH0OaZ_>3H;dP;w)W5^tS)-kl5RhTsn`zCkP83>K+#<e>G^m~`ZzYW^IX1R-I?KV -%ss#V&m!S5vZ=W8=?`8mry#;*+>pI;9&O@WeW7mbcuxQV*IS{VYrOj`e;AqT)Hee*o8THm>SddSW$+^ -QSyib7u4q_QqJ6d~nBr-;zYEFne)_Q6ULl{(l>pDE7(<n$6MJT0q-XLh=YHonYpO^XL{79|_+&cnf0W -iLPvM2o(<vu!~UDhM?S-ip9<;2V%%6PN1mI6Lxa%qjYKO4z5RVvme_&G>wXFR+FB;tdgXj2;Usx@{+C -f34%j6knsd0825SQ(tmNk1aVycv>}eh7EDLg@>lSAL3O`M&)TK4sjxzsnalvwkq+ZWy5H3%=iF~hp}5 -Ub$rAKGb&k}>~r&JbAt)1NQLZNj2@|F7eb3L=vG!_EX;`+Z~3zVkHIZOfXX$%(PVF(^<>AMW*BihW&I -FaMGrhWmx0wJ*L%SNJol4=4`LPydJ@8RQFyUwO)sE%V3(HQA3ZuG(`erk`_!Z~(Tum-q^irKR%dLaon -AKs0=>i}b%2j8Es|Gsi?9wy4sgVqPcg{YfQ{)rJ16W;X*k7^&sxxsnn>)XHwnC#R(#~H7rfhoF6;!wh -d5ZCxGAZCZ^9!>ltRX#PuuifKF+0w^yro1G?k@3KGKlB5U6np{8Qnhdbp(IIJ*&fdK$NDF9AZXdREC@ -sSBk`PlY|xI&*%ex|a+s&ZsjBtG>q&XKh3OVem-DXr7i#Jk1%TXRFWwuLlLmjr5nxx#Lj@S-(9u-p!u -_fojb276Tdhs5R7V_r<p&d$@<CU#9|ruf|#0dOm2X%hhL6G{<Tsv{t>`Iomm}8$f?C-uhF0ny*DxjBo -7B2*6jV3y#^M$L(A=Zf`oz6#af!NNnzO>K1S^dx(iovs_#bjhQ15y`(dLA~ox#0=8@adcsfO7<1~|CB -{=thcCr;yto(l`M|U_RShCx;{dRpjX6eL&UHq4Yb!NXS*`7{hrEzZSjhE68$E>GuZXf_BTH#$Re;V~Q -B|s3ynM-k+d7#C)b$p^s)D&X;4$NlcFtyLhjSAZ;qEX@XkOejwUdcfyrF?hFqlRcmqcwt6$pgw%UhIE -&6wG>QBjMUKm$4=dU`l8l8+dc8olc9=%sS~V9Cl<Lf?T>+wuC#H987_a=EaFVz^IOMbBXr)(D&C_AQW -=mmCx=%t(#RllkKWJ*k@mN4^AV1>tQ+n|7PVoCFG+aSjE61lHkb(gQepJ*<Y>GaZUtzFnZqOwOnD1|| -HuMd;U+e=)|yYApP;&kza1fN(n%hIwIDrg-{Ms@$+krLbh{U9(PF7;r_hEux&~$V^V5h@aGE<~ZJpKq -;z&?b8BuJXmTEMSb~#uNka+>#gZ@y&s+|jY4;@aaFd&_2g80u3q|_pS9@8hVb-$2$u$PJ>Z!P4tuX_a -?Hdti*JXGOg8D!zh6#Sp*vY?Qo7?z?OA_3FX(A7W$*M{YO8u-m=kp?@OWJ3*3{2lrpUb^YbdK;xq!9n -t40~1=Pa(5kI+byLS{YY2Y3(2Yr-&Rf`pBG%%{Lf<M}PGnNa50fpwJm`ZFGy=9-xL5aZ_s%w`VS!nHW -YuFMnbD%m>R1zQ*3h1Z@;0}Q_Z$S&7^E-}rQdAWy0yT0@Do+f|D{Kp{P`On{e#|22XYw>pN6T-p&_`$ -w~VSn>LKTr!u7{^GMq)`k;Ae<s80)YvVq%nF6%}5wSaESU;g_9!x6TeArWVDAkP`Z<%w~%PpzM}S!ij -MZ`Mfg^pCO?;#-i4yky<V~X7fSX)#N<88_ocwHMQL!l*ISZouYl~2MDLLjmTZyUFT%2&HuokJY&Ssg9 --L9xn}hcjua4qfQj<>hNDF?8M(@Rr@J)5Y_a~<4ea$XDo$bXPoY<G4$zIvnLQnkneCoHV!|<W%aOKZg -jvJY8OvD9uc}hGm^Z9dS&gL_DX-8u}DkPdAHeG1%Vb~YjjqkW|C*j4Sz}t3uU*x_Qy@zl#^SX=Ud?nD -0Lg*&LyTrh;>@N8ew@$rfhr;*shhNJhyHl|6MS1g^TgWQ>c&%ca&n!Iu)waLiHSphT``fN}9>8CyTfZ -OzjC|ppapBB(CsCrvBnLgg96~Y%l<icyP1cz<8C*RUIe#e`<W@V4r4*Nw`%-07-BO;6%NPEL-Y&Jes5 -shK9xn>&<X?c6myzVLrl_^_{gb|di?rCSlywX5Nuc^dGRzNj*>vFp?y@;N37Oto5gwuk`@!cRFdGwJ@ -s|MMDF0CAmj{vZ@I!wZ8e8ar?{3juT%y4UAH>p}q5EMT7i7S5NG7g&9AJRs$9W$gn&^6$O>cg+y#A1% -tpxE(*x!3AFQoBoq)BTHOP@x>pm)x3J;L|iq2(KP02q6V>dOLOPEv>;WA7zlF@NWv`WCnk5?LA$xeW& -neTDg<F{0~%5M5#}GEqt{dx!%3X&Uyajn{8|KmnFDjs&4jv~oJ-l`z`=vl|vMp%7H&*S~mH|79)k-Qr -)ex%-@;Q1CQTXMKs$p>9qGG;Skbdm0>&xazY2rv*;B)VZItRl{ucRO=1G#zMWtiMmGTP;+#Z7!HkFZ- -9gQ>e{<77G3UJ8Ia92)tp02Dd&8$kX4mC)H_fmHl%_CHVuhoIZ7QnGupkgWJP^GTGA`Q%%biT8MlD$! -dZD05z~2Q%+-x<E7Z*Kf@IX`6=9JGwnk52!q}WgZamyHX@tuy(zym?@|d#A3y_e9rsuJnt;rU0jAJ?p -rqOadyu`v(Pv?dt`Cu7(ApseDp4Z?`S-fF9DU{0m7n1^D4@HU#KPtjS{j2zbZd+7lu&*ve%lXjpts|o -99LsA-w)RQwz<fBKh|^5{8+pqQsQSu)`=5j7fAc_p0nQ&E<VQXpjcuSw<1|I%2!uf>iP1Prp$JW&8+2 -kghGN8Lph?nu{XL}j?m6_99zw&tH^0H&mj7ef-j&DRJh}~ukk4xwI}TF&Xwh~n@zxyrB0Chl(K8`-J~ -;+`ZAKv3PN$>a>PqOZ=y>}xQacG?SE<JKXD6whc83t}#y$QvXGq_Y0NBngPpEyX+qQ|f;{)=x`$F)&q -p+<(--g=TW5(nT!36wU(7eAv^P`1u<@hOg29`7KVv)Fa#SJ9M{M?hF_}>CeW|ltCC;1+IK4@v*N)o`; -`fgbNn^g7p8cN??(?sDj=WTmuOMP|TetrLJdr$Q{F_woVNN;vwy|3}#Yw!w)5a=cIO!{G43K>IyH1BG -OEF_NzQFh1DkD>m5r9z2SQz3X;;-Okr52rU<RWBTxUYAg9$l`Qvng<JTCa*EUxw9$`wGRpZ5^Ki6(Xu -j6NihcuBMZv<z@nTyWUDp4jOWP>9`W&k`rWaoNuVnTCrb&`R5ckH!zs;YoNb+h*+ALEX4s7+pQ@ff89 -HFC(;m0{CEjKICx~Q-<1hjk${msyw<l{zk?f}w>ua|L7In|)@3@4O$&FU}6%=aOmnYjJuS9VIi(5Ttn -YDLuVfv9YL~gFB(T#J7x9IuE-p=7;0@p~h12&V~rA@W_VIilx#X%?gMkcH__8NRXU_hR@WaZ?C(U^ME -EX!E$U#yOzk0M$uW;nA%HJTNijviRm+IdpuA6%l&z^BGdpHta?kgR5C{Hi;V0a&N8rPNC)z9zmQWg2q -qS(?B08`yk4_RPoP&({9BfUiAcofu@{C9B{F3!OllkBgPva|=$rTJD#te-IvbU<3T|nRwD+vRDbOPEQ -eu)6VKzZUe^1t74TaR(p}#;H=diU*2Xao`&;qKrRl>Bsl;P=R@Z_6e@Ag7<_@M_Cj2UEE>fvmun*za& -flG<PFOP)EvNVm3((&mXSedRAuD|T)M`t%h2CKKKaIH6Qu{Z&qnF}oS#>hco^(n0O~@_wn6n?BQ`}5H -WQ(zXC*jL^8kEP@ZqaDru_Uk_w0QDpVQH>21M@Ir&T<#;rJ*gx_)|b<E%U*E@p)#>wrQDHAdGO;I=;# -$ssgH(#Hwr@LP7dw~S!k<5GSNIpkrGdeNc*4qPWnu>S%mr7|zRBz9pJr+)~}{{_taA3o+^;PaP{_dSx -LIF4cv1d#*=Lt7$B!!(ItBnpuzhLRM#{fhdO*PdW+bBA<Sfx+W_6n2L{^i593cTK(+-w}1g$1N+RKA+ -~r->vWT&8|by9eQzkN3t;4sdf8I@0&5VJ?fT2!W-DaJESG?26ew`3SjR7KE6xO#OTgh-%@0Z*i%yS?N -zy@%iE)*Z@xVCRxCuLJsb$%>eb16PAeqdL_cyL(jwCR={E$2sa=BScR>2u3*a~814x<MD^}Y6bXA_)k -=-r#+HaE2^`RgCTR{4l)o&Uzi}F3R$=lDpEF9Mub(Y;|VrR7-o$@=F`qEKA-XO|<?*XB`e!4bC{7))o -Z>w*Mu|BN6h3_%3dHU;jst_;jy1^<6oZ9!IYG3q~&wkgq4_S!vhxcIr`6C<sqRRmoj{gxD{5%}?x3gh -dq~YGB1wh&)aT6M~Ta@9xa9CofF{9w6J}yqf8(qI8c8?=H3^n(9ozkVEIe$<a*0t^ys#q>?(MRa48tN -)QO+F>+;ArOgOs-qH`Kmp<8gI|mqt114DK35^f}rL-khL_iIchjX(0~_Luue9e+`e|QPU`iD*5kaUr> -e*7<A`d;Q-4r#Z3MUOE<()l*b5`sTLdhq?FJcuT;q-Jr|i|?+SFMTv}ja^wx4(d#rE<7TMY`?BCJE{a -^2n#%Ttdp2p%XW8Pnh_pg^&*E_=3(k=u^V>4=~GvSf-Qr660{aY``i(W^JUymPI^O-PV5zQy*Yofa?@ -+RP&dgvX10BG}2cO3b7lUx&l=YKy);v2ge+`yBX`etr_b8L4^jL`zI!`byEu%#*GHZsNbUw%(nsfxlh -+%i%I67W2?U^)v>$b&-SImz_n5WIMyuHoZ-+d`W8N>QJIeq4z*=-LszE(u3f_-PmZF{lx0D;7>BK0;x -tu7_8%Q5;bygWs$~}+R~`$erQ*nh;<6-_0w@^my6tWd8wi-kHL<lxk5m~)e$I6`m9~TTr>P?IcH^H`0 -GMap-3<^s10ekiYK2bmD6<=y`zf0F16a~g5%+oIdwAv_-jcUs&T+M|IR&3FTA2dbv`k|F~t_iH*3dRO -tJGPuIJpD7GREfAqSI)xge=UE(Ipx;c+GiEiar8wOUdr$@DJSO^%vg7-p(Ff$2eJ;}*H-q>$beGwFIh -TNzoQ9X%ZY@LWFyLPrUfR{t@|eq)4P?qwU^moEsoL)y?hA3vez@78{J9eus@$6s&wu^PMm4?-Xc!f<* -6Mr=3v!w8DpUH`W9lEi5ode=VxT8^dm$tdc}02Z~|450DeAJ53WnhK$N;WJF%Hc80tT>Poq-<NJUwzt -AbWXIAigQSu7oHPCQGNN|NBpBKg!Wen$Um!bfM$s<-aUU(C_nqvf2-%yQ7VeU5yF3QD6WyTn?en+Kp6 -yB&aJ1)_+k$PM+1vAP`xQ>@)!c0v8SXeueMkZS)_<9=_bz$&(Iqz+*`>|H#Ydj{Ko6F;9fXa+X`d>*0 -hgaAg&X-Le06i(5rzBG5uYQ;S%1<}dsAJ3H<#wfE};t-aaVs-R?k*F>nnq5Ry^z0*UIXbYlv2D$%JL& -ZpF|)L$YXBg7NjN+96qfBdNqb5>NY4SFZj-Cj)jqnJp<p<Q|uuf%~r@Nq=2|W@Jo|_e@SIh_O-TgL`< -cWNj=kjAH3JWVxxskJl7Ky63C&%GK6`fvGs>Oal)~18@qJqe13Q>(8fe5{e+h_vmz6nLFy}4@cIQOGz -Dj)UGs7c%BSjK)@3u7}&x0l<RT=>X?aI?-@8bGLfT78E{smc0=lN-6^t_KDJ%B0ts3p9Zt14-kItsGU -Nm`muIAN2_WQxRV54KPpNaWP1)>@XaDG?$f5<Q<4ZhGR~)>|*c}It*<x#O!JZ{cz<lt8F5v@^NcVIm6 -W(>7v!VuLEl)!H91;yL(S^p-6a;O`c!0~JF6P+vncJ<Tn-Ogf4%jp{1V~~s%$FmFLFwbb<#Ev19~MLv -&#|TTQ4kflog%nF6O#+-S8v7y;Qy3i{~__iP;Er1$60086phaH(zRH1pL$KMXJPvj`*I*NeuM$n?eF; -^Cd<d)CZ%@L$9z(mThEoE@{?e`|L2G63B2XJAl<Y$x_Z;ZR{80p%H!8q#&wPc$_Cq=P}(>Ej83~6qQW -#Ru=RQ3FSIBd=eqXNLw7tu`H1%vbHT@seqK>MgZwc(#YeQmuZDbc3kq1WBS#^x!^;~e$r0t}C~w(olA -tAQSfgeIVppG@7YoN9N*hLb6HI4uOb%1Ep6$D40LNIk94Ux@;&XG1Ze`MU6gvq%r06HUTey+%Ai6n#q -|LRRzkz<##Zqs(NLfcksWHG3J(a8_n3Bb&<LSyPYQ9ACIW(4eo|;G;AeoEV>2}pig1zc9OPKEA0L$8Z -FHqHGfm#`L)Z1PYdD1<txHVbX&^;=6UM^4FLxk(@B3i*!UN9LSu%l(iK5Rt8BMA{fcS)cj!Lqs=_CL= -UP3t3#^U$xE+_-zvmU$PB&wKhsjOh=q|9^i@4FBD&ANk)8xBcMn10ys|ZW$kmqbN;p|3UFB-`g#J2%L -gYa?AH{{8Pg}cn7cz*tXnjLzE5DaA=1L_|0$L2bR(uSBSSfdyIc>{_{4S{W64vze||A;ZOEfK1JVb=e -LzCLhPa!`y^BN9*K(o1OKYk2)!|EyJ6eghK(V)v%a>U6MCOr&fXdtTlz?UH=~@sO>2?&Q)X|Ss9ja#Z -OIG2<*B}?%I_K-^l!1v+_A0tkZ!sfDmdqQSSjR9(fC$8O$8Hvn(XZius_>t>bLe<BEDT+w*&|;63JP% -bj*%BXWes|Xu)2`m2p1wp849aobO7C@-hGB*|+6n^}3tUYL@&uJKtnD_G`lK=l9Z`FAT6BMup$0m1pd -AN^9HA)Ax)mt+Kz#Hsx1@dTK^IAHSk3Ak4U6!+%o4t|seizp>c+9^bYj37m)^xpK1ZjoPaWvhbQeS80 -nk@0vD5q~7saoG`PI+a<{N8X73-Q#;6ZYuyFx4BS^-UJ&nj(6xd`JX0O(rNY*RM$=j7o^TU$N>8)|xt -*YCK8sp^F0;P3H4QTQvv32>rv~RLiMCG&6C@yNyJvnmtFoUCC*PMIcKgKpr*aa@GBee4%Im#SRhV}w$ -VArZ2zZq@^|lantfEKm)i<?dEH7`o-B!!h<nDmGxs}4#)1rq@@_38u0;7Y|S$mD(VX==hK(fICo6+NZ -wDBv=QwO7nuNToHXg6#zD0z;3^Nb@Or38nmZg-?5Uzd`EJ*JE=ddLG|dcC%<`Zku0hk-WT;)j`Opl>M -`r)|LXiyG$ni>v+j1<#+gAvLpmga&z%Bmx1Cr&{t3FV@KmzrKD$9^ez`sl;-Ljx!tI4DzXpK6<``{A; -C8^W5f*$tD=x1cokyyhYGJSwHiHJ)8wujT5#{vLO%A_+go(mK$f&AmWwELN5xR9*9q9ZjA`a@HaRX+K -GC4cYv8BgXtf^f?o-*t^|?AebJ#(rn%4jMSSfQFxL-H(X%yZKT^Sa(`v*JxD;6quV4iX>TzF{cGjWlg -2BOwj;RYT$xA^+vvC@&xP^Jz4CJ;^x)Cn#hc-cCuZs9kagVHq0}3x5`&-Vr6)Ry0d}Ya*;{t{u5To*y -hdarYB0M8A3&ay>K}+Sj5aBH^2aRs8$nSx3L^*-6%5;~yVSdw-dD`CNhfw8Nq(;6<4hW}P_Vu4jG|lD -Xu|vflV!w~sFn|0%e~7!i$e+Jp#GmDw{^30zQ#_xp{~@75v0aG_#|fB%2zrAc>Qj#Kb|i1-?sgdO%{6 -#WM$l*{hU{6@JJs1v>x|k(E4BoLMn6XwYA-r&=s~?jo6s*16}@YC*q*!W9AkX%lc8^{qTfYDgxou1zw -k;&_5=)y_P$(1?@EPGxPu;=zI|q?oxp;}JI<hQs>}vkyC`<JPx|cRJk)!#2-{I?{~6w=b$4%BeCO=Yz -tzG%K6iv6J`hG>P9q};7uc)8`Ln?96D4Y0{;9cTB}lWz@QyOr7Qx0Z>1#9N-M4CVG~DtQ8)-TqDp@H) --m@{R%t86~>HL$I!ppG6Z-~Qd@E2anPuD8;_;dEeoBWRjO&d*y7}eisBMV1KGrksl-Z@-g0pD-cK<M| -7#MNX*S%{bI{o&-l^d!G_(DHW&jRW2-v|M2Bp!Ll9N6i<?b9b>m)>pC~lz6!pNuem5u-vG?Nx3VJdx{ -2M%f-Hp$bkY#;&h!^ic^H%YI>>?K)-hxt}>`t9I$Jpl25uR$Ac3ur`d@!zEv8YhG?fBR^*0*Kos3rN! -mb$V_?MA_2P095LkXtGu9>Zc%NRv6nABI8gmdYa?~w{1x$vrR#ayxz!)GRjZ&#;WsLK|eH_^FI^<J=z -^!XoPnB~Y$e~oa)TqvEDKKiLGhht|@@gjpSVcDhNLz;5!o^Glw;UxG4pEIZwj7;C^)MO&e_WcIhK%w( -Q>*86iyH3MpNE7x+V{kHElL7t?agZt%|fUyO09q_tU-M_ssfr;*Lmr-9omsp=M|ch!IakWSRy;5d%;O -PmU|>4pz-NdeVXZ!*VALMJ*xABm(^72NlcU;ELhqSA6;=p<}DvW=Tjv}-ZSlzO0LizLKZ-Ktp1U{>m! -A?U1HJR1k%ll4N01S1ETo%#fAo3k}lD#+gi^vGbOtP=)`DIP6WLGN3lK+sm=3Uc~;7TqnP;Qm&`R-8x -g$K{K{Ohw2dZNKEstTxYZyq2N{p^k&t`sQUalf(^X1QsOv#q_%g`FWbU`YZIA<g_t4O{KtEZRrjGo$; --WAJWhIKG(m9{;rG9BZE^k2z!iCZZB2=BH{Czk(BI09bu@r9#YHJ6<$4?LA)oy>d;J!YDj}-O3tKQtK -FL?bkT>q2)q`Np<?s794+as`Zc41O6ND2PlQD^Kg{mFgtXKR6dv5|jO-{z_LVlgC}H+kV*S@$Zu1v*X -@^Z3Cj&+zkacDuj{Rhn3&*DcE2KJ)c6{__1__wWC^*l&J5Vf-dBb14B}xIs}N$)H8n;z{MujydNClUy -C_m_lHdxZ!j;7j8DamXyzV#2ia;=5X-b<Xgsk25kQ>+5GW|*#jtY^x#H59mv8R!_ER;s#4XVIhm`0AL -S{1%I_t+eU3EwRj;M1g&_`{VeK$4rsXu_P(Rn>96d1Re0dy+7DKg!V*GQa)hS_@G9+0F!8u`<aW-<Z; -1lxTI3SvDr0^&ubBPVmz{VG@9lCMMly)=`lTazc5)B!0Zc%!e5~3BK#PgJma`MW+C%8<2c(HGG#^8mL -I+2J)^D+s^7Vsz$qbl?v^F|q8A&0)!Q}$Tq^c4rm(%3|=yoR<vgaApZ^F;xrh?Vbw$2fK+go;K_nyFt -U>~*P@3!ezbN;<mzQHMb6c)YF$A<~ZixxQ~Np-4)8S+;L4hhR$L*!?{hi5p@LoSDyl2%Cj|+x|{Z4h| -hho6hYx-bOWC5J-@VGC=_vx#ib(-ojwgOB`mYAE!)RnbOp^qu<IKFSG_PIEanpU5yNy8|Zwg)rb1Rg4 -Gv>0XQW@lj^aEw71k;ar9g=mYhr12`N(_Veh&PowkFwxWt@=NmTWK-7((2i^kNM$0s-gfhMrsvr~KV= -JSt(?_cD}jH>$j6foV0phd(lG<I}})2*7y^K_r!i2)hzys`*bj3aQ3DfW@J*y2Xp0Tr$1n*mXEUAt5} -L&uEW^|i4eQ~rx^%`BTKz5m;Q?RR(mHDvqoj_-puoP;2hLLnT5VG^flocOfjy&HiL{|VteuP2i|$=-g -*;yu-lp}oRP;%{mdwbPW~&ttYNIS<3VVf#gUIZby$a2)OIrJaVH?$O%r6P)eoeFp74+buSPlfCx*dCV -5QO^C5%ufRvq9=1i{-dB!@_q5u3Kzj?uP;#%sW5l~n4DBJ@UMJ7q)Ua$XQ$X)Q@-*2uv4xLYOu5Bx$? -s#fX|M1SAO0n>^_uJxY?3GF@wt!5cY|2K+sFjUf9#tc|BT7@QDoygMF{4l`QJxTz+OIxq@an*?;@p-E --tg^7K3T44C&3gi~IAn88CjD3;Vab0e%STKHJT2;<o)w<i5piuZt*Uw2o<6j4fHkxAvKO9a2gMlXDym -r;2b^$$33n72_QO!*ocSfa3~fi-z}tcEs*Q&8sh-I7ux}KTAA3H4c><!mxJufiX|gB$k$$;lB4IM$jz -<GP(o4MP4IaYQe*hk_G~GHwJbI(OeGfcIpvFF1JB^tWQ`ClBi;%2SpmR$}S;;BCIk!0$s#74Sx##D=b -+q%iRY>B4j<ZkJV82PuvTo7!4X#T7&KhRdr7KC;{cfeWttW6-xlYSSpG1uY$Iiacb?@8@u3CBDFnmDP -li0vDfH;e>Q2ftp4eNgh!RUgo_C}$07|zAXPNsG%Q?Xg~N+K))E%-+;WHX>wqnecezHaL|9zbMtE^!L -g8r^gtu0KNYvOv)(=2TN&FegZ+T7?Em>(d-s21Q$v;*C9293@tee6}xq!qS)Ee#G>F}t;eEb-QwZP2^ -p!ID2z%Pt?_k9kB!OHFyK^P8T;)thLYxY|xr`#5@;@6hHza*A^t#)>t1CElx$dCZZVjsr2A9Tz$LouZ -CwF1+%enK!mONTM_PvJ03eRs{oNR&<s?HiE!Xu8+Ye43(_0hNAyK3KG1F-n$(HjdLqLsSnnUUHV`N2B -Ybb-u~fl^ItAdbT*KiIpbiM0^bHLPP*~dB9dwjExq-U#zR2rJ6VFYI+?}k2@36*;K_x4qaT~g2rJZpC -<GM7t}}G2JC^`|0He$js&mIslkrb5dDA5y;qZ?=-MrK&#&mqnb3Skc(Wts0uPb^;RSbigq1-8@#_ySS -y?74tE+nNJ#nU^x+`14r}VDJtY<BQ9;7aYlkrlKWmEhVw|%xP^uF=m#BIXg#cdD>-2Rie4Pup}Tx4tq -pW!3Eb4UDg;c|q%pAhC8M6DdPbs#9#4rx%4tR-8Pnc(JezAE43r(Iqkf2Sn1B_da+PoLbi33gPVV2o7 -zU6|hnJh_Xq@VXfl?k&;BtC-CPZrF`q3Ol2`-5F@&Zy_=<FX~BHy}je^Cy@`PD}R^ww^NhY3bQ?6Cx3 -a02vMtJj7vg`Rm!GShVexDCWP)WoV|rl7!^`;3En0L9gOap%jHF>Pxbuh4~f>+Let{8z2&CuL+_F+KR -uDxfjC}6NWEv`!+PjTMzN*rQ!%4H#rUE~F>rQoE}Yt2%MO9>r1adyQLPEe`5I`UUyV{E$Y&agtY-NHG -Mi@fw^LTvu1C3uJ2+HYSAG=;VRYnJ65+I?F3Y%Y-cTPwVx^Xv0Z%RTv?PH@c(t#`jG=@Qug%tN=1eP? -rzavQfAi=QagkqF%AnxpvAaaa)2^)LNTG_^cT&@WQg*m*i@UJh>z;>q8~grv_){Xij(c65CCAX!A*wd -~BY@TDnP%q6dW@5_;mGk4?8Gf(XqS`7qKw9Gl}i?Ky?%XgK^FCUtBFB%KyAr~ZV=<n*lWkDPK1}6WJ* -Rz-lCuhHc-iyEqpi8JW4j=@ulLr%@QWhT%WqZU3D^gHs|D_?VQac77DSV!wr?|a}sm%X%`<}&>(9rTm -;t;e+f)NT{-3)MJ077*ekWK=Ns>{#C*S;QJ(m7dpSAl-?}hg2?f6tsr|Ys5YG7!$o&V0`6_Prhlluq{ -)bWwjiMw$AWI;{kQj#I7=qC-iDM)~Bg>o1-=774ON4~3!PDE27fgeC8wjc}5JIK!mxyqAB_sb8e{Nof -tsDsi0qr9sUYQc~Dtd#i1|ci60Z6B(pe?hUkXg^LM1jn&i1f?bDY5QDf?6PguB?j~1fW0}4*^}FY-MR -Mt7`|g>fPov7@*4-a2?qyz@Eh*G(;G1LFwuQvfR-hxOwEDz0ulVTSD^wg+x!}GL$YEpsy$Tyovqi(`U -hF{6Amg%=dDcZlT`uy&3aSXKo3-dg%KNz9$|0z0TY>?mVPb$q(fDRkqy;UfS#uy3<6ORQyDq*Q{Wa*t -hZ`B#wv@`pkRR>Z2f;00hatd*58HU<gh-;$7PS`lW*32g3ZX`0@}S%s+31mu<Iht{~kl(CdsYdH03oO -mC{HtoTcCcI`yqNz9<z(A&(dI6kl?!Ws7r#QO1`Dt$dB#j!h}Wf_vL@znh@%T6;>J)%p%qZuqz#{r46 -{Q8hwpR=NfF}Um=R4f##ULv`uI#C&kE2qoNbeS&6cDBJ&d#w;~hj&7Wut%vG)yg}a)!WpVR{^2MDH%l -=qB2HKGVaD+3nXbDrxuNi*EA6)rii!&ORe$HcD``dFA0ayI8qOrO-QFhiqup^U_MlHzWWqaSky#f6N} -xkqx^GslJ3`y50i(i-Ppmi!%8xchoRll$Vf%FV2^@z!HA8fLao6Bo6Aca=IA*Nn>+k8O|Ii6-TXqBht -<&(elbMGez6SuU|;`3U~|xyPeYh^=PiHKTPe1m!wn6)okqO14xvvu@X}?>UvoOl){zN9>uN_En>t_Vl -c-~|qVz@&E8PVXMiYTZK0C%cep_2XZB@kHx#Kr!a1U;Y(F&TK+1i~PnwmF-(PbgxL_-$^^9?Wb+-Wnp -f$*4ey^|d1&UI67u8*6$f7SA~*z%ID``UbVJHLgg{j{VayeVMlJ%6_TK1`{|QyX#*_4_CMP|m@tD#A8 -tUR_t|Hu-wW5jTrxj2>&5EJ7ucntmF#Et~|bZSR^_f?PtEmMX|yK4KTTvkh}MZXWz(w!!6k87#`-T(z -`vG`go_X1nyULiXGI`szv<xt*<T6zKb@cOljxSz6o|jhSX~f@wBsNmX>W$-^=8AAXS=#ZfJhi1g||=f -DqTG!EHUkom?@e|zJbEZmRq^Hq{vI6u$#<(2LKmHgj-p)gGT^}~+;^Ow}${)*nfYR=NX9{238zH43|0 -Q3LgWxNCK=a=w3ypjxoGROj>3<_i5UxFl2FtdhHG({mOgToB`DZDNSl|(DuA_g8)Nd}rv@oH2B7=#Gu -TrI#E(V)D7d_LUGAS=OPt*T%ds9?N_=FvDnIh+P<HHKLwbXFe~G65wHD*hM!t9}?TcSXTS+p^t)^2u@ -;YxRU;K&@oKR*VE?7iJxSi&1byX6>0V6xbkM6>FD^U(TB2Yo81UojN)OY(nO@^m=hMHyOXl#_J;Gc`w -1EvT4WgTSI5=xA<4G@mJ?(39lb28;aEjrxXtDuX=I4#s}~G^c?y`7tUFr6<z7}FHVe3;Uz(r*DDeKqJ -|B2eC}oKq6+E=RA+%{WSL@C^Dfu9Hr86^rOID1nGAiiNKbmB%FJU4;=gw2ptVKUy<g^c@cG>g_IH!x* -pHLr!3gQI_#MF!B&YxEnLr;O%0GQ3(8q`JPoD|&@uB?5Gx=Vh9{SB(`n^92R3UY4r)Bj_prwD(cB1HN -f;~N=qjZOSxa@7O#<uKzmXjTp)1!F^U05;Vn`5?}qVMrnn4s(}+abJ_b9X_rcD7rYyK}r5A_%i&eZRX -T<&HJ80%cM;ct+K^zz5H@jC;xvwDM@T4>Cs#{?#GJeu*e^Iaw00B=6fABKJy=_^#d~5=Gr+TWwkW;XP -7}y3ww8Kir7(i?pc=XO!oX!EY};HAZ);l>u0bpGnBBxBG}q(j{2jPlNlclZj4FYBD8UN6rW474DKoze -?lov2`){#^<)yg<{^I7yHHFJ4nA;7^*xJS9H8%i(jJrPS|#k@sZDFFguW&qAQbb6XeK-=w2r!_0xCh9 -JAtB=vR94KTijU^7nJ;9A{BJd^$omnmS}pc&f|Gb$IGBiKMFgne^qCQS;1FSer7e;W>|_pSzIY6VkIe -^)+)a*m*mkXMa?@{Ge19v=`^QtHgb%sM=-UO%L_yBmI)Z&xgib4wN$O3<W#vCNn21t}XEz1so-LXXTX -PCzVj`(<?EM#JcT~S;z5bCcVr^%)>wy+AW(f>X|)3(=qYM#0ipTrzY5(OJ~}<IusL~Gqlf!=y54>B-8 -bfy`~~vmXD`PC~8JN4hW@oTNK(}CpOFcyC~C4H4Q}CKSiC=N?COpy%27}iw_@Jx6wwMGLz-8KO1p*Eh -`d&hnZjt9hBG!h$+N^O^cgkai|sSaPgFxni*|-M0r%&<QMT)xH-R@g~w&$QXOX!!+zG>k)xo>i?oRS2 -eanh0*!0?;f;uo{dIiAOWyw5y!U_pl8FV~-*^9p?_Ur2mi+43F!s0l8?1lW<4@y@|36>ndjRsET;mT_ -01U<`62}peB1jr0Xoi9j5)9bm%L^2Vzz9x!O4~_dpnadMQ+Ff<qKs@cj>$8?v>~XKXNiFbAYbB@<kK( -(&p^%(rVD5=E6Bt^oj1t=C6u56t0qc8YbaiIV3v26^WZqJzsY_z1qhUYbCC8^**XTl21zu$=J4xK{gU -l7>+s?#vA@P8YyXF4z6k#=u~)td=tL`j2M|f|FJ5rz@52-rkRYkYw<>^sv$}K0kcVNfdX+xQck1(T`X -x+xePaLejrh4hauYTS#;yI8ubSWAh%*OBoI-zr;LDc|&3mqGgeMD&vE5B``q5y&j1A6WAH3=UsFLbuZ -ru-h+wn^fbOv3U@R^*s@?8Tr1IjO747B5RA~e?>&G!U<o_y%Lv%gD@&#J^BK|5W7*Uwr1$D|*6&-&k3 -NA7nq4U2z_X+DND;Q9SLhxiX3Ab5VzfARpokf;9r2l(A@;op0J;Q2w{Kfr%r(DU3aAKCq>N1(1{wd*5 -27%-LOhmp3d7q#CAo4t7;yzyLxs_X5xr|Fgy)7gX1B!9hL>it}8&x99e6Ewh&dD}A^4$1Ene2l|Z^@4 -;cgvbf7XH|@-svbSlA>nTCd$zQDxVLJ0<mA>b>qMO)J1vD^2{~+Le<T&oa#DF0ot{c^jAo46!6-JQHW -E9{jrLMf9+|z`&{sOC+aw@zQ-(NWV?HvIC3Kh^tZvKRZt&5diu2}<oj3Ec%FQq4$uc(vL25?}6>DN&m -|4rV?4Xvjfo}Z8p75>5iCta!x^fn#O96!GDEOAwTd9d~qe~sjq`5BHXfCf%&5>Z{hoJ3e1l~frn)&Ak -;gG!ReKqKb)v<`^zoq5Aw~L_neo_3r2fR6ofy3p!hZg?Kg_@L%o)zrCoKuLpK=!)T_$3#ZSq0(>_a+n -?FBhg;ZBCBdNB1fqZX>;6qrp;TexhU>A9q$zy;F4#t9Ca101BYX2We&Cy*bKb;T+3M7r%%u@;{J;m8} -y-Ige#8iWb-%4Qs@v*gqj{7U#d2Q*m};Kc3LT5#_GIVaBf5t{$GJ9KD?Cvti64bRjuhydr0z_Qp^<bq -yK}E!%8P%O_>#%Z4uGE6-gN?Aa0dZWr-#T?lEtiG7?Fd@6v5BC<^GOl-6z1ZD>A`rv(4>-3Ow@giwm> -be*A=G}>LDi(COVTVV3o*EIZC6e=-J>-i_@#;uED(?LC?4FGH6z7{v4DG9TzM(SKket+OgQ(5fHaheB -7Vec1K1{}`lg~j2;kjwW6OT0c4AfL#C{3oWhxfyUlwjofyqplpRQAR&63cHZrnK2pllYwO@TVAhv<{V -Blvv6QZM+#hIjX9WmOGTiHj?I-SzjeXvV{|)^oQgAE~ZgW`TF(G*(bmkFZ(i1vbwZ>|3ZJe^tUyL_(( -tb^WA<h5&yc&2PHg)p(uO_KM<5aDT<<Lj6^A72}W>~Bxw?bG4xX{f&|QV0CVou%N1QCk7T8JEU^faf= -UCLu4De_uRQi>3XDG{Z!HZRP;{|%ZX{jH84L=3AQ%wgP$`H%(p6_C&;Nz|s#vlF5DBu%;H?CgXr+_@w -?Aw(=V8G7OPqjVl;y<0-xUL)O-y{ben45lS6lQ|vLH`DgCbuI`H1vi)Ncifg$F2>T={QGct_qiv4ww$ -5I)}ux7}2R@aJ9u>Sw)(W%0t_dl9EEesayX;SlDPEU5DZg(m3xSrwsqGpP$b>$T+YAEgBVgcCs6&UkZ --B{XMQ`<FKeU0@L~t73nmzWz;ar*|aerxQG(q~o4R`_}RJer`n^-`&Q&uhTW3jb%c=oXgxl>LT;KIX| -J2O7RYTbMfx%`MZh3O*Axl^JIkL426$&g9pYlXkI%wA8Q|#XPgr)(;CzG$>Wc0m0fU|ywsK4O(^s1$; -*O<cw@j9d9V!#F0_>0FoWPHiN_@JExD;ojvF^LXl&N@c?7K<Wi0UG*0P?3dpaJ}Qz3_Oj;ga7_0Z_kl -i5!8v8@jDR4-xvLy@J3-Q67%)3_(bki~cr{a!XL8@6fX8F!oZn1$B~y(n@8Q9|TK$_2X|lukHrxa_e< -l0JU+?c+eR+Zaab?W5b%7H=mwX3Px9oDQ(sc2NUA3eJY;`l-9vr0{bj32k)YcZsh{ITt=N7T+MFr)3V -#<Gtjy%Hwwb%AM#Oo@*=CS>US%tOSt_R7_&k<@b+^tf;Z3^TAF07g{~gM^c4Z?NRC3i`$$?ZR{p&^He -iABr-{Q)Y<g_IR^~v=GDNifOf(6z^K1sp7`Qk=fQ6upf>|M7qLDyu!Fui*!|?^^sTue2!jLPN?*9xN% -KH1SG|$<5#>4q29Y6lg$X9XMX$+5Z0~P&qkGu9oMk`kB-2eZu@l1D2)tHq<I&7f*7Umr(z4{8Iy74dJ -6)cqR7;rSMqTiXznb3kI%N0Vqj(JJblqY~@;E4Y8&9<AnKwc@pC3qaxn0OhKh-TH5cPvU2+ytG9b2p4 -RhiLsujfv$ENXYqacAeAE^N>$x3G4rFc0KB>@-(O*=HBNjyA*}Un&`qhkPTBjF4`&N$^6?Xl5;;d~Dz -fHmLAcKWxoocwppE<{G=DD|H{df-xeV7KEvT@_5Ju;vdZZD!}3B;d@_;;?eOpTB!BJb<!zYC+zZ|g!p -~DmHpFzd8!isfv@?BPTx7f{xc-}!ySLb!f!kMFsw-dJv$Oe!D0wZAOwM<7>X<@IlUy~Bty{z^Qkb;f? -4@$0te6r2L#3i9+&hMAwhP%z$1W~2<Y&GxtPxt?yv|z9JO*V7w7^q1Mn*Pj{}$21GUDnl$Ho-xvp -086i$gfzLK=S}z2WW7x-I9_o_y&x1V$khhAQgpycz=q3$x>|9^<M=Bz%3vNAejOnB|-CkxwQpamn%zG -ERL4D`~9rua|Oe1jrk>)I$w;+J@<{ya7UFsR@cktjrsk54u;?K;}%qtzF?L8ox$o4b$ifruVJlH@ioV --YS5Smf;%;`q?y1FXa7&H2>N(Qe{x0tq-y@uZ7R6QlNXucL|A&iEDA?d8%t|jO@VOUL1*)Ld1jZ)YP2 -0D&4~Y~Fw5?Fa+XTuRnLw_DLLC?d9fk2OI0di_N?eUc{yjFX6_NRm6RdUVl%#4^iG!_=Kbuuvi87_1h -T!HyAxbLnoJ`!)Hal>mDl>NJ01?<ww4JmN_J4ysglw^Q%m)EbKrI(hZM9fo({Xyjk%t<`g)YcYoZ1$Q -g9saXCdzEMsyjTePcPD3MuW0sJH%=_6|uK7R)6GB0+HH&2nOn4Ln7VS&Hm~h~6!+?9JFXT7l#~6II$! -m<|QqrP=NF$McE9s;j$0PTkW@H#FfLZacm#V)4@K4tRN3^35}RI(8Ly5x%*)!Xs3K{U6!7{xe;jJtK1 -3j?3$_fWkPzKIVI=+}iox)|z0xYZVL{e;=WJ#CARJ%PRV#t!wh-6PLby;@*-)L|2v%(wj~JxLo@#FHx -1r6;<Lbe}m#a`!`PSm0Xl;9$A??A{eS%A0VTGTq_W$sia?q@r;_YBgwpV@15i<k{cuFNqQ6UXAkCd%D -C<JrYBrf#IG;nsU}XF?qom;Tp8ihq)k4uTX~GBvn2~$HoMnTd<kW1o^vPOBpokY4B4W|3sNQ$%@9ZYS -zj2fg;WA=1*E)e#dLEYc>PQm+r7&O(aAzX_<7{;xn-Xjg2$FHxc5QYZ3&DI^d}iADH{jSSr^H@!;ABv -5{0bBS1mo+@pSb(sgvC6MmO^sIr)K()uW`}FP%S2Q8FoBq>c<dB~VTugqE9bP8qQzcELl}KeOERxx~v -}C|K%aw<qY>GWYrJs7~7`-jBIuD5;8-mQN@CpKI|Lnjsi}!$y1Gfc@)mZqGxOeiZ2WcMkAXwdZel{!t -MY$A|?cF%qXyoLQif!IyNBCSZE`4~^kCi4)YPV+=$Bdf^L5=IclRwaV=fB&ZMrS%74<YC}LqNW=f4J{ -LD2Nl*b_Fm=JOd=;8w)~fcB<)s7=lmk|=tENG`f*hc_r9hB}`lWDB0_22J62Nu-CPkP3E5bmPdV%z8& -1?|_)U!dZ7y}L)wHC1RRdf%b|CKXfFM2hLhY65&B5SK1l(fm;*02?j5shER7)+-Zm#4pLaQ420R5-%c -adZ5oL;FYJ9$5WO9%p&CPG6xf!Qn|Q93LpRl}&<KO;U;GJAX*zCQWfs=^nPsD-^^?<BE5DvrL%L9oRa -qqp9L_iTwr+eRJB)Z1c5KuGIR`aT(Eh{V@gZr3r7^>d+So9B_txExGA83Y;o)AJA7ZD>2r%x7+18&9< -;z0~~t5+=C8;^&)x65@heCS?pVb(=-)vOr5}=+8Eo_n$?do`z{6{2@Z@LAxoqI3>S{v49m*WEYG0Rc= -w&|mwopP{=SO-r`$QvC51))aK;W*Z9Or_O~lw^?Eog*?U+UTlk-qE)I*&MtUAoJ+&ua7-s8jDaHo1N8 -&gS|<_zI$7vZ+o1u#+hDyOhb`F?bAB@#yXX|%L$q!S(=Ipa7f^6Wm@(utJdQ8l!(BdgsGdlgd@T+5J# -OychORQAw!$_A0uRu-e^xOsA$TsFPU<DM1h0malYYGV%<qbkv-9?fadRvQevoi5M@O$Re;X(NVTsIT& -LEcZtr$2voO;)8MC^-uXBdBWKctK;=#?}X-Rk#`o^%k$MfZ6LwfbV_`4mS=Ie=-0bpFrLesQs_pGF49 -94VKTytA>31Y&X*<*(-k7<L-7WSPC^(^xA)ZB;odUuVzanxEFYr7k4<g!;2Zv7sz*;JE%xg07d0jny} -9_%$BOXZ4-jy>H&Pxgf;PJ*kOg$yvt(J7eX3Zaai*UDj#t{g&(txhmv0n)X8qJzBJ<OC1^S+dxorH3| -EA4;yqvRk8^mOq5Ce98C?_?5?9@;Q(O6==?e6;Y`ypezoR{n{?>r%s?u<ZcHD*|c;vhOjI>j`9G-Oe| -awNy!*(ap(40k4!#1?&;PU7s*g*S~Z*u#SUj)8SuvQe8OJ&#h{@6@1u=ml=*^fh8&d)AUIWKF5o-&MI -OIv?HQ+oKqA7*d_Rf~E~xOzQa*8q)qw-K+bd;*3V{;T^{uGP#TBLdBtZ=h^j^TVm}tQRQ5up6$Uy6}a -v~=7`(67w0_@%^sb*p?3|V4Z$Wi;&>yh*$s&_T~;J=!{bIP;Rc~``(ko5kBe)4Lnl)DI0kl)(K?q^(^ ->4F6(?yHrDO*p2%PiXSh98~H2*=H{Y!iKFS~CZ05$L5foS#v{{Fn>;eQ?e7ypr<{$DxZJFfrX!F~XEg -j|wd23ay;lmT+@%bx}FDS{v|nxqjFr>W(IPs_t=4|)ONB?V4k(1~796G_(!D*_6`3<>51muz$a)L&@6 -Q#e4_1%DH4b(>r88v{x4l9J*vkh=xk^aL=>NgQ~|0{eCXj4dYFuWVxp0M$!Su;j(dahEifiq`8)fanE -qaHoI;9<sX9MXP@85;9P$PCY|`93Ng!7Ng+GfVEu&HdrnN;QjBZ>IBf1xRYN2-lOkxOz#ru5h_xdSG6 -GZ_~+%}^Jf|H4=&YC>%r-gaz-!CiO~sJsbQT~I6R>pYV83Gug1f>zWXcv+FMnnWi3*?b=^rm;P#TAe) -VC6zIn(7z*BSjp)I_m%xlK{wJpq@KVC8PPcQl76+{2@lD}BT{%J}r)K7)9H5rpp6~FP+5<orJt{JFol -lL|}k291|ns}h5sWSY0IPZ#M!=!W3ZHr=z+eR|wbF{-!uRK{@A{O+(Uw6XE%1wQz7G!rkLIyv|yP_eJ -XHL4p0Us|%CyLZ+uH|Vq98Z~J>s;ONN<N+?sku-l=H%$Jf3U~KL2nJz%KF7-{mtP?&%>iV`F@9oQ~Rh -<*|)fplib+tQ@${iSZ=GtxLrH(=AsSf&NgyCbP~iBH}Ni>5Ys~*XV;^S&b_Uc*po;PRvxPsavTEfypI -a4OSa~G$q`&=Xq;j>TiIbO4qXG{aet*~D=7t+Y2|ggd8Mt=``C}9yU$*aHWkhM@c;*We-kzJAvoVs>I -9_J=8xGhFOIK#i2z_SK>O^vANcNYlUOZEwa?5{AnsRgDw6sob+!(gSdSLy5Q>Iu`afpQPz>tGD05FR{ -r&}uzkVOw<@Iz8>WKMAuBG?Gcj0$hfYhyib_0^%a<U(WB}OUz8%ONjlrRz+B6BMYPZ^Rek!EGPD6U*j -hpJ*dlowhy5<03uvz9RN!&N;TCu!!+V;g#w@EFsFT5X{cVUuD3PF&ctPm(=YbR}rnCJg62>r6?RnbYN -@6Pdop`N58_uFh;_*}cE=U4=)r0&Tl#QqcRnllzRz6KRR|ui^q{r&c-K&Xtqj_i%U-+tWNgcGC9Xv)k -L=cs<21o-t*3LgPMD=|;!yD3{%?c#l@@J)SKIe#IsBm}2LZ-lXouSWD<s+>BjjC1&CvWM75`V=6jyk* -6lwOS`n0gjaf|^)|g<LK{J}7qNsah<8>pR6E`_^rH^M*XTuju{^QYKTV}Yp8wC&>3@EZ4=MHE9N-7jS -cITxlwJ^)g6Rc-(FJV5pcsm*Br%G?Xqfqw83rVeR@Elp%$|bmn83iG7)b*U_cyjz6oD%8k~O2h5C>TI -#xo!e0Nh|x0GHV+LAV@mNskG59Ty`(C7RAwC|?o!mpxfzWu!4Ez}f}6k=1~9LDMB~j#9v~M^`g=(Aix -F&El2G4$c<=Gx%urN?Wc2UB}242v1{hO-sHHcBg&^y8Ibr)x|e=G6l|_*H&c{iE|xR&RWz6_Z7S6ied -rX$~b}|+01jL^MTa#Pc!N_b%B2)qXu2DubPAEw~SgcVeJo1-iuKKy1H*!^*eEEdC?K^?}=OG9~2Fs-` -(TyZV~$3J^t<%p^x{NR;<Yt$(LW3$^p7fVVbO3=x26;aSOXY)1>94;6$aFZ9&pt--1hr92@n(-3g9WH -YeQd>mvtqoUuf;J-lnixkxjI++f*$|8#{wyrbtSsH7{rgOc3ZGkj?dM^aT}d>ixhllPkV;@uA#(VfQ` --EI8-PEiMkd$cRx`lGcMl0?Z8oV0WoVpr46^G37Ol<1u7560D@@5o9&epE-j2S$2qC9>40$JzCTW$fi -O;8nh*JXvDv{pKpPP;OT8veGm1zMP+Sybst{I$zp+M#iIN$Qwyeu587+%ub{2D4DYhCtH+W<(3gUxAY -0gLdLpVDpd^@X{*?pMwuXnIi<IBdJuZwV_MrtgFjE04ApkTzkJos_Sx$P>nWLi>*u|{2WE=;%j<S7%H -gjs^j%{6w!hRry7X;56}z;*-G5rZ|GzxX`x^h7b9}$RFAF<D(-cKh2!de<!7R%;Ov400FbG1U7=hCm@ -@ZBTCt$pXK)|?cL;-RNAh3{Nz-U=hm!*+f)x^<NqWl+%eM{DYqM*5#tqr~GO<a#y2X$AIEsOy*Q=9~U -Vi+_fmqWrprR7(B##N05U6UYCZN=9yDiRQP0gZSqq|&QFCYr4(FBDk*m)tN}T`re}96%Ngpa3LwBuMj -sr4|LmX!GByzX&u~;D`3>0&hCVYuZ{j1($?8SM0sy<n6Dhzvt>_?G;gY`#u7i3x}jT7xfO|ss3(dyaT -oIXQDJO2pD>#Jo}B2>MZF7&%RIVgbv&|p6G(%8YFJ5_cdEuetssM-ayNe`E|T!$*J=99lYi5&>fo0{> -gqzF;`jhw-PF(gL0`OPI|@8x?sIc5zk*=BXmasCDe}%Odt*Tt@67p*2>p2I^We+C(SldX3S2zONf@R% -9qvNW?u`cAeya?DjNvU8-=$y+Me!OHYdlJ_Xy?psxSDNc_pY<Yj!d2zB-IC@7tfC<%h;bJ>qBIu9W-C -yX#{)75cuO`hqtzySp>`fDy3UT%(EGDVsUiQwMn??76*bc+Rd5)tBg5DOJ6=$$~uZ@u)WiwtWpZGIg% -c^DVtf;tfG#A@HVxy;sQG?I>f}-f3O6y`yzhb{rcI^JU0UXk;+`xwj8P*pv@eKKG2JBg<-9M;Jb^<rM -Cjk+!B={)~l`fa?T%)`B{hs1uiMaF?Lgd=8c)?p}A5MYrjz-$mCZSXS+Oh6X21PuobtxCb1N`#dK!M? -1>pj(LXL*W{gdaslBYt=#!?$-IlWfo<cQVugfK-TtvT8fHJ0>LD;WYj@}_OB#}IaMaO8ubJ%ESYD8Uf -p8A94!s<YOxZIO>dWLb-mSppnW1>tfCl@eoQjB}GyhBlg8oEb<v!}0TNTlFrL(Y|*$$<=QRCgEyqF{O -J%#6w7(C*m+>Q?=z8#6tH73YDYW>K;kC)kSn~TXRd%M2E&9R!{i~^j`_*FAcwbiuRe3huW!OT#>J?R; -9cQ>z5C?B4PBdDb5GO<N(d;W!@6W6Ax<|$J(Tm^D;(Rqdw;&tItn#B|g-#iN>kZN9>N*a0|2mQ`-gGm -jArd&D=nWZ*W@PpIX$@ZaLFG+J!4k6ExH>aAb!jW^9jH&U6U(V7gf=b;pSt>r4d!yB_y=4?iDT`0vlF -#!oZ=6)MXX_%#O~GTua(Q^BnfUNH6R-1;4Z|}eRXB@JuSW01psy!8y|Y%2Qtk4TD*uL~F70m8U?WF%6 -S$P0JkU*k(%gX3;U^weJ7{~La=w879LU$KrsyIdm|mXSS3jJ8G7b5BlkdGkz}r8RA8F88gi(gVQJBF< -6rny<N{`ll+=3@Wyb?vx)l_43Lr&=xcF2FBG)RQ<bb*>rQ4tg+GcZ}ZKq*cDB#Us+{R8tSC@3zz$(Ip -t(zy6))se0`>eMe#aY<d`but&&L}shmWd@p_G!7D;B^Ls^xhR;-O(+1Bpg4+y><C{cbAg#90{A~z4&H -)ea9=qAre`8hK>aN$UIF{&!hh4TJyHoiipQ5*Z9mnq70i!1wxPWQsDM_tHpv9G5hJ-7GM|B?llGk}h^ -F!H{V<d$0m~E;0Ha0-Kr0Vfma0*IQ$+vx+NcYk*o`dFJ@f^CHQu%Q$VZ46vo6W}%?X4ZNA*jd(8aCz) -3gQjH&s40Ix0J4h-O`J+oGiI!-2Y<46&swNeMFfoO2-#nY>a5J0g0?$8tKze*L6_*sm+x9?lGdo%Qp^ -;;2TQN9vx%!JU|`L&6qKKfe@t>RwP`CP!n(hVZ0p%A50oJv>t`v0litVa&2KJog2>Z#}U?oAy54UaIA -vE8{}ERL`B_5t_OD?jhStUt9xz0jd)*Ju$JWO7rgd*NE)MNyW$Z#ca(N*5L57obZ#oi{}DAS1@Wq2nN -68gLXK`*KJkNt{BvX&?WBRpf0cG*v_K7d&{zvOkelB_t;l>5KKvPoC#6oVielli{@5%`@u-7!_m;BM& -F!{cS|lR&T99$daI_fM=sd0Cw(@~zfD_=V-eSXh6wTl+n7#k4!jjU3+3ewp2RdgfpOvph3pr_EeRfdo -c)`P<<i)j==UFE@F|A=-H&lm)a-VcD~L6>JNx*nDOpkGeO|U%S>A}?!?hMDS#JKxXY^aUt~9l*?iAF# -Zp$8(Gje-mh3&pU^s7e<(IyfCCU5cFQEyM!q)RCF$i{7thWM<W`{D8=XTaz@D6jdxQQKz}*u)l5R0eZ -|QmH3a4#p$0d>o6Jqgts;pgf5Pfp4_lG0r5KkYV6B&EqhnwKrCjds{-03aOjNk+YHMLL*8em}9_P6Vc ->@`{MyAe#u?P%ZZeXE61oZGq^5SJS-M-@3FE+g3w>C`auX;j$nwRV~;pMidt>ZV>8<12o12=j(p7C5O -?gVr>CF$kULt5^4uN|hkOekQN`pGPqYon*4XkInf)P$z0H9$_S+>g@Lvioh9dl|m1jnvr!?Q3nuPa#e -tUhu@#(Q~!oxo@V9p-HJt?!loUF;}zWpj^0fan%dXtqwZs`0E_<uV~-d#YlZpdyQJw*PS2mb0X^2>w% -FjPu^S{7W}R(J$N-WQyM>6JdZ=36)g<lS=^NUkGmxe%s5AJrfLAc9?Cz&}OSsSF|ox#)5vpgXk+MlAq -}!2lWQ1W-j6#C(^b`dKq{)p}a+l~{*FlT{>?%2#^nI+3~@F?y5Fh(N{)UeAEEC`kdL5Aa!z*Ww_&GJe -*qmRiR@sO5maAJyo<z-a%~f0^5T?zKF9$eNZzi3y}}{d<Yav1AWP6}^h&C1;bpd*~0(*j`mS^DiYJkV -W|(kGP>fHGn4ysnXY}i6-vWdRnzCKkrFk^oxUjbshmGSKr%ef%%QqbNM@4E#j@xx4c&Ud>atBkN@O0A -aEc5$!$PuNpQK1e=sO{<4Fy{)%!&{h%Qt{G%Xq?5zk&~Un!v6tT%24$EaP&E!ST54XgG}i0n^Iw$qG= -m4}CmB*vX`9{ZAqOnrOosq3<eTy2>glXmFU{mbn(3(Q+vr66Au*=}8j9k`9I%zRgktRFoQw3rdC8gI} -|5+dY&%nHKUU)fiv6}W0kVH`c55$=@%>o$2(i?n10T-Bh%^>%g!4b4b0@1rwfL%Mz^DP%(2^cK^zLQt -I?Xm`t%TvOYGgGWVJF0<#N$D_TS5e^s7p`)KNUuk2w?GwnnJ|!f|j}g1^2}3GdB`jY%iAF#YaFNV%Bd -7c$8X87Tr|QDIs5xS1$E%t<$N0Sh4O4{1^=13LQp5+I%rs(k{CIi}GUdhj)DIFm?(eThs?F>X`ozRb` -mAZkef9-gAaRusYh)|DIZaKxx|_Hqq7lD49$kpLBL}B6SKw$)kwM!Q)W$Em>49h(LlGn!-|iP^*p=kn -8C-I%PZowpRq>>iSqe4Ne$8b*AGGwWH>a~YoOfPq2loC_Z-yYzhf>U>O9ZL&<<x9FQWH0i4!vmh>tXc -lu{u8Z3!?8R_-6EYr_#5O+7?n*x3CX0)nlBUI&6hQ1CeK`tPOKg1025R$y0Z)lBnOhbCs0Orm67bUOE -esgGi=Zo;ZTxaXEdZ$YI*x=V!NpruY`<4_ly&v>7O-@}IhV!(~@zEUwan3Mr{0;}@|d8)yG^?R2j#i4 -!ZeBVKt#>q2~sl7_GK<>fHTsuOG&<;Z#A0`UI;6Zu!X<Y6lUeP6*ezI$VpO8A)D{rPTR^Sw`Z`JoL)V -*~|bC`IE0L((WsQ8<lb<ma6)6o>^Z5Jyv>XGAiq(eO&($RaTDx4f9Iqk{|9WuH$Y5;+hq$OwRu@#=g+ -(E!JmR1XkRDNxnKS8v9I1Ym>4fTfDz%m4mL6M+PCh-nV!CQDwKF>9fA)#wIPQwESmf!9d{fOUbjGy<5 -mz-yd>L6PO+sTH@g)%g*{z%a>@>|zWcs7AksxE>Tn`>%!3!}9$G|8N5CUk`5asWi4Ri-E=kUyFiA6Kl -?ZUhy_{HGXkH{=qav$ow6Mo4-K8TL}+(ui<^0I#eh9T}(jwVvzOYYhTa4w$A>OvxAdE>)HPS5p$!R>8 -E9xVR_urx=uh8e|!zoO{x0RBz8tCN4<#>ujPuYD4hu__hJ;|4HPku+&_qzlX^R$rI4u4eYl@(Xh+BA? -HuK;>=z<T$@|uhk&w0L$&?x4St0y+L$VZpg$cEhQKNB0^JJjsLyUPwi@qS`FchO09@yO5-8w=(4;)-Y -qQ>5-$JWS>4|!;5j1k!b)9x(uhFR?LY%>42d~+h|e1rz<u3en!hShnDcrdY5&mGMq*Yv3L{#B(qga_k -hlAi3$Fgzszet2T>l1hZr`Q_^~Bn|9EfZL0G<mc-xy-!gx8ZMXK?#}sShYqdbi8_|$b=m(>SZC81b3@ -@Uu?VNj%m&cOcDsxDm5AABs(k(hK77jQfPO?H8|9U|p50$}ReZ@_waaF5c$79WdNaFyCt?}`=ziLTc4 -bGXJQH7un85K`I}>B-@9vSW4L{6Itb>M3m4bhjRmy7Rct9VWj-^AOW+Ot*`>}A;(AOI3ctuI+aN<s%) -mES{!xcU?_Ej%gMib_{joL*^0_651+b|sMT&b)oz49_v{D5-){*WDab09?<MXMnHx}acwWYp?zz-BC> -bEqYwZ4fbgCbZLhxSm3FW8hBR7Z()gcRTtV$SHN6kQbl06Lc~fqQg1m7@;LUChpPAw=7ym0y~HVsx=p -E^LoW4S{iW0bg*(=axa+K%+F1`AMR)m^=)!<2OkS_mT+XFs86lq7L1Dp2Gue0aRJJCq@P>Om}u@$1s1 -n)PMEk;Z|URsSRxe`CR6#$l^a~dD2bx^+P@*2<m9D%LAHE+dB#;G-7jMi7SawL8u)doCqE4mlRLqc5B -Ueg*Q}i(CPj%KG^_Sc@vx6nLnFLDgSZ8e%12j}W3=W`$&yF${r~!Z{#r8ORWB$z?$s}u)#p5o?}6{Xa -j<td{Oz{iBO^*P1PRmh0*VwyAT&b~1dPGNvf2^L3n(y7raqlhMAlLyylU+L4@YvPP^O?wmuG9alK_QI -&{T~76@T78TyScEEqIk4q%uGOS^i7Jpys+@?vf-fI7_Sy%_IlPM9bk9I8K0T<u71zNhu=|>;{G=F;Fr -ECD2vM7)TQ5KstzAF>?7~0m}vKL2kLuhF~jwBqsp06D!3eTdTgyHt=e7`3LS1cTg!Mz9}3^$(ae=G`U -gdCBmX=ZrIb^=W~kLM^>im&EGO0z8E7DEs?lQ`xF(wWI%vywt7o03)lohA&*b{itWEN7B$uPOdGDhIz -0YviUL~4C<O5ZnvZV`%=E1V_~A88!aoQJTPMxdMo2ZkRK~cA5GmdxL`y8Nxi!lJ%OaTUKb)79PO<7kC -0;fD3%_F=%h2Nvko_$&{iQU{m!XJHZ787c{lngEC~(_7Qau)*1sw@#bWkvubXqipU$jf3I{X^NGOF@x -DX|J<zrvVz^}8Ap*O%@JjL%&vdLGq>nG@Ues#Y>~;7%|6h_g|B+?MD`9;_R8fu}+3*b+Kd%B#Wb9dD_ -vvZMB>wLdq`9Fcyu<@a2TGa)~~r)RTuP$ta~yL5S9K?7eLil>I1AR+7>4LMpt-jGO|;&-B-nUR<0644 -vs{Ja_y?w<JliQ@&=Rxr_l;j*C`TSHGppdygNb@wn2Z<FblRGm1;O)GbVY4Sr|8`O1Uak{Jto6}LRP6 -&E?7;{za8T%yM>Ue>(9hA?>b#qGb8F2<5j?x}yjoLkONHgTp;hJB1xVB&}d}1noufn^&-Gs0Q8@_qHM -S0Fb_rj90#$<0d!eMTw4$lj^pB4L><E7g=(xuJE)J)`tvpFvbI)ast5-nYmG~3wQhYR@%vJo9)GN0)= -<|=<4oBr4_ccvtd!4+)+=Dxd3^x3S%EGF9hama}y%#m5lH*9#Yq0WI-DRNELMrW;y`o=`(>~f>HiNi& -ITUK;N3NJTG`CFsxO0G@mvfP|KuI=}C^rAp%dqR!-<`|Son2miuTQ|Fy@N#;+w$CS1Mu)VMsR4Ha%m_ -E9dJITRMdNc9a!a0fzCil<v0q{xqRVFOd{gjU&?NpXcvc)UWVYS8Z6%b#=^XY*C7eASvDz2W)!5~=Pd -!0glG!&4(5ogFKT=#de92hDj(*7Yu4trDa)|@r*Vfl18XCV$jD9yQYM6l-zIugaO`teF9?WHR62RB@U -0TRxH8znsKUrd&C93Bv>8>3Vh;KrgY6e``od{Vva+h)r#9vL1EMGJ}HUt-`x#Pv#J#v|Y9?u3<c>~#@ -9E`}<P?v~1D;>jbyKnEdsaSG<ovyx-afjYwnn0ek>#1wwZtSli88pyw3@=`H6wd7ule}8a!%X>gnXh} -Jz{6K?qf;L_qQ0{c!nEp9-Q;;i&Th{g%`$^fAEDi8=v~F~I(7<kuV>8AY}}$Mtk>viR_8s()SGU1dkA -y*gd5VMQ#jOrapEc1^EZAA6_*?%D~#Mc#^Gw8T?2_zxDkQa1;cZ`mLe+L3{ia3wX|x*qkekCx2n1D=& -mq%7KJKuOX&}M;Ke?D95(R@%&J?DA|c~oBU6PoT6whZyK;ktW5_2|j8)N+wFk`RChIK;5szk1HvC>dW -k-3agPf^jBlz~oBvFo}!$M`0T9OWj8cWOUVDpW-mxvoJ-<B-w;c`%qYMAOy;<OvA))I|`8088vAD35| -SwgFLXBc}1p4b?oX1`v^NbDtDRt^Gnj_q2vp>1W7d0bug>4aXBV%%`nRA@n_*CnjhQnJKQy{yOwGiXE -tBLbg1<CS&1T+mstHs}n=7vy~F(Ir2yGt8^ak;GEG#wsm6DU?yY?nlyA%3v=)=aAkO-EeO=N^IT39k* -o+M}&MP!EUu`V38Tc*h}>^*N-0(8SxZu+-UtGymkh5?wr;TI9^mk9D5aYXZl-on$3*>mAbi6)e~k{@U -1(-SH5U;vR8019RIMWVf??z5>VNytb>s3>(7>9IDhf%kKx>JwtSD(KECxs0iHk+7)2=*XAt633Kz0+t -d@`mXhbuB<C-U6Y&3pTYIvK7jn{%b{x5|3Gz806QAD6HO@gBN63GGDZwy+~%VCxv38)<9VEQy)$5yEX -9CC@1m|so40>=gh93{cQtPZ}8>qI&5WXM)x8S*A$L9C^a6imy|>FO%J&iMe-*wyM4bh&ZBNL!AEXP|G -614ppmRw@h-f}OuMt7Vl9B&lQh&l}bE4;{W{choHLjV`$wu9g*unq0V1oJtHeE_ttBn*nGUOZv`&@xr -Z{qqjs@kok2O6*R5QNuPm6@*9zAm4^84wU1{9Cx`x%vjZ6<=uhpt*+VivPL#THuf~u*;63-adW6tJuz -hgC!_BETm3vde(v&ZShn8+BqIA@lJeP0tmgujy23D3YldxB|&&}&eX1Su=a@K_0mu;TWcz0FLw;OV;S -fkxM>iFSfI(6VOzVL|iVK4GwY%r63XY;#5v$K8@GVHv$6Dee+0X{oEdcP}Xr%L<l!+x>em{!OpoDTA^ -#DXPBuxil@v$od-;=(T|?)G+u#0XiNkik-$3ZCK?j<06!kG$dtuv*MRH=j~{o0PgF2%Ssxw#V*`3;r7 -M`=M&nN*x|jIX<CXubTKnZyL52M~T8t-V+y%gZbz#hYf>c>;laGtE%A3G#{(I((aX=Yj023b)4@o{S~ -`^Yv26?PdE7{$Oo-JZ}3{n+#5SSPPrQU_j<4J40r4GuKx9~2)lvH*A6;VCwiltQlev;^U-=aT75_6ok -25jn7J8KRYP2ljA`4Z6HTU^Jm?)v$|Vl-;wwu6Nb5}6mhoc;KV4>`oEi^nZ<kg{BY0l2CDonA_m`)j6 -1pKZ9@;A$5hrk|(Dd^Vk0FHP#k7&?s91i94H?1{Du_NkovPao*;;p=PlqtZ_D+;1lbJ5b_hF;lZ?K=` -?Ugu?Dzr<Ha`)1b!4VZsh+z4`GreL>uG$Pw&Zz`EdeG5*Gm-3W-s>uy32|s-_K<9zNv)62dD|@^*63V -2(r%H|skfJLyoiRDw{eJIm!>MS6Q$2iUw9!yW@*Wt)dS&0p(n6HqeIMt9Q~TuS&|i;;JxtQ_Z9k|zhv -yAD-b}9FN|UOuOHv}Q~l%r6X*Y@PDbmwf2>B(FoVDZMKTOZ6D065VrU$u2^3}+ilAwNU_SL*hzS5r7! -F`8VZhWSzV@YY8nkeMsNhNnPH`{*0)H+7v0xmNt&WlO>KRUfu}uuf69H%fEaDi<g{J5#9*6?G#gi2x( -_i(aaZvY<fx`n(1q6kTwG#kJ_v@a3c%6WD^a6`S271&BZZ1D8_kuEjOr4<sBA1_W4Cpp3SV<<U00mH1 -`YjZ0!Hno5`c{pIrbolIugo1d=A2!|sW>Y0$8i4s#%69m5$%&I*8Qr(>!wYNyqC(GNASWYV?nrgRx_l -1qxa&f_|wM4VP*HKMesGPzceAwAqnahF-qK_%n{Kq0ydxnJp5CCBxtQ`y!lqnUs?zFa=>vdWqfTNXqe -_Kfb6KV?$n6k^`L6F0yFe0qomJ$lIl?(-(`j0NZb%OlfiR8ZTu&;5laXGL+^7fhwq=Z#Jzx2Y|_=g8{ -sLS<tZ!L{IfjbFT(<TKA+lMpg8);078zN$MaC)uMQD!Dc4umP{pTq@8UH_2J?%k_FGPViuUUqDeRt|b -_p+g9qO=`i)OQ}+d}0%YR<VpBDh^7d*&!#k}X#|-YXkkqJq_$T~Ug>Kq#Av389{&C=t%`D-Gz<MlVGN -5o4((0tvsY12_4ZaB_|_J1O^Q;2eCANxkLW;xLo}I>i!3<>t=Jt|P{)b~&DpTOZoB(>-9##%a7wo^7^ -`SY^Y6rHKklC;Z&B+XGKMZk8!ZLr@i|SHuzvr<TffbT+XENND$uwDA{w&o;-p=G++#cBYQ*q&^+=$By -i}X1Hn8k-BJmQQC4#Qd=#-3sbmho`pPAK8yx&6aL={3(R1Ie#rkdi+J^9=@eS3=+h0IrMMCBt)|e!$F -P7O-@*cDi3^6wIv%~Aqq6SIbR>Rnv;2t;8~0Q+m&+!7MCyx4ZiI3*$&+|1_q6XgMoKrj?r_lTk{r#_; ->6ptzKi9{wI4CGEE6Uts@~sGBat<Bx!<3&qp0GKC14TR3l#}U+6c9&L-iA5?o)tnN>NvW(ctjry7yu% -c{-^SPMGe8r|YCUs7i6Bb~=eu7$x^?$@mm8yU7B?`Xy7ja@lYdxASJ2K9U04r?g;V$3syjcFpR?$BPT -HphoFiA)I05UJ*W~Vu%^I3S{r@8cz?qBZl3FEq18<Y$soz!($>Vc3B{$*OfmBQVOc)OKcIRdLwNZi@l -$&*N8`D=zgiscp}~=V#aA?(--C8CR^h0pSmx7@qGU1ee?x`ssF0Q(tqt-fA6F8lPfiaEC7z7FiD{_O5 -g|#FF%tAxn#KuzAs?EWV$f<3)0z}2rv+4z}LJo1zqz6m9cDXoWB+FS1%;|b5iyKtzgzOS-b5R7!plZD -jOg`Q$WTLqe1^X#{oln*%GE#EhzY_Inz(z9<8nk3#Jn=NN<;9JR(=wMdXXo;ezjg`<;V7bPSx7kbI?M -W8fT1G(zQIewH8stS_Mg!GL|Uw_xB8W>LYSU7+90l=87X>8<F{HM6UbQ%h1O@3UD{;WL5#zc*6)$qxy -7^ZrTxEkC54z@EPXn~eRf_fN6nSM?>Sp2bNM+#eL4W<ywF1E=_2;Ys{N-@?;4?VX^efvbkTzwG4zqh5 -Rg?-%`T0_(*sv5ADGvU~p+w?MxNT$Z?{)_C<jZi(NY(f7CwS~AcoUHtB=y)20$8z=yu=L!a^zO=_hk> -yn(C|I!{{G{j}UYARDrskV-8Eqjhi}QZm9R)L&SxH`&!<~Jw_qADd;<n#jUx~ayL~Pq(*9^Z&bbCd+v -S{X#QM&e_lh7r)JT}yIPBgAN?^OiZ8__*Shw(vAo9mgNw|8~ADAwlHdY`!lLf_j4{?0Y99ST-sg)YK2 -l5CKN;ZE)$;aFIBy!^U~K>c#>B8bi+lO4lComd^iaVb@NGH?02!7u^8Z)R7Q@tXG35QFyG72HlXWC4C -Za!sO6Tefld=XM+P4i(PhauChdo8z3g%pvJcg|AHRtRlLNBmD%OLTrD#!Os4FQ}<@gs-n-A@I9ZRF5e -ELTjrr6`hs~7P(VP8zF|fNMUe5+H;-pNwNFjIj(_)C5w(vS5rM5wuFPDymTQ?BGCT<M7K>vNoEBnX>$ -EIM(fvns;9oC@*uOWpqyJ9_f&ZFw`RgF@Lk5VT)P@rgf`SPWr~)y}dzf_#4nRqsVYaw|Q`Cnk;I^_N5 -#SMT>nr^>h>71y?=ks1MgE?lU^^ZGn(~&}VIT9hG6byDAlpm8!BPekKEdb>XgR-I(HQ7YBNSMpf!oYm -@`sGJ!~bfaHG0=h-^nQa9%9|{(d<21o4q9h!}LuxX5RJHxAqXw4kE$NPp#<f?YA%zed<O>AV&nFtZ%( -}{4ZsK!~;kH=fl@15wP;*1&4RCbKvH6)%AU9?S7R4b{~1!{1;p9<^MXwd=(P>TOnrs6k@h$0vqqx_Q^ -&U`Z@tC{2(GY{GAX3&Kmj}V!jQm>f-!InKo4d9dGcvx2mGuCQZG*<=cK0o3_02m$B*l&;<RP*z{d!TA -_bJeCs><uAjyTmBu7h`sjX78YqwZ-KZ=BO$PU-bjnbW=A&TVh?6;A@6G)5{jv>4uSD6`3D%8g(=QW$( -sfZu2y;(E!F9dGlzOXeNsy(z_$ru7#6BdS*HyEc$n0>jS3DeVheTux6OJ#&!Ky2M$MtRq>lqXwJ2J!% -x4Spqoeoafiyk@H`EkUUeP+|*iw`4Qx5G}1880d?J%4o$tT<b86rhg7K+LTRC|=So+K8q@z4y-EuHIs -3MHu&mI8fwsW+!dW?^NM*$?Om_2)K9#yNG?AmkxEHwW#EH2#kwRwDWZKM|nN^`v?oQHP&oTy&aVHnca -f>QCN|)_y}yNzY?K&yx#Sxax3WgH{E-G6^5ZNak%rBXD#zFm7e#z5<evTt7P{n>PPg?B?A5HbS&4h5U -P1~$2QI_4hV)5>Ze6CE`s3L_^7IAyxWqJ%|!t71M}P-KMzxSV6jdhSNfn!st-N*moPZKb;9`8SiG0L# -ew6Jou0kXTE&<h;gvO3JF<e?K3raPx0GW)UW8{89aAJ4pch^0S6b2T+#}dPo8VZdIbaEEbt8$!5`v)u -4;RX4-o7UfcG@S)6-FJ`K}#i+3o3>Vu57F2+_qHD)7>@JrlZEN(X-jvOFkS6K2}<myPr=ldkU#`Zl7( -?jSfZn3rgXc0X5XPKc-hdNQ^^E+wocEDDDzBX}1qJMD2qynF6LFMwyPM`#nx>&A9e%e`W3TCS13#b7H -e{qrzrMBWy_a0m=S-Xz@=<tLUGUb*cY?vhx3__y0F#<sULn8U~zia?3q2j7DG*Xd)pSihyZ~Kqv+$5e -CIS)E3?nL?Q(oFu-9;0ILm408MSn8nL&=1#qZ`K^K<VU_kisxKr{L?!|#<(v}qhJ3S1Pd_mzC23$GfE -$d4lfDR7ifk{xl-eP?8E0P;HrRY8Oi@%kVP*A8Q--LA%0kvcB;uJ8vDF(D%H@HE*=YO|%-JW71&?H9Q -RCJ&}{8rikIv?-J;=k4w<~x8X%5U1j+d2(9?1RNes?&rGhYOSt{wyuCWuDE4ndd(!DT9hK^tq&r{hN| -9s3=4KNl6)0l%e!X%J!+GjJ-W@&OeltH#8$|5$=yA<!>X=|FWbEB0sdHrT@C5{1q1c+mbSXOOR1=DA0 -uGmZ$6(I0GhFIcMNFmc6m4%5t1PlP6e^+*92h2gRJF8^s(1v(^~fi*?9(Ae1NcWK`20+jCai)3uIa2S -+azS2p6qO;j`OfuiiVgPln71#vp?m-XVI<)DW(^wRWK#4j1iAi^zFX$QX9%63HUwf6&_WYoVXvqB%$S -%0Kid70@YwwLvF|Ad7wo475f-ihADGuVd=@%*Q22Rgkh8ncFM@rLa9ei%LYgw%(z4R2~WDTH#ipXK6I -6Cdnf{bem9y^_z+)1sPtGR=y9$lE!O(^OH+T%C?}I5u~?XU0Lmh0~drcE#P$qB|V<uYRz(=6K_V4VZ1 -A^^x1UwNRZ^<pX+e!zah?4*%TF)xF=wwClgj+x%Lb?w>lN(*Lo8>;D_4_6O6}zjs<c#39heBq*H1aG1 -sk8ez65L}C<yk~j`y2!)dL$7E~z?V<`SR1lB=;t3Ez+OkDDewQoX0!#=F*w~=T$b4)HLxOOyWvmzhST -$R)pinSjyB%!%84{p0xoyNg2{ci_NIrVI(7ee<AH^Z`EoZ;Q59D1$-43y3vM2!<)!T^yncWZs9$;jX0 -m=|i!KJ}f#5BlosSNOX=(ofM0|S;(M1%Zy3t(H;jQw?PJAj!aQvN2^#C778m$zh16ohW9#G;dwKaj0I -=eFZV*6IHhKCN5Y_Ah-}zvY2jF3S91a_U7*jc&iM-zhu&J-YYL3GXlRUFL&)_W~K5`z7H$dX2Y)-rH* -OOFH_U$$Nj6zPq7cW_=-5B<e&-wo~foW69!QBfaxo?^ycdU*b!!gZ?bqfx(@x{Zr)oclU<yvi*KHzm1 -mt4Z`_{IWY855<H_KcIiaUG+#Gl_M<&gge7m3NW&kiB()mVB#An|9@SNXn8B-xXiKWH@ij*GaCKq!W# -q4zyeQ#C_LQ}v`^r-8$Nadfki*O?*}<1j#!V~o-d7+6C5=p?eN~b~_`;pMT~{i{laZ!GfU*?d!~S{V* -LzdMT{^K?T8V3V6jyvSEcw1uAYG?WCQEpH@b?9J&@L0FWAr5<6i+lNkyP%|5XQZpxPc1CopT^A*18`E -OMX?Ql$g+-Gwd`tzb^F|H8omgGsDuX;NrZxS-G@LNEG??dA?GNI^?4=QPcft8<iIhst}c@Gt_B}#~K; -R%TIUk_VE_==0X+-e~InaY4Yjr<%bWpF24<bE!(GZ{9=#;{VgAQ8J2mzmjPp$n?!@#KFAkRN*+=_LH? -P$7?SJre*Fskq}I`-y_PJ{n4Y*PkPZ_ru*E}^)O`)lPq|akV@RJ)x!k!9m-kRQSA)U3{&&tgeS{{Xet -&=R*7wKvlRPjQfA(j68@+xWNrS%3q$T^db;LAtXWg5Ihhp3V1-{0L{LxbOSqH=!OC0LiQ=`iXMQAn_( -DQIU)r^p1@uFAAuzfCq{iE77i%^PbazsySGuEil`gVUw=}vp@pgy%`H4eGjyM{ui@Q5xqez?v7J>X{! -xmMz~s&c_YL7szn8aP+TjmTK%Q+z^#-EoERMbR|j-tKL$u}3Qs6V8lDld;E&p~4~yUg!C=FY`o-J6S` -ymtj57*15D7q3bww2XV79A<38!!8#%5!<6r?7yPl?k5BnIu5j{7ES!9$(?w`cVYxd^@^wp~yA};CpHU -SXs%`6-#i(bRcc;X-HNOmT)}cX=6jDLltT`QI!w8UZFYG78S95qAxvMJ2*#U2~BL-0h$_JT<6V>k0@N -HQB6WRX%z|kH57XXI(kFnMNgXj4Np!F}#@q5%oVhE0bac`VP2#kP9k|Zz$VQ7MYkqw2BI1CfWN2m)6! -5r8It<rbFo%|vrygkU?KR5J)ypw4Zh;My}y0&MM_Y_(3Rwjl~P&n8C8~wHgViJI{;tVt_&;-~4#0*gB -B0*347pRM5K%+W&Poo3a^j0j3-y$jq2KpcITb~THEMoB9_?ykP;VM8`V?Y@re#<6r&r$@aJfQCZzU?G -{V#;4z@fD!&JUzdnE*%$kDn1?6oKdf{`ly1m??1@?|1TQ5FaM7kyIY?XmSZ5dg8X2C@PWYc^0^xW{U< -l@`%Cy&HxS%E=s&rEpZ^N~{sw~k2YtDLe=gtb+`W5CyRWutCj50Vi?q{JW}hn!B)bnrVoiP5uy@sLgq -wdSJtGWdiSQ21IpxOCbjsl+3UhtB@*DWO=Y}k=T@7<BHl|RfA3#^UVAXIy9}ESn&FgF<*QS!^QA}A(B -W}~a`K4Pt^k;mpzvC7UePkE^Pu$|6kL=?Awp+Yz_)wK$L)%c*%OSK9Pw)+N^+Y5ipgi(pbtGpE+2sv6 -C<HEV0_lOL$d!liLq?kq+pZk8Pbx$>#a2@AC#y5Bv}r}h)o+-J#iB?oc*P>07GMNu6XOWm-`mSWNV2t -S*is|nHH+e@eREOFdAVou(iSPE*w}bt2@58j=i}8fH~H{_2a)|}PCWV}u6|>?@V@-^|9uKZ@}o}v+i% -kU8eoJ#Ug7<J%~{z0uQ^R#<MtD|fA-ONzwnT~-XZe*!EV(pOty_!wH^4w*86|^qm9r1<+J(D1L$9z$& -Y1u0>@FH#Db8>hs3X#css{ZZ&7FL9roUHL4fCt0>;%ARJSmO#h^Muf2=kJlYq;$#Z=-QS&{c4Vf<Y(X -Wq)35tuN7F`yg<zm=vL>g_xKD-(h(IFkqvSc%^Q=E<8ThP|C{w_~L+;GieyI{>F(jvZkD838c1k+&Nl -10r<t9&Osr378qYIc@mc9hag1vg{#&vd8$9_$528*b^*keMJ4-a-{qBnfsO}X{vYrrhUl)?aRAY1sAT -4G3)#Gz9E3*T%5-M?Q;jc!g?uUkRiBVCbkDpmWGLH*NH^nq(2tXz3xI^swT?pRKEDI#SMMwaUXzmr(k -?h;Ov2c&sk>5aN)SPk%rV^9~L?nF=pg8%Jf&h%I)5_q2v$m`qimmHcD}erS5bT)cKQ@5ZDF;V?J-&;w -aRvKbC$R$^A~cG2WI^4Y|tFbiJ6cVY|Sw^|RdL3__&=Md)^Y;;Y#*=Gk0X<jcIhUfV^~AIX?Lz7i!89 -zH>YXkA>5;~FmDaz0hop^y0x70|C)zX(X`-`#!dqJhiI52D!z7juPFF&QJ-YE?0ks>>hW^&g2`&%B++ -6ro4<S$JgUvL?6zsAMYTI$W8$!nx<ROh2aOaVk|qDH)+VL$ySQne=*%D|agR486~cHX7lTZ-qtJdwUD -FumF+u^yy7|r481AjHuX@Bh{WRNw-4ml`Z!oK0Pl~p`oWc<y-VaFEs-_?W9)N_j<`7<c2;pTi~h4^TR -OpUTmdc9MLg70eLJ^CrRa5SBvWqs%IY9yeE-rf8#?0S-br+$avW)Z`jrAY@9mC>`*M1$MZ>Nb7RYpsw -Y#nuBl@VzDvbKva>?GkNrXkFaENlWZRc^aw9R<=Kjo7xFs93%};cM2aKo8D8y;6Zs&3dE1VU*t&w}`t -1Q`?JND#Q_lT8&XW-$cKi~}pt*rBX#~w(WL7z3w#J|IyTTku1+VkjO^7X_~tGh=H$Ypi{LIl5V+aF$g -s+j!eb)sF1&nHe)xiGyF4b9yoyMUrmCgcNh=rWSC_@k@uUr5H&4+mANJWzGUS7t>f@!(u`dDh+@=T{i -Kj_x%+7es^d(2l3;SXT?JmloIF8M<*4E5i&+syi`<q;At8fU{oet1BWo<}<>*(ols7x#HQuUU?|mPS* -EO%U_3wa28G@hV0i-PI3y<>;})<u`b-`QRvvPYi+N5B#u|?<#fo78oi<tH0WhCc0O^)?xDG@dCt`m3h -{g&VPjq~U)K@^ZksbwjbX>7Jwt}BZZ>+jve(Rf3@CIdW&AL{Qs%B?HXo+*F)*vh8j`Eex_+x0hj0p>@ -|nJl!P?tpa%QeJ^-pZ+Ut#$AElImAG2VXG;XO(3KNGS)-05eV`v2rWUv2CE@*qDt^Me20Ea;C+f<gkc -3xI=N1p3!h@}BL50j+JzF^PA+jH4h<(jT|Sw-5;U(I{w6FbJT!0S#;XEo?>sTZi~PeZ1wkAV5YSbSLk -u8Tpk|8fb3BZ~F)Qt@Qb}7oy%uFk67#()lgkZjb?c+w!F(IMprmCvOX)4RJ)+oBD^n9s45Cu>f|!2;k -vS$d>j0r3TCb+T+w$%ALq+H^2OYXaZ<MaN$o?^&@l^#MI!XFPbl&i`hkRvGS|zEudHq{@oI%Vf%M5oP -Iid7B3Tc?YsrX0&t3}x5Lhsify5#4}7A!`uNYJuI1Z2l(CrasF}|u@&Iz%pc$}jJOi?|F#|0%|0g2gx -teCBWaBSLLGnyE@FiH4?JdCHwv5uZw^Vd4qQ<VHQtS-A`V#1Ge|AZLmIwVv{RY$AzZzXqKaDQsV03A_ -*@kx|&<(deOG3ZvKHh1#PMq%7<@riV$|XcqzjTO_A9o__$lVDYMA@3<>$9+G@d@8ZmU~&W(?Y}1&2H} -NKKhbM?J)<Jd6kH&AmB?OS%z0Hq)(F}D&J{kZ)fX6mSdUeq698*ukqwUS7Pu<gSyOldxqtgR*%P$pFG -St#Wiu^dxNubEj9Ov*VWFcIHr@KaHl691j#@PqX@M|W-%9Q*KRp4e>y~3qN5#aHK*DogWIi6DRt`hIX -1my5-CfDIWn3dq*v`GsbFFoBJAjnX`F{m`^V8hujV41E}46a&`uJIYc3&|<?4q`yYlwY5OF04#6o|B+ -NDVE;eHD(vfzt&;!wVkMZU*Og&QPBS7eRVmWm!og~{-6eW0B!!&U5VK4VFLXjT3U58G9nklb9Z2mBT` -(G+Cue#rbQed<tmP?h6)&8O6m#w)|`E<5f)CDg5ttKPrdoac+~0{OH+ghvuM-H{o>%crLb%NrI5`P^2 -H=VI`tolQNK(_9)penx2Y1<#5G<LOa<h)<^UgApR1+ro7d&No#nXimMoy46C$bKfD3syP<jqUapos{N -@>n+)+cI2Os<c^Z~9+qNnmpwuJ|Ywhoq<Z^u>(MT)Np2r%bqcG~}H@4j-kDRkmB{KKJ(gfzy&36wi56 -WXjnIQ>rWHQV#?Y7(1SLHd#vkR?w=<~u+=mUnS;S>|!+Zh5k!(Ui6ai8FW!-~$zX@(ffoa81d%TA}2W -w<==xE$y%#yo2W^Ow{f(y;_f7Gm0P==jd>Wv{*R#1Qe!6ruA5#p?}vG7IQ|=@)K8m35gq2$;Dzer65+ -2}MGa9>yc~l;D1QWpZ!ca=5f!bnqy<Klo&R9!1*@!appxy&u{Gm)G2YCt1+16-7^~$9tSjEhwWYgIbg -$@zNIu;;$jW^n9nHteggueXbQJ4cK)@AnG{G+y;=ctV&qr=#jkfeBLnsB^hU)lmj}?x7bJAQr@4-MnI -{nE071P$lJNI{k;@e57xbm)>LMD=S*Fv(2c0XcIAELIIx1R?S*D2NWC^$eWi(G6~xi$Zl=Uyt<J5T$= -Vyp`DV&0BEr3UtbJh!LbG~CGQ-BTXH32~YX>O5ms|2vUGiJ-x;Si>hSUyGSYK*=0To<gk7!9^PyTG1- -U??%;(LzsqNe_kReT%h(2m4-{N{`O3#-NpagDTbqRsNYj2rM=i`^}vjNMvYf-|$A>(fSMmy>Pu<sR${ -f1h<|)aE%}TFJE=X;mr4CKI@}w+~^+93@I>wf^u-r6ihN^iEuHNg~dNzTV}IeKXBt)j*M$r_bi*aH-7 -4$TPy&B;sX++0cWjCU;um`R7z!vePbR`&y}{F_(r*6_&zzz1L#}naHbiUUcu_E$f#diCw%61t)yG{Ut -F8FCK^EVbb_GG+T?PT+7C8=y_W@m)O9toy0={#cdgx`%3X=JWiMA)pJ*7t*qI}pX%ii-FmCqooR2;9- -eygyr7L<(bcrZqw`D;*cDo)wl2tPGsO<~z+%$paGiP_^}9_u?(=LY{%&ey)HR|D9$Q^JWHVzlLPL_f1 -N%?<K+5BuSKI%;ogV$`E3`s3aQ4G9KcTz7|Ee!g?ia848NYq#bV37S2Iy%pZ&t>q5%af0@rKv72Mi71 -TO5ONx%gx32C6aP@7s}37&J6s2Gl(e;_a}A1EL3-0R)HPK!P?x!3;zMfZ+Dv7uYR(^B*_VhGC!W$>6s -NO$-A#8Iz#y1EcR=2?=oEhAY#zOfQh*Mcxv*@S6nrwyaEOfZ#STiNF9xM(AHQHw*wLim&>8JiGf?+Sd -NLgdp}a^dptA7^5cXB9yqR5;ua{%9aeKU-$?T{D<dr=sS!yf5vC4A-JF{09;OH^OMx=mu;|lRu@1n{B -kzX_owr3&IbDabbdISzc~T$7U1qqH2xauhOO@9qdOPXsb)*;PT(Cv?DGRd-5f`8bQFDT;V7dnr|IruR -~cd3)q+Z|E4<jWimuw$B)vpKVGb?hvAuz$-VncCUvBLMH{YhWe4oxwK6*1dynN`=@QTDcbXw~(pFX>A -DB!-=>WfP5GsDCS15KrIMf8f!5BV)i_9sc{ozQK9)RCxCWW$r%mIZVT@aW>0&5^p*My;sD^I1Hv#6D@ -yeA_ITl?mR$1~~Du416@Gvy51!;RqTno(rjBp!?l}U$30Mlus+|Io`bMeOO^JMO!R38-a(=O=^@rf3L -A|pN=mqBwA|_B?Pv}W?w*0!nH3bOh1s>%#m^F=jM>By<SY8*$+!FX~G}t37^Xe0`yTmVg7|?I{1qTRp -gxx)U9CZG!J?nYD7^j#brZP<Dkt0PoS+taiM<3{hX$>Y4o1{(6>XB67miBg55~JpR1Lmob0Kq7(}(VM -@<F8tBLQ(;i~QJ<$S$_sdd}OYO{pry%tL6W{#7%bJOCbXeEm}9sCG13W;kDdfW^y5en}%?FhX|Zz^kH -Xglff92dB{yQF7(EX17OzOxZg+Txv%CPwAbLOk(@MC&23IB$R*?M01G3yG&_?K;}m-GQdt{=9$K$HMj -O{$wh+8R@R*P#$-;Y=cq5!M#1(Ba|8PydyLJ<-}u6z6PAbZm>P|3Vgopb<%!ZR|>h+=NJz&mnj6H#{2 --+W+mX@Wy6vX+l*KLp9~H<X*_i4yXg(qa-K!N;;)5mc>nF=iu|X3`p;E@e}9;-HG)4L;)kH}p#}@}mQ -BThXbFRYWtWD5U2lehWIn|~ECHiyDCk_H<i{k%2$aH^40NqC8noFd45aD6CnN>E>ra)22m!@+k^r@WZ -IMTiuL`q&)L_X#fg(*o0iH=g2Y-t~$lJmg1RLf}rGF3efq+MWD44wY@-PiVTJU!u!7~ski3F4pK*1se -F%lucaQI(Eln7Mo>#t;aj{R8uHTbC#aBu~&gTAEAd|}+2Mw)^xk^l3Vy03$HZ$l2~Gtd1D3^tOBR)6m -Nz8P;@iVgbCpT^$KfCZROrr@Hc@D_btz&7anjfRx}s8?3C)^|0CgScpi;KCK4x%;K`4}CP=_N_TRP4Z -U{NArC3O(br-&m=uCpl1U`HSuqUAF!6~FX^+j7mGWO`dRB&=!QI8J3QYjF0wHsb5xtJq&=2(=9ZT3&Q -W&CdW^~iw6%l1hb);o?JtvbPdMMlCzXZ@W*C-9K2D?A%nwguSY1AL-mQP`$-BO*h?m0}TDb~QcrMAii -we=wpO(XNTMFrX^dKYYSb47xLEFf|y4zz{<C&8MI@m_`+Oi7k;h)qY9^~=h@sTRMT>F@iVm^lV<(#(+ -<Q_1Dvk>VFU+2A(@7#SaqC9rF+Q>oPcc&x8&Q0kJi`vWZ#M^XhsaJQIO*UZD$NdJ;MlAU8c6Gz;Zgi) -n5qWuz;k)=4jg%%a@jTxGHZD)M7aO$>%ljzWqYM_UuIiq)fKbrx?)KvV+7H!fe_xnq>QEOii-bq1Y@Y -m%&#spjgTJ|W&>zTnpP74qAnyIbo)KaXd~xKijs8r0WszfUd?Zv<-R5)NpdxXi4(2{h2w4qfCBbQh*P -csj_@l5M0v?+i=n#cb=4^SDd+g3U-bMFz>gM2xPg=i&^+whZ36(auAdCsIQ(!&sV^f-YU+kz-EiC9lx -be6{JGJxb9{0(6zQeoJBW1j`js?mH(M)*~s}JsB^g=esL!@rf-Hy<f{jB;OWJQ`AF;l&!2#!B+qqJ%b -^G(Wc8lSz%kI~bv<ON0+x^R~Jj@!TL4&KLGc5=yf$Bcm5Q@hl-eHOxtWfX;-)Rh~t`;L-!Y^iucP9LS -_#2EJ*Y!XT;R4|Fud8!|{V^ngD30Y2}Sw|`*Zl-ulmO_1nB)eDteuy$|arfxc__y@GJL?u69^c%fV3^ -s$%-0=&cKJ_%=^wxNOE~)T7yb~La2UZU1f?hvVF-%Gaq7d#t}Tw>44BIX1Ku&16Gz{g9MRiYkz_y)0$ -erTJgMkoZr2twlDEY@7~+cG2g}~ZA@Do2U|`&fdRs9jZ^Nt<0sQ?foY3hnf)%!<JQ?8jZ$|`-{18y$( -HNY@7RSPO<V<5wFpuAAoax(^WIIEe1UXpvHWo?Wb7sJaIeGKc-qT_rlKypTnFrO@@$k*)(a?6*WFPI7 -zW$=U%zp`7(C5hY=k4WhNy(PPAZ>tYV+_onzQ~trD_ei*fGX8@JIL<K#adveH-106{btmkKiNt_-<_V -u+JP1NL=(YWtzS$M#FS_u9?7?ehZ^T#2JVr@xp+rB=m_kOSN7}1@2~IgTpsji*Y|fW5Bjs~`#YBhCFg -&j^>w`C<=!m2<SC<vEVst-1XT&yXyfhL`sUPKx5!tTZ04hW^c0Wwkt#$2b*=gkju&4__~juK==oLLuy -T96?q4w!NB59AQIG7guk;yRo{F!adRh?Y@zl7j46DX9i}^w<7B6x;7&X%Rd^U#ST(ijqccDyWH?Sipm -Y?Del`Fi%wLcg8{BGe288@V{%XX9GK6LiLw(}jizh=*!j+b;w)ID*hAQOL7vvfCHjw{ROvz0qulphgs -p@!L&$qKeQ1Gz}M?Py!{_s-Ex%a&zq5M@rfSHweGCR1~ka;3a2A~`0pKXt069zB}!p01@>2@|#AQz7K -XiOP$C=(P+^@?f>#Cf`p30_{5Yv)0#<%LQ)t%V_tZ5hVNuZl6s`&bmNHnN^*PQ#>FJe=OwtvpIA<913 -jqsU~cQvcUTJcl$yg>>Pc{7e!Ipa>v}}+NimX*7nJZKYy|Gra*pGwgqRW!4{F~uZz)R({9;M%zlC&_0 -<p;eIKru2Db=dYISO)2fBb7eRUBDmYIRzDS_)BhiAKt@^~8`dmb~Nr{OVJ3Z8YfU8HG0@IrP`_ebMS; -Ypv$6_g}Hj@OpkN00arS^-lW$VXwh_$nfcDC}Q5R!ZuOQ>6Q{)AtqSc(;psp0Ych^%O-wuSK-i?M{1l -{w`{2Dz6TwJkeP04e@k@`5*~WZZxywBU=u8Nh)?O)0v9m;SLj$R1Be~29;55;#U}5TzxTK2^pl3gRa< -y@9tW|tdTFCFVT7%Gpsy6NH|Qkvz^XYx}1p@q!=b*KXHT$BlIG`1yx7W5~w%*(z;Jf5Hd%r^E>bV{Q> -Z|!__-6JO1#C`~7d<nz=Ui^91+5Il$Ku?2q^OrPmfkFgQvA@y?GGtYZR1(C8hDx5xz(Zwm9<nHUIAha -gdl-zr}~jQV4OS3-h`=1)^-AZvudT=Nzcw`1c3C~d|Fs7#`73lCr}LcGH}`Fr>)+0Hn6*Dlfb95n^%i -s)Op1sI1Q;0)=vKlFCE?VXZ$brDTLq=%{BKee-gz-I`wvNucs>_ZYj(B3uzpXR?-u)YAf#wz`T*OuxP -Xa4Yqr5%txrn9ic3J(A5wKW?T8=c3Xk^1j5zPC#v59e-a%;L)0U&@1g_1Wo4GC>5wzkAa7;mPf}&s3{ -wGFA~c&fig%%TL>&uNzCwFdTMLzKWhCN+dJ4z@NX%@V>Tso$bYEV1oO_F6{8bC6u3@{G8DK^xTgj5Bk -%XXH0d{as+qJZ_;>Sb1D><+b!K&9xBHE>!#>5WapYNQ-{OdvNO%-2WKbcc@-7zvo~@#nIaRZ;B-XvgK -^4B*f@~n1)&1BC^%wR`!kd)slgv54Q|?-J~QdAy*@C!y4UAh#=YX*68DX7AuHAiD(M8re7?vOGU#w_= -S$UW$;#>49`}*H@Hd;dqKCkXu}-mEOgZPrfmrl~jCTxAjeD12k6X~#-S`7ZoZIr@$M~8+mWAiXo`+jf -Y5Qtt>7|yFUZxM0<AicqANgyZM29Td?`-L~8&vU5cP{HWrpOz<c!e(A?XrPr?1egE+A-N=pT-8&DZyW -JPp<r@bqb@Q5h_eV=cbYJ;zxN)=)>6di#Yg0Q&HVd4z_zhdgWGKg;=}h7~UA_hS>xCD}77W;&jU#S@+ -QG7IqyO;_5=S+fa4RYF4;xAIwlbu<^PyW0U9&$@1vXvfY`<lv%)^`xs3QIh}|pR^}Z_^wDIrP+1y;9U -qT`USFa^M~iLLyL9j(c)K62cDZA=kFuQjr^gXrSGSnx`myh+aH@~bRpSp3nQ@8zSUl{~1_$mjDhXw>L -c*0hM2wQ;e9)2|jmDx<TrRgZ+>#l>&`8^mF>_5u>jE{gnx#2a>elVW7gN7qm(H{BQ+3%ER@%Hc5mo3n -gbvhEusrds64;ShwXSC6N0Y`qWXv>qTrN&g3CH8I$f;2m`s|R@>*YnvPNZ^IJ4f&XRrDi_YSz`Jx~fe -DBWc!G+$xYSFxlS@Pwen|bhji-eoNACwZ<6K8l_v;gl+f8QXnN3*1z$p^czc}B!<Hz{Zo|sPmc2?SpD -l`{4hNP;}lBaC_|w@fefSR4+pd<>@7lxzg?qZ&~*y2-<h{?Sp4>r1VYaA+lm<Y6MrmG`KBLb5uhn=`= -)Q}$QTFt9RB7&f$;J+jodOn7=DK)3eb|WUyTaEIG{_>AasIbAsKkE<&s;>qBC%y?Lk6=o*MI3&ITGHC -{Ux^qUjcexAVXvFjtPj;4uS($JDzHio?IBf60WBC9v-9moI@#b$1g*jl<$dAJ%y$_q&;F2=uXR&zOOU -?3a}3=z?iqW(j?}xB{Znk5V1wrzz)a8#hP+#fmmw8}BWm1;(N+xRzB>M2#|7O@T#^!q-d?d8b)|u>~~ -mlU0KtF3=W`zHT%m@u%9ScQ#ygve?i3E1?D=8DI{%3Vc9ra`PYL&jR#as+Gfw_S(|LB|@+DTl#DZVq0 -9+>>J0KrHUG>HJN2T<+*x;eqm+If3h-GftB$V*n~sf3`cS-DLPaUTwx4!5Cr#?Fwm<IRJJBpYw5%@`d -pS`P7Yd&i+0=kUOK)UjwjUqM7*|)CO<m*-n9u?zZiEBM=i^M;;?7j3x47lrsTY}9SM7!oQ9wDbLd6_c -hZNK3AgbwO1hcj)sxx_g_1E(Nr3w_lOdf^Uw(j)d`0@9r}ED-45-seN~&R)^IogUWRKwDi-;Wp7jSsr -WbmnpY<O?8D?;2LlVv8Z#B*8djtr(on!lVA&N)A@<19R%ipZPS%fd>so4vv<n2LRy?9HI-Ta{LgeF0r -aIv<}Lnqg5*aZfoo8#@9U;1kK7%IARyn;lUsTPEZ$YFi6T*cdu<HGFw)PW^yJP(wEsV~GYfSB$XYxJp --JIjuH3;*pnJkFW~U9lWdPJvkm;hIGGF>LcFLq{xXEjbEVa-U_7FAopSxz?YkE*gNtt&DrJJyaK!qHJ -(FJbI&|svQeMU<T3>J+Z}lv!qffMl_4ZX{YAeviMZG@Ltk#FwmW8YdP-y@?1y4u!gbI%{-tl>XuqJLe -V3H6(z9VwB1YMtp@T}#zBis1>(IO;{SdVoWznvxHM;|&kIa3!J%z-R=-D8Zq-0Z-;jZhH*0M9C(<nit -S#dX^3TymYS&2&((>(0*y*#?PJFc~fXax6q?0m&P`W4f78@!rB4ac~0U~jHhKu71K$gopNsT=P!bsE0 -(GI3=zRHZjK^?PKX8f*ZN0VwJJqJaE^m8V^=>Cl-r&Ytd+ml$mPQcOiC+Dcz}uKj#~e0!7BP~~X*Kj3 -m3(5XNX>tyisccbAdC*8~+Y(Dko+CpGe`Ds!4;`KSjD;NL3!74dRsc_b1xq?*;_G)n>#PTeAWw{#s8- -XXbf32JwSs7;oiyK&(W|REWc9UhX&(CiMP}yMOYKWC5Hk!bWA`6&b8@y!=mYrE4{zc(@TX?yId7K&;i -!a-skwkP&_Y3wpCT&n0`ke8c<#j2Au{IKHHw*eqAg`(}gGD|rwQ<ibIP9PkCq8q%VxX`g=!QAI_QuJ7 -?5@?}vfB7LPxITj*HC}l&4D-b#9SPGWWRq_HicA1H=<hL+%#B6AXOK5ac1r9>*Ed8!8*J&5x)ivxk{= -y!cVlX<Q22hr#pJZQWELeaZWcvBv0Y#jME5oTKx5x%;llwI#t?>ZlN9PWqNiRdcmr4d7x1=y$(VhUYn -M{YhhRE1|ija-3h2?IS>}^g>#N)T8*2Sel#i5=VFs`wl9Z7qw|q*XKh34_MTC7%?0!RvN%_VF=x*wSR -pFNNzV&L>V5C7?4iK!FI}o1y+hO25`NxUC7>J}Enmj2VsD1j+wI6oLLcxfeCvvKkRU7>6Y{B{xneTRb -rNUMHwmhWZv^#3u!|jcN}9OmyLHEI9{OT1t)WkW@gN`kxr{vny2jF!M>)P1jkzBK!4%V_JM}lN?^Dc9 -6h&g1Au+<o>tXkyL#y<?8XwtyxH{-gf^*1u*%?70j}*Nul1(|sXZ0eJqSFq`#TRX*^QwS$q<XtAM^ok ->)=61UhqG|tkH-EMuaE`vxwNhwSq@YD49mf7^-FP88T~*n>f+2-H0u-<9R-Iq<)OV1Iy-RLi&Cy<#<4 -i4)QuY{zGyEFlikyB2h^9MhB%3L{BY9Hzv;rdK}B^<?``@&fM@FQf2vo}Jc++K|AYOx_wXmXeF2Q$cK -IFwG6+SG7)%m417kFU;t0VI1V)lH$uI~GZ@BQocK8PUBKU1^^>!CcLeL{1V8Djjup!0(JcVWeXOYzJ) -W?u;d!C{}9Umn?ZyjiiQ*TEt;!WE^-gSx?GzOR$R6Bs@Y6hCxUo?RJsM$jRG#AH!?9RNQ-}V|91+|uh -dC#;*04IXdOZ1+Cdskx6_XE(~c+Zn>@RoTu#j!WH9ypNUKs6WnYjQjd%G1nOA90J-dCcEFHy3JOEPG! -^=6jQUsM*8fKO3Y<?kc*U;|3th>yFn-=bDpL$=K4|AIca8U)3aZ^@-`~5M_kI-$t)XaRv4MqoCrSMz2 -3_6Y|AeRm3k@{O2CWKYr&gZw!HV2GH(rB0CMnx`Qy2eTzpAsqvmrAFGjl*5*37??h=dx?NhQmVCO!rv -qJkGlQkOggCG9)9P*WmR4==9-qox)7S%Fhev2m@}@p2SLZ0cPOrxyexYS!U&1^*D2(zNw0o-g2h1m@W -w9>p8Z}sy-V2VjZmM`E6-aLaJ3wc5w=PNC^Rzzh`4<D5$zYJkK7~V_yfNvKi+V|p5Y)s)O!g#SlS^af -JLv)q;qlNIr~bH}rP`I+?0(@-ydVWpYuhB7SK6_t#Bn{}x3$T0LfCQ}E8>x}4X<Nw3DClO^mGxT<KEJ -A&$>H@X~bivKlP<vRrC3Hj!VikxLwL>wuqQlLns9Asi@uZlF8E!(mL0p$&4<zdrKW;^|j&QLOrdwM1r -~J-Qbys$8M?Q^3g$}N-cdPzRo>3rCD|&30qL7yA^Z3*^lI^qoYj0FG6``GM#7FYq$jhch{Iw{5mXTJ= -#Y%vf_PFJhKBVKeJI>Oo%JZ@bS3RmEh+=J^ANRC?DfPkUOi7BQwyqfWR|-DD1{mwP`t-0--nVW0S4y; -L<u&+{zu?-Jdw~tS2~W#X*R+AaT9z5Gpof9vM(Y=JTH8Z6n#)>aFPHBhk46-H}P6a*!oG%{1ESD?FZ_ -Ma0#q^E#`KokS>Z@9T9w_$+s@gzSOt(fjTu5Xng}4Rgn2HgVB*kYW_r9vMP`N(au3YC6n)N=z&18?r+ -;WVdekYWmW7$ipqO34KmL>jAnp3=0$*qdQl>m2pCctIj-EmXczK?w2pu?x!yoC>9Ei8|1)jZ#Gr~+cL -UI_p~h!&`Q0&wx3c&@nxgZn#f+8-Z&R1ESL@_Z#h=(uK8@O9QWCTpfZk?gkEJ4jHGPI7*b#58r}}J1U -^wm3nzgC23ux#^~KycTiY41({{iaGI-7pKc#(z?j}Wy*>!k%{B3U+=#Qd<aD27M2YvIXm!_NuU7m>!@ -e+BGKB|2|pBVKV-sY3<w2W~RI(C`JTDqgz;1-#z(q^zNc&lA^-C^{YR${vQ7R@Q+n5upR)uDA)-Gq1U -vw9poDbo$3tR=kD+%wikOcv!~B`#f+pA^bfxi#MhefGRngOo=hK|<lwJm=ee2*vttsBD#%qJQ*WJKCN -G%%8L_Q|BqrjzcsOV@E%W^PaU12I*(>)mf(pq?rROUHm}^Zlr!cv7>iW2v=W7gc_8Ry)|)<!Le0DTbe -L7a6=SpW!?DHruaTb>Iu??i{GsQ{4!u_CmbHs&ctuoVA{?a-t}T<adSbe<gL2RI^APrqX+GNe_B$q%J -e6HhP-7=3+qIL=S;ufizgSICF63_DCK!CQkh8CH606rC=4=-S>igC?ojcM8BJ{|t>g;Qi(_Q6M3cfzc -hxe>?oHx;(X4<Bw=5xK92pCafjN=FW#SU~IUY~Z!s^fLgz{*wMUY$iLnAz2L+PJYGR_<mM(p;sh;muA -XNBjt@1q=u*5Yx<{@8|6kK4$O8eKJi1sT1Eth*uA;>jz^`N*Ch*Vbm_^F6aJsn4l5S=nzJ3iEdElIz2 -QZwtD6t=ciQGsLN04|WILLxVmm`nI$>Ibuw>MpGWwk~hb^w|AQ4V<9{@<(SnsrSzlNKwA-`Psr8pj@L -!5d&pV>&h*XP3o7AwzXU_oUA@zOz#c-NCnAn`_=_hB=G3gwo)5PV#Xq1%@<rH0Y1jYu$bRD=O_O$U`l -$!?-#<w?9{(rH|Hg;g6B#J(eFOpj?J>UK!@qj{4?Gm)tvZb2G)}`CVx$oKLx}?-eX}G}AP`K1zr!iOc -JSL`U_)iuyBmhQ-RdzQ&-)=t1dej=;$s-U`&!ZGI^Bi|x9uC;+fe5Q=(aZr>EEdokV}~G_c#R_i@zuw -lHlz&pqafzhBvU6WWaC$d!G{gE@W=77DoZr#7S_r2@SZOfZv&dY9gM3w%CSNw~gCd0!nBC3ZmPuG5l9 -3Q8}+X&z;k6Je0#}TcyaV52^4&AJ^{$`M+W`?<@(1_^D;Y%?5e)r3#eiRK8fRzMBV_x5SM%Bs^DKWqY -|^Hn=BCFr+H)k*PB9kveWZRTDoew|(95a26e)fBQbTZD`gRphasn${d3XyPxDQq{vz0tc4T4KiC(Pcs -R57FKsqeG#}eOHz48&sWQ`S8^-AUBD4O|D$_qpB7Pg*e9HtaMp+@>l!t+0|F?}>yv2VmU3!LVOxC9}R -K&G41K-{vrj;KQv%Wf92_;+f+dwP4-H__4Xf;q_07ILfiXmnZ`QCDE>Lv2U&oz**`?ZFxPLTMiFe-^t -&27*cGX-NgZg5*(+3T0SqgYA8cA4KFEO!@z(@U}4LTmh`+m~BtvF)@S{chwD8f?EaFYuxObw7_Ou&+; -!MEO^A4gEE|=110eP3AJNe)S+D<>qFgxtEJQY9>Adp>%KBin`OfgXMN@d0dJhBK<YGIt|Srl^|VEX2= -%xc3>}qbep@N#RI9QyM3LVwI}2q*hTj4I|UyvC!d!K#~$(R4kRm{*QHy8l%b**cDSBWv8qqL(DByo(U -k=b%P@snkT4vs4||Y>*E8h1UJpE0c1JnQu&7_Ay`|*XsX4QZV%U->-FoD8dLX;YbGAe!VXihr<mP@0d --d5bkRfg8dxc-)%v~H}eg#~m@8~5-l4Y;;=&8bTBE6WYW>JUB@r8+brbAazQsVa5xyGsEFW1U6RpNyO -Hg6%Q9XoATBF~QUn5(mMH(1wSlx56@11g($tAU9Sa*|zp%}3*8fPw!sR?^e4tdBb`A#wp7Yx&jh@ts& -K&Yh#vUb#zZ#JaY9Qu-R9&o$)McA{C?LAvpHm)ab4f2jMm9&<9Z*^cYY+ItchhSWoJ$dm9wUmbx=(W& -=)C$z~P+97B=U(5C-y@IsEnMY-j0djZw<&w(qjv*{LT@$rMuJlE=+Hsr~3!dr>O^*jNo(agW;Hya-u- -TAb-QFfN?YXelFn7q}(>S~Akcnwda(;rlbbRhy{Z)HSkqm)`l#yPP&=Qi|h076K<EgQnPv&wUvSB>k? -{U$VFrH^G6)i>Pusdo@!Xx8_%3Z^9Zjn(o#RfCCgALJ+#*Mi^#jg^WDi?tUi=R(o{yp5xH@FRos46E2 -KUqKQ9H$qk1F}=@?5^QenLc07)*+SVYRc2M7)zo~4u`HhhpOz?{h>d;pegdmsq#qtTMG>I^9u7%7Z~X -073QBVFwoB{%s*XVK6{?sc;4bmw9<C1E)Qt=v4Gd<6Q<9%g?};yb^*m^=v{5*AJc*TPTeaPeMSB%8Tx -4^7pt~wmR?&dXx{yz&m{}!mo;9Eb-G1Grl&#BJe88srA?Jt9ZQC>uUbkb&sokUA3A9}*hj-O95P|>P? -cmi7`PZG?B<e}em=FajOgK1!F8@+PyG}Ic5du)OR$fv%J33I1O(N#I1?A<V(k5A7GFzcD&c)D?KOk$b -ji}NLG7ZeE+1XmC(C)4R*`G_t^7Q`5Gb$1`;+A8kTX`Mg(q63??=Zf53Rsde1*{MDKifjnc0_P$uc+R -z6|i*b9X9=Hg%{#(nBQ;@)fFiiRE4Q)Q2rC?;OMq4e7|-W4-d&<F1RdT~3jV(rd3AX$3(#KIhB5Gf}8 -@IBI7T2hLZy_EsQ)mO6ru@6P8$5U#4Xh2-1n$=3&8g(qouFiJBrj8xO%G!RHbfaWopJCj~$v*F~yiN` -EtrITRmdLuE(t?c7lt)^})ZeMbt!?HtoA5F=O;GO*xaZ83?rOMCJVNhRs+}|W#ezh#k-!+PT7#H9&-p -?w$#)p+t54U@>eVELB=#H?-b4<UUpHNx7D&|Zv{bJrF3l@hH`<krUKIvL7WqhqNsgNAcwcg*iFKxol& -r!a2g5|Hbx<P~#%8Fa?a$SnKH!yjM!*mLT9mDHrH!7oj>v)-_bNR)d=IS~${(;!m_={<v$c|y%o1H^P -ITnp{InlT-V_oghYd=?B7r(6B>n=gf=Ln@gvYT)S<dF}o=$s~$iQuKOuyZC{p#(0if5>|K?F#_^%0K) -2*#F-h;YZ%vuU`El|D3=P0zoJWL$;qZjWZuI-<UV<&))T282KHJ0fj6^Kt&ZyIi+u`3<L5u491{7#Qh -sS-}X(@w{F<mUK%3+=%*Q=X%fH3v4Fp24A^QY^Ls`D{j_k)GJb{o5e%@@wxi$}K<c1WO#!ytcB%*o=C -HOL0L6ji8HEBa!G`kTw~8qhfj2|na-?(yPK$bbUjqy46p-q-{38zk68Af2fcxd|_~&;M-rc>-IURq2` -}_YN;{NYg;AiCvy^iMuD3mvh(rl;qJ!y}JKe51tuMTBzcM+pBX7if|CT6VS41L-7{f+r2_XYas#{84} -0)2F2{>goTKDse~eqVl6h=KlGB1Xu(*Qq+TFVv2#GrHe%ucFaSSPW`UQ^+|@phIvwn*JmkH$n+UQ{(h -4iVEQz#|z`<^@=2oWS@4nw_LJI86IO(ieuME(4-qLrcOaJ1(UCMcs=M@Y$tS3ZFfIh+Nio;f|gV9o82 -5<xZvQWHhS%1BahtTDHFbG8XTNXD74PSDbUptHezaRB)tjtykK%{-<Giu7RLuw9lD0kJJ)jps%=KU%y -$tUK2@1gDhY>@<izcB&g<30CHd4cZNxB0^s?9Dp;4W^ZZze{$iem{d<FaR(5OWq5%-sE9WPnA$dK~58 -RK}c3zex&GiT2Vy8RiG@Njt?WZs${Yl@`Lip!kH-&y3*≦pkI3QNUyiVhLTZA!ld%202s*P6K^v&K -Pun!0del(%L+pm69_#S^jwx(N&P*jo4+McpAridlfqBrPp~>W97OXQiaXjJEnxowdh*gDSA(}}=s79D -)>2XE_^%eHh`4T-yw%%h0Bq^{IiqfjT-e#vTIjQRLm`L4KNhZZbobvflsiura%tZ6+@!nt&I_zafQqI -eLv7)p%F&#w8eRwkbTMz5hZK`&csc>dg7ZKK*N7}B4)2+yN`A%$yhw`$}v%}2H1AZ`%V=FRR0Zmt#a< -+A=gk{5l*C@30y{kE~s+!k$htQ8qpZ5udIf*Iw8y*Sh2XjhY#H;VE&_8l$<zITWRHv^JF}d^vvyRvDm -&4!2_q+&*;~avIpRw{9&ymn}-GI2XH=McB9WEu$;h$h?$*IcKP!&J_X@BU47d&OIe>z;ZB?q1GqX2^K -x$lztXAQ;ku|kRst+&vXXCE=@)v9bF@m;H<yOnRbz_#*uYrJs9w%BZlKmG{sj$l9N(~i|FzLkE#(cLr -e0%_zJHdYlkS1~fUuXD1F<pMbW?O;&gaA&;|2g8Xc&H6HJN_^%bPv2qxH^KR*g2Ii5cuUaM<kTV;xLp -4M-v0vkp?{0_e_qnQ;eC}?GfYUUTY2TKw!9~}%QF*4Y<`&GzNLj?)-<KMqhk1smih|0k75#sE;(g><R -bQn`~2<6HUxEiT{9y<=wu4WOu7@{j<i!&!}?YfX!Ro8Q`^2gR_KE4d|kfjlbfCzt!Jj=sxyhtR}Tw;B -OE<S*TwK&iXJ{Lt!&!l^x(S7zE7?j47B$%l+A~ENbM>^Ghbagco6EOIp#&XlbMsNhKbfr9a{9RglOx2 -PYE^F=wf!s&+V1fy%h>kBWFrU;)UwSDBR9cxbVbqo%O8$H+65;<R+SR3*YlA`kwDJ^VAXV1qcu`LQE2 -O%m^Wn7{u`F58$C}SGw%#?l(?+5mo85QVdec&)RE0Yp(^L?EK9>5F~!OO6eBm)Ll!DP@PM8;mYi;GV` -1O*J452%aS}xA?;g9${P0pzRs_HeMC2;_kBs{;KndqmeoBxTr2*<qE7Q119WzIJpt@j6+XK=Pk|Urki -~Fo&zHg+?k9#HUayzrqo?K$D(%a#@whJ9BM1|OxUyODB_S?j0_=$j!Y57Z7TvJ9$UMwj-KomGu4~*r$ -=)ko9<$)ID;*2yx}Q$vGCkBxJaRHbv|R(}u=YG#PddufV`@WUUR2ECTG3r~MsF&Wj@e1aeJawE&}pBK -oSN5j5;w(PnnA$x6nN7IyW*_~pHu8M5pU}a)ufX~E(iC``+lIh{_6A3>3uBAS9g3%hdgWgu?!rLBVS| -yz)U_alWsWEMJcqowhtJt9}El?0xk71v@~HdL)mkBa-I*8^1O99$_+uYo)Gu@<$m)IK1`DN$7H4SgMh -(if959I_|OaCKRne}0`Qxs`IZWNXuGpk(pdO8hkh;hQ*w`8O16eN7HxATYf+Ew@xaVBZSry5zsLK9(K -b|qewqoTx1EEv-rm$A_`gVW@4WAFjTqg{{*&!ebo8^7Vq%YvindE{0m;!uBVu~DL&Ud{nr#whSB@~qC -OXD;hlgz+Al)bm5pJ|0-OV4EJ()O+H&bPV*<>ckFYA7O+EgJg^beDS5A6~UT)zA{v<VRSPfPN8q{G4D -7W(&&9>O;ojMzC;Mj2seI7ZJ!baba<$zH!Si2%V(-simyb^p}M{u;k0jM^9X`niyznG-fhO6~6>gMiO -2_0@L)OW*q}68p%^_aT9pzIpkq{{vrB0<Ze_owPk9ko`0!Xj!r_Cft^E6rn_+pY>7r++hQR@#(C$zM_ -h8zxq?9pPTXcC0TG1r3gN6r8@DcZ2xK!F>SiXU2V-ydUHnU{PX+pVTM#-|2YUy|2%v1V{7W;*&B_Su6 -a3u)g5N0w{lcZST0mo(pGsuAR|#0bk4+`iD*2fp0gLzSdsHOz$kXOPK(TSmJ4z)H87{=Nki_Vysj8WF -KF?Gl>lh1)sibqxR-YYIzE~R<g>iW4xwG4mu2$cO9gL*_sSSt8>wp`vKN)?%!X4e>RgXAz-Kxe+}5(& -uX>{y&qpnDx?;+Ez9iXZF<}NdatyAXhCa#kf(9wJbxGU4KB}`~c?EF1+gy2=pB8Z~F>)mHpfT0hjbCY -%NNt$bC99e-HQi*MvJp(zhgrPd^~zusUm1^Qpy&HhEt#Q9Z}E*4nVNA36fyd%f<l^^Twhd?o!^T&aUF -kR>(+L}ICR4W7e3A20PHV94}X<;2#EYEEUefH<{L^uA;Y=iAnQjL&7t(?vp0tTMGykX9v8s(WB!_npg -CTr#6}BQCQiXMg&8u8-$wb=7(Vg`>XgXS((}au%{>Za6=XP}RhOg#!1P%v(7hu_q<Zd;7qE>7bvm|pj -ji)j-PB0?GzhRI45sUF_fk7ppa=|ccP{>AbXp*n&GwPYeShX*RN*B~GFa*&SB?6}D1~f8P7ORdJPBo^ -JT*jstgC0x$B5w7l5)xhK#$I%Nw^EK+N-89h(q%WI;)m>K*%x?UD~h9%W_iF5}^*mNzD+NAky_EbRK% --PbQ$9*ter%SeIs|Lzcn=e!5)eL0RI;JSfLdjbGN+lrp{LcXwUk1q^+n1N^w2tGRy306r+fyIL@^Sdh -QtGTdgj^`rJ1Sog<soir}$rfTxr&)kImd#C-zf%x}M`AaxW$V~`IBbzncW<Ip{%}8dmL|Ffe!_6ixO} -4?(Y=x|kJ%?6cL*hM<Fy04Gqpcf<eX<%NHkd_|4ehes=V85Cf^VL4aJEA3&qS8H&2SuTh??!Dc$*&tv -hC<IdkVn{-zc)V+pYH;W1A^nl5AI9FP5ZxE-$^?I3W8*JGP<j<|45tGG@dt;S}58wDW%nr{#YOP8EkO -zrv{`8t`>vGQQUZ2hI(Aqlq4S7}_(q=wHJDx8}{4W{>Lqam<!i|4}60Z^J9_BfkCtuk>%hEAS(}{s~@ -fca+C3@H%bI%iCsE6&<bIJ9;G$9*OssoU*>2KirNsV`cVBIZ=Ig(2sBn{0eV>1-HN_yv6#_I?+r6(QG -TeeS(qE03q;~im|BZA6MGb_nCTf+~MY)u*QExSkr{iS<iu5J1fZ|KfO0fQ1X(<@8^silA;1B)Nh<FDj -vkmUgAQ0d&#M9FSM^b&zya81CP-P1dz-CB1C(zp~8!+_;AefOYGIHbjzh=g=$+Py8dL}yOVJ@u!lXG) -A3S6MdTU!^#vJ#H1_4Nyb=(a2v#YIM5iD5ohxZdnZx34JmS{n>x*tcgLaF>V7&q8LK#`$@c5HT3?QkR -G^ucSG;hB5e5f77K~EiJFkYTAMLOXkeFl%i%l4M@BXG{mV3ht?p}iN}aJPp6DTrL9w`5MNtp|&nL{HH -pIA-^g@ZGHIzn?KIjk;cdHR^ECBq2?Ms!bD<Er)dVpF|9Q;4ORhv!-%J<6S9t>QR7)!l~UP_ub1NG<O -uaU99@hsHF>Zl8e*M`BkTOc5AK=H@$XneC?yBo7+#BqqLhEVBLg2;-OSrUbzu`?KTsWlL)U37=V`vB) -1LQj0EMr`*v8~0*qB>r$a5~7)!@Er_Xg`uoq19&7>z9cNB@{K5=}`ow6LDYsh`&Eo2oiMg>k4h<96-V -jNy%(3C}_s!wDngVRjo*_1A1Em5bel_qXR*Qy6nfu{yp)##~jv$?9QYQ4QPez3&}W<*9x?tZ6M#VKJ` -_Mp)d_SO#mSv)K~n`a4=@frd=^yjs#;TQGff*5rOqduofC?P@a4%u?|UUo~l@?aKz4gVW(`^81?e+zg -2d*}Z%0RQf}e~H8hwe1^iBD8GV4cY?d<2`&H-@p%xH+q=vc{uA|L-a!=UQu?Xl61Ba;?4Ca*~V8>cu& -gN1ANGE+cMjn8R(sH(%WFf=3$%t1c?c9JJ(tetQA1GkKoeO##=*t^Z8%#c*S4_-b#cx+rCD~mj1I%Si -sxG5Ns<fRwPE54e;YVEHB-~ammW!e~rY{X64YQzeM5(|Njz+&4netAo0pZzC+?~yaoS0Dg%GTdcUG_k -pC2wfxlwCzk|xax3K&%DtDv#r7OHB-=i|>%|Nog&h^du+l=`4+$aoJH#_SEy3~z{@Ss9K^Cp^;v_RTI -(7AxZPr&T*Q|2sKh+Xk3b4Rc0ExJ@An``phzd&dK-75=^>hRp#k0)Qm>FKIjh#5hVY$p#Cpr@zb-Uc+ -`oOXe_2R^+>DYy<{*<UNUlDs!vHHtC1_$e$T%N@})<&HUt;RNd!hzd9z!{42E?e$kS)_a?(d!{Yh`pr -wkIg1WgopyXnZgYKv&kRUlPp*nA?W8Hk$8*S1pg0#wb_~pBdG@d9G8hMv<Si4|8Ac*0u`TUO@SsT!cD -<wi490@N5B$C2izw(~s=ou|L*!b$c0B`>G&;U@w@9y%$_*8We&3q+B)W0pa=D1R2hVwE+35b@M)7YlV -o{kg)&O4so5Z8K+~lS$di%M|LU82&%8kN!g+hYXi8(#8VAf?I8i``gPyrL6tI<dX%JrNUFgX^-VYot4 -)I`PYa5}AAmR~>_?nXP2=GuEhMLHW74tS@e9W4q>KaU5ELJwB`>eV*RGZ&@P%C*Ph@_J{<tFnnMQJ|B -gIrC&4%Oc_C(+gRE*EmFpHTCBxH7j-AoCkAQroHn>m85)1N(g&fmWVBf^m%REg)U>6!lY9&M(NDm6W} -KBr_8-3&_qdiOhGd9K7tM6Ij{SHfaCMIq+lpQDAf+BmoMIo`G#tCiwbgZpD%|RfL|!4UO0j*m+(6K8R -XwE-JC`c^VJ?j@_>@lS*xF@TD;k&uXz`Kc$gH*r-ietg8_8*jr@H#ifmJJe2S#~EZANFY!iF@@q-_YC -w}jcuO1U0KK;9tI})Zbf?z0$A#r5$kN8jrPJi;u4L7Mqy4(BF;f8GCZsSMnX0<f_S;7&0tOH-4vU1sI -H%Z5d4KkT{qnc^F8QX5gg7CkRc#~|C>4vXc&<?trzf(Wcfn#3;<-3hx{OLB}9nSIX;1$&2PdPg2F7w{ -8pV(a~Fml7^aL0aT?{RO&itz4)lx=qtQon>xXIm;u`>TOOg2l(R_J4Ml@k1A+Gyj8u#2%6Q*(rPT<U7 -FPW7h$Cp91K=iAUvmF5rSsiiABGb&JyBBNW-T<;u_(yHBVljGH-x=?JjC?e$eVsEwaM?dxOvo%}iN_H -W(^@a0zibSHnuj-4s`Q!vJDbG{(lP1B_DIOCWha`&^MX}zMH9e?Re>@`oP>Ao^kF(ZXn67hq20;GvN9 ->et2+bD4vQFVNQqH(#;TGYkYGMhWES5I+k#2)mtTGA!;G6ii#4)myc(bpD;LRh3vt#_cokjOaeDR<PF -bW0z5k|3``g9!!|sOMvHZEi8>f>b3^slkeq<R&L}eG^l;RUWU%5!0bPu;6g_NG>y(2YUC~8ZqVLNiZ% -~k{dO}fH3I{QVo5%Ch>HcE7C@QS$YzvtFD}viJ=aEIHd8&9shmSo~~4kqyF#{qMV&e#hK|g!+50h<NH -m(WjZK_R||Nfep6XQNiHC!8c*bnQzga{g#H(PxOH$kx_F<?FB$^s2|p3R!+Rebw37cE1^ZW6w0+Eh52 -M}0TgR}Lxx}mijV*&{jenUROp4wDU#RV#gE8kq*Xw$H1TOCBSln<hrsPNFg3c?71oio9<sf#ugw$bjP -{eKi+i)iFMO~lb;%3Ovq|Q0l1x5+HqXoZS58+DRO{?Z_uM2!sE^yss#GBIeR54ZzN8FI*JEZ5|0fN9I -bQPRiwia5qcMk-#ZO*PaUyhx3vsC)}o=m!RmshL2;qi5I%@b;Z`Eb^?C@61F9SLOGha(+_jgn__z#uS -Zejwmx*j{4_dYgtUej~QwiX!{Gz9mf!WB6WlZY7=F6y5@Mgt#&u-4yi9^#Ih>(+nctZHsrNMyyXqG+X -B}DWW#QX>Pe<lv+8%B{S*YpG*1{06wRluM6mJL(E?s@)5-R@$~N?h9M}7Mro8nw=s2!B0lse+G0J3tt -Yxd!n$ZPyOj{WZ`9H8zi?zX;Y;>u?v==89}lE6+q#bKt;{Vte5X#^pc1i>w9VcQ-C|CYz3aLXt5187T -ZYHa7#bXI?b{8a!VLje_C@WMd+TBA@!JRzwqXa6Y*S3@>DJ4vAh+2m5gSunZ#dc;rSP6*4yW5J(t1b+ -@3|kpHrx9VVlsgi%=6+tZ205kkN-Brd`;gDeWLy|#N_j*)Q@i=W`FFz4>8~0$=`vPUUqbSiieOmcOfd -;jX9JH_HZ53cXOrIJpU{NSEdfu)fz`e%+9Xw2W|_}4V!_h0*_8N3q>k-%S5J78MZnWBWEK=s-j_xp&< -Fb^v<OC3a{?~(mJxOs}RW?KaPeFxF3x6(WY`D$GTL3M18}^7oxYA)}yDVv96;xU3$r-WSn2Et&$H*7$ -X0oy>I7-XP-5|671>7WX0HASgc^7Q;Oni`8>(UDSo5=C1PsAl8#0ep&p`>U?bwS%uvj;XCHjdJ^^x>j -x>+t?}f48etcNoF%|jsEme)tBlD;L;U28tL&>(~%MX=f+;d=p2*yJ?;dOFcF$zN&Mdge)78xgT&fdB% -wkRzA1;lU@WD~>^jt}w%SeiYi6>GVYBg`87A3@Al&vjO=E?p6jFI{7h{t-PE=TK|bEDC7-G@$PNN<mO -KMRzANfu5HKS9C+eB~S|!a*8l8r|?Ft$@uY%^q4*%3S+GWgJ`?UQ-JG}JaL^Ec+cDYxeS1Hg(nn@VY0 -dxh$WH;YU2T48*_@jDYxToHO(K^k;RUFX}pNacZ*Ygf6GB8UZm6u04;Bz$SBWD>MH$lTB%r@i!Lf9K8 -pED5Mn-Nvnmfi;2StD>3t}pJd;zgni{X^@d0S6foZ3bxQo0Ii#4vGD*>a^oLim@Y)?tV-N~T!7$^|md -3yv8$|(|sY--9(ItMrnOj!C3)SH7r!86B|oW8G|#Y93@v_*-#qW64?!B^P7neN|%m{XfRZo}iZ@#SaF -{|H<@KlfW?p=bu9HcWvj495s`MfDGDT=8vvhIi}qwek<+O&gBEyF7dsyKEi6T?|gIJmh2YlF&QX!8T% -&!kgXQ$`T@E8#7%=4~cDdBh)7kR&v8Jbf-D%b<m%Y7iynB#j<S_7NfRo?v;JOd%V?ppBuOkn^<PO27+ -(CcPr{`VIk=*cuzNvlob$H=vlE1B{o#rx|#dLE4Ha~era`b-WowO`4w5B>*$`_<Kr;kKO&31A&d2+`` -xeC^FQJ<c+U6}vRLuM>%)uJ{|QwbcKJkHtUplY(_>%n0{DGY`S>n?apUC8p`r-+j8h;rCNJaU1ZI -4uKS9t2tmmM{UR;!xP(&V)bO<w{Eo+3@-cli}Pa@je1m2X%rme3YlMI+lgk*PO~)fO2FKRo1u)$*%U{ -?)1YEyt`OdSd(*9np9DhQwbezh4t2$Lj}RF^Od><#vHzylxPD0EX(vP#vYN~^x3FnJcoT{g40<xMI}n -fSLJaFtKaMyJ(nw_-9qLufi<Lpce*uN8|dg$5h}9+N)7Av6zm0F2U5>F=BpYuZfjzHTMl9PpoZ7AG4! -4dNL|mLZxB8@K}rCUZcQrVWp7cpMPd%Txq2k1Q0P`XDDERUp0t6U`>E7?(zFsKftI)SR4wib_ZpT^00 -o<nv7#h;s+Q-x%&?dZs(?Q(IB13J{XLw@m>cfHqa@BxMz~Gvt2TwA>!2FS!r=&bph+T)hbPpNC+`Ks^ -fypO;q=W2Xe1Ufos##XXN8P)vXdbyN)4tv#*l4LlR*izftM5<YeA__FDo6bnD_73eo(TdXZ+c-rT5TJ -I;&)qsJOLGL5&3`M>xL);)A6gHDv?D0ORB^a#A_T-u=G*0!EBgNSW`r1^1Z;c~K;t$1TF@_&InU*yAE -r5>ZTYn`O8h0tciPd`H1LYRW_JN<fiyOy|W9_$YY0WnXX%__WoN+7<^!Rxw00tyIAK;~V87*tr1aD8k -iU%UM$%La-I7TI~i30?F5_0gVOi>WA7tzW2ZVURI-E>u>g|%l-YqxPJRw3lCwfg3jSo{*E_1@P~o!_Z ->%`{Tiydcra{T?>I@Q%WL4~w|+ax9bAQOFrk1dBgCspjv{kG+;@nb&0Icf^tCW#E!Qzoc*Cq`c|`$Ba -c|q{Nq4UEsUPbbgIA5d@~@ttdGzkwR1Yzpx%}*+tktQ~H$v>xlOzpxuw~qCdFJ7#8S<Xl5;Xle<yidE -W&{V&ra#B;r;wM%fjl5r1_||R36fTOh<R}WwTJt-h{nqK6+C;bwULb)1BaSTXOEE2TY#>v6p}sPUa`{ -~2|-pMY?>lzYlJaA!$%yE2_sAhIOT=hc|=Vjf~=(VL-BiC4URDYm(_9*v-Dwwuus4iH%JFoz2TD391g -|07`l=Q;v*to(1UqWpPnKFMqs*;-;h(JS-^llj(6}D%@$2Qu@~NC9DaVcv@t`~t#K9%!UZ%Go8~~@@% --U&z3<I~aIc1*W}dnT3?Q<QHg-;&`a;Z3gbGAv;b01L7V$>B(N?P6Hj=u(t}JmKC6ql<MOQ+Nn9I{s0 -<Mi;E!-W>kKodBZCOJcWviISCRN?Ps`(B!ebD;zU|P&c)86aq{vyW|dM*C?$q#AZsD{W(B;g#L+R){l -npvh1t=b_K`$OhTuZlwt^^-}9wD5x9@NfhL^VxH0xnnkjCUEYLiD<Nv2wGy*EP|rB(K1<5cjxhjAh@C -(1^77l^WnuBClsQ_u*AGlEF2gtAu<Kj^nea*)f~^`)%rUgARiSr!r}0@i=mH>`HO;Rd;WKH8;21T#Tl -5QNo4&4B|j{Rw#*iIvrr?5J$w?`3JiwXsOw6=5o~L#t`*N(IHfBMPd=6=(OdfFTDj~Ddh5b&H59pdt* -s1xvyO{5+xrmT3Y;zaCEE5!H$~CUl)l?!9<s@Svpu_WrQ2IDTeeAtSKdzU2FA(mH@C9#_5RnAi()qO` -;6W#=hBT<Zw|-d)?6lb-x8YM%BQu6La|>JMI5vhMOXiij;<0{w=Ra#${G*(Ro;rCrG(e@Qy<UH_nV@? -FH4a>+~(I(B>Ao&+A0y?ODQ4?9&auCJl&-8?4+0X$=Jp{%JVi)2XBSaHc$8EF<o%?ElS|~Jxc4-;Jsz -3JllVNwa<3^pEJ)dmLGf?M)4#C*~2v@rHcFtiEK`^V0}#X>6Umcj7sxl$sCuvZEjhtoEtZmwG3UvBQb -z^09Hl9h+^`jDCAtY@#1SseF$Q1!7A_cDv@rq$+zWRz?*ptySH{PA1zn#sk&GOZ8AXD!5wkWZpR@g2O -b_YtP~vP4fEu=aYSzp2{&<y;!s^m-B{)`{_HDtew3RJ^AFJ^cG%7pIdTGG*uhz6c|Lp-ED}=wiDysW4 -k&RB%WpWg1yce)CR1`Ht8#h%`L(Y&HySm|b9c66FNe&OZXy@9^!f(1jC6s#4hWklpAHF3@P&hn9&}us -a=L-boZo4Kz%B$;9O(=#@LE`*SP2UF<hlt+!sC7RJ5mO+DrRbtIfRfaY0+iOpC`ii!67(3uf(-WanuC -+t7Jr@s;7S^_;(XftSiR8ex%8le%+RnVg8R>-<Gs*zEfuGgT`C-#^(dSk7xWU!T8b0=zr}hU#*UQc7< -;jLX=`C{KM(yb)`#pStbr|eL95xtjWa5jo#7BmbkdCIB>R2BU2yedaO)s<$){5Tfd^a+xdFv%H|MeTM -AbaxN^U6k7LBb?ZNPqCX@UZ^D|lI=D$gA_dtKzQ6n~*hwqCTh3`62bkk}^d&3feH!8cWiF=$D9&W27j -cu1nb_dTbpoH3lnk)NVUnZUYveh_jVvv{lW$oiR!C^m~YL<TR)2KKd&~15?zbg7GFM3pDa5=wMo>^Vd -Vu;Y`9qd`|f0}mFgo)sRO}CKv@JIQP-)b19m7?We#2`m^*LrNL)Mq|-^zO1iREd<l<43n;cYHR|%-4l -fo;Qu7vFO<6K#+Y%`O9N~Uvl6NL&=uI3pf41ewp42JfC=`4-by!Kgm^c;Inf_tsg#{15WF|&h6z$+mi -mBEae%Ycy3)hINZDdFK1$V{{Z=m{Bo-JFYm{v75Q8R-!wqCpp=gqpuo>UCvm7}8cZd}H?N3thJ>SN;y -%H0)U#I*1Y(e`?~qmkTn}uYy!yCaQ#8uKBV4j8@hmT)mlj99O2WsPm~t^_`Ejz#f`)U)w&${uMVjJBO -$VIIDWXZ@G$E1azf%8}waW`FT^SDog{BpSn!Bi0d5Py{3_RS(L@N@>4c_)EO()L<IPQJ1mPhZ|rHB_V -iqZLdTNa8=PiPU)#5qy#^;=$lD&d)F^%>-M7qIhdO6cLJ)q%UKV9w#9-1*{-Lc9**cv>NM5b-&a$lZo -=D?)$=(l)v`c+ng)Zb6C3;rQ*t)_N6yjZYm`2)&5F*&y=gOYx|~1ef%=R9)plJP}9p<iI+IHDQ0>06l -$jv-uHKzOw?i<fOwi4x;Z&cQL4Fu->LB7;u0vpBtdSM;*`)8=z{~w6<ol4*F;y<^~J5<c1J4&`E`WGh -^J2H6z0%`L<hO@LZukAIj3s(gUuPut}vnpAeSU-MaP=THgGKP2Pp2Oao+QgTl$zK=H|2Snz7;BKP=!d --)ASxEQRqAl{ykhmDAZ+*VdzUlLY+GkAS{qz@WUn6p$yjd3m}Y?<u4q&@C>Y{#l(@y3Z>j&@j)76SJR -d70{{QHZb%daP*Q3g^?WE8sQ85}Wq%*vpd@HShNgcKkYcJ40dS77qENerq@t466KWcO5@z)=Ryiz6i2 -}r%f^dW7oP~DIWKV6pF9y7c*p!ysO#LeRl4_BcQseMPELy{Hb3YB<pbE(cf{}lQ3r<e;-sGe?_(*^oi -dA*9v<MEBmbRe>Mno|L1cy)eoroADre3EdKHozYIy<+&AcL<7%zHGiFmuM0+IiN)J|KLDEesu?_U?)* -ck|Au_H&wAqJHn?N$b_M$)Dx|%4t)$=Pftq8V$T`Tzz-t`;I4wu-!aQf#V$;p0KDY5|{vTp~5>85kst -Uscy`d>*4L2epPINiW~GmJ(y0uwRYt!}dn>836rcHQQdvqkOHWXsn4B{HTPGCs^-g(PP`poi-%f(?AJ -<2dA_;t8VS!J?_T>jM6VvR~ub<ZA+!Zto6EpIE{{bO8@GxUXSUe~pe`z;1Vo*7<lgczppr*+#RU(auF -o$0b&<`|x%@x?AAy-0nwr3;gVM*G24SR@2-kFFaxM!rOrDFlM!iKUvcyUh4wp+|G6(vIUvYzHhlH<(> -rt1K-Sr9gyf&*caHi$R|)-EA~_r)<s=~C0(DaB9ID4za_1#Mk7=y9(O9PA^0ZpK{&?gyAZ@8_pM2+tx -U?TPUhkslq5jKE?TC5L!TTIc}dDAGaZ^6YI9s~jh6vG6>r7MZB0Yes0}Nhj3sFO^I9wiG|$otaL&fST -e>y^&l00lB2-`#sHEkMgE2{*Pq=ig9u<!_q63{34wV^so;tJTT8IWIXaU*_YF~3DQWG6%2s5<MbAE|5 -Qh%@5t1^alY>5dxy=4e#XV5*}mfWE7mWFchTCcx;0P`n1$R1iA;Wzv|U0LdNKH_)ji+#gRp;-L*0Rj3 -QU^~A|v3ryWsrhf^lvXx>JeTEx_aDROItBRdAIx5-2<*x5uv5}zx9BDDY~hAC&bqhcXgMgMJZ%1OgBn -XeT+~B)0Cb^M?hx}L$Sa%S)#1@!&xCg}HF}xR{31YuVom((n8iz&6|7<sGNM-I3=Lh&B~=Gp(#WD1;} -tw{PnA8Alx4Q%$ok+{zSSFzd%l65@`BF7k+dT`A0AaqwFS1sL?@9b4^&0L@U82bS7%bqd*2WQCDqT_Z -_Fk2p?7~;ti#K@I&hSMC_?y|D#(>O@bp4u{JRFi?kQbkg9Ht8{qTUeEIWl!S^fm`sfj-q%z%yucgZND -g%Hs=G;uv&3;32V^JU8J0dQR@Q($Wscv+6bm7HCAQkHfcp}I45f~TlNcJF6eYJa<VW&V#X98CQapZbS -AucYeH{o`Q%^Z(NverINO8V@@LZ7RZ{{sJr;)*M*$TO|80oa^ftz+XP`my&-n-djS+)_+<-VWm_n8H> -=3q$T8rAlud&y6HBOm1lkIVMXj2Q*^vx;0iJu>%#V?6TLN>;$6Im?33j2`uJ{1wE|8|t&HtwEDzZy>E -pdiwV!e2Yg=40u{E~nJvjjhH$&Ta59eARB;gJIK4CFNe&&Ga9w)i-zHo1f!MlxBM*b4Zk`2o$@E4MQF -8Ki*RF@YjKtJeTs8H;}9`C?k2#S@vShex5er0&PGvl2jo`oOT5a6QTX05oZ(RUNWi#L1&4m+x>r0tuz -Id|Rzuy}Scz2*Y&j{M_;<K>4&oL#Zs4H`(IAzCnFtXy;kwnm&R8pOt_qLsB-Fg>gc)IEO}f804zWmKE -x)JD!ed)*={sV#vo>}?m^Zvgn4BX6Jd^sEP%o;ta$NlxD5Fo}rWmQOyoa@qu`{@du#iU}WqJU5p&Uml -7D!-$x%NeaEBW6`_E7FePROr9VJIyh>mEH!4=NmzmRz95%ezYw>eR*A5GA=)Lh0@fOn$hVsM@P;g0cz -QbEu@}r3&SH*rZjeMVFJNb^#`V|o7Q_fAy;l%MSnzaT6*<IZ8$O?j+q3=Q(IH}fw}8UnUMuT6vV0;D5 -^-@BP$SV4zp1VGt_*Ko;)E=EjK%qWOb=9aJ-1|$dFnlsYO(iCpegID(uz@<bLa+5?B!wdCs}_TpH;gs -L=cv5I+~)31R<(m_GVsO$@UQIE_Cb>+a7^%G_28vX|YEH;}C~Q*8OyQOJrZ->ylJlP|%hv;XDy{fO!& -BieFBD1$cjM5B^cA06z%ob@OEityYO$oH|*TYlpj*1!fadRn;A|mvTW{)qeVE+R)OJJVhXGl!-4}dpU -x2uL|V=UGFvBU7%)uES+Yf^lU(qM6+|vMIyYc@Q()0phQ!Frl(5`H1|9^I-q$6-xFA5!{SmU$0;5%T< -%!bf!t-eNgj24QuD<@bCOB#!{KhCEt167M?nKUgqF9)&fB93s^dd4PTY%)hDi0UYt_JF%WQPCOTPO0d -=wt@nJOKRQeI~Qw!u3u&H&=x4@|CA3<tHD@$kK{hA6ou9&QF1UUPWmj&`dCDYhTycWA?Djxvw8cacX{ -lFu;&*kyg@+`IOqu2>#=NvSr=r4gD;O&A62*tUVO-zH*GT2<)^6aQe>&qMlHzX|K)ALq17!!|DdA=h1 -h>xT_Py3Zi;4-`g_6|(-$ksG!8=TCc||F7=h3ugYC*Z(D$uGqGTC0Du>Z8*0QD2my5Ru=AIJn^QjC(~ -^NEg}9De@qOsbknqu#6}|5qv8ED4855^l6zLrij8Qxak4Fqh~74*R)|B<uiH<5CWi3_pm?^W1g$toNB -ihIvk|>;_kUkW>&h9E9hFx|C9_S4x!wdy?WQ!lJI%^J(PXO)2z(`j``%Kx&C*lIufSB$w@LQt@fTp~? -(=ii4+wQe<Ow+Q+~EsEnQ&1>$En&7Mi#{K>Yum$mr_28!!~aoTvjyN)b-m~SZ%;7Dj~oQnzjCkW*vU$ -C%Wu-%D>EwC34_TUEmYX>%6Xrn^m!oJc0EuMfBLlyS*jw#rcZnoAt^H;}x9jFh?w(xZIhyc5ioK`YhJ -j+opg~3X8$t5&hGc!TzA`e0^-p1NR5(<;2!qYqUP^O98^te|T%Zb!UQ60dZ{&-;MY=BCGTG7w2TmK6+ -hr+=`6#eOe2RV69NL@2@^_UtijK0@N$whtX`qhHFi*RwnD4=rhBYdBQFJSufX9IUmD3@FC8tmBX6)@O -+0R_~5Tv;DX>`e0c(84A*l}iN&d0P>m2y3y@qNhMPLP!Kms@KnSUgZOk=ryLs6}pU8*>-pyMj7*Q@Uk -38{W7<aRSuJA{(#ZL;5r4`nKaF`PC1&qwZ6xq|WdJ^~R;cbxQ170Mmx35a=Od*9xqRN2&CGBP@*TPt+ -J0Qvz`BA0@0}1F==pLG^rm$2lyv3AHQ5f;;-YSzUq2`M@9@T3nuJ{sB13hzRt9tPOMVMrGzD(CAnmwG -yp@|Y$Yu@f;^^^wj@}X~-)Ov;YX|7aBS?;bGJ{i#{t~T+y*e5^~cnLGe&hpP)&pjgcVf4z;KAknWB0C -~U*s0X3*(ks-b8{wla}HebQ)<d~pJDwgq<^PQeLlqlbT$h6W~K+#dICg}JKW(kShhQ!KdDnwZawt$Vr -iZA5A00Tamk8#t`EV*9l7-rqdmNP;;_d&w+0}>lzM$4_w|X^mnRB;Jkhd-PtW`FwhHihc0Qx9YW+9X4 -<}01i!wRbcRV&G(g@lW@Z;(v<a9Bz=B2oK{Uy<FYFKnlj&3qv__%(o$%$V0M|p-`BeinNr2q#fUMv)R -&(8MoXvZ9rxhG+kzR)}$Ekk6%jVy8+a9*5KM>1KPLsct+-`~*#&W@t3Rvi;B_)H*5e_{{M3>jGvRprn -h1Uyj2#aP~Jr2`~#cRAaEE<TSu^hlV+Malqb7j{zpbS=#~KkLg91Z$W+Fp;ikkf9e0{hA4nX5+a7jQR -yNwLvmC#Pz|e5H<Cr6SP6iS{&4a@OIq`SHkq%R+u3}D%sJH?oj2;G+Eoe$UsH;$>UiW9lzjqeux4C%} -n=wR+tq3eI-ZSht;jy0XD7sZ;9upUCb{}u>bk|C;LwbUTbukKw*ZYe$;pTM`!w~`uNMUe3u7}QV5OX6 -oumG`V}T%`a^2WZ0>GwvL`q1Jy|5$7;N^biMkKAN4s_-+d`s0M)RHUu5@@CStqyo2$bIC7U52ov3*Z6 --S<PIjm55{cnkGgk@;u#&MQM_(2ecVyM}`yx2;oh$L?(+@XKV#dQv#rvSP^nr&+Y!cC^n6hT+~^&bC* -#o^9jm*=7#6jm!U%8jJe|DEYO`D|=&eu3$~T>5s?x!sQ1=tnFEAMbGM=r{8tXMV`@$;JU4k@@Io#o_l -gvY@3F!md#i=J`kLCqennrbi`blt<K+3WBG$Ov*Vbq$OT{h>A8Z^-ap-v34Wx_z}}7hg3kPX);9ySas -}isGl1Ve_TBC8`j!9W_P4tS{*&9^?jHC%8r&xx2~YcR*G#B7>i+1e#v5>*Av;v9GTw9i(8+Pb70^BMr -NLz(?2I(hc;k_khul;iFOl#R1^2`K$@+*#%aL4P06d&&Syv}qHqN)lW_`9&;TdAj5?S(teO|nBz)o*T -x_c64r^JChX3v|DFs{&R@WKG9isiQ#eCx%aDx1J934>P?oH*CFQa_mFl5vcHWb7qT`4BGjNgc9Wd`4! -ADbHDkfcy|I{zziCd`h?_mS=Ra(|de7^A~Z^$D!=u7ZoK;kR#dE6K>x5U7m+ic}iI1`fMYhogCRGCH; -1OufNrZZj>&|!$gusr)`#p%{{>YrXYvBGgi&jVAaIw>3Bh#DPP~Us|65i#qr{ws3L%z9A8R))bKlTmS -pV>A}r;ETAfVNOUMVq@uWIgYcZS7(@1MW`ZS;-5T$e_Wa{O3R|*DxT}XMD1U4gs>v3M0|A|=^=y-Y`Y -44@^seEXq!G;Cgb&yJA@+k#W5gbXL5f>VKKTwD&3<L9@-n&(7p&m$j6kaF$dBV>J>8870;R?8gnmUpR -W6&G82)s%CSkpITNv#Z-;v;`~d5P#6A=j=oLVpVsq{kIM9|=qHM%X1<SOlqCM)aVDcTo*wYl-R7K5K| -<<DXdDm4u6~wU6{@(u}6|k9nA(K_E(zBoFh!#p;0{PEhGJC?=$L3MfzNG<s<AWP4p@9`o_!BQ^ZBNm1 -%Y;rk|qs9kS-E7w@@psw`-q)RbY`u)I`k@YhTt~7r3N9OWTY*^RrZ?f6lvh*1Bz%4T<Q#!b_B_E8Q{Z -6p^GrjKThQ?aRvKo+Lsx%%C58It(-@GQbQ|t!9?SYE9%HL_nNN7Y#oSrKsId_N`lEBol)P_3`pWzz?1 -7&BF+Rb=$#}tgHh!vJ9f4yW_2@J&T$+`|<v%o7m_Sg5AyC*qx3sv6-86FJLj9&o1iHrEk88gV@j|HT_ -fgPO~Ji@4J9na;t8r4a~ltZY_`P(Hzw75YbapT|<8on#s18f~Wi&4$0-VBp+iJi)D=uwT49$Fepxg`l -jgtqhD)Sflvx!|SBGK4i)M?T)+J5vJBu{s>i4$Z3dA(xDk)^RL)7Af0&l5EF2<eYO#RlsA+tu-|2R2f -WUQTM{3@PN<r1-QU#^&B`Pbel_5x`u;*&ZYoHV1dY2>HfgqC+3wLLQ*=M>`Utt5v=lk*V8x(k)U}8vi -L1k7pXyC20g_Zo+z?##KZ1+P#jAOJLo>43pBWT$09X$g`&Z?qSxV}yi{D%s57AA7v_nU@{kK{=TEQ{6 --$+7Lr=#Q&2l=cDPW%unshp`u7X!X%F0+7JfJ15;HY<j;IJqP<!Sets31n~@u)K25_q@lqh(#vhq;!T -^<ZZ3F?e(7{7PyP3a2n9sfz?DiVJ9ScUEQ>ONHqiw*0b)MIxTWm(5+EF;CI%3ZKeqvd*o}yvO6!p_IT -AV$hJ*Yk8pqX!Yq8+zNa-!|t0roV1z5wT7BSxz)+Yqd{~|c=b|L`R{Le>>CtoQKj7;w@pN5x?dj>Pxe -1P*rfj($9&z9|MO43E!Qv-CNL6*F^a$#2F7p<#@Et~p=pL92oj?Zm>{r^DmZL+DoFP|c{18ee-M1zYA -1<piv!tR22psMJSC~0$#*|xBV+XLtc&gS-&XByPJcAHwNy}a56#<KCmFG|el{yZc&!e9Qo*fdSF{f+G -0d(XCboN^_sC}w+lH;;eII5sKBTwZ|4&9mYw5W89L1Yb7e+tlc&zuam6z%6x3nKcCBNL<2(}9D{&jQ1 -I!<8U-*`eXbTouAiN4Oc|MBL%_+xytWR=2I=dNEiJWijLSX&jNhd%P$#Ae@27ioYn8K2a(TWur+mivb -#(dWX9-JFFs>F%sM)@O4D`IDU2+2S#lE3%Ky{@5;p<>|<;-12j`h(|sNio=VZJIAUIFXt-Yg&5Ge=F4 -7-^UduZUGWctAnPZMjIECW{Hc+ldsa%|l#%e+Brit!eD@8_qL1u+AYU<<%lhg0N`iuZSZCJ&0oHsSQ@ -i2c4vamn)uRV})oVhhJ{DTY+WMW)52up1jitF=ulKlc38rNHce-5A>{dv?&5>fhuI>_1+dkET8G3-)^ -j)9${2AV$>TdNO1Ws??aQitS^q@YTcq10jJbOq*SpskSet4al821JuCkxKj#xTBO^>uLjZg^*z4n;4d -RrO5N<+m;hP<j9_2El98#hw-xfX^;{hs8UbhM+vfH&(7v2_35TNY*yK^bMvxTGTK!{9=o|A8L0}CrkC -Z(&6H6RUBZpPJu%jN$YpDxl73_)%gj}J#$*z<I}m+=s6G`@Rw4+S?}Syfmq<1iP&s!TG+a<{r+>#Cc# ->$(rbUQY_}-#ej+L5&Np2VEPpgOfUUzZyq}YDd1xLiRPyzz#py5yEUC$U{BuE>L|h>VMu4>(jE@4Cc8 -7s3o6&{lIY;kFG=d<fg|tZ4XW55z(8)6?iv8tI(>KGL(G%v@m+|2P%N7lNXY~uGc%Wh)=3D)|tiNav? -{MRth{yZbECIm{CgMA?eYf-*-l=XIURWXQPB?&Y@(fxO-zDQ*2v!%-{gDTs56fasw0EnXIc)H#ls*F@ -$$Y;!aasKmJ(D7NiHZXO$Pfo<z{81_CQokYXWtx4+(%4}8`uDxds(6N>qGKZNaHCR<IoCzs*MY^$IDR -Uv<Q>|mti28F&Z>T*>EK!&{FX;F0e#rd#AVP_0{?QOj@d?%vw&C>{{J8^0FL`v1$nh5TyP3p*Aj6+sn -&U_<cngH_Xql>;7@5wy)?n?Sd~qVeS9J&=^8u82V$&;cp-O1*?8?;CGVh4~-khU3HB9>r;P!<>TZY7P -~TZg4tabqHVt%$G30LkGBSJW<v*Rcj!xY@!0xTd{1j7=*_)nMW%Qkl3g(_Cie(hbkj96%uk?*3Agse` -V5rVdJxo}G8Hk~KnsKKCV9KcI!?AQsckoc-mVvsn*e(g3B()dZ3?knKd@pFoNmJ_$o>Lx`j^cFe_LkZ -;~!fCf1<VfKD+q?>X^<VB<nifeNkb#R_zh-QQXo<ICq8#lh>z}J}i0}PcqM@pT*F+2rEc>;fgJ(5U|i -`|3<(42tmSTcsCm*i|b21>d2Qd+wUG50jK;Pf}A@&Ne&x*nQak;KdxqZdT%=Uifz|LUu0~Xa{;~?bU7 -rKYP@b~O@h(wfAaG8aCG}=U;T%CBqNh9?~LP^GX}zX!JHf<Or1f`rKrKL86n<{VMvf1(OQ5krb2XYlw -@UUsgfh6gbCRh`Mn7bs$|Aq9zizhjQpX&?C4T0<3v+$Q5`US46>64Xt;@H!>MKhvb~;ahYnCXk=whZg -q@G`&pxxJf;7&Mo`8)Hnl6^P6)k!?A%n*Qg8+z%9_@JWTEsd=Mt&4<B!WQUarA0d(Oz79Sy5Bu8bvv0 -gQlNpyW*~)!OgRdBC)g<1QlyJH3S#WQ&$+K`4$G~!ipxhV6iB_+{4Rx#ZafYY3^`SN%C)@g+0s5oTXq -WD*&uVa=X-7-c*;a@2jWCxMT}Ez1{gKAvJYodI&<cnv!N&IJOZFqmJ{s<;$fT=<3b^VH+F6`XS4j4nH -pC<4~o+Da8v?Js~_7B{y({%jfu#Sk@D9q{$g&tfyRF&SHbaRSUQsCY&26?z7X?!}OF4EP~S@2P@087f -)Syo^M%ap9roW+f2QI*&7od=SLVYiW_P-Ks*;UcYi{NKO;`0FZfYvFA?>8u=I>fh;}*<A?vB<L#Ab9g -I&2hSH24A4s|+K7iSwdLC$SCDaD<Um;ilW+}BD^)Sk6S?qYZbPKzh}>TU@`(Ip~!-DHunJ*sb`8E)~| -7yx5$gW6AntYzL#-qK}4ZdW>Eut4f`kV2y9Jm|+VosH|Gle{#gEJ;>wMN+D`<4-5xdx70gsQkCR0R6! -xAa}br8ghOv3oyJBePl?yS^2_G1Pgy&T=t%sz`6)s08I26%}ORTMI9rSS120KsWF<XC-r<vXDBUJe1& -`zoZRR{4v$e%5<wFus+~?aiFN>s!b5D6@5wa#hJtk=OkoIq&FQpOEM#)AB8_d|R_7;yB*^6=d%{!KpL -y|Oj;{&p0kay$${++B7UZUrIw^@5hl>0&!@38$eax*#B^bd;2+2=WsGC7Jo`{gMd?sJ%c>{o1cZ-vX= -@#Vprfi`l*qFy@JA6TJsvyWVSJYb(x5=CAJo$dt1RCmFwRW1hxd#~qsBu7D4k$6BA=;BgBvePSw<_>j -7bEnlURUj!@bz7X;`XJ;+&mI7MAvC+&9XXy0}Al6eb8jCwXTgknnM*bU?6mZig@JumP)yj=cuh;NRtx -~X!dz6Q^+^dGUc1BX4vfjiMC~zBrv{zgh}VGr3hLM{iV}i6#IHD7<^ejWQ--@_Y#vEa(pVxYiY>2d+= -~GYZf4bgX`DNCuV_=C8k}7R2CYV0q#>^X^Dg~>mK%0lXQKn{UOn8o(qrWRgKc{gc~Xa5IsXjx8q^-bH -a)2tA7k`i}128-HB92drHq9{D^0;wfR(eurY}Q=jZG6B2*oELQDZ*Coy#VahBoJ(5mG?-5dMhOi3K8V -4Agu0?m^Hgv4Py9%1Flc*^}XJNNJyGMainEx;8)Lf@3%_=MeGNn{=RL;7Y??vP2!G+&KY$$js|{=3Bz -_Ma3>zj5%##S-@0#nM`Jth5{1qiHq|;k{By=}k4UvfpiMBi-#ts7?Eq#vgl;?7{aLwS6VY&$}fsxiMt -~-}H>pzT2{%V5RFT2ak3Wt?g1j^CC%;?R0BtwLKNx^n_@*H3slx`$|Qd<PqP8&eqy%%Pc^5H)4Fd_R8 -V$cyl0L{~D&d6=SrgbD~?7747Pc|DO~~f8y)k6ia1}nBot`(x=D%*NY|n-z=8YOL%y?zH6EuU6Dyr3P --(uMf90N2lf#5o{TQ`S?Uz}3Iy65GVj()lbdzDk2j6M@lz7zFY_L2Mvn{W!wf~ii@R*m@$BA+uy!%I3 -pY0-6Jr8kU~%J|Z)c)~Jok-E+JyxPIudTfX;j%aoIG#E4NttTY#d07L1jrzc`zGiZr@j}V}O3Cc|I4V -hX>mZ)AL}J7F6~~-i0VBRp&g^J`tPOXiU?kb}!IPxuS3Ct#VlZF3{5jfO+MGR7l64j!RV5w{Q^#(_(A -U!12)>gP^(Eq=L+1Vcgv=eHzok<R#x1T%Is05d#p$I;=TNjAM{C6L=u&8#ekFnMiMpYIG-2TpYjCXvd -P!DJBqRY*O@%)Q~=mE`0&if?pQBZAb`dUo#ojGkS<}$940gqdDjik|-JjnS&GtEk)h)>76o-ntD)}J# -Myh1r~XPBU3Il=58NvN5Tul_kj?Jqc!)IoNKYEkZ?|2L*Yi{g-!@!`9u$mG!<Ip8*dvh5!X78t{0#Rc -s!bqb4e?FWzCnCHm-G3Q#jwCOr>#EgZa0Mb>I{XIns)&#LUcLJb>YosEg4NM(s9upV-TDUCC+ZJz`UP -Tb@Kl8OpL?w_5<_x-f`CFuRKMIA#9uJp1_xP#Jzgi)CFWOV#$3em1!B+9NrS++HPlq`A<0G#wo!ttte -XsGFX~>RLONLU-u25c~VZl91v{22~MA;oUI40Vk&jB|4a=<D37x#S(j9OTcnm;jSy}^})aK($kRz?C{ -dI2333~@5UEjXW5vS=Uvz4(<xVL=Ef0GAE7t5Tfx@@V%wUTF4yRGdVz}Bb$NEU5Ky$}H}%yLuLu+sK_ -4dsKTrc*UYne_d*JKF#OhN&Uu-}=wjFekIaLRbgUqI{csxIyWfogQs<Xw;50Wr5oD>VkVs7-{aF}|!L -a<tHT!FDrKvJ}ku&x-UMvuF)-aRt4M>srMu#%l}L2{9E5?nCsR-476I)~C+@!}yn6c&iwq%H(Z!p0>3 -Q1`)7tA2IypM#U$_3=2KF4yk=lJ{Osk78S};5)zKyesY%-kdkQ5g@#adBKA~2w?=`*AJ*nSJkOL-97i -t#KcT=S4cvbEq!QbuC>?7tmytZkkQq;K$zgraaq<Po(7=3lPi|duj>l{5hS*S^Drqasm4vp;!6s}%0r -fE9(ujk+xtY=H(s|NVTzw*_+lpzJl%M*^QsNOXCS-lm%L%x1}#wO!D`j)i_n9-o&{|TucaSa&)R5oVs -qNk69<TVG<VvsIr}1SxYqDMlgO6N@F#p?IME`x2BWnz#8ckcVv<=>A1X1teM3*utvPY=GgkJQ#DjyBH -}$DRApp7ZT9C}88#!uGB?E7tZcP)&jwD4d?H;*pCaMr;yd1BmIMCb5xK(NLL_I{jRbL!16I7e)7cnm= -<+?sO&fxO=y2)e%Y2t*lm*U3w(=ZWp*adU7gA$m!arJnD&JC2OCxD(yVy0Fdf}OXU5clVEig8DpnPJ^ -tt6sDHS(>BtAM`5z4<~PPJ5T@h#WVa1ZTZS!uKU~H8aDWD`mlpB|HFepyeHCU$>aN8UzMfvW9MJn8UJ -s+()ab1|8kYTY<5iJPc8>MGF9luJBfmi@)hXga8Bk&BY%p1YDIUB_It(A!-5Gv?8cE#@#`VLmVRVPk) -xyWa2W@W^b?hRtzUtlf9J@-%QEOsxLA=L3m-ej%aD)N5_%Nr6rY6^<RiWfelBpRqu_^F3ixqD%&3oeU -4E>s5c#q0vtO9_$dew6FWJZceCKz6y@s-UWB}&>((L%v?C=-TWAW|^TsFG@#(Lz|oPKBu5t7bo(~fz^ -f!@l((GGvO6nHz)$)<1zLusS4uL>rkCj5NxcbVy<bR-JoANo5qO%lw>6TLC=^!BJ}{c4@Nej{_=Xw(l -<07pG1{k}Rb{G~Zk`>L~Y6tR4|BY*$-{?5k({@dsKJ0B1DZ=dhKeY|hol)zuLQ_?0&Ws$LjwenIfM45 -N-SR_cK=sr4~Hyt2(wZxHH_F6o-w`S&;?+Y~<Mrv60l+_M%)y1k47`uKgmwNSRDw3BIja{$EJK&ZxV5 -x7%@WsIyLH+fjO9d*gmPGR6BX1!rboHJy?S0D2iZPCn>w41gp0&5PO9h<3+bB>y1Gs*V82r>WPw()w8 -W6d1(^?UR0#4cme$pfBYzP_&wE;#2;!DzcTE(T`6k*1ID5pnHt4a_K1LGuV9;a`ODdT-d5!vltOIQqF -FF5p8bWn<LY`S`7XH!0yb3@Qh8o+n7mhfizT&0j=IvDI%TR#=}G|KB099%)UPwP5Bfp^9kq9Qr#?3XL -Ped8~{e<Luzt;P7Mo6?2=`kcX6SY+es@)QMQpx>hVIuqCTpAndy-*`9Vwa5Mx++E**ui|rafkOo=PIM -wJZporfZYFYICdJ6j!M%AZF_l6U5`$f*kXYKIax5XG6>(=F0wB>AZ0!D0Of!GGao<unJ66-uVH-Rk{E -7sl(A%3cr@cgt!<(A(X?Dx=i;0oNM?e5C?=Ql*LfGQxeT83KNb(z0(lW(>=j?e`Ob^Vx{$z4EYrjKF6 -N$<ICCOT72r2>xpdj;9Iy;r{pYeDiO(Rc+gpy>rDb!6P87)#H@v7CYvdP687LT(vaDs&wu6~{6dkf@L -UK>#?Zial<S?JmHa4b&rg0|3=QJJECGpCH?sWwzCtA7xNRHF$lnVfIeIfM3q(;Hkbn6Cd%w7_`&mlpg -3xrY45!cY4Er(=(4%y*Q!*JG29%{=~sqyKAX`i7H#ah9K;5`qyJC1DaLa2Nz(3L*)Jf^igqNRmXU{Xd -Mvf9n!~A|J^u@@TjqvZIX={h-kfX(W2IcI+UOCr1tEz61VyKuxIwj+0Mq!w#+_c%1TB140g2F@iYOnq -cfWP5hA(BR;mo>5hPZmfS!-Dqu-`EcBr8u^>faM}@?Gfn&i5IVu{cFRDG%u@aPiG!S+|a7giBN2LPv0 -bmL{F0-F!rwB)7L~=YK{<5r;rw>4#zXPi2$sG2OjLBFS?fvLN6p`-sfBd9BMG4TaMG1oC{2)kEE|KYJ -A0MEPC_rFsk?*~a;)E2Q+Wj8{q#OUx*zj8|W?}8o=x<a6KFE{a-5*j7U#cH|1QUg}LM0Wa-jwt~y?d? -3$|1KMJs&%Ga@zMtzbXywMsG)D1E4wSTiaYrciLE!er*Wxgde4YIHqOX_s7-g<6@LaJEZR~`owRycn8 -xM@ixsa7v+1#gc2<KXWOHredA~j*%A32*^CW*PwH6ZB9uR-P8voi+a-ouI)%qM^4;G`5&*vkQBIaMZb -UUteJ&Z=7CKM7MwK%t@OBr8(N~``RSyr}eFOPCUj^{w!*owHv2shaTyt0qd*O|67TdH9q58C=8j<Q&k -+BYT-v*6;RWAuXyZ!45B;C}Kw|ZSJ@|%D!@A%48F3H1faUNUs0T2C>_M2>A!5duf6nGBC5WlPeVTPr> -|Ahcwcu`w?yFZF`dC9n)QghHFOEugOhH`5uVRNc`dtmAL3xx!*5nD}6MFvJ<^kAMdK%1^)T`A68yDO) -a&YZ)`u%dj<7M7|A%W^%#b4BvEQ;*bKz@Jb3^$||G0c(k+={x|j9{e719a^zVba(VX^V9Mqv8-Ij1dr -cH2TfJI9i>=Mzkz5O9=4e2r#u4qzvPd^sBiy9JiY3D1~xMu$%1d+dz=O_cBJv28s%(<x0A*#BFm2A@y -lZtZRdaGz?4U6M9S?al`l(pq}g1FUbG)~<bT|erN8X>WxwV>>MVdi3N2nRrqTMdYNZK;g2x%3W<q%GX -qUq$>$Zk?<qEOW4kfz({_AL19YGX5;6-uLr4KO!0UzVa(6T@91HstYdaK&0@`K#S^cKx}h;bj9`@}9! -t(AMDbAogBG(~{N#C`q;X^W#g5S2-B@{*SjX>yH;Ci-Yh7TNfrBvR(tv_lgQXvT>5N649xv2NH5%yz4 -D?p@)-^zEM_mC<fZaE-tevofJCowgtdm=Ji(>6d}a25iu_w7w}Ll$TT~`#?>H>hz3MnZ3El4ORyy6<o -wQCF7ek*K7@5ov<;_KFkRuE4M9uS??jG-t;Y$Eb{yUM2}TMZR-`qHI{MA$U6l$TA^jB=&up@_feYrAC -BeP&cA+&O^=Sqf9=3W?a;dK@QFK*c=Q)s{-?)&L*oB_+|Run2oC<X`0tPl_!Kta9|drfIC>_jk8&OI@ -ufJ{20o%UNcP>@;@7~H{P-Uwhl(chsrEyVBOE3_NAKVUB}do@Q%4+Hd^``a;!vI|z(2uR^n=+k`suq& -4~vUEY{ubFF~>)<4nse}1=y#j13wlja`Z4@r1ImC{15;-lo{gB(!(LH_vtV_?3$o|r+=dv^T65lJI-= -!Xl%c$Z`OG57YwolK(pM1U%shjuDtqHv-4Z<_J=gU9*-S0XoBLo&>zmYK=N62ppUdYbJRB+_Q6-@qv5 -$f9vvC(a^*BgcdA3f^Zn~K;CI9NC!+#>H>}@}>YsEn>eshDQn+=Zp!?gvul3n?d0)|;L5!)_30|1T^G -b8Pwcn~PT^EkqKU&V;TuO99JT1NFId_BGc)1~)%~z&T4u#eFssbY%&x3m7DI6>pW#FPPFxk>2*jkzqs -69Y=-`0BWO@@f{hvVDE)s}9SD6<aJ3*yzThL_7xePFd`D>WoKq%7cV8;|sfgD)Xeid9u5ReW6{`ttSy -jiauhI75=|^%o*qH-?qW=KyLv;nMFq8dq`DfL3^Vt=^mWmvrv!>8{0&a=mbcWSvmfCbs@mb?$Taq!S| -=Q{60NAFqx`<9r==nAHR4s>@(WC(HEdBM)L4H(7{66U63(@>UiKkoc?;J9$XIcQUfH^*CsSe?*JGU*@ -|FB;Gkwq3LM#vM}~qyod0uE2tszf1+Q?GT@i;!h(?{Rg)!IlSTR=;bkF5cp_R=$~|5xZ1w5gy8)R<y> -lCD)ZokArrxnOV=2zLLB}0vd!Ftpj=X%i$=tX0H3xBQ)80GV**7qs7xmE(Bp;neqq9NZZ{OoR3x;Z&T -{*+G1Oxurv-1$bg%kKIIlZraikORuGt7fKiH2W+nMC92n?f=qog)?kzobvFISR~Ih$thV!se8HDS$1~ -W0(SU`}`Ilatrno2b)rSehW5sOYi^L-t_}ep8|N}WMpSdg)QKv#9akO>1)RJLf&KsRqZwYl(?F5hb3I -sRBzGpt_I??*iwBgg)lL>f;|ni096`x>OlBB!8Fks#zo4NJl5-57Zt53a<*PeCs4Iff$Blvft+20U_< -)3zG8SB72A40{9snRp~Y@$M^2}~E{3fUn;X115eBW{Sq$8kAha`!UVx2tpStOwp~8Ea12N~fR)}de;; -7;<m!xr6MZbk_d~2tT5cjx1M66B-h&a{Y1$~o%A^Z1udEB|2b?zcN7h~A8XkP`Gc#V2lskTI~50mUyW -I+Pw?h!Lpo>lE4O-^-3LO^*`3v_x~n}cKTku{Tc5QENYA!s{2PV)Z_pys{*C9M9_!~YttzaIJ@i2Yl| -*&WkT{0Kndk192seR9O;p%=7ApV$`-gO6?1{v`Q*!zG0uCI34t9~ocl;~xbc@(DY37V*Eck4VrSm+ld -4kslq8hcpBAQRGJcY}r3Q<ZpM}#y>g?<i~uG#1DwxkKD($2gLA4;|Tr~NGADlnVm2c$Z_67od`Vw=%Z -l(J<xuSlJ~c=50aCAjo9Xa*zcbZ8~iO|3-mun?8}XQe8WcB{TqmFdEuX+w!7$D^b2ac3vg`w-O&E-$b -df^+Mkc?pLq8w-CA+hGS??WyRg?+u<#p!)i0%^%D%AkvhRTQRw`7*Tw7b&?%@tBHqtT05~c48a_dX_# -Vyou5ylf0VTwCXq_#HjqdZ-b(qJ<U1Q5r7!bz$&tLurXG900v(TeanVf6f|#AnS6BZjzX#09E@?8>R< -s1--2g-Lr4dLrOyI+~ELWy~cLE6oU%oE*Xr*Am^t)UhR}DxL#6TQ_U<%^0n92t~*Wi9j3FRk*c)p1|( -?<AGlWL=p$75)Afqtzc|}<~4rd;OK_s<2B}2gnKnuMct&UPmaN>3fSplCnO-1=1ID6AxBPj2`eP=n4C -6Zdk<Hip&5iH7vYt2KMy&AL6C&R_z%c!o6FHOQU0x!YW?cg&06#CN2HGLSNiBFead4%(%0_yE7dH6nB -S4x+mYMekz0DmBESD*s*V~XQCNU$O}-+reMi0yCWwNm_iylL&dJ>aRZzbgf81!TcKcH4ascsB{Q{(j) -*cC)&jye`p1(gR?S-G`8b@O)Pf`~9O|Jfc{m<<@nme)smP6fsvYrl<HoH?_wT`hdKJ@STxU?<|TQ$rh -ldR<!b+%*pF<RiK;llbmVX5x~BtSkIBt`fs)X@tK+E46}?*R7TVEgck88~qN&kc`hkO-#OxY%xeC1XB -tC6zEvhVjT<I~l5T*aOJSt&kQrY~C>&<R%lxMO!tTm{z<Cu{jZhqQ2hrLveSia*GiCS~UoCS@|^E@)5 -*<ZoEu4iLc1E9|npfoz{Pi533dAJC>2-Q%eZr0V75N)~?n>FANd2$0g=PCzZ%j7Xa3t#Vpv00B!?XpJ -w<Hz2#;yA;}ND>4b;|#hDO0=Z!^>Qfon=M)lN{0neP`5M2zceJ+Bs%3-`Rod>Rtc=W2w8LhK1#L8X3i -u&!!W{`9<p2_o;by#a;Jj~P~qax8W050D0dOZYY4!1MjK_$}@I<z5<`qaGF<#tzQ@3l~GlzvOkZcSEI -u%W-NK2QIPtH-+h0;U#xpzh~&{6EM4`KyNfU+nu`3I3P;e#&Hn7y%;~h=VXfAqYak&~Mj)Vf;u*@3HR -zpq~UYM10IAu_I(XoWVZ1WALNg2mW3ta1U&8=*UXvA4R?_KVn<>(=&&E1pN-3BkTxf(NAUG0sO?VYD@ -gtI&cmj(K{M{yvDLm5gzzaT*5x+4}Bzc!2|9OK|tzg1k85skQ~|SBf9?h9^=TdFdct#)>QU!NG1=(2k -<YgFogI38|ZsYo<b{^efFJ~dK7NI2Wj~`5&~az;dNEBw1xkYzLxl<XVbd??o+`YE=1K2?_Kuy_<egHy -_rhww0TGOW)YTea_9_a+RV2dzN~u+@>h{SexIDu^?HZ}I_{=@snOeGke@d$?k~%^E;z3IMq6LS4ji^o --p6E>?sH6b=U3p5Hy`_(#~W?8&%1N_Mpx0HgKr}A`~lMZ*Z02)-?}&XfCc%_#BJFxiDdamBp=>L^@B8 -NHj9P8h9<#C*af-ffSxL=7vRhZpG5b{F$LeE*mJ^sZi~;zl6F)b&|P_oL7vB5k$RQdxKEO=NVkU|)+N -C3?F9GhcpaC-AfBi3F@kiBho04uH}Uigs9xI|kdtF01aG$E^@-}x3oYE%LL3npSmF15$h5U5wg;9AcW -Bx}SHfbVv@wSg6+$wm<9oB5Gj(pRq^?k>q74iXwSzcek{mFd62u=b63k0p5c$ar@Nq@5>l+f>6NK9$G -xGlZCcaY#pVn)6S5xak6uw8UWLFh?K>rR-Rf9Ha8)`WZ=d^XXU+|QPe2fe$n6LEnbJ?T%-hO%|sXM&6 -Zjw2_t)8>Y+i(R;5%-4TEVdVDZc+PM_@}&n(7NqI8`{mbG#cAd7=v1RFW7n+Iui14)rv7D@7@#y0}@3 -?*<6lHV)z~BgzdCe6~+q~Z^{}e#j{zp&;@_%B{Iyn8t1Nl(#^9TO>nePu>zPy$TyEifAOK=T5VkxfNW -|K+j7mR_u6Hh&%T#?R89lW6JvL;hI<?}>;qe+sdQZqsLxU7=QoC_L<&hyG~H0GDOITjaq|5X7G>~itV -@+t(NH7p;H~Edx5P-rIK?fl)(CW}b~UWL9&e@%b@=<q-w7~yJWLg@h3Z^jTw3sfK{RyVnz*bNMk&&sy -A=to&xQj5!_#9uWP$l`C4$l9x^Tt1-$>v8&QIkaHNY?RcRxunO;Lvq1nW|{Rzl@-+8WI7_h8<f!T(^o -U+ty$8Ho+|P?GB+$B@fA5p_(8i%5STO9{@osSoP&^9&N$MZ1QVyPyFRYua@OP5V@bbZT(HhIg)@m?ox -m{|W{g+QMrRdhZ<;#m60iPn~`%h;`1*GVQ`=0f>*@>8F~29nTvrNqCyqLkt9~6s-<Af}twKu1}9KBDR -y>?CeuJTO)Y4uawqveUkv~E30Pi#b1aBO;q!ioH+_4lsvOeQ5)AIH4WA32*imJ#F4s?5n<Jy`cNqNx- -|GD22OcvtB<MVpD&W~8J}30v?k4+n!Gt5Hm`5OC!yxd6x=%BEPW>ouR+tf)QQgml*BFI2-Et`%k?#vD -AUxHIIB-^+J6*Y8J|)5T6V#GA{!~8iPw3%t#?V{CxpBT8QsP^YXLg@H8DjbTKG0C2IpQ+>PYla(lGi} -YC{|+xK}&OzPyS!*<8g;w7oZ5LC6Y1^CTlcxmC`U3yBTh`jbCiL1W}`o<bnlWpa7{iQmvFd<o|e;k9= -}@i1O?kIp|O5B>y^+yIDJX{383Ha-Szk=+pAadSLp@x#o|PxoSzFkQDN)7@VuPM6TP4xxHBkgOAOmXP -ZRY}&QOee!bar*>&sVT!M%yQ-QOW)+EwGtWoW%QdT6lc`LjP6`*`5}jV}8(6<*as^cMJ@NzcGT9q>@$ -+J=bR()A-d($1svD0uMbjveQ*=hQgqa}gX|#4#^u3;{e_w%$Wj%|QqeB?-czzVa85j9@`m4g!f8F!Dg -4DOYeo9x6Fo}UXFG2~F#3`Hve=GgChx|K}INB8QBay#z3y?Z`C}HSOZX~i#aT<K22uS$fApHB>1#%op -#7A)egne=$#nJ7szl4h;Q$ayTMgjX+rXJ$T>9N|6qdOD(^Zw35ZxTHEK=Y3~LH40INq%rEh&p-~cB-} -Wo{adIhJU&)VEEv9I{|_|!-l`O0DbhOGU!mfI+`B#q5LI1lE95+ndE!!LJr0&(l`3KztX=o<~DDCi0c -FNvM8pjb6%@3w)a?n5!W|uuw_h8_caq-*zcJH>+8000e&nAaKAZ)eI$|H<?3jNwq-}YV*Bb8_I;bi%P -W7QP2gK*gmr~Iq=;<OZR4HGm|tgXo?RBn<)<&Byz%;1J-wsmfIqeY-mm3x-cf+|w;4|YJmdKsy3b&Ep -Mt3G!GPkT_JtUGtbZp~vamLTwJt_+pU`6RoJ<JTUblqTOqSa1{s;kSstwqRNuDp^z+i48#>4?@A`ou) -@1<Smf@ji)y%gD`ml{HX@L4(OPndhCwiWshK!oduk>5Z|d{d89RcQj(j7p;`ox0c>cazKEfjfC8^6!; -3!JF5SypuIS#nkOv?`fcwjA1LWz@V?pwFfT`FXQ5P4U*t)=2st@xL5e%-}>bub`Lzq=>}~<`#BRa%E? -1D05VN37s2+56E|;VfA2DZR(-S{Ffd+BHv;cxn(WVLPH3$8n#`vKPR&Bzo@Bysn0f}li|kRJrli((wy -Z0U)lq)Bva&=Eq%g#fbcs<?yz=yu6a9JT9y+xQ&nu_ogTG?A1T=Ud){n>5!ZgBjcwpSoUdZB#qeNL{E -=7Vro3&8~Ggfb{YdG{Ch~9>gAm19io>2loFMP{@_3#c`@VwMUsh;Wf9&E(Cs<8@ZwWh5j$gQ|`hOg?J -V!CjKu3mUYHXJgvD{x1A3sZYrt=bb<1iD{!<Xk533A#LNtl^R3hE4KhK0vIl3szE$CufeLbei1hV)rq -S27MDxJ4lO~zE5Zh6@o=0H*euwZ6<NE{r)P3SyE-@@XY-Pu6b(37qf-RKF)ii1!i{)O!~A=LkA(vIYr -g$cwP7CL$)p^j7PFY_o+G1(Kp7k-_GwNbvdR>VTLmBeaYYC`P5-v8vjEr!AAck;UU~YB%Gr_dqwwl1R -`H(62F~Q@Q^yK`s_|^>W_;ezV%Aq)I0QBJoNQjcH`#|Q9z9$KNkYNUWutH{ri;?Sl?0>t3p_Z)w{R-T -wmze72({FE$td8fB|oQGMJNSHwHbwoIhc6%$FS3&i6u%iD^N<NYm9Q^mpz6UJ?2DLu&Q$tx2~Nb=Xg( -Usjz;W`7<ZGU<M}&jCWsl$Iyi^v9yg=RP@25%{B~LS~OQ1O{hmi>6JJfoRF3lZAQHVnav!r=&%bmT9J -;MfZ5*jz=IZ8St}1$@H|S(V@9B&HXjGFf+~4v|H{6UO_r9>GC*1WFC*pzTf`H^E6;C`<aArKO_A(Hbe -{4(jrQS%W*>f$1A$WV|bicB<X}^UbL9f0AcP|*sqj-&ZzBI*oV9iJvN#9F_Qg&>KIvUa@%p@{Y1hsg6 -J6OzTf^4zPu5ChR)L}{pCcq$%vniVA3GXg|tS~E6wq=ZqhK#yY$7RKOgb<2qrCP$C=x&S9ly}&S++#x -d*K-^oy2KI$IcoX3?+Tkw$0beuB@JxY5fG6)pQ;AZ%jE0zV6c`>mV3|G1%4cx@xN-4ao_9W_@0ya(?4 -&XXp5sjHC|>$?9I7W>J_4?Y$x@#m$x&#hcz?S5<DV}EV;+k66IAAOmJ)UnvY38KBiABxo?asOQ)N)-q -FXB3)8HBlhXUvhuHk2QiXw=&Q3+|F>#^>d&pe*XpjS&_~T>q@%P{kc24dS~ybhp~5waF<6kv4)=YdYE -LF7K9-f<4VRxuWQ$tWS{i_M}WLV-A^##_Hh4-hUYzkGL6&}1KK~=<4ni8WjGh1_ehOe>l!bS6I+C=4J -HIxx`6U#`-peW>J&lG`>Kcg&1k#28&X5Psr?;uDL!vsQT*TsQ$Kvj`8|r<WWuejf;-&-T08TXK-+@=T -ofHVBdYsFr2K^lQL1AHn#)Qmnl+M35U&-s8hxgaxR^9`qvBiMbHK|xDN@`q<4(iT2Bg_(P!#CZ@fee0 -hPyplZ$hrL;@GEEX~!-zX=N1^<YHDu*WO29>hP(9%tbB@M(Tv-{Ay6P4@1P1-GMb!rdsk|f^{xKJ2S5 -*xbl&aHL?qSbKu&S03xqEi-+Z%7Mv=jM+YOldQEeMZdwaHEYrL%C0~J0D8WgxW0_uJ%2(+_cMRn%6{` -Rl-}>IRH9llr|9Porx3iaQv-%Ub^7cCy<77s?pjxhj!G%sE5P4l(g50xRkr+1`sGyaG$G2xdL8+%XTB -$e~q!3;%!kc&$_h5zRDGWqqI^UOQ=%rGTy7%+wLrJ#NDgYUB3Ki_}4(#DpT?yeXhOf4!_g~SCQ>c776 -+~2|h}of}DhQR;y-(`0l@l`82K0a>pf^0<T;oVJ?8X~Ra29#woho6;%w>y9q#q(ZUnCX>PM*$(&l(Mh -f96~ErETViYU01^RQ7id{K=c_=YxJyLWA+&_DdHZop>TY>@D-dJo8XyA&{>v$`p8T`NO=kIJ#S?KUp| -UkF+RC9wEh{aE5-|g^?rL*q`U*(W<;ZKm3Zp!}++tKB_Opzj5r(lxnHNxa`Z-i;v4DmL2w<X?CpTlEe -|zP{om_&9I}$_)s`YjuE1VjM))$6v#)REjhBr;3qqbe~tq4e?!S%=4L;A!0+$6^DL*Lzg4Jpe-RS%gm -eY?kC*S)#HMHM0Z7I;HFQ+`{z3m&P5Pk{IQ=FpcJ$2vo{$~+*spyk%MT^PUjvaF4Qsb_(Qh)UZTgRa$ -f`Ro27D@k1^yQoQEQ*C<c0rcBD%Eh9+U*8i%urUugC2D&6@>apsxmF`x_ER$KP|YkQE$)?H0Vg!n-hj -HzEW1pMn$MFQSu$$zC#!ZhZ21R0N9Yoy1=xNLdIUW;>-200>;KmfNW&e}VX$HHxVM_MA{u<|QDGQnc2 -vJNbQ`hzf(>FE4&wuF>esmxY&_$=(2vRtwjNya5ic?-L`1EIDYm26AtYM|rLYVGP4rRDJ91Tic6{_y( -TBbKn?=S6m9V0yJiMK9u?{B*=WW8koFZEE7HB?<q7Du+<0(VaU*1?&R=%3O#ogVKG6BUI+btpZ6tTlP -gFXrjdD_l6XS{LKL5Au!&NvB6i+*le75`UxN4|6_OR9_=MQ+kAl4<`?OytDS+aaN8>+=r5A)+*xI{Vt --a+&?_h=abX_u@obD@ZSq9`^F5GEGqvzY`Qx>|VYcs*X`!d#Wpc#E(#q^^&I~ZD*GhSzc_B1@Li!Erp --Q+Q%>3azCu=CW#X``s|4Ub90)<7Gp*Nu9z*ph-`l=L$zJ}&`&zpD84;y$XVYl@M)Lablp&}2&1OMAj -|SnDvSmPu#;5Bl7{74Q6le2WPN!>|H6p-^QfPaL$F$;PuSsn$tE`C;SCT_x3?^0Z>sD2Ghl85_fG#mv -}OTtD?Uf9;x^mMv;w6N)Oo%KKSm8zEVgp_@<S>-{8sk}+?fu%u!Bc9N6_o}qoyo~N0(k3mgb*7JR<8u -=|hl}z5oN`Id<af9~H*j!er!Vne3ORSf#%xe+kNxlQ9BUpu_rrh#1I(ci0?EJnm`bU+yZ&lR5dHeHz= -wP#%Y(Du?7PM2=upw&tON^JPAa)eEN_twV0Q4@YI*_90O=s}ROcHkIUgFA%0ba!3SenzR2B(29luW%P -++)Ab=iYDlyZN;H=hy*i)$3();vtF72e&w#-Djqqxc8h|0?YCj_}=y@BI~c4b86*zT2>T-@C!$rTy({ -K0g&*Qp<kEt#XvRE%SC5wJ!;)t_~KDa*T0~QG!ay|%D%r&GauxUCom&cZ2BtJzWx9#8FnbqS{@vnUFd -+j1}qwOV|mV<1UKtyR#1vfGvoB$&<2SZq*Y7QE9}m^k{L#vfUa(HiWIDnIp=UWztzA;Ot5yabA+uAD= -USzY>gGY%Ou%A(qt;MguvEK(WYx^`V|0SW?XaXDtBf*JpDV&D7_=HH+n_~Lbq;BIpwdKf@Ay&E5qBMs -q#YZp}94HSUCGWfN$1~-|wZi5GUevPD`PZad$@XyFcQ^o1T(Dwu<|>MCWME`?{71o^)r9e<Jr9b$p;3 -)uCMLA|A#>5$P?}wsEK1TcEdCk)QTZnNVa>YlzCXM+df?cPzgAXj2&D*<Y|5u*48m(HhB1wJ0LpZ8eN -HqqyZzU)fdFa9X^av0K=nUXHITZf2QR7?@XGNS@eoe*<DsGOar9Wl!nVe4N+Qglx|cpG<9Yki^2E)ul -Z|%?(H4)U&}q&_K2IM|;hO^Yi}R1M$RUw0}?m?&NJ9+m9|E;_p=Eb)-^%c;i?0^Y;$<&U=2l`%lZ%6a -}IXh2sPYffNXV1cjsfCYU5(h#*Lu1R)Ijt&acU{Qb#aLZ9p=h9Aq;F#eUnr0}8D^0mbo`#1V~H5n8+I -8So0rz0hL2+`n2{dWo-Jy3XjG({ikdmm3&1pU;U6Gy5S`LopQVOd8VMdd|)B#8_1s0Am8<BTwJ<c#Bw -eckaA{x^&s3=00xufyLiKlt9!<As0B(veS<I()37A9n1>ze(yZ+0pe#DZJTl?8u@O|0Fy)L~W8a-|lS -sda7IWTU+G?&^O-I82MYWQ#~4QV_$F*c#l)>{108cnkKYXn}}`Y!qgr~D%C+ZfUkU`%x>Sj$J2FZKj_ -CBhjW)N4af4&+io<XS?0o*N1Mwh**m$BzxJW0zmmK64jsPun!h=^xcpy6^#=vB85q$1L?!08A~D+Kgu -jbLj*Tt0Bd_QY0r0HY3Jl~WCzMl4j|uEWE!?DqV4Y>b13T>&Gbv1DItBMa>Yg{%XKNgjr{_W=q6Yy4+ -v@=-N|epC7gT&$8?MNhy9hmV#)VX}uW2+4ln@a-A}-<cJQ3I+!Q2VL_tTsLAR;jJ_JA4&N>R^mK>Y?f -_LVZwNxw@^#}J1s*KdY9(J>{`5|yErN%H}86Oe~YtS8`n3o626h^NEqVx}p#d({OANw#a{%<r~d(>_l -}Nopr2QDYXA;D#fvL+u*8W*F=UkdQW!%mxwuf?b0vEsT}D$EP~V5h>!V(nB4gdcK6QJfE<HdJ~h1_c> -@2#XA%)%^k?5<zcUMDe3xI=+cSsPc#MIiT$rl1pZBev<eb#C&hof5CJS)$B^tgXikm;hfh(;fonzBCj -sS9O;RLzb8ar;v`)O~NA(jnZh}Ei%6)PQ`L1cBG7}tF(OjoI{9EnH+6;_4)RJ3V4(z!}V2O3j1~VR$G -bd9APpdNrQKa_}huK`Y&!}Z(E7nA&+f0F;id!hqml;vIA<W20mOFve+6ysWv_Q|jO(Lw+&(ASlF>Q_v -W`UiyiG3hfgjMg*j9rLg1jd%PTS)8u$yxY{OP%FH@V)#BC-WS;I>}`T=}RtCD^MsjuYBHVs<ns;b06S -<xR^jZXl!3z<QJh!MLk4N(LZv|)4%nH85>RgS?L}7wP(!ueS@{L+@J=fRRg+VPoL9+;ndAf;Z!>O56z -gsPj<CCBYMqNx<gn)?X%1I%sHHRYZ|br4bbcoVw#YLe&3!qjVm_jUM4M&t+s_@5R+s38Lz?l%t}m9aE -%1zNEY9#V3F@<s*os<$er^Ik@$qp_tUGa43W%z1we7?RF!?8`^VC^0Iq~JMRAJF4ZM4skcpQtpS>cBK -y_#BhBMbjiu#~%sNC)f<lF$q?9247>Wx|WeR7uX{%cy9?*0Ui{G9jFa%HyD@|->BJN*uOluKZ$W*l_Q -7M;m6AcV_2K5d*6#wfqhufPrU{d@I9ypOn{O>br-4}mQOWI<|sM9H62NjC8uWl$YW83Hg--(15!T<`8 -B7mD{<YX+S)rA?v63A+fH-KQxEP5B<|yk|@p%1EVm%pbkhgl|t7xV~G?YVqI#Iae1x>Gquar-53z=As -q`_;~1y{N5>M>As0acXgEUHgI})uhl(R(M|;L@?Jw0AU!MNqV`^~Y-#&G?8p&e%?gPP@O>f75vS5+ER -}jN?;Es8wKZ;G20yLb2PTr#o7a35FZa;S#Qc0`__P)=F-KU+k=CnQ%MEKm9urU7%RytyYOck6o7H|Xw -X_2y^~`&%froHllIwC6Ufxi(l`iT|!-aU;d9#H`VdL(R+U50%ChQGCb7I1I8P%(|0`>()@TrPw-8Nrq -yutZ>^nJm7GjIGoN*6R~N=GK~2EDfr?R^H%5!6e*pLpRvXk7mv&Rp(P<<C9nk3Ig68HAu>-;HO)e=&7 -i9~-cuzW>X~o9@v*ZaW<w>VLiRe@XRr&!^8T`hR|Q%Rer_-!AmEb-jtl_kJNQADVotf9-+)f6Ji0x6} -Xk0sYACh=bRm1PtN?h`<<%VA$`NT=KC&JWBnLqrg7N4u(X0R9wjT@Gaaq8WJBgji7eI_xqMU=vY`k91 -zKa6Ylg0&yPeC^{Lax(vOO9b`%rtJnCr7`!vvFJCpk}5#?hf#X$+-PoH4+saV{{wx4m|j%CLpd-~}zj -6Vb}1wRcA=#k0VxhaVpegt{^X-uR(c2d}<ogX`da**_|n4D-Ii|pJVj!f~rJavMYyrKU{+kf(1W%3_2 -h?cFH<gxRo29cv9Cb>`5!Q^&OIDHdy(Ls0eq=4^`oyGAUYrPp3h<5_EMpU2J%udFpIf2(#d~e62A6=H -BR_3cdze8;%t~&{9O4BBUu0~hoMmJwaFlv%}oZ0I>EbaSJ#y$e%(|51$CmW)m?|*G-S3L^?qR()CYL5 -DN5C7!!_@xSRJNoYRPc>u%eo-ovH{jEhzkT2M(--u2z8~PfeL;Wc`vLyj7xZ_&AK<@zL4W7_`A4Qw=* -vAfi)Tp>ul58CXU}d3Fz9tIo)k$@_9e!>o4MUF`&@AA-BygqoIRPbuTCS`;47=l46excS;ahUli<!sR -tey+YB|YoLF(*la|aVs7b7m2pk%E37#rw{6JPJfQ1@vZ#CQ4|FJc0j*oD3HNz>T^U{Y6lc#5)*;~U-* -s?hg{rPUSHT90kQjrKj`K1j2iXa<YwJ6kTTJe*uPse6GD{{WuQspMOEN!R=JcG{T`u5vRtEO<qF&nwz -)7fU=bV@(j+)g&IHqTU2m*j&k|vPeZZpn=dwzmXjoqB;2PO(xboIDK_j&!F!Lu6g1`RR#_zLWsn)IFA -~|E1RMl+gguasRR@(y2mPXYEToWX#TlsGHgVel!6A3Kds}5JJ-H-@`y%0%`yDY9-h*I$;sYC!yo4f$o -RCtBN0K~B`-fYmxGWxchAp6_Qh9R-?!Ppmy@^+6H2-{q4LPW6sUO(JkjkcO#`MHZylq-QZ9P6<74J{% -Uja{56sIAp`zv{JU7~W_LJF5!ukAaT>5!?3gY!9hL|Ohz@|=$w^QmlW2*a|YLjciy*CW93*6{W7iIN} -pmRgVxe4&~ZEsyAwAFJu6D#7L)U5*sp--nBlLH~RdWl)5-juLs&Ok0q6<wb_1ecc(FG|iil>>Esf*tX -4WA5(Slh;&k0J!9gL?w22j2o7@ZxdUUWd+?oH<e<E8%!t)sI2bJ*>OO552uYMY@Em3ziTR`&PFmeo!J -Tdk0~%7-Q`7S&ZIt^*8HcYQo<fz51^A|0@`?xBA?(4QXi6DnhhLmWZQ^6hvt`j&A^NuiYt9-_zERlJf -yMibP-t#kQ_RjMV)+JLue`nCk&E1RA%b?evik8g=d&92>YKx(b<q+)$@$g^V!9;>U_HfmuCowOHk5$b -lD@|Rzt@<WC2l-I=9B$ola1fg`s7Dt?lzL?--909VfVB5iVp>N<42+3J`?OS|mt#mL`sLmz;eAzCOy! --KS1yiY6}H^E*qkSZOAG=u)4}5V`V9bpxONtk4K>5)&y`Xj-swb?|t|UGhf^*Yn9mN#>pCEbT2D*POE -fZb3M`(_wsfDW$w3D_21N1$ZfLyx1k?Fcb&&5}3C4%j_kjLD(7Gv1!&mH520I+l_fU+4*c2h4}P~D2W -%A&t)7CYQOX8o0>p6)A1#0!Q}>Kg><7VP|h5Vi5UD$;(o32-o*oNPl_oYmSP|;GuRxp1>SocVd4m-K8 -STVso>ps*wUK|mrJTusc%x;IJI@Wsw#G5w^#5nC@@kw+=?ol4;uijkSsh(xP<gLn_3s_Q9fJjq||2+2 -_O>RZdFt@^D8xH5H^&>!N@m%x-LCbwD8n(z#BC|vcB>79RV-%nTe4kJ|Q?!Ih*a0ivH@P%E}~4hEttK -0%C)`PVV7(|BG2{L1uuio=-BCBH*pV4RgO`2`9PY*CBzHZ0hz&5S2l~j8cXE2f|PPMUW8we@tNUf5Vm -jhQK2Hmja8&l5BFU+2-iczk;VnZwd$=a*0rUh$-#dksv-TEXBX^`1hoiIyftweb!CMqipo>^vI8OQzA -byi93-+;G<(_r<!STJjuw9#mApIgFuIV_0B{I@}p`&9(}Zjo)mG2JMAxz<>l-sD#bo-rsPLdG0lz!AQ -U^6YLoP1K=RSP2GLLQ^`mhC@9Y--|F6KJ{Hws?;cNx|e@0+Y{zn3f&wzR)!KvDsJct9suCb<QNx1St+ -RXs^X>WI^+oZ?yrC$(|OV!9`x;YNdifk;^vrHo*VbVbiq~HXyg*1_>_44Q8PA^r>0>Z<=qk)#!*1VOu -qt9-0rW$J2!SZpX&%$fY9;pFhEr{4FR$K06;4M|V6;3PRo>Bu)b#a0rUE4+$PDtEIPXk(BTc3~K_zVO -CA1CxBvagjQb_kkJ#qHWAz0HxFgUj*j3Ea9%Y2Z$-39nbxK+o2jIO|fHg0;1@R|t1Qx-)fcJ!?*wAno -qD*EhS0o`02S4oM<lks-1y^mnRYuXFXh!X62&gYwd)_sQmWHhAj-Sb@;4KZ!=E=VCbVk13G;cL^+>0p -F%!TDtE<KpAd&@D8&Js%kU)pK5G>2rO#mwGPd($gb5J(8p*xxp01}FAp>n{EdW(?(`fQt3e06Cj}STr -sq}f3;RkncHf`Ms*S-Dy;J$xpjlvkt(ANVxBJH6@fOuN4)QW;g;B017j)<pPea01FJAhC3F~{^*V&5Q -9(6GaFDddCK;|Dug86w~eHu%KAfKuv3l<@-Td8Q+hi2)>=F-F@2vT0777C^o(nEJpetDjl;6Mol&q9; -?+IsZ~VO-JD=ifGY%4M%k#<p03>Xr#N+Ga}a?sP-1E%6kz@y+s6m@##L>K>9urggcvlc9{Qas$H=Z@E -Id$xqlexaalUF>|KruNY*S`FY#c({|lSoTCp`YXFR$UwK@Zm%nY^c(grCkFS`OXCF+0LFm&0v2XviL* -l>h`n^Tscf0-6E`g&6Nf0PSkPw1EI12u@Vkyp#Zp=g5;j?NLr-uhMmK{rRJL2tdw_{V19MwzvbL{sOO -GmoplPp0#$r3O<`W24m&5v^8VXHtKD|0A*T;bRO{}?Bx|AzlmRTw!|2b27>mWCe3$Dfwb1UbfrAqT`! -pI!+P|LWYm!yWmNsz5$vOvf_bM@jg=YVuG$F3<zU;~m@4zXZMP0KN9~N4o@PsA0Vp<MtoxRG&<a!ST7 -qEZ^HDJTo{-pubM!qSt&`@j5!w`SsT}iA<!nAB7VEeo^*8eQ%RMjx{-*b5U($eymRVL#B{hR_R8k-?f -zlR{#@4E5Dj5w$azZBJFkn-7oDC$4Gzm*51MGx6*=tf*xMw%t7*g5bEt^^e?Rk^!>*vUY65y>QE=9Ph -yi}FJ&mmJs2~Z;*s|WtH>xsT^j8yt5lK-@377({Qep+bkG2g!%bH^(U1}lxazYI;|S9}Yb#!nj2;J%B -GdRm-*3wmNf!9@zG1ISQlHNo{Y>G@39uuf+QIR}mD-bnA0<M|9_OK6{Mv5iC_-xlHLU->`B5n;WSX?~ -RArJdnr8{o!^Q+qg&4h<N95;4VrX}?5Ezuyw!Zk`<2@8rbM~8-zD9Gv3R51*_yaP}dY5k^DRC310%;H -L(|ahj4*B3-h>*FI19f&hvF3a$FV==6!hOZOOj%JmkruV!)s9rXwkiu!Fl!)xEZ^aya2VnjMCf{Rk61 -3D5?%?bJ+;d)EQIK9iTt%99{9_W_)Fe013&g<TN0BP-~l_oxG_rfvC^3Gi#U@^o7Rq7$9=DUS_f!xQB -95C@BQE4miSXV4g4Z&aL+a;Y57{bG-9T5sMv@cf4eNIr<TPWyc}lhn$ry<#v61cBJu{jqGF4o?M1vGx -}Q!}gY%c_xxHka!RQ1+skIB0owx0yy3ds#FYh9SdD7VS0QQVE2Eg^gkXcD37h9-|nKa>v;Y-R|3`6Ba -o^&PeuOt@1C4Vc_U>a97s3U!8H#|vjtWSY^ED5YmP}nqhP}>WfW+Thsx&&cb=LPkqB7k5rrf}%lkwRE -MowfC}(0i(|*o`m;wD$^6Ls3D^SA|!664N&=j)<{q#N6WKdp=(zw&N-MWW~L%CTog_$elUQg>G1i`T{ -OP8XC_ug3XB<os2OD77rQZeJ&eoG*~Ie^XzX!kvTuSIIG9+<sHz!#6#l#`}VJH!N0)LKRE0gME&-VpF -8>p5Iw3#a2UsN3dTSJ!C?Xd5dsHs3`21k1qqUXK@i!eir=n8?DKi@F-t^>qkseXNFf|fL+D4+?;|#}$ -2v%M#6WTKTm0H1q8&Q&_|Q9`@T1M{i1$8=0Q<&-JW5_k=-7C~T3-}+KQ4^;pVgEcaTtEAgJhp(Ljpgf -1or@NzrcPa3jRptV@Fxaq0XBe_C$xmA$2S??EfFm!q`zOgM6^>&?!QXC5(Mc2Ppp~ehJ}GGXd7$@XO7 -Gs!*TcD7vqkzNC=OXpbpM+$j3bm5HOFV6nNM5y5Q0A7lg`4lf8$0!3ByF%Mo3!CNr$%?}KH>(+Aw?}w -fKsBJAZn~}8bd-d%ON%FdfEQroo2fl&8uNyVK{6)4%(SML!xbQ1uWj^JH{ujSv;19!Nbe}@M=`wgf?) -2R|N#^*{+O&UEaa+Dx+Pux(JK<T7QQpGrNEd`f8a{4#gPA;F$+LZm1)E7TUR8!`>Q!Ql?8IWtX|m94B -!o#>+`*gC^H|~Qx$K`J!GYY}lNs>l=fI#3i%Yh5L$^n|l;Zsp6Hi(Z2i#22bG7+Wj8G+Ra!Igk<c6Qp -NW;?WKK(v*VgI=RI2jc4f~SiNODI~Rm0#e-m=7p(O&O~WH_U*>=mMTu!`Y~SSHQ09ZtsM>>{Foqr~uS -huxD$;MX+Oe**Y%)6d3JP*^iT&J!Jh+-0XF=5Fevq1{D*dOmMfwZfhLU=V#CZZZ+9cBx7l*Dd7O`*b& -YB1hz}5-;qM&L6@tY$1GCfxh-+Js|1u^3g3J=G__t&4<Jq!^p4w2I|(&>?`S%T=Qn9t`t_kbUu1RLza -G2YnlO5H;M_cO8L|xL;So<Ix;@(zK*j)T*d4TaZ$%<8N~C9DIB-}91pKO^$3wtp_HB@Ud3wrSIK5-ul -yb+h*sED9XA!u}NkB!<&1cY;CO5JO+4U5aH-fGZN%699=Nxsk7LVp>-Dk3THjU3-YAUqL^&Qv~P!&nE -CZY=FuBkOpQNL;2;G052y@<<RDjRs*9&i&eB2c7$<{b$UA8$f#gHBEH%N1}MusK0Q!>HI>#KTT?+xQ* -~K|nX<gq+;jJ+GX#<~1)Td{T5xHs^_9JrQ&f@AP#7Hum=F-C}c>zpsGsV^b3Fs{+CUD|`~dYyK(@Rz# -8lY?4GNES>hB%7kBSy7yU#x#2z%kVZF10a8fs>1+g~X0JSxLEPmzi$efeu4nb-t<PiAU+c)ZUMKT;Wd -Y5J<t^`sm9~9b9+?#dnGG5@rr-ajotZf&gqemr$oY~MB1E8exz<+8Q--Ud@-i4mIn6oGg3;GHA{vkQc -CD!>?F{4WC<3(&E3wfGi%wQe_0gy$w=*#slW}QP3TA6p2cE&mN|(;OLZrILJZ|_-^}^H186bVt%YLop -5Y+rJEibHrKk&yM^|qUov7*6cmW=@+TTVWFD}`r!FKgYR^2vcYG09JNq;p?G%_PRj1JSx^mfHzg@wEf -9^|6XP)Oq6n$=rKwJBlt_gZDhex!34lcvE*+VFU;(;12H*0wm1S|Ddd_U6qwt_U!InV~u5y_y7q-%!r -sVV}1h>>|yYRj8eL!)XloCEz`J~umm?7>z_KKZvGZ$Y@G^}KKN>ZRHj^|MKH+7nluj>Ad4F~oM?H0`D -b*?@-D=QqJBK0m3U2Jr`6nz8<7a7GG^?Ii*f34gX))c1G8{m&NZM}j7>K7j)N~;pI=Ma-q*LK$?J5(X -&`n{QOY`r*u^&zD3pzj7k7wcbMGXQ?@z4)f?T2BhJ)*18WS|#+PAypM5l*@kUm4uSHd6L$KAGlXBa&B -oQ^ov(S({IcPI((MGrh76eq-Gk1%4QaPU-!T2OG#T;ugVL^dOSUomoRDsM1Gk_9Qk?Hg2SB14s>))yw -AE69sd&DJE1w-%RbQVBJv8*+;X>ZaA*LY0-xoL{mOZ@%tv{~T4p{|r_Ac()&-D)<{zg-{@b;UIAgKA^ -B2RS_tPe^LO{4zu>{JKO?coP<#V#(p585Ps(NkRM7$^d*O#9EpJ)L+vp>1b@ahhQ}WVu=;*h0HluQC; -ZbqL`KJV5+9jr3_D_S0z1SDK=@~|<rF&7(HZtrO#X!6KSEX6M}j#z@YpeRGCT+!2StQ9^b)|&wC(6K+ -vpfbNgSE({n-1u`+;|mm?Q^%7fcUg3Hs@n+A&vz9=Hr5_iOyysLB*#P!?WH8H^A);;6DsQNKoWV&(r| -psMoss7mJ?Ox@()qN=YO|I4UK`rD|g7|Q!fn^o+h`PqEEvEg(bBt$IRNhpF+$bjdQ?3~nnU6#nXdXO; -+8uIpX+}GuL4-d(rf8Q?;d^#_rn^AXHEUs6quy{rlGi^}sK!*<1n!NlSO!?{(Kg{>qtr=%cnyay%ET1 -w(MDZ@nLV*ei375lWa%yWlU9s1RT3aB-E`}faoWOD`hNe}iz|%w8&V4>MPU&?*F1jm`L%Fe5`k5=xYz -e&>r{g<<TH$yCbmECZD9xO3Z@3dT!E5QK8nSQgl;?VXdZ^{Rzl(JOVz}-_i`wdhaA^yI5cC!|4G4HpX -Dyd^*LfRb>UKF>Lxn^BvRGrB4H?F?gU)%G!n?0i<AOI`31RgK-OtNyis%Ha04Y4W#&@uJdDw(`tN8Lo -BbTggqN^sB@=JLa40O9H0-b7Q<5)}EK`$wITp=wTHRTCN@x{j~t_mPeY+-!7goWGJ&IM#u96n9Wjvh@ -uqY0brCyKNAIJM8TFu<OIR=(tJ0GS%bXx(2>pb$LCt0>on({9D5aNL7vsnAgs!ZtBWOX2n6Bq=k&wKi -R4M?W_dNekeuIpzh~@#I|PhVka`Wxra*2;fi|hLhAejX%(j$0)Ei_68;Py++dVIOkDSP|k`p01=d1bK -fECxrQk1BrSIusz-(l&829}$iOM|I&3J<^KNq&XmkLp^&a_mvYNG;zFvTsMVY~#UFd%cRS{|OPMYW0* -BALthD}0DtI%Ddg#-TpRmozOa}>vV*fPJfVMNOt>R#422SF#RNY?8bw8)e^U;Ars3<!R`+8qUTs)yqM -9S-6it`N0mNZwV>!=9Vh{k`zt?Ul%;mom*4+n#$4t?y-1s1|*G6c_P%6O}eOnJh3o%F2KWEPE14@2c9 -<hUT|L2YzUd`fcIVm&lmsGfLceQ>v7Er(WSZ+}_ibRt@kH0{3$eT>L6^{Ty+O3H9hl`T(!gg256;a%) -OUwJYoI(odz;dD3D!7*T~4*D5451MPt34Ye9K6+4t$gk}+$#*}HX_xXWV2-Ks-DBqI%(-xWQ?*Fm3=$ -&P8y<LmTB@-Vq51ic7<Tp;;Hi}QUV)yWHPk;GuaS=lYrN<(`2hHRnsiB^Wi+j#lTIsx=A5gWwE20a;W -4L6OhM3O|Y{p9wHJI9{ZaTbj-Fv*w6p7?SxI^Xb_Hvo(#1X_hdzgc9(&kp15+I2r?QW!kV5u1N7PF`2 --=Mk@N8B$dTSe~uep<*2zcB9mO!-bAX)>7ios^6>?XKm3!d|N}xO1C-ZxM^UVQ^wa!}u<|4YImhx7Y; -zw)h>qoylp|WV(4vavGH`S3#+ts(|R~>k%|DRV7|;6*`KFCZ{gqybVs|%hnN2lEg7D@*#824fYCs2i& -X3*fUwSj}Qg!)&QFu7?dpXDAG$xNRAW^!l<crLh$*ZBh?g)mY&{Q4(U$nKSx!_KSNbN-tC8|3i$?A?S -KiSKmvy#0^H%$k($C0YR6X?3}FNU6EF%x2mz85j8GW)U4p>@dy=Ev5++Bn9{*CAfDSlBekMnN$WIh;h -<AS2tKaW`A`jH{h19yktC0NEZa(zcl=uk&KT|M1X{_|qJ054Bwxx7G@{dpzd5md1W;~{cLg)U}{pbfE -!j8Z9lgY><n?}F~C-+E_Wyj&6>?5fCk@EyUbEyuUPU<N8B;=7Z!>OYM3jNc8Q@=x1*Y`c5%d&%!;S7a -(PYfXUP)RE+es2i>UqDss?@-k-Bmn*vRsFK@zl^HXzm2N4bw-T<C7yzuc53-h+$uPS{3ebtiA#%R0_U -YU_wjQi1`Y1Kp)Z%$5N=|0$|u`a&O&eY*iGuyGrnbVg6Xg?tt@D#>-16wMSB6lLnZpwysD3m5DFj7UK -58-8fcAj$#$xOIPK<A%FI6QNo;TFgM8EKTV-^M;VzqJ0uG@s#CW$uUpfhc^Dv)cia%<ZaCDS$LZx`SN -5@DM&3wUMJL;K8kF}sNHh$RJc#44`gy=-92f8A`^ZAj79%2)%2)%||r)o4Jp~31qPHzd#BSO;l`na4J -5PA<J!JDRT0)j|is^yfOq@*7W;yt5vfS(?*pDlPK4Kb9f*RBk4enK3VYX|wMZg_WR;1ba|aF32@N_-1 -J9EBJs&^>Dhxm1kK4q>of$*+xD5%=;+a(5NZ!fdp<i8gs0%m}P0F>2msAYEU}egpI~$dp%mlEP%JZhS -SQbAvtaNciMfe?ys-M$7gNhOfA5NS0QMAjA>WTpM7to~4>#EpyB0L@yTP&|QqzyId&OB5=LSa~cw3;% -_GZxQSCSos?Suo*RN&R9|9xz}@ncc3+yCRw6=jYO<=J<+&u)=O(@)DdF%hfp*yJ#GNF4gs|l@N+ago5 -<*rlpaIaRr;*u76$XzPD_n{$%(>=IE_L>&!Qe4ww(-Pgs5jUcM0%DNagK46Il)9^Am;4^tce~&gyKE_ -hFa$zqN=6HjJHxf>H4-_<}mQAmmyudBW3XisERWS*bO26k+^mOSDGzcUbrE~!;<;;>!Z)ctF{BzX}IA -^0G;Xgy<Wr8o{)Y4luLVyPl8ozgZr+AW<r9e`=AR1LR#E@rkG8@kG2z){5fCvES5xua-Qnx?rqF#>?A -;Nm}2d&_gLAi=}gC%<oBdXyu-`Qm@HNi?w2rog#M&<Z1R4quZq5JidHP0VPp6A8+a_<lRl$%3EMSDiW -V-}gq84y?KLfq4-_SVi`dc5kZftNXuCymi}y7PYA;zXzK{d2Gvn`8GG@=|O=_HO=0_&7UjdgGNegS;m -EvAp+_!Jpy!B6HI_p?92=O_vyxaH)ZvaSF=a=X^(L^-zX&ut5Yri7@jI$gDKFiboh*F>{PoBHwaVaCI -z!`b}*fFxO%(R~Yh{D+~H|$U>pE6WW5Of|oPSMrgo@sk7m7e0}lHgjd7IpDWdO5@Hcf=}pEmz#41|U_ -z<VX4{=0?Q{R%5f2yf}k7wOG#G-(-ls1o>hirGXE!lSDU_I$04S;>K`+-^mH!idX`{(gVedMbad8t9F -|tB0gCvuNT~bDq*#j;F;W!q1IQJUE!{<J?-pvQb&mzaBCjDcCD#G#g`y4gE|oIi6t@#Mquen$h$<J7^ -VU<eM)PTvaM3;Pdiw;)$nByrZceax9k1R`S;7+tsL8=5b7lFkYjjo5Cg98tzQ;bu6gSW`KO=)|N3~6G -B1x-p#P!wZ9|&;kHmd}J(n-K<v%|vb@9Quoag!fB>T2_-}ZmvNBixtl7G9{FQZF-ywGo$n;1f32ueaY -NTT2lxhRChQ3ON~9NxhfN`V*(QQt#f2VnY)>OAlaa-@Pt_$b01EkMLEPAvVjfbT$v%zmPh@1n0Atf3! -mo*nq?$moz54Udcx3Lf%0Xm&ud6#U>W@DK^5kVDxVOMXJKAE2)t5Q3lipb`G*Qb!IY9x^^?H~XH)0jQ -&~eSgA!ZdrI#9kEYWI)olo!w5b~gDCa+#*Rj&FgifyF$;XZ5bRHxF3lly*Wtg6`(!aS)+ZkePJ4(!oV -fuTK<j&w8ywSoJMPnUHr`bk^$WM8P*wBNbfI%lAC26)W7V&4&~?W_2=JMRbUf+)dD6>=sY$gC8LqE5X -yU_r(tk#PvJ4X=8Wgu~E%6QiOZ&RH{Y>Sw)mi^gIgd7V`sdd5d_IJBe%V$r&9_{ezkS-jK5O8goc7nV -J}5T8U*p(t0k-CEry}9FZl!v&x6|d3s;)%?9S%80<cbIuJ|N{pU!z*t5RWQDmy&NoCFS$*mK~4X^z+4 -m7^bJ`x3Osa4Hc&}j)AC@UG;wV-ihjg1y+*O`xyzWdP5Dh8BfSM-}1GE3xS`bGC?N#%2=6lGNUVx@|4 -&Ed|uJ?m5!A?YEBRuZgE0S{VdKqu4O%QcJJ-`0higEg5fl}t(`~rZe|T<%q>W=p@C>Y%y+Nvp;i8TVe -mO_`g?4TXXth_**E$i@Y@Rx+BZ$<H~*Tg_49H_CduN)X*2G>0Kd|An<^uwFm$=`AbZewrBQxnu1oxov -f_eMW;G(?^){gA7Mb;K-Tjc+HTLDxoedluo4?1<y!?it2{4SU&)^elU2lD9Q~t)A(|ZRI%@%ghA22l6 -r|VYwO#+NN*2{PT@hM3bRqzIT<dSlE5(Z&exAjZEtWjpzP8r_!TRc@(OH`lmrj^SYLIWiMU?sP+KhWe -#;sm)z_wwZe?omEXO<Mv}itgSfq>RMLgWn2x-2;qkWtAhlK+F}rbS2QVvu<8|!<0@FlfKb3T-(bjM>H -9-*Zbx9Xq30r(f4AM@b${uF&FvUi2&KkcJJUu0Sva5uc>C@X4~voOt^uMx!A1UPXrWhFPTtehO0Mq6_ -Wj?N4e(+s@0<n+WR)&IQ9+b8uflF`bn|q?upoEew9(APb}BOxydzh`h>q`p1LDdrq0Oe$*?H_A}Q)mq -nF9^1CR=Bi&V0u{6~-doe|hSc0b7frc?Zji~YG%M1JcOQS4A9r$`6{Nen{>1fpOPAyEq3aVLhtI6-}P -1~&2Gd+uHkfj$+VFUg4HDDEKXF=smcg#BUiY0mvVeI~<>hJx@j4D6UgLLPm+@yE~Z8$s|8N7<cP5`Pi -`<l%64Cxw8AILZ&4;+G1}r)Y%6hcNc;1;H=7;YR@pihgEv?yfaDYBxtFWncZMN#P$A80@H6MbM{z13I -n|{b+h4N7~}goFZ!;PBDi6;}mfrJQYaxxVo~boHbctMuMXiCeQcJ^#1AHZ9cty@hrf<afpX!0sf6cJU -k0<WC;GLLp;tJ_%{ymIBVdaIYf0%K4O3I6ZrC~N(_@bLv9$flxrnT8v#bFqj~YBZMW_B+e;hWv^QB$5 -VGr=J(ETvpCG@HGa%^D3`^$7^y=%T1~%KnnrB@1SgcFwW`G;(p;vaHly!G`t3IdGN#-W~iM<nL1`!5e -TJ-Ji`3AJdjwFku+FKqKyZy^f0{EVn*qy``yuv*i<bo3lnuaS}8snO14R!I&4F%A%*6lE>rYpMXB|)I -u(XtR1w8^|e5pGSqYnn;jykWxX2UyC>a^Mavw=7(z>x~b{RX{<h0Txxws^SbgXL`o&a;5iOIXzXP-E3 -T(9!A{>X>IBq5}L1ioLA`W6u}t30lW{YuyuvHcbMt#^p*W$w|*_5`LDu@f3nc;tmtnS`LzW_VG1G8-B -N-eic`dHK|fIjL17>QgD{Nk4}CYMo1%v$BEzF_jiCpr9fOZqM=1WOQYS~=^vKzMDD)`$T?3kY;)X+7i -uwo`;0ODjz&|_T$B1JBInY0dA9TVv{tQvhj%Xo7e_%j&)48v>|2&xY;9=ZT><COC<Opu|{S)M)y@ecy -Owz-`W?$qLJ{jNm6JDU7bT3RCB>vr`V&P}9ar6_G{b^KDeWHr+7XwOf!-73y^BJ;)a<LZC=y2@2jbu# -m--;^eS^UKsCBL>t-ztNOM^5)k!gr(54`aWgcVqd5eE-FuI=^gFFW)MIy7q6TJ@WJN>!Zn0tNtoIJ=( -nZ(W$PF=X}(oS*!vg7+fTdPJc;HgJvJV4R;K!llWweV7Z9cuZiJ!JtWAb-wOf#EE`~aWCNIwY`_jVUt -6YW+Cqe6yM{75S)F$_heyHYrAC>Jvt};|fY17ite$dhFF5ubFPHXx8(8Gw<#lad`?Bqb`vWgds9-`8e -IK1`8v9E>s@fKcOS=HjLZs&;%U8_eG@KYkP}31_9Kiv6_13w5M&+bWR?uJl1`noz-lHJ@M%^T*_9-|u -fG5mfI_bQ=UM+|R(i#%p=AMe=Lc*#TzFbCjWpZ<-=B3F|0wL&mk}bj-T_f!)?7jgLs}uGG63AQFkG(T -bH%N8;xwD$s$s{G&Jlz79V7I!f>S&jnn71bZ7h5SFsQly@z+2KAb~HQX7Hk4zP-Yi##bU{lZEC|z37i -thkLXEs>JG_KwJ*L&TLOPIZ&`ekwzNyxk(km2u$T72@-u!KYKt&@uiEPG<}E)XG%rl2$mW}?iwfVw1a -D&>*u5cjQ}0)+JNNHt90ck#dx(Z8m1OI_&>0V-B5SwP(p7q&%iDP2RZX#862I<F`;7uxD!_1ZYK`G7n -sj-|wg8lcA&h9yx!ZS&th;0?&hj`zqEf-Zm6+le;W?6i2|P%<075c7+B3JQnsZW9MJr^YDyJcADiq>z -HzRM&?1+qLn1Xk42)e@2%OX3ru#%CyJ1~G8E_xdZZ=MjCIKw4nEN(o@xX@X3%+$-xoBb>>XRT-A<bV- -=m63C~DwsvpvKiVb&|mkMNdu$IRkEsSxKg^*T^YF%jwD>{BUuXWui3jvcF;^ztF{Qx{f=LQpv5=M&Kf -`+{)Q&e_r1-(i6Z{VLVxW0eiJ=>ik2w4`#lf=cRvVI5P|P;1ab@^BvAxMA@sY!!y%889LX;1qu7{5pK -&<p(Wtd!aWFZ26@?$!HEa(EzTYrSe0q|17erErli7og-S^?ihZBY$(v7>PLOwHh66zRec<5gz2QQvVf -8hIeXBU3@*LJs?eY&L&B0YH!!uFqsz)*UeGXj4`BqB%g^k9sIN6m9TVem5>=!kZxpZ4eo{&WJQ*+DYf -S5E$vCC1*4-m&=pi|=Dx_x`@gY0o*(j2ky7oP@agUGPx+w}OYi?)Q#5C-86l-r@Fuf8+NKw+H+UzqhH -Pe`s)vhdtaX@Q@7_00rfFnw2;|r+FmIf*1Nk+4FeKR?#A__$fZCn`b^rO&`*wf03Z<!KAtwEYTNtNVo -u5k51hQ*Zq0+2s)Xm_{3jpc8AsZ*|>wmkm$7_)Nm?;oN+=89$r@DiAy~$43l%yfq<H;^Q^{?lXUvKHL -SxI0KawyBQ;6=tu2<Md}+0)@^`KG%a*iAe`a%E`uW=V<9!KfdJYU}0cZs#$#y>T^<ZA@j$`xIi_ey%J -yuC3-fbyCMiC~}DL_}G4Q=i$s-w}~ko!8E+UX2DXld5(K{U6P_L4DU_ZY4fUZ;iHOv@uZI;y1NLFvcb -p{M-p%h5CGD}uVZ5@PN|0^=Hcf8S{S+|v59okIVG)%-^*{myKDv&wJmCW=8A2x1sX5d=bj1VK>9Za0t -VWFUm&5DFvTPr8twKA-rQbb4s`XGgj|LXRZ>(RK7i*a7*FHn1P5rzOc@Z;!F&$&vftP1C;X9w!_bmya -OCk?A0R=E&~<9^JcNN)11X8L&_JfcVgKv(JdKFgt7|9v_yN_?XKhkCGh(lrTDUaF5sqJPa$De&Utz;D -qdl-@}xjnIWIJh@yTX$v@?R)CUg)DgR?PgE4Y3T$k)?sT(QPBMIbj-^L8{5i^wkt(bxTA}{o@oyD)M* -)NT~ze>6oe<$fu{<o4YfBlq?GyXe7k~7vbTew4cOn{UdN0;iQ-UwCccGSH?Vq^u%sR-s5-}f8jKanup -LX5behPH6K(OX`%&P0PdhF)aC!`OA}T8I`VobQaiSR5o}z|x~`@8PEoZ#<!C-1td7YJ_9Qp@-Ugzp1@ -#^8Ee+OedC{Qy%LKBJ#xYYRnN)axSo1bmFh|w7r(p9!vYg3Prow0}}@+A&lW$f6E&Qj~dTpqt~}Ymr0 -gVv@Vopu2AX#$G#97k7wA8UTZfcD2~WBL^N6&FDv!5y=m1elnbZ+;u|u9%}6CqgUC<!hp*GB0aQulXt -?oWJXoT9>BP&z{DkhTVP8FXHaDfkP1>6aTeHZa7`eoS&|s=@)v-bqWX}MrC7~7CEcR^kfP!n8SPOe=A ->PeBYBgi?LDdu~^raa3Nd*O-Bf|ySdZE`#q|TNAUrcS=*$PsRDK=x(@QNG)Q!KqlDTL-~)4I!3-}4u1 -I?b{Lf~_#&+bviU>dMfZ3S{Q$&gdDDB4y>Hl*rCkw-V{mxU<jkuKK3zgh?x(s0TZrPDR~UH?uUd;vHq -Jfg3*XQUZid`CCKJg&4_>vL7+h9o=aJF}b4ca1EFw!SF#iX*aSZL6A53=H2iDH>k0v0CC}$Y(kN?=$! -r2TzI6BJNM~5hObKro>{1Nv(Dnkhe-&tblQCns>po@VVC;dGT;PIN!yPF(p>&2J@?y)jL@<wpX9~6n< -}zm-R+d(t%AlJNPZiTssAC8T&Du|;6A#d-XinSj9*GxLaN}B-`tTxhK|F|L9et?C#S-08iaF=6-MvoB -MewB#QP_9>SW&!im~Es2*dBt05vuWRvTl0>`Qbx$a$}ZPQ3i~-V6(Q>7JLemZ>!XPFDI-r8`EoiKbUa -%TirBpgpVt$gMBPNIR&Mj3>Q{S__7>;0xzRA6eaiS4d>vV;~cr3iOoFHq+4ZY-(V+JNVpwRq`a}o}|r -;u@V~-T%SZ9XYw7pJiQ2$jVK7UP<)2KSouzxN2`3TW!~jH_Ig1}@5xKBz$)pz+CnKelFaNbc7T^*Q7* -P;Gwtf|!g8}I4TxF&!tq0#Cs$SNEuJ%SxmlLmtYd>D8Z-E!F^ypb$#fW2FI;uP7AvVA0>o(8fN22e-A -7Oz2qP-EJ{;_Mc6oc9;r4XJ(fW=`kTx<c)wv#ZnVk6?l|`6Zk<}|j*-%mnpf5-%i8(quiNYmR7j*b~2 -Sr0a*`R(l_IIdz&y7JlA*(23r>E-X;*XfWTyOdSwh}O$b*qiS4Qu%u_;6?pqC<>%xt-Y-uV7tTf~UpT -+2BBmjnrCs>lk;c`lXKxO@2BMaQ2(zExDy=U#$l_IYiKVbMnS{l?*0yQZ6XTOl9girxGsjQ1rf3&i;| -OI-z_&Wo!%N3U?O=o#bZ9POSEc7aD?TxSCs+iCGwt4`K0UWM&d=Hxdp`e;Kr~x~g;f|Ckp22U@p3KZ& -J(K-T@oi+qJ@f4;zPN@XBKfz%GtFoeKJ7^D#7pp8HXj$klK9)&Xm`iyb?9c+W517<~^g3=CqkdH#jA* -+QSRF7kV!AD{%OMXiC?d10fB-xRPO+Kn7A$b6$WA-b2RKv3DNW)Uur)ix$h`>>Fpu1xXZM?(7AHg>G) -94NzN8gt|<i9>G?C@vI!k6Ul(YZw&De3*pqtEoGLyU|(LUimiUlt}lvl5U4cB0V{8}D#*kA#swZ#9Px -*hc;`zQC}R0b8f3icWM!fy5qP>X+_!sowdc83q*JOnfpyX}N54@Fo1qZN5&{;4T~zU%7o3c2rh0hoDJ -ZeHs1)e0DshKf%HnwA31Ke0V5V{0yQ@1Ee$?G;bgB?60`LUzNLnBgm9$?PfdFZWtKL0r}kc)eOJ=_aW -@cB%b+*5V=pp`e&F&ACL|M4m|e_&O;C3u&=sde|Cw$pIzghT_W&j*Z60b2z>7v|Hg1!6Tk(_0`vYphO -;JXh_HcXm&o;?;Tk0&G#y8ajgU636w1v)NW&fAEEW~S_s+64lOE7-NHx-CLA*(`Av3V3P~}u%@hP~qn -m7c)<=u5xU3f?`o;<0g*0S+zAb5A#aD-r4fMU$kDI)m3q;473oTqH*_K=n0XzpI7({R;pQ-$TRpiCz$ -)m~?<d|<Lv!?iZ}L*WAFbYR|>6)w-JUIjzl!b{&~1!{4O0EI}w*^A)c=Cx_~?tRI)wZ!4@)L#}d&L3A -k1A+vT*z2>lpWT{+K2qrK$F_f33^>u_@)>zoNWHA3;;}L@Df_#e9>WT59P0#nWa9yF>Kza6=FJ6pvU0 -_VC4zWZm+CT6-pZXw+(q~nr-U|Ds(WdHuV-_=#nk)xrsVsTn1Sc*489bk*Um5ebu+H|yL%X*l$J@!ug -h(Lqjyo>S+rt{`@k4UM-N?`zHi(FQqLeP0PDJ&Li_}AmaNXqg&_o=peDUUn-?<XM(Ol-x`w+)RWA)0@ -Z8m7K>GE(28+{&uEYW_D$ATp@0!CYf2>83?YGU0E6*!?d732p=;%O5h7)^XQxFPqaD})wJez9K@iQJq -86Z5O9KKOBlD!S%QJf!}ieH;KHOvd+lc*ox$AM5nW!i*TZ+j6{HSC`F`Q>?D!@hh1@vwN-BwxE|G|pE ->HBxU9Z75Y_INq+O%}Jh}dAjr8G{gS_^?(EGy>RM8R|wv}d9sl3iKt4S(CSs4exxA#pK>tpn|knffZ+ -!h(!&BdAwS`m`GVKgc6f)DHMLXU4KNG#?ZMu4`rT2ZB59Px`Zq?M1|cj*EjaPPwZ9I}^xF697=eL#Sq -d#w!in*%(0!@^n#8A`86Ma91`aKs@XYw^r3qg$ROny3OB$<F_rz}s@u1qQ^5ePj%@%LFo9)Sz?gDU?a -&fWQ@rf->tmbq9aV@W=6>}2_dCWyRu0uCL$EqXshm}vkLRJy^s$r>{wk`yOrF^~ZSq^U}zTGw#%0~`` -(p0!*CJvsZw;xv%5y%G83f^@X>iktKuj29K=lf_r1Au)M_Ep|b(5U^ySemE!zDh(K&Sfdg%liznQ%T? -^!3GyUKxc=Jp$F6UmE<|xZnzX6dWe@IQ~I7oI!bYBo=>@TM8L{x{Lu&_Y<WE40AwJ{qzFS();Aa7O3m -Ef?!Arc6sYQ&dYv5kl`=OgkSO6H)0?^k%ge_JQ+kE=GB%M&Jqw7)(C{SY=xV;-1dmcs2Ci4Y0)y(D)1 -V=8%uKWe5(YDxTgQ~PK9|L3ATKy-N!)W^GMcf*hF5W4Ym1&7mW1~RF!W-NVAI4JIyzY|+8NDOWLQ;V$ -+8KouV5y>RC)}#8iNT_B&oEyj~#qoU{I;iwE;ktg~bTP?cORO7#mqqQL@`3CrP`;Vo-akFS8y5vPf4* -*nI)_xOQ7iNY^khvsGjO&D8~_?voCOiOUX~{xUFhto`wiLhB#HI=e{!=kr|CvF!iR(rJDS^*8wN->&r -)CjO;$e%tYdVmmw}aFie+5F-haz$l0$pnW@zV+6VX`6HZ|rAPnMj_!6~7!e1?Ly%*P0RewtSN4%>#SX -j{VLy`8BeMg*eW51rKy3$uA^cMU9(WLs4{~ru9Mt3Vqd1#{Klhc9KPro)#KA_6sRO{m+0mpGh6f)Y{f -H4EpXpZQN9J~a0{OwEIC@lE2=pf^KFTxXXG;VfTkzz7lQD8|1L9~0w10{dk%JOI{)!TiL6dr0tF^g2F -2quEmBU?sgcHkeTD)9WUHFYQzk(>X#+qbhl)#g>z^fO5I}{*~$6}iW`-7#cHL1mLpAiKAX|z)K#dX4q -le?}aIE`uTza5F+7Za0r+>Xn&qQ_rwqU^f1>B?W#S^pMR{L&}(Cs^^1E))1G*ZD`63H+7o{G-bR{^&a -Y3SI<$28=Y{I-Zsj96XmBs4O1mMbl<wwyi)$4vXcpWHi=-YBt&QGB~TZup6oI%mBzuw8tbMv^6&sFbn -lKB=w>NJv^kc0Iqycfs?n=>+8!r>GB)Y=es1+^6hnfBx>yglPo%ZYeyNbUPwRp!=5g0*X_igSy2$*Fv -gs8NH@);5IQq2%oX(=cL!hU89PPtb_RqV^xy79*TS$1#$pYqu?PmyX_1`UZ&n;vw;8#vseQxWOyENzl -!Vjyte<Qcxn3g}a5Y52774dQOf82bZU+mII7G=-2^>0<2roWk>M>*2f!%IePGQ!`*-|40Z<{)5Hb79X -=eaZWFiwW*!rI7ai=1{Y)F+|V+hnG)+m$Dja^I*5Uh3OrK5w!W3@VHuQJvwyzEYFrcoPhKpK%KBLw9+ -h5vGQW`C{rLh=53cni9R8Ay1naXt{<@r@kUoNtbzR1O5Ytf{|=W73N=8{@io*4K|b%Uu3oMwk@3Ry;p -?Xb}c&emD^psMERtt;|Yq+6tRCA@ww7hkbZBjo6wC6^NoM$PL}ox%sMAFxdUU{OvyD}IC)~vhD*^;$K -)xw>s&NV0f(VHSIJLj&#bP5U<5|j-g)U|EWJA2=*EOPoMCVq+5v*qu*^8&r}UbU!QvIGoAQ8|Qx)`T% -GVTRu0=dO)qm`_W}`>BuHfBj%W=$Xq~^T6iC9l8_YGeBO@Yoq+VlPS7_5<Ua$WRWl1<1#;(~GfAzlQ& -%OCs^UKBPbqmdgm3zQKw4JY0N!0FG|lX?o6j*Q@1bvq2*4MutwZi01VQ?X&IN!%WchRg6-(2QBKqNSb -m*JCd1Ls`nbD<%ooE__`jl(e4g8F@eT=IUCHi*$k9l&u4zA!m;tYu?>MHMxIz<zpcB_p(FI2teDVBgp -QKZ#u$Px|gVoR;93^_e}k;X{K@`r4w11W=Q(N-7@%`+7y-$(9+b;LNx;9%@oe1vf=AV2d75x4UcKy(< -AAWTZzu_K#&>}V@s8WZM0Bh-wEZCR7Q?SDtV7hpfuK)2bWdTP9)@s*|QT9G-}3*n=S9|g>N^urai<vp -S;w*`=+x;l*4QGrX6qA{+0q(MkJbdDFrKaM3pMgH6$Wj>tstvunA1q6?<H^7dxC*E<in}6$EgM+8~#@ -bB5#r;E9dmv$$m_n5wOhagCF5rLlzCf@pp1_qK5X5%VE-VocvCE{4*Xf^JXZMy>+XQfJ_4A=%5=KU_f -?PPP}$a5@*@vsYxas@_yA!|!6`&l__>>FZ<$1vyzp;5{im^N7}D0M}c!yP>$qT}kGld)><dER=gRVVu -a(Sw{IaoN(8>qF&~ae&-#(aiSKHDBMCO7&5>WSJ)?|Ri?=CRYp!K@ti8;1;tYNx)t5cU@QNumc|Q$1L -^HrSW^iinlHu)m&7Ey09CbcVF7m+4Wn*mwD|8%sg;WQ2Y8WZ+5a`X_|Mk*Jzo5Sb$*jsgb@%zNEjht5 -TYoQgm#>W;ne;wiXs$6U<3>y=y!=U;lW=&B#NkyP-J!>xhy%*8g%F@9iyq>4?6|k;TH7$g7Al%8HXQA -Jp7r06@Iw=AKDB~9ChFwZ)V^@<UCf550X5w9|!yaVnnlpVUL5yT4?kEf%pe#X2+>!pSC#&K4_)rXHwS -}9ZTf%DEgtOM#%v(_r3P#;NekNPT)hyIXtqOe@djO4kAtQA0mw>y@JJkI!hui?nG#%&#Ch7h%{eN6!3 -4*;(?-oe}fhe6a{<(qXYv~|9WO|2aA82S^P6l4E!6kcw8p%576RoE))3Cb$;df|A6Kn4uTmzv*rOvrv -!&A^X-s9xPy&hneH%{23s5wNvHX$pCQphs<{{KIE0YtL<64D^0IC3%qhDr2Og+)x(1oy$M(`Db5q~-A -=?hu$dwDuZ{1BlUz^1q-P4xY^0}<+D)oM*`7_`bKmCQeZ{VoWULchW=01QEzJU>)hL%>V+Umyx%z<ww -n4h<AZrNFT9Nm<3MZ*Ek-&t*|o0(xm2S1^Al>xTx^)w2he#o$+8<Ls23n6BG{YufhG3e)Vl;lO<>d^s -N)!=%i6~s!A6$?cD_!iv(Qwv^{uj7$hQnJ?EEq!<|ihRla;;Gk>`3xp)y^A5}LS9(pf1T?1g;QvidAA -$XU;pF$`oF_|ew9`EfBwfrzcJYVc#*G``VXG<8~cnRI02y~OraDEQ#gu}Ac;{R3_~9sJc=Mlia?3)T4 -)$NEGJAHb~^bo%LV+2N<INN{vip5N9PpwB~VVkYoT{bynkc(M^*(qc>TM1-3@vO9nvj(yiH|CIVlPcl -46=3>U3dr*v%;V(ZIv>a1rQdR$&Yu_8j{(4kVxHHDLG=+owKen>Z+qyCXP;Dq^4hg7~OG!SPXO!awz% -?9(nlARi$Z_$TsD2Ocu$F}m4Le;Hk^RAnv7zQSl2JC<d`o^r6IrEgej((G`24XEtTW2+Z6GU210Qy3k -%>2_Q3F(UsN5=~G0kwMi|XWsbAE$l_$=eZ|#cu!uxdXPIF{LN!uMh>pK{XCeBADgNQ4-epM^+R*iZF* -B}W7eR@=hXh{nE^jKwZD31fGX5SpTMu_i(g-;J=};nBd7V78ekwwjk1Af*QyRgTCevTpwW$3286M%c0 -77HNxe6_nQpxM?U5yo@g~#RVArTq^)ne4m|51(sabA#<-B5C6+?|x_xA$$vwZe%My>sNR-0hWDGmw1O -PA^FJSx%qbyCTie4w_g(vJ(vJ};JvQXg9g=CsN?tYmO;{k-Hn9^GhyYZvz70rl<SxGTsJ`u>503FUcN -;J0#3U$d0Ucqz!+J#xpeBJ0eWU^Jq0+IzNXD+FSC>g^Fo=QrA+#(&vtVgDOu3;RoE3;T_nCrpqSLBSx -ke}NcCz%Y)JAWo4Wbm)9iC~>rYqTe-J)CWoKAA9ISY=+V!#dkDG5=RmbA&*4g(N_t7hD3e8WPQ*R(W9 -u0fJZqxL=U2LnjKnEyE)4~N7%7mk{rrVDE?tmN5?~9_ye;AeahU?r+B`f50V^dO)&eE#nZzaBIsfKcD -Q>;VPyvuF~dIi6FRz{lFz8t5IeG$8Gf)Pk9s@!>0hPxbNy3bDITfF(E7z}`9dS3tp9pJ9>#X55@(G9U -*>Pgwg1R$LI3|XTfaNCzizg^!@B-8>DmMxy?IZR7oB@O;fs?@UZ=?=#9qQJp^gFaA}!aL!Ic{t_RzXb -<LY6c=iG0DnZOYD7+Eo}4MjwT1mEWE5#JL#G~Y(xpcz@GK%u|Qu5PUYvqX-23RW9to!i=WkQB@#P=3z -S{4G@W8@|^q^?OTxKN<2-nEazfS|SA>H=~2<&wT-Wk9AG!ZqJX+3nu;Ll{X9;Wa#M(hiC^{YYLHpcDp -jx{pwC_4qy<L*!hd=gb7wcT9!-U>F3fMCkj+S+fzRY`%QU&B!NV%!bVv-sU@uPV0HPmIGqkG^Gf!x(3 -4qApw@6bS??|AY2+{4L2C-b>3@=R*u&rbXA^cw+WpE9eR@s4`=oDd;lEnwt3CYlMSjcU0YL-=zuS`uM -u#2RLtgMB3=Dk=9y`7w<6}4w27Y2%=nxFv0T}XqoxOxS3=19|%_A6esO@3Y5yl?SY_~rj(c&09Y}X;& -@}cV-eIn@|7yqa)CH{oO;8Cc-K4T>!<X8pyNVpu78}g6@#E`>|rqEF<`bfAO#xYBdHkBR6?Pl@ljL#0 -z(Qby1Ou?rQ9{zKFb#f4Op!KWO<7v4p_3!s!hTo8rb-@1BfFm}aT?a7>-!t;y;;u(zc>Ino!fXHiQmt -`Tel{H(E8EFMD1hDY)E|aR>+Zkh(Z6GLa7TY@E{}$euk)dItEYWhP;yXhK2}dcznDU4``HxE_itwM+4 -ZjnAw5*V)j<C)fYQZmfVgDz;BGc?yA)AtHc`b7D*I(;dY;Qax};yUW)4Zf>t}q${$iHD8wSPvoUy&p$ -BUgm*e@(lbbU0&4Tx{!=n35rsaEZzrJxKq)vD}u6wVtr#_`Qn(~>S8@P(v?SV=cY?wB<dLy^Zj<bDUF -+80J0o)+kpDia=`x#7};86?25kFAu<(o4LZB308N^aQaBav4`rxt^wKs|n%h0n0|FF`ds3Z4*WqdV`X -@^5NUc??sRoDU!-^ej2y*hT21A=UYwpt8{)q8yhTYBCLQSUxWLqO~K$!40s*->ZaGzo2J^ON>xO$D;U -CDB_bn~z#20jFMi5~qj+vCnRl)xK&=+;i+R}IGMUf7`)oU*D|&B(x-~;h=os?mmKrM@=QXsodwrM`^L -7eb@PwL0!wtYJ{IordXtrAZF?d&&)nH?lYH^8q=z_<~dpRqx9}?2gKqIA5cU7Ji2ZOrTh@UhPz#W22o -U25*rOVL)`{*|W6WI+x<oCTw=rSpVUdtAi!njLfDtC5O%c@P^s3nr7PXJoJ^&nv@5z{bE-WFoSJm2W` -9SeM+PP33awkrkOH4U-vN*1~&>8(Ul`N%*Z*e2e9NUe!D7TxmdHgA=C2um#TgByd-F|P@`%^%vVjh^; -E;i){W)$HgZR^LkPio50JO#riX;gf;zZVOX>pw+-s4B^fNa?S846y&|hIbpR?Ml$R7I)w==DH7)#oX2 -z(6MF(Yr`?|S;Tk*)8*<ki(WuuUmJoZM<ie*nha}P0$y47GJOKXs;6l?GvO%ny^tD#^_*z^E?Aj-Qq^ -*woJzc5Km~)<1<u+mLtK{V<(b7C#KJAV<C-_NELj>AEjDy9`Tl^qREPtV<OOU~J^OL6`n?W<nl;asFr -$ZC6-@*Kp!@jrKi4Nb`c`cc_pL^h1cIB$73|ZZt%5ygbMui0T?6M_idn#YuJKjvLW3m@}GgnN|*|#mF -FE8-7h=H^-2}pg0_yY1&EXp4T$bb9r-CmgeQ&kW*_aZ**1(e1s$si{h*^T149hjJ7XWYknv|M^14-EM -=AtyU#xk@&7Oy%bTHfQuZhg_$Ao0CnG3VWw>a$7uc>q?Dkt{J6Is+`Y$0i5qNHB?s`eBoOE=DJCeNp{ -?Ef!ETf8>Uj*oxk{x<unfggq$K$QNoZ^1?vSdK4Z)P7(Ps+C2VPyc$N$rB!R4idNLuQJWe@}zJlnfv` -g2Zt<w!#;c8wTcGcS&z@e=m8py_oP7?Wbg7cZs*K3zGvKBnTtJZFf-MM0aMfO;=xt<&<vU|y<s~BT*O -Sxi{=59{_Wr7pGOiySdyzV_uNpxid%{fGiqG%pZDNAZdrE9{FNEoVzxj_-LqiMTy@pQg70myC3(zET3 -KvRp#E>V<9@`cLl&|(XBx*O4En9B6z3BtSzCBj#lKUPVFFgK`Sz%yV7B4nQ(oQNv{C#6(0LpL3hlhIx -5s2<&E<Fe--8Wc`BiuWPW?_G_04f-BY;b36{6v`0NJ?{2k{;$WN-$y&V`wQUtH^}QRE%V2?>px3;i@J -8ug?zV&5g(O`@Y6z;l1DRG1|1?3M`Ig##CF7|)olk&doUOMpc@!J_$WkrAfF?qjE;D3|9jtQ$2r77mp -Rf`QF;I`nEI@p98ddUiVXb>eW0KN$D#2-%%QMPH3UDR#zW%b1EF?AwPUXxa-|;@%pO_7AB8{okODlmP -#@w={9(HsP0z`3TG*c!F@*Soy2@Xpu6y-;)aCz6)K$;&{1tUEe~h|J*Z&Xl`Z{Uym@0WpL$-NLt(v3h -cLmhymyNSp6`?A8t8R>`zb+kcjQctA*8>CJ9C=Y}y8Ak(QWE|H&whu__Mp`*84LI-eS8G&((iQCeipd -MKLQu*N8n<29w?cd%B-%fZLoknSca~bZbay|Mxo0?wkGUF=M*Ym@Ivw~MQAJ7Sic<HmSu*Z+<UNi)+Y -FuoS&$U1)S1HOU1tHAluF(c;1529wEcI%Yh5I+^KlNwU1D7aSnB?Os!x^t=)N!h!(VojwC>EJ~O@#Rr -Y*}b{{+M=5hcF(s<lDAzOkzH#Ctju}9@8g&j%lGW4SdBlm&2EIf+$z>sNaxclr2hcU`3oQcPjFmsp~q -|vkGn^Y?NvTiG<zdM;rhJzwZraZqTugm!gAq~*Wg~2gig5I8SwiOTXs<i1dGt~$>l}+9mgpRA2X!ls| -dh*bMGX=rf!nAUHdX`=URG9P{#ZmRnLiMyWtVP`3X7g4~2A3@4*>t@ML9|pmJ4Gb3y5<ftxZVbkWKXH -Guz(^IZSMqAOkX|z)?D4&k`(n*+>o<khO>DeoZRujcgd%o9&@+X$gs4-1{TX-Lp-y9a}c>;gk3tP%UL -|kr5Z&+l_%BfGFR&YZ5k(30#DrbKs;cBB8xgM@JXj*MdSGfJs{5Y+dFuvScBQ!&?W?`5NNcOaV<nrVB -4mhI$%P|x{GuY{tU&qpPuydQut5yT}vVWy(Kj7Zeanvo13Pm`)f&bZ-X1p-IAFaNWV|SBlU1vtmD27m -{M4B7x!OmY~kl%xB>k_(KGQ@?|JW9+lVI31@+Mv-!M_@zEzf<d7Az?F?%E_zRghp=k5C$jo&0@Z}>pV -tlyP3`HbhVe2?AhO3u+UCw`|j`SWPbeG%@Ktjo(CFnuJ#-AY-5N!A+JMPkvD2}A8s$90r|RH1q>pJb% -E34?;LB`s6T5JU7R<ZE>1aoJ8GP4D^D4bLrJ4jm{UBC<s{=F~rs7XT-jerK}B(`sKaSc(|-R-&>k0)Y -(pbNXTm?(D>2WV=pdV|u{Tf}Lc%y^U#WIHCo-(Xz=vj~uRLGuf(|k2b-agC}O)d2f!C+4r$y!usaL#8 -s754#Gq9%nrAfj~v!!f%#@Hmy9-*C~PjY5<#%0#?m4_W{vZ%O=3Q2Ejm*{H4sUMT)F%D&MM)pW5#lcW -Mu`|r>45R<O`<czmtJ{b>{0#Uf{>Y_Ma~04m}lzU3iB@tt-xxmO<MqjQfqhy_9DLr@-6xQOjvXibfq$ -Z^ajP>TIMBtFCkElSPDr!Vj0NC$VC7J!w7J)}Vkbv{_7vaXk(Mus$@?G7Wt;o@EMlANea7sc0J8dema -!_2RoLrW11cENg;}NEAPb4qLtK@OFDhA#iDM32!*`o+_MK)>jlXV>GzKVZesM<>U<y@fPZ*pdD}sI|= -90?O~fspl%mXGW7Hcq!-G_Yty*F{-u0QTp<Jsx6)IQ6A(DPt@P1fx6pgoZy}XShq+sNo=sOcD+Lc)Qx -Xu|MD6*AK_xZa!+cEy$;&0ZV$Yj_=g-TUIvNH&p?6xQ294WKS&GkagamjdXAWP-0P)(q>))BdE$y)83 -!#I3v~4=X<ySeB&uCKpKTr4uWBsiizoM!?-sv}(3V|t-gdq??DHKOg7@<H6KGIv{p(ucp2!+Dm)e(r0 -qu-49)a-U_lzxhm3G!2l91senj)t!NCq{ib$$pUM%0Bvt=|R*$KO!sWr>KZwKauFsxsQKle;ty?>1Xs -qd=x^F@Fy7iQA1jCR3Z1{QqeK4EBP=)$moDrN0Ai#r2NyP_&|KdhhgCHjYP)*h)+#nKiIzG4!!o1I2z -c%BYBr%2L&cf|L!~qgUtmtr}r<%saD>Cjz8(|39@pG@;w~^YmaolHe1Qo4pE}UToX?NRcm+UUsL1@CL -bsa_%d?a$PIW8VD9ef!_BV*OFq*^e`a|Y2cZL2?HycI()NYqv4>>8*;p~k-#sJX+f({0XY_Yu06K^1( -i>J&5T{+pJ7xO5vOb;DEkK*3&>9;+jQO$K`T30Fu7N1QDRPrc8W`inFOF!NxdD+|FcwenRt^f37A>){ -{v*3r3iWus9N?4|G5gxit){%=NCzE^(u>o{dS8*z-lVzYN6%|A-XX6r-KQFSmxlLhWc~xmW+Lwa3vAG -vtmP$pCEMfyuc}f)?BdXu7>YXmOgGisYe+LHQk#xLu05SVcze`zI=yZn2LX}$;LkA%uB9C(tQvXt{=P -H_Pg@?WY9Q+c=NxiUYSPE(5lym{l>e8y_gZ=s+qwnsd5XI14)yu*Zb$S59)v)`n>aUkj|?Ep(>Ewhxy -)TvJI>#yJ0deuxjxJi`n2X)bIvhF?#-92nvABoniXI}Ap63GYszMK$XAu9zq3}dLT2AfA}L25i^*R8f -R(^)(UA4F_w;&rT)Lc5+<9>q;2q?6y$&^3>BtpKHY{lv3h8l+xD@tlIW=1+uwW`AGI?U*S35+TDQVlP -XYScDY87yYhCa<ykOu=fn>Wr5z_UGLC}EyTzI)|CMP76xG&5^c&UOu*nyIhcHGw8gzXqWSr1Iu^LC)P -EO!LJHbjwq#c+1Z_vC)=oMCwgvEB<biQ=Nf$lltWALa^jIxok1>vJE6B|NVaQqc)E_uw#lvN(YK5_^k -Dq915@PGl%4wEa|a0W47L?$j#SUB0nW8$)n{PXvx*?-d!R*SS-79vY4jp(fpOl)iO=ulrR=y6FVBzbQ -0X;IoTk(<(>-%3D^4#*MUlMUzvS{{@~K})3VTy5ZCWz030Kn_1nze-_t{$PR5jUu2x<3KKM6&5)3jm` -~`V5BW21#7?@bEYH;RWsrG%<l;+kvU;@8$SIJ?-`hBVJlLM>T*v>LQ+$*9BMx)g;uF&a{GdTNY>|cq2 -WT`rHvJ0E{mur=f)r}1`Yzv^%aH+{zJ1x{SkHE!zYoz*&2I5f^<uG2Ut8jBOwJnJxjq4pk!3C#W4G6; ->%7MFCgdqmvYVz)$=8{H%o{8^slmx!3x@6L)=MW!H&wjjbcL)+&5}9Cw+B}fV2FJE#Ik?#o6=Vt4)YU -RLC~%qs<J7xhSc|fnK9H{59>tS<cdyo@v7+v}&JF6Vbpr;0VS@uf3E$D1qaa{l2Br#li2tsPEfv+ISe -L3j$A*3~<oP~cAVw>p`YAju1#gk%CSaB0=h<{B;lWo#(`=xJ4KVY2@RR#SdKcPElD9`M!Chf?@cHt=Q -ga^D{);0#xKy|K6mGXIprv=~U?ljuH}>TTv~VFPBZke?O2tXDUAwy)*{5Q?KGqsr>ax1hvAufz!!Imn -ecoTqQ^IGY@au6tl@fqeVQ9)uhWOsuNg$&<!)2h2=_yPqJ0Jpl(m}eN$k%|X)?Ix0#d~uy5mHa>=}hD -y&^hh(q<RdpIyYI;t7>Sr5E&>zxk;~-xNl~3t#d}!Q7NaMZ_3DhwmQv>4nt?$AsB!JpNr2I(!(58ES< -57y(Q1(WJsf{_E*wOq)j8=rhj59qLc{vKLA#@DQ>G|M>ffLfBi#j_4m&GGraoAd4G+tV4B>)EkR)@ji -Lli{Rm;9<R_<vA7#7z(_TP-w6TxA*!ZX?!XKykBt3d$f0EPM4?l8A@Bw9ZtVUBGJv;1ENz4x+s6%=iK -L8N&F`+-GRq0{okpIlFYX?LJjQW%j55etE7X?Bb9T_zIVe#Wf16K+knYMiphK{@$MSL<?(Z_2w`4{<V -;-K+^XO?205+rrBWgvg4?ka{y{{%$*5MgalNc|gxrT;^Ob)VI5mRPI!dxYi4ZWT*yt%!OXpyoTN{vFC -nU~SXZ17!gR%=+D6&FcSTR=|&@^>=4=Ag!NSKKv1BA<Dz19zyjdg!IMj`}lOS*Bf>xfvmX?n)TG`n0w -5d_<G7IQgRXUQbdk7>X++QWcIG8&_~z1gj}9N{s{UY6EbX{n6v^W8$-m%6LLjo2sLg-L{Q9yRaJ;vUs -r*&C}r$3tL#p5bS=r5yW9+%Ghh}!C8O3_K%5TpdOyJ)$ng{e%9qGjUdiMts<EhI8hDeXOZfBE7m!93_ -wBl`&)g%KC|E})#}olDurGSW?K?vxiV;|`Bw4j}+J++9dJ9(mT<KSVUfyZIM{K<#u%wOxD%7`V>9hnj -0kkG$fse~6G6@o4jbV7Jk2WrJ;`Gv44L@fE9!^$}J?~a`Uc&GmoL;#!@9VY1qwg6IoB_QH=9p2_y_RJ -Njy+Q!wpmPq7upK`5T=^LBTMVH6zfByk~++L7W;dPlaF>=0eZbG4TIPS@emv@)^b1K3FLWK>mqE?K## -CTd5SlL>|;9N-l=MD7+2!4QLY!aqFq2**7EZ5WpRqJXT4f`Bt)1*g3AYT=H~%xMf*;SYj(3d%30$Pjt -2ZWxQs1Yui<5f0Fu{!G7iaGLg>&1-xcpX!wQ_}m)=tRRnN~Q8#%$vSeD1>F~N`|KDXp?L7dev_bUNjB -+4$=OvPH}@(z-psNyqBbTzZ}g4G(G)A!Ka@oX~Oa%G5DceGO<cURJba~djmzyncHeey`MUIl?2So|L% -E#PMjI2bAy{aE$J*vCmIzS{HcH4`^eRJGqBE#OxP+<i3?asoA;vk(f{%Yjq+<Xl_W2#cnYU1fcS=RWY ->gu*0l@Cds_fsGm%k$b9$dCPcbR;0Bvg8G-ZwTv{!q8<~}c|?7B?hOxBT%5(uQ4MX>Dn)qdo?fo(0=& -tOxpQIa6UlT%?HXyA@Rj(8?`+AJJ~L^cXqjhgyI{no8`G8XGd+j$n5>xST+o0W@v0&DR)TJDMK@||gT -ZapM`;wEXSNT^So2A=oStrND)dbjPVjp6>2&b*8ImapXy;B)1Gbd&M+TzT;eNfICw5uHB+fLSve2tIb -_CcHXBy6g^<~ymw7n=%5@B7mXAkJg)?m-iwd?4%g3tL)ECiMFnXnU<eE$-saT7fi*-Of7TMTW{O%cn~ -OF`J2mScPlcsfN*Rpw!L28y$503k;I63UY*r^!;e<vFiJUh;{BSKg1X5b;}a375cI?kc90Jr11W7Dri -7C-$!|KSD7A`As$@9QJTiQ0ixA-?p~Ci*qpU;&qX<Y8z@esU*IM=dg4J#(hIM@w^h%H6K67QeWaH>zy -@kIm={}K?7WR3)FA<a=vr6xKI*`*-cKucYj*kk^!X1NFQK(F}6I3#K&zry}3}fvyt^fS~MN0q7oQS7x -&Cv5sOQmbp)RnSP?ZxIeh*GC?|t+e;(NDa_?jFY_dF*G(!?za|-V!1NB-u$|1&mdg$vCjU#nGG1)2k+ -el03$1e=_56bxowdsF+(Z~OK?EiI$UH;e6m1<?#FNfk~_T>lv)n_BvW<}Kgk1>071NeU=|K~3V1ku0z -{>=aJOTOc(=*#7|Ed6B~vS03fyZ!;m{eNw4-;m<pp4acWT-c5XX%t6(gbK0vC=(|1$Ki`O+*6?B08mi -&L1gIBEq3(TM@P9aMt+D2sm~b*`LPK2n46%{f!GM*!}m%*CDiPoSnVh+j*qMEkdE9@-Oq%eF!aMf_;m -K}aP`Ox=EuoLHyL*Dv-V5uaFzV9v~u{k=ngoK4madTAnp^wvIBhXFmMN}@Ta$JpVQHNdx#|e6)F^N2P -#~@6Z{3My=v;8^g4$Rq5u7d#x3CBE{QeceDiGO9d}B<K&n9z+9_DEWxrVWO*~kJ^)|G=ieP#;1bm?%; -Zx`v?^ts8Wquyhqde+sN24tI?L>_$Yt>>_jc0I0`1K~h*Sj3uU0sYS#lGEzB8grj|IvmV3nz$E#0WlQ -M@ugM1sO7n_AvLmA2&a0t>2JdoAl-$UfMeF%}0!2h4KAjCa!SMua;$eGwU0J?of0EblZWxqyd>jW%(F -{KV$WuAJ~tc7w}IW*pHqU@J}AtkDeFsPafEho)_@%9@ycQ_E%<Uz!$ePjwmnTir|<Qoz#%98TNt3Pwi -E?hWR=pop|-+%ME--To%(?U<B&J%7Xz0ZNPM}BpJi2_CBvw0iwmy8_}I(7{SQ~E$_P*Ww~pT+>zqV-7 -`AshO6KCn=I!ptayiJp#%-vrLTyKdpNHQac!9t*{n`4T!}n8!6xmJ<V;B9es_i7V83$Cg{PHzazRTEm -=o0*z;lFiS=6t#zf7CatsaL_8@C9)Sf5jZ?S`iio*rC>D^~=JVO9u@cXne*5C$Chl-%Bif4PQ_mw>Id -bVi9+e#hehdb8c-^;k@tOi!bGU9|Pm#tA*&*cX94#(uotAfS%CchD?4CRRguv}S@8Qio=JR?X%2ZDD^ -_&SdMK`5yefE$o?8Apx=EJI@j_a%Cr0ki22f-E(7f;Ad`WSxBYr5FwdORdtZt<*W&T^mug@9#+0)zJ! -}en>P@s?dCP#RN6*4?P-BekuomsnRFyP3bbv#zdW^K<mlyj?ZlSwX}PpQ9ae8)G)rW@hk)7S8v&;E>@ -cFC`ql_qa92m*GboXYF<q9Mk`kpNeOpeK$cYf$I{U+ue(~^tNXQ$2a~;{YMr6eoRqw5KHyHFAQ{vD*b -v%qb!K=55$rFAh5p_#Bfw<nK<i+Y&`;5Ie%mjL7YWnbAQXm&|8;c>7oRrY*^p>vCI{2Kd^>Uq4q|g=$ -{t9SPz7O_$;@bh!Zc-=jJLPMWP^t~Wg7IQqhe>OSjivM5-=RDHIK%XE&9H|OW1~p_lTzB>jHv<#|L4I -TM*e$&$p3qj`-ezmpV)7q2oB@ehu=fNGzt+I4Z|1=6EJ!tt$tV)Bt9Mt>4)k~9fs^jCGbNXN8=-?@8O -@OJ|v#>Uvctd`61{K2-<-N1|6V+-k}11B$Hs|cyTa%;3HL)lSgrpijG$KgSoihiu?&Wfso^N(1C|Oc{ -A)_l4JOxV2&q8!H^&iI7NP#<iyAPG$jv8;{K!kjl>_xarnb!qCO7w`;i%bkQ(>-<$vjO%AF3X;{Cf!r -Ov3)C9|4Os>;zh^JM>-NdDfw1YO|YMcuy>bb)^tb^m?P71kr@{xP)w9h9=|Cw~jNPvGB0-Jb?sM_azJ -kO0kAmMbs7TJ3Cld*25&^xN2uQjW2?h^ZfVLIktO9E_U}%Lo?Z{!1F|^2HNk(yU@W7vFTvX*=|sBHeM -yrThMHr?}g}#RXZ~5D|xqf3%6gn`ZCe>6;+>#@vIoDLyJo75k@~9B&6W)H9WR%bQB&JLy^?^o(LZs8u -9-isj~DSuNja?P~M=?!OYJ4i}2Z3m*X@?*G!0B7DCXlzj*cF0a`va%2wK^$Y*;=!j;miQR){1u%%hu! ->=?DM!SPNMhY)5U`tvg%X`_W?Xr#jFB~$=km%7UVguYF&qq%6ofZtVMl;njs70-80;ir;4Jj|(0ZabG -!i*^T#nbI%%=Ji?o)z1_x|FV{Id#RA*VCFg4I?A*p1W_^=psOf580&K0QX4w8ocLT4#;&Xg&UMWuJ~9 -wt{m$|AG6-Gf2W{lEG<`h$B~*15BDqUhOp$$?z@9X!%|w2Qsconpt`kS!xQ!S?tMg=IxVX3Tj|Og5b0 -79<wrgc<%$Hok*iUC}1}974&pYnM^z|tmCdF)pX^U(B=F5oJ;0ah2t8s-s%>wkyWG#lm5Q8vB)u>CfM -uMJ_Lx%s*jEpE$Tm=96wpU|EO*JpI+p<w()N+@H@LYh{SOmp?+*HfgLISJq+v%F7iqGlb<313VrOQv5 -!S`eC$0bcpv;>0LVUcq@!*Te{BVcK5VEXpdcTwYvPD0QS#CIpg!!R{5Xt4f7TX~eB|OjUJ=+QJ{?|j_ -+gs2PY=Sr+Wi~`Kp!K#V@v(<y56^>aPrYU$qrp)=)=L<=XCVq;-BsF!H@dOqD6fK0Q9?>h#(0s?T5a+ -JnQ|T8o&c~EzBB+eQU(+4WxX;oluzFz8rh_j+e#Z->s;?7m1DUrf@vZEWFtqdcCfvi07LPe{+ve4)+L -5<F#XBxP115b+Z6ky|2aJ2J1gh@vmkG{M8iyYKFiu#lNo#%=^Cg)&-u*S+{pt2SS0tAcu~duA+$&4K( -;gB`*6?;ya!>i^JKC9ONo`NdBJZc%HaAqyz1xQPt~7qb~Qj0Jie5o&Lp>6`2jF(9T(#-m-nGN8C`g-p -<MbKcCC~#zA=_)qT0rD0f4Zx9nYg;@sl^7+xD!VKrwot>=oLQJmK&@pQV;M7cIl0dxMn<XU?qB}E270 -(o#b_iRSPJ}s14JOHu`!wYYorDq|*M5RE5zGn5MBDzwKtJMqrx9a7u6&uk><2G^=qG6G4uNb8ebu%|W -c$gqc&0YT%SKnn@FQ6X-mS$Q9@{;m|+u$^3b)I>RLoQofl1Oe|)2r{HdL=o<2$ah#olq;-fxt#Fz9o@ -TaVL{F(XUDrw-H>|P%zGIg;wC{TAn6xJGTy<Kla_QBE4@wM58dDTim{%S;Go5)LZ0x{p5*vij^#Qh<g -h6n6N2ki7zN!Z$@Zc?pdRs8gF~vM<7xuweTDw(WLn0z@w|(pBHBmCGyJPJuC9wnCUqSUdbxK8FQ{orE -TcD+F9o!>huDz`#|ahf-VRs^^|*CrWZLhv9TWFd>rC3$L@k+I*;_mocc4D@*KHTH6A^8oFEUm3*6M(* -iu@i-|pDSD6SaArYd$b-R^ZBpQYoh`^LXZ=%S|~==Lth!YwABkL%)%3vl@c5^w*dEjfI4gfodMdANxf -hzDZ*&A$)P<{iD{pKYwA2@=nE1#8z}h0?0dT!1ltBKN@p+2?)Vj^D`3_V=wN*gyI^VIa1D7`4HX9x*; -I!h4RMY_Qs=^-qd$-wPc8!}-$Gy<a8u&WgJ8ZaFJFkV#19Th?3SZK_!CEm!M?XS0NF8;mv+?NkW#9{l -PW+dx)>qqE!$tfHS;GBC<ocXGYMp`a7yKD_CCG=|jeY8a8S<oSfKPYf<b(7B!L=l+oa^>rJaj$0p0{I -sVx6fHeXfKG&Q&a)dg*|1}Dl?}1vJNKFfmn&iPr($1sSQ2A*NCXI0ac4mA?H~d3aPE-Ug%oIX&Fg{pQ -b)5KGDre`NRSEQ$er}c3pUjcovxIzGx%JA8!i`H0manDM6Z~teDiI;S4Xrn$&&h0*l&x_P%p<2+M!T# -pXFb?)+#XH#@Hi;X<$(XT`*~TU5IsuBli@36|nYJSb~JF6>-(c++duMSN%-8hS{xXUzn45=Q~^XkxZu -mSCQl$O0KsksIwtp7YtPV7d;kYbgC+g&`!@BvlX*{%a)Dthy-!(>lrg0x!r{Fq62uhrWd7LZ#>7c51} -I3ZbZsvQU+Dufxe7M5tXcZu6Sl$2sM1?=inCFiX{lCad~6__{P0!Br6+CWRhn}f`0d#I1vkVy>#K3#) -(V7&I58jrAp>;>P#oLe=Ao*r`44@g#g3c8E%nWqzy#|E7Tsz4cPCNrvfvvfpS^H6Z_V)G4adAAv@Ab@ -Ee#it~1L4dU}Td-p6l<yOLL;#RuBq)C4)-@!)3Fes4DyCQTrDI|T!Q4%6R;U-ti8(!^B1h_eZ8){L)v -Uo{5+Iv`UM{UTRemyN$z(f^zv7|z>hJzk)2^5vi5%Rj%!_@VXo+pDovTU5V%ehjtQSRJqMyy|{=XUET -e{lD}-mpplA{g)v)ufE>1-9gwd%zu53%l_*RknjIj6aNM?{})dB_qOx|a%3rJm_#t@hgAJEI^f$52@i -E8<dbVa573$uN8RFZjYt0l<3}dquvPxCu2S+*B-zivKBC0w$HN}_)GrQSi;wH^;Z%km(sMBK5li}z$? -~6)#^^&R0FDo!i(&_M{=&rHL1>yB`HDkS??Wt0sRN4cBQf$Xh&rsBBkD+Q?6-u-<FNfLVA1jJ2=pWIw -8PcEr0NUjgIzwKzF}3FQ7|8@jH37<ag1Y!-*`*_pG1YIEc}OE`%!z-*hZWpL|g+~)HPxFiV_#W)vk%t -jE=K!)Lo9{B5&z|$l~`ymNu1ou}9ibk;8VM(<A=&e<A1J`&is9kL6516rp@%9lRgE?ECVj01S&1`wCl -*6!AB%*VVQ8UOZo1@$5RVQJCJ+MyR>Q2>ysx*8aA&ju4>$EU6`8&xI6GFZVkPf!_;*cM}GG|7)>|Zh! -Y@h7M_z9WkRCFMcR%$JmaRi|>P)A}xPF%Z^hEw*$w15<BxO86N%${Bx-}&}_|LlNG$M!(n`}EclxO-t -i35hoV_?EbXW{@$$%ninMbIqict6|2L^C1*Dxj?GH@ok*4_ecJ`Cj$YR;c;ANLuJoez<)CcfCd=etCA -N)$?^E>X^*U?P$6}P{F{ryM&V+?(xa1eRF!BS?4wFH#4B>P`Q*h84IBZQxl<^JFX{otGs^Sq3JiqaA8 -3U11?_qulgi0R?h7|#nxmRra0paSua3<V>iA~xQTdbok<X&xpVC2RNm!0>sG)VJ-yT*L?1n1Ix^a6D* -fMN2^)UgZZW`Mf2|UEW$dsH}b0qX?E_txH>g%~_>~ig^uimpyQ?>Pi&An)2Qgmx#(_Ryc#N8`rUqldy -8SRj{$7oiN1P_a3KnO50_nkl@XtskuF+r&S_mY6EabztN%z$5t2a;V?32@ZxJP1-I)ZuLrm{KxlEF<# -yAGg0pS+G`mypwB4y}EK-Aj@=6KQEk4KUox8n47poQ22bcYgfjaykW#vNa%X0=(mr6)mO>(JWqEN1tr -L>71O#(kMnK(e7`)Fi&ybiq7HY2kbCXMr#3s%gx-)jZ~f0dZ|sT=ee7t?<50gJz^S7ms-Gs3ePf|V|! -X|B8uN!G#-eaNKEc^j$_m5NrN&4ha1?(7X;xg@zfOQ;20pYXaiL#M$pv$F3VC`OkC37;(NaXIC9EEb* -%Gc8?X)9v{hQ&f6BADw3w	i~C*YXT><{QOoQ=fec{os>^y3BVco;#Tpq?4;jU-xWT#b2zy*ONTb<< -u+EP3cf1N$6!WPw}q`8>bRZTnD-6y!$w%s&Lb_8Y8cZpK8Yxqa_Kc&#TSy_^UukK_e}5kf;a5eVLx%s -eH*ZK6|KJR^ZlO8b&hEKXnT`edfJq3=yuL$hdEdr=pb1V0bXL$M}X^`0JZdX6mSOo(p0nQn3ZeyQY>< -LU2RH5|%b-$~iO8NNFIHv~b*FBpo_G(|(`ACpM`(G|XDkbZFX?_%^19SpEf^Fn&`A?)!Cp^nr(N_{*H -J{fs3`xo(X41f-I<{w67`jeQ6<HI&I!VlT72s+~Q9(|8Q4*8KJgAXwr6gd((dz?Llb*TM@KZ(jnbnuZ -5@_2Gw<!E!*!+Ubv15OVO!#w~~*ugeB3=KYRSV!V0K9W-;b<`X7;J>2^C_D0C$Vaw^`Us328b5!-p!8 -^PK%d{DGRyou@f>LnHa4KK!nbBp^{YJU6eI8>*#uu>oo~Wj*N?PKb%ZqyzuE<^@!BHWObmQ?ME;t?i9 -33XeC?<Nd~Y!QRXm4T_rJJiC(Bj*<mxxz4}*Ua&oNu&H}bJ}n`?e|qXiH*#{E{H;6E<VN}==GcC{Pqq -eW&yv-I72)a1W}bo?EA?e@vP|H?T32jV%pt#QVExZxKB$QLW)@HL7`n9(GgevZ^tF2cBnIguC;{R!zk -`r?WF&UyXa#G0n|u&tlA$qc=7-U62@3y8<{p5miQU1_M`(3i%ZU?j<yUQ+rdsAucmr>IhQ;;na?6$IO -KqWjZ4oJzw5ywFjXCZ!^?!XNX#O7_uXqtf>%Vj?(^tn)g<+C3jgtL?6!u8Q}|{vp5O<WWD+H!lMFa`G -CpJB!`tDU|6Z29f$4UN5VvT&)0tC>9(%!I^aRDL5CjADX*8U6|XeF4IA6;(fbyJ9|$#3>)tGbdXMG)U -lL_RiR{39m1aGEo3;mPYt3M^Wu%O+-%jA1Ig%Gh!-mXxR_Bfggc#XWmjo%O!<k3UED1mMB3apz1Es_o -9(Dz=IVKLf8N(#_PRnKuD;h0W(CZH-_ZgnokA+AgY#JmUaIG41i?V-oST|3>+kp(fQ^5<tiApgD(*rK -9GB_)7IHYBfq6kk@f|cYm&Cr9EU4&DPj>%BQMbxW7T?7lu)Fld=vJX+2g{Au*w_r!EiRq~W=TK?wgpt -uV`JRxK#kp7_)1fpq4mhhd6<Nq#(Yc(N1z%_qv#ec>MAL<N@d7olIRNqM5LOrR(AsqdEW+=NAw+jfIJ -iGlU(7l)?|YK`VrKIuTErw7`Bc5Gp@muUF<UK3&3;FYLFpH-;L+W2~Udn3UTPwMiXg;rpSNmk_ZlC_a -FI-9&HkT-6dha8)w@W32i1gN+CvlQJ$6+$t46Jf6h<+^kC!%D;4lfX(z8?2dU2cf>fNYu+dMim$qKDD -4Oo4lX-c$Ek!#TSrARpod+6sd%~2@4G2K0WXjxpv+>IH-2L0cU4lwP5*^&gP!o5kG(`c^KjHjd`ZNoL -S!ygXHBH8FdBxrgh(uu3x>;q{hZjw=3N<``W1RWcAkK)>>i&V!XJ|se#=h==Y?C^qF-AGvv|53e&;km -Gg4>H`xjx!r&E<ukSDQ;%&6~5=f<We7Wc-%9-bdqU@#LA9J!ZISbM$E6AXRKN@GPkWy;McB=2>vkK_# -RJJR}K>)t_lLdA_9X%Oc)8WOP2U%6Ua-%bWGJY&mxap*m1vfh*%qgQ(`a8;GV4#}Rs+5%#|0_o5bwxs -UWgi9JX<1=g!ht`YWlSBN)Qw36o_@N7?IEC+Zv#!p-HONPJ30$$du2O5mUoOSrp^8$6+;tlrkpnt3k* -JjK_>~NAbDHn*xXvW#T;AholxO82Dx9PHUY7IKmqPY9$H&&YshcV%^A~hE&yrywmR5ZkBW--@50BShY -(})x0(5lJ{F9($Zg_dfe)g2OKx9b9^aL#Y(SO;Xi#>7H&5C#qTDo;!UpzbpnH!pdaB1YX-_RUI+STa2 -f^7;+!wPbzqd3!bCj>PEvCPSjA*Ui*=ryvx!w+9qPpD5!t)vsQt;aeG!!!{{}YYyNT**=&WutZV#f+g -;&Y!qp7guf5Ku8L&~zj%t3soDC=7tz(PZtm<CB=zlQJB<2ruy~*P^h;4r=+paa_>*br|FVmIgK2+p!Q -W?9NRps%8Yf@^rzi}@Fa&{d8X+l~AV?e{aS|tfNN0*Z9`ifoI=~xs;IJJ*9TGRxr(+a9KoJccC<}*oO -!Y%t2jxdy4ud|1@6?f>Ikcstk3#@;BszA$xL=9RJ{7!A3MTrL@3NoKnTU_Kzz*Ir>geY<s8;0B4w8JN -WeNPCR~<7X{)NCtFH836Xu+c6nEX?l#IuiYJ^X1gfj=xJ@*}6X4-$Wc>-h12BM;;|ohf|@h11(}8Klw -x7Pa(_x%r2UtnBzlIumd4zq)qrSWkAL)()Mq&1|94IOZG93+;W}6`TSvI~tBV^P5b*xW9fM!u%mG+%+ -!v*1?f~JK_5UE%qbI3IyK#twTXJs$cbd^pBp8u;_=Mz;-^8BRf?4HYV(2Vx&pX0{mXjM^`lSYiq!#VI -%b|S8pxE#WhQr73N!`Mtj@G9n)eZAV%FOl)kk@9Ixp$LEPpyogMo<>2D`|zn~(dLyVkD;8!|&%6--PV -gGLW0%0>0kcE4r?kIIgUX}bF>Ff0r(6NGd0@hEgm}a!nwo1i`R``@QiF}GfsaWrThlt#JOAFvlCJxs- -MmUM~c5X#q9&fLB1xx6DvG6o{-a>_xVUkavk{wT(n8R$<RH$;Z%B&oH02W~bBp*G(T|=2FK#V5A7#`8 -V8>dNY8~P-xh7(*>Up6M|My-LE+wb&^k|*Ki>kTlGDOYzr0?R>~KahSBGu83Z6{fBGbaov>)_8h)K?I -21_w^F&EiE2i0bQ_$Y;*VxplL@H3xp0E4b3Z^&vsB<zFkdCpVw|j#t*}iE0z$kQ)|QFTd8Kf&aUr5av -syP(l0<m%%CCQ#~Y(!5<4r)H!2S-%=X4yzEXL<(0GDB6Q+S5(Rg$NRP;{Iu;*<!*<&Xrxamw+v#X&)L -inuC0n0KHr!Ni*d?5%iKhJ3htaie(wF@L8f1u)UVY)3SNp(~8_*IlZ;#PhhVW_B5CmhTotVfX~tU^|O -@TpwY7}S=x{;JubU7UPb7|Y=5phXTpRrxY2I8ay(^;*0@vH6pFW|&%+%N2ZN>kY*OAt3L4$u(vQxyCD -Vq*M<_sRuzcoG;$}j=iox_;zjvh4d<%k^vMxpA~K)H+#f9WK=^Ivo5bvA)a-Wt?(0%nNgT3In1)`eVz -<i&VlGAwswM3Y)ac<)V0(_@>!X2&Egusx(d1%tMFvlis^@U?k*0ZPiM`e5{kQU5TYc2p1@jUx{mbV0( -2TOpL(DRHC=Cx{^-w-0OAZ1T}GzuG58h8vfWEW#cKaRx-Miy#r)FL!Z8P*Lw!Z{eU5%nwm90O*49?Zm -i5&!Wc?TO#}dhZa{hO*y5FDsJE3%(gfJ9BF_Iu*ilAW(fk}iUQ4GT=5~T<dLs62%aSEXcg#ID31BO3z -Uicu_9zKa5yTikM8$QzcWcFbIXCFb}Y!8z^Yn?efxub(yi{@YT>5z|+PMjVAZjZb<dW5_^DDE+C4_=3 -mOa8C)XV#5}B074M4$zMc5F8!S#W-;ULY(|WVDvEGfs-SHvIl4Mlc3q>Ph-a|@sEP~;Rci)N-NO*20v -;pd)!VAippOG$mB?TwBHjS&h7q4+0)`e^~D`eSHz#?*CpK=cryO<)dlwN?(F=*1KSbi-}Fh|H5nS$z< -az?L?|r(Q3Xd%1APpUrxQTv;g1+iOGVTs!@`zhv-7R0z{7fEIN{l;Sj&cJ=My~Yukr7QadtBU`etm}# -(o0ex4~~?nkf9CW0BQ<6Sh>Ir7u9ziO<grgq8?8;fS`x!ST&HciLkfx=+`>G{SV?X|ed$K117HBTAO5 -6oAvvH}{kH_<JmduOtTa&Ev*Xc<X?1@vlLadF#t6kz%ff+Y`>vfJw3WvZ2Vm9Oll+jN%qJ8r;@34jND -Cj7Cs|b>uYK0D7|wxYSkt%uq9EN6;P9oBEXuu?${ylAkI#FD?!DcAlv;pP-q#u;F}5QFcmh@pT5!g2| -q|DNp$81r~$zwj%*4pyCZa;+1GTMTPL-ioMe~?pu7rZ*TZyd$fKzofO`C5dfMCbX;-momC;*=kRSz*D -Kc94~!FJE<Gnr2ZP(>_Jgdgj64twp>mJ7ABafC(-;TXeMi$m?0maChtz#0`>r)*ikD^KV`o8uEF#|6B -dfybb5&)08R};L=0!ZPS8{D+9q^?)v+^@mx7GXKiQE26+ZOn<xUDgX&sLQ#{$;zl`^vA?K3JwWvCZob -03+~?#W4CejG>p%TVRBUv}cAh_n|=<4LUu$m%PVEqX&u3>k?eTB$%>Q1$!{zd>H1jLN<dY27$>v$FCs -L#Or7?S022^?US9!muzmxy;qGDQ)nSjFVJhs)hAWr-Bkj5zX?e&BYEC4X6!ZEGYD_&C4BG%dB4p?>(a -M#MVShwUsEHwz45m>vgku#?9<wDH{jl^*ee0ch5_|g@sfRiLLL3$1o_Jq)3@Jasp(#)7CXJqWyG`!pO -f`~X}V&UH$_^36vFvOQ08TqmA5Q{d`UuX<NGwOwRkVGX-r;fZQU&r&&Rpun$>y`Cs5awWeT;;DuBz|d -vF`*_?dhw&tN4b=e!z&LZ0+(oc{rf;Yf{7-7g;*i7fqQ0e5WQj+o^1)s~I-U+gR?`+IvYs%-c~qhm|= -_0+%F1^VB3pWmkWe{zrC^^NYZl%@{}*Ta<#rBH}I6fsBw+oLBABREaaKV}ttG5p=5UP>Pnfc?Mwh7Cd -gg~y-W7j`(w!P&9z+M`|mW6t9dsXkI-Xm-S_Bk`Ub(ii)_FUk+b;l7*O<L17xL_UhF$MMNgz^9R)86b -V^j`9z;AdQX-k>pX0-_ImIM#edDR0xiifKLEMKU?1%JKhL^9DB<+I(CeQo>_hrGxjLIUo(Y{-6QmuP9 -h?7L`L#^WHgjCHg*Kr@>H|x;QI7SRVV(Ge1pE28W;SZqvF2nDZVA(C3g=m{-aGLs&FN@jwJlO@A&%2b -GIWH0!K7FZ+po4MmPA9v4>-e<^OG~y8Xp01o*nQj6Vel*&P+}OV|9-7;kqjlp^#Rtsimzbw45CH)Z~4 -@be6!@x=yQZ3pqnVqf<dNIyDI`Cz{C8m{lqRZ}G954&T-=6|ybF0~MF_u#&VQ7B$nC-n4t+|m1%Fnxr -+RyZrpUTUG=pUk&ybM}3vU#lR%Pg_|nV^+TJJ;%@UNIj_dqSIj>WQl9&o9MoIJ-@z)b146yy_KU+evR -Ry#{j%!rDZvJp_G71ea})u-1mNC5@OqV6PMRBl)K5fw2Cmr$YUg@uuYM0Vk|ln3~uNF=u{EfWjJx>v$ -u{8Qiy5hM=n23M10Opcdp?4(tSSrbbhRv0<))aww;$Z$GSJEA`4v4Z}YT?V0~h9EEYf>!#vC5efACor -|8}Z>hOeU-V8A)Hea}`>CTjlvKY{>K0sRm$eXb~E1h(y4N!F!t6HD^d{s?V>F`;6<8s>fX95MgLiOh) -G@8f2T`tIDvdxftodm#ogE{!R<^<hk*tw`lHGHK@@I<I}ye?}~(u<V9SQvDr=$<U2XjIY|<2lH9_P)U -#aEDPyx)RD7K)z{pq1HQ`mSK<cP`;Qcf`i5d^~H@8q&mYqnb}n~Qv##C1;}3^qymP8G}!i)(vRECMZJ -*DpOVz2*g&2<u(p$TmRj!QZMg4}FeI65x};Hdb$RECgUZzduAxiD3LDvrzAj@*tNufnTD4I}mo<x~04 -uc^+hMNb^~~$OpWG_hd7}|YEas)iHo$(92A4i&60Zq&3P*%=eT&}O3+K4&8JjYJ#E|_1EUQg*K`p|Q% -Bq$p*Y+>|Eix7mrNz~2qRVv}x>I#Kk1vjWHwyE()%#muriDIB^yFRB99_3dZ<O#`V@tM}Fby7Iya&)G -A3CRA9;)DiPecpu816b0F21@Yz)^7gy*9_6>JPx53lJ7^cMY5wuEh-_)c5V>oY=L4?E4k8|19nSeAGR -DzXQ;}Yjem_%MWBj#MBNsy|XtMT#%32VjBJ>7;g?T7=Q>aZK)-O74jKEC0&CR-TpoFm=?qDx9s-BBlu -zJNnx5Jf0y<}c~b2myggF5k{de*IJbv9G`Z-f?xJWh#x>aFvD-_d`CHlXXXHIG7aZ3D#l&uw*ud|Rm6 -zg%Q!Sjt2o3l;29+Dm4h)G*X#jHO)e|`|>q<D9-1w^7&)G*=-Ji4vWoh@M?T{y>YGD;5={k2nT6-5&O -&|ALL(<kQEln0$Lxy)Ba{nS9GR&&JU|s5a(>d`q+rNJkaf$3m!$$4V*dXB5n<RU7FzyTbqh5%om|Tz( -TuQ@x*?Juf2uqHk#k}fq<5O8a-i0TwxJu@h*%ho~fVrRh+3w>RH7_?i$WB&gS5g^21tU~)t|#{O?sBb -c{biuT@SLSJB)ZDUyT_C1o8bxEz^U%u_@?zT*AL-}1&{j~lpCJ31zUB?2CRI6NuC<#J*K2wrYn8lIQT -?o?1{(JI}no*5i2^MQi$4=S=qNECf2Zs)%uENVz)kedrh1UG~hccMAJBSaecwU_e++jvabQ3xu_Std| -O2xuC^Z;vcE2B62>^r3Fi{VAKoRnY~%jj^Q(b$J8|*a;wF-PBI!AJ1Mn*b3Wz)*^nEOIUVlB1RbpCk# -?>+@bIK&6f?Ky`(Q!Uv%BR1*=d`<#8xstVA+7-a<>Bwjy8Uf9DQ9h)^;Pl<lSFCO?JuG}{l(0NEP5s7 -FG@d*)i@mpZun&O4{Qd(N0;Y6Ir9K||MgR-`M+xp-(cu}c>mu*ROm<O^T<==hv>!*E_al+W6&f%Dh?T -a_{K%)Q3N=cK=DzMNPgTV3Vp2ZAmYf&M8t;zOCPP8`-S6=N=8C_+?hTHWFOJC?9(qA5kJeze4LMI<Pc -$lko~>~T`9(nddH#fh8&kpzT7D}G&l|(ZhkbL;vb=nL*gwvQaMO;bk^*MI7yGx(f$WL44(c9eM;QXCJ -J7EZAkfv+Q#FLogT2V0KaJuwb^C|iIO`dn<!|4@(rGmmgEkxbR;>nJsRj`D7oYD`VjL66!F|9h+8I|e -m`ibJF0r@(CmXYll2P%z5L$yciE%P>AOL)4wY>zEp5C*xE-F>!J)C{?XM3<1CHIHklqIVxsDDFXRkv$ -tb;#QlKzXA9gu#7ZJO<TB~LkD)iiccYbzh}lz#Z@*4q4itp4?R0Ka`8|H<<Je)~ZFlji~a_JRB-&ja} -F1NrUq_`6Vc57|6-QX5dhdg{i{f^Q>+{@SBn-%w%uddGIdTILfPDH^mb-5&A%8jJQ+)nK7QfdR0!9$u -BmZY3CjK4f{b#Peh~`*>ecrOFoqB;Cf-@H*|#M;ewF$Xy_|*d~1xquPe{aK$wHTsSdwv$VSFoqcyaFu -tttl@cI`t@zA2n<Mw;E<ydgdVc*1wQ)ERH^vAv7y>Zs)aNSI>zCn?hZC~Ry@IEj3MyqA`i6?iTH<RkG -nkt*-Yv}*`CFtAcP}EjGemH}z4lY_X5=7wM&TfNKRcX0b9uiELx)fPDV)<95gZ-0A7N;>LH1C?q(+ib -BormCU4Z5`3h`OXMl0-X&#wyi0y@5#kwz7wjBCCK_SMOU^*{)9Ix)FR+Pz0z-R`>2@Gl-H^1@$n1@Tj -<Mr0?(f}tn+hhpTgC>has#@p-cvoaccdEsgn9!r`fLW{BFb*+U25a8iOwb^Sa;FaWJ)b_}XhflEtjut -0nI-`~s+(H$}CorU3(abHVTctJ(GH!@o#S_p=LC9K;*6!BnLN6<vCaKuujfn)s4Ya%^I$at6+4AV4p$ -#Y~>29iYpC~nfn5E_pTyjN^MCpkUF1kD|gMSKWwF$LJ31{v)PBdD@Fm|CzjtecbLxd(;PLS)0&#n%mH -38Ted`9$~Uy5)gm1y5D86yHy;^kz|46SwADP!gV=I&+!aX)~vz~5zG{kA@pm~Ovn_4)0)DUgi&8PYSQ -P@!>|;iv2?M)t_qH80PS4b0kJgE8^+7E%Czbca>R=#j%Es+O_*`ryV;^W1bTc~&iuPCW5&86=3gE~iq -g$Mr!~0l4&?Hn^GsXqYs+<@JQOVuG9p)rO|TZ8eT?K!o@Br|q0wLY`yAl5J^6wJE4#%}u;7U>kw&`v} -k%@Ju^Syw!!F)|r|`R|uQip$sA$#5(VcR&0&rwb`3aJvMrjomE<ZAqG6H=?QUx5YL+-@m_D_UK6_IV2 -yDP2J?cw`2efhm(;VTvn1IWMDbeX=%!`7+LtLsFIwGUas<?rG)RNnQwRk?@5dHk+gp5b_lFQXPuIaBW -fda9;+5YQYgQ(~y*2OKq`Oaj>4vl~0iUk6T5KRMvR*c_lJZi=Y4i?O{GzvfS@K09$<QbXH^F`15z*&I -RmDV{C(TC>wFb~aD9X2CI-lL=zF*@dq(0NuD>3osX&6ZHoYe$F_R+}<rzWsrnX46$i#2#z4fmPmK)l_ -Bw+3UCF<trfR6m<jB`pdq7A3=jqGapYGn;Fcd%NSA#<-e#@uT%tiR`T?u7&}RWF`?gK{fS!Lp;!=8g4 -ZFyT7ENss|lvr0x!LY1a;P_2Fy9%s=1FO^VJ68P>h50vTCJ$V<I-HkJxAWC<DRJVE{;`T>Vu`TSWinT -JSXC~%MFoait2W_cwd@1WKXJrx4p9sPWO&R|T?`ig_He-YGw3zYrlUHrcr&i=2S$A1E8|1gKYgtZiW) -bMu12$M%+PJ$d6&<sA1EtDQz$vdDuj1-UqC}uzDv(67OHxfR2wf6&4{6M2QdgNnC?64)>FCQld@Z2#n -K^=HAjt-Pd{0!D&UzA+%!xG{U7RC>1J{}z+aXSu&@gpgF2-hV?q4Dr+P7Zt<)1QK8bRcX3KQgT`d>ni -jHYZ2Y_joVVzfklqrCR0#);7=I!rI?Uv+NM=`2$GHe-V!Q&mrxB;DCP$;Y^<8z9G2lj^Kd*6w;cG&VT -h8HNRwB54Dvq9o?|TCp)w~ns$;!`>3xNN3!+Mc=<Lq7t#Gw%LIOH=1DEh_)tWSJg6+pA)87&$n3S>O# -A+s_HSnm{F7;aGP2z7ldpj07_;#$`?`%v=q<xh#|>7N4G^&jJ@|NC#@(T=;%=cQt^raMmWOZqg&`pQq -;&D^P*gG2FWo_h_v)eVqW>F(m5;#6SuFq~D=)>46tH)(2w^9M0(L%Ir_``0^;NsK^z5yUXTECh-Q7^m -r5IN*iEzD&EYce1J&ZlEd;e}m`_aEILix5i=RxS=;?Yz(`wlwlIgz0cu9xnr+dinsnD$@Urio>eHJ>^ -M{LIDaZ<#n<j0)f|H9RxIwZFU@{*8bqJSiHydHz9Rh5J=uCBKTDg594>Wk%TpXf2zOsw~m!_r3}8h-a -2#tf1RvhFeNXq_pMnw+9|rE9i%dc2x{zW-}3HQv6O@_Z-;w5oeA;2aA9kajp9_!Nt&5N|72W!yq&PFR --pP$Buec`Ss3uoNE4~^4p`GhVPsf3I0lJIYxg_L;JS}|F#hJhXa4tJc-dT4Z}ErlO#>i6p9lhM3X2Cl -LSrR1dQXvQ4k}4>~Tou|AOeFbt5N_B*fw5{2_zxe{kYhd(n@A3H;I9#C}`_Ly#j?ag>-o;-AsS^nO1) -N{+Q2Ne-UO{`&AcjE}}jI6n-1j+V%uE!g`ii$q5%0*Q}RIn9r&?33A-TL?c`v4?Ufesr1aGbcYbJo_X -Q=!gy!bZ}#iN*Qz{J;+a22?2jR5y^uyi~hCaPIN5T@b^4~C0MLmoQ(0-nqFxkyiO(qDg@>q_oMv29|b -fX`-7ukXlbVK<*RdaU@+xp-A$wgPBtOY*!wrqq<ySCKq|9C>TADol4fP?dk-W7YjrSxST+2Y7LY4{WC -EP;WB*+<`1>3efYBdDNygEnHmBaR3AesRZVh?3adn5<NV*QL*whZ{Q+5u|CjvpNOLz@&wUhN1Mn^yui -tXgq)X3<0V^gER`b9pRC{U*Pkf=t#4r=6FZFa8nece*(dmAd<Q^=m9OEVY&qM6P&RbPxZmVl|2Tucrt -Tl;B{b-dj3=&2ISIiZPji9DN_RbqmG(FYm8;GF@J=mtQdL<T+548gjBD`QTzTeCqZ2ZFXWw@|(p`mJq -{)TZPo@mMRcHYW6ys}dSDBZ1@q5!Ft{(-`<xFwPEAs0_IEIzJ;7gzJa>zL+{8H)mBgo#j=`f(tHX0&0 -tU50*mZ1winyIi0Q!B~rqou5xnkf+a*XcdjCu*{IyVi`Vx<F8B`FFvCs}swdtjFI*BO&KeznE8Wm8jG -MCB3AaFy-+yU2=#f%-!Dvw15rh!rVl&;W3J-kwvf~C~y1o*uXWyLkN`MkcpnX-DlM&rko2tRhFW;5$P -<W2T*{)TtO}p-~H|4q$)?8eQRJw3T@1WUj_{!Npmz60d5;6|O_j5R_s%1NyTS-pCG($h!I#wypx5$Wv -T;by(P&hIK^Yubi{j)?Z7r=zGktv2?c+yOBLS3)uMdjo*>NZGv#^N4V(9k)#V8AOU`O==fw-8)JG7fO -H>Tg%T%f~tEHA$d*JLQwcFz#lI=Lvo?Pxlydsn=8HH~3zaf&3$m3-CuN(7)!mSob;M;wCD2ao-;SY?V -Q3D+ld7vBRG@F26tc566CzpTO_x>|Z%9y%@e3pETdj23JEopG&a8_#)W&3$NPKjtUwmNMfI2xDp@;bF -Fd1f3w<<#->je4~p|&37kAjh&Sw$oW1&!e?nLss_u?lqo9`gFSQ*|9dtkv04+^#Za(CXH!1LuOvo6HE -E)kZ^7L_kqP(It6Q&!@8!u8*I3Z_b-akPYJ0tOmvld{HoUM+=Nvv;eKZLDl<IQz8KxAHTK0K$9d3sZ) -rmSzbcMC?*xO7M<Tge@^;6%V{01?yFS*6%GpZU`mqOPsqLft1JZh6)n)IO$@NH7<{*$BM9XVk_!5&D! -LRd+q4cuYVY$2!Fm=l!@lohhyJm6&a?a1{H@+xY2qAErA`+)1|eC8274PB%~(OZu17h7VkN0jB)OYM+ -l=3Rj$qxHVur7YL7Uxm;>F9Otr728-c5pP-07^iy<^2j!_g8`;Z7M_&P=v+7cK)4W=A5i0p)8~#7cz1 -h;ESeGn#&r{?*eM-zjne_!AMlpz4aK|hV2!xoQzCn=@e@6UYp3JPO)7@qfVG0DBLDJg3*7oIIh2x#`u -1`ryPi6&A`Fduj@`~xpSxa1^tWIuWQlq(lqPz#}0b&f#XU?;vgm^u5ySCpKU*|WdV_H3Iee1n}8AX)z -yLb!>cULL)h2;!va~wiNI8b07cVp<Yfpm(V`T@=QC$JIOGxI1!T{VSyQ*DMdiCe@~qH{A|jN~PArX}a -e=&c$6LE~gLV|L!p5#d#W=#yF!P71?MC>~Jo^)@Vs!#S4Pa|iFLE2^OR3vSW+se4TAKVvfe40@1%0;Q -0@3#E`>pcDd8J9^q@0vJaL3d0bH#t9UMXau2X9HvN|+7T7?C7~!H55vL)JKzVB9%38&fA<$Vrb6grE# -=VCAP;?Y^svbJ5=vqDk!n)e2P4r(=9zxFl@GB|`cRg`$RmqRKCkyY7EcePmK?S{f7XkV9JmOFj>Gn>7 -sGyMHxVBR)x$tKK88DV=<;JwH2!!e9tPCM&U>!CU-_}fv*)|Xf!=8P$jy_FogqyAW$r5-upqkp0ZN_2 -M?#D(SPA&))G@EqH6a)8SCz#B!vOys5OZJ{;NL(@_4i@a|EVkZi(F5Gu09-b=!q4?AsPT0ea=$Syz3# -#oNmqsUbfaYI>q@YwA8H@z3oQ6f>Y$@L1tW<HF09~_84(&)R~4_0Qmul7{abr2pQ%x%eMEa&M`k04Ts -t|e1(?Cao(>mfY&=~cW?HkSNnYVgDndD6E)3GuBX4w!K~ob&}mCGSAd|G*Lmgoi^zr=`)vSuHUo`~m| -u7PY2V+!6TrWuH+SG7x|}AR!8bF7G-lk$>pq>PPV$}u<5U^JGkD_<adhPjL0}m59X+`N9hjYDlj^rTd -7-i^JxzIG<iHiiTk;lf+$>}6lcXL(Q`OV8#-nr{EPFzSO4v3gssR@_EU`1jMC_j9kY%{fN4I~%%{032 -{$4*Nd_Ok-+K>0wyZ`94`(oFB3v1|+A5t((V<ZIc*&u{L5R8xzicts-lhhvTND}`tLnIFAp*_S<@F$L -?AAO+g&>A2<LY&{k5B8)CrT;Vi+A)m$I7?*IA!4xan;}PNOh1fE8b9cY__z3me*!1=c}*P&ANgk;1o$ -VLBR^e#d)|5oFn?a`Q5XAk>E$11SL9<NyPx}5W5<r1agVLhM|$~KV@Ey#?W4bm;YWcHBR-1Gf6bGOKN -({7hp@(N55dLr8->Ka!*w{_2N?eR%Afiuq<oQ|$w&Lp?}4ShCjYYF`p6}GZx9f8dOkV`++VbhS(#71Y -a2t_*<JOD!Su5WYv1G&upgasdw2u(jk9_FLN1|V%<nx6oJ-F?PITr|jeUO)Z!X}V><{~}qsA8>eyk8* -SR4PhR%(IYMK!U^jidVQ&bPK(m=&Hob(|NoO13P3XPJBOHk#sXHr^b>g4*=0lX(<$L=4QObE{5L+`Z! -5YG|u_O6v9gUP44gdG8G=w1+$G8v80#@(i3P^OkCc-$F2SHze~0oJK7l9uyg^Xq@{@UP-XVCTh=Ef!D -CM0fj6oSEu(}HCX2Kvu!(N9ZE^y*mfmY5I~XwT`^K=NGN+lx?E8&MsUxD%;tvIf}ogc`!-KE=E8_VdE -6_PRPRu9Ff3{^@d}Iqw#DKz^Djtoex(nO6*@}{uMT^8R^>u3x)m=b18JHRHaWI#MaB<2sdE#BIKH|79 -ircGeRy>Qak`LC1@Gl&nR#GyU-U?eSy9Kf3oMBCvKsUTX<*Pog65Fg=2ld)Ex_fS)g#H3+k`t21hXO% -wC^q^Is&^m{R7t^J4rRsk*-zoEX~?HiLs1bUg$a(Z+%7pr!cmhQC<A`j$UozOdD}e)iFMg67#@Mw@!> -N<MJl4?F?yfbJ-v1*~`)`DzqhTKpzl6qkIyey?`ie_DSuW-wvx$N&TV{`E@m4v%fm5T)D$Wi{AVBWHB -<EU{0prRl#0oU=n!GQ|u<)NHY~g+O<sCaB@}J>`qf)`_AFsLlp@Wb{USo`)VvG_U*#FeDyY8g8<-7Yo -9_bazlhU%PmqBmgF&Q^(ef0M=`wC&c`k$uZgX5V>ck`&zhPB@OQmef9)i!q2TVVJPaUJ=q;z~qNC@Uy -GG6>4rb}w02Rv?v(Pd>cK&K#;7^xzSu|xDmcq{d6YuUM@o<a~Vy{%EkKthAr5(K?2;zaOI!dxbp|r%; -$YUg4c*GT<h>&TsbfSO58v5Z!wof+ai?m)zEACI#>dfowvE=9@2MSdiw7z?U2se%1Q%CVmfryfO=S@( -{y@sh%!Lnnx=jLLV&T`u;;`3q4#GWa6OKbzeP07{A*ux53jfO7cIl-%Sad|>odg_zl(S~PxCK9a;-of -?O*~ZHwZ%jv}?sRf|2=J&=e0R%mO!jCbpY%-e-yv7gUVlEvlmYsldcR@zwYaL#*@=d<H>x2M9%<DDs0 -3euTOGb}&kH@`mQz93X!7Q|jf|zF4PNy8qQC8!&Ci&SPBE2H(9?o3yS@7%f)^+3Bm*TV8k2kJw7Cn-y -KG;k*Yb1?gAK<JX)c4eMVk}{dS)a3XiV#we`{Unh}tD-L>nCdhY3yXD$)KK!R;l@#n^h?1sgJW3U3R< -k2I~Vujrs!^d*7}U+ox{zrL}q<yA<fVF03Se4F?^GsP0AO83mGlv3+)a@9KPco*v9^93JWCoQN&xHN_ -uIzAkDda`&|`*c}>>j=N695SAMxV_JN_Cta##)^;Sg2SBKRSaJg-8)LTdA}dy+-wyoUCRI?>?!Mty8< -w?ZI)wmoxl<qxK|}(P$H=^{&<yFrd}B1c5@Sm=Te%~G2W2i(I)J-{^p-2@G=G!0JqEX-vL#~KLb_2?* -6|4RsWtVeoQPNY==?%lOkw}*z-f0A_<b9Q5+{x48}3+OFb%_{Ip^chuZ}5v0ja`qlq!kJ}OelVRD)yN -9KlQ|Cz;q2CDG<1H+(0ZtBoLPYw}B8aWcZBt9s6hwT=8V4EGb9S#@yu`~2%Dv=2JQA+s8r0-X9z&rd{ -@l4=@P`JZ4j5@k8j}(_U6sltQW5a=b?&8x$Lw?Q*eM5F1#vq*?`U!`_Eb?CgRrkmmPgC5`ZWmo;@Gej -5pOxMJ4}q%n7f|&rKm30gRQ<h9j_;sK8|tjqaMLUt#X%7PJfi`=!5inIZff6NzM&&!g7iyF<5^q3@Wd -8DeQ55$N!`Zya;J2*Tg0)55P>o*CLTKQyg?1GV&_X)4?IR`YQ$JMg<qB{VGxS+w0no7GJuN%B&y>L%L -u>pg9kf0x><D>G~=STW^-121=nau@<Y95Nv8820s5DJT`zOZH75dqT|a;-SD_32Twlp>S~)KZxS$*wM -UMwdBuq5V*U%uQ(?raA1sO|od;7eEr7@KAfDll8T@>Pe^VnSv(n%2;v&R+Kf5}&J9^6#Ss*JTaAy0M3 -3lP%2DsuHG=~EKHjtvy{xNe=IN-QmccQkms2P7n2r7@p%&nB*SJB!x~>vKEwK}9)4sS?(t6MW@Dn2*s -LAd-f(|Ei|&Ce^J*Mcw=`rO;5qdTOttybiHT#N#2uG-f8YJd^bv`ruTd+@^JQxB|ib0^!|ywyvSo87h -;N)@?0_`ntVf1Don}#Am!yGohYaA5TIBSHY}P+^y5_{TCwvlW1&od{pq*aiGsH(3jVecgSf?+M(jSn< -cm7e$EQk0z8rfVO0E1mEZi;O?6^Ve}+?R`rfM0l<Ezk1wrWz6v=qThak&nnOcdeqOEF^EqdG&%9ee;h -ntU|%P3~Rh&utroxHjz2odWR-}3O4yUc^VT@-^6ofVZh!-GUV52x%}pl7GymHB@NR7KU3FiRB$@b<wt -9!_i64sJvoy}zh`16AL5{%YS}LDj$7K9ov*K@5dE8dsy#a3`WGEZ~=(EHa!N77$|}O4MwCSmEu>PMVH -vUs%rGin)6@3s$D=)IEgL+-s+kgWL(@Vwy37EDK?w1zRF*dFRtt0s+sP$g5NrLXS*tT)tc#E(m;#eq9 -P7PWgNmcI^A4p1P@~x30LD<9nVk<leyI%K%>vU^R}wNY706C&VK-5uU@9lvvTmh7FCFd+LyhlyFxFqB -lvtg{LQ7u8KDegHBdz=Kym9#umTe5DU+5I?I{KURm-i;dwd8GtqeON5?-?8L?^c<V^EPvgXGgUks+m! -!w5f12mEPYc{JFYio#+GMncwenT&%9x1qkbgYW0jz+a!RNv?zBr=%dR2bdt^sy;U1UQc!OMz#6_6$bq -#{q;=yIdx^ou1jbyr5S{4`bcQ=+G6l0=7g~NUje`q{&BLaQmdw?#WEf#CMa@9K)9*y+?}+N4U&rc51_ -V{ez+3l5O86rU;ebbc4LKRF9PGQuvVP0%%pxT*9?><B7twz9!f*9B%{--as$fOVx-rQsTD0agWJ|y0J -3a;mP#~dy9({&lsT8;U|w!X~fy8L#9xX-Jn3B2`^1Roo@YT!_oeN1&QLynf*AI6UiE+b`lHlVZc}p_? -JUx_dO+0Z>l~K`6lg&QZZZwv8l1C8A)Y+J!T7?XzH@%ZZ-(0E}x#DtD;w#*8m&dCx`zAs6zi4sQPvH{ -|%@@e+5-AgwYU%kT6E!1dc)^jKDOF!4!ePBn*=fh99JcuRs+7A8dth<TIE!aL~awAdjLB2^~_|G;v5o -9D3I1j=H`CRfn1d@iA;c4+6vvdr<7COYJXG_>l5O^8;o<@JDarGgA5?mHlZ?MNA$xF~m{wKQ3cG0rk< -|pgwG~eXN)|E)4$o&A{2QIB@80e{dW@9}J59HTCg9h3G?d6#mFb;qfsh{g<GMlaF=#DEeaoz5)4-QdA -CPUG9yvTC9uA>E8<QJD&QY{QdU<)d6#WF96l{cLCLbr-1(spgQmr@HL>)=JYd2@;eDn-lqh&FHDn>3% -z6*>q6G$=p<bOphZBmi$q~;HOKdrP#s1q)2B~%!&VTFN(ko354s4ooY&KP^d^~z<oSY(BhC&HoC0ld( -}+9dhA;h@KjN~!UY|o9-370?J6m=eZ8@7Psi##rzr8iL8E;{YH$Rr4fv+4X|Arx@lv0{oA~Ft~wR*xl -R)<(NKowt(|7{uiUps%X?*;gYtvKr)b7mW+;+cx5l4sm%ESnQT_Mp}E!PX?m3YE@0kc|Sf!~Pw70Tn& -+b34I$(u$~PO%WU4D_q2nK@fhdS4uTGaqGnE5TP!dE6g}E9AA?d_++_o0kG%N;T{r!Jf9m|<2-QKI}} -o>d}9B0Xp?PA{1$s|M>So34q5*^TmZ6U{FoK~V8M!gJ9fWBx_^H3_rUkZBYz5bBtlUHjZg$ZlQe{p1V -muOo=##Y4q-4sLj(*XUovg?95F?XY%GI5Lcrv~X3gkBH-P#W2SoV6vN}u!$v^cOhz>QKLq}&1ET5pXr -+j;u+S9f@yE}Xli9`7=`Lw9f=|P^_)4XHgKT|Z`16iE>XZGnz+vDgSybd)3^t0dy9a08#bm$-;9~Z~y -qlkBCC7?&98%0O13P(q<%afyS58=o5{SpuRgZ+@dY#{rUxMeZ2Y;NS)HVr+r#A`7k23O8s>T%70v;Dg -z@x@`D-&v&xf%fBV*nEWi>j3q>ISc;YCk1?C*`{lZdh;Khr}%kMTv(C5hai97@}s@0Vj#`oXZ@^Uz&E -qxpEvpyd;LXqz;idg)41e22l!x_Lg7srfo~f6UX|WHT;89ks1~YB>5W+ghjG61d(V9BxR2!f3S|KN6P -6cqL0d(-Lc%%U8XW7rwMc+FNhSkLVGns3uSR%lr3y`xOL>~SS3CubvsN+Mlw!==&d>|h$ujMTq;hC%m -u3|}0NT;u_^4p?_RQa8b>b)f-aIC@Y{MmTyC!VbYhEq$L_nQf#2c=io8m&2HU^^2jc@@5KRFhjQjJ?w -E?8jwgSy0+HbQQFt7H}$hIWF^rJl|DEL#IiRSX5T;E1MO^#b2M;7}KXcL#8rr}jj8sJesR4C)JqmFu& -_>CD;`n5R8R_8OA+=ESS|r8<L3iwG9_S|xzR9VkGhw>m15kC!YK)QK+D?{uWdhp6EAFg}`+YL=8SF_X -*?i!+32L}{Wz7trPQ0m`dhlpYSsXk9=^8j|Gsd0C`zq?l8!uxZJnrVm|)kR_s-O*{8;rmGx|AzRwq3A -nK78|o_d#ng`!!6lvSjb5m;NP$nu5GjipvKI#ruLIQ3wxjS-8nw{ENKkZdV*d#kwJ_eRG0Sh4CtrA&p -FyB|D?DyCu2srRY%GHr)Fw8%&-K$L5+iH!=yHCb_O?EqCs5rfc7IeeEDVd@o6`8^_X&NG2TUfLOGpRu -t8CYX+te3b%x2uS+S!aGpUwGr?&BGFNvmi;QEPKA8I__a?WsI^xwIIZdgH1;(09?F&9*(A@))~&9L%Y -v0;BgV#{wMXWT1D+1_|E8GC)t)Cr^{;z#61q|Bm1D*WFh?Pp|kOJe!P+Yn&0bV*k;sY!}dD6UWuR5x3 -qyh+CdT2d{WtU&7fut5P5~k3v}=axV(-P3}feR_n+<d2}7Bz!={*UU)ikn1VR8EFh`c!3Dx!%=8jg!N -2E%d9I)RHnJfR_ll5#;xhpG;u=4QP&5IQ&Enub2$UFk&~usQu_ejnbY1CaR8C^|*2?j8gTZEMOV*f9$ -nErc*zfXfB}R3+TmW4d0^~Zgt7qdQ7i(o(Y^6I7_w&l3AmMwnPpImIE^010)yPeiB+E~Idkhk{C!{!F -Sj;A4igr~%@m>3Y6l2}Joy!I%%V-;JMyt$DIx7qIRJkJ6W8<Dy@8`6=CTS$yeop{zzCAF_W_asb++SU -ItAt2GI|Efz0j$9j_`WdmI1MQ|g8Gu-j1SFeX4N{S&nX8~`jxM{&1+)!g(+@S@H?<OKcwxwNS$!;F60 -XX3DnkLoyIL#k5m8tPEsxgLq^%W1ZdY1Wij+wIfjX^Mh?PUlKG1W$ENqj!!h3<V_m&4w}eh`J>9{%;_ -g@M@wyla@>*U1W)-h@bUz2)<Vf^PR=0Rnvr<n}>ZTzx?Vbj5g@pV>uO%e%7#2oYFCeN;r!eeX8KAMm@ -##uz^7Q$sP*}63p9){PP`E#-B025flWTFaEbR6|$q=fro-AOy;Q4J{7@SOjY!8}Ckp#>0lvx;dx+oaW -zQNi%?@42}Dh>F!nKT_E@CmH$_^o}z%=3nq^3Z1@m;6ndgYkb0`<(W_EKWP5o*3@8ef|x9`@ZduXzDN -b{EnP{ed{OfCkm%X0^PI49W`MT1s&W59LI<~eI%g$1&M!2)XI<}lY&0vrWF0)3;5&Z@M*c<0m#t;L>^ -`CJ?Hup(cm58;2(kELthE`6v?rJ%dqEUdnUJ^Vb3ymtg~ln7;+TVkq_4jISTuK0-cU_sgL~OQT?Zn40 -F#AcO17TurYjqBlwfg9=cM<kpM!U&U^wsa>m0yf;{N=I}(gPgP@=K`@WHmkE}J1{t`MB2XsQl@6hRb3 -k_Wp6J%u$)!@{<ix255HiLG4|C%Qr9?3t^q(tWdyQ-(09fuD!_IKbi&!*{Wh5HZ`z%SW9?DQdN&BoCR -R6X{5(EaEy9V9L7AZZ=je~`4^zqSbd^Rpi(2mZCwKR`fgw-i#R-5dM_tgJrFT1ZO_cdOP}lgYQ)Jh)E -mGpW3mvDfq@{v3@GzZl)>rM@M_dP$(JmE<q8$N`p39{#08?R%Bu&eQcy=xw%FiwULuhiIN>p`ubKe^( -n0ndIxO%dl=p;j`+`a=bAc;7dX>T)jRXOx9HkCvTQZ3q38FeU6jHbfV}#(TSW;^JU6e5{0;OXpiL1#! -=V%A^-z>zC}E<BiA#5qsc8B1GPfD_^LONJB;uY;^MZU{lj#*S&7zk|8RIEARp5!$!9PGP!g+j*UgxE1 -Ba-L8~YaBCas*eCyaCL2vI@4i0f;ymKS4s7nN3pIVvEfhMO*xIY7=I!7#_L)78`KGH7mAU0t>kQmVi? -dr=<MC48yxn}9a6|GqUXWrd-ezy(Zn#MxDWCY~OfeHI(26^+<yPuztdYhSxS<clJu>ZC?tGk6^M6m(7 -lC8_C_JbyZa(bP#Gkih)FrTTS4($=po@~JCCf^`XRxRG}mOjKNd1*4sVSpB|eENR5${;3elJ3&i$#=6 -V~w2P=<<l?=!+_yo*?1PC2Rxebe0!EY9O(VB@OR^Now&_;jmj@Fx0fFF%;|?s@AwX!aZx5qsn#o)k<G -H#<Di(Tr*}&dFYkKZsAAa>LZoY>$F{>_6Av{V*sHb$_)Up9^U$TOWplD%jPOQcA7HCC3J4!4>Q3=KHc -LY=f+FS(x-qZ#B?XIqCN-sIe6G|JWi2bB3q}WtY0s^HQwDUJ?B{L?fo!wcR1AafS*uhk<aSxH>-XdeV -0=ows;SRT{WX(oNO@~!Fpf-mbnmL9IKBOF8CoBC(M151YFBCz3hgK}kUeJ?PIn((JJO!a{@VRVvV0q8 -=?cxvmsgTN-xl~L{@gd=-jc}qF>q?MHR}w)C4vlKZkJSY!76z=_QlGEos#D<mOo4iQdW1A~dP|csKd1 -9$G(hx(254GONZeLikI1XsX}Zz83_%PuK=pLUL);9G)l|lKvh#yVK@z0`1@!f}>Y>NWq$dQYF~GrOkn -R`Lqizw|8N|b&tQ;Uod8_YyFi`c5Dyn-+I0<;KaEP3pW~&KZ?Hx0p2(4{j!#au_(wq&I)XNf6lMA8)N -~ey}<g%B!58*D0<B@AcYbNC2tw|4VV8A>LpCmlmjLv|i4+e?=pPxm`uqljJ4UmWUGog&=GVN0?!4rZ( -L6aaGWmrZm&+*a?7ot$VZR2Es0!ul|GP1l8gK0p@OVt5HOInT_>69})qW6mcR|9QMuaL3p$QRlHJ3Za -l#F{=4MqQm(keLOr@hfC|qs6Lr06Z+Kc7ju?<mj}TE2ON@{WsA2zT=?+z2@ba+JXjth^Zbt+mrKx(mm -LK*<`lDK(he-DEGTbuI{aQ^Owmb8NI=q*F09DZ9dr7RP|0W3NIb@sh&l=0jclQ!?03g4@-0V0IU};_j -DXtR^!8hmim~5Q`#A|Kv1nHSL{1j3p(^<6%Gbb4Z?FCljfNJde@gg4kln6sW}BL7wb#D@k-`(H&oZ@u -J$!jhyEYPR5MMqwa*{5^P>j!ZPPDxs{h@7KXBDA`}|ynN0Fl-MbR)p;5da76iFR2)G&g=B!WT^j^QYE -_+Zl5R{#q`Khi__L2B56Ql1@T%Y!a{)NnqG1?mvN%#(xikP%-3ti!15qy0?a#~66_Y0oA<T+aL;Nf6m -VJJ<nR0w3&DB09FD*?+=+R*0vvg9VX&E&$69rUdnYR)>dHeAJ+J<d>kwY4(li$LtFxjuFXE@qItX;S! -%8MXDq|It}-G*>CWh>=N<UqSN0@qMGjj%VC=}-|*&CF)fZwELJ|QO<jfY`h|x(um?^2iz?6$&qwaAiK -Y+VvxXiu>oE&IY^zu{_5}hs<Rt&aLuZzM^<n=>5q|qu5#Dfk75KF>_Ahy%_UKI?f?GGm)xQANehTyZ7 -5&}?{;l}_DKXi92C(>V0Lwf8);{N`3RXzcCDU&ekVLdp2rQKQWB_A#gjVX7hKqY}t)V-^Pdy_K_rWO4 -JvV&698>RGc52bs)(T13LJgn|LYAonB(@wLtS4ss<%|v)o>oN~gv8_2%1D=a7jLu#EPv7i8xyJiN}A2 -Z)zfPRWPuT5sW%Jt(ty$FZ7t2!Jr@#sxk!drVdLO;pnHF6N<7xmJ&UoXaua60H__elBLeV@v6^uSxAp -A=WyP%CpdsDA`!H5KXq@DIpCA(~xlxrOUex;;?348MenC`6J<cVp0yHWlx8`{wI+t6w^3vA~7Sj`{`f -|J^N#+>>iix>=##c$EgOkazr~SLf7yJwwtJwfmv4;w!mtO_M?bAHNL^}6R8oPnRDB&jzAe+G^yAY|)T -CJEPCp5`I%BEAa@|W!ALl>MexqzzD$PBr=_}*tpyD0QhGx{-TN215-3odtO_9UL>N9B&tdJ%7QA1~SS -ECVin)i|!I8t!(L2?s|@$;o9`>0Kg9ou1>6my$^#Z!PyamSMK4hEwyNpdm_4cy`}_4i;ydK)WDfxOlp -)l;*FbH=^kE<=&($;|cHNz7UU^O2?oH^(IUgzgFVlLb)_FO+b4Zb5rpK&2uPoxJuTYs`~VCwIwb>ZXT -AT!fI|79M@?$7fPZuOt-CCD71uZ5;qsXwYLnenq`9b^W~<LZB(bXqH-S>0z)*+od?#V+89|B{hT7<eO -8~XnP#_4WX|!UTY>&{v+}q#pKbUSu@~+;*FEpG&1n+x|LTN-{LKjk`5O}o^2LNgArytv1d8J@1yd-tP -cIOGQ#67@&_3PluTcd3GGjlc3H%_lB_B4~o>K1_HW?kO14wjqtdq$>G($d<4)OJbf=5R}o#h7`?pOu> -$k^eZ1q$->7WHX(I#w|7quVLTKh0M0pSM=Q@v#=NXaCXX_<f?npwIdRa*VPk@P~=>N1tS$z>dx?<e2s -Ll%7J58#!onAED-b`ba*V?9eBfkFY~a?{D-Vd?u9j=LrSs0{Grhmow;#+4a8v(#MPbZ<u-hpPx|HKc7 -$zVUM4-{ZCIQ)jwIYK>X*5B=%#u0L87gnrywS$WXYJK{-Aoo>WGzQYhrbUQ&t~Ml^Pk<vkr$#rSSs&p -tg|2(7{%QXB$4bgCSq5cLPD?U<52D@^|w%stQM-a2IA_dw)&uSGEi)t*tPxzG4z;t0y>f=So60)W#?W -A8VrgU?I;!jsyC<)#An`|E~MxrMrVx5bBHzE%3o#to9G`3o{k;>s#cFwqx)dXAuO`W;_66@^$(P|h^N -*U{yQt=5kIQQv(sPo6{`Ju1<?POpOZ;HfKlAvi3gdjN57&Uj+;I|xzgxe<}-l#!C+5ooiAv?<M1j*v8 -xLLU^IzNsrH6?s&JmQ|*AA8ayUJ8`9VgDEBGCY5xA4Kv5f3DRAQeS<I+PwW6L5k@u)zdR;N^-gy5?&} -*7P1E@nTL5K{(AGvzOeDKOZ0;!XL^LYw)Gl$JFJF2KiCH+g;*tiLpCTIyH&eXYc09b!4iQ#B<E}Lbla -uUQge=hSP<Fj_%e!EoUoZDKVQg$gDqN*QjG*r+QyXCRFiR2a@#-bC8$fCUWa2kG7HeC7CtZA6JO-X~5 -C>@soSwFuc^pJ2a#1VT)w@g6{xxa4HE!AP1SbRl-rTi?@SHTDHW+F>IjLG<r3IOwJ*tn-J)Z}e9$h`= -?w(?E;OzP4@vi{#oV)8MG60S6m^ai3DiPMV>t@9nyteo(<#G_s#=mrT0KT$!U<&aUcL#euUs+ANnu5< -L^2xc@?u%CMhTZ_~zoE|gM`HbYmCO!XuomP>SVJ2+yb}i4G7QPx&YeN|uL=QFd0Fp7vz#P)JNf#OU3| -$;s2MXM^L^K&I8fnejF>0E2pm#9EM$_R0Ypx>WKBjl0Kno2wTkw>r57y?JR}VFTSXgGv-PUKm1iyp+q ->4Ez=Ud=PT3O^SY5L8-YvOG5f2-9;CkPI#k7MpJ`l=zV-!miMxpYRFd(C0(1{3KW0c`?=H|I*syr1}I -#s@n^VmAq068w2_ROH?(swot6-(OFlAQR<<J!XNyJ;TYe0x1q9ln;<^Zh(!tVp#Dy73oeU5f^Yho)Yg -UN$YgpkYoEB4UlL))VU#!#nwf_`X?G^qYBsBVV=8x(axBLCQijy5=O+z}Q=qpt8mq^LZ*z7+p)R=G4C -1yX3xX=qWz@r6(05F;T|nV?Q!u)uqPm)C}zA3LucX^EH<gJgcAj?a>;&GIoum<GJcUo7!OPyskSq!4? -FR+mL(GmmZ&xgrM2h3+@C8JV}gx+szabyiL`GDSFyjV@FJEpU6{1ZVX0LT&|_%DlLP4dPusMho&qN_2 -%=W!2=|5sc-UvUZS*}#c?$COFJ07PRX!pD0A4{->s*X%ELHa(tro0NqHz*67&#xvT#fS=*p`*UAuVG2 -^J9RO%g?^xQ#Om6eG}Gkk{zASmO+(LM~fp3Cs;*5ARQwx-IZKcL41ARswPUFDKUM-^4-a-@rlWS2$?@ -OG7k75(IMeV?sM5La9BuhUh)XruMgS8vT;=5kW^6<Bnl=Op%iZP)Vtep4vw*=Sa0b>k#>;S(75aRt-) -Mm~(K-lEX>j=$wp>KR9);{R!+i^qUGXk{zQSjg;uIBtraIFXl&~_~-=4Kdyy2d^9Z_=1|DNK*2u7h3S -XrvFH7Vdo_HB1sz_E@d1C*=n!9n@q_KQUq6H%Jd^kv2ts!>^jA2D9gg|m8-Kz<@XfyIO>i>iF+#F3ON -;AjSHH@xG5D``hyMrz9S{ik0|wguDF*sUv-iJ(fer`+d@#^<v{q|BwUvKo^X;je#6U8`a?P!yLN=!uy -#WhWgkzDaFMHG}k(D1STOD#@O>V)ff${{~f6e&4H*WLRC7y9__qdJROUp}XODNL!me=82_2EENz&|k^ -`eIh<fnk_#Y=@!!nG;!Dm=}EG#aO`RUzPF-U183w$dvq^M*4QUWN4K?dVqcTPS3uANEB9Z6z|aWon#` -{nD|o|HItJ~E@8&gQY-6LPtSfSdu%8-(C8Rf7%~kAR!f$2YR*%yHU3Fs_b)$q>~97S>~91Q?5p5GlQ; -!Yd+<PM5`!TeIpW9hUy3C62?L=piu}?m^>Bdu=p3f_q0I=BM?!UI8-B#P_l<daxWQo`3T^WBvS&^l^i -v8umOWGA$Zp~f#dc4npyZHy-1D+Mx*RV)Eluzz<0AIo^PdHeJwo8=K?uV>7Ia5ofDY=};g$OFZbhl1Y -<J{N^zkqD$piPiEBVNp=kZaYI|yXRAr^MT#rQaUzY!Ap8}wL~I)cZo{5g0~BFXb}XM*1T{d&Jwwr9`3 -29NE3ICwz+-vtl-{1=)O`lT<cbO%A2etL_S3>w=E3e|vQOMot+7@6;joXQL#8gx_UBz3OGTh`KD(y*_ -W9?QyIxLI+0$_g{ij07_b`i5C0g|ZJoBhISA(ev1r_sffgL0KGwBIfrPgU4kvOH(`EE`MI70=`_S`n5 -`>U*F5t)$x0~BhM)ErZJ(gaPUB%1%9PI|B#tDzf?IF>HIDZkU<A^dGZMy1|KriZ%F9P>sDPZ^$c*2#G -uY;$WPSJgl6lM-Bov?%`fDIF*=yxF>*P-T)vYOpN~@6($@|vlXA2)dl-EHzN~753<_UsTc75SsdT8p> -=5|kQ#|tzqLDf--x&6PbX-0PHb36@!oTuwAM`y=eSN?mqZLlmd%!{|1o`wqe%21?BV17^N$eO0h9PwS -4}xG6jU!+7NFMM3{xCJ5kA7c%K%O03(D0#0v%{Q2!67|X1`f@d<jZ&kXNR5x{-M`H(ZTbeKH=eTUq%i -J2==i{Ac%v)4}Bv{eA+6}{Lh3Zup<QRdywDcFpwkWz}WAE5%|*}Nq_nesQhT{Oz`8y{x5_a*SQ0n^g| -2DJ|U9G4yNr6;^+?`O7Xue`h2uxi63Cc<(@=?LIeLCx|bsR8QvEjw1lUT<iEDAw0;qqbp&@2D#razs6 -V?4oC)7K^WPjQrQe&ZfDgC-@rNCLH$48~cYKzAFk7{afi*{4_t)rmVk_{|#)=hxiJ+S2@V>^H-y&!+> -yG4Mzc(0s?6Uy1;`86(!@=?Q|G0yNEK|@3@9)9wtHKcQr<EZ+6KayO8sj+!t*%|=9Cwix<xcW-e{IC{ -++1Q*0Lr*miVa1{cNZ@WtR$qPST8NsS?x3jwcwqc@SVSr(49!mP~^mt<hUBMX9_BzlQqCS4@iqGk)=x -J;9=V}QqyL|Jn(%EDE*;A-?uvo5uG3|4kk(leNQIIS!ujfG%38o0I%8ibX;EO+k2yU1bGjZo5hQ*UHC -x=?E)$pk@N9aoZb3?Bwgytd$~L{PTx8k|9%3u?m-DKaxHGuc6CqAb(!9`^J%{F3mi|E1`g3kHPecDhb -s}<l*2ckgWc^_pV}x;F<?7eu{?2Nhc&d#bVJw*!>ZjM;Qr~;hLj;8nIiDf4F6~Z>zz4@+!Y<^JzCK=Z -%hc#gi}ADkxG$dL9LC}Zj3JA4-GVDT(sNU;INCAy4Sw0?pK?F8VbzmXDQ5`P9zoH02My_yw6>qZ9Rn~ -Sy*sOo|W!dQna|dFswaYo|6&#cmKU95>wjLTW-in1{t}N;(h8p^U*27viQArjahkOe0dRl-UJy~o1SG -Z6DdV%hA_QfJV2!B5s7y+BYeKGlsN@82vCo!#i!I1+Vo?qDR+#;lNKXVCUjvKl&_QUSZz7>9re-K_{~ -Wt9aVgolg{PY$&m`U;loLd7F?WhP7BkjyN-L(?C$T{rp6I_*31q=XTK+TFktjdElz2K-0ki-jk&!W3A -hXQ<p-A|D&`_`|70EKn>4ayGrY0m7VVtubN$Eym-%QSZfEt(ymoNYvjs1(X2LO6kVTROC6Y#{E4_v{c -1n;MictkuoBii6ef#+X$AA8WL;FjEiE|RUI|90epkBn0vfuHAR2%^02kQMx3+HJm+H|UA)?V-Z#P{Ml -uI}ls=BoB(Nc+~6DYl_tz+;y1?>lYkiA3J$XQgnnWh|;>JkT@v792*~f0#QkyG`?{#;Pj~uv^F^1r`l -W7sAE4j<|EGK4o1(x`$?SeC{@lU*)}(Gy<JE(*7-#@NV#MW@}%uV*r&f!o0U#%L3Ek*Mb%~wmvyKOWw -Fk(d^XLu}^9ms)}AP)d?d`G7OFbsd?yraWW0mtti*+ll8rYz@PN28`&A_r8^ei1Cq8qT;vi;iEc@|^> -;=d!vK5?v~mh*REBUo0bZ}>(Q>ZKcGKHIv4KOWG|l-9F;HWayy04pc*8==*^2{nrshX1^AQdEQ|B|Dp -Me0PA!o#@MzsJ%HN0dAdwrv|q?l;IbuKD{-id#BcTsqzQF`f^iOF(p|Lo~SzM<Lm1SmX{W=(H7OL2L1 -OiDmZh7x>cDYDs27adCl)#}LBaxXXH;fEBsM@~~Es8@JVE`0`U{qq7kpc9{(Y8+qnwQGh`PLoaU)#Sv -67csv*6#v0vc6ZmLc6;OS1JR=CyuD!G%mLMIZ6k@#ex(i;&im(n#%AxFRaE<WoXv!Mi0)IsLUp<ec34 -A?nBikk<NaRjFRuv%7Mk;ip}*UWDaH+}Pp)E|&?-{2HXiiMH~e*^Oybp{uw1UJwjqu`DyjJ9N$XMv1k -fr5-DAuHV>%G0dT$*|!Aoc4GKy}bT&3`-@Mny<Yt39QtHBg=-~Vk~=eVrwFqhvhQ8WH#YromH`rD;_9 -C+(6Qhh}4^0)uBgSvifK7<cv>>uTt{l=Dc*}Sv*w<-J0$sUIvYgImeWBTYllzkKZb~z3i_hY}G!EpcY -ZzuUN^17#_TGl_Z?KsEpSMUpj{Qu+ieMhVR=-Pftxxa#?X>tHk3O-B#4wI|=WB!^Siqi+aBM#~a9vvu -^%Kj7k+EE>aj~W+&9qimJIjU!STE4%?(xV`Te(HNWYJ}3mWGkbN!P4}jF8OC`kr;6td^DPVuq5_PyE{ -6tD*7ql?P)s}eN14}LoPe}tXCdjm^eyxS#%&)<kM?<n8FiBOV~cnQ4T!7>|eoBJ~&`0H2%xt;NLuAzd -3h7zo1V~kQd-z2Iz@%hSEBCcD2kwg^kcv;Ct`L5svKdds>ZqlD9@kjfXbNMgGzO@lCIH2#V|*+|VD!c -n5+}Q};42tikP&_g99%X4Ukj!12v3)O|nCRTPgGRLzFweIoooP?cXTHSl5hXzx1QSi^mgeE|GO)*b&i -t4BmOGsygKKL&CkXgQj-fbR`es%LrTqjpXAy<fgCq&Dj~`(GEDkK5^g8Mr%c(?t)-Z67MWi+pPvzi5> -^8)q5T9q%AML)zh$@P}=hyw9zF0MEdVo?W-%1C0&7J>5mST8LL>&F6mA7}4+H{;)Jxp3UD|c=@e%_h- -^ax4H&oUg=`79umZR%Tid&f>lSz$D#KX`R~HKDfh!aB5C0Je*bXt^!D3h4v*c>Ed%>KFRH`z-`#ta?+ -@wF!W8Q!@`rtZdWuU{5BIZ%x32s4F@JkbfaCCpb~e8kD+W*SINP&!9Ke46RP_C?<8a6Aynh}Tc@+C3z -&fAL_#imRGAsYvq89&cQOl&5<9)8UeC*46bWc}^7YRhP5vr_=-t|V$@Qi^F@_E7svvvrx_CgL`YD#Hs -{V}zy<g{0;F|h$#DMGIBa<zLveO+N4w3zB%)LEdz(l(vqOC>CIj12~Iu`Wg*^BX0l=Y&K`dIRm(HnAQ -}$Pg^+J)om=GEW4|fXi*`S7=CX1H;gczIHmzQ(AEv#f_T4iYMs%sd<*GaC=I9&LEkhD##58qQo49eM+ -3MLD}vQx&vqAf!P=Yd2*r3m~p1g1ag6?+I6*=JX5V-$d2iH@wuwQ6Hwanrh<{c^+^3<-v~Nf6IF!BWi -e>q*53H&KWMs8$?RpCyuHJl(ScKr(bZ7Q7%T@EMHjJ*?7(cf3P0Og{e<&E=OmSFEM9ep@`M=%&;8&Qi -v)O7@kQDA&&5ao1QhPrmTON~&ac&ryf?z4-rjUCHLU`bmyUm@nTNug*VxQmdO0}L;Jk+9momQtjFf@4 -R=_V=%yG4NuQ$qg>x!zw=xa<}^;X$5Eot2hLX8kEASW0XUq(%Pt@1g(=D?ma;uxqAD77ZFem5LS?*%e -Pld&Aa%77Km=&|cvdxa=X6$sJy&+zpQdoVP}{xxDiz0GH_@6JmX;nq#Y-b8k<E5yoBl94@KyMyS;!M5 -jyS5JPqdO3;Cxx(FZe-2icOaQ9lS8wbdVD^HaR@j(Nb<1gE(cCN5$=HqZq3VTO4R}Gx^L!tb5<UrYqP -*LUbTuyDVJUhYCWv`@t=sezXI*dX+)?H2C12a@AMjSiGsk>0a%Wse`pv?Bvkb%8L4fEoy7=4K*#G&%5 -WgLJ8J6q>zj4NY{9meb{<U89KQiEVbnx|He}n-v1kn^t6F5X-5R5=DMSN)}j~*P+ls*6eiXFW{_{XIP -N00h+_K|fUp+iFp&JTLemy2`xr{|hFDn!($8Tu%NqX$kvKg(*=$FeA+k24S-U5ovkB=%#xf0v)gj{?^ -YCQ|4qcA@CUxhOrV{vXwfqizp>yg|Paq3HamX~pq@XYlNxT0!}Do)Y@;L_&_@I-Gu5jQ-O5NGOjI3(9 ->526ApTx6{N*#Iyaf3p@A&KmZPeU_#hF88Y+t`qafuJ=4V{nYXUaBPmSCvpv2RZC7VK-Yrbeb8Vis_l -YCi=QRDQmW$@`=BQb}%M_dD`OJorb;wctUdQ?z#Id$+v$g}#?stg_Ky&z`@P5>+7Tx>381Km2zI~sDA -F$!IKV9;#R}B2qOaAqWfxmspht|gz^BwSw#qpW&xX*-F@C*`ZKBe8ERLWv<({y7FK`&q7K&FxVUEy*s -Y_4s|kvF9R&K;qmj`?P4!J3yR?Rz%A=0g95)_IRg;?1eV_LYphml4I?FP}0!yp{UGO=@4>*a~o-&mAv -}bXy|}_29V+fpo^}`p(S$y-#x0DFd171%jI8)t6jIdanz2zn^+NXwLbbD+3o7qlbok_it%d@NvXW&YL -9g6O9FQ^6dLAA42Dq_jNFr#_f4m&GNdbt2OcxDrkHKyb@z*9v=TD)tjoJ;w4i|{(>hfb}@vdK=LqeO6 -4^>j;YYxiu+CQdb3&lyyM8z?HWLHrTluD1a_q2;fY076{Df3k=XVKWH5cEmgA*fX6qyZM)!B)US&inB -6GPhY$(DA5RRgSAec0ZBBS>5sA9|9(L8xo4GR|uWH}Er)vR_sKXnU*g86EY&*J2l1SSo2dj+=Qtyx4~ -U;C2IlPuOF_Fiutn_9Vc!9(=Y$#-dJytHJWkw)oLdh(^Yel?@2C8+oSR1~rcHFY#T%xu^W&q%IxNwvz -F$dL+Up_I&lOG`o-R5T-9hkNdRw)+x&o)=NfIG_@xY*aT(#W(UyGd*by$e5Y9mseP8A=s;B7)Ms0?<b -{<>O8j`rPJOetES9;&n>fmm07o*<Kk`R;WE=nc!Q|et8ci0)Kyk9E>3wi!7lW@y<>DYv!xISaweo`^D -3SX4)`Ns`KQ$#Lsj+<PT$5dYH!>1T+#JnH*$2Ztv`YW;4c@ZzaT6h3VZw8mhI&Q&{0e4t1Ww8-{BS@b -Kv@KK7%V)d}0y`f<k+upV?b|Rf?1j%2P2AIzMY`z4j6tgbi@EQd(f$7&aza!h7V_rQNW!b;rE6hePN3 -YgI`hYp-L*miPP32s}u9s1o75of~$-0nTXbR7PQozVrqilbIMA`V+;8Q0-Wqq;3C7#rfM!Lj9>i>1Eg -vtW<Ve!UyvN_v`*WXlg8gcBs>=!Io({;tPq`CH`EmV+2=MRZ79@yiQvt;_7HLTndhN%ExYuMHM@?QG9 -t-)*#SYJ3q|~!IQ7Z$*t?iTC?0smkWM2E{QPH9GK>(izy9Zgp#RvG9nRtPX(}N7sU9ARr<DN!OLGtkj -#oEx;RxkOB=|n1oRw>C4*^h@!lPp#1}Y?1oP#xXMvJi07+=OgeN(mE$;eaw(Jp%^xPI!ZGq8)TBtw(& -8LZlH|<HjLu!=CTj%t*<{~B)%X$Dr4=TxXCiR9#k5<a_bGbc8@fjybT9EG-4*H0J3PGQvmK872Bf}lR -KRK3J!*TyIft!W#+m`3j>)yPBt&zokI`MZSRqkBB)|1-w5{RN!Sn=g12Ta~X=QFQDlVjWS(!T(Q>cHd -ysfoNcwmLSg<scw@=Nro&U&ZJ|5z{H|t6tYBEt^0Ro`vV3d`w<F>3%h`eP&7t_(nbY%%)B`s>SWKJzq --H^k)f;A?n^G6IA?zrNa*f;@bY3;bYbx6omivsnvXc!(QJ**1UhS|Kqnb`_1|f^*@ek%#XLZZ}pTU8n -Qn%!2CaUk{`vMFHi7ORR<?=1j8_h#*bx4h`_$~^Ei~c@MFO-{U9U=I-13ik0E7@d}!avA>4|RA5Sv;Y -raH&w3i=kN8~{ZPpG5rbF5f?kRd`Gm6jbP?vO5`elOST$ZrRH(4Q50QtVjKq?6;w<Rc80eOxdT_>k8* -Y}@EVg7uJHB@bYjM~AD&zBBdFn@zBT@{yxQapw>igO8o}8{FY3PVSfTmxUhfz;nwFzJ$W)ub7mijUk! -v%l2?te0;A{0Kc#DnWpmxo&+<Ct|*Lqf`8X6bLPLfEJ|l)FasaI$39<}NDXBU{{S>j{=PIAe_Qpl&M_ -(%E?RG?=ncurI%>&2!W|T;k9pMWWIx@v+RmB%u1Ch}Q&N62zl{8_3lIU?5BSLh^ZSbDXTkG#1u+w$SK -!;)qV+lW5HwSr?^-^=tbJsAc5qnn$Y;f~dh9?@TQnzGwQb*4aV*gNB53CF{2!Pbg~ry0i=;3F4!^_DZ -@0_Nv-<rR9hmlWiOQKNzk^~C{?{eSf{yRcrH&8hkrgXK(JkB(*VKxC?x*|48R6zR`{M&Nf0R=6d%7R+ -NAt^Hfb&le@tcq3$1(F@u|R*T>;inRyG$5?)|tvFccs^sr(_Dn<pnpd%H*n(e3o2kG+>Tt#!9vkPIqn -FHRY~M0c%j%HN*{Z#op(t+QiaprArvGS&)@bd1{mpx;D=X5qnr?Migwa8E5vZf_C<aLp|V~y`a+P_qn -2V5aM}tM@UoD7ycX<kdYkXLBQ`zcp2T;CLuUGy-!A4g&U;s?-$%P89*x}I7>KZjEP!%*JwZr<H2uaat -5z<xw_OErvcJ*wO*Lc+mkqj3&kbXM}HYfg!2GC!0v_W)2(z3AXPyZ{`UHRs{4{=H??HzIltn~iTFe#x -|-1l1OkaxG&B0X69^E${sWzBm+gC8*RETyBHq9!!W^^(9BHqWnJZV?c|drLhk&%3xHhETLz^2H#tu{W -+$Fa~NEP0r@yKo;Hjp)RAYBRYBDN1m=;y<^&rw;zxOS|#@9k8-OS=&DD5>Z60C4ebVT1Vcx(r@}Dywx -1|KyPR<>b%K1%7!LsOx?@c^vr2(O51l3F-;N)pG{v7S)bATY4>nJrobSZqdi6-WMjotcP^rv6^d-*Xc -=k9VP+?jMa!0wVu)w%24YdO4BVI!0aCKSMMTvOn*8n+n47OI}6@F3qrOok;I)7M}EQZD*?(F)N>*U3E -R)tBUaytS8_|`RH7ieR@ggC_a!C@e&lIzBQZ(Ng~H=r-`NMJdz9h<ueNEFszuHm&h~t7PD7x1l7OsKj -R?viNJgn@@!(Ws;W8&97>$#e#aDM|B0MU_0gz!j#Hb1J&@!Ri%e_wHhQEO77Bgqw+!$~P`)8&M_hF?o -rj@EGJq(nvV#(m9BDw-=bvU2PBY70dwbBN)Gi6)lJ4|NEzX|@xe*^sg6L0b_!T&p55<<W*P8~5Af+=e -Ifm5GqCH=SdC?R)2&&Pb}y=x46PY{K7RdnzMe(bGB#6QpF1mr)0cvmrp!LC5sh{WzAO6_XM4a8w&NBw -<JD!%7(wuPzV+ev1h*Yy+Zhlo9y6jOVj8Txh*g@d=66W#Md8(%@GT}<i6Z+&F2AKZ8V_AUo)Z@)2-jX -LbA%<VLIS6J>=qVfLT;ofKcSJ*GeE6Xy>SATX<^3Ta@ix+I|Pt8~FT+SZ<esP8Y-sUV7!+bNpdE2ABF -Bre@9Buqj1X5V|4-7OI?u|f(HUnb%hocKKTHhd$8E?4f+3>oHl|(_Ww#$B+>~WFS?d?8F5z2XkaNsLI -p1#fI|QaN^-e*e<+&vyAWLMc-oNhg$Rf;&<cO_;s3CvCp>FcC3FX#r17ebLCDu<}cS(M3lAicOLY -kUi7zl5b%Wv{kuE}_(FvKT^{t$hxjKR^jjYFY$FN;d+DWIl58y+(qqzcMo$WXr`Z;zoGz!U#XfFGQj+ -ocCDY9X5*1ZzK|s6raTFof*OLthA$@g1ZTR9Wry6Fr+|fskx#C4}s;FzJPrB7dGk#~G<$~2LIhH*DgV -aLH>C(v<F3}06<=iVDjqT3I>Rv7btUeL<-kn9lbp60UZzBV#^a8i;a*O(N2OzJ$x*Z<3L8U-HFDPkQ# -UU;`@*X`s+0<tJK5~!alPd$!nRNZ|ByaB85@GOA1Gu>W-0c=PR(&*Yk~4VuMXTa4dLE`J;@kczLu@dj -*Wg&CX>sE7<s|Zcr!zcCzzB5qyBP3STvjIcEW_cc93JqYLs>k|*Nt$>baD1DZV}TwK?PAl46a)S{kFx -X)^jmU_H18x0G(CPOpHm5sL(#5cz6@4Bu~y+j`hVN3mK1b)}0LnZ#-htiV#)=#w%PC8=1{{k_1{?B|! -gmzIul>?eJ2a`%tlKx%LgwXtAePq7y%8YHXyLOCvnrpw68uma+<{(Yz`^O0CXGqU1vu9JL36CufB{su -Z=}rwqO<Sqvw4qZtEOyt@*N96)wV9~ZiQWLhSX9tzaOjaGR~P!9<=_%}fzgVsqA>}tGveGquMvFY|Ul -;C3bm=GO;COlBIagou5I4)5JkXK0R4NjcWx`fWyX(q(kDDu9KXLmzk_Ch_64U><^lM#4)Rh{n#|3tvI -tO`kvnI_;?^LPcSw@@`pdzd@V?nC?&srqs*@Y%_~L#lp0_(#I{CY_1#dB|=<MnW1*t)Sd95Bqg{41$4 -VIK<u@Ai9JDNf&N>e>iq)ToC56(f*2ZPVl_=4%UNqk-JSqCyxP5ny&1UU^sa!NnP{4b3j0`L(9MC8r! -!rQG~?;Gy2BYz~*@+D9}{2LL3ckl@Cy<)XNb%*x0jbJB%j037H!i*sTtEF3E1Hv%0$HV)FLo(T0<-Qk -v|5>w>mE-!dsEwh68e{W8@!t#{o-N$vvc4#0}rJ=zRv;ER_ry+}r=Y@&sOfu~hY)~A-V=^zs_wHp`S& -RV8{1Ys;|529e%xIW;Wsem&TiCM1%Q;>ScFS9B-^a|dzUc92<IMs{0wBEur-CZ0>#qbIgJV5r8k5*y> -NW}8Bg;@1W$whpm?J|r`+HKJEe9DMu;<#RY4Tq2>g`5qG>fkc*OJG=9AAAe$3E+zR=p^?iT*n4s)JtU -4xkGo8jl;ID=&lA!ikypJhKR1UUEaBVr6mDJhFL9ab9tbE5zh^NqT>PgC9%1Llm@LMpBD-@MX=CWC2{ -o4<YrcCLT2=E$XI6kz+6vD)Q=PWU;ug`W6U!>@`we<X`P#R$#`P0luA?Ryf)9>MWC9)gkd7jRZUcD=~ -JHikmhA`vE2^9Hj1rZwA)2Inb*)k0>rGf(7em!4C#iWY8q>+R{NYg-!&oZ(nv9iETEwb#eswQCjdWZ> -G$dC>3=gv^`Bb&PxSQkV@`^~jwEtKsN=>*NgTl_@>64-eLxTL4+P!IZ;-!>$u}lQgm2$xd{0JEZ!!6H -JSP5ue=dpN2P?vRKOTj>4GW3=b@<zXIf3@<6Z|$4+-(Yicc)LVr>%&M%tk+x#QVFY4)&f0^x<N#4`M` -i(K~_d?t>)x{u%BX{*5^AZq9GFosI5pOqhHRXpG~%1#r7K>ccXTc;Dl0i}05zDRECp&EKS?M1z%iGIY -niEA7*iRQP`|CB?7w{R<W2zDr4+?jNa_kD?`_aN_(yKgCsn_nM`M{ZX?-l_H(5a66~o{C|*|I|^fcq2 -{;msJU)^q~g-_^fL;|d{EHSWn-Xwy+<uTS|2^IjhZ0X2oYrw=(V`Gmr*DE!r#!rS=FNkpF5$r>53kwk -z!iie6EL11pN*jxv7Hc6KAUPjRu%jqH+10cd*c$U8VN%DF(AxzfgtnVDP2MN(T1g8cz{);jKhMSA)IY -k@Ks(XAq46sG0F6$I<FOgpTsz`r^gtxzR2z$cZIgkq{1TyTQ0pr|!4G8+F>~n@b&b&`aWvw<plfdTh0 -<e9pw`q&E(ChAG9;8GL+B1G7$PL=TJCX7!4WS}|(UBoAxDXG|?-_Y-yiW)A|B7ptVo&?8cmzeHs%9b| -5+c0=@(SXHqawx=V5%XQh%igzB(SZ$GX;)zD#@qjlPc+D5g7g73qg2DH$$)~0);8lP{_`=A^0rMml<S -MN8vw}{5ABGbAtCK&SfB<|ZM$bMm)cQzAo@mBA!VYtvYqB|q2tNT~K3Q{ncxf=iu7hDcJxx!MC_2{B5 -IO$gIlubr;Ey_XEl>sn;qmx9JWFr;VsXi0A^?3>20J)q%=1h<nEcLN)I;qB=;aj$uwg3a2xV?h*41V1 -gmD-;IJeGYSL96dqzc14kcBLdy==9LW`|r~iBRM7>#0PSXQjA@wsdXTMj9MB3oA@#sC60PdwCoBlNFM -3g+aj3ih1Y2<{5H^jR#WLOSEx?X|H1;kk<C0=Va^{o%OT-i2KVkWG>(+(pXuakjf_+5wIn%Go$%j@Pg -TnV8X44?8*jP_^oKx+lNgpW$4MJDnG@}`P4|ETyM`^KJn_t|LhzXrGtb0PVLDs<o_48^&g$DUtu(Fn| -}i7|L6w2f$^^1-7vIkAMfA)fZcy<p)WZ7tBZV#;3P?4_z^;=-7yb^A?WkLe<Z%wXyEr~KLXmbGI6*Ul -Kgk~>|R<5_vFoPNVoTweV$k%_F;c0`koU5@7mqtaWDP^{@#d2LT^Vqe=jfv(LVMDeGg)Q!VP<WW{rpK -Vj|q%^HfN@kCX`Fy)G5Mhx&!^PAbTE2i-mi9^Z>qM7$rzqn#)a(cTb;Q2V72$G4wRvbXWV@0K^5`b&` -zx;q(>_SeKx{CWk@;?qi3ewtWHxF1A9@AlV%R=yTd?s^pq{Ho~mN1gwT-q8jK8#oDjL+%!d{Q+74M^k -To?hZhqK)p8L=>p`qMY{C#1#mBK*(p{82=vwU=nGf_J6iiT_52R4Hn_K-Z)-yvAe-TOGZk#F4PD>n#v -jLk_rZc8Kj|mFDH|F2gOu=h;eK=-WjS#l@!$@~43tf8{M;}3pGxXh;o!GYcEd+$-u`8gQ0?u&i^7s$F -toMct0LFe2?&g@GkU%S;Qcv#R|^t($<#h^Nd9?Som#4>uRM})(k>G*ct^X&UdQ0sB-!y`Pu*?BjSA6$ -g^$kulA%5tybj*>D(%4X-BI?2t6fP)Cp|j1`}6SPCx~_@D`)R!>*>)=3!2n~d<W>WNqh=e?$q_-P(x2 -Q1Q{rgRf~!dx)r2~@FEe=9M3=+S8f*~k2gZ}s>2$rP93rUiy^|@K2z~-821!CT8^gn&g7A!k*)d=CGP -?SO`9)=G;ZVD3-wM*{~97j1uG-fPyl!BQh80(arExj^Xzq}u3d;r3lYiooNgjc3eF_1*f}cmjMbrK)+ -oO(yOLZVPkzdPLq%47p}Q~TRNN&fsF^c&lNL~Qy`j@6I%{T@;%C-;74oAIwvG8ADu<&knNEL@A3Wf4s -FyIsedrrAa#AkL<;!hQ65_R1a^K)h{z5D(pdPbo<2BRbtz}>9Cy(m{Jy7TgkghNK((+8;Y2fR|N$K`E -X)64Xkd|0qL{~mZTliQ_H#U;ZmV;E6KOe=6#IyA_I`<H;jAM8~Nk7bshL#;YQUV8)z>&djh_zbqflJE -y;6?o7n1vK>uv4D8NKaOs)T>iY0^Z#Y(8;>yhI=}&mfz*~?nO%Dt66jV4myw9wDFdlgqP7%*-0U@Ml6 -w`ahFCt+{zjNm2Rm~&^#1+lbvu6KfKnMF4s`*>aGb!0aYJDZ(SEwG(}0b+4499Cww`CV8{l24k+LT#y -@2+X2j6txt;EKa+l0gcexWqPD>h6+vZOPM|?<-#94C{#;5r!bYitQr<{(mD#a)}=Xn$9it|11(}7PvW -iaW97MWD9*oKfgC_HD_>?Xn;2)pYdUEsEa^PAF>!GO}-_AnojXltsI^^{!8ofi_Lp6kyAZ$OI)%A~s2 -J{g}PCIrrYR38b!V&?gE^MhU>7z|;MFg%$>KB6bkvy!~XICU2I&Wan=@?X=<%6&B=nrk`$YT9Nm7Fr+ -jfls}1i4-0VLmM0ty3i9N@(;7;Vn{L3rXbKm^@MK{N8D)Zit$9LAAlaykDgSRR9-|GmCc@G65OLSaXe -IAzkF508b3j}Fqxd_Ee>sY{V9ss66r-BKQsskpL8LiQ8;#7pXGPD2g#KqpGo?_b5Wg;(SUqxxbTCcsU -VqEbiYBml|&o*GZR%j03TmK^tlwuVx!`mt4j)AwfiF~1{*8DJFlWe@EpZJlh0siL5HI#<j)F+2*ydvZ -7T)ND3RU0QWhiJY|;mT^;c=yu;B2F(4lAGim=AiO&!nRP^6>jhOCU0lP_0ig}3d`1uj$qOZ6%-g<<p0 -ZnpLI6+5Low%LJ$B~cBi0l7#gdE{>+D!I_HG^+$V^@qaAm+=WS@;tQsboWzsa@Hh+lU8G~Jj|Y9U68~ -~2>9hbKj|Zczvc^5xE_n&?G%lK9x2CX0<`WvdDUvT=L=~dDaC|@9ixt6Nz=@cQ!uG*QW}$^(^34)>j4 -R!j)1SC{e04-k-2~vA~RDtgtSs-d1gC?!5oSBjmqRNk+BoY{%5G+&ldVEYPc=(9W^{s7=fT9j3N|)!1 -xjQJh>C^)&TKwui_EOTjG=KWxnV=H;{VEg<xW@+@bzI$e&E~LU;DH&w+l=m5%XU{IidY2;PPX!OqGkY -}a|m$XjL<@2YMH*|^_Ns3H0`MF@huPPyAGLvQOBe_wH*S{UvLsl8jxf4j!Sd$-x{%Yf`lAN^hVzWsKe -`t@-I`z*4zB<el1;;(CtY_XG#%=k(Tqc})jB;VS2I<u)O?gV5lpnaSCju!5$5coT^aA$?U-=T#&D+E5 -Fg}eqSKhVN-xpMUSJuUn=2K*gb_-@huJG5|Tg}^V-!aW7Ge(oXze6^7|-JkuPJ9W8&G!@xyI3QQKRI1 -d17a6Ls@+}Vy124)NW0>(=Rry2q91$SAqj(L|20zw{1s4yueSjoCsQ$_uE_5RD5FH5FzY388G1QA#Qt -vRA_MK41L(i%yz{WKLPS-PpUkhb>gx~uY%X;Q0GqzeM=y+tyX{x&G`6R~0^^0~G__5>Y$BIrm3VgV7% -~dnaBE1+OXqQl^Ww-*pKWM<8g~s1m&agBR(u$z5ig0LfxYRp=Q{8~IV-Vs&gEWCMT1PBdG=Jd*{h@@S -#^g_e;4rYbGFXFg+8Bieaq3fXJ`*pT1;trXM>24kJKL2YkkZhK*?uwLH=>JdxtPnLt6=ar(Pvi3MyOf -3pgJU&-BrK6IiK!-9dYZ(FK^L*W4RwU>R(&x+wB@hjwFH*N9u@T$o2!pKK0^@-)6liyyvW8f0tEkTP^ -n9Oq2IUy@k^-yc^<e5i<3;Jah||x4nE%yCZwvJA(G<uRgSEGPk{R@AZlH4EYw=Z(%&KyWH&I`95jrXW -KRM#exriClodeAm4))gSX?%Zd8o#`!?|&T!h1WmyiF}jRbES9VFRf{^;FRw8!@G?zyu;00r+!`M;Kj^ -7!5dOnn`|DBd4#x0(hStDj21=4}W6F%Nw=6>T?u`;v#gTb`3;;d;{kNbc=&$g?3(d-iwVy1ur&0&F^~ -``#t)`R9h&cHED^d<(MY>lXzhi|x_=(?zIp+qUelb77Ia3-_x8^4+HTZT>yAs=fI}{9<&x&otRn>PN- -Y*6TaXuDyWwLGJ6p@9ytcZV&iZ_xCHe2mGu1`<2@Re%46zSszicdX;uN+h)i)<E;{qdg=iMO0K3_QAv -PPvWd<JT4Y)8c+a$Q{2T13J*TlJfx})IBQb{}%p8r@AB5A;#kRF1z%5qQ#Ug~VhU%qx5(CvXjn)gedq -SCnm_z40%*)!jxajZ_ItfT(W_OFFM^Ac%iw_)wGa9Uy<P~W|eiGV7M&+Iw$9OK2wp?E2wSBPas;azs^ -JcJJVZ;`+>2yTp$0On?;A|vQ`5d$fo*p;+pr%)pfjakOqaD~?O7eF0OSi?-+nwkml8R`)R=s=%8T?W( -hN}a<m-JZ>s#QA5uM?M9a{J7O3FWXh$57C}F6xymA=7`I^;wy7vgZYA+x8o!%dT2T0|Dh_EOYLkj{?D -iYl>M2Mo6UP4V7bGr)!2Z$Gmk78j25Ic10fNh`O={pOUE4cP|YPIx>^b)Nw?NBXY}Y>YT6l@Ogp?`4n -I9qCn2knr7xBeu)RhDeDxiHwZx2@})i*?GC8+CCrLcpas{!_zJNrm8QEqKe1!0pP#olJg!FL_xAB*3x -s_^t~4FPSU%E?oz=<>=u-P`1Z|rib8{%P5V`30;1Pz<75DDj5sH;l(5PzZIj7b+35@iqPEU(<&kW;?# -uKo(GUwSq9*S{|`1_ebYv$&s^9eF5M(m$erc_!AVisux2L&z9*CPq`lg*TE;^DpvD9jqk+jm8f?v6JE -2S*%j$_c*=K6rD1pXe=;k4XNX{xz5@Pu7vLAnH-TOiNcCss?&pw@vZAz817u0=}vDtLh&CO7m&Sk5&Z -ox?Vc|X44U41H+M!*$$S92UsqWKzLcmTV4i(;C+ib`<T>Cyr*s#bprK^OBFelL;YRb_#JL$`2hor8a+ -GH-2uaHdx95GpGjnisD7kIcrL>#A)3WKWUYMP_)l`V4i{6MxFtTLMbr6o3WPF!T7m=(`y>`qgi>C2p% -4s1dMcn?-)y9NDr%CtY!q_q84=PacVXyAx30;d94!SPs9tEW#=(hr@^2z0bq4Os@gb$uKCVN`t>dQ@- -(UDmE{V(0pvvK)N{4PZaqEpYR^Sjs?d$pw3iw10(^E&8wW%>Q8)x`cfR}Q)R7Wr#tcT)pOej@1BX#NF -#tt3CPqi}wRYg@1w-T&rJ!5P(5Bi`wVKk;@XLICC9DS0NUzb52IzheAp?URABY%84%)MsgQw>}aLa=H -99~|{C&#w@(m%idi>s8Wr<(jMQ*MkEsS&5+fjeO;mHs@U(H9Cu9NOZXXT5zpd_(3Gbts=92K2Ug&V%i -fj4@vom^~Y=xUKpo=e7?Gw%$3YkNZ}Eh1PYBFCk>bnAukM^{Xq5HU?Q}vYt7ZyxN;fjE|Tt9QCFH`58 -desXO-f{Y5QdL8ELRHm2Tfbz@Sbyi*=&ctSCHLb2OdZt`>61L3E}&y_Qe<;e}aEmBk}#vcuS%oS+>XD -w`#kg$SU&+!qMeOvL6^${K6)@K}hPHj2O)?gY=fxG+S0!-Bu#p8Bga?RNtFe|N3lrH(&@`6#^G8E$`X -oWPD4h9M;O8E?d>oh2g3+kXXpH(0|vbqt|BDBk`XP<!=eqk73k3ZYMV<1yTgS}=GIuOoQZdmwM>2p@M -s7vj700(}cbb_E6emM!D^+W5~j9NYEy$X?OeZKb2#OJ;9X5BDQ6v0q_;?W}a4!u|G=A<4ZjeB+APdtO -HLwu(N!D^a@vVz}GJpzrSWeabiamtlUjmkhH0D{qw9I<%KyWIXH7VgCBx2=lk-`}H-<hyNMo>v#8;D? -p!z`lk4&P#<_7ESST8qXGmeocJZwe|%d3;_vw{R)IbV_klmT#$H-O$5>Z5Ow$a}=k&$gNRwsTG|<WJB -Djf+h<0(I74wXj3Ju)FAUx=YgqAbLt=2GP+!vaG9;~c9L#E;xIoS++qLTZ3wm=2GiEFZY2TxAn%b1l< -z-}0yc_JWr5$4xOOBer>aG#$p&eMsZR_Iqh9X(z^5a$w9pr-;qGZ^_X+_%Xt#v;N<{l~Ru;nE5MFYKN -UfR#V%EB-Ou|HENcV=q|AN>^~|U|scq*Qh@v^){<+B-qSj7$Rx{VIL2L>3mbxc5oM!J0y#Ty0>&65b2 -Vv!l8)xN^4W`QXs>Wx+X;U{CL>Zy6R_zz$Nol3+)yQ92A2?)~Dw_qzo@G24wQOT|(num+JpNP)h>@6a -WAK2mnzTaZG};qR%b?007Ye0012T003}la4%nWWo~3|axZdaadl;LbaO9bWpZ?LE^v8Okg-n0Fc3t0f -5mVVcc8mmi;%8BR7g~a-txuk%Zg+j);5p^@ezC>UqX@#1zW90n(@57yx5nd`y<Pq<PH6hn<(ZIyXzh5 -=vhv;C^_tICdHW5YGssO3#FW@nlvZ#`EQJQZaATfzO)3TTvQTrL+F(Psgj4M;7Xfue}^f81J^DSjzxS -+6`mVX0w)ut9T0`^^YuMPOncDS&5y;3-qkPeM3pfQ0YfZsqx&q5?eVm<-GZu9wMB>uheww30naHbA4} -#anDx%dnB~oQ3)UzdN#4$(wG-5hlM~IKj|eP$_6598jW<`waUmX)67^0;tadO<Lq7p8kn<sDl%D&_zL -EH-)gKafebju8HHHJM71xoqI2^FHwsS1ju5S&->6ImKmI_zq7f?$B1QY-O00;n48F5T^$ze@Y0ssJ71 -^@sa0001RX>c!Jc4cm4Z*nhkWpQ<7b98erV{dJ6VRSBVd8JgrZrd;nz3VH4_L2;VF(j8EK(WKNLk~j- -WVc~36q|OKDv~P7U3}TMkCNlqY10nfbP@UZNKxjKujTyRTo$%OQ?Fzbs`-bA2yu0FB|JPdK!LKt?wtz -a_xTdy`xZ&=ZP{p$TV+ZOBysPo53)<a4QdRnL?W&vHxPaS82POYTWjP(a*jAU%PgHKDsT7Fq090|Fs1 -dUf?MTF2tpivYDtJ|Iqw!*T^$->Y_3}q)Im~HE1wB2>E%sK&DbKeCP!0QCaz9BWrvRfDR=FHnUk3D<N -Z&0b0ZhiF>iU|EuZj~ktc(1SG>j5H_W?+9dWWE8F!Aup#T@;ZK8bf-uhL4!NeGDlkT{7P+)}xo#6s2* -|oe9@xb&68?QBP`okwF5Z6Ov1I%P&jz-#YryDwfz2`L;mIjk*2+rFB0?kf^BGBfW)+u80*vr8@qPJ!b -CX92(`1Gt(r#wO5YwxEH8Z+2CizXT5SXId?q4KJJdh11BD&^+e5L~X2f*6gXu=XB-$wTs|1oeckmUHz -GT?fyP<o2$Q_r4e?BiUwMC(F#K;$GE2nPvHUDDx7F(AT)@u+I#2Wi}1!fF`Gqgc^K@wt-*I;CIo+V4P -0JP{c1aHpGF!Nioyx!DEq!)}<;FjAPN()H7LWtB$i^6l(AnXe?;{P)Cg|pJ^=n=jrwGdXpwEk32j6tX -`P>nS}pSy2H`2{JEZX%E#AzL0plWbvV5wF|^Obb&3^MYbXN$v*?ZLxvZtMKiAHLtyveGzM`JL>1Hba0 -8mQ<1QY-O00;n48F5S#L&-CD6951pM*sjH0001RX>c!Jc4cm4Z*nhkWpQ<7b98erV{dP3X=QURaCzNa -ZI9!|k^Zh<(Km|$sXYyy<i6Y~7~I)Ta^5>{Y;0!FFg6Q`L-x#Yha#13a<xK`{PxsKzmw9;#tv|Zfb~f -1?&_}UdU>k4=@;Va<&~)Vy6NuMVjS+S{vDqz78e&63nl+FN<HYJ>ifq=>cwA^&tma)zuT8XbKA7da6~ -#%486FOqP%VC>!_vJ^7yv7Exx92|5K{1I5fk9a8oS&Y~#?hS~R<TuLdpdRKF7sQpuIjM7b)Jyc=5{Z+ -aE9-Ua`HW$cgk`_Sy9dtSD(t4rnkwXLj%rtkD(LGu)wrW>T{%61d30vOqJz~)D}(Srg}ncfv~FC00;< -w}gI-Iq#B`Zjjv`|BS5w2Q@{j_ZYhkEQ;gWQjYlke@2KAH*wq{#&Jb6?Lq~-R`(?-9@Q`v5Q63mRiFs -)#DqMW!~R@00xVr?MD)(BHV(Wx$dTw#AcFnG-uoV^!Z2ZbK!tNk}n+M5T+;k`QRDRmSe7LFxWQU@ ->D=X^Xt6D0Yr0SJ|KJAf6?#iybmqv7A-?vQ#inbC>A&Zr$B~aKkofL-$Ie-$t;!M}7>`)oB99H5UHl~ -9)C6TQAUD<S6^mq8kYM3ayntt>6fTLbD_YLg0>&ZeBzyXT(s_)uk!MwMP>`a5+gVr>t<afPtngrW`WO -1HO9zbnN;98514G8sK4jXv5F%R?Qmexd4+AE2Jao|pr`@QP-swoGFGym9+L=+z0f>j;Gp@c;cIp)Ps+ -@iehKv*>hrtJ@f-E?LZ+QbIbyBRi{9Mte`Wf?Z=fggNcY?QdRZAnY8e(3Y(zr@YMaWCPqRsP&iE8xMh -&=v3|{aSGSIDmQuO8`lXs`CWn5f43R_56tWX*)TzeH9bo9p3<p=jag`H|H`Y0S*XUglf~VFT{7CE|vu -AAE}DWw0QgGThXvqf?HJLp{%=XKpm!M-}HgJUl`?a4`5)|4|azNvkSPuJj0P$u!@um7Dhn(6|LeZ>ZY -dYn*p@}T$}s|*2=~LRtoDL)L8NI*tS8t*uWe$6c6lr>LT-GrSEu^?^i;09B-~OiZ|KPk)r*pPpMF_{x -`|mP_p0*4|bKn!;E?uN1VTl1jUmY{ag_{EBg?<`$O<Ul{@Wzf_<ptYL3*MD(`pTDO}t8Kzka!8M}{CH -Fpih$P>zUqsBn<A4+Y^&RA|&?&Ne3K1E-fNFF>~(iE6+VqWPa<WtJA9j<@hcQaGYsUwe@%oMa4n#({e -WnIU!Kg#1ud@S2wPVi+e>Yz-(AVe$g8;J4XD+y|#Gp69PgLu)`zec*K(6?pvh$eLGM*%*v7Qjt`zR~e -hHZc76{Q$AImAHGdrU0B@aC~#lTtD<<TNB2qYtUB0A-MdpQ?hOp8Hwd(d6Doq*C`Y?a6HP1M-IgJ4*R -_a8=;=@_J!f)j8mKL|9@e`k!m<Pa?j9FqLr%i@)W_(bh>HxlXO4FgGUI7-STOO^e_y2gg4*Z+<gC9Y7 -IDL4kZ<^t4(*;!!L`IilR6?l*50DuS(qj=xjlg!7ufoVCbxjmqWTvsR&PEBg6%eri&U5P8`Z(fVl#s) -x!{?yL&p|o7rNMdR;z(Dn~*gGYV&eSr7{u{_wLVZ)hp5fxwKs(DMMmYy10t)Ck<w(V!eVFkDEY^B!kR -Touautb)%ux6m*q9yA(O1ih&rXbuvQp9WP{7Ix_kguD->%Hf~GQY*J}UZZ}?!vgdf?6>WXIIssPIxuZ -yZR8Adti=rE7CC}~PF5&z)d2J;g+cAwby|j$%tF@!G*<M7PNb=T!N2hsUgTP^&i@;2veTAefZaxeR&w -yt<uIt+Qdo&>V*&TZL8B!Cjs(4MQ!(v5*>n2&f}}a^4c=aYw{A3B5g7L#Y%kQ+gbj}9AQVu%FqN`k+0 -3>F00<&9$SqKL3I~CP6PDVK2uUyiW6KW6uFW*sO=JAg8P1EHzUTQt9g0L7aUiLo)z(RZ5GkrxPx|}4> -gy3QHOQ)h^g~3UPcX1E3BJZuh?up>BqShU?}!tu?kWWEYaAC%rp}2LS;IgXFWu;{F>+N*k|_qlyxz=; -K*?PXfYgw>J#NsNbN)%fFmQwbEg>94cf&&nc3{zOLH2|8x##WC41_NR%7`AlHn@71e$uuBEp3FsamAZ -=)k^Rk%N45TcX_ugA`ww522|9Kckk&LCz`YZP$b8NHwQ2}lid>B`<H84W}FrPZiY;Al;I#=GA;yd7I~ --Do5w)LP~`_t(?hl=)aaq7g+HI5<YiEx)pm8BM+;env{oVO7FeRhY+vqVaj>WD7vUso_GUWLLkQl-ul -w$<Z7QzR<Zs3ft4;L7E6)wqu0#p{hC}cC{{Z*^FsjM?D%A`Cp-Q14r~{IcwRII{zj0AS@GbZ$RCN+*q -0N`3tJ<-acE_B!OLecK;>#^MA6SZ+rwSm0VQdmS@|mc!3QK3j>v2FyzJ^T#_ux5CYJ*7r*QgfdTp$Bu -0w2jJ3A@ydi72j$<VrSJT4HzZ!{7mhDA8pFHi_GBqZ<hYNNZd&iQg29C<7;P90fT54blV&^*dYefn)- -}mq{$0FSa{rBbTA=o+B_D_guCEUIfC{k_E<$SV_YgB-_ep03!7dt7lx2Y>yzmA=Bc+sEIlD6p@t4Awy -)K0k&X;HM>H5*|uI9RK_!z%%NA0L<+;1shZvPpJG~oEFdg=Y--X?J(M6Ms<CaizWxUhKo<9`RNL*hKY -SlF(FSa{ziV0<JT<a-+qDg$P$loj7WOmH3rgo$IpNE`sUE>PLEjwM25hW4tY5E5av<VT9Rqo@v7rTaz -1k5g-{rqt(yoF*#LhQFj3@KpCqjmy^&42s74e0%mS!2Pc8US=+tYH}Q<m$<ISU5;>)VeK7lpAH?XY2; -CP+DIe2PBTdk%_Cj?xa8XduP4fhxfCktm(~Y=Bykj-up>S=8>T+V&G6a!k56UB9VE0A3Xss?NjU%R=- -e9#aVaUwI6w;0a-~BYw+tvSpMZuf)rjj|Y_Jsol~4uXkro)GwTC2`rpB7#XWrF9hBY45zv8u%dzHT5? -1t(L~6Bp5R_%dn)fa7!?@@n*+<4p%_2Pmc~57CVY@Bmot012v-D>Gma)VJIMzqNujd>gtVguOvreVJR -ne~R;M@!MsdWjL*{iR&JeZ3)OqEbj6MccW(?<#@;Ir&M0)2s8RcU#7*VLH93Xtbj^Vn<)7n!wOU&hvA -6&MGAFyIAC2BHQF%lw{a2A3J2s8${L&!X<TQSPS?kN-aIZ{>?KrYYwlYGzeEWl8PId&bJj@TJ?Q&vy2 -Y4!|f<s!4+jb*%#hUQZ{>83unm)z;6Y^D+3KWZzJqT(}nKf$-#&k4()wV^S)pShiOX~~8%p{MrKO!uT -|Ua{jGAg=xN?X)ZYSxs|wVsoD*hZz|}rW&z7zqN=w`-3*I>dIacz``g1LWFGjv}9!fBc(cy+Q+hM+O` -z?<M05$gmE=_9236wWux>nbm_dDXO+pwBG4sl-<UW(BgVG_LvlWeK#oan$Tfj{QztNq9ttX4gKc)%|M -L~VmjMiJLEHv^49U22Fqh4;qrsCXXF4Zhpi0N*3xS565&<{<BmodwGwc(&Df3*TiCK@as9~HsdbTZ6J -EH+_jK$z#o;mn6rGOOXg(7ei?C{@#{z}o~=tHArScEqPw%fjMXEpif)S|SYleC`EukcLs@76n(0@ryJ -0ad)1L15Z10pu5-h>>?;r23qc?WTOhl%5<tz`v1DGkiat3D7~gb&UHqJQ(l64Syeds=#BCs|v$nR1yl -f|I^qgI*`;eJMYRQlb!dOaCA}Q*_)qFwlVjLKuX{!Ssl2(Hu9O)^J%=T3nruKF^r9^4nNBoU*-6E7lb -%G4~>FcqC9?7cs7O=M^r#}K9(E`oy=%Q$c?8li_g55MMRj(hL(UyYiFv5vlGR)05%)YXbeNA)*Hp{u= -mnz`=nA76^L#g6olzytyBPrTo=|4L07vlk0oNbnnJwlSd*(#OMg4UmbPfL{Dd`tW-xUT6B{tui_aK;T -0P=9<%eY`T|Fb+>4AJAWH;z%5;4|CTRdw$`tt^=$$?01@!CcTD{DuOWPU={dREqRg0q=!m=Q;Us%86> -8p>7<GB`5fD|)5T5k3pq&fX#1W?nwq?R@EBiG{=YJwIQmSVqMno62)L|A5pV^ZwbYQA0Oz=sYuYHY<_ -op;Uv${pPdG$Qc#BHP0^QIzaUE&FQI#@0U2aLP-cXmCUn0{_!G%Rb-Q(`Gltm%NZxQ_W~RDHQ0?27NL -;@>QTG7`-z1uR{t>RD?1t&)a~(r##&Rjk#YHlM%f*T)FqKt9NlQxG=xklIsN`v;D3w|mgnk5Pe{}ViN -zDx4EmqBirHB-;!X%gZRP6h*Hz^KQe%>2xaPzr@S(3l-(8uA!?j7;m=&)Lns1vy@fCvVp{G+AI?1(!{ -vf58aijK96<tb&px|BFfW9sc9^O$+7c#wDLWh^&Gt9BG399&&9HE0w={R#tDRPV2mNO&_WI0KM&L_{4 -Alx!TfNgI*4@f>gpHEJ8ujfv6O}}RYwCQL=;TaHZek^`$9duG{phmi2XAAmyhD=;vDrX7!mF(bBW#Ur -Ioerc1l?3$9HLtIFyu7d_ptRwD=8mc05qz&WPX&40jU6G#HJ`wBGA!DUc%2Jf#eqY3=g#*2iIf_*Px} -KIua-73yz9pR^xFY*Q1?VGoR&oK!%0y&R17a^ckJ@PQzhxx-(iD8&uKQqR@9JxTH8dCTULWievKLR+3 -g7O(tW8lUrn$V7EVrwAGY|pn-ba0>FHc5u@ZqNNKT8wPq2d#SOUfln3;eHgSB?UNE+jA<~Nk*w>`f`) -7h&TE;L0)QFe~mEX_9lqg);OCjdf&G=MvSUH0gl54WFnavq_5qztm-Jc$Y>n+?OE@WwqOYkqg3^Q6R^ -Z~N*oyaDKF7W;mmXYR6O3;kvQD)vm0u#ndk_xPDvj##z0mgWgJJz2Z0BSxbWa7azzD10%(zM)l+tim@ -*NXn<`hLk+*kDUEAGdFW0p71hU^#P`vUf@|Kor(a-Pd0?RnEP`ZT!77{%vD#jRFDs1{K<K-Aw#~@cC< -+oUAfDUW|-x?5I@KaJV7nX79$Yfr|;Y?6BNLNsdPTNwdHkoo+be04!l+s<R5mDg%uAnbuD~K@WEc6HI -4S(9zBbLM06L=c7Hn02n0{%OOpI^j;7s3D|3U}tb}hGba*Y&-6o^(k1x|%MDmrpCABhz_=Zljwm6jmK -{Vf%Jt)6wXI`&x71t~yVtlm<?-z9FYSq!bN|z7jwiaHe!pm`*Fcqw*6c?0A@uDx1>yJumyufu$$)T@A -0&Toaas3NlSR&s_^6|ZJ-PbHF_YiMOFdR&Z<JVah^g^$keGxp-vKp1Vrs}hQDnIQTSYt}C(N(GHYb@L -Or&Yhh>TS~3JjHj&k`|ylT>m-yW*GMPE?KrFWBN<b;ja4CFMshLW=+PO+?F-nO1Y*&kI@iuMZZ{@OKX -m%tJhVjQ0KE)=a%9gucUSEwXa8cJoKt|b#c8GmpV&=-pz5(7a(&addX*KW<nd(csbS!h4(DD<z0rGwQ -<^;VRaXeIP$PPdmoSC-8?tS+(?-phwn)=WxJ{Sfkvi-q9RU_CF=#XIlErG@bccVA7n|sn32DHY4?d;z -~oNLF1-Ch_bc(mn}Oclz!vx7YWOBWi0#pG5j#G9@sSL^a2MW;K8GN<u`76&?aEJA<-N?_pDB%d3NU?+ -re5HGK#l&Do=j*hCspzPLyMg&h9{b3X`ucAegrpj%a<hYCE=;*RLo-=uw<4Su>{NAKo+=f84zWcB|y; -n>hkvL@<(y`&HD27`tlFrzhB>EsUN_IVcsn#uJ3p8=?RGga;-gyWU_`;JhvB26d+>roVXWD)%*skv%Z -G(a?*D>bz+IfGtSbEv}Q4NiRN$Op?O?^FZIRF))HhBIqR>dj?oUr*E#SsFnfQ}O{NY#k^?`B#K1wsEI -WxMHVoO}<~P_qghvybtQEUU<r|F4d>&~46@Fj&4yIUv*8vZhUQrnF*8awwGJ5pFMOF07UvSRj&$;5)h -k_Z`;y3=<#24mv4mb=zLg-A$d3cC9B|>i^1to+p{c|LP?^}j1It_h9!*LhUcy-6eyDJ782((RYdr}mz -ha>(N#AJ-}fWA$~IHCzQV2V|J(>!dBNo@F9c91(qDz15hnOb-@dFs85_(0yhm=Nq#T552@Lp>u<XmgT -y0W-&@Zq^8p&VbBdety$*ITyA(P~Ay&FWoyxuGJC>Q0kX;9cV=${P+x=2-c_Gg9~&pI7HyM_q6tz$7} --jp17K&WMA){=o3lYA5Ba+K6O07QOw7<Jo~X9>3?HE_ZW!n#QHL?f|D8bii~|Zug!B_C(;Q=#Jit>6Y -qn_EQ9ztw~q6CPmqFFMS}pXrlfe_OUN0U+i{q~1m30qxslO1+nKq5GOzvN@KZ|uH&9Ch1QY-O00;n48 -F5Vc&gsx91ONal3;+Nk0001RX>c!Jc4cm4Z*nhkWpQ<7b98erWq4y{aCB*JZgVbhd6ia8bK5o$z4KS> -I0s7}nU`ETp6MZRoQY@RHe;*pQG$r2h?oRe0JN+g^4qfu5)>)PQlpC`a`E2V4?N%<Twh&7W~9>V8)$r -f{Tn|?l8cLr#NxjVI`2|^&9L^$XqWsr{3OY|P!1|1n-U32d!e)gUm!U2U~+iufG%N&lm?32nhI)Fr;8 -WV(%7`IWvN#02b7?y+E@=?=JRiN)*1`K!AIe+e~=_eRto1L&s|(Qx&Jc+Om7mP4-w7_v<MqQ5E?|aQt -QSvZYPUW3zD2=jkPFYQz%NQ5L%X0AlRD52BfYsX@pI}4~aP}7D_9>SWFz2`3$avT|4@^dfxD_PDr=vo -+6bf)qi-P95%`qu<Ur2q*n4jS5rZ731;;jGinS|N5J?NeutJUtxY|-jE^s8@Q2Yj?c-TsI#?8c?gs<~ -2cY5U0jA1f(nHcrXyZdf(9eHHnDnq;89#+^!h74J%%CTm4yt!V-zcB>e3wj9qn+%Rc@|bp)4pr_{pv@ -nAGQOG-Ee)-Aq+4~X&j=^qzH3sw5HC{va?`=*i(q#ta;tGV0++0teT@v!8|>EJqMyW=oH3WRcIQ2A}Q -K_aqobqXbBXbw!7z6_^jYv=GjeJnvE(;$oK`Uj4wjm4Q<w&<&Pugly=%X9m{^ePAqvuA^Z41>IS=d+_ -jkBUWsNg@iTdLZsP4WWNFwc8Ha!Ru%I%YJ=4CR?TQkev-KtFqHHok8<a?ppE;2uqgW*HL-~UoCr72Wl -ps~yq_kUw-hvcffYL#oC`;o#af`|{I@mgAHX4Ax9>20+MT2p2vR}ybBuBGH*lq<UP>E+^>g{zjT*f?* -rbm<%Ox|~D$_yisej9^FNDs<6>cCT0U?q-N!r!87@bKISdR<rq6HM1B6yDcBE#PlA<y@*3dPH}xL%P3 -2_k_r&iD*jFUT+~MmbPfE0C$Xm^!;KsG*2%|@;OHbqB9j1W<&iBXvY}7&>$Uk(YHv7uz;mE`2X2%i$* -`AywmNy<eXCuCm0EVXDMqT06Pp=HDRv#(21OF(7ru;3i^bnm}leL$4<y+LHj$*v19<;9m!dXJ2G5vQB -*|e8uEv?nC9F1SY123Fc-lKdZuu-DG6F`IVymUy?`v@Tt#mi=jmR?cB0ThY1S%(JY+Z8?%Lu;X(?7Ee -l+qdY;R`V74i_|PKkKBZ3@%_b8Ml>3|533Sl_`v!fJZ$_Ah*{dok(0ca+>Is!4bnsufrCSErhAdc4n+ -;sbRq;_czj;1kwlD1!4k;Q9bL`#X2Q)Tk*pwoZKYd^M(v43A)60*RD<r9u?_T`4W>7E07>UmVvKmy!h -XXDZ?L4V9xKyS+RUi|m(yH0bmt$qEN6n>)VNWRny{o5=Bn!wS8|v5ucmO9KQH0000808trnOoSa^;&K -E408<VC02}}S0B~t=FJE?LZe(wAFLGsZb!BsOb1!IRY;Z1cd9_zrZ{s!)e%G&<dJ)J5Ts@>{3k2{>7w -IBF*EW*fz7&N(OSH{IB2|(~A}svhJG^Ad7gDq}k~kt~zPS&LMx)Q7Y%2<d;F>Vb_y$((1|)5S)Uc&hL -*-aave9Uitfi<S&)2PPCCzhSwIymK;~GzSp_$-G;*XycJ_M4A=(Uh_cvhY2|5a7ukQ>%y`3vQxkO7*N -oSeOEWmU1&4`=U-Es-VF9z6@kIg&|*nxX|np{0MdRB07XlSIqzCIS37zJ?UfWJ6Wv<z>cIlC664JJC> -X%%E=tZ8Y53^IIu}bT~Z)%wR4!wTBBldVKsXJ}P9_Xt9x`*>>TaR*E_lFV6GDM=@WLBqd!#j#m|}DF) -R9Wjt{h7{v#Q(c?g%WQB%TrnjKC6qcRd3JyayAiM<cmn^XeODSGhNns^CBPTVrbmqa+f>@sib*8pb;z -8AcY`Mw041UGP(Kljfr+{1^J@<9?bM_-Jqia=RxQzN1<6CNEr#Fy#(sT-`*T9@w#&qWu|FUHYLXyI(k -k1NM82DI}F=N>+yBlB}8X`3-+KR}jk={tLBCD#iV5Ojnr`o~*CN|tV0Q~Px3hv<0BwHy6_JV@g#`#oj -MO&398&Q1VwQxwH)z)u?K<{95)Rr_fII|Gwb|VY1741t(Wg)U5CE@_idb+H!N*yJJ^A1}danAOBb;)x -KA8O`=7=MHKhK*LI1sG?)2R*$~nf*!O3dYzyP)yVHh0OR`WHosba@u3P^K%A^@&6F3kYcj8aeanP(ux -v=e_m(>-=WQG#z_@<=dy>=>`5>_{^LmL(=5|>Xfc5L^KvBb|9z$ae1MO_uxSdPuqmsH68DAn|40pe_p -;l+@@FnydFsl@b*Fu28uAU=(`m?^@82dCQPciJIh90HdoF9|1k(#hG_AAH1Ns4GKEZGsUex&8AgU>5f -u=R;(>utWj3>kNPkmy<l>R6t-8tv^LAZ#9;6Kr&_v%?4PEhQU6Ads(I&OQ0)=%_aohUqE*hkxfv(0Z6 -r+EC;kY~6799tgon}NT#Ck-soNb~0ILeKWgK;+@`f)0dv)>zpCZ=aBV^=2AyU^Tys<?S55^WSeD9`6? -OeE#+GFSiee2@!877hSNS7$7ajF$0!Oq@)@0>15ysToT^}Y6vfZ*{=_9+N6Hw(>I1&11<>BhI5_$WEN -Sd?K15qvdiY&t$jfSd_s|@C7?1U111OD7ftgKiDbF?(myHSLR(zh($L)4*wC-`(4j=5I=2c$c{wbl<5 -qS+zSjmx56p_lT7_F+-si88->=P)6%j|%`9zFqk6>LL?<@L{z!&Yle2)mCR5VnFsT_L-6U_J{BxH0IU -Ni9eY)KxzibPe^r>LC{HNL4u(_x8W)ZO>?J<MjMnF;Zvz}KAn$HlxK5SDUmUeL0#ts6CV;|6yE93%NN -?bPgxY;g@|yu`51t|z!ACYV`yZU!5^IGF*Q=SB}KBBzK`D)}2wO9KQH0000808trnOnKU)%6b6+0RI9 -20384T0B~t=FJE?LZe(wAFLGsZb!BsOb1!IbZ)<ZdaCvP}!D@p*5WVkL49P(aiRU8ZP{^TBsL<vXg4y -V(OU$m_T~l)Dw|92cn6w?x)i=I3Z=Q2lEmn}LLdYtC&X%huhcGsq&6vi|4vjT&t<=e|?}uV+TMGkcRd -fwPtJOsmXu#G8IdAz<G{Oo3N~JycK8S%A19LSN&oN`q7cLrpBn{t47&{y^npR1JheN`EYD@ePg9;^TZ -n1z;t26LXIrg4k()9HM*02jkLa=9y6<7jYylZUc=Y&x&t<iQ`LLqV+hIm0~m$2JM-nM@QA;F7AjLl)2 -Zqj7(BKn1uY_4>}agZ=Aw|VU+g(ti&``!8@E4bxLSS(IoTvulBLEbk5jY8x8OYcf3$+c4_uoC15T7fy -uq&XxMyQQ5#AM1KJ$-Q4G`rC^uw9ZuD66KgX4CN4RxV1VQTnAZ}^QOtNAeuhA*WLMt{jKN1^9xXRztm -l2w-^Rb;eWY2P{`CBi(;3`!W%{Ys63h)#V5}F&z`^^P)h>@6aWAK2mnzTaZF`>M|2J*000Ap0015U00 -3}la4%nWWo~3|axZdaadl;LbaO9lZ)9a`b1ras?LGZ-+qjj#`>(*+lN062j1%u}Q|&5knvbsA-6Rt`w -=>OUBwB=Qt|?L_DLd}Y-rs)j3m^cJ{<!PR^=9gs-AE+x0KE6`z5(s2gZ%@wEYqwwpQ>%MI(UXpc6N4m -cXulNx2>+5I$oEl&g-53^8a>rPA{@r!OLx~0Y=dzSy8LzLaR-ct&{3Tm1jTeWrNR>Ms3P#U8xTSC=Ic -btv6-WK<_+<mRVWU=24n7y2;kse6Mfnot-^(%-?julU7A}JyA`mlB+UH6|~K>W!5O^lmn0|=5F4L>#V -uR3Yb`>lN1(_+^A);t+o20EHAg4*Hu+k>iR+#s&0}ZO{!Go*;$2)f;B_WME&*n{RAM_+vSBy=-KP_nN -Cxks`od|MOnn^L~C`?G@E+*`0+W6xIK%P<@&KfZ2KXrYxwZ^=<DA;i_L<~66-iii)3eKRh4VC$u{x)N -*8Ha#oH=}IUU8TOy{r$=_Uw%gAZ@(lj}`cTYS)9dcNM~O}0s@X1*$`HIN_~2C;3j+;oR7wVuP9;pY0w -Qg4XDrc<<|;O~{jkqO}wn0%6+0@2HDBTwE}Wm5us$k!jrWr9H7<AC&RESSkk1NUQ5Z#Vc!r|&kpqW0V --z5wdl@l(A@V7+sCC=KeS+Af=IrERO1Nv)5IS{HTJWLNrCwrpg?IN3HArrGzWr|<um)Y<X{Je2oK0Gz -du`0LL}HOJTU6d+C1xo+nCVtxUO*RV$TzPT|Ep}9aCLLiPT*!dCo2sq|sd7;<IL>(7bNuH%2Km0IJFE -6&mrA}W9Q*j6C{}OhtE*hePeS=R6-jVX)q=BunhR5}G4R9FsJhOQQ5UL`{=g1RwdQCYm62#dYunLeTY -FlK)W?4N?>SdNmf3FuW>Ku5uo+FnQ$yzg-5Z#PA;Hini%~LkWbr~<DrWwvtVyHQga08Qt_dF;{iTS0z -nFCJdc~%4NnQIyC@Tj<~8BhkRnb#mMbUl%o{9Km>tZp@d{l3B0x|k?H^YYU4Csb$6&Dauuy-6B>RZLU -Z4uFa(-xf3h`dou}YUmU1#0jouqRws_Z6;OEH#bjlP!L8M+MaDQ*sR5z8v>Uymix!Y`J<G=r@8)uUoF -Qc&9<K7pbn?P7m&77bqdnF){QDx#Ak|Ia|0IZSpkd;Vpb(Ez_uyZK=Ngh=Qr4WQ<Z?kIynOkQRy_RfT -iM{53gSxe|Y`!bbfOB;`CU}EOr1WD4Q#tPL%(*r;ZMvIE_~2w&-p2)M-?LDysS#9XX8}jY|f(J~#85a -HHQkjez3oq<~ElHhQ)L;^)=tH!nW^a5}fk`r-J;<5O7H(c#X^cW+N$zdfD5{Ql$HzsygL|N0u9KRHzU -@V}>D?Hr%J{@}m+`pMIsot<T#)U^@iX3zeZeaVW5b?SIZ)B6J;7$(=;&^Hihz|*ivfQ_PB=PPN2f1qv -u2n>_5euhR0!~!Z#P<k<`V$%{j!#qBHZl7%6yWvrSi$Z<uyhm^|wTbbAeVVO6IXCpOorcqV^mybA8Yi -0#sEi0-JHP=2pmY&BeR9Fm10S{nXY~8gc<3GVbOxz3$oxW$M)A)j;J97hACTd*<ywP6Pc4$?qAp?oCh -IyvJ?W#GNQQWZ_Zp;$m<*dtFE#EZ>=C!a|CHr98WOlyR$JIRqK{nwWQ=TpEx^8jjhrad9}29LM4>bTs -21GQgJui6ypGj75ET_#EU-YZ&Y)|?gX1&X(RKit(x{|5%NpDfE~=f0B$Y-X2+ZKlBzBj-<95wJC7}_u -)P$&sidxY&9{c1II*{REo`Jkvsf(menx+y6BedE^|HHoXIm!2Vw|@=R0JFaP94sMqIZ;<c!$60Gr0-w -$RqY9ABpU7vGcSBSI4ko9!^6z3>d&3GIKL~L+g07)6()0q^u{sYmWA$b)uO;`lEG&97hT58qtS@mhS4 -}!^d+gVF^~YP>dVQkz|_?pz^+_iSL1OX;jQkBco`FwmbL!d?6lhIvBMFy9_E{S?0K|F>WKb7QQe*23f -Z$Vy&>Wx%9_=W(X2k84Jfw%eWU;l_7DN^!0rDJ-27-S2sreq&U7nVqSl(jPoT%f6LmEFc0xWSDBYWlL -qAyWSNH1!pSLyGBVwS{V_!r$>x*z_5RyZYkYvDb|B>Wd_BEp2H$;jx0LHa}_Pxr$;fr_2zR2mwJZJmg -HN-2V4~>A+f>9F1J#iG<x6s#far``qWuNs)D#YF|zmA>8xSDQTelCsM*6@J9gD^~TlsG(?zo1~_Ci(5 -M58vM^{BS6gd`aFF%PjViyjK9<L+0(NS7k8*dpE(I2h)N16|9+Py7d$Xcz<&QE`h=}=Ou2$ssv&TiCP -@dmt3srhNbQmtPcmja&YbbwWPjNGDp-dW*2Bkm<kPfS}aoe(XfnuuzdEI26e&Jm>C8b%g4l?5^tTF>M -s(fF<aZGIjUzQr~mY#?`da(5lM{+NxjhSkPa{;P(jUR>S;f@R^aum&>X(%yrzBM0yw%2z=T)Q2PD)^- -HsDpu;01A<Ens$zAKH>LxZN<mX~!44sm$LcH@7Ns!DG9(77UkGXuEynW$|XqiGifJE2;^J2$Wu;ZkOo -tbk`Lma%4uGsKk${n_dwFcwzvI=OTrU6E*vIqHnrs_~n5_g=MfCWkuS>KuXq6CI4DMJ=?h@6iPn`hnk -LoT|qOMC+u|=fKt=Lot{|KH5a-D}V%;fG56<@}8VVurEw6P%+pl4o!E0z!I%c<oHpn><$e!asqGyqTc -9b1}g`#gOOJQ7>K2IAJw}f^+-kZ%oQCz_u<GBH&7hE1c{81g@F0md43|0pAF>*5&f<K10U2wU6A@qLm -)|LT_Ae!bvWgL`N|rRZos1tq1-F&kZe=wtE}AC4j}>IL`d7`12I>v&<Muap<zlh)nBj!(Bn;lGMg3Gf -D_k*UUnBBmBzSDfMSQcar_qb6v=d0rq>{+iG_P0>g)wU5KQ<5#xkmdB}fqDyeV~@E~JP0PCh(eNM1rr -?~iCuHzlHTgXV2wd%ou<sf7?cc)kF3zQ~prXlc~Q(Ez5Qh*@=oc?W_&CG%OaJ2B-j8h<h27q=OBF;f$ -o0g$QpQiR%+jBem5%CW4><K8Z;af1%O7*RPjhBKh!S1|_xiWOZ7RA!m@5K)p%TMq|wFHMsG5@hklu~E -k>aSvo*K$0<-CyE>)o5i_C*QWuwtTuVF^f7|5$|(mhakJeyu!?}0tp#hm9TZ|#3XQ!1IEoYE2x;IrJ~ -$eQ5i=UR_n=^Oda5w`4^pK_bJ(J2`XEbA$ZZ?5W8`&`41qs(rC!qGKPMGV#AFeI^^#X7E~LvMB%p(}p -nZFmEHC*jAzzu8J#b)huI*lc&(o>d`p=&~Hz8q@s&d}IBhYp>OK5iJ=ufXtM<7fw@il$?82>rTiny%K -AD`>S#^eM-EZZ(J&%;foJ^{SX&&?)pMJEXBB5USzmYJRe;q5g;n~-Aa^2yi){Eb*dK9d<iAA?9Ga)z` -)0?S7si2;j9mCwkg^l?0G<tMlqoN7{fy=iWUI5iQ0TzDR(mAzsMefsQr>j;z0YcIfMJUDL5-@MlJ$Tl -~UVg{Zab}-+)F7j~4$Aax6U%f8;tR05ZY<3V%x_LuT%FVWK^$B$H(sGgGta_dV`Ki<-2A#czhJ8BQSF -WV1&}zhQGuPds#v+tw%8C5gmmC$x45vS7i_j2j^xBZervkkaDtpwV7bNLs#7X`OONRj4^pbLsGh$Nzg -%KY!!?o@Xf~{7`4sy_EqT%1!E%>PZ{G5z52T_g{WA<=2=YaV_N~zWl(yJ`#tE8ycn9{`D6-eGnjG3&7 --3SgkE&&9GZ8lcI^oa;(J^t25sbL83zcEt8rN7^TB}>Zy{#%kYmIeHGBt9$`^a>+~75w)kpDZu<?~K5 -5IU-mU39)t~wr|HFUu>*V7Gk|GVKwQxFRjUj;X)2|uD1<k2_L{CY_{-3rTheK2~^JdO9FzG+*Hm|l7V -rihpn_f=>kgyz!apksLn8X=<w{I6^Z(KofKP4dHx@1QSN_lP3m;5-Jwr3ZMDdSUB@*!y%y#NNvo?*PY -)08RLhPq*b~ziP=01C)sPaVtuKzf(2fD)n8=>-*OUPm7Th5W-##LUvXz7Gt$_DIP^5cd4YdUt^0XdyK -WI+;Rsgpw*p%d_fw$&>OIGOA2?^)6a-=5PO$W+o-U{__VFnMzM7|Tv)bK6@-N%6R(RPP2-<wkZb69h# -!8XT@3tn?YA2ub{+JMk6(SyK%5Qzqqr3ZO-$@YIR;2fXLZBJQHuZH?(v=t2$iq6nfxsndVRaUj!O~Dg -<ex6-XHpuuVe&~jEgzyqCFfvNJw+$8yP*Dx9VxX1aBr*w={#LT!Nd6sYh2)CbxLwWY7-)>>j7X~~zw% -%Y$V{6J>kFO6HbVo#o8&!syU0TL4pGWQWU9tODaSBttNGrMBL^L?%jy!70*UA;871w>-=R!^4g2HAlT -&qG20I!@j>$cg@yiO!XtsH(k~Eb7+yL5X@6i9p4=~<3(*F)44y(>WV0W2TRz^D@o!2aTjTm-bv{Ka-v -N278atog9b@DjuK6t`v<BG$ub}sVdr8{+zdsYUzvlHRfN-}q_P|);<pB{_JU^&>89Pbla42uEY?oQ~) -Gk|aPUJNqj{a{Ya2NKrqxjYkZHyd3=<J(JQuwoAjS0!(r0vnUZRyWQ%#Vq0iSM#tFZp2P7Cv0W%Q1}R -hK~sPA4JY`+oL3lZq|V2$-oEGyI8p@rBi9Mi`;dS*T$hHX%!;Ivm7VvZB1Vr~5`sQ_v80K5HPaW#m6q -(U!tJineoZ)>?DqXhk3dUoS;&FZI?J;n&2KodDFu*^0S*YULdvY2-bu~zB(hMlVwrDKHelLJs44S9AN -*`I@)SAjf(;cstE2dfH?4csK5sy-K7RW2=$Xs1P86MR+m}PNF1bs4kMx~flXPK(P?;AGhNYD(S}+kC> -X;7{+*Ub=BMMetWH6acvIMe{v*60Mc2YTFZWDQsINh9rawu*%!btqV+Gs_&@#26BEm<`wvUe8iB+Hv} -F>ydGP<bwtZkAR}B^8!MDyLAGrni9E%&FAW#H$@J9ILF=hc_?P(eIvp1JukN+X}EVnvO8wf(t_@9Hj> ->56k(ZaZFZQjfP1?&Ps3Yq#HeHH<yc_6DJicR03?l>I+I1)ieVv5OmnTo1Gxku@N>=EGZD`gnCZ6Y!J -+jDmh=HJ2-30*O~N|e^_*MYtC`UgjGZ&L)wb#XkW)kbzb}VEQ&(Y^!(nMpw3jZD-eh|emVTN>engAYV -MQR%9~id*VRR`snt!n1%aQyD#TIz<?z?v?~Z$c)4wqW-jgQk2zc6NvV+3(E3M5dE|0X--Uo|AY~O(xZ -;6j8S|3Sxv$|cdQNk^FT&Q#M&|#9-T3sjN#)Er;LcKi?!U?Xrq1>V*yhMbVBPtG9+-@&UULGG)S#`1` -Q<}{<keuapO(`Xgy}Px|SdUJimt}?Jz%&U5?wJP3ot4`vR&N0JQcdDUDR7&qaA;avq1lm4^14KCIa}R -0kTVn?x<)ZVJC9w01Z8)+#A7Pa{usoi1~O}2gTczS5KV0H6Nl6b>+?f(-MiiJPc$@}LbqsspD%fPxq7 -z?xx+pqWSa{tJu5&gF(>88na<-;nB0XCUGcOX?RRQE9|YYY!%I-=><|F?O^lP!T<C^`aV}EBc7hl1Ok -%VcH5!dP{L^cHdeY@LGd23dC<Fvg$t-bTpp+Yg0Al<%q~5TVx0pX-+LOgBRrn!u*)3Xkxa58n-Bz#OR -vu<VH5LzbY0qzwujoTqgLDgAUiJ`NO9}q)0Jy9``k|UCc=+c55JegFgEY18^zQ?J8r3!g*HL}uV+Z<x -H71eg+lshto}!~;Omv~$r^Rw^o3r%rOY6gU1Qw;(J{`{LIS}BYarCJE_eV9kz=HM`Rv?;stCS3!wpVy -+!a0)^wI_U{PlnG8UoszY7$`7DK97SSNNYQF91s(bVJF0dW$xvG7?-;nH)?(Jo}+J(M+#Gq;9-g?VmR -c9Wic|2B<Z?H1@oGOu(evzpD?0V;9Oy)NVnp$_xzPar^ek~Pldt+%BJhOBFDkNrw;!ji1BBvlS3$7dQ -eb{iO~sd-4*F`XhWe1IwImx2eb|@*d%%}3Of<2sKFC@Si6Lu92X30FhFEaRJEnUuI2Xp0v><`n47a%a -S%;wvSNfJ0L!uk)E6WUs@~dot1t(u3QBUK%}z<p!Pvu|l2f9zfigr%!m`DQ_sXeS^>kDdxH#ReH+29< -3QWYIW$NWO6RK^O{zrsr96>A(Q(o<X3RX8t&^Bd_{uoCed94LM&gnXyUE~Kf9n3f)l`H>-s)PkJp<q} ->*K<Doh~`C}N1y!o$<P59KY|@hOAhO_#oJsuJ5f?c>z20t2<XA`?slo4$F~G@a$TI0vb2XO`5;Z`c}1 -syeK~*n0#=X#8O`^;Q@-PYVLH5N@ipxuV|x_D=>k?QA(5#yYIL5DScH#nFEq#a0k{dArdn>nUnsb|xy -^Hkxn6OAp)2SlvP|(AvgyGsK^LLYVBKTzn849_cFo0uJs>2RVh&-34SMZ*{OeDz5I-UkqOPPh)H{ABw -0d{K=Y@x=@M(2vwpwXKPL?z#vLe|O<Hqo+VHY|f3?CApA^}{aYQb|`@D%`jcm|e8&X7f%sU>^Bx;Z=- -7ATwAn<4)N<SO1kpi#lg;pu3^C#qqtFh(Y^4K5f#dwjiZD5s3r%(pd&EYAgzQJKYiOlMb*jpT^;!4K4 -Wgc{5_JsdHR`&d9e*i$Uf0Gb_`gg-$ZE%~T<D<QkE_SBD9Vt7C`hQz#FXjsShL~GP7mmY^EWcQ@jJys -|sSN)vo<_!AIfcAE}<2Vp{g7-Mx=>GL--oAFjrwMwXcpC1@!S(g^0o7>QV|D4s=e{86$H17Ch&lnY?x -`1PY6d-^K@l^Jx=tvXVNQNfj!lkLh0Neh8MjL`asiI~QuU5G?9IHhIZ)RS1N$}jUMEKxcdfqw2W$rtC -i<*C<!?%3>LO>PXn&cMucTyfwFoOXx<(TkR6jj>mMIh9bx4Yk{U|`FU>r6Q-Ug60v3iFEGS?a2UvRBK ->T-cV4+s#q9YHZwA|$$c=zk@-DDLBCvV<XQInDR4U%VQP37cN#5wv?04mLJ5i=pf~0Tcw(gGC;a=fmS -l`evCFoWe=EYG#jY(v%Vc!tg+L9jhpd;r}>sm@`TTob$N5^=`w_=y25KPs*Y*SK3_qY&5!`PeMVfKA( -g<46b_yboK0F@Up)&7~sUsPFh{cr$M$?b>oGX5&_f2I_5B>#<6o3h;t`_+eMn&o(R9ViOl!0lS>Zga9 -hlZaYsflGZJnq2H1aaY>x}ill))_n;Um{wrr8wX)e?DE|iJ(X@HJIC0j6&QUyHM1URlSpj@2mK$lh$d -E^v-2<hVn?^`0qV*6-?wmngb!1sb=JxCYX%;)izKtz>&(isHp;PnPf_+a<kTdi0b+^s#eWhczwCgFcC --sZ;Pr3_@0ntUl+)mw@EbEzP@kP9gRTP%zKHym!^@Ia<SVOw)5LN0=d)vGOKZ0!^9Zoz-e&Wj1>GW<9 -Nxd3u5xYFmgXpvQElB4NxV`VjFhB*B1ETwhelY-L_0E?^4;OkP`Qx+gg>9PuUF%K@!jMa<c2K3KajV} -s5YukG5u=2$sAR*wAmPwKmWDAH6K)ll69^l0*+X4(arr|ClztxB)?u2I}=pq?$tuV_uc>LSh+om+uA& -@Qc>&t7-yVcd^eb@Nv@8R7C)fP=TVHW3dD3N~NGrz=TqIiEh>+>PpUI5}K73?JTkkh{>2ubBh5`v^6r -MosAm+gDy4{}HVSrX6H+glE(=10mG%>gaPB9fCZ4jd^_QKxjEi;fv`T#S-#SAYQaDQmnc?grC)nCjtk -85rJhK)FX3=rGzrtHDi)5dRAs#yx_M=a_k9S?m2yCJ6fENZr^u`o<-<{;5x?o^I=tr7qW2=(ZKoa!Ac -y(Z>f4xEgeXTSdBJ(osaBceKcA{P`T+lzKkL6DM{}BO|8Kz;dpWqVi?tC;SL{m!4!;0DCiPV^1TKydA -OcgV8nkBn*uob)Ia1A^1H_jGfERcb6TT%|R1{Y4fSV-naNKU2ZnetN=Tv6HMBhs$(f+eTlKeawYi0L@ -S~4gfIeDP<$S%uMWRLZh3lm7}T#ic<UPjL-7Y$8;e)3y!u>A{qMsfX6XBd&ebPtirOs}c8eR=$)f+Wk --Sp%<O+U(!=ZBuBP|xz>a@N;bheztV+@v3_a_#-Ion!asj~O0pIS7-U=dxil3t+%Pq`X->>=P|P19a1 -s^pqxDKTcU(H9Gj1X39pygic(&kFA_qazkh&Cxr6K}j^s$CFG&51OxhL9t@$qjRdmZtuPH#Xxf1NA5Q -n7FMH;Y|_Xsm4_?bT^O%zNkpl*K#FSxC=`~^Ei+VB7B|4x0Z3a;(F6B|y*K6_vWMe%Zg(<jSO$o3VQ| -Byf{9RC`bykW7pV(oyP*pDnCkFpLU;z3&zxH)qs&u26F}eASfl`;k!BsbGKb2%{Oix~8azM|+8`{Q?% -L$LZ-E)!U@g`zZuZ@Gf7uPm&Tx9M>mB}lX%2td@_jzSg1&YD^LE3+yU9f^_Dj|<N4^0lTVrW0Nm<wd& -9%mxPXXnoctr5!LP#Wlnp9PWm$V2m+igkL10m#8=S|{oN!mo_@;Y-cmrHBFXsx%#V4#WN!QdjCR>)K2 -Oi~u5oeA5f99J!}`hpG@Bvow-g+yAaV{c^{ja_k2ep@7Dcp_qM6sw39E3#IjU)XZ)6`I)I$Qlqcm-^- -!lLAR~zNP$oumOb@GkXtiY%v)fc1ihQyPS#!$t>^<s3~6!RrQM+gVOML#e9x|?cr*4eCoCS(w^K^`&1 -_vsO)84);jX)-NEujEvb9X7Ad)x6z#6+2Cw!#|JIRlT&cw*N=zP!{AIuPztUb)tOGhjmNS(;N!lrf>9 --(y3_fYnx%Y#1r`J5fDNby{Ng_7%jM7bhl!KHXytHvoYoys`9u{jKixaxi(@jiM8LE>j&kAnRpTe)bS -vvi^3ZqT7yd?ipltNm{El^;|pbp&W2RG^<7ED0@KDVF)z%p662c2^@huZuz5{^;kfjcY9ybBJ@<nX$U -Db8)WaNsO(e~AMN#`afe2>Kz1mO-h$p>C@f?bWLtS)0{HJX%-)nIzvg@GqSMGv$yKmQUgyU*;KdIhTj -hJ#wO9xKLCbI~U6N<4>Fc(UzrwV8Dq}NA6tw!4;M5&Z*V@K9GNZA16U24c-J@v6|A_77HBY-Cq`qekb -0MGI4q7QmQD6zw4^}7qR|75G(6dA$YS3*WzNaGhdnFXecGcnx^<=Xea_M;v{<V^qD!m(z!ubZsGYCul -y76O8?D6lvBrBwdOqas8cv%??k`lW})CA-B2{Z5?O68e(vFo_HL!D4c4$3b*=N9(x}Eyu-*;lhv@ttY -C#K+><uZ+!Vs8Obsm8QI>iXrbRmbe!6K{6{7T#T)r*09E@hd~$as{aFjLxQ#oS;7H1hB39^5!s?%TO2 -``-A%K%a2Gg@WbpH63Ijk4s8d{z0pXocqSxiRV;R(0}RocyQ?$8oEVlB;g@S8)K)KlCi4kj%dpv%Zmh -WPq2F%kcIidA^Aq(siFBL8yp>$VjTNEvY;;~?d*AqiB037_d~`p-#>4D4x?{A(j<oe3<ntVcl@c1_Bq -izPdG~k2NT5eI{UkxJ()-V!`$URqaEx||G1H)3<Y^TX+wz}rGDa{^RU4lzO~DQdYnZNHALjm?~2r>G% -N5VIA4+#n0(V~j2x_-vx7PKHSH|G%Op>Y)}?S=;%BO2yFSz8?em2d8F&>JC>fk7C8;}1EE+{(`GuxS_ -Ny#s5=q7$0BXE03hnlQL>ydC<tHB~?C##aWm~sIuqUc<k5cglySr~GXZ@n}b17nvilTKWOb*Rfc)>hV -y^-*OMA|F><0Ct+r$aMQL4XggEhThO2tv~Z-Pa&jHHArV(k@+TEnHiLK_KXm(j8?2omgsO?^|;4WFde -ag$d_ELkCUAtAIff0#4UfDB0T|xLqoFKq^3U<0{EjlF=oB?TIE^5#sXnz)gL)mrPPH^wjp$38$eIrJ* -TIDZkC)wR5gTG$Bfg>m!!>s*(l^2XO@Eb|aDjRLp>)mb2{U7F6+h-r>5X8@xc10e9Mn`uBb`rsuGp`Q -zfezMn>k^k7+|^Mf^agYNllm0LiEKYw!{`0lT?grNHi!1gd&$-il|3c~E&a-8c6tj<G{^v{C{JZtGo_ -qVpx9ju8%!9~r6DSZa8x-`Z=mj}A`VP8V0HSc8nftF}3xCfNnR#?qd=DkPAdVU=z3d)ikS?XSBV9wOK -S!ic(fSBza&{jrAyFEghPOmk1B!GXes%}tXChAcg<LOEi;4Y1v<J_1S-D1tGReALq50Q)X6bsD+v+SH -SUVk%}Ml<&pbV3xmtPx1~wtp+bc0&0*3kDk|r8&>tLiQNIm)Jgz?O3<}rV!)M=G?n>P&=r#a`LQbt5j -MWC-^0pj>RK)&j2T_5lqi%k~<8b30c@UIvOq<m=~j{SJ8UL(Va$7OQqY5qmEJ3A}yw(H$9c)fPY^_1# -S`E2M4B6vKrEU#-a$*DqTh7*_#d(dbE-ufdAFK-ck6;jDG8303$9<<KOfNF=9?3bQc6M5N3JE2;m>)v -CZ!z|9b#1Q}&dXQ&TE(!%v?Mo_wZnybSL-y_*SC{L*tm($a@|#hY>y-Dko>bj3g7DP(H86SC;56=!9E -FTMSLC%w3zG#m1)T&JaT^&#hk{MZMIbT;%m*KPZ?3a08LwBpc6aD{NUX8t}o3H)PC@?l$`EMR5Qt8GW -8j@QGUYvz=VP|!&#&upB&%S+udhnYG=7s4jOdka7DFD&BdRJ`AETEXc?SdYg18&6$1(EY8hF;(YFx1b -b!(8y>h#l^kmJb$HgjfS_7PVBaCDH1f2L=)e}LB6)w=ALFofqIQcB`=aK-rh~HxNOnV)C~!EIj1h~Hv -LhH+Zb2GpYQwFx&-U92qh=27i0V%`ZWUM|5zZ4g~SXn5a>ir9XBY9j5^x{;|$fBe&2?jrMk>D_?RUZG -g)}%vQFS(bD{{ZJ$d@glW$CoK&~77#ZX)oMw_i;Oywm_a<1K<*|C?kTo&auknLRCGTa2CsCe**){EM( -aTYTn;DM8m+IF$1ED{$B495V?Dm)NHWtx1cgOk>DlIR0EaSxdCh9WWupDH8VBNH9H9c(VA5X37C>E3G -M1bKRcu2`-=@-I<%V{R3c>opEIV1%Zd3=?<6W5{B`Ju1O;J8>`nQf3lE#$_kmaDifX_>Pm?;;S}}vNd -sAGE>04o{cI^k(KVXRFU(0vy;}S@3`(SydS1T>5H;EHG%bZn<cEx=m!#Q-Ji>546pswMuj)*ZZrrR++ --LxS!ZCR;bY`{U%Bjcre&vWYB$@7g`~O_(n*Pu4exU?cUN_Za3|h7*zQ>5u0TW)i05-n8N&YMbx?^=I -Wb&BGqyf3x2P;zF`2kRl1>>oQcNyp|IhvZlmVvd9UXK}a$EgjYtiWFFr9>h?T`3(wEL7$Tf4uTfO5){ -ihOk36r@STr(EViu=}NiyNNB?Y~bA5^m5q23+Srn;cwmGG4hu9Aa-K)=aYADN!EV#&C}n)BaR0iabZD -?lxJax=SSdW0Pf@In}cT)bpT=-`0U{5X$*T8C514!)ChxD_^m+*OA@M^s{&{?>WL>sQ5m3nYsAok)`p -64fp_;)a8v@`BH9CJ3B~VN%#Y(CVdVdatdGFZPI9-+up==Tb+eq_9z`d98vfBJcQ)oKH8Y8EyDxhC4~ -DYjY`qgK8#?^^6aJhQ(wOotOJ$V6w?I%naB-&jx4AR4lMp4u5Ch=wR8?KBK~d8U&d(0cGX6o^r4uy=Q -H9)im6bVVjrxE3YR}fVN&Ym=QncvK7&Mv;8t>PuDe5fK-v<%AKL8Hn7X3dQh86E!VHJ|lGN&W0hKxJ< -J>y$)Qv5rxRjutU8`Pu6>SKZC$qRcLp?io9q4;VZt5fN?Z*YM~PQMV~2_c3Q9AeBk6x02+W_#5~pGSB -p9${F0kAIi?hMmw$o->%{BQo{dM_8@iW$yeFbp0%SJKDv$p{0|e?jZzAbGZ)M6!6*1^@1=@S<xlk8ju -DgXqwHOG~Rq&qm1#dlL}*)Tyffe%>?X03<}{-AvaF7Fx@g?>MCUm($3=D5MI5pyeLaPM1Z;2T+%ODWr -}9y613QeX#O7BC3F^;Mz-flt#Hoj^5EICuYY&&gsa}*745_ThLK$`RCJ=XdjCP~9esWD%qM5B0JU|w4 -$cN|7RA2@NV{8Mw@bVA{>nZW-Uh<rknd()U;8`t_2FS~t7^zV+tH(1z2w>vF)tp~CQpQ)dkf<x%CJ^@ -3eyjKe?2&-Z|*mz6PCXJpgEzK@rLOOuiI@H`E4gwFwUHqF9m|AV6{))lG|Sge!pdElEY=0$Lbxr_l*< -#H1(&glg6j?_%^>3f5Hvz1aq!I3VXeu4qci$l5?;F9iwy~@6Dd76Slf2iA=WwfwndAiuP1sd#E?wcbC ->{KHjGm7V|`2fiLqmAqx8ye9kS*LAot$m8UZY55l1J<hFwG{~J(C0|XQR000O8Q5kVe4c_mrN&x@>Oa -cG^AOHXWaA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b1rasWl~LV!Y~ZI_g7f#kTOs%yCI>Sw_SHbQ -xzIREke`TDXjl~PARAozC`|b&wfv#a~C;*3{n&?@ZFF=9X$g6ktBgbWZ1j<bam`==iIqOdkT~WV002& -v5NZuA6t_k&<TMOAf*P`!e=j9jPV4TL(E0Ey1~L`SrnPOQ*L)uObeyyIRx6jnKc;lt;=uS=weJ}xhX& -+#M%WZm%9n~16!yn8Z}f^x#*~~)dgE0*)Cvpr(cfXNnT=iK^7N46W4W)u}xus7Hbr7Jb?6dqX)Y*UQJ -&6ln8a2aboHi1^I#=O2*$F)hjzK6Fcd!uX)2GxgC*3pQF!$gF0NQ@mBLbpiCNb&|w_fZXX8SU{;djBv --Y!ymwY$teIhR%vg73Zp!nqMhSE@J2^)^S(#_@7x|*rJN*eUtks^_ADcBW9h>xC`~y%+0|XQR000O8Q -5kVeU!P`~MIHbEnri?6AOHXWaA|NaUv_0~WN&gWa%FLKWpi|MFLPycb7^mGb1ras?LGZ-+cuWJ`>((? -(~*>u>7>c*W;JzY9LH^amo_=u*}a`?MxrUmVoeb&LE6!FdVl-94*&!}%68hj-p%Z4I*mjE55Rj5?+fq -2kHr4teUYhUUS7>a+pP9q;FG<*FTVI<ua-ZxQa3u$QtMomd;b-E_VzB;xfUC>Yzrx>THWMJsYNQzxr0 -!bKgz5TjS`!*Os}L!%cZDft#jQ7Et>|0h4xvkw06UZai-LDF7;HTZL^*t;7{;#lF+R3O{MBaC~d!0Mc -S-Xy|KTWd?WW(wc5bCiUP)mnP_2NexFtq49f49X(O?<@Omy~(WHC)KEd(r%lT!h^K6cf=DMj(i%e~*w -6Se?;zfQr6}g^Q+h<epwqD9wE??(aGZk%J{HXGhzEo+grGr8XwqVA40zUlk$F!bfqxq5`$WKk3X3gC6 -m^W$;EvDkkAn%x-{~JEq$ofj!h7&Uq&`K6=Ak%9q-qjN3BbV;M>yvMe-oLq+pPjruJv%wRn7=vw{`A5 -CSp!T5V<}f@TQqZeI2FrW146Pj{Wk6AdD+OiOpAHj<lX2n_cCqr8;SUIL`mW{*K#|*fxbnK6LZ7K6cD -RTANeVhRX}LQ;e}G)r{(rcF7p~V0p@pF0<3&_o~`93or>diTVBiMNy&TQq^=d9?pVQu%jUK8o=z-Nz+ -~I3Y3q(&$ElX5rIw}6aXCn9%RtMtf~C8b-(6h1JK|@1L(An^<4#bGoVRs86<4yE%kn0#RXI01fghH#s -hJ<ALa$X@Ea#WoD%ILGBVgE+n3lK*7;g&jZ}SpbtL1jjTUOe%8u(?|EsTEb?L88>zhqr(5&d~7mtqY} -jez8*N@?>OTZzjwyS`29rQn^BU*<*LY=^ne^49sq(Zwka18lgGHSnRx3YA??0U81aNpic+vo(Byy@~< -{21~Q7tziS>+f-Zu-b<mkx{;e?FJC#SknpqdL>wN9(O+QQ>Q;|tgqo(_&V+zrx6K-$JWHPaD?P_gWv4 -Qysfa_84haaa72v2vhNia6dE%%67QSp7NxVW(Ptv-`Wi6U@T6RO+Hvs+E11w3N<Bnz|<o5P}9A=*zX* -xDi)cyw6U|HNfKtTe)fKd)T;WXjlK*GM3u(l0Q86<NBtW?!GqS^E(B3pddR$MgcHNJy=u8=T@AI9)n0 -*0z0&vGa5kzjz6rt6Jb0bAMzd1-#q%oB0C5-EXm4N%G8I^cC$Z>QLND{k|m5SNk>0uU9jKJcYzHTGF_ ->t5KU?$H<EmIz5Wzz@J|Ge@mj!j5+fw(VU1==sk6(Ky`yk$6S>76Fy236>_tGPz2`jjZ$4c4CLaR$~X -79>N-72bY-~_Xuuu-URWyt5c6{Y$xh4c^D!X@eT=x9;=NbK_1U?G8ur7v=yr8Uf*bN=xgwJCO7Iv3TU -jE#XzSa)1U={^hm@B>rZa7%4<#U(i@d8MOpyk<6;;XvY<zZWm^+vp-qa<cqf+tbxyzz#fNL!9Al7MHx -p#yXf@Dvqd^b>0dFjad?YB?4S--D2e3mq$jk`T2WaqdZ_lGg_&$&fq?jGfjGDIScUt>yneYz80Lgy>s -l}xN!^jzIxPJ{mK>!n;8(D|&Unw(qi%7hbS=wp|;=Gd{JO>odKaW7ER-nY?XeK^<{Dt;)#~0$VmMOG6 -_lFXor$M(D+r(|^Xipn!h4C!_)4_`bgv7WTm(;|Ek30FD`t-JaZ;0T<1BVEv)hBLG!rw<p*cE&9#Ujj -FLEq<}@^Z|!Igogdd2B_NLT%d2o3zGhYgw#N&+E#Q0f6K)AStK-l*4CcVF`T0>EbgBM!Y{eMSLt4h?& -L0l81NL>sI3K!;J=pAXrpFt$?bx9cO|1LDqqBEJWPcXaay}S4$H49zYQOSqe5k?BzxjGKJl(K)Q*xQm -j%`onPf(hzd&$;$7Fcxy>`_!Gm5h1-nDHml~&3Hr>h`gfTDz*qD>V>xddlWUX$%>e(Q=kvUpTT1kLCu -mpdJ)={XdJOgi`0S^hche($<Y1x3Uq+0C(gl-wkMA9nU9Ka$VSp*X`cyzNeu2+iG01bWva?}HtT63kF -G_kX;5^!8B{8^wa++c^?&{*IfM)t+%W6=JQIBvmkDH{+QIJLH1q6k4Dx^9}vx{Ux393@~tG&Y4b>q9_ -*KQQO=@+nw^Z6oBS%Ih2`EhKuJNMYSxT@lBS*yqNGb5NYy2w0t>xL|7B<{-yF<nAAxAD^CzY@MQZAcM -UmW8F?DiGZ9o&JZo~YlH^`fDI$wUwrezbb^t{{vZR8rxb%B2}vRmN6b`BWF-b6OKHXMB)TUsT}Of)v$ -{}1tKx=vYbtJ$ANIL3k-+uOhbII)z<z5;`H1@VYr>GnBL+2^1f7iRik-Z%?L8HvwpqRKdYK+5DLSD9t -cELcJgGgAg#Z5uBwz!2VRQIR3P$sk%wyFyhX`icTSoU`lj`uIZlO~qYtzF<8_cgQxbw@ol}C1r$B&I; -H%DLRN`IDYypkoF5FizSytaWxDQTVf#F?h}S!1vSH3m}nTFOeG33E-d5?(1_aMu>xJ7|g+N`|C4$#K^ -hd@9&~&?TgHWnuw#)wJJ#N-|Y#$CJH?<KB~nW+y_@G@PQNTg<C0LrlL7h)R)PmAIcGIn8q*mw@D@ssc -a=Apu)emdj{)%u?PUht&AP)7i&x73c=`7=?Of90wp-22^S{AZWk|gKe%A%Ipj__9bpIR39=lu8m_jet -3joD$c-f0`}#2!;U%C>1_i1z8tf}oSQi^Yew{e{ana$>|<dfUK$43q@TK7H85D3gBpngDC5xytV^OW` -qER%$w+)T0Cnp0(IL|&;(;?p9FZK>QF5@3VhHR@;)_bDBI#2V++i*I4EY@^S33m+he94Cg3uWA0e!8d -oQbn<j>Xd#PhNm=#I2rBV${LTz^F*wXoN5x9UP1Xh(d8Z*etyDY+#RZ4!<V74%~3`rJjAM5pCn1i1a` -vJn0FA410^cKrfkB#StLn#zNhK(#Zg?NfP3X;rg@eO^_$Y4N-)^?>>&dNi&S<;Km2mr>Tq13b4v)O2$ -Wl(}8(y3FCkK>RC?*vWGi5s6bmDH0l5)ep_d9B+xqrSSUtDXfn(W4wh<@=4H|p%YOSw1o&8Osv-w#iq -$-f|LjjM{y=IGoS6(awx=5r*)a#8pKWka$_7^0C%+>*26i3Qr+y5NupCaVi|_Pd#Xa}#l+Fov>hVy&C -vDGKUbZ=CG`63|F*IZ9#{@^@Yry^$;IX~Lp!b1QiQSi6Yxr{T^vR3oF&+smUVxDh3nG0?0mcOU;!1&8 -wsn$Y%ArRLw{6lADCOP^?7+{P-?Qg`deYy-ExFHza{-^@k&)2*Z)ADZtVdw3*e4g;O5*Q}IxY1|*85h -rkNTS(J$qvf!g|AD`YRbEu(kCnRgL-klx(E_V7;yw;f2L?7M1;U3*9x`{TdR(63z$UbBD+SFe>oh<(8 -wO1F}==nAdEC2DFZ_=OP;Ss&V0*hhx-(J0|J-4CGi!=T0W#l?^}05s0i!iy{ofOAF#sRXKdM*y!0RW_ -PqkS*c=4!D#X}K%T7A8(EGTv87m33nF=$M5q`#x9RP_WbV$s$h5T@KcsbVvU3*<+VbuM=uTEK5AKILp -u|a}&|w`P@PP%5u`CR~d!e#!Xfm*^ooXeLc|0JJ?D^krX@)~TRF)lyRhnanppgaWHVhAHv7p0{d8P0K -N0kd?t_8c$<H;gnKMnmv+Dak7o3v;pXcA3FLJK}zNiPeza1m*CGDsJqTi0rY&jwan#ujziL3jm|GNz% -Y3&B0SLNKA#6q`sE1`4zLB}KS?3fh5)rf^mqHO5a*JmPk<LIp(LfNb<ygp}-4s6mB5fmvP#t`d#!rC0 -&w_R--s@r|Cw?$$kIKD%SD9<%f&@fQ5UI$sXEBQdUj8W5yCOFVQX`_rTM2yDPo7<2{f4$|oR4C)e;A% -icB%gp}_H?e-S`FFUHaiaO3;U?r-<Nt<VTX#D+vy4Bqb2_)exZ#6MW7oXbXwpaK4&m%e&uNdozHlBeN -es*`R!3GLhYF`;7O-~u)bxE?{Ct)tZ$FlWbma$7JQ>Ncli{VHQVjzcf59mIr9@d{$H$nNq*&!G8rHBy -(cY{`_+upA1c~Ul*9PzLWBqt{*aD6p9T{c-89M?+jhHo|UCbFMiu{TLh&7$;bksyW1H4;-fscWfaP(U -`jRs++a}<DX%x)~ex%MIwepvc5Oe5ng4OrwIM*zh~M=(7QA%8diQ6~szk<d9^A$Bp0=;0fuPiD+oA*p -Viug922&lY$pf)rt7FkWb-+Pv=<T7F2pHN}w?!;m|i%2@i1qtOyvO__q{`Y(quF!yf2*bl7E5V2lZ=a -EP#Jwj~qt93)>naLVJBL#OK=wOVSgXw2c+aU*@&~|}Eg^3olG(KB`ec9BlrrZn?(jqVo(0Q~_JY{-!q -|F&&G?wk};gTby{k?5%r(N6IT2R66_BR`biP4S$dsuVOg={#`yQ}=F<pWRj;ZYHTQml>n;lP;$l?~eI -H))-t0@jJ)XFP<B`T70X8vu5LCyfBt!TI6s{N35x|NJYnIq~<7*(BmE2G?(MjK|*cDenecJbQl2_{DB -~)Jp;v7K{UrVFzX=?gWAig$0dOai9VZOyo`OAHX>8GwF!o;}4`48Y@+iW(I-paP0knL9HW5;>lw+b2# -dOp4AQbm@_)e8x&HV4Q;<+%8UK#8E?dyKmYPSEZuAq6MKsGzKK}{+o?BU8&7tP)SSuHwV-2D`+VeW12 -4@9+Ycr`jY;3y-iP+f#NVOOE=HY#i1WdR8#c<rGV&pMx^v{77lf0KI@6*Vf78KtBd~==lfHZ%m~Di6u -oD}TJ?BP<XNKBpfOB{2tUw$O_4I^tFNy%(bd6$uN`Zh|RWA)jgM78Iw}uZq@sAxD?~E}F4!{RHVN3+0 -y{0X@u%>wk?(T&G=qN{Y+#kOu%zX;=1-l8;{V$kp8G4cI-541Lo+Zau*nP18T?!uB@G0<tu4G0|-es+ -BVSz9d=+|7;!}gScJ|Ic>jjyy#khf6^tifD1t3=gT2kT~29Mr1}gU63Fd%OF8NS-Ipefl|*#g8){9-2 -U+mU6D>G#1Hg<^-0<=)04n*Q1ckZpNc;PcBCO{9Y>%-f2U4GOO2OsW2;5S2-rhH2^-Xm)Z}#KN8<yqR -~_ky`Me#O7r0cK-azV_uWfasTOk;e#7+7C8*FPdm-Z8+w%)l6+GyY6*C3OQ<&pZGuyl|Nqsn5e@UeME -`j-L(4K|^z?g!EnD3WTk|;3CDF$7|(?33W{uwJpQ$JWKrf%YVAGp#ToCXao%Y}(C<DmqZF8S%m9n89v -L>}v%&3I=g(Pp+|Lc-LG%<SU{7A4iC9Lw;m7zXqT#fEsV(<?c1&i>1nFKwo*4H|fFv^goD^J2S>iQj< -Lh1pX0&t+cHeuC#NQvJ0(fEFLVdh+DsOCJ1f&50v)w)m+r+52@kH{zB46tJgL64(wuzj88$06gk^j#( ->uKF7mwN9&Oh${3J0zB+zI5sd#D$%<boL5iNGb-JN%9Jd&Ck%SQnIqoM{vdIXBP2$Gy95KOf&TjC#2d -AIr#m7#p&*yoWH}g3O^obYNc{CG8WRmXZT^_lgeTZQ{W4gg^yp%2^j`>MGm>F^QY++ayaY|oaF1U;F% -yT`|$!6AlZN9u*bi0;}rOtee^6>pbLIC)h--@Hq4Q<-0p!~S5Fa&6d8CH#Y*dn6&7%weU<~V+bxeX_> -qN&rUOcgl1`;HqDeLs7cfZl=8gJc@{F!`MFXJX>fOpI1aC6{SEd-n9J7sOwNxzUwGrSG?S{^aRbqhBV -`GJ%Y(QLdC`_TXiA_9vM3KE#t7jLEwEA(M<5l9014!@7-_d;#OZ9O^9}D`Lq^8j$TX7%-vpYLBTYa;| -OW8>aS>qvk^cNe;RKSqKK-z<hJ+wB$(%+RB)(9<P%3cppLMw12xpB%9%3un|Gw-40MF;1~ire<S{k;= -}UxFa(w`00EBxdH}K_$H7tPFd%8ckdi(poTKsB5URB<Ocx&z_NKtN7$=q7OvvrNz@0V~V<*tS3m#1XQ -eH<hr0xS-===0jzG*k2Y&Vy(4pMpSsXmS5*^Fe2%cbtgmm=TfnCI`9BTg$>2v@;FHVGb$cqeE8g6s{0 -96mm=num)@lHrP_si_<Z=kx4IgoHqD12%S)KLry)`5y#6TtVB4MNAyBaK%eLm?%(3snme2B8}<P`Kbf -UbR=Bi7qK+hU$|j_P9k$jn5u2aKBcg$J6Sact0971>BXz9oiv$(+7x08@Aa<wOnmLgV@67PZC)-Yo70 -D9b6`uDEE(&Ig)6B`T*t-26&Dr#gCIX@FAj&Q=*B<)G6}4Dvp_Ec$*TNV-Pm%jL%*)ii()V{VfhOiJD -8LJyU#288c%k&9&GFx4-%`6I_trLarxuLDro)5nHp2^I7(AwEcq!^*vZBp4e?y6B_ELmPA2BVQ6Zf6w -sllSD87y!fDz)$_XZCMDQIUnzcxvddBeJ52i%2Nr`l~d&(oy3AA9z2mnmfHUQFqc($c8?E(8~vL<>JU -N6N*brMC+_=pd#HO4(Wtwi%OwppUxMbR1`cfNm#6SQzxSJI1%Zk9`6%DbR)Dl~N!N>a^-)N8qDTj!su -0<PO3Hc4QQ%zkB!f^9UY^@2S3naAXTfOtXl(^A2{H1ra%h{;Qtk8Be0r2)n3oQs**|??5C9@5Cb8pvs -oHfuIFic9=9KswD^hd_WA+B~#!JXX=J%9zLQ7PHZ}t7#c?W<B6@xo;<{8L~r>p^rDlts!%e8$FDHjp* -M2)5{(n>Uem9z0a}&rJ^lz^|EN{zUgMAOwQ)fX2g_s<myPH<FhRxBK>2R8I<_Wv48Sj^zTFvhN4i9vP -1&v`Y}CPU<6+42(W=pIKO89WN?c)(we~&ey=?p7q}Z4GOl`_L9Yh9)QHgT=)slgK*(LBV=74@mK4FHN -1bO?t6MxR233BrXu)%#zas&S`846}nU7A1f6s6JKuh#ks#06tfSDE^^a!HEIL9-eE9TekpxG)DOB5S? -G%7w8%vmvf7U*NW{Zek0_fWX9la%g`|XC^W@y^4(Tw3q}=VJ$AVbX3^IB22y=`DLMwW6#mfBA!8SXk@ -7!15bI_DNZ0x1tJGY#uctSDawO1e*L}UBWDET;{ywQ0AeuUz0mC`$}Y^Vxa{b=F4#lE8uQ^Z2Q!<nHy -Gltv(-cV{mP+ehu^WP#bSg_Okl(jZ=VO(i$$n0V1nfB18|e2O^I_=q0(h<Y*LN>&=_{=f=yTwn3_Zom -;ihW#-iZs!Rs9B#}1CUW{+rqP<mq-F%=B=ow^l;!Xt4dZc`8lme;kcZ?FJtfHNtOaw%7slyH^b@ai~a -UaVl14KX>$pjxhGi?Q)d#9%fSmV?+g6Y;hAra`<A4!kv>McFNZ#=&8zSr4nB2o6?!&NbC2mGQ*97yIC -WdJry^DteNJW%@4Gxi5SdX#tZ{vLl?=qb940VC>s9-x>fQ^34Y3o;FzCw^X+!GGCB`94T!IB_-CMq|L -inQ0QpU-!QD0f}u}xKA|E!$+X0*PZPhObcLLJ)TUO2cGJ9-22wDWj`_f9y?Ar(hnNgwX%k%P4MDY7=! -H|<DFllLLB~hnwsQrm!uVypU}TDc_2LYI)!rH4>PNMLi99sI)$^gwV#<XT$;ZGB4WEjh#i^d0=4p-RA -w&5-1G#5PS(C|Hr2|&;E^C?O2l;dZwsPM_Hb$EXiw^W7ON^}2K}+-w6O_%(0SgmNB%8w+M;72;-#h80 -vqavi3$5AOH8OiW=gb<`kt2x1ay^c_I>+R^nq9*-p*Q)!|0|b%c+(FCl}nRfiXrA;$dM7RpydXI^(c~ -x&@Ot?wf|*kM0+cSU9oS{M@hlBe5_XWdiN6$!gSHD=%3K`_;IhowT3NoPS!3R3U}2NyA0mlR_<>yQUC -V%Z)S2c@zzKc0Y6*h2U7^XSeV%@7I;UEyeqsiC>q=kgL^NBrboyr>BF9fWhxbz@9CsE#%+gvmX7)}DD -d{(#p&B0&i_e;&!U3C+8vZYk^C8Cz&wn9(x9V(sYbq&2$Z|Bn*x>6fhh7q4bFMLmoAj$@_$8_-{{HyF -5c_?5Px6p8srqp{qfm=VuYTpGsr*fF7~;PXWsu~vCRJm0>2-k?+{V(ZpmLs)}xE#@BT^H-<hz8^oNml -DGNzv?L&3$>ytMp7bpK9T6Yk;jDb6JD0u<FDefRv4N~2`j?qccKxM*19cl~|by*uWcb0RI@b(nE{WSl -(3C&>zE!SkE#cjIPRJY>+<APVdBdN>$;bai-@0M*QO{|B@H~Nm-fbHTk`n-&v$z2_6(x9K<b7uz=pm5 -nXcQ)=47X3`Gz%M<;qsXqh4UyVXCNdX0rCElTVl`ltZCQ4tHfqsh<wxS%7B6c}uTnhdWnh@#jj<vslt -z-!T_UazT@n>v9O-T#j*f!4$obEhvqky&<I!JLOO#ioonFLkIvMqjVcV)JD}qf*_s^{8p1tUHC_0O=c -MzK^wD>|j3ox=(!Cy91!21>M^(I_KnCV1mt%ilVRyM~jIFa+$^sVHL;9sz6l1offt(&iT>=lEWN8{+w -HN+ZTTtg8EF{V*I<r|7*PIe{w(^WT|r|;i5JH9g}(#a?2Y39YThrYb=;asQ&uWu{TiY~>&X@=8^XYKm -hJ_8dK`@D#5Qc2g^UG5F?5YyoGp?Md~%N^2f(lW2w!W3==98}ZIrrtHz-sO%{VNPG`9SeVFZa<IH8!# -!}-q94*dq1*ic1CP+jMCm}g}DeA1?IvIN@cM*5{*&;AhTmCG$y>kMD%%3IW!kP-%$$vKqwYK)Eg<$U9 -<>$9QU%jIjs{$@Tj{;BEBiE9@2UdwduONP8wiogh_7fcC))b>;qxXM<a~?(RK2q3f0|x2r5#~*X?S>_ -de3C_chgX<V4z9f=D;x1d?`;NWc)lYc-1yzQop**G}99GP*Y05#D-|oPdm<0G8sbldOCy@K#I<aFZ^> -6OY<lsfNH%dPWt((Zy@QMRml}p46`C`V=l&S}CRg#%k?_aNWI@r5~LqTDVL0u$q263Ghd`G|@3sFw5b -~-;z01<{wgl{`djx72Ola=?aeLqRXGSWbM3B)v3Kr_`bVw%u>vGRfK1A^3;#)c81^`0dvpbzB5Q3+Kc -Y{@mglre9^a;3(LhjnADY<>$kMpxEsFp=hV6aH}XB28D)#R^ggf_X$v9CctZ!|53{S{UDQwTvZazi!~ -089@2tM<T^R#I{>lncA4+)Dv<K7PGd;jk{X$Rz5UZOvAfAnsGj&fsX~Uv$Bs5;T>k@J!SVa2_e5~G8E -haS{@I}YSFkJVfUn`FvmrOraIx$mXQk<Rq$NQ7>i}U&M(frl>A6~yX0ivk72ci4K5RPGre(!<wM9ii} -#xtg$d*9JA%<<}WQ((#4ZqAepd)ciw=#DrHgnjHb9rQ>{f`8b9E@bgtl2~^9Z2g>>69UdRnRSA~+P*W -f>n<5~f4EHHm+-P_YsWeXv_r&L$3C{0`w835k!L@a*lxG)>ax6FfrDfJEXU9UXs@BUnSYwvp=jF$S>f -Hri&-7-7Nlz#K|6UjN;1U3i#~}4sr^eK9Vh;v$b0}@48|w$+-(1#qa68K!5=sofANDF%4_FK54fTf7d -QG+kG>FJdY4QhjW|C%$~MO&Iebo4ARR!uM_YqX&er}PZ-}vY)5jWD0mbs_rk|b8newg{Iv_@L0q+%-V -b-REG3F7<VqgFscO1Eu;B^qHZn%JTDRm}U$tX<u$8;C&i&v{&`58j~T7xBi;0_-<7paQ?$Ss-1^mhx~ -pAfk2VaZ<QdOZ<e(-*@#o`vcC5dj}+h}Ljk_-6#H`RwR{mK?kYDi2_{Vx_L^7a!1L^QRuhW314mzfOZ -+45|1TrCLt-uZO?`w?J3b**`2o$o?dBIEg8@@aAHHPtBcdxdAe)5%s_<so%u>`2=lCT3sbD{oCE-9M= -fY1We8BKG)2$MMC|o_%W>=%sp?-T_Nv(15ir?1QY-O00;n48F5TOIM?F;1ONd03;+Nm0001RX>c!Jc4 -cm4Z*nhkWpQ<7b98erb97;Jb#q^1Z)9b2E^v8$SIurCHw?b}DFp1nc9CQg|75cP_SE)Jpr^LS0D>|@+ -d^ifSxJ+`E&3Ea^wOu>Cn-g0B-u%uOGe};isH{l`GdIp?ou?i)n<P$#<07*i;~%F=WH*od~jnEMh9N# -ey}cxpRIiwhaYqkW;2QVQ1eCnF`Ehe`yhTYJL`HCv^A=`BH_*T^}Sfk8*73#Bg`+B7fF5-<^Dy7=76W -m!P#IN+xZHziV##Z;5}k0&6<oJpm`dsHlb)%v}bf$25V(!<1R6G@O1<q<cU0OS+R%qDFW@2I>!I1>m* -C~t4R0Ow(<Mn!G4VYzy0%9u|#)j9H;<o_G!iUP)!5Fshn<MtdVLA2kUge&^?3H7{+M&eN75*IdsETWQ -;LXu~=PiqXx4Fp(q6l%Jy3dvT{MIu7)L10e*_We(Zvl9{m}8MA3Ta;9Nv&{RW|nxjPC<hrw!((m^b*I -yfuxOZRg0Nt}x87ihJECdPnEY|RPG=QIbav0}2RHK(Pw&(O*NFn$KF*ilAFn9_MU&l@OVJ3E@TvO?MN -0Mdp7II0%<$bgiHAbV`6orZcdr2?-K>-_atDQ-&}ywOp_1H{%-E(VEj9*-{4e1$A39#M?*l`8|J=f7A -FV;^g)u|38wKq?XxMqgsge>-5!h?NLdJc4jQX9{h^`s#Yh%lDneGsKV1S;vXlaAF=+D^mkT%eb5z+;C -<_ldAmpDrB3~{p#4W>t9Foz2(XzS+TO_bh$^}wqPm~IU^~TVt!fDyy2wufM>TdqOia13!hOhGyZlm$G -xl`JE#u(l-TO^NL`B_>V{hN)cFiJT@`pa?~ePIxhv=%?8wPapBeZ$aqO<sO(B5I4aI+NP37hdg}ei^4 -~NRJtWKN@Xsy-c{Z8p_^1X=j;Wz8r%Xp1&WRg{GUmv`wahZwFK-?$Bj{_5e?6GE*499`W@{NX?xInU< -+v+gHI%W1iIrbQ1ztfyMaSkETyVz`*(hRQy_K`Y?Pe$A&=0cx94L0@b^rfY$RMVyvbCmYnp-{C<hVW= -JX&^?gQn)!XmAsgx<aD-qsy$p$D%fw?!T<)_rXe%cDx*_QtZM;l1!qLpG5_+pNnY?2`*GMi)xt^bCs{ -$>y(zZSR(Yq~R#fY;bdc1JQ<P}%Ou~#^Q&0~$VZccw<gWE~(TVvR*|c*r4OQg9!5R-~9#@FZTwwtz7} -@*4#S{wrZnn&R9DMm0VWzb&UgBiMyrpUD=*dIl_Dq=VOeFb?38Snd)yWR_2*&B@(Y<KkR4{G+%+x^KE -St{yv&u^3{VTX<a5Z^vnY{6F1rA?x(i1{LM8xCH*B|Y}1HXs<o(|tKy~j?{ak50xuF7!B3?IkC9v@6E ->R74LuyxNk%4KzTF1fPI8z^DPPT|U|rW!tkFi7;;$4a9HpU5Pdt+mB274x%lTA4Tzyp;y_7GFl8dSYy -u{57)EZl@axwhuUrD{k8|OFt^pzUUUox6{2w!hCH2TJ|98^6|{z(N%a2u`#RgF_RkzFV;Q%-^i&U=j+ -q4^XF_fJ?hI#e_>P)U*`P4<46B|i9Zpni@zM;LLdco@h5^2ti96s6!DAYJ^2}Ngopr!-sk5BzC=|BZb -AE!r3*5<%ox2B7y#DcPZE5V#^=&uv6yqkeVi|s#o~Wiy~0$3TP!E*{{m1;0|XQR000O8Q5kVe<{-)sd -;|ah#0vlbA^-pYaA|NaUv_0~WN&gWa%FLKWpi|MFLQKqbz^jOa%FQaaCwzhZExE)5dN-TK_n<72eyWN -8-is(kak#swi|{N{g4J0EuC#Pw5X6&JY(2?`|gf<p`19|^dXMOdwuS?JDrQg#X^*(QuXFiw0^z#fliX --?CdPD@YsU$E_dFxrEe{`<nQNClDw5(icv`Tt@NTXd$8j7-UeGt)UGksqeHEs^vcvON!HfvL|&R*gIb --yueJgU)mv5iBuPpwof9|G!TZ`l?UYwfKzCVWDF4`cxzg}aHVtMoyG#T===EBZsJT$1swj#IwToh*)d -L8#`i3_0gcaWJ8Vx(By%SPvu>-#~75-mW!Zctd`x0i&!bNd9fT9r6i9MhZ{3U;>V}<5W6uG$8&ajQfn -kQ8O-D!essXXi)iiCKsQU3uB7=Z-=e>CU}D&dV-0YQ$ATrO_6Fyb#P#=l#Er9uE3ApkIDdKZYLCyTue -@N>?tDA2LZ5GF6{5@tm)?{Xyf8NCOYUHoFl%hAXn#0K^XQz%XCrK&?I#zK&GE`GthpTN!qa>X7nCAQV -6I5y&uM0BBCNG7W0<z+yM6IGSCdXXu!SmrLhE=y>9dXLg6)=R6BEBoCyXX<n+DsOJy{dP;DFUbmVE^c -iLgN{}Xd8w)y$w!WQITrlcSS+R_t`U%1kjQs;mr~Biy#>^vC)0bR5d&xeYg-Q$eUiH6l1fxhZ#uPiy& -7s^BR0rN5W)By4>r<P8eBjWb+=~Eln4@{mOBu8B&)G%qiUr80a<0R5BuH-48kA-*^H&&^R}s^2ciIF_ -1H?S{6TO-TZI?}cVqJqlQ&qGIuM(u#a1F4SeGnvBM^bye8_kOD5KB=QlPCXSgV=>>zX_Sh^Jz?RJHQU -W#&My=K@2MSD#FcIA2^m?4{kfZZyzCGWn8|L?%R2C*q4*vk~%3c1C6PNH<sF&%dT710)&UMt<WUvG1r -&hBy(5d8ld>-nsaU1>~+JM2Ptn_wE{T(8fHp4I;E^eW(*lN*n@GM<z&KYJ-CU#|(?GoBSmZ?ohZ#pL! -#U!iuBcJdZvKyW{F9yLaE;$F?fauh_!dlZGZm$GOv)cpgc{$o0VWFLSZOc7`hSl9~jZ^C1qgN!l9flR -oe+iws11(O5s$Mdp5>6%<X)P|v;cTV6mz;lr#XsvjpeA!No1oE`qbED-J4M1mlACN&i~!lH|85Sd^Ck -3;1QlFLTfVdp5<FO-aL=VG!kC%d|TSn$Lc4=x6A(C(-qJ5W9uKWuWSqHeh1u{2pA`fv;>ZR=3XxOOuh ->D3U%(PaRIJTwOy7WDa~Z0DS?qSb$bJTImCuWYo?oTfZZ=xj`*k8w79O?}|$!H!65{9K|VERM8?Zo>5 -6N3Ts;S{*!Pk7q0Ilq<d;FIwCM*%-i_MQ8b7^S@`A{@BI%HGSj0raz_PjmQSa|6^pGi!VU^h8uB>KMT -LLrrm6DHCo&p&V(80$d+uir;jH}H+cp-7i~$9E|)p_3=@>08Ka@|XzX`Jj{$t$WT!Ms{sB-+0|XQR00 -0O8Q5kVeN5R=wogx4L1Z)5R9RL6TaA|NaUv_0~WN&gWa%FLKWpi|MFLiWjY;!JfdDT5@ciT3y-~B7Fa -<imTnSLbAP1Pu^>o^;4^XU4~?p`}(C=rqvQ>4m=ZMC=k?ROpk36PYW?%uuUtj=yDk-%Uu7|aaj0dI?) -hdW}DhEXybin5sQJjEwlTfJUyE0aH$GB0wkETTBy`rZ0$ZJp1fTrASCjHOs+=}i>MTwv3vScz$wOo}K -?a#75KLIjx<WiCT;8x`{?5vL0DR`oWB^Awv*%UDd)Ovt-JW=RkOa!Fn;mI%xvw6>zfGR+DxnMKvtG?b -IP{uRfPN3S0x1wf3Wv3?Sz`deDHTE;;EV=wgYOzLlWI=Plb^{dFrN%iYC$Pyr5zO^;Y(uMGR|3+pxjP -CnFH8CEkM*7V}W<Z5)QKWtn6w!_J0XRStK-)4QlFel%2Vz_ns*id^R2m19YZyPwVTOw(02mYbH6~HQM -D%F|^_b1ERBMKy8!dw@m;SscmVO-NutvG?`5FH7=Q0Ro*4fkD67c!CObbA}%wp;V6Ic~8A0X`p;#~%v -W%weR6woA5ZD+CoKDvvb8G*nbD}TIN26;}9%0$Boa>=+41kQ0LGrw3Z5q^~W%hjVc0AD6IQI;kPnH1( -w=JS3vpY$4DRck~)KL(kPul*3PRt=dE%B*gC1el#9xlHm1Dg2^tEAJ+9$y>rA)Jbv^#8G&0`g)+hzar -ue#LFm_Z-BLbWDXmMizJh`Q4$8@Sbm#^tK%$7v;NlB+vD@oBmd>e>*F&q60YMVvdAXRKsY{sgElXYUm -jk(KKG9f{ckVczIc7?e}8!X3YrrOdbh|^F0|W<rqxF9@>O2Qh1(aSk#K&5k<;7U84}*xdee)*BD7GfF -5rKv2krV482H88GZ6zd%O&g<1QN=ry-Jy!0efXDcb?`&pGU$EAjK<NKcdHK3r0YgS@lN7x$JD`b3<h2 -Mi&^e(Sx>*EY4(6;O+)OaTo91QYPQYm8*Wf`tJB2{?Wzh>G9ih|KjZUbYQ{3Pv)GZ(*pLXym}K&vNVT -ZSBf@QM`e})@BP43yE;+h3Oz8aoe7Jmb(|mv)F}O}l-cTsATH(co!i8`jnC$f^L;&p)4$w%-yZ)RtZ{ -}*|L?&-<DiGJvEYp)-klNm+pCsI*o}#J3ED)OypyDbML7_i)gwL121wPLZLtWhk>e+GIk^@$IAKBZkv -4fTmqK%}fJFtSg5R*4CKBHnV4P=hItk+Ej!^P`yrSOp6nUS!iy#T<`6LA{$(Lz@n%aOf36eC4pbxkAs -#nc*vVME{64Zq2d}T1#Hc;eN%?l`YD`Bd|WDeUH$ThX6M)S_=!B7=}bO#lXY@#WErB*0R^!$e{-hft) -=g|59IHX0pjj=-KSt+geJOusYDdM|5uQw1`@5<}-t98t;MVNx}y|?c}>gzqM`cCFSGLvE!r(=<$C6i1 -(0fny_jDpet1K+bItupD+61WIwK$IBZ!;^lSAYH_0vv5<~Dk;m0|8r3F1T*Wj1~{OFgY_rA%t4aJp%_ -cSFl6Y}`{M}NC+9JMG)i>Nf&#TmSZ@+b83XiuDJRi1l3^_>kfjWs^GxK-t=+B4-G1kGUS|<7AvP$GuK -u>J0?mo!MeD!^3rq8b8!AjHn&z;ng|^Hp{-KVb00P)v<uVKk>5;LkW;qY?peQmo1f3p%N(Qx1BNzg&g -&sXd4Q}8YDy;Hy2_{l36E{`;inIW`5T4A6Idp#u+nk<HSRMJx6fGFg;Ulrv!Xib>0z3P@iAMt_567Kl -+~^K3H*`%s_`0U&6s)2owK_MIH#Z?T{M9wqmeog;dKYl8Sh7V8Iz0<;x;7kK<_%2IL^}7Tc@Y#YkJ$( -F(9fe^4E2GZZSg9&L5WYsJ#_#;ur+}p7EwZqf+ips@Bl?|BB5=OHUPn?W*TJ+K4KMk9HV}>VBVx)q(G -N)i86E?5nI7oO?pis<BTg&n|j!yEnD;f$HOnK+bN8D`b39IRZm7MFW~m1*in=sZGqVKx<RRPClCn9ga -Fh8keFH*;Y^1hk#6M;n#%ZS4LG6+Vl|dB(S(8N;(?H8BHYN6US*^rD5T0daB(oB?$8W-_dUTU;a~+T7 -T_}R1}Bw0Db~TUiQ<9nU!97@BX4gY6mtSzag5?NlZ*5QP+x}^P!*?|TXO?-(`|h<&K9jU{mxBa$T;4( -^E$*w>S3?;4s?|T2gjawe2^J7_?zeo77n1Wgk{5t<>>+#Tt-<4+)$LXXYo{7f~A61{ahv$do-W{tN;# -cK^%iw#Tp0XFL6gG^GOyh3m{<}fqj=3U}n*hAfGnjB(P^eV$;S9)5IynHJVPhybJZdh4BEd6t$p;Xp8 -?MGh~gh0WX&5X;3RanU~2mw#QL`n_BzTk~uIX+`A~e+uOEdDa_8BPD}Qp=TcrfeKtiKqj!(IEzZcOJ$ -Xl+zQvP2e4ht5Kw1Ds&WwcIJ!FluyljDKF;@+rpa4lFfCqulT5bJFJ#6X1ZaV09HfZS`#jBgfMW+i6t -_UnD0>d-4Y1edL23Zji17;{G5bYgexODsxL`A-74z1+`X5DK~>JvBDn)%nNe)CFqcT+~kBDh0}TWxk) -?5GVUu;188;Rj_gcgrjWBR7b0=}W{rACdjqHllE+RRXgpm%v8|fV4{>X3-5u0szJ~Ck;>=R2FB|4YZq -pehkE0{O5c0I1vSFo?vvBL2Wr%C!r|{D#InyFdDkJ8V*BjKp;?0-YsF@!0yOg=l9)T_kMFc^v0lN(YI -Gzt@d|v)o~cc&vpk;5~<T5idkHK_Uhf6WA-<~dXUm?3Mqz!miBEKh156q#F+%WS`^FS?(Vn*^I*9G1) -6wiHrtKzyp#uf`%fN=KX*XFUO9A|fyyn%=s(=m60rV4F!J5~r;nekIqqyVrB*#xFwAoosM^8y*6Kl%R -)aBY&TI3`e>g_2kU<6;mybf31cIUDhsCc&G&&k;;GN>JiFg(P652_M%-=T$Mlre+%#-C}EVI1gRzO@C -9;^*NL{rc6;3NS${lf<lqJ|QN?%G!NCh+I?v`%1T9DoX&N1!>wRMKp;$x$W|!U1Inb{uTKdWz&YfI|; -pJ$8nU?Vr<{kvB24YEa+ktiO7p#F1Pl$R|-`xFhJSIRg54YO?II(EZ3GwB8J1i30uUU$<VBzK22r<WM -vTK;7q!gP)oTckkLw>R61nBJj=(Hu^4|5^mG1y=AC@k1Oo%)nEa0(z#;4ExnZlbyZ6R;Qc^%J$T<XqZ -(pry*YKFSr-oo0eSe*z$P&(NNO(8YR_|aQsed`J*BO1R9Axr%v<Szb^5VH$G|o4D$|_=ahZTIngg1!W -Rs{st1G{zV+_l89yo7VIHvILaCG2XUU}G<%jI!0!$Z>?bTa&#D{z`NCnV4nT@JyZiNN%bP4dt&PiZ3% -Ik`^;NwAPE=;d1ToM#vm0Q9L*MG|bNPbI8&Setv=Q9%txC_dSw8h-?%3LiQHk`R5Zb6skQCX=z3@R=F -$U_%U_A|w3?U1?5BVAJcJeSZJkwAdAgX-SE2X{Puet&%CsaV=N=4JvRDr7k)A3`&p_R8N#GLp-se0R& -0`g+W1DhK?=EOu`@-w?e*SM^xqP@Wci4iRyv&Y`YiQ_XCZ4kPr+jh$Ow4H(<6H4r{^i{Q2{a*<88~{K -oJIJaYQRo-$x=Xw?nX;q@_O82iIXG4lz2k!E<lhiUFB-!V`Oqgs>edw~B+xC|MW-#!&#rbmXMv7y;iu -cKx>#-*jO6uoN;$CmQcYam<->8bGEI89@U$@NX1qwQW(!*yV#aiLjVY3sKR72~^u9Wv@L{$U!I=7gCm -71I{!{~ybq7_Doz<UjyQ0z!NvQ#P?(&uq;%8^Nq&lRpGxGb8_jrSohCMBx94oYy(Fk!0Y#36@Kg%=Nf -Dtr7p*>6tZn6c~70yhOWh0k%y!kFL|*TbW(|BFmX@tF#G2JNG?e`Bpr>$@F9u&``M`w;Z}T#sF`;5~n -YZ#KGQ^r(nj@G{k{gu9Jk%sgp7efV?yarWY)Nom|4N0JjChq@Xc7^ka#B^c>iqPgrvm7elvLluY6hs7 --PHaEI9o4iMtdegvbGF)K3kjs+2JDjJ#ECTX(6?S<K%{R;FVSB^OXv53MjmeBKW{0f&>`_RBZN#Q(&f -itvAreNl3dq`8EK%J`^fOU7BvukLGnJvQ)O!{1E%70)Ri1>(>n^Aztqw6Zj#G;Ig2oI@6v_ND){!Bpk -3Y{u|Niz{fPC)QvH&syOoI)VPG1XQH1hQfnfYm>o#9+G&KOm_;C=r8Oy3H9*kzUJWAbN^|1g)p`_$9w -Z`Cz_wl!<+wiU}Bk1qMDDTph`=Fc85E7Hxn>jcOSb!NPK}tZ1dPgS3D^u3GSzLz*6~E-}55s@&64@`M -O7w8!2oYJjY;0I(x3S@z*M2-gW2rk&Sf?ISG$p!MYtOsdg{zwhi1>4(#61ThKjNawXEkUoKQsptL>Ot -Zcr><~APe4HV*=$n#)U;m3jg2Gbw3kgtOpb7?x*Ooz)eTv|y%um?0H!>qHC{h+Z;ex#aq&^J>#gJ7SG -iREnqaLyNG|J~aw0pBr4;{NQjy1QE&Vprj!#-|@P#ZK=@Dm&46xVU9u$W?W*8zyg=L)9N2Q`Aj;<IXC -)Q~I%>eD_tESW6qVFEg#5um;EA5d4dx1cpU)Uqnd!0ezV^lQhPAt}G#K79k?NdKM<h>$mLKpNZHfML_ -htTy1Uzx|UN&>2;cD(u+wt04GGeDU54XX+2?lPEEQ<9w{rdK&xbq=*r)f^jt0MvC71{A2Cr*AP2*Klk -n2{+Ec*du=lOAMXG4h)}YeKEYaU)(lqdB2g-}VmUTugm6zW=9ULBiVMYE?J+*|J*B~LkEW7C6^b#@uM -jKLDEp->IDRtD(%T&UT$B^4!Ziekqk+gas#7QLQksH+E+4Q6JI`WJVDWBS6g4xi)1I~7?d9I)D5eU+v -}eUho73oy9VpN)Pj#%;%mqS$iUCBaq>0)p7`QEGoIF>hqmerWPLY{)<fmM`aWDo`g#u(L3N3?{EbCzD -PL5S_ZLmOF#P$yYV0QL!7?H;99SyHQI$nX)^oqNphp;rubX&X3-li9mT&7H@p!S&P%qFm9GU5SDfq@l -AgfT~u%q;^-ATHh>33OUev^QacOYIQ^#8~JkE;BDo`9epL4OluSt4h8Y%Q(HojKz8s3K^4WJDuW*k<N -8?taMw2`<QBBT4FFO2a!0}$`8k`o~aopMt|6TcYY*mhf}}u#iGqAR17(WGbg#*w;zA;)b=-{K&*E$y7 -82>I$-C|6?~j7AGF%eIz5RS4zPpMH=p+Kp;o<SS2N*-92QlctULMGk@SKZbC(y%$aNt-7KkJ2`&ZyHY -gbP`4(nI??2d82y8?Md=uBONV()KD0V(4I+mc3RHB{*#euEnh#;ZtWw7=x<o|e(-ry_$v7^9COPY{N_ -&IvLJG%(wCQLCP|B2gFlHc<=61cz3c)l@>J^sEjw3PXV|6=eYOIJp6W_}N$_lhoB?o8A^ltn6vm7#Ha -9(F_IB!5oi=nx`mB!d3sa301XcGO+_zwN`dagGl^t$bJJhbPSHN;dz#hSeFRnoFsJwpK>?W&!m~o;fa -^Pfps9oAs=CsaKH~%8BX9JVd$jDsxyr8Ntx>uYj)Fb9~?Y+;t3a(tpQ78tdsWAB(4smDabvq?-=PJFV -O8Zp+Qwvh;mt=WX7XzhC)7*l<yA$$IYB)ptJ(-;n%9g=(2a^ynpC=pMTxQug~9u@W6zbd_;MR1Z|lGv -qi887*k3C`>F!I8SLF6?tuBzv#YP+4M5e)(Sf7wnQ`msdQ(ickK>B{#OIbIt)_BcLq@LEs*CZNTiAxl -UG?uL^8Ksx^X~;$572hDIbXpVn&P*E^E-s8X)IOl84Tv*YaqFT?7=)-M<+JnJHv&Bn#%09!P#dvBL`H -l!2J8kEb>%Y3Lg^8cJ)AxT0e)fk*RZQEPi}hHGPkz9MRJ4Iaj@&0Sfb|2+l^#os+Y7J5Qf}@#W6GqZ2 -L*umwTdQFPPi)NMdq1y)^(s}>lP%Ic*(qdtQBpbF5ftW40%s}`!|HZ>1by0fkOSCIrcfNdI+&<Vmgc1 -9`=OR8{1qXf>L=-dlp_1dj*=({RQ!%-%KG89OyaxPOBD%lODtTHqm0;cBHxhuQrLO#3MS_fk6pkRoSA -ReJJpbD&+fGQxoP>7qK$I(RQt}ZE}pDJ^uUY--01(;ZH_~9nxFVUyvD%`hBb4rO(W1GPAilLciJ%0ur -Y80(koJXr-f2@Y)n6rk%JTu=lr^t^lq1_PMer|!SBLMVnWW6+`l44jEN}7$`tUDb?=|DJ&YGp^MQosQ -Uj4h9{p*U3#4bu)rt?~~v7?w!N$rH&?xmor-t(sT}nv#ba9C%_Hpt?mg(EQehKR&Dmsm>jCxT1MN{A1 -d`lW_lu%D+H@*TxLHQ0dJ!EXL}d6{uv@XoHf=Jgw#`DW@B5NHtZ$7nTVCsDTGn$5x)i1usZPo>XIo+7 -VkrQnP)jSxIHkn+R=2W+1wyq(bc+sMWwr`+hVma{pj3piFdxKwO-jn1^N;{Roe~eEOunb@BG}`0V)fh -vOIi+3`8h9?1QR1O_aaZF`5`9=$kz`IlEGfBo+Do44=2|J&)=`Na=E{{0{S9gHWi_h<9y<8{19(&f)t -UX(YtcdK7|AVPY3`v;F6fAQqMo_@LG`M>wH0i&HvHFj>9MYWW;NOojC36^;5U!jj`f?T2==~FmGZvvW -DT{K()tSnKUu1bD_-Eo7ulHDfMa3Ell$ypF{qC}eP9G)GWoUpyG0)L^md9PytET_z@NV^3e7@93YOf# -(BarXx#gQ<fVd7QI@yT~u2_m_Kc8aEXi_Lx&qCHc<9+>7!cPRd2IY^5_<5c8TQ^9;-E-1$K4Kj}^iG= -jD*5F8h+OHbXN`o3;$hQfJ}J3aA0%p1wEFr5jK!{)j6keV2XJaAG)n}eZUVAxJaZuEwgF#2z;@3*;+w -%r`>V;boNRP2o6oY*;wY(74f9Dy{FeSlr7SRGbiD9<`270KLg2*0wloS`d7Z<$?&H(5<EHkc}*nU|a> -LaE~fmEx2MY1TZ-Q6#_v4%Xen%Xu)B6kPDt+5$a#f7<@+!Ji$s|M2s{?(nP8*WX;e|Gm*1V-a?b?hY1 -@ZVTl%W_45863bAvb%%3w<{5qT?lnbQn9})yTU8s~bY3R)_D7Za!09(-DRp+&NU8zNd(@(pC8z8CVov -x+$#H0O+9~Mvs#6(245y47X{FuQu(ISJw!Mj&q@eLwYEU80MaQ*?*>FHr55(1|idp0ew2J|4nWZp^ic -8q}ELTF&auT2~o|9~8^H4C~TSK)hYEsBxkACgz$}oK{N-$j!9hh#k9AHkMk%wb#5|G<iAHGUUN~qVxr -?5Rvz9*+FS{&p_RRCeKWBAG(f6Q*|p~5w%2q493m%y?6Umke-Po8@F-acyrSy)f^b`Kugaz=xpP{^mk -+1q1C)*i%U6l)VkOC$~^zS5Ne9w&Xd&giu>P`68X5kU6goRk37`c=s@JjAZRD-o$A_^nmau3~a{MCGi -X2t7;-;0IszA~k}r`+aLrqV^|3R5((9@n?;X<y27ws9uuxbM-j&W9?P8aimuj4;^usIp-o?GCX(h?gU -%S$S!wxcb@V82DiY%Qb%CKgU2;5>eWB^;tNmze{ZvBRZFsWH&q|;lW_ONvuEPbf!Gl|&mFOEQo<x&Ql -x>aD9rSIe&X;-SH7VL_S5p_v9C6lI_<%;njV{3&yvrrrK`c2l1?>~oknS0U2j$$SJ;w_^e0i6Y2a#=8 -wmd(sicnrQM~h25-oPsiy2`?sL%DpH$fI*y^wd`UYiPgU@)S~g!c<_-TsC{h1y5BCmJy7J$Jd^&ca@2 -Y;|8FpgHiF*hg(e-=71|d`jOI%IlW21M$5!;@vCVx!Sgcbq_OqQ(w8`sjrJ531%{5{}>$xss0)cS~tE -CjyD`)vS?O|S4<!r-Oa%r?{L-xlj#f-!r(Z26QyM?RIHnvB7-UjhgL+9s_Zqpt)LfJBg*^dehhTZ*i_ -@89X$i3ZRfBcnmwt7&&B_tj+&aKe42@^hBe{SIP`VIHO)PR8u?x|LiH-w4KDRdJITOeC!!Iba?ptu8? -V;mqu$nNt*r|TW!#C-C)odM=1~o*-LB;7&;|PHUH~pf(PE?_g|z<)tRD)R-^%KS1HR5i0Z~_m+$Vd`$ --&ZUB;sH(4g+yLY%UWh1+2JeJoL&X*i)FPr2P#MoV}H3)aX^h5R)pnT1%%RW4$Ri);R`XF1}W<ZY3Cp -h#i}r6k%32Wd#!RZ`l6RkNhA*&yD`68Pi0<Ug_%1sHTML=%=;0!u4)e-IJ>G*=i2bFtxSiYm=qAt%Ph -?vz<!r)(vcHTi1^g8EAOSBQEAD^C=0fqHruF@w%pJm&8-$5_$>fi=n{ksJg(Iy3^O9c>sC|Yi`rLJ`E -VBY_dYFDkx`YUx^d7&4kK6&>zHz7d2X%San{&Vyki8ZA}enwAS*!rz3vW-Qt2Dy7~cUKdK<DD+oR@xp -GMrPP&*8qd+m{62p-Kb}+d(b$K-|KA9WUi*~sp4?x_b&hr3BF-??&@~*Q-*Sy-It&2@M7ep;T@N14N$ -z^LKlREgK(QF;f&RIfmau#nN%pM|TWg<l9*Q(b2Hb~Z$H{(HVxm3sgN^WuyJ&xqvOR24DH7PZSZXavj -CId9b;yr0xdx5iP-%B%4&=_ytf?M^}txL<QQvl{EVZbYlFq>*z&Soo|!n-r^cccjyfvPLcas>^TLDf_ -qcu$C0bgpIGFoPT^gGIBRc!wU23DKHn$oJk%6d>b{I1t!eEuUbz6FQBC20R3&R*7@HZi5wHl>nBE3}O -W@mb0jc7Dy~i5R2tP)yI*1Gi|V1Mh`6Mzv-?AMY@rFr4Tb@yG*fia#!caSrEyNLd6QKVfexh;Kwcdvt -}FHTsGqBG{bIVU_|wIT^51Pdrha7@u#3P%z#$5YxGH`$f#kH7_(4WvYjS(edCd<4~e<NVicusX$;lEG -^S%Jd{WzKs_s{!#wfv;Sf*(nuQ*5t?}r?C$S`uHb1;o?pV?ZCIuwUyk^#^#2jRJ3D@uPQ$9GEA`>8?- -_Hk~}Q45igX@)7<u=Swa^kxCIS^)jt!$BxHZe5v?UQ{&0s$Pudz<TKfm@%$YGjsj5Tv1G{g4qBdJ{Qh -#cNg8yErbT^I@K?5#QVDwUi|ZYjhmSVU2A{JTTcw^EgQep23OPCo*J}zd0F+a&3L1T-n=_YyLaR?DC5 -G%>j-=}6vA<vl8}2`EwH2Gsl9c3QzdRym3q2HSpgPw&jA6x$2+dW01xur2e~622vu-vT-n-hAg#leYa -B4uwYl}}pkCLtpdDCrG;@EgSNQ@awR4D*a)w<bG{U*g;RMC*&asL>Voe~}oE+<Lo!KwZ5`P1b7_<ZMb -gL`&c)0t}F<u;{Ny0TB`0`rH<qjB$H&V6vO%uvY((yr0UFXf3la`F7E?8EUT<dJ2hODJKnqI^Ep?Jo( -PI#WTI|ad9cpsN?_WUcLVmzV;Ur~L?s0XTVCU@~|Z=gC+FAU<Eo$&Wptu7m?7wHSl%!r38^WLY3I0l` ->mD6+TG*h4f#SN?L7YE|uGspIN;HRZ%S)l7QC}>{a-)NO8+~bRCfx$yaeas-*kHoJIw1f49|Ei=Y=h< -_bN&h$do)Z@NRg#r)spKaFF^w{#5d)~}FaB^ivvFgGp3Nl;qUK<&O}}!1biTDoQso2Sk7f-gyr#(f+Y -(a)Fu?p3)(PpuXC_tI4u~d9azXnMEI(}$@?`@ba}Y9RG2QYLgn~KScYAw|y33=w8H4OYolOCqIjC*k= -fMCD00KjLC=U41BjeE{>!Jfawi^aTutuIWCFZvH>)E@vVB(U^N$LBlSO5-w3avVJN9Hiz2UnTbfi|0E -kmH>Yg1oa@fFqi08|VtBD5G0ZIbK8&&{Ca1wi~zRY4UjDFs?=gA@l9KHv?8~q$}72&bb6)Byj4N!^iI -{!%fvjU?wOh!9joj;{4^K1ON5$K(royd)&6)9K1{Y(SaivPiU;GU_*PH%i$xcEU}?J?FRUCCy!=M6W~ -C+IfHdr0n#q!2c=~OGA!&j2ReA)F{%A09g~8GYbUk;WbLGI?Pzr{ZbXAB&pR<+g^$t9N_(?r>U6d~u# -6QwF`U^*vG~D|aNEzh#{W?ka$PsPvgCt3rJb>KIw0@2KyQnKgziTYkI_T)36Nt0^0s&ph2-Z|ym=rv> -jG#FZ3S)h9ZD=|#>$(Nc+^RWM>V#Mo3d@bTsz-S?Z0tWfibH`2i>zW<tS(VvgrV#7=*3QcCa5!eUzmX -q{oAkyj5>%S@jnRvj^k@AddjX&nc*~BAlo?JP@@xPXibcdVa$~;f1bKs}cpZ&``~kpqop&7g^na&bLG -W64|U=+;4JfRJ6yDYnoVz4#dxRllB0lUocy6>V<i_v1p*(CAxvGuu7uIHRccmcwsQ|D!Fy2?i_YG{hb -EwBCam73KT5moYkUI9OgO9N#~+CxjF-4670?-C<_dms6l`<pxl%jm!aWvz6@(xW63y##$`mLGRcos@p -@XQM}~9RpcfepNH)`Jtk|jkO98I?hiGl(<KrDhoTdoy=wR7mIXn`xr?|dT3bhoL9{_tK1>OOovg^%~X -uhpZ-IRd#I~_UnHBt@kp-V3C#w+_^%=U8U-C>r!MOQJ6gwA_$xud5??N@()LBG*x^sRufYhRu;sB;$k -?XetoZ(ECk@5oeoLl-clWs&2><al|bcD*5OZqf*|bX5U|z(Ug%*-Kmg(d*;GxBjc+!xzV={^{{wj{oj -|`;YTuyW(T){B(77b_xH<uC9{z4?p{#pFRUjx;meopSG$+sB30)WPYGvgHhcYg;B9mwHY;A{2(*D!&+ -@Fs|r=!+Q3!S)|G4Oq6<Dys7gX;0hZ(v<qrrlT}RbSeZ-(8UAa*vSRI;ZEvyEPl8>^Z#+%;`nFj|t2B -f0xt{H~4YoF|TY4ztn^loimk3zPvb;TA+vUO|N;p<x80oJX}=K7BRpip<FHxE_Bie}a$m&w$Lk4-Wo> -Ggu}THtN;ih2)nOogmNts4?~yT<&Xx<^1Q)~^q81p1p;U{ULs?-Rq?8oVtJnswj#t3N$;1rAbxF*6r( -z?UU3K`Idk;sX8w!KZKCY*_!MjN@!|W)!WKbop*W^r469->Cj7m4{(HbrZ`Pi{Zn+q)Mt7rP528I-Gt -(C+^Ft!ug+7IgZn>lTGnYy7=QXT)8+IFe*b|Ig#o`L9xk~6)#gN2CuH6#T+D*m{~{{<EUzCea$M9Jhg -7O3PQdoLQvLI7-5OAz1tBPpDw$t@2zX%=3yg!J#gbDySl%T*U-G#t_6^2P+bt)_|rZcBN2MI`(U=i66 -&(Vf&P0Uog$<2@9wz0!$e=6IHB8ZL%vXz+p>F-Z!+J!eeJCb;7Kx63)Aa&h{uh1UGN_{AqND$uJGst{ -=ZO50|XQR000O8Q5kVel0Nl^bp!waB?|xm9{>OVaA|NaUv_0~WN&gWb#iQMX<{=kUtei%X>?y-E^v93 -R$Fh|HWYr>uQ+fJ$nG2g%N_;<2(YZ{mH<s)G%ofi(9)63g(6j6;;O%Xhoor9iPNHb2*Pvu&h6u&XR}% -6v=Dsr8(hG8r;*hchBXM4k`gP+m4r?y!Q~d1tU=?2Gju4j8M$VSRxOle<E+zImcZLiX$x#)lyDZyc+L -j#o@q(GX7DS<7(PUDo@YSc?Rvd>f6%W;zdXnvPbo&Q(xaDDR<=ly5;lIVu=6%%P&8a%r;I%q$V$~%wo -X{yF>T96>9%H;4fa0KmPxinom_kh_ffQjl~!N-!>RM9F`WpZ(R7pmCVyYir$IKDILigueQ`Ku*0Luoc -QhZ=W@<*j$z+SR+)*)8wdE};cR*Rk<8d6T`=tNm4_TI-!6RCzv0>B+5Nf;i4A>C`1XXSouxG_<m_4Y2 -uu)Fdv%`>!H1)wbBj785Gg$R@N36Ome*Yy5E~Jto3_cG|h}(#p#hJlf(0tHZ>8m(!!Hk(&&IgcUI4`1 -||ELhamfN{O(JYC@mD2S@@4t@VvaBqbqx>|H`5N*YS!?WJMO{(PFlXUdbm91i*|BeGUr4lzocsi@kVY -6C@9)-L_DsX_j1010i_6PAL=YlKBGdENRL_^A=JB*@!n%WK!o4X%B3F`y8K=WQh;(FiT^dUq)1~j`2z -26lB~{H0+XyVv<dgi(yOazPU(<O?@gzIGLL{X-o#ssbA48J!vXrc))-MVwAkkq;jRm=7o&~Q8oC|zLa -h)*#`taxHe+Fjw6&H36iY^db!xzV^C((PDuoB_X(#~ve$BSWi2obq}&juSOykizwxN$K`7S1#Xr=<xl -=@zlZ`o9sL+u|sZGg{HyK#RoC8YE(Ee8>&$5=kheDoZZ8Ez6?oy@omz&{KbCOKKv&9nh$93A};y1P}m -8YNfG;Jtsg(OJ5OyrrS|H5wT)Eu|8t(cP0@GQ&pqoQNQL#R)s<PH&KLHJGsoGBtM@sQ~8CqFmN8{=7W -V(i^foX3zIJvlN_gf7{VN>Ddb0w6VZ-TVOsP2rmm?Q3?gYxt-@%31?NOsIIdrZ2`A&QSBs*6_X3#&*A -+xbakT8b#f=bYivqn*RJwt8tuywWpET<_8WE-Bq@bFiS1#8`k!Y**P@%Rgkb#BC_k?G5%86R$mfWu(j -C0QoE{R^bA2@CQ9n*E-w=+H(6-EC*>mSCrt_h~ait6B|4SGWlr>xM&Xp8V%R8Di-{~Hr0U?%pgH?UQp -ng%v~dQFP#@I)9|_X1;$^E^6G564%!cmcZ{%D-M~hYKIpZT=%Z-w69aZ6AZjnp1G)Gxb+EypC^#AJTg -f{}leKEbeH#Ql7XH%=#ra=20u(_h&{u-k{wh-M8UgH%l-I_6Sdi9gX6L?Kzp>8<CesFWdON?B2uOJva -XM+~D`Ral|R#y`RhK74D0U#Z~<B-I!O*;#TSYdIIGiumR-9TR9?z#Y}f7ZME?i$<+OgdiYk-`lE7EGK -=hgP)h>@6aWAK2mnzTaZCUi)0A2a007)4001KZ003}la4%nWWo~3|axZmqY;0*_GcR9bZ)|L3V{~b6Z -gVbhd97MoZ`?K(e)q2+Y!uR@GeVL+1TZkcW^>sFZQ3A79}3qPb0m(<TDOQC&rBEl-}gHtC6SUmcDkz< -Yb5gU+|PH8ylJX}tyY_@-Zo;jVzQ{KMl-%vRle0?Wq+S+Xjxk2xk$CFO4Y9W!0TF;*K_t^tNA(??)Qm -q4(BHfm)WRq8o@I>Z?}E=xk_(O#6A_ZX7A0jw@p(u=Zu}Pk2%+yswoz#7OC9G^ql=tIU0)bJ1%oN%8* -ZUu9PKb&!a078;B%IEt=ITRwCcb`j>Ro*mN>nzL(mqo-=T^(uZ2uyE~q5ajP4iiZxGfC#e~c4f_XuQ< -dy_^5Xkm0~4zIwaG*yvNtl-Q<~`aCN<9F*Fq(g-LlHCXNt^Vxsv;Km4q&C#X-%@oe>E4AAkP=jIUNa& -tdu{yNEuC6ne`KzbTQuu1d{iDVk``q94C}`S>FYAR0O;x}<%-Z1Wtus`Z}`EuP_#GshH>IP?&w!_(7K -^Y>#@-N{VAyw1=I#W#YHpo?7I3MkOgVY?fd-mn5c=z(I}n(4|Axw<O&Udg}2)fFRQX=yHqV6`LX<2!! -9FTrxbm0mQC&BYdc+6`-QsLE_eEU~_FUh{?*%suXX-~->wVq36sTdcufwPBVr6S*kxSAjn~B5p%UnN) -S91cI+jdvb5@L<2TuAs8>oTm_Sgi94tQY`S>z6f*C2US0VVV`JqRbb;+DOf0g5vDdgEA9iZoNtp0jXt -$uViMi=)_c~Xwv+rpqec;H_3mm7M<+G>rK)mHIRVlo<q1DOCtp;s(7ryriV2%ItWI(BRkEMO$^A6VxR -_DkTSZA^Zxos~CG(igQ#DP<IOrOEC7jQX&fFcvnQiu%CrOc+u%=B24899NuC95ImSq@f`j?hl(o1T?0 -n;3&HhhimlRma3luy(NM0t+s&mq-Nb;C$Q0`jRiL8cRE8)@yp6oa5Of2;wH{A0-J=VWpH@=Lbu~YGf~ -!CVg3Y&{KqCqhRCk$e}J^rP%OlczKjc45^a=d+#@FM>!@dBkfp3#DyHrX-OfkZ#28%cY<u(2{RyPvI= -Xn3Nu;7ShI`SwYZjLNwl4R^fHA$umQ0$9>_9dFT=PA)lJvRsO2I3!Iy}y7|B{M-|<|DS+5$LJq|t&mk -y~Sr<9ep7C0YUAV@^P&LG}0kspb-W6pI%HXA2L1$v0%F{iM{7)u;u(8b)89fRyS2~rv^l>q9|Km@jkh -|Iu(IC_r_+~kxBg#ung+1->~+-yrKmT*3}=~}dy36(U7yi-$nYV$3!oS_ud2Ub^-FqNriC>N}S5%A;^ -`)gr*x^NJ1WG$*8IbtjBA;?HIM}s-BjDM4D0VJKT$kMSf4x5J^fY8C;v3@IVw?7oNMNA>OIu4Z_c(^g -kJz-v%1mDm`N-rBJ@@!#6ueoeg0*sFQL{aNlV8u4q5)Nh;vyvA=_2Q9L)2hI6NMtEjw)T}uYIz4A3$e -`YjyKmnH(4ghOL;!#g#4#A9$V5a!Io4f+dAXAM_aGlbKsW&03?$tT{V<PNpZ|-PPvWmdRZ7)H%lP^rL -ZH?5HIvPm%L1cv8|!@>D_Dg;`t9x6V?Y_-GWte_YDNnmS9JY+y$Ni{SmK%r<T_6RHF^Y^>2#Axw`VIG -9*_A2)#FvzH9JQS!L46T({yd@pa4d$rG$xrfncix1hOGZ3Gq7GGXt)rbpS*@~NY5D3ykuS&EdR0Zmyc -cAyh_E?6c#qx9ib!n5q^%Fx1*oaI$jJ84mQL*H`}b>~e<LNCc}U_Xnr9GhUQ*`}~E1f^qJN1D5ui@Gi -G#-vBYGJME-gQ^N)0r1+A$}6QEgD+pcY$FU=YY?8Z;S!QGjy?;$cwJSuQc%ORsjB6gH_<(dVdX{IEnf -4#mS4B~{do07M2?RFus|ib);AHMndn6{UibO!mzLtCdE2ruXC3+RuGfzG&yKp?>F9Tzzy#8F6b!JRvn -Nk%0`MXJwno<%s%~!b<t*uF4Ul<&<Gp^vTZfe28pdG|;$VQGH+V-5OR*fg<@13VXZO?r@K7ICgxT7iV -NnvmOZRLQd+0J7Zv#KW{5ag>)b|*8K5C-^w2NZ2gWhN4Cl~FO%N|+S!gOro;~OGS9z(E@*5F)n_T*3C -2&%9b&(1Hu0S@Brqxp6#)IFpeH{NbaQ3K*WJ@K`pR3WQ09xWJ`ywGzvvtr)P#%3nj(2^UjxYkYko*Ew -&%_f0^LFEr0K{F}~O9o`jd)TI5V7JVMDu}5N#PMyb2e`}3RIOXwbxI*%QHbVRWbtgqmdla*KSaeG9+C -+xUy6J6>lh^kSOZyOIB`xq{e1lWhhPHN>(3!DC?tedN&6;P+M(5n#rB;&c7;X^yPIGJ*2^^6GW<_%!5 -RCtL?Lwe!<09`AoP?#;|EhRhak?uUp3+0iG$z+&p8<QM0+ltdLc!9m6wL_h@*fnTNQXjq9}S}+pvpyb -~$5<m+Wp1xeK5e=0>`9-ev;BDa3ZeO(Oup%dBg^{l56Uf#Ge|-&CmPV1#~K8q{uY*fqdH>AYx1UDQwF -U|J`$kou}D@p<)>YcUvc5*nUSOJI;+CehwgbHCvdO3k*S9s1Obydzv>)sc*-0)xR!&A~(psfX>VEfg* -G)O6T!5;a!@m@S^!LKi-r&lS8zM<lH*?`XbAn}E_q-Y@Is?(OCG$z~YR4|eR#xmC}of;tnE+FaaO*~Y -ccXmu)!ITHPmqte;t^pG`=gg3Y$H$;<`@+O;1>Lb~wi651_|1v<Q5mLLi_5vKC$)SmLOflC^&J3uBUs -giVSgC{V##*iu-O#j<=hU1ZJigE@woMFOM=>a2yQs&PgY_0;zN;z+E~i&r5JHT4%|tC&jC>)xd+1<g@ -;kWkDrff|4Z+Ifnn~bs291l_#d%R6m?&Q{ev3|`vU9Q;9#4MF(dN)74S#DpLF~QD9Wcygz)H^9;*QOE -$5DX9IyPM*q5DzHK!bHnxQuMxJA?yk)+e42Vw;4%(AvKQ*pg}c{iVwwl#qFOFol`gbZZLxjl&j^KA2x -+yr!8yTu7OL&t_PWY^xLWcy2yT3iW#VZd3us=vujI(?)g&H75=4#*s!y_L4mtAQm&L`T}|EgzD5OX~s -0ar5;?f0*w`WM#gMs0;i)S;$NpYYHL58#Q%Q!ADh!>rwM%(<T~z{@y10h;GyRzTmzn$IGvIY8w`)ei0 -WvMU=WS->=4x$bq`A^U9HmNE`xa4aFT;?>N7aHJN2QH%p#Nc1_us6=qaI}(+3Vq%=qd->88&drhH$Cb -}aWOf&7WwG#ML)$)qXnr$u3nF2_vj9tUs`8lOyYqTEmWD3E9#+GTiUxTBv`88SQKNLaV4?A24$`e2Dj -`$>TG-WCs25)wZYr|SDeKAi5s{*M*k7Uzq}lKpVi?`ylF9?%-%jQx|RWJA<cGkel<Ezu7ij52Suu5-C -ID`Bp_E;`$_FJK3xi1Y>#G`&XB*UtXYBacq(WaUrZv<J~g^C2CJ-5XI)jr6U|r{AggJ2g9H-?6xF&Y) -`Yl+|i(JE?Kg<#z}DfMU91I-V<R({AIsb^Otn#V|A7(EyMZPNaY{_NF3VErp%S!3Xcm2hwewdyPnVx; -ZpRhIBn*nsLd#ClcPb4CrF0>NKxP5jMZG@MSX4;ixS(tNK&=6hAl$v1#YR!hVh+r?7r!KKauBTa;<OH -4RM$jmXq2#hW0kJ&Vx+e?P=qVy-~75jHkk(B{oUoqCS<XmKGaZ5hi6pD^*-e3QW6B5x;(k>uEfY0`xL -r<yMAToG}5|6#t;6cD4zI%4EJE0>nyG&c%RieHP_^bo?74WO<zEt#*vyj$01xRy$b27RravD&PDp1d$ -M!r)ieL2?=k)Ue5`kMHeghdm)rGKd+qyJJ0CVzZH{G#{%I_JzJ9b||$G3;W+z4c}Qu?muEX{yajKQ~Q -y4PyZ#Q?WYm{T*n=KHflHa`T629tm||lxrRF`8GY-bix3|DR|RrZqZJ|CIF5|@|IpEJ9!8gk7M5KLw0 -L$oTIjvQN)Iw1`9yy-f0Pk!%-IcEby>%Q&z5wN-^z0MKL-H|mV4M-$I&_Xeil;cS~=T@cx)u?sU95a@ -|Nny&;JEbO9KQH0000808trnOkjkrrz;Qu0LwA}03iSX0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RZe?S1 -X>V>WaCyyJ|8Lv2693(Q1z&@~a_1^((zTs2;~_6`w_;h6*SIT&u25u&wzbHjCQ5PqhW+pF?np|cB=-v -*hBu>FB#OK{9*>{<LT*`z4GV&0RaONL0+wuYQIsrPNRd`057hfWH^*Vg%VfjNdn#6|BwLwRA<dKAHIE -{?<K<w9jMTGX!iz!_ER^hqnrHYrW=LODWz#-a4Tjz}EHdCJ6-7S}qq}g$r6DSlht?M#n*5Epho^N}=0 -TJuJgbHHVLrb;6IsTiG7%Ya4cw+LrZ#(scuvIF0n5bi;e@?<cJy>GD2v?$+s?!$Pf{MUZBnk;&CSI>2 -Mm5@0y3r7e}$66H_{55VzX~v2b@?i?==n4iaRaKB3Zzq(ff#4U8iBW6vgI=%z2b7lW4*&1+w&s2M`6) -mm=c>dXLgjN{6$DFZGN@6Y7S)9C{9#IbH9{HO%-#bvOW;u!1oACn6uSEgu$~g>ek)#>#afSt;NzXIZ% -65;V)fGFVcwD9qS`YfbQ23E3=#(M7ApsN)i-QG+ef@x+>0YoPa$iK$iRrbBIC9(BCr+ZL^{Evq(J>%& -d8_zgasrX@=GPT8>jw38*@;E=j`)G<1l2Ai;q*1=lH64hqpaa+gij29&?bg1pX%%m!ll*qUfDL8EOdm -cnEEGYQza_ltYfO}p@n5Fsv%E6vX5R(^qkz}Q6j|vVPgQ`f=WN{KiA}jfW{)R-hMVJQ~3PuB4C?ikQ> -^S`usHCZClJ*Asfrl|K&XcGd3;=<^AT$p7D_&l}BQLxlKy?HG@WOGyVi(A0%|UNd_6JEd#O*tru$M>U -=3PR=vu7vc!JmV{0eiRR8LM(YJv7`mv$NUdJUBm{&&CW904=r@&=2=<lCg3t*p7#VWMWC?9aTkv;DE3 ->W?>e?hJfzS1wf;KE@1A@fmBwmB@0)=A6Ps<Py@F<K6uARPoIz3Q}~ApR0e%sZ8p2c5<NjyrmgwWqep -Kgzzl4*n3vEFJ8~Hk@-#!vQlncR`VXufpg6c-=(WIc%-S4l?1~xeKGZ1~gx^A0Kq;0N;y#H1xIqbEDn -*DEAj_hPO0Zg_vH<G`w2$SJ2oMt%VUeUsxnpU#1MMw%x#h4vA_Zem%H>;lQu|)|3eiphbdY73vOB)pi -Xw*T6<``ASTzd)mMX0x;J!>&6#|t3(q<uR(G?_}MhFYsp_OD&TE%=a&`9!x-QL1<z)Ej#C+voEq7;j$ -+JH@jqzCvnAvI5K_0I7dR=E&qOL5oGbZgTWRT1$3kQFwpRD4R}qrNcxg@F%nEYhA(jeNcj_F3}Dgv}A -7@!u*F1xyo%8$9)&`|NdzUqzPgSeU~C>n_Ls3tEU1|H07$ZTmndAT?4NkHmC4Dg#BVGFZ=ahdWLU1a? -al%#7gi7&~UQ+%aE<Ra&a$Oa*`gh=T}nd+Vyt*FA%_L~OfGqP1B<$>KzYixeXp!{ahsrF;l1(v>J+yK -k5$Ik23cT?dy}=d+8`U(kr2jzIntHSU@Xs%yakBx2ZuVEGR_OYg5hb^IaR<SC#;vSd3^0i?(^666^O! -jTR8k@K9LrU?R1M&6VtYgcNNFs{iWnN6}<m$acLlZGMwK1(y~Yxdq5g+EU(%gxnAaC3F`<7_@=byM); -Y<7Km@%rZ(;?&p~{GpNHs!-yEJBa79k|2t7&Yj7y#g2qWV?dbL<hcD43EqqQD}M|t{Qkr3?Z~guXJ8p -bKptbtTnF%80lyaJV8YHd<L(jzcTLJSoq?g5|Lg1PH&^qk0M@2ffMpIie~`@)sHNR0`yyhs#Nd}eON9 -!hEF%L?jr&6xABF@lo2ZEg)Fcua=zcK>@G49tueAo5K$0b85P)%~%Q1T#7ApyV9^Y-P2nkFSgW&65PM -pxsS?jy4pNrfZDg+#kDaaf(1^~kf{zM`UI2eYe9f9|Nn31hRF!j(Nyk?Uocbq_|CWWH<Eh<wK0HOg9! -1*w=M8Ik6q_4vpnD|n#@0fQyW-mrg1nEC_rgqTI5D>YVzOZ%E6ns~D2aZH7k?}mB%`y7E7CFQ=<-4>j -(r52D1;esLV&I}M*4Sb=LV*_ThZYsf4nUM@wMIKaHNraJ=*Qs_{M6%Gu@e3h<A+eTDD^1R?_XS3x7|f -XPr^;sXRKa3{us9x0X{^O8sqCefaEq6GXzr!(uM^RW=zK*T3f9V+Wr7SQ}_NI>KN=zmGeRcMX+fEBmD -0(zQi(z7hgAWwamu<$Y!&4Bv=N9(;4-$b|Ii0o5>RW6u64eXxTCYbj7&CG7)o#neZ7chdgakS`KJZa7 -h2N38pn&I=;=aex{HuxZ7ep{in01x*C}{)?-G#Z`;oYOmn-V2R+p7McPl@S!j#8-QG~gRMsJdDu6+jC -Uln5w0J$<5qTi^YRf|JGt$qxwt<Um<g`por?F1e0}B$|6{`pn*a1D6W>*+xSdT2I0!RCmq#6sv=M}_O -o}P@UyG*~5qetwkPtQyDAMKmK%v5)J#qTE2d!>J+QWgw`EOUo#VXe#rW(86+8-0{fQzvUX<pqbJoi|% -*Og*fPRU3(3dkX>(c7n13t|_J5O{xH4jKr7>AvI%p6DyxE?>-4F8W?>{4iDEWU-j}uu{w;@^I^g7509 -4LyjYwZg-^dZUXBpM)i;UcyrU<_BS<1Fdgwg}&_TG3Z|@cGe<+`x<<J(~V70q62W)<Iel=mQk_V<b>$ -*%VxXgy|m*+gA#I8{itceLN91UuA-l)amr?9x|L@uB_oJYYcip9Fr!m1RoWjSuhqh>iZi8eOsovY-i0 -d(Xpv1<xs1P$SW|6YN)1<|_7?s%+q2&vv$fER*f4IH_McT?2jn60TIA*U^!+IV@Ig7?k9b>m72ogQo; -_cyF+;wl%BplAx@Y6{3tl?=5|kQ_uJR<UtR`U?@;Ia{Q#FuhV}K|wceA;mKvz-;PAwI(<x#vw`soVPT -1m*hc6X>d@BF=a#5^u#m`aW`m!?pWGBFo3MFw-<qDRciIP@St_&wBe$-hSMYCw6C#e7>YHmpX%?80x; -iIB9Ga9m{#1HgP)XqBfZw{G80mrJZJF8-nT>W44GW=!crryM8n{tgokr8d}fBj?$<UmY;6LtGELKSLu -0Zw%LH010rs*LAaPLca*p<d8G&lmO<#k{fVM@Fg~g8A#x4{9lLRt5z>h5A9`YNv>9#b8Kay+8RDYKsE -(uK&HHF{1qZ3t0pkCdt_`}L&l2v@)P)lT@GG?t=_Q*_hNwBH<>(jz=Z&;Pfm%~wKK+3ZKQ~}-B{K11a -#cMQre?0ln>nDB03r~-;$v*-5T?WmN#qihS*Q`f|ri<eJIW#P{bc)#q!5k<KqGpKN#|V63x(#<y=XUT -xVEGLfYtTpc2nieFRz>p0DoMIgwO0RUlmMiu0a!(D=QN}zAy)AZQq#x}sa>#y_(Z=(syJ@myOyBxVcp -w=Tsq$mzQ4Ho*Xc!YK6`cg_F^8)U;i|_dOPo<0ut*IyC$Vm^t$WEQ;lXCV<VCJ)5ELvGcsGDtP{l2>K -UzI+NB@e4z-?eN0{f91vGP1$6w~nwz4<i91^ThLWT(0S-B$+_+E$=kUq`x8Gs46uc!XE{*iX90!t@bj -6owbN@-Ce%QF6$4yjgx=^z}xL9~o@+}Bb9+#j5L^Sm2Th*Cr%CC5f4_7{gL_^Y!bOJM-qJ)qrHYyYuL -Pbl7Ok!jD_kVk<}*LdnvrD^A!sc%TzjC2s*IzMuy!?r1E#3co0N88XbN4E=#()6jVuoVngJFTt1re_0 -AKkL$3A4uJFQ0k-SC02JjFhLbaUEHS>9b-WnesgnS)%og_-B7P}ZqSVyLt2ZzwjfRlySWD+vAKH`*g; -PTc{Wniu=Ay0*_e+Wpk?0IUrS^TL-nYxoO}5-^Z!^VPp2a)0%dY7sx($dAq#|*G^Le{fboI@81bHy06 -cQ)uc{ni9jsX|9e+9HFDwg|#g5Ra!qOZLF?BSy0>5fet0X#EuC8u`ix8bK&;XTG8<MQ4zpEnSq`^l#i -*R$_9g!!Z85!M~1`>4$h?KQHkl1z&&;oXYv%oUcQXlIna!Kjrs?MCd(1ksW!D5uxEL1nzvdw*XHhVJ< --pu~}_Vt_D`OvKtrF)RGKjdwbZjbb-s=f<05PAIt?$BmkKf7I8<_{fPExp~{{o8G9iP6AD{fOD8kbWM -PYo9;l@QSABneU@s3L0eWw~y1oE~8Jn(*r#5wGTb?p@_o8PkP-ZQErr27ry?-+KN*+a>_;4(dtQS5C$ -BRFRU542Yq|XS&G3KAeJs;2ME_F9R`Nph|Uk{$-~BIjkK#gYElcHitYcS6x5Ksg5@p%E9)aLRWZRgtY -fH~NIJs9k_Eyd9TvM{x0m0ZrWJX~0K?!wESK%u8h$C_aOaKKclNyz+k&jYuBDg@ZazME-B@g>E(}p5j -&KF}6hjF-?Qi}#`g7zfCq+k5;5`<g$sHSZNu`kcBlshj+Z#pQ&6C5CkGIFd(z7Pf6X$iVFzpNL4%j=0 -VoU&2(ZR06w_dG6V4hC+k~k&Uq5@uVfZr9q{H+4vnzU~C!l2lN`u*Xtl^C_=((YorCFuT1mVdhlybk& -t|I^!t0=Kr4X~pxr0EILmVtsLLZ`7~<_9R?gU+J1z_q$gs6%VI#&I^i;b@d3h+H_u2eVJ72w}*eTdKB -FBnZQ5PRZ@zJF0U?U?AH!2Q%yEL&ZIk7MC8$3tvqmabbVm7hemHuqT?$X*!Ga`)))fmJ&0#3c;Q1@RU -<mkL9DCE(e+0}5ybEoIfRk<#SH^$1?YFIT}_x#sa#Q9;FYY5`|O6!%4vdl(2hay9ooIab!n}2tJQ -Fzy)7RHFzIya|4+&YDHjG$8-%`^b&dkoG6Qc%4&>Zvq-%6H&zXk8JdatSyLwkEgBZe2FFW446&0H=hP -@#vZyX$XgfJr0HF->QQRB0xPehzgWLS^~=A6+5~Pg=7nkH!0~Zz$W|+`YsBwm2@``ENBmdnCAsY@oC( -fS7+?_<<pnCIzx3A2$ojhNveepvK-2F_#d%7)P{AKVEslOKKu5?J_aas4A!5d(jN_t4>YSf+Ot1<@A! -6ly6fD!)$8GckNbBH9yk~YS_y`Gr^j9PUO!-gfJu&+C|XF_pCecal2iYnYH9Cm6cO;*wfM?#odfsJ97 -+B4Idl7}bL+4<6)T^2PnI3?j}rxT#2x77uzsLJ!w!#?{g#o~<MI2jM@&`Qu+(Fon)HOuv+Ms;0FAxi> -S!FIZv8(MU=g44{UpP?kEKP1iV8?ZT?#V5gUvNnx=d*2_>Fh)1H_#`1Ck>w2?6VgUQVXwKL1bQ9o6ea -u1c(>ik}s}z0L0X%U=4N(Q2Xo-CldjW&>V(iSC%z-RHr70Z>Z=1QY-O00;n48F5S(8XRwfCIA2)iU0s -50001RX>c!Jc4cm4Z*nhna%^mAVlyveZ*Fd7V{~b6Zg6jJY%Xwl?LBLA+t!ue^((N_cu2Z5<VTZqwaa -u|TS+ywW7UslI!T6vh)WV{5MXfu$;{5~Z{PE}Pk@q~Y&)Hu)nptAxcA)GdEavmR!zN4=JQq8c8!|PlV -ZE8n>NX=bX|6>n)BaB@>n%ZRhvJ`dc7{HwfR%;wfXfXYbto7kB(LdUf0Wys!be>x=AvfyrakG_~$ffi -><1=);)jE4=i+gcq9;0^=YYgZBbX+fE^zt@bjXqwaPE+x@5TY@Up4fdKo-A-|pId)a;Kc%T;rkH5%sb -Kd*KBVv|*Cm3vQL)yoVg@RzLYl=u8~_UWx^n|(O`C;#uaFpw<Id;0F(EAOxV`-@7eB^=UQ^|wyx_Iuu -Ae)pZac~MuDTH=hP&qTIrmn}bLYo$}I%lS5Imz((pR#atMW%llcYT9B|z=C)sQBTuM7oU1Ci%;pczIJ -V3Zk>`=OFO0Tknq>})qbv*8?{xuf|uQPyLW4loqzxS(tAdKzw;mbMKv&QmB%k^?{kAE)8r4CR&I~Y?l -iocW`eT0uT{ILb8Xw`9blT>E(H8mo*9Jf+M*m-aG~e!;XH5Z-A?6xmuP&g+WD#|)qGd$0{et*!+B&{! -@<orgtzk@BW~CM5Ya6S{_x)#l9Ts_;Jg-HQ<}GHm>8nXH2Kh!K!(K%(ILJ3>(evZ?33irc=E7d>7nvu -1$3^9TqSC?f*sHa?91zS$@fK-*EgEF33ToYv_J2v4hVR@t@93cfu95Ls{UJcmVEQu$4`!qJ~c>-$t<z -Rm-3^dBVbAJTo_XdbAAQCs%AW&Bf8J$lcS^gOSQ_nvW0f_)qlXW#_;gyBtd2%PxR5UguP81LgC9Xznt -)TkB^V(|A<uyH^=2>Wtn(bu!DYjn&@u1fz?rmGirRcNJHet5f({S<za(&QH#_LPQNe(!BW1fD@9Le$6 -k~go)IaguZmSo54lIKR>1Cys%Yo)u~y}3n((pWIm{4@ERarT1smT|1NRVrnyi3j_gUch_`8~#CwixrM -4IXG<jD5L0aJQEOXkJy`b)y8G5#}2%lZb6Y7#b{?~r-Ur4RmZxE-O<j8@?<RJV<+(_0phMb}ix=z*q@ -XAc@#{)1*RN**NRcE3~HDK(fg4c33_k6q-{O>N>&N>!~oJS}`0wEpCs70A6g&W?Y(&PsW7<-wsrmnaC -mO*%pPNATZdB^+H_!*GxI7_({*%Wq*;MOG$Gvc?mmo^ED5LbL`$7WhN5m?#3t0Qi9;3{9Ax7dpEtVKN -&<P0~RyJD>)l(Dxf;E;?zmkE%+DO>NqCcXoQZS*N=_aO^6roAv3Ee?LV&diqtCU1eWAeWI?Gk569}SE -sB<K>L&O=@(Cr=2s;=0B$iS-3I9fc<}fK`YSzu{_XRN@1}|T_5GU<uU`J))teW8`U#l^lYO6#$KjvTN -UB5}<o%`r2L4EAD;2X2Vktn9jQ70tXTayPZA6o(q9n*TsYi<&h12plSTa`WI!%sYwONUsk0(>wTIf?$ -ZEZmr_Jdnn7FQ9QT7<Je)ONGDL>jzf7RX`n5Mf6OKwm&Q#Kqq|wzF}}2WItovjJi+mfn0`WH1>GEINP -JW^Jcm6%}Frm0|{#BZEWa)ATwi@%=KZMlCi$dFo9Egj1HljEkHWb^0WIoWLrdq)+_rzh+PICry##s<V -LIzNyN6a#J@S0sX7wlCV2@nleGq(iJci620rHZfJDV>{+-)BJ&-1R<^DBT_FDfEX-M)sSE@ci0k6I$h -*uJZ8AFSmIVcSmL;pQ&RX0U*Z>8hcbeR63IGB`rD?CtNQ@$iF+{W=$7E5If)Z81)>ccE)GND(pp(EBK -4S$%be4q-vMx{)-Pc{Rg>A6FR&X$n)^Ow%GoiLYQGX3vX0$Jvlunc9E8I$)7&HWg>Xt3cWs_-dnZSJ* -Ii`%{@LyKmWP8Mr1M_3uAv}w1_DL5%D|Z&(b=xZ#92V<yN<dhhT_cx-jfMRt^i@b^Y4RGDi7%?;3C;o -@uDa5rpkxc0PSFyFfwhB5*^$JCg<h<Z#e$gMVu5|NB1$ACKMnWKpUq7H{2XSm1dyoXUBOYpZteL6Y76 -iZ=bHoLS`u&HkFHg?do=lAFK8leCtz|ipZ84%)2V8j5ifPIke!2x4^53YP}VxirQ=PL?>8_sKw33Qg| -Y}BXV+O#qBNTF;iK4MfH*S?s{<if0z{8d18(rD8da){j>Sl-Oisktf)VjO*#?H!vMaOZ;7I{$E0`a$& -AbNe#x1_dm~8^|@T6#eWOsrk?f|byhk{<aMqMM{1yZeZ)RRNOLe_-#WD7sQo<+4RJ6OpLOq2w>&=07% -T~#U&hBa(nV_?w6B279Tp*{fvTo!G)4@X5yrBL3eWUb&5R>it&Xe-Q$ulA^akPc51F_S=iCwgRE!UxY -<q$jC}d=q+_e0ci`G__6LmAOG+LZQ59VEfAbl=u)V3H3SEW9o+B-FDOXWc0tzDln6q#qq#w=DnSM4nq -=vtl9I@c!JXK_DOnF?<V^zCi&x!4<BOd`Ntb?hIvj_DTo3qclelTGH^i57m&vE=9bZ85jefaw#Ek0!p -aAI$SfM6#2v9`$o6CFD4c-!W!S!U4V;ya@9(yqrlNz)n2q*r1`#wf5e(_e^KYJic=dk%{^Irdn-A}&h -InUBrp$Q`LK38qVTFG9uYP03IB6TA-=Qw{^gZo9)N9j&dol6I*w=h}J$MSSfyjG^nmGO9-ike1Xmjvm -+0Uu*UQ9we)hHV?^FBqhVNObl={pJF%SIyi#*K;0UU@lV_GC^kn!X!UehXhaAo5$(ofQ8W|8A`Lv7kj -{^b&?ZTb5A~7-AhWIqiXW1_5jv`v4T4|NJip?j-pJ1tE$>aw#O;F3~mXBY6!11f4_U33_*m))Sh@y+H -1iZgAB3=E$bmUt?Dl?y}v5bl0_HFiiZ(yx%A^D;pGj8aN+ol7M756EZ8+RYwk>WY;x2ut9YiF2Cxwb6 -+^llE?i9R;u*g3SGbp`7J;ox5446PLlJAtljUjb*V<EGOp_enEaL&fIR>grpQCH>l&;K^s#~tv}&^T7 -Q{7)z%&B+J=rTr6CbPk#+Wm}i%DfovK(~@BP_)YU$b>T#WTFI{TsC_GuGFlG0FmM&)xya+EdWeWPtIA -N0`e9qiOQPPrl=$Qa7~kw>b^OOOZtqq-QY=^&LFi-^`LHwnbU5Q$mmNF_?r6p$yE5jSx?#8$ZY=XUPM -7JmmHn8fNOeJ|41S14GJz{9(V7=O`ixV!cK8aW)xA;<FqhEa!$T-UE&ZERXR{f%p4I?3j)?g7CR_tmq -oH$7*kKVqc<vP~QR?W`QyJeL>o!oPEz<gqSUk1FNWeR`UhQg~KX6yH$}Joh_JWlEt%FkZfHnNacrd9i -JlH^M}_mIcvAz&mo%{f8L1|4di^26{xSRYSxAk=YWIaoX`t_E_=UYtp7NFTpC_lEeyGnz(AJ@zDBqqy -n%J2QMEWgM1r%{p-i~eM9j=bY~s`?0a#ygg2|ymU()iblIJa89GH;oJw8Kr<7A+S-~q>Tbjv4*cYG<m -$TJx_o@G3CiPJuY3o?v5vO~jR!~N$`@8=fgsWs?M0lWsWS8Tg&LRK2$fiZ87?+LAk=_UHaX~lj!bVcE -ozS#hyFUu+XJHq=3R?#!!d>)b`5%_}kV&&W$Xh3QZ1ZX$9F4F|o1A-oQ4^Vs!Vk9rLy!JhL?9ia44qk -|j@lm7&c&r+<aMcp8miFEhm`nTI*9U^_daiJp5}<4b=tpBulTp^SHApU1f!KO7NoFAS`*?8Tnf5HP^K -b`2C9?j2ZP&7kWIq7MxB};G2i;3hpKy0X7+VidG6wztQW^CsH2nqu!5Wb8$*;Mm6DOX43dp3_+$ZiKu -8yi7U%OaY?F(?w$9zs7otn=@F1wJ!Cs!Hb3A%Khw?Ag2*gV{G&vVQkH0w58c1?rGNKOshI=K<Gd^+Ct -GcZ;+zz6Nh7PwgZ)CjRfC{}#_nw99B0e!PWS`rtbCn1>an467d*5n=yT&X2`qfz5RUZis71IPl%7Z;P -Xg@D2c*j5$T_$054pGUj`fHZ(B4ZENYE`ld15-(bV_3aHTWLQ}A1VgC1GiiBtY>1J9c&Hj*t7Z?(21p -#{n8V2XDcBa3O7D;uk*?Yk9%+vu4vU0u;7ns+MC!)nqOM7&2JTaZ!U8!3%F`b6k|3CIj|h)FtTuCHoR -ZzfZHPHs56Y0fdEyfcPZ^mq9K`_rP5GRGx1=$r?hAX%L>)7ryAWV-_v8pKKu7^nHN|>kwV}*9;9(24V -0=!K%=+I=)Q~p5=G(3Z?W}fS$N>GYMLRsJ6Tl3{HQ0^3CYBNz0G`Dd!ACwJ>P)EbhRaU=sLCBJ1SEo7 -4luf-=(znZ!(Sb$c;;$GCnk2G=an$`#?BBZ0r|(FYvcZI6M+~5Gp`j;a!f2A(B_o8uTJyjO?yg?7UvJ -gokm0i(g4+XS#Nh>)m{~4(e9@aJbTfB0Umi$0s=HcbG*~9L#IaiTXb%!X{HIBfIUIP=q@r@E?AsO%-X -W;0E_o>qX1ogFNO=>qx*qfC|qzmtWUCk2sD8p*eyN=0vkt*$@FRF$M}*alP9<f$+$5OQ15=AC&$TyXn -j7rc&GUGJ-dQk#sfi51O5dI;JfeODlxfm*N-U4Hko&`b3!*&9QLuKZCYZm8R{-5N!m?Q-vl>+w5k5yf -aXLR8Ewpn?%YSL7s2l-{f*O!uk8QPoA!d1wX3x*(75zFYhGqWVT|uy@e=v64fQ(Txq>LJ*>h`mrUvd< -R9Ts#W2aK=QO|2u!;J<}uY6V}5fGp!Yd;2}(7IDk9zXr+slUM^yXX<!^zvR$5LZWe!50fim8AmvfOcg -PG$aGf-ami&58HR5;cfO&8Lynj*r&;soXa6C&kU<X6Q!#@s{EiMoqirZ6ouT35IVjC)mAmY$F`pEs?l -db_go2cbYH0wz10g^sXOli@Scirpi489imt^0STEr0o*s%@Z~hS-Wqt0dpRV`=AcwB|NtL84T$JP(YH -G%za}6#*@y8SRvKnC;_HjdZTD`b{TYV>iT%8UE2?W6bvD)JT1@^elHcH@j@1yk`lk3sx%7WN{5XN;9X -cJa!4RlB~dMl0P?1^I1&3YFO)Ftu-1}=2qGjLcG`K3O!jRdyvE$fZXdfZZnRsBc{Buy*Uu*ZRn3j=W{ -$SHfu#O3}e^ApXik793v_+4o7%rq&;?$ZG}4>+tNB>?!@OcB$V^_75`zps-%pYu19ni{?|p~wMk&HIP -u&D010VOM~|9t?x9mf|i@Yt*$sL)M4UY{)T}*L2h3C?nL~nb{2}@P@BRi*dj;2ie~(`d+Z+dqDD*O3s -|YNFZF>I9i<Nq{#C5Frxdf{E?pTcFB3QE+ldS!@5vm0aQZR=r{?qkH{Z{ZAQ~1@?tY&rv^PsY&;?JJl -1(ccOoAz>!}p?c7sMYu#yNIMmliQEO#~<9r&(B#@e`Wn?0cxsN@A`YQoYYa1sDu$Rmpa;H*O#)j4j75 -l1-h*cW}m%CG4_lLQ9aZRx5FR(k+4yD)G$F*xC%#&Jj?)5*`OsVz2$X$UA!7Mdr9Vh3J`5`+G_14_xD -67boYia&nOyBJIkSlEFJ|NfMTv=FIMa(arz!brBZcWvgyBpjG1l`ULU4;l_xjGPk(M+p}c(Cktb*Gf) -9k`PD>Axc%vwP&351O+|_6vwZo9LLkGR;s~M2K<vSK!&Y*^L0!`M(4{{+!6C=Y~jt&9}{g1i=y}Yop; -sXG+Dyzy37?x7N+dp9C{1;oXPclu`;D|M_oNh=$`=E!L;3W4ekUSg)TRs$oMwfza0Qbfm$~O`G1nKu0 -LY@>PN+XZBU1{MB{At-eg*W;^5fQVd5!1r7T}@Qe!2I^K(>zsh<!wq!)a?6hBO%Jt+>tVpvvO<HZM_4 -#)<#c0BUAc{Ph=$DCj53iA&@h>R#=`1d0>2k&;{fd=~x{&}F2AK{OL{`>Km|8K4~BvooKw_wPo31qTA -*=Y}3Qx0Dqg3@bRs%qVCJl@cwiNTztaSzZ|ulvX`kbvi~oiJjvWA=7gW-S_FkBq<JY?y3s^}~+7$%>K -{T?*&5VT)r#Ct&jEc^w__yv}WgBs9hjlPS)Q(=m!_RSOgH6d2M2;+^me+yEj=qg@8O-OCX9fbR(*W&v -{C5mZ3XW&{#5yZ-T+94E<3X_qaR7%l2~qirML!gF>{_oAWrad>&vLqO1oU;y0wVcCj#UowPuYdvr~fj -@)(a35Oe7ssEwZko-d>`S_xuxC){Ihx6w4`o%6L+4>`U2*r=@vuOnmm|3|pnelbZq0ALCu4gmupT|f! -SJcUFaVk@P>oTk<I(A8*kMffAikaX=H;6+3>uZ7qpVDHx1*an$_=zy4bJXrPbsOS7*bTSf#ah$BQ<ke --YeWCH|AZrW!~gIXl28ZZH$zi8#$+&LZd;<apN3*5{5I|crUtqtk{DVCdJU1yW}*N_e$8uzxt+@#5jg -v8Nh821_vCx=N<R=ldikRcM2NM8wb0NcjbbqfwZ}*a}#O$IWek@;!x%pNBoN%u{0r%d+xm+97JRz^X< -SCm`^SWd31+U5Z8byxYGLJL&L5Qy9MKzCa0Yd3!_ssp2I50dU5w7zJC}o7I3*#*Q(@n1Vl?Qi>&XFqW -Hj~#JCRQwPBgKM}F<tBx>&24V+yILQfB79QnIIi6wX+P*)TH-(tYx4nv8W0)s~+6rUCh1OdkA(t0+a) -pe1F-ZZdVZC+~_6TGnLvF0*fmNuLg<pW*#2fJYV8|Mo)Br9(k37le4fKr2=JLp=2a)?eoFr*m|7XB^0 -$+1A+%YC}y4jV2);}_^M)HT?U*&hB+_v^4?FB};61yocz(F50Fecv!|a!BqzHknfxn_d0({5=>oZ{Fd -*7-6p3Wjg7BMT`%DzRcQ;&`DJ}r&d@~oLYmL#K|qhF3~>`yAN<sFGU3N5&FrJz*%&QDo@WRyk#7;_%- -QoMlXeeChn3b(6Q0!wze(Jf*jJ}#pR>tYxJfBP%c)FkoX_HM#l*68eZctLm-m&vs^eG3*H;#4}rB5vu -rw;D;B_16L!lvxOHh2TGP0{=3c4{{=ASx8CJn6n@DDY%`vJNgT#z`MIsL)Z@wYX{~icF4C-1eJTKBwc -;=|yEEc#;pp8(PF}k-nZwj66jrbBWYwf4p>5i$mf(9wgW8p^x4Q2QR;K+%e7w90MlvA)Ow6{NLe+_(t -jdvPmJMCgTCeIgqe9gbbLqy3F*;1GySJjdlWk)twgESa>z-o!v;8h+)=-7)_HD@c~La11C&<?xxjY|M -yS1H>ybWv@AF(E52_i6IH)V0lWqHQtg5tcJS->i|-x`*NRmGcpqh@zq3S=<SW%=b9&smV<=cR=kBZSV -}v;=L24q61a{e2TB9H?UWwn>E;dlE}NPbJ*5rkDpB8pQqtEpFMttPrt%{em6;zbIg#n3t!fN=yG4da~ -G2bH`Anh_~2-RjP+!|U=l#xUtFvb^%iLYd#4N*B^R){Mp8%dgh)NEy@)WEI~UFilV2s=6Mc#dkiDsKI -UGr>l*2(1_mhJ02PLW<k=)2Eu{cGAJ>M)>kT(_Uism`M`UdYYF;~<So0t-zH$|>=AdthWh5{>*L~+I5 -#mhF^`?<_xcQZQqHTRGG<@l;<e@)6=ftn~W$%$o?RTN^5<HPtVmiu^8A^V{yHC*{(;g1OH*<ARVSoAo -=nG>#hH$N`q(S_KfZX-$p!be@Vs0V`OeU+`ZX2BsFn<!R>myOG*Dg+{mUJTdVi+1B|WG8euq@P3)=t{ -_<8N~&5s4j}&%J?*}PzGxzNFUnJlZ9+F3$z;pC_UAY$aUiMe^IDl*HNX1G02?cPO)<34>{6iHX&dCD@ ->cWO-zGj79q!C(WL&7j3<B=brmiM8d+IRabcgc@t)RHa2N!WCdUCp1Oy{FLyOGYQM6~HDe>~jVt}3oF -F!5w7os$w2|`+=$#x{{q<hjfS*2G|xEUy*oGhKZF`n~#fRy4ARSuecOh&kxN9<5V>fC~;U~Z*t9)5p` -u(j4W4cB=o1*2HQRUbKDn{E*wk!PQ#B_zrT;DERyrjj}iu474*qW@LIB{7+s8eQWCoiNp3wbp9#w<B~ -4gWP?zt9M;Vwxd0L_N-7abbqOsfb3yIxZ1;s$P$CthHOhrOLxyMs;8gi%Q1xFpj{mDg&8G&FhSI%RI> -ks|GX`MRg{7$XO#BcYC*m!O%PDP^|D?Qr#pzuoB7G6agM7a_(O@VUW-|BU!n}6<j6;fg4`cE)?uvEjA -k1+K|}W^&1z8p@I%b{%N@*kzz7&*RDge^lrPwUfS9OFffy;~AO@4ym6;$=_o-;frw!KS)5IJ;>~cnN* -w*W;DM&WrsVj7NgGo9K60}Yd7zK=>$diHES4;kfO;dMkbQ*9-Kv&t~D;bu7K-bL5gXT9%cv_TG>ctjX -#yjXfx$;*kq?BVoqvh$c*lVtlG3BJ5RvU`83cqH@i?ggwJjfV#N+F8L$(LU|Nq%_p6DcUxJ2lh?8~r; -{C*GH>LEY%CQm~{?^(OndzBv`r=Ez5V3ShtXJfFN!JQj!3Zt*^5yjIOxxf~j6hjSGk6O37~3QK{S<ZD -9VTJQEzh^OHPSl7Yj+a_4+3FBi4i#ch!l|#mh7JiNqpT5vX%v+V>%|a!5k1lD{&Pn|5_CX+!=gdXtE* -C;L#H`F35lVDZZC-VR*yDcsctG^8J0R(gO6{U+=_{~{NMd9#F=W`Sa^!(^hS0|7-Qb<Drv$8eEiuU-D -uRTC=U7Aa@<W<tfX@F!b0J~}j5qX-#{j2~2a46zRPIfe^<~z{JV2^KOG;zcyq3&%2GZ?V&Q>TT-F)aB -6>o!Sd8N}B+*@^1z>bhiHl-e?%qU12V#r0^<TlO8mV<O4$nQaATLCc;njVzyEEZ11r(n7p9fHf9g(WA -)_;PBS+;-c0VhTJQaDDSFSg5ytZWttOrk8K(@{Ns`-?wTeN4<`p8y|^3z$Y+Ij4?gPb|t1za2+0svN0 -0umiVy{^r{cNf5B*qANtuW99<b5z-zSfec!BT@1n=_Ly^Pd7>Hfrp@VSiexP-4!gv2f*}!-RzXS~3FE -NUm`z2E#=NCXT7eVs>-u8m|aHG%^Ti22?G;Dq%?JX9<1<s6*E&>)<RVL2FDAQEIf!SOL+A}#Kc&6M2g -^HpY?@dqAE;!{^Vp;OK1BUxZnnb|1prC}fVbwk%0M-{*z7fu^h<%5wmtm4~Qydd8x3@NS40xBAKIXo6 -c;t^aKa5NuDZ?541T*1ZduPSPWCf*1+B5c1d%^n{RAp`&Oyg^W90tcVRNz$v3ao=(K+7*dy@W3-XP=Q -r9{)HbnFWXS3&EKiT4P@PGAQ9~X?#dts^<-gsWsjl{Y%KSebE`l6x<bEaYBKX6t#(Wjsx=Na4LU-#cR -n|bg+`dP)&hxP^vqwIvo@_A1Flb|3uMn_P4k^_i)hsOHLk*`I1CeYd<`f+?=t#&rsw-3bg*NF&>OceQ -Lcj9~|SJ9zHVGcKp{-;@dPChimPvaMG8ENR+0>I1cYD`y&K9-!G6p;moo_<$BDBu6Fx)^n$bVO@a!Q( -u21ti22W*Pk<$dRvVxT4DSvV!~|B@mXQzm49wjYWrbs6Ul^%R7f>^*2ln|~XbuZoeniDu&GcTUChBcG -`QhnLy)18<hAu%DANTk{sG+-LOP3XZf=z<>LZoAr-{THO{KmLPr)Dv9sH_8;aYakl^~p!n%<+cKQ88Z -?<!Gwdz*(E5Hvo=oWs}wC5n~1>yD63EN+CjXsp{9({qWio3BL<LO>K6SwWDBA_Ol{h+smH;cwocqM9U -xzR-CrZS8i)il@gs$wEcPcN&(fbI8<wck)UsZhn!uGs@HJnv@Ux(60gCyZtQJ*uSmlHFgS;zVH40RV5 -Vd*y>zy<Y8`vz5|{(vdbNXuky`%Q-$~K+O>vD#%{Tbl+Y9t!?UQVs6``K#2fZGX;}FLmKR~%b+4bJ!4 -p*ExzG`YrSp+FMdeDrd&Wd$Bn(XPpiVn0O6C&0N4x74ymiJaPoO?6&Al}_KvOA_>h?xJ!edghXlKFo) -dwFJlxf|LcO$j6Ha*Sq}17XdB`x(<AE_67Qn{Z+ZN>D@q$N+%I7tx~S@@WiL0U3bie4;{Z;pLilHx}N -qWqlTD9q{;eJeaHTzo%E>&#-Paq)FkAEBe4I|6>>`@O#g*$WP{_d<%i(u0#Xy&9*EQ$-mdyTRHK*=yg -w!MKSy6*?ac*S%3awa?O&_x99IiM|Y#jy|o5218Z;i`orKk1`#CvkzLJANg%1K`EVGAJC2t~8?wEF#< -;!bceA8IN(bPvh0kWKIQQwYGQ0`cW>pvZ`23%{=yk9Yr=biS26E9bMZnEA_f|h}9~%&+3HLHL6alC^r -+iqCn*-Q6sb&XO7?khg)5KkUpp!>mvnUaCictP;d2#^R2VlkG<`CA;Zn;kD_2~sB-z|`SjR5*}0_Tu` -IdLfjH@1KjYua8-e&IE?*Cx|^=5y8~W-x`i9Q!Pew|YDxiho4K^hcA3$q9cESYvm5VLnnk+<he8KNlP -0h5SDg`)6fh_hDU>ylVK>uV79C+VB4@cGPRyXHN&&Q4d$VPwPZqz#8`>$fNJ+yu&Oa%qF<yLt9e{$|d -j;ctSCZasyd#h&Ck$lAVW`c($$cvxU~>BH@pdc^-Z{)Pe8OEhM-rH}>SiWmY}J)KbjTSUTsIAcYr+d+ -2Lm_R}|a4o%;{k!mrEg`md@$VfFiuuR*96yLY+%+~=I{5`V80v}*%nFJcvP0rEKX8v*6w2RdsFz6})e -wFksL}$jDe=Z&F{RTtMKB_%kOX5|^VzJ~&2Y)u|Z(9D$=J-UrrO1;xkPSBBb>IgOB@GtWMqkw^_x$Ms -;NRW}i=!Z{AdDSW@@bzqpok(p5k6in%sH`*Lgu>Nx&d-0a1o0$1?~`BR#CkuzoN&1uNmmWpEK}|{oWr -e=yUYo3kIL_!Gb<0{|g3x_YW2rgfSUj24noc5oHebH%MeY<lvCyP>%@3rDLDM?idk~)FzrCesGeRZ9k -ARbMR2j2Po{p*#o+tZ&wO8_Z&2G2Ju<k52#yJ;MFo4&fY_FJi`HL?lq9Xi}Sbd=Woyd{Ndv5`Ag5bB} -r`102-QK!v+>H(0OToA7~<@+25lkX7V$;j==_axULQU6*lwG3@;tsUtzNd)u3tgWU#r1gRY17aG-AH@ -?OO}FS#{ww8g^lG+?VMS5@~`=4fG2eLql@ugXHRsO6H#h$1%Hg1;E$PsPV1@1})KqXWV)G9kDK3c6)s -U&fYy1ZZ>{hC3D$BG#RKhz*69c55HQnF7qaM-SpGF*e@TFXm`NxOb2KKJPn#j{|kOBT|T{BUTn&+}?f -bzWNA!?huZV&Clt|8q9gM^%iZV6uI=bK&T`)e!^D1b3#`#7@m424Afo`j&yQyd4>%7P-O&H9OpOo=|I -V~R_cYD5;N|JZFsn}{^6<_aWTjKKyz;-pY-tZPfmy~0F!^8CF7^l<jZOD+esMR8-DdFEWnfg)|KEnFq -3ioJ=h>K-LAe@tL%OdrUP?~!iY`8SWpG|SA5gN{~Bbd*$)Bvbssl*_jmZZiC?K8R7Xt}`S2;Q@#rhxL -*d=_ivRcpeTmb%ZRdr2c>BuICQ1v`n{WMa!ZF)xCTMRsn1gHkn(qwT<;L%&u!2RKfD{Jf1Ecad{b4wU -AQ<e>fYj1`;uwGY*u-GF`4cnVc%t=taR1ppGZVA;Fa|Qd8~tZ0LasXy0OJ971yjysxK5_W{=cc4r8N# -&0=b;+j*=1#gg81drpMdr7>1RuwzLiOg>Q@xOcqoTZV{a35aaU(qt}I=UyH&O)#Bk>XieAA<ADlHA1c -#Ph}$~~ihid9Nt02(D`o&;(w1|c^n40{XLYs4dfoYTK_LO}lsX#%X3`2=eo&UfHs|$Hr$v3Ls#DBd(( -NfgLNzmg)ah)k(oMT92f&?x-tx#Sel+RR$3>;lnW-dt`g?AQ-;}0$O!jc8nwqIFg#=^Ej~MLxma6|`H -vNSJP37D|k>e})q%Njycwd%wpEl7O;0{a4mlgbw=vS_kWr9@0QZlAe4MCG&9xUu2gl1|)+-rW}_d5ZK -_Yq2|lSPsMc?pH7VFEs8ADC~Hy6L6-VQTbTNfn|HI3}9;`DGZis_5fs11V<WmtJ}w2bPt3<xwoCL(5F -D?1ZVEA@y2#8Hh1diO*?)u_5oQb1X{1OF93PVND6YK+4x&f9=QU#0WK#%Hiv}UV|*eOd78~9d>Sv?q{ -OF=`tBuifL$Y@E!%4u$fl{iK^ots%13A&w;Zabd^LYEZWOq5o{lF5_|HFl{=yw>KQ7C9*p~eU<!@vON -BIf+0<0t?BeqJOGKjv|0oN<pRClOZ_j=R$cBSct|o>dp+ovcS$w`~=zD;a<lzIBf&wSWJFoQqRBrZqo -zd-0(c<n)L3kY2lkMiSY_gvV%6P(<agCoWBa-@ChlaleDA@+|0eZ&EQ~+I=@6dV$rCmt^dU!40jBo`* -GB+s$=a2ObHk<}uj|i*eV2p{TZzY@Wx0_Ej2#kkpfIcKXktURXc3b8Ar@#B+*}rmMfq*44D1osWJXZe -PV)8Rp3Cl4G283EOwdr6dm=M3jcxR3E4Ys0y01LaI%woJ6SYoLgWK{mwTAsgqadBaYfta;li0udYJ_5 -Z^RW6Tz^6RsSu1QTKd~G~>@bn9$<Oib(X=6J8^^;JwDO89G>Hh#wO9KQH0000808trnO!At^1Aqts0L -vKw03iSX0B~t=FJE?LZe(wAFLiQkY-wUMFJ*XRWpH$9Z*FrgaCyC0-*4MC5PtVxL8J(51Fko$FN3iRX -kB*=kh+1LY>x^p(KZ)})JV#XF>HVP?v9i!$#Q<YEI`xPB=3&j-F<h*wb2=iqIKa4Bch1OEZ4>{zOp(k -oQVAA-Ws=!a~?nPjj&@YpT?Qq!CzbF@+eNFP_8^X=rQ=YR<X|VR5-B^JYn22+?vW&)LiKed+*pMZUvh -?#Ugi7E8FY!;*?v<zTVy4&WzD!P%RE8B>sYqi1J%jSdp;Rfw`@;EYnGmitz>Q%t25?;2+#5sWyY~e?# -EjfA?B(w_2y(zRJ=w_N}#H0@p2zIZ5A35Uv<!IS2{D6R`$oNF`kq4XjAlBU&A?OjrxZ2jTdGt7BYbSG -1>Es4N+`BwbwE3A?lx?2-+dQir{ob|aD^7U5J);XC#P?vTs)F-3&(!sOaQ1XLT0fEZHVuqYycqG-ehb -FIXP;qPGu+(P_S2<tp{6^hSbSM9Oj6YkiS?*s&u)v@Fb(7a#V*q1;o%y}eX4S<B-)z_8AHjYi~{s-tv -1KS`jmp5mEZ^0#n*j6aq#bRNcT+0}sVrwo_%P{g3#mbV!S}74D)SWSI^wZ%LdfZmjBr&HkwDGLh*d_Y -2h;<@fA)6OYXWYpcfQBOo;)>%cD4J^JfPLQI9ddDA72Lw<_-wY;m06t$Oif?`C7yD)53Fo?o(lzBAd~ -mT2k#F?*c{lZ#SHHz5Z#Jra0oDH=w+({s5O;jI!5&h2o)$N0a5@;gbS`@D&1k+n^r*jgI7&KsD|ALzH -X4Fzv(yrv=Gh&m(>%kyzIq^-!lFrvm#@v$X3EIy~c<%Qb3$oN<@)}Wb8wIl5@i|%7O{IYdXCmqKQLq_ -&pP{Yx3|fgfQ^`hw<?MQ6D<vcwbDrhq@vQhM+G@P#4h0oDbO=HdcgT#}z8Dn_I2?$wDQ<qz9BHJc<F1 --Ya;+3%a5VY;lKQ0w4K5dev&+2w1rQuT+?pfKmzY7rV4<Fy&>{ximv!=}Hj()T|gDRn-04O;iomI~GE -1-E_;<MkMD0rICUP?3UIMfnnL%2xlS1gF7gkIsO)Mqu3V2k6(!^fpYbshH4GBJ6NPd(m5K@P|&~+0jt -yZTY+hL)O+fxG_S(#PG&+EZs~wZ&v41b1*-#xw1A)ifKu%s`x6LhBw}Jn=jBlpo{&~h_BuTrh%0^+t` -bQx&U73X#)jOTau*Y`QD5UX>}8rlPXY^Ur2)?ggy-Y|TeG@)OXq)SfBowN+$#xZLJ~KQv0pmA{q<p7r -QXS<+bRb24<q(soVH=`0KlS5kvw7{cZfj39YhnhwQxe1oiI%n2gU%1nph?pVnXS%`@p7yap!ov1?`A~ -g1olqSgE$cNaqy*!-704SjXlpT($$8#(m#@!;)Ol$-4V)UiDn;TUBPzVa<r0bZ2#2_P*qzDsT#4rP6L -esS^8oSHbRW!PE4>X4CKU`C|6vemVQxRi$TH?hePM`dQV!ab~7~s!S-XYbvdGhlbwWfT!?Zn(93iu@0 -@%6uPnG)oM$|gQi0mTiU_b@QI2kecZypvl6gBCgELbZ!}~b*!nw9i@+tvKS%7PW()2F0eWm!_D17xq( -sg(atFIGKBdYF_ni7$ZfsD0YEhSNApVHx7c#=iOs3p~rV^qcM`;8@UHQ2>kOqa_-2VlHdh#c!CCitGU -Y>ZGJ$l9Nr2x=T$vU!+@9EBP?meQw(diItj!OkTr^=@SMTB0!7CFqiu$LyhMoSia@!M=ZTU<}0*<$g1 -0haWghG^yLPzmye*gkDv-p;1iUpn{yjpd}U5%$vmoSv?x1pzDp&1E_M)<)s-cKER>Tf(e$hJj_nK}O> -Zl`@}W9YM7$R)0bUeoWmQI^a@OOLdpJHf<g2J8w)cnGDsGEkDk?!unc~y&}|!H<*y|$55vW1(XRIVZ~ -2KA?3UDEf3I(W=NTDP-W>55jZ7rVZ)dKcV7vg%Fo>GHsubYE_(~UfFXpdp9ZyB%S~Z?5=dXt_ztoS2w -dPy1)LUCbY6LW{mr}Km9bPJ+eDMxi_8u3j_SMTL}>mJq2lL)H}n#9z2HhH&jN}H-ZJ9}HC^QsS9sU)Q -C7y4rm=yifw6*KSq|%GIu@U7a}6zZp&mstXiRG()<LM@%&}zvzsLSGl7==3mJ^MH0$(^J9a`?3Za?Yd -0NTI$7q)4bB~#JWG}8ZgfLTC4O;B-onxj#yvMiO4f(?ADqu4q}ERBQ_R$!|UZ%L4Uxv<ReeXwsxgotK -G;XZ@mGvGB}1CIue&b$}4E^@S1s15iLTQt>o;B0JYtMR>jB)Fknz8(Nqc@v;>s6AtjTQ8SLN7y@nR~* -}+Bk43=@&W3SlRSN(O*;*(eGC^T7K5q?RZJ5dTFfb!V+Fnn1lV}e3aPF!$%`LV_oz>v1u*oWX{&!K8X -n8wsetBlRc=lntHN8<px^S$rG(McK?7_^Q@=5s;!huTP`gzr>*EmXA1X^j=u@>}SPKIhjlP0x(NTACe -BaU<zA5b_P0!r7KU?w*9Y6biwS*Qu6Zh&->Af0!v=&QBXnVWTlMa333c80{+mBTpsRP@as=`|m?G?k+ -@cr}mfqVaRyd6&1(&@Y$1u!OP8fYrVT;KgP{&9S^NAmK!JEZy1D6qu8w)y>`SMncPL34`8N#LBm7ZCW -^E5b#de?(gy@L?A27<rFHxj!|c=dV4DC{SM=vKrO;RBy)R!#j<}8K&XctbngDr(l3r)E6cZ&T^dq^)G -ANXyk(?(ok3iDcHpJ0}B1N$QEv=7`%+zy)t4iRf44rN%stN;b{zJidYvoSI|INPUzI}n?q=hyg<Nh1@ -dYE{~u6G0|XQR000O8Q5kVe0XdAaF9!esHx~c^9RL6TaA|NaUv_0~WN&gWb#iQMX<{=kW@%+?WOFWXd -97G&Z`(Ey{_bBvcnBnKj=CoOP`D7VpiQ>`YghE;!;l0rEl~~|SyV+TjW=w+eRm`!k&>Kr!}KK)#e44U -;oZ@BEp{YH@<uf^OA^9&m8cb=8!3uLvBbR3>@wR?UPO)Jg>090e8<$jVsbXi5i6=_dP}!VwosDa&t|i -X<z(A1DU(!`ij^usp)ltKE9s6c32dNEq2hp6Rl!rLxG0~9R55idRn6!wSgd9Qp80&P|Ne|<MBOkle`z -3(KLX^Oh@4P@z|l-^TvfEDJJPB$DENE?*>;sEVeC7A*hpS($!aIE)w*+e9k~ju2R;5pPD(MvN@+<p%; -;iS=QrwK+y5<W>nP7BY_Az4tn8y7nc#XsU0nWnO+?+Qm^pIol1WT1>K#?d4Wk*W6YWiCvT{d@h7AJ$3 -o9yCle{TYOcGjd00=EJ@}&`qK>{#d1tSKNXiTP9ZFBOD){3W1LF-}<v1NHvAjoLDBwufMdINrLZxli5 -P+n?;Qk2JMA6{Nu7#ro16#UlYlc4P~g8Xs`s6`>ZO7i~oOLB5@`gBRC)Bv*C0!tOk$YyW8o<4t0J}~3 -dv*?*mpD}ebZGaj`n9krOx~^&@3%joX4Dca9ka1(ID2u(v8g0D~td}N`t6JRg3;?MFEltT&kuj@nM43 -`xKK3C5kCzq_BW&J-`PJ1`eO0!H%1}ch5n~b@$#{Mw=K(n)9uK;$s^0f<y==rvG${<IOgRtw{p>zvl_ -KFMWAnM*c3#&4ys~SrShu$Du`4QNk5ouDRIM3pEO5Pt!V|sw{ZzA(10AKJWy(VB%2Iz-?B3L&#fp&c$ -h*C|fz+S$_$F+z`P+HdsQmc3^{(CFR7Sfmsq+*G*D9P8gHV4TAIa%RThH_goYb^{K#=$B3$R_i=B&s< -vH1)X8=TKGl2Jw5!-6Lj(q0=evJu(dIbPq+aX3mXMvl7u(gzBCL0oxayhN4W?r}9cD~YJ^+|i=1$o2p -n)@q7{oQBDGs*ZI@FhN2%D}V=*mt1jLnChb=q;xmvbhOdL`j{lRJxM~zihN0I!vYVNowe~>QNp6tpx+ -!Cqg<3|uVO7e_|o|tcYyv5ozYn9^gpyN#pKVwx-UE*$7VtTLloNAg(1REnq<I@8<BPHV_#2HQx!~xX( -5*;OydUOhRqOhrQufVzni)!_~tayk}`5hye2tKm8kbx4-rKM4Sx?+Tx%S26`v1Hg|mf3l0*G#pk`xt{ -x)r(r332Fksh~fZz*ePsw8J`U+Gm$iZ&+#r@9xYDx^<`JIiQlyt#ODPIPs#u6(^=HPbxnJ|RR)*{Fkh -4RmDpbO%DK)yzv_kP8v4NU))GupE4$w+wB7&mnHpBapgR0n{ElbV+p6ehL-?c^I;aP9E?bc~P-4>^Ce -T_%{m|Lj?3Fb0GfE5F1{05O%FY0Mqymro|_pE4Ce31U(+&X#qVS`Y(oz5Q{!~xL{@gUHjX-NV03N0<y -MsMw6_C!!zy{I)Q_}1RDX^>{yUECa3;)e1@EGhu^lZctYd;HinrL#Aks1z`X6W=8;0D7-1QkJ)mLq-8 -0XbEc5|1lO=qHA`&_^WKc=RHhS{W4tSpIpxJYHSD|ZC?7l2q1MH08;LQ5+UbE5;zRD}{4;8oH?pR&(j -BfOhdvGFtWDdq>viaikKMa`;{$S8-75w*Ma~KgD<i{=(({YzJ@V%Il2O|F;?jKIHKlPUlZwp@h5CST6 -D&Xb{motot;ThI?#ddI~IFGhbU!{WfZug2y5aDP~Ky2F?W!Ux2PsACtW}qe%9Ml=!LaY|pAE4vn1&(& -D4O{lw-P8K+!9mK_w@>5w-P8FCa(e>*oWMU(6s@N-r!9hWd3oJeK_G$VcI=sbph~)1mU^xj*2-zPNJl -kvPAcZbVGG_>TG>(cwL7Gq_OTR=3#ZXSD`-AhXl5<<u)Dk*my6&938K$}m!Y9!&s>XPnWKRZkoCRZX? -|5`iDstF>4ADEU%&)!Q_~NAF#04gmgx0K3NCwQ;;#<w`>(?Mwh~->F>f(3;2r)b;_d($Z5dQcyLCxkQ -)ncMaR#&lZ3f`Fvm*Ao(~G*Om+kWPV!#T^8<R5o(s9Hy%#vzky@Q}BbJ$g1V4`w9>fJ$WUAKH`a~~g( -P%j%A>irH42c6JV(6$9;Js<4l#OsuLY0@XsxB0@7Wq6-)8Ttl{kQ01{@IrN>q_b~GcjvwcvgXb~glVg -QIG-T)d^!9%4N87*)sW+J_r~YmB_C+RZji>^(mz(iD{6n!od9fO`2c8lHm89n!|xrQ$zpJg6W5p&*jN -H=9>+L;1^){0huA5Om;TTm*aPi%_Yu>=Fu=pn?bZ|D5^pYc{Oi7S^Wee*>EEswj~K6$<%R*1`-n_mCm -p#qhqHeGP)h>@6aWAK2mnzTaZJ};&=*hx000pQ0018V003}la4%nWWo~3|axZmqY;0*_GcRUoY-Mn7b -963nd6iX7Z{s!)z3W#DQUsO?n?<ojQMkxu(JkP^c7e9HZXr?9C}u;EDnF9=(%;@8Mah=!WU~ScOXQoG -H#3jJ&gdS>vh&UxEK3mmpp64wTP?lAa{SKHa-&;pY?gJw%6rjH`0)P2xGeOv`2OI~?mi_r8+h};@6k@ -%Ry?2WFj|^+>$KMil<jQuJO1m@x?jU$mOUBa(7;{d#iZ5`e#lqeb(^17#b59K&a$k<4w}8z7Ry?D)pB -#li){w<+}zy6|4-fk_BA(#TPxJPJZvllln4d~$s6oZIq0;3Ui9d+mX@8lWDAD|shn!8N?x!%J|`l9Zy -8f6b^Q-E&gNr+XN-1);|@VTQhp<XWpU>ZKZHtHkit699pn#dcr3tq;%kAc7Ft1m*YP!gETN+5wvm+Iw -))Q-DMkG*)s~$WwMt<oB7!(mNvz|l!NhePBP7NVL@l7!v5+18`Z=kHKxuJ_4Y(N+cS3FB0tf}-1brEP -y%50(i|`zxkBFPsm+_CNQ#UM#tsHBZe;e(Ki<Z66E5@M3!C*rTYqwkYp8c48p^1O)5qR4QC$tJZd{bw -j=MU6jw-**VubN;Sz3FgR(IJB!RSG$k$XkSM0Bx&F$yIB3+KXnNWNP0o4oDupQj6^CC6!K4o;(J9gts -7%t4d2cdc|zkTkI;TFf+>DOD6_yTuIQr<&MvUrjvd5n^t(%@(<A(cw|j&AXrGhsz&3gq6W|$p<W@(A- -)SCHX#Ol+<p8I$o1T%Qf>*s`$Y0shF=!`(=4Q<js?fV`fa@{mXW6Pj<I$fC{1H|z($Y*QW4Qtl%%0X> -Z1ib2`QmQxJMNQ-j3PMj*{?RoR!s554CO&G!)Wpkr$Il=6Iy{(1Rn>dFSqOvR|7gUl_U*2^Q~@yv|pf -&8_`xKC2bnLO%H}CXt0_yn6CrRwTRVlNnSkh1=6HL}T-!m`!5m??zfId}J?-xv;k;;_hs?B?s1-2q^% -*f%kNEK5;{;XmmetCu$*uJG|~XoFIqKu5^b1&w^Y@ECzdJoSxKfgkG)cDi$<tUY2{adAZ<?R*r7qNH- -N=b>&$7d_1$aHh7vHErvskeUI*uOOJW6UbxTx2T)4`1QY-O00;n48F5VTt{9Tg5&!_%KL7wC0001RX> -c!Jc4cm4Z*nhna%^mAVlyvrZ*OdEVQyh(WpXZXd9^!hZ`($;-}Ng74hqS+G}9!--d+JJkj<vsqD@-F> -0K<c0W~5=*3=ZK%OP#6#s2qu9y6R7lCquMu7NnxJkFf=YsTBA-is{Tc5T<FEE9TvsGC;Ejj7A7RT+Pu -+2On{OO>~}u8bSnc2(Zib=eP;_0^TGu4c0>f=;twkAwbR<*I7S<1a=Puj{Inx>Ai@pVw8z%MSq6?fCA -)ho4{fGe5&jLSvWl;Jq;LSGGB3Cf}*OvP;!nt_~4$Ki0X#f&Z0dr`|M8-6Z0zynC<O=4ikE+|+l+O9J -ytbzRlBm4$YY`L(=KCN=sl-PbqpscXtoZ(yb|${hh?zt-AqYSjOA%Cw$2^!2T3cXeUxny%F)g6e5Oa2 -X7Q^9`ct!N8Z<Y?fuREJ3g<@o|nUdMhiyu$d=fPGkh%5BNPpfCzd133h`pVW$;odZpSQ;iGC6SystC= -*#(Rc6s?@_QRXM|Lv#uf4PLUi}|$zAi7itGFQO!=nGJ5=!?woJA9sr!Oz^7GP_ZY0VxDavqBS^I13VP -)m=M>^Ph-UWhqDs0*=0|n?lIus@sE#8PV<}s%=*mVxt65c%utdh_;3q_>StaXAUGnw+5i$m`Oz4(2A} -qR8t;-df~Ooq~gO)gT@%q8HNUvrfs?$OoyQYD(Ng^UZ}D#$Qq)Q_`^B~)QBen_W6ljZQ6-p6e$nus`b -OI-mALvGl=!JtR;Q;z>|J8>W5Y)TFq+W@q!h(g||V2>Ss1(onKE)n7V6nmC2%Llra;y2l_Ca3e{tB&T -7kOu2-JXRIEEEHd<Ah+UqpSGRd^E%9W_M0wz<?_18R)ykpaT$;O9!gLw~hFYk>0O-)E|rz9wsC87Yn` ->Bj<k!Q%(3qd1z=5W=0a101dwOP$Bj#rc#oDC4PDAkQB#R70T2Yo-ZXwvTM4SGNNf|LT6&d){L9ZF?_ -;}N=vfyc*7W02dZ)Ck<Gj|GZxVz_t<gQ_{eTwn-j=Swg;B@j+Qn25ZDEfW?9z>L^h1NK%+c9|j^bQpP -OTJW5(R<JP|VRqyvbd{G~p=h_YU0uO9uy$N6(Zu(<()(_o&d{a)0HdogHl`lQ#oVp{S^{qX^vnvi6&d -`JUD?u9RX2NCg03_R(p4lc5jH$H#XMgU$Ii~q=>OM^lC27yjsTNK=}Naz*o`C_z)m*cm}u{-JO^iqt_ -|4t{@d5$<^O#Brv&8F?udBii;z_zP=er9ft}K*3or{+8Qtm|l@cTnOrwC~Dq%iRQh+S)Niqy}L#w>3= -y2<Z2@+C(qLUTJcSl7kzTb*t-HBUmb|mhd1U=#7HfkqtH29&!d3b^)%T_fNvL}ZaC^w+IxO2TGIaEFu -Sg$QdmSAg=l!Cdx>|+zE9_t%G0F@KBJ5`P8K(EiS!79@RW#iSMhj*(jlh<p912KBNMpnZYQsP+G2*dV -xP$Ix^2;7n|&>Bz3t3VGfN_`E!ZSyPWt&5bDjXBF9y&-Y*atN^)9>UhoD<If(O$D|VS}dOdvIVw~-Ab -TwXrdfC83>-U6vEn2r1?+8rAF6$tHi!*QObz4CoX}&eys@n0dz_?h8>e5Yc)ha#f6LWaM8!P4b-2=zz -1V#S>J-K4t7ukkJj@@zuICC8U<>EHbs`vBMuRoG@(-L*ML=RBP#=906t;_sRiU{zkvm+mc21b2n`1Wx -0w5AFdxN-`M_nLd%e(G2f{H3k#ID?)F(`Ls=5{L>Pq>2A?>tk<*{3Y6RB?1-Ym{T28cL55e9pCWUHY# -<v3wZu|isCq+qNz9;oqRz~pr?AH+iz9grSwnIzK-KZbzxvZD_`^d!EO2X+g$kdYdfb)rGom=eXa3-)G -sJ`_mCfD#LXI&Pu)r3Q^?-U@JgeT;%kr6E5=u4SIh)1hu4L!C%c^e-Tc2@27-%*B5RD^0iIP#-WX^|b -wkBNuyAWEMCrdzb;AWenm%)k)w?dXxxhM5^~>sSS;hO7b!khgZyL-J_L=FQURYvJ3JjES^4fL3Bp>MC -c3IH|^yCJ(7)ls9t^Su+EF(t%<UH%1pG092;)M@I%Dkf=avPhQp`}9I8l=&O#a8sDfa<k@-#pr5gD$; -~W`;cG8jnb3<x%bms%?t-gYCzCdVKWxW9kjsin8l{LC5G{ne`Mr+nWm*}RmVQd7B{?0ktu5AzVr7!rg -rfsz>7blXK#JTPB!~-z@DujQ|X2?R8q%!v)IMFMJ&!1=<5d0Yj_<;3`xELSgUXVuCx14FpW~0G1fiP@ -PF_0kW()uePllmPXe|4Z#p^^DDh?2l~V;=-U1`SD1oSjtNKBH-G2=BW61{4K!V*~<IB~U2kQm;arT-v -M;MoT4aTx5&k#tiE)=gZ;IHj?;*zvBTs#ih;Uen7W+P9#u7gUd1k!W<xJVUQVIK?Yg%z|`HL)VYT9<5 -U0f4>DX!7tx+w-v%j7QE0M-QqTs~I{1BUz*+JZD%4%SZOIAL+Ldu}*C>q@WZj#HvB<r-lY4N*%jK+x_ -{}%pxNZVyWvEBJ%vLYXqvg2JZgGvE#r&^tK47p$eO*3#c2(C`5Zdy3|7`y6Y~D*<em;Ps+|~8e;iak; -ZZDDMr(eu^JE0F;x`wWqYM%@e+cwJ<MwQ#dtM%&nmx<Go6>dqyl>CFx6<cXK0Bk{d^l&&G1LRmY7>qZ -uNv)<Em|n=^mexH#V33E}s0_X0s+9Xp0kLH%4ryM(aGx*X&l74+qT7b#$~UmAOQc+hA`AoswzWV7DLe -&`>KoNGn#){UTSR0|I@;-pc=JR684kHjJ5U8+r)sRo0?FDCj-%1)yFk9`F3+$|;7>QQv_qQ!4vQR|ol -Do53GW&Fx3V-8?HhH`NR4TEg%P_2tROrI-y|L)Mmqz{Ds@XLU{Pao6Dpq*YCw<bdD8FzQx{zDr!VdSZ -11jyerY4o$$`HQ4{-;BO7zf>CK<R&n~=l})6{Dl6x{3e09(lMAop->RBV}s-?5w<LG0m$Jy+klvE}lf -Y&Yzv%Dm+i#X4`;8|JEUl-mKJ$c3&Io1<7FwB<UmX4lkSM;rmKc90c9*<05kz9)j9vQSmg*I(9F3aI! -oB6I6V|3=pY>7?YWp`fq0$D%&+f1kpPcffGOW?XO$7p+eDw8+v}=U<gTYIn7ZYWy8YP63ri$Sol=@F| -H8o=$d204r|xAP^X6>qh4`xpb+7ZznlpKxai)OCFl7h`<{<9mT3C6@SB43*@%1e*WIIec)J`qfy$-98 -2lgzk%2qg;y|zmrztE_bvFj?YYmX$$ow>r(G44kWd1?Vhw5C-O6R65g<DI7LN`uOqQcaF?rza=sfFxo -SrR0<A3^e*faDVihba~%Z8f!W`Ah0iHQAK%oic2WD`Sy6;Py5t4QrB#Y64DC>3}OvgTV2lUTLM?G`ua ->S9~!t6dvjq9kI|wOqOM>o+Q(@Pb=JTP&l{R7-W*;Cy)Q-MpuH;0KUbE;s1eW-|>I;)*4h2x~^Dhxa+ -^zbb6hJ?NoPyF)=COKn6PxLuqlUyD^fWy$1giBF)}kk7za;mhlwi`W_0RmY$8sq{9!4PCEOcW_TIo$o -!`z~}E(a|IameN2}g&kaBsJEHZvhjb$wO=gSa4>EM>h(NF#IC!d&f&C#u*cA$myU#YQIifltvj_G};e -C9^yEuDSbC=s3RIaxgK%YhSHtBIQVnY^iZ4rDvKeavTD_Xw+{(-e_NCZkMCW0<_SAz>}YH*!A$8{eQ@ -%5MYphYh5lZAbHS>NNt4<n~Ej74O0cJC0wd(71BU`w682KhG(ad15nSm0FFv+uAO*>b%cwaEk1qw671 -Y8_-fe33@msjF$@&(tM^zixCUa>CcSy!t_D$N2~~!d&C2Zk!Ge5gBDAZnG-@25?S@^dW_Cpcd}KI5mE -}uJpiISx$reW1M)O@cJfTpgrz%km&R+5VsO3JF=RDuTSt6V-s8v@x2V>Kd*vYAoRYZOw{^~^)KmfkK) -9?4=3DUomMJx<Uth0>;Bm5Ji!PtPUJw5$R8E8qG+|3ZN7t&2@*j}CF?`b;bAaQ4uJEv!iia)4qP5EdK -Dsw?#^-gJX)(cWtqyY`lM+#!09dD6;X$1fC#r-mFv+8tTm(E58Gq3oTALcVs@%ij{bz3KFOe<41GiaI -<m5eww~c19kV}KKQNh$o;Fd)L#%ber$=X2mwK;D*<gyW#6sg_yKbu38)sE<a>L=ZFJ8fOvmz2NgIlMt -?(}VYFuduai($LW276JO`q{n`25tJh?&DN;=JSMcMNWrfI8hQR?00o*eU9FSB%;Y852BpP*1VjM75zI -3t0hV7|Asu3ji(ZsOBMd4U^~<z_lj)+|IQy3H7IxQ(jaf|(y-+LU#-qRz6TeoVwAo4zRoz!V^wxtv=i -F<7PkS%gUcFlCVlITas%%2pQ_&ng_V<-*w=;L9#6J1QJ0yG#tIx!@RE2{9l2F#lb9Z*08?({+XSZG`d -hwG$hOAzm58ki!pA04oWXD!^7G*qMz8IjffE%r#(c&YD0A!F)$=$a05H3Hs?Fkl+U7Vt!TM2-sG$q*$ -sOEE6hA0_OL`jY0ldR#QkCWeijx=sQ;E8vWepd5MF%^?fNZs!yJFU1L+GRGfAyj1s3jk@;3J=n@5rQa -ZMYL2ZhTFb+S9#fBNenSweqGm=7NH!Lj@nE>YS9Fk}0DqblKipU385O(%6OyN*m6pGG4DE3$r&;Zq8p -P`2^lRj0S(x<vVt&5)zmLxWoe_?X73_XWlQl+gqT}_8E2i*{&1Mm@uW!bDco~e|`ILZr|k@eDK>Be%$ -yDmpP$KOoNs6&r;lFet3cBK)5xZ90_(HZnIHFLN`jmOAT%&q`n7thPCwBu$gBL5W$tb>2dnDi1eHkyW -cjpxCeo_n>3J)cHjaFWG-c;Z9!0aXVsa#HiO6fHXE&u{U8!QS~A3zEZ#v48^M>|f%3~nl@g!wiC^CT$ -ic|L#5dpfVs0O@FCqugFNoUC_`dMJU%Y&th)dhp`BVB;`c>TewxmN9+;#?~`0~q_F+KL4U?u39GD<<| -<<trkiJ$to*Ulr3Y2)hbg<X^IGw4z4*MX$jl#EDMt>4wVME4<}coZ`{IQuEp6(m`BN3s|=T4uw_eMkg -3>lLb7pqU&=qCZWDPb8M|QPlRzz!Nx3CyFCn@;KdLb7%H`@&uiB2kwgp0iGM^-`0z>_g>k=7e-us1Ha -D(F(*)|0dnLGh9)@L)|;Vw;t~Ai!y>pO9X#;(GrlVYk^PF!pWaG3pC0U4b03>yPx$Tuf<uEBEd+`S$g -Qs2OYVdlwKVbir+4q(y#C;n8%>ZOzoJFPZz1?a9}pZrO@)OnuCZ(6B%agn@&3^}j_4&6^&~1p&b`&3F -z1@jKxx}w<{>yJPAYmB>{}OGB7mFw^u$piINC`uUEv$2zNFx%GMtL`Fo*-s9BUA~2S<P?<k$FU2?}=G -WudwU`A3NLuw(~Yt5)as%8n-71CD+bzG`q!6<pAcG{wD%K(#8VxBT+?i?2toGM;06CdPdJi;fo$?Zy8 -#x=QQjYU)J>?;X6ycpjhe^4>Gd{f9JPJ-E9C5kt;&>e0v~iZ2IGMkXGJ^s0aFTaj^g9I5>M4@$yN5rm -20<Z;$Ih#LJ`j8R`8JK)zBdM>^Y9*(O~{c29j9$mBgeHg-nKCe|@pC0xrM{&@};qkW%yu;xhUL-_k(< -+EGhf*T*Fw<l#LkvP#E+<@Y(w1=YX3mBIneJ}Je|#6=6`T@eimQP`@Ka7P+>-t~IFaA~>4A;)<)eLH? -bFrxjMF=^QKB0S2NZM%3{Zg&N@)GLf8!K!$iF~xMsY&b|I?SF(RH|$=44`en!-uMMg}tV=;i)?&L4ER -7n`l9f&q(;A9x&Q<ns)q{gF0=P1DecohrT+WFAh3`HmEy#2`pW(U$IdlOAYrGw&5Wq@d#CyE=FbYJsH -UC$6nSxMAOPbL792geq~mUbVaMZ%}`q^J(*?m_L2?bRHO3rCNxqqtZ6z@yL16NUToojF0p0T#0HohC4 -@jPq;Ph4h7Wji_v>Qt1WKbAJHvwEfNeTi_7!rK1kB{A%@+D^xkGbNby4@@e}c_&6YHXGWwG%bRw_;(j -XQ--_5&+LC#mj!0i2)%i7{B@mrhMLc*u!kV{fNtXowc2T)ua8eciGJn`xkA>k7xzJpDtWEhlx{*PY5P -C^{9CVLJO78u&z=XjCH{=%qe^u-D4RQyNS3*VApx!E(Lw6qWLtDu4L|4>T<1QY-O00;n48F5U?G33OP -2LJ#%7XSbr0001RX>c!Jc4cm4Z*nhna%^mAVlyvtWpQ<7b963ndBs@YZ`(K$e)nHN<Q`;aRrTTC3>b$ -X&0PX)nqce2JrspaTU5-AB<d(Cj<?AE?e`5yQIh3!TeR2}f=H%@!}<Bmj54hXwpwM4X|!0am@F!#4da -_y<&6<5_j@wQh%U)wE-F=<mQ0jem5No-<VIFpn^mTCk#fU5eZ{wr{6W-7EuWJ@J>jX*c`i42qifN!!J -6YVnM_tIp63u`!9GU6i2pUBHn+m;R9Z)$@Oqo`x@N-{Q?>a`Y|U&wVYtrD&g}hCl~1CSU@TZ6pJmA)9 -JBjH&GtJ*r{|&&CDdi}0=(vHNTMoHu32GO$E<F)JIjvOY;HHt*MB%2{+Vo5S>j-+%1Ws`xn3^sFT>J3 -me!1ysog%>OFIf)!a6!3(p&euP9~QAUaKdWLeP!a@h1t%N&136%JPA2RZ*ytnL`Bvl`%S)X=f8Jc^yt -p#nv*~@8ou8_t2J>I+G$#ogay_QLL$jm*GQ&t(n}yA&1y4c{3$``^pCZlv*=cTN!InT2`LKni{UQ2SF -+=EF-ruWpInx3HIwRKeH*>n(X|at7XituP)xj?A_JRSIete^2O6PDm{GP@#n<ioa{osTH7==F$%%Wz< -s~pzo8g^6GGM*Imk{T+~0kG0{6etzl-JN^(*2Bk-b-Wd0==*d+v#uG;A;PoaIVAvZf;WTsT&hR+X0Ah -|YT?88_s4@*-2EXjS4HBp)+-6~Y6a#<`AJPiZgeO(~7!x%^#d2HiP!30=><9(IN81W)ZE^VhXoAl9<n -=1nRfyMb9Cf9sBzHDxZ4!U~7#mIwKTJxJthU?!fcTyCYw4@pRC`_PNIRjbSbZa349kqeh7W)WhDZWKj -yzq?=F+`a!0eVR>tQe;3q2`yKvX)W?BZbezVhuLPGQuH!u#ask|;kM5&9WRd?o>dDTSdAHlmSs9TA`T -}6jgP=|vD6JVb>O;DO__3icxC_j`Qv^zXY3#BVpAK<w<eHiE)fs!mAPplPo&ecOOJ)(+4!Ux;wp}IQ1 -4OlY;@${I)g{0W@=xubpX;9Nt3gl<$W-mvX;x!Q}%*>p6QD846?L%PuDFX8el$5;A3dFF=><HR1T>ua -9gjPG*Dv0YoLX4Xt7>9k+F_6OMS}FwcH`4@y7wtz3OABu@$*VqDc*-6Qf*kNXZNM)ljCQ9yC1fQXoS@ -n}ppMw&f)%fjy2etDqWOOVe<wG)O9ddoEaQ2r8&v5R`kQpi5OmM~Rt2W0sPS2mln)uJ$M&kYT?QB|{N -ImLk|(2?VqSX5OABN<jR|I}6ZVz#?}9jN?q8_T;G?3;D69l9N96)?BoK)l`+x(^=;PnYA>qluh3gkTD -;`vKDB6Jn>ks>8S{Hw{aGJ;cCO#-@j?^Ao#lo$!qb|nvfTMlq%n)%aJn2u+X>sHzCBAWccCW(F2FBnF -zdy0(+8x2*}*5$!)nmZq#y#b4NW-%!JvV&Hw~>TZX`yR3FAbSFQTRt4k2zz2>k32tG&tZ8UGUy^QFPV -(96`bmTNIj5EYg2GFvf7A*Q##D41f`>7-CZSTixTSN!$K0j~8cs){VWdE>G`R+peH^&`W<Ld+OxLNga -7dZZxs=<1F(k75$3U_cU&SE;dJT4OLw9^ib$*U9N+6$XfVe->pU#p5Aa>dir)f?5;P=`X(O~US|wcMl -QIW0{R!m&HE<r;QGV2}RO*4MYsZ%*|6(eTvHVz*&n2u+1;q}uvz>nj<<w(Kwr>NmCQ(nK|U#A{XZO@8 -P)P@V}tn9(?ZqUL&MBMa&yluFn&s_2u@c3dd<fo;I%vGsSyNIsM}GgNe^_1#5dc0KVwprE4dpaIhN4L -t8hT^I+bV|f&Zw@*B8sQ1v|U9*e#?*c1&OA49>Eo8zjSoq<Zq$&L_!7XMK0x`S2xxKRHoH0iRTj^mO1 -QKG=%9pTzQ&aKGsaKuPCxevqqaVO-l&Mjs6p%04a2<{FILeTjBqB(rL`u(zc{Vgrc<0;s+rNrtCwRaU -dEkL_dOR%Hbp$gMY@SYMr?`;9X^+kCmd!?%fsJ1aT>h*gN3!4#;_YvhcsMC{smL+@$bq)q8)w=h%e@? -72mFY<wF9p8f6OZTZKGQuc5F({&7?-63?i(blr|=2eaEv+Lp?Qp5WxuJz++=EP8M?e*nK?#r;S$o8Wo -@y>zIgy>&sEb)@xrP5acwE)(t^`NG-Cl=+c?s%@VGNd^NGNdEkZw$CR!2S{hK|=a&1NO$B^}81w@~dV -tF4xHZyV6|5~MK8FH7_r<0Mi%_$oj~Ok>AAPVO&=<!{yX?2j+exAuuW5AdmzQyw>nHtR+L3&IdHK^u1 -IrQFA|hbyYVCX!(QXDN?_FuF^z>wYoV7LbK^bO&&3&TT0CIr`_Wa1AwL3Jn_EaUA(auo^`sxyf-JX!g -g>Nh%F^t=yva%4jc>N2jZ>8ek=*8G^v%wkTVd2$NM-5y2H3e~~bL-QO&QhPimL6WAX`TMbhQJ`#<^$< -o#!=JT-L|TJVK$=uVlVqm&FKFDP)h>@6aWAK2mnzTaZEo-f??Pg004Jc0018V003}la4%nWWo~3|axZ -mqY;0*_GcR&wb8v5Nb7d}YdCfd)bK}O5-}NizsB)29Q?OR+b8?E6#MWwK<?P+9m2#Vu<03(FNR9;p3? -8DH5BJ-zAM*r;kbLJ$ndS0|z)VkfPfx#xtFqXN>2%f9O(~~Sp|-oCtVKGnima*Sl)s;>aM+^AYxz^1s -ks@ZpKQ}SUCZ)BKm8|+Fn_DU{FN2!waV8Fswx%_vNm99wUtE!t5)KUUflD8*jQPXMd?P~;MWr#m`oQ% -mdQn}io7!8zq!AE|BXzSvV5%;8e$@UTF6~6Y;+>v^L4R2ye;Z)>Usw>To>D2TB~^`C*pls)CGX2^(Nx -ATog;GzkC4j8e@J!us+CY2Mb7mcfD!y2f3Vx+k62qGg(WVgWn(1Of4C|ld;Bbmo6TFpH)(+pA3FgT>| -r_^<gI~q<)@OlAle)T;*wbpm%`i-(E$)B-`RqT4Faq-*k~FnG?@9Os<{=dzv#3eHPvrj!neZu=L&Cx6 -FB-)6^<UN=>ktrmE=*mnkYF9ln_X)4G^$faH@CkO^^RBqLeN`dj!@mZRx3Pq!eB<CBw<MV3|-FnpDzw -Pe1RqhkIe;5fcKAyzNt3S?O2s-8|qmCRP~Lg){EO{ObVR`s+l53t;Q*~r%GWm>23#$)7Y+!_Ka!Uz=Y -WGQhMftm^)!axrPAR(>mQll{uNQQ?@DdCvqLXR3*$a<iI<d)EY5JL};T8X@<>8X3@t$;61+M`>nh)%R -9c~p*Q@sk+OKE2|l%&QJq2SqM{e?8#+S!xwb3_-?s^-Y>p^2j*7y>E+LMw#U;W#6-k;0-686C&{(1fC -F_GkW&jSAU&;{QCC(F62Omk?lQdNeB}e!dQVgXITVJmn-I&{pp`-_rE=3M+trTh4@soiT$-6ni#K-oQ -D%aAMlzkHOsc}f4v|qhTp{1l^CvptHTaKKCd+u`b|sOIW35q*w~ekDw5lGsEqZBgTa9Q#X;8kkcm!JF -3W_M_!_LjJ}sBk*}|GPQ5VJt48ujl9L#dPk-{qX*=!C*ayA2nPVlk<Y}Znx`BE?!mZHedmU4?v_8Xbg -^w|t~2D5f$v6E$efaxM#Ea=Q7LfmgOIHnU{W>q0P6!)s$5UBTudIPqps$l`3LjckxXl+3J5*U6tQ^kx -R!IuUtH{!8Ka{;I<fF2;Wl)&62TD}zMN|!0ZXK5FT@zsuvC|2+_tqI_&1aaFJ<%8zr%};fiid~A2Ygt -xe1&+yFZqi3pG$n}|iVGT9fU5bM_}tY;>ylvLU}WZ$*3N4uFSjeQS(9KRfL`1P;7gVvReCniwQSHWKo -Y<~XvmT$!9u)GJ?p?ZliOWgp<M7_QSIbHt<*y3S!ck_VhQUE*%!fG7aQ_pDhqIwsRyaWpY~z6WXT?mE -#B3G+U>LemFb=ip?%r-8d(87us}#lQK~hnIqO_Faz3)~sg^|V%M=zYQO4F1&IQQ=xiM*cmn=XQ5pZQ{ -AR74aD06b5fJ-W0WDT$hcgUbb^01WiW-WG2xdS(-O2jS9bpT;_xmSQxlOw4iX`l>BB`ZhJJ#9ZdG{?H -472(X(;*yTe<?O$kG6ND`8K(>^N%8^zKXamtpFPMwE^6e3h3g*;xRoIuG6zByR$iu=%-8kCp>@OWjbs -RZFBTiQctE#~ylSo5V7d7Llxq11JFsm4?QL2wHWn7R!;QpKcdf<jTL#9GH9@Va&r~Ab8SYI$aFB^)rW -30R>5uDoZ|`s3-cMiOT)%sL^WhFG)b}iq6DN&7u)}`y`u4-k_5Jkj{;T`H+}+UFSLZJ$;??;D{_hq3? ->G3r-~MpKC{E~5UJU`dJ`7iAUni)p>ZZCnp9rA5f+LB4g7T^0FB;J?(&X|lY8=<n3|D+g!(+@3yHGj@ -L?g5-icJ6MJpN;-XsOfV;{tI-4$#EN&=i#7rdZMx<3rFXUct%3qnv^|9%&{`T4CBa;%w=muqkadBQyW -lM<#^8&7v(2pLYm-RQe-)sW%PY>c7I*ypiyh|7ZioeI&s6NBA<_L>Lr4XfMNu|H^Dg_&UBXFgpIC<Iu -Ca(RP&iCE1$jo7FD<yd!uptn;h`YdSyF5<|rl!-exeZU_go6P^I!vxyiT35UlqK{B-9KW!f1seo7bPw -R~r7GHTMCO~kLR^*~GQbQzS7{!2i7OsCPzAC{uq0KYec)@9dv#LI1q!hv5$g34>kuko12$9qiI>Cs03 -0uFa+xrEsHvlxznLZsDjgN+AMQ84TuHiVziaj}|4*S<dK14@n0j>`szmu@f;O7C_3v{@Us1%$vQ2Drp -H5%uosutkF;Vb1t-7JN2K7ucFfOexX*;7OmeKbNjslZs*qrqe_9{c++(2N-1Pzx@y5sqP$6!6JGmu?G -wvoU8tM_g$6JxJ^p>@kvJqFgcy{B{&7#j(HA?aHW3Op|C;Pb@?MNqo9mc7Pb^0(%_ZBko2~Ek`ZG5q| -aJDU57Nxl|>H`ZOyRDGGc$_A^lje(p9!lPyt*%`~B-fD&VjKRB{4*&V1Zk@5BB;3k-LbjAzG26$_rGI -fJmDjGlJrQ&LoQL|tY2t82PF<@D>0cZvWaQumMig;!oLx2`dqO5=^zEx2=lI-{x$CEI@IW$-eJ<-vF` -Ka4X0}%lmMBCZfs~`_Vs;(%#Cr+!yu!^Zl_<vKorF;<W{8^wsIp=^c|7Ze27sW#W&_?`JyusKCL)XHE -t{fA}w9FLfMD6y9^W<~dSN%NcY)Ryx1i^l&m+h?8?)V%!R*Mu|-oPCjAEVJRqfKdmN!!fe)LLd)-x+* -2$GCv>N8W7bz!=b6WK<yv$ubPo(D%modyr)TQT8e=6Y*Vo0DZhd>w>|MGY&8?-4;zw!LZRhzBhk~O6_ -ts^J6CB2%j8U+k#7BNz%w1F<LZ6GFeZA%fpT1$0}e?;4OF#xvzNHDQ~IYBiaj#3@}we=%$rEha+frf_ -w^v^ed4*rYghaK^#}>eszzt38Hz3f2aYho(J(M9!)$dB+tIV3MKKB(kBi@ik?@18y^q|Ys0z&`QSAsM -ZjXuWeXPQH>n;uKcbgQcmd`fK+dv?4kJdsI#)o66fEzAz=G7#TmmO01#9FD<igfrl3-p|tdo6OqBR{2 -J{WvTM;}l%hv2y#B_f*!0VMx3xHrzsjdlrur?sXH{*ynE>}3bs@VQzp!9(eR29p2b&9(T=#jA6Gvk<S -6SIGqg`0KnN!}arU(`+QyufQxBrp6q}uooTdFZ<w`og0i}O3UeA{KzaSb)k?&6Vj&v3rM*W8%(+gl+L -!vY6YU#N)J>hei3+>5z-m6RG^r^%xEqkG8c77(i(j!K8M)-^NX?G=L}ssnO6<4mZX!8col($nhGRc`x -7d!EA6<ZR5Z&96k&!j138*`9DLagp-&C02J3evXNszHD}y`+K4kI`jN<BG(g9{zh^nO?eGj;eU?e-p@ -CP!FhiC_RI2n$A7<a(%u8%advG~1s+1+CNaC#*uR*nX(T`_s)rQ7l2;@SQTnw;`LDE^v9qfe^wKzyPJ -=^}5nt42TB6}wS5OqX!}3jyAAOE>|PPHm{0RB$ZADPM~7II}{Ko(pr08N<^0j+8a5Y0t==DV3i&fVcq -6T(O07gQ4xjWG3|q#?-Zj16Fx3{ma|`eEaU>TgUOvakc3Uloro5bu4>=T^7K3Kon;AhzO&rDn23=#R5 -7eq}*uA5wFKe=NykN&OgV*+UH|*Nnf6yi!V(g1~`2I-)RNkic@9fo13p*4?{dH|Ia(FvY+>Go`Naf^a -VDuK5KS#JZ+i;BYib*YDsRjM17r>hqx<n3c^s!%TDrKI~dF>)P1<wX9~EOSKx>|VxA6`GD_BicW2e@g -?(z$I~IDM>+wWDZ{1!)F6blcigXq-;Y~Z+8Vg5VnkguqwPE@dLLTE4_1ekLiCAS#wK2es>>}6GXcwu< -uuG{bjiv^O+7$>%Va1f8@j!+c-`36{({*bvp=UiegIiZ==sIjL>UeovpVHCoJKcTaD%4}NM=hoGOUeX -(*c5o}FQX1U$2_+7DwpCD&}&#=>>7#zx~~Ai6`)j|pgCyMGZ8ZMo&!Pf%97o3m*xGZhWWwVQ8(0fT@@ -sj;qV^y@dgKKf5U9BNtP5j$Qzw}3eMEZAH`MDx<R3|(B=~Nk?TdV)!Iilq<G$}`h;x`8z1u+aoVS?X+ -(d7O#nj&zODW+%Q+I)=>koDKj*G-2>4oi2$ddXCU#u>b^TitQx=59&rD>YQvnvrBN*2d9JmQayJVdlM -6VSL-7<83GnqcHUVyEzKsIW<(R0$BN*vYi5Fb@fOzOoHkWIS7L`swu#iU7;(gn=TrwGWVZ;$Jls55?0 -GFzSmkF~N0n(AU+{F~dqes^;zZkLkO-(C)}uKpm~rA=V0sgSpu-tZttAlH=p12H~8be$JWrr4(k1P#g -u%qYg9RDY#ftrnTC)61Htz3j*(qb7pOQ$vbzv8NDDS5qf`c<nL8Z)1xn&X6&cCIoyK36WZ9DBz3<*^L -?l+<Gq|YBXT0KXgFC;iS5Nz>E+lIxVI{l0HSL&ygHoavpkxzQAJyJI0Wr8s}_nu(+L*R{asns{jps3f -xjaf2%4RdN0@Ab}0sl6DDv9u*{u477+bZdytD_k5hp*F0@wNEwbBm^8dbjqgGR**9{sogC4K6JXfux$ -T5Kn8b3$FYwui_#e>Yjij_k!Ofs}Yyx=V+T%C%+b5L)}Vh;%Kt=q>erh`GsYu5tO<i@*H*&#$TP#QsB -W3=~+5Q2r5ie!Z=94NR1Cp!>Uxn#Rbh>8>iy=cl79H-twgmi}4;T7KoFDbMI_&5bkAhn8;?6SDx^L3$ -fA`Nzy##Bt2AGQT&G6@3elN?ZoIUMM-%5Q096^r?`24D8*Y>(0-b<X%nJu)~Ult<(4iGkP(Ub)VU7Qc -*JKpB%}wNeYyi$V}1;J|d1U_Qxd0$y=pWs^RlR@)Tlimcj9Vtxi~BMx3&6g_M?R!j)_;mJ{y5k_JOzo -5CM^gGnJBZtKYw%$8ko#ZBYD9^Ug{X6Y>_uY+E6(ckncNw6I241CR>{oEorH*ydZLNDQS~WY}xDiww$ -Z0qhz^bjv(h`Z(>H1iw6KCz&C+B{<eIe52QX!X8R}ptTZ<pBF7oawq5m#oj0J+)BbC`5r5fB%0<{LP) -+h(!x1hLjKjff>E3nsC+Wa=sStV|PG=;+Et$~r?V3t6GU+k#(*>BWj18$u9ip^U!`*w{^9HCYybv-{e -iqc6U&Ep?QWH@R{b)tEA`>!I^qPW*I(Go2yqA`)=C5045DJ!=(R#-TW<Lf%_liOET%y2<LcvUJmcDXN -xc!!TiEzce`@nH_M4R?0S5Ca%@fd=&Me0mJd69f}5gtGw1-qe;7M6!#4XRCxnFO;J9yOAhG@y)*2=gm -qy)9j5VY#+&NnF?t93u;es9EIgZmJi4}4^T7(iIC`YKBEO3mElr(7fX<(EyW@lIpGZ$ov=kW!*DlnCv -2eR9B<TM(59!$RDq)Z|?qoWEUvV_>11`cH74UE0+2cnMg;8n!X^_=U?_6hCo2J0)!B0GK8=Q@!*9D?D -0LIbWInw`cSK{2ZVNhc^lKwtR>s3*1&rH|srTDs8uMehqjFPt8#~gQ}+4grLNouDChmz1#l|6@X7<~Z -)O<uwgO<BM0@ziUR@EQJ_=<7jKHlx!cz|ss^bbu{RNPnY`F$u`j5xeuOs0erj+-q=jsb>B1-zVbY{N; -rhAu^YreKv2_Rl=~6qFjFlflMP`esS?1za7KkN5F9lHfj#=lNK?KV(t$VBIVdoHF2<d6dWj)a*LBJ^A -IpVpoVK)Aikegpp26f8}y`Pn~%{0NBaG&Q_|^7(&6RkoP({1W8#Q4VxmJujv{MMOoU6(EvThnc?4aC$ -BKI)OBRc{zJ_31{8gsvLn1z+<KF`Yyb;V(am$#{jYZn9qpRPpbjSCSVNrl*`=2Yk7qB(nF-rv&x=ABK -&{&k%`O^cgUGOcDY0Y{Q$z_<2DXjT8k0Q+tllX>)na}RMmRM8er&KYE-?@rQ&C!yuU7|DP%wMFNa1Ha -1qvvGwPujTlI6IDX-TD^ZhKnY1dG|fH`{KommtREv?jtVtSLQlFQQA8OSQleI3vHQhph#dSik80RkQE -SoG~m)Wf7AFP+_pm@+8pyrw1GNR7N{{;h9CsqV-W1>=;)X5!ZCdJNJSzvOR+>2>S6-K#TLwF*E;9LAq -IxBwlY^$t`mcN@<jsyi<kDs4|))opF}&zeX`!|LR=<sMhJ07Z~I_62@%r(T8;xTel~XWSLEBrB+Q&p) -3s_9ebwyn#%(p#Z|I~~ZI=y&k=h@W*R^J*pqJB;_Eu-;k(4t5wXeGF*M5U;H`yNVMzB?L5wO0JFfQ2D -GZ5@1QKD)w#NO$FKhg~vKBQJL;BlL3lQ%Mf@^w~C1jyKn7xqr`!~Td~_>+2+SYfmmbYhYBOqh;#IQ-> -oHZcby^^SANi%}WR05g|;Y<L<%)xnNq%m=HZy^CvTs&p|_XF-A+Q}!kqmK#%Sd<nya*{plXq{N6n#tw -HYqfEBdx^qeSXI~D1dGG)Biv4c(HD7gh`>CrS323G*9GF)B2#T@?_u|=blR#?heG@zXG-NRE5;Z~?62 -PhDbUvl$%pDTjbKs&-bGgJ^kA*E7^26aooI8SWXJD8o!E{aGs*GIs=@58jwxVyWzT#Bs#**H#<`PtCZ -r1dU*7u}Jeb43zEa=u0|I<4%BDB5Z!^7ToC-5C_@M+|ZEqS-v{_{oAqc;t8=e_25Uw^Q<2i2YCU8F{x -xk{U?<GUQ|H4i3@J0yh;yCo%A6vcy*Kc=qAs~|jiHu|SRr(?k3ArHsiZnp3^cIs(qXTuVAfxGGDCo|R -k8R|$=x3g;@g3n3XgwY;#WSZMVW;z^flT&WrDr&Vwd%5Q)K|T*4kLoe<J{8V(g5l3QGVnA<I4a@>m(d -_ll|TW;;grcU6=b~*$<5$NiU&M;@C3yg_i-Q1A)fa-!+1t{E`6W8d;b`|b9m6#4~!kbWzm3x=MxNvV^ -OLd*x`X!FW@$eekKQ<<Pj+#7*7d7(C=X?71;mYy{_T+i&L)YAB`&Uo;9coyrHje=eMH&wwef~i95{e! -d$fdB^N~BJ@7a&e4U54%J3168)N6;d6ZS>J<>A&{?bDD0oKAlVleC=FF1|+_kDdc*p^wDZlYEyJ`m6h -^me6Fv(8D27$=)J{|JIuuwc&*Kt@Gf>n7A)Iijq$LX{gu*<$mH2z%^lubM5@XG~8k-v1{O@h6Tf7~Kr -dmra70rT>yhOw4yfzpt>_f%7k?=4Pb5FcRK8!ryqoisBG&Rj4&)nefM|+`Yh*k+%05y~#Wae;`JO&$i -ixf7PmcJITAIc{K5&^Ze#31$AE5S|_gYv8TWEDEvpah0lk-10V6_`1|u8+(GE{4R`L2VgoTkfvI0SyL -<T5w2zxRCAh8BSYaz`5L?Va%9F_Qk*p~zUn8ik6dI!EZ}bMXCes`3ay%WsL~7A$_k;HpJIn;j{b`l1< -kS{%J>JC{>%1lD-?;PQ!Mqrgx+^NKQ(k}g_KnaLJDIy0KEjG|^5`XCvX)5Ym+g@uz1*=Jr?*on>8{y+ -a)xX6^MzLI;(65p_J2k6U&QHW5ve0jB=q-ffc=nuwjlm1X}7_Wk926_t#*G#3&gX#9eTSQ(!96HA=cy -YE6)`6)~0P&;|IAfv3g&7z7yIos-`G(tohfNm`SGdkyAkpI#*e-R*S%dxmYZAQPDI3wtpBg+C%Q#W$G -w1HxVPf;+%I8-5)EsG}DF%MmInDSK@q(pO-{s5{~^&WP}j<@f&x+BkEb9_Z6k=*4(4vL=b0#a`3Ud+b -8>tT5KXNR5Az>PW<}}bNb04b6L{~9(gf%na2GDkjJCG_NU12I*yKvkNy<K@s7BF?XAv+=e8+u?iml?u -@X_t2aJ~cJDRN%1enhp*!$3V6YA%{BZ+nxm|s(C70YPG6N&KNG?xDfYHYfJEJnM=r8kYvLppW3KD~&a -Q|zC=)@e@^sP~8W2fsa*t2Cx7)!xjB0J2vrYz+uN{+S^Iycb)w-qbG)C@k|vfPfEKp)KOB>kL~PNEha -ZeR}9ta@)JqzCzN&%p;v5f9~lE>0vcq#X|uz<vK9aT66!s{Cj?BerpBq(LDQvJTI{DNTb^mDpn_E6z} -jtW2LaFY5G{vogg%ai03d)cl<<QOimbHi8;^iJC7}HedMaF*A@FauSJBCM1$w{fgaN>$93EP08mQ<1Q -Y-O00;n48F5Si00002000000000d0001RX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#5UukY>bYEXCa -Crj&P)h>@6aWAK2mnzTaZDJ)t&@Zd0040+001Ze003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQEE -aAj_1X>MgMaCxm-ZFAc;68_F#fm5a<sw2}$^UZVWjhiT`=knsSm1J&u9hxE`i8V#21Snf~bNAbC7jFa -zN_E<5CJ_ZL7K`0y-vEzBqiC@yIoYzJtti<wY+n|XlZ@;btH?I1vo&pq*kppV9A3O-Yz>5$yB(R=>$0 -X}9^HMqdH05jd_!(&voCW>{<;xj$1l#$^NO`avX+yQoNdpu-Hyt6=LO68`R*V#tUhm>YK08Gze|%Snm -=aS9W2svSp4E5iU@pG4cii+tIFj|Qf_yw5#$<Ve6K_dXkfKkH03g}E1Fp#yAoYbosyELmMZ00T`bw7T -D4pazKkaq@-=>*1q_v@?C6*itDwv4E3%}UvMxZUl<=I^lv`G)H8KnM#S=+ED^A^Io!zSyGs0PZPsLe9 -_q2N2S`HIfM!s!e7~duh{k5fB#N)T~#du1_#;A@t$1rEHp$#P&{JX2lZ7DKQvYLN22L2Tp6r4Z1mP6@ -3S|&13e_f=KGY5PS!Q^(VO1Z`yP?1sqWDlff0(KrD*%CHD@(n|Z6>G?WwG9CQsxp^yCZrQzY#K@l+bQ -{xy5(iPjtuHp9l{^b`640zWG%_F8qGj1@+#x};;wJSJMvJ9jg>p;c2G*I<cy0mx?0g(lzRYcjox=4dD --OcmW!;;(ZrlotX|`{+=+A%U?6$J6xcHIa_o>q-}&-opq^%%RaVgd8IN(Wa7UI0LhEc<fdVwFfEBR5R -nH`=I3t^E-?KVep#hyYWiAJB%GV-6F9(P~oIBjlfcu%t9r1uGN;xu6%>($t3a$7nLI>kk-Dw=zEtph- -USbOPAiPD}Gs1T?FINYNt`)0*8SWjFDm8s~2f`+YY+K#knV2NKvfiirtSLcNly~llpSPFu^waG;z5V# -=@AJiN`r~48{qE`qazVzTY3VqMUMA#fh5RM{B-+Sb2QKoaqK_poj-IT-m7Z}9s+mg8#_lo(0E~*PDI# -Ng&*X?9)(RqF$LdwNZX2n10<Ivn1E_)hmJO@7v=+qfJBdb+Ng^44({$AeP-&W)fSWBjt6D)*^*hqT6< -e>-z4TAU&C^5H)bN5Ueo3;+@_UewC%k-2wrmei3bOE~;Wn<r*e|TCBQuRY=2ZK#rii6^&<yjYVa?S3{ -GwJ=1MjoP8!DQELv!6Q!E#nPLyK}tL0Qho?d?1HE1E<@k{cm@I0(wGJ{l4oWX;<f_47RiQxv=-;yc)f --73m_qsI(QE6OSnN-9IAh4e@o+*`LC{D>m>@1o0~8eJAy@KicVmN7a~+9g+VSngYKFa(f9KCqfbQ3Q5 -|AKKc<nu>Su2<awG>ud`!0d++Zj$Purt}+4fcdP9ZJ2ujpcL(&x=Sg{DYv_}6O!o6Nucsia@%t64Ybs --ot%)!{1nGe20>Mo&;2jDvve0r9_Fx_>$_7@dz(h3{G%E;O>ByjiJE7Ya_DKtwrNIrRD)(`SWXoS*E( -SBp)(g&@KyjBtRRoj4Q;-?T;K&a_q($FWet(C#QIh?!iVit^fPlQjZGnTARYjVt#B5ZD3DdLU9n@f5S -pC+`nljI4`>d=m2qg}Y393TS?M~`LML?JXyBY|vQ`F6>1+i3SaN;;`cM|z9_t;t)F<#8ef6H{dWwM@t --Mx5Dwsf5>(d!4MX}=EVz5Gti6Ng|PZmm_iYilhYEvyV%iC~Z$lmxr_c)hs#_~BMt;RkwPvLIx@AkP4 -W)1F0ibzq7fibl{9$RLjo1zka$FY8jIY0PQ0nvxAbl{S2aPCq3WWJ+p&?X#*Z0I_LK8&R&%FX(ImDRA -oLOX9|l)UZH0r`(2$9L;XX{EVx1a3mZAYmJU#iO5n4MxAVzj3$vQ1@r~bE)`C5u-$LD+Zp^Gi2?(-Rh -b(S`tfTNG6Sfqmj(I!o=b?UK+@kggf_}~hH0TD1B_0p!er|NAN(ziY`+$)JXA~D;Ayt$i!y>;n@Y4-# -|;KeC$iE$D-+F(k{g%<kq{$TQnGVepJRmO;=G|N2!T+0pZEL9jo4Pn$Vc$81m>vAPczA|7fmcV4kttY -11WWA*q_*UCYaP8iu@TJp?QKdC#!_y_597{r*{iC0st0hqlI^X4^!KwmJB`WM`x!{KcwQYqv{E^qKB4 -VYki|Qy@75+*60mAGkN1cc1(Z(vM9BsUS9?|vl9Y#&%j-^3@TDiaTGcMRvdJ^@?u%w4t{KFsKTC#XG9 -lZGhKNZrKO9j_w$dR79qE9zcoo9y?>ZEjYVe(X_yoWCu6f%e|M`p0JF86`KVqdHKfQfj67;ZMS<nS5d -yhvVhR5;BhP=6T0r8jCVo^jd9TA`BL5EsL)!#{yX;W0teBzA!new-Gi}}AwXv@LMu7k4zad#BwFZq^j -eb?kB$7h1zIJEBj)xUmpEP7vfJo4B(^+S7+dOGx#rk^^&K^v&M+1mIzq5}n?5$m1YnkRSP77Md)P=c( -4rMyGEi#_&fV0p1s+OWbs6NIPGVNF}Myjk?(=jF}X#Zo{OS7E-PffM>=?VZ-JK2?{ZmNR35@tooKv!S -fFn~O_!#MTg`F1H~g}M%s1nM9Z)$1zbQ)+t69%=;qDJ3mHba`TA@%034dA+W-myCvx5IL)7e^74Iqk? -SjP^+i0^YwL`jUz|xW(+h?)tJe~W-q@BY<6^G(CfeIT<P?-%(=ixO=(9^Wx=1Vrh-vb=$T$dg~ki=4I -hzjY#Mas!vZOF!n6uVPFT}9OR&@<jR)g=*AUpu<>$R_;b-JWh?P(m8W{i0$%twst(fYpWtGz9EMMqEC -CuKGxC1meP4L>+_cQWpL-Tvt>f413|Gopp#{<93n`pn3)mE&p_sfw8+<fHwsDDl12<U5vLyO-+EifZ5 -pT7+0@uM5b8IczNQ9u(^8l9nfMPyRec|);vh`pN2NHg<fo01f7pJeKq1Pf@-@ia6nhBWXI%@5D`Qw-o -}0V_~%YoQX2guJ43mjcoxat^UKEnJ{t>!hH|b{&syv>e!9eZ$Gw_vqGE!99S7oGb}UQ1uv|qQ+03Zfp -I-RM#iaH1*a~Rktm;2aW?e4b6h0cV-@j=b2Jmf1e6D%FO{U571I>SX(KdRd)e+jA)VC9mQ-iu1u9?E9 -inibxQzk9K;~Cw|Fe!basif<4G?HX(!PPt&a?O?6kjd|G?pd?;WX>f2T8g5X4wuan~>Q9fY64^^>6Fi -X6O@J)8%r*->cy9#}mYQpbH?w!%-yqc-Gpg#G0%PM=5hkD{Jo;a0Tj6#MPv9Dsz07SDuNc-lc|owEX? -NY)Cr1%J<>2Le?tTOmt`9ycr~09b6V?w0IqrSZh0#zPZ8U}}kG{?-z0CUls1tf|io^?2gPP1tS75Ym+ -1$T$q{1+9h`{3%@QXSbKmYQCb)6XiDKuHc=%zEE>dDG!>BCCA)sX6g`gsAs7d<AuS!zM_1<)A@RgN>> -+VZ37_Lt6SlG)7JO2AkgJyi3^K?Er6ypc~4V@1fxeVFX6kY6!B=<uQ$x3M1di;%ze5e>JN4HGgchaaU -#=@<sLehdkGfzuz7`dmW95hDX88#6!{OVxu2pcw=J}LJCFr0G7-Pp2%yX!FR)ix(X*-qLoj*4;$vF|9 -et}8`@7UUd%d~|O@kWoNmb16QL4cdHq~q5z3^b)Oq{?oc%q;}jX78Fj@s>gA}2>qw1Vt|rop2zRNZSl -J$0|6#xmMuZ6y*vcHy}#{)t0uL+c`t$CoKd@zB;BVapZ4*7jwtZtUFmVOThEc5OZ<x~Mfkw}r0LYKc> -URT$)wBgX{|-DB6NpeWD9h{UJVNY}ZVO^k*Mo8za<1Ew&%<Z68v(l2`eF{g|Q7vWiBa2ey6&r-{h;Am -~4PL%PsIW30@lM_kVsB7k)SNm5prs6OdknNi}y2Q%?_xDgg@Ef=o4WBV+i@Kek#mwOOL(bMUUi@h}<* -5slHh#B>W#}$zGAMj7(F|bX3AYZ~-uBEtLSwss*=C9bO&G&FtobXK0tEAYF|0U#lSE&VO$J2h|8bob# -g|fQRbg(JbH_N4-{0Z*^7?xI;qBFjd3y8d14c7>UdDK$Z@Pkm?eS~;yE?YRTKc?4{L}b$e)D;Lliq%O -v-om(Gavu#h%#K5{Q*gWyR#?A6L2}D#-qY}x14$h-Lk3<!asca{C+%Dw=WY}aj3s|`ae)h0|XQR000O -8Q5kVeE~Rmeqy+!~eh~lwCjbBdaA|NaUv_0~WN&gWb#iQMX<{=kV{dMBa%o~OZggyIaBpvHE^v9xSKn -{jHV}UIU%{maBz3A{uj`8eVK6c;4VI=w<Dw5vAjs0$<|2z4Nk#33{qMUYB}=m0bV!F`ezATW@4ox)?j -v<_ax%JJT)km&ske}8p2V8x8&(LB`79B+mV8xeNZIN$1Ih0bNI@zs<9sx_RH_8_Y%=zl0+_O`*2VPfE -D<RL8zD9s1c}(46=$W)GQN6w#%X~%OF_px`-!LFWIQ@S1ZydFEQ;2pE+s?}<GVsg&El0383vE+{m9y7 -VzVKLwb2Ij6+QuJ-{v~oHLvKpUK9k)!`F+&yPI>7=a6VF@^_eMV^YM)eY^n`DE=wfi3hx*l%gc#NX-` -<j7B3w#KIPc8%24%!#q5Emt?V0j41BMbdTWhrXz+wVub!LcSQy}jI3Ckvq6<a&K|H7^e@(AQL{`{tDT -xM?tPjIm2A-`!gVM$<=CewtdW17a~(ylf^6-xQi1eYQTZk)`u5rLSZ);lJ-@H$s)pNzOuyQkafHpVPg -3Oe!}}|Sa1cCpibU9W8EY~rq|gY~HW=j?>>UvTGNDx;Ir^zogG!23yvjZ^Zhijz_RZ|_`u3LI67_5?< -Sy2&tD<Tg6<Cf+$dpXX16mUtO+=Li7IRoS>h^5y1$)8{d1*bMUC{6mHq7*2%eXR$h6YJ5`KX8`7T>-J -RFQG*I=8ou&n5>kkmDG+2s_J`<GY|ND1!srPPE!`a@V&&wnC(=(;7Kc5w(@+jZWR4v3DSeY)h``(Jhu --ZR2~eHCB+|P}}!yX9jFRy&#f%&>e5PQfamVb`OPSqJW%LTb==v@H+|z4T8iH+K`Y2eb{-qi`oc^eIK -&P-U4SdNMTiOT<1n()}$Z?u9?H`%;X|qr>Rvlg>rVPPL<>D9kst>L2YjYTcNbyE5A3|d)Puu8j2kM`P -bpYrPKDBb4O$PD?ssLmhlI0_Qps@WEYUd3?m51|1g@+HBv>#s;a6N9r*yK1w{DK<Uo;JN+Rr}L+WSm> -8g{^Gj;=c%5vBU&8;%+Kq-{cL3%B6O3v-E>X>>U+3eIvcaTUxpb<TeuICqT7nifeJbE*~xtU$e-R|^w --myZzw_Vc&pOSCCx$}DI2X%+J&c%G;^h@WnYmvi|h1AxeU5?^Ud}9ZI+cVgv#D2;X?cyET)o$D`VYXh -F(y=ZLW(%8E+h_I~xltm2+($ogi{|kaX{=)ta~TA|owE;>x|8wP>(%@{&=zUtTEZG6<O$vhEAnQrkw# -Gqy=F;Fqh+Q$$%Hb3-|=SM)F{O2H|#;?R=}zlcV6^*k7LkrZN#BRbg(XvXsT4dG0kqHwxZ0^IzY-QuD -7^3CEGa5Am6~CU8(YQpGFUHR+>Uv{+6A&x@$z)XO8#f#SN~;fVLh*d)F|`v^Noa&D3)G3P&ZZr^A^Jg -y>i}wR|;gMIGG?jc`9CP<?+g=1BkiQ-b<S65xEu;ZtGvXKV`DZ>*^u)+5r`{@e~-{xJ%@p^zM$at@1Q -YkJ-k5680>9{44TH&m(H9wehBxYMaxO3q);uCC_S7p;^G*f}WXPSF8xph>e2i`Vn(#pQWdmJZQ9%Fd& -|{cioOKJ4k>TfN{>@aZ1<CGx(qFLZZ;rU3s-f&XuW`}pqhR3Z14Q`GW1uPYBNM)qCEei)AjI@Ga1G5T ->l84A%rJZkZk@S9bTx&%{JNrA^N=d11H><{#)n9a$(qqIk(el*Ti6Wj99l;a<$)v;oAG^)SV94SG2f? -}8~ex`7>g)V9d_?erVwrY>q*oL&F)gNCwEVM{{W}0&)($8V9L+d+qBsr+?<!~@1q+BA3a3M>yMCw55N -YQ7hIo8qR&N&_n+?+~}?hF6Mk<}#qwQs71h5-Rj)}9*Wo~<W4YAAiOgTo?tqrU-AO9KQH0000808trn -O!F$XaTgN+0Qx%s04M+e0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FK~HpaAj_Db8IefdF4B6bKAz -X-|;JU<jD|pC|I)7PA*$^s>oE$sVwP=bllYA0YP9Xq5`q#0uaq)(%;^5&h7$>2PHXkzueZ-#sqNo?0L -U-eROo>%;%SE7Z)2gznb~Sd6{KG7HlmfyV(~Tk+RnwyAVktcC6U&oU=I13t5ImEYh6CYql39+lexXoF -u;ItPt#h%XqzKh&kl4h}Ur#6dZt43+I(6_y|$5h_8b(DOeJ(WFTVzjD+(t6~#;VVPjz7hKKiYdiMv~H -03<P?Eol<q8JGZ5+Ft16A?iYN3h6gkO1ps&Xcw0IEzi36ONpySQC$coMl0HAKVeWc@ZQDkH(Jkl4bkr -jHk$y3z!Pno5Xhdd+)?M83I5k_gNwCWRPw4%-zOmye+rv)O+K7H)3lkwtzwaiabvcJdV<!27B$DXdoN -S&~e_09S4Dq>ct>1_yJ^tAZ_3g+il`-V}HgyMl2WjCE;wxof0$%JORs+gXm+)!y?(U4VU<t!9rGMY!f -`7BqUFQB7Wciu;#m3Fp~eXgq0CU@h4D37^Fs4D9Wu8OjD?#*lvRqCCT7V7H8Fpny-cck#tZJ=oU=vfw -bRa2_x7%Nu2SzOvCZ=U!_dIir#pkNDCRSyb8A$r~d#>{WvXzuc4Mo-e?lWE<+J<XT`z#Ihojs-+|F?1 -Kf(eTP$vfb<lq9F|r?IeFbt9DLMuV*m9Z21rN)-5Zm}?zFaz65tRv;I(Sr2upr$t0iuzth_{^8d%@Q% -OOQLTW3_S4${aUdE)B)Yk#;iJd#q(y$o-gp;GcL)?t4%U72sD%${o@={w3sD!Dh6_R7xT1jk6%n9p?( -7#9mtjTG|+xA6L|~AXknn<QBBHS7BoWGKpARfYpFCm;eOP$k}apN@is2jVW2?ERekRPO!o=Wg{po6pe --hLkH8}1j@lP0h$40W_cWep|97#B@=7#fjn3xxD<T*)#7sQfURbd=Q%3EidoFf!DW``x3l+CP-Ow$u= -Izp`%DMHAT2QRfJoQzT`74hy5+Q;W)PSO;|%Q}FTr5)k&&B|^MV#uTJO=(+v&yGhs%Wz6#M71n|IS&| -8h28ESC`WWDM+ZAj|WZpQrJdZHgkx$FE-T)Z4}PamJ%K@Pxd3g-@^MTta;DuYxW2XKAD@kXDBhZB()P -6dDqX4<ZUn85et>f5{RN7enU=k_<VT@2|@O#NzwLOoLS}lCt2wdUhQBUI$ta{_k{RqFMaqcPIbT{pxL -kpSMBbt$<{Vf}RO3dX;{Url`O8`qlGsdAPMf=%3eN$x%3R0q}(ZKtC5{F=8A&1~;D5cXA-LAQlGrhdt -QB?AmeAs~LO2ZXg0fh}a(I84q!rab=I>dp#TaYl!t?g<kCRxa{Lt-w;*{1)D&sPI<kV=b1b}f<eT&2O -*N<8e7cx!#5u)-6rA=Lff5r#F*4VYjEW8mkMg1I|i(ZaYdXsj_*SZ0E?QiPlKMwH5jo0|58XuB0jFK- -hXzS7Z_w9M(l!pPGv*xIq%NqKE9o>g)BM3ybm(Pw_b@Jep8hK7%ISDz~LYQN^qfq%VQ`#AV+wPZ!8S_ -E2na4!hRt^q7mKPUN5fCuP@PwA6~y1+g9(XcmDh7;@$PzQFjf5sfW|%5_(mw_!R`c#@GkmD_vL%f@rS -xPX|K^y#~la2EZCdBODA>sPC}!sY{lB`WYDQl4fu{P1);bQ1<$_Q1-f?vey-5RWj|M^U4g%N%xnI?s` -;bH23S!c;H!qAsk|zl{Zz+^z$MD!}7sstv#`TwyouSdb{wiuCJ!e&3>HT&MtnU52GgR_03{-eRX!(3x -6}6-nQUxr~mt5b~}Arr}P8s*tdOOF3x6`{_FxMAs`=dq7_y=0ehO!iaW?Pg-hGH4<mLzq^{$B#2zr~9 -u$iQ>2jMxNiszDG>%BcgGjNcfb_$mEdMK&TNHk=$?-ql&K6Vuhs*2pzs_fWpThp9zkl=nca9@ueCJ~{ -@oVqLM^8Um0D$Klk}*US1A}yV^=rp*Ai%*#9p=0{UR=UYE?wVGF~#~owgW{0>#eht^at-nde8UA5L%# -~H-U$$>MHacQ&x(wXfa)zH&7L!Z+ahJwE{d1p{w#CIDym%qK|YSx<YQasbFi#7@;)LJo0@u_iui>zL{ -R3nsi)kF7AU+GU^N6m5@H9(D`jGNns7Q+B4k@^i}*uLI?QoQ*@sUIu>(K8jnD>xW0g5^$Ec!5G9$%bg -blqbr=5qBYF*X)x`!JqEhi7H~rjk0u83=Dit1V0I@lN`WrBMglDmlVwba}RZA?f|A$(2PX#%2>@~F69 -TF&q!Xm;J9jp}`duf+glgX)fy8HvJ4IY9x!P*s}L=r)5Y=UoHeKhJbtiwFe5rhXdjZl@rw0cA9fJX2_ -N+k7{5j%pHezn+#*yD!@MC79p6+A-*eFXlf1ELIK=xHqe-J^j`&%pE@+c?iv|E&8Kv`96dfYR6l=~Ot -oe~uP%4?Q@bjHsUx?15$o*g&Ry$EA0qz4(PSlQ{8CzoVQPtOTeIo3BREjG@)QuHqC?QxD6TPldF?7nm -%C%u_VQMu<aSBd`+_fVIkpwN6YrP#YR8{LP@HYI#D>x{<Urf*(N_M8wxgzT*AaV*g61lSmsvSDqK8IY -sg+qq+Fl@;ZnfAgKacRTf>%vAJUNk_zgx1Zu>T<|_0Wd^4drmKvDIEh;a<Kn5>VjxIp4fsFKoY_F8T* -&U#$+Ec9;PnpKKt@})Zd_r#165vCb#yIc*{8Dw!5Fd8%1xGK(5yx*)t>v@%`D_McL4)G4kGvYc5j2Di -#6&0zI)O^Y#vU^jb@^&ufnB|*=zfD^Cu-CU!cd70e;NuO;(&cvTpWMTTx48{T?NY=_`2DDP=NjgP&%j -m&(dff|IBF$R@9?0gvx7t!)COiybS#KiXU6CHW>c-L4Y0Za0<8)3C{ztKN1ttr&((#;YJG7zQ<<3St% -h}K~q>^Q?lnc02mbPA7u_=4AwY!!}%6lB2k_qYB@%k;)I1-?1+q}LIibC6r!yl>1Ik5Jcu~b2>^@%Lh -RP-WlFoQn!TBq7&;&ftm7{jm_L<+mmaiL<-i+!9ydG++!}ZFz+S=fv0QQ0y5YFvc?bwW0ss1x@U#N_+ -<}xF#ic3GGH?e$9>y`W3EwhHG)iAiYh@R}u_)-M+e9enIX&%EP(-W+`_qKEZ$|9I;>O~_Q?}&}%3^)| -{Xn776ySFqJuvCy5D1`cEvO)LGtMFNfWfyS$Y032gVgRe>rul975NaOG3&7_%T;`V=PJNxD`;ip8_06 -BBGhiyH$}#=*|vlqD_#ITc6Kw%$rNzF<{2TG4y|GWVmZV`8{v^9FWPXzDrm0-YX*%_=hTZ{C?kgd6+G -O4qtonAjYc!6X2VF`h(YFJ`38rI>KGshrN~J@7Bb19-oa5_)s^cZY%S+ItVU44nPR-fx5bG){c&3ZrI -E!a<+mzrL-aJm!ZqY#(#8DjidEH!$IkNmX8ZuyM9}OTyx)zBL9UUlgB<k(&Yc2;$WScR)N<Gz5vx*{s -H#gR??5r+Hr$cwt^PDt!3{kcf7k<KT2_@_SE9HOB_0LTI=K>Hy<lq<1ta4+C>p-aiaiZby|!<E`fP7R -)r9x9RC9Dbt+COE4{0@gtv_`cw7~wtQ!ax98C>i$a5|l5s0JBg7H!z+nTf9CJybrgk=6P@<ew$gA~*; -(4ydgMRi2lYAYVXHOje-^1TcSHi`7DaCezymG6j`46?Ifof(aeNTM6Ba<Q6IRaf;3i&<CVAnQj(JN2U -R#{I*ubqq5mYDjMs6q=ha}qj!6M-OP~XV@;|?rAYcWP>(m3^ZKz9>A@Ph9;Uxll@A^^+?+)bPWTn6&3 -YyTe<JQ?H^#-#q4ATdY*4ddfE6}EZL#z8p)@Wi8JLojw$IgZSYYtz^`3s52T?**9(#K=SE0J1V#U<~p -~_4Vk&Ttp$S$2ms)*6(bj9XX;Sv;DfUT`1loOIpM^uPJZA1IFL#3;7s##wed;;hpbFq(5)o~3TDb^x` -6o5Xe4`T@>X2dGZ;^6aBr7U*<>_P=`sF1GJieZ<e8e_3jP>@o?Rf<prxTJP@rChc0bG@&MaFJ{6J-cC -A`9K25<u~s+Ge)G=>fml={2Wp~1yS}9LU_g_HTQSbT-{7D1_MYi$7YTkQ*_u7ytGf@>#iL-i<Fa%9TR -q4@#A^=m{s$3AIha1WeiEoRnt^>1xAYxQmGC*BuZ@1N(6Eh+^OIbiX?#z;0r{lY@h8tL#b00$v%`sap -B{6PqH3i$*yS{>BEQ-9dx01d>P!`@yO?5olkJKW7Pw66kjjKyi`3jf%Fl_M5Awg?AZ!IdtNseHpK-?P -Fml?L|`*k&0Y-uxF!|Ey~U1JzD2O70jt!1E;5`}(ft96r^c7P-vMi-47oalt^^HU4Yc_RT`cnUo>-~& -u<|E%(k#0BfQ~2Zw2Mgb+_RcK7*>!t$-@V20WSl22ln>z<^2wSSp+tU4_X-%0cxkIdykN{(O6XrW%$O -ReV?C0X*V^;YP{2p95xR02kzk(YyxHd@#zTXiO^61F`$|0^~Ip4Y0>&!fhX9no8@W+Ofw7Xtk1=0V~3 -g^p8n3IxTRg5V#|^o^%R@3h{P@h_ntJ5IBuus)7g*HxBmRyhsE3Lk5~T}d_Bg)N637)JcwF11ZZt!=H -|Nq!UqOa36QSkF{6h20BidE)U^bs<$yy&86A?mSvOeF4T2!T17E4GSKzk@8}PyKIUHMV{e+cv)|=`BY -`*C?G?@N+=do#NIgi5l|H6Y#{v-Y8*<Afsd(Qzgt(+sTiB{gBpB~S%)+z&URV&aoMLu*uapL1uEsYqR -(!#3l$YF)jWTNAPZ4xX~!i`+Q+muYdo<HJIWsjnX8re}cooxOVZCe`O^=#GEdUrYAL5kCoKgHG)A*J4 -`&#^5VfQBSV`t?+ZB1n8Xm9Psor9SK99~ll7TZ{3JUaG2{wrL>zry9%HLijD~IY<87l$8xWp`9$QOpI -xja4*=!>~HU<Xj6E`W?w2%5~eAY8EnDJ2j~q{{~5OmTH6$>h*ndeD!AuWkbh*S&+vm*nOvRjHWc3PE2 -f-$!lDlNheG;D<~>;OR?+~6!3iC9x7yNHaSHt}I@@+a6~84WeT>zYJgPaLnFJ0UTe|3XxVkr!)9ITHZ -PC!Xpn2NnMddbY?A?)6Yr)0ra=Q5GX6m2KuTDoDXlqbuZTd?CZlFiagE8xF=eh&D>?>02$On4#X2#yI -$Q^p;SHsb;xpnK&>~NM8gl60`I9HUK6~9{HUNyQcGw-v9ZyWZYn&sc<9gPmjy!;xg#9L9;y}M`K{zIw -_E^WeF=pJ#*v(Dq6`Q-TYITC0o+oGZm=}3hU)yq4?;&bj4R#yZkeYXP}BNESotwHoKrF}`IIZrXC95W -VdSx`+<)KW9;s3-l)rN**cGKI%eOQGJ)AnIZeCVaG125Fv{YsNSsD!5z+(6Z}sZs(wOxvc4|b|8E-Xi -O6PM+WwV!tQZoYtoWQQHW3^ZMB;BcqY-g31>cjZka+@d}-Z>Gcs-99JZDTosl}@61tUN&q5nhlRvBDl -wx0TrqMh$L@`@w6#9vZJuZ6@jTjB<I#yrPTpv#~1c68ml&f$YB3#`=^U)~|5P$I2+oyUz8Z26vhI)AY -XX|B~)Ar7XxHbGJ_-2egc(Lvi;riSR#D+vPR&?9yW3yuS^)+_`4)x2XquC~Hy(?N+)fIW8S^d-u&T&r -v5Fib?tG|!%=CFrmOw-y{@uz`s)Tn+{N6PlWZI@gH?c*tw*~lU`5kX`)p<_DBAj1IT*9330-~%#RJz% -v-4^5`j5}e^<?a;gnLrerZI;tNBSs+xn;bW-i`$YeEhBW$lRg@S8TO`oP?;r_Jq1Kn;U4>`Z7CRO{ez -*zZ)Ce42C}QsU-jY4ux7`UDwFO@94`qX0OHm?p4Y~$T2G?`ALh~VbpmpUY!FCk|kk`KW(4X8D8w%>%4 -6Jn*hd?F}A(7E>wMm~AkW_v84O}WpHM@9esV2G-7Un`dN7jPE2kar~AAsOLi%~^yw<shO!rwr8%Quja -eUbXQ2BtFLk!gQFGQFos6>W`#X-{I(6}MZ-Krzs)wXJZ_+M^Q|o>R0OpqKi9#+#1cGz-Y)>ch^MDr+e -~3qU6>P_=FggN5EK(dvNc-fBR;YOI0SY(+oao;@<J!aoORR?76?zt5Xn^i8S=e{)&|wt;8MhbC0S;xi -{1PmeJ0?mR%M8OC50;6GT<avQU6<bZv{cys?1@P6NEuA0Y#pn}S<^;O?y3RV#6;v|>SPlftB0uDCj;) -IXZs69$=qhN8odE)#VP)h>@6aWAK2mnzTaZKk^!1H4u001R-001rk003}la4%nWWo~3|axZmqY;0*_G -cRLrZgg^KVlQ)LV|8+6baG*Cb8v5RbS`jt?LBLA<2I7t^(zohZCRek-0?WcrhM^cJ+dd`+KKJ6JUg{F -HN{X8Br&E49Us<cukOEJKL8Q{Nm+Jsb+vb=N@Xk(Xf(PT{XzrU+uQ4n<fP2xT^6M)l@%f{SM={pWunZ -IBpx4&hd2_GVzZKY(CghT;#@4Fdzp(>5*5&Hd6-5;{2;~M`;mwqqBx1hi4=vZ0F=4Ra-mY_H@O~(bzC -e|S%_jGd+<uAnScS*aup{s3j~b-|3#^YmxxT10zNV-08cTNlL-4jUvaYmIH|aaCil@?_Ab+@{DK{q>L -E_&hyb)!O9{{cwTGkN^`XiR7x8={GXW?)$ZP<kObOUj&Z06Y#Pv$1qtW|bv50^gi+Gh2z8ZCao~lAjq -7}^%FrO+MOT$Ox;c1#|#5&p_2ARxN@*n{mPYNE*kyZ?j2?G<2l0s&hjL@MhVwf1TMa)*2g0Yqc)u`xI -Ef^ruqh@1{Bm+i$l=OlbCt%7p@t|V`WLf3~%_@`sUdEa9m=P8GdC&A*#VbRDC`r^>PI;1kM<Ib`&|k} -o?h>bk1SU<HHP9TUAFDD4awRIA9|8@Q-t?iTo`29o+Ah>e(zKC1Hy1bJ+i#A6K}jOygG`GOu-XVBxzH -rfOUcrl0|g7QUc{3{Zv|X~zkxhJ{7e>zJ++^xw8-Ky$k4P*WFX#@h&J&dU*N((90%All{Ar_8BC(I!t -_Y=5Z;V|!k7S8%PRc$b2PD50KB@7fv;-T^M@X(AP9(WFj|yJBqlSPx^c6C$YEHRGcOgAkvRQTPGHpH< -fPXV@X_z|at!o9K~6GL7@47_kF*IGb_mo{p>Eqh==I)3tJMZq0nGlZ-X7?cS*DgE3}+=S+c2!~8xwzJ -$lrTC{T#=WUkZR%Jt4t0-(;4h%6w6Iu!@R>`I;|4V3O*an%v8x`j%HOibW<PWRH2UmeGACXFbL>2r4= -uG=3KP^B>2=;oP+C6V+(-#l>b&{WVl+UJS%gW%8{m(`kev-8<+43ri_XK!Ot&ZW!gTM2av~ArL@;x(X --wJ<76Z6C$i|g_<EOBzB9kO?WRilSLG#0|t<&Xc|tE7}f@NrI&z6ugEqhLc9<+MvLbwIf-ZS<irT;YX -U(SGf@q4;SAQe8lxoi<d=zD72=ZKTp*H<Ks{!}Y7pX7T&Yyng9X4{Qt5dxhCdK+9-zs=J_ZN#CNwX2M -g(Okmnz#l#B$vq@9!TN9Iv9KWDKcQ7R9iZEX4bJo)*=bTxIuUy?6q~9#muO0Wrf66c0%Gsra<tvPAX= -VjrYCi{LqN%{>3y>%9=8t4q+PU@&qXtM~3~6yn2EahH`aF_p#h5T!D#-{99kf3+Hb=^FA<GHqZ5ghBl -n2PB<5jVCCRATy|+K&?#0ctd&&mkB7wBtaUZ8dl>1ga-8W0@MqecC_6us1fSBbq4Dn0I--?CLENvEDF -%bG3sS#l&NU47>IGnE=H=>pr`he1b|IdATGhs!y-uHd*BRe+%lPxsn8xpzAWeSMEa<B2p}*}zLNs=A} -enuKq_g@w{qs9Knm4h$L0h%Aua*Zyp%aOJ}=<UkCoO3dj+J4GF;l)oEBL*Ar}RK#wo7boJRrmJyq#`0 -sn`|;(LIFM9%-X23-NxStDs^p0ghTO>&hYeaQ;U6|{_U=#Q2+KOvOha|C27jEP;TJdZW85FFZE<pKwK -0t#%h93fzE@L8!<3F}u*!MXtV(~0ykWP3Md-(g(6uE7NiOnXH2*i49JSpayi%K*P`c+HUrk}`-3a(pV ->a-3I6PMAt(3H0Xm7^NF@#|SSXJ^<BhGtxL$YI-8#88T!M)ok>s5AXM<Vwy#H5l`5m0D=SR>lC1oOC~ -c^ZV^(31|`p73MM+7R8kg#ZOLI3YBLjjgn$1QC8a#CrVOUj>ktw~r?s&P-opblu`k5?cnRX8MFx;R`t -JTsz1Fnjx}U@9St8X~^k8kl%(A&UoS=IP02KJW0F7lIm{)*Hqh$@<m9%nhUPdnstjLHtC~6!G^v!}Cc -yvo()bQi&<=sX2=Kb~XucOO<yMP%SeRur*H$98|ssy(X9L0wy0c(VGtM$|Q#oMzF@9)Cl<;}Z`+Yuu# -zpNs17s*vp01A!oLp%j9PfX$!x$z}ZBe0j|RQrwKvzAd_`GMd%u2I=~Dt-;o1-g^yVDjkU=mX4Ugu2` -@?qt#f@NvSki&6Oc+wa1khChd+cV{rqK}XBsyEFLj^{epa`u*RJj$eI??V)Q|dxU)S`g;R;OUsMl`MV -4J|L83IczO5k2}p6*+vj%l#(WC8w@>eg-Ofj&r=t4I88$}S9m!|Rt&@ktH^b-gaMzCAV?J-dC$T~Ic` -DO)>-HQByM}u5I(Qt#j&-nW$L=woH{g>5`WbxNz1wpz>>8@8&odOlGgkF8<oy|>eyW^z)0bk9H&L#A9 -b+yjuOLszPq?|gzPlb?zsK<6;q@_k2;l0b=uMD+83}Zd)C{dXX2Qr{03RK^1hn&2cI+*{f+#nGKnmSj -ndFjkDXUngd!j<X>l~aRaHYT<FVsXOAp}y(IE6^>3mE19pb3K45O`Rfh`u}Rdl>gd!#MInbNA)zgF){ -<dp&Rs7f~J+Mb-!S1F`3huy??LV;f?hnh1RcWI2p)a^xObn9*N1P_thWfP+U+JAN8!$Gf6-ybZPEM^P -ib?~WQZ--_DK4BZX2@Ttg!yQ8-qzg-c0g3Rd-J0sW>JLl~#2tElpL~O^Ea||k}H<dHdnr-AUF~^Ai{; -bk_xj9@#1w`&<!+|0~&(lA|*bX8D7~xRwas&>fwrmOD?13?9l&VLak}=sB7uc5fm+<{!_~G{A?)L0zb -aQ=sXHq^ci0*bwrnc0QPp1zl#6?SsSg3%<8*wr#)5*y%EtLLcC-StVp4y1h$YFJoX-msiLcEQ@jO;=& -Zpb7HF}w~<$lteu@OU~9)2N8TaXFje4iSBUkab=xLfSWwnMYecrgRc$b%c&jILkJ=GutLIFWBtiC<JV -bi66ACQfEMD?|~C*&Zs))73$oql|`)*p{>pQ6h$zXg-d{gsxu}_-2N~R9H)klA4b^ICo;=GBra3h*-E -PRV~ELXWL)Th&foQFz(gWwzzl#ME$sO8>T}(th?f!*1`XISP5rK4Pmt2;Htl#+lnqs;2<26cISB;nSG -^lL!EAaaUN+D?2xuur(`hF2yl;uqfd?(b3^IVUQ`Wj+JtLc)#L@*O!YwR+Xkg%W(5y71(L98eRz3PNO -tjg@5ChY%xk)ImqZm|;%4iAoKUw_zJTUMMT0sE{yw9j1whu^yQf^)|j(F6k9iZUi?5DHKtAW_ZfhaSy -Z&Av8oK$TgF$KokptRH|{r7-LWX(}}iaUX0*#Zg^ZiPe#H4q<GIZ9DFPc{S2>vCsGSfl6MoYG`bruSh -U|3d-+En)?koIH@i?YEM_l8;X{t51AJe{OVc(%zDkuTL$6+GK<>t5u734q1HESamb9TQdw3mCNZ*V7c -V1OxkGxL)_PEmA7&FwpbisM%+WwtZ5nWuA%c1aOd|rVNMGH!xet|)v2%rt#uh`_*Ki{_0`qw#pvR$YX -Ln%g0r#NeRaCw5~y)+S9>tanhQN!ZCgD5>huxyum!`9xC8SBlhU?Qrsk{|HB&C=AKbQg`O#`X4Bb7g= -Bn#ZRv>}W{@`0pjW+R=DgW=X@dW(YMjpI1E>!?)pHnuR_aIVP;KtMcJwrd<6f(!Cfa%(4=I!MGt+XM| -iwtyf7!`eot1i%k-_=JTuAz7En3<-AKX|zOe&!j$wVP)e=sEVe0{MH{XTP_$FHAw(B*LR9v9Q^PTG!S -~+Um}H^j;GLtbp2*Jph;n?#-<>W*?RJmM-^~G}pZ3ozP6~=PmG-B}A1ExM_#GgbLKrGR~>OhqlmB2(c -0+Xmr)`iT`}6Q9h{!`2USrn=vE4TG$cSVH(?3&;LH_<+!i+Qm#-!aVK+)wHO$v=Ku**oJ=QJ6OhCYk~ -X$!108gj_-VL5W&K0Drn+iOrVTSTp$dzrzyhM8DjJ9cW(BwkPZzKOkXZ&O0X&XXxHeF%b%{n01myz$H -;$%(_`8f21M0e;bA5)&;PD%H*K;Fp!+w)!0is}j;TGDw1r+*j>w}(W)H}L=#75lTZ4Wk}H%TH;2_KnX -BVt#dsp^^hvzyC9ENG01cpN7HS~EH0oH$hj?N=M`UJZ(7RKS9Fr9f&$RjWkicp$=QrdIs}-d=}iz@`2 -HmiiI%G5$vr0OXrT*%(V)5!6J1gE1-KjhX=xHyhVkAkPQF3NQj;KbOgDpb<Jav20f|3o6U3O|kQGQss -9%qX+NYSvV0gzn_pIa56LXOM6|kz&7P;+uw%MxWypz*j}ldX;!tP#g$|Hr)D!<U@ITE4D}FeO5!=JkZ -EOlb%AgS15o)yp)64UkeRA|zbUF;Q!2aW`ddH?YupgZECbx8RJviRmlo0jrbpCOLtLkl$VgY08hj89? -JZ&fZf4{SakPNxYCEcB+QSmlWV6SMTVrI_w(cIykyu<P8;G+96;Ex{uqF7k@P5MPuSN)_LuBwcQTtey -xV1Z2c7wcb@Jf4Zf2oT@jbJXL6xKslOFS8v5S&_eMi8PU@Mdw)sy4NzLIbhGf3Aar8R23ka_O7_1p1e -MyrzU)1<9|u7MC--3<=xUHARaUg+Nr|KOh&Pg5~2xe4D6DSFx=?Q2>W@%~ZXHqFEtXMa-f}QL}&~GD0 -TeMjqDNU=`DvYPOkwutaM(c~Gy9ODyfiDywR6WV+0)Jfz?i9<<W8W0||_Pkvb?@gzp*ToE>*{JmXJw} -~Yg7G6!dMypIQ(~@i~XjJ#jOtR@K))5n3_Z(AURaJ_IWj|C<$TYFw#TFR}2iG5QC)eo?SbT00#CtMu6 -<I|@qH^DLh1v10y7uZ701GGNqNseE_>Uww4<&gNRSCcD1_pXlorB;SbL5I)J*vN2!)&SD!hD#FAm&9s -oOfC{BBnzRuDYxjK$#b6NqTasWR5%{^uXbd(mBd(q>)1PFc3?X7ZgA1g9%ZFet8AX7-dr?MggL(0;~> -)pr3;oCVY@$Mcb0f?AyquNrcH?+tC=(;}I62iI*_zwC~iA9USyux(_T*Fh?@GehV<?BE`^aI@FwOkqX -un1B23_W!S1${g+=#-e&|3ED2&3gb?n;;Gj$GJv_)Po?&rj2CpHsM#I%1TSLx$tkGJUBrA%I=B);doB -OB(Or0Js&^0=qxgBxN;tUJu2^Ly&t2c5H)_j~vR3C9p1p5~fom>KWrrfO-Rf^amg9c4RoWE&j^b6GDs -3tUAfAE3$6}#ur<^)uvN&;Iwpe|r~wS_324kQ&saUxKFeQK(=#gct=G|H6&TOWD|;v9Xieg`}7L%W{} -7J$<TV)AUfPa)>48Qa+{K`3VdCHJkANqz3Xcf6RMwjj&N9X`92v;MYij2Gf3bUeiH?HR#kI}G9to(St -492CoOiB@iq?cmdPD#E2u&l~yrexNJAQBJcdDv%<m*n-Ej*ryWKY#77Q9cCCjcoU#kQF-iqkVxm*23W -_A?q->Z;aScVGgwqh8xxcz^nk_l6brPyN*R=id%!s#)IMpH-=l2A+J7ly4CZ{)&<(b0^2a57(g~I3aM -iLat1XIYs8*XBDKnx(bHBn<Oq`S(Zy-KkF1R+#{nn|N>_&QR5wNE4>TFb=AgcN($J;1Q*p<WNj~3D@X -x{S#qGi&W?Vys+fL1CSVomuh21iBaJgb2vggegZw+wonCL1#_ZvH=KNL~}&1K-k{JK&%1cXW2S!1NfJ -i*}vTCJtd6i=QYJvpB^B`iU<l9U|f$#0rLQZzcLD(#WR|#!@e>iSVs3ZLzR)zR@}Q*kPj7J)cO73VrT -|Xbg_46-$*9@V#?N@46KB3$q*!en|DXD>)tP-s>h)6HM_mSz-vQITvtBl+Se5IC@5}xhfkZ+?&(_t}Q -1-GPrUFIx~q1>O}lux+nh7VYF<NJc+7&8;rN}MRc#7nwHcip9c;hE-KOp9L$y`+7oJd<Jj4j_gLzr>l -#~MM_;zRwsIO<Uf;`B)atk43f9zWk%5GEg~n!AN}q3GBaFwoEBe)TBrC!El;BWB=9J914$ItJ7#l1;& -4rHrxJqzwYBKZ8kn4}V)t;dC7%>)%i#STeI0ol{Y?v{%=xu`AWT#KrFk9dvQ5h=E=;R#PgGJPqHP@Ek -f?F95FUv7;%fyVeq%n0dlq>Y8N!p4khs35)JZ*hDDgfdV)pE<)?205VuQ3C<HH2u-#SZ+fQ}g1<VFgq -Coj$`{u|zFbrA}qk$M`@FoUi~7BXVfwX31haEKT#^BhX5`e);nFNF35ZxLH-d93?opP4j3PijoD7+<8 -i}$0-QQ5+e&Pjl*nS3EvV#eil<nGv>fWzKU!~Ab-2<9G9yP^;Az`1{|P^KZw^y-~8#D?~lLx=1;B%Pd -kUY15Ci*$!*%A3V2`t^|d(KGJp^86ZiV8lM}s1g{wYH*>^>X0X<DXE@xIv4l80&DPnx34}$W-L~E&(6 -B~KTyWtd&p@JwdFYw4--`DlLy>!r|s@IUH<2(sKCxGhe@0Z2w@O!@$sf&2%NuPt_j8i<4{Fpo4z!u|u -@8PptDT@Om)SImIbS}ut=h@jMzbEwr6BjQ_PT+t&qrcH|XuD<s?4*jW4gMSV_&N4P%d(<7$k$Vci@x~ -7)mHh*;;eU+L7Yvt!M-zsHU{FNR(G6S$9T}rVKomcV%7>1R)S0&trIZ83j#z*TLX<Z4=B}Xfit14$?# -Y)c0}p66YNC_aZOp$s!RpoMyZ{3#bHrR#;Hl4=dvReLUjywdZ9CE+Qq67c$dJ1Yf5=OvRoQ(Tdb)K?h -VrOIvo);&tO(f2vtS4`8<7nIU>O>84<osDr_oRuAfUPcRy?(TKC6Vu7&Wzy6#Q0j+-MosBd9nd#jfBx -rKn8Hl~gZ9@mkr^Y~3%V<U{rZ%ME5fZncCiv?+&+dC&3F|%l?W2HJi25{;LvR~lPQLbUv>6m@By~>*x -Rh7<Ov*Jc3j}Bk2nxVqeVuhTx<DvQEC74@N%dP#9L~&X+D^@Wv);{D;c_s7VLenZ-#0+by{B0CnykYN -F>V}$iF9hbv4k6AeO!2<C^d$HexKL&jNuf?PP&kzn^cERhtQuQ4)t-~P>HcTG9IUO;;i))k0^+^9mfm -K&sX`75l=UXSxSZwjKP<eeT6j|mPa#jJ3-S1EU-zmzQ56rJj?kN6bq#b?v*-2Eg;f0d(@72Dv(FbQu5 -^%R$khx8eo7Ed(fC-?c_FakL|^d){JOY)8|+59s+`C%el$pX=19LgB{!~7>)(CGfcxo_1vP=4GX*P5; -DFdqLo-MP1*^HkdQTlcJ1eqQC58lhOf9=a_fml#vc3yz@#c>1Kf$^fD(lne;6kb^`i*ackuvQ(?(rpM -c&&~FisqN^1!AP{B|`URp!dUZ1YfTX+|G@<^?|9ktKM9xD+P9I;|NfHS3Q2<?~$18D9W5@no*g7rYY? -MP|%Az-sHSRq}Nfc2Oh9@YAxy7JDr2XO%5LeO6kSm_)%p*wVU@6P<ZKqqoqtd!NoVww~uLR(uSTDz5U -7=c<8Z5>uk>hhMjpexmW}BJW<i<$J5rLSP&Ou)G*!33IvC37HPIyN7NjxhS4^NFw1@$BYolMZezrx!E -nC%XQ>LjX9go-V5=^v@^+TU@7L4?4;}pf#=g`VVv2yu&#IL&bzOU{z?=&LJ<sU{Fd$AL{7b4^@~CRiD -q_dW?%)Yt<Hvf%Qp&y%USd_CspLRmDd%1VZEN{M)70<cd1KOjt?#r#3B%h2qcK*)VAdLwkTw-H)|isV -by64XYia^3EW+6`rF*tYYHgLQ>LxZzrXJfX&a<kg^j|fMxeKGiK?xiEsJNO(r4s9t{}Ho6rJ0Y}4b~= -TAPLiF8jdG;&qg$M(lVBYap&8rPLS*!>f|}{{E<%-3_6AR4tJIDJ|n#Fhzr=)+~?`SnodE|+hwLuMU; -fqDTqoqC}^@?{!p{g_c_zLIMCGnf2w<)SU|oOEq6?Pb{TIs*M;QuOcrH<*LV2~W@k}$viqc$S|T?bX; -Qs(yvw`m^Xn6%WG+!zPZA0C*C0mf_eXKA;3efj3-#k;F~ASvs4WJls&5-<3j;@E{e%rocd~xBZ56`~{ -*CzjsVFodbYRn62i%I7$zC+^vA4Vbs#~2)jCA{M*Cry5Or^Uc-)9<ROYmj=)|lDpnzL0q{dl=Fep&+B -$Bk}hq-h%{bX<`3CiseR;{{J8El;T^+*uqSviSn_S*q}mPOYV0SZ&^M@@&D|=X#Imq_yc$K!s?+FIzE -1JqwjgO^q&RXZ1a#rgq1IC4}v6Sub9jLG%XtPfoh(tl-P2`6@{K>y=$n1Y$6=fgOX^uHO!?23)8Ouq~ -K4m!VoN6>S>W28%C+c97;c96dr#2cyTOr%cyef<H(3U$Ck+BHuWOjLxo{{3N-UOUa4f2)AFw66=&El> -7N|;-V1M6!K<4mmuagLD=5wqmph4oIhBoaD90`Dv48PNr5y7+-BoI{7kXY7#$~4?S*&IDaD5yr@HIxD -t7}VTa>DsBQurf0p<wM@zdYPjrFQY<ytIY#iK9$UJdzT4h!C|S`0I}l2m$csL6$8{@ENb5HHO(=2X4J -E1|{G&cdse%p%&Z1ka&d>Y8w?PPV!#d+mkEconHF=(sl~`A$qia+XAM`wDk0M%E@iU1kcjL*u1)p)7b --wI&6ST!Y!TrQCGT8wQr1Xsab5!Re|bX}!Bwmmh-=0Ci|vmqy@C4>tg<b>1TdjiwpG(Ag<Rvrc7J`O$ -9ads_u$7L6@Ulou-d=dZ_mA#RLgs`qtSVA6WepVQA9ye#+%7Ee5%$Fe0rX9ML@(a^rSp`*bkR~ZknS= -+qLZ3h*swwavawpv8V3|<6Fy83j1^(|?2nJmw+npjJ&0ZbUZRqFmnQEdREKkhzfv>K1kR+}DEDEP{qG -V_)|bydVxN&+}_esRlbre^J}mV6r<PtBi0i$0Fjih_aRqG25j1>g-23PHkj-&2FW0ddd-QKeD4K)iuj --4t0D3~LE*KVohn{CI7m8SIIrgiZW@hdM`-pD{DF&H?a2L@$PEbNjw_+&(_dxZD0kd+hRCoKL)|%(_& -5r>pG|YXeJrs!KJMW)ni59v<yN0gt2>7HvQW93!4`2`^1?mkaYda6R42_Dr4~<nxs4%U(v=JcoZ?-mm -d5$J_o`oo%SQwO*K3X9MfIw)ygV3mP4*s=%1~cs#*FzxI*QLJ)wk)IY`X;^^qxV{(kqcRZ*SOAW=&Cu -o{BZu|Es%Uzo@@AaI6zV*)toQnE~1N4#L_M6_?&jw$LXbEP)90+Cr=D4m;NbsOCzTh1FPk5T>;tK*rb -ecuxDsd^WN@<E`5_CWD%P;laYQOwq!WDg3n-3Haq*nK8%fVoC8(&k%t$Ni;?yG8;u8aK4v(Fwh#b*p# -P73P+k@l0q-jS5;hkds;fH?TE_f~PN<F@?;gC&5!sWUtaIk~S2ueKkxYxwi%Z%}>*UFWK-j6kB~n?px -@Qz|ZyfrYWI*MS&N-xy;D+6TPx0{%YAbbBqWUQB#*AkEI53?06;PSv(db-=e_{Ikp$x!T1@EtXx$x{o -qRKv%;8Z;uT}=J*;{Nn<pu*Dr2NR`(`QZ5&KnnC%W+wWw7~JNzm#RgUpTe=c&&T*jm|t<YPh<q|_ZI< -slU!Sjt~ZFwmG{$VM0RZYl;gVMnvj(|xe&&)<3jEcV-v8nZwtK^phEaQSu4$GMQO+9^Hi7(Ojgw0U_n -icw+FK#wNnsR3N@?k}#Yry*?hJb>9{9&vf{L*Yo?O1v3rWmje3el2u?Wg2PFub_E3vVy}^~2@u#d+=3 -Xaz>cv#MrS*H;&MGz+*tTYuc<j6EHR%N9qjwk4W)5gz)QOEV5uZt6q58diws2wUWSr1(%e?KrmQd)6| ->i#*)T^R><mpw+ii3RLE|=uGMHFUiSBOYgw?Wsdqr2Kq{+Xd3rKO?YG4g2Z=jY2?ZGK&?}zx*D?i>ky -IS+#r)}aQw?$^`V?<VVh(KEpR%aZ(W>1$2Q$kb#s<lvyjNHkLv-6`6L8gEQp(_W4>%cHyhBoc4+MRS| --g7+7v6`*ZQg>%Js-71ACUyboKAfRkfwKPHo=cilzEZD+yC8OOzWTx)B`8mu#(v>XNbpR}$?L>eUfuM -+)EaZ}JSPQdINna`vzEImf!)ib;J?`>WILBkI37w`5MJn_o-RCyU*~=6-s~rK~T`h9VIfGwsIX&kPoe ->I=q!&BCSYzY?j;&*mg`)=PIGrO$9(N)hxe)ws{2i@sJ%V}Pz1{}vO-n{1~Eep+2VMj8zd&%`64Rh6o -V2M@5vK!8VQ(Gdk3Zy@rC*XBhU7~4Ea4ZRzV>rI;BYxFT}&^3S79X(a4e;z|%M{2z7L>GWiVU=paEla -&cK_TUUXph&<hFLV9%V{XpEaz9Pz`T<LO#wr*u-12=@ZJk=R?@jFeGjTm>QE_=wy?3xtwYBaJX{`hIE -*$v^F_QI@J0nzpv3y>Hgo?}#P=?lsukzrZjB!JG3JLLO#p`L00<pfr}H(2B%C#s{ns6o^_#VkxLI_vP -e0nF$n4A&COX%43Z6?QMf2y&bbx2Uqf=>^8W#11CiXtgDsc}a`8PqjmtEmwr>5YlK9pL`z5`fLpQQ8> -Gu|N;+j$wZEboEW{qeA~rOLYvh;<xtTa;Jzv`>m~@sBg%-hTm5O9KQH0000808trnOwdy)nK}mm05cc ->03-ka0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FLQ5WYjZAed97G&Z`(Ey{;pp^q$q3$j<R9xFc` ->(B5ko^Z^4poD~dv;rE^SFA~lkVYYhAEyCbQ0DNVcjLn4uP5AU6Kdc@97&seH5A#XRVvb(b%XeBy1If --ue!mvVRRSrlYEf><TQmZ>*gpxdGrYcLNE!!#0u7A7y>6&&w3NUP^RlyFz?uCpho#$fvUCg?8fz^1vC -v0g-NX1U1JkO8J?jdYEV|QE&F71kOnMH2#DMBd*l5Y`6AjYnesdXX=dt5WXb3rqd)*>3aI$o>vgJG&& -Lb*&7Bq1r?f$!fNqI>_I!AGlk9H9Y%7)%sp4h5hM=$ux1;@ee-sJXlargki7%XYwRrNPAPm1R6PD(W+ --JXZ%adN`ma-$c<_P`!EJ_0v;)cx^ySUZ9Q99<1cX9F)$C^Fd=a=Z9ky{Up^vvY$mEyx<=GveFt=K|9 -x`$rR#AWgCw=ccV>FJ`IJkXeQViVUg@kaE5jU&GU${S66r6GoEEAx*=ts$s>ZKdqR-lyu!G(P?Q!ejf -UEBk;m+fs#sAO%PIqm<M{;!7s8Qd@xw%PC%31dS=G=0P8>x2v_LN2UC<`Ut|Ct)2|1k(;#;Hg%0lAbq -sZ#x22oi};KC+?k0~JLE4TJSYo&Wc2d*WW)3`NvQXG30Cw!oK4kgG8WP1G5(?^cJW{&A$xpZsvTX<z_ -lL*;_pN79HflhHI31RPJ7h_bFK3mwLMat@vF?~0zn~m$*2QgzWG0F<12@(UYaENPW0J>0nYfG~^Kd%# -C1J6*5Or<6k>Kx=biUP)-Q<Q13jrX?5A2}<Yg#yx|t=7%s*f@^B{ncC;h`b9432bdrAXhMsmBuYQ&#a -jh1*pol>o<NOK*Vt;Tmq0c`;Rv_SC`G++Pz=53(;x}P%4$*2Xck`BOqFA!N!piD1+ERt6$;JBDl30fM -h7R<hN89Jp!HZi(jg#DvP;*ZmUU3t_>u(FcI`7pAC83V;AgKCD9{Mnq!UfS=q|A>|0>v`6vnL|1(zRS -P#xD7Gh_YZt~haxAnWPM!c8vJ){hFn9)KCn<PsE`EJclxxO{{@ASigp2E>iY}}6%7l(-o*1lk#3=LQ= -7yZq}s%5Q8(9406Ylpas8v%w#N3Dz!4hbpcgzU&vD?+~)n8n*%m_2HY^j)Kn8HUAg62o0>$%g|f_Rqh -~s@QqujjD7CNvP+o6kX1@i$2xj9b!#zM-%9jXtnj`(YsV#^zM3#-UMd-BeM{bD_JQPA1vLisg^xj`Z< -%wdu6P5SWMB}DLeJgSv9f85-uhp#S3ndJJ8e}E#A!mka?y7{5}aX&rP!3$4&e5+*N2ErV;AhdrlAS#* -74Ecb;Eo(oFNx&J<s$)1E23jHymf>-gzyt)focyHeGw^;G<!A3N?EnX0Yhu<_O8<g!zl6nku(#2G`rm -@PxtHCjA2s}uJ4(-9cxS7QZyR9}%bU(^@dK!-=Z(H7K&^IL%}F4F8F$2(?=N()Q(b>aG@Ex4+oBsN+H -exxOTk@oR0FtEw>Hz`4Bh<g;6;85o$5^Y8b`aAfdM>Qfs6dWw5Rgozy!QW^-hpooQpXs!o^JaIyic{; -~taB$h#;cGUxKHo#o&UvZzr<D;)kKwH_Nv*SIZ$2i(g&z8E&k_;J}>s?i9CXsD-fO3qWFIfJCH`);af -e9n7yj<jHTS-XyHdnFoU#sxRRlke3mjD*)`zAA{`MnT#wkFfa8)}SY-8ZSykrP%v+!Ce}Kl`9<uY-@- -95GOc<Q@e8^KXh$x|bKX1>D%cIMFtQ#q($&JtkeXAd;cuq|}Qu8~a28np7!kI3mna*H$PD=VYy(<z8= -^d$P#$el{@A>?^?mr_STmf8~w&|G`qq2&I6#rErRJ$MtqnkYLwx<J#aXU942<3>by?&oNZts`lrNG@T -Ugp$p4h|gyUr!)kKOA~Euk`TUy%J`EWoJGZ_2;3>p<$9tT2Gx_e(yAml@6!S?wlTa)w=f;5*<C;z|-8 -4I0?Zd+hbzVJrqFQYk%HcZ01bA?h~3W<@FTlzn!+cKRSdaO5;u1bW$|stefvJ{&ifcWK|@jin;jqn>F -ST&(MH@_w=;2jw8Z0rgPJ|87xDMn_+C($g%1**`6}4O?1J0OZs%tufM%MwP}>Ee*f*SH_6SLs~1W5*3 ->IynVW@P^1Ra=Kz`4m`>%KEjjkSc=#wux^U43y^a=lZrw%k7-kknI`Ge;b%v>ZVul-k1s`+3+7nofkx -oUyjsPFHPCXVL1W<L(qR1|{^M@uu9m;dR34W^<^-#YzF=?*}f+T5;jnj&+PPD4g-1F~kE*)-WY1gZy? -O_RU_3OAN)oO_y$c5EK!?c3oef_HTQj0e}wH-m279DOzDNz@dQrix4#koNo8(3^7wbtK3PY4jgZO9KQ -H0000808trnOaK4?00IC20000005|{u0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG -*Cb8v5RbT40DX>MtBUtcb8c>@4YO9KQH0000808trnOt)E!eOC_v0GLDo05|{u0B~t=FJE?LZe(wAFL -iQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5RbT49QZe(e0XLBxadCgmUZ{kQ2|DR9Mm(?mDF&u;>l -UePY&M{_!mH@(JvZK`s8EAqp#_jVX3H#}<s@sqD6O*02yC_PayB@!)uC9Kcot-rnJJTb3wh1gs0*`uR -?H?TY=QFZ0?F})=>yAO)DzMi(!nR}!AAFP99x<SL4Ig~N_C2z7*}kFEb>Py4YuKK{T)#sWJ4&9IVUZn -mDKWWR$7L_(h7up@EcW`rqA%1U%4`Icg%UhU4B)1oM{VCUEbG8|)sV9UQ5(NDfbeh*%#KTa|3IEx=5Y -|O%zY-WroZbngb&ti!vPv(Wq<&8V|sK$Ua0GVXfzyEa-uB@K#ysYN7J&%EweZ09%0_vJvd;1Wv*PqJ# ->g-6KXSe&jOEZ=*mao>=k5!_MN#0F)mqI#vi8r1hUaJu3=idIPf}T$Xoz#_{61#$LzMC;Q+iH3#<)UQ -En`_(iKv9!3+PkV*ZY-4kU0b0MtMC0N0w@=t;m16%pQZ@25tCz>mtDgKIwRe9~OE$VInz^#T4|Cq|N= -U*Y3FUsv$CV^jYhf^SCMz3Fi$0X}Tz6}lN(fNt6l6_ld$);q&}qHRQJ*azZ(ThXg4-!N@-fWc+00fTT -gi1OIhf5mo3#D?dwwP}D%vSI6B4}oA{o0F|+L9{lpanAIR<E+)@;y~GkLhM0PVSQB1o1F#dS<iP(9y@ -IyT3f*eu|(CDxi^ItAq_-u2l4oUzS8D++t_=|E&iw6L?>8TrnhSoh#(NZ3VbN^u#h)^fCe`G9U9uB;9 -QVmf(>DaMJRdr^6r8T_CuG6*xj)`(sD_$Rp7F1;M$;CM8k%G3%TZh(Y22yD1OT<=yPZ$#LmX#{U(e6? -5oBK0*KosV!>uUz!p%jQJkc;!zynF9TG!NIFMq`5GG2dxd?-IOX$7?J2vmH8IwC9jysL$)8XP#nQLUE -li7Uwbu`ch<V?}w`&pYjjuv;*hXnzOxiVRNBhw*KCf~>}qsgF6v|nd)P1nhE&c%)HXXB9u<)eu@ei)1 -<U&t-+PNoYo9^H=?Ab2t5N<(oYO-F(E+FZSZugdLcJX(Ac?KT`OCMbJ2ofC!3l=)($K8%$)nLW&BQ(X -fX0}wqKO@?#Oq}^+iMF%uP8PUGN7oy)O<1wn^@{|X#WR6&gI-Px+kG|Y3$lY{2(4g>E1BA-$SQF~NKy -|E)?%QOb+$&!+&NT%|!cHU=NXg@!hQ+8?fnRkonoiIpbvjwh;cFW#o-bnd$C0kJi83GQ09lwhpMn~6F ->p<}AmE*7LK3<^-AX`$-yd`>jcK4MW00w%0GXlFID@eVhYYe@ZUY}u{&GpoJw^t^pvNreHB0fm(Fn^O -%kUvP?ggJ1r#gWTIWr{K!hp35^RG-4)i*_wS-voHvvi>QE=}9-U*HGKPol^(|Da1BKdlbfbJxotrV1= -(Kj8=dKa{p&%xbiX^r?gKxJ_o$(PW{`+e95cOw`4<nbv4DJRIgs|FConNYtNG(3|IaSbN@Tm|N^<Bt` -!d*9@Ztr1KG1rMWJ1o9EbrLm?!R0euh$3ly>n$1V`tXsj9doPXsht{8|4M8lXSfm6g>3sqWR8MbKD{T -#P>XKz5eQMcLpt^0da56!n_K;#FGMVouWX+lf2qcOYVIhN@+&pYR>76+c<`k6F)-8Q*t$*`dVbI801f -6k{iOg5%E`IYp#og1D9ZTd=GJ|Xb}2hGHB4o&#c>-^}QlOIXKk3X_n0N+j*^nQ<tTMhBI5jWju9zxAj -<F|3>SyI=v+2@5D&{iYk(~zmCiSoRSTZmq2AXga4>TqOl=o>G<FoyyihB5m|vtjaq1IOpMPe9$k@C{x -fI#o=aE>m3BIHZg21K(I#w4i1nhGYzvR5@>(bkPF3TfSs85Ewc9uxw7ZP#E^brYLJ6G8himhR<9<5KC -%IbsYwOn7e(B@<byvH!BLuTCw5TT2b1HoRF>Ng{_P~vP5!SE9IdambfO?sKP*eYpkEWGB5u^kJEfLtb -i6$VYI3g2K227e$4neqG}<P_U2R9HY}Lg?qOalg^^S_^65Tq)uei~!KuH0s1T2wVcvPezeCG-^0HzwG -+_G7aE(0$<teLx7V2PBFzr&6`grCtpRJjd(xQ)5(}8)g9+*DO)-aeBzxfqbK)3YD>$wD*@>YogHnA?` -^#aQ;a3QaqI>?%LO=63VOS2s6P-jl8KGrFp4hq3?U8CW<2a#Q)gw{zlK?jxuV!ZrJev7kU+{fBdQQWn -X!pJ+hz-m>}MDZn2mBmh>oXQAF3zY&WFDgj~A=B?wp2C%iaD9}P8aZ;Q6Mmt-$b%^t=QR|vB)Xz(n%5 -O|$GVF0^mVj=1M4bCk=BtdnXbYL+ozAP>chw@i%NN*Xy>D~qz%i}Bp`DMv>Gj}&B}4+WgW*A36$LyS( -Rr5YCaI(L%%nksOXu+V4_$}+!g275>&;)Wngh8C=bfS(UO&A%^J=P+T|WBP6Nq!)GF(~m2m3x=qP~*3 -B?w~OBbmmT(IQ4o|J^MzA6&QSSgW}8JmH6igg2O(K74O%8%#{1=Z0#`$g4z7bg!xsd-mrPA`F)(pw5t -AJ3_=83y*6hkUqdY{uP*Waj~GX;GWZ8pKMr)ry2Z0t$MP)I=7pg<FNfGdALcz#mOfjaSm9@-(O|7e`j -73S-oTE={RB-twG$MyZ<_P>z8s>Se+M<)}h6H9;LsRVB!hm@7weTHeXBD1pCYP-W878nhs{hH0l3Qdw -<X&~fyh8hNR>uYi{*I3d;sY!BIK0&~RwO3X>>>VUj6?2WfGp6h@sQJjdVqY!)fcXC8N1;>f01S(fv2P -IEC|1+3EdmWsr#k@b!bb`H(BA8xJg8d5Dwc)OpSmvIV6zV#lTw6`7-vwoQEnl#(tYOBx41lhz*|_EN* -T6rXNHW?_3Xo#te@S$_59VL#+7nE8r;q6q^Z7}rVEi8NE8Lvbb~4InU+HVOEB{Wok(gRovpQ=fQdoQ9 -@X5Ey-iI>Ty(>eRR#IoB!YQFcD)t(tL(=@HEN&AJwI_*{TK*hJJU>C8UQMJ`GsL5MYD3jt3@a#~X%_* -@H*&PiTDI0pYpRXyOKKLZvcN8j#sp>+f+BhHh6+FJsf9)HIqgYtC#2Vg7pXX5a|}8a-*X6i=4sn^nSJ -k)H37DAS%*&PmSCsmUPU8pYTx|S^-7BQg!NTgY27tUI-A~`C&P^-R4iQbI^K!SC=1Z<h|YMc)t~=w_e -xV6OwzaFbx1;&-it{OY|_D2e&HdLN{41y=cgp54$;yDIcKDg2h#;P;`G5@!4_jKNyU_@gj+x+9lhlXb -4<Ad(Og-YMLLo$3A$%AT{@kb8J_3tT*J!*M8~w38_P;ADnt_6<h)$QIVW$GspRKXq2J%5PUeqP@qa&L -uZ{TTp8kzjr7Jq>a8B_`;gQ{bsY{g!$etm^y{Lcza&FlgyrxPaA<;QuHZ4(Cd?I$5!sAC}ITq2D(pg4 -TGAkQy^IIg@%OzE)%OF&wyb>8W=@6f0e#ru=@XYyiv}sKV(#R7vVV;1o$j5wA^?l4p*}yLh74zZgN!7 -X4DIt=bL{=#)J;W?z0=vf4e)4xm4uOs-Pvn$Lt;@J>4?eAk!TRbWL2~m%H*|{m;<K#xG*kK_RdS2rSY -1IZ7GFdvrbu5ys&q@%yi{Pw=Xgi`1K#C&OB<>9RIpYiF3?hc<Pq1qzH{ppv{3pQS-Z*}8Io*By#H{NE -xhY?>NSibplf1|l*`aF7xSttP#lNao62CxNUNOgA6HUq#=yBSgO~3m6mAe55mYzRMO++l<sL$U;-u_f -sGw#Ze3l|=K(_`=)kVBYVV0Y{re)w9HZMh<E9Z4$w=2Dz8R;uhlV?1y(sA^XXD!>xB^|f2#ud_cU`We -KEf#X&5vI6QJ}r-<h%(h5N@hh7Z8GUBB+lN}&5b|wZA~4YG!;L5FT~gNt<nqi;v%$ZoA{c><PXTi!vk -@#-+~1jC{ghtT$AzFKcOsqbb<dBB8XV{Gzg!W8EfAohL?I}XAs-iQ_nHhl)p<$o5n@O&+R%X4bRy*=E -GumBRMN7Zg$_gH{EWx*X<_Qqt)SGU_m6h6nA!W?H0y`=c%nz_l3H6CjpG;He%Xn`{DwMd%4m+lwOF^# -aNF@dr*3rFU8`I`C^oOlPFXz6O0Ql=_VS%tJH`tPRID@T5KcCw0oWYJD~QOb4m5m7RAVZfoR%r{(@=% -w5D_uYyE-nXOmBcgD=k<$hUxtz~bBqT!(q|C-GqH6&fTX37U0ly8AYH-I?oMD9pr1k{|_lc{iOR00U~ -{wnD$C?!opPx;D2a2Y6XTGN=4)Bo4m3bZD4X;G#dSipYmBt+q0R*F}U=e@ETuX~IY0S?ap!jjj)$Ajq -YvM|}5k3nRvJSlO2<`I-FYiwiNk4I=KV9KnQ5m~U<mf}nSuBT!cO2uZMC%fNoc9d#9VyplFYqK~o&{y -H?Q_#{<~Y_UNVs+FxmvD%wsx-^v7yUf%A;%|JQj&$~9yB_Rko4wj|#`u{)NO2)iOjxE;_S+rve7yE@Z -+Z~(>zyFElu7XHExxUS4J&9aE;BR_9(7d%x{GB+w)ABuJVH`HI?dV9Jp`3CxPxI)5MIeHN%Dru_72`p -48>jcBr1$ecQXabt;JqL0x6d0`YUyzsS&XdaQ*S7dn46PSade#LsrGn^~1&0#dTjI!R<BhKhNKyzAwc -j)Qeaslyebp#PLm7;^8i=*CCG-dOW0A$An16r<^bgg`^y~(3!<#Y8^6&M?nTYJ`GbYB)O%g4(>Gkt1C --<Rk&0%eR*+pz5JryFZDa6e{+fX=uPcjs2QgDQI>wUT2JrdCSn5qNY8DRo?@0^%z_L9U9SYz?JE5g!! -b*`-A@%73Lt@oi*gNx44<^)ZKB?)nKrpR)+TwDo7#Fpj;>NuNl4$jtafflotS=oTitwl2BnsUkUGp8$ -HYg}NBo10mjMJ$?H`NTJj=)0dZKptR8vXR4i!OO014dsu{y|e442(n8Y0j3Yl)AjlMYm)dk%_;i+h?{ -E;(mnzd~}J__*YV^6IGAkW$KRB^LGi-Cl~Oz(qil_*1=8;P;}toK45ypynzgt>5?$P)h>@6aWAK2mnz -TaZCiS+>k{N0015@0021v003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQ8FWn*=6Wpr|3ZgX&Na&# -|jZ+Bm8Wp-t3E^v9RT6=HXwif^2pMpy;L@pd5yC{YtKrm!!x&>>SB1vy?(G><QQLz?T)F>&g_v!C>kR -mDD>Eqr2TWy&<Jn!>6hdMYon7r2O<4QfMN-R~?DAS5U8__M5xK&wi)SZ!a+i25?MOo)%ecz^&$=y=5N -=T!`yG^&$wJ7>J>q=d>uv2#QORYPRmquk>wGl>DvQxR}G?8AG_e*=~`Maxjvgqv|m8rIsW`hgwRfmgL -_<60(Ln`3djVSA^>T@_<te3h{VgW}lg)T(pB$-@jqh9I0&L#3BRzMRN7jmKToH~amD-DONWG(O2O4S| -F7MZRyWk86shLg)ytaRR2YJ#lEYNgvwz*>+ABw}Kn*&t=$P(JE%AY3W=(9%hb(T^pnZ6X`^+?W#dK)> -{@D*8%D;H~W>92_b~8LOU5=PI2XfT7A2TS2z!=jZNQ)@>Tqx^HEtOs91<JTS_A(!;a1t=z{>t(u|)0V -jpgE0H=23;R2HK-q0(BGxE;e{})I?k1DTA!rUXWz>CNNh8$f#-O@E?eG+2B%9wGxe)Iz-w4<*1u72gC -Fu#6FRwtvIeeL4T;AN>&TlTo84ye}y=s8FWFp{iad3=(zh3@!^;Y1zt5;VS=XaO%^v^m;pZzlZv!-vC -Z(nY$IG7>Dm)CdauU}85z;~_+G0%!Qax_Qr=Zj6J+Jye!8BoLYlnzGS<G;U^kE#Zy{eqduj3RS_K3<Y -!i@(6%1!=P+rvfF!zpZ*u8wsS~mm3AHf=XI!$o846DrM5>V57R;)FTt5O!a~oU=88lXwk#PtMjVTne4 -QAsS4Rw-7FHIQgtXX(TTKEQdmPovW~jGsX$5m&mIL;;Lm7Zn;Lkn*Hw)!ud|Z!0Z1{N5KA4L+?M|+@C -fA99z3BXhvEaK4C`W?ErNaGL2Wn)A7$06mi&$)TZvY#l+Y%3x~8RPBI!P!eBuO1EA45x!qT8MKkZoq3 -Uh?EtaS&0dIMU0HkNFfJi|=`1%J>t(co=XGkaZT*!CTcGpw~@Mi2OS|7gVE?1_U=D$m#-YI6ZW@T<%o -+OOaBZ#;gqFZ5&f?|G-^eO+QsO^D%<2eVSZXT*D6C3qhPG)DO?f9F_E#d{3hp(LPBC}Xs-HozPTt5de -ge=rD2tUt8|9|8aSyDuquRJ!A`Nj1lnQp}(90MlTlKF8rf?9XL8$FehTz+Jc$q?v3x7H;Mqy}Q18dv| -%0xD|HK)H;im@od{&SlZuIcfp_Db;f(lh=agZTpQ3xyzR0EUBbWb?_RyImcjp*g*zIAe5-49I*?fOMW -IX}6dA@@k$+8oI{DZ0>97T=4mj!8Na00zQVh>W{0xtcpL|(hFSHdL!4Y$O8j&)x1YmW2dx>t89MM1E0 -1csxi^v__VUQ4xJng}l%z8@VZL1s4k5xWw<PT}CC`^v}t~h>S53p&4SGeecY!0YnUh6seenS7B0T9Sk -gBF-)6)ZW!)5hVpR1mC`k1b`2In3DI(&#lNZ%+pWfTaM%O8$X#)9E1CBI>Z5mz<r6lheRY@T7^$wzOn -E2=5S23Lh>&?PP#Ah)M62^&Tr9$wO42tTa7(-tI&*I)wLZIjIE#+pC={_7oc`P`ie6&qRN8<OLkq>5r -~&Z#&ubt@yD$5<lA9G$<!F&~^}x7n~t<OmA;rUwS(1ucMU-v*7bD`iC?|S`g8wRRaIb8T##mS@a{~2; -5GP9N{A5*p&njgGOw*Jt%90-w+Syc*L-Ss8L$Yz*_)qIWP(#QRWQWaG}VSvaCnoLzy`rdnP{mtVGZ|U -Htsq1_yAGEz^6W`zHBm>Vpsq0sV$tN5D2M5Ml#N4;4WBJ~_Kk-{j5@{FXEwS|B-itA)|99G8|wnNjg- -8<oKql^<B=@#^1|9Z6|i_}=uLTvXo)3Qhtzz)5?tF{&7Y7+bmdR9CMZ?hG{GnSNRY?`ve48Zc%}*&gf -%CqA@jr;%k)xrBMqIy*G&bVj|(+0G_mATf=01-#>qnB;d!Fy?8TqP*eRgdfUoiG4w`b@bPC29EJ)bIi -p4#AWyH)yTJMW6_sY&O$TX8Z5e(7xJp}rcrfHfH3i1#KL`pEWDI6o49ld&I=JWAB9nh>KKRFLV=(017 -E%t{Q@LId}pwXr7<O41Atu1x<hig=EMcs8w#Dy!0hd*(71UGikk%uV?e82>K^ol9HsjLIhK?a6n75(x -l7_@OL3Aw@>-2j_Ko6fd}n$^Jd1lu;=W<QiXCRDINPevkg~8F-0R!`-jLMQ%OnCKTVnZj#3t58M?8?D -%n`D8o9~wez=);sRgzrU#s5b!aCD;$wpY-KQ3XpzlH5hjL^iZG!%p!=X2R`ehg&NumQX3(&`qo%qi`8 -9io}prYX=*{URaNm0X-adB{Vh-fB@K>6O;>2#9@<zY;EUa1k*-}LBK-d(M$P=F`@h!4fF%8&K{JV)v@ -kCAxH~!{D)nLCc+sDR(uSC(P(96=Z6UQ@CgFh5rvl!8|b2uKS*x$5nb5XXm}t)RusHjx-s4$wH;^RBo -t?Z3`um|!QK|9M3L1Fq4k91(e*W$tAex@oWv;}B!|Y)kjCA4a?lf-#*$ho2}iI|F%6?#R}U?6hP&`9_ -_wN+DYKE4QgH<>jgtAy(psw{FxS1d<IZ97<+phe+3ZNB#yN{Uioknn$+36373;F9&|oj1Ce%4JH(Z~= -AK)vPkRYCgU+5^{gPM}BrPgX75^aU`&I^wlqdW4eW#CUN4~apOFd(>AmYi%K2q`>2iHN2a^5PSVAkKt -t)1DtC&rdk42eHlq$f#<9jN$H&r!PKDcQ#r>0DXzVi_=e2<oJ#Cc*3><`p#o+JkdJdE@#8UH(fpC_&K -p@->GFz9z{~&r}QtdcM=hq4dP8x%hAAkFqPBmp_*A&iL_sKt*VMNI(w8fgZQ%PvgKxG_p<RoE0V}#Qy -d~X?N0q;_sBna1wIyxt*|xPgK*tRA&TAVikbI8MZe2O%0R?)9_eO=0qb<vP-lkY)WYSJa71hih~FBS% -GHWW%Y2TNq-6|?22A`ORM4I#46jWf>EVW%Kr$_YR8DUOU5=4i>n7f|7em}YlULh=dEwH1Nfn32fNpSY -Q5v93Q)I#oZk}vQZi#a=SjR2_!9&T$Eg~!*r_`uBf_~0+S_3uzj3+WfuY@*dgJBUAx*^{IZxTmlaWsW -AA&Rg&S(9dM+fbxn+dSFXg!oloHPpwyZ)wHG+{C|N1cbkOOgtW@eW7Xef$6u5fe$#{72PGp(hQtoED* -%sYC9<4@aI=H-QZ;fM-9e9-%*B!JhOY(2cD;bpF*U%s!i~tY$?KWT_53Sz^L5>)<EE>b@v4v0sFU|&> -nkjR#fu7-AxtZ0OHNa6<&xSjI@`T80XE>K&~H7>>)<tLwv|m0S(eA1Ra10)FTF9+%<-&Dzq!rjT?H<? -r?#v490td7VJ=*4?`C_QhZcUW$eW!Reg*R60=igrSj6jA>MBkUKT<e+FM1c!E_Nk;0*P-Gt$;>muzf) -3<z2LRgW4m!U}9L*Qq@y)rh5r4heh$Z!u1XT*9OVoyrOWcmq(B=S)A0qa%Ze*g0?}mEgP?7sNV`1`#D --o6l%(DCzeq3CT|5ZW)vJQzuckd){3k!R^*R<Y309KGEUZv%>2Hd^ElT_SaFPuDsmcEQWtO+EGNqynJ -hQn7>m=-TjW0sw($)ci(@wFB98G7iA6AFi7mcL8$Ba?7cmB>>yw6*?r;;F+dWQ$53U{2nJ+T3CnmS%W -b32D$lUEjc;{d!>+i5(hC%Fvrv3%YVXGCezkxW4WbJ9gBJ03jvE0wgK(A=QPYLxm)^%1(uZw_=xVK|? -#i{y;9oNz-v210arC{?HZ{g$0&K->l7M8=mo(0#P@`6dh7crwC=eqVMhe@L;6ri!z>}615>cn_ZO4BY -_Av&W5AT-&i9tc4%!TD=C9~^W?rktR;vhk6bPrs_0$Ngi4SH*71+~9iO;pa^of~t<jUFQ;Y=5v`x%P! -+gH9b_(W>O^imGRZ61u1SEb&&6ZX|Q9TF#OD_DxxB9HpYb#;Lr%oz4Wlq%&N=fIv&C#dQmg=Zk&;wN2 -6BfK&jTG)ZLX;U)c8dIDEi&zD@?owT8>k;-ow2RFJZGf2;tAt(x+d{6^EB`+k;!Ew87K=864y!Jm7ml -9tds%;C3ZW6(kXcl1|Z>U2UP%5VYu+;FKj}Mj>^{5ThF%Y>6gb96P*RW-%M~9*@<s)(qTVoYm<Lg2oF -|p<(9y}jfTX>Y=?Ha)tDymu6W3r+x(A*b6w>uO%BsR7VFuVjULfa=7r<OE#^Ad!;9;T6gOn~g5B|Mf7 -qb*r4OHeto)V4iO2OyQ`-XOj!rbFAnZFo0=ITS>QD|UI2ovpxWM{V$yi6ytC#ShFYCKj7ScV;Bt?GP8 -I=nKvjV;-VBb*#-Xxy#-hMT0C$35r0YA(j?p1;i+4A(r9u=_MlO%S}q0r?_@79Q(MnGzK$j#b^c<=U( -mOR~Ar6i1`6~;gk)*Rte5kx@6)Gq;Xx&=MIhG?d|JZn#n<qt~BsEumxxn0@J_M=4}u}^w)J}b}RG&ou -XS$v4E09wJNpK68MNO%+T-xWuy-%4*ddUnR?tk_d%E`=FyJ0aMx-*4~r{)cb9{^d+RL};cM)0*i#71V --A47h&f^wwy%W-coeKB79+ThmCPj#g;1SRIFD2R?p15wIyuGrhatK6QTH#9H3Di-0isa_z2k>zk^n&* -{EnQzk+2s-UZ}k~-|QKt$L%Nn?VJy}<^Fyw2*xKY^&|}ac=Bn-g0RyH1(-fz>%D`bJq}?(XiPp@yfuF -_j2pQ|nDQP`YbebOk<l9W2#n$2Hpv<qTPHWCc7IRaC=Kq|=q5RtMows%bNv|K@<}xKkhds{V~^I3bFb -%t9?sp|@SAS6cd-A(amq>j_1kZ_{r*u8*fA&>UfoR@mG4FKrz7i(?>q_3Q6b~L22m+$5f8#pr>O>XE^ -0O+v{0F}V|v%whz026flGk%A}rK&2Z<@Zwb_031?Skhm<`M~6Wmb+?KRcnV9D-o3)Kge^ncLaUMB{!) -5(7UP)h>@6aWAK2mnzTaZHb0pnOmO003<O001Ze003}la4%nWWo~3|axZmqY;0*_GcRyqV{2h&WpgiI -UukY>bYEXCaCv2nK?;B{3<U3aMQ&9Pf8bk|DlHXKBTf2$74hV8m|=3$%0TYkTLO5mr#9!fno9SCmx=P -z&7U?C)aYA5QS&3#L<B^U`>^m3{yt1R(gjdU0|XQR000O8Q5kVeM!}|M@CpC`=OO?AEC2uiaA|NaUv_ -0~WN&gWb#iQMX<{=kaA9L>VP|D?FK=>WWpZU?Uu0=xbS`jtwOVa&+c*;bo?k&UC~PkjC+Xd`*x<al-E -E2scDE_oUU3H_FldRkd6q;iDcSWc_P^iEkd&ymv{~TtA(6=8aNhXL43%^CBaiom(j`+HcCQnmMe<t4< -#fj4lpDj!9WR-#a>G>4-kr)F{CP3|YXrZ(#a}P+*DJ>JgcYaaG(S6M?_ixUju<8<z(tsnnM#&|C}kci -4ZCs}XFN?|7r|0aR8^7S12Xza6(=pXyOO=Qy84d2=ci1;>VJr`l=)WZh-r}uZbZVW97HEJzutXhzsOk -RMj($}Sr#{!m$6F3oX4d+z#hPV9;@t9i&z%ITz>oN<;(B>a(Pzj)6E%!pN&=-Fw=sAtQnbSE6SBjL|! -s(*s6Xz6Q5&Il<bbEZnaiAV3AZ=c3OQMqt5OtzK#`G#;y8UoXjUFjuHFB(@MDKyHaHII4VW~zBoHOv% -U=do4~J`rJ3M>R5{lt=WdaSY%R0_M;W1UjwxI_A^LOnLk=@Lp~0UCLryH?g<*RTl9h@bNW{4#{s>O#P -#0PqKx@z+4FKcWY8AmtDsuY}tGwi}Ilf`Q09D8i1cX_L0hS2}vIK%i3oGIUKf<#o{!wl(?lF9cxRe>} -xlx*8E?kO%V|XUeCpfRgwo17sX~{AY^=T<o3Z3(m8If-0s}<<q5TDxSNM*i9Q!>sHRjtz#jespuX<BN -<Qpa}N9vOqE)ukb0h#aIo%5nz`4TO%&MatkHWbhoa>&~%U9N>_EEe%Ux4Bas;chWEeQI^ULC`p#!=~j -WacG=9cyXEnY#9>HXDu^O96}Pehbb#l!AP|PSxM6Jh?)~kjh`qi2*T;zceEaVQXS_sgz`NkOa<!VG=_ -2+G*INUBzS$oW<06uxax%FCI>}S{UqlV-UKc^u%yY&*$ZgKc3S1~n*NZi)A#X-(U6tsfBk+Y7*j8vF8 -x6U_GXMwyLy1UgK5G&4%22dO-8~y90M~0-YLx6O)T4fuWT+`>JY(Op>qc7=lS^R!@l*&pz|)ENT!<LG -1ZOf+VCd^c(1>k8%IC?1J#To<YJN4C_#YRiTB))gccAe@S!xN^5CLusEMp7i{wyEZ(9d}jaXG+kTQ^v -_ym`RI_!u$!`>o2w!_bC!o)+x)Kh8SiHakq)K@-N7@p$6G3p^ZIK#Iu!o?wA5^MF1KJ(YwrQyH<-jQw -q~_@1d`DIXT6#--=%gH1<p7;<rBxP-+3_>|gch|bM%C*cTf6^@n^sSsOuawzrDK@WK1v9icl_R!No41 -}9CMq;r532`@2_>%Mm?3a2T#vV*jYy%Xbac+7Z0+SEL3I0F=@e#1Rdgx6puOFJ(h7GuJ3A>Wtk<9xY$ -7&v-TY6q=ITui??_65$X1rHx!k$+f7T%>Wf^I!Mgid{p_()#O;h2Co@R@vDVQmvcDFFONI!6VbmL}i^ -b2%n0bpUUzPu6jik=!Cm5BO35!iiWIgGmawnksg0c%;m{Z8WD$V~qv?kn0M#9U}Xfi_g~XE$7S&RZNH -1S&!Ch+XOgb9bMD603MQ~b5hR%Zq6AW-=->=HMV~w4&zE|A7$4~{D8qzVJG2G5O@PcJGxI&qzTb1U$m -pwF{LSB8fc+0T|#j=rb#gGwDBW<N~5d)helU{MlsaNdPo&JF=H3s6CguceNVAUWfBIMu{9}>Hd^&E%* -F+&hZh%N=wVwBPG{`}RxX<?AU8Y(js8SB@mfA5`%(2=i;B<^*sw7y9HQVDBF-&7YJjd*F$2c)bY$u29 -uRJZEew<|IURQGtj?wZ{&isd9lY5p#V!=sO|f6@-rV~#WMi=!>md*VM%kOz?1rb<8jTew7;OXDfoc=z -LR@LmPDCOr%F|@_H4*Q`YjY>u97!%7UmVtq&NmsTA1NKAsv`glF)qmUz($CBUXbg4#ExNRYrU1GC8&j -E;u@S~JR6-nTF==Gzpz1xAU==+Tx2z|<Qtfa3(7Sc=r7eV?4lAy?oUKP#Yyg}58vuQJjGONUtBc7k6q -3XsL(h?y6+LFAA(?2$)qbIl5|g%1C0UJ9!^5$c5H<G5}DXS1W^jj?LaDkM*_N`?d(Krx84CA-Puys`_ -CR1K#y6oo+B}!D8T^^jTlo0ck%Ivc`3_w%p2hH$bQbGWBUzToYWhxFm1-Nrs$~snC<Q4s2D9*SkkA8g -i!3n3Jf&ZYIGsp5#1uen=pg^lO{k8cM}BX^pb>MLuS7vxPKFX@ZAOmv4gZ1B+y%yJdd$wfsWxOkhoUn -_6DogJz~i%+Ox%JN6ooEgZ6lLc{Q9I-3Y^b${JQW=K$0}xf9c{C5GUNj&u#)-a#!5tqM3U<_2`5y9a3 -;5K(D-(}?Ccz47NS<oGq+^@}fb*Uoh_R`R{=%BaVF0qNXGN^U8ev{-b1Ce5|M^m)Rz@*wgVHssS<jwt -BKp;))+6=$9-9A0#WHvnvU<#%khz$gX-;Ra!%JZHZG8@zVgYUn0lReEAa0b|f*7*j#|27O_hwW><?Or -ejS)vM_hxCXUT%hZcS*VcXo$r0p9SSF2+?I}^&{%zJTB^^c*QNM0%0DWOe+Ub!@4Tpe3ap(7$V3be3u -#-OuPv5XxN;u9An!ZvMo2JKEAO_Xvp;zd(xzMz~F@aI{fVT?*FXPvADGb4dP^u*q?v4Vl6EF_e8X^SC -1Ak-ZS!P`C$-ip-AA#QrTBUHSHy0aTrRBn}87hgV`(>0o5Oy9SUjv&$#CRc@kauixOsNbZKUNyTxKMe -5(vi0F5dX-bwr|>~Do5nQ_oiUp*pm}kmmI^=mI(1QCgUY?kiI*|SQyaORle;2u?9*<W}I?%eYlk~AYH -rqQV<RKXmvhR1v*BJr;I4w*pS08i*-_Qu%Pi6jBf=DL<zJq&{!zsYk_(}hTi)dr!XTwZbOo{Z>KQAy* -6J`5}Wiw*Y`#C&3z77{Qk#4OJC@)oi93<6ESqeD_gD0#MUcO@DZntkTo&r+1hzf;mLd+bk{BVrRRjIU -ypa-qupD$&2xYb%26(!2nALvc*=PuR;y?>C><<&t{-1$Bh;Z&!(}5OlcpU}@hFVw*!Esh#bV$B=Dmv& -{FVpy1*FV4-Nhqj7Bb#LGqnu@j_Se%TP~YY@1b2723ZOc)QZY5gi`J5(s`_kQ{dowF_E-BopzwP=4a8 -)UQ@IprKT8+jE=!0HnoKpgkHU{cizX=1lK{R&(LiU=}GlAGdqr@8PQ_JH_%(OHwwFqztfm4KI>hv8m1 -f@r%*cjYSN{+9_&me_pj&mk`GIuv$*qC90xuK*_&``gsAHNP;<fz;u;q5TLqOJex_todspjVgFe=g1S -8O&;H_F}x<O!1xL2hU=fj!Z<5d{z;<p;7C@uAJr6XxRMJyKh3G6486<kY$?YaU*ZSi&g8gqvIBx*#C7 -44zf-(4`aSJvOjGF}vP-|ZRTr!L20JS+AqyWmjF1|u75ND7$60w1l~_TD>y5-c!napnekX0(_7Jp+c; -&Bds79TyLs^>$ypE}@UkIh4|svDa|*|3|!PU6CB5I1V-T&+sn8&-oK4%8OJ&v2JTC_o>`|UqV{Em4Q= -ezb-%P>frxPpm&!7W5dn9mm$1U!H=z9*xi!%_HX_<VMv0(F5e3f+_F5u3bd*xM*V*gPKy5lP)h>@6aW -AK2mnzTaZH(5O<G7D005G8001KZ003}la4%nWWo~3|axZmqY;0*_GcRyqV{2h&WpgicX?QMhd96MDbK -AC(zw58SDbq3ap2|y{v~!cGJ5_9@(LH~i<TUN&c{mgaS*$6NB}m(PZ|;A;-335`pOWQxG7$mnE*6W$V -)4P{a5(&&1!0f{T(DJ~vd0vjqdVrsK4;n5%~+a8g2fTL-ezm~Ic9F;v$w<Ha4>kqPUB>o26yX>S>A{p -zkc)jd-(4M_JK!#x|;y7c*au^M}t=Yea+KNAVdIU0>Rci<;yL*OWi2r{+O*&&RM)--r7y?_?TreRJCO -Z;j?&|xj}@ixxieq1#$qJt$~n;SJ|VRa^lPtBK86oC^A3x@(qtNH^UlNK?rTMvNdPJg~Aw)s2ZQUA<z -SMu~Zkb#{gQKg9Nz9(!fJ1V*v8P+($liaTsg@RR^MzI0TRb!nuHUAh%<-iTz-OznmJE<jXJ+>oM~KB) --fu$P}3A@d&Y?E&mDqA$W+a0S)XSYH`USL18@!3N}-s5}5P2jyKiT1jy4WPa~+76P6!?=&05|xtC!MB -CO&tj31>AM1Fwn67Q+|ZlKg%#t)pDB)dI|GvHYAfqjvbU95`4+6_at<Vtc-HOSemv?@g&L<V{gxFJj8 -lq#*a)|O0snzF^!$D1#c`IOBT?0SCn+w5$5#)gvxq=#enWp?xF>hlc)i23C5<_~uDkxefDVE>q1o{ib -`_v`s|v0ztoAU3<WKA%k?cXoMt{`qWn`78SXn3q>K?0j}Hy8*H{S5&1UHk&Sx+{JW$`U#Sg53}>x%^z -bR^>KD{iF7|+&Dn%qPv$qX)6eIVIlKNmzrI>bfrT?5d^x-PIEQ+s7t_ld8|sBTHvJ6}Z1HJwevXv^wa -I5_!yLI}r&rg1%xAxTx?!KL&d;Wh`C$s&O+K7YWo6K`)APyfV$9Aa7n5J7gmndUu!RUHd1PNcO)(Seo -WQ@+o7vSRHs<u|@@5XnF|>7lQy_ntEv92Ona>s|mXGtR3v4C|7I3bJ3}9YPB^?xcwQm3f)1Md9f+Rbe -PR@ba0+D4yHMl((tWr=}$64iBo^r=w!3H$}G)}}J3=c=92LqMA$|Em}<51{~04z-<BL-!3vpCghu`P< -SZNkN1;5cp$gE)oSPS~(vwAfEemGw(P*3XX9yPt=E_5kIeqZ03p{pPj(8tfso=d<9eJS0;JFk4V@Hx- -;Ico^-g6_`C#bkuQsaQ(+IkO0nXO)`j9@z>Y4?Bs+UL-E`0;<s4*uC@IA@h$uLgjsLL?A-`NwqgMKe! -$=l%}sRYkOUAnOUINSfEB*uX;A=aS>T0WQ;Tf;mH8Qe$|ze>p}b`fx#?EtF1Hy<84E5Zzb|J0J5|hX+ -$RzIiw}4xcq>;+S8$ot&YXqZu`rJAMlC#A#H8$G`xJ|A;BnO8I*$UJ=UO<&_Q;A?#BdV28T9GK1}l|j -0!_a){L_7Kha<^9{=H)VE$2u#d~~-0t-oMzkAZY1>;kHk1hm1j-mss3VsGD!*!S#><ggTqBs$BEz^=w -%RF@$~E4_BX1f%@ol|>?8|8b(z*IP&6qmzxwDoHx*cPl1C4;&XI_~-K#47-qnHd`>=tc(`vzm&t6jF{ -rJD9+Mt6&8qCzgweGk;$Jto@DF_v~vZs$}~;mw2JZyB=kK<sFJx;Mol?MT0g$qi`I{CYqWeGvfp6<lP -p}{cffbB(87$-i%=2)pJ(FN-3s(lq%FenjBXKvVutM?6*3X<tBFek<bXSnhun(X4KJzBq;ZmEV<mN*i -E$c~xy)UGZK4e5)C?$RMWv1=?nt@=qw8qY5e4xT3vYoRsTR(;`>*X87hYP^52+X6b7e{~#>`+B|1i_W -JZK{Rn0R-*L<71o8WRH(T&g_GaG)Ux2a<94z^#!%8swW1OXIShu|gctxQHI&dl+GkBd{*JTP@Lb0pA4 -vxi}bEeiwo#20j<e8O(i%17Dz<t3-`pci?M+`KnP#`6hlSfP9o$kiZ0E*Tz$*SqBx6mdP<1(HI?*OnH -DU!y^G~Lu%BQQU*l_UVumDUr2o_J99@bLZ^h_b4UE~<T8#botne6X&FQ%>m$3MQf-7ew-|Xq83m5SoA -v|?mCBgeBqGpKEaQ(o1Kj|GW*80Cid3^>N^rHor>Tr;dW*eR2n!PiC579gxesobW4R(^IeIt~rG|o+w -Tva|sLnOzR)?$VZ8^co1kG^!k6h|xgVv5tmW?g!nMx|%)&*weevme&6Ko~U&tHcM1H5&3#H!%=wg&fi -0K_M0VbG((6s{g*^&3=C$JK*J+|~t0WF%AIXy!{|7Yv4gWn1VoKu^<vmbrl(V-1qX>uq(Q6@&GeV-3} -S#+!V=9IS^%pUf|k?SrwX_~7w~HTRB5M~%JyafwiE)Mf8<kq02%=58R(2SK$kf`3hG(1NL}YBocYR<L -^;nYLE%ZcqWyCDl5=J55<(e>#nshE$_K+o6py&TVOn3Y)SBo-P3F+RfI|2jO*RK>HXIwgEtxma?^4pr -JPs>&2P~o@^XMf_4PJ@5Pn9@;huviKb#%FCc{+T`8QHucy~<Umvqo5cxn7(Zkq<M_43hddMzu>tO?xq -bp3*&=W7VrtBZ&7El<%)EWrd$WrSf+D(vfZ;J+X4O(c0606hW@zkKIF!xdX7^z}3Bme$Cqc(Ifjc%jO -p)va#EF43mB#a8t?CE?oeFaR5u2$;&TC)0gHnfNEzs7~dBi3jzgw9%pAr0D`L!VbuSqJuOdmUrarn=> -W;bpeFS#4DS26uIik#OBJ-PPEJ3)$WJvaK3cxpn{G+ZKl|bpyef9A#8&4QWJ3We0yA)Fp~DhLz~SZi> -`!RuJX+Euno*57yT>B3x(~l4)(Lv1E8=BP(93G@;66Foa*W$msJx1QG58dfcKxVfdl7b*Ur^|F=0|O> -0hoj+AoY!<1vTt*vU9)WlL5Ie~Bz*SmM`dU`;cPW+oo8d;iy+6Quf6TyAm)wD)YB<*sY{sq7|S9`2rf -!8tZ;DR*4Af_p9--?8LOd4%LX0bq4=JBoljsce(E$zD>jK#0XplamW6@_=&(QD+o;m8Ho%}`1N#Z8r7 -dCco0Q_AMAJV@~*ATR}sA}J;c?wic^aEE%%9{?kV*<dS2oiK-8tChesQWJ5Wddi8X)*v~7rpOgV-eBM -qGvG=49IAa=W2z;Eo@IO^O!wQEW-*h7HqKr!M9C-B9a}E-rR2#$MdmhcdXLO0p+SAE&MYC<{Mezlpq; -ka6}sb<L=fZuMb2p4ioXg%Xe`0&Em%w}bI6C$Oadg`UMa$)>72v!p{NHf_%JBX4zlS>Z8n_PjIjH -d3RQ^3iGPHIqJ)IttyNf*w>P5Q;80Pv@S1Zbc4=p#@p%Kv3<UOx7tFWd3Ur)3v@>PB~bhYX(zAo<Wmi -W?JH3rRV+!eBX6Ynpdt)~SGq6Mi>!Klj?m7Uu?Cm|`9BC+Dv`&ImmTV3AGziuw2;i#o8);Zqw*9T=Yl -PtO96G|qhX;xOd2t=P#bf}ew<t5Nmyo~V*Pja;VoK!5s%itw*s$EZ*M_|r|o!L4vE+uvh0YLI5qq^)* -XDtwqNZG-jVXcgQgc;G{p?v&EkGTn}lY*Vg8o@^a_ZiDle8|N;PqZ^*_7k+HaY6Exte6!g)**fJejp= -&23eZMkon;A3a`An@|8!HyASQ4$LIR8JvUmptA%%gDHDu9&x(OXTBg+&nW>9(y9!8O47a*NP%D(t?b8 -&uMqzFCf?ik5@7(fl0<4VhANgF2LxIyS_0+{tTIp_*hLL?~PzL;H1FPhm1ZkOOY=tgnWK^lCRF6tGe9 -TngaS(WfjC5H$S&<;X)idQA{p^`&{2&jz^!hX8BxnA(}L3Ud+hq^<^WE+jsUuRW>M#e4*3-UdyIBj{m -=y=zGcQ5BT<1vv>Z3utmJSUj{p@%k*lqaduOMGmF5wUmAGg0zR=|wlAhMh1hMvtw??#UHGup9N*1LpX -F8^&bw&Wa~hW~;J3biBq>lK2RzCK&^!kCgCIoalV5?+caI+OEk};Ccy?UX<KPJ!$e+f$Jlf1>|tt$RC -Z4xxHA~J%OtqjRna*ESSCM3XYH+SxIUdWoB;=N4}(?9*W+LdKCyb2;<aS$FZ`~+5IWzoa&s$?yA9;f! -SZhW`nny${snT9NkBKRT!AP(!Z~&Xm<Z1C0)glQpS(PlOhmz%t0D;!-asg;4)U)b0O0o;)*sIQ2ouSY -j<{E)$eZE?bP=?4Z)7d=^9AuWi#z3(sr_4gHRZ94(}t$ajoA=QbTBxGTlwGk63S650`1YjI+{NsU;O- -W^Nm;r%jk9p5eC03^hT>M4#)T@I`H!`~Bj4etlX_bc#?p)!pKKHQ#5CLFC7ef;OUHb?&iZ-@kT=2JbE -n0s8InQ0@vfw<`Xw_bM7(0-kc29rdW%ayuB9XM_!!>YkB4l`Z#S<ms!rUr-*>RyQN%0d4zkWU&oon>+ -gwV<=SscW{eZMgzQVB9D6vKAI<*xUE#r8w}+6%1L!AsiAel(V(3#D%Fe)N5<(U9c9Q<4JdNVA$Q1L6> -Zz=^PuVg#<Q0}rGou;tH_I=(-jCcICdKabA1k;e0DgxWcDxd65Q|*WPpLiPwL(si2P?9L<gdp@Xy5+D -DDGs^XMft=h4A+7kfX2Ro@@YNy1z_A2*K<tW+T$T5SpoYuwC!J}OBU7AfiWK-{d*<>zANm5FihwhAz6 -ID$56etfo4A%TczVeB1@4iN6<AnQTsro5kzo#M^3;9=*8x~<Nny>_}ft@chLEfZ}y5%yxXPmR5N4LYX -39n;(n&vVrDa+R;!?xvc#TE07HT=GD_*^Ddw*~*MdS^LkppXcY(s*`-&>n|IqxJPm*?kTKqV5Hu}@nW -q{?OI2DL8V=9+grPz-V*LXdP|tSdfU#|bM;m!OPAhOMZ8OIi?vW2iJf|zaxhOK`(~P}=v8%BW$v%NfE -On`YF9vAMdukGxc_13AOYT?!#haek%9jb0(j7ioqG)6t?Iu6AE1skjYIJ7c$TE`liG@ZF7{j%AJXzG6 -53gS*BiPl$PN-{f6n;I1#h41$0s-P!vi}4Y0bG$?7WnYJPo-{V~-1QVA}xuY5NjJXgmFd4Y>w`@EE85 -#oafd@g>OCs=wyk4L1kToGe9_x?TqD3%p65tzX*6Z$gN=>zh#0?K=zb*z#L6@Y_(L7JfUXUW&hX2?5- -*eG&f4_&;^MHGd(E&k<cze5n}8ZobS?0aVH%#UBoufdI-2xf|ulA=u!()@R>mbfX)2+ZR#5xpV6*w|F -IT7k<0{+U4===fNuMgM3(p+v~-4araz5ws0OhJ=vO|cloj!yzb2wWcKi9MG{BfaPw0Wtb4RFcYl`_#H -o+gThvL_(V>rk>xHr4Yw$o0C4lc3zXZ42lP%G^#zKdz_8klo{lL*6k#`J-4hEk;9<=iH42Y_<caI1K- -y9N}(C#r&9zuP)VPPC>RYyiyu>atgBN9&E<#nIE&eJ*+u7`y^b*`jvnA(;2{hHUq>9dv3?B#C#YaU4M -RKaRbbd%eqh@I~~f(D(Y+|4+18=6K}?M32xI<yTJe6z$CbnqU&z9wHn?S0!Cfr#_+y)2ZpaWTDZe^9; -dkN(x3czP!W@zgxFCuTY8NnAPL_eL)417VjPwJ(8c*CLUg*F@Eg{I5rZaWrN})NXuG&5)0hDS9sHAKg -Av*}D~dPo*Yh#pcMm9^?^gHD-VtVR(`azOzv(rB<)jGid}-mV(HsI_MR2IlI(?2h6ENRzsmwniW;v1= -6pnS86Ta$Jz02dgHYsG-R?i>{TywoUhM*E2>(VHH<)7xwj^|WA<G-WZyAr^>~ExFyC}_@TC|B?{;HE7 -Kff3XK0k6lF2fB!ZKM%kmwTSDVOCcQJ_l*d<#St!&9})mpc|hmg`g%<}QqvZm2+10wKybm8wk$HuTum -0w}`At_GOtwiXnLt|nA6I@(~Samp_A!Sx^T!i0mjt}*xyy=(iF4OI7ELhl*<FNaMP!wRydF$gjn$ylQ -S{s7TBmdS(XhM~Kpw`BEWPyHGM-*|0S>_%G)I~})yogumg_c$*VT260h-pkinBMLb~bfA2b#`4V{Q&0 -6PQhBtD^T>B}<Pb|`G#O9@va>y!+8l|i-UB;Pfo?7+iF09TVHLctO=76PCSE9-wPBG&pOqaboi{^O4{ -n96)Vjf83xBQMQEzGqOaGNY2}UmvLPsU?Rei)zok6{><<t^g2P-G7Z3(MmRAuS+`4Lu6hl5T{F5=U)^ -?)&Bfz|(&XELUnDrFe2j$Zpz@r1UzV+s(!LY<|loCHviMnzB&wdnnE0HJr>3bQpbv6Qju#*nQ<3|)a? -#9Glz!&b+Xwyg&Z0BSgf$?L|`KsDUb5_Y31m^KT5M(dt$g@vzu|Ly*<&E5eW-zFe}F!UMAC@9Eod<E7 -<A)t$6y9h|AHvBLU*=~FZW#T^s{1KaF%1-JGYB(Sbv2<ua%SLp=%W@Ngxb8-vVt}t2wB4OT;z-Lrd0v --DY_mt6)gcny=#OW0hr~8|W8cou5YOt60_GW=Qh*>%VdJ#GVX-*Z6EZ7&3-AkNEG%jR88%-A>U7hsja -MK|I+CRwlvLYx(IQSwW7|j50`_!tA6O>_>2CVeQ_rLSRkD8DQ$^DfEv=UMPuTKOm^H-vLeckc%tc$?i -a{9|Pj8J51N=`JIx0w(=AMko7DU-Gh6R){_8`|@(2q6z`NMEz<APe%6q;y=atyep`d}9*gZo-t*^PYu -L_r5lIDkP=2?5X=0G~}RgP2nKrA>s0ZJnZ`4~VHtR6@GP7+5IHPGKg^rhnybh%RzHPkPeoE_5Ya<C|O -d(+PWH+$ff~b9!ri&hPkBNzlklh7F7wEJ0nknYZT3ldncb*t4R&>KWGTX}fAs#w+$EPVe1RdL9`6HFG -214Z*=;OHcs;p4EDX%BkRumatQvgs#V}^yr`eJQ_3nfd>pwpkN#>JU7wX7loF}hq_u~R@nxnch<6ngE -;je|Lf~p(-apfXf5;Am<1hZ`RZ$MJ8I};@p3X=7Q<+`R`K?#jW36f5qo56ZAC#1-7R%hXI6E&M`dX*z -);!eY2#j+SlGJd82waamW5>4LUKTh@|?=?jjT$!+Hk2gLB*W-o15MVIT7NM>VaA~BnjG(!pN#)SL!mF -dvIk2ja{|9te(yq%t?ShanCWr)yX{^{n|4~9|27JpK{u)v9d%>X=9cxTcY>KIC!m*v2=*MEU`un6j%r -0?FNo^0HXlQa5&krZNo?+V6c-C$I6yQ46G7tP%}@|a7*syfXvWa7mf<Y=7h1Q64k&ZQ$WfyF2kc^9P4 -tk*ft}R1S?IkT>`6A#gKxj0JlvkZ5c6HXe22LClcIV=_N%43acV^yQ7e)@{$gu>tt}krQ&kKF5E%7Ag -dTPw)(hdfjID&NeR=LiUiZ*l>=GBJBYBCe#t(q6c3b9Xq#Ly6!M7-g?v1E-%=lvb8yGhQuOfIk>1*SJ -!hABO<9;qR!hsB*b-SXN|J45^ye4xxktt32-t&SV+;)vm_xE&gFz5Oxm_~CE>S2Ixncb>zhR&%0}f-( -NBr@7k!?dRG0NQx^c;%VZ|^Af+p+yaWgxB+U{w;flQ^LOGk5@s(ifQ@=UK%90eGvbOFLWL*}+dGaLac -yx3;x|@esje8E=mv(AWrS-4bFML8MbGNmc+}v6+k&h1_FsCR_)QkB$+t<rCK)k&KBKWOkh?%iw4Q!v~ -3tP-+ck2%*ltBHxX%N^H%OHrq7|s{iObM;J<k><ndYp*anPRvNE2eq=#=D8Je;>=HHp=!K5K`dCq@G5 -`QZe-}lMZiIVqf!crih~bBdLc#0G2RV)Ap()^rDX@k%8C?OOWluB(P~+z&&8smd$@0{clSqn6lw18Lh -dyqBsuLOHbd!q=BQYYY`0WN)1#cf3;nyO+)^bj-f;U=@fP1zaK)-d%iR7LwM^5)>IaDH>-R7<s<bntc -YT)C>1zvq+fRf8dnD{vlG;`LdN)~xH8(DKGke&37e3C}(O<@8|pD_0ksQz1~+`Ts$?Pd}Tc^E`S<b7- -S&uCa3X!3a8fMCPEuzn>;B-Kg@D6|Z=rn<@DN?0u_+Ju)%t{5mM9O#H(towpT(5tDNk;FxFo(NhLnam -6@Q<aO%1}cW}p)6oy)am&AME=BERk0)I&l5HCmOlN?nb@30!DjbPqpL6%>-wyVc>qravILb3HJ2!cgd -{bb+E+bB63jCJTISxN@+8OdbX*QWoHywtP(|w>wL6WkOX0m6l^)Au>L$X%{}YT;2<xoiF5>=4xorP3p -Il#0=gwrYnEiT*A9-2SFA?O4kDn)MLHc}sHo2KD47uw{F$#431Zh>-FX&)xtg9OVeia=SS_+(Qwy5V8 -w}&-Csw$QYf0C+iGNhKXv_iwc!E|J1;S+Q>`9tLehT_@|=BvXsa%EgrpccNJ3hAH9n2|cLe~inzBy=P -CHp6>znU;9vo&`R4QGLL=ZrppUg<@bSS_OR?zG&S;{s0Ri{2G-y+Et$?QlELE%R{v5BrwV`o^=%=H(y -b;u7{x~4bG`dQmaa$eqxB{fRB!2d7;qp!!hh9MN@(tf7Irh5>0tGf)#+~76BeK+M0C1z?dCn95<5i+b -5KBG-lRl%>Mm<m0K+phUv-ZH)@m5y;yEbqX_B9Reh|hzavczuO7z6X>bRN5%T4rq&RW6F;<%SsfaL^h -j<#EEYy+XP=VtdReddj-q+hg;4T+I*ZY+oZmWX}_cW<`V2Ca~VxlEJc)>H8$pT~46aoPpX&D^VeW?cA -Bh1PvU$uZ53M2be3Rhl&8Y@wg4q>t&T+t?N0Hlh@k0Uw9de(Q!Al=q|RaxkFVrUDEB_INGD1ORAQ*g- -SLm%R&7*xbt0ZswNNG_IqMC`Mf_ZGkCp<^hoK>>BpalA>C(1vOCJ9b(zq0jF^wXcJ1A1j`qsLF&P1^N -;Q?o3k9@gxbi`okba<K!pR3<ID=KwEIfl?}5aRnd`jQ|lK^+8oN?a8a&2%3peVfq8C(M8S7OJ_GKv=C -Y{rHw4zd6M*2kx!_u=(UI;eEfs5I57~G9v~)XkEZlm2+2<!k9uaRq%8oc;p}Sf7F2(<SucH7LRDdP5s -yoWF)%X8(RMA`_HIUyf#PBv5S6|n`pejY2VfA$`HOt7|KA2?WZ3=Y!^tT69*k-)fmtcVAJkeR|3N#TR -18jhU(-WI<o*NfT)x0JTN3N&W3`66in&I=iAKnlKArn$@g%QIP%Lvcx?T<gQU*??R^!O8U2e4)6?x<} -<5ES`xAlHQBZMjj?F6uJ7h~w`F?xx<F_7LTF`ZUvuH}(q-NmLU5H#ZIF&dMvMt|!8%gwZO3r<U&sprs -8Wx}3|mOe$WI#(=*Ow(1Et0$OV{J`q`SAVh9}yk#!$J(jV&)prSbq{5tY-)7bV6d@rWg>)Lf)QF_XWX -Bs0pss+<FPv&*l=??XL^=3H=;w-;UxBZD8tfBK`H?7U2w`T&4-{}A-m^(0#WK_r&rpB+kOU=lW`o~bG -zh|2UO}7WEK4V8C?lu^7zFe6NP`~6D-GXrN*kfBdTZ|8V@nKrMRkpSF}lU*KTQ!VXc*Er$qZsp$W#0V -C!SYpNs*~7zJO<1MP&i$Qn#hyM}^6tfKhD$wuh~IQN`_F`Jsk#c+@6wI%76F>}yb+#ml8Ff*PHU-+K% -qj4VDz|A-`Gehq^xN==Ro-?*^{l?rWAWZx<-ERP2N4^T@31QY-O00;n48F5Si00002000000000o000 -1RX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQVqs%zaBp&Sb1z?CX>MtBUtcb8c>@4YO9KQH0000808 -trnOj1`IxlaNB0JQ}G05Sjo0B~t=FJE?LZe(wAFLiQkY-wUMFK}UFYhh<)b1!0HV{344a&&VqZDDI=W -@&6?E^v8uRNIc)Fc5wBSBzY(1T93Zs!A2wJQNiqq^i5xOOaYtV92DnBsQ|0ro8mq>svyAY#t!?oH;Xd -e4JM>em#b*%((b9fy(6Lk8X!hO38+8_XnwrPD-}NoEJ#`T|I<M8yJ`!!u`?gq=5IZUTeACqiK`ZYben -MGsvZaN+Z<V?0^ZIVXND0W=PG1Ba*OH$P5Aln%jH|fehs4H*QVh`{Si63tSSCD_J&>xc%r?i#tL{hB- -9DteSQP8jE}crOYs;ijH7Y<vA+bN%~a^907_TOIQ-<eNZW>bj%P~7hIrU4JSUs_38c_kwE6X%J=~q?U -E14Su)Q-NCO(pz_mMs+te?9_`YfFem3-HEa@J_xYhR?D=M714hLuLQ!f6nf@gksxKS{WqBw#YL2YFKR -ur<vY)Ih-e8JJMO%HFi;>I0W>WTvwp2$b+sbw*u+6dV5b_2vT4`f=Sm7~F1L^rzOf~lip*<A3m+B4cn -t4-wSP9H#Td>0KY^7q4P+R$6-#yZg=5f?^xTS;r8mBL&*f_F`o)<wWII3t|uokA&$dlGKpZ9kaH<nwI -)>G{jkYWh5%&mLBfi|?~*f;8<iMArl<Cuat@vInh1pur5Zv4WNw%1Ya8j0E)L0fnYg!pU-R0`@Lv*D? -p<Fvc_%d05^vt_GIE%iFnpp$ry%=i19;K^U2?NOVX2Xt=J+UgBI@%nO`O?+Zbr90BNe4gNKO@yWg|?v -{!j4wf)LPG6Q${Cu=uj$xagM3;9imapPs<UdeL0|XQR000O8Q5kVe`)$hQKLG#$umS)8I{*LxaA|NaU -v_0~WN&gWb#iQMX<{=kaA9L>VP|D?FLQHjUu|J@V`yJ!Z*z2RVQpnEUtei%X>?y-E^v8`lEF^HFbsz8 -d5T}`&`qj(nRY>N0fEE?9wEvacZ+D_DseaZ_N3_;Flo|qiemf!KihF#&p{B!sFZ~9ULl<YK8AqKNWIs -4j^a&6Xa--4V-FW0dqSKZO~ks|6tP5P90}~(5l7<%!Y3&=J4_{46&pAyB8;FV6Q|^K-7(uLi==o0tPT -`nO4rUej0Y^&B{r*>csjwjNO;S3FClPP-o2W(-J1F{(cnPdav+PEE#0kDu4@8!h_U^le5N3-akUZ366 -FQ6qOY2I`Rg(RoM$&T{gh0zAUC=5bF10VpdWjOj_uIWxhjXYr@~kzDt$4qTOlX4YoNdT{WFk${7+HoW -YtnfUd+6q8=chx?=0{{mTZabAh28ylaTW}9H+geZ_)=oI7^k%I&Da6JYrc~iWen{|MJC3eFIQS0|XQR -000O8Q5kVewK|V0vIqbGMiu}7LI3~&aA|NaUv_0~WN&gWb#iQMX<{=kaA9L>VP|D?FLQHjUu|J@V`yJ -!Z*z2RVQpnEUukV{Y-Md_ZggREX>V>WaCxm*ZEq7v68`RAQF4Sl4$g#-Tb8pfD@71)Be6-2z#cl5v)V -H~al^QK)ZNDM{rY>VdtQ^kvUh7FF#S^XRMk^2?eTd0b|q;oe70JwjPqKoWiq8=qcg9Jrox&vUG4k|-; -Y!LnUQo(YOh2|+m+O`aZ2CN_4Vs?JRXlmdvsyEoYUKta#W~N68_!jTw3zbbanlTN|j0NBncOmGL!RPY -w4mkUaNve2y;F!)iNcbmG{;B@Gv)-OXGHG?9JivVJ$9Q`E@xOsdZ(nCo7w8Zs!=4szjb!V5b%IE+vpJ -MfRDG$eg^Pr|GlDq%>4l3i{3qQl7CZ?Yt;U9D)mgjX~|4m+Ki!mwX79S3>77_5A9zR&p)v7imw+;7~` -2XLoF&87Lr1v2D?cgX8pvDH%w%TLpnempjT0y}Y=Nae;e*C-@UM%+}#*1Kp+0m5X8c7*A#pA-xITmy& -_zd^z}bD|X>N_Bs$x)4!x6Z+G(%Turs>TAz*NZ6+&E=VATKT4U>jtyfPFcP&Sw#R7IaP-n5g+62a>Pt -v2wXf(=7fpagU^{P;r@G{6reih{=ew{{{6^`L}E(==Z+ObK|!X(!-YOI{WIk$_gD)UU(+?^cNw?V>RY -Oj&VGGlZ81~<HU^@5%qJ^f)uPDXA&gU!dIaH}SlH>Px{lD-JsVn!X>BI9d&^{s<=t5#J5_H6%$kI^Ls -Y2zu^5f6W?^c$<`l_;Hz`u6B55-%`5#^CtC?X(xS^ZG<73%`c7GupRuEmX*%69`USRVts@NjjO<0Bk_ -;z*Zv!yW!M_ClO^|V%#{Ie~j2#pJJ=Io@QpFeKOgv#lpz$*iXYybawC2xpN@l-qDYLeg0%l;)_u^<x- -<~I5GtyVZR`IX}JTSB36>MLGE@EJW>leAzOV^0d!%-%^Fn*iE&D9gIwFOJc(3YmddSU-V;$7l!zUPwT -Xp_>0L^`E;yo&+{$b@DSe$TqIcO!;f#h<)TosK*t83);C#JD=ypGF1eAh%^seVG6q&5M6cU{oJ*P1}h -Q7*z=+kLK6jw=L+f-a4VF6_VO1Fom6WFKS15v2i2XdfzNQ>%za?++zv({+)N|xZio25e0qocGw$$cX$ -6}(8-KVQCk{gN&&-;(e+R0T(doFzdO>H|)(gL7^ig+c(~gY8OXt5Fl>UVyWeup;v~1(PcaC!_LFDVDN -~buyBI?=U|P0>8s{+PI>lJ!;VYq)*9za?`>Z*LKkoi7BYOlVveu9t7+`twzeTMO>48$+fT()v~Z%<5G -}{s**ZSCLjKtetcXfj4XSoQqUABw^e?XOm6kT!2}J!b}_lX-8bNOLv)<>PXAwF>d8T`xAJRof-B{EDM -M>x*oZCybb3(7tS{$XvsmyE1%+0JG!&)!53c8i3sXplhuvyrDqSWjnKbU4HZFFu@2AVArOraQ+mPxul -$b6oN)ASv6fJhU-R^&{#uRB<icF%?{<c4X0**C`W1B~4i@{m3&T?IA$l^e-8;v4IgQ^hj6(*K8PLH-i -&wmFLUuYEL1gbXnICC(3F}~9YmzBwH=_LJRlulU6G%o!M&~f<u?-!SE&R(2epG`--ih+Y^Y`hIKr%hk ->X0g$VC%42bKh^XE!<7r;lFq{Vj2%3MojH$8X)_ooT^RZsCC9TKuW=m6dqNQvjqh;X$watJDPWacVBN -`t<Cgi!04=W6;M$?29vf5@2L`qRo86#rb_@EpLl#r={EF(k(xuU*O}df1MQ_cN59671dV(e|3#B=b7_ -M%N1@qS-hCJ<s%Sn@>N9m90Q#zpW<;Jt3>&#SgJWU6K1UQS>a)(-DMq>&I^5`-pqtkL*vNEKs;8gzv$ -(S!MVA{m>fY*{<D!BUwE|hV`*i>+u6zh3!X3GQ{QO~Z+9eNSY)N>tz(H=}ywWz-){m@6pA{jUyRWcpK -gGHP)KCgLm=bgb_u$$<*xcn-uDt27uJ?-<MeM*oKxn!+5dl-WF`4ClMX}Jq`;ks*+eU?7Gksf{1@@3# -^lb=&^zfriK#^^qMe)K$$v<Y=IV^eaqK%N$c$8MR=Xo=wUDH681?PAizd>pa$6+{Z%9TB)*hT$Q+DGC -I5gDj*=jkrRPLy2IZ%_FSmRma-Gi(o*Uy7{xUy}lpDlWx3D#<7n<zc&2|WOgSmpqk9N_l*am%-}O-mb -&0;7RdkOH;26Sp#hLop;3QJ!i%#vZx@$WZ_h6;PG7T-u<+*WAMeiJoV^@JGPO^VKZDi$sR{W#^lph+_ -m}tv>Kxh!cEKdjJ#tXeo7bifs1MJjp4@j)>pjU|H~DArC6t3)@>`s}-Z_Ek;KgS!r6;O!238%o-_aNY -@TSbe=!-{UsJ5ux7%}-_uASm{0;VDe?MdVI-Re_16un^WcNlx>fdbj|N6h_2e3m_prCM5HLFXz?53LM -tLme&`bk7God;nL#HW(oI6H+Lw)DO|#JI}%XlaNMSY?8^Hl02iP9&$<eEO#^d!pvb$;p)5(7rS9l#Y< -o^1c1#3Y;8#>RCnIRLGZmoIxr+ukHK<dQ8Q2kA=92SdcZ*I`iG5g;$zZv81J^>9?Gr@|L-8%cXm9{=M -c}lbvPJS_(cWfAH^z<zghV(%m&1iUtDv*Fm0gL^n`Gn1|e<tIH1^S-f@HQ$G8t|dw>9&<$d$_=>7Zm_ -kXkC?iBk$c+lWEm~q{v7qPqykaeQg8=S3w`AP5X_d*-1RG{pANcGu2Ot)`DwE28HvZd5Xb7D$A(b3(u -cJI|aZoAi`yKQIOjBD|!Q@17zVUOJK;3G=9pO<*5j|1~sR0%)JXD#UIbUJv}^})iae<s>T_8S-*tskC -zeDD$UHSM51+-?mX*Zd1a#{q7`ci;?@fbc9VF&u1V7>qVLN2C5PP)h>@6aWAK2mnzTaZFNm;lHE-000 -yO001Na003}la4%nWWo~3|axZmqY;0*_GcR>?X>2cFUukY>bYEXCaCvP~!EW0y487+o1niIw2>J&*6h -(#=7}6k44?7WxO*cYpOC{-K{rgF==-SDAGT$SqM?Ti%TLVz{(h~w0*9K2w?16pL3&IdDzL}q%%)yqYi -=~Q9>Dyq%9bDt&b7cbgv#T&yvyr0}(=%2^yg8sbBH`nrPH#PyzU#0Q=R1AOF?@kgkq-f@oK5)ABa5cC -_JnXmTOsk7!NGTolWui@vhh4NVQ$9B9u_8kMe+ODcY=Rqb&Y>L6;NzmhTx@u?Vs1}dK0roq*y<{?biF -<)27(I?)C$2nUMr)*S#YJa$Rm0HTmX@P$o8xz;ih1ImZd&xC4=Z3)ukd%M->X-?MUYE&5*O;>(^0JAp -(F_4^?$)s0&b`qZ*r3Nq1CGw=3}0!PnTd9cI?F)0fR(cm~ADgTxjRd=!OMp{Ck_7sP<)oKo1$O$He0J -dr3t^LSF%e?*NP_Ufte}dgOpv;$*id@IlAg@Nls9%5Y%~NK&V8#A>q!V(yImL9Z8jqV*V0z1n-5t&?F -*zNjCLWE@{GJq^xpN0z{aHqX{sB-+0|XQR000O8Q5kVetDj#zlLi0)jSv6;CIA2caA|NaUv_0~WN&gW -b#iQMX<{=kb#!TLFJo_RZe?S1X>V>WaCwziS#Kgo5Ps)Zl<Wt<V#j+V-U!JL#LFgDytcLAyhPE^%rww -(Gd=3=fhE5_Rej6>>`LK*fj+*vzp7bjwS_cYRkqSRO+jo+r7f_fQL?f;_5XWe*{JN5+un*UC3_}pJWs -#VmC~u^ED!sJOP*P!O+57bWR}jR57WE(2xeh(s<qO+UN7e>5GKu3QQ*2zMVf0>mOLNO(r^rL3D1&Ql( -BtdN}h?8$a;XEi;D~Q{L0aU!oXZt9K;IjhC>5~;1Cdj6*-uVs$>pJJR_CidD3$r<C1B%b@#?@!7XNz8 -8cpNtSzNjCcn?;&v!NQ0@U&!{234)mE~jjtTdECT?10Qa+s9mv{;LRk5Dz#W-p`!Cim=MKs()GvG~lS -;fn=W<-jDj&W;EL8`NEP?9x0tWKtAsu$mPH_2-3^2f*V{nWW<)3Lo6Unp<YAcAgzUpH}-LaH5Cq9D2_ -kMJ?UxdGC)KlWJE5L)@)ns7F<Jq{eq>KPAi|1OW!7$~M3ZEDsR8Jxq?lDZsr5UZ{3njn6CMR;@mqY%i -6PgHG-aNL!4M*m70b+qcQvq4x>@mhsYd^Y#SKtJb@OIYoF?6?N`qsuXCTs|;U7NqGQKxbQw7>;{j$Pd -<XN7-6P!#6aUU(+9BJVC7Z9@&qP%jwn`vum+4+7mVtb1gHXozVOhgDoL(cBnb0VaA0{ZXoX4Gs+@wyq -GEQ#uzc~zP6@0BQRFU{6x=`WZoqK8<JurhE=;EIH;PBCKRwQ3jhTb7d<(hars!MD&>i=8qxnn<dq`Y` -XXs)il_q@$sF~)*G#(GmNq>8I`gQV<ewu!sygba)`Tdva)60BRd%XKGs?r%x1KKU6+6cPNaErrnEQpY -VWa(A7cIB8MgwmPj0J`;!_jbGxyvTTMVFGX#ZouIE8(WoFv5UoEqm1?X6B`Z}i{X#u0X!q^xM<*>w}M -Fra233D1&*({<=XR!34{^$F)P}@qM-E3d}S^<<~+vTV)PK(2R%dvW#3b6wFF_Rn5x8z<T(+T$5>0X#G -Jy=vP#-oDr(^Xy=j;+Sk7Z|)_8&36HbT23t!0w$qHH6$-U}E)5|9HEo>{S1te_--mPi{-ml)L4vUztW -i(nvSxv0MLY_cCjy~A3*XZUZH9hZ43LtzE)b9haI(4$QSd>y4cjIYBB2atxFBsSGuKUrbi1ZtTM+T$4 -1mmKu*$cZF^#AG)8)9+7Z{r~?O5FduA1Fy{+@iGhQZC`8PL~~%*ajWlFe%lZ=job>bj7wp9tOk6JZP@ -v-<)~W6;Lx#tQ7Sf6Cf+{J#ilFHyp2MvUacZE0DHS=|4F(z&@mOj)m-Mzy60FTPnLr0@|E1SqtnLm^L -SD&@g7FFB&o-LV6@`2RZYMalJYX(9dLP;FOkyt)v+Ru*et5?CI{0bT<DwoqTBpg01`kdnl1wO0BFKLB -<MH9t#ln7;1y^>I<RSy70ucP7i7w3X=U}a7I+HDSj@gOmJf-aw<nEj*#t=@3;(PQRjE`aIsE0FezS4y -DS;{Uw83HIuU=UbgWG3z&|GK@d;_u`NXk=gBgV9@K{Wj2)=_u)jjB*9G*Bi2|gGY*4+&BOJ^D@L$eQN -aq9KNAH1u9uRngOw4Zm#F>dBLueKX`2E((Pow7zql5`ePGl9f|+y1Ek+g5vU(XQ*do(dq+Kj4gE?8Pw -5-``J%m<QviP)x8m)*TH(O$FjXs=#o5+^G)A0D9u);0nK@9_MPh?%OAmRnBP+@>7xHr4wrNt*UXuh^P -$9!ehsYWAZtDd7M2@@BCC$Q#mzhhu|7)$+a8AnIk>JnZ|*26<E%5A2oGHi;=PFHc+!xBl7-nI*(4JIr -jef&zr_eXD)ahd#%*<hhhvj%%q~+-8hD8+;;Z$D2#5%VxdJA!2(}J$?=Or&1F#tuC*rYko%}-+;1$oZ -0^J)v_X?BjK6zEWAe5X5`!6=%Z-~lkfxIs)V+1%rmF{P#MGp^CZVv-ZQuo4N*XZcss)tO<g~>Xn0gHM -0|q$*)9KhBZENuD#Eh@6*QjT;M0VL;n+^L{?XN2>adQ7~T~<<F-@JQw=F+lS8yx@1>O|@FwJ@gQH$VU -K;r++|*($n;baRIH96N?~7vE*#rxix`<`UNf{Y~8i%dD$NiBoAO;73*6Cbp2GQ4l6+OmdXj<Z6FBeuq -QNe^5&U1QY-O00;n48F5TOVUX7W1pokf4gdfn0001RX>c!Jc4cm4Z*nhna%^mAVlyvwbZKlaa%FLKWp -i{caCxOyZExE)5dN-TanMl6#%#4ii()X)0%@8K0fMGL(|y?ng_ce+8=2HdDvn$9zweHESM0Rg@*%Owy -NA!cUvi_jkR*BKDuYP^a$9QSK&-7UDu+q^J;+&XEiAr#(Tc2JzCe}g41@YMj!Ti=iW{`CmG_<00;F<y -gC=qN5^XDs_bHZ6YGqr=Ps-p<s!Xg4e514dnK9Y~!O7|A*@vs-?EUHG+w=Fo!7GSvzQ}TsVO|J_QINb -lIlnl2dv$hkL6>^{8B;f#2SGp*uobtMY*1uq?Cch?Ohh5?@YQ>*Z~-D^5{WlMs+;DtvP72bP_8}*VER -LjkZB?+w`o*Lqwn|0gX2tEwkAnMx~bosuRK~9hW_uz4OyO6&O)vY(35C{BPL+*?+UGhhI$-$@l`2|*g -|i|s^fN^!}ax*sqp%m?8-6=QL2?9UyzSiUS;W3q6TveIq^h~dny#H5d^HYE>Nfi6w<l{5MApGiN>91` -#v}$l;z-9aC#E1Ui^Y^U?+=$>~`>3ONAM%_mJxCR`g;Y{VTN~5uxB@AS`?QPG*>m&FDk7ngSRs4O+V4 -FK*+J%+kxkURSUaip;WAx*_;ZIV|^Xqt&u9MIqPEpFWFUhNBnzm=AoW3sSMj5{~HdOG<2!RIJ@;lQpj -ML62Bh8~H`lk@A34AaT^;vBbfsP1EkbQt&v-|3PGw=#M8QODrihozcY#lwSIiNmicSi)~rpY87-?uV2 -4DTFv~#sBXhI!fl0m`b+#QoOcjk2PF}$AQ}|K0-`=2_^t<tz8&W<Z6Hi!_+EX#Z0{L(R1M!o-Jn6GF7 -~y)koob#q&sP)vQDTJr$iPU-uY_Oxj6FO0T$oU=PI87Ok}tdFQS+Wcd9-gykqfuD3cD~NjL8J<AE3dB -BcpT(E9682k3wXA!dwTwo^aUT08YY_OSXee>#9e#n>A%tgss6jjyr@euh6sZtAA%Y(48S=kqv2e;QRT -U;Y}+yN8eWg6{bPW&YzNrudIgInoV!KMs39&7kW8HHbl4M^vlP%yNq^$tB^I+DaxrThp3A!&lqMSf#! -rpp~LD@2159w)zf%QFt`Djc_DK3ran2E@>{9owU?Ub{NsX5zgVZbS!JgSZbRCTyCB9-o%*{j~H-3wB@ -IjcEFRr_d~trBusu_LC}>YjYE3ZG<T81qM-idw}-=k&g>_puDOY@e$3jlK|T7l3ufn+e!W`2<wyTvQt -Cg!)rOwRWS*npndyhQU)`F`sVMZ0%eV3~J{2zAOb`U*g8ZDpb<N=#xaAqxZBQ{~KZkYW4L^}R;RA*YH -oQ@K&~1|%4_(T?lZTmcG7PAHm<9Q(fE0}rQgs2YseCYUD~v4m_3FVvZ<jNJnWVI!?M)C6kunk|s~V&C -u6;-TSQhdYn>DpgKwFi(09#6MydA4kW-^@~;X|8z#F)kTFHz=%9w(r;-%GrjCKR8x3Dvc&PJEDI-mJl -pXni_a>F1ARVu#x)|La^df(r8Re+RShL;><A&}mv33P_z^wd`<_4j*puM}9(|5p|sF_&(*(?&EM!qpd -aUu0eVZiu^IwpA;Vqx{7Z|qsG!(@MFxw)=<wrtNd~&j+!u>$~D#BMNwhHud{AjF(RdF4jk$>?u*Arg` -6+cxIxl-Pn-G^8;9`3>-R}85B>pAO9KQH0000808trnO!PS%pV$Kc04E6m03-ka0B~t=FJE?LZe(wAF -LiQkY-wUMFLiWjY%g+Ub8v5Nb7d}Yd97AWZ{s!)z57=Tl7nr)5sK#03J4a#)~$2cHYn1fH+d|LEH*T$ -B`G^bvH!ip4_UIEU7$dHu_^LB&c}Nr*GBK4DC*92hKd5juGPi?ZmgD_qav;+wLg|+EtapiC7W6CmhJS -OY!7IhYl~6}QVh0XDaB^e1L>`#)(NdnfE8gy<{6C@YP&Q>o5^HSQ4PWtwWrdSs+r#WJ<lh=pPQST@cp -r&^3}qjA=i)rgss?<f?7zrlj4<tAyhi1fyj|f0xoaS;Lh(xKL2@X=o;uWl>UzFbZz+I%y9tT#xP(lYz -lO~W+r3Z0)&DREy45AHCo+6rOB$P14|Cp@$@<yG5xZFCu=)`+aJIG;q=@PH$?fEvf+-f8%qg~&Ka@c7 -KPdkp|xo3HzM8(1TGxtx)!BCIplwr@;~4)doPR_#QzY2sAB}DJ|UD^ITVWfS!?d8(xJE4t!dDW=(gl6 -M<|KQU4d2{SA(7PGJ_dq+YDAOFVDY|ZCQ6Te>bbT^%4B475%r&3<~b?pD4R{W_I(3!i^*^pNbrr9j9| -rX}l%r@n)Ws&SYd<(F7+HZM4EHF71WvAH&&^?xlou5*pkSY=~W8yRsx}>rToectS6K4`04HgC*lhmAX -?LA6JZg;1+^KeMb!0PCAwbq*(eJl7)U#%zDs<?Z*|4`iA>+e<eho{B3<b_GCnzM3uW^OT(#k8WfrD)F -%#|r^~u$3^lgU8ObN^M>8b59v(xFo`&#Kf@s+0oON|!>02HE+?IpjTGl8eSQeaeoFq&1K%v{-&b~GWq -nYqks4CS5cfQM6Po!aoEYylN-F6%9Mk{=us*3f@y5cNL;l`tdFJYmxFod!WRY`s87w}G1=0k>2doNtb -D7`7Ovpu+@JuYDuu;mN>`R+?L&DdBwbh8sluqRWT^fsTzs<1N2E9Jra3)u)mSktsOT?EI(dBmq!yGN< -9dKWX=Kj8wfQ&FKsg$@~dG9edc1j>DVpCvk<!JXwy1&^+Lq`y9$OTrP!EZxb}eSSP>&H$J7z1G+)K_A -lh;+){&Y&9QVXC_Uc!s%f4S^wbMueNB(&mGy|NrWE8hPTo02&?7ePj~55ti%dcCD}F}{<#yutu;Kh?N -YHY>D;b7cvU_!W>`aBN|t_pX3l<$uFpcgg`c1P`n1g9Ba56ZQ)#}JJ!SQd8hv1Iag#d!OAzLg_eE>O9 -v$^kg@S$5=;}kDi@&*beX3d7?wdC<OWg49TQ~ojMmTE<SznI+{-OuCpIkl8I)<6q+;2~Pfv1yy0Z>Z= -1QY-O00;n48F5TKVei|95dZ)QIRF450001RX>c!Jc4cm4Z*nhna%^mAVlyvwbZKlaa%FUKc`k5ywOi| -w+s3i}&!?E8j*Ec8g}7R~e9Q{ttR>3YI<lqOrOQb<4mbpcBq9)CaM{aIDbJqno;v`pBA2tJT9Lp^PhY -<2?&+T0R^@@k@wRQ+O2jeC4#%=;7~j-o-ZmnZ-$&|klO2TqoR_;@R_sPwq>z+(E|MlIi&~Q?_(7yid( -4F#k~N}g$}%?t8vb6~?X%oa6bGK=`b#B7a$XdP`$QZ)+QEpy&x^7sV9^yYRkqEts>*6gFMi<n*P^K&o -Ja4fvMGT}=h3y`X@BmusE@Fca2{P1w>;0%*Dzkdqfqm8<jH%!6NalgyC024pcl5#+KG0ec>^Cs6~r-W -B#y(;=m~qt8_w#cY7^8u+m;mwe5^z*iUy{!W-r)5G(5#|<rZH4vlVqy!wZhOsoT6^S;07b20^3IwH)v -|tDCZV00yl3gNgrgGG)Jvf%v{m$5S?Ls~rCmDDPMb{24#vy5UV*BZW$&Sq1ip^D^ORuJNxR>nO>2T{E -&rP;UMK1Hw72G9HiRV?a-_&30`?v!W5bUGiivg=4&F#NpVmyDZOHQVHG&5WEm~YPzHfubVw<kDxM<GO -!qkJY{uB)IguG3@_M5u$pg0{s6SwTBK?<B$R<A)sR$dvjV8_8Ww^t9Mz3R;_L_zp3g@{PnDXvP$DK0l -#8#X@QSC4=lH)=%;KxiOxrij5$3!DYCrITBR~|Th5A2qmXMHy@i;9~U<fAPFIQm92|k=ZdnWGr0n8mG -<>A>RlpMaT*ilqxY6c5nzkyoITd;PPikfid%7@=k!q6A-^Vgqh#Vn*+&Szmbtm>@hn;dk#d0<CC3Zj3 -#e#P@ztk=IE7er8TKwG<(Z~_kQDt<fy1F)Uu1lIZbU$80iY;)nbp2%}5Yt|OIsOymn0bW^grbtd|JK? -}IDmLLQiD!r!7Al@uEY6R-;@~d}aFJ!h^SM#M3cs?VJ#0iJy@Fi0DH+f6@-AX4@ToNeN0NwC6p0{Hvl -3RXV3)N;Q%6>#Hv(4xZU0ynpltkHi37|4ZnGM9C3q-~eDES=TaLVf%VWSeQ8a`UWp>p}aKr4%6115Lj -udNL1j*s&@&MaU6m_=AAI|pKZZG#Kyfd_TLevP2Z6WTDuyMdRBHannWKGQQ+cHCo!8V1sqWnZ&md8Q) -W>UB<gcoEUZL!U&y3x+FKSSXUzbK2+vf${!bF9~7uedB?v$fTPz6q5-utt1c-mwEO9`qZ)0qoD5yq1v -2BtwvAD;(xldk7B%GBr%12Ji#Ak_glL9Mp}G1PRH<hq6J<SGS_FE?&a(4rtbO3zpe~yDLhVRb?2lfHY -2)vyjxWDigrGyVB=t8*wY~@Ng7;b)nB3&=n>go?d96QbbQjN<XM7r6ay=MCGaIj{7=N$^nexSI6tf;R -pTz`hl%c1F+A;b_<sK4Osi6^b$@38qlvu3*ghi=7)&A$qt#_U%g!+rx;@04RUFQAYwRsy;{AqewN}XW -+@op0j;TE7qjyz{CbYRF7Vgath8?6V)nnkk4FAWTTx2#AE9dl;Bo}-LyWMc-0uPMLJ3K!IY>M1z  -bqC%gFw>A(ujShq44H@=QZvKy?}R5nJZVd&dNJ(whSr&TivWQZ!e52HHI)dE6BulVjY>GdN7VbW&C?; -j^xcC_A*ML6EGW5Bij=f!<!exD7*=2pk$Wk@c^NwJ5c22-_hfJYY8ixaoA?qMX`@17%Sc2464p!r81z -d+iw2>BMHqpYg3Td`tmbQq;L*$FtIMC>tl}S*tJiN|#y`KlS}osP-K+)-z#RnYSY@R{@SvJbXufOVxw -G?Xse8bs0ADK=?;@_Ncp{?neKLT%i}4wt0QY@HktExC-cFg6hJZv}NUYa3{uZg4soa1IVm<#+=(>0yY -{Ea2<&mXy#^I}No0lLlW*Fsm8*h06hZR?2>J5``$T&yz0UOcW2~p@{LhU&FS^(NWp6bES2@WOb!;KIE -j=Hy~vICr$P<u%80X?6YO>DzCk#R#Og^>LK;8K~QOy%lah$EWHO<eKkgU|d&_LK$B+22|4!De%m>}jX -+k)5$~oiY=mi5X0?q-A|Qp^j(KIVv19G2gaDGG9l;&e~zkP{Zu%msvCeS2c^C)9)|gcN9gx8ht8GFs+ -j$3W13Lq^o&Z?40xukXrZ~?7Pbs|M&LQtN4e@znnsbR)`CZpq86%7W&B8z=?$Q9Q~aAycd{<PBq%y%v -eXu%(`50zlRLG!Q>n_G13Do`^5q#kp;51l{{X1(Xf9Sk^4eA=8OA#APc&AjC~b_*bRj4oL8_lc|k}1a -wwX?8OX`kNL<$&OBo7#q#yx$+}oTFG^I8)=JO}FvlN4zfsS&R{TMPE1c=e6FD?}w*j^SJ<`^&a7a6Ur -SAr7?=K2&1(ze2ClCc%1lM|p0^fE_(1*b9zuB=EPp@lH9j)*vNtUMDEFRRqUrV~TTBxx&HERxj)IT4% -&&IZ<Gr9z(p{i4Zw$fTfMtap(6jmhi8dnyuHn<<D&Own*zCpfz#CnbktDDiy1tv?t--u}8?uCD(YU%p -x`uj8B5<?5%K_{H0o%bPV?A5wV5?07tuA5H~4I7@G<^8evPCYs<Ev)1JG^718~snyZ?-B0x2%jKKpYK -foTzFS?r{qY7ruC6a%EGNI}!~F@y{Dr<ehvf0g=if}(SF;N}^~oH!Vs>Z`#y4PICgYsrP=M6=^O>9jd -SY>mQ7?|cdF0!v^rDON*;Jpe78q+(F-Ct>nWFqEH7~#P%U|74xj3cEX)oNLBI&#C1+dyrVpmlwrd_8Y -pY{o=?PbI}1xuPA&fTDrZzCCZ7E*KmE2TnssXqCy=?u0Y)%q_Km={VVBiH@7M-IxYq{~Gf^pm+KqM5K -@Gyg?bYcPW5kGgD{*S#Z=!>%=)VcdBHOd@tee`XgQFthu}pU?^0iw+n%j1LIddv;=qF+t~vKYVZM#l} -Tf(t&p+J&h_->#3J^pBCayZPBMs-`|DS#^h0v(=<z(z_YO2%oe3S_VosLp{h2zfv2<EJuH}Q?*PE3-r -M+t2KVRmJis8l{5c(OFo2Tj<EUQ@W97swSM1J1e};A{E>7%-uw%YR7TyD}tXmq#Gz5>PWce_7`c#fqF -8|LIYNbjIPO!NGF1-noyf*b)$Bfc5syvcho`WUqDSQXYyW>?_pC#qt$eV1F<yrG!>f2>*lNzj|@Fv1Q -sYztEt_uDL>37|cF8J%hIm|F0Wd#jqF@e4fgwV%L&kJUCR)E%vL<B}eitS-<HPoRR<5t6sN5EVp(BDJ -K*>HU`6gFOLnFfY}zEaI}r&hF!Qn6`w!T3d4K;n<5N==4N!gKaT#m@c&zsHW9oYi_raNb$JuoF$J@s0 -ssLd7@fD=<@=b21?swKYvLO6Ur6Y_tlRSBSg0JXN~H%;zWUXGrV0ECK4Oge+emWq>ACZ{gqt%iWr)Vv -Ttrmezx-T~SuH%vOi?OzzB!<-9nDjCsM}cYr=1Fx}4}=Z8(o+5Mc|8~0>-Xc~i`-I!B)2gB7O4ctu}! -jB8Z6TJQr@~lBD&a9HP-DG8CF&N_Lr27<ppIAqpb31DsvO@CgBz{wWxzIugoC^3cC-|s9<2-Qy1$Ia8 -T_1S@_`tSNJ%9F$TGLS`nr&28yJ!36kUy)o$=A;>W>0EWroV`uM_>AmBBHupP>uioxBBTXv$Jo0{R4d -XpYf^1@kbryL0{<R+;R5!Gmr)0F!ZspJYX$kzdQnk0^_6t^1y@i48I*BgC35Sqm!lA`3}bF>%a*Hd_g -^CU$B#l+m$iX#Jv9So_2eerSOER90F&O08I})ud0Xtk<Cu2d^YN0O}+Cy(h!*BS-RtzzNh|{P{lzwMY -_t#3R|}^hcT-TS*ThV(s)~7uXOE@8Hb$&+Ri-{p-?Ug0)1g&Q}y?YXE&n=su^M4BFA<V(T%;nOter}l -SYRp<niSoD-#c=L9N8Xq@X9Oa~7b3q7+9tk#3mLXHJK6FDiK~>%rh7XG6NT<p(Q*n$uP9CzOg1yP>M0 -Tb46-BK*b#pg|RSsa~fG4qP?2CN*2H9b93VN0+fwwytSm5+RG3bVER0&CvB5luB1su$n?8Np7+qb&qA -rG8=e_p;i~GU`@Q}!gH<3s8cl--D)q^H<2r+u+x*4jP6u%BUg)^EhNS6IEh>w8x4Ri_WRIPv}o3V1C> -DV4^bTmI#`IaI<^gA86Ooi;ByBM`T_&idhf&pFA(vpg1n_}sS(T@w{x3<$40Z@rGSi@`@QxiwLP;&ml -f3|8Pn?U73oXpX0pKPbm&%AM@~GK{bv%AC{(o@=-^_zn(C0SdPP-T5W>_(EtF+*yQ`Ir*Z~w(OB=Jvt -obZ4gWmNq|BhMM5n3G_NuOBlR-((t9qC`}Me@EzaB;Q+lNDZH&KgPP(kW|?SolrFQ4}eOvbA7WrO_mB -Qy8f_h<e}XQ|z$h6i|nX9Oxb7!-#r^K}Z10isA8t(Wz6Y>G^Tg8)3x;9!b~K*|1bPMHILpMqTvr^?6m -h?&6u-(K7b<mIdEY3$!e(UgTvH*q2RJ+S1r9uQHqhXMq-*nsul7;5Bm0<(#Rh-#fQmw2MXp{jAEFg6y -kuOIBMC>v}{xRw#9fwA;N?_Lmi{ZKvUA+3H|RPm{|gLdOA)7f-Mf4=xLaO8&xASVD+MFF3RvdK=+1Rx -~bqH9Cq~790kUr~9yj&~qLJPKA`Hf1(uT+C%?z5K44{AvRAH&s|pnsxxhup_B3@1ORNpw~cc_?AxwG1 -775vEr@oGh*PiXJGDh#^U)N~tXjiUgz1>O&2miqbY<EO@Xw$!KH0aQ;WF^3=n=;3-%*(E7I{uYmCD;H -cZ%jF|C-9P{;B#si}8x28i}>D<b6}YVR9&UyVk9^;p?h~JE5;usE(MM*r}eANm{7muktoYjJkf3AJq! -=WB-sgZFkUm|2fu7oP~P#A<YyFNcyVuy36U(TyP{k0>kRlK*!Gw=~MSM5&lpe&0J;Bomg<VDwj#o17i -T+wt4Pe<eN(&QB|mTmG(lyEA{nwyz`q8v|pth9&b<BOXsd<nk9HNrHtuJ9-fhDniu)%r<Zkx#UA<`P= -S<2h6;Heten%IZq-;eUFHqnx&+xdPSNYL1v|F{ZG*?%`OX%j29NOrL*+-$GuU)j`!~GHxp4i3U7NRbn -|IO{?~C%Tm~<w?E3b~(uZ=A_XI#*Mgqd;GgK4!?b=R6IZ<X8d+isSx6*b(V`i*vVr$b=!RvEUTYct=H -G=D&PC)pmB8}rx`LX-L3Hr;Os;lGz^G%u(1LL&y0VjPFO&0tF{aSu_!fOZtnPie?DGautjjUw(mTk1W -~lx63h=VUZQ!Ug}QWbqHTrXQ$hb$he@n&T68rQ;KN>Wz@>mRnO&P>9R3_jr}&tJw@(VTZ(Emd43D%Cn -7kHw_>6Tc@t7yg$&1zF+>hyuNx7FR!oPUiYmtWcltjP-lYYwH`I8RjC@?Gwo@fZ{96mT)omvN3sVMJi -bIK799b?-h@w^*tUDU?(ZM)H0$1W3G`75;=b9Rs!7;~VmNg|l<x7EMX>MNk3)+``ni59x6{S#H*g&*4 -0kYf-@^+OhR?`Lsk;Xd@?72(v4FBaS2gGvJqrh9clY+5(@nc_Qa+gwVpl7`RCMx1JqhQsp+@8llVLCI -HLu*8F!(oQ>L!d|n5DDK<O6mi_1~d=45T4G*kt0Py)^T|%?IH5q=&W%S?7bv4L&+X`rsu6AC0X(IC;R -wa1uU>ePDKBd&lz3LEUKltFkB96Qm*`wR)M~>J0$R*)7l2{eC#Np52~D-+)fM3&7@&wl2cazX4E70|X -QR000O8Q5kVeea|~R?h^n2n^FJ(B>(^baA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLPyVWn*-2a&s<ldD -T4qbKAzTzw@uSNb@4nrBSI)rZXNZ9VMds^y1pCCCAgJ@vukWD4_xY6d$71IQ`qZyZ3>+!+|1YyKOL&h -z9QV_V#=C7T9Os^Z2GLs)iLyR*Ou;O;OcRdB>Jjv0|_9n(HEGPoi&s!<vHCZAoL*?Pu`do6$Zy$?Ae# -^O`l+f-S@~zfFsZ)uo8jWhxSu=Ir(CHT&lG-?H^}8eg-tMrf62sykNS)iKYq8sNY<gb?#uAUZr}v$K~ -MZ<wg6qKeqXHOyNTNt+3TP>H{{X$9aHBIYejG3Y-*q>@6^EH4_iEV8Uv17w(EkmEU`RX2hsh(}xHh&^ -v$21`;{AQ5$3r6qs^SmIXXO$}ST1;paGt#H|j1F{v)%GFj7d9@wH7J<ZRodTs`w@Fo$07{c^i4-D)qe -R@6fFtf{#S?*pS3J!d_>UbO9{vw&MBT8sxD^$@647Xst_TE>B`@?pR)CHEE#aDf74ePe{&iRDpG~?FB -Vuz5%fk%7v}WpI&Q~I7+A<SU_9tGJX?`^t!6u)M7+k9YC|l%d%#I06WNwVahgg&i8=o{yl`h&w%#eFi -c1CdNACsqy?RT>E<XIRd;WwK7G<$h5e=|Edh5O?p_UsuuoT$6+-ke>`%<ZGeX!O4)=kxQ~i`fqsaQmW -a1+MfHuTs7MrV@wi>tbDlAPU7k!ODy`z>gKlFgJ1(jppZnIsf70#R~xW^5X2}>;(WV7Jq}M;|T&j2eC -+Vk)h<0)N-V6BY>hH14gi37CEqOemZ-8^7h4r!td1^0ESOSqfwmkx&~-+U82!=Msx(0OeDz@v1Idkny -1ZtJ_Zz*Qxt%>NQ4@I7f6?=#txt<?q@lP%-l&g8XiO>MSzL|HnJA0L|LiDtTp7W*xoZ|87Ym&KOg?`- -Cl&m<juH)Ke55q%`jA&VpfJ}Bbu`Wl?1}in_|99#_C^c_TJtedn0Fawsdt@S}}E7axP+LOPY6;f>xuE -0aX)MAPVagcvge_XLlMM5*Yn_0j4s-<!E}k1cgNt!t+>Yl%_b?+SM`v%Bp8{Q)IR19vgjf#sdfqFT%f -hF`jfx8`7_fyHfxBiD#`)n&yD7cnU(=Js$6!<+nUb6PrL!+0TbxRlgW6YHCmPwgE}dL5p>pp?2Ir$QI -m0fmF0!Ccy1|b}AZCtw5`kuUNJ@Stc}#XyxJ0y5gm+Xti+xmcIf}JgdOI-+@}^Nha#fxq$NLE&yH$;& -WBCWh0Vk1p9;m5!hTb;GjFpf_(>;=E;<OYip#k_jAMvbq~><viX!f;?-3Re;(be@t4I36j<_QsYD43Q -q??;(<*M$hN%_N0ZMm@&MPafz_e-rdbj9TEeDMz$K6!h6hP?||AitAvRX9;3cA1wAZ2k2_79DtNGr0u -McdS!pa%t2^9*)7_IKJ7)mP`*2fXS`5~?CO_6Y;4D_ro(7-<V>KLW;pndTt<V{lD-WM1|>Id?$_X@df -q;96X5PDh=RZeXz_-CWV@K7PNGb317!|F1$HX=dW0%|K;%nz5uMIj86+GH_0Szj}U+QiJ0cf`ShUvq) -kp3XTvhmWgGfgDQom0S32u92ZrB<_k<;bFE`EkMnXKkWua{x)RNJPu<;{5`Q|5BMNFlD*c|v*AFFxY; -}mQE<Itya}I3iWXUm{E@sQD0DGeTJ@KVQj{}<(9a7|Rq3(c9sAc?i2of$p2@;e=aEEG6)R(H^4fHW|C -z$vKVu#-test;x#D!5=S~p`?jbINRaZq&)4=Bh5c1r%-WAJ<U?P+4HS_m>1WK;+hkWUE_C6T1en2Ka? -(%}u8Ycu3RFIX}|z>sG`4+OdBjr17n8yjbt%_ax0eWnbKG_X~%&e`Hl+Z+`fyAzaQ3QiChoJaUSZ<1} -qf-{FEo>U?~XxN$p()?!GW@HYGE&l+!T^H32-4!|xtpDJt(nF1F0Q)ts5hDm++l359!TlI2N()l*I;0 -T8mKv{Zt+fj(WU*;P=D|beZvzg;T^_z41?WJ@D`i+nZQSU)G*2)^!2A;87>Mza8lEvW8?5IhZoo{$ta ->aX;z*{j0D5c?$NPZ%yYmxzxHmzC4(?>GB2IJ(={kOo3~MbeMQBNL#K{rqO+4ZeNrW=M7mX*VYYAf -hC+--{}>HSHVk~G$osomdA?H7iWK(oxXZ|v2jh;lx|)NhIeLmz{G|wIquTTeUCz@$obgWbr4isU|QJ* -wMnr$jKjvL#vdH^R|brqnMnf-A-V?tqqu`@b#;RAf%W8I$}SI7<^aDBmI?k})=}_R!W(|@eqwUpxt^< -P4P*7!%JI}4)I}>>A@`&+c6KA~Y6@S5Qf58U&Y3CYG$4-67#j#!fx(;=o{e1~5oD>Ds{%Ss<_ob?3gN -lI#!Y1L3TK2p=qeq~isGg%O@<bV&<7E_Tqf`RNF5kQLK6xi^t16ErH9%qRN@LE7Kl2ND3CGQY=A+7B* -cdsX{f~Hd&u6jq>QBiSQ2uwsGEw%jnM!`vm_QLos_5=Ty2m?vGQdKLLRVUDU27=HZQxHX3Wlh`$|;>B -MsgHfW+z7BB<<mr-x9;&1vpmb(a5Ewh|BnBoRBoC~T3!b}BO?hCmgt0w2QTYY0^VNpM#ZH*0N~Hmkvq -CMGJ3;HxsDw4%m6k&zJ}FmhZLQv$*%ZNw_al!+#edUQjWn0MatDlJ+n6=q@uMBp+d8OxF5$&_K#gMWq -kAs2wK_2%!bXvKIk0m_sjPe`M4rwk`+rw6BE$-&}iULHthA_6r*!zrr*{I*yEM^bdtE<(nkD}&oDpd} -`3B`opWN2^o&oFw@`Qxkbc#7HdY?9ac9EHG~bPaYRJq~R-N#-!w9`TCB5U6{jtzch#UD6sZyBOz(&mS -+xzY|E~NGBc5i6`1|jekE=~mF)tnXyU^)hZG{c71kzrh1Gsl97R@i`jM&{(W0eD7-m{=GF94BN^6R?L -YhVFZ7qq_=2~rGd5GQCSk%eQ)b252rPiYa8-iR`R^k?Am+B$fa&=}9D}opw5r%PAz>*O=llqKtVykfQ -Sz^=p-lEAsHPbi7UDo#04dSrwOoYXRqrJMO!jB?T3HZ5^sZAG3Wt#hf8r|Y5^*9hi108UHLJvuxehvf -;a&t5#@ezLG<)Mr(i9wJb^<7OT*@n@MNKcjJoidCfj;R9SOSzT+$1)-ru)I(4ygJjt!xm}g-MR<tevJ -N24x3N_ucmy>{yDZzB|b9iFk-TG#Z?0Hi>+!oD{Pn6#0sstTC?J1I2drLWC7HCO#<SujpH9bKV?53{W -6hCAuFt%F6{+{LtS2gFja`y+w~B-lp`>JhF^ZzfVYgWSaxBP1$=AS2Uj}K0xksFX5;wpse(%0_$pNv< -#;1&daC|Oao14Th1Wj&qi7o35*l9_X3){9GH&W{5IwNTdU3H@h9|S{PfnjlKDKg>svJ;xfsXT(bA7C1 -q^BCBtKyi$s6(f(Opc7}1ZqA`9zqxdbCw60H-*bCCJwI<vy~JN&RKwx-0YfvJ&5rJLO?%OMUpP>b~U9 -xT=V=24>r4X9j!5{q75nrc?ir^oqhK5)y3>7J1-#9*F`4ChKmxi;Pf9t9?uu0sAT9yo_N_-SkR7kRKU -xP%J+Gbo=wV^8YlA=S+7W$d}kfP)iPbdT+Z62KXA~@Q>_f|>DBSKyY@cDROk`$04jz!43F5#L>&f6E( -Y*GV0c2C@mP#WZsgLvZ4H|7jdH4z2q~wkf)bL<*P^0BdqfqIzLsZdD#}lrLp%wVYGq|{PKsyM-LW){P -E2JBy2!2yHm)2?v3OZDXFAmoiIfm4ASc`ErxK)0_&}cd=`2@uwW#7dCSWqN6M5ZMs$+p$k#U<RqRQ@M -22n%Q7YliMxvYfmuY6k-XAn0IBpI?3LGJ()5}2_~DuKH}xd44G;*`!%WNJHLF<caNHl(Dxp9p~v>oLI --CCQLC$nTX7u}u1Jg8043unkc%s8+dDoBj8g2~BI<b3k59wzk@(_T_ENaM{WjVeA~^9n3!zkCUz03yX -5qJ>g}M9ck2T<X4wa$!;u=;O!2VeH*fU!Kz!_u0Wx(ZtgsBMt`u%hL5}>T|!N&`GmR_PBJP*U?!%k46 -0wuId+24)(M8ZH)VVBhd#)#yMaux%dUKRoRYU6FE|Bs#<18V-c;kD{aAfNdX){0Lxu!%w49=<Nq?K*h -;@a<y>5hq(?b$Gyp%)Sfc1TT(uUSK>aSUs*!5#GXUh>!l3?W5heny<5I9AjL2$l{)TG-Y-Pw*(_XQvB -u9LKmc@;+0-O#3yLz|jA&L2=*4~77EIh_?<L#6y<+GMPb1kTE$PBB7&XaRKEQ4$L=S7{|4m+uWOo)m8 -rvEa3@R8`eH#j0%X=)k`YBw)Sv1CT2;pxtSMVhNoddXE$j0%?!h;H7sK+BH*XlkN3!P`Uzs=)>4_yc| -Y{K36e}I!55mZ6e<sE17;Pja~AeQorWZmAC1pa)Nz1`?eV6Afk*=<=$Sa+iUkW3Y098RO};L2U<I%mL -IdjQ0+`j9XOkoQ$HSC_GTDJVC@hPGBf@2UOPv!{eCE8l?m}sfe*MFA>Z<3j9NYI>|B@KOoEC|bHP!Do -FASLxUTOt+}XzQ;W*FjJ;3YPt8L};s99Sd6GrlY<MX?<5L&x9HF^SJUwzY)&~5#l1>&RG@9S4DUYxyr -n8zCg`0DM&0HM1*OFuHTfP67W8KV7mZjw;8hVJD2&?*vy`(4R!PodX(B+p1NjdbSwmYB}=sON~1H#(` -RMO@^GmjEk%Ti#)~ImB+hJGMK9?W^-VeKR^-BHIsbRJQM9TAa0w>Y+Vit26^2OM3}>lYLfUQo{I}tJh -xsA*zBJjX5MPk2rc(UN?^nu9`CUYzW`Uh+>gu+Gnyy>_|NEdU8x>n<YWCp|B5gyD{|bUBZw7Hw}rF@n -{2%+6buj)q0g6s?vel3X9InEVHXawZMGM{^?kwUHs!NkijhN;J^R#o_AN*EBd~7R&MEhY2c@OUuV6o+ -^=x`uLwC{)ld;w)u}DW)=u4h@%eptaC195@%l4(@!I#gvrqQpVUWHjAFw3C@$FOD?5)oOr}hG0%*h9t -bDx(F_9k!KV+YaOrN?Pm(9-w>s#<vM%W^R~YkCh+zR5yodkOV7=wrPUyZYtA)m`6DmDm=w4PCeODPJl -ih#nLah@GN>0a)0WlC|+o3ZYQLZ$z!#zG^y23T&Cq1->-E6z2y(W$BG@vYLqfU#mKf7ox$lXbM5n{OX -}G1^s#aq&Iu3w<N+O?WR6HiVkrf4qfTYf=ZlR!jAl|k9Y7WgP^Jg(aamB<0zoMcfg?vHmYY$9)ftVC@ -js3ek+#MfXH6qap4*(^7JkrzDwiMbHzV&K@Ju(x{^uPZ8)VjN$qJ5kC-}&sgP;gdIs}js~u*-#w1?H- -G2Z5q1o)q#b&c#V{qn9vSTxSckt{GFI%4U$%FHJ*r{~~6`>$dc4WFy;E!}~n=nw0WWQxU(ndc$Aas}B -Dk79S=t4r>WBQ<&P)`1WL1B1<U*f#thDKR*p?~W_$_|xPoc!aT=g-exT+H6kVh@--`)Pi1dK!2kWx#Y -QMqr<ERb(c3x|F+kKV^qg{1U*!BG@lP8d~kYls2C+bPkK~eX+CZw)%C7?&<8s>|)k;4Z(x}uTSHg4{f -{j0IyzXA13>+MlXI{g#V8uRd#k@pU-&)zzKdsfiL6`zw5`nFrfC{XTVF+ZH~v6!{M(_^c_QBMjM`5n1 -_yF@scf|B)j;YUWZ$tTQs3AG#nA73H(1C?CPS68VMGy3FLQM$Hm9TVQchh=Y#hwFreh26~6G{Vb^r7- -c~oFHQZ`zhFIN$!vS`9mxHweyo$_9;CicF9=(46YWgLCj~4WahiS-2(0l&|tm#{x?35j7bsJ0%!j9X? -50F28j&LA<9888fy-&(=mS3gn1#sshO!6}h>N`G=;m^TJ6ftjL8%@<Z@9+I^E#jNnDGA6iwR!hV&83% -cu<X^fLlP9#K%8Hx51~wHJAcDU1y628)ueSdS1lpGC>CM0f=W6v4MJ43p`MsllC?O<GDPGWR>Jr830G -?U>e{}{VVkTF>35m<El)H03>6h85HW)jJdfBo6;Ih8Pi7O7H90=cIr0LWbPwQ~R-x~P$gWp>NvSJ);D ->C8h-e`WaPEOCI%V%H+j%N)9y%`-;Fm}WthLl#p#@u56noMlw_Y0Pso<4p9O+VWFrM@TSLp_N4Z7F+= -7IYWB>!UvYPy!deGsrhH{dStjeqxj!6~EHsWPDXKGQknu`GJA@0j|dNX1UoSKE+}>V;A)L5<G^i0PuZ -6_e3^CqVS}7zi<bWFe+aaQ6HZz&$?&Rk=7n`~Mjmw{=Tj>f!P{^62n)-%LnvyjLN|md;Q;*qi{@qPoR -?VEOuKg`bVXmPGW99t_sV&nqONp%?O&eU)JJ!94Xo4A`&7C2#1((=?BZs)B);d?N?+iA-B2fSXs95IO -zAwxqHWgcJNg-83KI>kgH#vSPtA*84izNC|KMvuV9P;MBJ)2a<aSo{<cFfz7pumelrvk|1mY(<#Di1i -3B5*Mk6uP4&G%&z*KaS7EoZ^G477m)s8Y)b1;cs!*&8LkG^Mzk1k#4fq#OO9KQH0000808trnOx5qmq -Gk{P0I)9r03ZMW0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g<jY+o*LdCgjDZ{y05{jOipYXgy#q3DP1 -BhkiKI2ujH!1xi%gTcjOS89<ht7D2(*rYYe&CPGmseX`6i5lNv^I;9c=A*j0y1E{xs=3UwHJi<rWl`p -0He+(V$?}5nh02n$5HoY%v5!Tbr<uFi@;sI4vvT*VHIF)-B{5vcl&eTe$8IIQCUUt8See>OL$~5;mB@ -u7TgTrAOs)8Z{(JfT50+gRim#E_6f#Sdqn%DaP4Ya;19p=t5kdNggcr*!Uw<)j1#EhEb1Rj?wSCm-bT -Dk3rG@xfuq$?#rK0okdO8CoZa?ruiO$V*_VCmF!{iR6{=?~H{P}V6^mu(YeYk&os$O+Y*)88FR;&a|M -EYE;Shi%G#qwFGf)yFAHyOlOBtkEkEz2~bwXjW|#bpG+Fjy)(f&}{b;q%>ic6<GRS$^&?{0uKgT0Q#a -yYrDzlfL`myOC8_(D?;RjKz}8BB-js-}Q!LUk&Hkf=4f;ydDqOqCe83Pfkws|FI!u#Wu5oC|Za3YsnM -0E}1gTm#0{lT#K-yhdyEDZpgaCniqnG7Q2mLs>sh4yF#c?lRgUA88-1LF9nlJt+Z+=FQQezcp4kcvJ7 -wYtyCgxNSX^(CbWGp(jFx1@je@nh`mL>uPI;!ED2an0{=~JdL#hPbG`#9R$kqK-YCIi`}ZrBu>WPbor -=V*X1rqO&~K}5A<nZXcv0j%@`HeNoA0|pHPNx3Z|_+jGZ*=8#Mmi&q6uk{WTH#K$#<3JZ=FM_#3+Ki2 -RH8dHs_m}%Ayxh1Z+Hce45?e-%SGc@Ob}pKfeDo1H;$LVe44uCz$^uSL9s()iG|#ZZw5<N2AXTSIWxU -%Ip3C6Pw8b?`G(3#`m`mkCW;2=Kk*J9LIQIC(gfKoa>(emzU<!8{=`;#F~Qq_?nqW!r($2J09ZMG%NE -+D6Q^whIcZhAj7o-<M-*)ltpp_OI4%JDFzJKswg&Ubau9tFEU(bf0IeV!z_P3n-X_f>~N94ihMSev6z -8DbJTVlLRAT@JA^HqAxQj1M1?wAVAltmoFjHXpfj1q;%m4n)=6XdYL|+aa4pVw4!Q({E1t)K!rx$rwG -6gmF;IGbHNZRrEBu)jo?Q7^q#}pYON2={x}<esf`?ozMXuL-5f1H|nJOimTN7*yLE{A+oEHcN^kO6OB -^E-OMCyo1*SUyxtoQ!o<ZLp=-+tgT(vMgMK^a}p1}sETSWdJDX(SpWc)DZPlj-13<69j@#w(8B%X7oT -y&eB?e1sVd0zYQV02|fd?l@~^73+nFc&R9|=P{Ng20V&H0tFT#rXkQDg64XirG{B76{k#a_xaN&#!G~ -_6#JyjDPXtnzh}4CW2L2kKb>khoiGSPTp>h+o%fRu*PlN<&BiwmA19Af7;$&h4gZqKwD;fI&b!#9i{X -GIMp_`L2h)$&!{2>p!;pPH{&<bw%k#m*{imNUhUecC6$Uh^h|9(0?;IEJJ?+ptyvCcxBgfZ0JfLc!al -AbC2M-(#q-oN)yT|GE-c0t1yZsMNdav$8;||)#_5bw05x6|~fH-)Y#RBO8508gJ7m;_$B+Dp4Z1ni_v -IV(!Uk7#vVFqd=BDs{&h&}9z6~fFV`wbh07gZ8b<%amGnG#4D#)V-Ay&i($kA3!sE1EGRCx>CpC}y!g -u--7}vn+oz6M>Fhwle8=s=*p&;GryLvz`*kG9WxtWKovP><}-zYMDV4IvNPOPu?ItWuH|Qh}kPoN(#c -X9h@8?@l<#?NwgBt%WRdYBIRpQLA3)qObjeKTVo$VgnbUHq}alg&msYpJK%UgkXeLEFyU}ChAw3yj*f -m2yKla)H(9@L>_d|ASPM6cRvb~lY=@gNV3v2=et2@Z%WuhMuUe+Jx=b<?%#;&?6a5v*Og9@|tn^K*EV -YKsuug*pc+oJRn3`sVR>bJQnsW}wSk(u;lkqizE;3D#<x-e|)_V}4fe^C<UTpnLo$Oh-=U#3>`fjH4+ -ukA|pyp0%X>-tHvOWPR8(~{rv-=bBHnUDb$lAt)IBPD4ge|C==(e-rECM=*2l**FM9@KA5v<%i=Nx{3 -g2nPb!saskF+eOrpdpyeDTiX=z!oeO(5NnDT#3UIB(Cs~QU6=^?Q6KX8y<eOyWzmBK{S=iTYIxl6>!# --4gq@`=1SO*E)JF7y=Da!Dqhq#(b^dxf8{cvbRGgZ;Te#^EAqK&QC+vp6O_6`6T<-Ym+~2D9lJ#!o^K -EgH@Sp1lbz1~YrbO!S+wvXFM*%yp<tDY$V49O-4YUo3>JgYslTZl+q1=9wXi!hEzqkhc@=s$L-wHs{E -~KCg>y*ME;vNAjsbJxEK;G&&O~}fMx%-|9={UmiU+0Q&q71l7IvouQr$+ilu<{@{{~&t++M)#SyiQVV ->TP#x}!$mJDj!af~BLZf^7?_4Qmyty+6WrmW#huv|fg4A%|*Q@^k}SQf;HIy+Kn~cTL(~_G8-dc=iTn -34eTd81YO=-SA}V!<Orn9}WWc+uxe~YVM(cGru|g5C6*S^*pA90+>ddv4ky&9IlxbJ=&dsc~ACxC<Hq -csq9%I4)~O&yCF=Qh;*4q#7bgFGQ%HiFJ*+<pRe_cI#i8oGKi%c7|KSX&>!W^R}cQ+34y_?&_M^Tz7k -(!`7B|FI#eu#uK053F;|dnf%uapy54YWG?3Wicje!~(KiW?L=VMCz`EUjm}CezJ+pDPonbpkSGr&0Yf -=+YdyG;C-uqp!@EQBmU|`5?zICI#UQQDNG|ZsuD+FqgDZr(SZI5fjem?)D8=5HB5YPgHQ}#ueL?_Y+U -fJtIk%){`scm+{%l~BCEQb+LdvABCL-}Sn4EI$xGn;r-cSQZkLdV-qs>4FnXmab-_Sg^2^PVNOI%#bt -^*lbop)~!Y3iNeGeacwRp-nnuldteR!cr$t-ATZn@#^H~i(gJ!^1l6P(Qn|I#J-UIzVpUh=zKJ*0%Q+ -13qg1V!kiO68cO47aOiSPT?~@|ah=PkYGMX#yOPn$nLl-{2*6~T4-NO?L<MQi)&k)rHhEloGs;86=Q6 -Q<%J-&b(b;$e0r_a&s4V7&?8Ze2?tD^eTmc~<CW%2Z(FD4N$xO4f>c1lU<KB2bX4iAftsDf*;Ma^V76 -2qVTbnt1(@X<3TCj<iJ2rou{Q2|E<K+DuJXL{YO>@n)xYeslWLb0peT1aeESnR`n!^_IdJ$V;SKyYDQ -2yVUg&6%ClXeTKx4@uu;2(c4{5@#)fps}xZGdKKRs%ND*Y%tmBbC%MBT!Yt1CqYk3-%hi&}_gwT3x<W -v{D=Ap#VqtbhSiX_O9mG-xr#?xqkn-qTF)^FZ~~NheW=JL+|<56}jIc{{N!RO0NH#N+VclA!Zh{QuNf -#8BfEmgmo%3_uuNJ*nWT;Xwi*V{9*&HlcWk#3X%QQxV$2lUkgr1ma_Jo+<WG^!hCK4!yk99NfI<mFH; -_J6z7Et9-1qqC*79S!!_g3uHG_otDnye5Ad>(Y8Za^E@U@A7kco3y*J%V-O!>wyzSys)}zz|tyhhm0h -<bnNwgIR6*^-8OOk8`iaHH-T&$r;wUuf`Q9z`+Yijws7#3%vQC%VGi0rD4vXF^)95Sn@qU!jM9*0LZz -Q0djb$5Pq#r~m3dS?zshMy{_YHin|d-`BKRW4K^i&B^C^SO5-F`pZ#fS5X;Yv%L04fZIuk^d8!BE&AT -SJ7``M$cAjx6x;FLLsuoRllujB|tb7n6`G^N|>VSx7i#>KYNaE<F%$v1#&&rtXjI2d|nYisix7r|3y} -;DqdPGX0ype=sZFv9iAliKxN79HzK9F))pKMfLl3Vy}&Okp>q+|f)}OCjW8avX1a#5J$Ad;xX#fPr+J -;GtGqXFOm9t~o_uO+j!I}tL9+<2eF@<Vckj?@J`eV$_6!Oy8xI=>(p1TQYw3&0r_ECspq~V2+}{8y@k -LUX5GF8sjK-9q^HMwNVFzRj2w*V;RWf$rmK7cSj`lmWF5T1)=ykz8<0bS$E8jD`3V%;+mrI`=TLlvY4 -=7Lqeo*H`2hue2uo*=$`!RzS!da5v_jTK@Gh#(xQ;{w?>&I0BbaCMzW3{z|PfegCV!@RptdnOi1Onj> -`lKkOf}Ff{#q;&DO!S+W6Hd-bb-?`ZSN=ih-aJDp6|l>%`aBPQi8!=YZmtye@GBV)J;pZVH{uy=$+o` -O`0?g;!jPajmBJLpoNru&=kGi|Jqeg7*y-^6_x<Cu`zOJ^^@JX!vpu&X4j@=kfP}W@1!`3K3gOLz7q5 -%p=JuPyu5F2h?j6hZn*uk_8k$I~Rp{m+M%MzRM(_LEq7OsgAW*g<F;T?LwrL|K28h8?QpV&|OTW+~L* -Ypw@)UHh!ei#7LZq8!)tRO=j(DK2Zyd)sIA-I70b_euN4IFILktgx?cKfw%Us{B*&J@Rj9Uk`pg<4I1 -^T^R!Q0cLw9WTGp#I-Pg7!Gkoc}iDY)ogNR?S&QzN&uRhmm-;BP-ah5OPZTGK!6K=R~I(A71W3i>3&T -?3>c3AY_%*p-Q0V7OpK&?Yk>s>(smtU+k)C{?`;&25V|zkMzmuXkI6cx$A)uSWGEI>lS?WiU<lJ=mEi -$iW$mEgZAR)+S?)E8)^31>!i6DuoV`s(kc^a`wkAs802Bxw_;PDMAax8A;)f(pT7=Hd*mKAs*S*x(j9 -&6w2yJAO<{cP?}8$Hxkeh5n}py2@dIok?^2XhTZCQgTv+caHW**)Q@LfrpD7ON<(q>#um4hmrfLJj_J -hNIv(9e<_Q*pNl&0;=gY0{X`vMVCD}9lpK-J&nQCrQ%wL}a0%5!N-7$^Y&jJ|;ba7Z$WgC4ii_C(z=j -x2PWn!>7DWn~gqxf`GaMoWt!r^8gaSi>g0BZ*T}sgW#UOI`AIE$YR)x4$c^eq7M9|LcZfb?%DIYc-?l -dx$+@k8EIdz~OVNlf3&>;$Alw$<%*ED?ecF+_BjbXf`Un!XNy0!=WKi>;sG$2Js;))7VUF>KGJaI<A1 -^eyU%13=D`j7E#crkn)u$WX)v?gVFx3Q=5r*^ldBwpIk1=LhP^Ba{o1}9fm_~Hw&@L(zvl)Y?cVkOjl -QC%5ZXbKe>B)^Bi3C4;81Mh@=&M=&h|f0{Z-_4TAVajUZEG`fC6zx5DOntZR#J1^f<c{36ph+bY&`MV -nbWH5d*{??X|%ZnpyhqxNCmR}qKbLpUDx+s0%2;t;H^c}zJUQ`XyWGP#KlvCBTz*t@r@IdUA`y-wN3r ->BRhu5hWuCRo1^NWGL90|tB3CP<06H!V$pc1J0<?!b3%(%9m?K5ViOsYCAcMc@8;Hf@oPQ5&m`&}XG% -YJEW6EGnreARpl=!OASB^rPqS7<kFY@4*{(`Z&h41L!cDzHMzi(DwMbv+aM&LH57t0Q=~{_2Fmf^t9g -shYt*?-}xs{O9KQH0000808trnOjT0OAae@<039X(03!eZ0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g -?aZDntDbS`jt)mmF~+r|}s*RR--Mk8_tfz-HeS~Tj!wH4PhPV5=W=_9!W7v$C;7R4?^vk(34J?HENy9 -6l9X*<*EAts64b3fm?AXTS!Y_X_%(|2OAU~<>0&M>~xs_u<g*zac-?0zfQT2#ER4b!UpBn&fhCsc1T) -@!k5s{`8_)7EmujAF7`%aR+x%$6J0D1Vskxdv*w6{W1Cy=H(kkm$}T6vh#Ef-GLYefQ@VZx^rbethxq -?fv5Z%};mlKHi_X$4K?e-ph0GxfHFDs?q-Ty=D5rfFyTar@AxX{eo%H7}<!LJ@C30UlMm(ShxbT`mP3 -rpPemUIn&%SwfdVV&1`;#ygq6{r1G6=lu?Z=nXDLp;IihcTI6SC-*q6(0uRCEjQ~+iH^Z+PI}f+cGfM -{lgOtmfYwgvWS(fwSjKSae`MH0<O4U?y({~)LlAqCY_e`^rH*7^t1zW5cD9VF}E7ifbR;juu>^1!JM! -5}~fk6YTZ@<lNGS&&czWpx0nTHD)5ODfE(D{isd?T!8aP!vvJDlx=ZozeE1-zDb;_toCW_I=Z?*1xcS -NLObeJwuoT?>{g)$aOgZe@Gdu~u~7xEpM?-^y~!)Pv|cxfYsy7HfvzQMY-l+^^xEd6V3FgZ$=ZK0je+ -snO*WL|PaKzzySdZH3_--w7i+jlsBF{;V3YT*lHhYH`~7c-)yEKmJ=b9aI`vV#Fc2g5(4d4X=y9<bEq -bNwr%+7+G68xfpNOB$X!#dD(z|AmShCT>LDM+e<JC*h?eAC^|>UQH#o;OBrQ*!p0b}YfaAHH28a<Bpx -8MY(}q?*+M}38{U*CAh-H3-iaa8Ge!x30*<2pkxM9*-U9M~m;phYKD-5N6zhEOslyENIr_~#D$Jo3&d -6vm0cn%5s#e^PSa>w?htn$dh+sSZS?>BB<2%)Z6;x%d2(0#8`UH130UW#$@c;+gcVOv3bH#LDmI9<_? -{?D0ZW6avOP^!0bG#Xh8pxrQ4jTCR8yRamwSx3Guq8g-)bK5$=V-{rRfoJi1Zv;AAl`1^SF;72Q{Cpe -w4bjlS&Qr6-8@_UcK!Sh&%S&9`|G!IbseZ&)X$$i|I>1j2Xbg#s|^Mqq^<-AZKM%F3N+o=a60jxcgd6 -dhf(%b&RYqy7otHfT9mz!4<br=$SDPI$ZaL8Tp&9j2+3nzJoq#5&Le(}bJpjlb!MROf9TZ2dE}4BJ(u -Tz$VS8n4F&GNDqb4ZS<L5EMG3GK9xPICqGw$HfQIY@v|vpj2L%3dfB!ysF2ao;;i7}=jJ+q5Txs^|=M -Q*T)rgU61yBqULN_7~0YlN;0j&Z#)mSH5^RajEr3;D>ddAw2Cce^=9<nLxemz9sR&KWJ<@=8e>;{-fU --h2179JrcHWc)I(@+Tnf56E-JdmoB<^VwdAnI%ouVactT8S-xfHOKW1t30OuO)_hHiRc4v=uZI9@Rh? -?gZD+<_<N*CDO^{NlX)x-hp2UaNgK*FeKC<H(LKu-&=8=A-(?zl+m*$PH7hc<oTU~^X{I`65m1{?zp6 -8T$H@mA`)zH54Vw_ZE*xyWCs*i2ZOG(H$uZpO{cB!(q7~Bo*#6A7A4nE(6O&|yqGp%$sO8HSi<1a4zf -d525}2OOEqf{o{y?O80gy@f54_J8M2cbN=B^dz*O}RRIvf+q~V_it7+s3mfy(+1{o@{-m-B3RqUYpj% -^eimG)GRegbVEpFMeAAsBKCAHkJ-?BB{7q9bV%G6H7kJUfOFi$U%*V&{8qN(kn25Z)qb#E)sngUIW|I -`>VzmHDEG=NH@f!_gLEgnry4&8`m&nsey>(HsSh;i(Dh%t1L!hX|F6#Y~I3%4|HlmeV(&e*AGwsQ)@I -B5%}HzVJ=Kt@{pg$u*2!zR~m@EwrZY)7AWl1X=CmeS8X+@t@<HHV;qUq{ncT{vC1EhIb|sf2ai3LJ;u -IK#|TaqpvP?=+rMeXCnMyEqU3^uh=D<g=-W>P=_qJe6eVt7B3cAYQrqDM;2-5rjH+JLWCN=RqH{{vAt -`^LW+)zA)82goFiXuMfu6r06z4;Frdm+k8q(GQH=7*wKPPspk5}4L5z1V#PJ>EZ?E7dg39Rnz%?Qfpe -ZpPts}5!B^Wy(stFwa0spmzAyf~IL1BGl*?OwBfB>rDM*tCxZJrZnBN2c|mzWBou4cdB&$MSK5LhH3G -G|S{6CF(c)&eyMfhKLRvO$hxl~RfP{}7#`euMPKj>KbcbE+%JW4DFR0Lhjo-1j+IB&=MBLKx(e`F~7> -8Y$ozewes9$-yE}OjByvKw34Wn7II4(MX=&M#DySot=l(25-<LI9Sm|!M$798^d-zfcAMpYV>!Gcgdp -8n!%XoL;9QUkV-@+t;EAAyLn=>dvF%XnME=`StV=KOHE6sOGwNW)^w+g74}OiO(}!mf*Iu!-R~zRwF| -!f{+8VoBW7dSU)br#B^*>o5I>p@ycQVAUyz;THzV)5H2{yZ=Sh@~GK}3!S;8N84h;S)pwhb5nmzlUb> -BF*CSf0EzJ-lj!h65fIl_9VBnGpo5&N(}q;V1YbFty&A%*e?^v5uNv=N4(3>|5=LmJWDA6Mzh#uc~OJ -afyV@?kdj{kLy=9qN}PFam5rS{F+v^>XMYZGS`sEbzx&?}J?T@p#|{+2zvxvRp<z6aKZpzy`TN-c{d} -(M}cr{Bq0^uoY$6ZsCSq^!N+M&>p%x-_2QVhDkKg2}R5sl@3PFkx_BlOmWR{F?Am`RDM@G^n1fz(8m~ -b!Hqa>fReB(6$HUiQFnq4f#iONArXc!BhkCKVS`Z=jE_5BT-#D&30`hPd)^4K#z3f`4c?BZ`6y6KG&K -LwU94m{3rU;~_b`-Ti+2sI+ORfHwspbEkE-&kY<|K1ic?f`WiWAwe7+W<B|gI_$K9C2Ypq=LyL3Hben -Io)iN-!-c0C@}CCF3T^?wMts3W-m{~Eu@pf?{b9`jQ%<D=xLU!_orn$}ZTXxrjZM~hLGwBb|H_5lwhe -xdQqy`oz8ot?%4%=qnH>}K1`xy?-UQYjz3O)9Wn!uS}dq-t1kUFY0c2V%snXa>e-*lN~jjKj$WZfgE; -?I41{RBthobEr{P5){JmO@xUXpXs?LeqA-29|yq1oxyh-5q?~(-7Bdn7ryp5O^Xsy^A=qP&0;CswxOn -aUSO3gmI=4zRKDIh612-0B`AUIf5rQtF!PGKHEbFPnD2@CzcL2C!v8M`TsFfJE0xU3^@O&H+0M!gTcm -O1_?aRJ752^P==j0G{b8skE>8TIIvpky4q>cBjNET&yX0Q3#asGx&x?Q5Lxh(ztW{d#B7JDTLOmYXBx -QHj;D#x5Q(<BYZ^`W|jxpyDnJ?3KB;(*5`oWA9I01)3ay)b`M_s{G4A~vXbm+t>oVX_m!lUp*uA>L^! -&8RBL8ehpyOS0ij`tnOj$;%z2x(6bnqdh$ywW%h5GdX-y@O85HLVo+9+lj_bR1{cy+%##uC*)3<M$`L -MHM;;iCQ1htz_yii0N#69UiPjE1ET~a^0>vY$ubIB&|jp|Nk!>y_?IC--I3^$yf1?9QrN3s-@oI3s30 -10V0d#Kc51aOP_9ovuRsBl^VaqX+7<z|75a!9qxm<CaX^p<KB1&;ZPn67sL$t2|Q<ewv(7YO9Q~y`y{ -aZ-}vZM3ZA}dm#R<Vk{q4la<uKZz*jW*f?)Ec@W@6{aODY|uc?9*Suva?ukoX&JN|iglMPs7P3S7sWW -O>$*|m<06mJ*m5dg=Qexm;-A=IhxRPke(^kWr(O!hBOO9KQH0000808trnOv4^+5ex|c09P3R03QGV0 -B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g_kY%XwlrCIxL+c*;b-G2p9qmYfdN*}<YXIz>-HoYy-?RL}j -4!9ua(h_YGr9>@BCH4OG_YFzOl<hS4Fwj`0=FORJhV07diY*qa*0n|~7ED%+HjeS7)v9%35q^(WL{?~ -}MB${aZAVx0N|df`lo$n?JQv>!(F}+_=z`P2CvL1bH%6P$Xw(|D;LaJ#PT5svi;bv6He(rY-G;t5+B* -6s3I3ah^*>r+w)C(vd|ip!W!Iz8nEgXAU8^m-<+Wo@vs#;qEBU8jP-NMybQ{KN_RHnvr^)9j3;J>};< -b{?=S<cs0b{;gd<fLKMHC_(n|#!@n3CM3U>oO}eDv|Ri(g-Vc>mAWZ$6waKEM6t{MYl(aAlIwYwrNQE -gn2894-{MkZ;sv7qm%+-=OJ(F`dpw44(%N9{BH{x#QNEwxI1{D{Yt&jS&`p%X-~;L{{hQixnl~7FHVp -@|xXn)p{l`YQAdgV*a(EO;|wT*POl4h>F{Y&P`sIjN;BXl=TtxLP52qWiM(;d<D1Sv8-W=l}_G(yC}3 -N$t=X_;@w;J{4Xzl$_MT&7FKCzk!Oe$f<kMhSYf>uw~NK3P<9rLIi<MG7^OpeB+KF>B}MnhI|45){rF -UgWL>uSpE1bvkt;93yIyPOf8^G2<1A&tBs<9xYWjHcQ-&Apk^hm(3bqd!VsKBpq*MA<7<iwsg`mTPNG -of0EWd_wJ=3ZGI*=JNz_tyRkz+H4&`$FsaSkC4(G7tOF+B|D9UmX%U4Y}RzG{qyZny3Cm=sXvPpnX@B -&NuXcgX7{FTUM!Q`*Ocu3&&%N+sPkR4&rh=WUKU&nP!#A()ci1oD!*yi2dtb12D4<z40&0mH3BCCDQd -y^i=7c3akkYC~qDSiHjwRf&axYKWp;Ce5A=ULi|HgZ!YEL4dSA;V2)6`$}RSA;Hcl!FCLzeHTG@mvgm -nN*71``Y7D3Hs6?vkes;I=OE=k>Q-kqtq(1YhGY-z{9&1~hiuY^eYWE{%*y-r2HSna_Wt>;u5Uo^<-h -@;4JVdefG#%(F2S95(E`g=$tsP+!Imfi7&f}C%g5NlCL~w{$2>*H%Z=Ex98ic?tm0e0b?61+J1-pCjt -5ar5bB}QlgYYiodb{4y_`cmGqyyhk*+h7g#OV=U^j}1ErV!6(}~E}xo;J=7Z=(ZTPj|E^ZSMsrPzi8j -^{AC(l?@<=DWz8f9DnY&YaEXqrq0beEE`nLH72Bg+?|%IazDHRw74Lo>W{a;Nc--PT@~i?_@sY?Nm|E -Y^^Ya5%UJU5{X)NlK@G;^NS}#SjzJpC3g2{Ful{T15K|wHS-rwyu>pvZrsZ{nu_;e=sq|`ct{XKQ7cI ->!cQ_Vjy*{5;Q_l9akAN<R4p~w4R0DzhYS!^<2ppLY=R_z!iJUCx27M#jw0BJWRF;eC}pVt^6_4FPXy -*y16GeM_py3JNSJ&+-^Y~AJxV$=IdC{Y_dWdk4g6kgRy%ACu$(aW+k7wonD{&LBgn4O*$CdDXYT=Gil -v@@M8vj1(_E~iv2KDEUkW8FyEjw*4Z~VZv#rk;5BZoQr4xoP6(DjI*l2;K1d@o^+T)NHjENH98SRUNI -lBn<puI$vhGr-)oj5D*kXU8H5j=dq@{#f)XGEDQA`uizztXA*sa@+00y;!X@Qh$34Meum`eez?*^>WB -@Njl=nt+&pP0I;I3Uc>Jd;0A8zO?l9?gT)uKNrAti_xVP+^9I+)NQpCrVqT$!2!QZ!IdBR6*p^fNHy5 -hO4bWmeg~S6wtmTzri&!6r1>%kNd{rhZ1a_@%SkyXBzpB%_GFmJg{C7&D+c3DX9f0*G*Y__%<;ug#Li -~?J$TcZUIq=vrFTmM^SaX5ML&q>*01J~?HcKQ)rok-p3bq*tBw`5Yl!%FM<um1U`OdZaFlHB4}9qL=x -|??gEEd?m^&Yf)hghdmxTETKPx{h1OYUeY07LDj<7j<Cxt2luwY`kL4K5>-D6}RCu2e2luZ-K;XIAn4 -zo_B%lX%Cr2hKjI{L5X0qW)P^wza>e`w2gJlWylEsJty)Xt}OY2S%JgFdb^IVK*_h}j`IEdEf}32GSi -YwlHZ{50zMv)KGk30G3zD0%z?TKz^UI>I2K3tbBIbjvWY8O7sRYF(-1GPC^wXhxGF$g8&4L?KpU-{eX -n8>qN-YcT$cGC;2%c6nXvtw+qj@wzM}O~zcQ?JTG#8G?Ed4>vcZ21;2Z*EShBkY~Davf?TVLRWbEY3n -w+&if*z^n|s$Y8<n38c+7ClL8t+u|FX9DCMV!<aa#k_P_mTkpAXF`efef*FtAMP4Hk0I3~@V>3-rNY# -i9%jd)>J!{6L@gNdh}v8U5c*gF|}9YMQ9jkDKqLmN89UJ3(X;V$0AjM*eslhYctErna<+N@7Du2LsvR -nXPR*oMot$ItU;A$2^?kgto_+6l3f*5uz`WhcJL(Vua4J?(eKbENxnAplUKTKXIm!%-+kG-wI;9E;9T -a;uNotHX$m*#{2q=~XF^4@f0}(C9cqQdjS3!{EG&t%<>XH3;qdPd7hx8i|%t8{bz?uGuN3sjF<KJj~z -+n{^%JrBr?pyUsctpL8_KXTqUZi`{g;mj{WdNf8kF(F>c!?&urI4^P%(8jRM|UV=udc<WD`IPZ!zCNm -lm*zE?Rlx=u{{H)P9R0{wxdy<fNSZ<71$?w8?!Wvl>1+h}DCFENm3Y}j6^$e$Yx;C-}PRDMV52Quk$f -R6a&pO$=AES@q5*_UD-q-ig0kt#RL-rVBShzRU(<j_7v%k~jrWg9Zsu#+N{iwg`Ptw+3f)*%GK%~|=n -;a?2{Q1zf6qiOpN0JR)+76R7B+~#tsoD<4nOz6^kB^%>XzETHQ3;(tkl#Z+K|}(b;Vv{J`FK!|zxO8} -5_Wc{unu!mNoR?q|I0N$o~?!R^>k!9`<ZUakpiOhcjJc_;IP^{!OP(!-3)F)`izODHhJt;bh#I2oF?z -?HtE^_f62cAP)h>@6aWAK2mnzTaZI*6Bm4mZ00656001BW003}la4%nWWo~3|axZmqY;0*_GcR>?X>2 -cdVQF+OaCyyC!D`z;5WV{=1{WF&T+v<&IfO>gKuLmal7lf~Y>li<R=Z|*WaGc@>`Jl~6WT%#?Vhw^-k -W)EX0~*;hSZa$4O{0y)jR7LCL@sZ{bruevme>F#Wdb;sl-O}yo+vsW>4AuBA;b9x5NAM>~4{blF?{XP -zm_~73ZaOxw1L!$*`YzyLt6fXm3+sRg-P_`raB!zDB0;cnr@1^dLyMd+1_;EvyM}k4ocO6O=&%f>xfv -mJo=EeWVba-LbL;wLVIWS7s}SHUv}&JM^9kP$q>LapR0XGew4u4Y)#v4VsWz877At7T`f~C8pI>C}h& -dG*lgdLT)S%JZwdU<4}2mC)5pP&RI9Pdeq1wvWCKvkGKl=6bkOVzDkCqN_2Qev!UL`P;zq4@Btp3U5h -(Mcxgn;h4S<iD1;SyWOhB%xKx^q9S_)gA3R*cGJdQEnI5<zcL<6UL#?(I$M#5}=2LW11-GP8=d7eXy- -yziZ6&SX=<mhcO%gzVa^}nvrX)b6KP}%yiVl!E+DaB`755XEoVyd}0G6+GTz+1q!4A8AiR|)A$ltKOV -QxPr-7F`;-N5o?1s}UKt8ODs3*iWh-umC}KnRvT{`(CGg|u1Uo&C<jU#$J$)#zm>m)0DdOwJ#B6QchM -Z$cqVCKU2l=ENs-;LcA_O9KQH0000808trnOmD%VI4%nS08l9a03-ka0B~t=FJE?LZe(wAFLz~PWo~0 -{WNB_^b1z?CX>MtBUtcb8dF@*LZrer@|6fnB7o(trN{o|SdoB?hupOl_>Nr8<w75$GYDKOr*3?qqE-m -Yd26>GG?p`iWax?ouE<fa`$sJG>6_QBe&dkov{N`gv*&|UFC;TcPg`6Ms?%liB>k)XZ*^F_$B-DfV&P -$VAE)qfD4<#=*a*=V8ELSO8GA^l1;A=J~a>2;-r)S5PKYdTeMjR26@|fna67qN<<tn&;-)`oM6^s1!g -39%kpXFEgkETAEFh*XDkDojrlX;etm`R$X!q;j9QMTIT$<;yz<kWs75BDEDB(n{fBuh|bLRSgb)M*ki -E?7WLCQpV$faLSD)A7ZmDOy=#o@YxEhVw!eISWHPVU|l$@C3AFVVX#m(^T|&W&xi@!tnViov~C{rt{; -I@%g0J>-{)>H9326K@N$x?|<XLlRYxYmW*(^WI)a<Q_&orW|G{{G>NU5;WHIX_~aE^(iPfRFu(Wm@0Z -VBT!a_L&&LxG{fj!Smxye1aPZA{qk~c61@3oms3~qoOB#(LFk1?yL7LikLj}(gE;F&P1aLsg?dm$=ak -dttgTMV1*P|7F__fzNJwAOlMrGi0FJ^N>MU*6Anyp#h7cz$<4gw`22XkNMlnZdelJqm4ZU*Fda(Z?~Q -YOL5g2;?0MiNnU-|^@l2tKgDip97{NB^{lSkas=iQWJxIeD!eW*+&PDrewTE`We=wr<hXFkT4Q1OYPD -N}&#;1aQPfB9j}o8<zLf`A1FWqiLx4msCazbUQ?jl|eL!e4`Dh2Oy~^G5k`IDgB0o0@i^W5Rn5cFm$z -pl;Wq83AtvQb(Y7XR5fNd{`!$pE)rs`{v83@3MTIFS!&R)VU9SN&sh$UP88BH%!4J9i(vYGwF$t2zH- -%+;KMA&1J%u|bIN*=L<@ZY3IZbuVCN%a;RQG`LeJ|n2#64wV1S^@@$9hck{~M8{+bIQbj1R#EWVD8j_ -jcUhlO`Sqqi5o{4hTM@$7<3&c46+^(xN_9(y$oDg=XwHH`W!{Q)^d2{Rg9-@)S|-0%;`Uk;nHc4oDEZ -qZuF!BmCsd)hw=)g&t<M#YSgITca?f^wU=e2KA^Qpt=eIu<PU75G@+!;;_)tj<2<Hs`Sk=`_o(i&bC2 -)C9BD=Ny(4_F&@@&ybT7DKxD88mQ2V7%?9|{7aDO6_YOCjsX^BJYp+3vJ@i_1MmfmU1fP97fZe6q*!5 -2hL|=v8WU}r2z-Lk!|Itt5n-O_%pavMA<+a;3f>H+HiJ(|Hv1WXJtSa;06quPi;T0WHA}&-dA8=(91V -BAfHbJ~Tp4&nz(^)mG=c>9`s@Au{qKhQ{n)&pns+E|P-NBThx=MzwFLx$3p2f~+M(~gm2dgm`P-a$0} -TqSN5G&9mk*XSURI0AT(5)U@I;jr43zMpdRBV=kf?f~1R-lFr=)1fvYS8@K%s&pmyZB*31_ia5vdHP3 -hr%)B%vW8Zcz>sKF>-Pa5<|BSgG0?nj^c#wA6P<Dy{8n51hWKF{|W>!6peXs<MTEB4UvhX^ioxin(7C -Q>h4>>n6fCf#t}qwsvf4k!Dn^BvsVP>~C=W9Wc})$~dchreit;%|rXFZ$E@t9(INKafBg9Sfc8V8|xb -T2z?jdCa5e`a97+QFE!BJQoOe_TT+@pyA+Us-9}KL;9pP|8dTw*D-)0NJj-{ANPy#l3MysZHp&qCp3? -T-pcM}-hF&u|jKkaJ{&bwEBNFF0eebn7N4=2<$XB^XzG`bT*a8P-+6rXauoVDa0kolyk$4LzD|WS~D6 -qZ@^7``W=s?$T6&Vp28X}?Ws#IlBh^d&3?R}r1!IN1bSrDiYtjhZ-g@z%CXsXkMxp7qLcL;E@K`93ND -$u+DIo)>{D{)w|P=I5cCbJTJ?@idA;@cUBucHuOc#R3>1qT!w;+$P!(aEO`ps64PB@-EjeZkVX&ONp8 -uDp)~zR6t5KDC8*ZgEbpH_F*6HygEq>pd>7BVUOl1W&miUR?rZJ>}rab!1XzyVA$lV?%kC*fnBp!cLz -`=xl-apn^Yk7bDePgs|}7+w*Z_?ZLMxgJr#X(q5ghvNtgeOTt$LRNy&HQ|#W#%r+zpV?`W#V1N{gs@K -SDPZU4;8mQC8)xe}NB^-N$*+yClcfGaiPW{5Ryl2r`MwnE+KV}ErT_|;?B+j5whMOaUgmr@_IC=5huV -r6#a&X>erQ$|?2VxGORt~%it6z{->*=VL%pJp!>9h|Gta6*>7)+<o+Cp@qy0m$xs{#|C1*_T`rCD38) -l<0U6Gn4ru)uaxR@xtLR2;mjuiTE7Ek^?K>V>jJp_A$?TRM<a4no$LNpN%ss~Vt#W<7BE5DzW!T`AiM -cfSsQ?eW2z{ddDwy>IE_BzPsh-*Je+kgTERgSj>cFVJL}-C(fWE1{zDo#Lq<2uX7(khMSa-rhca3V+8 -P71PGQ+3wB5;N9JV#wcv7pp%^ijX|T66ZqRD46~IL^vDQuT3)kc3~Me@)&s_VhgybBJ_z7QHgk`H?vA --<%Yfs5(P#aBvqe4SHUivwzO#`XxIxlzQ5hu0gE-*}zqF3rds(FEz0r(fE!4vDE>F6ZL5&t?I@>wtv{ -O%82y{Auq%}`+fp;A)iY4swa{=EN&x)%B)(8ynd<nOrdV^#oY0aSD!PQmH)QD8&S&Zze>w#rn?E&;LT -Vldp<8$OScGs7nMASg^XC>Sf+x3~kUA3^Xg+8<<EUTD<p~n1e*kG&`KsC>+7f{`|!`h6Y&e+vCA!m9? -1#GBXXFSSv6P@Z7DsR`uGS(FD72}|)%#b^DVlFHfZ1kC3TGf)XTiGwEYuB0bX}j?4v{kbhQb%2779D$ -=gr#w(@$Ah9g2WJMKf#r$xaLCLkm~Mf-3Qd-VVOMiyRKrUp}?cKodm)S<n!nne^O{97_+|>*w=*B$N- -{9lhmgqW>RUja4)3zGetS`u`hMn7I_DW-mJDT%Nf1aUan1R_5fa}JG))bLQU+jaO1esCOI=4Zl}5Csb -`)C={(^yJ-o~dXTI`V&iRQmZn0$Nu{B<M|2OxwHr>e}9l~mYoI?2p{m#b^|Hdl$@xy;ioz${A>twS&w -t~mu_=C1TqGg1RCgDr2JKFs9WUhPCYWP*=aMMNAS}z9>?bNED4{B-n6STo^2n&P5FAfX)L&#@Eg&v)C -)WYTvt-`-pRQT`g6aVa??hKGm4bgUQ-9I;M@TKNs;b+eaDiK;Y#G(4oSe+I4BP<RIJg>1-wPLkWWrlT -T)Y(Q$yT=>4yp5l*l6lF1MX|hM#AL&qsV6Y@&zP^t@s|)oZ!RageF2WzHO1w288!48c5)1inxW$^U;_ -;irAvtiQ|B}q?0rr}_EQR7hU0udks1G?NX#VHb{edQ2Gu?6j!B^3BvPBz)6W@?lZZ<5qY=-@GRvKd9l -Ze%Vv?`_Wb_;_cr)8-VqP*HseVia_u{BMb)Z?R9-aT=!HpnoH4CL0wA`F(Nu2JeenL|c3|-%~`=Hv@H -nKHze{JR|mT2cen$d0hZzhHyW!$il$K;V3AL1djpDdINR%0q@9o#h>RuNg(xnTw;TGffLyVV;ZxLaHf -y0;{j4qtVR1Cy!}Sx>lWX5d~bsxwtGo1SmRUQ3<3-QKQ`w!PS`K6dtpf23|t$?|>ke`tcBF->&S*4A9 -qJsETee?R%?j%i*;CEw|8(FmU{)4&cuvrmT*v%PS=1O6{iO9KQH0000808trnOvkMViv<P%023ns03r -YY0B~t=FJE?LZe(wAFLz~PWo~0{WNB_^b1!URVr6V|E^v8`noV=FHV}aC`4wt<@FmJvU_R`b9{PS9I+ -OO29^M;+v0^L6-~rq??X<tWfH6qBE5JD<ULIEaC9&+}@$vEDfz_W6xs_Rx?^L!gpVN3N)3TNShd;L)e -vi-Weh0hVz^a^82dN5{#V7fE<2Fft{w&n~P;J=P`=88N3Wse!*{eF`8GDV-D!b9CN@P~b4g2!??TM9A -vX|e!e*fe3JA2Cuwv$z?(y~_l*ckpZ`|;xk`<AmTubAAa>Ze-t=RuY1O{J36zvD}lpW;d-ahiUzz071 -0S8~@ZeLCK(em;LbJiPq+<@?Jk`-T0}nz6WKs&-9sQU6@3Hy$oFt+@U3sbhM%{y_{z02BH?M%Y4aPtB -DMO3oApp|bnF8G$H-(p2VY9k|TV$VDyWVd$;7(`y?f8#V>1f{Ue?2C>2s(1G4kU^Lgp4%~=!7<4oNrV -f!Y5`-bNfkVJuGT<%>xJx_ZqJXcbL9B2DbZr55Q5<L3*nv&JLlp2HOx^K-yGFnfOn^hcS7g9fDBvsFn -H3DUSWbgj;Rv|01$>3#IK##cqyyfA>1sUSD<j|tCcq)!N&OH=>w~_zX#l+*)GkvRJ(L-b_S%D)Sy{s4 -!OVD;%s|kaV`DVe#tx)2(}QslZ((qBus_4&@|5#n8QN?#5Bo;sOL8j^pqc@;xz?>EK$)E4ddFBR+()_ -g={OP~*Sr}A)g;(dj}uHUjZGW@(Q}#tqq$ypApPVbGP5tFJR&dvnXy*S0H%2rt(|F5UvL^kZ4&`%5;8 -miN}(l=0Zd_FNg)J-Nw53N%&@To=@j;0dC4Mqi9k3Bu-~pBy{|)D6bHF2<OkfYJ*Z!%oC#58LfUHrq_ -=AbQ|Qjnh*ur~t%Vz+%*<H21L-ro2mey#B~E9=aY!M3;)eCvg(FFxXBwL3`{s=ZtWTmtY51f8b+ZH4H -~JqN*`(65Yzc$JD#u6@B*~O|+oDP6_6*<Y?p>f}TUc6SL<(D5F7PXXpj%miI!|F~gb*ogJ*pu3x;4Ez -?$?AjO=5726t<2{;09}Q^>jT^A%sVk-Jv~qkGTp9xaArlFYZwNjhX}?h#Dzih{M$=D4GND3k_Wc?@n= -|vMMhRdK?B}$JGMLL5f4#DDKK@5ijynoQ<x#%S#>x@GWKWp|V~6al3>vs?RAbBnHPw6C}w>mE3ohGwj -qw<8~%z;doHxK(-fwQu789y>dz~iMF5^Ge8gq2-*Mv3=nn$dNj^T6<yuu6&Gv2-#a?mk7436QFsrMXu -CWf?a*i_@R>rR{b@?ppN=*YJFJ#Q`>G~u6{79fXgLSPN=MO=Y~dl?EL%I&XqhQAMFnU_Vf5|jrQ}4#k -f<ReOWOgZ4F{XnBE;h^4Rr|vT-pE^7yt)-6xxD#{G*{nqu^Oe8=t~!TMeM8+bW!cVx^<#+8zNsQk!LK -hc@-PChBz<t9euPYEIw~PNIg4tbrA%0XUf<6Wf5J26%)49&LaJ41gmx3T;8$sB5TC7~s<e_`m=-rJ>L -k48{xy2m=DzfB+Z(XABhDf_P-2p&?;FNE;9W1K=AnjW(Sa9Nj{(0bh<qtTNTNZWcH>s7#g;__o+@kHf -*T-#V^<=cPf^Th9w`Sa^T3=>(+#5)pwA1P{$er$OKWm`QZU8Hl+~Tsfu1Tt$RS7j=<$@qL!_cddv+mv -nIlZq=SRjBa8L;fG_Hl!h)HNit3-GLe#6%0RCCN~i%^<Rv*DcW<ZaJwC@>?JQ~`e?Q-$?i*angsz;z0 -MwS2vveGTYxCGhHBuLilSx?~)LZqg%y72CsFB`Zlgj8AXYa86KwK-}K%I??W^fR(aQB1474N#oh`Vx1 -Bj(!F9??s5laOOEKy@8@{!(ZyA%ePZRQ?C3Z!OFxy9pihLK<(MBveL8)Y!yzqsE}M6>5DO4?zt@m;%r -}Icvi`6wI!=jbIHmYX<8s8Yi27eh~f^oalqtz))as;uK&ht!==r{8Gw-@8nzkG}&p-Cqw-7@bAO_P)h ->@6aWAK2mnzTaZFHuF&{(%000>U001Na003}la4%nWWo~3|axZsfVr6b)Z)9n1XLB!YYiwa+Wo&aUaC -yB`O^@0z5WVMDOsSBaie}qAB5~;Ma#)G>P<lXOQDl+<ymf5XHUd<&zkU6Y1hG_mtRp3k{pOA5J<nh;$ -TINbfNPYMs=3_SqWLM<8ikEJfB!X7(0AOTWQI8ex5G=0!~l(|_X3NAA6H7B4BzhD81B0%+<y9e3+ofi -d7~uEndUN~1+P$A9K+rGVFVTtW{>yNZ}TZ^lz|!@<HCCCK`4SZS{Vn=R>{nn(>PLWjA~$Sgy3sv0sc> -Elo=i?)D9lw>eLuzu0jffzxHU|>(DH#aRba+G_DltfQDLUeARiPNIQ_$U@~cEMS|uLW6<r5Y<F5lFD3 ->tsZZ2WX=a>-2`mXAPpQx=x8C+D1$<>1x(H~kaVogR4M^7f4~O2vVzGb+1yVV{n!9&?>Bo*+*l>a1zi -jVR!yK=e5T{;_I;8HdWT8)4Hv4inoz1;0zca7PDxRe+%1af0!=MJWp%*?yRGt?i2(KyGlYG?UA>uokm -L%vxRu|yB2ZsVHf4Z$QC*U$(Jnt~8Ep6{fw9(%oR@1zw(X%2Y%vPMg=INdBJRRqf^bWTbcIa3`fSym9 -iYKcCY}m0BD7_YbM*XZU`y4%ro(GN;nV&CPfk%h3rhQ5hUPC(`TK^tBNdiNlEer9_2cTWTk8n<wryTk -9(cenWv<}J1A9B$qgcQ$;OBzABZx_CSvJ5n385)d~Wy82EOVYND?<z<8ej+>P^!Vnc6RfZrtKzU@?yx -PC+1{L+DcBh7c>z#M0|XQR000O8Q5kVe7MngDx&;6Lq8R`HApigXaA|NaUv_0~WN&gWcV%K_Zewp`X> -Mn8FLY&dbaO6nd9_zdZ`(!?zUx;k5(K0INswG5kp%c)#S&mZbqdHiSq8DBR`xbDDR7sueCeV6BfS<V( -B6AX`%C&uI{PA*FY94fuuO6}-#3q)of*AGLA;{T?HHweJ#4*t^{UlE@OdCUiPS6B<AiZ0mw&2!l=vC) -F{1$zl8B|06SR&KG}RP6B{dG>&0|7u@Aw#fG`HxaKR7}DBU;e=I6@1&p^=gfX+R=I#%QuQ?;u79nqPd -JUM{ARdqp^=Ap>e@^g4;}k>{;bo+iZe5WU~T2}fx}!35%kU{ZoZrUiTEy&J~ymvqxX^RvlxzUTn0knb -SrJzNFOGmG*;zmYatpNl9+$UTWT4$q}{(y`ZMD8$<5tJ$#KYPD8mjWA;*;a-9%Bg`e+fNVI8qYhf9QK -0VL;^daW<?WXTan~M8y*zmwX9gHyw=63q6f4Teb6i3oRw~vc6mdqc(I&yS_jrt=7!u<vNpfLfBRZ1?1 -Isi?;>2~%=?X--e*1>?9P}nvW!w~5;f2@-Ev|Mzd5%={T?dk{J9OH;2;UQQdW!Tyo#^KSM6YK1ii+(2 -KP1t9qG*{cBO$-!dvb#fh%$5;M?~z~50Cr~PLB+7uQ9^kel4Ql+C5u*ytqIQcjC;l4GxGttmRlPl%#F -m1C3Vk1M3b>-ksE1Nm<+-4&RNsgM(lp<}^ACGC#YzxI99Ou*^iHf%l(3F9*f2$v|}DD11Z#hP<axr6N -W-{Yv>`&rW(AhNZ+8rAw{=N*A5{L~7-#+_=8ubd+pcc;w1QWtUoQmw~D@xkVh%<fQ_%CuBn~7wWJ39W -;Qylbdm&n#C#Kq`ZSXbZXZ>_Zp~f&|A%5bQGW_e3Wrl(MTJvZyKenn(AKH@s|mdF$vgKExB&Vq(VTGU -LIIUY6YfI5Na`vaCmx^q@)Z|R+lW%g}%WO4e4b&RoS8@!HOXU1o;?-$aHHY4gf<qA?Pa(p**YfLp+Z2 -1eAva5`YozsvPWra0)%B-L7P#PC0?ekC(XGiB2P_O(lD=$eZ>ymprm@<Zae>mfPuUxt&bl3)kSg<ra^ -?Sw}NE?Ojx+Q#*hEb`Y-6*{^R7h8n$xLF>kZqtMwvVWF)J(HUH9w^>>*x5K^&mZ`L=zWn?1?|F&I-nE -}%s0bg!lyACfu8Ko$XR+(<B#^_^@o)#TfYQu>U%uHK`dt%AeHIr9YfKX7SI#Nuf$}>v`Sg9OLBVVaUm -)-Ims_%%ygPXB6HCG1eRnd=l{Dy>DLrH)^z5S}Ea{l<)}j4q(6LO(sNb*mWrx)bk!fI*mNx}Er&4}Rr -n}<YK$Lr_h~`fbg$EGrq}h`v_w0zsm%}vQMfQ}3WwQPDFE4qzRTfL0>7S}O*!4~Y!)X@Ii;-0%UQ#^s -(b|_?0O9q45Z{967#CW%HR0*liFekr$77H21f~m@MshM-!(i*<;EQL*4r^@4rpIg~DNd1%6r~@gFlqI -EjA>-%NZZYN<76kcx7cy^0EwaYIGhY+1q-3y3w=kzFs{PY@}3Nin4q3d6NZxLc{EwhS0f@C>7E=lZS= -?pXX#X=bvpWd>YM*Z0nXJ_*zq!*&1UBZs&LG(EN}9EcDSDHQpuB}&xPWsvEq+!f9=arns=VzQE94q{& -wp)&#HT&)aZwo({-1zn!~>Bra;hzN=+lOGN%<X>%(*;k8HWZ*LFwW)Y!tWaNFp@Pt7M$#WH#T4nk6ct -Tg8)t=TU>`F&X?)1;qjxref;iTUODe4Eeo_nmxMhDkb|IEK9`$+Q}ojpZcUdP3IIvL?@zx)l<zlMdJy -z}H`H2l&%+yBfWQss&H|HC!PQzR%$X9`F#Z*wMp?p{OvV>konhE}BK$jl_S!Bp&1vu!(!kXPbnpI?Pg -WKGmRxgXd~|KB874S2Lt#pju9?vGpHNO9KQH0000808trnOh|7<zN7>I0MZZu04e|g0B~t=FJE?LZe( -wAFLz~PWo~0{WNB_^b1!&bb#rBMUu0!wX>Mg?E^v9Jmu-97G!%xv=U0f7l7yupPS-XL3()li3S*RYFk -ml1mW~>O;{@5EEie1+DE3kGq+LJkB46%vEK54~vD~ZP5^Ao~{Bk6gr5QGw&1Rz^-0zAK%Il$`cRg7aW -G9+Tnv<@^-`@YL7dXsCI$LBkqr8-5I?u)2h;mBedS|uR4lgGBF1>o%NX-{FHocsdBXQ(IG3ZAFk=%%j -bmkVikc%|0@6J+1c|jxb_~N)L3L^33?C9j_#fdO;D>Rid%?h`4<z?)ACMFZJESHuhlU03lTZ(0#x)Nx -Tr6pOJ6^#ZDtgb4THnz65Trn;Yhv#SRg34r3)K}W|O}#4VjA{wzR(nyqpv-hdnlF}RSCF-HTZ~&pX;W -3U-0gyYmRwCa@7PmQX=idV;Waj9ch?=8lrqVv6Sj17|M!->#;q-@tGFe%;4D|Re!|&FRjc*=xI4mI-` -5*=8e}#;b^WLJ?8|DI-aXBE*?;}6Vvp&*VtE9LeOFiCr`XMoZWMc~tyt_uX-Upr*wvYASBI<X7sespe -c`6un)-~SzGrGZv^jNk#Mdvpn9cPvqt$75i>{_l(%j6&Sm0?tbC=rH8o8X&xV8CWx4P9({iw$EyVB{^ -X_uS3F;u7ZP#PXcJ;RRg9;iFF)+=n>%8#?YwW#cEWk1GN;P6$|*D*G^+vsqIj`@L!=c@<iu8H%Ta_as -h?T%c$`jewvLBh)XlG=m4{mw`%Y?_zt)@p-o+Y;MCP2IT@sd2YH6478N$ekjWJP`fs(}RA$(`js;3)l -9#&8=70{eEj5Mj;%8a5sbxL%0{h{SY36aOlI*2YDDwLa2Ob!!-(_S%*=mGzyhQq0%T+8ih)uP-zq@jY -6f-FobakWe7vHkqV&>VW>Cq^$O+(%qDY-`5|+g`BBYgt6Ar5zTRPe%zVJ?GIy9g<|j<wEZ-^LCf_69A -m1I|8s8V+6yK2%^Hb&{=9u{z^K<4G%tPj5<`MIldBQwpe#!ibdB*&j`3>_4^IPUq=6B3<=J(8J%nRmo -<`2vtnJ<_>F@I+M!hGo;^(ziuGv6>L%wL)Q9Qi}!Pmn)8{_OaJbIF`CQ|52X-<cV6#`JI3oVj5B!St_ -J!St`?lKCg|ih0evVgAMZoB0p(U*_BOJ8-amXP4$+*vBNoWPr&oCJ!;$!(<<m15AdP#F$7-5=;~(8WX -|<ePZ;9(I-Zq7=2>&iP0xUpBQ~&^oh|YMxPjcV)Tj8Cq|zbeI)uw^pWTz(MO_>L?4Mh5`854Nc55DBh -g2qk3=7dJ`#Nr^hwYsL7xPD67)&XCqbVCeG>FZ&?iBk1bq_pNzf-jp9Fmr`Y7~K=%dg_p^rizg+2;>6 -#6LiQRt)4N1=~GAB8>&eKh)L^wH>}(MO|?Mjwqn8hteSX!OzOqtQpBk47JjJ{o-peF%LBeF%LBeF%LB -eF%LBeF%LBeF%LBeF%LBeF%LF`WW;v=wr~wppQWxgFXg*4Eh-KG3aB^$DofvAA>%|`E=@kuTS^`L{$I -xHa5TI!q<oYvPza|rrWo_P5%Q>O9KQH0000808trnOppzSL#F}&0K^CY02lxO0B~t=FJo_QZDDR?b1z -?CX>MtBUtcb8d3}{li`y^|hVT9rBE7_rhV6ABr*xMVdMNaZ5*DMi#)*h51xY4JOaFUEU;g&ykd<binP -}d3EU#9p>?<wL^a!L>(o!zDJQ6Adx$p~y>Y7SsvK4ZbRy8S#s<DlRq9DA!C~XOSHA*xVim=ZDhuPbd? -G_gSmMfW(_HASzpqVVDu2Lw<QqIS?U(TpBz#mBbv)?V#Cu&ZK{e<f`ND!Bn#Pu>MxUq@+g6n0nJVAMG -<#3y2)&SLId)9A$_Xd4Z*OtZgGRdW}&guw%4%=nEk)w<sDX^S#Jpr`*FSki-mL;fQytHIT{$>O}liAo -xTEpWszVZ0L=7<hr0qZ#&p<W~+owW(+A^{m_AE7}kVx8;>>LLLdiXEw8Fo0u?BRUQTc=U`!b`%Y0Z#* -N`iv*-UmdS)(C_sHrBh(LVvVVQ2m1dyP>cfl(vn|YvFk}6stBDoUre;i?HZ_@_&HR{7hG>($VCxJjas -*qL27{V|S$hqD?Y`><@<*SA_v>#Cf*E4)IRQr2Q8D5a-K2|{gd+Ex*am;xY~8)=3-F4>vZ0{+lr`fPY -J+kYu56K9Shse#2d}Lj-N}6c5C&#T4RW_Wy3WHPDy4_#ElNR+AzZcvx{`O-FIms<+tg)WJzjG`b=QK+ ->%`ml)FQO8>V2uS20Wls$e+#KOpI5R;IHXAa)nEw3=}oBcp;n6hA*=7f3`whL8tx#n~s3Uq`<J9sL>h -jC{f-TH7wI9q5<Ema`f-R!^?~x5q+i@jVg^Tu30cQcp6e2ho`CJ8o%?doYnVk)2r`u@ioEV<}wZ+Uh) -=$TL~9Sep1oElh#TPE4(9(j1x)1=-_*)LC5igK+tA8_k$0&stP*AKzJNdH)-59u8W=TB+vc>P)h>@6a -WAK2mnzTaZDXyJ74Vq003qM000#L003}la4%zTZEaz0WOFZLXk}w-E^v9RQ(udtFc5$DQw&0>f(ZM1; -M2lA9s77M%OYtUZLTr#GI5uF`<q0q^(=dEY$&wGncu&es(!G}gSK6#OqV3Bvpo!IC{Kb=+P)X20W}pp -PmgPj9ncA{tf5k#QC^n9_)t6iJt~Ji8c%D_=#{3WutQ%fLtbc&P2DK+PMyYxm?TLMg$}AkUCHG?;$2q -PM)X+MIhRQ-h~PPJ&I+^nJO7pdpEON>qEqb^Zd@=3c@Z5FoW(l=8y(olNh35kplQ%Zg;a89L<nT8;~0 -${<JCyq&UZ@*z+rH<gI7C5{cp<)8d;0GhW7tdaZDmmgDtqxWQ4jcV5TWRxQ=F{v5G?^Ci^7XOj{{*ZH ->NG--RYDfG%pNvOK@R^ooch4?`sGmcC%wtHAZ1srKW}qKZ7Z!L`;!WehSYTm^@7!I;m1s_H;TI6wp_I -nZAyeVla>`^tB8#2)UT7x+8=z_K$CwkKnv0$$(pEqyrCvX#oTHru_7TXZ1c&rB137w~ab@(hZ=Sig?7 -OpAvI|L|1YTiDcn?v__T`cdfM`tgju$og5(CgqR-uM}MEI4y82`wI7u5hj~|Va%8Ny-@9b2Y{1%9MLu -vhkkSho^F@O|B`LVeQ4>6g_E-vH1{Tm2Q?brhCKNLP)h>@6aWAK2mnzTaZE75%(G_$005N<000^Q003 -}la4%zTZEaz0WOFZLZ*6dFWprt8ZZ2?ntybS}(>xS?_g`^UI>jDML|-fQVT>Y8A0Mr{A%xfzWr@=n@= -LbEXs7+}T-#}rG-VQqyd<{oJwEsN*iI_T9KtZIbuD=qg2<~<YKZPtnbn$yu1!eOueOS$CZ!Tpa33iim -w6r)$v*GWH3@lpalHsHm;bLmEN-rrA7Kuo(TKb<d2mM61J5$10JE!%Yf%=UbR;#7#8On6sTU$S;u|p1 -!iU$F>#NnxHBR$H03Q#zJ$N%aX^2Q+n@<^WF(!SzSbg|1r!c0r8Gc@_-(Al~<EOUu_5AL61h=;~=jgF -fmnLjJZohvMyt-P27oTpHds!CqDU7GUfRSg?@Z;c@knl9BGY$TGIO1+ZF||*?+a2ml>ms&;$HAt|tc; -@!9!r^^hUSHRl1B;n7qRO;bi_p`qRO@>WU&b-$WV{25|lb1AB$sy$dfWS;OSjQjaX;k|M!9dsW>4)Xn -ObY+$7uC6-PO<pPg!eHrCBVVN_=bGz@j?N%KfQn1n({qEO%q@cknI&0yT3Gk?l@XoIR@>c+Jc#RgQB2 -@SVkarqBivJM#P!iaHwYmzjA5j{~X8{s<cHF_q5#95@2*_Mrd%?72-o6Rf>488!|X%&~S-_g2+dk(eY -38ZD)-7ZBiY7{G?oa4^(+9A)?R%43XnxO&uOSm4f>9`GWJw+jO7*fTvbOPs*+$emVe}8P4yLk|q4r-i -$Nn*hPqnk|**>RqPWu+C;H1WZ{J&XvV#D17Vq~~eR_w9Luru6T<NpCE&#+-Xfmw3RUg_J&uuzhoPV)a -K7ZU*cTcr;?voO_ELP1D&MahY%{s>Nb|RKTv`zx!MMyMIT2_s8t*Szzd=e@ovX{2Trjt79?it16O;%K -*<0E_G8!xRGUD(KnMrk*xK;tc%9>E*PzA4BRn3Zom~DALw2Ezz0mq)OK&g502NXsbarjEhp1qOh3Fug -YSH+DC>tdj7`Q@6x@T?uHP2yz64H#KLI>(x3*$;2MCewiwN3S8#L<)>#qOPtTtTJ9tf^?$0p{fj2iU# --{TCPJO_-|h5Nu%x3053ujdwzXNn(@+hUYXxRk-86q@&4Xq~uNub1l?d?{<lYo(zwr|+4%Ej(o50ZQc -s-%3%?o~HdG82JTIO9KQH0000808trnOxYfprW6PO0D>L>02lxO0B~t=FJo_QZDDR?b1!6XcW!KNVPr -0Fd9@i`v!k~4-M>P0Cu7Liq-pcyx!jp{w`ntzNp`wvU+&ytWRPv`0wR*Qcge5MIg$VYvK?m|9<V{@`& -;5DMMbjg*y>iYEF-*Xgw%u{lqg%xGW)z*x%Z_wop^ofAB9@2j!2>5O~O9qtkGQ5s;BZsR28j@e@ZFj2 -*>M!ed<BJ6|$oGji|L0<p?9$&ppI{*v~DOtYWo(&-4g#po-;|K>*aT9>9B$yefnha-`I1UJf#|TA?Kh -F1Msc;Y$7s%NnZBGlb;O@^WDP4}5qF%yTVdHwQiPlBrH<Rt<8TS^m+G&BSZX<Z87-+cHVg-pI*`>F>? -ED9dVEfqP;A%S);hc?(#jpoP;jTB;uJR|Ky0dToAt1k%v_BRw%iP{#erEbhp=?%j7JLR$)b1}Th_n2J -fOKolZJ@<cT(=SR+@N*wb4-n=J`6dyo&(#mpp|Gmg*Ijj`UI-Jb_garDP(2OY2%A64@^D}=zFaw9~qo -oo=wGA3ik-{m1q8U@KJpn;8H1~Q-Ue7!~BmWm(Fhh#ggi+OzSK1LRoGKlm04hob&VS)j)J9EMKCpokE -0T#h(I4QdO~1aeqP7Z53-5a{LcRd@C-UTi?wLFUP5DTkoL_dv^1A^(Ns<ecc5*_@s{MNiJ?$9C^^z;! -iH|oC%87R|l&|4DIHw}*uLfYWlR;1|1g-4Qq>D&RoN)_wgi^(8uCpvstUPYXmsFk<{CxTG)y2Cd)<Dw -CQe;aIB~AtkKJIG3g#wX*&<Z3$_@sYcLL{^>e?Y%zEGtP4H!Ud#k3@0&Td`QdH9eH<4iw+_cc7WFh4t -+YoLXcBYwqE4D#d}8Zs8t8V0GX%gu)#-qAt7pv6Rg3fNtbHz5y-rlF|BpcV=g*&dgZsD(0|=*Jf92ws -7ASOzH6-SOj5r;OyW_+pIR*2`z+4hq{&-+zCL%G<~5GU=~Y|p|mY^Dj*G7i9K|(d}d{nM(brOf@Bfo0 -pK5#bv)wSXM$Z*QhkJ$9aQMT;-Jh$WUJ8+qGmy5euUT?x&*Wl#$c9!xdciahkPclT%XB9PyI0=>j@Qm -t>0QU3cC*UU(&-9aWv1et!r#{c8K^aBX#-=-hYAi4a;Fu8IUXtG8*g})c?n9?+lBu#UNyugrtN!aWX& -;vwy(K-yLCk8yhTCe=uWhY#Ag6;VMl>c2k;1z2Yzj4m`MmCJ)m9`8%oT2UrM_>!Bl-oD#D6>n0{S%pN -dM3=*NMVf2Log_dQQisdZXi?VS*wd3i?Cj_OKh!>>er1;x6P7E_l`LcXYK*2y;nkHn*N-&_Vf(!w5gU -}xyP!sm#Vfy^ICDw>dgQfIChxZ)+2Z`ZKyW!2|Y9RJ8cQd|cq75NP{;L>B)NL@9pj_k^f_sX;qo-OxA -IP1RKF9g=z=IxNz8~BiLiwY83p`-}J@C<sUDIXXd=38j-Ic<35YpH5<ay>_3^sL;*j<=NCt8pi^1f!a -67)Nfc|Ki;ud&%}32xfvbsddVyS-bGfIfq))~T2LZ}t!UEbI*`75&IuJY**++GZLRlPRdixe?|Js#%d -)f(B*kW;19vR4OKel6dP0ui>tz{Qt7`gpKb(>tj3~cNoxW-R8on0Tzahg15cs)#H#yFt7n>4W0%+rsO -BtGS7m?0e0Fg_Y?J}YiRAKFxvBg1_{7!5y5mCWhuDQnS|t&JU2E_Oal<DyXa{`D9m~rhUtSaxC&VjUY -LdW0P{Th&Q9|gPWB+><dg`!qoWwNb2@t3?7{T=&9gUWgVlq|n!^nz!O;-Ra!Zl?DfJmn4GUX2sIvZ1R -<uYc$VWunSt6;CiBzr9rpr3syIn0Dgk8h3vrNvlLy4e;_#~i6>>;7pKDNm{s0S%NjEezs=6uYnRo?#8 -6^ME92-TcP#W8h%i#={$u97LHm&4w!3-=V@RM;foIRJ!-!ry2H5id~vJqh4XPv@c#l*fNO*SiI2x{0Y -BncXWZrqC=sUQDPW?%gz0j#!0ce{$fk-6kiqi_6$?RMWoNEC3v<)cr02ddH;K)6#%Wt3*0`ULt^_(~J -3x*VO;%trWLW;Xk?a2v$OLg6Sg6ifHU0b{~zgwm86ur-Zy}o74Pkd~FgBDbCMZqXlTZU+88}WRq7aar -3ow9bW67U{DzL(q!|6+Muu;vI|-d4hrKUv|N-01t@}T8MD8e%!V*dSS3(SOjbAjoFN7ejD_bNAOjT;k -CR{&F`C;=C6g6bwmq0)h=v$;78eOQ>CGt1KC!&DC5JaIQ`$mo2@W(B#e>xg11*q3$c-Yqf0JWLPsw^2 -On5CEvjmGTC6VX&dH=)9$U8l$j}}oCmdd|utfqe8nwl_>*sm5eyu&)zd8gks!of9AOmB$iYGyjCp<!U -Z?xmq(7)G0qJ1Gu3S3zO+V^H+!oHLcqrY3*wf=;*Up5dfKiNobc-o3~wQCyI2deSyvPGA3qptJL(Xj) -{L%{&}-=nN<<pE;MlmK)(k+hDHR^3o#cfgd!&%O;QJFXLs1bGwn6shEH{ecPyInZ*lclUCL@^9GM$v8 --n16HjDS4#+Zow!tq7WRrXlyq*oZ9t)#A?x2bJ@K`U{sy5HTgvS<kblFIJLGO7PB{+@_2w~-2pW*dUg -u@1}&3jJ<UqR?NTXIDvyaFcrGkIe=YujA%<h%)A^4!!^2DELQhdjpC#dG-8uTV<^1QY-O00;n48F5U* -_VZxb0{{RM3jhEX0001RX>c!NZ*6U1Ze(*WW^!d^dSxzfd8Jm{j@vd6eb-kI1_H?&S?TivdfH@*q6Jd -4P4kcj1TBqZ))dK-)OxpH-ytbk7YishF|aFft~_UkLp4Tqgwm#Wy#Y!I@3b<Gu%lI?cR=GhNd~!nvDb -Iab<%iud?_l`Y34?E>uSM|RG(WrnH-q~H0zkGN4tl(oNSZ^!yH%A7L5V;7e>ptnhY-|05K{*`^5vRPL -L$Y`wxH8Uw{7bcT$opMbk7VsRh?-r<AaMRdeeMKO#K83X#%1dRBs2OCCd}VQ1O!+}|ezf4ki-JU{kM_ -lQ<n$Ao~IXjYwB3l>Ghz&|}V(1CQ8G|F_$6-jWrS}_Ae;4aV;9T=&Qngd1yX}RN1KrF&Sr7|^`Vv$<1 -4iH)z2}y&jw-^<LqYWW%v{5bjqIBT$>!`3jqA@St|J4v;Dxq46>;dbnCwK?X?*837Y>NVG4#w<qax2? -M_%$@xYFu(hX=Xt*Ik{t|wfML@Uj~ZfHn9z|MImzH9rnf5f9{z~o@i85T}=_WEm$31kb>-L;eYAD_{t -v+Gn{F@FsZ@1GM)3VGGLXDTc%8FkoAps!+PP$FJG7P4jg-8rc4_yVC8cHq08MT3&fouR^FGwFIsGgbx -|+?2`32`yG5Yz+xe3gEU~{OX+egAC0n9G;S2J|iCYrc!Tyuv2%B+wi@nhy7_Kp+;~m%n3;J5Zn@D)WW -qlA_p4W6nzP*}mslSiyPrv=LMYfmw?j}C1r)E3?Ig-Y!6S;69JTC|fNpLC@BfTXl9XL&2&x?q>2vsq$ -Ny(OGWWzdzL))2t-Af}Qk4#wDLjF?|2hS5Xu4e+|6Jo>pePWihLLHgFBo$bsqE<vIH?++r`sg5D4!6V -PTPQhT%b86sHWc4a#YZV#Ms%|oI3huseA)vJX80yF7-qZI!+4{&>i>ll_x(QB#h$tLeTj2pKEcBb383 -z`N=DvT{3E{kioX??*?4R2*TYmZgYXM~IT<%#q^(iC&VI<3EX>Bd>E$rthbt&2eqPUJe7sd?rKB@T;9 -cTxbv%dgTs#KVL)2gxm+gHfd`$F*Tbow?&PU(r10Wmn6+uO7Zt_*CSqVLLWr#fcV43v1iJh<KA0)nD_ -X|dSn4;G;b1>03u{gM$FP;EQSM$m(n`AcF%Q4w}*e|O;&B&|qBwCt=*+CUH_|-IsmR7#KmquQa-(aK$ -T6n%14WenAQNQ%#_!)`3)K{-jKs!~hj^nJP<?Q`-Bc=a0XBbB~q6gpik?rj6ZbAEgRk8SKg6E^S7(CZ -m@P13uza*aU{{T=+0|XQR000O8Q5kVe_=)VKy#fFLJq7>(6aWAKaA|NaV{dJ3VQyq|FKA(NXfAMheN@ -|S)G!cz&sSKLR!OR?#q)|FRj5!TM5S%T3n0szOcK+?Hoj2$_l%v}W-G|UZahA7GIQqA7&Q>a8t=RT#) -ufSGLG<*RlRq>#&eQP_Kw@G7pM8ytF{%gosag#CP@<*wb1m$EmUe4xU6T|_v3NJSjU~WtWq`D8FYI*- -XB+pccNeJ4Dgy&otIDc0zpG)E6InOulL7KkGJgZ=Had&50A(DFCXLK_901<5I7i8&Kb}a+~;V^7?XTJ -DRP8WJ-3$JA@dY@HvQ*^gy3^^brt{7s!=V%qd-J8_|~h6_eAsRiMM!Ts!sd{nne5~Mhc|jlAM5e3pIH -bt|R+>bQcoc4gB)LzyQ)&(uf|2Q>0dC*T5Y=^$?kaL<xILKiLEnQo!uez?Vjgw;>EP?X*!X`KGiJO4= -XfZ6JR~D5WFNdd$$g1n8XBBrT?Ok&Z>5=u|_4T_mJ%jAa)3rXbhcv=;xapPnbRMs|%FpD9|90MF^-ee -SoqA%<2%%`j|Bc^zLc{%k>nC*AY3z~4RZTV+tuAuTol>@ruT|GKR@B`UDxrdhTSUWKogsddW0EAoc>- -j&<d+dw+#b(v!I$39sC3AM#GI1nWv$h@;D*=;<>{4hECQwf=ELd-98(%e`u6k7v~n}lMmQC??nimjCS -T0Z0DRJo}&3KA-DRy)xUsa&)kHo={LRU084i`|ytKEMgD!I*r5H-OtlPJ_POtZI~V2z0S6s74v=LN`v -yt4PMV#?%{?r8|50F2|WF@f}4iUTZo%fwEXbC<qH~Of@WwM|N?Yhvg7^{=cYYNgT(7-CX!uwAhK`o(P -_Fp4+$vlm<C*rRJ38gxh)G)@&nBIWJ@?;W=AByiqHz%OKa;^2{c_d@EmIqh8nCK^B1{(^Ri`+rghP`Y -ccW0#Hi>1QY-O00;n48F5S=7SNrl0RRBj0{{RN0001RX>c!NZ*6U1Ze(*WXk~10E^v8mQcH{5Fc7}$R -}3ye4y0z!rRgOsY|o*mun5H-+v-{mB$=%L{mQcCL}7I?@_aANOl!3S#@f-378wH}jkX^6)#+jM$d)@H -?Tj<RR9Eh>)>3lSB=Bju9^m}%bb39X?_m6_(RiVid&0h2t1Tg<9=LPxhJ#rP<@(+KA`nhd6z5*wpbrR -WwT0E%g+c@<E)kAEX8?_VM#sDPS3&^njMW|dUa5al!HwZ=r<wh|M@2~lHrRq4Rq1eO51^L^9e~@;tug -1bJv!0Tlhd6wqV@;q&@(5b7`SDrL^c&~r@Q2QegF-kF&u@P@I5FUtwA{G19`v(u2XboOeo<Qs|>deL( -p=cY1Oh}Yr|%R%gg($?|V!c;fA0v2&P_a^ktIpS2g$<hnJ_c81_eP3$WEhdpA|ugHU-pa+Pkxunos=T -T~{UJ;^xIb%AlAqxw+#w#h@Wa|MOnX8)eCLau0*`>%QxHwMEhQpu+)!lXx#$d%tTBlRhV<-%dM-X(>f -K&$^+s4}ST9|$SrG4IA@3;Qs*6|v0JR>lhD**u@}LGY>nUr<W}1QY-O00;n48F5TYC59HX4*&oJL;wI -60001RX>c!NZ*6U1Ze(*WX>N0LVQg$JaCzk%YmcKi@_T-TFRKyBY{Kk)ZEaSXm+o3xty<GFHy`>&$N? -wuHo+{0bmz<c_N(#(3>Xr6A3EvKYC7PmqF$~lm(A`9aU@Z+tIDciQAGGL7ez_vR*JMLS)}i0GxIzZ`# -sP0_EzMqprt74due}_?3nL(%Iv*7R3%UC-4iV`AR}jGalV-mxa`1zv2@0sW0sfXRz3Sz6r#{TYLslqF -Ct^J*$!FHc^($*H;ey?{Z{dU9a&c1v$6r%QpsX*Jkl)jfWFrw4R|VIT5^#|3w+{5S<#ebrzjKAJ{4P< -u1LaViDJn}#s{F(5YQ616c$Q?+f0@;O%-t^*ov5!o4dP$ow%svyNajD2VUsMvt>=%(u<FY&~Iqos(7& -gER$%`gag$*D<iI7&64QE3JHiEyl{)JwAl9jEC%zQyPyfnVMIyMsPiaJEV<3@c>ebvzG?$^@z5jWS%P -!aVjNif80EA)MB*u9MT4P@ZNR?b&3g*aEB#yX2jH_Ax+E*WD~xZ3AnecT*&>QEdIYat0$7|<DXspE&K -G?jSZYt3&*!eaNKWHNx@VFgdp9#RwkCJyyIZnApAzK(c;H#Wo|#;dN&+LKXs8pJvzYHVXg)N^|9XE<@ -<RLy8YWed*3W+i-%IO}#F&7y4uB|t{!x^SNKq9rBeaMQ{Dfc%4qb(&QV?0?s6y}yEemp{lstF%1HsTV -^A*f79v|@aC!R1xiDraRd4@@QCZ#ZvoCyU`kuvZzm>eQgQo`_-k=oP3mM+m2V5Yzf2b#}Hf?naVg(Bn -?ynIg{jCX${KYI1}6L~O3Su3@#Yxpn>2PmzJ7BMaKO9(xz8Sr(ArE9^TE+V8Y)1uRl;rwVUinQO<z^E -sMAS-a#;*1*YdTD5Mo3I_kcAoJviWZWkyA^p&i@k(DuOFX`t7}>i$QSL&u_B1E3~K@|>a0eEI1~ZP68 -J#)(BAhULYk-_Al;&gUSSOXlm+ErkHvC%Ef!07Nw+DRfZ|$y0-6eo7)B9i6saD>D_EDo3jSS}pf(1-T -cZh+<tETWNV_w9WF<Y(ViWX-z^1fH%MIqh_Q-*y`KIR!FdJc3{s@GA3Q5pH(0sl-TbiUia7msxU}vI) -@RFw#0t<VFG^e5lhKM&ifq@t4ddZnLeUXf;*HykRXu>cq^r$%uYWBS3o_Kj68G9loX`yf1!D;45v^f$ -;GpV4RyR}ku_lZt^Uej5yKh$`O`3FPRXFe5I8H|aY8_OZ{99LxC*Bu7<JuMP2nnawZ11$pyNudBDXD3 -R}m#b@a>dXsS#8YR)7p-FB6<)pi$7qb?Hh~0tu&6AmE`av^FUH-_|81ghR0)a%WuZ60s|eVLrx-%Ker -Mb*B%cA}0O3&S8ng(d4}&z3#gLKB4QMx0lzoJZKx>R~CEK4N;epCu>cs0VxiKY1gFxB~0|sj8x@de5J -Z5t95Qr>2ula7BF_thjUo`wTpXxubk`+gufl?0QsnHV1tC&IU$%Ck%!rU5#f*QOUo2%E%q0(vTnikB^ -0-Lry+Z#9zOx0v)m$)hli2AAH^fsOl3017z;R}W=*s2)dZ3tI0Vw`IsmjlAIwTM!+CBboA*eDNzP%Kp -J^^ww?p4I!W<>|$Kwi8fOt_x<1HJ_U)m}m&*$~pTLMX!BiMQU=SmBrWz!1zup2^HwmkPU5BzAnW&0pA -aUX>#A{2*vjqFukt5#VfuBiiUu$l>b&yQ3h<Bvle?%s{<#HNdU`>QaNGTaA_PyM)|os0L1n653F}#9? -FZc-hHQL*^Epnw)D!{MVuBLWiOtYh$vZvgOTLr%aY677FH&U+$lX`G%u{->c!fbz|<gTSeN<o@*E1G5 -&({nT+TU%B>_Z$|GZI6hxE+~S9Y)7-raq8`}yswf1B69e?CfIVZ|bzWJnhGjJa$jBCaqv=p{OGgMx=& -?mvEt-o3s5=%t2Wy9(ui3I><!%lSn8v;E$yek!B>&_uo0bAm!N*yBn>1<D;L6DDoSADLS7g0~-)Mtu? -{0v1P*(xJ@N5)k->Waw5@rCU|K#wGG=^`g*AYVq~$r(bS=`Ns`;$6^X@psQy?RzP|wU;!<Wr$8F6><f -JKuzkVf73nX^$q^Rb$mEtCC@cq2{%5FeN=TrSEmR2MUyI;?>cjkD)og7!h}{LarEZB}@9V_$EaF&=Lf -w!-q$bFK-)MGLg;Ryi3%29WUUBu%pChoIbovdL+9ABBe7hoBSm`v)qEh7R6jYNA%tgJ*!c?agPRS(U= -j(MWjybr`+&k&!&7_-q)HC-ZTlqf&nos`s8jIv-<GEnv{2V(}Cd!bBtHjvRR8EmYbNfM;TJi5?+DTuS -W>nvDT7G>Y8u$|}&J%F3)|`$7jy#R8IAwH7g<(QobfEIU+DTt^<ZOS*K{?V#W++AbLR5L%by~FuQcy5 -$Cs5t0oEDJ4y{2}?v7li^*?!><D~G$~6f~=jWz(fAs?0R#4Bsn)-8QF1*V301>B+cEWc<gN)xa!$c)H -hai!<HV(gjz8)@XibSqXLazG-RC?%;&@W6=v>b5#q#I!{8@g38@)7(i`{5m5D*woG-fPw<TE^|RiE^5 -xsP%Gr?X_n5Jd6>i2rj%UwtT1m_&s!x<+KMe|nLNAIS^{&+GJoF%dXcD?r&oTL*Xv%TXV3Ri8@|2gV> -3yUbwyBXx4>8`3`vTU_GVH`0yu5oPZLk3gq^Wp{*t5!&=~PQ7?6t+7Vib?8uAM$qDv`&qoHva;y*AAS -RGU}^gDy%Di*$tw&V-L%Dl*)@L8fR17TxV2+5ZX3Lzn-33WR^BE79vM<mF2A&;z~xRZ6TfDCJaF?PV% -#@c-`==r)X}DNk+sno_#yPhV7^N6>+Ad#9F7Pg;6XzrgO7mj~)qThq?NmZoh^yjW@OU8i}`G)6WAYfr -C&>wTIVFR6MMXb323pzsgrR^s1955_T})9${2Z6F#+I&Ba{^*2ax$^Y=pCseC%(H6{sauzc;J>?ga!{ -XFEWzhFAWzY9Cvjs5}6Rhs1D6eW(Q@H+AT{wQs{mX2k7Hu$vu<1%#$+13I(MMZ$rSqM+SS*JG?47K*A -Z5-9?7@J;*K!(8)#jCMn5^rj!+@B$JVR<HE;()`sF?*7O2d12QPQ?Agfz#d_rh{@EwHxE#_bH^8Jwuu -W3&fn92HwK4Um8G49!Cqw*NMJ1}Ho}Cir{dpX4o^p~=+%_55UEan#nL^r0vh20M9;XwkXEO<oW7pwC? -~sXi+*YOh~!eL~R2PLpXnH7&zcv++9MYq7{mo>lC3c+^20*(M<0ca7yZO}hi@#H`MM4p}vts=w9R$1E -%))WEpTvnvY>8|K-~ti|pQmr;d1KVZ<!#EbNxrLwXl+5(%n%~Dq4QIZ8Ju{NY#kRr$ZK;I^$S5z^cGX -grzp`)6Z8q#N~>?4dKw2aU?g-Cne*~7HH*gN{ve~HKO^l7Ki)C@yT2kbY!=-`zMP<Rf$2WumY$<3f~L -}b8MYbkQuv%8C?Tiz%H@`;Nlr8U_UB!ekI;&y8iYRMJN95)S>MWt?yp(6B#mbd6Iglt2Q-0omjvAEJF -3ZRbBepn@9h5dKcI(?$qASr}|mEQWFYHjJOUGVB#|H2IPBGm^MT`0wG`><WV9PxAIUfTCJ?nF>CZlEZ -_%V{*jWG#Wa_TfptZ`A}h7q~Ok(56!z`GMWyxW;fF`q9jeXN_U*M}g~2@h(<9;78X@kQzzf`a!$dax; -`hN73EQ?=A&*Y?Mf6+pkNfGwdhT+2-9ifzN$Dpmn!^ZB*_)^&>XPY12to1OBEH!^Zse1LbGa?X5X6_X -A3lBE@x8qc-y(I*K7Tb5h90`Rxa8cRuUav>*F|P4AIzJBqwQ{-Vy@_D|&wknT7-4M?4O>y)d{1BQ5t^ -P=R}a16OopE7H45rWJv`?4RnH1Du<&H6;^^W>hlEqs9m6C<*rPaEr-(P(>3lD5}(xNo~oAiQNkiAOuo -+fw#S)Ml8}o0ck$;#uioDmuaHUZ$o6a;n3&>d3aqzv>W)IW;XusG+!>Bf7q;YZzEyVD%8GO_GInj(*m -|3z%VJN@;PuWjj3oVAo!QXir;Pk(s04ey1MbemsL3PalQR>CRYx^YCpPx?L=fg8Oxd*LTD@90F0gO3N -EqGVCbFC78Cf>Gq7!Xclei)Hl+S_~F7EJid%)0&#nGOz*l5S<tE!)>qXIpl43wW#;wezL$G-oy{;kZs -X26XNpC}VR0+E3C4C~d>qHDzdbFPG1CtY<wB~CLX`4t)O?PzQJ-?S&!T+=@fl|1D0i4_r(|DysRiRz` -PW{5mG1C*Nq)v_c*=nvs*~)Z04kFrOem`u_kHjH&G}M^XRk+wWvKp!Dx_tJDlQ?k1(;=n<uIRMxFa&^ -bPc=LPJJQr8@8lSs^Ph3=>a(aR0)0*b}+}b2zI|VGOpWuKCWbYS;kfa6XPP0VO7=~@A^z%mQ!J(^1k1 -YV2!Pn{&!YmxaL#0kM?`9%Wur792ZylhHd)b&4?R04ZVN_;je;c3Pq0KIC>iA*7PcPwiAos-kBcGdtb -?5)!e?Mp0Ej~EyTm6xqI2q+Y@Mbt~U$}lKVEQ&W6DC`n>2SZG}5ZQX0R4XT17s8-MkFrs(Is*N5};j_ -sw|s=W~?&v2{WPyRddUQw;`YpM~;#PyYk0<UsY_WJkshT7-NCz#$ob_*8dz^)kfv9_W-kQ^`}#HpGe4 -~*h(=VL(So%OuwP;$R`*fOFw{qV${ZbsMrvlbf0Qy77`DodSNTEm7P)5z+6`ML<eseHx4@*yyoK|56$ -nO;IqV+I`t(H`xM0EcB?C)JVHMoSmt67h!rrE4T5(BC$$zOH<?L$K2z2UA<h5R6>pK569_>I2&hSw<l -AzhOP#W%P@9oqZS;O#9BeBEyNLud5FEkri`ix|-J9Rbg?oCGK9q=gu^MkXU~er8y4Cz4^-3^O-@HT<b -G8)fBTIyI~LsgYgm&ua15uhGh4$dqiUjZuYxUo;^-54qktPveoS2@)}iBf-LJ33-xvxE=-S52I_<K_B -+EXs39#06(vM?X%C#Bf*k8z$ydT8$d~*t+ZuzwG*j#UWkXmT%Yv~U?jY)TwT73#4ks$RPt@Pq)r=^NL -Bg$oWul#lQo}~M#u#l$J4)$pqgpWCpX?SBv)K#}dk!w)oiD7N)1Nvc4kgJh&dhoJgNAcb@QT!rY!>}C -`!7&S0|XQR000O8Q5kVe4@<{5zY72WX)FK$6aWAKaA|NaV{dJ3VQyq|FKlUZbS`jt<yw1>+qe<`-=Bh -Tu#lA6+T^YmpbNM_oA%lOLGRE8EsDiLM@y8KSy@y`Y1h8C-@P+@NTeitAD1f%)CjURH8Y$i=SNbd6nm -0oW!H9+Wf|f7M#z@XtrAt&vdsKmEbRDaC2IG*61yF*ckbr{l{NfSi&h@576d*e%H}PTtq_%RqJQK~R* -8DYRJ&k@oHZ@^pr8C+N+Hj2a*vfz6-ZiWmWDTJcF*cUNXMl3!F#x+isfRzr*+{7-kYBTjZun=T8&7wf -&(3|3wCfM-_!h#?%20D=+Sg7AM}s4Z9CRxyjCr(Dpq6#SFPmRPS3X@_%q`wV+C*NwqnUhR9dh`vYaBh -6Z>bj7x%3AP=C*xw{QMt!Z7gV`$B}~?CBlL%viRQqH9(}+hTq!78qD2$;L%E1(iSQu{g_Wx`#YT7K=q -*QKiU7(AfGXwto{7#N~3S{~`tHEhdfel)_2#sw-du;>=a)LbF(JDncbA74QQeuL&hN#BU9<Sgm-=?-@ -~G5IhtT+@1#0qM~3!gzS+X=@iI>AxA;TMI*(ITwDL#xCg2OJLD0$Pbi;8M$v+mP(8fnZI;D~RppAjrg -8_yy?%Z7U>#vZHsC(bSu29%N!oM!e2bnBqKBbUpbOHc?)Q`;rA1+*8ut(J6RkzGg8$c|YYPhAidMmMn -j_C9Qmud`pp_jP5rC1jtJ=-Cv{Ed5bjzw{W1Qrq_dbe}=jhlO9lNF#DCXzU(Mf-yj?C!jvi0ZD(Mcze -o1a+@3O!HB$|zZhoK|02!#Mg-nnJwivh8Ta>U+}O(w5x9dc3Q|mR2xJ&J?a?g4Ckb<x8SKmQ~fzSI6~ -SeI>*6gZV)TobkcBQ%p{5Q|%_2dGOQY_FY{aG5?#c?Je*Y4R9DvyM`r;VKAQ)%{46dUp$J-4|?Ur6k} -`2Dh8`6!IoICdsc~N&+3-kGpTS@Ov!JLPUMO#X9Br|HbVsZpoBi6h%))x3s?rRe3td4kbBymbHHqrG3 -T;b-uzZ@NKeS*itT8A#A3+->g;QUUrWi@kGjke>G(<5dvEy{a9G|#+A|k(GZUeE03%n#2qv-hS+XK_f -?4k^&6Lo=G`LEaFZLA_8wB$o9hWaz;?Zp&Av+<#n64M7KErk4V~55v2VerYi`6-YC!(A+b*9ee%{6eu -_Pq&Qi9NJp+GyHP2^Ho^@J3U_3$hJGyjgjZB+p@Up-4Ogu<dwNWY(yx)F9Bp0gEl%be*ge>a4IdJbW- -<5<=cfhCPZpFA*b<&<0vUBRM{71-PFpv$|SDo6bs;44{1-0@N^fP<&SL`c7@Ew&^ewromvu#<M5PwW< -;i8T_BY>S7m{K`@Mk<dBRA@3LE=+JP(>4H>`(*k7_f;f^ESPZ5M-YzQ{??<5T|uClAgQACjDg^ic)QE -KdF2iUdLw7Lo=b9<u{zr>TuSgzNad+oS&JKZu?6NmSqW^jRi;8g_=AgCJiV{4ff+7g#0v!hGN?>e0<` -7NzYSJDfYWQ~A!Bmm@syIKJ&6l7=%l{_a;Z?dFTiq=QM$`TepzjWPab}JH+`Bgr49wyCCb0GZxd?(IW -Y~A!SC(g(Nzy7zJ*wxT@dC6JvG8Yc~|91}bU;}}*^-rQ^&-39YFv_-l2MV;W)B|txTkQb@1<1%hGZz0 -{bg<pk(2+PGw22M4_?H!vkQi_S%*bo(7c){$@xlB@(MfYcAnKBIy2YSQ*XV|uIbn)v9Fd?Q1y>s7=`L -jb@<oHu?<X<i+@RaQg<+ADgOmJInwi*qXAeP!eXy21Y&p@}h-4tKp`mWUr3FCOLAM_FY|fqGgfr`1Sc -cfRZ%=wCbO7!SLLwXqY5F6QkkAd!!>Fk@L&te0Y2<@;Im&oAsIfu@n8Yei^n6U_L_5kk(Q``sc=U1UK -K0odG>3uiJ!Zq4hr~R|hj1Y9j==>}@<C4vyskr_jd-oZqBRFgMj1TnbgHPVf(h^#ur7r<7X|Arl$2T? -yXPXmHlrHJ7H+g>ya{dU!}7mv(`NG=qk?RB+%V{H*&REYglgkKA>S@1Ak0O_3WcD(XlKPubPD5If;Wb -Ov>kR##Yr;uFRIYo?KCU?_2x$Jz>t=Vs}-+%1-w)}<NU{cF(7;JhC3Wh`_UWni@rhuYe||74D(fN2(C -seBOWNH1>1JJIQp=wg~XF!O$i<*7kWRwiqg-5*YPkzGRl=e*PDeO&;b3L$4`%{OG1Df*`Bo&LQCUlEH -!NpZIpzZbF-tPU|`yoG%?PDIqT*@9>|LmvrT)fx3&S$xHa`>H>Gxe6T2|u#fcpY)wY|=O~5_c(w^PS& -Pdb86=N&n@qnlP(_(|4_SoS0d{^Jq;-Q|NFXCPT8hXL8CNcU}BfYZ?AI3TWP(jH=3S<EmnYVkLYJ#6v -7UvLe&pS&vQR}+@r41i`;W2AKJS%Vdu`2g`sa+^juDl)j&Ek};;iU8C0%C-2*|EvPEv_?z4S0BSh(n3 -f^qu`cI5sw919OJgJ=tuea4!M`eX|&;l8)PjXZ45@0a|Mv_HfHsHSYtPfSO{Oeyma_QpNJAqQ95&Kd; -Cq1k~`a;IcguK$ZFcOxX<+UbK|@doBt__8n|1a)@Zn<a805Yoa4Zon<O{#Xwz*Bm9|=9yzND%`h|`3# --g_!}c1a2+vH$*PQW)1V6SFMi+|27qHA+s3am6WV(bJP+%@g^!4O4!!(Jt_{38e_3_rkeVYa}RM03l) -g_oaIpHYVq38YO&9f#SH6gY~a($t0rXKOZt&M_~H#+Z~rp9Rkmj<(EWG8U+<0!+2@cI%rw4-MYMsZcB -=zd#Jt>M))_z=hk=v1@UM<=%W04)1E0KF$Xf%Bj<ugEQ<rcD}Vl#yBH$8hbLeMc|CpX9`TYplAxvlw; -rCpA$E!Vnn7%L}#HT&U%0rl3Yi{3NyX1<EYu)6;qGL&_Q7jcO0qMw8GlF!a%#@SKX%QgU^wD{9(<PA~ -fB#X5P96jh%jcA4-~WtjFAF&7uQN!V;Hxx`|5V5DZOz~dW4O`1Y+ynHI{!IXY$B0%vKt94Q)u%~=8Ee -Lx{f)^t$X@?5G+huq%Qsa9KI1ko3toI#y(Fk35YP)L>C_sRXghIW*R*$wqrcYGJo6za?c14zCX*Lmi+ -QfG8I9!ov9g)}MU^Pn;PZ!Lods^v~8bqGXWuV0uVlZ;Oc`)WyyI15}{W4Cu7ea!wYw`!){;}J-r?+j} -sH@A%9borvo91GF*&G{s+3@C)E7dV|`SrVR-oDb`@vaAUk?XJCzWdeJUw!lLms$u_I^^gZJu&*m*yH? -u{pJSDML32;heR8BKod2?!r3h$FYKWA_KFjN{18kO0bYr7aGU0Wu^idFSF&Qwv_gT2MVkO$@MN^#iJh -De>Y=G9zJSvQ@7m0lR-ZeRonR{Dh?5Yr;z_NpJ`&BnX)t`AqN~3fM}1S;;C>~xN+r$~-IWcAO(L5EbD -iOCH)(?IlJ3306L(Xu?#2%j9CU<2RRVT}x41R#^nt5p*&ZKRBEnapWLM*<YkznJejTrdHWhzUpnHR*L -zq+HAMlc2-!={hs6XiUvCLe&oJ=#svu~Q$OM4FqZD#pb(@*fLfi?K;69A2+Nsn+jJukzZ{-EFb`~sb5 -ZC2L+ZTi`dkx9n0xR5VDT2$!Hf%Sn5bVkP+EW0Hvun`pagOGO^Fk#O4qyD`s?Z1^<*YxWHNa4vCp><p -f5qS+63DpATp$el8t%oe%O>mleIxJSAvsQ};HAtR9>+oTCh&%B*vWzkQSfF*cCrLLMOM~SZRG;4hr^R -;yS6t0x%6Sxli#*W&GtfOkzeh6&G(@bC^(0U#en?w(Xft$H96+jp=ihT^bv|^c)^!vHEV@BFJ)P)WSO -YmOm|D=>E?_n?C?fGAqu*sIx_zT;qyG<3O9KQH0000808trnOs+zN+$IJ90G1H|02TlM0B~t=FJo_QZ -DDR?b1!pcVRB<=E^v9RS8Z?GHW2>qUqQ4mB&D*@VcVBrF3_bJRv=A-Il%^ahQLU)%|;Scl8WsW{qMV@ -Nb1ci`e6<b%jDg2ch4Q~sI3$wNz-kk8_Cj?@Uj+C6Z)t`(P);ozh^VMUWna}S3CDpos@gj?5Gct*0b3 -bA!}YIk5sWtlqIclhkMojjLGWZ>gsy6>V!eCrrODUlsS_uf5$W3iR9u?6@q%OJ6``)7P8LnC9Rb4)61 -43XNB^Tr@QyvUZZ)pwPQNfOqRT&MXLBeY$TW1kexiQa#raSRy#p<%vi0tsMILVYbk~7<dmkmQE3LgdC -A+4>4&%XSHEAc(%(Kl+`j9i(`Q!YLMAoMo+!GIJTs}lic_trRE$v7KBRVc0^r4;cBy1aG%{mqYDV!Ru -=d<}b~N0kS-~OT*=&YHFiDoK2oj*~#;k>DTG0~9Cjzmoph}SyqcYoD8bbRWUCs!6Uc7kGZj&u|hq)nb -j9~k)7Z4Mo5!h1==*bhwM5QSQdVl%cFnM~D0EB@uf=d!8gBO^!MgbBmIvGOdwG=zD7Hy6;4#f#LD}ZD -DGCrYm&aWhx8PS|=;k59I>og4&E4DGYpmL|+>*DEP<7+W%;AOx<Oi&?8ynbJ^Qv{hLEAte*RSC__1Gp -V}3H$^L9>nl}f#rA%;=v|VmtF?vc1ot{GnLEW;g6e%(v~)bUSjA;eX4od$YLn6XGOgXeuYy_K%a;$@T -B)pk9RFg<UN`sp@kxI`w#`uY#5&@SeZaZnbbDGbSFhqhp*!y1yM)5Y%0sS&16iF!5-^;ODdtw>gB+7N -jZ4kKb2wdfh&avTe8m$hh~FnO$oJ5!nT}<DU&D(y6l)0C=|5d7Y$o`t`%$;-&^(22zzHc5G$&&YeA8f -MmO{*J+gdbI`CZYLFZOftRF2jVCX8jXmr9A)%p}h!@ws9lYSRQ>(`skWGy+gH|P_PI2EEl@d#u&{2BH -A@j;B}XE0tW-}FbzlNRVRZi#G@KBBXibu2q9R|wDUCT7h`95}>oQj<P5yvS3<6!yx{fngW5Ya{;LXaV -f$ya~PO*r`VYb>ssy2dy+&F$ul;PKx8H58zD=A#AlEk}Iq)0rtJ%(oquF4(3+A!jh0dbS?)72VEN39T -lLdJ>Q|t_x+xcf-6nhX@S9T1xU0gPK35w&<5<}Q3?5zkpqPj<o66r*WED>+JW{oiP8d(Ag>Buu>=f*9 -q9V757C2$!5O<!X+hvXkOLzbt)TI<WZ=HHyX;>m!j>0o?+`MekYT~vnF5RJmgh~ctGh{Ib{*}VfSb@( -!2S$+=L=gD8o)jUru~3<Vkb2|yl!)i8XExpGT6qCs|5Utr@LKY*rzixE(ajAw$GcP*jN7x?o{ksKCU~ -oO+xD$t`?zP>9sZdyhJ86rkR@r17W*83@%4u3}sdqG-IB0yhf@F%4C4Uw;kzA2jcER;eUHKqWWAYKE2 -r2+vhe0dz7#oy@lkN77c?GM)q`_Yoz9ul)=rqtZXmEhCXSqxM=;e6Kz<bt$n{g21P~@Vp!5cktHeVF< -cKgC|DKtsy-sG+!9{(!j8O{tb+vztQS9QhD~O4sQjJ*`>ACQroM&-!t%6tKG$^um$XkT)8;DKUcSr$> -EBwDgOE=!v!Q?M&HsLi@x~bh=g;yt80a7E(YS>~VD^T|z>kIt1Po%Ai;>#mOu`oA=W*Q+K;DoaUQbK< -CBb(xb9CAl7au&d&Mnv8@<g*E$-UVn_%C#QWMDn|hI$zMT?LT+0RApWIF0NT`7w%;Pl8ttyw@sl9N@) -#zPM1p!CVDoeg<UP)`p*8u1Gjnk=Kr0dZU<lt3EsOG^Db9^?^&pR)pwLG){%7HmJdAZBKKO;}lzt3LB -}!4apxHbKOV8DXnIJcCVo0f#Ln7ni(VGe%PN%*aXjNLp<n8((9`&;CW+Xf`a$AtNXV%H`nhj3DVx`Ms -Q~OsOL>j=gaq5`7ZDY#Le6L>(%`wt{VvJX*cc6dp&umIKHx9SLQ#yJd8)6a#yM`-;QdVCp$Q>^}3yyz -~o;J-r%Fzzfem91QY-O00;n48F5SuQy(P!1^@s97XSbh0001RX>c!NZ*6U1Ze(*Wb7*gOE^v9xSl@5k -HV}UIUqQGiBp0^OXJhUb<VP1QZGt4*OJJysMBA)oNhPIZ+0g%ecPCOJE!k<`=7-p#?mONczdPP#rHUP -k<5gYNO2jdfyRuLf<Bz(?>Pp1T^Jug}IkDq1i%PDvP*(Cni1db5MrI`|)@zxs?PH-0x|C(~$hAm{-Hz -v}RdCuob~3u+RjuQsNQJgScYmIqp5NU~+4=45^=&5`KZ!goT4T!XI#xm#wMvBUNrC0bmZNP^UCFFfp7 -6ZLWx_N0kBD==6Qj`xod72n)|+T8sw-LxW0HyE35X>b*P7jJif7|SXuc=&5rfZoJjRzy=Bq;OcqNM*V -q4S@mRv9}d{-y|Z^7p*6Deyf6gmPRDZs73ia>*wfL3Y^0<dHy7<*f)V$B|k64mP^`^9Maz@n&Cq-(HC -y`ZiG77bVtj0l^G6>vo6vWnwSi)=Mz@3>lP_<FZ}Hm)|Cln@{%98-qklc+_zxDEy~QL;;8a6v~rr5|8 -e*h=6hn5}{-{GF|2CUh|MUIJIDMKJV+C#Y%>=n6s|SE?30=!(}_wYcD!7XGV^$jU_%uWBRMs?IW&Ne! -pBa>7NsG6*LVJlWXjMZsj`d)OpS1VEuG<6^v4MO}vPr+yG7UEo!no0yveo-&M~6Lq;_c~Q~o+%vx+ar -Dep4ipXpN}f5p$poY!1J*prR4{HWZpa31;I~HmU1dr@iO5X?+Qo0RAWq@lowtyJ5Ks;4T5y$YVoRtPS -r-y$vTuH=WM0Jv>Yu!$b4u}#DdY<ikcgh9>`AD{LW_3UJWuAY`(YMMnSsQ{$R9Dj&2IYs$blUSPOIWr -R;ccD^hm*AB_Hd?D0YK>dW#hAhInAIh86I#NGLbqu(4G7T#MM{9{H5`R!ayG<D>?P9$SlCC|-d`(88P -4iK@S=0CW<kJ?mHyiS>GhjyA<61*Hij&P(Ju+}X2W|9+<>q<@J@y&4=n7itUKi?yg6!dm!4uk?mx1ib -tTo6_TC2|JVxvncYkip&~-5`YXLB7-diS&mu*(OF!7=qvzpmyPk;bqg`O05i>ME5Gc#uvr5k@aq(UgE -?*HIpf!sz?`*}v`6m?SsqxamKVO5J%12;NQEE6#&bc3LprQ*I9YaTzPG=SBQaIE1^W!wRQqBF{7!kr_ -tzmzQd5NTM1;7-bdLpRuyzTgI&;XjmzHnX?fL2T?U`n9)zw+b9-%^UMWr@Eoy5x42JL~t0`hFbb!;WV -pivm?ZG@jp=0qX_!Oh-+VtUg-d&m+}o#>ZEy3Ax12Gd~j@V=o?h9M>m%frAzNBBGXTF5-~&y<xDCyx- -&*W;c}t4qN>1>a#g^;yza_XA=3bbfzwc5;6*6gY<hz1X?P7AW9O-9PAStd`FbuAmyPAz20*uPU;&t3N -+-!b62^z-k-&gU3Cn=Vy)(tfuSXe{zI3e|(%>e!jT=`6KL*qtWp_L|#FmEFlEdVBp>N$70{t<Eb%K_Q -8`2@LF&eUNiRc^WFW))z$g!zLk`=U`SgWhfF+(HXEW?gq5uf2LwDXEYlRZ-~tD6k4o@u=iD3iTUDgR9 -48K}k^L&$_7ofbBuqEZAitnz2tb~GK^km|^w+NH!yFfz(Qe^Pb&g?<NQA#b8>ddh>W@>IAiZ5kl0h@( -s)NvP#S2D046Le|y%nL;HzUhlyKX<hrr3#D2~kB^UV}TT`!%Ck6`wPi2<W)?kItS5SU^37YdDf1gclP -x@|QT-7F#G)ax0tw;rNLCYbtogo@KRxW~>y{cx?nv!JSqKO^b3RVGUD%>4n0w&_<%UUm6DP+1^nOE=Y -}ghQVp8d(MVv>g*lyvV?&+L>&*A$a~<WbD);E4xXs%JbTI47PsMWn-L8)Xqdf$L@l7(^hJuSokC4B?v -Dpv*Xqp#%@o(p0`$1ot~VVxHowjge7tRk6RPvnZ-R|2F<C~fFm2X0n{wLrn<B4w)QtOvJIB;lb`O)P* -J7~`?ET<;M{~(|Hk*yR5PGjZLl-z_Z}oWE*0`|gQXxNr$pO?~O(yn$PKF-D-ZiP)!?r1X1pB+q>mJ(6 -_=ETpDgZrjS0P?OHl^bLzN;$-wOlm?r>DRcqN7-I>-WKS4mgIsHI2PNqpZ`Tke+r>m_q%TOuQ-F<jfI -{eX>>B<Hlfl#!t8HP<eOV=<Q?&-2ORsH|T3Rx~it<V_y#Qv#Vh4<sW*Lj-oU$Ke*el#=;JE#H4fVS!P -YoGGr6=G`=}r-}4jp5Y9Fi-Z^*G^2kwN(E9-s_q(Og{@3ltO>^5Ge*>^?OzOt;KOwWtD_T#R3z$;G`D -bd^%NsAuKY8{_?dU&HO9KQH0000808trnOsk0*KhOgJ07MG_02u%P0B~t=FJo_QZDDR?b1!vnX>N0LV -Qg$JaCwzhZHwbJ5dQ98F$5OJhu8G;a=tIy7D}O%UP~#*p(yq^7As3WN#0!keMj<poa}OfMAm3tAB|>I -8QlP5Rp&Z`jDcucZ5;5U)v|NQ`gIfy^j5S{<wfWtJJ*PEl=#;#o_SH@%wX`_xc!^5j!XF$e(Qw629-- -;vG|O%Zn?3@%uKbjsw1~p=%(SS992H|%b5qi7uY(XmA$gcJ@FS~w27jqklb4MM~QxK(6S%q<S7CgyWK -9#6B{{Kyzmp+ED9TB4}>M0B!bh>O?-{E4u%Dmvl#rY^jX2eM{e+`SM~^h68caI>pCZ-oun3u&cfAjIJ -6g6YXufv*JkZyWH=mBIM<@6gFXO>{1xGdwIIBdh6Wukx#Ql~5*?aGC?pB)pc0Y{osk@vtYw2+p9>>e2 -WP|E7R}O~<K>1kCBCB6?ctEEKvcXz$RVCUiUYZ`6e7__Hh_oL=o5U=JwRXK<AB2_$g=DX&!d5l%ajT6 -1c6bn?dW99#d~n$IOF~ZO04J_2qhe2dyBG4;R81(OVfv!^N<z2HbP>5ojxgenIxN3EQM!T;>n7pWaPc -gco{w@jQzynNBn5wl>Q$VVa4f+r9|uUcp3H;124SZJoe|N%8hizJL&Q-U)OY>B(L1$v4`+VrbgN33;g -`g)i`IWq~xW%5Gs&Q;uRIF&Lv*y>m&7sGJwBpx=KA1P;f<gOUXgX8uC)K{)UOhAJy#Ak7Ii2F}>h5R6 -Ukk`Us(Qnku6+-Azb#KWi0Jy|gb-X#<5;l`u^xIH0RVT_{mvNZD+cL~HLu-7^_+qH%-!>|}J;?te<x0 -VZ>{nobRgI^2a6e9kRWHI$4X&W@dsC9`O)hh`8+$ZZ&CPpi-<6pDdSG|p&AH^-M(Dkb<m`!#Gm_dDc( -+b7;fnv#`@&>UFd8v@DC-C;DIg)LSJlU|uy>sjOw`R_>Ax^3(?Y1PL{it|6T!gRB5P4UKVNmW{E{+0q -ky^&M0=VK@%fi=3kWw3`hALcE?0;_!Sy=F|VPpGe}bm9E5KW&s=0T-^ug0{uYk8PXIe0yb*+Qn@NKfE -L955w|K^f&pF4Rs5PFDfH6qbtiww1vt`g|~{j@dmjc_GsvSXoL9?k^7AArpP$%fR${6^5eZ6pzk$)qN -3M=+sM`2vbP~LTv*(`w{C+M|ED`D?(|UdeFEqaLhlt?(QR9r_K%f^y+=5)K&1w6^$@Ra=U-#K98c`KB -!&liP!%o^@=yiC);kGw9r;wi_q=nO4fTCWacUb$^gmEb0|XQR000O8Q5kVemp60f{09I4F&+Q_6#xJL -aA|NaV{dJ3VQyq|FL!8VWo#~RdF5GMui`cnzUNn1R28s=ob6q8wCqK@U1_DNs@_)W#cCCqWB~V=IJF% -({QGytb`mET&S5L{rd&X<XU6mK%y{g4!&YxrtWc$>c8{#F+tm*=GTCZ%V0pf6Y@;F1nK;x+TgEp=$;L -wN|4$}iT∓CA5E)X`fD9S2$rNUScikY{Lx{>Tuvy*^2!i{M`r*2dL~%ex@gf=K^XgRApM~K=QNJN- -x=O8jeCW=Ep|J@`KQBxM$b!cVd;_!S*DL6|xiVe{!XB&4qyxRkop3TH1C=D6G=wF=+`k&Tvw_*WjRzP -=2a@6ZQ9R|Mb4;`A&NP+0y<=e}3Y{9+v*utp>emEn#sem3Po&GNC|#X6rU0*$(V4Zfu_C6+d7s7f4n} -ZcJFhdvksngT>>7;b%IXx?i`x=V4qIdvOHAwo0?JYBbY5yI~YsG#{!GszQLtCQgFq6*$kxk9Jk_;)(B -oq#U?iIzF}Cf;P<Vf${RlD@z1w%PM7^5KZ8zg+$~0%0_K1!VFm1Xc~kg=ra?Qv0TcGeMAipil)JGjLV -W4021${d6$=}Fpq3+ZEYSO9^4oLhnGl2Q<+c?P(4U)!Pp0HOXMzOHDH_CDkaVP_1o+RZ;6-V$!8QWH! -x$30dL=?6vpOWg<b-KXA6}f*tk#=rK53zT9;YH0v4-M97Wl1>8V<0Q`p=CMI8Y#^Q*g|#*m107h1-?t -+m>*&jCnZ*t;m6%+yebtpNR=Wm$HGW2Fa72n`|O7Q^Qi;5x^`Fr4@cbBHxszRVz1fu^=BHMjd)JnsTh -N%liW-1){dh;&2?y2r!YyU;uS0@vBhbCs~g+9)bv^L%bVZkOy0*E@vPn>SCVkTza?jfoeh8KF;Z7g@( -1Gfp~2%;_9$FsK;OXYKz>ij0@;0nMFvlMZpK(`<>~D`(QG6neHC5R?e!wMRvMIeWltIdZ+8r5Lxok#? -<2Rx}#thtqqI^?E)X_)}Df*LO(zen~^xC15LvDgynT4#fD+6j#uM!IRQYl-*@pZnNp4Uw3iSFMWl~F! -y}I%@?ocsZ{=zY#UJ_y6)gnl{~+aYZUC2s|G7SnT)g}2;AmcwA0hPpwab=*HqJIiFi+cezuz9zOZY2_ -EUWVN`P7lDCzIamAI@v$8~RpVSKG~3jD%F5KHC`mqIBl-$=NFCC>Rf*o-djpccCdccnb6W%BxL_egOU -zHpDdM?sGO%pl^q3tT&?HeB99m#4S_ubcRJ0edmL{30w6CNM^2q=VV8o=kDukVwB(q58~X7_!ij5*+X -H4EA_ej5U_xYjrawXzS-kE)67W=clTWO$oTm!AgS!?3hDObp)wuw<%+nV_a0(kLOn8GF?Nd_n^vxTXI -zzW?Vk>0)~b34)_(Q**%C2SkL#|?7<8`h>F2;yX8eJ2mS;>QohrwsfPiG^T|nYG((@d4YcOkfKJ*O&7 -%<fw!;PAE+g$0_pr6@SoCcJw)4ePoAhNKx;f*zh^TQGokB*a^NnQ;-=W2W1JW=F;y$!3Jw6-4V9+RIe -<*~@GtLQYPjpi~j`PVKL423(B~Bynwomob4y`rVNfkh$y=~Zl`X3q<HPr9d44ZOyRw19QM733}Y@jOH -$f|_hv7xI~Q|~k{A(Ef6Tet%YL!@(S^?YC$c4Z$>jZdfr{c5pkTv?6cPao%?f!Xtm<o-I-FN?&q^~S5 -sPsvDl#CxTKKMD*Db4c4IwG1Y1nO(bkB})dCrmreS$z$lx^3be>9xBiz`TQcmvfS^DeuL@R;&`@vNUc -se9ny5g<uGRLbw@@IiEyn}j(gQ|6F_iJf{L}b1-Os7v!igE6~@%v7+?TW9;d|hS2P*>(6~ckvF8=KiW -q2CL#>RUewmI;RuxKOIkO1Plsu^_x;-GJcy(rgNAUtPWO+fEyvSIlqMmdfIsBhF5WnwtV#4C!rmu5iL -LU0{-*RG8;SNs6^789k*z^BK9OyRjMoZd<J`dXl9R0$+>l_T!ZRR~gDhOC;9Kq1}{{Ag1Vbkp9vrp9H -)2Y=_f_Y@$8ak9OXW3s$RP%m?sENAN^-B^3T{l0};9?pj;7OhCJ~F;B^gF+xiQE*OW?tY96cO)9*uAg -dp`IEr)MIu9m2ujg+}KcS>P+3eWy~Gwe(opd-Ifs~3|$s%!EV{o)z+N0-}$&%Ww;Ms8b1`|_mP5bUQt -ee4ciHGQ^eTqVwu0d%<+V3wUQ%w<dor6@nrxm!9D(X%hs`(&Yf3aK%eLwi;=Ks&F~8RvN%MJ6ng!Fb| -L=j5gyXSr8-qoaWD8+RY968oQmVi<4%5J?xv8iwL`i70}o+0Nk^yf@sgwIE26Lsp~~4ahk^W{$}7tUB -(KA7nkWL~I(oiEJn(j_Pj}Uq<{X~R)_r>w4_|Ob+20#QCnHriWPLsYVH$HIBHtB8O`@*=UFQ2+)QoPn -Uv$}PG!EVRNQ(?jj@37p8Rm7zt*^QiYV|qI@J+b6_jjXd{Wopt32%MUZu83zU3Zl*`0(od;C^sDtWfQ -Z3zpB%U#^Q7UIKM8hQqgnEYg|f!*kkrZRU%#U!6BzacGJ^(~n$8e|O}Af|ZH2Z;X6^QdcV1wDm75)9) -nHN?+_yYev;7jWqX0ay*K0#VU6NYr%EnRc<(Nlmm{usdIXpLkF<`15ir?1QY-O00;n48F5URC#iAl1^ -@s+5&!@e0001RX>c!NZ*6d4bT40DX>MtBUtcb8d9_&WPun;c|DM0X3YwB^A%(I5$BC16$9Cd`D1uGgX -+oJBJFP_;N4C>a>9oK7p2tqwq%CawaD0H+eqMjiiy!0r{++4woR}#!go!-oN)u5wpS(2WW@)CfBy%_r -vebl@j8p|Rxl}Wc32l@Z*9MOg-}k*-$r(x0yf(GsX-dSblFAS|*0QJ#Pu)5O1#^J{J+GmVy8Y5i?KwG ->sFHNfOD0vK#ZxQH@F$a+WyL+usO6bQ;K$MzaxxL+B*|o%i%Cn)L}vbQJ5;wc>3Y}WPZ_TaxwPaTl#; -3=6K%-ktfD4CmY)>8VPGbUf@c=3R>Vj#0GeF@&-V>!!H|v#744F<*4iA3iZZ6S*3YU~aqQB!Ee5Hc6S -bumvFWo~l6EH%RoZ-#^Un6=&HI;FN^TZXJ#MgEyIpS^14yf^2@38qo|6eTsWz+-<1kv=4xyf+C0|xM_ -_Jb9kPB%--|_lU{9Q_{m~HBZ)tBN>FD233gt;gTSK(O7B6hY!(aV{ERR|?m=>Nx6+W=DJ)CQ`bDu#>m -PpalGd;S7rY<ozmE1rp5WShc%92n0_Q(6?zX<9G*?K1RZ;;)hf7q#XZ?8|62<+ui`p+E7|NB~Ls&Je$ -(M$Ea}A$}Xov=$844$ZWBoLG_fm)94g`#XC=XB>>>t(;D2!qx-WEONvuX_{&(%3PA)&PjL_lebNHx+a -2e2+%s>F3zAn!ML|!x3nn|q*~T0;~p<G?>B;3wM+VxYHExM;W#G2mYg7RGV&hZI*qm%uqbEHH@6J3eP -d<RbG+BG<S(MsV1$X?4_&A`+1=}D-DFA_&m`j^N>8yYWNp$k;U(-s=0q!|rtChK0_iU-*G8w?B{!%|o -}L0~D=XKj6zUl0A^S6a{*eL{9fQGPxD-pQmW(6ecxiaoqvw?Ep9T=OMr?p`nr{m>3GkNAOb~6AmDfp; -@1VJ6`8lWd$ZcbbfCe=wC6of$-zT*Ll^97rfBLw83Yky_hU8Qf&jYf$`kw>E#&8A7E{8od-AF@=R0Dz -~)1hIFIMCOYf?-g}Ju-hA48xMXq-aNm&uIZU4Wu)XDcMkxHw089>lG{*U25{04Bx`9qvL~v2>u=(kk_ -xt@up&wIanP!pSley#E-^a9Lw<Utz*TLKocNJTqrLj*QAsHJxnKZ0W~)(MER)K9!!m?^x0rA5oTJCaU -2>{%Zd(QL>N?cQ4D@LdbbC+P*!VOsp{R)!O6kFk&}Oe!DldHLj3c(wBrxXm~N^fthPDOPMjGS1LyBA| -He_%3i!)jB(WP(^;FgcBOE3ZQ$y!pl8GdAL6?m;XNn4FQe<@J3YFYXxpNxxkG9?sm}*?YjX8iy0gNtI -okWn3cEKpU9(^2LU5)O8P8Q@00xNYQD_&Z}V_c2W+l$fl)j#B4w`w`p$%vN&M#*vKklt{+u_)07cUNR -^mKBgNc(%?ftf&T^2ANK&-M_!RzP$ePj2JQFL_$GNdG<)=by0Ff$D$Bs32miDx3wV)jvx>w$zmW$YiP -IpFfYIkbS@DZk?W?`TCptPj$6MHK(n(AWFyE^I_KnT>+IJaa~};0hE=f%N586^S{v*(){wvoBCWtjvV -c_W!w+u|Ip_VZ(d7<%M>ZK=>0ZwKO72BbSV)>OM5|G0TQWX*WmByu%EhkXXq|0pmOoVxN4Qnhu8RF&P -sukM>u*S98?;fidqXrSe_3Wl%{W?$voBS$E}dOixKOv_dIBM|@qnkpWFWMz`Qh7><I|oxXAExwVMD%Y -Ut1jZ5JIJlMx?{w+aQRnnXQoC>0r<;n~t9L^ULAcLl>rYA7I)8W!WR0aQiSdFt51D%e8|UUApA5w?qL -$C3cq?H<VFBU8*-N1LHR4AP+GVb|fP~!^T;V5Z9tW16)x?WVX3vmKAyg<1l>AL<vk|s^K@(-JTu2lR{ -=rZCEXbCud)`9{_MMd<mS{!Nb=WeOeBW&-#S!Go4eV!{F-j_lpmApMofIKIELL)w>(ozY>k7bP3XC^p -QL3!9eJv8D7jW(GsvxY~PJFUT0zj=)=He1WpbMJrRoMa9=(*a}8s1(uA-p<_*fBY64ZKc@Rf7UJC(_# -)Y<!*+h*2MwCc0r_v^hP_lGOubG|EC{*6M*-arIg!&P5?QUuHsLA;`jIM<UtaM1=62@@5S;FKKH3iqs -=J=Z6hq0~4;kxW@l$=9qfCxhIwc$n_TT5+8v=Z=^x_6!q+&@W%J8zG~T?|3X7i^Cao1**1?HDPL`mj@ -`FjUPl$jVk-LdV)ZJguN8>M;&~lyMks%}<Tub0^6A4^T@31QY-O00;n48F5U4qNSHj6#xJ@S^xkT000 -1RX>c!NZ*6d4bT4FSV{~J0Zf0p`E^vA6JZp2?$dTXmD<)E01Z^6zeINFsiY~>KD4Qvn(vh^iTQb7}fg -y<%2yg*V67MSi{knS|7ytv3vb}q|Nl-3}1ZH}A`rSPZp0M#U%ozOhn4he-ESa->$=S^|UnVh&lEos77 -p|Yg^Kjt?p`VM7Y?TC?h<A=oSjyKaeDQg}9>RRd);wK>Sr#U-%lbKjhUfQT0MC~^<!qj$Z07lQ4_+E% -FyBvBYcCIHVHD<DdMX#c=P5$L`61lR6ZXda&OJJTIp=_C8ZMSOd-LkmpI^Rt_4*Z?ZP~{#_O@)~{S>Z -U){P=I#4#Bg@{FhVJP?y_G=d0olkpC1y@PuS=kV8y0~Ul?o`$nc&Ve4Vhb)=rfH9|sVUCCgiN9I#I0x -hb6e8}$TejY$>m(E7kRHh<XLHVx4!C{5a*=v*&I6>KrcA!{aw5DpOYS-0BlZ_3dFaFK^_qJr3uETNw% -~EdGg<;C0-#v}lqVqdsWb}NQ0%)36(D4r^*Tv&;C6Xq9lZ?U7kev?LSm2_CIdV+<4DVZa14NVd6*$EA -j^6)i$Wi{3n=7X7~_2)y{0iN13;wcX-X^VWozz-^U&|GhcwJ{9!r5R1Px|?><_v>vQhVM{Tp`CADv%y -`|n4rdv(P=b%(?5VBGJG*r)#Z9UJ!Ec83>ie9gx1`Xe^Fz8u4lUWfGu=T{#t`h&Ls4kz~C-(2;37bbw -~OZL7uJbwpYyWjV(`r{v2cW}Wj`{O}xGy;Jiu)#I!ee4a!Z1fI*R51I#$FBO_@2`67@_GnU;r>nUyx+ -aT)i3(P-ualpgY)absQ2F=017-}7v1;Wx48Ha5raAE#;14P@#q>>8^WeWAFjrLJG&fSzh_t1BSQAW2= -;Z+9d{Ax&F~r!9d%${Z~U%@&;Z{q{5v1_uLn3D79J1bYljVbZ?F1qdxP^HPQAwQK(ZkW{4kOeI;=bFk -8sWF4`ToZ^I<4}1So@^fJqdG$%qNz&>O<e-**Y_Wtju+(L7C7Y&xB9@=eO8Qx>jJCP68(Bmz~Oitk59 -^1d=pOAyfrtcALta`h?O>YMp?&9fu1#2O65^q$87h>;o@J|4jy=8<>D|ML_i`e*OxsDFVhxa`B;&j6~ -6wknLc)B5|Z_ws+H6a4?x%Rf&i&;Qu!;DCPn=;$cmb9V1VVK4>Vj&mn#pB^!|Rsf`c=&ronU&2Fr7S2 -hDR$?SxsTYD7`RGL(-b>RYby@=$;0egeM$!VH96UW`&(aoq#w5Iy0|{d`PB;9BtRC6<`6l+sTES<)GK -_`3N;<M6j<)zc<vxHd3@~V>SPvlO=~m!Kgj6#n5vTr=`*&CTo<~Rg(dX-&_2~)iK+Hqx7~`A>|8E!j2 -1=mi$Z{|Cxp>+Eq;g{jZSWqbNl*1{9>H8NDH0?*lLN{VVGP|RdKa5_r*wA!_AM(<uruRBd>1DVv0OnC -Uo33Fv%bbHeViD`XS}jQT5}9yE0?^|XnQeIgfDoC_SIvp8p7t)5+Z}fHeNKKD&-};KO$M-;9_Gk;_>2 -#AAVqd<YgJU9JI?R`i&I7B%2uFg8G3oS276^0vdT3fi6yX558sOg3;{z0y25aY!l|*EaE8D8-Ne|Kp& -t%xQGh{39*z$H9dnM0?30QN!DQzxDx3QH|q!h!8!maOeMAfz~Db`LRbbQ8zwxUGxjn`lnlOy{*sYOQY -fUC1HTS;Y2$Kb0tP_S1pJVf^JpvLik=5^C2?2=t}B9w$Adi+JP4XLsh1<Waur!DlPDlxh>qXSH(n&RT -8tF|3I!JhPA=FOVu-<{3!sC8#E@!oe0<zh2$N3_N%6gOt59@d$Wft@(*@7NoUf)+C*#q)!|wRjP&wic -NHW54?Sl<j$~I9BgYlVb?#GoFIRvhl0gh;{7%xaH7eqT1&ga0ZIPb6wsfo0R`6C$gaK%llp=Y3m2pq} -^h3MP@rV}#e_`GTu&__7pQ5$8^DHFJ35c~=xuCr6^@G8cSQ7+pS%R;NUYY(?5Y1T9daEB4_e@$)0ZZt -Q6Jq2Src*}$5XM-f>O+2+v`8QL4J4{_C>!&i+KILnedI(GY320ukuZX3CUZ%mm;-ivfRa`sNup)qe8` -j^dJSc7!3Ka&AXD?qjF|su7Ur^unsS^QpaszZ#q3GFHX%s>D_A2!|<w#}Fp%(Ca2(r%&syNB)CvHZW^ -mi;QOcA$IY%U;($XaBZSVvn?ooK#^lsn2?4U0aUUk^U^hU4i?cRcP52j$E=ZT;Q(>&;)*DZqRDFU-Fu -FWRSn`V-#FHgmk`K5zfA)fTWmT@NoB0e#M%JD(q3wBc_{@b}`ndD+iyeSCj#(fgr!#;q~q^Tb%D|F*w -lq2PtapCoOnj5p+5XY7A9$68>lTkMqnsxhrXkXrtHL66~Y<?%lR^b_`pvlSH!A3P8lnQeH5YhVyubQp -IRu1xWxa3<;%^bHc7GtfuzWjZy}i7*axt#U#(43Rao4Ios~7&+QDxTK*<#PzBmyGeA<<)WFfo)T2NhG -LXX{b1KZs596-njW3ds`3-0l{#rFu-Zb7`siAhpeiX~=Vt3D%$=6oDt1Ff(lZ)DZsJw(NY_@>HKzny8 -Ye|^2O+d8<5D(Hy#*Q?1YEZbwCam92B@$XG`2RRwt5u{Fr-KZhrV|RNV_&cmVLU4UPk4odhOfQlh>Cf -jGh;Tm4-T$e%@jE3~9X0To?<2J5QYU?d#J?X&9Dq%=*u{7fb6;!t@Laa2Xa>oD3AET}JF4+>r0V4yV% -&eaTbL=XeS-odR4!!BYFVFGSl=aVg%yEtN$4LKsvX?4=|a82-U@Fp_xQkSBf;xu&p6su4Go21%c%mp4 -qvmn;v{cPyWwvm$u<=1K{@X~1R06epD2@d{lrra`v)nZdK;4>8r6j2hIl^cYxH@$i;XoWK$P+^$?62T -r>p9zi*TfKiJy*{m~=q*s&jP(1bt!L$Y)0$6$m&JqyB+jW)EG%>uCl_Vx<?3#zz2D@;ylc9!5$^Y%dW -j8+bG<XECC7hbaifXx_hUrWt4j6PduT)R~#x*a}ynl5yT1@kbVI^QU;e^bGNz8-LakHAChJ-1Ima|IW -|0ulU(bi78I__~Z=7ha4d%AqQAJH8oY3AI1%^+kNNogyrSCw>kbz5JpXINX6<!xcXgod@ve3%fH)!7* -s#??Bn#lV4K`1Tn+{aFSvs*(-(d$Cz2ri{RCELcO(ZlJM_JUmdJZDkePNQ}G)ENkrL;XTh>Hj+UM)u- -`L1rL)GBXr`Fj9>x2s6|(6+Zf-N^=&;RNbK>A)IZ~#Mv}W6$+g94d2N(Yr&gCr+A5)7#WL%W);Lg&pm -U&o_+ir3gr8C8X~vH#Lcbh-BFRGpKi9>-J~6lCgms)n+WqB7*VoO$M^^;WQ#xR6pQ4h%9rFF_?SI^r* -3q7$lH^IdZNbcLdV<1LpfEXgqbV{(GHEUGxmCAIMWiCps^(i%78lby6k=GttRCMG=TcrOP!XRks8rEW -!LClA#1p%BP@LAo9I;OAd{0DKrgbBR!<IK$o~)YEHPC%k1i*$8nJ<Zc9}jbj^d<I>L?PIYx#xrUY)dh -oFL1*I4pW|%({8n^#$@Sbv|+!)S{N-y(RA7p8mb<Vgu&x;EG(dBlh3Kv;<wo!&crFds|S=B;wv_*FxM -}zKs%jP&~#f>rk}8LG_oYz;#9RbfzR|P>}^_PvIy@ucZ#C7cat_vy~9LJroUmiS>Ud1DNgy$^XCF+iE -M;(HDgRE1MH|GRV+riSOSBnsxG0K6g06|$DCb19<G!_y=+Q`r`bJz$Yo!b>O2tTAbp4{{2-pzk{fg@U -gk-*Ik#E2vf#_A7W$S_RjXR&s?@g%;a3e0qEg@)=c+F;d{df%-Az36AqB?%G2z(@>q=+13VvM~iJFzv -Dp6H@1B9MkKrd$@CM8?a>9<thgBY?eWirl<gM?>sOZ8)Iu@yytJT3{P6m`Ac1l98O{?tr1py3IHn28B -BW@j~k#&WTra%xqJDynNd0VTflAOJ0<_1@o%f1F<Q&&OC#`-i@-+cZ4?=S`UMtHi%^c9dsOK#O(is-^ -mp3f$10wA5`ttiYsh*iTB^lamymMXSzS-$t#qK*&ScRFM>$(^xsOVdIVaoz<;jMMM&vsv@_iZzkAO<G -ksx?;7$eWq)u{wa|{7Z!QK`TXFW!#LLzpr3oU6M&zLm%pcU%B9t(V0O7;W%^BG@N)Z*#XLSnPA_BWJJ -p;m2TY)Fe7adV&6*xj%=~>MaHeIT{YX7bcyj^fYq8qH<8Mb>#ndXjU$(G~*)9XEK!D~<IDGk2j%@c(P -ua;316kfGj7sLx$UbhkQ?j93iYMY#4-}g>2EFFFEsQ@G~mQaNlb*P`v&X6x)#9<5&7(9jkhtWMvlDtB -6ywxb^AlUf)>*<S79Q^P9g`BkQrw~)nUlFu|uH66zVTKD&`6C2t7$=o|bM^7G5OzTjtB#b+qU%T8OD$ -<%0A{Q@8Z-6V(@7od34^#w6hY{4O%&r^s@ewzJCOSER1|Z-S>j%B%Qi(+K*}OjJa~dC7n8m~+KS0SX{ -%@3e5yw{Pq%417W$P1`6)82QDq02h7&g6kD#6bNJkhER}T;hfCbS8PwT9eFe;KE?mk5<#EdVI2{E%#A -n37E8ueS|CgEvk<t|?8z*jO;v(eCAEGI}hSU`2N0*LR$1%w0{ub*{TMsFNI#&*ZIHb5vlQItGj2FY`L -ktIf3=(8jZu&H}qPW8TVW?>3dMmd+GW;TTNJEf}#Un_DYA2{V;v^k(t(V#p&x8^ie3TT;@H-25Q{etN -5u;|1PTNNNyrB=&;DYF(p4_ulp)#DN2`)T4-So&wVM7;^=gk_L~aw*^WGUZ;7v6UxJ6V?g7hLEau`;} -_}pclcn=y)#ahwc6JF54kE&;dn;8(H8wX|h=?#oK87p{yt{#xft0Xnd;<UpNruCwbZ-m>9UME0mSTfo -=JRrI)udNNeVlrJ5U}7uH}?ps*5u>wH}E0bhQU?>DSdejg^Atb+V(lQ&LBlx3Q1-Fcn#GQd^Q5Pq$VF -(Nc9tWj9%uDsZTt+--GbdX~~3wyq(>ow*)APJapX-(jdcw-Pa24>R6(fcF}WSof0`^zv2w4^84@35wK -2BWQIHmZ#t?Xpjz3@z6toI-l>lzUldu?S>-=b?BprMz^Vii$!mg0}>m*hAF<Ilkk3P4H-a+Cf>ccXF1 -HNO_DCOS_|&MqRg#7tNR!$>VK3$;bCHA4ohmYb`X8+hjI)ze*aa>OF=Q?I;dmXN;mgaEm`WyQ?wcoJM -z7u@~&vJ#HR7k9bV)kj0Lg*$g}0tju%<C#kQ^lW+$ipz#`c5hckT^OT{XE`WL7RJl`^=m&8^_LmX{P3 -MB8OCxw2PHs<WyHvi@o84U^DG8X1ZMbn@g4|t~(OYk>ohjA|>%4=v-==u+J1tw-l2(yFlRrxg+l3}M< -t=PW7M>ZiVU9GmnLu#YxY4?2NADcQ8`=-Pp(Y{@4q<@JhM{ksZ4Fb7fIDoPY*>~jYq3s{&}j+atGtl~ -(!1n=-}AI1qZL^tXf}-<L_a6rY=O2;lNrq4lGA)3XXIt{)?^&$&I&rZtmA_A3>MjMrX-WkScBiZg^%{ -)YdBXcl=Q4w>cjw76>1e72iN0KZ@h1okuF&LL}f6Z7kUfqSUD5#58K94J3zINvln|gAyANQDHa8@F@% -O&ihhwx6v+q>zrixz@3w#^$y`QA7td0#9bTr+z-UalWuPb{9n>{YWZB}?ar5l7dhCl00!?R>vcEv{{1 -yjKP;^jjv45S^7O9UhwJj~Qvf2J7i0+K2Hl^cL?Xe?+WMMGu=vdaETE{Ai#~0Oe+iM(z42ps+DU?6Iv -G!8<gtYWwg9~iCK$^~1c~Q@>+1Me+z=KZ3(6Un#x;3^JKMJGbcs~g!lGi`-p&;<uueH>nIrRDf7~G4W -0M(?fE{czUeQQ#w6-%l$Pa@`@DXI8cuGZ_>NK#u#*J@yb`se@*DQ?U*TqCEH?oz81Oz9A~y*(JUGTwp -OD2ixbrHWroTv_Nb>4mp|SgqDRQi;u$qsFE-l^~GB$s~2eHw-r9{W77tfv%`fsZNhq^ioM4E?;h1p;s -{)tF>0kqky}B=Vie|SL=nW6i;sF6RQC_#L4V(E}q`5SyY`H0ccs!R9){dNz*6tJ4LPV4mJY-_iGvi!l -@q~LS<utGI@(58lbTHGWjJ4jk$P%#{o{<%n9_wa>Y<ZgeKAKNA|UI2ti<d4pAfTF5TbR(kJKtN^N}#o -u<}4+ItZ-?6607)E!oZWbBgK$6A$o?Fk!UOOzLZi<Cdsp=4fEcqoCAE#ak;f-1qnEZfXz4Tn(a)PCZ~ -eGl1kx_u|UHq-%HxtD@5ZR8zZjiIhm3khRVRTq86FuAP`wKV=eEehVJJ7S@yR^3e{s-j%4zRO1Ey^I* -WAK&a@!^#VzWs>b?gu+M<))d#>mGvQCi1IeON)~&N24?`0pB;p=8rzJr9?_(ZgsXn`tvY9G(yikMxw5 -69_K;|vB6*11xwkqXlCMYcqHGT9(huy3_@@-X1FRKEJFQWfyEl6Oc9Hw;s9lim7AdhJ=8GG`MoRKD#B -a^?Z}#W%oprDPMu4n7l>i85DBsMtyb`DZ?e8{2bZjA<kaHuVRE^Urk~}0DRVpb%D3PLfnB^2!Mx(ldL -*b~bI~^2^E}L61tv*1OY5>c3Mwn+a|I1%48dVnFu-wa9IJ#OTu`Ha)hQ$gw#m$b{M|&n(f$gtw-S8B} -s(PeIK0M6iiijfBU@%09llY}koyzR5OI1R&9bJ|CMOd=uP!Sd;s-Z_2Es8!F)u$W!*A&g6T9PUi#oN< -KqX>z@zLKJ4Sy=XWFx2zqqTkt4DAjtYb*rXT<sI$m%CRor*n(5D3Tkm}6)bs_Jgg8xD@y(cimaJmRb+ -5ao~29HDms8|UloTYwO?JZDA^A6D!)&os>mjR^?jS{7nAnMzX@J{w$Yf%v}U6EB-$QM*UD*oLDfSjD! -M_f^gIgmyDH~0JE^|CB7btU7^o^Q`X!b_-d`zxW2d~J0#?*_U`zi8P)h>@6aWAK2mnzTaZIWjXS_iG0 -02h-000&M003}la4&6dWMyn~FJE72ZfSI1UoLQYODoFHRVc_T(96wFNzEzN%gjqjtx(9!Eyyn_QSbzD -bQA(A13bC7xZ>jzb8_P26>JrvmB2DeItof4Ii*-G08mQ<1QY-O00;n48F5T#PBLxb0002z0RR9K0001 -RX>c!XZ)9a`b1!LbWMz0RaCv=DL5{*O47~Rhxiv_u<c`DxxbcIiwCUDW8b`4~@O$D-K~#wKDe=sB>=` -pIDnT;t>f?af5ZugyS5M}WLx8h_C1GZjx=dbmq-xv!{hOxgLr0{Jaqu^d=h^qX+c&Dz;78>gL}2GM`7 -r*7bOoiPCnoA3z_uMd2ka~IauYJ80IX%u%Gv6uY#Y3*Q=bNou?*lzw-s)8TT!|v_$m?bLjcLmgz;aIE -i5anqJ9PP&Z?Qn^DUI@`I6(u*)u}aPoGs(!av<l$Fe|8znz#9?X4B}auiP(4d!247I*+qO9KQH00008 -08trnOaK4?00IC20000002%-Q0B~t=FK=*Va$$67Z*FrhUtei%X>?y-E^v7R08mQ<1QY-O00;n48F5U -{Wn!qV0RR9t1^@sT0001RX>c!ZaAk5~bZKvHb1!3PWn*hDaCxm%TW-QI5d6<6R!9h2igExXF4139B_Y -{>OX5)5P@$@KuOA_?^JuA5f9~wgj(5k7q7o}8PFS2%f$vu)utBaQVO*-buCYu@CY7Yy2=r-~l#Cxus? -<QCU<aRH7Gk_;n@g_Pp~f+86RK8#;nJBfVt3@`obj$pHfy=tt>p&RKukh%5$zimD&={Dv1LhaC?sn+j -rv+&oF=Jt7CE9y{kWxz$NeeoNmv!|49aG&zt?(SbuS+n1WiWbtD1l$X!V572}3A$ejyLV6V%BTsIGzo -ncOs9;M4QB7J72fPU32{dU1_325klEgy7rH#4=NnX((5a3*;LG7lBg4n$^-|Blawb9`v0hAF%O_nZ86 -t%D_!Y-F~1T)Y)^!n{;gaL8RlOgS|b}Fj=2=F-hpwU!IpbuZOpzmtya*=*M1Fl9wg%0yL<&GptL$xwp -QlBmaAczb-I_!&Sj4zhPiE=pMUVT(B)q4|hAI;Zrh836p;OeHQrkVLaHEdrLn2cRO@bar(w|y^2Kdh% -DL0`v$eS0>Ye^VW4xCN41^th~Fv>2x#;TP)h>@6aWAK2mnzTaZLFlGc$k%002r9000;O003}la4&CgW -pZJ3X>V?GFJ^LOWqM^UaCya8OK;ma5Wf3Y5D5xNK&-<a4fs@~K!LVfWV@FQ0)dvsHa9Y<l2q(uvHyK% -NXepXNp^Z!q7RAs=D~T>Ypr%H%ht86HDnnRyGm)x_{ylVwvhSv*{s<w)n+5)rhV0L{8EW(wkBrykZSn -Za{4Td<z@K*KWm|32h#Rn^fz0J5?cJn-@ksn|Mnw$xbJYa6{Tqb8?c%1OrgjMVXPJ_L?~%GitGhsp># -`AJ#R7%M%6lpb5vUK{F&3a`jT=kl@vKI#T#Uj?_hv3WZcpPXZ_B#fqSi$p3P=tJkV^}S~10=d~thm=J -;n>g0KSCY^?#_AfB;i>5k>{o04#M{IV9Z$VwrfjsJkmQR7U>^0nEh4e0RQJc|mI-oW966$<8cX|tEyo -O}@&4ctPp{KQKW?C-Y#WtQ`N3nvsLWEm&PV%Ap@PanLXhaR71Ek4_En{N?8tY&UotOIoyJ?=-ehBQ~Z -3S%hlut{ow>wN3k6i}hRK<2MUEl{pk4RxR(VnX)AB;70hj9$tN*iJGkMCf$OO|}Ee3vPKFo$^oZ!A40 -(HKaod2a6kV59ENvpQ60wPk1n6QhM~s@l1rEGj-PP9U{7g&1M-9f<9hQl~=S8)5~=dUIml|i{@+g!9? -tX!+MAM%;hd$(GCCnd*+3S1doH@?jG;XOgOcg$b27BmqW*=z`a(#_6<n&Z|MrfC#~K<1{EQt8sbhh?D -=!OPQ5YUa9VK4p&BVZeeHZ5O7~n#jPG+bZa%6Sy(bkGPGS*Op9MPfW<W=Z*-ERwA-BF%4l7A3SJDbuc -aUC8JW^924o@z%e;(^VsKk-<mf0;ZRrzqTTW(pQWaPR8!<HtYK=xKKE{8f%$Hr{knaQzi1q^n=V!gxn -94jVZwI>xwmO<4TfmjwPUUyhCMO8w;Ezs34>TU+hu3~#&5|AtE^9)d7++gEjYK?Ui6~~f-qES*KJk(D -4vmpb2Jc2O%!#7+w)r5@<GeqsSx~TBHveraP1lhQA2qj+Ig0qU-EuCo4)U@^j0Sd!0?$IO+Rd06|XTi -}F3usu6pc*&F6n2D8DetQ|!6q@8sv#Et=h_-lGmdVfi?ngjNVqJ5zCyJQl52$@g`OwV>5Aq$y2F3xfs -v!j#VDHp<;i%t=dWg7%QsP7MYr~JRHf&xeq2Q*JQWhbVP5O<Dx!I%;X0tzwZX8QZ<V?3^vGIaQ#SLi8 -ouK+bL_R62d7DrWH<t8xmaC#-|8l^M!^`e4o_h#<Y~T*3!!xaPI*!IxSOQ%y_ImIuw#iG%d*qBjppF8 -W#Gdc3Ss%GgwuiM8kW=N4-EbI+u|v`WNX0T^LmaYmZ`q_M+s@^AEIS6E{&LEzLTG~4&TOG-qUGMjHaV -BoV<hQX`<s$-absj!&yCe9w!>M%(M@#uo*$7?bTfYQ&X?v2uqR6iq?Dow^_!Ls_k4^JHkxZ$&X+{uGO -?HZvMcQRN<HwcF@+KZnR*JAIuXD4mrosl-*2ob7KPOnU{Dy@^c4{5qmfMG;`R<h!?J2_rL44;P=MU`> -cU28;c}!mzVGE)(+ojAhXI1XMa9?p-29rL~+3qh{y4*nSqmW@K_c!74PWlwgL2p*^2=%I)nFgeHe5(6 -?q)>47%%%;RVT$h!>9Sf9e1lUA@B1J?niA|Md+0m7?Ms9<q-6H-(=4pOVYHx`2{RvFI|}iR^nNy1ivT -FvixZEY+SevNz@LK?B3s#PNRh%A!6g-UOSUbQay0?j{}TL@{KP#=6xP-_tvN;bjd54UHEGybAN(s^IL -fU<Y@Q6cq#=hcga_>)Fp)J##w3q>W-4g!>K|c0yqE{{T=+0|XQR000O8Q5kVeTxrr7fB*mh6afGL695 -1JaA|Naa%FKZUtei%X>?y-E^v8ejzJ2<APhzKo+7xG-e3+e+s<+*!GQ>Z);5XvABzZ<X7`i#^MBxy0W -nmqOo$NkQCPwMq@=2ZT^kcFZecnx?xH@WLB6|O>8z0{)2<UMq=TD)52>5AOpXu}4a?zK2zdq#Vhd|MU -+^{1#@_#0ciYINpAD_+-e*9&Y~~M8O9KQH0000808trnOdQ~h3TX`h0G2KQ022TJ0B~t=FLGsZFLGsZ -UuJ1+WiD`e<r-^q+_v%i{R)iS%pH>x8z&#qxmMGe#PUR)v8CGTxHGmxLnKbeibpU2sna#dfA8+%L4Xg -%_H_ECH;GIFyNlh$zOdlQ$;slC__-^U*o(T=Y+F`>HC*YkzFnNa>|(3ro@Lp#Yda;fjFtOFs+RE^Evv -2-nR#C<?6}nKNeTC)ca?bXFGmj{n--Vya0jkxSXbLco3cr>dr=osrMi4b_wruov{O}8-Z(Z0pK;C1aA -xSuqdPp1vlVK~D}Z*(1455k$U|L8UO0qX(PpTeESGf)s_G$?_!<At%38O)svN?Fc@4DNqlkxGG;Jws& -(A8{h3Bx&6$)~$lvGKN*R^G((?T>#<Q(xG`YVCb6&LkY**yLFjnSjWb5QxdkY?G%BFlg|*v>Qdc1cRh -RKUUV{bKR@hab;hoM*4j0Y-^5m-`0zTB+qvt6keRzv3VLE9xZKEY}Efkt}|=eDUJ^<@E&C>Zf1d>Ex> -?>6d?4CP4ikS67#>uFs!kmsi&pmoHx<CkqC@o=d<6B`RJ5N9*C7D9V=KRAMv{$}yU(CG1ln9!3*1nt> -IKX0|YuRb_oQ!NUV^m(8Psisc~#D4}XTH;wx+3j+Lp6p^mhd^^^KN1vJRVBZfrAto1|pXAknA2ksDci -Bu~-jp?0$I*<etK-}pnDoS$%!Sq&7(BSKsPp5@KD4UStthgc)a{%-WIL{R0&u~!pD;VgTFGuO;At%id -<l(bY@=Y-f1k2b>-w2}AF*&-$s0aDjhtD&+MQs_Lg;qM!1BR~**&j1F~dvt?ELjLG9*_?idbwb6_c#2 -*(5wHu_(lrjU9f4eq8gtSTnSDq0U~)8eYJEh0ZXL*a6G4c_Tq4ej0WSpgaxd#b?hk;I0{2RhIL7CkQ6 -l5GBYrS0<iE`(Tn1uM2i8MO92hRz@38gR!IwqO<`C`JOqUHaK?0+Z_Y-fTJ?G9j}nan5cw}5$D2EM>G -t><nZYg&+quHcutTJa<4QXaH+~$*bms9T$QA};p!2t)vsAOuSz!%0a^WSCb@H&D}`L}+5ir?bK3#<7h -49-16yKqKB&H*H;PxFH=)2XdF}W6apeWuyBV=Zlj$4$`vXF_ou_}xt&@$FnxScI`Zak8rg432Oj=w;# -&<Gd(h1v_nuL1l7%teII3A=b7+1F)f^FDIOlWBtSoY(IF{+GA8IwP_+^`<#+37tgaGw5g?Y+bPy9kzm -@CIO_?)I<*ghU$wS9THaeij_P9Z@nsxDjeiFX;U}olUrBSqVvmD4W2FU@QEy4!Dj88b6qIbpH$Gb79U -28u|Ojkn-W8e@uGyg3KTaO6erpL^Ms1fH@cJ9#Nx@JFlCnY}d9dTvM?5mvo9W?@B-gT!VucB?BC9rCJ -PJt0kMlFz##x>>gi7E;H%%fyYOV5g7*lgR2WCP^yuAf>|Y?_m->n>}fK_M42)J*N;!YmAAE2Xxn?^N{ -<5TyRre#yA=-sTwtok_(*yEyx*Kpv&5OSG&ZUzPYn{%F#SxR4|7(Kp$x}h2N+ta!NwxXe`eP^h+a8I3 -)NkP>51h^K*e6){*lZRt8?p<eXUB#sVNAIOlE6S3xPhjzOFG6w`5)1_&`7bv9QYO>l=jK@q5glOl-Fz -Z;2XLKpu|=lXZeIcp!EpK%L9Rlt-<N*TJeOyQKW!R-C5F_WVed7HEV#@TO~#wu$;=ZN;>pg=Dq-EP08 -Vk@*pMf&WK2r<xDACu$QCc<y1>VaBqK;yRZ1U;<?WmJ&MlidXGUcDGQHbP9yb=_rVjkT@7&G}B#!2RB -h9W=HUNiQts%3LG+<X=EIk%tXS6e1AQg?<Z2Z4@^c$RGz6=+Xq3?lI6zPyfM&cpsKPe%-LM6Oh5qV=b -#sj*@(td%&2xWGez$Jv_GQ(68fzx8EmoUz4!_HVD$jWV$WO3(Mnby*r5as!X_GK3s!VgW4nfjBj8tz@ -nP9Xy4Is^bq0#`fe&9$c5wW=jArcw#ks`SJ4c<~3x(kcPLf;6{=!z@tl4*K_H7c1bfrpg4Di8k((lr5 -*QTk0K?c2}5WE86pup|wGM9yb90A7%p*?|^so*Vza}^-0mR-C3)6%d7)8JfLzc;43LLpYPu1PqnfDBl -u)0!<#o)}kA;ER~E(K^91Q0v5C17)SpC0QTPVbSFmn!$ghCwNGf><iY{SIg6UiHZyAQ~?nh#?^8rdw7 -maZD3P)5K7!;xJ~R8Uus#Asd%NOZYbNM9DwEAf!LsQ(WCp>xJU_`96OQUx$aSBT*Vw1SH6<M4M_rH0A -De&FLXrSVEh;!VjU6|OAh>u{qkE>P|?|O?$k)9%$R);%b_4^X_ggb-ews^sc7Ua!o82N2kaOSqu?Q;$ -D2F)rD!vze2CWQ-Em-F>*)eBt^wQ@pSg$r;2SU=R}#VV@Z{hP4|1?=TaBzwRK`~N&X)eKS)mWBxeh3V -qeFZjUVmTrj@?-Qu_SN5ejgQW!##<8V{(5&A<ly5^~7dH<UV?jY%keGsp*2f-==6@Dl-@))6F0V#2B$ -hpiyB!bWRXLg6<+%!(JAIzq7%1;|@MfKVb7?$YaS6L?1~l4ahjuAAmYVLIPvh4-Q54{o_;%uJWC4F(o -l?Pq4(})Rv(mm&O1F`&izaB%v7`*ze}V3H$zdH-IF9W|o6YX4%JxWp~`XE4yr<PLKw(>_{R{eNv*&kV -fhhpHh;-y%eQFVS4>di*<eZ>~h22?2g212d4ZX@Hohh5cF+M{pGi0`GG;zPFE)fQB{BSgnZF9(NURX+ -cyawZvxD@_{iQqCaSuppc!EJo^1sf9W_Gb6eAe+Tu&+WVgYElg|hI#RWa@7wtw6&Fx_7sc(5IH>ub?k -ZAFIxT5MRwy7lA!e=MN8F-!3w-X8p&oSqW)sl!IGq5c)vk2IG^<{04%V`VOqP@yMda&*F=i@=mU>jc& -s`Ht7Oc&}F5E=MDE*-CZ9qkStu+Yq2zFv%%;l>}TxO!4|?&uZz(_&h#&zZHYoFh15?c)#*_+JnEJuE7 -a$t&ToVgA?>Xss9rVb~VKJa$Abx^Yqu_|9@%EpI2kG*)yb{)pUasA-o^a@|SU#Zz<hR679i;MFIZ$%Z -u$EPOoj1h1Yzm$-`|jV#VE|A}3fGe1vpkc?MUf`ge#Ryr_%SB<`5S{?2xonV(<$^TqiFP2wOsNDg3ga -AGD?x)Y*dKsmp2JzFh1m5TudI~OeB`ZSR9arBf%!MJh=7yg*r6Y%vwE2nO{(g>V7Aug%(YYwY6OvX?r -1SN#48r(a-(fDs)MI-|PhN-NTnDaGVZVW3DyUN;d6%#<!TUhZ>YN!?_Nhaf?pc8Qte#$I*HKcInMY9< -2<IDg;%%olQi2)#BS-~}B?x@b~iA>)@Pg0%(o+BRKTu)QfBF7JJOwsE7V5G#=$(JW<Mi<}=9uq2!@YS -Euqooqtf1m44`F8jB2mpl<*}T18Lc6W$gze7zbZ|5m)+u9eY*Y5Y;q(B&=KCMw()N{W|Lso__A%B}y5 -ay5Pt7Tw8tJ~5%GI4vrfNFu%6v!ldM=gf8q6g(N3&WQH6mMiC#da#0@&WwlG$b#t>I%--y$(cZ#QO~T -39$jnTDpKQjLaEx_Qyqh+8dBmkD!7@dV7oTTQ$0$nlM|VNIRr#jfYSmypfs>*&4(gfyOu6yV(8-}`$+ -V+K)!b`vS@mAm({Cj-=k>mCQe%QU_tOn;Pco1KPT<P|T#7)8}s%d;0Pi(nhFEzcpBm*kw|JB6>N`&E9 -wA|glY2oc#~HSfD44r$eE+O|TGYXf7I==%rXA6<{a3ryWz2#44qsJ+$%-d}@xgP%ATIVj#(GStgMUOS -NBP&5Crn6YX9{f5er@JfqnyJmZR8`zY&Dxd$PY=z*#77>fS+e>s8p&6NRYb(=th~8%Y2GiQLSixXXV3 -20{ZfP3S=-m)??@QU4>oT@765_G1hJC}>?3(fJ0y2SEa1DsKHh4Lqwfs(yT9KkDNPKEm+Sp?p1{zgD{ -Gf>JI>X^jLM;w7)dz!5x?i_V0$LX2w$A?Uoe2Z|hjA$sSNSdsvjK&V0dr;o<rhRDNDkWTiK3zTI*SoL -DhrBiH6maIg@6EVgfBx*oHoX5yBQae`s<AFXU^UeDu*a!gODRMMjmg4`;CKRzu0K29to*-x8|jsHkRO -R&@~(DB*lc-7!&Y8qT<#xT}spJ-C|bdpQJ>)g6RXnv8aFo4r)FqZuu6!`v4bAtq(tPzaIzx*C;}0Uv* -(Wl3-%rv`6C!v73F8*VtVS>|S>_tL4&QB}2GCuTi---orVQFbepcZx#kh0O0USnmmg^9!DytVF7<iB$ -rtAW4pj?$xGRajXj;hted39DV9l?d?97jd3<}?vl#U3?O?y6g_!N%m!Yh^h8z#kN4h;=tatyVNAT5jT -!B`6e^YP<Vp_tkLn_`reV@b!<>9v^<4;5W15ir?1QY-O00;n48F5U3ZB@hfEdT(QwEzGX0001RX>c!c -WpOWZWpQ6=ZgX^DY-}!YdF6d;liS9%;CKBB?C5F%MkMs8#9K8ElXxxZMs@vAN%r;bN)s3)n=`lq0R#Y -NMEm-`-}C5qH%N}-)Na+H5}5;ZpMIS_?>@cl+g(x=+x@ujMNuTxu50@-DOW>V??+Ma-wz(h_jP-HT{Y -M0&vsD1dZB&|H~X=w^<M{FWE8t@Th+SY*q3XuD%T&?i@UOK0JyI3Q^n;UY_XG@Y8VmnkQmVGw%JzK-u -E2;RfX0!WpgcxzHLV?CU#|2=Uv$kqF04p39)%YZ)96t)#b&lXf~}b(|x=ydNH*7el3Q1GE|>}q5yUMv -Bde&UF^iV+E$_;jug&!W&aV1s7hbcpT{cn;_v&a7dz36y4LIFwydkoTk~n2SbrP?=gjK5Y}%$;1FWA! -(Ud!JtmZ9ryJ{O%_uu)?c|y~hlmq`LWU&wu%woQ4Z-r@{7POOVp{5>c+}#LKTdT8fcU?KEYE3y-x1t! -vex6*55q@myYBf)Oc>T?bZ-01as%_f4rf$oPs#p!hzOUyA{8Nl=0U&R%_u~!zMPHyq*{^R9JRze7B|f -c1H^Q)V=d%Y1Jg=K!EbF?&PcQqvg)V&$XzjmzFf*X)c3nmwt*WNz4)dhnH@Gi~eX|jLaa;A{zN|%aJ5 -S!cep9@7`PIwsUKU?}@%G<dzAaw8{_5p7Uwr*?PPO+ijZRC>QgbV?Z@RiX$g%gku@_<vYxj}f6yg)?D -?oVMsQa$iR6Wg!8qlg1^iF{q3)$>YjQ~cy!M_T|8{9qO`nssAhMVBJfN^y(>{ngi!Ulsfy(l-uC_are -@AKqU`BA*0U&Ri77OQ<#Z@53A8IXGEejp0S4vLM!zIoEL{f_aP$I6`>3Y`8Lr^%bA{H7dk3~v6F{_@L -gMAr*mK2`9oK%CyZZr)Vgv!_2WRrBjfN~#eN*0vd;D?!0QjQehE+j`(3s~YcKe)s*G@4o%^t9Qk_zrO -z3uePsL!L}2y0A1BIHdO%{g8v7kk~5`>Yh--`lk`qll;d`-=K_A3_p~?F7aV#)Z)n|MA%Ebl`v6A_G< -T_(NDj;N6}`&}qBKPTO8~v?%drJ=xU|S;{!abO3tb}rC=NpgbslWQHo@Irb%3wHSB4B%cy>wHumecF0 -4h7KZ?Zo9Tb4hbWgp(Z|J#SFtH&R%X8)4%mY-2+t`AkdX&XUrs%^4kNchmEXxc)T+vV4NyYI4RGhHV5 -_FTfQ2XO=vzIZ^Ndsy?n@k-1kTs_`$E7WlLKXSmbHXu&saIM_b;0m*33k;5a0s>0#IG^jf90o<nEH09 -@tN#$|5!&JXj@^KrR*glG4Wi!SuKoKQsQ69{1>y%VN@^ST<`QQV2C=C|Bpb_DB}~U$PltYxFvzmyPyn -frC6j%(DMzvVuHVP1bqC}LfO1?Qkz7?msz9EB${Pi%Wzx-GLtu=+>vDY~Bmm${fM8|Sj0|FC77|CE>s -8DQ9suT41MQ|}Ei#%K<amgvK+eZQCk6`)K4X8l40;0<0j|9a@Mh)|V`dZ)0zzoesdmT_wScsAxb6TgE -QU|H*%Z6s8XCWNjj~_+ae&qN2%MczGf!T$NFK+8m_+jDivWtKp}BOK%4U+X*#H>^`La1=t!kXGkpI$q -dv>x%OPE`RmC&GdUFa74b!hj=PLxfuT*f<QZ^d{MT0qUW$T>#XI_qo}E>Bs3uoJNTEDHTXE>U91aF<E -?Xh=UakA{onQNnm4dogpHb1}`K07%dE26oCb`oO>LYqLq=tNFt(q_Ca}sXyF8W{V@u)_-{WLvDL0qJD -b)EUZljrL4c)a!4PrA^hF;6|j=BF62x6k6W5a2z=rn_TJQTH{%iR^UH9$RjH*aZ^(RrLtX`i@whhp)* -CU(K~=M5!PDkB_&iL$yMeCVwDo34Mwk<qn7^oyj;!`1c`#kZL5*0)LM{s&d?;%as}4zd3tAAafk(v#z -~2Gb?50>9j`Zg@=?=>Jb+rZ+=B|R#gWds9LEln>8_8!1<Yj=DT(_XQVNV50BV~U`SY}cZwm1K%k{UrW -1oQm>-5A?s0J0)z(ARalDr@K(2z~JKfM_Z|`Ot=&c3*ESXgB4pNLE5L$r@Gxm{Fd52@G`I_6SVYR6Pa -aHQuzF-0N|*5rFMSx{S<^Ctm1{Cc6S{OCGxMrjy?SF#chI0|5{xfS{J!5!PqeuTenX?(4+XYFvQwOF@ -Oj24*pwTTjkR+HInRQE&B=3|U0i4nu{*>D#(Sx;*nnVbu<r!xq%slu0eFtFhYQpf~LTF%LNMqHPvN90 -uVZ{@;P{4B!@t$ggt?+;A9Rxf9fD5~J6!-l<=Bizk~Q)lxUJOh}yYMgmGRDp902#fyw(k7`Z?2beHQ) -pV&O9pd})ClapY=U?0!T7E)FRQ)~|6F>(7rJWJCJ+kY$B`Qpd!~^qiM~Z66QcG=I;x8nY^1jgWC-SU9 -A$qp12P0t?o-isUIjB|c>#+bGW=i~{=cvdSN{ACsj>wH#fkNf)lTx6*LKddWpk74g2_^j(pkMVpkO5K -{(7K`r?@ENuBv@m1#8Uta;%M2A1JcnfMV0L`^@J~nzgw1)41QZmPsk1JdW53-Gw=-*DC!~O0ZwQP=4W -hrwI(s45wIqK^GQ98m9SRF{EQXU$e@123MmYk-g2>8HYQoWEin$@_=`U&v%t(wNQfSYnY|jMFhbQ+8x -3aE!!z1({vzI6>AIJ`b#Za=B{5KtXPStX${VYcy}G-p);Gzny1p5a0hZRNEmNss=+N*8&7y54CEE*7# -&n+G&R~GRiN1gPRc?3ZUR#>9LNqQC?t6QU#l!+Nvt^Qgo}@?imsd8mTd=-?T7?a{b$KX8RK>sZp{uJg -Ggarwvst7?OBN<ww)2!CXdZD>774X11I6K6@j<#3*fuV^I2<EB6OG_F^>Dquv!dh_mvXsMn9+hrlux} -VR|EY`D`_A}ZNvfP8kWw(1__5q7=1o6;BKB+`#!LR`75M{Pz`|lSvNyXCCbAx&s;!L2%A98p<y0*I-4 -oekk=aGLufUIR^vMOy;N#^E?(&U`>0pM(P}ME&~$8V=p-}=XjoWx+wPl9j`}$HKw{-WOMtyxmJ<Pn=~ --)PUUl2C5S<G-b7rX~OH%V>OwFYmZF;g&n^wYfIfflW=Rou(Eh3!;goQzX7Chf%1xlv`q2#xkNn4{G( -*dP<G~g%fCLo6ZU?-He_ZR|nXYFC~SHO7GCPYo{BLaY=eem}RR?Y|DO-MVIJnU3z_OL5(8M8k9kblUZ -0H>hRC~$<UWDhGk6ZTk75*=!YHuua!u!qc0X++V%0P<0Zu!~%A$yR%ALZQTrw02;*YI~9;iweGyMJ8; -Q7mtSJQku7@fn4!s{4E_c{vL^Of`@3;CagrjppKB5dwmUzx4cGt&S?Y<V+JB6+7zHA)JP)G?kZ5hRst -m#lqJ%AgB{zXQRT%Q6HN^oa8%PaVwN@l<HtBcz8NUZp?-faCC-S{feoJIVEo5e#pQp`6Lo#T_8wB~JT -79#gxhoF*r0LSGM;vIxfW=n5`CIHRz8i;H0sN|?8|`eNmquod!dKQkm@NoXoej7OnnWQthQH%m^>tpf -s(Mm_-IIBXXwJYO}ip$l`?*+vQA5k7mnniK0C&}X`?513>ZCk%k~dv0UYhSo(0Vr47~K`#qx@HMNfK2 -@NrDn9)L55$g%1<sW~*(U^S-(WX)P8*K>w57wMF8&Dl8Di!Oq6vSj+lM}st{UIJXB^FHeTgl)LHfo+5 -Zsc%J*E4S)gW9e+}TH|M?BVF6=al4Z#U3&AjsK)f@dAsh*jhHK{R<LK>)yZCx7ak~WIZ7iNq9gJPP`g -N;B1aEW;<+q^LZKA3%+CC#9VHZl)VuNkV_;%UIGZf6jqkZ%2!)hH;>n}sFtDkxW&YN7LaW)=TW@q&fn -AB4wn@iiKd_ybIi#d+z&lF(Kz|zfnaaR0%lfW73}l2JSxl)9b2bETs_hn76Ld^A2SaYC0rHz`P%30aY -?xSJ3DzzL(F5z0W8NcxzP(GfG!Y0Bl-_~7-nJ$3)xJlTxNDIsa<64?6PWQ1=plCrdWi8RBNPQ?80LOW -nlXhOZT4n{fd`Y^v}<8Nm9$-t)y{6y){q@q1v5P1b&--1BVdmIDXg`W=qb@MBt4ER$)a@H|LCr?+kT5 -yc+1D+_>}w(2F>L>r~E3@MdiM8l{ndD-Qa&)9^)8Nyx)k`{yIy)AJ9T!FCfdfNVVq%jNIUV>3VdJjt9 -NnwM;TWcoa{|jqox731mqMF4_2yVA<a?Fz6roc3vkXnn$oOB2I}h2jzN9qy%W~##a=WQ0_XE=?5UB3u -#neE}!MkaZMS_=g!AJ$#1a4aqKe@C2H+L*-TDA1`=&%%Fj^pe->4e8xStCYQ(8D#b>$lM<XlE(&ZAC1 -^!*8GmGdNZZj=&#CM78rEB@0lt=zQ=E;jcp&WP?FLpg}lE`RZTV!>7m){Yqtl3mvrSq5kA@NU}rQKGg -jK!esWUQE%#3tBMvvoKk1CskihfpYYaB=|kYG{)?A$^np6uWC6dw{+Le8B)k?aF4Aiueb-1{F`F%(cn -m?^Y(>@d?EM9LR(t)T{FjRW<g$4cyF=5&Bo69bh=@h>o(!7k$LQnulb)A4U%eAM&yeNjB`EDAaEDyY4 -W{lkb3&Vy|UTAqyg`aF#WPXt{vM(}k-mEN3mDU);s4w0ML^I33`v3Y5-wA2;|rOBVzH2}oCUi`3l(kr -0uHn>fTbeC~snN@ffV$!g1zMX+w~fD#_FRQgpcz4_Ja|Mm6D%jEUIdONJ?N{r}hB()9^MxrIIi0<m2l -kDc2c>C(7-h$Q$<TD^|I)u=+sBv^_7Te?axGa~P4#;(lvw)bbsqIwu!c?<JF**IJH~-OAO=iWlvb11S -h4==Eu-&g)*cVa!!(fIOhCI>y-ZeoWA4U#qlO5PK=naokp4oho^h^?+eS;DEcSJD~MM#kCTgx1f1EMo ->0+~p0z=v5JL<keP;g8r7HYlzI{?|73fdY{MZ9qk4tan0mB*j8_qZ?vk<aO2larxJBj-KEe`V}a3q8} -Y5q3T7;Ol@eVj5jOB_GHJRERO>`Czz%YcLBTz9tRzAwyw8rZJ6H9J==qjexdPFX@?A*Eg+u*<q_q8_> -Ymz$g7YDfhJTndl8z(J$s4ML(4y8(-j9s3R@RRjOr7p{L-X=?E*L*%0#p$ApLW<eR~yW^CNvTkgT8@I ->|!^G#o&4XEA4|(7-P2l|2#76h;>wffbFVn^0MhI{hXRw|r;LpTr`rb!(cw&ZgBebWj!DfjCB7Gjq5_ -$or>aCXCifbWs}+hy6;EEN#n14@#Pz?4{pBo3dE_NG`r<WmpH2M-pS%8-OK^DZvkZR;Q@+2?%29?ca? -LU&TFBLE7PgUK2eGlBEV{I*YG24ameBzhOF{;<ilv+;t_!^_zP|6;rU48nVwVe;t{-_>v+3$t@bpD$C -0zWQ&yZ&_Q~k#xCP4^op85y<9~x%kg@Gs<mYqfh>8L(3vsE+5>aTXY08B-W<l8wt0?c7eQ1m3KipsBg -8nzrdqcf*9Hzs?3@4noY3D<cDXgya_PVk>bQOkl<BbgnTrOS$Uqsvqby{#BfW&)qX%{t`WsYbBh}f;( -|P+TAX#B}$25b%Cw<E&$`UoT2{~CW9}P1te$gg1Tqxq!b=JzVZ_T|$SHHrI@f-J2`BKj7Dp}>G@ROp7 -&6%vs$A)!Zbr=%w9l}yx9KFhRr4^8mV!gw-#`lOb;*(hKNuvTJU#!t;M_{jf3g$#bhNMNqeGGsv7K^4 -`VC?8(y}iD0VQCi0y)YG%_o@1pUU{VG2Q+S@{kxO#04NeKc=8eD6Qv)w?P%=bBRXM2yMrVdxNns26|K -}GXi5#OW!YE(;Ls4-sP|~<^bHt&3lp~sT=hpZRW$=NZ1!a0Qg~AorQUktTorzjWTBR>W+@G$8_apd%! -V8(7<M;Z5M+Ft`YpLb@lI5R8_Yq6$9`ksE?VDhmf>i_&34n?;R)P!KTe(TTDQ9$kl|t@hV?S-h?JXcu -2IqT5+h}g`(a({rE}((mj{J1qOY^}7xIwu#TCfI@^{3X*>-fsXn78AS7p7z*5Mo5Lmjf!3r3{(!50n1 -?*BJHVlS@ZQ8sNCe?L75Vfm}m)};wM#L;j(F_xQhEDLG;367bE3&jHsExz%ZTC_$liqqPpC*^3M)UV) -?6OmFWY{1Qa4fITPi|h3*9g?95c{E^z+9y1<)=z<Xh({qwA7mMQ$R}d0CK<CkFV>d;Oh}3*u-SoV*{T -d(gOA#qEaQkmrR%)V1e*vrK?pbHP^g|{k!I8rQ{k-lAz)M<Lcr(BXR3m-cQ`6)1YF!WIWeBtSO~e6-q -HC;L$WRwk1Uz?M;%=<PvMTLP^TF(G92xS3uh3YIMJ0A{}EQK1~)LA8fKg9v;a9C$um6+8<Zze&}a19k -bDFU409<sRiw+`mGwt%Gal86b;(ND;Hmo@eo{m6!m_urJT^964j(L$vuP`fN+9?=OkR)Z$`naU@dm)Y -fgHBm<i{Ve{*OPR>V$rv9f-4|FRK|S7!fjzsBPA0NJEfFU<qhNnMV>SJofD#gLWt2WbcGXZpN`2E}uN -P21$LtLT}-d?$DJ_V7;Go`?`Me`_G=|@$pzQiXFm%Pn|dB247J82M2m$t+F}LNiKE{IpMP=JI4`t@U` -mOCK_C*9t_bwx^(y`?5`!MI9b82L|aB<C2W;d)sRR@;#fp%^`BYN_GfqTSNHI&8u-{lc}JQQI%iTg6r -i>>9ms4yXN>y@vfy*pro!i8@<lzgGQ3El7Y6a{ui?J}rfae$MUay+vP@DenkEvd)r%qh4LYgG8pcnGW -|O^-BhTqMV{m5UVe?mEHHVIFslpbEoA)qoAjHi^ojEYH{px{Fv?-8Z)r?33_c>*dek1kWC(2q{3F#wn -qyC7NTb%QRY$Zhq-OYLOA=D7gY5OA9wx>12oZJcan(x>z1~eDrq9{y^+}>Ta{>c8VwyVXhsPTKwJ~9s -)5^PZpReeA;9_y^hLb{dCTMW1(>maNn#^V~lJRY#}p_MWL$r_J-j%B|hOCtsh0ydLNWZ!q~V8@loWyU -}qJ%6+0Psy_*3>u`2KB9!-^HCg@b-7z@%H-2!@(Fm#9#fu}(=W5+akQd|%&$j0B!d=4zdC<Hl9@a`g% -fdyhU+DE7J7L9^y;`*IRY}k6N&=;7`H^CifhuOS*o5CIbHdd#O3tOzy0gt^*67+O#=xRzei1hlPVc*K -Lw8i4mqN<iul2(TS3&aE8be2n@t%kyL<~H&S-?vAL31Mm#=F;$xKe59iliC1MF0wDe#gL5XmFecv9qj -mjCY0vkzC(9+uE!5qAc~y&G1np@ztWrjSCmj0>HDenPQPdEb_SWg(THEL)W2SToUfv_}*eKCBffbx#~ -Y#T1AI(2qw0pI?$wgXBXsHfbQ9FdK)7#3s<?-uCTxYz$>Oj_C$W7uB&<rHneK>CeS@vv85K&(Xoer@} -%a&JSUZoU@kLu8^S9F>F^+)Y^I&(RzGtF1{=qtSl2#^a3b<#X%h-dF8D)+93}7CgQZ(Hy@k!uDO`<3Q -V|5U5b1p5<_RRiG4icw22-n^8^0gp+dE$IGaJriLm2U7LPN!m_APR)>7w1=E=pX+~5hh%j8jiF?saFU -O;Z~Xn4x)njB}8t-wE`B99hBZ=5s5=mrH@4oahHi?mF>$s{m`bI5OQC!k_sz^Lj@<6*!x;cF-)Sg>*~ -6Kte2EE6^q@d<sc(@;VPa^0TJBkEuJeFFdmNl1!TpfuIDb%L{%WJF756a*gB2Jz4eM^_VUZ*G;8L~iS -HKeh#B<m`8`L-_i)PUS*Epp&>|z3=gi1Bi%B$_}hHyXir!P^>o~&4S_v0_7G3R8mmLNYL{M1FFyFlYI -mK8Y%L}AMO7B_@g?$VF7<DI3RQcolDeW6b7t>+3v>y(<_j11D$kTFSgYufVR+3=&XgFD<(atjG$pa>H -oHhPjWJbmT3sGNwOY9D$Em*yBn3n$5<2+O9ID5WIw&kNQ9YU7AEmbbe-%C4TNX?v8c8(!Kd%xWZfu|x -bz6E)>z>3s=0j_TWl^gB9ak$%G*GC!!lwW#(+eQ54Tf5J#Z>2k=f1onc=7Sfi)6J?R212HXaR1l1@xV -v!(#C^wGe~YOb-$Mv6y6gd<T0K@Ew2v9hJwk3rL89E@i?o`DFrNsO}FGi0W<YOEZ)KHmK5IVuNv9IWC -)Q0UCtl>G)UeT7k$`EM~@zu}Y+OU7C<FmM?pv|<!8c!|n%+Z8JJEhfUV)8L*cZUXE<R`~hpFUIg8<A~ -hpcEix1n@ZQ?O(305g_pNN>qs&La>-Myn?|ACGw3-53?vX;P>3&Uwh6H1M<?*s9)3x%oXtyR?BN2omE -+iRQw4PWwxUysDfR;d3iLZTu|b9(VdFs6d$c}mS~PQDFnOu5j5-Iz{<-SY;0G-~1je<~IlktY+=b%Gi -HqzV#%FjPo}06|w7rosf0A)homq^Vx8g^SB;AVCokSqteECpq?|T73W07yc=}DQ{;)yOfzX8(Ygu969 -?xVciY^HEZP9S}CJbtN0s0Fd{eEc-}Nv!bMwpMyU+7WDu1bB|4Z_=6>Z-|9kOpO$<QG1lJJTj9lImR1 -jKIYyK;<nfL+t_4>*<tiC3_3qik^xR1-DT7B3Yg?auTr~)4Iq;_E*2QGQ;UV%01LDq_YEF@UF^yRcGB -j_V$q8=Y)!=;eQ;acYo5FvU;Ys=jBJ%t3m>mWmNVGcCNud|eSCCjO%@%TnS>Sqn@&CJG%?{u)MG7x#3 -TB~!$$DwIL=`5dldKm$#jr=8Wb!R5wcDhbIe$-&e{?N(M_1SGuD3uqfeDi9w#YBnEr}d>t9#R32)Mv? -J_@i=G6TdWC4pvSKr%`RT<~EGUy}&31UVzC(1_}F`KBo_DBI>T~)9ikA>{6Wx}_H=+nFU98C<|UZ`{} -#2-la*-v#?b(30+K%;{?UD=NnQWTF3%gXtM5{!&BG!zu0x%!U@jZ^%}UAWlNYQ*;VyH9Ye)0ukRK<^R -da8RaRuRMona?Z7JeFMs-;pY^8qM|aTmwl))8y-yDZ5bTsta6cCvEhrS`Dg2A&lcU`dHxv!Ol}A7bMJ -gVkGY3R7)_NmM47c&dtb<Y<ko%v>}tAt7g87XhYX?cpiSqkiajYdwvdhG&{%pBO|VOu-$#&Q^Cy(3#v -8kjLHCjx@q-i_UEJb;HCE#E)eX68%ph%Kh$+BROUeY-!+1~f^Ko2$PkfXi@d2-_2xL!~svgDQA=%!<Q -)?9+Eb}OOPtrn}GuzUM+YKeKoT=1*QCDo{f?6gXp2Q4uFF{Nv`S#IZ@}co&G@Do(szJ1gMhm7HDZ}hW -wtL|O@g3PfXOJpyQjcuFb9Rsq?f=#$^5*1-ef5M-1}zkH?)#>_b2L24zOzWaM6=oDqz7i4?#e?-W@0f -pj`kmx>W6P_@uXE*iWNaFpo1?thodPHZhCoQL5Y02rV4tSs%!PfzS(DrI^csB56Ls<vc^3`V7Ib&f&! -lyQoEjUhM-PU%tGM|#v?C=nwCuO)dWd&t8z@k<;Ij}Z7quP)>t%Sf8b3Y)kVxHrdSlZN)~4&g`1vit2 -oGdb+yBQyy4;!Q<bFiWah%)d%5@y2z^0U{;u4LFX@F03;5mdB-mM`Hqqa07j8Orvr`smBL(Xnk$E{r_ -b4q0wTQDT-SAoJEya|9fQjsFS?|d@AR$$lZ{jQ%vIqCsG5DOZYw(%gIU$h9?!o7L^!BWS-UyHGp{a(B -@`oe6pe=SZhHqLq{b%$e-<3_Z#lXA&2RgK1bVLpINN=W0*D4CocAp)+S;4Ds9c7gFG8C>SF%mp(0gNR -7vcBdD=F!t7lBtVn2UR-i-YJ(9Mey29T^u>YsK<y$m#Xo%93ew=#%DX~Vh)O5F?w$09~-;OS9~Nf(uv -pyPTr#O9{X+<l@3`RnMfZEi$_ELQ`M!e%P>67bgR#F1;C=gb0)=#-R7}W6E?WuAjZ%ETM%@|kaKHdM8 -5n^=J%sqj#Ma5vTAnSP(HrwZdPFgMYfvJb&K$;oUQP*HcUZG-ZT+EP6wf0T4C_>9saYze@dTcR$Hs*F -xyomU^rMW_aYK}2w5FKcM(8d=vMjy-S6xGOy@@i64KCCM=d)APxNUO>C*<NH#-5A*6o%@z(xiVCAaDS -1ZcFuI+?d4sxD9;rkC(^c|Cwg;m83lE1QSi(%ekMsaY%|v&bizfqpHXIs3;&9k(8AX_#|)y>I@1s*a? -;0JPgn!ew2DE<Szr)feBrd=U;FNLqUbU_bl)GVtTNV|35+YGZ+)X*)Pr<RPXEY?sq1Pw33;sC9GHC(J -S>XUsjSB!lFSob^#()qXg2>R5J?sO!1FLj%1#$heGSpLr|RwJ4hc7Os#+w_cesCXNk2QC=1cL0+qnWa -0oQ^N`WZ{BaCauAEN=x{(3!(@)P{zDWM~$K=^(sHi<{|HmKxFjYUl>nn7C^%(=3J8{7F-0IVQ_IZU#{ -lJ_JTpqc`cUrhsDTty4tb>Q~<(od8fX}h@Gxq}=TR@&Qt8jenW<FWa@znNvJEkOkSKd;5?+Lb{Wfs5x -EW2>0IBF&oU;LXbxE%D^J`3R60WbI<Z%_6=I?#gv*q$i?aIj_OG_GNoU)CKZ@9}JdED7yDyS$2(0t!I -+@$9n-b9YzhL`6GGUMB-(AydK2nUS{y^(vH_uHy-#di`R)dG`%RY3NfOlz6V(iu#ZU)U8zxKmSfeu8o -t{?xh8loI}ll;kX>i>jX?kmZo!u4-w*>yy;Qpk!ubi8?qtfs`J^;DYc$naxZ>~(**BsUDMTL+KlWBu` -az<ZfK@5eyW80G73=ry?lQ)r}J<VSCcVDMV9u+F;_bne&WtC0&=`(3h$Rb`kR3V{fS>zVa^~JM+WC%c -1}S|#qOF)90|!6%2%tZuEs;A?+o`(Qn*Or-F5A^DA$0G$sHNDGqv`Wi6^7b9wsm8U>@xyI$hgtRYWM| -Ig)-+W$o*b!fnt&IJOoL3b<2w4lr*BlP!D=C^DGD<4zVxV$K$nZ)GFu_{K)w@9Wk`^c`lf#|J0SO4n; -;bQY%xLEny0XN+l}B@UERqFe*fZ|tG8W+c_1h9L9J517Q=O4I7%CMM9KrI3H4DKbmlGQf7;TUw@v?Qs -ZRAqgUa=CKSvUKf{qWZ8X-tRc+&qrp%{J}dWPB)=?2;zSb6@`qwdpm0FXb$pbB=LNuo`Q7Bil>N2N$8 -8;GqW2+%@d=98#d%`yH+Q3P2DUJ@hfZupiRsc~5z5*>SqzkcywC8OX7ozRzeADjL^3J$oXpn~owmmT# -hn%z&&%JVo-^|J=%PIIrTlNaphrRD$u7LbjNPH+<m7$JA!N#=qOa~s1H1?sw8w5}AZJrzwQKoW>9Cs* -`4BAKLX<2Pd=bQA-=OX*N!J~PZ4gaHvK5Q%U`UD%a$@d%LrHT<pt=?EK8PSJacZ=#`imz%L3k8+y#nl --EMnf0gT>D($p_v3=G;pLit<!l({`9W8=q;9hOD)|DVuA-{gYeUjW@u@gbn!1P5}dPR}b<P($*$*V3| -qSP(9`O#;TK^5t9Nq8p%7Y)OmTvoTV`tmM5#PdQpD7#{{2!VVp@GNls0Z0nSWOr4zTwjd$eQI7MfV5R -~Y7OnjzNl*o`(m84FFmSXB^x}p1cEtxx#;#*g&w4gEl&qvVG`9x`H(N!77ZT>S5)8fWhGI|N8dMr~mM -+qDutpWVUOIziQ+X~dsbGj@0h$G7+zMsf@Z$A#|>n_io9db_OGvXu*=TT394Q@UW-aWCL9%M35POho6 -hom2xlpEI5Mh?6WcDfbVVi?sJc>eFrDUGT8C@buDV=sg&%GsH`I9VaN(zRwI)lj^~yBR$nkarbSnYgL -WLHO`fuTz+(bKiuOSe-M5Z2heA(Hr_IGQ7}vU%bh}YUdKKC*N5ezD&>+LkXzqOo#a*L*0edZ#U({zY3 -6XDDZUX*SdyMi8(aS<g}*fn+<t-OmCQmTuwU5PG^jtxHrkkmQ8QGBz@MB`Nko?Ga3Z~nVeVueuB7VXK -=;-AQ|e#Vs9lbwM#1+gXvO3CCn~yA~9>cGSa&V^~z1k@?KF2)R-1Vd-7)B%2D#PM>i%i`rW`hpC^w{q -;3OBM4L#S7ij@&q`Xc}z6NQpycaC4ldAQ;3KiV$AX8wR00x?@ENG!YD8<C;fd*`<I&;G+Ux9a;^@TZ8 ->nmfR6y4(G*W@Qqsjy)E0Y_yd5N-y3uMJHh%kd{i>BTpqg!Yd~KJ>V$Tg>@R<WTE+zoFEx7*%u%kn@< -a*>){!o+KTx2Vezv5GyG(b(Y*9dg&LPh%_Wr9<G*FB=_w1T+;Rf9Umhzt2yRIE-P{sx6KKX7&)34V~B -pTK+9G)?S=7A%=s#)Jfl8X`8?DeY*Xe($#f^ngv300rKf+}LSz<V<@^W+t22H{w?`9~eE3#sKS9XZCJ -Nt<oz3PG#%jkY6c}_=bh%PAqITSWy5UVzQjf;ayMiSWn|LmNe)@|(&MVpGRg|`Pz4BgTx9mpF&TH-~M -0a?*cM_1VgwlJBZR;vXCk<E=8IE1{A1y=q(W77PlYt$dt4I#7_{xUePbFG0*M~*lh;B$HA^NK_e-M=W -wJEios}zoztn|+G^F4%Q`xUD8PX2W#lLz0(s`C-S#?l!WT=WVlJYP5xN!)8Ekc=dCNI;nD+pe!*ch)E -FQ#y5RiyOHVn4%w&kZTV(o2e_NfILWc2BU#NX-A9g+wh>3&Ec**@X+r>dTVYMQg^D-)nqWGu*c**WpS -N`;Q>=2&mlXd+Jsbo%Y(|7WidF;69hxFojeRi`(CTj)oGem`hmUt&dzm`vv`$U*9;OXhbzAHQWFHzjx -B1?Va%H2p)^<7*lk3Dlp?ql$t@Bwz4B%9=9Hq=@=O>dP}&7;D&jy)IDt-t@!Jno4xD)ZylD#N5+B<&t -lr5xaNKEqVNK~b?f439;%DrOC@h&Q{!2N3E*LfPLMCiEvAXf0>wD+yFY%=ZK1<Q@1&Y7tomFwVIAQjR -V~A5TVpzp=4%3=NG-HE$R4=iI`oy@`)hTQGee#y#bMXTbGAj#@I*N-^M45x^6QUD`ZZ)tPW2i|fDLJ% -d4GgE@+Zi9pw4@i2a8>oVgLG1n%-tEEIOV3EbCPl0XI+E1i|Ad)=3?iGOOqpaY^iEi=uIqiV9pmgo5% -r*-k1=80|+7EwL-68hgr~_qKE{`aBsPVZrYvTLL;b!w5vTZCe$G!>@H&oinKjo>6!=JQc5~sI<mTbU! -7y8!WEsqh`KyNCgm;dq@^;Ku``C+GKZC$CM=kx=`8QrB=3Y^(cLO;z^U>kg}F}jRS`Z##pFU?s{>;Sq -_K;;3A75&XHTc7@wRI90s*)^n7w~`<)iiVoViFhIV>L~%#L5`Zn|aE_?PO(WTsR!Oyf1~O3Xfe3poap -k&Sq9-L{*A?|>)sgNZ;X2Ng5p7^?-4$Z|baw<trQ;g2Mxg#@u{H{x>z&w+)x3Q%G+@oV3|{R(v}x~V) -W*vh$IwXM8H-iayUMnDny`4>CdkzY$<GWL7oF=#dvqo1DB-V|7k3}-M2J<E}J(ybz8Z+DPWu^_4j9jD -ue3~Q4E2J*iW*2G%l`YV?J)&RAK#e#y0#BL=v8;%l+#ujnnI4o<B8i3briM99=x`wpbPp}Vr5V;l$T* -b29wIGXhLa1~!I*7?wmg@3)z>F0_XC@5SGgBCYToIE-?O^|`E6ki=DK6rZeydPpGo$RYyuJouK<G|(n -?EpfxGA4M|2<(Hl+nN_be-pfx~LPu%G>Ssn`;3h!`$33;dhuIjgYvkuVMEkKUk+}DB>Xb_ASCRYjjN` -k|_pFa2Kvi=q_<F=rZ|1&IgJQ_{ktcl0AfxE%Q8|$+n#B?5`UKEihQh{RSd$*LHiP?R1hno5gnp4z`e -kiN#vk`y$7CDlFry%(`ZnG+G{=5t0xgq4w1^I^w7|wzjF+J8^bw&$Anu9->wcyRzKZW2Q?>LFfI|O!+ -GGr@$k_`zEtM!n8b~ux4T~MF)rud^JPujJsh^);m%XQ8Sk1k}O$l#O*wJnm-2=7}rvUQkAs*2Sq_Cl= -4A8y*1h7!>J7@tu^0UkoD=`D5-V!=SytjKNlZ1`R```LQavtb1RjMI5zY3P<FB1Ze_<7s%N=17kKFq) -y%K^cHd?4q=}p)_%0`fZ~oG@NA;s1;YTh+al0ODQ3{4mhnENP`YXNC&R_}1VI|@LBItZ|)E1<WxF@U^ -9QbR$P;E%OrB7e1QSXA?VG}{q=y2OS#tTm_pFCOB<qiJ-FTJ>>8=+pc?W*kGugagU{=0pb>r#3r3Vx| -!<?k^lqM&|V>D8wnv^6m>mT9WIDD*4b0Q8*```Xh=uX%`$E%;&bdW#8yFf5Dnjo1v4XfoHDOG^e~09j -b*Eie9#5sX%z@$2y{`|$q#-#%PjJ^pY-$feW!B667tgV#mV7P@CU7jv9mt8dTwo2y6ofG|I@YR`?Ua7 -u;&^PW}SaYZ;)of}Vo?XA`qFU%G7`hszl<OQ$RN$|*()sl&v%VWBm)58fZ{UK;hg0J)eehIThw>*+Cf -r+M+{fiP#ku_3K>bJ?Mrh}At>b0-E$<-_1yv~tx_LSU3pWL9V+Lw07m7;1=GDhU~pp!VSE?Kjek-tZ+ -DB%j&?Suwhcg2Ixwgv8jj&|J84H_4iD99P?ERVrB<8*=3Kd(R5Mn(sUA|xu+G~Yz!U^u4uj!plg;S!^ -1JqR9FGg*PMk7ewwSKQj=>fuN?g$9`9T&A7Fq~><VEUJIMWNM3rth#`zCR5t!v}loZWt8=da;3$x*xo -w@8PAtBG7KSlj9zLxdwXQ%&!rx)6xxtkk-&#RaZJcT^eZWoQLVGI;kB*Fzkm6TIu^-lv=Sgmk$;W|KQ -gm<a$Sw^@69#*1NB!w^^apmoC98CW`zEfS<IO*yGiCjk5wqC5e1QCD$~4~D~kOqc48PX2^(PME9l{3q -56V%Fj4|K#8tb4L6`{oiR9g$Dj~c&0{0lC1dfAL$?N6)Zt~CJDvUZwk&s&n)%P9pXJJKJPOY#rA~_us -gfK$><iyz(E>AY;^xV3AoKxclBGf$T_<nVk5)O1|gV2S99J8rrzfqS`cR?kKBs~<9<0b5c{Tx}@4mBO -RG|5G7zLE0{_rXU7ufvk+dSbiX{~3`vNqhebP)h>@6aWAK2mnzTaZD23l6JEp005qb000sI003}la4& -LYaW8UZabI&~bS`jt%{^<A<F=9C_gCO%YEDv4(#EO#G<TC^<40vHvE#Bgv8y&y3P*$_W++l7sF9Ua{` ->U<0P&<W_FdJf{1{O{186k*jpn9n_hPl$9Q$J@S1VEN4{g_r;z_mjv6n0U{^rdF+pXKWmg~N18)X`na -#I}ZzO2?gx2byB^=(_*7VBM6HE;Bny4`N8W^2B-N<%(Whvn);Hf7tHeuwAns*|ccc5A7!tvdO`QL5gB -vu^i?qBjlXkB6cuk4kn!i?Tg6bz79C&9qXhO;yX)v8(3-zLZsG|9)93{u}<Y>f05--p${L?C01ViuE& -gnGGY#AJ_8WA#VD<QGHR@1wQ?}>)LKEeg`Z0i|iCUc~^I`D9^f)EXPI^;<HNiUG;QCSYNgM7wxer=i= -*5zEtf|{q9)R<!4pLql^OjeW7-GGWJi!fB(5TR84bvCLK^n+nxX1)!a)R54d3HDE_im;j>X-PQ$Oy{j -O~^ava3M{^P%^iV<b7tMT>?PzOwCFPnbo0$3WTb4n8^D|M)gGw&^a>jB^jiADiE&xM4E!0`aGn2V<E_ -C;O&LsIKm0C%~A1xgG4%StJr_utdQu&F)_rft=fFwYe{4I3gs6>ih@P6CP1JUd>ZS{(>OLsy_%(;WUB -o}YG7T0DJ+U*5dInaEB&nDe>Z%Kne^Y`R)C#U41r?9H1u>$*@%I7n5~_UZ4i-?RHSj7PZvW>Pg(zgkU -|tT*t3*-ZSpTs_OPf^j}R2G5a!!1I6pYXF2zLm-_5KGis|hUPCt4V)m;;o~sMN9gt_Ho!vQ4?wyD?9p -Atx@~&kTuQHGj+|{DL&m2*6c>n+JvOi~;P*Mt)PYpdT7j^7AJDybIELrT;&1>aIEBAw2{iHoA9xsdGT -V4EIn-J>ZvRdmx_Dn1@3^OvJ9RJa)I{8gDYl(H&*p;uz%C!3A7?YhyIm%2@$502!^9)8f8MEo%@F8hE -+)&rw^cLcF$a=F{`c+)cwj-&X`o63dUJDQep8}7_M+cO!KdIw0oI!Ze>uQZ3pnK{2^5}$YQ5y;e}E31 -GbLI@(ZGSDGpQN*Q!NGb7X|)a*X_w{;6j|F*dJ9dp5Rw(*0+FC5S06>ku)6#y1?^hFfxUKp!2$DCUEN -84w-9x7CR7WHTT5%9}nBED6yH6v*pO3TiM92=;48=0cE1yi0;@d`f4v>LP%7ySy#ZR^zf$&c*?OiOT^ -W}vPDsr72>%7q!DWZeCe5<+GAas?z`fJhLr#Y*vk{{Esgbb7G;ajfE<Aj6&)NzP&i;_r5Vf40a0B8t{ -RY(FA^3HG7VcIGgD$xwul<&(s|Q7Hn52n21*8R18JXLii&n^0!RS-EJULx3TQd)s`U<=84#sZRfnwy1 -S1vL^&_f)sQcr=8)<I0p{P}B_QC)S>7eTTX{PXRac_VOTYwWnnovMN0H{!HgVdPZ;@Jq9tf4OviK|x# -K2)eswTkv`XV+0YwXoBB*%xKe7fW;OGC~2F!VjoQ>1BmN!v7UGi~nGNiULqW+@SRA97r(yH_S~6-WFC -$KO?fIl`L_Fmh%*qk^*$6_xnRl*q0?~KLme?Bh7|^kyWe!+bcT*f8@_eUjPh&9?HiTj$W@3DtMbJ<?i -)Qn9LiT$-a1&t3tCko=y_E0RD@D6f@jl>;)%Tn2v-=gBD&UD32fknbv@<f6gZZ`bc<2gaYF*)dPY_OK -1HE7N_8-s!b)!6&&=oBY1^oxj@9v)TkiVH4aVB<(}ojy?6&aumS1>;tW{+Ky&zikf=TumS&tt-o01fe -wM%*HIsD=2<H!IC{xduU@p)q6Qhu(l^I1{KP@Bi48Q;lt|B&eI`k+g1g4&$wZx`GN9NqCX{?3>Yacdj -Hv9O?$1Bgtt@z^o_g{W~zw7&hx_|q23%h@OLi6qI;e06G0)KxC>N5!Xx1W6S$**j`1FYY{1LNr@;(_S -?A-O0xusrQqG-IK5DCSV`0N32s?Gtn$u_#MVt;7Ck5v&YroK7qcKCh5u)UyAvpUiw!kEgi=c&o6vzZq -r;G+8qSHUvdDGm_VT77_#kyK?(dI0H$ulG`nO-?Y=&Xj9lc+4U<;I{Tsrn+A++Ht?nnp&JYMXOeo7ZX -G^#<*Gg6bJWytWq-*Qnu7uahB$Lc)vfst<BQ;LT9bSD0<;C0Fpl-_E5t%Cx95ki+6L^?Y717WH0zS3? -hnErw<8M;lqRO~&WGdb3E9qoA=tQ1>OswrU^J8Ayh6*_JXD~I!ItqTF{r~CeKw$WKYZwpI1Q}}n(o9? -S1zV<khtZ#0AkWh(lU0%c6oL+dgXyN&CPw;{;5%p{N2~03P1N?Mil$Rtnbm@2E9OmRbMYqZv%Z74Dwp -A&B1I1c#1c_Q&;u91kJf!iuW6V%R=4jOiJwVBWZr_Xo9AJ>gCdd_br+^xCGQb-S+VPfVwDX0u8XUXDJ -V;=ds)_y7dn9Z?b(naKNUy$udMhcIiSd-NLjBcNgo85-l99Wd-&{IVWk1k4jlfvLN<*5cjY`<jEUYzX -yr^bLiwqZx|8JJ=uJAX@VZkwZ^Yl{cZgTMjof7OEs=k(5C^&oYv&?e%AdyoDY&UzKB$B0<JR?dv-F3P -Ykh_Xxg9J4$-nbV#9lJ69by)iA-(+q2M!a%e6pI+Q0oKnwy~{<-Z(}`Th6b-}`ii`xPG!0VYIO7YBg2 -FPgquvrL7y`{L}t10n%#@dPriL}Z@i1dl<*))9~}8J&YwZ)ptJx<d21Y8+tJ6#xVXXa`&C0Ol5GtrNT -Vlcm2_Z_W?i%KV1LDt|CsJNdI^<wHCB$nOv`dFT*6@;d|^8rla>A^|;Eo)5m8&((pxEDppMz)CLassQ -5vIAXnW-4+qR6}2Qc(Letc;Gw~u<ti9H^bjUQ(|~}K@51XA@b#f*=sxwy`nU#_SZ$6#iI!Fg@!{;emh -KLP4PiWmD#*H)MRPnPTCmK9ANY>|S*~<NigCaDO$Xr)?VK;LgJ2H}@&_*#{DWvII1#K#v#AHeu>7B`( -1r%~?*RG6r}JP%y2}R>0@4?JF^_l%-0#!4O`vurfy563KdK`NY;*dSq;RcVu&2U#;2#>rIM>vHlqVLy -_Ixs{cC&JR4t={m={u3PY3;iwR>(nOPc70O5*&_<k_`V}HSytJYFD~%E9gx_xr;#;*l?IIuISMl0F1$ -|N7wX2UF@IA0w3N}4?O0}x;@EmI*SaCiE-_IgsD$;RA=T+6M;X@F8iZjy~>|Ee>l)EXBcwuPhVO@u=w -fZzweZGzx<cDD_zIXRL#(-{_9D!8Fzx+L8}#6BdgWY#A@cEmJN=t$N|q2oH@8d%hDTz0~`bC%~5$ozK -s?W0?jGh`Xhe?k)>8T8Vi~`Huv@BcV+3(exXF+`Mp7Q8^bKprGwe9dWL_Y6bc>a<aTSML{^P{HgDEsq -%Vj5po9SfMcs2<pb7wIy%BpjSk(bon-)%<SJqe8BrrDia$C<Ub|Js-nzY&$J!dD>>frc-jAu93V4ZvL -$WrGO9DtH~R7q4-vajD2$;iZ)4qnKK>#vkU$mH1NMSs=y+9^r8bhSU!$V=!6IV3CG6N;6)fG`LP4LvN -(F?Ldb4%=*GhZ-jUj1=mSD(<NVDCFevgPr3Bya5;|z#~bP$<8-{Wb;yWFamAwzUZE1r<~EOdvJ(Lc-j -PjR_mg{UB|=#Wdaf(AAzHJ1BIkiDPnj9B4CZPCfDUhhmH|MG~WQk(4F*I5Dwz+>~aTM<Go4R3Phj}?x -|UNT9#(V?(gJCS!ona!wm@hOdR%Io{Fvkg>HKD9(5vA?J$t1VTcJv^f<~wz{R;eb_sLB`P}IJ!u8+Gq -xp{p{r$zz6lMW#IimYGFo|2(SU@vH#R<C@!vOij)*qfku&?p2D7fP7+^ult9g`Vg+nt<s1cwh3USRyN -Ir6|E_i5A#JphOtf3bRp*}k^P5Yu2E2`ywdMoA^H{YV>hrz~j;3sz4NR6b$`2LJ=2Yrnh^cS$HbD>Lz -^iDO5)tF`*AqwOXehPrO704KY7dT*c!Cp)-`tgqQ7n{#@Qq;!R8AeW3u?=GEpkffG}qFYQT668<-I&? -Y4>1|7a7QoV`E4Gxq;`Yp%O(rqGnQr>*xctjD@Z%8p>AQ1GX!1u;Hi1cy(9sw}^t$>)Ovs!7CH^4KM3 -xu9A{N7wki#~eLa#qQ0IVme)@=w{Y=g!&3R>uMxxE%x4?a`YPp=*o|5XRMt~M2B-T1(~AAjyapM2IHb -#%>=*S30*4eFF)YE%T!Oz+g3i1gvEo5i{&en8*!G(>kv+;^5_UT(X1Ikzaa-T6f=BF+6Hj`ipZ#spj) -t2v>}FP<=rPMVmtAPINsH$r^A+%D&01scs#EPj(TdK}eX{M$p~H0LI393LND5IFZF%LHu_G*7f%k|z{ -D@hR0<RO+}V&8d?UWbLE@8`X!Mq&glw0ew~Pd;$=tr0uZ*X{ohmGG7oz<M~YEDL*DL7w9Mcfy*7nG;W -avBqcBoGW9^2pK_W;Bz}nr!%2*w&@Z#ZIW(V?TjwGp_AvOG18qJxpOS6CUT}<JoyCAY-ZNC(Qhr|#Oy -vyA{t3babVuogyWUce^8y$<Hj`W-bRZ8@2N4Sc^SMR0K09!m_T*)`IIEeHDn_cg*_{kDouR_^HW&f!; -$q6hPfi#-2#Wk%FAzk31bZ>RXNna!FxsYx{xcBg81@`RGD3mwvEZ4_W@-Ft{l1h>N6_xSm3`03y|KIc -7RA8LcoJ^3=6MPOxeb0t$Mb|bxXX`-v!u6VU?}b|F>|>UpB7EqV4MKYk2b(HUt5q><q`z`_*AT)JGn` -KV$<PC0)vic<$5iA4iSpG&`lA6a_set>J)&8@fte=KMs8!uT=pV%Y#Q~r_Ds)BXsCmL?F*(SdF$z-Cv -DpbM@XSD`^SeTgaM;jitrBdn*0NV-C8FHC#2wsK9=7hYw_cMkGe8Lw_Fg4tn}qK+-{W{W*u}T*h*(vw -yDhVQNvEIZ!TZn^A&R&VtBI8jT+9Ef42Q0nH#TmdIQVJn+M{jA`_9q(!!hr0|lCo=S8`XvvA)!B1L!( -u{K5RTOueP6p|U`6M>TCrWd@VG<wA*ID4f2$&E@A*94uB+1hP_|Ch!kibmjYj$W8H#THHqvsw;(VRNB -$vnvl?!#@&vV-jQWq881fX!Kc1^f%_V8AAAwlQa?H(#{|2iC8|)4J<W2l5a)U>~GDlZ(cCaYP-mZ8lZ -6k8)40VgwP=FDce|&7o?Jk^gcz%*~sX`z4et6cyT6{c7kNB+c6V`jNC<`}fz}0g;C%V<~j%4JM7-(*g -2tNTNcP{}y#u%JJZ=nzU>6mUCeJ_<zLHE=4GZdqLAo`<d&d1Z@}7=lk}ssO5|Fywv2kEbzZOVa)#$Zy -ve%E4TFfg0vM><@Rk!=~0-gu3;&mgOQ}nQ!vGDP}|aBSJs)93cdfwH37jc417*g@z5Ys$o~K)C`5+x5 -ZkX>eL>C*mzf#QJjEgy22DW6nV8C_xq>TC77O&a8Mi22;6Rrs9_GbDkGRkyGTv3ytby<JBKDU|Fc)bH -#HyS?4+o1lnI84vAuAnMz`>$^cT_2OS}U#^u|%CVtImG&OMa^ex)yLEr0R2qH$i00{J%=Nf*sgo# -kxTd%iU$%;fa_9QThii<3X-L$F*<3r&yeS@6p-9jHHK#W@Tie4C69FhC74#M~3dmoNfH-O5Ndg5(lQ& -Ptw1o43=A;`@e<~D(ohW1``t!kwKY>tOV>%Jjc92dt!xBm6L2b9BhtAwjynI<<s24`I))aG3^O&} -2d#oi%xvEv9t^W|C<u4ehbq4{qM0|25qumHnB^y_qH5yB3)k-Gyf<H}87M)=$c5=WLBJWT1oZO?TR)P -P+56lPduFt4XfXCwsVwlF1b|>05Y45-IR;`qqQEk#PP%-oyIioy_;bY|BNpS#Zeu#@sF#A`Kp_0r74! -1m6f%&(&c_KT2M<Nz2?%$^MOQJ2;7%2>O75O52TMZkTwdt>?-{;*p8kS<FqoA30y)RBM=FQXCyQdyTi -Bi@tc~>viZ*T9Z?fE^_f8AV3RvfEI+#UQ*87-cjIht-VR+vW>eknmFaTQo^8jWd-x2ob*l(mfO|2P%6 -W_^lHktb`8LsWWQdDcg^5sWd}4#Q=S0E=J^r=UbpE=eXmNak6p*949*Qh$sSw_&CFSaVQU8wL&zU_8r -}&$c3R+Ir@DHU!v#ak$p;IBwwlNF^C!9%gjXZ^(wM^ZfwQRa(sH#q+sjVI%>#U%_lnnmO3}b}dd#vwI -nW^ouP9269VFXYI<DGxEviDjb}I7hG^XD=ht^yfB!oM;Bg3_!9$2oq5r>F4?anyrsZfTnDX{;Qm&M@g -i+n^39m9OgL<XugbcUcnI69h_fA4?~YqeQvgEmxda(5Jbeitw_qtvB%T^HUWa^Zkp$`te@fey9f);q$ -!OAMQNIgXA=>8vA|Ln>zR1>lLKH_LKAIxp?@QA0@y2z@7|OEE+)4zb{}%!+P7V`~#Is$S^}wZNu|Gl5 -Gu0Xdd2O=i}zx)5Fm%LEOQDuVgwt3PxL%eBi#U9=&G4^W@>&1#W7Qgb3d%ZLObKT9x5sz5~^{4E?r;o -d=mGfNdMR7;%aha*}^DT){%kO}~t3QxJ_w4@-En(a`Y*J%s_sQa*0x;fpIAab%fYWbeu?an%524+i{K -3X>c6)=u3nh#$s3ZH7a^D&-A-K`$fTHk2gZ)&Wpfaeh<rTHNj8oPD6up#7jOKXkp!SHi7#scEz6BgT; -j_|*+FkHxD^)l3oEVu{p*H@e%|6<rH+neNtfX9AOZShJlhM^15RBOC0trX~sWC{Y?L6O9<Fe`uKAPFG -*5+#rhs72j_n3xd%@v!LIMG3_0TbFdl^=jSp;&4PVS{Fhi0Kc;mTc7RqlyC+qmuzMk7Sj_S!A5f*dcD -cR*Num5A{E**#7K3{kj$7p7BS;|t81>M(I<N=&)4CNyR1OR#I_DgR=}##x{;{_;Z${qFEf#zOC<~<{^ -zSnA0)6BVj3r{5Yp8ws`ik&`0m~ZZlAE?ikO<q+OxSm3v=TIL^#vB1=SukS!iL3QaMrKTdY5_N6pu!S -dnWa2t~)rmKSRZf7J9*CTYn{N6hpyV$zxBZSo^--6pVboKM|u4aZO-XmSb4HP_+sqr)I{dw23D+6)dD -Pok0yBd6=uH>O~_$;>jzy(M0+GL~7=Zk>nVT9o3ZNCjDAC`o<J$oGjy8M96oi=qc6E*RdXy2O-N-A-E -GR|pMjh)0_9)fRxWZg*x{a`XMyOkP-W+M1Z*4?;5NUI|wub-#dSHlW2_m(3&_0WeQwGq{wQo{__=gsw -w0cd?T7k|n7cKWVvyaqWbzKbCBiEES<(12BpXvJF{tSOUO&I4{YqJ(n7NN!8|3{k<do^}s?2JzngP^P -FObT@nis=ua&dPO}ROfz+{~)L9s@%5k$KU(+4ft#LrzMhw9peeqKyI=pU#Yq{sp){*RK)V(_8Yl8Px+ -*&CPtvjyx;UtrJlRkX}k3ryeX^*hI07Dss%tMSKfdq=@c?2FpSz?i{u@gm04^YVwGz<a_RYa!lrQ(Yq -c;{CJJJW%m4@nC#5U*wqoUqG<bjCp}{jw3syK~{JGQ<%S%3wOalqQkrnRhecCso{LT-01i++NmMo?^Z -=(KEatWAl)$(^xBxeRrg6E7luF2+*i_rev0lk+ORSs8f7sb-)%><Pk`i{EvkM$Y43hg3p|DHN@U%(Z1 -=?gC_Tf9&46$7=;5M%S7f#NQ*<wlh@0qTk+f9;!aV7@2s#op)C+*>L$?DmRMZf4jiUx_;TKy%QV?4Wt -jT5X5UJpd%IpAJH@<*Zo{p+>Hzj`j}dz|AvAMNd-JHez>xRyGkAxsQxGGY!|+TWNGN<bu)O00q)2np$ -%I(_LTu4&SqkGqOgRr5v>5<`zL$$ArURh;Omotr%9b;IiYn*G98XoX$?S9rPVD8;@hO9CO8drZBe@*e -TWbdKCQz+C@wbo#SWNyc#Q=g-tSsG|c61#!JH%W}C<?wjoF_Tw4$I19E!+I?H(0)bgBoNvnn=E967$W -rBW-t)PjJ4$$oaycH6&6oy;HL#2gBf>5il5Q0iI$8M5weRKcdgE8Xy!|j=)+{Z4wyoN#dM3sSZen=7u -3<FyMs%W`JX}!WcUjPGNVG___vt*%VX3&J-(xg%(?|2bXzJkyamSfo`3!B$SI1&Cec4!WeVTTpJ&`CZ -ZlSNpYI*Ok{0W=^M7NPrbeb3c9Jc9@j0EVgXl}wqzHJslCgL?!*M7?Xl=eS<Yx8hL7yXTZfl|3##%+e -tTjrqu$V4*W64^`vZc2N#iBvFsv~oQ#)5=7r)LV-xKGii!CR^k(uG@=s+sSfU{%2f4r%;&eiO~<efu% -L{HK5G7Nm-C+%jy?Tc+z+|#glB{xk><*W8&L#Q11qL^-BDkkc5m>%70<XL;Bw9!;DdoqqjNd?4872b^ -9V~P!$Zrz^hstTPl5krGXH3OoSVv12a`D1}flARVqj_Z3T;8E>d@t04(6@UKbkI<3BsW=Gs)djPcN&W -d6?UN53Wf*W;0>D>Dc^#-$zY;@DOHGp*AVU>*PA@|gqBhu9Chuy1#4;X3+8JP`E-pf#D)?Z8FW`V~j< -t?cS<hZrUCW&jE<3dU6gog*E3~UlU*$J<z%rmH$q?k?OI4<5Tw{BveLo$EX5uHe`w1%uKV*40CHEOTM -{sTJ{p-dYDL0=PobDyG(Ftz5YFjl$y}Ibk!A}AJ%$)1vkIea2m?HYVPF|>I>mKj;!X`1^0$JS%G$&Sn -JaBCytBFuP2S_~7$SW{F=qwPSj=-z9q#6}u=oDQI?+#t1jGF)}jd2YC$_yC`p7IMNMuMbceSt3S-@bi -|41y3uY8>E=3oxiw$2kq*kAUKPpD@+Ej-ujHcnk7#W72Zpd61wbx8#pY2mCy(n~*UJEwP%l>>o50IV| -l8u4nbTaVGeOrad)_ZQGV+rbuX}Qd}w!lgy4_U}{(GIgn2Ec{jxx6$X8|iiH+c^#hL5K1)Ao)Q5yycI -;Wx)j3E;coZ)GA2Lm|Q)*8pS!#$j;Wy5pHhF95UACL&y`Nz^iv@EwStGd55_xCx!l|fF#aS5z+uC9Zj -en&}R-kqdI!Jo<n1au}SGM;^3P!qyv8_^ZAu?{0t1sok`|BkB#ZkYZl-}P^653pSdc<+X5kSDxKrh6w -5!HjvHB4>CNR_Ww;3vOIEbx03I(Q}DF-o`tg){*h6dKb`kpUrFIi56e8`N6QeO^f^_{sbGgOzx<b!qC -fAnii7bbSF-P&xGaMda`24ys$;Kakk)5o<MnLDsL{o0w_7tEq|W*4mqE&h(HI2ih#_^jnXXzyI*z>+y -tZ{Djxr^4`kfR+@2f2C)WXT8?-;v91$M2?Ie_?!Z`Ov32^#w0igY$jblHl5r>Ox=FyIc|&hQ$@Yu<CA -ipRCgGJB`2QQ!zzT@?&H=If2S@{5v~4(H<nGr&0Dk*K-Yyx5rh-}uCd(2pKJ$}|euST&9%hMLF*@a)c -sadQL`!jV4ULH*<&b^eDjj4HL9~XQ<$8q0@RFAVl<Dm!|Cz1Tcx7fo0wd$$qx5Es2at3h?|Ox~jeOk{ -dBHzB&5^;pI@QrZ>rYL0#7~s+c(Dh5eqvr^qU$SjBQFeo?Ey>WNT#}tD<BsWLCnWX2#K->#dMsb6NH6 -*vC@$3Kf50nYw^PKZKFK=s}mj$MW_7N`COgm5H!<*!sq(L>`iu(+d63t<zGfO<u}#1jkN-kd$S*@G0D -jDNHynCrN<OEl)&M)>f<jTUz6ez@%erGB3JgMRXXgL@idVt;{CGMlh+p#{f!vPvQE|UspC2;qvad%15 -MqM!9(!)n@g7mutY5nl#h2@BxC!g2Cv?8x~=<ehN#MN+$Bb;MW1(pGOT5rUaXI%NXg2VrHm@uMw=2H< -L{{8YIs#lUu(s51oz;QKTA9Q132VZmm9u)Q0ZU{X6fQ}DhEWAB5vh=Sk)!5>I6;Qiiy4%J_%w8=;fgo -Sy6QzbTh{Unc9<3&kbrMI@3<%I$xE8r>hYCoQ#y4_k%@C;Jn4(V<m??FQ3dO$ym3Z*R>{$cF+yfg}w} -SXQ$~}Mw_Zf6bt&1_<62GQ~U%~RpTTCWjdP9Rjf9Tq&qBcB3awg@dsVk3(@^o`2DYw5#fr9nVU&vFd7 ->)<~4t>LaK{5@$Vyez7na-X%VLc*+{TyVs;rKz9bwTQlLWCWL`Va?+^H@4)52oLU!47PW%j2;ZsSH)? -xiBQ$fEsWU*-4h2fwuC9D;&<4d<XmNxm;dG$g9%<$TV32g)!Y2lmafD6kPN~39y+Z`ICecQ$n-CM!0p -5hX@avz(hW3P?4h)W&+w_<L%o1%BaDV-8r-^Smuw79P8z={f|swnT(f*vcJP(ONI=3%*XGt(|)=_X3i -xKxv>xAVh@_GH)T;3c(6UH)abgr|#Oba-Xby_lYAz<0F|Exp*asDVFvvaRTx^jQl^3+>^4wN6FEtS}J -sa1x7Wu|BWy?M+x_6y$UFRQ2>mQ>x!SFf)FW%`;};>3iTd&mdc)=7Vz;yfW{Cq&1nUFZlM(0>gVnvz0 -srJ+cF)GWVlxw8U1J;l(H&(9@Wr3bAuH2gCv9SsipKgGz17qN^)bRY0GsBwgJdu&wvVfZ=hxvK;hiDA -<7<*Et(V9q7_2k2PHpOcy!|UOZ`N)CHZZ1(gCfRyQfp%N+()Aev`%ZUBG7Yo5I_e$f0eq2ZfVL)%$Ap -2JoA`X#Pa@QRXAb~vYhR78wM9*(VhWQTI^x+=q5zaY_kf0)kZ;umO)!T)~oe8Rsn1)#J-hP=76FI(1m -RG@`U*~_*oUQB@j{eB)wYYO8JNZuyuK1&Ygy>piL$KgkQ6_VkH{1vKbD<_VIsjsa$sQ?+zg7a39P8ZO -3`R_21$3V-x{?dg8H@vc-$*xZ?-)SAVlP=#C$*YH)v1KzYT^@eH?UJ9*Yk~(C(3Bf6Qz;F@Z1FhRfU* -nGz{`6fgEN+G=%2lOJ3f&4pY=h#5}7PHa*=@HMGBw{>l((WGGW?(2gd@-v<}&^7P~oj@-)BsSGi;ph+ -paXjArw={mitz%6G|5kyD89mGwYfUf=)u+7dPWMo}@Y=HX}jm1)kKzW)bMO9KQH0000808trnOa(^7a -8L*U0Pz|C02lxO0B~t=FLGsZFLGsZUv+M2ZgX^DY-}!Yd97L7ZsfQTeebUzJTN3-WjU9Zg##l9_5v&r -%r0g&nFr56W=m8z*Al6al-r#k|DGyRlqiWko>@dMZi!^ESas@D72PP=k+N(CGbmP;gm=AEhS0s1?O<5 -x-gmq4dn*qIE)M=xYX8fyu5WnDcDn{8_Pj4D+4a<TiGyak?9Uagjw~l1etP@;&mZ3B#J-ofrqps!6`R -+ymx}d<OQF4te+VwLp>0d?^AAc%HBTQ5Z>O26Gm61JR6pf}>#~&<ZF8cSpdHgW5mI%u<^N_SsCZlnDa -KQJVO-Qq7?5$;?RGfE6uI}NC=Sg0-F{2U5~Y`A2GgpRYCS9b3+(cqnN;q7W0lG7b_AZQtE;~e&A^NeL -E913MH3^*o`I^Jd}cLlPRx;!VR3X^L9GnM{xxuz3knt>&wi^}11{x)o3czbYnz<ZT>D+|!H<R8?H)Bq -v*l2!SOX4=5BBB=1ONH&@+<BDpYhLfK+|Vd)*MatRtmP-$R4uvsyuw!%_r!Y>bNni9?yW2f;0Hj;`5F -Hd<FSc4UF){8tlNInXqfX{{%KBCq}3OBYUx6=t+RH_H8F?-kfvtBW>aI66B~8*R0q@cU5jz53kfJI3I -x47c@UITIa-2-olZkwvH%t-*OX*z~>DrJz>?J3l}3q6oUwTM$7=H4cJ`)u%tQ@eePN=o&e<g!N6h@NJ -9a*Z%#B9l{JYJ?U|e?hybAz$^t1M0oQ>84OIYkJ;}4iolo$a<RV=LR*KqY`7{MbE2>$FN@T%7!D+aUp -T}MRMmk;DZMJ#1&f#bVOJvau_X3^bjO+&)xH>X@41r)lV8_xk889YBt_B_xL?7je3_YQZ0ftCMQ?mNT -PASZbNf3*bViXk319>&z7R>MXMu(?cz=OSv2zmJ9CvtyJlA=E+go=8>u93swAvR3wL@fbZLU4P~nq!H -I=LGPj&Vfn&2>5>GZa<QJ)<J&KQc;*W2}Udc@p-ygPMkezjt_nb*dt(DbNm5x=1fO4iZ8b&atHk?WK7 -~GE84VInIQD_lC{2b69{zygb4tAUr7N$;mE!N?gq0GF?4%C5|F(WGYJu_Vp>xO_Fy4Kt>e*A3J5O9PY -t=HxA^@Qfij8kAB}`xcmjl{<;T55%A7>xq-DV1jwj&T%-=`ADrjfn8PcL1DC60sk!s{*@Gh=*!38w)# -Lo9E6I)Oq7N|I<4;v8Rle*{tYBKu75xls&MfT#niwB1vV6%C0p)}y7Pp5EWeU{l63%^9A;gKde_FVJ% -KV=c<&chKl8goi8DaeR$Onr>!lyTjHi?`7Axj0|)O06JSPRvrY5nIe!xKuf6K?fsCKw!gFcW<-i66^2 -m<QbQbk24oPJ`(g88JD}lCLIKD<qY-5$8ZZ+0tAX_K3hO;gvl&>X?9n$6<jnj-T33`J1P<rq`u@@Ck5 -0hBeS0v1VtkUQ7<xNah1ne2`iwYR}u?7TM#biEkU$OXBQPsCT_#J^jhCs>$@c1I(WNz@co%74K|)u1u -4xsVy<)36>g_sb|Gs;hCJtt9wzkBE1~nYp#U{Z59K{3lH{B$hPT{{Pe>mTKgZ0t46n$}&?2PCFG^MnO -2YJfE3&_mBqu3ol#@gxS++h@m<6^9gqtUC0hKmj&~2c+D=_gTm4nf|W|rMS7Jtd^lC7c(!rYjBR3gGM -ubY84ffcL+E~MF@fcITq(LL4pJJmx2n%^fkQ(Pq5uz2-x=f6*&1G{;}2A}b|V5f2{Nu6;VUB&?r*r#U -u;gBZpyqjzV0$a`{H4wr`xKTNqPNtxJ&%~PA!)I(n?TmcV{KC-#@5ArnnYIHgz2J15F;eta+-HdppXB -{eVQtY2Eu{O&sSp{Kb1pdd>#4^-VP27KyQkHYMfNI-j6=32sg6_}fR_O@&s+`~^z10a(f;gH(<V18VG -J1r8_{TrV0fo+F-M?^#42*F{{l^uwpk~z(*H3hxE?f`84|PyBGsxgCoW(Ti`4j*7mBboc9&)`UH@e<w -T`8}rIkxn(a`bu_wv_sz8v=!?;bkKG93Di7?@m1g7hU7*3bwH4EDPTf{+fuoI=8>1YY*+p@NZG^F1)% -YtTYOY~khZqteCfNK10*u4I}Jxi8sVHO<Y>;<hPrD-`L(R*g8<IDV;RQ<OvUh}_D>BS`pU$ZSgq8WMZ -)Cg7;p@Z&v(CEsg(MXo39E`*A;$JmB$rrJTjN&JcnZC#fTM|OracjW43-TT`2;L>Bd(OC74Z^+Mre1M -8dp7i$q18ZKOM58UEIhj~o1_A%ZMz;pv9+@r(`Sl3k!rKF>FfG{#@dq?VYCvyYDGpHecejBkhnJw@(A -=;as3V@}fsHps$RMbVz4g+l3+{2EstyEseL}p9ce(Z+BE(M6S~%l8{Nd9QKi-)3FJvtw4VES!KVs!|n -`BXUhMjt>DG8i)A;BZDEC6VW=^0S-zP2ouJ$8zI5HwT!1e!}&ySkWo1M{uJ?R5-EKB|u*aWeYzpP!tW -$Dw)PPsPiUNk>FBn8#^tU(*OztN?8PhHk;0c|Ym^G>YREH1@~%L1$}+*!{2`w+laW6%tMjCVE(&C+Z$ -8y~-=<e6ey~yUU8ZbD3lnWec16vd4jgeB)KjK!r-yEWH{`bMx)hs-SoOW+4B>>|)7lt5{Eijx>&m(*; -a`7f%X;&AHLp{Pmh=YBE9}|BkvP@vJ))F1~sKwz;;KyY^xnI$W%w!XWsa1&Vi`^qs2P7Pj;C8i8D4*w -@6{m)Uk>u+60k-W%-x2T)4`1QY-O00;n48F5VDTC~0sApig~Y5)Kg0001RX>c!fbZKmJFJE72ZfSI1U -oLQY?LBLA+cvh}^((OU%_Wt{^rP)|$F15;6Q@^m(<Bo+o3?3|p-4z#O_3@emesjG{+<T_0wiU7y1g^| -;cBL}L;?o~2j`6gWKkAt5r&JVZb})3B3*BavKG<2Dzc`QA^#qY7T7K>vP{NxTI7{(n8@E6IZ{93BCq9 -bouzaAM3!Y<=pU*1mKAZ7$<d+MO0kM=q=-b-%-2QIWK!hOS|-BFisdrRm!8<J(s(7dMUy3>T182*74< -3w3>MhEsi1MaLSUs_Hd#~>fb(`J0wbbIRCN-npZaZSa4#zTZBta~?Ix;M`a!j7>NGRI>Zmr~oB5_JVp -*Ba)y{maqjHgEW`N(*4gF+NZqiL4Z)3S}s5#34dX`1_@S-e>vTYm}Yrsjgl!gV8VO@k(T~34qg!2Sw0 -pDSouma)cdRevIk>bu!{z$;5N@0yRQG6XOWi>%!mLWcyh_cCZAXM1o2|T+=%esLj%Wo#4{T}8;xXg-q -luZcQwnT7=%q09-N98s2#5qq!;}(<fM&?OTYCHhVu#{ENlt9K_s{ocFSQj_a;GO21rXFmkTfF({tpC2 -0b-6=6FbfaAM<d`NXns!EQ=hcZExy~;vYNd{#<{FZ=sJ5nl367O8=DrRFoXpJL7IvWUb(JIDZPpClC; -`n(Jn-`!ryZsd9w+VwDg#C>f=S#HNJ<|DT-3(?V>2xQ4K5fJ3&pWFjX8g2WIF)g9g=24x=uqJ+4JaLY -miArzwpXW->}})d`gFR#D|Xa=PS*O$NBAX*n-TiDFnGl%=f0T9)fHk1~ThJ_OlWcDgk=$O$nGHfnMZB -I_4&s`(isp<4;;0E(jxs<Z^;BPp61JIK63CD)(G)3?w5Yxa+e@Z!g-i&vMk*RL+I`Q^JeZ(hH>x_It9 -cRJ!E)C#~zH?pii#JrEA(Fpa7EP)Fwr4vB&m-O5ZL!?d^jz^>Kem=7XfF8aVz^sG$?`McbP|tt&#-ks -99&B{`JGaq)GxZl<IbYWi!1#IgrUwM5P0hBe3|d@0eLFbJQo&jpn9#USHS9q2>5TM5bSC*kbVhn2oC% -IcL&OL0J-{xU5ePNQr;<w`q7a87FMf;Y@gUeI(+++k*34o?Ku8fYR9@8}k@IHhdk9?FEHFoT0cP_iN= -X)hJS{GV;&q<w1PHHqv#VD{E<OuBdt#%B3-lm79V$H#O#*%go})xA6e3|!hGmpi(nqxnKe!v(7~tQDx -X>2sYPSI!@i;1%U^N~;zTV=uF^_KMjUUjnO__s-p#}&CA&;s3zUdGg#L6At?+&k~(u%o{dP!k*aBxsm -0X_)U(Y1uPmDr}R8ci)OE`FR{UIoykKLO~Z+cP*D)z_DVCfW$ub^)Uz1M+;tU#9E=1w6#Ltvz^73Tdq -l{UIU(K#lu6sz|Z=;AjLe>zfZJAID%6K~h67xoIAT!Dfe2dK7!(&Um~Q2ahUoMAq>@JVJ*B91$5eHS& -W!Isa)5i!%o=kR~}1NObje242A}eYeKgMBoQm19>on2lG1=Z_(Nc2?}xt{$92al>{@CkVrHeQ5WJf^{ -5*ColLV|)x`!Tbc^mpw3~i*a&j^e+X!sbBE6N#^ox^|F;R|<tPcw`5$O_ak_;sxR!v_-V6GK@?86278 -#})oEw33Nr*~5Z!3|g7bY-&CoHy{wUo?3<5x92frNv+_7DdaFuXFJ}1qWpdd<;&kK-*T~at2_xMN~?l -Wt1Ehpg+K|E5H|)xt{SDm?VYPb)krkeiA}iPehap<6WZA*Q>JF=7A9Jr2t0|{ONiH-sDP_=<1oC3XmF -6M4AB*U?Nt<MlPBRUZ4+==8ZHG1gs0(v#yK`9U{}>Y(x!QBjTn6hoFY82wfobQOnurQnPTuSJVtr{3r -R@!DTpmd-3#n%VUQ)Ht<o6OoOnF$?3GkHC_P(pDC_^ynj2px)@tfz|$py7iGFczeM0V5w!^JMgn!{{Y -IALIGeuM(9#4gzq9NZ53wuZwhP!%Oy8&I;Nozqk+_L6pe~9>B$n_tR~!VYh@4n-U@=U<Wh+FyO*Azjc -&SoY3bPQ{4-BW)ALz5iphJB903y8>qp=2qT0yxp#Ic}d#B?goY+)z31S0{_O;{y?9wQ#!Rkd8p9G(Nd -{&<28A<QgBi!%g*ni>#5uc*oDJNn~Pu^%jOSy#x0I3wr^v;fI?VkTV4&A5lP7kJPFe|&&A#_l;j|7fc -)3IlolT9=*G2YBaG5A^Z1*DmCXbP1+MphVzmqM{bX0@e_EK;T?}`h(>{NTl|l2`?_Z)?(~O2~Jrc<O% -)%492SCv0l&|@IO_08YqNI1W({QhhQs|IX!uKn^tv&_`-BebBi81Iu)npX9ps50{iUeW1A!$V2U~rw- -9HCYDjSXD~LKKAV3s$sxgV9S<XPo0h$m+re%>M{eABZd3RtZFT<zLuE51XJLZ8>z}UneI|k8$!XpgYI -&Nj74~X`WYbUV}aiIRw>YA2JwSb`^sKEhlBx+~mL2F61Ai}uS2H?m_FCZ_`Y1h2>DDmobID7Tx-Br(w -yRMMmvsK=!g2QC6mldW4fc0b|{Qt0_g1xQBUy0uuSs|2j@u>2|qaG|ZS?9T}_;_x>E;OK~-e3#;H9(( -l<Bx-^*n)u^+jKC^(M#R8wi|F6>w#(iR5WD^!GBbai2w)+j5i7*E{~yyS(tO-^??yNgs&R`BVy$9Ymt -JwP@FN|LlxHsFcpaRG%&?(Ry6O=G25UP8t6bj#W&&<+#d0m{`7om?@@5N_~AQ3liMFt!{9`HQLbv{z} -pWkz3#&r1hEg7f&PJk;Fv`-B(=p}^hL)ay|hNhUcTl2S0&g;!0Z#g{e*6gt!U9l0e_fsf5`031{`B@N -sMiTzQi0#Tc%ZKC<|BeCE1fiP$7V7jVf^k8)#3D)Y_>QJPz*b{{1m<KBL~4h9)|b<FD#<))IsMGDX0L -P$WS{$F?HcfGbm0WOmr&NzrxZmuQ-Dfu1H9*P=?1ZVp(52uK0g(Ws19e(8N(r*$U3`S8!LKR$jdZ&ET -Bza&r2K|lyI^c6eY-}ZikG7rKx-wFTQ^RJ^1|NQ3T<8Qwie|y=?b^e6mpkEry##%Q!xho%kp><VcAl( -bDT5evT!!Y;87?~|LJxVV&0s4-hgOuyyHTB}?ZzdYXmtnkW@@pOn97zz;X<7u&FJ3%-_wp+I?%j(Q7j -MJM+0Pg4Qv8(4EP=pE#vlMd+$5?a&J;$3|527+1J&oh0*i_UT<A<(ynYe5h5@;tMVOEPRwKS8oDma8X -CezzGgs%#q4l+SvLn=}nVMrS;b(Kc?V4q*uf1ci#QOU$zqI@fFHlue7Yq}8dhI+SI1AuBf+D`QA0VhP -_~8Q~7k>zvvIoP$$&Ma52>^d0PA#=%<8o(5XlL~tP*+O8Jw?AxZj`83b#+uLk)X|#R6;Y}^uV7Lx`+x -4(+jzmJ;5}P!GxpcdPQzOg@$O$s%GA5I(Qaguo$nv^Dus5T&&mNy>Chh0W+-SE9hr@Fd9iw#j>v47$v -W&F?Tu4B3<U=UV|2|Rhwo(T)bdPh?v{Ci#mUC!KjyinYyj-!NS(Gyo_!VTWN9JkjQRiSnbwX3QAy#9X -cxanTkUrCMGD@w5}ky&Wk*aBT!!$W*r&u$;51`38m<Qkpoc4T)UNHQJY;O2d7?8qwNgHeb$C_1N_`+? -?iw$m3lEFx3JU)L;)Ss{E{@Bj=fZyiI`(V6ydAILSX(F=vC;6V@`|WDO_s3`4+eX7{>_OYR3^==7d8( -m6C3!$iT4ihojHWKXSlg-r{rp`uyl~C*m{67*jy|7=Dq#3g&X#pQ>&#=4o=`r{a#}eZ(ci0wMuh33kE -Ckj&Pb41?sF5)5KqlqF0oVT)k{4yeNl<ZuF11gkN1N$ewDnnKu&lrFWzFSd`P!ZU1Sk;_hU(yNi3G{f -vrJO9yr$Uw_sWZLnZ?50A1vrrZa?ONKo)=nsZDM#ZW(YA7jAuadFIE<|QIR6Vu5R(pC^U<cVhj};N|0 -LyVZFwr0o#|%EF4;{cr0ZGFV+IfRYSV<go&&-#IB*4DsnLBquKxX=;(!tx+o_Sx`*y;{y-I*BLPJ9Qb -vFq)$bFtxoFPR1RelW_DYYfW8~rNRNA^t9TqOi8vW*pKpJv-=SDAtKlDVTj6(yW0gnHMTC*;mG4^hYB -X7?YPt}{=-4WZF~df)&;(uYdpc9vlf#m=gR-7HrJhS{<2&Cc1{|5K(&y$}#;g(?6p0@hxnw66&P4eo4 -(SvuGHs<Sd3#0^UiP=Vgv$-ws9dOQqDgf=relb%)7!pshH<f^5f=C>MW?IVRS&{}96;kb};xeU<|55< -AhZ9>C=pcN<=wBZYO$P1w35q9((N2(JgYUsmTICn*g?w+(g<H{$|2r>Ik9?j4;hx@6n)6LW>D7n8!n# -Wm_NV5pl14lCL89kcO{k@3&+YZAV9*GR7fB{*{%>$aNYIXakPc5ZBQD%Xp#8-J~u=KP)qIHf{wZj`=) -Eiwwbn*MDj?B!kI{WkqNe*L1<+4HFfYKT;2Id-(Q(+e5{v4r4CKPi~&|r3gcq{8Gp|GXk-!2MjXK9Ge -lVqZc1Y+=-QUX}PrJDpp{kjw~gxTNMEZN>}4n2`hNJZ?%P6?2rP4fgjQ`)XvD?0qF=BUOobp!4(3Q^m -^Pwo&wJ!X&TU1<98{Q!rtc~E~ek$nv~HaNO#Haq~oyK|VKA@0Wd0YDvM8U|^b(j#a2TI;=MbkpVjG1Y -?)ydO=*+^I?nwnd5CZeb;B2U6N$lwRg539jW%J1;2My%yc2-P^#WVy~G!UFXF|T@|4WO6z(ID@&cDAX -?xLW3PBS7r7lIo5BbXTWC>kQ`8z5#w%&O!hL10!cF}cVwf^5lt7%0hdeorZ_V3dm=+>>p)d9BlCo@97 -qmZ~y9JBX@odcS^5TeV5g!KG1@f5!vXj*xgJPlA;;cLRtWmR~xW<lZ0PXWA5q$ylK0Kvh>F_fGN3jD| -z0N`HCkZ7KV4y9%sTGaUi_r@Nu+NPBA?;}v1T^hhf`^uX0}j#2uT52JzUR7wvf^EmMFH`L>%ifpDlBO -HXmSw`2vwljP^GBfkwyX@V46BlI)0s%@ab--JfxRG!g$CogdUXElOE70`{CRL<33D{t4TIZu~g-_m_r -^W7wGn!%dzWS-tAoO_bt^++oyKDb60JAFL|#Ukvh^-GYrU^ZmH{e2hb@8cSZ+>T+PjGOri2b$NkFwle ->dCb$KJRVsm6%IRep&Axnn?iVI)>MN;Pi6aJzd1_f@*R%9FHR9AAH7u#0ML`MNu9iPJr1O}9>F~90nF -P7IYY*XZ*Z~6636|LV-Hb<gvHh`mlI}y7v`cq)UB-ZLIX(rn=0laR<oRWbDE151=H9TQ7AueA<xTg)K -RqvPTF`+XSDw+Hh<y?xm&cg5C&t6^r>@RFX+sp8%O2<W<*V)hu8m6d*UIFJcv1@r_F0IAq0ha|2><6z -pHOcfL1Oh@FFrMgfgR9x=XFQRK@J`P@``p{Ry-R#KC_5&{t`;59oC^PBB2I>d&FP??#q8(O6deMe;5L -c-=(PXn%&;7743&4R$s%FZLOW+zIYq=sFp~+tUWad=zkc=dr*WV1-F0_bAfT+Mr1N5kXr^9p09P8u@0 -LZpoV~ih+U&D07)9shv)3=*{XnJLe>-s#DOfHLmmf|)LNE3G<fG0SsPHUo)>!^w6=f;Kro%USuMVT6` -3>gcX&;AVtH5nxbc`VG2c89&C)*iGp^ijo9z*Sko8S092VZ=kuxsn#t*y;gc`YDHs%1X3Kk*KGnxaDC -(;g{#cAqq)Ph%aUCRhcMv$p)C!G8)c8^_Yhg^8HX#Ckgzk`m=u$tSqhtBp2Mw=l6d<F`SkswxWR004n -g+eTn6Z)7qyx}J&>^)Vhodo9;<sY-PL@=kEADnqd$`+WFiSr*M^f<ggKdj^g&?X(?GO`v#kdw?6_Sqg -|p3t)Eetne@p!cx-;KqPC)h@fTO>gr5uY*dmtTDhje#n&Z=*5r<gO@-L8H_bKQNfB4BUu6|4x4t00z@ -tJN<d}gS?NLvXaha$3cv0|kx_N=zLNF*5U2NgmUq5FaX+vVQ=Q!<cWJ1pX2gIa_KW1B@_{{W1(qLU6n -hb1@-?_aj;*|87Qqw?B#Ep<}i=43M-EDGYTqT9YXuW<IdNIy@w~l)B_bv%ED1kn7$GftGD|a!$%D1*L -{GvkaZY!*N&8@8|-0%i!InQv<yN~ywc-kg5dT%Xm=?>ZVk2@XUzj2>TEsMcqz3trVx9ORTwsSy*w>~c -50BrOavi*J8K=k|Jhw6V7&tREhi4G5zB8zXn5vPA0>_g?o)DgMW(IEK17G7IvEcTQgP<?QDOv>b#6v? --P?d(Bysqy98i|>7W%95k1nNNz-)6-#c@PN4gMrxR`CbgwerZV{sLU(}jwYD3xDncc#^cX26OCjxrV( -O@oH~f?0%P+qaM_pSf{)gwKtZi@6Ne7v=)&@-<=^8L-JrhPd#s88CBS2uq{v-=V;3Bmn^>1py{vAx1s -{Y3%8rrU3{;ss*9c}QmnWZI_TJXwqc&<Y9J4bQPbPYnnGj<OF<sMEOf^_>ZoO*={27>NxYjSmtYa5lA -ZE+(U?^%>n%2#rLhH>p08ItPp=+MPN5g1E*CkClDBpMIQ<1yobayQi{n1hZVLdvc0hv4zGTAnLr`FeU -5d;uIID@=V=668xq*3q1fj6}Co9ssgI$kohi>j!u!9~?@sfRW2WQ|8~4H^8HdvQ`r4_w2OY^Di)cKuK -k(LdL93qI_&S-#tbr!b11L8m8|lV1PI<aNktuGdKUL8wAcn*9qzr1l{8XwS?n>*#S?cdjzlJt=JH%-F -gVZUdIFJ9fDhcS&ERM`22@YS@nGirI}5^Je}6NjfcS>ipye+vQ(DMhR*OS!=X8NQx-`ROG;Ypf#6pg8 -K;YsN*}<=fN!8`wuT*^yTsi7cr#9gX{11|)qw<J#zz%z*xy81novFe{{2%+m|Nx~BR1S;81X@t9Ck+U -a3opL1ZqvmGhn3lE~Wq9a;FX=x@Q!}|G&2Xr)!HJOSZeAkadR4{<PKEs)Tl{DznjLv#Yc1kE%V3i_H! -vRLp<%F`nfvL&416nBq{p+d!1Ux!gKk1B7V3A$M!hWTehx_HWRFrdS<7Y%vfG0h=}m;U0~1sF#iJHrX -G1JRr<yb>;n$#Ge#J9R9Jep>y=|j|L4$<Zj4d?tK_cf~ivhVNHk9t(^_sc&IqmoFLHds&9iKt4xkI4| -0t6By@|^_q%!SH3hxucAcw9t5AJy(XniymHQhU*A-_&54WvK5TdJS@U`4gzV|`5w(92ZCdcj3a)=_@V -T6gPukFMhPQ4y?^)8F(T_@o>=nf6<3ODyn7Xv{1fnAE`VNvoio>1}n+wk@=ojoU3Z0rv4Jhm>kA&U}Y -Y{?F?V};CxHa8H0RpzXWxqrqyF+JKxz6Urx!4t128$nZMW4&q8rG#y|55<ewk3U?TtBU4t`!CkfGL1! -*E+Om&n^3h)l-Y|RBt=s>9J(+L#@zX!Y4WT9_g9rbKdOvuAK@yX-5Y<^IjrZ!Z5$NW`V@pZTi3CY_bQ -Kp(1=f4_AX|+FBo(2z`Zm+P-r&w+L6>YgnOHfAFq=M7{OwzF0kP;Iy~w<#Z9AOQ(ojDZz13w=hP$I_j -n3;Y68|Z1Y;530g=42Q0=pDJBTULJeMW?Qp|kFB?kHsy;m{QP;OyiU6X}Jqw!!Ww8h#{&OV^D%@i1jU -~kf*snEG93ovH1r&5BCr*1%q&=}=W4sP0vYZ)jHiA8<|z`|+4aw=%@c9W?yfOLXJWiJj5&UhM&#^d*# -G>H}qEC;l3rQKs|EmVKHcO>Yo5*X|#2j0!})_6O8#+8%28C8=MO{t(Ugg{(i9WGw0uw3En>B^QhTS=A -ZqBPY+y^OMT0roz}b3$|*ngW+n)j8@6;ZuHcMYSZzrgL>|8icR8-13IFzR4jHbW6vwC^R6@OciK|uaN -Yxm}e)ae?2-mJ32d42vF&sh8KwiK%|rUl|})P{>QUR1#VknF+@qD24a@5-rGuzAOzE*OcN^CtOagfmv -p{*F5?JqZAkUv#()?Wrr^qxgrWPE$=kHv(Zv?(`h+sV{*2&4lA?0C;0Gk1!I%h!n|b!CQek8u-mfB7% -e=xcdCmPtbg@POViBud!&Qpc)lqj`<_O`+iN4H^@AU{w@9%c)vf`b1nrw;%@mvYwgC|*8_{7l>=+6v! -O5fXY2>)5EhJ-L#M<F>}g84B9R8GM}-&!NJ7|nS1|L6$VVP0VE1qaV~q8c}D@j&?$^?Zf}8OR6EFTQ* -C{a6)3DbNNnYcilCiabdX8ZLbx{O=l7=7DNKA;wlwS7hvi73rH~&?{H9X<Q1y7L;%Cz?^SX88QT8XZ> -N3;4zC59X(jfaw!ugomxR(qEO<+7#&$xweIel)`qI?*6BOf#+vu-!Ub<;Z!R=YTTA!P%7KjlR|6cAwm -1tvT)a+&wAiFmhp`ZzP$wes+QU+KzvS-k1Lx;~cc6dvqYi2WzTv^6>Hy6f{tnbl9X<e>;Q7mg&c>2KT -bD)QkG6?3=P6>#87b3^n>v?V9lTY?byR1twg(djlJao!8x96^<p9Q)ep{qtTRW=`E58XEiXnZc#Xu4i -7qPRP6!~@uFi~tbwOU?YJ%9b~ir%Eg)-tQ{AJ;^qD**pZ5WOiLpy3(bm+iXKH9O$@tiT)N!^j*v_6Uo -)1c$nNJtrd_%;@U=F_(?e^HK8b@bS=jXqo{!SkulOm_AZ5P&O2mE4K2-z0@TRkFWZ?>>il52Eso<scx --s8nl>eR;DgbNTzy2E6Rg`yC4q({KJ>1JRv6j+Px@{RO!$L@ugPRG)@Y>PLcv!X8rAAM?A3gL$-{aRE -e@QLm3Hega((>{-}ll{#CT2b;66hTCuwm9G&%rF0EtRDZo@iEWppJR{jC0_=7u(M>{>h)X0POTA_V|V -I8IIUsF)bE_P4F`gg4LH~ppV#gY1h<gg6OK%!g?guCU#*+uUexka_Hnd&NEEzWpv!>}mpPd~wR|DZ}| -w*oR2Plj9mk{><r)4!#~#q2?$nkEU&9?h0mM3nO*b5G2}4)G)M1|e$eb$^7}0*hc>mZ2zZY;)is>tIf -}!#Ve5i(SN5Q8I{de+BPH*X?sJ?tH|kgT1Ne<Bq*caA<k{fj67+x_C3rXY*}m=bh+v_&y@%gY~Vx)2q -F~tRp$SvfBX;wJ-m`B#)am>RmrWZoW$IVEFM^w|uOt?)kg`Uop~_F_=EYadhzrU;c+ja$!AXq6-rA{b -vNtm%%cCwc4DXeQ`!r3%Hq~ZVwde2qKPLR%0$`M)uE7C+t;Y{-FeCgI(3<l7WKnjF;{RzJZgG;cgsOb -3n<9W;|!1wkfs+*h2yr(|LJ(#)L)eHAH}-ZsB2Mmr*&#duQ4r<4!5{gYR)sWn<<Zmyz=BcxvPit1De5 ->auZE#fHG<VmUrF2!rs<J$63OfrchXJp=NNGFpWU{?YfzK)2oj_IG)T?}+|#;4FJ@$Aujd`iTJ-7D?l -^rΜ`_+8W5*Y25ylg6frlda}S&}Ni)J5gcPqBE2`vl><ff$uGa?Cfy<o104?K@tgJ$HQD?M9<G1B} -HBfI-EGe894mp!a38v5sY;ds3-uOw=iI;)K?XLpef>2*5Ksb^InOE81e&Y<5mjdKiLT$D3v=nJp#^+% -lZ_GzgaxcgKC+{>gA`ZZ|Su%;4DJuFCeotxbI>4==DVBX(RcW{X$A<pbPc0Wtjp0@q`#%evUiYIRTLV -3|2yT4Rw1+A8w&uNE+anN_^3ffVcaoVM}xP3O>)y8fLS@!29X2D%vNltVv1&hVUAnJ(1>Ye;w%SZ^>g -YkzeSgT`9U5A{wRDDOahB|aVl!DUkERGJoE-rG%8DuLcH?qCUFPW8?pZWO~E#IbNRBLK1f-u~+cf%*z -I7t~#;^1JFjayB+T0|*B#OQioL1)(5t_G-Qpom<V1DO5b>P?CdDN_n(J=t2eKDu=m4+7PWDTL?T>X(D -rty*6MVaXI^oFVp#P)ogIH;aCe8-lwKc=R8vvTjL2{w?a%&OQktL31cNE-as)CHVH;7n!|4=E)NDads -*<u1MxWDdv*7)y)DT7c-W(v#J#g5)(L`V{Kn2#6@0a-_DS@JME)Ki^>0=<-iy%JA9^d9Wknlg5^J)Vx -cIGsxL(NsOr6{-x<i%vP-yz6t*@5O4tsm*+WpoT#NeU8do6N3oA6ZVSIopZvyAfH)KsV$(*`=9562(s -6jN@PToWU$ksK!Z3EmGZacNy>9Do}H7EGUuGSBgrC0VyQRU$WI6`0k!q;q8FVpZ3h>iqb43Bxof^y}k -!QP-K=?9`Xzc~;DiPlD6a;0yH#h<f<)^vf>{5%<|G+)L@1tuQHK`o|?SNAva4o_b;B9H>3MMK=ll*yG -?)GCd3|!vuA!dvX(=4qwfMJC=AM3zeOUD8|H<-mfEvnAV!<KOrZa@4wTAeaJdtTl1W6KAvK8oNgKesv -pc`0{ssse8eQ1eu})*y^Wax4c>{Nw?*k}quviJ)aAaFy{%;(18T31&|9yCIvq(B2GLEC@*QsW$#G`-_ -Qt1Yv}J*t67shuE$Q+n=Ju`hvW!m%^Vtg8IYD)S*G1MvkyYB6`wg$ja?Yo}ZJ`Albc@=l8H@Q|nq)fR -YK|^((j8@!Zy1+kL+M)SBIhG^c)D8Z{JS~~PkSUX!kfg?wKQ39i;#T=vd+=>=J1~1T}tiXxB=t?yIRA -WnfF)Fxdw)B+iFUCVk|2u-8W#3%r_Ro3K-bWRx-Zk<6r8wBC*7OUm@Q&8muh{g}P@7Ug=G?ZM!`B&|2 -+P?M-nOW7FYKv;WUbNYvs@24$6C?V7dp>E4jqT+@$MiQhPviU0#X6V(RR-SVV=YufI3^Y|@9WYd%J=z -jrFO9KQH0000808trnOf?GLJE;l)0Ba%u02BZK0B~t=FLiWjY;!MRaByU4a&s<ldF@(lbK1%k{?4!1D -xCo`SR{5{J+V6!I|+0BR+Gf{PRJ;Ww7^~qt*TuaXs7+{J?E^1Bwh?j+Yg;7lMfi}KIi>8XIF6?r}k+g -HS<*<*o<pt_`QhOC{a^3F(%f>?e<ujNjh|WHEnl%BOgTHa3k70jsux!#-o5uRUk)F1T~|WPNiWgO<0^ -JvC=}jH3!5Hr00!NlP1FRn4HEcF^mtj3R5FI`**FD{jPNWO)qrK?v7=QTEyJsyYG5eXV-WA78COr^hm -WxilyFzhys<kTF&$JH@_XWm=Sa1nMEvWwOSxX40m}x_b0*wgBoC0#HXTpTx0M_P<Q-tD?oAZOd5s^G? -*|j)l3BKKG3o7!2v!a7zQwGq!M@zt_8eM`rJqrxix~qkCTaU7%V{?{DY~{hUK3YG5ipcq(Xr3jY^~d{ -6ritVW-@`?jPIl|7>5#VZxI|yNjE2`&}oFuRzS{a{1>-&a>69+$Hd08EgD{_JM(mcp94Ka?_mzx6U-} ->mCn2gIap<4z)uYP6x34j2k|<P@wf-i8dfDtV!2VjzYGpC|p3^jK@Nw-AqRG^JV|+iUrEo)<+Qb5Fwc -s#>i-_*;o-;w)}gy-#feTF0Q+s3$Jr?bJqFP`Mz}3!ex}{_%9HVA(z@15=f+?gGBKu0AmbT047i%8;G -4bfhCj$B4EP>`%a02>o9M=H(ds%Y63GhWMEaCnmlF*sMS==CL$5+X&MD0c}kj(p{ODfhL2p<hgF0l=6 -o85LKgvcU3YM){wBka58i`mBQ+n~Bx)pK)!<$Bt?cje#*RM~gMJ!|1T?kJ2hZJSSxjzvSH0`2W9z0-8 -u=6p@CB5SW)3ZP^0eRV><1pE!X>!8ZsaJh(!z)*?1L}_Gvr!OIW3=2ZJj{<yZFtGRDuORX?SB{yqS!= -kqW_a4QGP_PP17n3AvkqS5u7<y;+zE7z5RBBS>PPb~FUiKoO}TAwzi&R0#1>@M{T8fxZb-;5?4mhrDF -OR713cfVhS5pzs=HEmFW#C73;i%TT*ZG;j(~5mBcE{j}kcFB+&*iJqE;!%B`JAK-V-D36q<eHFtyK|l -<Qc}%>5g1QyvSYRNf+2;1&m5efdGNNkb8DNP(gkS@>z>Pz0z|bi>Iblw~6Hw3jp-30h-EdYZ%X!?aA2 -cD?T#Fw~MaVr7Jv1EPL$BNEemwU+USFO&trg`hfv#lXzpu4zL`B|~`&Ldrjb)fJ5<7X%!O$#+eyoWts -qa71!^%0_8?h@Dfs((c+IrnqQ7J6}Dks@uuag<&u*OiSQ1Ga=q-1L+kZi<;0(%4dl%(Wku!>}4m0i)K -MD@A3MVo+5GX)u0(?KtwgNP;gMzlznnM&?adK%M)96!#uxn&(mJ)8v2fWkrH3XEPvemy`jp&HAGsHL* -t9nNGhk{RJoK&CsDexkG*8Jf;Sbdc(Hm{pMPzkc=V#hbT{yT1GUS<~e@o}X6GP*1d6`>EE*S`a#^b&4 -a~`s7h@)1!k&`BPMMr$`D0JqYKq9TQ0v$ED`q))SChno$^Wa{@y^ZNs+8=Z{#v*e9rZTgbwYL=rNsJl -n8eZ&)KzCJ$i~)qy$ZO!?^)1_wLw_OltJJosRb-KhkuDSLt@rFA#tdX#lw`|3f1*S^Xu0ru4DHQVT&y -~n^cuni_|2fMY4OK^nu9ufdEr-h9h282+}sPb`sMOq_QX`6H_X<(gH)O-s^yPR8`ZE5H19&&sIeI1y6 -$uyusHnim93g+#`Ip)#suyZsb$<5|k-`lHWZ<1Kaqf*POKVIGSW~;I@Z&Ax1H#Ov)@{4v{uLQEb){RS -%gPy!om&e*HxO61Pn;R{*o1)L|c}^s}|D7gFHkNxVbzQU#xgcw_6)o~{`llQ1MzsGo+HH+i)10rXQ{g -^s)u!TxR*VGwbZ<#N$-~|2tM|PR`!VsVrhAZZ#wI&P<-7&`1W#^6ew^3J>{T*<oxiNTc$`=V`H{oIlZ -<0TIRz6j=1D*YS!qOx;56N`AgyTFso`+@Zo^Gryoh-_mT}wWar^n}qoY&e%T>6Q3$=nGIUKctpr96FW -$;EOD}V!H?4ZPv`oDIYwiL0u*!CM_+Z#)+EsT%NzMS%Bz1#j*`K`2-tQ2sBwD&06M%q=7m7&qf+&(CF -fDY|^RW@YXv<Safhrz*e*%yc&&n#@b=Q8{Q3^T`g8#PY&6n9ZLIGe~I5Wpq24LvPdz($Fn3?aLf8%Op -!lk}0mfE!Z7W(njPABG~kzkx*?A*))g+Oh|K?0Xy4y}rD>zA9fwm4PVTPuSN-%J<uL3aVQQsvqyhtUs -2k^>u003lReYLa5X|as&8uYr4&YafLRvksEFTp>-^RHf*XFUI8;#P}c9fatqfYTQRvro%7YnxBS5po1 -<APa$OCMGWl$+MO@wbZTVN#TdPWbE8qO^aK;y!e2Ef?1Z?hy3v8e>5r%8QbnS&}gWOeL=W|>`oPKbyo -Qm>}nqNO^cxZ>$l|1$E<%kE=4<N~+;cFR$UX`4)CTwrYIUDgX9CH7j(Ih1Q3bX|Mc_=_p)~iox{L^V7 -FqHPHH6H|XDFt_rQ=ah12!XQ$(X_7;bO#WWo(Ve&gFI%7>8ZV!2krDqqqi?}&@K>SJ)|e#%-l+1{}cB -2qCZs6UB}GH4wO!7b<Ii%!_uyrPN96Z?x-H!V1qq>SJ(gJYvJrHN$$lWyUztH+-r#XFJe)gb@B%ve>w -ln>wdnyJ-_<oeeR#%778RzA4bv{w5-8pKA;Y=q!@Hl@NHzi0MkQC49@3qs1lJ3`sgW`)X-DfI@IR+l9 -pSH?w?D_{UsI2;tMvV^LYdGZms*fSx(e~;Www@3<e3$M<IGW3GEO0@%fP;9=_Tgy`z^q<8}CEYlw#F2 -vo3&x_%-!j5cW`@olLG&qlyD&z~K>u(oH*z|0^FU2@RTq1*rXK^W`p8z|qqhCQ2=jBI7cwP)DWMp?x_ -VP|R<LCXs0l%*$_@zjkdxuM!7{6Ro#9Z!bRFds%HT^wVcEDtclbgW%YuWdEHwx!_>&}N|j*!9QqPck@ -p^YYo-x2LwqCR}@n>LDZ;PY1nPPMtmy8E9EBAZVhJpy4;!DLZ`mvPzAsV0etIEEs}M@AK|kSzQ2uxWo -OUkYQDWaWCMgi_w5s^wE_V3LF9M8UWzZxJBMSY%zkWnqkubA6MvjxwTeXogIMpN-nZ|WmPKbyIK=iZQ -HBFHtM-AV#9g_cb+7w<fPqb73$CHa?8u4Wj8pF=zj*}jmEw;gM6g5F1yATx6pLyD4oA!%LeUB1xaTo4 -{7%Zx)THWKuZjb+xAY4*;k|_jj({>pfPAwynoH#++}Zd`Gb;y#!CR01_59y=ZI%t?&0|R+2+e~;IR_2 -H^=w{U;nstfGxkWqrIh5lg<ikpCi%Hi&sadnKODLCeW3rlx>rpez(^n_{%?c`_N}W+Vbrry%bO6SVqu -DGS$f))ka9?g&Y=aY19c7hb;uHm(sYBkfj_ZP{I(69I7a!EaMuP3N{-k^IGfz#+o#yKi1w<YQ1(0{TE -P60|XQR000O8Q5kVe%?wR000IC2AO!#b5&!@IaA|Nab#!TLb1!0bX>4RJaCxOv!EW0y488j+xb!dwaQ -y+pvcs^;E<F|KQIKt_VJl05B&W%W{`)A|PVAuVVKV|m63NHMCsNAW9)wUs96SmE)H~}V$R=1lL=@w`D -5i58YA54<-bU=5B8^3%5{@HR50P}3VSFDwvbAWn3;}))q`P0_v5nTBO4~f~YWuAyfWHnE6Cp!Uh%%s7 -6&Ts$?#>#l*s3v(8xDZ!yMf;dUXXtt!Pp3obU*{r03MyDmLha>x{8mxcbyk-m#~}<tczq#1#!=wFZfm -K#8VEMYqz5lnaBE!Kq`|43XrJgloQl+bRj<$oozd~_X8Fm!K`C$-~qv-)afQ*pQ>rFl|w)XmV?46@Vx -}s%L69j<S(3i$9i0$g;TG|JY$zik}M2EUSz8Q?)S_iqUl2NXsuBxSCcOD8mjf=VyKu%Qo3a{L#@>GCo -_S}xH&=e%*_Xu4xDA=NK(JgD&zv|l`%`Rn|raIr6}iato!FKtxM-o(Q&uozP!zJZ#UcRRi6KDpewvp= -)X15)B&IM%_qH+MyH-6N`Gs^IcQugN6(}4)95Wm%p<=H1~%Vc-{AF&fBUhimG!-h*|8QPkG2rJO4)>{ -E)2Fyc)n%)82=oz3OOzw13b1B9HbujHHgguA&0gar5RkgNI4%}C1hn6N~~oa->Y&_z+X^H0|XQR000O -8Q5kVeaUN<U1_J;9xCj6M7ytkOaA|Nab#!TLb1!6NaB^j1VRUJ4ZZ2?ny;V(X<1i4t`&SHJ3JGMxwue -0|n}xFNp-|cq3OyP*9@{FiWF$G>{QDhARuU&px2H9Q)S8($PxJAdrfG5ujVd~UU~6W9H?6=1r8Quc5? -ogF3n*Dm9>~lNdZr~E8(_KWEEL#k+%U_PG|MC<z*4IQvaIZEr!mVMq|%n$jS`*3EW9Vla4u9;5ng<a@ -JW(v1TzL+czbuq@fOUp;dlNc0eV_;JOrRDoQuleabu@E*4U^m77voJufIje$wdDQzy2_M5!p-<-Pu~n -o9`3X`vjLS@D@Aq^Xo5o3}u7|X|d8ijGVGq&dk)RA6{SuPf8-03oPN-GHcKnR^b9DF;+_N7Ep3Q?QiI -erU9i2Co6{#j{Ls^H(q)xa060VpC%Xv<20X1Z}&{P&qglp`84bBwip4-{Tm81X3CA}a^I)f0rjJ{#E1 -HV&=~{<ro|0sLhQg%Dg3CThQ8*T8hS1S)JzssF7g3Y(gxxQ)X{duTN)^phL*R>k?(-Liu<&z&_4RJS? -ZjR_cWa+CwX3L>H+<=oo<yuV%!<O`!&LqOV}`L3BE>6&6UO?D;#5i*1F{#qq(SoMiiIfqRzr;LMe;zT -$cOPIk9tP>rZRYGfBE+oer_KMW%rn*CC@Cq=^B$YpJ%@!H{loA~;kENT1G%lttqT(!2YY_5JVL*N5k) -A8=(-y6Rv(t<PlRO^{4R8HX(gV?$TB)Kii+5=;v>Cs<q5#&yA6s8Y}oXW<I7^GG^~3*9c9ZJ31jj$rc -hx&#(WfM;^mJvTJqKFH5jegNarSDrG{DB>SG&B!&>jfxv!Uv!G0h7e7HY7~)E`If8BIC6a$^7E0sU$3 -9n`}Pamq8K;f;&P3Y@_e?JasQ9HI3M|rm-r+awN`pM_B`(Y2u~1Tw@xGgF=ZC`&W1WrLBq#absCOlaI -gN}Yd;Idf50iFb&F5%tP?i9pj->TP_kIP>JA4@sD#Rym@YsPHU6TEk0t!l*XO|Y2s;K%87XGO<1bK40 -|XQR000O8Q5kVey;?u8x&Z(H%L4!a6#xJLaA|Nab#!TLb1!9XV{c?>Zf7oVd4-YDZ<{a>#^3oXPU!=9 -OHl(-R7K*YT{=z5+GyRL2#O3G!78zl?I_BBzcVyst%Bw!uzz>oci)M9tF(nel~@>0^nZ;ic!TFZjh^Q -{y!?EH1X2&^1U(+o<@V3-r~4`R2V33yY<lf^Ht*kO^HE^?usk!jIgVqi3)YNbanv($GztuIaWpPR*y@ -7ya+&8XpC4bo{doSq{k5b#G=_!Rx1zxy_o-gUUAjoJjrkI!x0_>_ePuqQ_)4sRAFSGv0;vQgx123H*~ -w(`SYz=99P*Pz1IB7<1C`QrMP|S%+K<*)*yaQ!TKWK6BcSXRy{^v_Z<?G_AHw?uhC8&a#tNynJi`HT1 -{pNs4MDXi0|rXM`ebV*V=~h<bK<$$PX`SU(s_C9J-Z_+a8rcFa&65~*gBvJb^+YcXb)O;VA_yYM`Yo9 -3g_mmtGR&{S_4HFhMTVv+R&s&nny?qh8yQ%y<A80cyQ^S+;#7zZG@#wY^2Z9MU;JT>&WzOG0PxHAop* -4;If2&_8A)Fx~KyOewt&5AsH<QcUm1<6R`Ad7|`dY5W;6;nOqOz3h@7hGVd=?O9KQH0000808trnO!7 -nRz@z~H0D}Vn02crN0B~t=FLiWjY;!MWX>4V4d2@7SZ7y(mZBoH*+b|5h`zzksLsK9#b{^o<uwlc1_0 -R!32C7WQ+HBFFq`LY0(X!GsaCI<b^1Vm$iEf-&A~;m;e5)rD`>N`MM@(+2Esq*O$sZ{m7Qi97wyLU@I -@q4<zct9SC)q96`_C2h+~P-vnb5Moi|EZW!C*EgL|%D_J%PH8Y;>AbRdA<47cdE13SqxMd{LX}ZW!=4 -g$NTu8cCDdoL11%S*vxTS}dnJQ(OnnOXXl<lpU+wjm|(?=%)0z9HE%R<F_QLa&QuQcANql{9;czHur8 -IEYsmb^NP5LXsu#jJ<y8_F}$_nd~We253cAerIXI$qIpv7rxR=vAs>+fNqt3J<xBIsdo&F`T}!X>j}u -vE2A$crgY!ppED+{Z6V8LB)r&qshS1{lL^7P-5wj+cHrSI;ribN=kXpv<V$Uh!<9Bp}Io2C?l+(7qY; -IW~HTUg4t!`}?^kQj>czFCO!t%aidB1OF2($r|<fW<_cLgG4ZFLJxJvVk)#N6I~`Tuix_<8Ab%RaBhe -tqEvugtt0x}x5URL1=eP)h>@6aWAK2mnzTaZDgL1$5v9004Un000sI003}la4&UqX>4;ZXKZO=V=i!c -tybG^+eQ$5*H;Xv1|m_3vE&+c+}cIsI7I*<2$B|gXbWORj>wJ4U1oO~Sug$e&MZlZy7U6Hf+35`x$T) -Vm$lIqB+0sQjlm=VS=HJ&5G$+8#$nPvk4D|O!Twk3wl&)RsV;?EYg6^l8)1}GxgCv08LlBO<tk0Sps` -Y`#5zOo!suoM^a<W0`Bt_Sf=&opp($tsZ?!^@Yf#!jW9hUNjf0UlFz#ZB?_VvKAqz(!l|!RMS#BYvZw -pzeYgFOeUzW>g3PNQdEVu%@7oDL>s9NL*R&4DQf;Vee%Mz8S$iD?vp0bkin#RYC85Cr$^b!OCzuH-o3 -TmTsBdQ>Vp9_-Mh%Ic8f>KbT^L9$99??Li{nJL9M{t@P=ado9jq9v!3Yiw*G184;yD3`BUPbB}e^n1o -?B%=H3CC`0ks{ol!sI2L*|v$`Pp+CIN0$uqMVcqp;&X!D3O=P+JNVI2{#L}G2V=C^I~c=<ZMD)RT^Fs -IIFgsv!R(GNZ;$}QDFY<v?woHAPDX$XEVS9*9khAyEa?exPjH;Q%d~^hbet0%&&basLa>Ohg3({$5F5 -0N;2y~|Nef|;+N%uMO%mq}gi#k>y<Na_`o4rzSG90*B}?hLG;~ClluPS`N--Q*o^rg=9?nCjgQqydRA -(3l!lqINQHx9m)j*C4lv0AVFv1beL^oJ-ODMz_O#0|bOxogPextCG=-Mbr^d&?HJzwK#f$3v%Q0a$}8 -~ofzgIQ9EPnw=9sbtku3H{gooyPD^7>j*YxK6!Y5V>GHyb*Frq4rs6^*Zg3NJT*GA-No%YG54{bgwm= -jBQOg!wOTuQbe<jP>!oDlQtEGnu6MPmJInO96mLQ%CQiR!p#fE2_y4s>Mp)oeeAoQHJi~P6=W+~h<e{ -yxDyCRcgda;h>!dDEyvcP8&X-tu#`#|J+V8h{rk=mMQ)F}q}|bXaWPw5%)g1}^B{^TuLyZDyS%!-Zeg -m3BnIP(BMD6q{_yU5pNzX-FJ>=(|2q0D_D6iF{wSCZ=@JboTJ3q*_xqTCgu%m8jVUMTu%~aND`4SCPs -OSnA;sQf?{FIItQ~#=$hEtHXEuOmaKNbdjdHTWkFE3QxFft4rNtrdLmCTV73W4bbr^WxK@`F5?GZPbc -L%{7>T$HJcXxZl;cnWUt)1}S(Eq51oSm9|28OacoCwjIe?;Iv7OC$R{j86BD_m?%DGW`ZzOVA_X}%#H -DdIRPD`^gQJRa}3AHxGvo~Ti6y$%fwa@u?FbNFU7CJlf;zM_ul3au9Lw=hd#a<qDUM^lRPbP`?|MH6o -!oOu6}DNM-5Bsw&E8DISmW?!&bI)2%-!`+#NI4_5{D6@<@ML#q7kWa!_xRSIL{Iq=Y@*b#?7qj_1@;| -()-yZ0%Q51!16t(N=u9Hzyt57K0cB*cvz(O=MXN40C@DcK@<c5}@92K_Bf3<~L)^Huq<Ara%NIB(R&u -%T2yl!x1&}JiTNo|$44fw!|BAL7yHrsYh>oJ@9rp#Ll&!pCMzqF7wUU_WnOJ@&m%jNuN5&8R)IFvpqi -ZQ&V+9p2E+P2h(N2}hN7lxIfK|_issXi{NGhAqQAF8&K8Vm#Pjr!<8c+u!jP)h>@6aWAK2mnzTaZIT+ -=>&ZQ001%z000vJ003}la4&UqX>4;ZXkl|`WpgfYd8JlSZ{s!$e)q2+dN{-ZQUkl~hM_|rimqGxu)9O -s-5!d<Q5-qeB1@hmH_Z<B-$zomYqu#jYzBhJGDUv;NRcd^ts&3LHndLWIjFj^E`V5htJ@&+_?{%)ekF -XR)hbC!I@hQslaGaLg0jZ<XD?CaSLJIFifYlnd1W>WxH3Kntp&+nIA`6Ho;D~wsBluO^P+0a);~$)57 -Mly%e;E*<y4Rkf3;umax3@U>OtsM`Xou-z-=W_Ut#MSkIOZ?077pp*b)MMtSx>C8Jt(bY$R?e54%bl` -5+w&Am$)Z8kNzjK*I&g`XA94?5vp~Gc9hfM6ulow+1xVpqDG9RoG|A&u5=MUSHi_<d<hRmv9O*Ux|0` -zn?L{52BWyz;xs?ICQJ3JubD~A?VefO&=dKddq}^Fl$&Yks3a^T%xY?);V-W?-wX<J%N>c(i*fO0%$2 -bhSwuPt(8YL$4+{ME*jpBz_R4#_WI+8Ul{Mj4I;klAukyGw?BN>t=@n0Zg!7;6k2%C(Uv~7t3PBB<|h -f@b98ic20JI3hWSJgt5)f?hq~24HCi(K2+x{AvR_3di>)W<HHeK+m^iF#YwXS(Z>(KIALGsj|F30<*{ -qBTd7gTy%SEUB^aC=`0U95m=cEx%)Sci7oWWWZfdVoF0u0BfvC0HYWC#|Jyx^k{hiK47PbD8w2_{JJ2 -Q3n^EboJR3SYj0Dtj6*{Rk{b?R#pH!8zt7?-=Q>NatvLnfiE6;=pwEB*&vMAt(?5_=eG~5i3o3-f5zY -?^Ufu5Lq(3UJHfT#uuIN8$!)*Bhj(j8;g{Yx5G|p9RtgWU{Geb#_5EjkyG>px1VnG%I^kU_h_fPPnnU -sboelz9E{Zq($ADjT#*)VyKmxh{?dqJ$6u7OboQI!%#78A?3}<`KZCb0GCc8`IVO)I*;7+JEj=SK)l+ -iu04S2o+6H4JQ`Yv()Bs^YB=tJEZXQyJk;L5$b2z4OI;SI(c#L>Hz>&mWVxHwX6Bn&LC3CkM)Atz?_a -eonDbXEx?Piop_ljxxZ*PTQ>0_<7coDdW{qLlYbVM2s-riBOOBw5{PGL)_I;Utka%zWF3fqD-DSg1o> -{hcm)pJrf4bkg(m@`H&3Q>*@{w1C5>gklo>!=I6B^GK2S6rU4e(%S1I#Qe+;ACa3es<Bvmg)0Lvt#^Y -bn~GJb>l|Yi{js;7g@Iz9Adg1@jJ90D>1cw*vT0-%{nT<jNpq%k^*i2*(xV#UWh=i0=Igclzf~GiqHx -jk96b3=nQu@PHfD$@npohhDi#Wu-%bu94@fakP<}avVUlG)6o3HQ;99hZirbfV;q)Cpb=#=iN_oGM8w -(FK`9=n=gFb|Ac74JLyl%30Y`Z2f{b<UD1+ZA?@;|nldPMt=k~bZ=}2h}ahB>PLT`}=kW@G0SD|-e?; -|nUQ{8BBUPvdgTyWIq+2D59+rLcas}s1p|N3953>o4QbvMy>KQ4vy<Zn<*0|XQR000O8Q5kVeXC~Kpv -jhMD{|o>C6aWAKaA|Nab#!TLb1!UfXJ=_{XD)DgjaFN4+cp$_*RLR)hf1wS6y4h}5AzatGvGRa9UvHr -K%gbc=0=eMNhNWA{SGgZC|g;p7t7?ieCK@UqDsjc<$2YbR?$31tZt+-h#a)!t)aR9pCsYDkiyVc!`Y! -b;qrK7;&|~FpNJ?qRk}NuI!TN=|B@hh!kIZKN=mCtUkln8w07q!rKB1OmTg_1^IjYg9qA^O4WVHTE@a -&h(<wc!w|DoC`{BAZjO*@}3T*=}nTl}rqWLowrBtYonoC7$lH8z;G#beYm8`0$q5>>gxEd8ifLu+z5p -!aCj+iKT>k#kH+R)lXh9EOwD2f$#@vqzulfuL4+@b~AN<ot($sxVDHpEak>r;TaEC^4t=o&Lo0ytugf -#^rj{e9pLhu4}2a-=FLX@$IkwUCOoUVO?thS_Z9ewQ8fC@7(q6Dv;Wg>eqCx0(VTYUxL^HBAfbN_3#X -EG<#xB0oE0R;s32gB^`%&5RXbLbDPS3?4atBc=}v1TdXMPoI6xjPlZx$pqm%x_ZOXPu^1EvT&p(k1o@ -Y1x2AfguNxksC2M2NADu>cXRYH14{)bTBEhQ0DeA8Rf8T?Y1bY73D|cItnbPlrke6<4jv1s%4|U2<-< -O=5SVuP1`whostn3tagGj<d`F8%hCtX>Y)4O*_}<##43sHUw93_UoEuJ`DaVr-I)^2c*Hu_}Dwavr*$ -n?9nMl9(xAsYAXolWjvyq_>h%;z~SlCvUJp|-~X{;O0j6K%rgKFvE{b_g&wDwA&2y)kW`HLb=`rf_kK -!m-u#|<r0CYp$zV5$p;Gi}nK3Yfow@VxJ5yf<e~@ou$WJ><*HCLjtXg8jaXZmkykM$5f{ey{)XgS9WE -(P>vsH|P$k(LgCMUZS=^1X)D33_K{rAP|a5Cv_svbeM5&?pFQ(A;jDJ&HZi<oQ=7<K@TwOkf5~GebXZ -#9A<=@g(r4AQQfZwUsP6-%NIDuW9GZKR=eH(Za(6o&mYv8P2XLX&8L+gm%HtH`{)0u|GnC5?jK_dPwt -I!O{Zdh8X7f+qGTq|LwRe*z`~B`s30c!!IP?4(rZED!``xMVuA$wSY7N@0a+i`5(emld}QM1PiZ8Q4Z -!tDw!HK?aUv1ku4IZ(Zgz!<<4`C_$f-&RpzY-}*ihA<3FI}2+J*4E4<UUsykMGX*bXr23K~Z?pNu^l8 -MAc87ID{Joj{a)SjttHs@}PVzA@%(6W~+l9m0-^V?Pn?wn7xs9L<<LJkK)6V|0c6MVd{f$&RWEK;Yb^ -9lkG?`|TRRc&)#KNNP;QGgDGv7@_IxVYT}LNER?|m)re%_M@(0U%M*sSsZ-!Y{!1DiT?gltMxHjALCY -;Tp@9kp4GUdFLLS@gB>>W4z2J?zN^Q=!KinHotlv7w}rQGEjz&XzTrKa6gogq|0b7d0`Y#r|3U4}+)2 -CT;A??#dO75~uW39X6n{eGvZ3O#vxiUJ6bb{rkWU!i1*t<b9f+pZo;}H~mgA2=z>(iRsxRbqV^armqf -a0AcLaJo6J5R|_zt7r8G($by1eZ-sw+frLFuoN#pFLwO9KQH0000808trnOh{DN>WKyb08bSF02KfL0 -B~t=FLiWjY;!Mfb#!E5bY)~NaCy~OZExE)5dQ98!Knx$54QG#VFQBZLy)9v(DVgO)}qS-fsxKJ6Nyww -%8pU=zweHErQ~!5+J2ZmBofIx9-q5=?&yV9Ig8^(X-f@p%tT%&Z5h8YDl09-)%RplkEh&%6*)BDcSgz -PJyW;0Lf$r?%0vaX%jVN;%w)2l-3n1e@d{+BG;2kZ`-RA0v;b8k_ng!=OIM(cP?B-O+PSzM>}`;!9Cv -Sotg<|d4J1mYX2#y1y*hdQ{-Rr*s}wTRtbVh3bJoqFZQP>rcKWZ2)3@>Q(ed-s_~h*EjOkKJGNP0z=y -)ZxEqMlV)u|}0=(K}01a&I(jNO8bg*0ef25EZ=UoIkG5IqZdqas;Cavu}Av06*elgZ@b^!yoGbo?SdI -l4TJpS`?fhb-9pFyG7Pd+Fug^Mk#Y2YVNP2e_6T1sdmTk40$4xf=`PSn?d>V2aC<j2pw=wdc8jY;jCG -Us#NSP~F@?Vy6cahEEC$j3Ob0jpNYZ!g`z@`iu<8&`F%xxOW{M(VY@9#N$PU#`%XC3-IJ~l5wYuD8d3 -Xr_uI=ohzO)y95Rg!dMCor@UQZ^`_gLp0&UoRRJ>GV#<^vsU7kKee2O^G6n;Jr(r8GZ6)9#fx@!z?De -VE3cdS|XC=7zsjt`5`RVhdh0yR7I3s7Q*c76Ph#5;ttwGwDa<8ZC2|KbF7X?K)TWf&|Rf(xr>NZatip -(X~PI#aL*1?xRaTug!UW6m8K8;4`2{4Xq?Cb~*yp!P8dO<JYIDDtG?aKPNpgIqxk;LcmP<yH^Q<z)vJ -#5V3r7pM4L%}t-N}Izlm<5Q`K``}Jb!qcwrfzul9aCn=Lc#wiWv;q>zuqN%X6yxQzH=fuH&Ghp{2mxl -Gy;YdWQ{4cmJU3mY;>Q}n^sILm{emv4jWIQ1o7!s5C=!mfE8Hwo%Twt8x!_dP}hyrw}c5p=Hc+o250c -AG=O-aNS3i%)l<ipfI+}zIy@m3AIBJtQUQi>oJ=&J!D-ZasI6SP9dPn3c&cd)qH}zChA&(9^07p>GzP -kWH#^9Db=13f+@(%9C^NGyaR!m>jrWs=){LaT8PD#{u>(85uCUP46&JT?)}!nHq~{)9+lZRDnW%x>61 -QX-w;P0YKw$7Z*3pH%n5pvh@%E_lx9{g#W@~L|%){=d!MgG#Vrl5B-a80_imDdaK6A;+f_ifIMJ;3Hk -aLj>>zHDp;bRFh*)X-Ja?DT;DwzN)unAlP+(*orKwM%FG$a#1N8+TAP8;dri4{mf9Ttqb_lg&Za`w%j -FJ|Z|)T9;*x26hQr%u%)qF^S`0!hJTYIC~E3B#rsBYtbM98$YjS7G$rSPl>MO39HEDx7*?;|8Pq1X74 -L5RQ~q+x61|rD>N+t5;2%oPIp)x*Y1~EQ&Ojt*Ct|Z6eh=oc4(I1T5%WNTB0mv64VFLg6vd^=9dy_KQ -8P>r(}J(JiP8DOCuc0R}7ltnD;ywHTSFaLluv>?(~{eS5CQnLTE$LD$v)!sB_@z0gB--ZOa0p0YpKkL -=gq@Xzl*yFX(}8o1dr+k@%4U+>=b;BQ0Ga}egwU1{)Q3`5tgxt4uzc@~V~xr%91kZl!H(0y)<H{EI@3 -V7n!xYXGgXX+4eo5N4RQ9{iaa(}>!A`{gO_$Sv`4tnb8$dE{LVIW3Ea#3EI&|fnE^lD_r%CXtXg&lG} -q~pWTlVN2K-G*dWIK2uqWWW)G;QEo<19H;gBUwHcn2tv3cJDEsSWP2gVr0774p092YW~Z$UoM}xHnrd -5AtU3_a|{Dsk@dI@h+J#?g{F4WW4c^f*n!~s+PtpKBNyt{hM}l3448hbhJ8wXIy3>fWt?A~Ky-tswTp -i^9Ef|<gZ2$O%yfleN7QAPC_Q&Sp#)gz*n1&UwRUxnuarp9a8rUA$XCq^YN!5`u1Hi);Q^u{yVSoPZD -9&LNs_1Z!;5dk4y|8bb|_K(UK0^5pk3o+2tKINb?l|7?QSV&&&=3TtpUG#W8}GDtcI_+$oLKR+W$yWX -_l(YQid#Q1iBepja$uA+F~WRW40|y_DOwJFxh-wiMV3FkBagfBOnUKxz-DU;f<|EW_ZtbP*zvQQ}+)S -cd*uwrEpUY01Ga$vjOB-L){b5rLsyjIv1TO!z44^?~KZ|WCN3NV{AnhYS4*JC;tLaO9KQH0000808tr -nObzCexaR@@03Zke02TlM0B~t=FLiWjY;!MgVPk7yXK8L{E^v93Rm*PMFc7@!D+mXMB*5XNw*WZ=O;Z -GIQzLQPLs8I-w6d8<q)Jk5{r6o`qOFGmxH?1;cXqft`*5LEMHnj@+h|~nh^kiF68>yd*;ruhcN7&42N -f43t+_U!1M&_aU;2|M>W)ga*$BA_pJs15|60_P?Lg*ABTM$m9V`%;8ZuD`(B=&A4q-yc2{PF0*A3HPR -HHNK-5$*FH-p+D0oq)&n9g+wn{L2<_GbxWl2@oo8bwhK1<AIMy&~`LMj$z>_japfGWt%hB7)CsHuLZI -&WDJC*e#G25uztTlEwh3xXrfSz8-O{kE+nf(>($fN*c0W=?2z;HxQ~KT+ycn<3SyF1=7+X*Bvj-8DzO -aCaG+n)e{YvTWT&00=Ojia>q-NKZQKpEz>l&d<PCKS~Mw?#!KixNpu|f5n;%KlF%ydo(r;aGW&MHw^l -om`=F7z<#b&W(Ao<?oRs}M0zEs3kKJ)>PkPAZ3GAf$ZT=VJ2M{I8eOHASY~o5t|2NahW4cR%+}A<)cE -FOD#`HxAnN++^jMWP_NVLN+m(I_tcfZm!je4n!II(bV=G65xb~~%U@|;_q<igmle^Kp37$J@2G6Qc}4 -9AMz;@LgM;oe$2H%{9WtC$}Ic8~L<TW*fG#9uzFZf<W@H*uO?jf>&ogP?kF4~7zBJHfjA^zrik;qGgE -7U>Z^7;cB0On6V0K!D|%D(4XeE=1Pt$m`yEOeSXP{!ao$Yjz5|+F~G?MgKlLD;4%dda6|sIq-DJCh=n -jx?Fltr=QjPqd+L7o9O@9YzJ-KjQ3V4{U%LQyZwqOdx!6B8zuucKhkq^$bht163<Ocu!-7T)kx{q{qi -v9b2B4zGNn4S7!LajWY(|j#YxyGoztLm$8M1h+`HEFV)S>#Wc_hNdi$#V@u7dXcIghYn=QLFhGJo-_t -)d7uml&c-aFjon>tN3n&?3wO-GXx{R2=-0|XQR000O8Q5kVe7NYV>y8r+H76AYN9RL6TaA|Nab#!TLb -1!pcbailaZ*OdKUt)D>Y-BEQc}<Po3c@f9M(_6&VIpl|>;+_(f`Xzjy&IHLGc9gQ>EiFx+aeQl^FeaX -ml@O-*8>wgg7GjS-+bv`;D$R{!;S`cIKF%jOw^58y*wQEhuv;d>w2}`LIpB|IJxUR1^z>e*n7pny>X# -+>pIlBnukUH#oOwPY?y<br~(9e97F*rl$<0rDV9!HwPiqak}8Jpj72G$CNxdbM2a8XmbRl2<!^ycw9- -=VW2;PE1xzoZo328sJX6^RP)h>@6aWAK2mnzTaZKgnkd<N%002!b000jF003}la4&UqX>4;Zb!jeedC -gi|ZyU!Ie&??kP%y-`sg>=tL10ut9mh$8x^`eW@IxFdhPy*@qUFqXXI2!0{`h`pE_)%DbZr-H^&pA6G -iT2AJD1_I)*F^(%f>df$TB83m98!03!}@%ip+nWEXS7>@=hA5)npPLNGocqb!p-Qvon6Pkt@Z^xY2)_ -vzzN5uV25LvqCI+Q`$@_o2|JjN>N7&R>6KiA5Ndt1syd{XMwN~+bwA5zIG&Gn|@HXii;`t|p3-rsb -u8!Jl_-!65%;Wjh!53#o*4TR&$l_2H{p)9u~aJxFY6ROa4C)oYLyR@qHsusqi3*IjLj@NT`t@2uIh-i -t=CpNA{S&6#kd-lGDrc3pAc`wy`!v5`_pRT`unZ5Ys?aiCFQ2tME-iHs#iL*^5l@cxEH~!;fV(Z;Acl -0q`<hs-~-|)#9d!?;mdI^VFE=3K2nW$?GfpV^}ZX-MqyOw6oq{_>tAm!iej1`-gw3NXsK<L_$c2ClYx -X(pp*-Q5aR`Kk_W7!pZt(BNe$dus!DmqIFW4?0FW?82A1`eG}CKLD|%Zw;RZnG$SmY3X^Syc<LU5jGQ -mb@$%Jikr+VM68Fv3f-=!mX{l#pzO(V$P;<&2;V<!dbKvvMkwFutKYI%Wjq4vh5m<+fpQDFe1V57iPu --p|In;EZOgkL692LAT~TPOM4|kQVT-_O;b4|G)jV=Aoa1v2qMCs-@LfKW^l&TZI(->ba(Kx)}LyDa96 -F!k?$9}BqcFCCYut)N*f~=U^QR!n&*~$6|!wPEN!(rcq{GNuZ{W%<XS#@d#~89Ef)uRC6#U}yUU=Q5= -uqPr34F^-Bn_iB=eJ7Pj32cpOHuK8foloj8e7cMi|ig^|z!o>brVJ5*Na0o#Y*;<h&Np2ALPw<6aXc_ -$Tx!8X-^%>Rm}h7W3{Tm)<kBy1q4ipYZPB9Ra$h$O;Az#Fkv;5`jP`k~;*u``u(@Mph>7ota859olvV -Y9pS0_7s@@uBDoFvL>k$Ma-f^iH{c_vcGt*eCd|BXg=<BZd+-@!HUk2CX?(t*a8>|&p8sqL#&+>08`Y -vmjGh$TsJ@wII%<3nO^)3Dk03L)2aLWlfz+Bkx&My&}$n9E)ncXn)NIprz2cLj1){Ob}M!Z&1<MTo{@ -TAc}G^nGQBm3+N~-zFAR}hh;A)tP~hkWsZQ`a=O%(Mki*Xme9{|tR?1t!*0Ml`VtG>=U~2+GYvio{ab -8;dW8_Abyl#yhbOmQ$5b1LROTq6Q2+I}J<CNkE`CK$-i-sVGT=Wk12K=%o>C?H_h+o4HAddV}lbA#d2 -SLLd^UO2#BxTpuDa%l)km67aUvlrBx_5;%Ike~LbUeAbfrV0mGDuYlWW=4{`jy*C3KNi)QqNYki=`sp -&OwcWiZ7vQMzNy$O83@mkz~7;`5Kl$jI2Qvi^Y8f_rS_RlzfN30+}txQPPJjLJ!)lC8ZgdSw%{Xs<DA -K9y$gylnJTeiEOooxqu$P^)5mKexlDfE%UM#yx6sxpiBjT5%-)vr>zsae_W<RIU{YB&B%G@>>;mLNWB -jq-fro?qzks_`t)-{vXgWgf=R09_6$L1l5_zu_V*(xA?Y3l+uVgvlD16kvoq;PP^`t{W37m&_Z8(V7L -;z8e~a=Ci*1jFOTA%3641oB+&qsN>Q3s$v|??cVS-Aj5OOZCsa)yN`+0{Lg%|{@9(!py3}-b!LfX`aA -9+7tl!#nJbXho>YhG2NSHzvUz=9WrWIiW?8_M^Q9C-;+0K&ikg<RSt#$bOi;N0HWv`6n9L~;*-<bWhs -Dn$-}HJ*1wd?>>AY&!SO-=pV>kD5y)KlZoa#Md3T#f1=I+*s1<x^uBpb{*>sS|<*e>zrrYW8VgyopM? -qYn~RBhn=H1qXkWQJHZGmh+7g?0{OOUSVGi83=N?gC<@b(Q`Byh<!%mEe46M%&gVr;%sRcad>9A&YE3 -!~4nibg0g-4n01#Bs;)q^fP`NP7dke87O#=_1B8So;xg62^zMi8wg1)svoVZjN;2LgNig8WLPRFP|P% -Ir$W}n~Fh%y^0p)C}?51{*VU}3LT_;h&n1|B8*aa0_Lu)#jQ5{Q}Elug+~Hrs1jVWUUvX+ppI8$8p0g -;K$Z-L)db{343|0E-n`*FC!xDV=qne2iXZDsf2jj6J{8vS5FRTDNnB&?TnnA*%2@^juf$ar$_OBZ0Rm -_DoMP{DfV$gh(UPOEW#jIr4!;yMY#9pX<mCUX8PX7wmzVvIp(D%oh86_46`KP=eD)J7?<ZN$)sHulE! -Y(hiT?Nr8~LKSWg2DR!okBOwsI`aLX%GW3g`+2@)-4TWmGadA&+%;mb+lu{6*SQVFu^=+tE+4I*o*Np -lB)1&8VG}k)DwmxMyI`l048l1>wffB&v2ab*b7}6sZ*cxU==}UE{gs;6<I^r1d=z}wHOAw9v;HVxg$` -pc11XsYNP7@0>B^_E(-{tkarSXj~X{SUjs9@S7=i5gQpsgaE<tb~BYk(cun;_8Pt}!%vAhuAtS*=|a0 -X#rS=}w$_r7Des&_bC?D>rnQl0~L_0T+g7uDbDsRi}ZGEZ#T8mAAxX5AXU8_X)+{8GEr7Xi>e~99F6u -rHF4}MRdDRgRNt&+RlSEx@gcr_iYyR7ux8WS4=mxAG$dGNPAQfk?e>9-2SW1W1pi+d#AzQS5If{f@HA -IM^5W1&icN^h%F(fIuHNmz08ZsUK$Q;n(b4g8nQ3^fQN+n7;lF~L08;+l?$#tdb}tG${5HRn4k$8-z* -CLtoMqPTA{i*!slm7y)2tS4*y>W?RYpTbL8?^@$enrkA#sz@5FTXNYxN$ArZoZJ5qmbY@r+Lo_6KJ^u -Y`<nWIcdiU$uo2$^QNl=uE+R|q7Absv2mcaORRnNSuzB5s%*f04*1#2(DV<Cyxi4n9H3UW%rinz`ZMN -IBqJI^%|gK3z`z+IpIdKt*^57TT+mG~eZAsHpsivGem#Fu1JV-`}g~o2ozqzRy`_?Ln>R%aV4LBNo^6 -#O&1%QDbgN__Rl*l!}O)pZl5MuLG&W$wM1cy$an$u4vkaqG-6raWc9sa51{ezw4g;wm(YPdas!g(-f& -^U-&aQV?PQwp3IR;+eY2BH`G7UH2@1YDrQ2f-^T>*N*!D8!ZdjQ{v{0_&CqY6vJg3^>8`YB+|lzi)K` -L<ku>jdbG=%)|7qmuZ&yrSbDPr;o-2o`nxdW%Q`R1P(F3CR)-+@~^S2R5k4jK;`o(&g{I$EiOT)h#u3 -+!lUA_3>WvClwE<-+xGxh&OQ8^F9oSN?>9~P8D6SVgtA>ns%<O=OTskL0Z=E%#&+As|O#8gN}p>$QY) -@A=Dz*QdSbsWu;7lw|RhdDphvAt0uJSf&Wj^@S1KN=}Qaynx-0>WEcnP-=mE4*(=$D7M)SMkeAR+rM4 -MwrX5{`BOVFi;OzH7FwJP=8xScVsW!L=)ZgE9iwLW#6_pXxFcQcr&Jy;ha7sLj>5Yck$SP$>2U=NXTz -j<kiC^J(`32%b0ZD0{mXdjccO@Bm9v@29A_@xXj!j<_`V85wKP<=+GU`o>&X4JMngp4w$rIDfT_?aNE -sq_hFlE1+RQVLBD!HT!_-r6(_B@IHbLwG5qpxuRbnKpCj}X`y7o)(dTb)qvD4#G4FrW93eG08(;ZxEP --D}abvEg7au<S^Kv>;9h|Y3n@R$5{c!D@kOR%77YSagZ-Esu7l(UKXyWQ|`sC@K4?UqxrE!1~-^*otU -wb&<9Irq+vf(}b*?UtHbEWrbtmu3ADGxrN@1~K(NK5A4dred6F;<MUX4uc4SuY^{*lBF)G}PQ9tV4^* -ru#f@WntIDu*f{=Fqs6&rXQQ|G%)JZz(C4gllQWwq9$guZLO_{J^o_nt~^b}^WMC2A%Jm&wDX9|J!-U -8xb8&XiP|ye@xCk=r8IvB;QGlvX};pJ>&od(Q&HXdVL>YENq=0sVbde#)!f(Eqd+m~G5VUmP!QT+&K4 -zCx6IJpj7u`;Y^c-q3O#;iQ1}rul|mg^G1{aZdUNU_rdPd^qa7QvwZ<JAwe8p7qlXc~CMS0X0iE!@D! -U7gBpJPanEPy%9eC)cG2cIaK=4G+eNYE+bVB_-7<gAVf+}A2i=i7W<o=@BEZPdo%%MniAv++C_g{w16 -hg)Bk~tGLPkj|@EM1RQH8w;5W;)L~4RQ&X*-R^c>xvrp>&Gl+PXuAO<VoO~pv7}{vCP@65Y+`Q>15*0 -xNif|9rdjM^ZZVlix<~^CTBUGl?Z|hy}Ssu7dJ#qf$IXP!QFbfwH&L>t-CfwUHpeoX~<as?Jr4Nr&7t -+k3S)g90Ba(arF6FA#{sV*tNEznD)Fo>vfW!1-&QYJuV5wrc_Hkn?5klXjVQS>Zd*W{|zKM)sf$a;+( -D>{tE~Z&u)Fh^#q<YJAYu#>BeDzAoJwoNbr#kO{0I!LN_`K)@ggRUf{(3maV8oD`buEDc!fCy5fgH>H -gvr0lE;BB5OQuzZ7QIHI1!ZYK>pT^zrY%cp@#qM8E>+MlMK4Xj2%qCb8F(sYrc`>~0gob)hKQ_RHUw$ -8FU9EQD>pzCcNI2!I30PVq>?dCS}ve71aNB0mZXRPL=6w?NZNxoT>MP;KYgsjBPFxT|H4wr792I?|s- -uCK<b@@UAB{;k_Lj*Nq?gJ#YNIPB;<fs&D?FP`PO@Lv);_-?@gXYnR$nscO<(&1MdH}nOCKDoWGiH?z -R*Nx*e#uU@;D^TrY+rI!%O9KQH0000808trnOvqNnOXCdy09G&n022TJ0B~t=FLq;dFJE72ZfSI1UoL -QYrCM!|+cpyZzQ2OlU?I72<R&@b4na4U%S(F&+O+5<y$@-ir6t;CSC&*#veymr-*09}O4OUzn;1dXmd -N4onfD>j&(HtM^E4Bh@hoG%zq(@KPADyloFzqGsUn*(U6*B{s`K;nvz02gERI)oRVxw4Om6WF<4av+b -tPi+`|Qj<7fR)Y`;isvwanM<XQACUy{RjiHNOt}%&b$&GKzO1PYV@kc^hquozPLOvP>@B$|YA?Fs_+- -9Mf-azPL?9S;2O+oAHvTuZry!cHNG`^_u}<Ds`Fh1JJ5AbGGEkO<l&RRCAU9NU^S$r79Ak_56&Df7G^ -8Ld=1$8=?}6Td6BOJ3BjzW26zYOZFkyB|4b1U@fXxt0Y$9uUaax6?qkWgrNwSP%zRW7s0@v=vf%YIp2 -Z+kYbW?t=aF1zA|zOi{+mpsb<fJJD|FTwbcRWeELj}bh3d(G_j!dhFFjl{@JYY|K;Bb|L9d!(%)T<?B -L8)tU&rQmsK2xT4XD`2!0;0-)JS^cv~pZtg@HY2Bl*pwJH?baV3jdv!0@Plt2e6vDM8JU${}Ng^qJkW -kmwwtw2ABmB=nQ^XU9~s5Y>`^Go(5`e*cyIeQvCWoaRF9#m|@cY+bImEvney_qRj46x=^r9yvc0HZS= -(0N<r!UJKPSvUSTyI^J@*;bBoMhHg@;Iobp0O+9*lmNrbX=2n!K59l=3NJu^VXf-W&_g8$&h!Mm4CsV -CqC1||LWi?SnqV=gq*F9M*fk?Nj#R@wW76)y@%3?P5i&@FWPcq`%|A8|k1f&_qn++#=C~b*%|ULSw<1 -#38i*}$9hvrc0|m<qR6$Kj1}{Ok5QU(pOvVR9d#-Zu0AcWo=Qz<3Cy#xBUIa))tyl0#7zX{NaV$ZOq- -0-RdN6d}eQ;Ah0<7?TjMr2wYv9y*1CbJw7QbgLw@AiQ={g@Gc8TUSXE^e*XK9EaZs890Q<3$zK<qbzL -}maP5^6O3PKpgE9#t()5@fq;wiF2mcL73S#-)R*(iYbef?(i5g#p9jNfNh!fkWgN>O6)qX1njd8AYu& -!jLUi^u6bWTkBYXvDEN|SB8VLb}MF`ITO)3Vi3im0Y||C<KChw7VvrjwvpTvbrsA;IisME#MPl3k>`X -MfIT}UvYhMKF&2&>F|MSq1t7nbxd13&pBI_}0xGOg)Tsd92g0#pbh<yzx(I(z-+iEVj|$kzmI$}IApu -^}pC~K#U^BD(TE=Lou*NZ}X_zgw5KpR{6Xc~KJ<yD1iqEi}G|i!ph#fp|!3M)KP&ioJ%ZI!q$>{nkqc -Gh>$wC?gX7e^EH4h%Jp8z2=8k-J-Uvm)#^|#u{hCX}cWi)LV>ILvNi<)E3V13;;T&*D(eDlrC9>4kV3 -~_*gKnecurwyH*4N`|bRgV#A>?Q*pC<`sCLLDqq_+Y}9zy}B4Hkm&|bJt8)95QH1`3fE3vq+1wV@7+K -KYhYrubt7U0vE%=Ox_5VJp1F1RgtAajk^mPJ7*P_h()tbnaPS?g~WJYJMdvdD{5RZ^!S^htEH)DR@PS -n>__Wbum_L7{nt~H@P2bJQr-&4DpR)S7&HLxv`$3&%+B0YRjHpX7LZYI>LvK5?V>!Cd;w*~f+*?*Qf% -<A6wh_Wp>`7MHPjZ$bLjS0C&~UEI1#seTV?>k>pywEE-;N?OP~Xqrkz^{j<@U__Pfl);xS~ux98CyXE -F36fF|P!I&IANV?Wf0TQZ@O0?Zp4ORKlKgy939pyE~qeNBa~WKNVClC3j{L<HKA9UxEN=UKs1vmFUF> -YQ{1;t0kZz#jKVv-K!Hic1KmZ;R?jL<<vek-kx?P+k89oPqA|`sw2^bZX)xDU<@Q;cxN%Z$B}pC*jdf -lKn3aRG31brzzd=*_}ALo<J^R@EV%0(FcVczj%HHEF3^m5TQUz8E0FbAr>~(f(=FNygTKcRSA#=%=ix -Qd;ah{$fm0zDYECFuiwF}=kxwF3h+<>K18*KQQHG@zknx;pAY{j%Lkyem-MZj*jgUATu9bg@GxkC5v( -%rZSSIa<JWsGe&A-vv_l{>XOCwe9=B<h@vRUYsT!O!Q?dV53xo%&F5@e`a!h507<}<P#0~~h_-NE{#e -x^aHqz|IC9{f|L@q>G244_^y<POzuX8gxJj#3!%myBeu!Cj0>WgM@p9D~|&=DeKoq<(tAWdh>0{k$?% -Dqycx#KovMT)7bTMf1k6H4?Rvk2=ba<3#j8%1G>KRO5oFTt$gCD;*|0i{}?1_NKvPXK`LHhq}4&)rtM -+@gUfN2Sl?--2d0(RKo&w{A2T6<Rg=eQ@C*JgJRc*ZE&{QK4na${PK)*x_%U9~wH~)n$ec!L{p6H13` -nse1ZB)CH-hk88Uh!wv05x7&G4|38`7)hjcHRr`Xx4{pt5EiwhKC@WAnxdx<YTX{lHc?J?%tw1yK1j^ -uJTQI`zB8^PV*rm1N!Mi6jZ%@S%V!2BxF*;1`1FC)SaiFd_unDm(BaC4mb(!+Y2!V-IQq%*3N^ZcxV5 -V>*$a%Mpqo`G4k`@;*U5zra)4O8{>V2~Db}?@(HZDvLa$;XsG_whu7&5P~k;3&g#>}#SGy}g}UxVPTu -fLc>LP>NuyqmfAGzo#_nG!rbJfdbMf=$fYpiVIkIP?g91*as8*p{aEWZ2fZ?-XQjvRmUq=rbA*`7ScP -$D+^lX3>`04AZs<a{=lG<Cel=mwx4rywvBYqL?4H5k0ZbUjcr!YTh_bWEFg>z*L$y3cW}&h-}f>F@PE -hfDj3pyhCXG8+E1ijPZs-m-L){&okIR#1EnNfW$aRZW6>qT)KG<S;)4;r$oh%z%E5M5(;~sp+~bjdz^ -y%`6pOZXpry3sgZtxQ})=)Nn9)<h6XcWSsK;x)IOPh0P;Vb_QYiO0Wv>KP2hjCu{lK|ECXD2ioq+q(6 -b{g3}O;ZnCkKf!ayd%+4Ok-Sj237dMxg8^yLsP{MdG=fvscu$Be%JvDi^UbhL33ym#RO5WLWLHhS)}b -NqCXJwDd6^XY-(s5MJjzdpojblR{t>3>cK@#;pFC4%T0mo`3tt9(=ykC3G(7_u<Ee6K}%RQr1dV44W1 -^hbqha*?AlIaPM|(TR@n-@_~#&lm=wo>7u8XQ7;7ss>&++|Oi*f0r{lqhxpWD}fFjI7<9)Pe*-znL(_ -MO6L^G1g~8_k79AU;QJ?tEokN3SY0&1Eot%Sn>(a;m*j>R`}iJ172Z!k29C=RIoj+WEF54t4(dbk7J{ -}-W+@b3Xum@+s?JA%7-(4kEJ&B&7_g_%JDU!J|6wu&%%sJ?nXSmo-adT$@h-*cK?*hc?5s0IuDrD`8R -+4pmQA~!z$D6z<3?_exbIU;`BXEWwA`cqd#G~e=+{&V6E#B59{b425#%0#(9pIJnxU3M&3*^X{j@Zi1 -FP2}6E<do84Ph7IrgAi5EEI_R5m!y;BtgPq>I-wfI@pmV`8<F9N0^sf*S;zce*vY(|NP>NfM{qEp&Os -O5Dx<T2S~1DEfdW*0Ks8Js$Lr9CiQ96>H?vx<{`v0sacGNoq(j^S1v(zP;0|#Z<ZVVGRW;CtT+i>ItZ -7i(%8pUvrqjPn_&oRU4iyk-gde!bo>$<m!#9%Or~Gv?En+TV}XvkPsG_w)5-JrDBrGNlz}r9=C%xJ1| -QN6P@;?Q5Sgp;M+N#nfPdYYN5x3<MWG8u0Qsf+O?m+N8`B{dBx9<KG{?|HkI*83ibI*i(FS2-S<2i6$ -Ua$I%^&%#Cv=J7`SF9_In1^^w)6Qv=8sgwzGt$@9)lDNRX%O<xAOCbsi_?7Mr^*u}wiaHpM>HRSHIai -4FuF?^AQIIO_61>c%%DMJg@>T6iLu+SL&A<OoG^TPYrkd?!_r+apa4RYERQ{{}|~)Ecb_4=;4Rv`aNF --{GMf{L>QfIKa5Q;$<lm<BBdQ^ls&uqkNvG=DY@owk-%lna+AmPD+Yor`XYSq_X2O!zSW*Cu5u9t)eC -k`^X;Rv*!KOS$mJsurD(b*GZ{XM{p<2@Z~q}is_{JR*0=<H8(5SFIS|Rcm=apI6N@dKchEqe|huv9o| -+bK)T6>%!5u`UBS?s_G4~ZNo-%J6lw=27jY|++O&2hwdaOX!Vd%u5z*2ZC4C--;nJ8|dnL5Fm$Q<n99 -CT}RNzjjh8H}>D<(r2HlxHN^S!x=iVX6mw_cgkFjgewO;UT&jqWR$gXYHQhxc6Q-q>An8#Ual>38`oG -3=)=52i_)cwPP<>6~y2A-}Q>P{?1Dk|_iUs#u(BVtUIJUSCQ@1=94L-Bu(Uo=d$oXAQa(351uVyO7Un -_ihd`ZcZdHA43xG2b)?^G*vu$ff6re*}k5C-^>l9)_;3@fI5PslLu*3FC)S4c*A5Wofu6dT+DTst}X| -+sJgdpx`_>5nCTLDcBk*@O$cYvB(ta1dei6+yhLkZ_bikXV~%NaPs_FPA=EYpJ@z!m=t(dn0y@*Wel% -_h8}@8>tVP-=!r)C0#*r#~?D8dLlM&Y)tj)kF1ioPBp>42S{r=WNA#iE`oc$mxW;^yj3kCj0^2|Iycl -?t7&AGA{NqkhgXc)GS?(6?hO9KQH0000808trnO#8sh#WMu}0NV}#01*HH0B~t=FLq;dFJfVOVPSGEa -Cwzi+m72d5PkPo5Lp<KcV(q%3KUqtMcXtj0t8JFw0$ua1XrRgb|q3FskNQ2?+mF6Wyxu(7gM9*T+duw -XjKzRi`KT9Q%XeLC~XOQG^%PXr~ZAl>gbg^9E3ddugdf%%j>2P6<@7x$e$m6`EXBu<3KHiAwpV3j5wv -Wdgdl=bybPSv|-xtmDT6_6@jNfJN&2K2FF2|>B!XI;HQi?mb`O3Z?#t13+OHZ@AAEs)6j?}ZLO$G&#! -B%IZsF~OjEHlFxzruea;3(I40z8u8mOgjgnTYYUIn+QC5oOqv^J!R#C8EwOV1&xF)+kdg+1N_l_1*Dp -?J2-vC=yF=NQj>@#CJo@&~7ACVWtM30|!<OsRYJuMxGnm39LteVNJ^dC%C@|qhU$L<{;Co6G3ccryWc -sBiuG39V9Mjm&ZNV=<f3OM8p<OQHhNMR|B4X=s>v$FeLNr?F^(+3FZ?d{VMPo0y_(zb!%_)sJS?`_gS -3<#Lt9j@MxKhCyPlKikE-=^QE-zDUA`kLg58yQ(rvS&_O!woGoJJehPh&7Q)(o%5EbXJOtRe`jR{2+{ -l^i>UcY%K@^ZcF&7Q66Qiiz`8tw~foc4@EkN5e0#qGi!Amf)e65F$DsPkqH8UPk1Ap@TdG_xy<8z1aW -`ZT)%bc-{r+2SLl|uU8X9PF$*9J?0NCx#c+Om@|9om4zvz=Mp&iKg!vC(1;z!BIX6~FCvcFwC>L7^1! -MzG`>vAKPdT3BXzMLR2twg)qtR)!Ic;UbvZuHgu?aJvOp0|0zC%Jyyx?7*acor1=AH+AsM!;T1na@uj -L9xuL|Bq3t$Ajv^F*3&FQcx}$-ePT%-5}?nW}5%ax=KvUw=qQcFcFZcgaM+>@lS}Qe$(~+TE|LGJMot -Kq9K@!h+7$F?Itg%u(2^>`;MubXA-{zMrXT(6UMK&OPx0B6qEG0>uO>+9qd~PgH!h^ro#U1jP1J^g!; -ydyA^nqh&${ssib~TYx>M2&xvFI0aHX0TU1|qBm-V%ll}HZ54<QGp=sbV0R`l01IdWdp%j3O+?oCKHT -AuwlC`WqWCDZ*!csUDtn?qDaOm`OhQo?72?NPDrBMJ83Lm>r~!r?0oZ{@YlF43HqjicsB=aP)XqPKL) -sa>neuG@tD?GTxQG>a+q*EJ;IJo#7;vL#495*Al`X`{HH*JKzVAl?D{x|HY$O;890z{G>89!Z%a`z#< -*+c=MeHrizpGFLVrneY7OSj`BQHOiPmykQxQoD5+)T!p!}2Ew{WH(6j|2E<`cj!j8qpC!sn42_FUfgB -EMN>*LULFao!AsoEi6(@d<j5g+qoZbT#F{2CLTqdP)-~<ydx4-L45M>$pRGp6Tz^=g<xR3(A&kk(>nz -Gw7}-W+Ni-ybOt#0uO1e8`}(B9P>c<xxu2ym9<S&K(iiNU{>Bxf95XUp<{wv&Y3}>ZbR7Ug?^*!CME^ -blR{8%RG1%&LOc1f(LL?`~8l8c`pIQNB2U+a<yTJCgXt~Qy*yR_-G~@-hJ!HOY!(+@AnA1ufp@KJ)!i -3tpzr<8$#!#1&#PGv`Hd_4ydquy{qdzIq@g3zmU`1Q#X|Fc>Z$@-wtwu1@i(xjT^lG@HwfS*vZa~Kl+ -BVE1ho&SHn9M8-+NB>c&;I|*R}6Gm{eG&B><pW<F>UP^ukN~mbsM+#n!)-I?uebO4nFYL3I3d=x?9w{ -wz*mT3s6e~1QY-O00;n48F5S~zTPkZ4FCYWD*ylv0001RX>c!gV{<QOX>=}dd6imikKDEq{(irLxWiS -Fy{ogEwm=uS!j9|21%f1q)1<}vpl~Hh%bX<2qI7%PqW`@!e32-LyLY}1ww4+WhcnN-k;+?9ktE6cu5V -eA5MDK+?FijTQT826^zVxcGhT|K;B{etcC2c0UNZYz$he{1{^BA>wheFMR8%lx*-Bb5ML)b}k11<9E^ -29MzNXnbQB}0gMylk2)tP8x$sglNJTMveZCUc2ozu`(GD0QM!-@L+{OK+G+%wrZ49v)qMMKkjiYka7S -Svy9g$U{)F>f7B^c^pUO=es+B|Rpntrcmju4RtA59vS%k1O(vX7*0hT`S6qiwlqv=JSr+PIesIaU|&L -QzYgM@IiC37D$X;<AQbHsj)CgYA{xkL_n67R7&zK@4~4h(dL4{9})tOpx|Ag1~T5-v3MA4StAlVoR*? -ydR(S^Rxt^qq56$~iq%T}_j2ELjr%O^4=MNd(IH281uMk~L|4+V91zZH-X%#WS(&d;Be&m!1S|4_wgq -VT#f$p`KEaL#A+E@;qP>@dwxX{yLTf@B&>^ckR0Y}fg+mIA8A0(jH#fBHcv`Z!01&fSw8f2nLSL}3S* -KcssGpnHfBMUxU%iS3c05N3H^c8yO)FBft`zBtXygD&+vAGlEiEb(Oc`5QH-v|1!U4EyCNV%+9(cD81 -EsBKx{{&=ZE;#A5-h)0#=-Trn{~<R5Fg`Gb}eth;3kNoyT$yP9gu2b)N}k_da0()h|v8bazzj+AtLXr -7?4)dl!d{kPlyVT(3N&EXE_23X-yhW3B$Se&Hfe!h?dM~-mx}m${w|743P6W3xk(IL|&5DCzjWw+s!! -t4yYZWyqh<YZpT@hyJv{K@@Qokl6?aK0WiNJ=sr<AcoRsobfMAfAetnAZyOAi^EqJq<^4|||MA23$&c -Us%Y+YNgK97k*^yhdcHH)LlIrvjZUgf&fGx_sI3%*mMBm+hLrcjf?qmpK*@1Iv>^rN^9AI41JZ%y66Z -#SH43;`IJqVl#0m>jbZz0WmMH(TwPI@9I-JTJ5?>m-K*)wM<3?2Y6;s9v@a;YSb@iG2SY{p`+3#bG5a -Fcx?W=UuIcdVf4(S&Yt*z<HxXnCMVNn}OK5;8!y$M9woP3+Nr5C`$^g4f}oN(Dj~j<%bx?nZ653`&W5 -ng;D82OI1W^P7ps08Wbfa13#IdHMcP7a5=*47iv;Ky9Ku5~@ehQ97X>GYAm8R!jzNz+zyBl}ZA633g( -Ombkjl@Hq_DS{Mu#kbc)rj8K^CYs~tgWih_(+T&&(Vr$V20yu&8#usHRol3yw@g)YVY2=^de!*uOfYY -b<0R1&Uf<59!)>QqQtAE!`3w0Nc+jZ`i9>4IQ6-f`-?Q+`?y#O_{t?L@bQPN;(B^w0sheYT~&lnv>R? -2Sb(Y~BQ;2q9Y1_lzYplIm8O>)sPVt0-}zy!-`Njrvsh9O#vet<5rYiXTgzNzRDf+5R@XgL%<H(0n)q -O~-l|0e}ysn-Aa;q7bdt(pzY#TC%#IaUa<E4bqhT5f407zRa9b=!eTav7omoLH;nL2aSW8R@QNK(3LK -8`2y~UXRO6t#Sn~D$!Yyrxw$Wx*eu&N0xVPfP=-JT7@cLl}aC=7Na0c)K4rqUuzyrb%h#3W~re*T|)o -zo#@L<c^xKI5M(MsaE<jMl&^gS^ARBx@8V01z6rO;C#eI>IiTI7_9Tvn=Xcl-wM@Y%?ORn%%00DV3?L -EXKMJ5b=qF}aLyeAN?*R6e30mmD%hE>n24b~x3X1$=@-t?Kictk;@C`bLgjqrHs2S`|xf99?zVUP0vz -UAoI?429$1Cu%@(8I3{()!os?pU7%4<k;?2)Ewd-9ZTC?yYWVPT=2!cEqWVz;mEoZy15)BVH<swnYW! -c#&(9iH<7qonqfSUUk0n}OnWr^BH3({qeWAW{MMbAZK~BZSLjmR*_*RGG+rSBb1I*(4<37B#^$aCSw$ -QT0X6KqY`uS{D%NR9C4}WKO|yCL*|@WH5kRtVQH+x3erBypI1GznW*VE3+U*TMQC3%T#fL;6of80W;u -w=-cP>+BQ&(i~?2OLY{%w0?SbG1V1mAEAR`3ZZ4T}mIJLj$O=QU3BeD+4PhI#O%)ZDP+Cu_OUE3uq&U -8?;eVM87cp%Lc8|?Z1ul;U)Xuan_q5HP2IruejR77Rk@<zd6}t}NfCF3yIMzwstO#SMm~gJ!b2?QCWb -xh{uV4x#A(-`AM)M51#LtXzFtK-Vc9CG=P1?*(RT}z()5>KPd2=7HbFl<T@U9e?5@B!GlBhif4tv9KH -92Y020EAad~r=3)mWcY3m}_2Cyt#m)l#b`T;N10xL|fge!zT_VOARozo`SlhVvZam5zHK-oO3(@^C{} ->5eQmz@3Y(XVv7T!oMf;!pWJ|CH)jr-GH-VcciKYJXiv^^SSLH`jf6}-0^ICrmJJ}&!4`tb+K-5O~uL -T6slry9hSw@q>rzquc4m^>Za!P8U$Lmtbj&sOx2&__{ArcsAt{GiB4wNhDR3jq`TUZ*Ps%o;lc7gG5Z ->5AvQY{t=+dOlNG_DH#8N7Q`anu4&rMRy#g$#b}gg#ZiEF=ccyLGVTtYQJ4Xr1jzAylQ?eNjhN|o&7) -%YCIPv_9S%GS;>I$?ZI;i*f=CsL_w9b-#sq?-pb%%8h!~f>2%piRB4LAY9IMf{i27x?MW*vG)b;bhqh -zn*Ax9L0o;S_EOFq_ZO>HmAS0#GIdC<09{Zxt{B?-WGNuJEt{NJcQM$m?k|IigZ*t7LeqsY^|Bi8?m; -8v1(okZ)+D@)_=Pd1L$p4`t^Zwbs9w<DSvX%MT3q#mvyyK3-ZgUUq<uw@S$z&l5DE>hHk&_0b(>9$Gs -!v8N$2G~v{96vU<q$HiACiHr`<6QN?J6p`8S75TVV&2`3_mZew<{-)zWE`KAE*C}AI3t*$wju*Y?<t% -KR^SycN=bVU)ke~2#D4vm(D%zksW50~$d@e~iII`|^Wn_+w&_sK64KdAA7|Z_qzlq<uZp0nw$6(_TN^ -du}cVBq#G*1jCOzW$r20rkp&ZXzBw3$|_>iFgaD!zcfb*!hjTR43IYvX1!&MIA+8OCi;a~{4ATT6Hcy -tRoI{{7(G1u8W4yNm;>@i_T8c+!V6B@jF?br*){g4U{U;^t^iZwhltO<Ezk37D?*>6GST2!@x~b?c*P -Zv*FKOQ?f*w+7nh<&-Cr$`H^Ut)r&RJw6zf?qq1>o7r@f+ET0Q0n2-337pgooAymHgs{Ij4x+ivtdb{ -3q>1O~d>}aNdC4aGV2@mOGCUz@V3!D@c?Sl)-`S-U(fHmjU@pMJW%f2o9_QRn7g^%_iu}p~0A1HoY*Q -ed_04cxC~%Xu_=XbZ2)$}WFo%K3J*-fpn0OXS9XE6SycPfEXRd=AV2B*N3K~-Ay;}|f)3PL&epco}-O -l1nMwfnQPt5MSubht<*Pq1OtMg90^i2$J=A)I+;@2B0POWIhEHYqu)rpVjvs~xtu1(d&Hz)>gXzeKq# -|G7#PeJnOS&9dJ#=Vg^F2#Yh;pCJRuV6Rx{=;xqA6Epbd2Pgaic%Cw(~950cs97Bh%t^U4~T4?xmI<i -+cP=BJgr7gi!td<e2v0q6#H7fxt3QT&#k^i330uZ%Wt*Vg>$0jqzSw3GJkj#?NZG5_nEu|(f;6)+@fy -Xfn|yMdC{M%<FeVUx|?=>R2N!M^2n~=VW%#k_P=K&=p}34?1k)byBqv<qd<Wl(x~tOK~e5EH#fm}a{u -$5Vzp;LnW=l~9=~}iG1?S+j6z3(BOgD0&_AT8SjX|}o=h-V2cusdM0>9nqC~G`K6oG@i;Ea9eE0n>ip -kf|ULBaetfQ6&0?oh)lOuk*L_RRANDoZ4#}8PW>Wc{d1qMX4O!sg`pS;tTeyAG%^#m9(KouyM+H!C4V -Gfm`y^g3)X*LU5&)JLqy2Ct<AFC+;8b58qg{LviJu;ntk>Ni+HM8`$EaOUsJFFF)J5PW9dY+>MHFJK4 -;T|}hthr_-$P=j>5o=g3vbUCI^yMecB?jS8Gg@F>bK%D>`UzaK2edt~;Z9-NWjnQ%(@$wNyis4#fj{g -;Ht5BC1ty2Y7N(^<r548uKo!Ny$>;MDUg8boi*FaOECaR>u}>AC&#F27Iyn8eEK#2^N#G?l?kN=+yA6 -0zi<Sl68(fuQMwF}1O`UH{y(jJ&+x10wnGR)6#vp=J>d+;}x(4q+>x{Lk;x}eEQQ@e+OB*W-=Mdn5@{ -;aKcInvLw*#e>i;IhgRDur|9Iqn~1<}R-0Z>Z=1QY-O00;n48F5T`Vrm^>1ONb#4FCWX0001RX>c!gV -{<QUWpZP6a%o{~E^v9ZS6hqhHVl5xuP|GNB%DlWUl#^imQ(uBo)#ARvJA#2aT1?(>>S&f*`@TqS8{I7 -WcJcqV8C%?>67$X(o{ybgwm>az2TG+(RSK6!aiFqd&lYU9!2B6)O9UXJ-uo>tsHN=N=P0>6>986m-kL -cJ1H!M?Ie4q9dk`aOzRBii|DDC1!0+y-?_0ut2?cn(Q=V1^;t>H%1IctQKxBd0wH?hs?;X8;wf+SiO; -GFttwG>%vf%sC_-PjA&1GSyyos_zn4&|SPS7uL9CF>TJj4wMQ;R?$r@XF8xeR=95lsE9sBoEm}x7Y_6 -+YdopuYU6(9C((eM^f9!P@cGt}~-ajpxNc3fNAOe@EnDE3|sV0xpxBK!$mO)QsH296aVq}2!#pPQSTk -55C!8cu$yJt`}lHqV3&n-EOmv|pCoI-$IdSs7@UwPDsN_zKu30_5#uiR&cZ4_FW{q-75%r(=jN?^VZ& -$7E8me0An|!8?naUeQ9gEmLK(`ijp(%uLaU6OR|Cj~TIzK2z&T-Mhn&Oj@3i;#?lKCM$4K$_ujtNdtg -$knLHxq8WpXG0HG#Kx=-Yx<lhO2)WPuz&(hQwmGsk|DuIThO^$kkug5GrU-&HpA6}n-?NI}`HkQFM)F -GhhJ(4`tV{wh=`|tCT@oWe&p2?F^%7GE{;lO91P#$0SD{Kca*k8N?5K_+BW^e88f~48a6Abl7YqEU;G -HAMulFB~(I#6v|4HBT0>kV-dV6qSZD+XM`I#97cY8~j_)hn-Bucw6oy!#u?*v?goxO!$Jmwe-Wh-R?X -kgeI%zcRau4E2*8t=cxNAe*g%|K5iML@RUz=~|wd3MEE*GoB>3YGtt`1EJTfXWNL0Mc|TfW6)nR9LLl -6t)7wiV9^eF5hAm4nM%_ar1rbDOgTP0*Qh>fu$L;mBwU;@2}+M!osWS;}EO&1ZsBiNQ3&AT(1LJs4Bf -mQK2e*ji1mVfVrfp!JnNSm>6dpLA1Ep42*6+hP~LsPG4d)K36z0G%uvcUg;HK#sHww<C|*!Hq}P@yxi -TebsgU57Y{MEg`uAK-h{<2pDNvP9f}t^$ZR^d&WLW!WpADeOHm5BJ{6M$i|CpH1K?ncNmhl{a2U%JO3 -j8=!I&8Tazvn_8Lk$|cZ3IuES#`IezE&W$kO2t(D3KK4$tV&C93OQ(T3UPU9Ne_f9{&nCI3Hs^RU*wS -yRB5ue~rZ^Qmc2gB$6t`iSJYD4xkI7LpG87z*c7pK%%hbj&#HYz<D8w{dz|{k&qFBx8T`I=$4&x~84c -U!ccM^C|+&aUb7NdnW}93VVp;cj?2o$7@h74f^POg39q`2Dc>G`aJ53clP_8{RW^NpgKa)_v1*mQJrn -P3a-*n%umB$|Bg-zBk&LM%$_Yw9=3-7;jBC!x1`i6cBEx6Q-rhf2-s68ir{Y!3}iKg6|yx?9%=L!P)h ->@6aWAK2mnzTaZGMBl|dj2004$0000#L003}la4&Xab1!psVs>S6b7^mGE^v9(T5WIKxDo!ozk;w~NI -LH-af_nOBEHKt$Q=Tt*CIu)1=d@EUU64COQJ$jyLOBI_s$GOiF)xm{Zh0-5NOHaa5$WK=0)BsS+XSAH ->Ob{NmyRiQW?hYwJaJV68n3xXvYhAIONsA{gm3hDY01WkyoA9adH$@DpjoW$GDV7q2opsMSkzN*Ia4A -xMp@Zq2J#6yh_ERBmR_E5B*eQ@<O{QRT?G4lBKz>3;qOrOg18oTZ!EgWL=pAMtj2JuHy)=OZKx+I+xX -ZSs5jZ#UjziDtRo61jJ30V7GAEcqhv`FGLu?;O#}Y`TNE8I=ToVORdClN(nDzZj4A*Fb!+&Qg6i^Zx# -II^QScn<Lk&{oTG3vw4d9l;ex!{OA>xgBo*B0Zyd|9MBU1H(cZ%Fw_*HE^!63L!K%dql`Rxdwpx!5!h -E8!Fi9$2f`uX3uHag;KR5SBtLbp4@o2qZ@E|>~3P6^C2GU%)vA7#lqLzsp-eqF<ARA++H2f@uhKZ1vE -Q!~()|q?FjH&&1-O&I!NJ_hkJ%eMAIzlaq{Sr>M;|Any1;yv$;^MOaAF4D9K^;rxv>GkhDHEW+ducMp -;YAw-s?o5bTMg<EV11P|9q(8nT^$Cmf+z-e(x=>Hw13>{0XW}v9PkN#&r?*A*cqvw*6d0L?5bnfk%E5 -e#(-9cnQE#84U<=CIN-Jk@WerX+U;^MuQPc{v`K;8?GL=rVmK`xjpB)@j=2KU`e*Rz`=5Rc)+~4*{Hr -I7y0?;>T?R6Fz7T7{)h-LIygg~YCq>bU^<YnHe({N`3N$=C4k_q8uW)H9j8J7>2?qYf<etH%%-IgAZ8 -=%$LrmD+|Bx=46DAe+%^?i_Xq9d<ZrILBaW5<orfYUr;ihbSQhXFy75hn60Cf0&Hw#(<g^?QKgOW`h- -bArAnrHOtfyaMCxo*4v4-J#o4ixN94AtBtgLuTaaTXUo5D5q-NDBy9I!6y>+>YW!8cDCI&?c{lNyp6x -3I{FDdl8tdw;a7oN2r%Iu0`-e8gHb7r)XqJ77hdk?1VQaOE5qpcU;jEw^}DS4D8u3zK)J|rSV9lbK0* -{O~(iE%nQe1G&DCbM5$vmhFCo2+URgbyY9L4f(c8d&{Y6Pnm-5>g3JzYp25i!;}s)@n8r-`bnwYmtG! -e^!S?wh#1NC^kQv+qlN01EvMS*A(p02y0y_Fl{F@0ko1TQzqvLZPeDT=?*0_Q#yB=KWHQNkyx}7@H1e -`sS#YnQtT9ZYCTXtsUw(wLuk#iGR2G5FxEVtf%O`UQh2K#;WR(9>&R^wgdz2SM~?cy>1AMhG5XIQ)*0 -nagMQ4f<B7J{*Mn0cimjNb6OTO;5e&vFR-?MN`P{lr6+aQ?!VKC5UJ_{rgCP#<?d0I<N``~8Fz_ni7j -zwHYlf$sENIG8b?E+2%nZuRA>Ef(+IIhV7j9MzVJS|DQWo{|E}65n_MEXX1N55`nOb&A6QY=j?506w@ -hEN{qEVt--`g&58J`6&eMAa~BIMvPYms{my>zxa~<@bPbd_^<|0E(*drc9QA=GuMi72%@_Oeh@4J=vy -H-3{{wdemCLtAjlF|LHvsZcl5W7;WBd*!d$djuWq&x)Mh8B42HKjHS(VAISmoTE!|TL?^70iG<Skrf? -3=|o7dZM#HTD^U=7YK&j$ML-BtpmrIJ79WmEQkjdsF8$$O}xpa2Ftf#2+qL&-c%)qSRyAeIqpX7~e;Q -t_%`pV~+XWo~QpWJKtxKC0P`Z`td`z*_IQrrKG7_giV;W+CRDc=7ODuywfNN-?xcw0K}L)i{oB)?3(l -vwhZH?a?X;d@C&&ZjNZuR6AP?77$}~bC0|hW9BXH4y&S}H35%Y=wy%QcliWaraisC5-_4A5288$8>J& -X>)C{)btnkLO_8z_o=jC!f9c$Ie7G*c7hd2>&=&g&=}4!D7Gr5~6rI6c;#5AQNNfPJdjS?grAd-&eiU -T8O2VmOZseb>I@)z$Nc}G;Ke#fsRCQa-Xy-pN3~Cn{tRX0aMytbw%XWVBLte9d2nL?TgZG8*XRpm@?C -*|b=<`m;sCn-Ymn@S8l0p&(>qpyWV0;gC4<n0g^Wp2(OKs0#{puCWLel8V>t`lS4Pe;kvDP@FXOb1Tg -ps}jyGJn6x4mR)Y6Nh}{&o8G4dxl+(?1V(m+T{yb8x}BZEn!j$OiM}oN$D<PHU6tCEX)0WOdMaDm*>} -VR8M09+HvaN!U<6K-TC2joTkE!Q=%J?xAde9YCAK46DA;q4Gl)$Jy-^UQZdo-kfg_kisp))=;}e5RG# -ruFcu4h^U`;8??~#OpO4S+^@MEZZd~Ce-#00P;oRNz)jF$TUU}Rw=P6j|D=s5sRo1eXoeN4n9O*r)c! -E%+X47oyeIHO1=E#vmyO}4ue2a%3=vCH3XB)?tN;WsVREYgd83PI#)!}0+NUJZWMmTcy}^0d?XC-xht -6##WY79f*LoI@JJBYiZ3p^e1wLIAwBmzOQuQLah=Z0h4rjfQz8KP`m9@`!WY|=tOUP%3MA*FF&j33&9 -3;bnh^HP}QBp@f+L!6y-a^s*TdLN{LNXV2I+4jz7c=~!(D6?b;_v_pe-}hx2D9P~=-zxK-OcNX$G4&s -pun)?b*PQ9c_pO$0x~Mg!zP+{)!pOk-CYGthSrygf(XHk;2$aoOo*vGb-oHGnL%^6<k!RK2_}b?>n5* -Em~P%|BkO0BprNz~CvcHz#J**37-WkKsjw*Wb6^Va6Airm?y)S!v1QO)?7tMa-Xb!Y&7@|!izGkKA#e -Ga7mXmx53!+L5L&<r1NeX(*X&ARWjy6R*AT_=R;zt;3ZnM2iYvRNR(&O^&-<nm6EZ@mx5t}mZ(P0@HB -*etc*2AR6#8P5-aTEjK3J{rqRuvl@OhzokIxh+t%B!14!J9bk*M#Ij@LUq&q{P&`J>NR{Vm{*6MjR#u -pm1{*6FplR0yTC9rw+405v!_X~Fb~rjE`Sf~9;t2{H5emsUGC=a&ZJ9hSR;HpEOsLF*p1w`P(GIsp(u -j)un@%h!iNH`X@>vL~C1EBOlq;8FFDRcAZnzQs`?j^mWyM1Ao;t+@w%xvtWlO5X}dx$KpGccm|Z|E>M -X72>%_jmwENUT4Sl!`x@bms^rhfPY_{_>;y@bWLdkRJ&Y5?7}`X0ghj(w{ntO*{$D!<(Yg}3P`uoPMB -xAhJK>m_7XVMMUXg2O8ae84jL^e%CBn>?j%+EE@*kCvB$xYy+Sf9rg*98LnQtNP=yrH10$1x2OcuEFZ -e-wTrgbVA~XU>!Q`RJ|6$wT?I(<Q;ZfVqE`w^Lw&>x1^2a|5uy!%%mC`q?TBJ!O3|Ijy8h+<QPO+VHX -7w(JHmjShFM{JT5CYMv&c)7t6`pdnwcK(n!qU!S>eIe{X#|!v^gd}xc}JN)bW?T5ZpE2cIj&qR7G48t -+KRSzGHxvo``DXcr2-<iE;q!b5pAnL_3}NzrWw}|l~t&gy(tC*+l9dPrzbG^YV|Ac^N6EeGH18=rv-6 -8tYSAYBXMUFYID<r2sS$3QKQq&50MQ$3|34{=Jha8AeS|9!4)&%VNP-+bv)OEZliw5TtD+!PNPqd)77 -&py|2UWb~<pFz3Xc-j8%7S%Z`5Q7&!K4891V#7soQ_J1cGp81r$5ExQ9mhC!zzTKpSOO9KQH0000809 -6@rOsjD;R}lgL00#vC03!eZ0B~t=EjcbQE;24;X>)WfX>Mk3FGNLCLsCglR7p=xE^>2pl~hZQ(=ZUe` -&W#_0SRs6dqqL0Jk(o-mUHVmQ^(+VB72h3f6q8+Nf(u6>8Z+mkD1S7cfM1r)k>+y24TNFZ$CgnOKpp> -##+5?n7h2xx-<5NaXz}LJ99&^qU1D29Smb;ZTplkvVOPUDJBYVqy#=@HX#TJwj&8970i`VZ(zTf>W00 -PW+&f?M`tQe#Xum3fO^)d8g4`J5rvOrd+C&)k+>k&jfoBexqlf&Jmp)9FP@wJ09$E$rn>QCB{}J$P^2 -#KP0l^SW0FD3+|MzzFW7t`e#@AkHGYgM_{<ZxP!siCt{jmII4X=^^mGu5!6)ubz&Kn(!Qp>}I<u(p!X -F#id|fZ$RVjc3`#B*-s<D!CQJ<@Y_7tI1Re^6MuH_Q0)BDy{x$zk4T+$Y%*TZ-Kd2k8<mTZzko*4yly -J{mv2rrT6WCow-oLiF_(_JeePw0j9S0D3IAJcUMo+)YTfAju2kmz6W(-tK9j+W;x8#yXU=ex!UP0bC~ -Wb@SJM9w4eU}}f@{eUUUEm%!^d_UBC8?V$_4i4xDYl?MmSuLLal=>vvXNo8{T7oo|%WC-u(h`U!T-te -^!HU$uWXumRZZ~kb3DVgE*v7C*M6LWcv3|0mS<rw#I}yPenB@5gfli~r^eFw&<9=6-LGA7p=YdbB)9t -|5$4cM}Ixg%4*Rr#}08mQ<1QY-O00;n88F5Us7nsB<0000)0000a0001RX>ct$E-)@KE@WwQbS-IaW^ -XTLZgg^aUvO_}Zgg`lba-@&PR`FO&d*7WFHSDXEGQ|C<toT5P_R`1l2*BinRy_tF*;w*3|WK=08mQ<1 -QY-O00;n88F5ViiglWR0ssIV1^@sd0001RX>ct$E-)@KE@WwQbS-IaW^XTTWprU=VRT_GYIARHwN&44 -6EO__SHeAQ)0TEE15s%cgCS9AV-@WinoilBcMZ!WAwSwxQ~!7D<O&_);UvUU?wrs5?9X<di%JRa<%0z -0iwXNyT)_&Iu`TGp=0Sw$*<`}b*a@3CQ^zVuqX&3#ub?<)#Z(8-HPq}f))I6DgzjQcNQ7L=3baobxAQ -5xwAPswdf@-fbiul7LN1Jz71`(JA*_W1wx12!KSZf&wlGGe$e2;%MB7T;uxp{4D4Ikw+k~aj^fl@U<8 -S%`-}VEJd%}2c;OoA?vwpy7YZZ{Nf?AsIW}D&;o#6?a>d{Ig@m$#C!z<IaLf6^0cEXkwA`H$!0!fP}9 -g|i_O*!EA_-{58d*8a<l09?O5QJ2j0;2~}g*2AW1t3->zl1zlNf)9}pjYo3XQK7IF{V*KX%dkZEhSbg -mcWpT)h}k!<+KYCF_<g1RCR5tNP3jynp3F3S58_Ih|pJ`<{!UKXN&3W7w&v0QsT~hhbolOb!mS#nRpq -3^^?H>$+_KF!KE3zs1=^9ap703q-2@t{68zY&0TaNFLeMPa1v5;8_?iHz^c*ZzLq|e>m`6<2SYv{^5G -!`eT2>0xH@}-@S9R<AB0kLNj@>iyn`M>v|+cA&@^=XZcd_9-HIb2Zae{6>~k%GC|B5!PTdh7?l+Fgr% -u6-C>{7Rt422$=eV!Oug=GO$dA%_+MOeQlzgHtcYfXUkQU^-Q(`Z2s<AcIV^Y%rJ!nO46M|EXsVnry4 -ld45`S|c<k=c5R(%q#=@)0-1ZFb{_dv(bi(EjANlH_6!#<5ORTGDPYt*9PxRXryLV*I0!|CjV$C*Gm3 -qhk9LP)h>@6aWAK2mn<XaZJY_m%;`B000C4001EX003}la4k75FfKAKWNCABEop9MZ!dIja9?a?c4cf -Xba-?t$SmLj08mQ<1QY-O00;n88F5VZ-O|2a0001P0000P0001RX>ct$E-)@KE@WwQbS-IaW^XT7NJT -|V3(rVR&Cv}@Eh^5;&$Ci6)HC36Pt8j$N-W7QvQkJ&$t*63F9)en&@j+5HqbNB<O<5qFVXcZ)(t2vO3 -lekvQj81Doy1INldp=D5x~j&CAbA)lJN+gozj<M7RJ@O9KQH00008096@rO!~i<AEg5T0Qm_302}}S0 -B~t=EjcbQE;24;X>)WfX>Mk3FHJ>MK}11RL6uh9a@#f#eaBa9rw?vDCg@9&PT0t;E2pU@iKB^~_R)sP -6^Vu<PynRLzt4i8M9EQFNiX7X&)GW;_#U0egcH%9XslFq0_Xgc-G~Yk&{DJY>zDkLpR?Phs)XqhxGNC -m-TVp+rmCv2&M*U~R0#`ZK-SiYvXpgBAXlgwv`9aT94%*ms0t%Z&j}RHX`93`1>(BXf=d;%tA+?BL?8 -oX*kY+P<uRBdtb{Bnz20-wO5++)V%`3l8`WsbbEWbUIpxLP$rNi#q2AB#*jwzD%49YH6t=q`l7viJ*E -m^Pu;?1?i?D!s4x?u_FNLGRssujWyuJDG*A1JN!dkhINU2_j6sZdiZk=$Ag(QLJ5W(E2tVtbpFebxei -Cer`?Ly<OnoMGyqNiPt^=@K^N<8Aj?F_E8HmW6R($}^!Z&B`)mZ=Bas)bt$gIkHx``;Q_W(1>xw}_N= -ZbVi2`Mnc$-q5r>ewZaaoga$lFAiq>bRgs6P&_}J@$6v6^8*>PN|)#dB>dI{+q`2R@t;N-v{67Na5<r -#o_sgCpmTZL|DO&2=lqyaoK|K8fBmmBA_0fiQOs|?U%S7i!_XfsGW-naQ81an(EvPpiX6`f{BSur<7c -No?nASwk=l7{pk3_6s#N-UADlMm57tg7^QtzPOc?V5^YB!|*sHZD^@>Ft9)yM~lgC)cqy*$EP8(xrO7 -Z2xJ=;t7*fBiJf<27()h_v?0Jay3c=W{!SCu{vdAL?-Gj7LD7Xxxy(0<Wr&;Kt_jZ3>3;*E4g^9Xaln -rmv_zx0|Kdk@~#0H0agAlw-$)YtuAj97ZC9f+SS8t_u?X(bIVa6R>@j)yn#SBk%C3buzj(juaZCGh)1 -W*?^seD4iFjs4vq)+$3zX77EpdfGOEG0s6&{ze<GG+E``781+M`fd|b#%(_U+vW@a5+_WKZsQUp$mXi -`6u+!{xTh^|r5*cR3G2}83`OLCj#9abBle9Wv~ICeCQjv=_sxRH{|X<rz^K15bz_zVjY^qrXJCUOa|L -E9wIRzuwmtDtWI4vawBg%i683m^Q+I7VV^bO&s0B<_?XPDRZT}d1O};x-Bb{h!q)5GX&@;H<qhv_u$U -;i49)(4F0{wP_^Cy8aJAt$ijv1vYdKPuIwW5~LBu|>0^dC+nA7!bQeSjcJPjY;?=Y6B@cNxcmm&@g5! -7H&Mc%&9l8sIVQ>=#f=0|XQR000O8RT*(i5fKKgU@-sym|_3`8UO$QaA|NYIW90RGA?9kb960fZf0*U -Qbj{gQbe_!$&#Z;x1jfJ)^8&H%{(l6!6-n0009zgFy?s>g8)5!qpXZ9g(4#FUEE$&WkhA!cO3WQXY%9 -T<=y}Byu8Ur&-+ie?uN{VQ0)I&gG5tufe{xOzhZDMNLYeNM>^AqTsz;|DZRFdSA)I5?Ld%3!2kWfx?i -N)&znyq8#`uukz+Z&8^O@e3=UKL!s0y;xk-kn5BCO9ii>-Fa66Ph{^11v5QlAD`%UzMGR>-X<3UI4X$ -i*`I^JgYP^Yzu=B>b09vk!Voy=qJOg#q$0{_A~zaQfMg+(2eQ_RDO*&BVE-vPEZ^&raS3&85rvY`)*7 -fBLLM!*gP5Dfi?71mMPjd|M)FDyc0LLMrQ6c2@bW8-*x*~9E0NO{te1rJ>&CVM>QG@R2Nh#~mzkBr*6 -sapT_3q4!%)x!|^^GS`!?LQ6`t}N=qY>5=$D5il@A3GR@g0?#t0#W!MQoMxmmr>F8o3NK=c+{X^4~Y^ -~7QG(VCrVRp$6i-tLv#gK@1$$FBS7f)3g%4|FE11sv$B!m+z`6WIDJd>zSQ(^hEgWwX816bvT>$JlvY -=92a_cFd(Nvi^xp?W_L5PhZNp$X13eC`*m!t-^;?(pM&1(z1)}xrVjF4D?obTE{vma7hd}7)r?03RT* -e`iV5%@Yrh_A92Qjek13_XefK3wB9Qjo8<}gN(ZS_dv_o#-^AE&_!+bDje@z}&3utR|x>QR?0wuuN_K -i)(Tvxfb+r-51HJw#W!OSl8k-{YFIIIdnG`uS2H258Fn4Pq&m8jvgp^A#qX)#KEp_9M6qi%1?TN#B+Z -_)t#o9yd|jf42uOzJHeBzCE8M&$=V)ky@%ln;kiUbSw(?#SFZrkXR(CwL>uc4d{1Wl=rWnxhJiY=&l& -#XN+z;<UYXF2J=u4aj>=(nmZ1S3Xuyr>Fgi~#)!|rC?CeYeceI`+fFmtg}2CAShGWe{mB5JWU;SJavA -nB1I`pd_L))cU;;+S&%C_zqo|LE*CEb%9o#|=@8_8_t0`;<YMc1T+pEW`cA`Udkp#cD+G~^U2mr*f&& -alq;y#X|JRD!3$Z_DO5VHv}6^s)jSkoT4Gkp(%uBOF4?gHWcN>YW6&pQMlk<ZL-ecFz^NneQgoti8=$ -gpv-j=BMf4~g(d_E@v%eXLQ19fnIO0;Ny1+e{)L4t{3#@&2EmUYJ@Kxd;#eZKe#7R8z<ZP%(80v}+EI -{BWmc3O#Zte~6tOj>GT3v0p!rv4oSPN>ER!fomvAPDbNq0VBbUVYJL*OD9-B^?rePjoXnV4t)j=`KuA -2uq={XyAa{gOXE0jN%~>kXQLOdEl?%%L$4G_4v(up>|kKqZ=YeIA7-05Z#MO*zI8U*%2y8{5{qRTCR8 --@l(bl0ip~xyn{!@dRn!1fvOcU05B&|k+2<FqqAhOXMv#1DA9g>W=oOwRupdOonKUB4%kFvBi%oF38T -oBf{)OyEem8#dAclW%R)g9b6es~y!(sU0!8yD}PlzKRoNnFqn|bt6JXf~u3H)tNe*N--UdC!~@4KEno -=4KY^Q^(p<k|}wcfZ|(a*rzDoe~>2K+7FY{%zQs6Yc!h%>XIpX%#`KI(VtnCDRJ;EnTmUijhlsZS1dC -8W?&6nG0asw0}qc`m_2pDRIRPa_Bo0h&G#<HEN-`=p7c9me+>dVPxZj91M+FJlbu>0SNhvfF!Ttx!>& -ACkft>2+w1Ey|FM{gQ%7aI?-2Mi}A^|u!Cb=+~w;kGDa%yAQT4wA|Q*Welu!$_-cYKqtx5OdMP@MytG -!%+L7tHhDtLJ)U~_O*E^@VwF#?lRu@G6#@`~2+^_P->(X8oEUpeDdsgFR_D@Wz6xNvZf^b1qipI=yAS -Unv!RRvVFcilAg8w=<$J;u2uzB%N<jPJ_<|BK7hrs*FohS)$8{^8agPF_qmD(YH-KD>N8NS=B)1|S-R -k;g}CtI>Fdx$3*Anz?&dPE;WBCSS4-w?Lh><WyL|Fw+gGJEekfFIZ?g@f6mbhs^xA~`&kiuLIPN@n}q -fH{3sOc^_`hs`9Q@ZW60Z!w!+$cHa-uIqeT$}_2yjGt8I$?@i*=K!dQkI_2Qq%&71I?!-u4tM0c)eYl -*%#-}PS<=tO3R;hm+vfl&P6zRLoI;QUN&v4$tQ`Fyh$~GI-8S4|KVrWG(|mq%Mv$+@VZ`T>WQ{EvWLm -l>ZnU*jsy=zjQAz-W!-m}#)%=a!reOQ&KV4k^ac2y7O=MwV=R4cY_5`dRR3(yAVsL2fkJeH2SQ(UWgt -fUd90Z7W&G{g={U<A?>1=fHhI~aSoK9|si;o*p7E&0vT)CT;pZl3SsB0#0JK~F`Xa45Q$M5FW88md(t -1Z5U{D}t*S4!4ygE18D1$u7OFn9J;5y$q<7OtW1D)<{5<SCl;@$Ci7dXFP|SRbuD81VoIr7S)2YUK4R -5F8o#)blavE$sc|5jz-!(0AkYLhkxD__Q@kdJ%%{Z|P2p@ujbVeN2)--i{cOdhy{bM=(^;xR=4o4#ZL -Xd-ShApK(|oOwaK8MF2dvmoo+(`$O9v*V_Ym=;x;31F7>d8&3f!@~J#9=ddDnTfX+L94`Wfcuf0t>b` -sf7O)fHh`BMH!z&W{q?iVPg^?x&X@~2TjSGwk5sxfS$PUJdzkI_c;tTzFu4jqsi?v$|ATZpTL3uP*@Q -`ryRCdI|z2?p6s>7J>Q1Cr|{zGr0Ee?7H`f<JO^}Ko2NZaW=EL_(zM+YIjvS+usUXUBu#+4Al;Y3oaZ -eH<eO1A|@zc|)EBHnzeb~GPCc@D-vU~gwqTc<(^uJ{J_iCXDm-DK@S&s@crx4aboL2bg0M943*V!8;7 -=vU(Lpohk~%N{Y;2&LPm3%TWu<8;}p)R|1kc4HGL`aL^trux;%QF%Q_0qGB5BpqF!S1kcLWf#$=?Fe& -AN%Ag7bWj~4w6=^D`$1XaA^fW6<$AMI(3xRYJW+}S1yQx?sm1HrBv2P3vJOLOw(8{^Zuuhm!xV4ip?; -0ErfZd|cT;5jzKQNtr7|UYacQxOm_-N5Fd{i>TC9wC=6mQ*$`Mat@l~yJmXM+j5YI-D7P+nB2@n&@A= -V}Ipg?Wxf)PbD!8x|(O|9S4m=|{0zZsN0eu(OOdWj#%K0YDm>Du}DNat*h-i@nHT<#H1J#7D+Jfk5L` -N0PMLVp>ya^n?Kzb+R<2p(eRlGTwFX!xKKXAN0%A#Th%AyQ9UHZzDL?>75i_Bg){TW!J18cqBurBPcn -EehA<l|fs{P#?ys1oYw`MX&-fh1%>O2K}TSPxO~zgK&p&+W-xJxiuP+3*#c3B+P&wi*N(In#fF}c-St -9hR<RDU_{aY+AQ$fxTPym4Rd^y>xP-@lCT6$ALO*`y<YQ5F1Y7+2Dxdcz6y5`fP+75mVek^2A&@7;w2 -|98C!7sMZXGnRb2Z<zH@;>Iq7PhT?`ehWUc0>1^;1}XK~QSUuPwR&+h(+XZQ7Sa4^ZB+(k-f$s4RQSp -pZQyekd>IJCn*HHCnGSj{3I-sa@q)zTfJCqN?7MzIY|Q2018jeF~5K3MmwoTmgs&*>@M!et!)VZMtlY -{u7=P;)BvW>~sO$O;^qC|?T)4aoB$<SX;Su_UBW@|~WVbQ>^<A@4EHZ*Ju`X)sl(zeUPT-A12EDxh%F -H**?{O#v=?y5ysz+-Ks7mB$`EwPC3;?j_;$ehW20h=70CnNJzv+UHf3hwmcf6YCfE%^e8@zB(+cA1R2 -j<g2y)K8g?oM_E#2q`Qz$Z6tr%MNbiFAIIf8pKz!P9$17kpC!KoN>MronlghlcY7R)%i|W_65x_rM~d -1$0s9hJz3~6hoOc1zxw+LG%3;vR%BE)C<xU?`G(9ONL<^#eakp{mUWR}`{qj9O==?7M+hTpY4o2p8&i -Q~=fa{<3wvF(9gANzqVjT2aHq#0Qt_!>_>*@IsDES_ZzsMLfKmRgE6#(M!Ve&56fvA^SKbahlR0HHh9 -L_J71lG&*!X2)XzI_7plUx3UpZYQ%vUdp=2#O6=8g3#sU8rQfo{#qB(lBxF+<K9ST-~fa1*i<Z+$4Zs -N(_G_jClio*}G>*Y)?kUmoUk5{HZ$gmoc^1z{oW$!|6({BEb$TwX}#G3cuIsKHzomQ(#0HBpUMqd7p0 -Q<Sy&3x|h+sh_}B~Pc+kBZ!<BVCvuVX9gKiK?6i$Pd>__jm}xYPbAwLH0lY*kDxKCPjO?z#qXTf;-)W -+`^k^Mq$YwUdA13F?|KzjJ4h+q<$iu=TEF75jxuILhIvxY{d|X7428^TD;A7D}6Lp06!HWz(&Wp^RJE -n?QhOeC2Di7t%LM^|@m39#?R}&!pQt%)xcW`8fVn2n{!;kX<id`Qvv{!<+q;8f2gDG^daB_9LvG5RHu -=5rS&r!T?+4RrOd)RF97qlpj`^qhVi*!38eQmjqqpKkYsp5#E#f`jUPY#L2C8}&oisL`{lBvn>aX<Lg -_DdX&pUR0hdD~P-b#^%ffnpj0o2DF1(z8QqjkhG!=Py=l^~E@D(E)@IKiGw7Oo*?ek67XkKQ5<%CQfp -`YWaTklG~hj2EW*(8iMhWmd}&O&0D^R{V*}lp?^+ch7P6yqVCx%z3&qENG3PQd&I18Vq}Ie`X<#^miI -dk-+UGFgC2&}w+T5FbiyG_<zQbLgLG(So-4-^pB|liVnTY;k-bAl{n0)QyPtBSjr{xP_)~$|p-+U2)Y -o>ih?uwMi_9bRMWb7eR&O-fs*Bo3A-aX_!!{pZe0N*5y<hv^jhbBOwKwl2Id!Fsss|etM~Ew8WM4j1d -G<Z9I%t>f+N#zzBkz{w1MD|L{;7xnOwC@GZ$`bp<E_^m^V4l*2+i+k>4>wk?cGTEIGQJ5+n8TUbg$I0 -o%05UUZW(*rD0SKqQW27GJ+nxWi@T7Jj#2>r$e|l-l#5%!f*bF#NN*s{=lCz@vNN<ujyMT+-zwK2<UX -c1&dkkI#jd=T=kfC3B+R{dP&-^ZdpLU7IT2_8~%g+K4kCAaIJat4iq$6V3P&@dOZ5!{!U5_NmPs`@~4 -<r4ve60_8WWODKFSD?q4mSjaztI%m?s>G?;em^RD3T7cUzfJx8bbdRAcBvfA5?b#~YnzxK@Yt33ElE% -v?@t16S^;=u#WTLO}_04%aP(Z|CT6!A*ULfJ`qi=%evyJ7v{eo15b$Fb7LNVODUUwEL**iDfx*fF(&t -}zO;a7wde9Yd?c9Rd)*58TKf{pXSE3%O`=sdh?0DWDNcT_<Q7j4<!|+}JKqUe|a^JeXSeuqt;5iM=02 -e30MICYhN?7yjnq%k>_m+#<tqQpl78bCkv^XBoCB1TxA%r?-6v0`E5N1N-Z&vi)>ama(2t!~R(&*|Ks --W?91#YCIfCU0_jp{y?KLu3*ssZmtCc-hJ)|x%QhpiHFxohHu>DW<tdV_tkMh+6^MVW2yX}DycPJIu` -)K`g#i+kl2BnQ~W_GYQHbzPeaa)-oDJ;YR^S^l+IT|<#ZDA6hoOi;}j<9;mELiCIfY4Q#Rs<Dc;<(|6 -IV=xv+)=*E5KU5r!#c7``2euA3RcH6JD(cbHI+#<9zbqqTzx0{&qx`gmxkKKyj>YV))m@Hg4MvGiGIu -OY7s{S`cN;ncE=dBjN4iE=N9*Dd-6zIc)k^bl@aYkUPSU7V?jcs^*Ry6El%Ku6M;Aw5tR57Lpij<q{{ -L9al*<!UJOZsR_{<7Ow~CH`Z7I>4eVmhHjuKrMtHRmbHLFoNjsTN)0Q_>MlDM@sbsw<E|eWzs)X40)y -Uc~!7lcqMQ5HYRz8^T<x+gj;Y^nk-~aljyawgzzL!>_{AckFGzc)0n@8yc{%Jd&50vn!;O()RU!F$F* -t6d7~gV_R$WimS@a#<bWLtk>n4X`Kyy=(lk3+YqcC$JmM(m3@i6bvEa4iLBVCHCLTB?u(MQ%vx8v#z0 -mjpo<C2mERH=b#RGR6A>Gs`dcSUe;RH&YT82;yb#z{`g1*&FxFb*$_+i23&r{oYTHewOUX2fYpi1x}2 -lB&}(lcT}{&HSDK+qDxWd<(YkqGpDM)!yMcGPcaC>$P_lY;hmAe_(p2JLzt%VvqQ2jxP#sx*zKiGi?Z -jSGCQGyE~^fghG#+kac+4sK^JGEc&mu#ov7jezNqbXw73cNbYY&Be<#aV6-k`p+2ahw1oNLcJyCueH` -o9Exfb@akzfpENKz@E8FwQsXn&8A)g(<woBzXCU7u=Kb{gD}Bh`w9mePBRn}btGKuVUf6p~&+}T&nks -5-bP_uO;ilXKi)0%;ioI8PzLBsFVcR5m`kydK|HO;4dt7d$;h-_u!`hYUtGli#!~GQH7ne2#ncJq3kR -^GGj<EN5;BP`+4m8i)Dy4X_@Lnub!hsM^V@1Mc0N_@uh(-s_&Y;DIoGdpP<a+`3tB}#}pC?|g;dIvF{ -nZGIEryv1=2VmOIo52FG7i_^%#-QiN+}Jb?>7TWLYwXWEFv503jHBakOpzC`6?>+Wbe~{q@B$(j!1n{ -OZWB>?qNSJl^hp(a@gVTr@jAz^UNRPrG8!E@o`;KXHzSy&N*v@?l=ch0SZt@edyW!IjuCKad7mma61s -g0rW?9(@o<r_ObsOIx$FfMN^BO<KT2z5ioN!$fdhdv(@`jdYMbt@X1~^S3!0#^yL8XU;NmXag#qj<u4 -B9pE#PuZXqh3Z{&3()jR=Dd>XESX(mcE-{{iKI_ie(a18x<UY=V2>UM%NW(syC6Ygq;BF2bIu3*bD2? -IyuV1b^}2o`+sKp@t$(**m0yD8x?`pqYg#wH=i-(inT`f^M!MT(3;v1bZJ={D!qk~bwr@(QHwsNHQo` -2FzZ5Bt{-U%KJgx|+zWx}md|M_5g}tK$tEDo>?IG3ot)lwB$gQ5+G^5)2N$7cu_e{~US0(ye|=Qh`v@ -<ePfkTY+>rL#dSw9)R8K%_X~ctLf{5d&D+fLBRJK<jZ3AdHkK46Se^cVah_ME<Qt7Zs{g;r8CXb!Q;M -~j{$uY8Cpxgax(-3`FH$V?22g~6^iYl7-t%~QB`IW0%B|X$EYvul|RfQqOQvA;2r19RQ{d4MOND%uU= -a3Zs(+QjmZqSJv(I=d{H8sT_RU?0Vb&%ClM$Qek{s!-hbTrzv$ii+DUb-b-8zq1X0$Dx~4!4X9QT2Vw -1@RevkkFszuSw_C&keX8fn^xtXdhsrj}M0KwU9_yr-*XMgXRVtv`85))5)Y?L*sDxGw34{&y#cx(5Qx -_sdMs>}Q!9`n$z{PCaT%}<dcd%f>9=pN}P51-77g6S@H%vQFdE;R{sLDI7zU6QO<0lO~;5?{o<E%9S7 -TBJ)kMK{>Pt+q$JoGuIo7X}DstkPqQ-QOp_B`#Y+O#HNKKj3*&#Np^YBWdq<>FTxrM)#yf8Nz289Bhe -pmpZD4DzMhjhoqkF9HSgrZV{}|dHVIA?AnL0YD+p_t3C-D%Dss#*NCw3g8&*HyalOZF-hm73od4Np8d -3PB6i-vUsBmG^nY4i{pzjzk`wY2DV4pR%f+<V63kN+udaI#C=uVr1S!xT!qN5MiFlsIy&rgf5i|JDZ2 -z;(z_pvyXEj#0uypr@5)$<bp5w@=$MrGV^EP26qa?2Ey5)8#_+FL#B4f_-O`|$Ld|mjXHUb#lIOgq^6 -Gz!(s&#D|B(@(a%XoW*>aMCS7+3oWJd5W)ZSKu^#lQQ*zTGJmEQdE`3nbc%B&E!YFU28Vghsp{Gnu-! -+FoWK1TklmvilN*elI1Bn<0BG>R`4w39Q<3%N>+1cR1Dx%tjeyKZa{=oi8!!2@w<*!ThT!;-{7WBxLY -kvu(Idko(=Y9FfXHylc`pm?axRvhH-o-IPpI$@eaLoUX_>XU3l-1XEr`KTMWY(Ma2uX6k0Vc+{h7Kjx -Q)47=lbn6l=ipF|;M0sfAZI~W0e+Kr#YyzO`79u>9cLWy@Ub$UKFm#Tl*VK|z>{)i5VN_1D&zns{d+H -I@;<0kwhBWmA@-^!2|*Yy#pT1fauRMdy5qg#cLFnmQZHdV*NeF(^Ox8=-#TaG^x;^%KKGW?rJpALl=@ -y?C53^6q0^q|riB}%6m&3RS`kfJXgVZUud2*-ZfhF^tv)#qT3;nG=9MBTlMEKl9S5h-t4X^-nstjRbL -_?u_P+`?%L^>pBWUHjRu${&`V;XCWZB=VF|sVxzzQ<C#NXC|=BoaT;Sjq`Y49~Q{Z!wyA}zkSb#l(&_ -S^F0*ufyzffY80!_*Gsdw2U!(aqy++jX9O}(Ru`q8g{Z%7_zwx6*PRnq-XK__a@1yJEwWlX@tAL4W2| -v#9VQ>BPg}fAPi6R=Dfqu3;C<PN!j?G);)_&841P-IjLHzCBF~}iwCs7*d8Vnf`R*s;4#9~3&MbYq=! -1jJi7{jsv#KVnK?qa3bjLwAv~CYDdT#<*;Ze~;I9odm2L3y9^~Gu-ETnOai#D*U!nX-7l!{y(oF>4c( -W#Es&vupg;^YL>4*DV^kDBkR=IV$q-5QTDTc3K(I<zetQFAT0?gZW}YK1so+H$x<uJ2Id8|L$Zz-zi( --JJkmCtS;@8}Cyh6<xwP^)Di1)#(shlfMT;fEo?}wPhpZcf<TrZ8i28M6!FV?i=Y5T$i=(FV^PbT<gB ->A<Wcg7sv|~&$nCwde3iuBR{p<9sDG}M2;>VQS)3}BICh0OxEH6Ldm1T^tKl@*K32~)<4b+_y+m>*IW -5-&!hxgP5rT@$PTXppi-!z9e|#HfKhYo4>8TbEn!W}Ki~e{$8SMO?{5y{HHa`Bu<90fbL*Ujjq0s%OP -)frv{f#r0zA=mV;zV*GYOn~_JMqd-Mo3}r?K}o;-hl5%(JK9u8Uh~<=Gy0TI@XwxA+}j?Q%p=>F5RB1 -wwZ3q2e#@mX9LX8`N1V-Jz4Jpce09-wcSwg)}@IR-3uZT8&LSO!%BJW$UvK3nAaFQ`Ls$Gw=USU(H+h -AOUthI!UGt$-_QL6@i#Cfp-zlp|Pe4(Un>T#4L9t{9cavL*8P+^5d6RtBRilSU?WZ5hEsq*VB$jN)0M -cNV0D8v=;Cc3#v3}gK!67DD(rpE~C8v1|P$>RFwDe=qmDX-owcVlKI6WL><NeK`jrb8waoSad>u5eaU -(M;JZBf20oPnIhB~oPs?i82UO25Gm;-~aAM+0akJ9tN}~SV(L`s50q-jP2R_`YE&BV0-$JHRDux5(bF -<H7@TwSw$e%~WD$hs``$ZVXn<XEQe7bp@_h92+{#ySq`4l~0ul3y&?o5T=b1kUOnG9=(eR>$=+ywiUQ -WDnKqEq5oqIwhXkAmk-x@nCcw9{v`d6XfenW~4Gp?m?<zDl1rV)h28>zj&dW=#wa&_MP=q3rPY%MGvS -FAC}1RX;?{{xJ{zBRKJ5!0*vexP_hr`I@=u{-YNS0HaUs4t;lGFXS&q&(1vx=qWuG0&DM+S702$Rj*0 -oR;GHuo|lI)6PL;&OKL}8KM#2r`zai!{*y&9#F}FyB=lyp@=eE?T}KwUJPugJr=<D_wi;z*GiajiuPE -gw`q#6SdQ73F%OnnL^%G2{Ae#=6HYlfkI?*&!b;h3J9KH{fEt=c>)KBC-zD;=_*YW4t&Y8s{TRIexX5 -Geii`wwpe8lF9Wa`o0y<Uo?lQtu4g*3H8U<m&SKXh@JC;8{GpDD$N`^O1Rj*wXLF5|o9G`qg+afh3ro -*qco<j6g1)Ms)FK<H2O_hJ`ZW0(78`BZh`h%I10)D6(%DD55G^C89a(oYs)pjGg)jr!fr{)_#3!f=`o -&Eh0IlxFI~Sy1wJ5$Uo&!smv@n!TGu;MJGArcs`b3`O4;vP``{hfUvxnc+MMBSX6lc{0m7<;jrm{79s -ftm+%rw2$VgMQo@;pXn?7bv^qwecoI9_Rd}d0yrXDtlQor<dL*nOja}+ot{E09ECu?;(h0JL}gIVt4! -}(=Yt&hpX!yWCdEcSJNA)3LCxxO^Pm?Fz52CsF;hvo>nBj{*gfTJM&$jN^A9v^r{?n&rjol+L~-Gwxe -qbTBW>SU@Sr#eb4jL4wb#kk4s?LHKYKCJ_qM1%;4H4X&q~L~Su(rkeX|-&G6bPg-7BlC;l%|)BOBs7c -D1`YHhE<8ImCOf<R9?R<xTUsSC_FzOAma>;svv4Kv&juS#x5)MJk5$uaxfzix^u+tlUyJ@D2RjfAKJW -yK<7j+w_b{t4$IY{d~I<#gK)lmy(MZ$XR?BQCaZqoD`8AjJ_AlUdX={`V*YiA)E|~o9+>sklk62S7FS -W_*)U2t=mxJffBEhy)W%{+u_(x>|Y%QjbD8!Ji805HJlZOYckOLJO;tWwW$knV=8F{(gnP!3WxWp`8- -wr;)MSQ_{jWUo2)2*g--(D26qt)*o&v2rv$)83w=OI!z9(F&es|yj)U_&V}G}*|DwCsxSzh+ZgU?l6Q -<2IaM$5v_Sk~-#C;l`43Y`XAq{1tM)lMVgJAq8=rm@p*~F1~9w5u09JUKQDH$>rrwl&zQa0~-^fBfnI -6HfHHJu%azn`Q0q5jWbkogzAfnR60xf=G3WXD5&_dv=C=E9svt52yglI{TN-b-~;ZTaLb&JKAm*ZoU< -ce7=9%WT|2;1J1)(^R4{>O|62VY&LE$|i}+PK{Y@zsH}Y8tA7r3){BLKe^Zm*BLact5%sKliWk2|3DA -jOx+(HB%9Wm3^n9@v5rlmY*Fx+TGk)(w-?r1cXno`#!v^~m2Gdd1(#aY#iDgYDX+$gT83bQ0ZGW)4*Y -Ve`iK3rMz8gxi8jX&AGxlvy!_sDQwe27`k2nx13xq-SDph-twQjs?_do3N!7A#E?x&KTq&VtKwdR@!@ -XkrN{#NCf}6vLl=s8znChN79gU?mtR4O%^;e_nE4B(B(1AO}P<)#9hZ}W>ItsW;Rwv>dhs5l;x`;So5 -Dtbst6%7si^adezf+@6JGo~kLSjq|=<Y{c7#8&Q=!)6GbO))2dc>U-e;^0Jqn=GeKds!b+2yx&^C<Mz -C4HL-Ht)#XWUrir+~IvCR_c6$51nw>%a8KHGs?C*zBEeyi~jz0zE1}8WZ{+4Bf^jkh8sQTz#1HT5L<+ -w$b*xDSKj1#E!@HIyGwnce-kpU@xt6M!4&}%j3a7UKXuf>b@y&dZEn_tq9)(d-9A8|baU75Mdm;3cXK ->wn^xKKwK-H<S`|o2v!EPlhe(;+F|*?@op9u7Vm=YpvqADb=bHMe$^-a2FU2L6#*>C{kA0p@(I`BkB| -RM24wZY6-oqrObVtb0OHh0|R`>^S_`J6pzHh()*e?hw(^Nl@m@(Dpa-afj=<_+DVa2ueV7TKIpIh^mk -^|6t6UGNUY&WMJzFkj44o8ESuEGNoyT|Bc<CGog+qEDNAqaSjhnf4l)`vu9pI5N~;D?d_%kJ9twOWNv -0l{3G;{eVfblofKWZPN`d*l#a<TN{{fpC({PQOmv^TOzR+2@1*tzn8DU`li8Xq+0kzYsPFg2&8uFEQ1 -?&wEqs;W1v+tKRj%4#R#L`WBd1(JR*JRYM^R+Nu>|OJt9h&iimV7ufZ#yEx$zdBb7V-Z}2M9ZJ66p!g -SC#a;WU$4uohqgpX6$T#b`A0kV>7EGk4DmWQS!W(fE=SgU6d-7Ll3H%=XoZ#ATHY@TPfbCI`rnHI$l$ -2wfXcDp{a2YOlTgy{f{&aMz>|EqY0_mG;`EuXj1O9vKydGHgBg6vdi!7(6aqNx8ciS$zLCdvc?y3>th -GJqo+M=2BoDJ+J?$B+E_nLy^^}!NgRE9)ta_y6Y>vvWM59jkyOfVZuW9e#UQBmtGvV$P<FPir}m;4_- -34NzOZ*({5=Ua;iSiyd8uKSXvyHjL$XU(x04AEQMkeh46ax9jG;+Rp-r)r4zFyUQ9GgkH6=F!Q0e?pB -6+Kac9ix4*tJCjY6=2RtssA)`DWK2dgg^lbG<oy`>T|l?C+eZw;s|0$Hz*W&W42q^nkTk5Q+(mwDaj< -y|E+P=@8{0TmG@FWBrUAca1n(k-IGmnuUii)MY^r&UgbnS1>EPH56Dff7iPCNBEQo76U+ToC1H3y_!2 -!)rTDe(t^u3Aoi=a0A<n|w$V;z;$3xS3d_`=l=WOGoVvgmvPzgdjC^ejr_2f!0|7)bsXOX0nJ$Ny*L` -XVmKn_stOUpptEQa)#U>g*nesR8(9`@iW)wqv*zwrCr1F4*d#cAM;f-Ew=c(fpSpt9JIP`2M+{F37C4 -<OEExL}`jhuWvlexfGijF46qv^*7AvGh4x!b_YTL_Jh0ph<U!7#inAi{_rRZrmQpON(w#i-2}}_+aVb -=y|hJX$#Xf|^4@2H^j`@0{mzW{_Rx&2``SrOwvi42L1XYW#of~yNjH)6ibt$uwhC);h_&gwBgpqdzb{ -h$N8e!iLjPz;`=9RZ_=}+0FXOlRXb*}M+g4sj(>KTgrvPEJbvi@YbvkE91aA_)NnIl}vdu0a?+1%tr) -;Ra+8@Kr%QlzT`1QB-_6uzXi%z$NN-c>ytNy**@<lq8a)lyksjl~4GDkqcdhPDZmAwC!%)IWZUu8c3E -exut0>2#?S3Xry))1-7I+%IukoumMftjpGiKMK^8ZD9TQ2f2(@*(>fZ+`b-nBg}_OWERz0L<jIoOWqc -dyAiWw7)Lc0c0%~Z{w`coaduvKN#6x^lyVW5A#sTm3UYXjH`hQ{vxDsUE(+8c!X7;sbE$nQl3iM%};z -u+duKY1^@!;RlRT@=L)hQIxs=YQAwfeCp84qLFKCl)D(K1Y5ns~)O$nW8~jTYa6YRtK@gX{q7x%5P&t -B>>LKMZ0_rfq^VX5OK4@pLy)8+Be+ssK)5rd`)v7~eq28ZtUyan&-DfS;MyA*<Y8z716sIPP35$0K=Q -4fj@J}x17kh}SUpKj4O|mA6>SHc)7IiUkHIEcH8fXKS%;~zCS;sOQlrT2`kmGIWAo$))`<cHf>uU(wg -}DOMs@F#lK8KmisprL1eO$Y6sS7C@>5nl#^-TP<ykGM9Pv|kP<92#oQM?k=K9x~NfI<;0_N&`GY)>Kz -x-#sj<}=+_R|WK-;Mv*!enIaOeEa3K&53b5L9nj(7C>ie;5dVlQ*IfnbdeiMIO}*AgTX$9&&m!%-g_Z -GfoDH|9kT9qkr%L7?rW)WoVhwIOo#2yT7j?;(iUr3-zb<Qf@j+t@}7RraS%7ZU!eGIe~x%h>H2b={mR -+<C7GEO4&Q_#%YD)k_Jh2S0pO<hbk{x`r{148`-HFj;B)B!p-$d$F{9{q7<-v)2E3%SA^@0B#g>5)m* -5EFf<yN3^LD~}r{X7eU4Ee-95G(!rt{@S0}kgrBxL@QMu27CPhJJ8A?CFFp1=(cdFF5EU+CjAXMR<ay -IJCLdXgG%1h1p%-SakaD^9{giFs(Tm)&jQREBy*>@f7*`+q_&-ZaF$7j15)iC<p=!=W(Ij4Vh>gE^EX -MYzq~wsEUzb2&gKP06lv)?agZ3kwnW<Dl>N6O`YsC1l-Tfr*MRlUS0ML7B$;2)$$0dbTM$e_VkJ%w6G -3Y`NzfaL60+`9M+mnpaWyK?L^~m(EBZ(J-qOJm1($xJbwkqFV79o*Sm9<NNS@004T&wNH=pX0FRpOYJ -LuwnE7xq-jPEWqR3cwn};kI@eTB)`tOnTsdyoLC8n3;1Bbg_bCZunzZ`tq|^=0Io7<njt6S&)wmg4WL -dJH78fa|?zqzK@IRNA{t%Nsjz7JIm0|mpSGs~J0<|Fa>8VDospYXS1rZhPH5)OR9QL-z<5|x5h?xHHG -Jklj|0>Lg6db=MZ5RWU9jn{}To7{dO=oYj<uRx4_ocT(p?u!@A@O(G=fWX@2$zzJnuF$194$1Px0W=> -jDf3pHI96Hy<OWbIJu_U?#M3-l0RFxt5>7d-VbC)HsBRfwVRUi_IRF5vQz?@iWabko%1=rp6}`DC_Wn -=z;|Mme{z>3956Y*j*vc$o+FfwAStfUT`NDTm!UZC*VE|60X*HrXS>J8OI&|&L+tnA>+H4WK<etYb(+ -3rHZvV3;{nhPxiUF+y)8Bmo-E%PYSwRe$e+WYe|cFuzvf|%g5n--5l4+wbWvP|qaL}-26E|j-LuAn#z -@@eTXRe2iI3|?e`r(lbppo+5ndn2CF-oG8DZnzMfxmY-dR;>6o^w=bT2*_%}Mw?R3hGY-1{w_2YTkRd -4L>42>_)6MXpS-f_D|!=;VsP0)grEz!}lUrpq|=@BDTCw}~2b9Xzoc>c~iiKu`4(5E5Rc-36)9uflq` -ELtE3jwB=D^SMsw6YrTxe7SoP8GT%7?4=K5_Wa;Y6f{iEcA&$g;1;`vsF-Hn*dYA9{M8-x+iLw&RQ_& -=fHB~nK_ToCpUR7gGB<?LADesQvbz(iu(>&E|Iy=+#_c}ZOn%ee?_PFR5}Z8m4%aMM?4ibEs#!Y|oxL -td1<m5T-Y+9@P#A;S{qewU7x(`>3;REmbi4rH4eB&oDj5#optX1ioC~Zo`tuzRAV@1A@_e<#+KekZ%o -P1;488)t7^`xR&$v7&d!y6tIA_ogA=f&m6!wS7Nd$Q{_Dtu2wk88R6#RHcbPII9``9}_yAI*mA$YOC2 -TyGgYYHl>*L#!+H+ZN57c#yA9DggHCE|Zs+dtl05|tcCg&nSzs%7<IUaWlHl0t56R+iB50hSSbpULiK -rf<&!a}s)^ecfrP(+m4*)|GlhQQHpuyT^@&s7)ji>Vd!uwRgN>R4fGPrpkYo_XGI3<Gm1u?s^L;h+je -;K%>+WDHqKqN4sM|1I&hX1zcP^);_g^5#+<af55)81W6=7cFGhSL#T$sp7F$(U{~^K+Tzx|iq_M-uvb -)})h+%bJ`DY@D*bnBAzZ!LIfH1MJEzB9fNuxz7~~-1;MC#5s7JJ@+MERve+r++d&DQ+*LQZy0+Nq=aS -O^(z2P#C^6vZi?uoh*Uj563M_CRg2ldX#`i>wzE=c}E`_+g0x+jKOHu~hu)YrP;8oN>W3>s;!Q^T`t# -Fzxcg)8mni^M(8yP;QB6nA|bzGt9Uk5`J34HW5?+_-YHF=f85omGr98WS;AuuO*Xn9RYH=PSUUh#!I0 -Ypq#d4mp2D55ea4W7##Eg@i`52Q=q)AA#IxG-x8vhXXkOdz0`V+Ea^%br|E<23nW1>B&*x<kmx8m7ch -BhB$bl@x$Z5A~^D}Yfpid05!`kiX~rp=@!+$c5N1+?i8cfO0sseT^b^e{<I?J83!Kc{p`<6Yk`7rg)t -A<L4TTk|6x5Ni%%y-ty1D)1Z#nmKDx8MUT@oO9hE6U6HGu)KIAxP=1j~DdqyfBH<kZ^Rc)HSJs`YZCM -0#|y&hHtekB0ij=IC8jLgg7Xd-fM*~gFrkgji^XIh^WZp*QvEh~G~l0=<PjEwdWmyFsWOBv^&947#V1 -cnIhy|hJoRR;*Q*(y5}`Dp(C2luBF=QY2|>M943HkvV3%q~)@J7-7-HUk>;L~~Wc141O|Y8v(Mys!Yg -^0v)Cbz|FBgZHk?Ku{$^SgX>-%UzTWhgphQ+S7v3<cj1-8Zu~r7mmF^Tgd!TW&Vdcy><_D0b8D_c&c5 -jh}`fbK`Rw3L{6u%20fDQrZ%#41k<5>-d6h)=-tEbTXy_}uX4*2lzKReXPeN34pdO?%BttfD)l(=IQn -|6$<gzr6!_z=?UNSx5C2oA&ghtPhy+NRBt+c<C#WUP`5`WDG%GD(z|zWDiO9WpcEacDy70fK^ivv&%E -_f)bDW^|kR=zKE8Q8>?<Eheh%N7#uhhAkYa+|1^!Z@X>lfB>A5PCpc&|m>1J<+oEHK78O56a!XHlT9m -3N-?7AndzVm++4Z4J$yr^+9p$&)rr!Pf?@12tWtbBT-YU0S&ZryfJQioE$i_d1+(SGKwqe&=#dB<@J~ -_ZxqE@;|_Tp#MBC#P0JZY5xz)ote$2nBqzOPd|)*il{zuDZne;nSrfCE&|rBAw`tT#g9Bcdu}{m8c=} -Z&_SM$e&OH470#qs%B247!(?Z5Mvr>M<uFoD9R@&1Y1*aWHcTZL0+Hx4b=oFK-$Cf_ROk!U;Fy!a?sn -h*?M2`?`HvHb26c~~B+3<YLEYyk#K<ZFI<99RU@r+W(X$eis-N`4?&C4bFT}VR`_=2({Mj!!E`R1o-z -Nq%h8@WoQG9I=4LBPZevQKwhFX+cb*_1^X*S=s;NkZZD__`uUV12ow)p^q4j?eOg&pLsQR%Bzs~pgvt -9xRP%HV?fsA>#)WSC?RJYT{`zekU4_q)dbGUmrLO)*k7?JDi9S<|j5k;IQPZZrK=(tAq7AF(>kcV6FO -ivRt;{vS|F0Rj{Q6aWAK2mnzTaZDN}?<h79005;f000jF0000000000005+c00000aA|NaUtei%X>?y --E^v8JO928D0~7!N00;n48F5TYNu*^n0RR9<0ssIH00000000000001_fnyK=0B~t=FJE76VQFq(UoL -QYP)h*<6ay3h000O8Q5kVef*6bSLk$1`hAsdA5&!@I0000000000q=CZ`003}la4%wEb7f<1ZEaz0WG ---dP)h*<6ay3h000O8Q5kVetE>JyrVIc8;V1wA5dZ)H0000000000q=7ac003}la4%wEb7gR0a&u*JE -^v8JO928D0~7!N00;n48F5TYnKB`M5&!^NKmY&{00000000000001_feS1E0B~t=FJo<FZ*X*JZ*Frg -aCuNm0Rj{Q6aWAK2mnzTaZLR`DN&Lm005bN000jF0000000000005+cxIO>?aA|NaWN&wFY;R#?E^v8 -JO928D0~7!N00;n48F5U$dX|{G3IG7P9{>Om00000000000001_fp=m60B~t=FJ*XRWpH$9Z*FrgaCu -Nm0Rj{Q6aWAK2mnzTaZEP&CI4V5000i0000aC0000000000005+cVQl~aaA|NaX>Md?crI{xP)h*<6a -y3h000O8Q5kVew-0xjkq7_)`V{~G5C8xG0000000000q=D;~003}la4&3cV_|e@Z*FrgaCuNm0Rj{Q6 -aWAK2mnzTaZLIsgtbc!0087F000pH0000000000005+cs-OS>aA|NaaAj~bGBtEzXLBxac~DCM0u%!j -0000808trnOxvt?_I&^V0Gt2-022TJ00000000000HlE=uK)mWX>c!dbYXOLb6;a`WMy+MaCuNm0Rj{ -Q6aWAK2mnzTaZG)gAUk3v000Vo000aC0000000000005+c(yssjaA|NacW7m0Y%XwlP)h*<6ay3h000 -O8Q5kVePrb}Y4+a1LJ`w-`7XSbN0000000000q=8=6003}la4%nWWo~3|axY(BX>MtBUtcb8c~DCM0u -%!j0000808trnOofS-iii;a0AN=D02TlM00000000000HlGU+yDS@X>c!Jc4cm4Z*nhTaByU4a&s<lc -~DCM0u%!j0000808trnOp(FBt{@`-0L_&E02KfL00000000000HlFl?f?LAX>c!Jc4cm4Z*nhWX>)XP -Z!U0oP)h*<6ay3h000O8Q5kVe-NdE^X*&P_FgXDL7ytkO0000000000q=B&!0RV7ma4%nWWo~3|axZC -cVPs@-Wpi^baCuNm0Rj{Q6aWAK2mnzTaZJ`y86y)00090E000^Q0000000000005+cP)z{<aA|NaUv_ -0~WN&gWZ*pX1a%E&>X=8LQaCuNm0Rj{Q6aWAK2mnzTaZJG=bdKuK0066N0{|ER0000000000005+cn^ -OS*aA|NaUv_0~WN&gWaCvZHa&u{JXD)DgP)h*<6ay3h000O8Q5kVeU>*mJW&r>I1p@#87ytkO000000 -0000q=CC60swGna4%nWWo~3|axZdaEp}yYWN&gVaCuNm0Rj{Q6aWAK2mnzTaZDk5yb8|=008tR000*N -0000000000005+cS0(}gaA|NaUv_0~WN&gWa%FUKd1-EEE^v8JO928D0~7!N00;n48F5URSWQ|;9RL8 -5bpQYo00000000000001_fm<*F0B~t=FJE?LZe(wAFLP;lE^v8JO928D0~7!N00;n48F5SiR;)U%000 -0k0RR9b00000000000001_fzwR_0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gD5X>MtBUtcb8c~DCM0u -%!j0000808trnOxjdNr2_&004N0j03ZMW00000000000HlG#P67aMX>c!Jc4cm4Z*nhVVPj}zV{dMBa -&K%eUt?`#E^v8JO928D0~7!N00;n48F5Td=BX@H1poj55&!@r00000000000001_fdo+k0B~t=FJE?L -Ze(wAFJob2Xk}w>Zgg^QY%gJCVQ_S1axQRrP)h*<6ay3h000O8Q5kVe5~{}VECB!j76SkPApigX0000 -000000q=A`M0swGna4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zE^v8JO928D0~7!N00;n48F5T4JS{ -W50001d0RR9Z00000000000001_fdp6r0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPPZE#_9E^v8JO9 -28D0~7!N00;n48F5U<V7cB14*&q*G5`Q300000000000001_fdN?p0B~t=FJE?LZe(wAFJob2Xk}w>Z -gg^QY%gPPZgg^QY;0w6E^v8JO928D0~7!N00;n48F5T(CNzBc0{{Ty2><{m00000000000001_flX)v -0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gYMY-M+HVQ_F|axQRrP)h*<6ay3h000O8Q5kVe4pbie!36* -SEf4?zCIA2c0000000000q=AcU0swGna4%nWWo~3|axY_HV`yb#Z*FvQZ)`7UWp#3Cb98BAb1rasP)h -*<6ay3h000O8Q5kVe5@CS2C<p)mh#3F?B>(^b0000000000q=Arf0swGna4%nWWo~3|axY_HV`yb#Z* -FvQZ)`7fWpZg@Y-xIBE^v8JO928D0~7!N00;n48F5UDd&NS$0002;0RR9a00000000000001_f%|#_0 -B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%h0mVQ_F|axQRrP)h*<6ay3h000O8Q5kVeo*h>F%K!iXaRC4T -D*ylh0000000000q=EQ*0swGna4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1z?CX>MtBUtcb8c~DC -M0u%!j0000808trnOu?rH|62tB0L%>l04)Fj00000000000HlEoeF6Y*X>c!Jc4cm4Z*nhVVPj}zV{d -MBa&K%eV_{=xWpgiPX>4U*V_{=xWiD`eP)h*<6ay3h000O8Q5kVe(}>1YrU3u|%>w`cE&u=k0000000 -000q=B-60swGna4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1!mbWNC9>V_{=xWiD`eP)h*<6ay3h0 -00O8Q5kVe6mSJcJpcdzKL7v#9{>OV0000000000q=BS_0swGna4%nWWo~3|axY_La&&2CX)j-2X>MtB -Utcb8c~DCM0u%!j0000808trnOoJ=h!6yI!04V?f03QGV00000000000HlE)g#rL@X>c!Jc4cm4Z*nh -VWpZ?BW@#^9Uu|J&ZeL$6aCuNm0Rj{Q6aWAK2mnzTaZClF+Vu-M0s!zL1OOfY0000000000005+cf`t -MAaA|NaUv_0~WN&gWV`Xx5X=Z6JV_{=ua&#_mWo=MP0Rj{Q6aWAK2mnzTaZCvlLPx3r002Y-000{R00 -00000000005+c$-e{uaA|NaUv_0~WN&gWV`Xx5X=Z6JV{dY0E^v8JO928D0~7!N00;n48F5VT&ks}N0 -ssIP1^@sb00000000000001_fvmv<0B~t=FJE?LZe(wAFJow7a%5$6FJE72ZfSI1UoLQYP)h*<6ay3h -000O8Q5kVeIlqJu?>PVf7J2{x9{>OV0000000000q=C)E1ORYpa4%nWWo~3|axY_OVRB?;bT49QXEkP -WWpOTWc~DCM0u%!j0000808trnOv~qIW;_D`0Nn-v03iSX00000000000HlHW{saJUX>c!Jc4cm4Z*n -hVXkl_>WppoMX=gQXa&KZ~axQRrP)h*<6ay3h000O8Q5kVe;8`d=JqZ8+!z2IzCjbBd0000000000q= -9q-1pshqa4%nWWo~3|axY_OVRB?;bT4CQVRB??b98cPVs&(BZ*DGdc~DCM0u%!j0000808trnOo>?}h -;jq~0Lu;l04V?f00000000000HlHT3k3jhX>c!Jc4cm4Z*nhVXkl_>WppoNXkl`5Wprn9Z*_2Ra&KZ~ -axQRrP)h*<6ay3h000O8Q5kVe;Fn=qzXt#S_7eaABme*a0000000000q=Byx1pshqa4%nWWo~3|axY_ -OVRB?;bT4CQVRCb2bZ~NSVr6nJaCuNm0Rj{Q6aWAK2mnzTaZFtMH%O!f000IK001cf0000000000005 -+cuowjZaA|NaUv_0~WN&gWV`yP=WMy<OV{c?>ZfA3JVRU6}VPj}%Ze=cTc~DCM0u%!j0000808trnOn -iprWk~`60B!^T0384T00000000000HlGN9t8k!X>c!Jc4cm4Z*nhVXkl_>WppoNZ*6d4bS`jtP)h*<6 -ay3h000O8Q5kVey+WEXXafKMKL-E+A^-pY0000000000q=6qH1pshqa4%nWWo~3|axY_OVRB?;bT4CY -IW#$Na&KZ~axQRrP)h*<6ay3h000O8Q5kVeL<FqKzybgOeFgvk8~^|S0000000000q=CmI1pshqa4%n -WWo~3|axY_OVRB?;bT4IYb!~GlaCuNm0Rj{Q6aWAK2mnzTaZCh=1wAzd003?e001BW0000000000005 -+c!6yX(aA|NaUv_0~WN&gWV`yP=WMy<OWpiV2a&KZ~axQRrP)h*<6ay3h000O8Q5kVe!3toa6b1kQ4k --Wt8~^|S0000000000q=7Uo1pshqa4%nWWo~3|axY_OVRB?;bT4IdV{>gTaCuNm0Rj{Q6aWAK2mnzTa -ZDgL#Ly}Q005;9001HY0000000000005+cf-?mGaA|NaUv_0~WN&gWV`yP=WMy<OWp!g}aBy;OVr6nJ -aCuNm0Rj{Q6aWAK2mnzTaZL0<19@Q>008PV001BW0000000000005+c>^KDgaA|NaUv_0~WN&gWV`yP -=WMy<OWp!g~a%OU6aV~IqP)h*<6ay3h000O8Q5kVeCIy%HI0FCx)CK?mA^-pY0000000000q=Ac31ps -hqa4%nWWo~3|axY_OVRB?;bT4IfV{3A7a&KZ~axQRrP)h*<6ay3h000O8Q5kVe%-c!TGdchOg?j)1AO -HXW0000000000q=5rf1pshqa4%nWWo~3|axY_OVRB?;bT4IfV{~_Ba%FKYaCuNm0Rj{Q6aWAK2mnzTa -ZI2=jTkrs007el001HY0000000000005+cbdLo9aA|NaUv_0~WN&gWV`yP=WMy<OWp!h8cW`oVVr6nJ -aCuNm0Rj{Q6aWAK2mnzTaZDLS($`}r008Sy001EX0000000000005+c?2-ilaA|NaUv_0~WN&gWV`yP -=WMy<OXJRrlF*0UyWpOTWc~DCM0u%!j0000808trnOn$5Wk2V7U0NMrs03!eZ00000000000HlGAx&; -7mX>c!Jc4cm4Z*nhVXkl_>WppoRVlp!^GH`NlVr6nJaCuNm0Rj{Q6aWAK2mnzTaZC*<)3TWo000g)00 -1KZ0000000000005+c1-=CUaA|NaUv_0~WN&gWV`yP=WMy<OXk}t@Wp{9LZ(?O~E^v8JO928D0~7!N0 -0;n48F5U)8aZJVFaQ9tWB>pj00000000000001_f#1*t0B~t=FJE?LZe(wAFJow7a%5$6FKTIXW^!e5 -E^v8JO928D0~7!N00;n48F5Soc_nI26953aOaK5K00000000000001_fiM9E0B~t=FJE?LZe(wAFJow -7a%5$6FKTdOZghAqaCuNm0Rj{Q6aWAK2mnzTaZK=N$;u!L001X4001cf0000000000005+cxfBKfaA| -NaUv_0~WN&gWV`yP=WMy<OY+-I^Vs&h1VRC6<Zf$R5Wo#~Rc~DCM0u%!j0000808trnOvv$8n*s~~03 -1dD04M+e00000000000HlE+AO-+%X>c!Jc4cm4Z*nhVXkl_>WppoWVQyz*d2(rNY-wX{Z)9a`E^v8JO -928D0~7!N00;n48F5VhyRRu~2><|)F#rH100000000000001_foLoS0B~t=FJE?LZe(wAFJow7a%5$6 -FKl6MXJ>L{WovD3WMynFaCuNm0Rj{Q6aWAK2mnzTaZHb9tr)!t002=e001Tc0000000000005+c6*dL -{aA|NaUv_0~WN&gWV`yP=WMy<OY+-I^Xk}t@Wp{0FWMynFaCuNm0Rj{Q6aWAK2mnzTaZJO(Re;qB001 -yC001cf0000000000005+c7C;67aA|NaUv_0~WN&gWV`yP=WMy<OY+-I^XmxI9VRC6<Zf$R5Wo#~Rc~ -DCM0u%!j0000808trnOd=1`Kk^Cy02(X+03-ka00000000000HlF3O9lXNX>c!Jc4cm4Z*nhVXkl_>W -ppoWVQy!1Xklq>Z)9a`E^v8JO928D0~7!N00;n48F5UtGQ(uZ3IG6JD*yl|00000000000001_fo4_) -0B~t=FJE?LZe(wAFJow7a%5$6FKl6MXLNOPYiV<6ZEs{{Y%XwlP)h*<6ay3h000O8Q5kVe<m~XImj(a -;`V;^FBLDyZ0000000000q=9o`1^{qra4%nWWo~3|axY_OVRB?;bT4dSbZKreaB^>AWpXZXc~DCM0u% -!j0000808trnOg42GP2B_l096eD044wc00000000000HlFSXa)dqX>c!Jc4cm4Z*nhVXkl_>WppoXVq -<7wa&u*LaB^>AWpXZXc~DCM0u%!j0000808trnOs&%qsB!}U0Ne)v044wc00000000000HlFzZ3X~vX ->c!Jc4cm4Z*nhVXkl_>WppoXVq<e>a&L8TaB^>AWpXZXc~DCM0u%!j0000808trnOlkJv59JI10EuG& -0384T00000000000HlE;aRvZzX>c!Jc4cm4Z*nhVXkl_>WppoXVq<f2Z7y(mP)h*<6ay3h000O8Q5kV -e9(C^?p9cT{85RHlCIA2c0000000000q=7<y1^{qra4%nWWo~3|axY_OVRB?;bT4yaV`yP=b7gdJa&K -Z~axQRrP)h*<6ay3h000O8Q5kVeivCZag#-Wq+6@2zCIA2c0000000000q=6-d1^{qra4%nWWo~3|ax -Y_OVRB?;bT4yaV{>P6Z*_2Ra&KZ~axQRrP)h*<6ay3h000O8Q5kVe){$p2AO!#bz77BYApigX000000 -0000q=D{=1^{qra4%nWWo~3|axY_OVRB?;bT4yiX>)LLZ(?O~E^v8JO928D0~7!N00;n48F5T?fJZ%W -4FCYeFaQ8300000000000001_flZJG0B~t=FJE?LZe(wAFJow7a%5$6FLiEdc4cyNVQge&bY)|7Z*ne -hc~DCM0u%!j0000808trnO!dFKJw*fn0L}^k03iSX00000000000HlEfo(2GLX>c!Jc4cm4Z*nhVXkl -_>WppofbY?hka&KZ~axQRrP)h*<6ay3h000O8Q5kVeN5_!Yxc~qF@&Et;9smFU0000000000q=AQ`1^ -{qra4%nWWo~3|axY_OVRB?;bT4*ga&u{KZZ2?nP)h*<6ay3h000O8Q5kVelLpr^0{{R30RR91BLDyZ0 -000000000q=9^+1^{qra4%nWWo~3|axY_OVRB?;bT4CUX)j-2X>MtBUtcb8c~DCM0u%!j0000808trn -Okdrtxt9b00I~`I03`qb00000000000HlGyqXqzQX>c!Jc4cm4Z*nhVXkl_>WppoNY-ulJXkl_>Wprg -@bS`jtP)h*<6ay3h000O8Q5kVeSk!4bvj6}9@Bjb+AOHXW0000000000q=A~K1^{qra4%nWWo~3|axY -_VY;SU5ZDB88UukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZElHr(cT$007(x000~S0000000000005+ci> -U?xaA|NaUv_0~WN&gWV{dG4a$#*@FJW$TX)bViP)h*<6ay3h000O8Q5kVe$78_Ra0&nb#3cX#BLDyZ0 -000000000q=8Va1^{qra4%nWWo~3|axY_VY;SU5ZDB8AZgXjLZ+B^KGcqo4c~DCM0u%!j0000808trn -OnuhaFNFdC0DT7l03rYY00000000000HlEdxCQ`lX>c!Jc4cm4Z*nhVZ)|UJVQpbAX>MtBX<=+>b7d} -Yc~DCM0u%!j0000808trnObu<KJxm1v0QD3A0384T00000000000HlG&x&{DnX>c!Jc4cm4Z*nhVZ)| -UJVQpbAcWG`jGA?j=P)h*<6ay3h000O8Q5kVecY9|c;spQzk{AF09{>OV0000000000q=8Mq1^{qra4 -%nWWo~3|axY_VY;SU5ZDB8WX>N37a&0bfc~DCM0u%!j0000808trnOeUOBmt6q>07U`-03QGV000000 -00000HlFz#s&azX>c!Jc4cm4Z*nhWX>)XJX<{#5UukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZFzcb6{vH -003d10012T0000000000005+c2FL~gaA|NaUv_0~WN&gWWNCABY-wUIV{dJ6VRSBVc~DCM0u%!j0000 -808trnOgaj~yuU6000_bW03QGV00000000000HlGb@&*8KX>c!Jc4cm4Z*nhWX>)XJX<{#AVRT_)VRL -0JaCuNm0Rj{Q6aWAK2mnzTaZH0a;w>>1003Q5000~S0000000000005+cr6C6ZaA|NaUv_0~WN&gWWN -CABY-wUIX>Md?crI{xP)h*<6ay3h000O8Q5kVe(ZzVLwlV+!MaKXD9{>OV0000000000q=67O2LNzsa -4%nWWo~3|axY|Qb98KJVlQlOV_|e}a&s<lc~DCM0u%!j0000808trnOoo@Wn`{sO0NObK03QGV00000 -000000HlEfY6k#tX>c!Jc4cm4Z*nhWX>)XJX<{#JVQy(=Wpi{caCuNm0Rj{Q6aWAK2mnzTaZEiCt^$n -*004>@0015U0000000000005+cta=9kaA|NaUv_0~WN&gWWNCABY-wUIZDDe2WpZ;aaCuNm0Rj{Q6aW -AK2mnzTaZC-SZ1J}v006O<0018V0000000000005+cb%F-~aA|NaUv_0~WN&gWWNCABY-wUIZDn*}WM -On+E^v8JO928D0~7!N00;n48F5U=w?&w!3jhEPDgXc=00000000000001_foY}(0B~t=FJE?LZe(wAF -Jx(RbZlv2FLGsbZ*_8GWpgfYc~DCM0u%!j0000808trnOuGN;+X@l@0C+n903HAU00000000000HlFW -vIhWgX>c!Jc4cm4Z*nhWX>)XJX<{#PV{&P5baO6nc~DCM0u%!j0000808trnO!b(M47{oU003M802=@ -R00000000000HlGH#0LOyX>c!Jc4cm4Z*nhWX>)XJX<{#QGcqn^cx6ya0Rj{Q6aWAK2mnzTaZH}##aU -ap0001f0RS5S0000000000005+cif;%2aA|NaUv_0~WN&gWWNCABY-wUIbT%|DWq4&!O928D0~7!N00 -;n48F5TE*a0QCIsgFw&Hw-#00000000000001_fgUIc0B~t=FJE?LZe(wAFJx(RbZlv2FLiWjY%XwlP -)h*<6ay3h000O8Q5kVep#23_uNeRUpIiU{9smFU0000000000q=61&2>@_ua4%nWWo~3|axY|Qb98KJ -VlQ@Oa&u{KZZ2?nP)h*<6ay3h000O8Q5kVe*nI$rTBZO108Rk_8vp<R0000000000q=ET-2>@_ua4%n -WWo~3|axY|Qb98KJVlQ_yGA?C!Wl&220u%!j0000808trnOkT`O?+vv8003|S02=@R00000000000Hl -G8BMJa;X>c!Jc4cm4Z*nhWX>)XJX<{#THZ(3}cx6ya0Rj{Q6aWAK2mnzTaZF#-ps5Wd007IF000~S00 -00000000005+c(%1?BaA|NaUv_0~WN&gWWNCABY-wUIcW7m0Y%XwlP)h*<6ay3h000O8Q5kVeBkyPY! -vFvP5&-}JDF6Tf0000000000q=6a!3IK3va4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mUtei%X>?y- -E^v8JO928D0~7!N00;n48F5UniZ5l(0RRBY0{{Re00000000000001_fg}G40B~t=FJE?LZe(wAFJx( -RbZlv2FJEF|V{344a&#|kX>(&PaCuNm0Rj{Q6aWAK2mnzTaZKW3J<vxS001v!001Wd0000000000005 -+cGyw|$aA|NaUv_0~WN&gWWNCABY-wUIUt(cnYjAIJbT4ygb#!TLE^v8JO928D0~7!N00;n48F5T+76 -7gG0RR9w3IG5r00000000000001_fxsOL0B~t=FJE?LZe(wAFJx(RbZlv2FJEF|V{344a&#|qd2?fLZ -f0p`E@NhAP)h*<6ay3h000O8Q5kVeHV;zP=pFz7OKAWADgXcg0000000000q=Ek*3jlCwa4%nWWo~3| -axY|Qb98KJVlQ7}VPk7>Z*p`mb9r-PZ*FF3XD)DgP)h*<6ay3h000O8Q5kVeL_!}!Vp#wH)M)_#C;$K -e0000000000q=7F#3jlCwa4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mbYXI4X>4UKaCuNm0Rj{Q6aW -AK2mnzTaZI9{nVhcy000aF001BW0000000000005+c*O&_caA|NaUv_0~WN&gWXmo9CHEd~OFJE72Zf -SI1UoLQYP)h*<6ay3h000O8Q5kVe)p!o#B@_SvK|ufjApigX0000000000q=Cem3jlCwa4%nWWo~3|a -xZ9fZEQ7cX<{#5X=q_|Wq56DE^v8JO928D0~7!N00;n48F5S=3~e=A9{>Ope*gd^00000000000001_ -fheyF0B~t=FJE?LZe(wAFKBdaY&C3YVlQ85Zg6#Ub98cLVQnsOc~DCM0u%!j0000808trnOvFZN7QY+ --03<5`03rYY00000000000HlG%&I<r=X>c!Jc4cm4Z*nhabZu-kY-wUIUvzJ4Wo~JDWpXZXc~DCM0u% -!j0000808trnOeW*5SUd&*000mG03HAU00000000000HlG$>k9yIX>c!Jc4cm4Z*nhabZu-kY-wUIUv -+e8Y;!Jfc~DCM0u%!j0000808trnOvt2t{s~9`0J}v203iSX00000000000HlFD@(TcPX>c!Jc4cm4Z -*nhabZu-kY-wUIV{dMAbYX6Eb1rasP)h*<6ay3h000O8Q5kVeW7v1x%t8PFvdIAeBLDyZ0000000000 -q=AGw3;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#EbZu-kaA9(DWpXZXc~DCM0u%!j0000808trnOx(x2G;<F -C0AV)(03rYY00000000000HlGDeGC9_X>c!Jc4cm4Z*nhabZu-kY-wUIb7gXAVQgu7WpXZXc~DCM0u% -!j0000808trnOz+dL52gSB03iVY044wc00000000000HlFLjSK*AX>c!Jc4cm4Z*nhabZu-kY-wUIUv -zS5WiMY}X>MtBUtcb8c~DCM0u%!j0000808trnOw5%&mYe|q0Mi2i03!eZ00000000000HlE~jtl^BX ->c!Jc4cm4Z*nhabZu-kY-wUIUvzS5WiMZ1VRL0JaCuNm0Rj{Q6aWAK2mnzTaZDstovEe)005c<001Na -0000000000005+c3y=%|aA|NaUv_0~WN&gWXmo9CHEd~OFJE+WX=N{DVRUk7WiD`eP)h*<6ay3h000O -8Q5kVeOHXdj9RdIV?*;$>AOHXW0000000000q=EC13;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFK~ -G-aCuNm0Rj{Q6aWAK2mnzTaZCUJ0006200000001Ze0000000000005+cPLvD)aA|NaUv_0~WN&gWXm -o9CHEd~OFJ@_MbY*gLFJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVeZqR&y9{~UWZ2|xQHUIzs000000 -0000q=A-{3;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?XY;b5{Vr6t`V_|GzbaZlQVs&(7b1ras -P)h*<6ay3h000O8Q5kVeB7pnEl>h($9svLVBme*a0000000000q=5;R3;=Lxa4%nWWo~3|axZ9fZEQ7 -cX<{#CX>4?5a&s?YVRL0JaCuNm0Rj{Q6aWAK2mnzTaZDk=JdC#j006cM001)p0000000000005+c;Fb -&kaA|NaUv_0~WN&gWXmo9CHEd~OFJ@_MbY*gLFKKRSWn*+-ZDn*}Ut?%ta&u*LE^v8JO928D0~7!N00 -;n48F5T~>(aIN0ssId4FCWn00000000000001_f#{hG0B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;<LEb -1!UZZgehic~DCM0u%!j0000808trnOd;)^B*_K<046B_04x9i00000000000HlE-oeThQX>c!Jc4cm4 -Z*nhabZu-kY-wUIW@&76WpZ;bZ*X*JZ*F01bYW+6E^v8JO928D0~7!N00;n48F5US9#oj`6#xJjVgLX -s00000000000001_fi$EH0B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;<LEb1!pYZfSIBdS!AhaCuNm0Rj -{Q6aWAK2mnzTaZI0%YOT-#0046Y001fg0000000000005+cYPt*naA|NaUv_0~WN&gWXmo9CHEd~OFJ -@_MbY*gLFL!8ZbY*jJVPj=3aCuNm0Rj{Q6aWAK2mnzTaZG|TV<e9N007Vc001oj0000000000005+cg -1ig>aA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWnpAtaCBvIb1z?CX>MtBUtcb8c~DCM0u%!j0000808trn -Ofe_Nz7YZd022lP04o3h00000000000HlFjy$k?wX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7VPs)&bY*g -LFK1<Lb7*NUaCuNm0Rj{Q6aWAK2mnzTaZKb~Ul1As004ak001Ze0000000000005+cw!aJjaA|NaUv_ -0~WN&gWXmo9CHEd~OFLZKcWnpAtaCBvIb1!pYcrI{xP)h*<6ay3h000O8Q5kVeN7*-S;{*TzP7MG6Ed -T%j0000000000q=6Q~3;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bUtei%X>?y-E^v8JO -928D0~7!N00;n48F5TR%2uj!4gdglHUI!A00000000000001_fkej)0B~t=FJE?LZe(wAFKBdaY&C3Y -VlQ-ZWo2S@X>4R=a&s?YVRL0JaCuNm0Rj{Q6aWAK2mnzTaZCv6F8JFA004s`001Ze0000000000005+ -c{nZQraA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWny({Y-D9}b1!6XZ7y(mP)h*<6ay3h000O8Q5kVep?# -O|GYS9z+%W(EDgXcg0000000000q=6pZ3;=Lxa4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bWp -r|7WiD`eP)h*<6ay3h000O8Q5kVe+Wtz=Yz+VaQ8xepF8}}l0000000000q=A{}3;=Lxa4%nWWo~3|a -xZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bWpr|7WnXM~ZEP-Zc~DCM0u%!j0000808trnOmjpbmQ4l#0H_rJ -04x9i00000000000HlFZ_6z`UX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bUtei%X>?y-E^v8 -JO928D0~7!N00;n48F5TaBbdOV1ONa_6951x00000000000001_f$97V0B~t=FJE?LZe(wAFKBdaY&C -3YVlQ-ZWo36^Y-?q5b1!0Hb7d}Yc~DCM0u%!j0000808trnOl691srLZ@0EGnr04D$d00000000000H -lG@0Sy3fX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bWN&RQaCuNm0Rj{Q6aWAK2mnzTaZDn?5 -HS)3002x9001cf0000000000005+c4FnAUaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWp`n0Yh`kCFJ*Lc -Wo0gKc~DCM0u%!j0000808trnOqLCtM`#8B0HqiJ04@Lk00000000000HlFt2@L>nX>c!Jc4cm4Z*nh -abZu-kY-wUIbaG{7cVTR6WpZ;bWpr|7WnXM~ZEP-Zc~DCM0u%!j0000808trnOcP&i5Xb@m00jvE04e -|g00000000000HlE$5DfruX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bXJu}4XlX8Rc~DCM0u -%!j0000808trnOaMn*n==3a06G8w02}}S00000000000HlE`6Ab`xX>c!Jc4cm4Z*nhbWNu+EUtei%X ->?y-E^v8JO928D0~7!N00;n48F5VWNYv>X0{{Ty3;+Nb00000000000001_ftM2v0B~t=FJE?LZe(wA -FKJ|MVJ~BEWMyM6aCuNm0Rj{Q6aWAK2mnzTaZG%HmT->%008I!000^Q0000000000005+c=oSqCaA|N -aUv_0~WN&gWX=H9;FJo_QaA9;VaCuNm0Rj{Q6aWAK2mnzTaZCv=`f;=h004e0000;O0000000000005 -+cuNMsfaA|NaUv_0~WN&gWX=H9;FJo_VWiD`eP)h*<6ay3h000O8Q5kVeW4!ti4;%mh=YRkJ8~^|S00 -00000000q=A_t4FGUya4%nWWo~3|axZCQZecHJWNu+(VRT_GaCuNm0Rj{Q6aWAK2mnzTaZI;k^s?px0 -07kn0012T0000000000005+c;yw)kaA|NaUv_0~WN&gWX=H9;FKKRca$#;~WpgfYc~DCM0u%!j00008 -08trnOdIEYq89)F02KfL03ZMW00000000000HlEfLJa_LX>c!Jc4cm4Z*nhbWNu+EaA9L>VP|DuWMOn -+E^v8JO928D0~7!N00;n48F5U>g@uJ~iU0s`(gFY-00000000000001_fmlKf0B~t=FJE?LZe(wAFKJ -|MVJ~%bb2K(&VRT_GaCuNm0Rj{Q6aWAK2mnzTaZK}>BY=Vm005gL001BW0000000000005+c0nH5naA -|NaUv_0~WN&gWY;R+0W@&6?FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVeE8g-aA_D*bTnYdHBme*a0 -000000000q=CWL4FGUya4%nWWo~3|axZLeV{2w<Y-KNOX>Mz5Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mnzT -aZDj5ynb^7000;a001Qb0000000000005+cCEE=EaA|NaUv_0~WN&gWY;R+0W@&6?FKugNX>x3DV{2w -<Y-KKRc~DCM0u%!j0000808trnOdvdREgA>_0Lm8t03!eZ00000000000HlH2-VFe7X>c!Jc4cm4Z*n -heZ)0m_X>4ULaA{<0Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mnzTaZI~~@VyBI004p&001Tc000000000000 -5+cHs=ihaA|NaUv_0~WN&gWY;R+0W@&6?FLQBhX>?_5Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mnzTaZHgT3 -E4dZ001}&001Wd0000000000005+cgX|3eaA|NaUv_0~WN&gWY;R+0W@&6?FLQZqY-w(5Y;R+0W@&6? -E^v8JO928D0~7!N00;n48F5TJDOkpd0RRBd0ssIa00000000000001_fd%jl0B~t=FJE?LZe(wAFK}U -FYhh<;Zf7rFUtwZzb#z}}E^v8JO928D0~7!N00;n48F5U3c9zN*0RR920ssIZ00000000000001_fzI -&_0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rFUukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZKiEO5@7`003MA00 -1BW0000000000005+cCG!mcaA|NaUv_0~WN&gWaA9L>VP|P>XD?r4Z*6d4bS`jtP)h*<6ay3h000O8Q -5kVe`u(I5a{&MVhy?%uBme*a0000000000q=7E=4FGUya4%nWWo~3|axZXUV{2h&X>MmPUvqSFbz^jO -a%FQaaCuNm0Rj{Q6aWAK2mnzTaZG(ID^~>y001T+001BW0000000000005+c<Ms^zaA|NaUv_0~WN&g -WaA9L>VP|P>XD@AGa%*LBb1rasP)h*<6ay3h000O8Q5kVet`VQ}cLo3e=MVq@B>(^b0000000000q=6 -;@4ghdza4%nWWo~3|axZXUV{2h&X>MmPa%FLKX>w(4Wo~qHE^v8JO928D0~7!N00;n48F5T}MT3lw7y -tlyZ2$lx00000000000001_f#3%Y0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rZaAjj@W@%+|b1rasP)h*<6 -ay3h000O8Q5kVe#p)*y5di=Ir2zl{9smFU0000000000q=B#?4ghdza4%nWWo~3|axZXUV{2h&X>MmP -b#!TLb1rasP)h*<6ay3h000O8Q5kVe4)4aHVGRHPBrN~{AOHXW0000000000q=Ee*4ghdza4%nWWo~3 -|axZXUV{2h&X>MmPc4cyNX>V>WaCuNm0Rj{Q6aWAK2mnzTaZJfAKqgIX002Id0RSZc0000000000005 -+coG%UlaA|NaUv_0~WN&gWaBF8@a%FRGb#h~6b1z?CX>MtBUtcb8c~DCM0u%!j0000808trnO!``JjF -JQZ0M82m03ZMW00000000000HlE|oeltSX>c!Jc4cm4Z*nhia&KpHWpi^cUtei%X>?y-E^v8JO928D0 -~7!N00;n48F5Sx!$t!%1ONbi3IG5b00000000000001_f&8Hk0B~t=FJE?LZe(wAFK}{iXL4n8b1!0H -axQRrP)h*<6ay3h000O8Q5kVeDu3}X4+8)I-UR>v9{>OV0000000000q=9Ls4ghdza4%nWWo~3|axZX -lZ)b94b8|0aZ*^{TWpXZXc~DCM0u%!j0000808trnOwQ~NPWuA@0456n03QGV00000000000HlGnsSW -^eX>c!Jc4cm4Z*nhia&KpHWpi^cXk~10WpZ;aaCuNm0Rj{Q6aWAK2mnzTaZGmzQhVqE001Hd0018V00 -00000000005+c?X3;~aA|NaUv_0~WN&gWaB^>Fa%FRKFLQ8dZf<3AE^v8JO928D0~7!N00;n48F5S># -_lk^1pol|4FCWj00000000000001_ffBI}0B~t=FJE?LZe(wAFLGsZb!BsOb1z?CX>MtBUtcb8c~DCM -0u%!j0000808trnOy7KYB?18e0JH%B03!eZ00000000000HlEpw+;YsX>c!Jc4cm4Z*nhkWpQ<7b98e -rUte}*a&u{KZeL$6aCuNm0Rj{Q6aWAK2mnzTaZHG*IlB}B002k?001Wd0000000000005+cP`C~NaA| -NaUv_0~WN&gWa%FLKWpi|MFJEbHbY*gGVQgP@bZKmJE^v8JO928D0~7!N00;n48F5S_P~K7z6aWAiQU -CxT00000000000001_fvLI<0B~t=FJE?LZe(wAFLGsZb!BsOb1z|JVQ_S1a&s<lc~DCM0u%!j000080 -8trnOqgTnFBJv=09_aW02=@R00000000000HlHV&JF-@X>c!Jc4cm4Z*nhkWpQ<7b98erVQ^_KaCuNm -0Rj{Q6aWAK2mnzTaZCfP@{&Xg0000c000~S0000000000005+cM%4}gaA|NaUv_0~WN&gWa%FLKWpi| -MFJX0bXfAMhP)h*<6ay3h000O8Q5kVe1)<vY3pxS-@FD~N9{>OV0000000000q=CfX4ghdza4%nWWo~ -3|axZdaadl;LbaO9bVPj=-bS`jZZBR=A0u%!j0000808trnOoFna&n^J~0MP*e0384T00000000000H -lEo8xa6-X>c!Jc4cm4Z*nhkWpQ<7b98erV`Xx5b1rasP)h*<6ay3h000O8Q5kVecgbN*R0041S_S|B9 -smFU0000000000q=9uD5dd&$a4%nWWo~3|axZdaadl;LbaO9bZ*6d4bS`jtP)h*<6ay3h000O8Q5kVe -6GO=}cM|{rAV&ZI9{>OV0000000000q=5w=5dd&$a4%nWWo~3|axZdaadl;LbaO9bZ*Oa9WpgfYc~DC -M0u%!j0000808trnO!>~~&?*D~04odt03rYY00000000000HlGrG7$i9X>c!Jc4cm4Z*nhkWpQ<7b98 -erWq4y{aCB*JZgVbhc~DCM0u%!j0000808trnOoSa^;&KE408<VC02}}S00000000000HlE<HxU4EX> -c!Jc4cm4Z*nhkWpQ<7b98erXk~10E^v8JO928D0~7!N00;n48F5T`+M~*P0RRC10ssIV00000000000 -001_fzLY;0B~t=FJE?LZe(wAFLGsZb!BsOb1!IbZ)<ZdaCuNm0Rj{Q6aWAK2mnzTaZF`>M|2J*000Ap -0015U0000000000005+cggp@eaA|NaUv_0~WN&gWa%FLKWpi|MFKusRWo&aUaCuNm0Rj{Q6aWAK2mnz -TaZC-~@2*M#002w^001BW0000000000005+c&SMb(aA|NaUv_0~WN&gWa%FLKWpi|MFK}UFYhh<)b1r -asP)h*<6ay3h000O8Q5kVeU!P`~MIHbEnri?6AOHXW0000000000q=8mt5dd&$a4%nWWo~3|axZdaad -l;LbaO9rWpi_BZ*FrgaCuNm0Rj{Q6aWAK2mnzTaZEut*W&*K008?8001Na0000000000005+c*@F=Pa -A|NaUv_0~WN&gWa%FLKWpi|MFLQKZbaiuIV{c?-b1rasP)h*<6ay3h000O8Q5kVe<{-)sd;|ah#0vlb -A^-pY0000000000q=6cV5dd&$a4%nWWo~3|axZdaadl;LbaO9rbaHiLbairNb1rasP)h*<6ay3h000O -8Q5kVeN5R=wogx4L1Z)5R9RL6T0000000000q=D9r5dd&$a4%nWWo~3|axZdaadl;LbaO9tbZKmJE^v -8JO928D0~7!N00;n48F5UKKJ|xn1ONaf3jhEg00000000000001_fv&I-0B~t=FJE?LZe(wAFLiQkY- -wUMFJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVe02$MiS_}XH+$R74BLDyZ0000000000q=8_y5dd&$a -4%nWWo~3|axZmqY;0*_GcR9bZ)|L3V{~b6ZgVbhc~DCM0u%!j0000808trnOkjkrrz;Qu0LwA}03iSX -00000000000HlHY!4Uv(X>c!Jc4cm4Z*nhna%^mAVlyveZ*Fd7V{~b6ZZ2?nP)h*<6ay3h000O8Q5kV -e7aAOIgC+m~9*O_}B>(^b0000000000q=9A95dd&$a4%nWWo~3|axZmqY;0*_GcRLrZf<2`bZKvHaBp -vHE^v8JO928D0~7!N00;n48F5VVn#luz2mk=f82|tw00000000000001_fh+kD0B~t=FJE?LZe(wAFL -iQkY-wUMFJ*XRWpH$9Z*FrgaCuNm0Rj{Q6aWAK2mnzTaZCX@jIu8W001`^0012T0000000000005+c> -H!h}aA|NaUv_0~WN&gWb#iQMX<{=kW@%+?WOFWXc~DCM0u%!j0000808trnOxIn|7f=HL01*iQ03QGV -00000000000HlFb2@(KsX>c!Jc4cm4Z*nhna%^mAVlyvhX>4V1Z*z1maCuNm0Rj{Q6aWAK2mnzTaZK> -87?RKu007xP001HY0000000000005+c;S3T0aA|NaUv_0~WN&gWb#iQMX<{=kaBpvHZDDR<XJv9OaCu -Nm0Rj{Q6aWAK2mnzTaZJiF<iwK)0024{0015U0000000000005+c@gEWZaA|NaUv_0~WN&gWb#iQMX< -{=ka%FLKWpi{caCuNm0Rj{Q6aWAK2mnzTaZEo-f??Pg004Jc0018V0000000000005+cz$X#_aA|NaU -v_0~WN&gWb#iQMX<{=ka%FRHZ*FsCE^v8JO928D0~7!N00;n48F5Si00002000000000d0000000000 -0001_fz?0~0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kV -e7{jfTgbV-xaVh`+C;$Ke0000000000q=6hk5&&>%a4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQEEaAj -_1X>MgMaCuNm0Rj{Q6aWAK2mnzTaZE0yagC$}004dw001Wd0000000000005+c=1md+aA|NaUv_0~WN -&gWb#iQMX<{=kV{dMBa%o~OZggyIaBpvHE^v8JO928D0~7!N00;n48F5VWDz<SK6954EI{*ME000000 -00000001_fzMMC0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FK~HpaAj_Db8Iefc~DCM0u%!j00008 -08trnOy^U;^J5?Y03~+-04@Lk00000000000HlE|XA%H#X>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{# -PWn*=6Wpr|3ZgX&Na&#_mc~DCM0u%!j0000808trnOwdy)nK}mm05cc>03-ka00000000000HlH2hY| -pAX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#PZ)0n7E^v8JO928D0~7!N00;n48F5Si000020000000 -00u00000000000001_fme?b0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5Rb -T40DX>MtBUtcb8c~DCM0u%!j0000808trnOt)E!eOC_v0GLDo05|{u00000000000HlGhj}icIX>c!J -c4cm4Z*nhna%^mAVlyveZ*FvQX<{#5b7f<7a%FUKVQzD9Z*p`mVrgz<X>Mn8E^v8JO928D0~7!N00;n -48F5SmuiTJD4*&ojF8}~J00000000000001_fn1*w0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE -(IV|8+6baG*Cb8v5RbT4dgcVBE}c4cfXaCuNm0Rj{Q6aWAK2mnzTaZHb0pnOmO003<O001Ze0000000 -000005+c_^uKFaA|NaUv_0~WN&gWb#iQMX<{=kaA9L>VP|D?FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q -5kVeM!}|M@CpC`=OO?AEC2ui0000000000q=AmF5&&>%a4%nWWo~3|axZmqY;0*_GcRyqV{2h&WpgiY -a%5$4Wn^DuX=8LQaCuNm0Rj{Q6aWAK2mnzTaZH(5O<G7D005G8001KZ0000000000005+c$hr~$aA|N -aUv_0~WN&gWb#iQMX<{=kaA9L>VP|D?FLP;lE^v8JO928D0~7!N00;n48F5Si00002000000000o000 -00000000001_fl=5J0B~t=FJE?LZe(wAFLiQkY-wUMFK}UFYhh<)b1!0HV{344a&&VqUtei%X>?y-E^ -v8JO928D0~7!N00;n48F5TfR~)%d0ssKD1pojt00000000000001_fuq<G0B~t=FJE?LZe(wAFLiQkY --wUMFK}UFYhh<)b1!0HV{344a&&VqZDDI=W@&6?E^v8JO928D0~7!N00;n48F5VeZOY|80RRB70ssIz -00000000000001_fkN970B~t=FJE?LZe(wAFLiQkY-wUMFK}UFYhh<)b1!pqY+r3*bYo~=Xm4|LZeeX -@FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVewK|V0vIqbGMiu}7LI3~&0000000000q=DMp5&&>%a4% -nWWo~3|axZmqY;0*_GcRyqV{2h&Wpgicb8KI2VRU0?UubW0bZ%j7WiMZ8ZE$R5ZDnqBVRUJ4ZZ2?nP) -h*<6ay3h000O8Q5kVeQgz|KqyYc`6a)YOBme*a0000000000q=D?^5&&>%a4%nWWo~3|axZmqY;0*_G -cR>?X>2cFUukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZIb9Up<os004~;001Tc0000000000005+c(&rKY -aA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFJo_RZe?S1X>V>WaCuNm0Rj{Q6aWAK2mnzTaZEvBkk<hP004O -o001KZ0000000000005+csqPX0aA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLGsZb!BsOE^v8JO928D0~7 -!N00;n48F5VXIUJwZ0{{Rg2><{j00000000000001_f$Q@U0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY% -g+Ub8v5Nb7d}Yc~DCM0u%!j0000808trnOg&-m+lCPU00}t&03iSX00000000000HlEh_!0ncX>c!Jc -4cm4Z*nhna%^mAVlyvwbZKlaa%FUKc`k5yP)h*<6ay3h000O8Q5kVeea|~R?h^n2n^FJ(B>(^b00000 -00000q=Cu_698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2cZWo%_*bZ>HVE^v8JO928D0~7!N00;n48F5V -2@5rKN5C8zMF8}}_00000000000001_f%_d30B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g<jY+o*Lc~D -CM0u%!j0000808trnOjT0OAae@<039X(03!eZ00000000000HlGRE)xK7X>c!Jc4cm4Z*nhna%^mAVl -yvwbZKlabZKp6Z*_DoaCuNm0Rj{Q6aWAK2mnzTaZJM=Z4nF!0037R0018V0000000000005+cQ#um>a -A|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLiQkE^v8JO928D0~7!N00;n48F5UuJR|%80ssK31pojb00000 -000000001_ft*7V0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%h0VX>=}dc~DCM0u%!j0000808trnOmD% -VI4%nS08l9a03-ka00000000000HlH2MH2vUX>c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZUtei%X>?y-E^v -8JO928D0~7!N00;n48F5U<tq6++1^@sPBLDy*00000000000001_flE;n0B~t=FJE?LZe(wAFLz~PWo -~0{WNB_^b1!URVr6V|E^v8JO928D0~7!N00;n48F5Tde=#3K0ssIR1pojf00000000000001_fsj`d0 -B~t=FJE?LZe(wAFLz~PWo~0{WNB_^b1!XcY++($Y;!Jfc~DCM0u%!j0000808trnOct9y9l8Yo0HPTH -03iSX00000000000HlEyS`z?pX>c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZbY*jNb1rasP)h*<6ay3h000O -8Q5kVeNN+{Hqyzu}(hvXuDgXcg0000000000q=64$698~&a4%nWWo~3|axZsfVr6b)Z)9n1XLB!jUv+ -b3a$jU+W@&C^WG--dP)h*<6ay3h000O8Q5kVekPU}Jrvd-~#0UTY7ytkO0000000000q=EZn698~&a4 -%zTZEaz0WOFZHUukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZDXyJ74Vq003qM000#L0000000000005+c* -k=;}aA|NaV{dJ3VQyq|FJowBV{0yOc~DCM0u%!j0000808trnOfbRBvu6VU0F?;<02%-Q0000000000 -0HlHVX%hf&X>c!NZ*6U1Ze(*WV{dJ6Y-Mz5Z*DGdc~DCM0u%!j0000808trnOxYfprW6PO0D>L>02lx -O00000000000HlGJZ4&@+X>c!NZ*6U1Ze(*WWN&wFY;R#?E^v8JO928D0~7!N00;n48F5U*_VZxb0{{ -RM3jhEX00000000000001_f#G!%0B~t=FJo_QZDDR?b1!CcWo3G0E^v8JO928D0~7!N00;n48F5VbiR -`4k0ssI#1^@sQ00000000000001_f$n(|0B~t=FJo_QZDDR?b1!INb7(Gbc~DCM0u%!j0000808trnO -db}{ovHx<0M-Kl02BZK00000000000HlH4d=mh0X>c!NZ*6U1Ze(*WXk~10E^v8JO928D0~7!N00;n4 -8F5TYC59HX4*&oJL;wI600000000000001_fw_JY0B~t=FJo_QZDDR?b1!Lbb97;BY%XwlP)h*<6ay3 -h000O8Q5kVe4@<{5zY72WX)FK$6aWAK0000000000q=BN2698~&a4%zTZEaz0WOFZUX>)WgaCuNm0Rj -{Q6aWAK2mnzTaZIj4gxn?u005Q|000&M0000000000005+clbRC%aA|NaV{dJ3VQyq|FLPyKa${&NaC -uNm0Rj{Q6aWAK2mnzTaZC(TA0+$+0009Q000yK0000000000005+c?Vu9?aA|NaV{dJ3VQyq|FLP*bc -P?;wP)h*<6ay3h000O8Q5kVetBDyu&;tMfL<;}_82|tP0000000000q=6f#698~&a4%zTZEaz0WOFZd -ZfS0FbYX04E^v8JO928D0~7!N00;n48F5UPH*@Cv2LJ#u9smFp00000000000001_fg-FE0B~t=FJo_ -QZDDR?b1!#jWo2wGaCuNm0Rj{Q6aWAK2mnzTaZH&fsd4NE002M|000&M0000000000005+cQM3~PaA| -NaV{dJ6VRSEFUukY>bYEXCaCuNm0Rj{Q6aWAK2mnzTaZG}urI$?=001~z000;O0000000000005+cak -~=$aA|NaV{dJ6VRSEKX=8L_Z*FF3XD)DgP)h*<6ay3h000O8Q5kVesv2j!K>z>%M*si-761SM000000 -0000q=EF%698~&a4&6dWMyn~FJE72ZfSI1UoLQYP)h*<6ay3h000O8Q5kVeXihS1;Q#;t=K%l!6951J -0000000000q=9MC698~&a4&6dWMyn~FKKRMWq2-dc~DCM0u%!j0000808trnOaK4?00IC20000002%- -Q00000000000HlF?(h~r1X>c!ZaAk5~bZKvHb1z?CX>MtBUtcb8c~DCM0u%!j0000808trnOwVOvsIC -D305%2y02crN00000000000HlGn(h~r1X>c!ZaAk5~bZKvHb1!3PWn*hDaCuNm0Rj{Q6aWAK2mnzTaZ -LFlGc$k%002r9000;O0000000000005+cnA8&haA|NaZ*XODVRUJ4ZgVeYa%E+DWiD`eP)h*<6ay3h0 -00O8Q5kVeTxrr7fB*mh6afGL6951J0000000000q=8P_698~&a4&LYaW7wAX>MtBUtcb8c~DCM0u%!j -0000808trnOdQ~h3TX`h0G2KQ022TJ00000000000HlHc+7ke9X>c!cWpOWZWpQ6-X>4UKaCuNm0Rj{ -Q6aWAK2mnzTaZG`2Rm1l!005V@000&M0000000000005+cndlP$aA|Naa%FKZa%FK}X>N0LVQg$JaCu -Nm0Rj{Q6aWAK2mnzTaZD23l6JEp005qb000sI0000000000005+c#1<3)aA|Naa%FKZa%FK}b7gccaC -uNm0Rj{Q6aWAK2mnzTaZCk9#Bfju008kC000;O0000000000005+cr#KV<aA|Naa%FKZa%FK}b#7^Hb -97;BY%XwlP)h*<6ay3h000O8Q5kVe;99i46CnTqGim?;6#xJL0000000000q=79#6aa8(a4&UqX>4;Z -Utei%X>?y-E^v8JO928D0~7!N00;n48F5TC3f?=Z3IG6WA^-ps00000000000001_fpcOM0B~t=FLiW -jY;!MRaByU4a&s<lc~DCM0u%!j0000808trnOw9~UE&u`m03Zbb01^NI00000000000HlFVZ4>}-X>c -!fbZKmJFJg6RY-BEQc~DCM0u%!j0000808trnOmQA+BnATj0JsPM02lxO00000000000HlF_ZxjG<X> -c!fbZKmJFJxtKa%E#-bZKvHE^v8JO928D0~7!N00;n48F5U#T0gM50RRBY0{{RO00000000000001_f -x2=O0B~t=FLiWjY;!MVZewp`X>MmOaCuNm0Rj{Q6aWAK2mnzTaZK_<?ZBh~004sn000*N0000000000 -005+cr*sqmaA|Nab#!TLb1!CTY-MwKb97~GE^v8JO928D0~7!N00;n48F5S?HwARy1ONbg3jhET0000 -0000000001_fq-@t0B~t=FLiWjY;!MXY-wU+E^v8JO928D0~7!N00;n48F5UhH0cC=1ONas3jhEU000 -00000000001_fslI?0B~t=FLiWjY;!MYVRL9@b1rasP)h*<6ay3h000O8Q5kVeXC~KpvjhMD{|o>C6a -WAK0000000000q=7zw6aa8(a4&UqX>4;ZY;R|0X>MmOaCuNm0Rj{Q6aWAK2mnzTaZE^5*y@P}002)F0 -00#L0000000000005+cBZU+IaA|Nab#!TLb1!dobYx+4Wn?aJc~DCM0u%!j0000808trnObzCexaR@@ -03Zke02TlM00000000000HlH6ixdEGX>c!fbZKmJFK}UFYhh<;Zf7oVc~DCM0u%!j0000808trnOctW -@O1l6602ToN0384T00000000000HlHXjuZfJX>c!fbZKmJFLPydb#QcVZ)|g4Vs&Y3WG--dP)h*<6ay -3h000O8Q5kVe<>HW)Vh#WRO)UTb4*&oF0000000000q=E2{6aa8(a4&UqX>4;Zb!jeec~DCM0u%!j00 -00808trnOvqNnOXCdy09G&n022TJ00000000000HlF`o)iFZX>c!gV{<QGUukY>bYEXCaCuNm0Rj{Q6 -aWAK2mnzTaZLNb%*8VW007$#000pH0000000000005+cldKc~aA|Nac4KodVqtn=VR9~Tc~DCM0u%!j -0000808trnOentIFaQkz0KF>!01f~E00000000000HlHSu@nGsX>c!gV{<QOX>=}dc~DCM0u%!j0000 -808trnOnG8z9bp6j0FVs;02BZK00000000000HlE-zZ3v)X>c!gV{<QUWpZP6a%o{~E^v8JO928D0~7 -!N00;n48F5T*G?hUh3jhFyBme*v00000000000001_fwaRE0B~t=FLq;dFLQNbc4cyNX>V>WaCuNm0R -j{Q6aWAK2mn<XaZIamG*=M<000LC001KZ0000000000005+c2hS7$aA|NYIW90RGA?9kb960fZf0*UL -`73WQb|x$Nl#8La&vT0O928D0~7!N00;n88F5Us7nsB<0000)0000a00000000000001_fmzWM0B~t= -EjcbQE;24;X>)WfX>Mk3FJ*3Ya(Q2HZ)t9Hb1rmvbWlqH0u%!j00008096@rO#g~?nt%cT038MZ03iS -X00000000000HlG%(G&o1X>ct$E-)@KE@WwQbS-IaW^XTTWprU=VRT_GYIARHP)h*<6ay3h000O8RT* -(i#~+u%1^@s61ONa4ApigX0000000000q=AIg6aa8(a4k75FfKAKWNCABEop9MZ!dIja9?a?c4cfXba --@7O928D0~7!N00;n88F5VZ-O|2a0001P0000P00000000000001_fyvYq0B~t=EjcbQE;24;X>)WfX ->Mk3FIPxKMNCjj0Rj{Q6aWAK2mn<XaZLKZmmj4A008+3000~S0000000000005+cU)2-<aA|NYIW90R -GA?9kb960fZf0*UO+{2eL_t(RP)h*<6ay3h000O8RT*(i5fKKgU@-sym|_3`8UO$Q0000000000q=7! -!6aa8(a4k75FfKAKWNCABEop9MZ!c0sLr+pfP)h{{00000837pqf>i(j)(RB>000 -""" - - -if __name__ == "__main__": - main() diff --git a/vendor/pip-9.0.3/AUTHORS.txt b/vendor/pip-9.0.3/AUTHORS.txt new file mode 100644 index 0000000000000000000000000000000000000000..7859b7c3109861c8a061a949cbba2559d5ce7fcd --- /dev/null +++ b/vendor/pip-9.0.3/AUTHORS.txt @@ -0,0 +1,329 @@ +Adam Chainz <adam@adamj.eu> +Adam Wentz <awentz@theonion.com> +Aleks Bunin <github@compuix.com> +Alex Gaynor <alex.gaynor@gmail.com> +Alex Grönholm <alex.gronholm@nextday.fi> +Alex Morega <alex@grep.ro> +Alex Stachowiak <alexander@computer.org> +Alexandre Conrad <alexandre.conrad@gmail.com> +Alli <alzeih@users.noreply.github.com> +Anatoly Techtonik <techtonik@gmail.com> +Andrei Geacar <andrei.geacar@gmail.com> +Andrey Bulgakov <mail@andreiko.ru> +Andy Freeland <andy.freeland@redjack.com> +Andy Kluger <AndydeCleyre@users.noreply.github.com> +Anrs Hu <anrs@douban.com> +Antoine Musso <hashar@free.fr> +Anton Ovchinnikov <revolver112@gmail.com> +Anton Patrushev <apatrushev@gmail.com> +Antonio Alvarado Hernandez <tnotstar@gmail.com> +Antti Kaihola <akaihol+github@ambitone.com> +AQNOUCH Mohammed <aqnouch.mohammed@gmail.com> +Arindam Choudhury <arindam@live.com> +Armin Ronacher <armin.ronacher@active-4.com> +Ashley Manton <ajd.manton@googlemail.com> +Baptiste Mispelon <bmispelon@gmail.com> +Ben Darnell <ben@bendarnell.com> +Ben Rosser <rosser.bjr@gmail.com> +Bence Nagy <bence@underyx.me> +Benjamin VanEvery <ben@simondata.com> +Berker Peksag <berker.peksag@gmail.com> +Bernardo B. Marques <bernardo.fire@gmail.com> +Bogdan Opanchuk <bogdan@opanchuk.net> +Brad Erickson <eosrei@gmail.com> +Bradley Ayers <bradley.ayers@gmail.com> +Brian Rosner <brosner@gmail.com> +Bruno Oliveira <nicoddemus@gmail.com> +Bruno Renié <brutasse@gmail.com> +Buck Golemon <buck@yelp.com> +burrows <burrows@preveil.com> +Bussonnier Matthias <bussonniermatthias@gmail.com> +c22 <c22@users.noreply.github.com> +Calvin Smith <eukaryote@users.noreply.github.com> +Carl Meyer <carl@oddbird.net> +Carlos Liam <carlos@aarzee.me> +Carol Willing <carolcode@willingconsulting.com> +Carter Thayer <carterwthayer@gmail.com> +Cass <cass.petrus@gmail.com> +Chandrasekhar Atina <chandu.atina@gmail.com> +Chris Brinker <chris.brinker@gmail.com> +Chris Jerdonek <chris.jerdonek@gmail.com> +Chris McDonough <chrism@plope.com> +Chris Wolfe <chriswwolfe@gmail.com> +Christian Oudard <christian.oudard@gmail.com> +Christopher Snyder <cnsnyder@users.noreply.github.com> +Clark Boylan <clark.boylan@gmail.com> +Clay McClure <clay@daemons.net> +Cody <Purring@users.noreply.github.com> +Cody Soyland <codysoyland@gmail.com> +Colin Watson <cjwatson@debian.org> +Connor Osborn <cdosborn@email.arizona.edu> +Cory Benfield <lukasaoz@gmail.com> +Cory Wright <corywright@gmail.com> +Craig Kerstiens <craig.kerstiens@gmail.com> +Cristian Sorinel <cristian.sorinel@gmail.com> +Dan Savilonis <djs@n-cube.org> +Dan Sully <daniel-github@electricrain.com> +daniel <mcdonaldd@unimelb.edu.au> +Daniel Collins <accounts@dac.io> +Daniel Hahler <git@thequod.de> +Daniel Holth <dholth@fastmail.fm> +Daniel Jost <torpedojost@gmail.com> +Daniele Procida <daniele@vurt.org> +Dav Clark <davclark@gmail.com> +Dave Abrahams <dave@boostpro.com> +David Aguilar <davvid@gmail.com> +David Black <db@d1b.org> +David Caro <david@dcaro.es> +David Evans <d@drhevans.com> +David Linke <dr.david.linke@gmail.com> +David Pursehouse <david.pursehouse@gmail.com> +David Wales <daviewales@gmail.com> +Davidovich <david.genest@gmail.com> +derwolfe <chriswwolfe@gmail.com> +Dmitry Gladkov <dmitry.gladkov@gmail.com> +Domen Kožar <domen@dev.si> +Donald Stufft <donald@stufft.io> +Dongweiming <dongweiming@admaster.com.cn> +Douglas Thor <dougthor42@users.noreply.github.com> +Dwayne Bailey <dwayne@translate.org.za> +Ed Morley <emorley@mozilla.com> +Emil Styrke <emil.styrke@gmail.com> +Endoh Takanao <djmchl@gmail.com> +enoch <lanxenet@gmail.com> +Eric Gillingham <Gillingham@bikezen.net> +Eric Hanchrow <eric.hanchrow@gmail.com> +Erik M. Bray <embray@stsci.edu> +Erik Rose <erik@mozilla.com> +Eugene Vereshchagin <evvers@gmail.com> +Florian Briand <ownerfrance+github@hotmail.com> +Francesco <f.guerrieri@gmail.com> +Francesco Montesano <franz.bergesund@gmail.com> +Gabriel de Perthuis <g2p.code@gmail.com> +Garry Polley <garrympolley@gmail.com> +Geoffrey Lehée <geoffrey@lehee.name> +Geoffrey Sneddon <me@gsnedders.com> +George Song <george@55minutes.com> +Georgi Valkov <georgi.t.valkov@gmail.com> +gizmoguy1 <gizmoguy1@gmail.com> +Guilherme Espada <porcariadagata@gmail.com> +Guy Rozendorn <guy@rzn.co.il> +Herbert Pfennig <herbert@albinen.com> +Hsiaoming Yang <lepture@me.com> +Hugo Lopes Tavares <hltbra@gmail.com> +Hynek Schlawack <hs@ox.cx> +Ian Bicking <ianb@colorstudy.com> +Ian Cordasco <graffatcolmingov@gmail.com> +Ian Lee <IanLee1521@gmail.com> +Ian Wienand <ian@wienand.org> +Ian Wienand <iwienand@redhat.com> +Igor Sobreira <igor@igorsobreira.com> +Ilya Baryshev <baryshev@gmail.com> +INADA Naoki <songofacandy@gmail.com> +Ionel Cristian MărieÈ™ <contact@ionelmc.ro> +Ionel Maries Cristian <ionel.mc@gmail.com> +Jakub Stasiak <kuba.stasiak@gmail.com> +Jakub Vysoky <jakub@borka.cz> +Jakub Wilk <jwilk@jwilk.net> +James Cleveland <jamescleveland@gmail.com> +James Cleveland <radiosilence@users.noreply.github.com> +James Firth <hello@james-firth.com> +James Polley <jp@jamezpolley.com> +Jan Pokorný <jpokorny@redhat.com> +Jannis Leidel <jannis@leidel.info> +jarondl <me@jarondl.net> +Jason R. Coombs <jaraco@jaraco.com> +Jay Graves <jay@skabber.com> +Jeff Barber <jbarber@computer.org> +Jeff Dairiki <dairiki@dairiki.org> +Jeremy Stanley <fungi@yuggoth.org> +Jim Garrison <jim@garrison.cc> +Jivan Amara <Development@JivanAmara.net> +John-Scott Atlakson <john.scott.atlakson@gmail.com> +Jon Banafato <jon@jonafato.com> +Jon Parise <jon@indelible.org> +Jon Wayne Parrott <jjramone13@gmail.com> +Jonas Nockert <jonasnockert@gmail.com> +Joost Molenaar <j.j.molenaar@gmail.com> +Jorge Niedbalski <niedbalski@gmail.com> +Joseph Long <jdl@fastmail.fm> +Josh Bronson <jabronson@gmail.com> +Josh Hansen <josh@skwash.net> +Josh Schneier <josh.schneier@gmail.com> +Julien Demoor <julien@jdemoor.com> +jwg4 <jack.grahl@yahoo.co.uk> +Jyrki Pulliainen <jyrki@spotify.com> +Kamal Bin Mustafa <kamal@smach.net> +kaustav haldar <hi@kaustav.me> +Kelsey Hightower <kelsey.hightower@gmail.com> +Kenneth Belitzky <kenny@belitzky.com> +Kenneth Reitz <me@kennethreitz.com> +Kenneth Reitz <me@kennethreitz.org> +Kevin Burke <kev@inburke.com> +Kevin Carter <kevin.carter@rackspace.com> +Kevin Frommelt <kevin.frommelt@webfilings.com> +Kit Randel <kit@nocturne.net.nz> +Kumar McMillan <kumar.mcmillan@gmail.com> +Kyle Persohn <kyle.persohn@gmail.com> +Laurent Bristiel <laurent@bristiel.com> +Leon Sasson <leonsassonha@gmail.com> +Lev Givon <lev@columbia.edu> +Lincoln de Sousa <lincoln@comum.org> +Lipis <lipiridis@gmail.com> +Ludovic Gasc <gmludo@gmail.com> +Luke Macken <lmacken@redhat.com> +Marc Abramowitz <marc@marc-abramowitz.com> +Marc Tamlyn <marc.tamlyn@gmail.com> +Marcus Smith <qwcode@gmail.com> +Mark Kohler <mark.kohler@proteinsimple.com> +Markus Hametner <fin+github@xbhd.org> +Masklinn <bitbucket.org@masklinn.net> +Matej Stuchlik <mstuchli@redhat.com> +Mathew Jennings <mjennings@foursquare.com> +Matt Good <matt@matt-good.net> +Matt Maker <trip@monstro.us> +Matt Robenolt <matt@ydekproductions.com> +matthew <matthew@trumbell.net> +Matthew Einhorn <moiein2000@gmail.com> +Matthew Gilliard <matthew.gilliard@gmail.com> +Matthew Iversen <teh.ivo@gmail.com> +Matthew Trumbell <matthew@thirdstonepartners.com> +Matthias Bussonnier <bussonniermatthias@gmail.com> +Maxim Kurnikov <maxim.kurnikov@gmail.com> +Maxime Rouyrre <rouyrre+git@gmail.com> +memoselyk <memoselyk@gmail.com> +Michael <michael-k@users.noreply.github.com> +Michael Aquilina <michaelaquilina@gmail.com> +Michael E. Karpeles <michael.karpeles@gmail.com> +Michael Klich <michal@michalklich.com> +Michael Williamson <mike@zwobble.org> +michaelpacer <michaelpacer@gmail.com> +Miguel Araujo Perez <miguel.araujo.perez@gmail.com> +Mihir Singh <git.service@mihirsingh.com> +Min RK <benjaminrk@gmail.com> +MinRK <benjaminrk@gmail.com> +montefra <franz.bergesund@gmail.com> +Monty Taylor <mordred@inaugust.com> +Nate Coraor <nate@bx.psu.edu> +Nathaniel J. Smith <njs@pobox.com> +Nick Coghlan <ncoghlan@gmail.com> +Nick Stenning <nick@whiteink.com> +Nowell Strite <nowell@strite.org> +nvdv <modestdev@gmail.com> +Ofekmeister <ofekmeister@gmail.com> +Oliver Tonnhofer <olt@bogosoft.com> +Olivier Girardot <ssaboum@gmail.com> +Olivier Grisel <olivier.grisel@ensta.org> +Ollie Rutherfurd <orutherfurd@gmail.com> +Oren Held <orenhe@il.ibm.com> +Oscar Benjamin <oscar.j.benjamin@gmail.com> +Patrick Dubroy <pdubroy@gmail.com> +Patrick Jenkins <patrick@socialgrowthtechnologies.com> +Patrick Lawson <pl@foursquare.com> +patricktokeeffe <patricktokeeffe@users.noreply.github.com> +Paul Moore <p.f.moore@gmail.com> +Paul Nasrat <pnasrat@gmail.com> +Paul Oswald <pauloswald@gmail.com> +Paul van der Linden <mail@paultjuh.org> +Paulus Schoutsen <paulus@paulusschoutsen.nl> +Pawel Jasinski <pawel.jasinski@gmail.com> +Pekka Klärck <peke@iki.fi> +Peter Waller <peter.waller@gmail.com> +Phaneendra Chiruvella <hi@pcx.io> +Phil Freo <phil@philfreo.com> +Phil Whelan <phil123@gmail.com> +Philippe Ombredanne <pombredanne@gmail.com> +Pierre-Yves Rofes <github@rofes.fr> +Piet Delport <pjdelport@gmail.com> +Pradyun <pradyunsg@users.noreply.github.com> +Pradyun S. Gedam <pradyunsg@gmail.com> +Preston Holmes <preston@ptone.com> +Przemek Wrzos <hetmankp@none> +Qiangning Hong <hongqn@gmail.com> +Rafael Caricio <rafael.jacinto@gmail.com> +Ralf Schmitt <ralf@systemexit.de> +Razzi Abuissa <razzi53@gmail.com> +Remi Rampin <remirampin@gmail.com> +Rene Dudfield <renesd@gmail.com> +Richard Jones <r1chardj0n3s@gmail.com> +RobberPhex <robberphex@gmail.com> +Robert Collins <rbtcollins@hp.com> +Robert McGibbon <rmcgibbo@gmail.com> +Robert T. McGibbon <rmcgibbo@gmail.com> +Roey Berman <roey.berman@gmail.com> +Rohan Jain <crodjer@gmail.com> +Rohan Jain <crodjer@users.noreply.github.com> +Rohan Jain <mail@rohanjain.in> +Roman Bogorodskiy <roman.bogorodskiy@ericsson.com> +Romuald Brunet <romuald@chivil.com> +Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de> +Rory McCann <rory@technomancy.org> +Ross Brattain <ross.b.brattain@intel.com> +Roy Wellington â…£ <cactus_hugged@yahoo.com> +Roy Wellington â…£ <roy@mybasis.com> +Ryan Wooden <rygwdn@gmail.com> +ryneeverett <ryneeverett@gmail.com> +Sachi King <nakato@nakato.io> +Salvatore Rinchiera <salvatore@rinchiera.com> +schlamar <marc.schlaich@gmail.com> +Scott Kitterman <sklist@kitterman.com> +seanj <seanj@xyke.com> +Sebastian Schaetz <sschaetz@butterflynetinc.com> +Sergey Vasilyev <nolar@nolar.info> +Seth Woodworth <seth@sethish.com> +Simeon Visser <svisser@users.noreply.github.com> +Simon Cross <hodgestar@gmail.com> +Simon Pichugin <simon.pichugin@gmail.com> +Sorin Sbarnea <sorin.sbarnea@gmail.com> +Stavros Korokithakis <stavros@korokithakis.net> +Stefan Scherfke <stefan@sofa-rockers.org> +Stephan Erb <stephan@dev.static-void.de> +stepshal <nessento@openmailbox.org> +Steve (Gadget) Barnes <gadgetsteve@hotmail.com> +Steve Barnes <gadgetsteve@hotmail.com> +Steve Kowalik <steven@wedontsleep.org> +Steven Myint <git@stevenmyint.com> +stonebig <stonebig34@gmail.com> +Stéphane Bidoul (ACSONE) <stephane.bidoul@acsone.eu> +Stéphane Bidoul <stephane.bidoul@acsone.eu> +Stéphane Klein <contact@stephane-klein.info> +Takayuki SHIMIZUKAWA <shimizukawa@gmail.com> +Thomas Fenzl <thomas.fenzl@gmail.com> +Thomas Grainger <tagrain@gmail.com> +Thomas Guettler <tguettler@tbz-pariv.de> +Thomas Johansson <devnull@localhost> +Thomas Kluyver <takowl@gmail.com> +Thomas Smith <smithtg@ncbi.nlm.nih.gov> +Tim D. Smith <github@tim-smith.us> +Tim Harder <radhermit@gmail.com> +Tim Heap <tim@timheap.me> +tim smith <github@tim-smith.us> +tinruufu <tinruufu@gmail.com> +Tom V <tom@viner.tv> +Tomer Chachamu <tomer.chachamu@gmail.com> +Tony Zhaocheng Tan <tony@tonytan.io> +Toshio Kuratomi <toshio@fedoraproject.org> +Travis Swicegood <development@domain51.com> +Valentin Haenel <valentin.haenel@gmx.de> +Victor Stinner <victor.stinner@gmail.com> +Victor Stinner <vstinner@redhat.com> +Viktor Szépe <viktor@szepe.net> +Ville Skyttä <ville.skytta@iki.fi> +Vinay Sajip <vinay_sajip@yahoo.co.uk> +Vitaly Babiy <vbabiy86@gmail.com> +Vladimir Rutsky <rutsky@users.noreply.github.com> +W. Trevor King <wking@drexel.edu> +Wil Tan <wil@dready.org> +Wilfred Hughes <me@wilfred.me.uk> +William ML Leslie <william.leslie.ttg@gmail.com> +Wolfgang Maier <wolfgang.maier@biologie.uni-freiburg.de> +Xavier Fernandez <xav.fernandez@gmail.com> +Xavier Fernandez <xavier.fernandez@polyconseil.fr> +YAMAMOTO Takashi <yamamoto@midokura.com> +Yen Chi Hsuan <yan12125@gmail.com> +Yoval P <yoval@gmx.com> +Yu Jian <askingyj@gmail.com> +Zearin <zearin@gonk.net> +Zearin <Zearin@users.noreply.github.com> +Zhiping Deng <kofreestyler@gmail.com> +Zvezdan Petkovic <zpetkovic@acm.org> diff --git a/vendor/pip-9.0.3/CHANGES.txt b/vendor/pip-9.0.3/CHANGES.txt new file mode 100644 index 0000000000000000000000000000000000000000..436631ad09f11b2167e5b182bcc0a4486a14b149 --- /dev/null +++ b/vendor/pip-9.0.3/CHANGES.txt @@ -0,0 +1,1775 @@ +**9.0.3 (2018-03-21)** + +* Fix an error where the vendored requests was not correctly containing itself + to only the internal vendored prefix. + +* Restore compatability with 2.6. + + +**9.0.2 (2018-03-16)** + +* Fallback to using SecureTransport on macOS when the linked OpenSSL is too old + to support TLSv1.2. + + +**9.0.1 (2016-11-06)** + +* Correct the deprecation message when not specifying a --format so that it + uses the correct setting name (``format``) rather than the incorrect one + (``list_format``) (:issue:`4058`). + +* Fix ``pip check`` to check all available distributions and not just the + local ones (:issue:`4083`). + +* Fix a crash on non ASCII characters from `lsb_release` (:issue:`4062`). + +* Fix an SyntaxError in an an used module of a vendored dependency + (:issue:`4059`). + +* Fix UNC paths on Windows (:issue:`4064`). + + +**9.0.0 (2016-11-02)** + +* **BACKWARD INCOMPATIBLE** Remove the attempted autodetection of requirement + names from URLs, URLs must include a name via ``#egg=``. + +* **DEPRECATION** ``pip install --egg`` have been deprecated and will be + removed in the future. This "feature" has a long list of drawbacks which + break nearly all of pip's other features in subtle and hard-to-diagnose + ways. + +* **DEPRECATION** ``--default-vcs`` option (:issue:`4052`). + +* **WARNING** pip 9 cache can break forward compatibility with previous pip + versions if your package repository allows chunked responses (:issue:`4078`). + +* Add a ``pip check`` command to check installed packages dependencies + (:pull:`3750`). + +* Add option allowing user to abort pip operation if file/directory exists + +* Add Appveyor CI + +* Uninstall existing packages when performing an editable installation of + the same packages (:issue:`1548`). + +* ``pip show`` is less verbose by default. ``--verbose`` prints multiline fields. + (:pull:`3858`). + +* Add optional column formatting to ``pip list`` (:issue:`3651`). + +* Add ``--not-required`` option to ``pip list``, which lists packages that are + not dependencies of other packages. + +* Fix builds on systems with symlinked ``/tmp`` directory for custom + builds such as numpy (:pull:`3701`). + +* Fix regression in ``pip freeze``: when there is more than one git remote, + priority is given to the remote named ``origin`` (:pull:`3708`, :issue:`3616`). + +* Fix crash when calling ``pip freeze`` with invalid requirement installed + (:pull:`3704`, :issue:`3681`). + +* Allow multiple ``--requirement`` files in ``pip freeze`` (:pull:`3703`). + +* Implementation of pep-503 ``data-requires-python``. When this field is + present for a release link, pip will ignore the download when + installing to a Python version that doesn't satisfy the requirement. + +* ``pip wheel`` now works on editable packages too (it was only working on + editable dependencies before); this allows running ``pip wheel`` on the result + of ``pip freeze`` in presence of editable requirements (:pull:`3695`, + :issue:`3291`). + +* Load credentials from ``.netrc`` files (:pull:`3715`, :issue:`3569`). + +* Add ``--platform``, ``--python-version``, ``--implementation`` and ``--abi`` parameters to + ``pip download``. These allow utilities and advanced users to gather + distributions for interpreters other than the one pip is being run on. + (:pull:`3760`) + +* Skip scanning virtual environments, even when venv/bin/python is a dangling + symlink. + +* Added ``pip completion`` support for the ``fish`` shell. + +* Fix problems on Windows on Python 2 when username or hostname contains + non-ASCII characters (:issue:`3463`, :pull:`3970`, :pull:`4000`). + +* Use ``git fetch --tags`` to fetch tags in addition to everything else that + is normally fetched; this is necessary in case a git requirement url + points to a tag or commit that is not on a branch (:pull:`3791`) + +* Normalize package names before using in ``pip show`` (:issue:`3976`) + +* Raise when Requires-Python do not match the running version and add + ``--ignore-requires-python`` option as escape hatch (:pull:`3846`). + +* Report the correct installed version when performing an upgrade in some + corner cases (:issue:`2382`) + +* Add ``-i`` shorthand for ``--index`` flag in ``pip search`` + +* Do not optionally load C dependencies in requests (:issue:`1840`, + :issue:`2930`, :issue:`3024`) + +* Strip authentication from SVN url prior to passing it to ``svn`` + (:pull:`3697`, :issue:`3209`). + +* Also install in platlib with ``--target`` option (:pull:`3694`, :issue:`3682`). + +* Restore the ability to use inline comments in requirements files passed to + ``pip freeze`` (:issue:`3680`). + + +**8.1.2 (2016-05-10)** + +* Fix a regression on systems with uninitialized locale (:issue:`3575`). + +* Use environment markers to filter packages before determining if a + required wheel is supported. Solves (:issue:`3254`). + +* Make glibc parsing for `manylinux1` support more robust for the variety of + glibc versions found in the wild (:issue:`3588`). + +* Update environment marker support to fully support PEP 508 and legacy + environment markers (:issue:`3624`). + +* Always use debug logging to the ``--log`` file (:issue:`3351`). + +* Don't attempt to wrap search results for extremely narrow terminal windows + (:issue:`3655`). + + +**8.1.1 (2016-03-17)** + +* Fix regression with non-ascii requirement files on Python 2 and add support + for encoding headers in requirement files (:issue:`3548`, :pull:`3547`). + + +**8.1.0 (2016-03-05)** + +* Implement PEP 513, which adds support for the manylinux1 platform tag, + allowing carefully compiled binary wheels to be installed on compatible Linux + platforms. + +* Allow wheels which are not specific to a particular Python interpreter but + which are specific to a particular platform (:issue:`3202`). + +* Fixed an issue where ``call_subprocess`` would crash trying to print debug + data on child process failure (:issue:`3521`, :pull:`3522`). + +* Exclude the wheel package from the `pip freeze` output (like pip and setuptools). + :issue:`2989`. + +* Allow installing modules from a subdirectory of a vcs repository + in non-editable mode (:issue:`3217`, :pull:`3466`). + +* Make pip wheel and pip download work with vcs urls with subdirectory option + (:pull:`3466`). + +* Show classifiers in ``pip show``. + +* Show PEP376 Installer in ``pip show`` (:issue:`3517`). + +* Unhide completion command (:pull:`1810`). + +* Show latest version number in ``pip search`` results (:pull:`1415`). + +* Decode requirement files according to their BOM if present (:pull:`3485`, + :issue:`2865`). + +* Fix and deprecate package name detection from url path (:issue:`3523` and + :pull:`3495`). + +* Correct the behavior where interpreter specific tags (such as cp34) were + being used on later versions of the same interpreter instead of only for that + specific interpreter (:issue:`3472`). + +* Fix an issue where pip would erroneously install a 64 bit wheel on a 32 bit + Python running on a 64 bit macOS machine. + +* Do not assume that all git repositories have an origin remote. + +* Correctly display the line to add to a requirements.txt for an URL based + dependency when ``--require-hashes`` is enabled. + + +**8.0.3 (2016-02-25)** + +* Make ``install --quiet`` really quiet. See :issue:`3418`. + +* Fix a bug when removing packages in python 3: disable INI-style parsing of the + entry_point.txt file to allow entry point names with colons (:pull:`3434`) + +* Normalize generated script files path in RECORD files. (:pull:`3448`) + +* Fix bug introduced in 8.0.0 where subcommand output was not shown, + even when the user specified ``-v`` / ``--verbose``. :issue:`3486`. + +* Enable python -W with respect to PipDeprecationWarning. (:pull:`3455`) + +* Upgrade distlib to 0.2.2 (fix :issue:`3467`): + + * Improved support for Jython when quoting executables in output scripts. + +* Add a `--all` option to `pip freeze` to include usually skipped package + (like pip, setuptools and wheel) to the freeze output. :issue:`1610`. + + +**8.0.2 (2016-01-21)** + +* Stop attempting to trust the system CA trust store because it's extremely + common for them to be broken, often in incompatible ways. See :pull:`3416`. + + +**8.0.1 (2016-01-21)** + +* Detect CAPaths in addition to CAFiles on platforms that provide them. + +* Installing argparse or wsgiref will no longer warn or error - pip will allow + the installation even though it may be useless (since the installed thing + will be shadowed by the standard library). + +* Upgrading a distutils installed item that is installed outside of a virtual + environment, while inside of a virtual environment will no longer warn or + error. + +* Fix a bug where pre-releases were showing up in ``pip list --outdated`` + without the ``--pre`` flag. + +* Switch the SOABI emulation from using RuntimeWarnings to debug logging. + +* Rollback the removal of the ability to uninstall distutils installed items + until a future date. + + +**8.0.0 (2016-01-19)** + +* **BACKWARD INCOMPATIBLE** Drop support for Python 3.2. + +* **BACKWARD INCOMPATIBLE** Remove the ability to find any files other than the + ones directly linked from the index or find-links pages. + +* **BACKWARD INCOMPATIBLE** Remove the ``--download-cache`` which had been + deprecated and no-op'd in 6.0. + +* **BACKWARD INCOMPATIBLE** Remove the ``--log-explicit-levels`` which had been + deprecated in 6.0. + +* **BACKWARD INCOMPATIBLE** Change pip wheel --wheel-dir default path from + <cwd>/wheelhouse to <cwd>. + +* Deprecate and no-op the ``--allow-external``, ``--allow-all-external``, and + ``--allow-unverified`` functionality that was added as part of PEP 438. With + changes made to the repository protocol made in PEP 470, these options are no + longer functional. + +* Allow ``--trusted-host`` within a requirements file. :issue:`2822`. + +* Allow ``--process-dependency-links`` within a requirements file. :issue:`1274`. + +* Allow ``--pre`` within a requirements file. :issue:`1273`. + +* Allow repository URLs with secure transports to count as trusted. (E.g., + "git+ssh" is okay.) :issue:`2811`. + +* Implement a top-level ``pip download`` command and deprecate + ``pip install --download``. + +* Fixed :issue:`3141`, when uninstalling, look for the case of paths containing + symlinked directories (:pull:`3154`) + +* When installing, if building a wheel fails, clear up the build directory + before falling back to a source install. :issue:`3047`. + +* Fix user directory expansion when ``HOME=/``. Workaround for Python bug + http://bugs.python.org/issue14768, reported in :issue:`2996`. + +* Fixed :issue:`3009`, correct reporting of requirements file line numbers + (:pull:`3125`) + +* Fixed :issue:`1062`, Exception(IOError) for ``pip freeze`` and ``pip list`` + commands with subversion >= 1.7. (:pull:`3346`) + +* Provide a spinner showing that progress is happening when installing or + building a package via ``setup.py``. This will alleviate concerns that + projects with unusually long build times have with pip appearing to stall. + +* Include the functionality of ``peep`` into pip, allowing hashes to be baked + into a requirements file and ensuring that the packages being downloaded + match one of those hashes. This is an additional, opt-in security measure + that, when used, removes the need to trust the repository. + +* Fix a bug causing pip to not select a wheel compiled against an OSX SDK later + than what Python itself was compiled against when running on a newer version + of OSX. + +* Add a new ``--prefix`` option for ``pip install`` that supports wheels and + sdists. (:pull:`3252`) + +* Fixed :issue:`2042` regarding wheel building with setup.py using a different + encoding than the system. + +* Drop PasteScript specific egg_info hack. (:pull:`3270`) + +* Allow combination of pip list options --editable with --outdated/--uptodate. + (:issue:`933`) + +* Gives VCS implementations control over saying whether a project + is under their control (:pull:`3258`) + +* Git detection now works when ``setup.py`` is not at the Git repo root + and when ``package_dir`` is used, so ``pip freeze`` works in more + cases (:pull:`3258`) + +* Correctly freeze Git develop packages in presence of the &subdirectory + option (:pull:`3258`) + +* The detection of editable packages now relies on the presence of ``.egg-link`` + instead of looking for a VCS, so ``pip list -e`` is more reliable + (:pull:`3258`) + +* Add the ``--prefix`` flag to ``pip install`` which allows specifying a root + prefix to use instead of ``sys.prefix`` (:pull:`3252`). + +* Allow duplicate specifications in the case that only the extras differ, and + union all specified extras together (:pull:`3198`). + +* Fix the detection of the user's current platform on OSX when determining the + OSX SDK version (:pull:`3232`). + +* Prevent the automatically built wheels from mistakenly being used across + multiple versions of Python when they may not be correctly configured for + that by making the wheel specific to a specific version of Python and + specific interpreter (:pull:`3225`). + +* Emulate the SOABI support in wheels from Python 2.x on Python 2.x as closely + as we can with the information available within the interpreter + (:pull:`3075`). + +* Don't roundtrip to the network when git is pinned to a specific commit hash + and that hash already exists locally (:pull:`3066`). + +* Prefer wheels built against a newer SDK to wheels built against an older SDK + on OSX (:pull:`3163`). + +* Show entry points for projects installed via wheel (:pull:`3122`). + +* Improve message when an unexisting path is passed to --find-links option + (:issue:`2968`). + +* pip freeze does not add the VCS branch/tag name in the #egg=... fragment anymore + (:pull:`3312`). + +* Warn on installation of editable if the provided #egg=name part does not + match the metadata produced by `setup.py egg_info`. :issue:`3143`. + +* Add support for .xz files for python versions supporting them (>= 3.3). + :issue:`722`. + + +**7.1.2 (2015-08-22)** + +* Don't raise an error if pip is not installed when checking for the latest pip + version. + + +**7.1.1 (2015-08-20)** + +* Check that the wheel cache directory is writable before we attempt to write + cached files to them. + +* Move the pip version check until *after* any installs have been performed, + thus removing the extraneous warning when upgrading pip. + +* Added debug logging when using a cached wheel. + +* Respect platlib by default on platforms that have it separated from purelib. + +* Upgrade packaging to 15.3. + + * Normalize post-release spellings for rev/r prefixes. + +* Upgrade distlib to 0.2.1. + + * Updated launchers to decode shebangs using UTF-8. This allows non-ASCII + pathnames to be correctly handled. + + * Ensured that the executable written to shebangs is normcased. + + * Changed ScriptMaker to work better under Jython. + +* Upgrade ipaddress to 1.0.13. + + +**7.1.0 (2015-06-30)** + +* Allow constraining versions globally without having to know exactly what will + be installed by the pip command. :issue:`2731`. + +* Accept --no-binary and --only-binary via pip.conf. :issue:`2867`. + +* Allow ``--allow-all-external`` within a requirements file. + +* Fixed an issue where ``--user`` could not be used when ``--prefix`` was used + in a distutils configuration file. + +* Fixed an issue where the SOABI tags were not correctly being generated on + Python 3.5. + +* Fixed an issue where we were advising windows users to upgrade by directly + executing pip, when that would always fail on Windows. + +* Allow ``~`` to be expanded within a cache directory in all situations. + + +**7.0.3 (2015-06-01)** + +* Fixed a regression where ``--no-cache-dir`` would raise an exception, fixes + :issue:`2855`. + + +**7.0.2 (2015-06-01)** + +* **BACKWARD INCOMPATIBLE** Revert the change (released in v7.0.0) that + required quoting in requirements files around specifiers containing + environment markers. (:pull:`2841`) + +* **BACKWARD INCOMPATIBLE** Revert the accidental introduction of support for + options interleaved with requirements, version specifiers etc in + ``requirements`` files. (:pull:`2841`) + +* Expand ``~`` in the cache directory when caching wheels, fixes :issue:`2816`. + +* Use ``python -m pip`` instead of ``pip`` when recommending an upgrade command + to Windows users. + + +**7.0.1 (2015-05-22)** + +* Don't build and cache wheels for non-editable installations from VCSs. + +* Allow ``--allow-all-external`` inside of a requirements.txt file, fixing a + regression in 7.0. + + +**7.0.0 (2015-05-21)** + +* **BACKWARD INCOMPATIBLE** Removed the deprecated ``--mirror``, + ``--use-mirrors``, and ``-M`` options. + +* **BACKWARD INCOMPATIBLE** Removed the deprecated ``zip`` and ``unzip`` + commands. + +* **BACKWARD INCOMPATIBLE** Removed the deprecated ``--no-install`` and + ``--no-download`` options. + +* **BACKWARD INCOMPATIBLE** No longer implicitly support an insecure origin + origin, and instead require insecure origins be explicitly trusted with the + ``--trusted-host`` option. + +* **BACKWARD INCOMPATIBLE** Removed the deprecated link scraping that attempted + to parse HTML comments for a specially formatted comment. + +* **BACKWARD INCOMPATIBLE** Requirements in requirements files containing + markers must now be quoted due to parser changes from (:pull:`2697`) and + (:pull:`2725`). For example, use ``"SomeProject; python_version < '2.7'"``, + not simply ``SomeProject; python_version < '2.7'`` + +* `get-pip.py` now installs the "wheel" package, when it's not already installed + (:pull:`2800`). + +* Ignores bz2 archives if Python wasn't compiled with bz2 support. + Fixes :issue:`497` + +* Support ``--install-option`` and ``--global-option`` per requirement in + requirement files (:pull:`2537`) + +* Build Wheels prior to installing from sdist, caching them in the pip cache + directory to speed up subsequent installs. (:pull:`2618`) + +* Allow fine grained control over the use of wheels and source builds. + (:pull:`2699`) + +* ``--no-use-wheel`` and ``--use-wheel`` are deprecated in favour of new + options ``--no-binary`` and ``--only-binary``. The equivalent of + ``--no-use-wheel`` is ``--no-binary=:all:``. (:pull:`2699`) + +* The use of ``--install-option``, ``--global-option`` or ``--build-option`` + disable the use of wheels, and the autobuilding of wheels. (:pull:`2711`) + Fixes :issue:`2677` + +* Improve logging when a requirement marker doesn't match your environment + (:pull:`2735`) + +* Removed the temporary modifications (that began in pip v1.4 when distribute + and setuptools merged) that allowed distribute to be considered a conflict to + setuptools. ``pip install -U setuptools`` will no longer upgrade "distribute" + to "setuptools". Instead, use ``pip install -U distribute`` (:pull:`2767`). + +* Only display a warning to upgrade pip when the newest version is a final + release and it is not a post release of the version we already have + installed (:pull:`2766`). + +* Display a warning when attempting to access a repository that uses HTTPS when + we don't have Python compiled with SSL support (:pull:`2761`). + +* Allowing using extras when installing from a file path without requiring the + use of an editable (:pull:`2785`). + +* Fix an infinite loop when the cache directory is stored on a file system + which does not support hard links (:pull:`2796`). + +* Remove the implicit debug log that was written on every invocation, instead + users will need to use ``--log`` if they wish to have one (:pull:`2798`). + + +**6.1.1 (2015-04-07)** + +* No longer ignore dependencies which have been added to the standard library, + instead continue to install them. + + +**6.1.0 (2015-04-07)** + +* Fixes :issue:`2502`. Upgrades were failing when no potential links were found + for dependencies other than the current installation. (:pull:`2538`) + +* Use a smoother progress bar when the terminal is capable of handling it, + otherwise fallback to the original ASCII based progress bar. + +* Display much less output when `pip install` succeeds, because on success, + users probably don't care about all the nitty gritty details of compiling and + installing. When `pip install` fails, display the failed install output once + instead of twice, because once is enough. (:pull:`2487`) + +* Upgrade the bundled copy of requests to 2.6.0, fixing CVE-2015-2296. + +* Display format of latest package when using ``pip list --outdated``. + (:pull:`2475`) + +* Don't use pywin32 as ctypes should always be available on Windows, using + pywin32 prevented uninstallation of pywin32 on Windows. (:pull:`2467`) + +* Normalize the ``--wheel-dir`` option, expanding out constructs such as ``~`` + when used (:pull:`2441`). + +* Display a warning when an undefined extra has been requested. (:pull:`2142`) + +* Speed up installing a directory in certain cases by creating a sdist instead + of copying the entire directory. (:pull:`2535`) + +* Don't follow symlinks when uninstalling files (:pull:`2552`) + +* Upgrade the bundled copy of cachecontrol from 0.11.1 to 0.11.2. + Fixes :issue:`2481` (:pull:`2595`) + +* Attempt to more smartly choose the order of installation to try and install + dependencies before the projects that depend on them. (:pull:`2616`) + +* Skip trying to install libraries which are part of the standard library. + (:pull:`2636`, :pull:`2602`) + +* Support arch specific wheels that are not tied to a specific Python ABI. + (:pull:`2561`) + +* Output warnings and errors to stderr instead of stdout. (:pull:`2543`) + +* Adjust the cache dir file checks to only check ownership if the effective + user is root. (:pull:`2396`) + +* Install headers into a per project name directory instead of all of them into + the root directory when inside of a virtual environment. (:pull:`2421`) + + +**6.0.8 (2015-02-04)** + +* Fix an issue where the ``--download`` flag would cause pip to no longer use + randomized build directories. + +* Fix an issue where pip did not properly unquote quoted URLs which contain + characters like PEP 440's epoch separator (``!``). + +* Fix an issue where distutils installed projects were not actually uninstalled + and deprecate attempting to uninstall them altogether. + +* Retry deleting directories in case a process like an antivirus is holding the + directory open temporarily. + +* Fix an issue where pip would hide the cursor on Windows but would not reshow + it. + + +**6.0.7 (2015-01-28)** + +* Fix a regression where Numpy requires a build path without symlinks to + properly build. + +* Fix a broken log message when running ``pip wheel`` without a requirement. + +* Don't mask network errors while downloading the file as a hash failure. + +* Properly create the state file for the pip version check so it only happens + once a week. + +* Fix an issue where switching between Python 3 and Python 2 would evict cached + items. + +* Fix a regression where pip would be unable to successfully uninstall a + project without a normalized version. + + +**6.0.6 (2015-01-03)** + +* Continue the regression fix from 6.0.5 which was not a complete fix. + + +**6.0.5 (2015-01-03)** + +* Fix a regression with 6.0.4 under Windows where most commands would raise an + exception due to Windows not having the ``os.geteuid()`` function. + + +**6.0.4 (2015-01-03)** + +* Fix an issue where ANSI escape codes would be used on Windows even though the + Windows shell does not support them, causing odd characters to appear with + the progress bar. + +* Fix an issue where using -v would cause an exception saying + ``TypeError: not all arguments converted during string formatting``. + +* Fix an issue where using -v with dependency links would cause an exception + saying ``TypeError: 'InstallationCandidate' object is not iterable``. + +* Fix an issue where upgrading distribute would cause an exception saying + ``TypeError: expected string or buffer``. + +* Show a warning and disable the use of the cache directory when the cache + directory is not owned by the current user, commonly caused by using ``sudo`` + without the ``-H`` flag. + +* Update PEP 440 support to handle the latest changes to PEP 440, particularly + the changes to ``>V`` and ``<V`` so that they no longer imply ``!=V.*``. + +* Document the default cache directories for each operating system. + +* Create the cache directory when the pip version check needs to save to it + instead of silently logging an error. + +* Fix a regression where the ``-q`` flag would not properly suppress the + display of the progress bars. + + +**6.0.3 (2014-12-23)** + +* Fix an issue where the implicit version check new in pip 6.0 could cause pip + to block for up to 75 seconds if PyPI was not accessible. + +* Make ``--no-index`` imply ``--disable-pip-version-check``. + + +**6.0.2 (2014-12-23)** + +* Fix an issue where the output saying that a package was installed would + report the old version instead of the new version during an upgrade. + +* Fix left over merge conflict markers in the documentation. + +* Document the backwards incompatible PEP 440 change in the 6.0.0 changelog. + + +**6.0.1 (2014-12-22)** + +* Fix executable file permissions for Wheel files when using the distutils + scripts option. + +* Fix a confusing error message when an exceptions was raised at certain + points in pip's execution. + +* Fix the missing list of versions when a version cannot be found that matches + the specifiers. + +* Add a warning about the possibly problematic use of > when the given + specifier doesn't match anything. + +* Fix an issue where installing from a directory would not copy over certain + directories which were being excluded, however some build systems rely on + them. + + +**6.0 (2014-12-22)** + +* **PROCESS** Version numbers are now simply ``X.Y`` where the leading ``1`` + has been dropped. + +* **BACKWARD INCOMPATIBLE** Dropped support for Python 3.1. + +* **BACKWARD INCOMPATIBLE** Removed the bundle support which was deprecated in + 1.4. (:pull:`1806`) + +* **BACKWARD INCOMPATIBLE** File lists generated by `pip show -f` are now + rooted at the location reported by show, rather than one (unstated) + directory lower. (:pull:`1933`) + +* **BACKWARD INCOMPATIBLE** The ability to install files over the FTP protocol + was accidentally lost in pip 1.5 and it has now been decided to not restore + that ability. + +* **BACKWARD INCOMPATIBLE** PEP 440 is now fully implemented, this means that + in some cases versions will sort differently or version specifiers will be + interpreted differently than previously. The common cases should all function + similarly to before. + +* **DEPRECATION** ``pip install --download-cache`` and + ``pip wheel --download-cache`` command line flags have been deprecated and + the functionality removed. Since pip now automatically configures and uses + it's internal HTTP cache which supplants the ``--download-cache`` the + existing options have been made non functional but will still be accepted + until their removal in pip v8.0. For more information please see + https://pip.pypa.io/en/stable/reference/pip_install.html#caching + +* **DEPRECATION** ``pip install --build`` and ``pip install --no-clean`` are now + *NOT* deprecated. This reverses the deprecation that occurred in v1.5.3. See + :issue:`906` for discussion. + +* **DEPRECATION** Implicitly accessing URLs which point to an origin which is + not a secure origin, instead requiring an opt-in for each host using the new + ``--trusted-host`` flag (``pip install --trusted-host example.com foo``). + +* Allow the new ``--trusted-host`` flag to also disable TLS verification for + a particular hostname. + +* Added a ``--user`` flag to ``pip freeze`` and ``pip list`` to check the + user site directory only. + +* Fixed :issue:`1873`. Silence byte compile errors when installation succeed. + +* Added a virtualenv-specific configuration file. (:pull:`1364`) + +* Added site-wide configuration files. (:pull:`1978`) + +* Added an automatic check to warn if there is an updated version of pip + available (:pull:`2049`). + +* `wsgiref` and `argparse` (for >py26) are now excluded from `pip list` and `pip + freeze` (:pull:`1606`, :pull:`1369`) + +* Fixed :issue:`1424`. Add ``--client-cert`` option for SSL client certificates. + +* Fixed :issue:`1484`. `pip show --files` was broken for wheel installs. (:pull:`1635`) + +* Fixed :issue:`1641`. install_lib should take precedence when reading distutils config. + (:pull:`1642`) + +* Send `Accept-Encoding: identity` when downloading files in an attempt to + convince some servers who double compress the downloaded file to stop doing + so. (:pull:`1688`) + +* Fixed :issue:`1559`. Stop breaking when given pip commands in uppercase (:pull:`1725`) + +* Fixed :issue:`1618`. Pip no longer adds duplicate logging consumers, so it + won't create duplicate output when being called multiple times. (:pull:`1723`) + +* Fixed :issue:`1769`. `pip wheel` now returns an error code if any wheels + fail to build. + +* Fixed :issue:`1775`. `pip wheel` wasn't building wheels for dependencies of + editable requirements. + +* Allow the use of ``--no-use-wheel`` within a requirements file. (:pull:`1859`) + +* Fixed :issue:`1680`. Attempt to locate system TLS certificates to use instead + of the included CA Bundle if possible. (:pull:`1866`) + +* Fixed :issue:`1319`. Allow use of Zip64 extension in Wheels and other zip + files. (:pull:`1868`) + +* Fixed :issue:`1101`. Properly handle an index or --find-links target which + has a <base> without a href attribute. (:pull:`1869`) + +* Fixed :issue:`1885`. Properly handle extras when a project is installed + via Wheel. (:pull:`1896`) + +* Fixed :issue:`1180`. Added support to respect proxies in ``pip search``. It + also fixes :issue:`932` and :issue:`1104`. (:pull:`1902`) + +* Fixed :issue:`798` and :issue:`1060`. `pip install --download` works with vcs links. + (:pull:`1926`) + +* Fixed :issue:`1456`. Disabled warning about insecure index host when using localhost. + Based off of Guy Rozendorn's work in :pull:`1718`. (:pull:`1967`) + +* Allow the use of OS standard user configuration files instead of ones simply + based around ``$HOME``. (:pull:`2021`) + +* Fixed :issue:`1825`. When installing directly from wheel paths or urls, + previous versions were not uninstalled. This also fixes :issue:`804` + specifically for the case of wheel archives. (:pull:`1838`) + +* Fixed :issue:`2075`, detect the location of the ``.egg-info`` directory by + looking for any file located inside of it instead of relying on the record + file listing a directory. (:pull:`2076`) + +* Fixed :issue:`1964`, :issue:`1935`, :issue:`676`, Use a randomized and secure + default build directory when possible. (:pull:`2122`, CVE-2014-8991) + +* Fixed :issue:`1433`. Support environment markers in requirements.txt files. + (:pull:`2134`) + +* Automatically retry failed HTTP requests by default. (:pull:`1444`, :pull:`2147`) + +* Fixed :issue:`1100` - Handle HTML Encoding better using a method that is more + similar to how browsers handle it. (:pull:`1874`) + +* Reduce the verbosity of the pip command by default. (:pull:`2175`, + :pull:`2177`, :pull:`2178`) + +* Fixed :issue:`2031` - Respect sys.executable on OSX when installing from + Wheels. + +* Display the entire URL of the file that is being downloaded when downloading + from a non PyPI repository (:pull:`2183`). + +* Support setuptools style environment markers in a source distribution + (:pull:`2153`). + + +**1.5.6 (2014-05-16)** + +* Upgrade requests to 2.3.0 to fix an issue with proxies on Python 3.4.1 + (:pull:`1821`). + + +**1.5.5 (2014-05-03)** + + +* Fixes :issue:`1632`. Uninstall issues on debianized pypy, specifically issues with + setuptools upgrades. (:pull:`1743`) + +* Update documentation to point at https://bootstrap.pypa.io/get-pip.py for + bootstrapping pip. + +* Update docs to point to https://pip.pypa.io/ + +* Upgrade the bundled projects (distlib==0.1.8, html5lib==1.0b3, six==1.6.1, + colorama==0.3.1, setuptools==3.4.4). + + +**1.5.4 (2014-02-21)** + + +* Correct deprecation warning for ``pip install --build`` to only notify when + the `--build` value is different than the default. + + +**1.5.3 (2014-02-20)** + + +* **DEPRECATION** ``pip install --build`` and ``pip install --no-clean`` are now + deprecated. See :issue:`906` for discussion. + +* Fixed :issue:`1112`. Couldn't download directly from wheel paths/urls, and when wheel + downloads did occur using requirement specifiers, dependencies weren't + downloaded (:pull:`1527`) + +* Fixed :issue:`1320`. ``pip wheel`` was not downloading wheels that already existed (PR + :issue:`1524`) + +* Fixed :issue:`1111`. ``pip install --download`` was failing using local + ``--find-links`` (:pull:`1524`) + +* Workaround for Python bug http://bugs.python.org/issue20053 (:pull:`1544`) + +* Don't pass a unicode __file__ to setup.py on Python 2.x (:pull:`1583`) + +* Verify that the Wheel version is compatible with this pip (:pull:`1569`) + + +**1.5.2 (2014-01-26)** + + +* Upgraded the vendored ``pkg_resources`` and ``_markerlib`` to setuptools 2.1. + +* Fixed an error that prevented accessing PyPI when pyopenssl, ndg-httpsclient, + and pyasn1 are installed + +* Fixed an issue that caused trailing comments to be incorrectly included as + part of the URL in a requirements file + + +**1.5.1 (2014-01-20)** + + +* pip now only requires setuptools (any setuptools, not a certain version) when + installing distributions from src (i.e. not from wheel). (:pull:`1434`). + +* `get-pip.py` now installs setuptools, when it's not already installed + (:pull:`1475`) + +* Don't decode downloaded files that have a ``Content-Encoding`` header. + (:pull:`1435`) + +* Fix to correctly parse wheel filenames with single digit versions. + (:pull:`1445`) + +* If `--allow-unverified` is used assume it also means `--allow-external`. + (:pull:`1457`) + + +**1.5 (2014-01-01)** + + +* **BACKWARD INCOMPATIBLE** pip no longer supports the ``--use-mirrors``, + ``-M``, and ``--mirrors`` flags. The mirroring support has been removed. In + order to use a mirror specify it as the primary index with ``-i`` or + ``--index-url``, or as an additional index with ``--extra-index-url``. (:pull:`1098`, CVE-2013-5123) + +* **BACKWARD INCOMPATIBLE** pip no longer will scrape insecure external urls by + default nor will it install externally hosted files by default. Users may opt + into installing externally hosted or insecure files or urls using + ``--allow-external PROJECT`` and ``--allow-unverified PROJECT``. (:pull:`1055`) + +* **BACKWARD INCOMPATIBLE** pip no longer respects dependency links by default. + Users may opt into respecting them again using ``--process-dependency-links``. + +* **DEPRECATION** ``pip install --no-install`` and ``pip install + --no-download`` are now formally deprecated. See :issue:`906` for discussion on + possible alternatives, or lack thereof, in future releases. + +* **DEPRECATION** ``pip zip`` and ``pip unzip`` are now formally deprecated. + +* pip will now install Mac OSX platform wheels from PyPI. (:pull:`1278`) + +* pip now generates the appropriate platform-specific console scripts when + installing wheels. (:pull:`1251`) + +* Pip now confirms a wheel is supported when installing directly from a path or + url. (:pull:`1315`) + +* Fixed :issue:`1097`, ``--ignore-installed`` now behaves again as designed, after it was + unintentionally broke in v0.8.3 when fixing :issue:`14` (:pull:`1352`). + +* Fixed a bug where global scripts were being removed when uninstalling --user + installed packages (:pull:`1353`). + +* Fixed :issue:`1163`, --user wasn't being respected when installing scripts from wheels (:pull:`1176`). + +* Fixed :issue:`1150`, we now assume '_' means '-' in versions from wheel filenames (:pull:`1158`). + +* Fixed :issue:`219`, error when using --log with a failed install (:pull:`1205`). + +* Fixed :issue:`1131`, logging was buffered and choppy in Python 3. + +* Fixed :issue:`70`, --timeout was being ignored (:pull:`1202`). + +* Fixed :issue:`772`, error when setting PIP_EXISTS_ACTION (:pull:`1201`). + +* Added colors to the logging output in order to draw attention to important + warnings and errors. (:pull:`1109`) + +* Added warnings when using an insecure index, find-link, or dependency link. (:pull:`1121`) + +* Added support for installing packages from a subdirectory using the ``subdirectory`` + editable option. ( :pull:`1082` ) + +* Fixed :issue:`1192`. "TypeError: bad operand type for unary" in some cases when + installing wheels using --find-links (:pull:`1218`). + +* Fixed :issue:`1133` and :issue:`317`. Archive contents are now written based on system + defaults and umask (i.e. permissions are not preserved), except that regular + files with any execute permissions have the equivalent of "chmod +x" applied + after being written (:pull:`1146`). + +* PreviousBuildDirError now returns a non-zero exit code and prevents the + previous build dir from being cleaned in all cases (:pull:`1162`). + +* Renamed --allow-insecure to --allow-unverified, however the old name will + continue to work for a period of time (:pull:`1257`). + +* Fixed :issue:`1006`, error when installing local projects with symlinks in + Python 3. (:pull:`1311`) + +* The previously hidden ``--log-file`` option, is now shown as a general option. + (:pull:`1316`) + + +**1.4.1 (2013-08-07)** + + +* **New Signing Key** Release 1.4.1 is using a different key than normal with + fingerprint: 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA +* Fixed issues with installing from pybundle files (:pull:`1116`). +* Fixed error when sysconfig module throws an exception (:pull:`1095`). +* Don't ignore already installed pre-releases (:pull:`1076`). +* Fixes related to upgrading setuptools (:pull:`1092`). +* Fixes so that --download works with wheel archives (:pull:`1113`). +* Fixes related to recognizing and cleaning global build dirs (:pull:`1080`). + + +**1.4 (2013-07-23)** + + +* **BACKWARD INCOMPATIBLE** pip now only installs stable versions by default, + and offers a new ``--pre`` option to also find pre-release and development + versions. (:pull:`834`) + +* **BACKWARD INCOMPATIBLE** Dropped support for Python 2.5. The minimum + supported Python version for pip 1.4 is Python 2.6. + +* Added support for installing and building wheel archives. + Thanks Daniel Holth, Marcus Smith, Paul Moore, and Michele Lacchia + (:pull:`845`) + +* Applied security patch to pip's ssl support related to certificate DNS + wildcard matching (http://bugs.python.org/issue17980). + +* To satisfy pip's setuptools requirement, pip now recommends setuptools>=0.8, + not distribute. setuptools and distribute are now merged into one project + called 'setuptools'. (:pull:`1003`) + +* pip will now warn when installing a file that is either hosted externally to + the index or cannot be verified with a hash. In the future pip will default + to not installing them and will require the flags --allow-external NAME, and + --allow-insecure NAME respectively. (:pull:`985`) + +* If an already-downloaded or cached file has a bad hash, re-download it rather + than erroring out. (:issue:`963`). + +* ``pip bundle`` and support for installing from pybundle files is now + considered deprecated and will be removed in pip v1.5. + +* Fixed a number of issues (:issue:`413`, :issue:`709`, :issue:`634`, :issue:`602`, and :issue:`939`) related to + cleaning up and not reusing build directories. (:pull:`865`, :issue:`948`) + +* Added a User Agent so that pip is identifiable in logs. (:pull:`901`) + +* Added ssl and --user support to get-pip.py. Thanks Gabriel de Perthuis. + (:pull:`895`) + +* Fixed the proxy support, which was broken in pip 1.3.x (:pull:`840`) + +* Fixed :issue:`32` - pip fails when server does not send content-type header. + Thanks Hugo Lopes Tavares and Kelsey Hightower (:pull:`872`). + +* "Vendorized" distlib as pip.vendor.distlib (https://distlib.readthedocs.io/). + +* Fixed git VCS backend with git 1.8.3. (:pull:`967`) + + +**1.3.1 (2013-03-08)** + + +* Fixed a major backward incompatible change of parsing URLs to externally + hosted packages that got accidentally included in 1.3. + + +**1.3 (2013-03-07)** + + +* SSL Cert Verification; Make https the default for PyPI access. + Thanks James Cleveland, Giovanni Bajo, Marcus Smith and many others (:pull:`791`, CVE-2013-1629). + +* Added "pip list" for listing installed packages and the latest version + available. Thanks Rafael Caricio, Miguel Araujo, Dmitry Gladkov (:pull:`752`) + +* Fixed security issues with pip's use of temp build directories. + Thanks David (d1b) and Thomas Guttler. (:pull:`780`, CVE-2013-1888) + +* Improvements to sphinx docs and cli help. (:pull:`773`) + +* Fixed :issue:`707`, dealing with macOS temp dir handling, which was causing + global NumPy installs to fail. (:pull:`768`) + +* Split help output into general vs command-specific option groups. + Thanks Georgi Valkov. (:pull:`744`; :pull:`721` contains preceding refactor) + +* Fixed dependency resolution when installing from archives with uppercase + project names. (:pull:`724`) + +* Fixed problem where re-installs always occurred when using file:// find-links. + (Pulls :issue:`683`/:issue:`702`) + +* "pip install -v" now shows the full download url, not just the archive name. + Thanks Marc Abramowitz (:pull:`687`) + +* Fix to prevent unnecessary PyPI redirects. Thanks Alex Gronholm (:pull:`695`) + +* Fixed :issue:`670` - install failure under Python 3 when the same version + of a package is found under 2 different URLs. Thanks Paul Moore (:pull:`671`) + +* Fix git submodule recursive updates. Thanks Roey Berman. (Pulls :issue:`674`) + +* Explicitly ignore rel='download' links while looking for html pages. + Thanks Maxime R. (:pull:`677`) + +* --user/--upgrade install options now work together. Thanks 'eevee' for + discovering the problem. (:pull:`705`) + +* Added check in ``install --download`` to prevent re-downloading if the target + file already exists. Thanks Andrey Bulgakov. (:pull:`669`) + +* Added support for bare paths (including relative paths) as argument to + `--find-links`. Thanks Paul Moore for draft patch. + +* Added support for --no-index in requirements files. + +* Added "pip show" command to get information about an installed package. + Fixes :issue:`131`. Thanks Kelsey Hightower and Rafael Caricio. + +* Added `--root` option for "pip install" to specify root directory. Behaves + like the same option in distutils but also plays nice with pip's egg-info. + Thanks Przemek Wrzos. (:issue:`253` / :pull:`693`) + + +**1.2.1 (2012-09-06)** + + +* Fixed a regression introduced in 1.2 about raising an exception when + not finding any files to uninstall in the current environment. Thanks for + the fix, Marcus Smith. + + +**1.2 (2012-09-01)** + + +* **Dropped support for Python 2.4** The minimum supported Python version is + now Python 2.5. + +* Fixed :issue:`605` - pypi mirror support broken on some DNS responses. Thanks + philwhin. + +* Fixed :issue:`355` - pip uninstall removes files it didn't install. Thanks + pjdelport. + +* Fixed issues :issue:`493`, :issue:`494`, :issue:`440`, and :issue:`573` related to improving support for the + user installation scheme. Thanks Marcus Smith. + +* Write failure log to temp file if default location is not writable. Thanks + andreigc. + +* Pull in submodules for git editable checkouts. Fixes :issue:`289` and :issue:`421`. Thanks + Hsiaoming Yang and Markus Hametner. + +* Use a temporary directory as the default build location outside of a + virtualenv. Fixes issues :issue:`339` and :issue:`381`. Thanks Ben Rosser. + +* Added support for specifying extras with local editables. Thanks Nick + Stenning. + +* Added ``--egg`` flag to request egg-style rather than flat installation. Refs + :issue:`3`. Thanks Kamal Bin Mustafa. + +* Fixed :issue:`510` - prevent e.g. ``gmpy2-2.0.tar.gz`` from matching a request + to ``pip install gmpy``; sdist filename must begin with full project name + followed by a dash. Thanks casevh for the report. + +* Fixed :issue:`504` - allow package URLS to have querystrings. Thanks W. + Trevor King. + +* Fixed :issue:`58` - pip freeze now falls back to non-editable format rather + than blowing up if it can't determine the origin repository of an editable. + Thanks Rory McCann. + +* Added a `__main__.py` file to enable `python -m pip` on Python versions + that support it. Thanks Alexey Luchko. + +* Fixed :issue:`487` - upgrade from VCS url of project that does exist on + index. Thanks Andrew Knapp for the report. + +* Fixed :issue:`486` - fix upgrade from VCS url of project with no distribution + on index. Thanks Andrew Knapp for the report. + +* Fixed :issue:`427` - clearer error message on a malformed VCS url. Thanks + Thomas Fenzl. + +* Added support for using any of the built in guaranteed algorithms in + ``hashlib`` as a checksum hash. + +* Fixed :issue:`321` - Raise an exception if current working directory can't be + found or accessed. + +* Fixed :issue:`82` - Removed special casing of the user directory and use the + Python default instead. + +* Fixed :issue:`436` - Only warn about version conflicts if there is actually one. + This re-enables using ``==dev`` in requirements files. + +* Moved tests to be run on Travis CI: http://travis-ci.org/pypa/pip + +* Added a better help formatter. + + +**1.1 (2012-02-16)** + + +* Fixed :issue:`326` - don't crash when a package's setup.py emits UTF-8 and + then fails. Thanks Marc Abramowitz. + +* Added ``--target`` option for installing directly to arbitrary directory. + Thanks Stavros Korokithakis. + +* Added support for authentication with Subversion repositories. Thanks + Qiangning Hong. + +* Fixed :issue:`315` - ``--download`` now downloads dependencies as well. + Thanks Qiangning Hong. + +* Errors from subprocesses will display the current working directory. + Thanks Antti Kaihola. + +* Fixed :issue:`369` - compatibility with Subversion 1.7. Thanks Qiangning + Hong. Note that setuptools remains incompatible with Subversion 1.7; to + get the benefits of pip's support you must use Distribute rather than + setuptools. + +* Fixed :issue:`57` - ignore py2app-generated macOS mpkg zip files in finder. + Thanks Rene Dudfield. + +* Fixed :issue:`182` - log to ~/Library/Logs/ by default on macOS framework + installs. Thanks Dan Callahan for report and patch. + +* Fixed :issue:`310` - understand version tags without minor version ("py3") + in sdist filenames. Thanks Stuart Andrews for report and Olivier Girardot for + patch. + +* Fixed :issue:`7` - Pip now supports optionally installing setuptools + "extras" dependencies; e.g. "pip install Paste[openid]". Thanks Matt Maker + and Olivier Girardot. + +* Fixed :issue:`391` - freeze no longer borks on requirements files with + --index-url or --find-links. Thanks Herbert Pfennig. + +* Fixed :issue:`288` - handle symlinks properly. Thanks lebedov for the patch. + +* Fixed :issue:`49` - pip install -U no longer reinstalls the same versions of + packages. Thanks iguananaut for the pull request. + +* Removed ``-E``/``--environment`` option and ``PIP_RESPECT_VIRTUALENV``; + both use a restart-in-venv mechanism that's broken, and neither one is + useful since every virtualenv now has pip inside it. Replace ``pip -E + path/to/venv install Foo`` with ``virtualenv path/to/venv && + path/to/venv/pip install Foo``. + +* Fixed :issue:`366` - pip throws IndexError when it calls `scraped_rel_links` + +* Fixed :issue:`22` - pip search should set and return a useful shell status code + +* Fixed :issue:`351` and :issue:`365` - added global ``--exists-action`` command line + option to easier script file exists conflicts, e.g. from editable + requirements from VCS that have a changed repo URL. + + +**1.0.2 (2011-07-16)** + + +* Fixed docs issues. +* Fixed :issue:`295` - Reinstall a package when using the ``install -I`` option +* Fixed :issue:`283` - Finds a Git tag pointing to same commit as origin/master +* Fixed :issue:`279` - Use absolute path for path to docs in setup.py +* Fixed :issue:`314` - Correctly handle exceptions on Python3. +* Fixed :issue:`320` - Correctly parse ``--editable`` lines in requirements files + + +**1.0.1 (2011-04-30)** + + +* Start to use git-flow. +* Fixed :issue:`274` - `find_command` should not raise AttributeError +* Fixed :issue:`273` - respect Content-Disposition header. Thanks Bradley Ayers. +* Fixed :issue:`233` - pathext handling on Windows. +* Fixed :issue:`252` - svn+svn protocol. +* Fixed :issue:`44` - multiple CLI searches. +* Fixed :issue:`266` - current working directory when running setup.py clean. + + +**1.0 (2011-04-04)** + + +* Added Python 3 support! Huge thanks to Vinay Sajip, Vitaly Babiy, Kelsey + Hightower, and Alex Gronholm, among others. + +* Download progress only shown on a real TTY. Thanks Alex Morega. + +* Fixed finding of VCS binaries to not be fooled by same-named directories. + Thanks Alex Morega. + +* Fixed uninstall of packages from system Python for users of Debian/Ubuntu + python-setuptools package (workaround until fixed in Debian and Ubuntu). + +* Added `get-pip.py <https://raw.github.com/pypa/pip/master/contrib/get-pip.py>`_ + installer. Simply download and execute it, using the Python interpreter of + your choice:: + + $ curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py + $ python get-pip.py + + This may have to be run as root. + + .. note:: + + Make sure you have `distribute <http://pypi.python.org/pypi/distribute>`_ + installed before using the installer! + + +**0.8.3** + + +* Moved main repository to Github: https://github.com/pypa/pip + +* Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer, Brian Rosner + +* Fixed :issue:`14` - No uninstall-on-upgrade with URL package. Thanks Oliver Tonnhofer + +* Fixed :issue:`163` - Egg name not properly resolved. Thanks Igor Sobreira + +* Fixed :issue:`178` - Non-alphabetical installation of requirements. Thanks Igor Sobreira + +* Fixed :issue:`199` - Documentation mentions --index instead of --index-url. Thanks Kelsey Hightower + +* Fixed :issue:`204` - rmtree undefined in mercurial.py. Thanks Kelsey Hightower + +* Fixed bug in Git vcs backend that would break during reinstallation. + +* Fixed bug in Mercurial vcs backend related to pip freeze and branch/tag resolution. + +* Fixed bug in version string parsing related to the suffix "-dev". + + +**0.8.2** + + +* Avoid redundant unpacking of bundles (from pwaller) + +* Fixed :issue:`32`, :issue:`150`, :issue:`161` - Fixed checking out the correct + tag/branch/commit when updating an editable Git requirement. + +* Fixed :issue:`49` - Added ability to install version control requirements + without making them editable, e.g.:: + + pip install git+https://github.com/pypa/pip/ + +* Fixed :issue:`175` - Correctly locate build and source directory on macOS. + +* Added ``git+https://`` scheme to Git VCS backend. + + +**0.8.1** + + +* Added global --user flag as shortcut for --install-option="--user". From + Ronny Pfannschmidt. + +* Added support for `PyPI mirrors <http://pypi.python.org/mirrors>`_ as + defined in `PEP 381 <http://www.python.org/dev/peps/pep-0381/>`_, from + Jannis Leidel. + +* Fixed :issue:`138` - Git revisions ignored. Thanks John-Scott Atlakson. + +* Fixed :issue:`95` - Initial editable install of github package from a tag fails. Thanks John-Scott Atlakson. + +* Fixed :issue:`107` - Can't install if a directory in cwd has the same name as the package you're installing. + +* Fixed :issue:`39` - --install-option="--prefix=~/.local" ignored with -e. + Thanks Ronny Pfannschmidt and Wil Tan. + + +**0.8** + + +* Track which ``build/`` directories pip creates, never remove directories + it doesn't create. From Hugo Lopes Tavares. + +* Pip now accepts file:// index URLs. Thanks Dave Abrahams. + +* Various cleanup to make test-running more consistent and less fragile. + Thanks Dave Abrahams. + +* Real Windows support (with passing tests). Thanks Dave Abrahams. + +* ``pip-2.7`` etc. scripts are created (Python-version specific scripts) + +* ``contrib/build-standalone`` script creates a runnable ``.zip`` form of + pip, from Jannis Leidel + +* Editable git repos are updated when reinstalled + +* Fix problem with ``--editable`` when multiple ``.egg-info/`` directories + are found. + +* A number of VCS-related fixes for ``pip freeze``, from Hugo Lopes Tavares. + +* Significant test framework changes, from Hugo Lopes Tavares. + + +**0.7.2** + + +* Set zip_safe=False to avoid problems some people are encountering where + pip is installed as a zip file. + + +**0.7.1** + + +* Fixed opening of logfile with no directory name. Thanks Alexandre Conrad. + +* Temporary files are consistently cleaned up, especially after + installing bundles, also from Alex Conrad. + +* Tests now require at least ScriptTest 1.0.3. + + +**0.7** + + +* Fixed uninstallation on Windows +* Added ``pip search`` command. +* Tab-complete names of installed distributions for ``pip uninstall``. +* Support tab-completion when there is a global-option before the + subcommand. +* Install header files in standard (scheme-default) location when installing + outside a virtualenv. Install them to a slightly more consistent + non-standard location inside a virtualenv (since the standard location is + a non-writable symlink to the global location). +* pip now logs to a central location by default (instead of creating + ``pip-log.txt`` all over the place) and constantly overwrites the + file in question. On Unix and macOS this is ``'$HOME/.pip/pip.log'`` + and on Windows it's ``'%HOME%\\pip\\pip.log'``. You are still able to + override this location with the ``$PIP_LOG_FILE`` environment variable. + For a complete (appended) logfile use the separate ``'--log'`` command line + option. +* Fixed an issue with Git that left an editable package as a checkout of a + remote branch, even if the default behaviour would have been fine, too. +* Fixed installing from a Git tag with older versions of Git. +* Expand "~" in logfile and download cache paths. +* Speed up installing from Mercurial repositories by cloning without + updating the working copy multiple times. +* Fixed installing directly from directories (e.g. + ``pip install path/to/dir/``). +* Fixed installing editable packages with ``svn+ssh`` URLs. +* Don't print unwanted debug information when running the freeze command. +* Create log file directory automatically. Thanks Alexandre Conrad. +* Make test suite easier to run successfully. Thanks Dave Abrahams. +* Fixed "pip install ." and "pip install .."; better error for directory + without setup.py. Thanks Alexandre Conrad. +* Support Debian/Ubuntu "dist-packages" in zip command. Thanks duckx. +* Fix relative --src folder. Thanks Simon Cross. +* Handle missing VCS with an error message. Thanks Alexandre Conrad. +* Added --no-download option to install; pairs with --no-install to separate + download and installation into two steps. Thanks Simon Cross. +* Fix uninstalling from requirements file containing -f, -i, or + --extra-index-url. +* Leftover build directories are now removed. Thanks Alexandre Conrad. + + +**0.6.3** + + +* Fixed import error on Windows with regard to the backwards compatibility + package + + +**0.6.2** + + +* Fixed uninstall when /tmp is on a different filesystem. + +* Fixed uninstallation of distributions with namespace packages. + + +**0.6.1** + + +* Added support for the ``https`` and ``http-static`` schemes to the + Mercurial and ``ftp`` scheme to the Bazaar backend. + +* Fixed uninstallation of scripts installed with easy_install. + +* Fixed an issue in the package finder that could result in an + infinite loop while looking for links. + +* Fixed issue with ``pip bundle`` and local files (which weren't being + copied into the bundle), from Whit Morriss. + + +**0.6** + + +* Add ``pip uninstall`` and uninstall-before upgrade (from Carl + Meyer). + +* Extended configurability with config files and environment variables. + +* Allow packages to be upgraded, e.g., ``pip install Package==0.1`` + then ``pip install Package==0.2``. + +* Allow installing/upgrading to Package==dev (fix "Source version does not + match target version" errors). + +* Added command and option completion for bash and zsh. + +* Extended integration with virtualenv by providing an option to + automatically use an active virtualenv and an option to warn if no active + virtualenv is found. + +* Fixed a bug with pip install --download and editable packages, where + directories were being set with 0000 permissions, now defaults to 755. + +* Fixed uninstallation of easy_installed console_scripts. + +* Fixed uninstallation on macOS Framework layout installs + +* Fixed bug preventing uninstall of editables with source outside venv. + +* Creates download cache directory if not existing. + + +**0.5.1** + + +* Fixed a couple little bugs, with git and with extensions. + + +**0.5** + + +* Added ability to override the default log file name (``pip-log.txt``) + with the environmental variable ``$PIP_LOG_FILE``. + +* Made the freeze command print installed packages to stdout instead of + writing them to a file. Use simple redirection (e.g. + ``pip freeze > stable-req.txt``) to get a file with requirements. + +* Fixed problem with freezing editable packages from a Git repository. + +* Added support for base URLs using ``<base href='...'>`` when parsing + HTML pages. + +* Fixed installing of non-editable packages from version control systems. + +* Fixed issue with Bazaar's bzr+ssh scheme. + +* Added --download-dir option to the install command to retrieve package + archives. If given an editable package it will create an archive of it. + +* Added ability to pass local file and directory paths to ``--find-links``, + e.g. ``--find-links=file:///path/to/my/private/archive`` + +* Reduced the amount of console log messages when fetching a page to find a + distribution was problematic. The full messages can be found in pip-log.txt. + +* Added ``--no-deps`` option to install ignore package dependencies + +* Added ``--no-index`` option to ignore the package index (PyPI) temporarily + +* Fixed installing editable packages from Git branches. + +* Fixes freezing of editable packages from Mercurial repositories. + +* Fixed handling read-only attributes of build files, e.g. of Subversion and + Bazaar on Windows. + +* When downloading a file from a redirect, use the redirected + location's extension to guess the compression (happens specifically + when redirecting to a bitbucket.org tip.gz file). + +* Editable freeze URLs now always use revision hash/id rather than tip or + branch names which could move. + +* Fixed comparison of repo URLs so incidental differences such as + presence/absence of final slashes or quoted/unquoted special + characters don't trigger "ignore/switch/wipe/backup" choice. + +* Fixed handling of attempt to checkout editable install to a + non-empty, non-repo directory. + + +**0.4** + + +* Make ``-e`` work better with local hg repositories + +* Construct PyPI URLs the exact way easy_install constructs URLs (you + might notice this if you use a custom index that is + slash-sensitive). + +* Improvements on Windows (from `Ionel Maries Cristian + <http://ionelmc.wordpress.com/>`_). + +* Fixed problem with not being able to install private git repositories. + +* Make ``pip zip`` zip all its arguments, not just the first. + +* Fix some filename issues on Windows. + +* Allow the ``-i`` and ``--extra-index-url`` options in requirements + files. + +* Fix the way bundle components are unpacked and moved around, to make + bundles work. + +* Adds ``-s`` option to allow the access to the global site-packages if a + virtualenv is to be created. + +* Fixed support for Subversion 1.6. + + +**0.3.1** + + +* Improved virtualenv restart and various path/cleanup problems on win32. + +* Fixed a regression with installing from svn repositories (when not + using ``-e``). + +* Fixes when installing editable packages that put their source in a + subdirectory (like ``src/``). + +* Improve ``pip -h`` + + +**0.3** + + +* Added support for editable packages created from Git, Mercurial and Bazaar + repositories and ability to freeze them. Refactored support for version + control systems. + +* Do not use ``sys.exit()`` from inside the code, instead use a + return. This will make it easier to invoke programmatically. + +* Put the install record in ``Package.egg-info/installed-files.txt`` + (previously they went in + ``site-packages/install-record-Package.txt``). + +* Fix a problem with ``pip freeze`` not including ``-e svn+`` when an + svn structure is peculiar. + +* Allow ``pip -E`` to work with a virtualenv that uses a different + version of Python than the parent environment. + +* Fixed Win32 virtualenv (``-E``) option. + +* Search the links passed in with ``-f`` for packages. + +* Detect zip files, even when the file doesn't have a ``.zip`` + extension and it is served with the wrong Content-Type. + +* Installing editable from existing source now works, like ``pip + install -e some/path/`` will install the package in ``some/path/``. + Most importantly, anything that package requires will also be + installed by pip. + +* Add a ``--path`` option to ``pip un/zip``, so you can avoid zipping + files that are outside of where you expect. + +* Add ``--simulate`` option to ``pip zip``. + + +**0.2.1** + + +* Fixed small problem that prevented using ``pip.py`` without actually + installing pip. + +* Fixed ``--upgrade``, which would download and appear to install + upgraded packages, but actually just reinstall the existing package. + +* Fixed Windows problem with putting the install record in the right + place, and generating the ``pip`` script with Setuptools. + +* Download links that include embedded spaces or other unsafe + characters (those characters get %-encoded). + +* Fixed use of URLs in requirement files, and problems with some blank + lines. + +* Turn some tar file errors into warnings. + + +**0.2** + + +* Renamed to ``pip``, and to install you now do ``pip install + PACKAGE`` + +* Added command ``pip zip PACKAGE`` and ``pip unzip PACKAGE``. This + is particularly intended for Google App Engine to manage libraries + to stay under the 1000-file limit. + +* Some fixes to bundles, especially editable packages and when + creating a bundle using unnamed packages (like just an svn + repository without ``#egg=Package``). + + +**0.1.4** + + +* Added an option ``--install-option`` to pass options to pass + arguments to ``setup.py install`` + +* ``.svn/`` directories are no longer included in bundles, as these + directories are specific to a version of svn -- if you build a + bundle on a system with svn 1.5, you can't use the checkout on a + system with svn 1.4. Instead a file ``svn-checkout.txt`` is + included that notes the original location and revision, and the + command you can use to turn it back into an svn checkout. (Probably + unpacking the bundle should, maybe optionally, recreate this + information -- but that is not currently implemented, and it would + require network access.) + +* Avoid ambiguities over project name case, where for instance + MyPackage and mypackage would be considered different packages. + This in particular caused problems on Macs, where ``MyPackage/`` and + ``mypackage/`` are the same directory. + +* Added support for an environmental variable + ``$PIP_DOWNLOAD_CACHE`` which will cache package downloads, so + future installations won't require large downloads. Network access + is still required, but just some downloads will be avoided when + using this. + + +**0.1.3** + + +* Always use ``svn checkout`` (not ``export``) so that + ``tag_svn_revision`` settings give the revision of the package. + +* Don't update checkouts that came from ``.pybundle`` files. + + +**0.1.2** + + +* Improve error text when there are errors fetching HTML pages when + seeking packages. + +* Improve bundles: include empty directories, make them work with + editable packages. + +* If you use ``-E env`` and the environment ``env/`` doesn't exist, a + new virtual environment will be created. + +* Fix ``dependency_links`` for finding packages. + + +**0.1.1** + + +* Fixed a NameError exception when running pip outside of a + virtualenv environment. + +* Added HTTP proxy support (from Prabhu Ramachandran) + +* Fixed use of ``hashlib.md5`` on python2.5+ (also from Prabhu + Ramachandran) + + +**0.1** + + +* Initial release diff --git a/vendor/pip-9.0.3/LICENSE.txt b/vendor/pip-9.0.3/LICENSE.txt new file mode 100644 index 0000000000000000000000000000000000000000..f63eac3d66793724218d428c6d156284ffe02b07 --- /dev/null +++ b/vendor/pip-9.0.3/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/pip-9.0.3/MANIFEST.in b/vendor/pip-9.0.3/MANIFEST.in new file mode 100644 index 0000000000000000000000000000000000000000..3dac128eab541d29cebdd0269481f63530aebf1a --- /dev/null +++ b/vendor/pip-9.0.3/MANIFEST.in @@ -0,0 +1,25 @@ +include AUTHORS.txt +include LICENSE.txt +include CHANGES.txt +include README.rst +include pip/_vendor/README.rst +include pip/_vendor/vendor.txt + +exclude .coveragerc +exclude .mailmap +exclude .travis.yml +exclude .landscape.yml +exclude pip/_vendor/Makefile +exclude tox.ini +exclude dev-requirements.txt +exclude appveyor.yml + +recursive-include pip/_vendor *.pem +recursive-include docs Makefile *.rst *.py *.bat + +prune .github +prune .travis +prune docs/_build +prune contrib +prune tasks +prune tests diff --git a/vendor/pip-9.0.3/PKG-INFO b/vendor/pip-9.0.3/PKG-INFO new file mode 100644 index 0000000000000000000000000000000000000000..aca2a4f2444cfd01732740e367c306f972d863a8 --- /dev/null +++ b/vendor/pip-9.0.3/PKG-INFO @@ -0,0 +1,62 @@ +Metadata-Version: 2.1 +Name: pip +Version: 9.0.3 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: python-virtualenv@groups.google.com +License: MIT +Description: pip + === + + The `PyPA recommended + <https://packaging.python.org/en/latest/current/>`_ + tool for installing Python packages. + + * `Installation <https://pip.pypa.io/en/stable/installing.html>`_ + * `Documentation <https://pip.pypa.io/>`_ + * `Changelog <https://pip.pypa.io/en/stable/news.html>`_ + * `Github Page <https://github.com/pypa/pip>`_ + * `Issue Tracking <https://github.com/pypa/pip/issues>`_ + * `User mailing list <http://groups.google.com/group/python-virtualenv>`_ + * `Dev mailing list <http://groups.google.com/group/pypa-dev>`_ + * User IRC: #pypa on Freenode. + * Dev IRC: #pypa-dev on Freenode. + + + .. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.python.org/pypi/pip + + .. image:: https://img.shields.io/travis/pypa/pip/master.svg + :target: http://travis-ci.org/pypa/pip + + .. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg + :target: https://ci.appveyor.com/project/pypa/pip/history + + .. image:: https://readthedocs.org/projects/pip/badge/?version=stable + :target: https://pip.pypa.io/en/stable + + Code of Conduct + --------------- + + Everyone interacting in the pip project's codebases, issue trackers, chat + rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + + .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + +Keywords: easy_install distutils setuptools egg virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.6,!=3.0.*,!=3.1.*,!=3.2.* +Provides-Extra: testing diff --git a/vendor/pip-9.0.3/README.rst b/vendor/pip-9.0.3/README.rst new file mode 100644 index 0000000000000000000000000000000000000000..da9a1f0a46b0a21e89ff3dd682db6175e982fcff --- /dev/null +++ b/vendor/pip-9.0.3/README.rst @@ -0,0 +1,37 @@ +pip +=== + +The `PyPA recommended +<https://packaging.python.org/en/latest/current/>`_ +tool for installing Python packages. + +* `Installation <https://pip.pypa.io/en/stable/installing.html>`_ +* `Documentation <https://pip.pypa.io/>`_ +* `Changelog <https://pip.pypa.io/en/stable/news.html>`_ +* `Github Page <https://github.com/pypa/pip>`_ +* `Issue Tracking <https://github.com/pypa/pip/issues>`_ +* `User mailing list <http://groups.google.com/group/python-virtualenv>`_ +* `Dev mailing list <http://groups.google.com/group/pypa-dev>`_ +* User IRC: #pypa on Freenode. +* Dev IRC: #pypa-dev on Freenode. + + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.python.org/pypi/pip + +.. image:: https://img.shields.io/travis/pypa/pip/master.svg + :target: http://travis-ci.org/pypa/pip + +.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg + :target: https://ci.appveyor.com/project/pypa/pip/history + +.. image:: https://readthedocs.org/projects/pip/badge/?version=stable + :target: https://pip.pypa.io/en/stable + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ diff --git a/vendor/pip-9.0.3/docs/Makefile b/vendor/pip-9.0.3/docs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..9f08edea7e7d87ae2c2efa0ded3ce3d6ea1216f2 --- /dev/null +++ b/vendor/pip-9.0.3/docs/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make <target>' where <target> is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pip-installer.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pip-installer.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/pip-installer" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pip-installer" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/vendor/pip-9.0.3/docs/__init__.py b/vendor/pip-9.0.3/docs/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b430650996dc684e811f6bf82bfe15152212a686 --- /dev/null +++ b/vendor/pip-9.0.3/docs/__init__.py @@ -0,0 +1 @@ +# docs module diff --git a/vendor/pip-9.0.3/docs/conf.py b/vendor/pip-9.0.3/docs/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..3a55481b6429242a8fbb4d8b3dea1d279274142f --- /dev/null +++ b/vendor/pip-9.0.3/docs/conf.py @@ -0,0 +1,227 @@ +# -*- coding: utf-8 -*- +# +# pip documentation build configuration file, created by +# sphinx-quickstart on Tue Apr 22 22:08:49 2008 +# +# This file is execfile()d with the current directory set to its containing dir +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import os +import sys + +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.insert(0, os.path.abspath(os.pardir)) +# sys.path.append(os.path.join(os.path.dirname(__file__), '../')) + +# -- General configuration ---------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +# extensions = ['sphinx.ext.autodoc'] +extensions = ['sphinx.ext.extlinks', 'docs.pipext', 'sphinx.ext.intersphinx'] + +# intersphinx +intersphinx_cache_limit = 0 +intersphinx_mapping = { + 'pypug': ('https://packaging.python.org/en/latest/', None), + 'pypa': ('https://www.pypa.io/en/latest/', None), +} + + +# Add any paths that contain templates here, relative to this directory. +templates_path = [] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +# source_encoding = 'utf-8' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'pip' +copyright = '2008-2016, PyPA' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +try: + from pip import __version__ + # The short X.Y version. + version = '.'.join(__version__.split('.')[:2]) + # The full version, including alpha/beta/rc tags. + release = __version__ +except ImportError: + version = release = 'dev' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# today = '' +# Else, today_fmt is used as the format for a strftime call. +today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +# unused_docs = [] + +# List of directories, relative to source directory, that shouldn't be searched +# for source files. +exclude_trees = ['build'] + +# The reST default role (used for this markup: `text`) to use for all documents +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +extlinks = { + 'issue': ('https://github.com/pypa/pip/issues/%s', '#'), + 'pull': ('https://github.com/pypa/pip/pull/%s', 'PR #'), +} + +# -- Options for HTML output -------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. Major themes that come with +# Sphinx are currently 'default' and 'sphinxdoc'. +html_theme = 'default' +if not on_rtd: + try: + import sphinx_rtd_theme + html_theme = 'sphinx_rtd_theme' + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + except ImportError: + pass + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. + +# The name for this set of Sphinx documents. If None, it defaults to +# "<project> v<release> documentation". +# html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# html_logo = '_static/piplogo.png' + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# html_favicon = 'favicon.png' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +html_use_smartypants = False + +# Custom sidebar templates, maps document names to template names. +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# html_additional_pages = {} + +# If false, no module index is generated. +html_use_modindex = False + +# If false, no index is generated. +html_use_index = False + +# If true, the index is split into individual pages for each letter. +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +html_show_sourcelink = False + +# If true, an OpenSearch description file will be output, and all pages will +# contain a <link> tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'pipdocs' + + +# -- Options for LaTeX output ------------------------------------------------- + +# The paper size ('letter' or 'a4'). +# latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +# latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]) +latex_documents = [ + ( + 'index', + 'pip.tex', + u'pip Documentation', + u'The pip developers', + 'manual', + ), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +# latex_preamble = '' + +# Documents to append as an appendix to all manuals. +# latex_appendices = [] + +# If false, no module index is generated. +# latex_use_modindex = True diff --git a/vendor/pip-9.0.3/docs/configuration.rst b/vendor/pip-9.0.3/docs/configuration.rst new file mode 100644 index 0000000000000000000000000000000000000000..3af24de3b7a42bd6fe8f7ec5ff688eef59846e96 --- /dev/null +++ b/vendor/pip-9.0.3/docs/configuration.rst @@ -0,0 +1,6 @@ +:orphan: + +Configuration +============= + +This content is now covered in the :doc:`User Guide <user_guide>` diff --git a/vendor/pip-9.0.3/docs/cookbook.rst b/vendor/pip-9.0.3/docs/cookbook.rst new file mode 100644 index 0000000000000000000000000000000000000000..83d42a608f430ef5ec85eee99d55db4852340223 --- /dev/null +++ b/vendor/pip-9.0.3/docs/cookbook.rst @@ -0,0 +1,7 @@ +:orphan: + +============ +Cookbook +============ + +This content is now covered in the :doc:`User Guide <user_guide>` diff --git a/vendor/pip-9.0.3/docs/development.rst b/vendor/pip-9.0.3/docs/development.rst new file mode 100644 index 0000000000000000000000000000000000000000..52daef6ab1866e32c6c7fa4e4a3f8e0f128fea81 --- /dev/null +++ b/vendor/pip-9.0.3/docs/development.rst @@ -0,0 +1,127 @@ +=========== +Development +=========== + +Pull Requests +============= + +- Submit Pull Requests against the `master` branch. +- Provide a good description of what you're doing and why. +- Provide tests that cover your changes and try to run the tests locally first. + +**Example**. Assuming you set up GitHub account, forked pip repository from +https://github.com/pypa/pip to your own page via web interface, and your +fork is located at https://github.com/yourname/pip + +:: + + $ git clone git@github.com:pypa/pip.git + $ cd pip + # ... + $ git diff + $ git add <modified> ... + $ git status + $ git commit + +You may reference relevant issues in commit messages (like #1259) to +make GitHub link issues and commits together, and with phrase like +"fixes #1259" you can even close relevant issues automatically. Now +push the changes to your fork:: + + $ git push git@github.com:yourname/pip.git + +Open Pull Requests page at https://github.com/yourname/pip/pulls and +click "New pull request". That's it. + + +Automated Testing +================= + +All pull requests and merges to 'master' branch are tested in `Travis <https://travis-ci.org/>`_ +based on our `.travis.yml file <https://github.com/pypa/pip/blob/master/.travis.yml>`_. + +Usually, a link to your specific travis build appears in pull requests, but if not, +you can find it on our `travis pull requests page <https://travis-ci.org/pypa/pip/pull_requests>`_ + +The only way to trigger Travis to run again for a pull request, is to submit another change to the pull branch. + +We also have Jenkins CI that runs regularly for certain python versions on windows and centos. + +Running tests +============= + +OS Requirements: subversion, bazaar, git, and mercurial. + +Python Requirements: tox or pytest, virtualenv, scripttest, and mock + +Ways to run the tests locally: + +:: + + $ tox -e py33 # The preferred way to run the tests, can use pyNN to + # run for a particular version or leave off the -e to + # run for all versions. + $ python setup.py test # Using the setuptools test plugin + $ py.test # Using py.test directly + $ tox # Using tox against pip's tox.ini + +If you are missing one of the VCS tools, you can tell ``py.test`` to skip it: + +:: + + $ py.test -k 'not bzr' + $ py.test -k 'not svn' + + +Getting Involved +================ + +The pip project welcomes help in the following ways: + +- Making Pull Requests for code, tests, or docs. +- Commenting on open issues and pull requests. +- Helping to answer questions on the mailing list. + +If you want to become an official maintainer, start by helping out. + +Later, when you think you're ready, get in touch with one of the maintainers, +and they will initiate a vote. + + +Release Process +=============== + +#. On the current pip ``master`` branch, generate a new ``AUTHORS.txt`` by + running ``invoke generate.authors`` and commit the results. +#. On the current pip ``master`` branch, make a new commit which bumps the + version in ``pip/__init__.py`` to the release version and adjust the + ``CHANGES.txt`` file to reflect the current date. +#. Create a signed tag of the ``master`` branch of the form ``X.Y.Z`` using the + command ``git tag -s X.Y.Z``. +#. Checkout the tag using ``git checkout X.Y.Z`` and create the distribution + files using ``python setup.py sdist bdist_wheel``. +#. Upload the distribution files to PyPI using twine + (``twine upload -s dist/*``). The upload should include GPG signatures of + the distribution files. +#. Push all of the changes. +#. Regenerate the ``get-pip.py`` script by running + ``invoke generate.installer`` in the get-pip repository, and committing the + results. + + +Creating a Bugfix Release +========================= + +Sometimes we need to release a bugfix release of the form ``X.Y.Z+1``. In order +to create one of these the changes should already be merged into the +``master`` branch. + +#. Create a new ``release/X.Y.Z+1`` branch off of the ``X.Y.Z`` tag using the + command ``git checkout -b release/X.Y.Z+1 X.Y.Z``. +#. Cherry pick the fixed commits off of the ``master`` branch, fixing any + conflicts and moving any changelog entries from the development version's + changelog section to the ``X.Y.Z+1`` section. +#. Push the ``release/X.Y.Z+1`` branch to github and submit a PR for it against + the ``master`` branch and wait for the tests to run. +#. Once tests run, merge the ``release/X.Y.Z+1`` branch into master, and follow + the above release process starting with step 4. diff --git a/vendor/pip-9.0.3/docs/index.rst b/vendor/pip-9.0.3/docs/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..ce08561fd47388fadab7f19acb419cabc3bb79e4 --- /dev/null +++ b/vendor/pip-9.0.3/docs/index.rst @@ -0,0 +1,22 @@ +pip +=== + +`User list <http://groups.google.com/group/python-virtualenv>`_ | +`Dev list <http://groups.google.com/group/pypa-dev>`_ | +`Github <https://github.com/pypa/pip>`_ | +`PyPI <https://pypi.python.org/pypi/pip/>`_ | +User IRC: #pypa | +Dev IRC: #pypa-dev + +The `PyPA recommended <https://packaging.python.org/en/latest/current/>`_ tool +for installing Python packages. + +.. toctree:: + :maxdepth: 2 + + quickstart + installing + user_guide + reference/index + development + news diff --git a/vendor/pip-9.0.3/docs/installing.rst b/vendor/pip-9.0.3/docs/installing.rst new file mode 100644 index 0000000000000000000000000000000000000000..cad3f2caec961c7bd746bbd455d77a97aa5312e4 --- /dev/null +++ b/vendor/pip-9.0.3/docs/installing.rst @@ -0,0 +1,138 @@ +.. _`Installation`: + +Installation +============ + +Do I need to install pip? +------------------------- + +pip is already installed if you're using Python 2 >=2.7.9 or Python 3 >=3.4 +binaries downloaded from `python.org <https://www.python.org>`_, but you'll +need to :ref:`upgrade pip <Upgrading pip>`. + +Additionally, pip will already be installed if you're working in a :ref:`Virtual +Environment <pypug:Creating and using Virtual Environments>` created by +:ref:`pypug:virtualenv` or :ref:`pyvenv <pypug:venv>`. + + +.. _`get-pip`: + +Installing with get-pip.py +-------------------------- + +To install pip, securely download `get-pip.py +<https://bootstrap.pypa.io/get-pip.py>`_. [2]_ + +Then run the following: + +:: + + python get-pip.py + + +.. warning:: + + Be cautious if you're using a Python install that's managed by your operating + system or another package manager. get-pip.py does not coordinate with + those tools, and may leave your system in an inconsistent state. + +get-pip.py will also install :ref:`pypug:setuptools` [3]_ and :ref:`pypug:wheel`, +if they're not already. :ref:`pypug:setuptools` is required to install +:term:`source distributions <pypug:Source Distribution (or "sdist")>`. Both are +required to be able to build a :ref:`Wheel cache` (which improves installation +speed), although neither are required to install pre-built :term:`wheels +<pypug:Wheel>`. + +.. note:: + + The get-pip.py script is supported on the same python version as pip. + For the now unsupported Python 3.2, an alternate script is available + `here <https://bootstrap.pypa.io/3.2/get-pip.py>`_. + + +get-pip.py options +~~~~~~~~~~~~~~~~~~~ + +.. option:: --no-setuptools + + If set, don't attempt to install :ref:`pypug:setuptools` + +.. option:: --no-wheel + + If set, don't attempt to install :ref:`pypug:wheel` + + +Additionally, ``get-pip.py`` supports using the :ref:`pip install options <pip +install Options>` and the :ref:`general options <General Options>`. Below are +some examples: + +Install from local copies of pip and setuptools:: + + python get-pip.py --no-index --find-links=/local/copies + +Install to the user site [4]_:: + + python get-pip.py --user + +Install behind a proxy:: + + python get-pip.py --proxy="[user:passwd@]proxy.server:port" + + +Using Linux Package Managers +---------------------------- + +See :ref:`pypug:Installing pip/setuptools/wheel with Linux Package Managers` in +the `Python Packaging User Guide +<https://packaging.python.org/en/latest/current/>`_. + +.. _`Upgrading pip`: + +Upgrading pip +------------- + +On Linux or macOS: + +:: + + pip install -U pip + + +On Windows [5]_: + +:: + + python -m pip install -U pip + + +Python and OS Compatibility +--------------------------- + +pip works with CPython versions 2.6, 2.7, 3.3, 3.4, 3.5 and also pypy. + +This means pip works on the latest patch version of each of these minor versions +(i.e. 2.6.9 for 2.6, etc). +Previous patch versions are supported on a best effort approach. + +pip works on Unix/Linux, macOS, and Windows. + + +---- + +.. [1] For Python 2, see https://docs.python.org/2/installing, and for Python3, + see https://docs.python.org/3/installing. + +.. [2] "Secure" in this context means using a modern browser or a + tool like `curl` that verifies SSL certificates when downloading from + https URLs. + +.. [3] Beginning with pip v1.5.1, ``get-pip.py`` stopped requiring setuptools to + be installed first. + +.. [4] The pip developers are considering making ``--user`` the default for all + installs, including ``get-pip.py`` installs of pip, but at this time, + ``--user`` installs for pip itself, should not be considered to be fully + tested or endorsed. For discussion, see `Issue 1668 + <https://github.com/pypa/pip/issues/1668>`_. + +.. [5] https://github.com/pypa/pip/issues/1299 diff --git a/vendor/pip-9.0.3/docs/logic.rst b/vendor/pip-9.0.3/docs/logic.rst new file mode 100644 index 0000000000000000000000000000000000000000..0c27d8ce5a4aeac897d36cac9dd66134dffce45e --- /dev/null +++ b/vendor/pip-9.0.3/docs/logic.rst @@ -0,0 +1,8 @@ +:orphan: + +================ +Internal Details +================ + +This content is now covered in the :doc:`Reference Guide <reference/index>` + diff --git a/vendor/pip-9.0.3/docs/make.bat b/vendor/pip-9.0.3/docs/make.bat new file mode 100644 index 0000000000000000000000000000000000000000..65726733056f7e13c05a4229e684e4597461de60 --- /dev/null +++ b/vendor/pip-9.0.3/docs/make.bat @@ -0,0 +1,253 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^<target^>` where ^<target^> is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +REM Check if sphinx-build is available and fallback to Python version if any +%SPHINXBUILD% 2> nul +if errorlevel 9009 goto sphinx_python +goto sphinx_ok + +:sphinx_python + +set SPHINXBUILD=python -m sphinx.__init__ +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +:sphinx_ok + + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\pip-installer.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\pip-installer.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end diff --git a/vendor/pip-9.0.3/docs/news.rst b/vendor/pip-9.0.3/docs/news.rst new file mode 100644 index 0000000000000000000000000000000000000000..f3291119f7cea643c8f4487b388e5b9824680463 --- /dev/null +++ b/vendor/pip-9.0.3/docs/news.rst @@ -0,0 +1,5 @@ +============= +Release Notes +============= + +.. include:: ../CHANGES.txt diff --git a/vendor/pip-9.0.3/docs/pipext.py b/vendor/pip-9.0.3/docs/pipext.py new file mode 100644 index 0000000000000000000000000000000000000000..2bcd244e0dcd5b16b523294096ff37054b55b743 --- /dev/null +++ b/vendor/pip-9.0.3/docs/pipext.py @@ -0,0 +1,108 @@ +"""pip sphinx extensions""" + +import optparse +import sys +from docutils import nodes +from docutils.parsers import rst +from docutils.statemachine import ViewList +from textwrap import dedent +from pip.commands import commands_dict as commands +from pip import cmdoptions +from pip.utils import get_prog + + +class PipCommandUsage(rst.Directive): + required_arguments = 1 + + def run(self): + cmd = commands[self.arguments[0]] + prog = '%s %s' % (get_prog(), cmd.name) + usage = dedent(cmd.usage.replace('%prog', prog)) + node = nodes.literal_block(usage, usage) + return [node] + + +class PipCommandDescription(rst.Directive): + required_arguments = 1 + + def run(self): + node = nodes.paragraph() + node.document = self.state.document + desc = ViewList() + description = dedent(commands[self.arguments[0]].__doc__) + for line in description.split('\n'): + desc.append(line, "") + self.state.nested_parse(desc, 0, node) + return [node] + + +class PipOptions(rst.Directive): + + def _format_option(self, option, cmd_name=None): + if cmd_name: + bookmark_line = ".. _`%s_%s`:" % (cmd_name, option._long_opts[0]) + else: + bookmark_line = ".. _`%s`:" % option._long_opts[0] + line = ".. option:: " + if option._short_opts: + line += option._short_opts[0] + if option._short_opts and option._long_opts: + line += ", %s" % option._long_opts[0] + elif option._long_opts: + line += option._long_opts[0] + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + line += " <%s>" % metavar.lower() + # fix defaults + opt_help = option.help.replace('%default', str(option.default)) + # fix paths with sys.prefix + opt_help = opt_help.replace(sys.prefix, "<sys.prefix>") + return [bookmark_line, "", line, "", " %s" % opt_help, ""] + + def _format_options(self, options, cmd_name=None): + for option in options: + if option.help == optparse.SUPPRESS_HELP: + continue + for line in self._format_option(option, cmd_name): + self.view_list.append(line, "") + + def run(self): + node = nodes.paragraph() + node.document = self.state.document + self.view_list = ViewList() + self.process_options() + self.state.nested_parse(self.view_list, 0, node) + return [node] + + +class PipGeneralOptions(PipOptions): + def process_options(self): + self._format_options( + [o() for o in cmdoptions.general_group['options']] + ) + + +class PipIndexOptions(PipOptions): + def process_options(self): + self._format_options( + [o() for o in cmdoptions.index_group['options']] + ) + + +class PipCommandOptions(PipOptions): + required_arguments = 1 + + def process_options(self): + cmd = commands[self.arguments[0]]() + self._format_options( + cmd.parser.option_groups[0].option_list, + cmd_name=cmd.name, + ) + + +def setup(app): + app.add_directive('pip-command-usage', PipCommandUsage) + app.add_directive('pip-command-description', PipCommandDescription) + app.add_directive('pip-command-options', PipCommandOptions) + app.add_directive('pip-general-options', PipGeneralOptions) + app.add_directive('pip-index-options', PipIndexOptions) diff --git a/vendor/pip-9.0.3/docs/quickstart.rst b/vendor/pip-9.0.3/docs/quickstart.rst new file mode 100644 index 0000000000000000000000000000000000000000..efd6d3486308ea469003dd88bde7126c39ee3ffd --- /dev/null +++ b/vendor/pip-9.0.3/docs/quickstart.rst @@ -0,0 +1,65 @@ +Quickstart +========== + +First, :doc:`Install pip <installing>`. + +Install a package from `PyPI`_: + +:: + + $ pip install SomePackage + [...] + Successfully installed SomePackage + +Install a package already downloaded from `PyPI`_ or got elsewhere. +This is useful if the target machine does not have a network connection: + +:: + + $ pip install SomePackage-1.0-py2.py3-none-any.whl + [...] + Successfully installed SomePackage + +Show what files were installed: + +:: + + $ pip show --files SomePackage + Name: SomePackage + Version: 1.0 + Location: /my/env/lib/pythonx.x/site-packages + Files: + ../somepackage/__init__.py + [...] + +List what packages are outdated: + +:: + + $ pip list --outdated + SomePackage (Current: 1.0 Latest: 2.0) + +Upgrade a package: + +:: + + $ pip install --upgrade SomePackage + [...] + Found existing installation: SomePackage 1.0 + Uninstalling SomePackage: + Successfully uninstalled SomePackage + Running setup.py install for SomePackage + Successfully installed SomePackage + +Uninstall a package: + +:: + + $ pip uninstall SomePackage + Uninstalling SomePackage: + /my/env/lib/pythonx.x/site-packages/somepackage + Proceed (y/n)? y + Successfully uninstalled SomePackage + + +.. _PyPI: http://pypi.python.org/pypi/ diff --git a/vendor/pip-9.0.3/docs/reference/index.rst b/vendor/pip-9.0.3/docs/reference/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..cb83554b30ea69ca40e18284a046b2e8fc0a65cf --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/index.rst @@ -0,0 +1,17 @@ +=============== +Reference Guide +=============== + +.. toctree:: + :maxdepth: 2 + + pip + pip_install + pip_download + pip_uninstall + pip_freeze + pip_list + pip_show + pip_search + pip_wheel + pip_hash diff --git a/vendor/pip-9.0.3/docs/reference/pip.rst b/vendor/pip-9.0.3/docs/reference/pip.rst new file mode 100644 index 0000000000000000000000000000000000000000..d14e6db095ca5ad5d498e0836d2d94c706064bdc --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip.rst @@ -0,0 +1,130 @@ +pip +--- + +.. contents:: + +Usage +***** + +:: + + pip <command> [options] + + +Description +*********** + + +.. _`Logging`: + +Logging +======= + +Console logging +~~~~~~~~~~~~~~~ + +pip offers :ref:`-v, --verbose <--verbose>` and :ref:`-q, --quiet <--quiet>` +to control the console log level. + + +.. _`FileLogging`: + +File logging +~~~~~~~~~~~~ + +pip offers the :ref:`--log <--log>` option for specifying a file where a maximum +verbosity log will be kept. This option is empty by default. This log appends +to previous logging. + +Like all pip options, ``--log`` can also be set as an environment variable, or +placed into the pip config file. See the :ref:`Configuration` section. + +.. _`exists-action`: + +--exists-action option +====================== + +This option specifies default behavior when path already exists. +Possible cases: downloading files or checking out repositories for installation, +creating archives. If ``--exists-action`` is not defined, pip will prompt +when decision is needed. + +*(s)witch* + Only relevant to VCS checkout. Attempt to switch the checkout + to the appropriate url and/or revision. +*(i)gnore* + Abort current operation (e.g. don't copy file, don't create archive, + don't modify a checkout). +*(w)ipe* + Delete the file or VCS checkout before trying to create, download, or checkout a new one. +*(b)ackup* + Rename the file or checkout to ``{name}{'.bak' * n}``, where n is some number + of ``.bak`` extensions, such that the file didn't exist at some point. + So the most recent backup will be the one with the largest number after ``.bak``. +*(a)abort* + Abort pip and return non-zero exit status. + +.. _`build-interface`: + +Build System Interface +====================== + +Pip builds packages by invoking the build system. Presently, the only supported +build system is ``setuptools``, but future developments to the Python packaging +infrastructure are expected to include support for other build systems. As +well as package building, the build system is also invoked to install packages +direct from source. + +The interface to the build system is via the ``setup.py`` command line script - +all build actions are defined in terms of the specific ``setup.py`` command +line that will be run to invoke the required action. + +Setuptools Injection +~~~~~~~~~~~~~~~~~~~~ + +As noted above, the supported build system is ``setuptools``. However, not all +packages use ``setuptools`` in their build scripts. To support projects that +use "pure ``distutils``", pip injects ``setuptools`` into ``sys.modules`` +before invoking ``setup.py``. The injection should be transparent to +``distutils``-based projects, but 3rd party build tools wishing to provide a +``setup.py`` emulating the commands pip requires may need to be aware that it +takes place. + +Future Developments +~~~~~~~~~~~~~~~~~~~ + +`PEP426`_ notes that the intention is to add hooks to project metadata in +version 2.1 of the metadata spec, to explicitly define how to build a project +from its source. Once this version of the metadata spec is final, pip will +migrate to using that interface. At that point, the ``setup.py`` interface +documented here will be retained solely for legacy purposes, until projects +have migrated. + +Specifically, applications should *not* expect to rely on there being any form +of backward compatibility guarantees around the ``setup.py`` interface. + +.. _PEP426: http://www.python.org/dev/peps/pep-0426/#metabuild-system + +Build Options +~~~~~~~~~~~~~ + +The ``--global-option`` and ``--build-option`` arguments to the ``pip install`` +and ``pip wheel`` inject additional arguments into the ``setup.py`` command +(``--build-option`` is only available in ``pip wheel``). These arguments are +included in the command as follows:: + + python setup.py <global_options> BUILD COMMAND <build_options> + +The options are passed unmodified, and presently offer direct access to the +distutils command line. Use of ``--global-option`` and ``--build-option`` +should be considered as build system dependent, and may not be supported in the +current form if support for alternative build systems is added to pip. + + +.. _`General Options`: + +General Options +*************** + +.. pip-general-options:: + diff --git a/vendor/pip-9.0.3/docs/reference/pip_download.rst b/vendor/pip-9.0.3/docs/reference/pip_download.rst new file mode 100644 index 0000000000000000000000000000000000000000..153282cce8c740528aa33d11078314e8422b2bdf --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip_download.rst @@ -0,0 +1,120 @@ + +.. _`pip download`: + +pip download +------------ + +.. contents:: + +Usage +***** + +.. pip-command-usage:: download + + +Description +*********** + +.. pip-command-description:: download + + +Overview +++++++++ +``pip download`` replaces the ``--download`` option to ``pip install``, +which is now deprecated and will be removed in pip 10. + +``pip download`` does the same resolution and downloading as ``pip install``, +but instead of installing the dependencies, it collects the downloaded +distributions into the directory provided (defaulting to the current +directory). This directory can later be passed as the value to ``pip install +--find-links`` to facilitate offline or locked down package installation. + +``pip download`` with the ``--platform``, ``--python-version``, +``--implementation``, and ``--abi`` options provides the ability to fetch +dependencies for an interpreter and system other than the ones that pip is +running on. ``--only-binary=:all:`` is required when using any of these +options. It is important to note that these options all default to the +current system/interpreter, and not to the most restrictive constraints (e.g. +platform any, abi none, etc). To avoid fetching dependencies that happen to +match the constraint of the current interpreter (but not your target one), it +is recommended to specify all of these options if you are specifying one of +them. Generic dependencies (e.g. universal wheels, or dependencies with no +platform, abi, or implementation constraints) will still match an over- +constrained download requirement. + + + +Options +******* + +.. pip-command-options:: download + +.. pip-index-options:: + + +Examples +******** + +#. Download a package and all of its dependencies + + :: + + $ pip download SomePackage + $ pip download -d . SomePackage # equivalent to above + $ pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage + +#. Download a package and all of its dependencies with OSX specific interpreter constraints. + This forces OSX 10.10 or lower compatibility. Since OSX deps are forward compatible, + this will also match ``macosx-10_9_x86_64``, ``macosx-10_8_x86_64``, ``macosx-10_8_intel``, + etc. + It will also match deps with platform ``any``. Also force the interpreter version to ``27`` + (or more generic, i.e. ``2``) and implementation to ``cp`` (or more generic, i.e. ``py``). + + :: + + $ pip download \ + --only-binary=:all: \ + --platform macosx-10_10_x86_64 \ + --python-version 27 \ + --implementation cp \ + SomePackage + +#. Download a package and its dependencies with linux specific constraints. + Force the interpreter to be any minor version of py3k, and only accept + ``cp34m`` or ``none`` as the abi. + + :: + + $ pip download \ + --only-binary=:all: \ + --platform linux_x86_64 \ + --python-version 3 \ + --implementation cp \ + --abi cp34m \ + SomePackage + +#. Force platform, implementation, and abi agnostic deps. + + :: + + $ pip download \ + --only-binary=:all: \ + --platform any \ + --python-version 3 \ + --implementation py \ + --abi none \ + SomePackage + +#. Even when overconstrained, this will still correctly fetch the pip universal wheel. + + :: + + $ pip download \ + --only-binary=:all: \ + --platform linux_x86_64 \ + --python-version 33 \ + --implementation cp \ + --abi cp34m \ + pip>=8 + $ ls pip-8.1.1-py2.py3-none-any.whl + pip-8.1.1-py2.py3-none-any.whl diff --git a/vendor/pip-9.0.3/docs/reference/pip_freeze.rst b/vendor/pip-9.0.3/docs/reference/pip_freeze.rst new file mode 100644 index 0000000000000000000000000000000000000000..c13bc00f3b6b083b85491d395059ac0293c7f35b --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip_freeze.rst @@ -0,0 +1,47 @@ + +.. _`pip freeze`: + +pip freeze +----------- + +.. contents:: + +Usage +***** + +.. pip-command-usage:: freeze + + +Description +*********** + +.. pip-command-description:: freeze + + +Options +******* + +.. pip-command-options:: freeze + + +Examples +******** + +#. Generate output suitable for a requirements file. + + :: + + $ pip freeze + docutils==0.11 + Jinja2==2.7.2 + MarkupSafe==0.19 + Pygments==1.6 + Sphinx==1.2.2 + + +#. Generate a requirements file and then install from it in another environment. + + :: + + $ env1/bin/pip freeze > requirements.txt + $ env2/bin/pip install -r requirements.txt diff --git a/vendor/pip-9.0.3/docs/reference/pip_hash.rst b/vendor/pip-9.0.3/docs/reference/pip_hash.rst new file mode 100644 index 0000000000000000000000000000000000000000..72052bc22dc6ac5b34f5a29be838b84f2bbf4e5e --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip_hash.rst @@ -0,0 +1,49 @@ +.. _`pip hash`: + +pip hash +------------ + +.. contents:: + +Usage +***** + +.. pip-command-usage:: hash + + +Description +*********** + +.. pip-command-description:: hash + + +Overview +++++++++ +``pip hash`` is a convenient way to get a hash digest for use with +:ref:`hash-checking mode`, especially for packages with multiple archives. The +error message from ``pip install --require-hashes ...`` will give you one +hash, but, if there are multiple archives (like source and binary ones), you +will need to manually download and compute a hash for the others. Otherwise, a +spurious hash mismatch could occur when :ref:`pip install` is passed a +different set of options, like :ref:`--no-binary <install_--no-binary>`. + + +Options +******* + +.. pip-command-options:: hash + + +Example +******** + +Compute the hash of a downloaded archive:: + + $ pip download SomePackage + Collecting SomePackage + Downloading SomePackage-2.2.tar.gz + Saved ./pip_downloads/SomePackage-2.2.tar.gz + Successfully downloaded SomePackage + $ pip hash ./pip_downloads/SomePackage-2.2.tar.gz + ./pip_downloads/SomePackage-2.2.tar.gz: + --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0 diff --git a/vendor/pip-9.0.3/docs/reference/pip_install.rst b/vendor/pip-9.0.3/docs/reference/pip_install.rst new file mode 100644 index 0000000000000000000000000000000000000000..fbc42becee2f6e9ea4bc29231e4a373517a2a93d --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip_install.rst @@ -0,0 +1,840 @@ +.. _`pip install`: + +pip install +----------- + +.. contents:: + +Usage +***** + +.. pip-command-usage:: install + +Description +*********** + +.. pip-command-description:: install + + +Overview +++++++++ + +Pip install has several stages: + +1. Identify the base requirements. The user supplied arguments are processed + here. +2. Resolve dependencies. What will be installed is determined here. +3. Build wheels. All the dependencies that can be are built into wheels. +4. Install the packages (and uninstall anything being upgraded/replaced). + +Argument Handling ++++++++++++++++++ + +When looking at the items to be installed, pip checks what type of item +each is, in the following order: + +1. Project or archive URL. +2. Local directory (which must contain a ``setup.py``, or pip will report + an error). +3. Local file (a sdist or wheel format archive, following the naming + conventions for those formats). +4. A requirement, as specified in PEP 440. + +Each item identified is added to the set of requirements to be satisfied by +the install. + +Working Out the Name and Version +++++++++++++++++++++++++++++++++ + +For each candidate item, pip needs to know the project name and version. For +wheels (identified by the ``.whl`` file extension) this can be obtained from +the filename, as per the Wheel spec. For local directories, or explicitly +specified sdist files, the ``setup.py egg_info`` command is used to determine +the project metadata. For sdists located via an index, the filename is parsed +for the name and project version (this is in theory slightly less reliable +than using the ``egg_info`` command, but avoids downloading and processing +unnecessary numbers of files). + +Any URL may use the ``#egg=name`` syntax (see :ref:`VCS Support`) to +explicitly state the project name. + +Satisfying Requirements ++++++++++++++++++++++++ + +Once pip has the set of requirements to satisfy, it chooses which version of +each requirement to install using the simple rule that the latest version that +satisfies the given constraints will be installed (but see :ref:`here <Pre Release Versions>` +for an exception regarding pre-release versions). Where more than one source of +the chosen version is available, it is assumed that any source is acceptable +(as otherwise the versions would differ). + +Installation Order +++++++++++++++++++ + +As of v6.1.0, pip installs dependencies before their dependents, i.e. in +"topological order". This is the only commitment pip currently makes related +to order. While it may be coincidentally true that pip will install things in +the order of the install arguments or in the order of the items in a +requirements file, this is not a promise. + +In the event of a dependency cycle (aka "circular dependency"), the current +implementation (which might possibly change later) has it such that the first +encountered member of the cycle is installed last. + +For instance, if quux depends on foo which depends on bar which depends on baz, +which depends on foo:: + + pip install quux + ... + Installing collected packages baz, bar, foo, quux + + pip install bar + ... + Installing collected packages foo, baz, bar + + +Prior to v6.1.0, pip made no commitments about install order. + +The decision to install topologically is based on the principle that +installations should proceed in a way that leaves the environment usable at each +step. This has two main practical benefits: + +1. Concurrent use of the environment during the install is more likely to work. +2. A failed install is less likely to leave a broken environment. Although pip + would like to support failure rollbacks eventually, in the mean time, this is + an improvement. + +Although the new install order is not intended to replace (and does not replace) +the use of ``setup_requires`` to declare build dependencies, it may help certain +projects install from sdist (that might previously fail) that fit the following +profile: + +1. They have build dependencies that are also declared as install dependencies + using ``install_requires``. +2. ``python setup.py egg_info`` works without their build dependencies being + installed. +3. For whatever reason, they don't or won't declare their build dependencies using + ``setup_requires``. + + +.. _`Requirements File Format`: + +Requirements File Format +++++++++++++++++++++++++ + +Each line of the requirements file indicates something to be installed, +and like arguments to :ref:`pip install`, the following forms are supported:: + + [[--option]...] + <requirement specifier> [; markers] [[--option]...] + <archive url/path> + [-e] <local project path> + [-e] <vcs project url> + +For details on requirement specifiers, see :ref:`Requirement Specifiers`. + +See the :ref:`pip install Examples<pip install Examples>` for examples of all these forms. + +A line that begins with ``#`` is treated as a comment and ignored. Whitespace +followed by a ``#`` causes the ``#`` and the remainder of the line to be +treated as a comment. + +A line ending in an unescaped ``\`` is treated as a line continuation +and the newline following it is effectively ignored. + +Comments are stripped *before* line continuations are processed. + +The following options are supported: + + * :ref:`-i, --index-url <--index-url>` + * :ref:`--extra-index-url <--extra-index-url>` + * :ref:`--no-index <--no-index>` + * :ref:`-f, --find-links <--find-links>` + * :ref:`--no-binary <install_--no-binary>` + * :ref:`--only-binary <install_--only-binary>` + * :ref:`--require-hashes <--require-hashes>` + +For example, to specify :ref:`--no-index <--no-index>` and 2 :ref:`--find-links <--find-links>` locations: + +:: + +--no-index +--find-links /my/local/archives +--find-links http://some.archives.com/archives + + +If you wish, you can refer to other requirements files, like this:: + + -r more_requirements.txt + +You can also refer to :ref:`constraints files <Constraints Files>`, like this:: + + -c some_constraints.txt + +.. _`Example Requirements File`: + +Example Requirements File +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Use ``pip install -r example-requirements.txt`` to install:: + + # + ####### example-requirements.txt ####### + # + ###### Requirements without Version Specifiers ###### + nose + nose-cov + beautifulsoup4 + # + ###### Requirements with Version Specifiers ###### + # See https://www.python.org/dev/peps/pep-0440/#version-specifiers + docopt == 0.6.1 # Version Matching. Must be version 0.6.1 + keyring >= 4.1.1 # Minimum version 4.1.1 + coverage != 3.5 # Version Exclusion. Anything except version 3.5 + Mopidy-Dirble ~= 1.1 # Compatible release. Same as >= 1.1, == 1.* + # + ###### Refer to other requirements files ###### + -r other-requirements.txt + # + # + ###### A particular file ###### + ./downloads/numpy-1.9.2-cp34-none-win32.whl + http://wxpython.org/Phoenix/snapshot-builds/wxPython_Phoenix-3.0.3.dev1820+49a8884-cp34-none-win_amd64.whl + # + ###### Additional Requirements without Version Specifiers ###### + # Same as 1st section, just here to show that you can put things in any order. + rejected + green + # + +.. _`Requirement Specifiers`: + +Requirement Specifiers +++++++++++++++++++++++ + +pip supports installing from a package index using a :term:`requirement +specifier <pypug:Requirement Specifier>`. Generally speaking, a requirement +specifier is composed of a project name followed by optional :term:`version +specifiers <pypug:Version Specifier>`. `PEP508`_ contains a full specification +of the format of a requirement (``pip`` does not support the ``url_req`` form +of specifier at this time). + +Some examples: + + :: + + SomeProject + SomeProject == 1.3 + SomeProject >=1.2,<.2.0 + SomeProject[foo, bar] + SomeProject~=1.4.2 + +Since version 6.0, pip also supports specifiers containing `environment markers +<https://www.python.org/dev/peps/pep-0426/#environment-markers>`_ like so: + + :: + + SomeProject ==5.4 ; python_version < '2.7' + SomeProject; sys_platform == 'win32' + +Environment markers are supported in the command line and in requirements files. + +.. note:: + + Use quotes around specifiers in the shell when using ``>``, ``<``, or when + using environment markers. Don't use quotes in requirement files. [1]_ + + +.. _`Per-requirement Overrides`: + +Per-requirement Overrides ++++++++++++++++++++++++++ + +Since version 7.0 pip supports controlling the command line options given to +``setup.py`` via requirements files. This disables the use of wheels (cached or +otherwise) for that package, as ``setup.py`` does not exist for wheels. + +The ``--global-option`` and ``--install-option`` options are used to pass +options to ``setup.py``. For example: + + :: + + FooProject >= 1.2 --global-option="--no-user-cfg" \ + --install-option="--prefix='/usr/local'" \ + --install-option="--no-compile" + +The above translates roughly into running FooProject's ``setup.py`` +script as: + + :: + + python setup.py --no-user-cfg install --prefix='/usr/local' --no-compile + +Note that the only way of giving more than one option to ``setup.py`` +is through multiple ``--global-option`` and ``--install-option`` +options, as shown in the example above. The value of each option is +passed as a single argument to the ``setup.py`` script. Therefore, a +line such as the following is invalid and would result in an +installation error. + +:: + + # Invalid. Please use '--install-option' twice as shown above. + FooProject >= 1.2 --install-option="--prefix=/usr/local --no-compile" + + +.. _`Pre Release Versions`: + +Pre-release Versions +++++++++++++++++++++ + +Starting with v1.4, pip will only install stable versions as specified by +`PEP426`_ by default. If a version cannot be parsed as a compliant `PEP426`_ +version then it is assumed to be a pre-release. + +If a Requirement specifier includes a pre-release or development version +(e.g. ``>=0.0.dev0``) then pip will allow pre-release and development versions +for that requirement. This does not include the != flag. + +The ``pip install`` command also supports a :ref:`--pre <install_--pre>` flag +that will enable installing pre-releases and development releases. + + +.. _PEP426: http://www.python.org/dev/peps/pep-0426 + + +.. _`VCS Support`: + +VCS Support ++++++++++++ + +pip supports installing from Git, Mercurial, Subversion and Bazaar, and detects +the type of VCS using url prefixes: "git+", "hg+", "bzr+", "svn+". + +pip requires a working VCS command on your path: git, hg, svn, or bzr. + +VCS projects can be installed in :ref:`editable mode <editable-installs>` (using +the :ref:`--editable <install_--editable>` option) or not. + +* For editable installs, the clone location by default is "<venv + path>/src/SomeProject" in virtual environments, and "<cwd>/src/SomeProject" + for global installs. The :ref:`--src <install_--src>` option can be used to + modify this location. +* For non-editable installs, the project is built locally in a temp dir and then + installed normally. Note that if a satisfactory version of the package is + already installed, the VCS source will not overwrite it without an `--upgrade` + flag. VCS requirements pin the package version (specified in the `setup.py` + file) of the target commit, not necessarily the commit itself. + +The "project name" component of the url suffix "egg=<project name>-<version>" +is used by pip in its dependency logic to identify the project prior +to pip downloading and analyzing the metadata. The optional "version" +component of the egg name is not functionally important. It merely +provides a human-readable clue as to what version is in use. For projects +where setup.py is not in the root of project, "subdirectory" component +is used. Value of "subdirectory" component should be a path starting from root +of the project to where setup.py is located. + +So if your repository layout is: + + - pkg_dir/ + + - setup.py # setup.py for package ``pkg`` + - some_module.py + - other_dir/ + + - some_file + - some_other_file + +You'll need to use ``pip install -e vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir``. + + +Git +~~~ + +pip currently supports cloning over ``git``, ``git+http``, ``git+https``, +``git+ssh``, ``git+git`` and ``git+file``: + +Here are the supported forms:: + + [-e] git://git.myproject.org/MyProject#egg=MyProject + [-e] git+http://git.myproject.org/MyProject#egg=MyProject + [-e] git+https://git.myproject.org/MyProject#egg=MyProject + [-e] git+ssh://git.myproject.org/MyProject#egg=MyProject + [-e] git+git://git.myproject.org/MyProject#egg=MyProject + [-e] git+file://git.myproject.org/MyProject#egg=MyProject + -e git+git@git.myproject.org:MyProject#egg=MyProject + +Passing branch names, a commit hash or a tag name is possible like so:: + + [-e] git://git.myproject.org/MyProject.git@master#egg=MyProject + [-e] git://git.myproject.org/MyProject.git@v1.0#egg=MyProject + [-e] git://git.myproject.org/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=MyProject + +Mercurial +~~~~~~~~~ + +The supported schemes are: ``hg+http``, ``hg+https``, +``hg+static-http`` and ``hg+ssh``. + +Here are the supported forms:: + + [-e] hg+http://hg.myproject.org/MyProject#egg=MyProject + [-e] hg+https://hg.myproject.org/MyProject#egg=MyProject + [-e] hg+ssh://hg.myproject.org/MyProject#egg=MyProject + +You can also specify a revision number, a revision hash, a tag name or a local +branch name like so:: + + [-e] hg+http://hg.myproject.org/MyProject@da39a3ee5e6b#egg=MyProject + [-e] hg+http://hg.myproject.org/MyProject@2019#egg=MyProject + [-e] hg+http://hg.myproject.org/MyProject@v1.0#egg=MyProject + [-e] hg+http://hg.myproject.org/MyProject@special_feature#egg=MyProject + +Subversion +~~~~~~~~~~ + +pip supports the URL schemes ``svn``, ``svn+svn``, ``svn+http``, ``svn+https``, ``svn+ssh``. + +You can also give specific revisions to an SVN URL, like so:: + + [-e] svn+svn://svn.myproject.org/svn/MyProject#egg=MyProject + [-e] svn+http://svn.myproject.org/svn/MyProject/trunk@2019#egg=MyProject + +which will check out revision 2019. ``@{20080101}`` would also check +out the revision from 2008-01-01. You can only check out specific +revisions using ``-e svn+...``. + +Bazaar +~~~~~~ + +pip supports Bazaar using the ``bzr+http``, ``bzr+https``, ``bzr+ssh``, +``bzr+sftp``, ``bzr+ftp`` and ``bzr+lp`` schemes. + +Here are the supported forms:: + + [-e] bzr+http://bzr.myproject.org/MyProject/trunk#egg=MyProject + [-e] bzr+sftp://user@myproject.org/MyProject/trunk#egg=MyProject + [-e] bzr+ssh://user@myproject.org/MyProject/trunk#egg=MyProject + [-e] bzr+ftp://user@myproject.org/MyProject/trunk#egg=MyProject + [-e] bzr+lp:MyProject#egg=MyProject + +Tags or revisions can be installed like so:: + + [-e] bzr+https://bzr.myproject.org/MyProject/trunk@2019#egg=MyProject + [-e] bzr+http://bzr.myproject.org/MyProject/trunk@v1.0#egg=MyProject + + +Finding Packages +++++++++++++++++ + +pip searches for packages on `PyPI`_ using the +`http simple interface <http://pypi.python.org/simple>`_, +which is documented `here <https://setuptools.readthedocs.io/en/latest/easy_install.html#package-index-api>`_ +and `there <http://www.python.org/dev/peps/pep-0301/>`_ + +pip offers a number of Package Index Options for modifying how packages are found. + +pip looks for packages in a number of places, on PyPI (if not disabled via +```--no-index```), in the local filesystem, and in any additional repositories +specified via ```--find-links``` or ```--index-url```. There is no ordering in +the locations that are searched, rather they are all checked, and the "best" +match for the requirements (in terms of version number - see `PEP440`_ for +details) is selected. + +See the :ref:`pip install Examples<pip install Examples>`. + + +.. _`SSL Certificate Verification`: + +SSL Certificate Verification +++++++++++++++++++++++++++++ + +Starting with v1.3, pip provides SSL certificate verification over https, to +prevent man-in-the-middle attacks against PyPI downloads. + + +.. _`Caching`: + +Caching ++++++++ + +Starting with v6.0, pip provides an on-by-default cache which functions +similarly to that of a web browser. While the cache is on by default and is +designed do the right thing by default you can disable the cache and always +access PyPI by utilizing the ``--no-cache-dir`` option. + +When making any HTTP request pip will first check its local cache to determine +if it has a suitable response stored for that request which has not expired. If +it does then it simply returns that response and doesn't make the request. + +If it has a response stored, but it has expired, then it will attempt to make a +conditional request to refresh the cache which will either return an empty +response telling pip to simply use the cached item (and refresh the expiration +timer) or it will return a whole new response which pip can then store in the +cache. + +When storing items in the cache, pip will respect the ``CacheControl`` header +if it exists, or it will fall back to the ``Expires`` header if that exists. +This allows pip to function as a browser would, and allows the index server +to communicate to pip how long it is reasonable to cache any particular item. + +While this cache attempts to minimize network activity, it does not prevent +network access altogether. If you want a local install solution that +circumvents accessing PyPI, see :ref:`Installing from local packages`. + +The default location for the cache directory depends on the Operating System: + +Unix + :file:`~/.cache/pip` and it respects the ``XDG_CACHE_HOME`` directory. +macOS + :file:`~/Library/Caches/pip`. +Windows + :file:`<CSIDL_LOCAL_APPDATA>\\pip\\Cache` + + +.. _`Wheel cache`: + +Wheel Cache +~~~~~~~~~~~ + +Pip will read from the subdirectory ``wheels`` within the pip cache directory +and use any packages found there. This is disabled via the same +``--no-cache-dir`` option that disables the HTTP cache. The internal structure +of that is not part of the pip API. As of 7.0, pip makes a subdirectory for +each sdist that wheels are built from and places the resulting wheels inside. + +Pip attempts to choose the best wheels from those built in preference to +building a new wheel. Note that this means when a package has both optional +C extensions and builds `py` tagged wheels when the C extension can't be built +that pip will not attempt to build a better wheel for Pythons that would have +supported it, once any generic wheel is built. To correct this, make sure that +the wheels are built with Python specific tags - e.g. pp on Pypy. + +When no wheels are found for an sdist, pip will attempt to build a wheel +automatically and insert it into the wheel cache. + + +.. _`hash-checking mode`: + +Hash-Checking Mode +++++++++++++++++++ + +Since version 8.0, pip can check downloaded package archives against local +hashes to protect against remote tampering. To verify a package against one or +more hashes, add them to the end of the line:: + + FooProject == 1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 \ + --hash=sha256:486ea46224d1bb4fb680f34f7c9ad96a8f24ec88be73ea8e5a6c65260e9cb8a7 + +(The ability to use multiple hashes is important when a package has both +binary and source distributions or when it offers binary distributions for a +variety of platforms.) + +The recommended hash algorithm at the moment is sha256, but stronger ones are +allowed, including all those supported by ``hashlib``. However, weaker ones +such as md5, sha1, and sha224 are excluded to avoid giving a false sense of +security. + +Hash verification is an all-or-nothing proposition. Specifying a ``--hash`` +against any requirement not only checks that hash but also activates a global +*hash-checking mode*, which imposes several other security restrictions: + +* Hashes are required for all requirements. This is because a partially-hashed + requirements file is of little use and thus likely an error: a malicious + actor could slip bad code into the installation via one of the unhashed + requirements. Note that hashes embedded in URL-style requirements via the + ``#md5=...`` syntax suffice to satisfy this rule (regardless of hash + strength, for legacy reasons), though you should use a stronger + hash like sha256 whenever possible. +* Hashes are required for all dependencies. An error results if there is a + dependency that is not spelled out and hashed in the requirements file. +* Requirements that take the form of project names (rather than URLs or local + filesystem paths) must be pinned to a specific version using ``==``. This + prevents a surprising hash mismatch upon the release of a new version + that matches the requirement specifier. +* ``--egg`` is disallowed, because it delegates installation of dependencies + to setuptools, giving up pip's ability to enforce any of the above. + +.. _`--require-hashes`: + +Hash-checking mode can be forced on with the ``--require-hashes`` command-line +option:: + + $ pip install --require-hashes -r requirements.txt + ... + Hashes are required in --require-hashes mode (implicitly on when a hash is + specified for any package). These requirements were missing hashes, + leaving them open to tampering. These are the hashes the downloaded + archives actually had. You can add lines like these to your requirements + files to prevent tampering. + pyelasticsearch==1.0 --hash=sha256:44ddfb1225054d7d6b1d02e9338e7d4809be94edbe9929a2ec0807d38df993fa + more-itertools==2.2 --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0 + +This can be useful in deploy scripts, to ensure that the author of the +requirements file provided hashes. It is also a convenient way to bootstrap +your list of hashes, since it shows the hashes of the packages it fetched. It +fetches only the preferred archive for each package, so you may still need to +add hashes for alternatives archives using :ref:`pip hash`: for instance if +there is both a binary and a source distribution. + +The :ref:`wheel cache <Wheel cache>` is disabled in hash-checking mode to +prevent spurious hash mismatch errors. These would otherwise occur while +installing sdists that had already been automatically built into cached wheels: +those wheels would be selected for installation, but their hashes would not +match the sdist ones from the requirements file. A further complication is that +locally built wheels are nondeterministic: contemporary modification times make +their way into the archive, making hashes unpredictable across machines and +cache flushes. Compilation of C code adds further nondeterminism, as many +compilers include random-seeded values in their output. However, wheels fetched +from index servers are the same every time. They land in pip's HTTP cache, not +its wheel cache, and are used normally in hash-checking mode. The only downside +of having the wheel cache disabled is thus extra build time for sdists, and +this can be solved by making sure pre-built wheels are available from the index +server. + +Hash-checking mode also works with :ref:`pip download` and :ref:`pip wheel`. A +:ref:`comparison of hash-checking mode with other repeatability strategies +<Repeatability>` is available in the User Guide. + +.. warning:: + Beware of the ``setup_requires`` keyword arg in :file:`setup.py`. The + (rare) packages that use it will cause those dependencies to be downloaded + by setuptools directly, skipping pip's hash-checking. If you need to use + such a package, see :ref:`Controlling + setup_requires<controlling-setup-requires>`. + +.. warning:: + Be careful not to nullify all your security work when you install your + actual project by using setuptools directly: for example, by calling + ``python setup.py install``, ``python setup.py develop``, or + ``easy_install``. Setuptools will happily go out and download, unchecked, + anything you missed in your requirements file—and it’s easy to miss things + as your project evolves. To be safe, install your project using pip and + :ref:`--no-deps <install_--no-deps>`. + + Instead of ``python setup.py develop``, use... :: + + pip install --no-deps -e . + + Instead of ``python setup.py install``, use... :: + + pip install --no-deps . + + +Hashes from PyPI +~~~~~~~~~~~~~~~~ + +PyPI provides an MD5 hash in the fragment portion of each package download URL, +like ``#md5=123...``, which pip checks as a protection against download +corruption. Other hash algorithms that have guaranteed support from ``hashlib`` +are also supported here: sha1, sha224, sha384, sha256, and sha512. Since this +hash originates remotely, it is not a useful guard against tampering and thus +does not satisfy the ``--require-hashes`` demand that every package have a +local hash. + + +.. _`editable-installs`: + +"Editable" Installs ++++++++++++++++++++ + +"Editable" installs are fundamentally `"setuptools develop mode" +<https://setuptools.readthedocs.io/en/latest/setuptools.html#development-mode>`_ +installs. + +You can install local projects or VCS projects in "editable" mode:: + +$ pip install -e path/to/SomeProject +$ pip install -e git+http://repo/my_project.git#egg=SomeProject + +(See the :ref:`VCS Support` section above for more information on VCS-related syntax.) + +For local projects, the "SomeProject.egg-info" directory is created relative to +the project path. This is one advantage over just using ``setup.py develop``, +which creates the "egg-info" directly relative the current working directory. + + +.. _`controlling-setup-requires`: + +Controlling setup_requires +++++++++++++++++++++++++++ + +Setuptools offers the ``setup_requires`` `setup() keyword +<https://setuptools.readthedocs.io/en/latest/setuptools.html#new-and-changed-setup-keywords>`_ +for specifying dependencies that need to be present in order for the `setup.py` +script to run. Internally, Setuptools uses ``easy_install`` to fulfill these +dependencies. + +pip has no way to control how these dependencies are located. None of the +Package Index Options have an effect. + +The solution is to configure a "system" or "personal" `Distutils configuration +file +<http://docs.python.org/2/install/index.html#distutils-configuration-files>`_ to +manage the fulfillment. + +For example, to have the dependency located at an alternate index, add this: + +:: + + [easy_install] + index_url = https://my.index-mirror.com + +To have the dependency located from a local directory and not crawl PyPI, add this: + +:: + + [easy_install] + allow_hosts = '' + find_links = file:///path/to/local/archives/ + + +Build System Interface +++++++++++++++++++++++ + +In order for pip to install a package from source, ``setup.py`` must implement +the following commands:: + + setup.py egg_info [--egg-base XXX] + setup.py install --record XXX [--single-version-externally-managed] [--root XXX] [--compile|--no-compile] [--install-headers XXX] + +The ``egg_info`` command should create egg metadata for the package, as +described in the setuptools documentation at +https://setuptools.readthedocs.io/en/latest/setuptools.html#egg-info-create-egg-metadata-and-set-build-tags + +The ``install`` command should implement the complete process of installing the +package to the target directory XXX. + +To install a package in "editable" mode (``pip install -e``), ``setup.py`` must +implement the following command:: + + setup.py develop --no-deps + +This should implement the complete process of installing the package in +"editable" mode. + +All packages will be attempted to built into wheels:: + + setup.py bdist_wheel -d XXX + +One further ``setup.py`` command is invoked by ``pip install``:: + + setup.py clean + +This command is invoked to clean up temporary commands from the build. (TODO: +Investigate in more detail when this command is required). + +No other build system commands are invoked by the ``pip install`` command. + +Installing a package from a wheel does not invoke the build system at all. + +.. _PyPI: http://pypi.python.org/pypi/ +.. _setuptools extras: https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies + + + +.. _`pip install Options`: + +Options +******* + +.. pip-command-options:: install + +.. pip-index-options:: + + +.. _`pip install Examples`: + +Examples +******** + +#. Install `SomePackage` and its dependencies from `PyPI`_ using :ref:`Requirement Specifiers` + + :: + + $ pip install SomePackage # latest version + $ pip install SomePackage==1.0.4 # specific version + $ pip install 'SomePackage>=1.0.4' # minimum version + + +#. Install a list of requirements specified in a file. See the :ref:`Requirements files <Requirements Files>`. + + :: + + $ pip install -r requirements.txt + + +#. Upgrade an already installed `SomePackage` to the latest from PyPI. + + :: + + $ pip install --upgrade SomePackage + + +#. Install a local project in "editable" mode. See the section on :ref:`Editable Installs <editable-installs>`. + + :: + + $ pip install -e . # project in current directory + $ pip install -e path/to/project # project in another directory + + +#. Install a project from VCS in "editable" mode. See the sections on :ref:`VCS Support <VCS Support>` and :ref:`Editable Installs <editable-installs>`. + + :: + + $ pip install -e git+https://git.repo/some_pkg.git#egg=SomePackage # from git + $ pip install -e hg+https://hg.repo/some_pkg.git#egg=SomePackage # from mercurial + $ pip install -e svn+svn://svn.repo/some_pkg/trunk/#egg=SomePackage # from svn + $ pip install -e git+https://git.repo/some_pkg.git@feature#egg=SomePackage # from 'feature' branch + $ pip install -e "git+https://git.repo/some_repo.git#egg=subdir&subdirectory=subdir_path" # install a python package from a repo subdirectory + +#. Install a package with `setuptools extras`_. + + :: + + $ pip install SomePackage[PDF] + $ pip install git+https://git.repo/some_pkg.git#egg=SomePackage[PDF] + $ pip install SomePackage[PDF]==3.0 + $ pip install -e .[PDF]==3.0 # editable project in current directory + + +#. Install a particular source archive file. + + :: + + $ pip install ./downloads/SomePackage-1.0.4.tar.gz + $ pip install http://my.package.repo/SomePackage-1.0.4.zip + + +#. Install from alternative package repositories. + + Install from a different index, and not `PyPI`_ :: + + $ pip install --index-url http://my.package.repo/simple/ SomePackage + + Search an additional index during install, in addition to `PyPI`_ :: + + $ pip install --extra-index-url http://my.package.repo/simple SomePackage + + Install from a local flat directory containing archives (and don't scan indexes):: + + $ pip install --no-index --find-links=file:///local/dir/ SomePackage + $ pip install --no-index --find-links=/local/dir/ SomePackage + $ pip install --no-index --find-links=relative/dir/ SomePackage + + +#. Find pre-release and development versions, in addition to stable versions. By default, pip only finds stable versions. + + :: + + $ pip install --pre SomePackage + +---- + +.. [1] This is true with the exception that pip v7.0 and v7.0.1 required quotes + around specifiers containing environment markers in requirement files. + +.. _PEP440: http://www.python.org/dev/peps/pep-0440 +.. _PEP508: http://www.python.org/dev/peps/pep-0508 diff --git a/vendor/pip-9.0.3/docs/reference/pip_list.rst b/vendor/pip-9.0.3/docs/reference/pip_list.rst new file mode 100644 index 0000000000000000000000000000000000000000..c459b7a3bb11cb7629466ca7bfd1831a3b8cd453 --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip_list.rst @@ -0,0 +1,102 @@ +.. _`pip list`: + +pip list +--------- + +.. contents:: + +Usage +***** + +.. pip-command-usage:: list + +Description +*********** + +.. pip-command-description:: list + +Options +******* + +.. pip-command-options:: list + +.. pip-index-options:: + + +Examples +******** + +#. List installed packages. + + :: + + $ pip list + docutils (0.10) + Jinja2 (2.7.2) + MarkupSafe (0.18) + Pygments (1.6) + Sphinx (1.2.1) + +#. List outdated packages (excluding editables), and the latest version available. + + :: + + $ pip list --outdated + docutils (Current: 0.10 Latest: 0.11) + Sphinx (Current: 1.2.1 Latest: 1.2.2) + +#. List installed packages with column formatting. + + :: + + $ pip list --format columns + Package Version + ------- ------- + docopt 0.6.2 + idlex 1.13 + jedi 0.9.0 + +#. List outdated packages with column formatting. + + :: + + $ pip list -o --format columns + Package Version Latest Type + ---------- ------- ------ ----- + retry 0.8.1 0.9.1 wheel + setuptools 20.6.7 21.0.0 wheel + +#. List packages that are not dependencies of other packages. Can be combined with + other options. + + :: + + $ pip list --outdated --not-required + docutils (Current: 0.10 Latest: 0.11) + +#. Use legacy formatting + + :: + + $ pip list --format=legacy + colorama (0.3.7) + docopt (0.6.2) + idlex (1.13) + jedi (0.9.0) + +#. Use json formatting + + :: + + $ pip list --format=json + [{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ... + +#. Use freeze formatting + + :: + + $ pip list --format=freeze + colorama==0.3.7 + docopt==0.6.2 + idlex==1.13 + jedi==0.9.0 diff --git a/vendor/pip-9.0.3/docs/reference/pip_search.rst b/vendor/pip-9.0.3/docs/reference/pip_search.rst new file mode 100644 index 0000000000000000000000000000000000000000..1332c99f781e8b5f8f7c5f29d8719d48d005ddfb --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip_search.rst @@ -0,0 +1,34 @@ +.. _`pip search`: + +pip search +---------- + +.. contents:: + +Usage +***** + +.. pip-command-usage:: search + + +Description +*********** + +.. pip-command-description:: search + +Options +******* + +.. pip-command-options:: search + + +Examples +******** + +#. Search for "peppercorn" + + :: + + $ pip search peppercorn + pepperedform - Helpers for using peppercorn with formprocess. + peppercorn - A library for converting a token stream into [...] diff --git a/vendor/pip-9.0.3/docs/reference/pip_show.rst b/vendor/pip-9.0.3/docs/reference/pip_show.rst new file mode 100644 index 0000000000000000000000000000000000000000..6c9aa84aae40eaface77fee70b33edb0c32b6c97 --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip_show.rst @@ -0,0 +1,86 @@ +.. _`pip show`: + +pip show +-------- + +.. contents:: + + +Usage +***** + +.. pip-command-usage:: show + + +Description +*********** + +.. pip-command-description:: show + + +Options +******* + +.. pip-command-options:: show + + +Examples +******** + +#. Show information about a package: + + :: + + $ pip show sphinx + Name: Sphinx + Version: 1.4.5 + Summary: Python documentation generator + Home-page: http://sphinx-doc.org/ + Author: Georg Brandl + Author-email: georg@python.org + License: BSD + Location: /my/env/lib/python2.7/site-packages + Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six + +#. Show all information about a package + + :: + + $ pip show --verbose sphinx + Name: Sphinx + Version: 1.4.5 + Summary: Python documentation generator + Home-page: http://sphinx-doc.org/ + Author: Georg Brandl + Author-email: georg@python.org + License: BSD + Location: /my/env/lib/python2.7/site-packages + Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six + Metadata-Version: 2.0 + Installer: + Classifiers: + Development Status :: 5 - Production/Stable + Environment :: Console + Environment :: Web Environment + Intended Audience :: Developers + Intended Audience :: Education + License :: OSI Approved :: BSD License + Operating System :: OS Independent + Programming Language :: Python + Programming Language :: Python :: 2 + Programming Language :: Python :: 3 + Framework :: Sphinx + Framework :: Sphinx :: Extension + Framework :: Sphinx :: Theme + Topic :: Documentation + Topic :: Documentation :: Sphinx + Topic :: Text Processing + Topic :: Utilities + Entry-points: + [console_scripts] + sphinx-apidoc = sphinx.apidoc:main + sphinx-autogen = sphinx.ext.autosummary.generate:main + sphinx-build = sphinx:main + sphinx-quickstart = sphinx.quickstart:main + [distutils.commands] + build_sphinx = sphinx.setup_command:BuildDoc diff --git a/vendor/pip-9.0.3/docs/reference/pip_uninstall.rst b/vendor/pip-9.0.3/docs/reference/pip_uninstall.rst new file mode 100644 index 0000000000000000000000000000000000000000..f9a97589eb5edeb2d167ff63647e732880f5e924 --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip_uninstall.rst @@ -0,0 +1,37 @@ +.. _`pip uninstall`: + +pip uninstall +------------- + +.. contents:: + +Usage +***** + +.. pip-command-usage:: uninstall + +Description +*********** + +.. pip-command-description:: uninstall + +Options +******* + +.. pip-command-options:: uninstall + + +Examples +******** + +#. Uninstall a package. + + :: + + $ pip uninstall simplejson + Uninstalling simplejson: + /home/me/env/lib/python2.7/site-packages/simplejson + /home/me/env/lib/python2.7/site-packages/simplejson-2.2.1-py2.7.egg-info + Proceed (y/n)? y + Successfully uninstalled simplejson + diff --git a/vendor/pip-9.0.3/docs/reference/pip_wheel.rst b/vendor/pip-9.0.3/docs/reference/pip_wheel.rst new file mode 100644 index 0000000000000000000000000000000000000000..75ae51a21fb1d5441318152e6e9e6128b1550aeb --- /dev/null +++ b/vendor/pip-9.0.3/docs/reference/pip_wheel.rst @@ -0,0 +1,73 @@ + +.. _`pip wheel`: + +pip wheel +--------- + +.. contents:: + +Usage +***** + +.. pip-command-usage:: wheel + + +Description +*********** + +.. pip-command-description:: wheel + + +Build System Interface +++++++++++++++++++++++ + +In order for pip to build a wheel, ``setup.py`` must implement the +``bdist_wheel`` command with the following syntax:: + + python setup.py bdist_wheel -d TARGET + +This command must create a wheel compatible with the invoking Python +interpreter, and save that wheel in the directory TARGET. + +No other build system commands are invoked by the ``pip wheel`` command. + +Customising the build +~~~~~~~~~~~~~~~~~~~~~ + +It is possible using ``--global-option`` to include additional build commands +with their arguments in the ``setup.py`` command. This is currently the only +way to influence the building of C extensions from the command line. For +example:: + + pip wheel --global-option bdist_ext --global-option -DFOO wheel + +will result in a build command of + +:: + + setup.py bdist_ext -DFOO bdist_wheel -d TARGET + +which passes a preprocessor symbol to the extension build. + +Such usage is considered highly build-system specific and more an accident of +the current implementation than a supported interface. + + + +Options +******* + +.. pip-command-options:: wheel + +.. pip-index-options:: + + +Examples +******** + +#. Build wheels for a requirement (and all its dependencies), and then install + + :: + + $ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage + $ pip install --no-index --find-links=/tmp/wheelhouse SomePackage diff --git a/vendor/pip-9.0.3/docs/usage.rst b/vendor/pip-9.0.3/docs/usage.rst new file mode 100644 index 0000000000000000000000000000000000000000..20c2b29ec39b5d9d619be6e6d32d0161a3a6f48c --- /dev/null +++ b/vendor/pip-9.0.3/docs/usage.rst @@ -0,0 +1,7 @@ +:orphan: + +========== +Usage +========== + +The "Usage" section is now covered in the :doc:`Reference Guide <reference/index>` diff --git a/vendor/pip-9.0.3/docs/user_guide.rst b/vendor/pip-9.0.3/docs/user_guide.rst new file mode 100644 index 0000000000000000000000000000000000000000..7d7fb86faed2744aaa1ad8220d9ad4a54d61fc18 --- /dev/null +++ b/vendor/pip-9.0.3/docs/user_guide.rst @@ -0,0 +1,677 @@ +========== +User Guide +========== + +.. contents:: + +Installing Packages +******************* + +pip supports installing from `PyPI`_, version control, local projects, and +directly from distribution files. + + +The most common scenario is to install from `PyPI`_ using :ref:`Requirement +Specifiers` + + :: + + $ pip install SomePackage # latest version + $ pip install SomePackage==1.0.4 # specific version + $ pip install 'SomePackage>=1.0.4' # minimum version + + +For more information and examples, see the :ref:`pip install` reference. + +.. _PyPI: http://pypi.python.org/pypi + + +.. _`Requirements Files`: + +Requirements Files +****************** + +"Requirements files" are files containing a list of items to be +installed using :ref:`pip install` like so: + + :: + + pip install -r requirements.txt + + +Details on the format of the files are here: :ref:`Requirements File Format`. + +Logically, a Requirements file is just a list of :ref:`pip install` arguments +placed in a file. Note that you should not rely on the items in the file being +installed by pip in any particular order. + +In practice, there are 4 common uses of Requirements files: + +1. Requirements files are used to hold the result from :ref:`pip freeze` for the + purpose of achieving :ref:`repeatable installations <Repeatability>`. In + this case, your requirement file contains a pinned version of everything that + was installed when `pip freeze` was run. + + :: + + pip freeze > requirements.txt + pip install -r requirements.txt + +2. Requirements files are used to force pip to properly resolve dependencies. + As it is now, pip `doesn't have true dependency resolution + <https://github.com/pypa/pip/issues/988>`_, but instead simply uses the first + specification it finds for a project. E.g if `pkg1` requires `pkg3>=1.0` and + `pkg2` requires `pkg3>=1.0,<=2.0`, and if `pkg1` is resolved first, pip will + only use `pkg3>=1.0`, and could easily end up installing a version of `pkg3` + that conflicts with the needs of `pkg2`. To solve this problem, you can + place `pkg3>=1.0,<=2.0` (i.e. the correct specification) into your + requirements file directly along with the other top level requirements. Like + so: + + :: + + pkg1 + pkg2 + pkg3>=1.0,<=2.0 + +3. Requirements files are used to force pip to install an alternate version of a + sub-dependency. For example, suppose `ProjectA` in your requirements file + requires `ProjectB`, but the latest version (v1.3) has a bug, you can force + pip to accept earlier versions like so: + + :: + + ProjectA + ProjectB<1.3 + +4. Requirements files are used to override a dependency with a local patch that + lives in version control. For example, suppose a dependency, + `SomeDependency` from PyPI has a bug, and you can't wait for an upstream fix. + You could clone/copy the src, make the fix, and place it in VCS with the tag + `sometag`. You'd reference it in your requirements file with a line like so: + + :: + + git+https://myvcs.com/some_dependency@sometag#egg=SomeDependency + + If `SomeDependency` was previously a top-level requirement in your + requirements file, then **replace** that line with the new line. If + `SomeDependency` is a sub-dependency, then **add** the new line. + + +It's important to be clear that pip determines package dependencies using +`install_requires metadata +<https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-dependencies>`_, +not by discovering `requirements.txt` files embedded in projects. + +See also: + +* :ref:`Requirements File Format` +* :ref:`pip freeze` +* `"setup.py vs requirements.txt" (an article by Donald Stufft) + <https://caremad.io/2013/07/setup-vs-requirement/>`_ + + +.. _`Constraints Files`: + +Constraints Files +***************** + +Constraints files are requirements files that only control which version of a +requirement is installed, not whether it is installed or not. Their syntax and +contents is nearly identical to :ref:`Requirements Files`. There is one key +difference: Including a package in a constraints file does not trigger +installation of the package. + +Use a constraints file like so: + + :: + + pip install -c constraints.txt + +Constraints files are used for exactly the same reason as requirements files +when you don't know exactly what things you want to install. For instance, say +that the "helloworld" package doesn't work in your environment, so you have a +local patched version. Some things you install depend on "helloworld", and some +don't. + +One way to ensure that the patched version is used consistently is to +manually audit the dependencies of everything you install, and if "helloworld" +is present, write a requirements file to use when installing that thing. + +Constraints files offer a better way: write a single constraints file for your +organisation and use that everywhere. If the thing being installed requires +"helloworld" to be installed, your fixed version specified in your constraints +file will be used. + +Constraints file support was added in pip 7.1. + +.. _`Installing from Wheels`: + +Installing from Wheels +********************** + +"Wheel" is a built, archive format that can greatly speed installation compared +to building and installing from source archives. For more information, see the +`Wheel docs <https://wheel.readthedocs.io>`_ , +`PEP427 <http://www.python.org/dev/peps/pep-0427>`_, and +`PEP425 <http://www.python.org/dev/peps/pep-0425>`_ + +Pip prefers Wheels where they are available. To disable this, use the +:ref:`--no-binary <install_--no-binary>` flag for :ref:`pip install`. + +If no satisfactory wheels are found, pip will default to finding source archives. + + +To install directly from a wheel archive: + +:: + + pip install SomePackage-1.0-py2.py3-none-any.whl + + +For the cases where wheels are not available, pip offers :ref:`pip wheel` as a +convenience, to build wheels for all your requirements and dependencies. + +:ref:`pip wheel` requires the `wheel package +<https://pypi.python.org/pypi/wheel>`_ to be installed, which provides the +"bdist_wheel" setuptools extension that it uses. + +To build wheels for your requirements and all their dependencies to a local directory: + +:: + + pip install wheel + pip wheel --wheel-dir=/local/wheels -r requirements.txt + + +And *then* to install those requirements just using your local directory of wheels (and not from PyPI): + +:: + + pip install --no-index --find-links=/local/wheels -r requirements.txt + + +Uninstalling Packages +********************* + +pip is able to uninstall most packages like so: + +:: + + $ pip uninstall SomePackage + +pip also performs an automatic uninstall of an old version of a package +before upgrading to a newer version. + +For more information and examples, see the :ref:`pip uninstall` reference. + + +Listing Packages +**************** + +To list installed packages: + +:: + + $ pip list + docutils (0.9.1) + Jinja2 (2.6) + Pygments (1.5) + Sphinx (1.1.2) + +To list outdated packages, and show the latest version available: + +:: + + $ pip list --outdated + docutils (Current: 0.9.1 Latest: 0.10) + Sphinx (Current: 1.1.2 Latest: 1.1.3) + + +To show details about an installed package: + +:: + + $ pip show sphinx + --- + Name: Sphinx + Version: 1.1.3 + Location: /my/env/lib/pythonx.x/site-packages + Requires: Pygments, Jinja2, docutils + + +For more information and examples, see the :ref:`pip list` and :ref:`pip show` +reference pages. + + +Searching for Packages +********************** + +pip can search `PyPI`_ for packages using the ``pip search`` +command:: + + $ pip search "query" + +The query will be used to search the names and summaries of all +packages. + +For more information and examples, see the :ref:`pip search` reference. + +.. _`Configuration`: + +Configuration +************* + +.. _config-file: + +Config file +------------ + +pip allows you to set all command line option defaults in a standard ini +style config file. + +The names and locations of the configuration files vary slightly across +platforms. You may have per-user, per-virtualenv or site-wide (shared amongst +all users) configuration: + +**Per-user**: + +* On Unix the default configuration file is: :file:`$HOME/.config/pip/pip.conf` + which respects the ``XDG_CONFIG_HOME`` environment variable. +* On macOS the configuration file is + :file:`$HOME/Library/Application Support/pip/pip.conf`. +* On Windows the configuration file is :file:`%APPDATA%\\pip\\pip.ini`. + +There are also a legacy per-user configuration file which is also respected, +these are located at: + +* On Unix and macOS the configuration file is: :file:`$HOME/.pip/pip.conf` +* On Windows the configuration file is: :file:`%HOME%\\pip\\pip.ini` + +You can set a custom path location for this config file using the environment +variable ``PIP_CONFIG_FILE``. + +**Inside a virtualenv**: + +* On Unix and macOS the file is :file:`$VIRTUAL_ENV/pip.conf` +* On Windows the file is: :file:`%VIRTUAL_ENV%\\pip.ini` + +**Site-wide**: + +* On Unix the file may be located in :file:`/etc/pip.conf`. Alternatively + it may be in a "pip" subdirectory of any of the paths set in the + environment variable ``XDG_CONFIG_DIRS`` (if it exists), for example + :file:`/etc/xdg/pip/pip.conf`. +* On macOS the file is: :file:`/Library/Application Support/pip/pip.conf` +* On Windows XP the file is: + :file:`C:\\Documents and Settings\\All Users\\Application Data\\pip\\pip.ini` +* On Windows 7 and later the file is hidden, but writeable at + :file:`C:\\ProgramData\\pip\\pip.ini` +* Site-wide configuration is not supported on Windows Vista + +If multiple configuration files are found by pip then they are combined in +the following order: + +1. Firstly the site-wide file is read, then +2. The per-user file is read, and finally +3. The virtualenv-specific file is read. + +Each file read overrides any values read from previous files, so if the +global timeout is specified in both the site-wide file and the per-user file +then the latter value is the one that will be used. + +The names of the settings are derived from the long command line option, e.g. +if you want to use a different package index (``--index-url``) and set the +HTTP timeout (``--default-timeout``) to 60 seconds your config file would +look like this: + +.. code-block:: ini + + [global] + timeout = 60 + index-url = http://download.zope.org/ppix + +Each subcommand can be configured optionally in its own section so that every +global setting with the same name will be overridden; e.g. decreasing the +``timeout`` to ``10`` seconds when running the `freeze` +(`Freezing Requirements <./#freezing-requirements>`_) command and using +``60`` seconds for all other commands is possible with: + +.. code-block:: ini + + [global] + timeout = 60 + + [freeze] + timeout = 10 + + +Boolean options like ``--ignore-installed`` or ``--no-dependencies`` can be +set like this: + +.. code-block:: ini + + [install] + ignore-installed = true + no-dependencies = yes + +To enable the boolean options ``--no-compile`` and ``--no-cache-dir``, falsy +values have to be used: + +.. code-block:: ini + + [global] + no-cache-dir = false + + [install] + no-compile = no + +Appending options like ``--find-links`` can be written on multiple lines: + +.. code-block:: ini + + [global] + find-links = + http://download.example.com + + [install] + find-links = + http://mirror1.example.com + http://mirror2.example.com + + +Environment Variables +--------------------- + +pip's command line options can be set with environment variables using the +format ``PIP_<UPPER_LONG_NAME>`` . Dashes (``-``) have to be replaced with +underscores (``_``). + +For example, to set the default timeout:: + + export PIP_DEFAULT_TIMEOUT=60 + +This is the same as passing the option to pip directly:: + + pip --default-timeout=60 [...] + +To set options that can be set multiple times on the command line, just add +spaces in between values. For example:: + + export PIP_FIND_LINKS="http://mirror1.example.com http://mirror2.example.com" + +is the same as calling:: + + pip install --find-links=http://mirror1.example.com --find-links=http://mirror2.example.com + + +Config Precedence +----------------- + +Command line options have precedence over environment variables, which have precedence over the config file. + +Within the config file, command specific sections have precedence over the global section. + +Examples: + +- ``--host=foo`` overrides ``PIP_HOST=foo`` +- ``PIP_HOST=foo`` overrides a config file with ``[global] host = foo`` +- A command specific section in the config file ``[<command>] host = bar`` + overrides the option with same name in the ``[global]`` config file section + + +Command Completion +------------------ + +pip comes with support for command line completion in bash, zsh and fish. + +To setup for bash:: + + $ pip completion --bash >> ~/.profile + +To setup for zsh:: + + $ pip completion --zsh >> ~/.zprofile + +To setup for fish:: + +$ pip completion --fish > ~/.config/fish/completions/pip.fish + +Alternatively, you can use the result of the ``completion`` command +directly with the eval function of your shell, e.g. by adding the following to your startup file:: + + eval "`pip completion --bash`" + + + +.. _`Installing from local packages`: + +Installing from local packages +****************************** + +In some cases, you may want to install from local packages only, with no traffic +to PyPI. + +First, download the archives that fulfill your requirements:: + +$ pip install --download DIR -r requirements.txt + + +Note that ``pip install --download`` will look in your wheel cache first, before +trying to download from PyPI. If you've never installed your requirements +before, you won't have a wheel cache for those items. In that case, if some of +your requirements don't come as wheels from PyPI, and you want wheels, then run +this instead:: + +$ pip wheel --wheel-dir DIR -r requirements.txt + + +Then, to install from local only, you'll be using :ref:`--find-links +<--find-links>` and :ref:`--no-index <--no-index>` like so:: + +$ pip install --no-index --find-links=DIR -r requirements.txt + + +"Only if needed" Recursive Upgrade +********************************** + +``pip install --upgrade`` is currently written to perform an eager recursive +upgrade, i.e. it upgrades all dependencies regardless of whether they still +satisfy the new parent requirements. + +E.g. supposing: + +* `SomePackage-1.0` requires `AnotherPackage>=1.0` +* `SomePackage-2.0` requires `AnotherPackage>=1.0` and `OneMorePackage==1.0` +* `SomePackage-1.0` and `AnotherPackage-1.0` are currently installed +* `SomePackage-2.0` and `AnotherPackage-2.0` are the latest versions available on PyPI. + +Running ``pip install --upgrade SomePackage`` would upgrade `SomePackage` *and* +`AnotherPackage` despite `AnotherPackage` already being satisfied. + +pip doesn't currently have an option to do an "only if needed" recursive +upgrade, but you can achieve it using these 2 steps:: + + pip install --upgrade --no-deps SomePackage + pip install SomePackage + +The first line will upgrade `SomePackage`, but not dependencies like +`AnotherPackage`. The 2nd line will fill in new dependencies like +`OneMorePackage`. + +See :issue:`59` for a plan of making "only if needed" recursive the default +behavior for a new ``pip upgrade`` command. + + +User Installs +************* + +With Python 2.6 came the `"user scheme" for installation +<http://docs.python.org/install/index.html#alternate-installation-the-user-scheme>`_, +which means that all Python distributions support an alternative install +location that is specific to a user. The default location for each OS is +explained in the python documentation for the `site.USER_BASE +<http://docs.python.org/library/site.html#site.USER_BASE>`_ variable. This mode +of installation can be turned on by specifying the :ref:`--user +<install_--user>` option to ``pip install``. + +Moreover, the "user scheme" can be customized by setting the +``PYTHONUSERBASE`` environment variable, which updates the value of ``site.USER_BASE``. + +To install "SomePackage" into an environment with site.USER_BASE customized to '/myappenv', do the following:: + + export PYTHONUSERBASE=/myappenv + pip install --user SomePackage + + +``pip install --user`` follows four rules: + +#. When globally installed packages are on the python path, and they *conflict* + with the installation requirements, they are ignored, and *not* + uninstalled. +#. When globally installed packages are on the python path, and they *satisfy* + the installation requirements, pip does nothing, and reports that + requirement is satisfied (similar to how global packages can satisfy + requirements when installing packages in a ``--system-site-packages`` + virtualenv). +#. pip will not perform a ``--user`` install in a ``--no-site-packages`` + virtualenv (i.e. the default kind of virtualenv), due to the user site not + being on the python path. The installation would be pointless. +#. In a ``--system-site-packages`` virtualenv, pip will not install a package + that conflicts with a package in the virtualenv site-packages. The --user + installation would lack sys.path precedence and be pointless. + + +To make the rules clearer, here are some examples: + + +From within a ``--no-site-packages`` virtualenv (i.e. the default kind):: + + $ pip install --user SomePackage + Can not perform a '--user' install. User site-packages are not visible in this virtualenv. + + +From within a ``--system-site-packages`` virtualenv where ``SomePackage==0.3`` is already installed in the virtualenv:: + + $ pip install --user SomePackage==0.4 + Will not install to the user site because it will lack sys.path precedence + + +From within a real python, where ``SomePackage`` is *not* installed globally:: + + $ pip install --user SomePackage + [...] + Successfully installed SomePackage + + +From within a real python, where ``SomePackage`` *is* installed globally, but is *not* the latest version:: + + $ pip install --user SomePackage + [...] + Requirement already satisfied (use --upgrade to upgrade) + + $ pip install --user --upgrade SomePackage + [...] + Successfully installed SomePackage + + +From within a real python, where ``SomePackage`` *is* installed globally, and is the latest version:: + + $ pip install --user SomePackage + [...] + Requirement already satisfied (use --upgrade to upgrade) + + $ pip install --user --upgrade SomePackage + [...] + Requirement already up-to-date: SomePackage + + # force the install + $ pip install --user --ignore-installed SomePackage + [...] + Successfully installed SomePackage + + +.. _`Repeatability`: + +Ensuring Repeatability +********************** + +pip can achieve various levels of repeatability: + +Pinned Version Numbers +---------------------- + +Pinning the versions of your dependencies in the requirements file +protects you from bugs or incompatibilities in newly released versions:: + + SomePackage == 1.2.3 + DependencyOfSomePackage == 4.5.6 + +Using :ref:`pip freeze` to generate the requirements file will ensure that not +only the top-level dependencies are included but their sub-dependencies as +well, and so on. Perform the installation using :ref:`--no-deps +<install_--no-deps>` for an extra dose of insurance against installing +anything not explicitly listed. + +This strategy is easy to implement and works across OSes and architectures. +However, it trusts PyPI and the certificate authority chain. It +also relies on indices and find-links locations not allowing +packages to change without a version increase. (PyPI does protect +against this.) + +Hash-checking Mode +------------------ + +Beyond pinning version numbers, you can add hashes against which to verify +downloaded packages:: + + FooProject == 1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 + +This protects against a compromise of PyPI or the HTTPS +certificate chain. It also guards against a package changing +without its version number changing (on indexes that allow this). +This approach is a good fit for automated server deployments. + +Hash-checking mode is a labor-saving alternative to running a private index +server containing approved packages: it removes the need to upload packages, +maintain ACLs, and keep an audit trail (which a VCS gives you on the +requirements file for free). It can also substitute for a vendor library, +providing easier upgrades and less VCS noise. It does not, of course, +provide the availability benefits of a private index or a vendor library. + +For more, see :ref:`pip install\'s discussion of hash-checking mode <hash-checking mode>`. + +.. _`Installation Bundle`: + +Installation Bundles +-------------------- + +Using :ref:`pip wheel`, you can bundle up all of a project's dependencies, with +any compilation done, into a single archive. This allows installation when +index servers are unavailable and avoids time-consuming recompilation. Create +an archive like this:: + + $ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX) + $ pip wheel -r requirements.txt --wheel-dir=$tempdir + $ cwd=`pwd` + $ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *) + +You can then install from the archive like this:: + + $ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX) + $ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2) + $ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/* + +Note that compiled packages are typically OS- and architecture-specific, so +these archives are not necessarily portable across machines. + +Hash-checking mode can be used along with this method to ensure that future +archives are built with identical packages. + +.. warning:: + Finally, beware of the ``setup_requires`` keyword arg in :file:`setup.py`. + The (rare) packages that use it will cause those dependencies to be + downloaded by setuptools directly, skipping pip's protections. If you need + to use such a package, see :ref:`Controlling + setup_requires<controlling-setup-requires>`. diff --git a/vendor/pip-9.0.3/pip.egg-info/PKG-INFO b/vendor/pip-9.0.3/pip.egg-info/PKG-INFO new file mode 100644 index 0000000000000000000000000000000000000000..aca2a4f2444cfd01732740e367c306f972d863a8 --- /dev/null +++ b/vendor/pip-9.0.3/pip.egg-info/PKG-INFO @@ -0,0 +1,62 @@ +Metadata-Version: 2.1 +Name: pip +Version: 9.0.3 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: python-virtualenv@groups.google.com +License: MIT +Description: pip + === + + The `PyPA recommended + <https://packaging.python.org/en/latest/current/>`_ + tool for installing Python packages. + + * `Installation <https://pip.pypa.io/en/stable/installing.html>`_ + * `Documentation <https://pip.pypa.io/>`_ + * `Changelog <https://pip.pypa.io/en/stable/news.html>`_ + * `Github Page <https://github.com/pypa/pip>`_ + * `Issue Tracking <https://github.com/pypa/pip/issues>`_ + * `User mailing list <http://groups.google.com/group/python-virtualenv>`_ + * `Dev mailing list <http://groups.google.com/group/pypa-dev>`_ + * User IRC: #pypa on Freenode. + * Dev IRC: #pypa-dev on Freenode. + + + .. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.python.org/pypi/pip + + .. image:: https://img.shields.io/travis/pypa/pip/master.svg + :target: http://travis-ci.org/pypa/pip + + .. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg + :target: https://ci.appveyor.com/project/pypa/pip/history + + .. image:: https://readthedocs.org/projects/pip/badge/?version=stable + :target: https://pip.pypa.io/en/stable + + Code of Conduct + --------------- + + Everyone interacting in the pip project's codebases, issue trackers, chat + rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + + .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + +Keywords: easy_install distutils setuptools egg virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.6,!=3.0.*,!=3.1.*,!=3.2.* +Provides-Extra: testing diff --git a/vendor/pip-9.0.3/pip.egg-info/SOURCES.txt b/vendor/pip-9.0.3/pip.egg-info/SOURCES.txt new file mode 100644 index 0000000000000000000000000000000000000000..c8c511693088b288a035d9667a6091d1aa24e71a --- /dev/null +++ b/vendor/pip-9.0.3/pip.egg-info/SOURCES.txt @@ -0,0 +1,316 @@ +AUTHORS.txt +CHANGES.txt +LICENSE.txt +MANIFEST.in +README.rst +setup.cfg +setup.py +docs/Makefile +docs/__init__.py +docs/conf.py +docs/configuration.rst +docs/cookbook.rst +docs/development.rst +docs/index.rst +docs/installing.rst +docs/logic.rst +docs/make.bat +docs/news.rst +docs/pipext.py +docs/quickstart.rst +docs/usage.rst +docs/user_guide.rst +docs/reference/index.rst +docs/reference/pip.rst +docs/reference/pip_download.rst +docs/reference/pip_freeze.rst +docs/reference/pip_hash.rst +docs/reference/pip_install.rst +docs/reference/pip_list.rst +docs/reference/pip_search.rst +docs/reference/pip_show.rst +docs/reference/pip_uninstall.rst +docs/reference/pip_wheel.rst +pip/__init__.py +pip/__main__.py +pip/basecommand.py +pip/baseparser.py +pip/cmdoptions.py +pip/download.py +pip/exceptions.py +pip/index.py +pip/locations.py +pip/pep425tags.py +pip/status_codes.py +pip/wheel.py +pip.egg-info/PKG-INFO +pip.egg-info/SOURCES.txt +pip.egg-info/dependency_links.txt +pip.egg-info/entry_points.txt +pip.egg-info/not-zip-safe +pip.egg-info/requires.txt +pip.egg-info/top_level.txt +pip/_vendor/README.rst +pip/_vendor/__init__.py +pip/_vendor/appdirs.py +pip/_vendor/distro.py +pip/_vendor/ipaddress.py +pip/_vendor/ordereddict.py +pip/_vendor/pyparsing.py +pip/_vendor/re-vendor.py +pip/_vendor/retrying.py +pip/_vendor/six.py +pip/_vendor/vendor.txt +pip/_vendor/cachecontrol/__init__.py +pip/_vendor/cachecontrol/_cmd.py +pip/_vendor/cachecontrol/adapter.py +pip/_vendor/cachecontrol/cache.py +pip/_vendor/cachecontrol/compat.py +pip/_vendor/cachecontrol/controller.py +pip/_vendor/cachecontrol/filewrapper.py +pip/_vendor/cachecontrol/heuristics.py +pip/_vendor/cachecontrol/serialize.py +pip/_vendor/cachecontrol/wrapper.py +pip/_vendor/cachecontrol/caches/__init__.py +pip/_vendor/cachecontrol/caches/file_cache.py +pip/_vendor/cachecontrol/caches/redis_cache.py +pip/_vendor/certifi/__init__.py +pip/_vendor/certifi/__main__.py +pip/_vendor/certifi/cacert.pem +pip/_vendor/certifi/core.py +pip/_vendor/chardet/__init__.py +pip/_vendor/chardet/big5freq.py +pip/_vendor/chardet/big5prober.py +pip/_vendor/chardet/chardistribution.py +pip/_vendor/chardet/charsetgroupprober.py +pip/_vendor/chardet/charsetprober.py +pip/_vendor/chardet/codingstatemachine.py +pip/_vendor/chardet/compat.py +pip/_vendor/chardet/cp949prober.py +pip/_vendor/chardet/enums.py +pip/_vendor/chardet/escprober.py +pip/_vendor/chardet/escsm.py +pip/_vendor/chardet/eucjpprober.py +pip/_vendor/chardet/euckrfreq.py +pip/_vendor/chardet/euckrprober.py +pip/_vendor/chardet/euctwfreq.py +pip/_vendor/chardet/euctwprober.py +pip/_vendor/chardet/gb2312freq.py +pip/_vendor/chardet/gb2312prober.py +pip/_vendor/chardet/hebrewprober.py +pip/_vendor/chardet/jisfreq.py +pip/_vendor/chardet/jpcntx.py +pip/_vendor/chardet/langbulgarianmodel.py +pip/_vendor/chardet/langcyrillicmodel.py +pip/_vendor/chardet/langgreekmodel.py +pip/_vendor/chardet/langhebrewmodel.py +pip/_vendor/chardet/langhungarianmodel.py +pip/_vendor/chardet/langthaimodel.py +pip/_vendor/chardet/langturkishmodel.py +pip/_vendor/chardet/latin1prober.py +pip/_vendor/chardet/mbcharsetprober.py +pip/_vendor/chardet/mbcsgroupprober.py +pip/_vendor/chardet/mbcssm.py +pip/_vendor/chardet/sbcharsetprober.py +pip/_vendor/chardet/sbcsgroupprober.py +pip/_vendor/chardet/sjisprober.py +pip/_vendor/chardet/universaldetector.py +pip/_vendor/chardet/utf8prober.py +pip/_vendor/chardet/version.py +pip/_vendor/chardet/cli/__init__.py +pip/_vendor/chardet/cli/chardetect.py +pip/_vendor/colorama/__init__.py +pip/_vendor/colorama/ansi.py +pip/_vendor/colorama/ansitowin32.py +pip/_vendor/colorama/initialise.py +pip/_vendor/colorama/win32.py +pip/_vendor/colorama/winterm.py +pip/_vendor/distlib/__init__.py +pip/_vendor/distlib/compat.py +pip/_vendor/distlib/database.py +pip/_vendor/distlib/index.py +pip/_vendor/distlib/locators.py +pip/_vendor/distlib/manifest.py +pip/_vendor/distlib/markers.py +pip/_vendor/distlib/metadata.py +pip/_vendor/distlib/resources.py +pip/_vendor/distlib/scripts.py +pip/_vendor/distlib/t32.exe +pip/_vendor/distlib/t64.exe +pip/_vendor/distlib/util.py +pip/_vendor/distlib/version.py +pip/_vendor/distlib/w32.exe +pip/_vendor/distlib/w64.exe +pip/_vendor/distlib/wheel.py +pip/_vendor/distlib/_backport/__init__.py +pip/_vendor/distlib/_backport/misc.py +pip/_vendor/distlib/_backport/shutil.py +pip/_vendor/distlib/_backport/sysconfig.cfg +pip/_vendor/distlib/_backport/sysconfig.py +pip/_vendor/distlib/_backport/tarfile.py +pip/_vendor/html5lib/__init__.py +pip/_vendor/html5lib/_ihatexml.py +pip/_vendor/html5lib/_inputstream.py +pip/_vendor/html5lib/_tokenizer.py +pip/_vendor/html5lib/_utils.py +pip/_vendor/html5lib/constants.py +pip/_vendor/html5lib/html5parser.py +pip/_vendor/html5lib/serializer.py +pip/_vendor/html5lib/_trie/__init__.py +pip/_vendor/html5lib/_trie/_base.py +pip/_vendor/html5lib/_trie/datrie.py +pip/_vendor/html5lib/_trie/py.py +pip/_vendor/html5lib/filters/__init__.py +pip/_vendor/html5lib/filters/alphabeticalattributes.py +pip/_vendor/html5lib/filters/base.py +pip/_vendor/html5lib/filters/inject_meta_charset.py +pip/_vendor/html5lib/filters/lint.py +pip/_vendor/html5lib/filters/optionaltags.py +pip/_vendor/html5lib/filters/sanitizer.py +pip/_vendor/html5lib/filters/whitespace.py +pip/_vendor/html5lib/treeadapters/__init__.py +pip/_vendor/html5lib/treeadapters/genshi.py +pip/_vendor/html5lib/treeadapters/sax.py +pip/_vendor/html5lib/treebuilders/__init__.py +pip/_vendor/html5lib/treebuilders/base.py +pip/_vendor/html5lib/treebuilders/dom.py +pip/_vendor/html5lib/treebuilders/etree.py +pip/_vendor/html5lib/treebuilders/etree_lxml.py +pip/_vendor/html5lib/treewalkers/__init__.py +pip/_vendor/html5lib/treewalkers/base.py +pip/_vendor/html5lib/treewalkers/dom.py +pip/_vendor/html5lib/treewalkers/etree.py +pip/_vendor/html5lib/treewalkers/etree_lxml.py +pip/_vendor/html5lib/treewalkers/genshi.py +pip/_vendor/idna/__init__.py +pip/_vendor/idna/codec.py +pip/_vendor/idna/compat.py +pip/_vendor/idna/core.py +pip/_vendor/idna/idnadata.py +pip/_vendor/idna/intranges.py +pip/_vendor/idna/package_data.py +pip/_vendor/idna/uts46data.py +pip/_vendor/lockfile/__init__.py +pip/_vendor/lockfile/linklockfile.py +pip/_vendor/lockfile/mkdirlockfile.py +pip/_vendor/lockfile/pidlockfile.py +pip/_vendor/lockfile/sqlitelockfile.py +pip/_vendor/lockfile/symlinklockfile.py +pip/_vendor/packaging/__about__.py +pip/_vendor/packaging/__init__.py +pip/_vendor/packaging/_compat.py +pip/_vendor/packaging/_structures.py +pip/_vendor/packaging/markers.py +pip/_vendor/packaging/requirements.py +pip/_vendor/packaging/specifiers.py +pip/_vendor/packaging/utils.py +pip/_vendor/packaging/version.py +pip/_vendor/pkg_resources/__init__.py +pip/_vendor/progress/__init__.py +pip/_vendor/progress/bar.py +pip/_vendor/progress/counter.py +pip/_vendor/progress/helpers.py +pip/_vendor/progress/spinner.py +pip/_vendor/requests/__init__.py +pip/_vendor/requests/__version__.py +pip/_vendor/requests/_internal_utils.py +pip/_vendor/requests/adapters.py +pip/_vendor/requests/api.py +pip/_vendor/requests/auth.py +pip/_vendor/requests/cacert.pem +pip/_vendor/requests/certs.py +pip/_vendor/requests/compat.py +pip/_vendor/requests/cookies.py +pip/_vendor/requests/exceptions.py +pip/_vendor/requests/help.py +pip/_vendor/requests/hooks.py +pip/_vendor/requests/models.py +pip/_vendor/requests/packages.py +pip/_vendor/requests/sessions.py +pip/_vendor/requests/status_codes.py +pip/_vendor/requests/structures.py +pip/_vendor/requests/utils.py +pip/_vendor/urllib3/__init__.py +pip/_vendor/urllib3/_collections.py +pip/_vendor/urllib3/connection.py +pip/_vendor/urllib3/connectionpool.py +pip/_vendor/urllib3/exceptions.py +pip/_vendor/urllib3/fields.py +pip/_vendor/urllib3/filepost.py +pip/_vendor/urllib3/poolmanager.py +pip/_vendor/urllib3/request.py +pip/_vendor/urllib3/response.py +pip/_vendor/urllib3/contrib/__init__.py +pip/_vendor/urllib3/contrib/appengine.py +pip/_vendor/urllib3/contrib/ntlmpool.py +pip/_vendor/urllib3/contrib/pyopenssl.py +pip/_vendor/urllib3/contrib/securetransport.py +pip/_vendor/urllib3/contrib/socks.py +pip/_vendor/urllib3/contrib/_securetransport/__init__.py +pip/_vendor/urllib3/contrib/_securetransport/bindings.py +pip/_vendor/urllib3/contrib/_securetransport/low_level.py +pip/_vendor/urllib3/packages/__init__.py +pip/_vendor/urllib3/packages/ordered_dict.py +pip/_vendor/urllib3/packages/six.py +pip/_vendor/urllib3/packages/backports/__init__.py +pip/_vendor/urllib3/packages/backports/makefile.py +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +pip/_vendor/urllib3/util/__init__.py +pip/_vendor/urllib3/util/connection.py +pip/_vendor/urllib3/util/request.py +pip/_vendor/urllib3/util/response.py +pip/_vendor/urllib3/util/retry.py +pip/_vendor/urllib3/util/selectors.py +pip/_vendor/urllib3/util/ssl_.py +pip/_vendor/urllib3/util/timeout.py +pip/_vendor/urllib3/util/url.py +pip/_vendor/urllib3/util/wait.py +pip/_vendor/webencodings/__init__.py +pip/_vendor/webencodings/labels.py +pip/_vendor/webencodings/mklabels.py +pip/_vendor/webencodings/tests.py +pip/_vendor/webencodings/x_user_defined.py +pip/commands/__init__.py +pip/commands/check.py +pip/commands/completion.py +pip/commands/download.py +pip/commands/freeze.py +pip/commands/hash.py +pip/commands/help.py +pip/commands/install.py +pip/commands/list.py +pip/commands/search.py +pip/commands/show.py +pip/commands/uninstall.py +pip/commands/wheel.py +pip/compat/__init__.py +pip/compat/dictconfig.py +pip/models/__init__.py +pip/models/index.py +pip/operations/__init__.py +pip/operations/check.py +pip/operations/freeze.py +pip/req/__init__.py +pip/req/req_file.py +pip/req/req_install.py +pip/req/req_set.py +pip/req/req_uninstall.py +pip/utils/__init__.py +pip/utils/appdirs.py +pip/utils/build.py +pip/utils/deprecation.py +pip/utils/encoding.py +pip/utils/filesystem.py +pip/utils/glibc.py +pip/utils/hashes.py +pip/utils/logging.py +pip/utils/outdated.py +pip/utils/packaging.py +pip/utils/setuptools_build.py +pip/utils/ui.py +pip/vcs/__init__.py +pip/vcs/bazaar.py +pip/vcs/git.py +pip/vcs/mercurial.py +pip/vcs/subversion.py \ No newline at end of file diff --git a/vendor/pip-9.0.3/pip.egg-info/dependency_links.txt b/vendor/pip-9.0.3/pip.egg-info/dependency_links.txt new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/vendor/pip-9.0.3/pip.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/vendor/pip-9.0.3/pip.egg-info/entry_points.txt b/vendor/pip-9.0.3/pip.egg-info/entry_points.txt new file mode 100644 index 0000000000000000000000000000000000000000..879fd89648478d3b98551de10b0157007182e7cd --- /dev/null +++ b/vendor/pip-9.0.3/pip.egg-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip:main +pip3 = pip:main +pip3.6 = pip:main + diff --git a/vendor/pip-9.0.3/pip.egg-info/not-zip-safe b/vendor/pip-9.0.3/pip.egg-info/not-zip-safe new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/vendor/pip-9.0.3/pip.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/vendor/pip-9.0.3/pip.egg-info/requires.txt b/vendor/pip-9.0.3/pip.egg-info/requires.txt new file mode 100644 index 0000000000000000000000000000000000000000..26b980b8fa17b2daf9f8e98427da4aebd261c56e --- /dev/null +++ b/vendor/pip-9.0.3/pip.egg-info/requires.txt @@ -0,0 +1,7 @@ + +[testing] +pytest +virtualenv>=1.10 +scripttest>=1.3 +mock +pretend diff --git a/vendor/pip-9.0.3/pip.egg-info/top_level.txt b/vendor/pip-9.0.3/pip.egg-info/top_level.txt new file mode 100644 index 0000000000000000000000000000000000000000..a1b589e38a32041e49332e5e81c2d363dc418d68 --- /dev/null +++ b/vendor/pip-9.0.3/pip.egg-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/vendor/pip-9.0.3/pip/__init__.py b/vendor/pip-9.0.3/pip/__init__.py new file mode 100755 index 0000000000000000000000000000000000000000..c00b284d624a375c922228fdd172b1a55a6c747e --- /dev/null +++ b/vendor/pip-9.0.3/pip/__init__.py @@ -0,0 +1,346 @@ +#!/usr/bin/env python +from __future__ import absolute_import + +import locale +import logging +import os +import optparse +import warnings + +import sys +import re + +# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, +# but if invoked (i.e. imported), it will issue a warning to stderr if socks +# isn't available. requests unconditionally imports urllib3's socks contrib +# module, triggering this warning. The warning breaks DEP-8 tests (because of +# the stderr output) and is just plain annoying in normal usage. I don't want +# to add socks as yet another dependency for pip, nor do I want to allow-stder +# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to +# be done before the import of pip.vcs. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.filterwarnings("ignore", category=DependencyWarning) # noqa + +# We want to inject the use of SecureTransport as early as possible so that any +# references or sessions or what have you are ensured to have it, however we +# only want to do this in the case that we're running on macOS and the linked +# OpenSSL is too old to handle TLSv1.2 +try: + import ssl +except ImportError: + pass +else: + if (sys.platform == "darwin" and + getattr(ssl, "OPENSSL_VERSION_NUMBER", 0) < 0x1000100f): # OpenSSL 1.0.1 + try: + from pip._vendor.urllib3.contrib import securetransport + except (ImportError, OSError): + pass + else: + securetransport.inject_into_urllib3() + +from pip.exceptions import InstallationError, CommandError, PipError +from pip.utils import get_installed_distributions, get_prog +from pip.utils import deprecation, dist_is_editable +from pip.vcs import git, mercurial, subversion, bazaar # noqa +from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip.commands import get_summaries, get_similar_commands +from pip.commands import commands_dict +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + + +# assignment for flake8 to be happy + +# This fixes a peculiarity when importing via __import__ - as we are +# initialising the pip module, "from pip import cmdoptions" is recursive +# and appears not to work properly in that situation. +import pip.cmdoptions +cmdoptions = pip.cmdoptions + +# The version as used in the setup.py and the docs conf.py +__version__ = "9.0.3" + + +logger = logging.getLogger(__name__) + +# Hide the InsecureRequestWarning from urllib3 +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +def autocomplete(): + """Command and option completion for the main option parser (and options) + and its subcommands (and options). + + Enable by sourcing one of the completion shell scripts (bash, zsh or fish). + """ + # Don't complete if user hasn't sourced bash_completion file. + if 'PIP_AUTO_COMPLETE' not in os.environ: + return + cwords = os.environ['COMP_WORDS'].split()[1:] + cword = int(os.environ['COMP_CWORD']) + try: + current = cwords[cword - 1] + except IndexError: + current = '' + + subcommands = [cmd for cmd, summary in get_summaries()] + options = [] + # subcommand + try: + subcommand_name = [w for w in cwords if w in subcommands][0] + except IndexError: + subcommand_name = None + + parser = create_main_parser() + # subcommand options + if subcommand_name: + # special case: 'help' subcommand has no options + if subcommand_name == 'help': + sys.exit(1) + # special case: list locally installed dists for uninstall command + if subcommand_name == 'uninstall' and not current.startswith('-'): + installed = [] + lc = current.lower() + for dist in get_installed_distributions(local_only=True): + if dist.key.startswith(lc) and dist.key not in cwords[1:]: + installed.append(dist.key) + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + subcommand = commands_dict[subcommand_name]() + options += [(opt.get_opt_string(), opt.nargs) + for opt in subcommand.parser.option_list_all + if opt.help != optparse.SUPPRESS_HELP] + + # filter out previously specified options from available options + prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] + options = [(x, v) for (x, v) in options if x not in prev_opts] + # filter options by current input + options = [(k, v) for k, v in options if k.startswith(current)] + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1]: + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + if current.startswith('-') or current.startswith('--'): + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + opts = (o for it in opts for o in it) + + subcommands += [i.get_opt_string() for i in opts + if i.help != optparse.SUPPRESS_HELP] + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def create_main_parser(): + parser_kw = { + 'usage': '\n%prog <command> [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + parser.disable_interspersed_args() + + pip_pkg_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + parser.version = 'pip %s from %s (python %s)' % ( + __version__, pip_pkg_dir, sys.version[:3]) + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + parser.main = True # so the help formatter knows + + # create command listing for description + command_summaries = get_summaries() + description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] + parser.description = '\n'.join(description) + + return parser + + +def parseopts(args): + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == 'help' and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args + + +def check_isolated(args): + isolated = False + + if "--isolated" in args: + isolated = True + + return isolated + + +def main(args=None): + if args is None: + args = sys.argv[1:] + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parseopts(args) + except PipError as exc: + sys.stderr.write("ERROR: %s" % exc) + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = commands_dict[cmd_name](isolated=check_isolated(cmd_args)) + return command.main(cmd_args) + + +# ########################################################### +# # Writing freeze files + +class FrozenRequirement(object): + + def __init__(self, name, req, editable, comments=()): + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + _rev_re = re.compile(r'-r(\d+)$') + _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') + + @classmethod + def from_dist(cls, dist, dependency_links): + location = os.path.normcase(os.path.abspath(dist.location)) + comments = [] + from pip.vcs import vcs, get_src_requirement + if dist_is_editable(dist) and vcs.get_backend_name(location): + editable = True + try: + req = get_src_requirement(dist, location) + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + req = None + if req is None: + logger.warning( + 'Could not determine repository location of %s', location + ) + comments.append( + '## !! Could not determine repository location' + ) + req = dist.as_requirement() + editable = False + else: + editable = False + req = dist.as_requirement() + specs = req.specs + assert len(specs) == 1 and specs[0][0] in ["==", "==="], \ + 'Expected 1 spec with == or ===; specs = %r; dist = %r' % \ + (specs, dist) + version = specs[0][1] + ver_match = cls._rev_re.search(version) + date_match = cls._date_re.search(version) + if ver_match or date_match: + svn_backend = vcs.get_backend('svn') + if svn_backend: + svn_location = svn_backend().get_location( + dist, + dependency_links, + ) + if not svn_location: + logger.warning( + 'Warning: cannot find svn location for %s', req) + comments.append( + '## FIXME: could not find svn URL in dependency_links ' + 'for this package:' + ) + else: + comments.append( + '# Installing as editable to satisfy requirement %s:' % + req + ) + if ver_match: + rev = ver_match.group(1) + else: + rev = '{%s}' % date_match.group(1) + editable = True + req = '%s@%s#egg=%s' % ( + svn_location, + rev, + cls.egg_name(dist) + ) + return cls(dist.project_name, req, editable, comments) + + @staticmethod + def egg_name(dist): + name = dist.egg_name() + match = re.search(r'-py\d\.\d$', name) + if match: + name = name[:match.start()] + return name + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/vendor/pip-9.0.3/pip/__main__.py b/vendor/pip-9.0.3/pip/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..5556539cb714e8ef5e7a969cc1a74f67a5a63436 --- /dev/null +++ b/vendor/pip-9.0.3/pip/__main__.py @@ -0,0 +1,19 @@ +from __future__ import absolute_import + +import os +import sys + +# If we are running from a wheel, add the wheel to sys.path +# This allows the usage python pip-*.whl/pip install pip-*.whl +if __package__ == '': + # __file__ is pip-*.whl/pip/__main__.py + # first dirname call strips of '/__main__.py', second strips off '/pip' + # Resulting path is the name of the wheel itself + # Add that to sys.path so we can import pip + path = os.path.dirname(os.path.dirname(__file__)) + sys.path.insert(0, path) + +import pip # noqa + +if __name__ == '__main__': + sys.exit(pip.main()) diff --git a/vendor/pip-9.0.3/pip/_vendor/README.rst b/vendor/pip-9.0.3/pip/_vendor/README.rst new file mode 100644 index 0000000000000000000000000000000000000000..652a43f25b8e9dc7ec31b065623c4a2854abcf79 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/README.rst @@ -0,0 +1,134 @@ +Policy +====== + +* Vendored libraries **MUST** not be modified except as required to + successfully vendor them. + +* Vendored libraries **MUST** be released copies of libraries available on + PyPI. + +* The versions of libraries vendored in pip **MUST** be reflected in + ``pip/_vendor/vendor.txt``. + +* Vendored libraries **MUST** function without any build steps such as 2to3 or + compilation of C code, pratically this limits to single source 2.x/3.x and + pure Python. + +* Any modifications made to libraries **MUST** be noted in + ``pip/_vendor/README.rst``. + + +Rationale +--------- + +Historically pip has not had any dependencies except for setuptools itself, +choosing instead to implement any functionality it needed to prevent needing +a dependency. However, starting with pip 1.5 we began to replace code that was +implemented inside of pip with reusable libraries from PyPI. This brought the +typical benefits of reusing libraries instead of reinventing the wheel like +higher quality and more battle tested code, centralization of bug fixes +(particularly security sensitive ones), and better/more features for less work. + +However, there is several issues with having dependencies in the traditional +way (via ``install_requires``) for pip. These issues are: + +* Fragility. When pip depends on another library to function then if for + whatever reason that library either isn't installed or an incompatible + version is installed then pip ceases to function. This is of course true for + all Python applications, however for every application *except* for pip the + way you fix it is by re-running pip. Obviously when pip can't run you can't + use pip to fix pip so you're left having to manually resolve dependencies and + installing them by hand. + +* Making other libraries uninstallable. One of pip's current dependencies is + the requests library, for which pip requires a fairly recent version to run. + If pip dependended on requests in the traditional manner then we'd end up + needing to either maintain compatibility with every version of requests that + has ever existed (and will ever exist) or some subset of the versions of + requests available will simply become uninstallable depending on what version + of pip you're using. This is again a problem that is technically true for all + Python applications, however the nature of pip is that you're likely to have + pip installed in every single environment since it is installed by default + in Python, in pyvenv, and in virtualenv. + +* Security. On the surface this is oxymoronic since traditionally vendoring + tends to make it harder to update a dependent library for security updates + and that holds true for pip. However given the *other* reasons that exist for + pip to avoid dependencies the alternative (and what was done historically) is + for pip to reinvent the wheel itself. This led to pip having implemented + its own HTTPS verification routines to work around the lack of ssl + validation in the Python standard library which ended up having similar bugs + to validation routine in requests/urllib3 but which had to be discovered and + fixed independently. By reusing the libraries, even though we're vendoring, + we make it easier to keep pip secure by relying on the great work of our + dependencies *and* making it easier to actually fix security issues by simply + pulling in a newer version of the dependencies. + +* Bootstrapping. Currently most of the popular methods of installing pip rely + on the fact that pip is self contained to install pip itself. These tools + work by bundling a copy of pip, adding it to the sys.path and then executing + that copy of pip. This is done instead of implementing a "mini" installer to + again reduce duplication, pip already knows how to install a Python package + and is going to be vastly more battle tested than any sort of mini installer + could ever possibly be. + +Many downstream redistributors have policies against this kind of bundling and +instead opt to patch the software they distribute to debundle it and make it +rely on the global versions of the software that they already have packaged +(which may have its own patches applied to it). We (the pip team) would prefer +it if pip was *not* debundled in this manner due to the above reasons and +instead we would prefer it if pip would be left intact as it is now. The one +exception to this, is it is acceptable to remove the +``pip/_vendor/requests/cacert.pem`` file provided you ensure that the +``ssl.get_default_verify_paths().cafile`` API returns the correct CA bundle for +your system. This will ensure that pip will use your system provided CA bundle +instead of the copy bundled with pip. + +In the longer term, if someone has a *portable* solution to the above problems, +other than the bundling method we currently use, that doesn't add additional +problems that are unreasonable then we would be happy to consider, and possibly +switch to said method. This solution must function correctly across all of the +situation that we expect pip to be used and not mandate some external mechanism +such as OS packages. + + +pkg_resources +------------- + +pkg_resources has been pulled in from setuptools 28.8.0 + + +Modifications +------------- + +* html5lib has been modified to import six from pip._vendor +* pkg_resources has been modified to import its externs from pip._vendor +* CacheControl has been modified to import its dependencies from pip._vendor +* packaging has been modified to import its dependencies from pip._vendor +* requests has been modified *not* to optionally load any C dependencies. +* Modified distro to delay importing argparse to avoid errors on 2.6 + + +Debundling +---------- + +As mentioned in the rationale we, the pip team, would prefer it if pip was not +debundled (other than optionally ``pip/_vendor/requests/cacert.pem``) and that +pip was left intact. However, if you insist on doing so we have a +semi-supported method that we do test in our CI but which requires a bit of +extra work on your end to make it still solve the problems from above. + +1. Delete everything in ``pip/_vendor/`` **except** for + ``pip/_vendor/__init__.py``. + +2. Generate wheels for each of pip's dependencies (and any of their + dependencies) using your patched copies of these libraries. These must be + placed somewhere on the filesystem that pip can access, by default we will + assume you've placed them in ``pip/_vendor``. + +3. Modify ``pip/_vendor/__init__.py`` so that the ``DEBUNDLED`` variable is + ``True``. + +4. *(Optional)* If you've placed the wheels in a location other than + ``pip/_vendor/`` then modify ``pip/_vendor/__init__.py`` so that the + ``WHEEL_DIR`` variable points to the location you've placed them. diff --git a/vendor/pip-9.0.3/pip/_vendor/__init__.py b/vendor/pip-9.0.3/pip/_vendor/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bee5f5e6fd3b0910c9abe7893b6473e6dcb9e782 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/__init__.py @@ -0,0 +1,107 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(vendored_name, globals(), locals(), level=0) + except ImportError: + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("cachecontrol") + vendored("colorama") + vendored("distlib") + vendored("distro") + vendored("html5lib") + vendored("lockfile") + vendored("six") + vendored("six.moves") + vendored("six.moves.urllib") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pkg_resources") + vendored("progress") + vendored("retrying") + vendored("requests") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") diff --git a/vendor/pip-9.0.3/pip/_vendor/appdirs.py b/vendor/pip-9.0.3/pip/_vendor/appdirs.py new file mode 100644 index 0000000000000000000000000000000000000000..4b5c38bb4822675c64fcf407120e7bc71d28e78f --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/appdirs.py @@ -0,0 +1,552 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See <http://github.com/ActiveState/appdirs> for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - macOS: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 0) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "macOS", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + macOS: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/<AppName>', + if XDG_DATA_DIRS is not set + + Typical user data directories are: + macOS: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + macOS: same as user_data_dir + Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by deafult "~/.config/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical user data directories are: + macOS: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + macOS: ~/Library/Caches/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user cache directories are: + macOS: ~/Library/Logs/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname, appauthor=None, version=None, roaming=False, + multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernal.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", "site_data_dir", + "user_config_dir", "site_config_dir", + "user_cache_dir", "user_log_dir") + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/__init__.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ec9da2e374f39ce26d6c2551ec865a97ba84b93f --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/__init__.py @@ -0,0 +1,11 @@ +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = 'Eric Larson' +__email__ = 'eric@ionrock.org' +__version__ = '0.11.7' + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/_cmd.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000000000000000000000000000000000000..afdcc88c27ed4058b226ac68b97a57c0db117d68 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,60 @@ +import logging + +from pip._vendor import requests + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import logger + +from argparse import ArgumentParser + + +def setup_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session(): + adapter = CacheControlAdapter( + DictCache(), + cache_etags=True, + serializer=None, + heuristic=None, + ) + sess = requests.Session() + sess.mount('http://', adapter) + sess.mount('https://', adapter) + + sess.cache_controller = adapter.controller + return sess + + +def get_args(): + parser = ArgumentParser() + parser.add_argument('url', help='The URL to try and cache') + return parser.parse_args() + + +def main(args=None): + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + sess.cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if sess.cache_controller.cached_request(resp.request): + print('Cached!') + else: + print('Not cached :(') + + +if __name__ == '__main__': + main() diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/adapter.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000000000000000000000000000000000000..23488566b1e9650b2fb579cb1bb332e6b8b39fe3 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,125 @@ +import types +import functools + +from pip._vendor.requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = set(['PUT', 'DELETE']) + + def __init__(self, cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + *args, **kw): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = cache or DictCache() + self.heuristic = heuristic + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, + cache_etags=cache_etags, + serializer=serializer, + ) + + def send(self, request, **kw): + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + if request.method == 'GET': + cached_response = self.controller.cached_request(request) + if cached_response: + return self.build_response(request, cached_response, + from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update( + self.controller.conditional_headers(request) + ) + + resp = super(CacheControlAdapter, self).send(request, **kw) + + return resp + + def build_response(self, request, response, from_cache=False): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + if not from_cache and request.method == 'GET': + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif response.status == 301: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( + response._fp, + functools.partial( + self.controller.cache_response, + request, + response, + ) + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self): + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() + response._update_chunk_length = types.MethodType(_update_chunk_length, response) + + resp = super(CacheControlAdapter, self).build_response( + request, response + ) + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache + + return resp + + def close(self): + self.cache.close() + super(CacheControlAdapter, self).close() diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/cache.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000000000000000000000000000000000000..7389a73f8c5dac9ab07b005b115168eb025b735b --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,39 @@ +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise NotImplemented() + + def set(self, key, value): + raise NotImplemented() + + def delete(self, key): + raise NotImplemented() + + def close(self): + pass + + +class DictCache(BaseCache): + + def __init__(self, init_dict=None): + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key): + return self.data.get(key, None) + + def set(self, key, value): + with self.lock: + self.data.update({key: value}) + + def delete(self, key): + with self.lock: + if key in self.data: + self.data.pop(key) diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/__init__.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..f9e66a1ff7f15b3d5c6146e02340dd03bb98d87c --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,18 @@ +from textwrap import dedent + +try: + from .file_cache import FileCache +except ImportError: + notice = dedent(''' + NOTE: In order to use the FileCache you must have + lockfile installed. You can install it via pip: + pip install lockfile + ''') + print(notice) + + +try: + import redis + from .redis_cache import RedisCache +except ImportError: + pass diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/file_cache.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000000000000000000000000000000000000..b77728f0faf1581e742a9f0964f93d51bd2d6d55 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,116 @@ +import hashlib +import os + +from pip._vendor.lockfile import LockFile +from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile + +from ..cache import BaseCache +from ..controller import CacheController + + +def _secure_open_write(filename, fmode): + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except (IOError, OSError): + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class FileCache(BaseCache): + def __init__(self, directory, forever=False, filemode=0o0600, + dirmode=0o0700, use_dir_lock=None, lock_class=None): + + if use_dir_lock is not None and lock_class is not None: + raise ValueError("Cannot use use_dir_lock and lock_class together") + + if use_dir_lock: + lock_class = MkdirLockFile + + if lock_class is None: + lock_class = LockFile + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + + @staticmethod + def encode(x): + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name): + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + name = self._fn(key) + if not os.path.exists(name): + return None + + with open(name, 'rb') as fh: + return fh.read() + + def set(self, key, value): + name = self._fn(key) + + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(name), self.dirmode) + except (IOError, OSError): + pass + + with self.lock_class(name) as lock: + # Write our actual file + with _secure_open_write(lock.path, self.filemode) as fh: + fh.write(value) + + def delete(self, key): + name = self._fn(key) + if not self.forever: + os.remove(name) + + +def url_to_file_path(url, filecache): + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/redis_cache.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000000000000000000000000000000000000..9f5d55fd98c989c17039fcc8024fee3932646b57 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,41 @@ +from __future__ import division + +from datetime import datetime + + +def total_seconds(td): + """Python 2.6 compatability""" + if hasattr(td, 'total_seconds'): + return td.total_seconds() + + ms = td.microseconds + secs = (td.seconds + td.days * 24 * 3600) + return (ms + secs * 10**6) / 10**6 + + +class RedisCache(object): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.now() + self.conn.setex(key, total_seconds(expires), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + self.conn.disconnect() diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/compat.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 0000000000000000000000000000000000000000..b59f1122a456e3394429e57c70e9e80d2c236607 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/compat.py @@ -0,0 +1,20 @@ +try: + from urllib.parse import urljoin +except ImportError: + from urlparse import urljoin + + +try: + import cPickle as pickle +except ImportError: + import pickle + + +from pip._vendor.urllib3.response import HTTPResponse +from pip._vendor.urllib3.util import is_fp_closed + +# Replicate some six behaviour +try: + text_type = (unicode,) +except NameError: + text_type = (str,) diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/controller.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000000000000000000000000000000000000..5eb961f85bab3dc4a237c8635d56d202d4499d04 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,353 @@ +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + def __init__(self, cache=None, cache_etags=True, serializer=None): + self.cache = cache or DictCache() + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + """ + Parse the cache control headers returning a dictionary with values + for the different directives. + """ + retval = {} + + cc_header = 'cache-control' + if 'Cache-Control' in headers: + cc_header = 'Cache-Control' + + if cc_header in headers: + parts = headers[cc_header].split(',') + parts_with_args = [ + tuple([x.strip().lower() for x in part.split("=", 1)]) + for part in parts if -1 != part.find("=") + ] + parts_wo_args = [ + (name.strip().lower(), 1) + for name in parts if -1 == name.find("=") + ] + retval = dict(parts_with_args + parts_wo_args) + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if 'no-cache' in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if 'max-age' in cc and cc['max-age'] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug('No cache entry available') + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning('Cache entry deserialization failed, entry ignored') + return False + + # If we have a cached 301, return it immediately. We don't + # need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if resp.status == 301: + msg = ('Returning cached "301 Moved Permanently" response ' + '(ignoring date and etag information)') + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or 'date' not in headers: + if 'etag' not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug('Purging cached response: no date or etag') + self.cache.delete(cache_url) + logger.debug('Ignoring cached response: no date') + return False + + now = time.time() + date = calendar.timegm( + parsedate_tz(headers['date']) + ) + current_age = max(0, now - date) + logger.debug('Current age based on date: %i', current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if 'max-age' in resp_cc and resp_cc['max-age'].isdigit(): + freshness_lifetime = int(resp_cc['max-age']) + logger.debug('Freshness lifetime from max-age: %i', + freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif 'expires' in headers: + expires = parsedate_tz(headers['expires']) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", + freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if 'max-age' in cc: + try: + freshness_lifetime = int(cc['max-age']) + logger.debug('Freshness lifetime from request max-age: %i', + freshness_lifetime) + except ValueError: + freshness_lifetime = 0 + + if 'min-fresh' in cc: + try: + min_fresh = int(cc['min-fresh']) + except ValueError: + min_fresh = 0 + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug('Adjusted current age from min-fresh: %i', + current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug('%i > %i', freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if 'etag' not in headers: + logger.debug( + 'The cached response is "stale" with no etag, purging' + ) + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if 'etag' in headers: + new_headers['If-None-Match'] = headers['ETag'] + + if 'last-modified' in headers: + new_headers['If-Modified-Since'] = headers['Last-Modified'] + + return new_headers + + def cache_response(self, request, response, body=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = [200, 203, 300, 301] + if response.status not in cacheable_status_codes: + logger.debug( + 'Status code %s not in %s', + response.status, + cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if (body is not None and + "content-length" in response_headers and + response_headers["content-length"].isdigit() and + int(response_headers["content-length"]) != len(body)): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if cc.get('no-store'): + no_store = True + logger.debug('Response header has "no-store"') + if cc_req.get('no-store'): + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + + # If we've been given an etag, then keep the response + if self.cache_etags and 'etag' in response_headers: + logger.debug('Caching due to etag') + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body=body), + ) + + # Add to the cache any 301s. We do this before looking that + # the Date headers. + elif response.status == 301: + logger.debug('Caching permanant redirect') + self.cache.set( + cache_url, + self.serializer.dumps(request, response) + ) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif 'date' in response_headers: + # cache when there is a max-age > 0 + if cc and cc.get('max-age'): + if cc['max-age'].isdigit() and int(cc['max-age']) > 0: + logger.debug('Caching b/c date exists and max-age > 0') + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body=body), + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif 'expires' in response_headers: + if response_headers['expires']: + logger.debug('Caching b/c of expires header') + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body=body), + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads( + request, + self.cache.get(cache_url) + ) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = [ + "content-length", + ] + + cached_response.headers.update( + dict((k, v) for k, v in response.headers.items() + if k.lower() not in excluded_headers) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set( + cache_url, + self.serializer.dumps(request, cached_response), + ) + + return cached_response diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/filewrapper.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000000000000000000000000000000000000..f1e1ce05598cf301c855bf1a00a66bbdabcea404 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,78 @@ +from io import BytesIO + + +class CallbackFileWrapper(object): + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + """ + + def __init__(self, fp, callback): + self.__buf = BytesIO() + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name): + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__('_CallbackFileWrapper__fp') + return getattr(fp, name) + + def __is_fp_closed(self): + try: + return self.__fp.fp is None + except AttributeError: + pass + + try: + return self.__fp.closed + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self): + if self.__callback: + self.__callback(self.__buf.getvalue()) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + def read(self, amt=None): + data = self.__fp.read(amt) + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt): + data = self.__fp._safe_read(amt) + if amt == 2 and data == b'\r\n': + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/heuristics.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000000000000000000000000000000000000..94715a4e7e3865792275c806d22931868953a5a2 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,138 @@ +import calendar +import time + +from email.utils import formatdate, parsedate, parsedate_tz + +from datetime import datetime, timedelta + +TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" + + +def expire_after(delta, date=None): + date = date or datetime.now() + return date + delta + + +def datetime_to_header(dt): + return formatdate(calendar.timegm(dt.timetuple())) + + +class BaseHeuristic(object): + + def warning(self, response): + """ + Return a valid 1xx warning header value describing the cache + adjustments. + + The response is provided too allow warnings like 113 + http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need + to explicitly say response is over 24 hours old. + """ + return '110 - "Response is Stale"' + + def update_headers(self, response): + """Update the response headers with any new headers. + + NOTE: This SHOULD always include some Warning header to + signify that the response was cached by the client, not + by way of the provided headers. + """ + return {} + + def apply(self, response): + updated_headers = self.update_headers(response) + + if updated_headers: + response.headers.update(updated_headers) + warning_header_value = self.warning(response) + if warning_header_value is not None: + response.headers.update({'Warning': warning_header_value}) + + return response + + +class OneDayCache(BaseHeuristic): + """ + Cache the response by providing an expires 1 day in the + future. + """ + def update_headers(self, response): + headers = {} + + if 'expires' not in response.headers: + date = parsedate(response.headers['date']) + expires = expire_after(timedelta(days=1), + date=datetime(*date[:6])) + headers['expires'] = datetime_to_header(expires) + headers['cache-control'] = 'public' + return headers + + +class ExpiresAfter(BaseHeuristic): + """ + Cache **all** requests for a defined time period. + """ + + def __init__(self, **kw): + self.delta = timedelta(**kw) + + def update_headers(self, response): + expires = expire_after(self.delta) + return { + 'expires': datetime_to_header(expires), + 'cache-control': 'public', + } + + def warning(self, response): + tmpl = '110 - Automatically cached for %s. Response might be stale' + return tmpl % self.delta + + +class LastModified(BaseHeuristic): + """ + If there is no Expires header already, fall back on Last-Modified + using the heuristic from + http://tools.ietf.org/html/rfc7234#section-4.2.2 + to calculate a reasonable value. + + Firefox also does something like this per + https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ + http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 + Unlike mozilla we limit this to 24-hr. + """ + cacheable_by_default_statuses = set([ + 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 + ]) + + def update_headers(self, resp): + headers = resp.headers + + if 'expires' in headers: + return {} + + if 'cache-control' in headers and headers['cache-control'] != 'public': + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if 'date' not in headers or 'last-modified' not in headers: + return {} + + date = calendar.timegm(parsedate_tz(headers['date'])) + last_modified = parsedate(headers['last-modified']) + if date is None or last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {'expires': time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp): + return None diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/serialize.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000000000000000000000000000000000000..8f9c589f252091687b586a6be9837303ea8d9a6a --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,196 @@ +import base64 +import io +import json +import zlib + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_encode_bytes(b): + return base64.b64encode(b).decode("ascii") + + +def _b64_encode_str(s): + return _b64_encode_bytes(s.encode("utf8")) + + +def _b64_encode(s): + if isinstance(s, text_type): + return _b64_encode_str(s) + return _b64_encode_bytes(s) + + +def _b64_decode_bytes(b): + return base64.b64decode(b.encode("ascii")) + + +def _b64_decode_str(s): + return _b64_decode_bytes(s).decode("utf8") + + +class Serializer(object): + + def dumps(self, request, response, body=None): + response_headers = CaseInsensitiveDict(response.headers) + + if body is None: + body = response.read(decode_content=False) + + # NOTE: 99% sure this is dead code. I'm only leaving it + # here b/c I don't have a test yet to prove + # it. Basically, before using + # `cachecontrol.filewrapper.CallbackFileWrapper`, + # this made an effort to reset the file handle. The + # `CallbackFileWrapper` short circuits this code by + # setting the body as the content is consumed, the + # result being a `body` argument is *always* passed + # into cache_response, and in turn, + # `Serializer.dump`. + response._fp = io.BytesIO(body) + + data = { + "response": { + "body": _b64_encode_bytes(body), + "headers": dict( + (_b64_encode(k), _b64_encode(v)) + for k, v in response.headers.items() + ), + "status": response.status, + "version": response.version, + "reason": _b64_encode_str(response.reason), + "strict": response.strict, + "decode_content": response.decode_content, + }, + } + + # Construct our vary headers + data["vary"] = {} + if "vary" in response_headers: + varied_headers = response_headers['vary'].split(',') + for header in varied_headers: + header = header.strip() + data["vary"][header] = request.headers.get(header, None) + + # Encode our Vary headers to ensure they can be serialized as JSON + data["vary"] = dict( + (_b64_encode(k), _b64_encode(v) if v is not None else v) + for k, v in data["vary"].items() + ) + + return b",".join([ + b"cc=2", + zlib.compress( + json.dumps( + data, separators=(",", ":"), sort_keys=True, + ).encode("utf8"), + ), + ]) + + def loads(self, request, data): + # Short circuit if we've been given an empty set of data + if not data: + return + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + ver = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, "_loads_v{0}".format(ver))(request, data) + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return + + def prepare_response(self, request, cached): + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + if "*" in cached.get("vary", {}): + return + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return + + body_raw = cached["response"].pop("body") + + headers = CaseInsensitiveDict(data=cached['response']['headers']) + if headers.get('transfer-encoding', '') == 'chunked': + headers.pop('transfer-encoding') + + cached['response']['headers'] = headers + + try: + body = io.BytesIO(body_raw) + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode('utf8')) + + return HTTPResponse( + body=body, + preload_content=False, + **cached["response"] + ) + + def _loads_v0(self, request, data): + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return + + def _loads_v1(self, request, data): + try: + cached = pickle.loads(data) + except ValueError: + return + + return self.prepare_response(request, cached) + + def _loads_v2(self, request, data): + try: + cached = json.loads(zlib.decompress(data).decode("utf8")) + except ValueError: + return + + # We need to decode the items that we've base64 encoded + cached["response"]["body"] = _b64_decode_bytes( + cached["response"]["body"] + ) + cached["response"]["headers"] = dict( + (_b64_decode_str(k), _b64_decode_str(v)) + for k, v in cached["response"]["headers"].items() + ) + cached["response"]["reason"] = _b64_decode_str( + cached["response"]["reason"], + ) + cached["vary"] = dict( + (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) + for k, v in cached["vary"].items() + ) + + return self.prepare_response(request, cached) diff --git a/vendor/pip-9.0.3/pip/_vendor/cachecontrol/wrapper.py b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000000000000000000000000000000000000..ea421aa7e712b3950fc30dff914b5240b747ce21 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,21 @@ +from .adapter import CacheControlAdapter +from .cache import DictCache + + +def CacheControl(sess, + cache=None, + cache_etags=True, + serializer=None, + heuristic=None): + + cache = cache or DictCache() + adapter = CacheControlAdapter( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + ) + sess.mount('http://', adapter) + sess.mount('https://', adapter) + + return sess diff --git a/vendor/pip-9.0.3/pip/_vendor/certifi/__init__.py b/vendor/pip-9.0.3/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..556193cefbf1f8b9b65cab70f394e28481af1fea --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where, old_where + +__version__ = "2018.01.18" diff --git a/vendor/pip-9.0.3/pip/_vendor/certifi/__main__.py b/vendor/pip-9.0.3/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..5f1da0dd0c201e8aedc1552ef82a1780eb37276d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/vendor/pip-9.0.3/pip/_vendor/certifi/cacert.pem b/vendor/pip-9.0.3/pip/_vendor/certifi/cacert.pem new file mode 100644 index 0000000000000000000000000000000000000000..101ac98fa42d9eb4b27836e122cc81d495e33c21 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4433 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" +# Serial: 156233699172481 +# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e +# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb +# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE +BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn +aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg +QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 +MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD +VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom +/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR +Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 +4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z +5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 +hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID +AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX +SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l +VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf +peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF +Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW ++qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G1 O=Certplus +# Subject: CN=Certplus Root CA G1 O=Certplus +# Label: "Certplus Root CA G1" +# Serial: 1491911565779898356709731176965615564637713 +# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 +# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 +# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a +iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt +6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP +0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f +6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE +EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN +1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc +h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT +mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV +4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO +WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud +DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd +Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq +hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 +/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS +S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j +2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R +Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr +RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy +6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV +V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 +g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl +++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G2 O=Certplus +# Subject: CN=Certplus Root CA G2 O=Certplus +# Label: "Certplus Root CA G2" +# Serial: 1492087096131536844209563509228951875861589 +# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 +# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a +# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat +93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x +Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj +FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG +SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch +p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal +U5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust +# Subject: CN=OpenTrust Root CA G1 O=OpenTrust +# Label: "OpenTrust Root CA G1" +# Serial: 1492036577811947013770400127034825178844775 +# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da +# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e +# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b +wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX +/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 +77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP +uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx +p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx +Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 +TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W +G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw +vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY +EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 +2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw +DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf +gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS +FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 +V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P +XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I +i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t +TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 +09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky +Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ +AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj +1oxx +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust +# Subject: CN=OpenTrust Root CA G2 O=OpenTrust +# Label: "OpenTrust Root CA G2" +# Serial: 1492012448042702096986875987676935573415441 +# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb +# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b +# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh +/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e +CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 +1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE +FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS +gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X +G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy +YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH +vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 +t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ +gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 +5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w +DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 +nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT +RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT +wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 +t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa +TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 +o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU +3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA +iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f +WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM +S1IK +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust +# Subject: CN=OpenTrust Root CA G3 O=OpenTrust +# Label: "OpenTrust Root CA G3" +# Serial: 1492104908271485653071219941864171170455615 +# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 +# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 +# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx +CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U +cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow +QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl +blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm +3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d +oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 +DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK +BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q +j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx +4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL +BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV +BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw +MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B +LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F +ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem +hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 +EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn +Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 +zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ +96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m +j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g +DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ +8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j +X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH +hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB +KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 +Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL +BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 +BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO +jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 +loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c +qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ +2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ +JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre +zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf +LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ +x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 +oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- diff --git a/vendor/pip-9.0.3/pip/_vendor/certifi/core.py b/vendor/pip-9.0.3/pip/_vendor/certifi/core.py new file mode 100644 index 0000000000000000000000000000000000000000..eab9d1d178dc29a7ab0dd304084e130fb8a82969 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/certifi/core.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os +import warnings + + +class DeprecatedBundleWarning(DeprecationWarning): + """ + The weak security bundle is being deprecated. Please bother your service + provider to get them to stop using cross-signed roots. + """ + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') + + +def old_where(): + warnings.warn( + "The weak security bundle has been removed. certifi.old_where() is now an alias " + "of certifi.where(). Please update your code to use certifi.where() instead. " + "certifi.old_where() will be removed in 2018.", + DeprecatedBundleWarning + ) + return where() + +if __name__ == '__main__': + print(where()) diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/__init__.py b/vendor/pip-9.0.3/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0f9f820ef6e5f21042efd0e9dc18d097388d7207 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/big5freq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000000000000000000000000000000000000..38f32517aa8f6cf5970f7ceddd1a415289184c3e --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# <http://www.edu.tw:81/mandr/> +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/big5prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000000000000000000000000000000000000..98f9970122088c14a5830e091ca8a12fc8e4c563 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/chardistribution.py b/vendor/pip-9.0.3/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 0000000000000000000000000000000000000000..c0395f4a45aaa5c4ba1824a81d8ef8f69b46dc60 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/charsetgroupprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000000000000000000000000000000000000..8b3738efd8ea1e42d196d381d2809beae7f4c649 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/charsetprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000000000000000000000000000000000000..eac4e5986578636ad414648e6015e8b7e9f10432 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/cli/__init__.py b/vendor/pip-9.0.3/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/cli/chardetect.py b/vendor/pip-9.0.3/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000000000000000000000000000000000000..f0a4cc5d79f2b42486631f96558a47093dd6298e --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from chardet import __version__ +from chardet.compat import PY2 +from chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/codingstatemachine.py b/vendor/pip-9.0.3/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 0000000000000000000000000000000000000000..68fba44f14366c448f13db3cf9cf1665af2e498c --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/compat.py b/vendor/pip-9.0.3/pip/_vendor/chardet/compat.py new file mode 100644 index 0000000000000000000000000000000000000000..ddd74687c02a12ecc296ee803997a345e984bc9d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/cp949prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000000000000000000000000000000000000..efd793abca4bf496001a4e46a67557e5a6f16bba --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/enums.py b/vendor/pip-9.0.3/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000000000000000000000000000000000000..04512072251c429e63ed110cdbafaf4b3cca3412 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/escprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000000000000000000000000000000000000..c70493f2b131b32378612044f30173eabbfbc3f4 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/escsm.py b/vendor/pip-9.0.3/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000000000000000000000000000000000000..0069523a04969dd920ea4b43a497162157729174 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/eucjpprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000000000000000000000000000000000000..20ce8f7d15bad9d48a3e0363de2286093a4a28cc --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/euckrfreq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000000000000000000000000000000000000..b68078cb9680de4cca65b1145632a37c5e751c38 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/euckrprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 0000000000000000000000000000000000000000..345a060d0230ada58f769b0f6b55f43a428fc3bd --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/euctwfreq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000000000000000000000000000000000000..ed7a995a3aa311583efa5a47e316d4490e5f3463 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# <http:#www.edu.tw:81/mandr/> + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/euctwprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000000000000000000000000000000000000..35669cc4dd809fa4007ee67c752f1be991135e77 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312freq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000000000000000000000000000000000000..697837bd9a87a77fc468fd1f10dd470d01701362 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000000000000000000000000000000000000..8446d2dd959721cc86d4ae5a7699197454f3aa91 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/hebrewprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000000000000000000000000000000000000..b0e1bf49268203d1f9d14cbe73753d95dc66c8a4 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/jisfreq.py b/vendor/pip-9.0.3/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000000000000000000000000000000000000..83fc082b545106d02622de20f2083e8a7562f96c --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/jpcntx.py b/vendor/pip-9.0.3/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000000000000000000000000000000000000..20044e4bc8f5a9775d82be0ecf387ce752732507 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langbulgarianmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000000000000000000000000000000000000..2aa4fb2e22fc3bfa26b569273c6cb18c4c415dd9 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langcyrillicmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 0000000000000000000000000000000000000000..e5f9a1fd19cca472d785bf90c6395cd11b524766 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langgreekmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000000000000000000000000000000000000..533222166cca9fce442655d9f3098126f50e6140 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langhebrewmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000000000000000000000000000000000000..58f4c875ec926b85256fd3866369fc8a81a14350 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langhungarianmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000000000000000000000000000000000000..bb7c095e1ea6523bd00365384e4c662954c678a0 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langthaimodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000000000000000000000000000000000000..15f94c2df021c9cccc761ebeec80146edbb000c9 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/langturkishmodel.py b/vendor/pip-9.0.3/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000000000000000000000000000000000000..a427a457398de8076cdcefb5a6c391e89500bce8 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/latin1prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000000000000000000000000000000000000..7d1e8c20fb09ddaa0254ae74cbd4425ffdc5dcdc --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/mbcharsetprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000000000000000000000000000000000000..6256ecfd1e2c9ac4cfa3fac359cd12dce85b759c --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/mbcsgroupprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 0000000000000000000000000000000000000000..530abe75e0c00cbfcb2a310d872866f320977d0a --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/mbcssm.py b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000000000000000000000000000000000000..8360d0f284ef394f2980b5bb89548e234385cdf1 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/sbcharsetprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000000000000000000000000000000000000..0adb51de5a210aa36849cd149ed0f4ae424fce42 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/sbcsgroupprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000000000000000000000000000000000000..98e95dc1a3cbc65e97bc726ab7000955132719dd --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/sjisprober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000000000000000000000000000000000000..9e29623bdc54a7c6d11bcc167d71bb44cc9be39d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/universaldetector.py b/vendor/pip-9.0.3/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000000000000000000000000000000000000..7b4e92d6158527736e3d14d6f725edada8f94b00 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/utf8prober.py b/vendor/pip-9.0.3/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000000000000000000000000000000000000..6c3196cc2d7e46e6756580267f5643c6f7b448dd --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/vendor/pip-9.0.3/pip/_vendor/chardet/version.py b/vendor/pip-9.0.3/pip/_vendor/chardet/version.py new file mode 100644 index 0000000000000000000000000000000000000000..bb2a34a70ea760ad1f58979acfc8fa466e30c511 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/__init__.py b/vendor/pip-9.0.3/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..670e6b3970b77529fd65f002a1afda6d28873cce --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/colorama/__init__.py @@ -0,0 +1,7 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.3.7' + diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/ansi.py b/vendor/pip-9.0.3/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000000000000000000000000000000000000..78776588db9410924d8e4af0922fbc3960a37624 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/ansitowin32.py b/vendor/pip-9.0.3/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000000000000000000000000000000000000..b7ff6f2136eec3530563c0fedf226b4b00c52d9d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,236 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +def is_stream_closed(stream): + return not hasattr(stream, 'closed') or stream.closed + + +def is_a_tty(stream): + return hasattr(stream, 'isatty') and stream.isatty() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def write(self, text): + self.__convertor.write(text) + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\[((?:\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\]((?:.|;)*?)(\x07)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not is_stream_closed(wrapped) and not is_a_tty(wrapped)) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not is_stream_closed(wrapped) and is_a_tty(wrapped) + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not is_stream_closed(self.wrapped): + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command in '\x07': # \x07 = BEL + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/initialise.py b/vendor/pip-9.0.3/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000000000000000000000000000000000000..834962a35f76f903c56bf921605b7fe3938088a4 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/colorama/initialise.py @@ -0,0 +1,82 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream + + diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/win32.py b/vendor/pip-9.0.3/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000000000000000000000000000000000000..3d1d2f2d91867ecd8663a2870fededa15b2b9c89 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/colorama/win32.py @@ -0,0 +1,154 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleA + _SetConsoleTitleW.argtypes = [ + wintypes.LPCSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + handles = { + STDOUT: _GetStdHandle(STDOUT), + STDERR: _GetStdHandle(STDERR), + } + + def winapi_test(): + handle = handles[STDOUT] + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = handles[stream_id] + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = handles[stream_id] + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = handles[stream_id] + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = handles[stream_id] + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = handles[stream_id] + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/vendor/pip-9.0.3/pip/_vendor/colorama/winterm.py b/vendor/pip-9.0.3/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000000000000000000000000000000000000..60309d3c07aa4c1a66388d0d2530e7086d46f091 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/colorama/winterm.py @@ -0,0 +1,162 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from . import win32 + + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + if mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + if mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/__init__.py b/vendor/pip-9.0.3/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d186b0a36c3004781c6d058f6999901c44f12c74 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2016 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.2.4' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + def createLock(self): self.lock = None + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/__init__.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..f7dbf4c9aa8314816f9bcbe5357146369ee71391 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/misc.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000000000000000000000000000000000000..cfb318d34f761cde906d8b02dde3f9329688b8c6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/shutil.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000000000000000000000000000000000000..159e49ee8c2aa698aea9a191db91a14716187324 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +import collections +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, collections.Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.cfg b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000000000000000000000000000000000000..1746bd01c1ad915b728ab58b4668c82b2bd578e1 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.cfg @@ -0,0 +1,84 @@ +[posix_prefix] +# Configuration directories. Some of these come straight out of the +# configure script. They are for implementing the other variables, not to +# be used directly in [resource_locations]. +confdir = /etc +datadir = /usr/share +libdir = /usr/lib +statedir = /var +# User resource directory +local = ~/.local/{distribution.name} + +stdlib = {base}/lib/python{py_version_short} +platstdlib = {platbase}/lib/python{py_version_short} +purelib = {base}/lib/python{py_version_short}/site-packages +platlib = {platbase}/lib/python{py_version_short}/site-packages +include = {base}/include/python{py_version_short}{abiflags} +platinclude = {platbase}/include/python{py_version_short}{abiflags} +data = {base} + +[posix_home] +stdlib = {base}/lib/python +platstdlib = {base}/lib/python +purelib = {base}/lib/python +platlib = {base}/lib/python +include = {base}/include/python +platinclude = {base}/include/python +scripts = {base}/bin +data = {base} + +[nt] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2_home] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[nt_user] +stdlib = {userbase}/Python{py_version_nodot} +platstdlib = {userbase}/Python{py_version_nodot} +purelib = {userbase}/Python{py_version_nodot}/site-packages +platlib = {userbase}/Python{py_version_nodot}/site-packages +include = {userbase}/Python{py_version_nodot}/Include +scripts = {userbase}/Scripts +data = {userbase} + +[posix_user] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[osx_framework_user] +stdlib = {userbase}/lib/python +platstdlib = {userbase}/lib/python +purelib = {userbase}/lib/python/site-packages +platlib = {userbase}/lib/python/site-packages +include = {userbase}/include +scripts = {userbase}/bin +data = {userbase} diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000000000000000000000000000000000000..ec28480a656c9d286563bf21e3b02216756165f6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/sysconfig.py @@ -0,0 +1,788 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Access to Python's configuration information.""" + +import codecs +import os +import re +import sys +from os.path import pardir, realpath +try: + import configparser +except ImportError: + import ConfigParser as configparser + + +__all__ = [ + 'get_config_h_filename', + 'get_config_var', + 'get_config_vars', + 'get_makefile_filename', + 'get_path', + 'get_path_names', + 'get_paths', + 'get_platform', + 'get_python_version', + 'get_scheme_names', + 'parse_config_h', +] + + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + + +if sys.executable: + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +else: + # sys.executable can be empty if argv[0] has been changed and Python is + # unable to retrieve the real program name + _PROJECT_BASE = _safe_realpath(os.getcwd()) + +if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +# PC/VS7.1 +if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +# PC/AMD64 +if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + + +def is_python_build(): + for fn in ("Setup.dist", "Setup.local"): + if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): + return True + return False + +_PYTHON_BUILD = is_python_build() + +_cfg_read = False + +def _ensure_cfg_read(): + global _cfg_read + if not _cfg_read: + from ..resources import finder + backport_package = __name__.rsplit('.', 1)[0] + _finder = finder(backport_package) + _cfgfile = _finder.find('sysconfig.cfg') + assert _cfgfile, 'sysconfig.cfg exists' + with _cfgfile.as_stream() as s: + _SCHEMES.readfp(s) + if _PYTHON_BUILD: + for scheme in ('posix_prefix', 'posix_home'): + _SCHEMES.set(scheme, 'include', '{srcdir}/Include') + _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') + + _cfg_read = True + + +_SCHEMES = configparser.RawConfigParser() +_VAR_REPL = re.compile(r'\{([^{]*?)\}') + +def _expand_globals(config): + _ensure_cfg_read() + if config.has_section('globals'): + globals = config.items('globals') + else: + globals = tuple() + + sections = config.sections() + for section in sections: + if section == 'globals': + continue + for option, value in globals: + if config.has_option(section, option): + continue + config.set(section, option, value) + config.remove_section('globals') + + # now expanding local variables defined in the cfg file + # + for section in config.sections(): + variables = dict(config.items(section)) + + def _replacer(matchobj): + name = matchobj.group(1) + if name in variables: + return variables[name] + return matchobj.group(0) + + for option, value in config.items(section): + config.set(section, option, _VAR_REPL.sub(_replacer, value)) + +#_expand_globals(_SCHEMES) + + # FIXME don't rely on sys.version here, its format is an implementation detail + # of CPython, use sys.version_info or sys.hexversion +_PY_VERSION = sys.version.split()[0] +_PY_VERSION_SHORT = sys.version[:3] +_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] +_PREFIX = os.path.normpath(sys.prefix) +_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +_CONFIG_VARS = None +_USER_BASE = None + + +def _subst_vars(path, local_vars): + """In the string `path`, replace tokens like {some.thing} with the + corresponding value from the map `local_vars`. + + If there is no corresponding value, leave the token unchanged. + """ + def _replacer(matchobj): + name = matchobj.group(1) + if name in local_vars: + return local_vars[name] + elif name in os.environ: + return os.environ[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, path) + + +def _extend_dict(target_dict, other_dict): + target_keys = target_dict.keys() + for key, value in other_dict.items(): + if key in target_keys: + continue + target_dict[key] = value + + +def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} + _extend_dict(vars, get_config_vars()) + + for key, value in _SCHEMES.items(scheme): + if os.name in ('posix', 'nt'): + value = os.path.expanduser(value) + res[key] = os.path.normpath(_subst_vars(value, vars)) + return res + + +def format_value(value, vars): + def _replacer(matchobj): + name = matchobj.group(1) + if name in vars: + return vars[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, value) + + +def _get_default_scheme(): + if os.name == 'posix': + # the default scheme for posix is posix_prefix + return 'posix_prefix' + return os.name + + +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # what about 'os2emx', 'riscos' ? + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + return env_base + else: + return joinuser(base, "Python") + + if sys.platform == "darwin": + framework = get_config_var("PYTHONFRAMEWORK") + if framework: + if env_base: + return env_base + else: + return joinuser("~", "Library", framework, "%d.%d" % + sys.version_info[:2]) + + if env_base: + return env_base + else: + return joinuser("~", ".local") + + +def _parse_makefile(filename, vars=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + # Regexes needed for parsing Makefile (and similar syntaxes, + # like old-style Setup files). + _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") + _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") + _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + + if vars is None: + vars = {} + done = {} + notdone = {} + + with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: + lines = f.readlines() + + for line in lines: + if line.startswith('#') or line.strip() == '': + continue + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = v.strip() + # `$$' is a literal `$' in make + tmpv = v.replace('$$', '') + + if "$" in tmpv: + notdone[n] = v + else: + try: + v = int(v) + except ValueError: + # insert literal `$' + done[n] = v.replace('$$', '$') + else: + done[n] = v + + # do variable interpolation here + variables = list(notdone.keys()) + + # Variables with a 'PY_' prefix in the makefile. These need to + # be made available without that prefix through sysconfig. + # Special care is needed to ensure that variable expansion works, even + # if the expansion uses the name without a prefix. + renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') + + while len(variables) > 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On macOS before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub('-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub('-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search('-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub('-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'<key>ProductUserVisibleVersion</key>\s*' + r'<string>(.*?)</string>', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall('-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/tarfile.py b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000000000000000000000000000000000000..d66d8566374be661085213468bce338c6a747702 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack("<L", int(time.time())) + self.__write(b"\037\213\010\010" + timestamp + b"\002\377") + if self.name.endswith(".gz"): + self.name = self.name[:-3] + # RFC1952 says we must use ISO-8859-1 for the FNAME field. + self.__write(self.name.encode("iso-8859-1", "replace") + NUL) + + def write(self, s): + """Write string s to the stream. + """ + if self.comptype == "gz": + self.crc = self.zlib.crc32(s, self.crc) + self.pos += len(s) + if self.comptype != "tar": + s = self.cmp.compress(s) + self.__write(s) + + def __write(self, s): + """Write string s to the stream if a whole new block + is ready to be written. + """ + self.buf += s + while len(self.buf) > self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff)) + self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) + + if not self._extfileobj: + self.fileobj.close() + + self.closed = True + + def _init_read_gz(self): + """Initialize for reading a gzip compressed fileobj. + """ + self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) + self.dbuf = b"" + + # taken from gzip.GzipFile with some alterations + if self.__read(2) != b"\037\213": + raise ReadError("not a gzip file") + if self.__read(1) != b"\010": + raise CompressionError("unsupported compression method") + + flag = ord(self.__read(1)) + self.__read(6) + + if flag & 4: + xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) + self.read(xlen) + if flag & 8: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 16: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 2: + self.__read(2) + + def tell(self): + """Return the stream's file pointer position. + """ + return self.pos + + def seek(self, pos=0): + """Set the stream's file pointer to pos. Negative seeking + is forbidden. + """ + if pos - self.pos >= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/compat.py b/vendor/pip-9.0.3/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000000000000000000000000000000000000..2b198dd57dd57270f4415ebfe0ebe0ba1a99d761 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/compat.py @@ -0,0 +1,1111 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2016 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +try: + import ssl +except ImportError: + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + class CertificateError(ValueError): + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + _fsencoding = sys.getfilesystemencoding() + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile("coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from imp import cache_from_source +except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + #print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + #rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/database.py b/vendor/pip-9.0.3/pip/_vendor/distlib/database.py new file mode 100644 index 0000000000000000000000000000000000000000..c31442640894a3170990a31101e1df1c225a872d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/database.py @@ -0,0 +1,1312 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2016 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, WHEEL_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if not version is None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.finder = finder = resources.finder_for_path(path) + if finder is None: + import pdb; pdb.set_trace () + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find('METADATA') + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, + path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + try: + r = finder.find('REQUESTED') + except AttributeError: + import pdb; pdb.set_trace () + self.requested = r is not None + + def __repr__(self): + return '<InstalledDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + if path.endswith('.egg'): + if os.path.isdir(path): + meta_path = os.path.join(path, 'EGG-INFO', 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(path, 'EGG-INFO', 'requires.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + return metadata + + def __repr__(self): + return '<EggInfoDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/index.py b/vendor/pip-9.0.3/pip/_vendor/distlib/index.py new file mode 100644 index 0000000000000000000000000000000000000000..6803dd283fd5ba94b93c3e45871827223252ec2d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/index.py @@ -0,0 +1,515 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import cached_property, zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.python.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + self.rpc_proxy = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the actual work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + if self.rpc_proxy is None: + self.rpc_proxy = ServerProxy(self.url, timeout=3.0) + return self.rpc_proxy.search(terms, operator or 'and') diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/locators.py b/vendor/pip-9.0.3/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000000000000000000000000000000000000..14789ef5d6167caea2e280328cd0b4bae74fe4ee --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/locators.py @@ -0,0 +1,1283 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, + queue, quote, unescape, string_types, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, + Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata +from .util import (cached_property, parse_credentials, ensure_slash, + split_filename, get_project_data, parse_requirement, + parse_name_and_version, ServerProxy, normalize_name) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +HASHER_HASH = re.compile('^(\w+)=([a-f0-9]+)') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'https://pypi.python.org/pypi' + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + return client.list_packages() + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, + headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf',) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl',) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + # If get_project() is called from locate(), the matcher instance + # is set from the requirement passed to locate(). See issue #18 for + # why this can be useful to know. + self.matcher = None + self.errors = queue.Queue() + + def get_errors(self): + """ + Return any errors which have occurred. + """ + result = [] + while not self.errors.empty(): # pragma: no cover + try: + e = self.errors.get(False) + result.append(e) + except self.errors.Empty: + continue + self.errors.task_done() + return result + + def clear_errors(self): + """ + Clear any errors which may have been logged. + """ + # Just get the errors and throw them away + self.get_errors() + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + + If called from a locate() request, self.matcher will be set to a + matcher for the requirement to satisfy, otherwise it will be None. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + self.clear_errors() + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + basename = posixpath.basename(t.path) + compatible = True + is_wheel = basename.endswith('.whl') + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme != 'https', 'pypi.python.org' in t.netloc, + is_wheel, compatible, basename) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implementation favours https:// URLs over http://, archives + from PyPI over those from other locations, wheel compatibility (if a + wheel) and then the archive name. + """ + result = url2 + if url1: + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if is_compatible(wheel, self.wheel_tags): + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif path.endswith(self.downloadable_extensions): + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at keys of the form + 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release ' + 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\s*=\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\s\n]*))\s+)? +href\s*=\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\s\n]*)) +(\s+rel\s*=\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux-(i\d86|x86_64|arm\w+)|' + r'win(32|-amd64)|macosx-?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile('<a href=[^>]*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.python.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*' + r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/manifest.py b/vendor/pip-9.0.3/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000000000000000000000000000000000000..9f0336453c8d01a6e250b37c7468435b71d555a1 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/manifest.py @@ -0,0 +1,393 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re +import sys + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + +# +# Due to the different results returned by fnmatch.translate, we need +# to do slightly different processing for Python 2.7 and 3.2 ... this needed +# to be brought in for Python 3.6 onwards. +# +_PYTHON_VERSION = sys.version_info[:2] + +class Manifest(object): + """A list of files built by on exploring the filesystem and filtered by + applying various patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=True) + #if not found: + # logger.warning('no previously-included files ' + # 'found matching %r', pattern) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=False) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found anywhere in ' + # 'distribution', pattern) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, prefix=thedir) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found under directory %r', + # pattern, thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: # pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ('include', 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects <pattern1> <pattern2> ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects <dir> <pattern1> <pattern2> ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single <dir_pattern>' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) + return pattern_re diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/markers.py b/vendor/pip-9.0.3/pip/_vendor/distlib/markers.py new file mode 100644 index 0000000000000000000000000000000000000000..afb19c62e02f7a24e971351e0a8c2ccb08d382cb --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/markers.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Parser for the environment markers micro-language defined in PEP 345.""" + +import ast +import os +import sys +import platform + +from .compat import python_implementation, string_types +from .util import in_venv + +__all__ = ['interpret'] + + +class Evaluator(object): + """ + A limited evaluator for Python expressions. + """ + + operators = { + 'eq': lambda x, y: x == y, + 'gt': lambda x, y: x > y, + 'gte': lambda x, y: x >= y, + 'in': lambda x, y: x in y, + 'lt': lambda x, y: x < y, + 'lte': lambda x, y: x <= y, + 'not': lambda x: not x, + 'noteq': lambda x, y: x != y, + 'notin': lambda x, y: x not in y, + } + + allowed_values = { + 'sys_platform': sys.platform, + 'python_version': '%s.%s' % sys.version_info[:2], + # parsing sys.platform is not reliable, but there is no other + # way to get e.g. 2.7.2+, and the PEP is defined with sys.version + 'python_full_version': sys.version.split(' ', 1)[0], + 'os_name': os.name, + 'platform_in_venv': str(in_venv()), + 'platform_release': platform.release(), + 'platform_version': platform.version(), + 'platform_machine': platform.machine(), + 'platform_python_implementation': python_implementation(), + } + + def __init__(self, context=None): + """ + Initialise an instance. + + :param context: If specified, names are looked up in this mapping. + """ + self.context = context or {} + self.source = None + + def get_fragment(self, offset): + """ + Get the part of the source which is causing a problem. + """ + fragment_len = 10 + s = '%r' % (self.source[offset:offset + fragment_len]) + if offset + fragment_len < len(self.source): + s += '...' + return s + + def get_handler(self, node_type): + """ + Get a handler for the specified AST node type. + """ + return getattr(self, 'do_%s' % node_type, None) + + def evaluate(self, node, filename=None): + """ + Evaluate a source string or node, using ``filename`` when + displaying errors. + """ + if isinstance(node, string_types): + self.source = node + kwargs = {'mode': 'eval'} + if filename: + kwargs['filename'] = filename + try: + node = ast.parse(node, **kwargs) + except SyntaxError as e: + s = self.get_fragment(e.offset) + raise SyntaxError('syntax error %s' % s) + node_type = node.__class__.__name__.lower() + handler = self.get_handler(node_type) + if handler is None: + if self.source is None: + s = '(source not available)' + else: + s = self.get_fragment(node.col_offset) + raise SyntaxError("don't know how to evaluate %r %s" % ( + node_type, s)) + return handler(node) + + def get_attr_key(self, node): + assert isinstance(node, ast.Attribute), 'attribute node expected' + return '%s.%s' % (node.value.id, node.attr) + + def do_attribute(self, node): + if not isinstance(node.value, ast.Name): + valid = False + else: + key = self.get_attr_key(node) + valid = key in self.context or key in self.allowed_values + if not valid: + raise SyntaxError('invalid expression: %s' % key) + if key in self.context: + result = self.context[key] + else: + result = self.allowed_values[key] + return result + + def do_boolop(self, node): + result = self.evaluate(node.values[0]) + is_or = node.op.__class__ is ast.Or + is_and = node.op.__class__ is ast.And + assert is_or or is_and + if (is_and and result) or (is_or and not result): + for n in node.values[1:]: + result = self.evaluate(n) + if (is_or and result) or (is_and and not result): + break + return result + + def do_compare(self, node): + def sanity_check(lhsnode, rhsnode): + valid = True + if isinstance(lhsnode, ast.Str) and isinstance(rhsnode, ast.Str): + valid = False + #elif (isinstance(lhsnode, ast.Attribute) + # and isinstance(rhsnode, ast.Attribute)): + # klhs = self.get_attr_key(lhsnode) + # krhs = self.get_attr_key(rhsnode) + # valid = klhs != krhs + if not valid: + s = self.get_fragment(node.col_offset) + raise SyntaxError('Invalid comparison: %s' % s) + + lhsnode = node.left + lhs = self.evaluate(lhsnode) + result = True + for op, rhsnode in zip(node.ops, node.comparators): + sanity_check(lhsnode, rhsnode) + op = op.__class__.__name__.lower() + if op not in self.operators: + raise SyntaxError('unsupported operation: %r' % op) + rhs = self.evaluate(rhsnode) + result = self.operators[op](lhs, rhs) + if not result: + break + lhs = rhs + lhsnode = rhsnode + return result + + def do_expression(self, node): + return self.evaluate(node.body) + + def do_name(self, node): + valid = False + if node.id in self.context: + valid = True + result = self.context[node.id] + elif node.id in self.allowed_values: + valid = True + result = self.allowed_values[node.id] + if not valid: + raise SyntaxError('invalid expression: %s' % node.id) + return result + + def do_str(self, node): + return node.s + + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + return Evaluator(execution_context).evaluate(marker.strip()) diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/metadata.py b/vendor/pip-9.0.3/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000000000000000000000000000000000000..75bfd68ec78bd9112f699b4509491a9cf747f622 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1068 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '2.0'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + + return '2.0' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifiers', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ('maintainer', 'Maintainer'), + ('maintainer_email', 'Maintainer-email'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + for key, field_name in mapping_1_1: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile('^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + 'license': 'License', + 'summary': 'Summary', + 'description': 'Description', + 'classifiers': 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + for nk, ok in self.LEGACY_MAPPING.items(): + if nk in nmd: + result[ok] = nmd[nk] + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: other fields such as contacts + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/resources.py b/vendor/pip-9.0.3/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000000000000000000000000000000000000..f07cde2591e9879850514049df777a86f92c387e --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2016 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import shutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/scripts.py b/vendor/pip-9.0.3/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000000000000000000000000000000000000..792fc2e1fb1f668024516b52a424a45bd123be04 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/scripts.py @@ -0,0 +1,384 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%s" + type="win32"/> + + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly>'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = '''# -*- coding: utf-8 -*- +if __name__ == '__main__': + import sys, re + + def _resolve(module, func): + __import__(module) + mod = sys.modules[module] + parts = func.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + try: + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + + func = _resolve('%(module)s', '%(func)s') + rc = func() # None interpreted as 0 + except Exception as e: # only supporting Python >= 2.6 + sys.stderr.write('%%s\\n' %% e) + rc = 1 + sys.exit(rc) +''' + + +def _enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + # Normalise case for Windows + executable = os.path.normcase(executable) + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = _enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = b'#!' + executable + post_interp + b'\n' + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not use_launcher: + script_bytes = shebang + linesep + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + linesep + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + name = entry.name + scriptnames = set() + if '' in self.variants: + scriptnames.add(name) + if 'X' in self.variants: + scriptnames.add('%s%s' % (name, sys.version[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s' % (name, sys.version[:3])) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + result = finder(distlib_package).find(name).bytes + return result + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/t32.exe b/vendor/pip-9.0.3/pip/_vendor/distlib/t32.exe new file mode 100644 index 0000000000000000000000000000000000000000..836211d848ec0ba46667d33cfade3348888062ae Binary files /dev/null and b/vendor/pip-9.0.3/pip/_vendor/distlib/t32.exe differ diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/t64.exe b/vendor/pip-9.0.3/pip/_vendor/distlib/t64.exe new file mode 100644 index 0000000000000000000000000000000000000000..a401b59d602d4823e0a69138a0268f0bfbec3de2 Binary files /dev/null and b/vendor/pip-9.0.3/pip/_vendor/distlib/t64.exe differ diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/util.py b/vendor/pip-9.0.3/pip/_vendor/distlib/util.py new file mode 100644 index 0000000000000000000000000000000000000000..aadc87435d51ac74e6af16046ec12f2f1f2f51b0 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/util.py @@ -0,0 +1,1611 @@ +# +# Copyright (C) 2012-2016 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import shutil +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, + cache_from_source, urlopen, urljoin, httplib, xmlrpclib, + splittype, HTTPHandler, BaseConfigurator, valid_ident, + Container, configparser, URLError, ZipFile, fsdecode, + unquote) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code for name + optional constraints + optional extras +# +# e.g. 'foo >= 1.2, < 2.0 [bar, baz]' +# +# The regex can seem a bit hairy, so we build it up out of smaller pieces +# which are manageable. +# + +COMMA = r'\s*,\s*' +COMMA_RE = re.compile(COMMA) + +IDENT = r'(\w|[.-])+' +EXTRA_IDENT = r'(\*|:(\*|\w+):|' + IDENT + ')' +VERSPEC = IDENT + r'\*?' + +RELOP = '([<>=!~]=)|[<>]' + +# +# The first relop is optional - if absent, will be taken as '~=' +# +BARE_CONSTRAINTS = ('(' + RELOP + r')?\s*(' + VERSPEC + ')(' + COMMA + '(' + + RELOP + r')\s*(' + VERSPEC + '))*') + +DIRECT_REF = '(from\s+(?P<diref>.*))' + +# +# Either the bare constraints or the bare constraints in parentheses +# +CONSTRAINTS = (r'\(\s*(?P<c1>' + BARE_CONSTRAINTS + '|' + DIRECT_REF + + r')\s*\)|(?P<c2>' + BARE_CONSTRAINTS + '\s*)') + +EXTRA_LIST = EXTRA_IDENT + '(' + COMMA + EXTRA_IDENT + ')*' +EXTRAS = r'\[\s*(?P<ex>' + EXTRA_LIST + r')?\s*\]' +REQUIREMENT = ('(?P<dn>' + IDENT + r')\s*(' + EXTRAS + r'\s*)?(\s*' + + CONSTRAINTS + ')?$') +REQUIREMENT_RE = re.compile(REQUIREMENT) + +# +# Used to scan through the constraints +# +RELOP_IDENT = '(?P<op>' + RELOP + r')\s*(?P<vn>' + VERSPEC + ')' +RELOP_IDENT_RE = re.compile(RELOP_IDENT) + +def parse_requirement(s): + + def get_constraint(m): + d = m.groupdict() + return d['op'], d['vn'] + + result = None + m = REQUIREMENT_RE.match(s) + if m: + d = m.groupdict() + name = d['dn'] + cons = d['c1'] or d['c2'] + if not d['diref']: + url = None + else: + # direct reference + cons = None + url = d['diref'].strip() + if not cons: + cons = None + constr = '' + rs = d['dn'] + else: + if cons[0] not in '<>!=': + cons = '~=' + cons + iterator = RELOP_IDENT_RE.finditer(cons) + cons = [get_constraint(m) for m in iterator] + rs = '%s (%s)' % (name, ', '.join(['%s %s' % con for con in cons])) + if not d['ex']: + extras = None + else: + extras = COMMA_RE.split(d['ex']) + result = Container(name=name, constraints=cons, extras=extras, + requirement=rs, source=s, url=url) + return result + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(base, path): + # normalizes and returns a lstripped-/-separated path + base = base.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(base) + return path[len(base):].lstrip('/') + + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): +# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +# changes to the stub launcher mean that sys.executable always points +# to the stub on macOS +# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +# in os.environ): +# result = os.environ['__PYVENV_LAUNCHER__'] +# else: +# result = sys.executable +# return result + result = os.path.normcase(sys.executable) + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + #entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + with open(path, 'wb') as f: + f.write(data.encode(encoding)) + self.record_as_written(path) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + py_compile.compile(path, dpath, diagpath, True) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.+])+) + \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) + \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.split('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*' + r'\(\s*(?P<ver>[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + if ssl: + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + +# +# Configurator functionality +# + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + +# +# Mixin for running subprocesses and capturing their output +# + +class SubprocessMixin(object): + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/version.py b/vendor/pip-9.0.3/pip/_vendor/distlib/version.py new file mode 100644 index 0000000000000000000000000000000000000000..48c17c0a6ff39f55bccca31222caa28d2a1ccb5a --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/version.py @@ -0,0 +1,742 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2016 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + dist_re = re.compile(r"^(\w[\s\w'.-]*)(\((.*)\))?") + comp_re = re.compile(r'^(<=|>=|<|>|!=|={2,3}|~=)?\s*([^\s,]+)$') + num_re = re.compile(r'^\d+(\.\d+)*$') + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + m = self.dist_re.match(s) + if not m: + raise ValueError('Not valid: %r' % s) + groups = m.groups('') + self.name = groups[0].strip() + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if groups[2]: + constraints = [c.strip() for c in groups[2].split(',')] + for c in constraints: + m = self.comp_re.match(c) + if not m: + raise ValueError('Invalid %r in %r' % (c, s)) + groups = m.groups() + op = groups[0] or '~=' + s = groups[1] + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + if not self.num_re.match(vn): + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + r'(\.(post)(\d+))?(\.(dev)(\d+))?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile('^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/w32.exe b/vendor/pip-9.0.3/pip/_vendor/distlib/w32.exe new file mode 100644 index 0000000000000000000000000000000000000000..85a90a5f51a9596679a7365eadd3352443b95782 Binary files /dev/null and b/vendor/pip-9.0.3/pip/_vendor/distlib/w32.exe differ diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/w64.exe b/vendor/pip-9.0.3/pip/_vendor/distlib/w64.exe new file mode 100644 index 0000000000000000000000000000000000000000..b3aea316f61163e2637a7c0b0a96cd3c664b54dc Binary files /dev/null and b/vendor/pip-9.0.3/pip/_vendor/distlib/w64.exe differ diff --git a/vendor/pip-9.0.3/pip/_vendor/distlib/wheel.py b/vendor/pip-9.0.3/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000000000000000000000000000000000000..2952b8e0b3142afd86317e58d81ed6da787c2b37 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distlib/wheel.py @@ -0,0 +1,978 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2016 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +import distutils.util +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp') +else: + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if sysconfig.get_config_var('WITH_PYMALLOC'): + parts.append('m') + if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: + parts.append('u') + return ''.join(parts) + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))? +-(?P<py>\w+\d+(\.\w+\d+)*) +-(?P<bi>\w+) +-(?P<ar>\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if file_version < (1, 1): + fn = 'METADATA' + else: + fn = METADATA_FILENAME + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + except KeyError: + raise ValueError('Invalid wheel, because %s is ' + 'missing' % fn) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy for sorting + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + records.sort() + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' %s' % v.flags + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + sys.version[:3]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = not path.endswith(METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match('(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/vendor/pip-9.0.3/pip/_vendor/distro.py b/vendor/pip-9.0.3/pip/_vendor/distro.py new file mode 100644 index 0000000000000000000000000000000000000000..9e7daad2bb476cf1712c3f404b6d541df33d7230 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/distro.py @@ -0,0 +1,1081 @@ +# Copyright 2015,2016 Nir Cohen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is a renewed alternative implementation for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.7 is expected to remove it +altogether. Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and is also expected to be removed in Python 3.7. +Still, there are many cases in which access to Linux distribution information +is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ for +more information. +""" + +import os +import re +import sys +import json +import shlex +import logging +import subprocess + + +if not sys.platform.startswith('linux'): + raise ImportError('Unsupported platform: {0}'.format(sys.platform)) + +_UNIXCONFDIR = '/etc' +_OS_RELEASE_BASENAME = 'os-release' + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = {} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux + 'redhatenterpriseworkstation': 'rhel', # RHEL 6.7 +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + 'redhat': 'rhel', # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( + r'(\w+)[-_](release|version)$') + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + 'debian_version', + 'lsb-release', + 'oem-release', + _OS_RELEASE_BASENAME, + 'system-release' +) + + +def linux_distribution(full_distribution_name=True): + """ + Return information about the current Linux distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the Linux distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular Linux distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current Linux distribution, as a + machine-readable string. + + For a number of Linux distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amazon" Amazon Linux + "arch" Arch Linux + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the Linux distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty=False): + """ + Return the name of the current Linux distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "<name>" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "<name>" field of the distro release file, appended + with the value of the pretty version ("<version_id>" and "<codename>" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + """ + Return the version of the current Linux distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "<version_id>" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + """ + Return the version of the current Linux distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best=False): + """ + Return the major version of the current Linux distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best=False): + """ + Return the minor version of the current Linux distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best=False): + """ + Return the build number of the current Linux distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like(): + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current Linux distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + <http://www.freedesktop.org/software/systemd/man/os-release.html>`_. + """ + return _distro.like() + + +def codename(): + """ + Return the codename for the release of the current Linux distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "<codename>" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + """ + Return certain machine-readable information items about the current Linux + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current Linux distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current Linux distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current Linux distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current Linux distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute): + """ + Return a single named information item from the lsb_release command output + data source of the current Linux distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current Linux distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +class LinuxDistribution(object): + """ + Provides information about a Linux distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current Linux distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__(self, + include_lsb=True, + os_release_file='', + distro_release_file=''): + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + Raises: + + * :py:exc:`IOError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had + some issue (other than not being available in the program execution + path). + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.os_release_file = os_release_file or \ + os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) + self.distro_release_file = distro_release_file or '' # updated later + self._os_release_info = self._get_os_release_info() + self._lsb_release_info = self._get_lsb_release_info() \ + if include_lsb else {} + self._distro_release_info = self._get_distro_release_info() + + def __repr__(self): + """Return repr of all info + """ + return \ + "LinuxDistribution(" \ + "os_release_file={0!r}, " \ + "distro_release_file={1!r}, " \ + "_os_release_info={2!r}, " \ + "_lsb_release_info={3!r}, " \ + "_distro_release_info={4!r})".format( + self.os_release_file, + self.distro_release_file, + self._os_release_info, + self._lsb_release_info, + self._distro_release_info) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the Linux distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self.codename() + ) + + def id(self): + """Return the distro ID of the Linux distribution, as a string. + + For details, see :func:`distro.id`. + """ + def normalize(distro_id, table): + distro_id = distro_id.lower().replace(' ', '_') + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr('distributor_id') + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return '' + + def name(self, pretty=False): + """ + Return the name of the Linux distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = self.os_release_attr('name') \ + or self.lsb_release_attr('distributor_id') \ + or self.distro_release_attr('name') + if pretty: + name = self.os_release_attr('pretty_name') \ + or self.lsb_release_attr('description') + if not name: + name = self.distro_release_attr('name') + version = self.version(pretty=True) + if version: + name = name + ' ' + version + return name or '' + + def version(self, pretty=False, best=False): + """ + Return the version of the Linux distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr('version_id'), + self.lsb_release_attr('release'), + self.distro_release_attr('version_id'), + self._parse_distro_release_content( + self.os_release_attr('pretty_name')).get('version_id', ''), + self._parse_distro_release_content( + self.lsb_release_attr('description')).get('version_id', '') + ] + version = '' + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == '': + version = v + else: + for v in versions: + if v != '': + version = v + break + if pretty and version and self.codename(): + version = u'{0} ({1})'.format(version, self.codename()) + return version + + def version_parts(self, best=False): + """ + Return the version of the Linux distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or '', build_number or '' + return '', '', '' + + def major_version(self, best=False): + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best=False): + """ + Return the minor version number of the Linux distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best=False): + """ + Return the build number of the Linux distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self): + """ + Return the IDs of distributions that are like the Linux distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the Linux distribution. + + For details, see :func:`distro.codename`. + """ + return self.os_release_attr('codename') \ + or self.lsb_release_attr('codename') \ + or self.distro_release_attr('codename') \ + or '' + + def info(self, pretty=False, best=False): + """ + Return certain machine-readable information about the Linux + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best) + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the Linux distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the Linux + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the Linux + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the Linux distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, '') + + def lsb_release_attr(self, attribute): + """ + Return a single named information item from the lsb_release command + output data source of the Linux distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, '') + + def distro_release_attr(self, attribute): + """ + Return a single named information item from the distro release file + data source of the Linux distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + def _get_os_release_info(self): + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file) as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines): + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + # The shlex module defines its `wordchars` variable using literals, + # making it dependent on the encoding of the Python source file. + # In Python 2.6 and 2.7, the shlex source file is encoded in + # 'iso-8859-1', and the `wordchars` variable is defined as a byte + # string. This causes a UnicodeDecodeError to be raised when the + # parsed content is a unicode object. The following fix resolves that + # (... but it should be fixed in shlex...): + if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): + lexer.wordchars = lexer.wordchars.decode('iso-8859-1') + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + if '=' in token: + k, v = token.split('=', 1) + if isinstance(v, bytes): + v = v.decode('utf-8') + props[k.lower()] = v + if k == 'VERSION': + # this handles cases in which the codename is in + # the `(CODENAME)` (rhel, centos, fedora) format + # or in the `, CODENAME` format (Ubuntu). + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', v) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + else: + props['codename'] = '' + else: + # Ignore any tokens that are not variable assignments + pass + return props + + def _get_lsb_release_info(self): + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + cmd = 'lsb_release -a' + process = subprocess.Popen( + cmd, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + stdout, stderr = stdout.decode('utf-8'), stderr.decode('utf-8') + code = process.returncode + if code == 0: + content = stdout.splitlines() + return self._parse_lsb_release_content(content) + elif code == 127: # Command not found + return {} + else: + if sys.version_info[:2] >= (3, 5): + raise subprocess.CalledProcessError(code, cmd, stdout, stderr) + elif sys.version_info[:2] >= (2, 7): + raise subprocess.CalledProcessError(code, cmd, stdout) + elif sys.version_info[:2] == (2, 6): + raise subprocess.CalledProcessError(code, cmd) + + @staticmethod + def _parse_lsb_release_content(lines): + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + line = line.decode('utf-8') if isinstance(line, bytes) else line + kv = line.strip('\n').split(':', 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(' ', '_').lower(): v.strip()}) + return props + + def _get_distro_release_info(self): + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file( + self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + distro_info['id'] = match.group(1) + return distro_info + else: + basenames = os.listdir(_UNIXCONFDIR) + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + for basename in basenames: + if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: + continue + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + filepath = os.path.join(_UNIXCONFDIR, basename) + distro_info = self._parse_distro_release_file(filepath) + if 'name' in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info['id'] = match.group(1) + return distro_info + return {} + + def _parse_distro_release_file(self, filepath): + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(filepath): + with open(filepath) as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + return {} + + @staticmethod + def _parse_distro_release_content(line): + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + if isinstance(line, bytes): + line = line.decode('utf-8') + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( + line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info['name'] = matches.group(3)[::-1] + if matches.group(2): + distro_info['version_id'] = matches.group(2)[::-1] + if matches.group(1): + distro_info['codename'] = matches.group(1)[::-1] + elif line: + distro_info['name'] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main(): + import argparse + + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="Linux distro info tool") + parser.add_argument( + '--json', + '-j', + help="Output in machine readable format", + action="store_true") + args = parser.parse_args() + + if args.json: + logger.info(json.dumps(info(), indent=4, sort_keys=True)) + else: + logger.info('Name: %s', name(pretty=True)) + distribution_version = version(pretty=True) + if distribution_version: + logger.info('Version: %s', distribution_version) + distribution_codename = codename() + if distribution_codename: + logger.info('Codename: %s', distribution_codename) + + +if __name__ == '__main__': + main() diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..7427eb126a538a61489aa240a166f409b6aab680 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,25 @@ +""" +HTML parsing library based on the WHATWG "HTML5" +specification. The parser is designed to be compatible with existing +HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage: + +import html5lib +f = open("my_document.html") +tree = html5lib.parse(f) +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] + +# this has to be at the top level, see how setup.py parses this +__version__ = "1.0b10" diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_ihatexml.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000000000000000000000000000000000000..d6d1d6fb7d382493ef4166ee4a999ec7c65d2d8e --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,288 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\-\'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_inputstream.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000000000000000000000000000000000000..7c5639ff8c0f7fd43283b7f22ea014e52dbf7f40 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_inputstream.py @@ -0,0 +1,923 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type, binary_type +from pip._vendor.six.moves import http_client, urllib + +import codecs +import re + +from pip._vendor import webencodings + +from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +from .constants import ReparseException +from . import _utils + +from io import StringIO + +try: + from io import BytesIO +except ImportError: + BytesIO = StringIO + +# Non-unicode versions of constants for use in the pre-parser +spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) +asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) +asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) +spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) + + +invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa + +if _utils.supports_lone_surrogates: + # Use one extra step of indirection and create surrogates with + # eval. Not using this indirection would introduce an illegal + # unicode literal on platforms not supporting such lone + # surrogates. + assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + + eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used + "]") +else: + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) + +non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF]) + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream(object): + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos <= self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= len(self.buffer[i]) + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return b"".join(rv) + + +def HTMLInputStream(source, **kwargs): + # Work around Python bug #20007: read(0) closes the connection. + # http://bugs.python.org/issue20007 + if (isinstance(source, http_client.HTTPResponse) or + # Also check for addinfourl wrapping HTTPResponse + (isinstance(source, urllib.response.addbase) and + isinstance(source.fp, http_client.HTTPResponse))): + isUnicode = False + elif hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + encodings = [x for x in kwargs if x.endswith("_encoding")] + if encodings: + raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) + + return HTMLUnicodeInputStream(source, **kwargs) + else: + return HTMLBinaryInputStream(source, **kwargs) + + +class HTMLUnicodeInputStream(object): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + + if not _utils.supports_lone_surrogates: + # Such platforms will have already checked for such + # surrogate errors, so no need to do this checking. + self.reportCharacterErrors = None + elif len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = (lookupEncoding("utf-8"), "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + if self.reportCharacterErrors: + self.reportCharacterErrors(data) + + # Replace invalid characters + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for _ in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if _utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not None: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, override_encoding=None, transport_encoding=None, + same_origin_parent_encoding=None, likely_encoding=None, + default_encoding="windows-1252", useChardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 1024 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Things from args + self.override_encoding = override_encoding + self.transport_encoding = transport_encoding + self.same_origin_parent_encoding = same_origin_parent_encoding + self.likely_encoding = likely_encoding + self.default_encoding = default_encoding + + # Determine encoding + self.charEncoding = self.determineEncoding(useChardet) + assert self.charEncoding[0] is not None + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except: # pylint:disable=bare-except + stream = BufferedStream(stream) + + return stream + + def determineEncoding(self, chardet=True): + # BOMs take precedence over everything + # This will also read past the BOM if present + charEncoding = self.detectBOM(), "certain" + if charEncoding[0] is not None: + return charEncoding + + # If we've been overriden, we've been overriden + charEncoding = lookupEncoding(self.override_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Now check the transport layer + charEncoding = lookupEncoding(self.transport_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Look for meta elements with encoding information + charEncoding = self.detectEncodingMeta(), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Parent document encoding + charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" + if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): + return charEncoding + + # "likely" encoding + charEncoding = lookupEncoding(self.likely_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Guess with chardet, if available + if chardet: + try: + from chardet.universaldetector import UniversalDetector + except ImportError: + pass + else: + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = lookupEncoding(detector.result['encoding']) + self.rawStream.seek(0) + if encoding is not None: + return encoding, "tentative" + + # Try the default encoding + charEncoding = lookupEncoding(self.default_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Fallback to html5lib's default if even that hasn't worked + return lookupEncoding("windows-1252"), "tentative" + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = lookupEncoding(newEncoding) + if newEncoding is None: + return + if newEncoding.name in ("utf-16be", "utf-16le"): + newEncoding = lookupEncoding("utf-8") + assert newEncoding is not None + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.charEncoding = (newEncoding, "certain") + self.reset() + raise ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', + codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + if encoding: + self.rawStream.seek(seek) + return lookupEncoding(encoding) + else: + self.rawStream.seek(0) + return None + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): + encoding = lookupEncoding("utf-8") + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + # pylint:disable=unused-argument + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + p = self.position + data = self[p:p + len(bytes)] + rv = data.startswith(bytes) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + newPosition = self[self.position:].find(bytes) + if newPosition > -1: + # XXX: This is ugly, but I can't see a nicer way to fix this. + if self._position == -1: + self._position = 0 + self._position += (newPosition + len(bytes) - 1) + return True + else: + raise StopIteration + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + methodDispatch = ( + (b"<!--", self.handleComment), + (b"<meta", self.handleMeta), + (b"</", self.handlePossibleEndTag), + (b"<!", self.handleOther), + (b"<?", self.handleOther), + (b"<", self.handlePossibleStartTag)) + for _ in self.data: + keepParsing = True + for key, method in methodDispatch: + if self.data.matchBytes(key): + try: + keepParsing = method() + break + except StopIteration: + keepParsing = False + break + if not keepParsing: + break + + return self.encoding + + def handleComment(self): + """Skip over comments""" + return self.data.jumpTo(b"-->") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have <meta not followed by a space so just keep going + return True + # We have a valid meta element we want to search for attributes + hasPragma = False + pendingEncoding = None + while True: + # Try to find the next attribute after the current position + attr = self.getAttribute() + if attr is None: + return True + else: + if attr[0] == b"http-equiv": + hasPragma = attr[1] == b"content-type" + if hasPragma and pendingEncoding is not None: + self.encoding = pendingEncoding + return False + elif attr[0] == b"charset": + tentativeEncoding = attr[1] + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + self.encoding = codec + return False + elif attr[0] == b"content": + contentParser = ContentAttrParser(EncodingBytes(attr[1])) + tentativeEncoding = contentParser.parse() + if tentativeEncoding is not None: + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + if hasPragma: + self.encoding = codec + return False + else: + pendingEncoding = codec + + def handlePossibleStartTag(self): + return self.handlePossibleTag(False) + + def handlePossibleEndTag(self): + next(self.data) + return self.handlePossibleTag(True) + + def handlePossibleTag(self, endTag): + data = self.data + if data.currentByte not in asciiLettersBytes: + # If the next byte is not an ascii letter either ignore this + # fragment (possible start tag case) or treat it according to + # handleOther + if endTag: + data.previous() + self.handleOther() + return True + + c = data.skipUntil(spacesAngleBrackets) + if c == b"<": + # return to the first step in the overall "two step" algorithm + # reprocessing the < byte + data.previous() + else: + # Read all attributes + attr = self.getAttribute() + while attr is not None: + attr = self.getAttribute() + return True + + def handleOther(self): + return self.data.jumpTo(b">") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def lookupEncoding(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, binary_type): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + + if encoding is not None: + try: + return webencodings.lookup(encoding) + except AttributeError: + return None + else: + return None diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_tokenizer.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 0000000000000000000000000000000000000000..178f6e7fa8c79abe6d18f0c60adfe0c239eb97e1 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_tokenizer.py @@ -0,0 +1,1721 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import unichr as chr + +from collections import deque + +from .constants import spaceCharacters +from .constants import entities +from .constants import asciiLetters, asciiUpper2Lower +from .constants import digits, hexDigits, EOF +from .constants import tokenTypes, tagTokenTypes +from .constants import replacementCharacters + +from ._inputstream import HTMLInputStream + +from ._trie import Trie + +entitiesTrie = Trie(entities) + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, parser=None, **kwargs): + + self.stream = HTMLInputStream(stream, **kwargs) + self.parser = parser + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or + (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.state = self.dataState + else: + # XXX data can be _'_... + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-char", + "datavars": {"data": data}}) + self.stream.unget(data) + self.state = self.bogusCommentState + return True + + def tagNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rawtextLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rawtextEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rawtextEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def scriptDataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEndTagOpenState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) + self.state = self.scriptDataEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.scriptDataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapeStartDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.state = self.dataState + else: + chars = self.stream.charsUntil(("<", "-", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapeStartState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..a5ba4bf123aa585ec8a47dce6838b09b4dfa0b1a --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/__init__.py @@ -0,0 +1,14 @@ +from __future__ import absolute_import, division, unicode_literals + +from .py import Trie as PyTrie + +Trie = PyTrie + +# pylint:disable=wrong-import-position +try: + from .datrie import Trie as DATrie +except ImportError: + pass +else: + Trie = DATrie +# pylint:enable=wrong-import-position diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/_base.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/_base.py new file mode 100644 index 0000000000000000000000000000000000000000..25eece46ed2da28c4fc22b888f4945e2b07a828f --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/_base.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import Mapping + + +class Trie(Mapping): + """Abstract base class for tries""" + + def keys(self, prefix=None): + # pylint:disable=arguments-differ + keys = super(Trie, self).keys() + + if prefix is None: + return set(keys) + + # Python 2.6: no set comprehensions + return set([x for x in keys if x.startswith(prefix)]) + + def has_keys_with_prefix(self, prefix): + for key in self.keys(): + if key.startswith(prefix): + return True + + return False + + def longest_prefix(self, prefix): + if prefix in self: + return prefix + + for i in range(1, len(prefix) + 1): + if prefix[:-i] in self: + return prefix[:-i] + + raise KeyError(prefix) + + def longest_prefix_item(self, prefix): + lprefix = self.longest_prefix(prefix) + return (lprefix, self[lprefix]) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/datrie.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/datrie.py new file mode 100644 index 0000000000000000000000000000000000000000..e2e5f86621c3881d1d812814aec9d153dca34bd1 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/datrie.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from pip._vendor.six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/py.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 0000000000000000000000000000000000000000..c178b219def8f7fbfe6d00f7822a8e61293d003a --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_trie/py.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/_utils.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..55d67475300e03374bb53ee1934e4c9a5c2fd753 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/_utils.py @@ -0,0 +1,127 @@ +from __future__ import absolute_import, division, unicode_literals + +import sys +from types import ModuleType + +from pip._vendor.six import text_type + +try: + import xml.etree.cElementTree as default_etree +except ImportError: + import xml.etree.ElementTree as default_etree + + +__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", + "surrogatePairToCodepoint", "moduleFactoryFactory", + "supports_lone_surrogates", "PY27"] + + +PY27 = sys.version_info[0] == 2 and sys.version_info[1] >= 7 + +# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be +# caught by the below test. In general this would be any platform +# using UTF-16 as its encoding of unicode strings, such as +# Jython. This is because UTF-16 itself is based on the use of such +# surrogates, and there is no mechanism to further escape such +# escapes. +try: + _x = eval('"\\uD800"') # pylint:disable=eval-used + if not isinstance(_x, text_type): + # We need this with u"" because of http://bugs.jython.org/issue2039 + _x = eval('u"\\uD800"') # pylint:disable=eval-used + assert isinstance(_x, text_type) +except: # pylint:disable=bare-except + supports_lone_surrogates = False +else: + supports_lone_surrogates = True + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _dictEntries = [] + for name, value in items: + if isinstance(name, (list, tuple, frozenset, set)): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + assert len(self) == len(_dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +# Some utility functions to deal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + kwargs_tuple = tuple(kwargs.items()) + + try: + return moduleCache[name][args][kwargs_tuple] + except KeyError: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + if "name" not in moduleCache: + moduleCache[name] = {} + if "args" not in moduleCache[name]: + moduleCache[name][args] = {} + if "kwargs" not in moduleCache[name][args]: + moduleCache[name][args][kwargs_tuple] = {} + moduleCache[name][args][kwargs_tuple] = mod + return mod + + return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/constants.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000000000000000000000000000000000000..9e7541d3826e8ded149f116fb8459e41e2224754 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2945 @@ +from __future__ import absolute_import, division, unicode_literals + +import string + +EOF = None + +E = { + "null-character": + "Null character in input stream, replaced with U+FFFD.", + "invalid-codepoint": + "Invalid codepoint in stream.", + "incorrectly-placed-solidus": + "Solidus (/) incorrectly placed in tag.", + "incorrect-cr-newline-entity": + "Incorrect CR newline entity, replaced with LF.", + "illegal-windows-1252-entity": + "Entity used with illegal number (windows-1252 reference).", + "cant-convert-numeric-entity": + "Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x).", + "illegal-codepoint-for-numeric-entity": + "Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x.", + "numeric-entity-without-semicolon": + "Numeric entity didn't end with ';'.", + "expected-numeric-entity-but-got-eof": + "Numeric entity expected. Got end of file instead.", + "expected-numeric-entity": + "Numeric entity expected but none found.", + "named-entity-without-semicolon": + "Named entity didn't end with ';'.", + "expected-named-entity": + "Named entity expected. Got none.", + "attributes-in-end-tag": + "End tag contains unexpected attributes.", + 'self-closing-flag-on-end-tag': + "End tag contains unexpected self-closing flag.", + "expected-tag-name-but-got-right-bracket": + "Expected tag name. Got '>' instead.", + "expected-tag-name-but-got-question-mark": + "Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)", + "expected-tag-name": + "Expected tag name. Got something else instead", + "expected-closing-tag-but-got-right-bracket": + "Expected closing tag. Got '>' instead. Ignoring '</>'.", + "expected-closing-tag-but-got-eof": + "Expected closing tag. Unexpected end of file.", + "expected-closing-tag-but-got-char": + "Expected closing tag. Unexpected character '%(data)s' found.", + "eof-in-tag-name": + "Unexpected end of file in the tag name.", + "expected-attribute-name-but-got-eof": + "Unexpected end of file. Expected attribute name instead.", + "eof-in-attribute-name": + "Unexpected end of file in attribute name.", + "invalid-character-in-attribute-name": + "Invalid character in attribute name", + "duplicate-attribute": + "Dropped duplicate attribute on tag.", + "expected-end-of-tag-name-but-got-eof": + "Unexpected end of file. Expected = or end of tag.", + "expected-attribute-value-but-got-eof": + "Unexpected end of file. Expected attribute value.", + "expected-attribute-value-but-got-right-bracket": + "Expected attribute value. Got '>' instead.", + 'equals-in-unquoted-attribute-value': + "Unexpected = in unquoted attribute", + 'unexpected-character-in-unquoted-attribute-value': + "Unexpected character in unquoted attribute", + "invalid-character-after-attribute-name": + "Unexpected character after attribute name.", + "unexpected-character-after-attribute-value": + "Unexpected character after attribute value.", + "eof-in-attribute-value-double-quote": + "Unexpected end of file in attribute value (\").", + "eof-in-attribute-value-single-quote": + "Unexpected end of file in attribute value (').", + "eof-in-attribute-value-no-quotes": + "Unexpected end of file in attribute value.", + "unexpected-EOF-after-solidus-in-tag": + "Unexpected end of file in tag. Expected >", + "unexpected-character-after-solidus-in-tag": + "Unexpected character after / in tag. Expected >", + "expected-dashes-or-doctype": + "Expected '--' or 'DOCTYPE'. Not found.", + "unexpected-bang-after-double-dash-in-comment": + "Unexpected ! after -- in comment", + "unexpected-space-after-double-dash-in-comment": + "Unexpected space after -- in comment", + "incorrect-comment": + "Incorrect comment.", + "eof-in-comment": + "Unexpected end of file in comment.", + "eof-in-comment-end-dash": + "Unexpected end of file in comment (-)", + "unexpected-dash-after-double-dash-in-comment": + "Unexpected '-' after '--' found in comment.", + "eof-in-comment-double-dash": + "Unexpected end of file in comment (--).", + "eof-in-comment-end-space-state": + "Unexpected end of file in comment.", + "eof-in-comment-end-bang-state": + "Unexpected end of file in comment.", + "unexpected-char-in-comment": + "Unexpected character in comment found.", + "need-space-after-doctype": + "No space after literal string 'DOCTYPE'.", + "expected-doctype-name-but-got-right-bracket": + "Unexpected > character. Expected DOCTYPE name.", + "expected-doctype-name-but-got-eof": + "Unexpected end of file. Expected DOCTYPE name.", + "eof-in-doctype-name": + "Unexpected end of file in DOCTYPE name.", + "eof-in-doctype": + "Unexpected end of file in DOCTYPE.", + "expected-space-or-right-bracket-in-doctype": + "Expected space or '>'. Got '%(data)s'", + "unexpected-end-of-doctype": + "Unexpected end of DOCTYPE.", + "unexpected-char-in-doctype": + "Unexpected character in DOCTYPE.", + "eof-in-innerhtml": + "XXX innerHTML EOF", + "unexpected-doctype": + "Unexpected DOCTYPE. Ignored.", + "non-html-root": + "html needs to be the first start tag.", + "expected-doctype-but-got-eof": + "Unexpected End of file. Expected DOCTYPE.", + "unknown-doctype": + "Erroneous DOCTYPE.", + "expected-doctype-but-got-chars": + "Unexpected non-space characters. Expected DOCTYPE.", + "expected-doctype-but-got-start-tag": + "Unexpected start tag (%(name)s). Expected DOCTYPE.", + "expected-doctype-but-got-end-tag": + "Unexpected end tag (%(name)s). Expected DOCTYPE.", + "end-tag-after-implied-root": + "Unexpected end tag (%(name)s) after the (implied) root element.", + "expected-named-closing-tag-but-got-eof": + "Unexpected end of file. Expected end tag (%(name)s).", + "two-heads-are-not-better-than-one": + "Unexpected start tag head in existing head. Ignored.", + "unexpected-end-tag": + "Unexpected end tag (%(name)s). Ignored.", + "unexpected-start-tag-out-of-my-head": + "Unexpected start tag (%(name)s) that can be in head. Moved.", + "unexpected-start-tag": + "Unexpected start tag (%(name)s).", + "missing-end-tag": + "Missing end tag (%(name)s).", + "missing-end-tags": + "Missing end tags (%(name)s).", + "unexpected-start-tag-implies-end-tag": + "Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s).", + "unexpected-start-tag-treated-as": + "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", + "deprecated-tag": + "Unexpected start tag %(name)s. Don't use it!", + "unexpected-start-tag-ignored": + "Unexpected start tag %(name)s. Ignored.", + "expected-one-end-tag-but-got-another": + "Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s).", + "end-tag-too-early": + "End tag (%(name)s) seen too early. Expected other end tag.", + "end-tag-too-early-named": + "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", + "end-tag-too-early-ignored": + "End tag (%(name)s) seen too early. Ignored.", + "adoption-agency-1.1": + "End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm.", + "adoption-agency-1.2": + "End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm.", + "adoption-agency-1.3": + "End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm.", + "adoption-agency-4.4": + "End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm.", + "unexpected-end-tag-treated-as": + "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", + "no-end-tag": + "This element (%(name)s) has no end tag.", + "unexpected-implied-end-tag-in-table": + "Unexpected implied end tag (%(name)s) in the table phase.", + "unexpected-implied-end-tag-in-table-body": + "Unexpected implied end tag (%(name)s) in the table body phase.", + "unexpected-char-implies-table-voodoo": + "Unexpected non-space characters in " + "table context caused voodoo mode.", + "unexpected-hidden-input-in-table": + "Unexpected input with type hidden in table context.", + "unexpected-form-in-table": + "Unexpected form in table context.", + "unexpected-start-tag-implies-table-voodoo": + "Unexpected start tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-end-tag-implies-table-voodoo": + "Unexpected end tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-cell-in-table-body": + "Unexpected table cell start tag (%(name)s) " + "in the table body phase.", + "unexpected-cell-end-tag": + "Got table cell end tag (%(name)s) " + "while required end tags are missing.", + "unexpected-end-tag-in-table-body": + "Unexpected end tag (%(name)s) in the table body phase. Ignored.", + "unexpected-implied-end-tag-in-table-row": + "Unexpected implied end tag (%(name)s) in the table row phase.", + "unexpected-end-tag-in-table-row": + "Unexpected end tag (%(name)s) in the table row phase. Ignored.", + "unexpected-select-in-select": + "Unexpected select start tag in the select phase " + "treated as select end tag.", + "unexpected-input-in-select": + "Unexpected input start tag in the select phase.", + "unexpected-start-tag-in-select": + "Unexpected start tag token (%(name)s in the select phase. " + "Ignored.", + "unexpected-end-tag-in-select": + "Unexpected end tag (%(name)s) in the select phase. Ignored.", + "unexpected-table-element-start-tag-in-select-in-table": + "Unexpected table element start tag (%(name)s) in the select in table phase.", + "unexpected-table-element-end-tag-in-select-in-table": + "Unexpected table element end tag (%(name)s) in the select in table phase.", + "unexpected-char-after-body": + "Unexpected non-space characters in the after body phase.", + "unexpected-start-tag-after-body": + "Unexpected start tag token (%(name)s)" + " in the after body phase.", + "unexpected-end-tag-after-body": + "Unexpected end tag token (%(name)s)" + " in the after body phase.", + "unexpected-char-in-frameset": + "Unexpected characters in the frameset phase. Characters ignored.", + "unexpected-start-tag-in-frameset": + "Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-frameset-in-frameset-innerhtml": + "Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML).", + "unexpected-end-tag-in-frameset": + "Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-char-after-frameset": + "Unexpected non-space characters in the " + "after frameset phase. Ignored.", + "unexpected-start-tag-after-frameset": + "Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-frameset": + "Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-body-innerhtml": + "Unexpected end tag after body(innerHtml)", + "expected-eof-but-got-char": + "Unexpected non-space characters. Expected end of file.", + "expected-eof-but-got-start-tag": + "Unexpected start tag (%(name)s)" + ". Expected end of file.", + "expected-eof-but-got-end-tag": + "Unexpected end tag (%(name)s)" + ". Expected end of file.", + "eof-in-table": + "Unexpected end of file. Expected table content.", + "eof-in-select": + "Unexpected end of file. Expected select content.", + "eof-in-frameset": + "Unexpected end of file. Expected frameset content.", + "eof-in-script-in-script": + "Unexpected end of file. Expected script content.", + "eof-in-foreign-lands": + "Unexpected end of file. Expected foreign content", + "non-void-element-with-trailing-solidus": + "Trailing solidus not allowed on element %(name)s", + "unexpected-html-element-in-foreign-content": + "Element %(name)s not allowed in a non-html context", + "unexpected-end-tag-before-html": + "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", + "XXX-undefined-error": + "Undefined error (this sucks and should be fixed)", +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset([ + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +]) + +formattingElements = frozenset([ + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +]) + +specialElements = frozenset([ + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +]) + +htmlIntegrationPointElements = frozenset([ + (namespaces["mathml"], "annotaion-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +]) + +mathmlTextIntegrationPointElements = frozenset([ + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +]) + +adjustSVGAttributes = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" +} + +adjustMathMLAttributes = {"definitionurl": "definitionURL"} + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in + adjustForeignAttributes.items()]) + +spaceCharacters = frozenset([ + "\t", + "\n", + "\u000C", + " ", + "\r" +]) + +tableInsertModeElements = frozenset([ + "table", + "tbody", + "tfoot", + "thead", + "tr" +]) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = dict([(ord(c), ord(c.lower())) + for c in string.ascii_uppercase]) + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset([ + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +]) + +cdataElements = frozenset(['title', 'textarea']) + +rcdataElements = frozenset([ + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +]) + +booleanAttributes = { + "": frozenset(["irrelevant"]), + "style": frozenset(["scoped"]), + "img": frozenset(["ismap"]), + "audio": frozenset(["autoplay", "controls"]), + "video": frozenset(["autoplay", "controls"]), + "script": frozenset(["defer", "async"]), + "details": frozenset(["open"]), + "datagrid": frozenset(["multiple", "disabled"]), + "command": frozenset(["hidden", "disabled", "checked", "default"]), + "hr": frozenset(["noshade"]), + "menu": frozenset(["autosubmit"]), + "fieldset": frozenset(["disabled", "readonly"]), + "option": frozenset(["disabled", "readonly", "selected"]), + "optgroup": frozenset(["disabled", "readonly"]), + "button": frozenset(["disabled", "autofocus"]), + "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), + "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), + "output": frozenset(["disabled", "readonly"]), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]]) + + +prefixes = dict([(v, k) for k, v in namespaces.items()]) +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + pass + + +class ReparseException(Exception): + pass diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000000000000000000000000000000000000..4795baecc9949b5fb076fb07107c472f7fcff1d9 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,20 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict + + +class Filter(base.Filter): + def __iter__(self): + for token in base.Filter.__iter__(self): + if token["type"] in ("StartTag", "EmptyTag"): + attrs = OrderedDict() + for name, value in sorted(token["data"].items(), + key=lambda x: x[0]): + attrs[name] = value + token["data"] = attrs + yield token diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/base.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/base.py new file mode 100644 index 0000000000000000000000000000000000000000..c7dbaed0fab5afb4f8947b24dd175d2239d35d6b --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/base.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + + +class Filter(object): + def __init__(self, source): + self.source = source + + def __iter__(self): + return iter(self.source) + + def __getattr__(self, name): + return getattr(self.source, name) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/inject_meta_charset.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000000000000000000000000000000000000..2059ec861871c4a8d73ac8c736169d3bd67acc94 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,65 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + def __init__(self, source, encoding): + base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/lint.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/lint.py new file mode 100644 index 0000000000000000000000000000000000000000..3b892c860926fa3fc08baad7f9dbd8391175b97b --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/lint.py @@ -0,0 +1,81 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type + +from . import base +from ..constants import namespaces, voidElements + +from ..constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class Filter(base.Filter): + def __init__(self, source, require_matching_tags=True): + super(Filter, self).__init__(source) + self.require_matching_tags = require_matching_tags + + def __iter__(self): + open_elements = [] + for token in base.Filter.__iter__(self): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(token["data"], dict) + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert type == "EmptyTag" + else: + assert type == "StartTag" + if type == "StartTag" and self.require_matching_tags: + open_elements.append((namespace, name)) + for (namespace, name), value in token["data"].items(): + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(value, text_type) + + elif type == "EndTag": + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} + elif self.require_matching_tags: + start = open_elements.pop() + assert start == (namespace, name) + + elif type == "Comment": + data = token["data"] + assert isinstance(data, text_type) + + elif type in ("Characters", "SpaceCharacters"): + data = token["data"] + assert isinstance(data, text_type) + assert data != "" + if type == "SpaceCharacters": + assert data.strip(spaceCharacters) == "" + + elif type == "Doctype": + name = token["name"] + assert name is None or isinstance(name, text_type) + assert token["publicId"] is None or isinstance(name, text_type) + assert token["systemId"] is None or isinstance(name, text_type) + + elif type == "Entity": + assert isinstance(token["name"], text_type) + + elif type == "SerializerError": + assert isinstance(token["data"], text_type) + + else: + assert False, "Unknown token type: %(type)s" % {"type": type} + + yield token diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/optionaltags.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000000000000000000000000000000000000..f6edb7341c535edbf67b9c0d9e9d13c1781abc47 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,206 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + if previous1 is not None: + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an <code>optgroup</code> + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/sanitizer.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000000000000000000000000000000000000..026748d2e45d6d45d04c752481dad6e11ff04bb8 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,865 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +from xml.sax.saxutils import escape, unescape + +from pip._vendor.six.moves import urllib_parse as urlparse + +from . import base +from ..constants import namespaces, prefixes + +__all__ = ["Filter"] + + +allowed_elements = frozenset(( + (namespaces['html'], 'a'), + (namespaces['html'], 'abbr'), + (namespaces['html'], 'acronym'), + (namespaces['html'], 'address'), + (namespaces['html'], 'area'), + (namespaces['html'], 'article'), + (namespaces['html'], 'aside'), + (namespaces['html'], 'audio'), + (namespaces['html'], 'b'), + (namespaces['html'], 'big'), + (namespaces['html'], 'blockquote'), + (namespaces['html'], 'br'), + (namespaces['html'], 'button'), + (namespaces['html'], 'canvas'), + (namespaces['html'], 'caption'), + (namespaces['html'], 'center'), + (namespaces['html'], 'cite'), + (namespaces['html'], 'code'), + (namespaces['html'], 'col'), + (namespaces['html'], 'colgroup'), + (namespaces['html'], 'command'), + (namespaces['html'], 'datagrid'), + (namespaces['html'], 'datalist'), + (namespaces['html'], 'dd'), + (namespaces['html'], 'del'), + (namespaces['html'], 'details'), + (namespaces['html'], 'dfn'), + (namespaces['html'], 'dialog'), + (namespaces['html'], 'dir'), + (namespaces['html'], 'div'), + (namespaces['html'], 'dl'), + (namespaces['html'], 'dt'), + (namespaces['html'], 'em'), + (namespaces['html'], 'event-source'), + (namespaces['html'], 'fieldset'), + (namespaces['html'], 'figcaption'), + (namespaces['html'], 'figure'), + (namespaces['html'], 'footer'), + (namespaces['html'], 'font'), + (namespaces['html'], 'form'), + (namespaces['html'], 'header'), + (namespaces['html'], 'h1'), + (namespaces['html'], 'h2'), + (namespaces['html'], 'h3'), + (namespaces['html'], 'h4'), + (namespaces['html'], 'h5'), + (namespaces['html'], 'h6'), + (namespaces['html'], 'hr'), + (namespaces['html'], 'i'), + (namespaces['html'], 'img'), + (namespaces['html'], 'input'), + (namespaces['html'], 'ins'), + (namespaces['html'], 'keygen'), + (namespaces['html'], 'kbd'), + (namespaces['html'], 'label'), + (namespaces['html'], 'legend'), + (namespaces['html'], 'li'), + (namespaces['html'], 'm'), + (namespaces['html'], 'map'), + (namespaces['html'], 'menu'), + (namespaces['html'], 'meter'), + (namespaces['html'], 'multicol'), + (namespaces['html'], 'nav'), + (namespaces['html'], 'nextid'), + (namespaces['html'], 'ol'), + (namespaces['html'], 'output'), + (namespaces['html'], 'optgroup'), + (namespaces['html'], 'option'), + (namespaces['html'], 'p'), + (namespaces['html'], 'pre'), + (namespaces['html'], 'progress'), + (namespaces['html'], 'q'), + (namespaces['html'], 's'), + (namespaces['html'], 'samp'), + (namespaces['html'], 'section'), + (namespaces['html'], 'select'), + (namespaces['html'], 'small'), + (namespaces['html'], 'sound'), + (namespaces['html'], 'source'), + (namespaces['html'], 'spacer'), + (namespaces['html'], 'span'), + (namespaces['html'], 'strike'), + (namespaces['html'], 'strong'), + (namespaces['html'], 'sub'), + (namespaces['html'], 'sup'), + (namespaces['html'], 'table'), + (namespaces['html'], 'tbody'), + (namespaces['html'], 'td'), + (namespaces['html'], 'textarea'), + (namespaces['html'], 'time'), + (namespaces['html'], 'tfoot'), + (namespaces['html'], 'th'), + (namespaces['html'], 'thead'), + (namespaces['html'], 'tr'), + (namespaces['html'], 'tt'), + (namespaces['html'], 'u'), + (namespaces['html'], 'ul'), + (namespaces['html'], 'var'), + (namespaces['html'], 'video'), + (namespaces['mathml'], 'maction'), + (namespaces['mathml'], 'math'), + (namespaces['mathml'], 'merror'), + (namespaces['mathml'], 'mfrac'), + (namespaces['mathml'], 'mi'), + (namespaces['mathml'], 'mmultiscripts'), + (namespaces['mathml'], 'mn'), + (namespaces['mathml'], 'mo'), + (namespaces['mathml'], 'mover'), + (namespaces['mathml'], 'mpadded'), + (namespaces['mathml'], 'mphantom'), + (namespaces['mathml'], 'mprescripts'), + (namespaces['mathml'], 'mroot'), + (namespaces['mathml'], 'mrow'), + (namespaces['mathml'], 'mspace'), + (namespaces['mathml'], 'msqrt'), + (namespaces['mathml'], 'mstyle'), + (namespaces['mathml'], 'msub'), + (namespaces['mathml'], 'msubsup'), + (namespaces['mathml'], 'msup'), + (namespaces['mathml'], 'mtable'), + (namespaces['mathml'], 'mtd'), + (namespaces['mathml'], 'mtext'), + (namespaces['mathml'], 'mtr'), + (namespaces['mathml'], 'munder'), + (namespaces['mathml'], 'munderover'), + (namespaces['mathml'], 'none'), + (namespaces['svg'], 'a'), + (namespaces['svg'], 'animate'), + (namespaces['svg'], 'animateColor'), + (namespaces['svg'], 'animateMotion'), + (namespaces['svg'], 'animateTransform'), + (namespaces['svg'], 'clipPath'), + (namespaces['svg'], 'circle'), + (namespaces['svg'], 'defs'), + (namespaces['svg'], 'desc'), + (namespaces['svg'], 'ellipse'), + (namespaces['svg'], 'font-face'), + (namespaces['svg'], 'font-face-name'), + (namespaces['svg'], 'font-face-src'), + (namespaces['svg'], 'g'), + (namespaces['svg'], 'glyph'), + (namespaces['svg'], 'hkern'), + (namespaces['svg'], 'linearGradient'), + (namespaces['svg'], 'line'), + (namespaces['svg'], 'marker'), + (namespaces['svg'], 'metadata'), + (namespaces['svg'], 'missing-glyph'), + (namespaces['svg'], 'mpath'), + (namespaces['svg'], 'path'), + (namespaces['svg'], 'polygon'), + (namespaces['svg'], 'polyline'), + (namespaces['svg'], 'radialGradient'), + (namespaces['svg'], 'rect'), + (namespaces['svg'], 'set'), + (namespaces['svg'], 'stop'), + (namespaces['svg'], 'svg'), + (namespaces['svg'], 'switch'), + (namespaces['svg'], 'text'), + (namespaces['svg'], 'title'), + (namespaces['svg'], 'tspan'), + (namespaces['svg'], 'use'), +)) + +allowed_attributes = frozenset(( + # HTML attributes + (None, 'abbr'), + (None, 'accept'), + (None, 'accept-charset'), + (None, 'accesskey'), + (None, 'action'), + (None, 'align'), + (None, 'alt'), + (None, 'autocomplete'), + (None, 'autofocus'), + (None, 'axis'), + (None, 'background'), + (None, 'balance'), + (None, 'bgcolor'), + (None, 'bgproperties'), + (None, 'border'), + (None, 'bordercolor'), + (None, 'bordercolordark'), + (None, 'bordercolorlight'), + (None, 'bottompadding'), + (None, 'cellpadding'), + (None, 'cellspacing'), + (None, 'ch'), + (None, 'challenge'), + (None, 'char'), + (None, 'charoff'), + (None, 'choff'), + (None, 'charset'), + (None, 'checked'), + (None, 'cite'), + (None, 'class'), + (None, 'clear'), + (None, 'color'), + (None, 'cols'), + (None, 'colspan'), + (None, 'compact'), + (None, 'contenteditable'), + (None, 'controls'), + (None, 'coords'), + (None, 'data'), + (None, 'datafld'), + (None, 'datapagesize'), + (None, 'datasrc'), + (None, 'datetime'), + (None, 'default'), + (None, 'delay'), + (None, 'dir'), + (None, 'disabled'), + (None, 'draggable'), + (None, 'dynsrc'), + (None, 'enctype'), + (None, 'end'), + (None, 'face'), + (None, 'for'), + (None, 'form'), + (None, 'frame'), + (None, 'galleryimg'), + (None, 'gutter'), + (None, 'headers'), + (None, 'height'), + (None, 'hidefocus'), + (None, 'hidden'), + (None, 'high'), + (None, 'href'), + (None, 'hreflang'), + (None, 'hspace'), + (None, 'icon'), + (None, 'id'), + (None, 'inputmode'), + (None, 'ismap'), + (None, 'keytype'), + (None, 'label'), + (None, 'leftspacing'), + (None, 'lang'), + (None, 'list'), + (None, 'longdesc'), + (None, 'loop'), + (None, 'loopcount'), + (None, 'loopend'), + (None, 'loopstart'), + (None, 'low'), + (None, 'lowsrc'), + (None, 'max'), + (None, 'maxlength'), + (None, 'media'), + (None, 'method'), + (None, 'min'), + (None, 'multiple'), + (None, 'name'), + (None, 'nohref'), + (None, 'noshade'), + (None, 'nowrap'), + (None, 'open'), + (None, 'optimum'), + (None, 'pattern'), + (None, 'ping'), + (None, 'point-size'), + (None, 'poster'), + (None, 'pqg'), + (None, 'preload'), + (None, 'prompt'), + (None, 'radiogroup'), + (None, 'readonly'), + (None, 'rel'), + (None, 'repeat-max'), + (None, 'repeat-min'), + (None, 'replace'), + (None, 'required'), + (None, 'rev'), + (None, 'rightspacing'), + (None, 'rows'), + (None, 'rowspan'), + (None, 'rules'), + (None, 'scope'), + (None, 'selected'), + (None, 'shape'), + (None, 'size'), + (None, 'span'), + (None, 'src'), + (None, 'start'), + (None, 'step'), + (None, 'style'), + (None, 'summary'), + (None, 'suppress'), + (None, 'tabindex'), + (None, 'target'), + (None, 'template'), + (None, 'title'), + (None, 'toppadding'), + (None, 'type'), + (None, 'unselectable'), + (None, 'usemap'), + (None, 'urn'), + (None, 'valign'), + (None, 'value'), + (None, 'variable'), + (None, 'volume'), + (None, 'vspace'), + (None, 'vrml'), + (None, 'width'), + (None, 'wrap'), + (namespaces['xml'], 'lang'), + # MathML attributes + (None, 'actiontype'), + (None, 'align'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnlines'), + (None, 'columnspacing'), + (None, 'columnspan'), + (None, 'depth'), + (None, 'display'), + (None, 'displaystyle'), + (None, 'equalcolumns'), + (None, 'equalrows'), + (None, 'fence'), + (None, 'fontstyle'), + (None, 'fontweight'), + (None, 'frame'), + (None, 'height'), + (None, 'linethickness'), + (None, 'lspace'), + (None, 'mathbackground'), + (None, 'mathcolor'), + (None, 'mathvariant'), + (None, 'mathvariant'), + (None, 'maxsize'), + (None, 'minsize'), + (None, 'other'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowlines'), + (None, 'rowspacing'), + (None, 'rowspan'), + (None, 'rspace'), + (None, 'scriptlevel'), + (None, 'selection'), + (None, 'separator'), + (None, 'stretchy'), + (None, 'width'), + (None, 'width'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'type'), + # SVG attributes + (None, 'accent-height'), + (None, 'accumulate'), + (None, 'additive'), + (None, 'alphabetic'), + (None, 'arabic-form'), + (None, 'ascent'), + (None, 'attributeName'), + (None, 'attributeType'), + (None, 'baseProfile'), + (None, 'bbox'), + (None, 'begin'), + (None, 'by'), + (None, 'calcMode'), + (None, 'cap-height'), + (None, 'class'), + (None, 'clip-path'), + (None, 'color'), + (None, 'color-rendering'), + (None, 'content'), + (None, 'cx'), + (None, 'cy'), + (None, 'd'), + (None, 'dx'), + (None, 'dy'), + (None, 'descent'), + (None, 'display'), + (None, 'dur'), + (None, 'end'), + (None, 'fill'), + (None, 'fill-opacity'), + (None, 'fill-rule'), + (None, 'font-family'), + (None, 'font-size'), + (None, 'font-stretch'), + (None, 'font-style'), + (None, 'font-variant'), + (None, 'font-weight'), + (None, 'from'), + (None, 'fx'), + (None, 'fy'), + (None, 'g1'), + (None, 'g2'), + (None, 'glyph-name'), + (None, 'gradientUnits'), + (None, 'hanging'), + (None, 'height'), + (None, 'horiz-adv-x'), + (None, 'horiz-origin-x'), + (None, 'id'), + (None, 'ideographic'), + (None, 'k'), + (None, 'keyPoints'), + (None, 'keySplines'), + (None, 'keyTimes'), + (None, 'lang'), + (None, 'marker-end'), + (None, 'marker-mid'), + (None, 'marker-start'), + (None, 'markerHeight'), + (None, 'markerUnits'), + (None, 'markerWidth'), + (None, 'mathematical'), + (None, 'max'), + (None, 'min'), + (None, 'name'), + (None, 'offset'), + (None, 'opacity'), + (None, 'orient'), + (None, 'origin'), + (None, 'overline-position'), + (None, 'overline-thickness'), + (None, 'panose-1'), + (None, 'path'), + (None, 'pathLength'), + (None, 'points'), + (None, 'preserveAspectRatio'), + (None, 'r'), + (None, 'refX'), + (None, 'refY'), + (None, 'repeatCount'), + (None, 'repeatDur'), + (None, 'requiredExtensions'), + (None, 'requiredFeatures'), + (None, 'restart'), + (None, 'rotate'), + (None, 'rx'), + (None, 'ry'), + (None, 'slope'), + (None, 'stemh'), + (None, 'stemv'), + (None, 'stop-color'), + (None, 'stop-opacity'), + (None, 'strikethrough-position'), + (None, 'strikethrough-thickness'), + (None, 'stroke'), + (None, 'stroke-dasharray'), + (None, 'stroke-dashoffset'), + (None, 'stroke-linecap'), + (None, 'stroke-linejoin'), + (None, 'stroke-miterlimit'), + (None, 'stroke-opacity'), + (None, 'stroke-width'), + (None, 'systemLanguage'), + (None, 'target'), + (None, 'text-anchor'), + (None, 'to'), + (None, 'transform'), + (None, 'type'), + (None, 'u1'), + (None, 'u2'), + (None, 'underline-position'), + (None, 'underline-thickness'), + (None, 'unicode'), + (None, 'unicode-range'), + (None, 'units-per-em'), + (None, 'values'), + (None, 'version'), + (None, 'viewBox'), + (None, 'visibility'), + (None, 'width'), + (None, 'widths'), + (None, 'x'), + (None, 'x-height'), + (None, 'x1'), + (None, 'x2'), + (namespaces['xlink'], 'actuate'), + (namespaces['xlink'], 'arcrole'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'role'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'title'), + (namespaces['xlink'], 'type'), + (namespaces['xml'], 'base'), + (namespaces['xml'], 'lang'), + (namespaces['xml'], 'space'), + (None, 'y'), + (None, 'y1'), + (None, 'y2'), + (None, 'zoomAndPan'), +)) + +attr_val_is_uri = frozenset(( + (None, 'href'), + (None, 'src'), + (None, 'cite'), + (None, 'action'), + (None, 'longdesc'), + (None, 'poster'), + (None, 'background'), + (None, 'datasrc'), + (None, 'dynsrc'), + (None, 'lowsrc'), + (None, 'ping'), + (namespaces['xlink'], 'href'), + (namespaces['xml'], 'base'), +)) + +svg_attr_val_allows_ref = frozenset(( + (None, 'clip-path'), + (None, 'color-profile'), + (None, 'cursor'), + (None, 'fill'), + (None, 'filter'), + (None, 'marker'), + (None, 'marker-start'), + (None, 'marker-mid'), + (None, 'marker-end'), + (None, 'mask'), + (None, 'stroke'), +)) + +svg_allow_local_href = frozenset(( + (None, 'altGlyph'), + (None, 'animate'), + (None, 'animateColor'), + (None, 'animateMotion'), + (None, 'animateTransform'), + (None, 'cursor'), + (None, 'feImage'), + (None, 'filter'), + (None, 'linearGradient'), + (None, 'pattern'), + (None, 'radialGradient'), + (None, 'textpath'), + (None, 'tref'), + (None, 'set'), + (None, 'use') +)) + +allowed_css_properties = frozenset(( + 'azimuth', + 'background-color', + 'border-bottom-color', + 'border-collapse', + 'border-color', + 'border-left-color', + 'border-right-color', + 'border-top-color', + 'clear', + 'color', + 'cursor', + 'direction', + 'display', + 'elevation', + 'float', + 'font', + 'font-family', + 'font-size', + 'font-style', + 'font-variant', + 'font-weight', + 'height', + 'letter-spacing', + 'line-height', + 'overflow', + 'pause', + 'pause-after', + 'pause-before', + 'pitch', + 'pitch-range', + 'richness', + 'speak', + 'speak-header', + 'speak-numeral', + 'speak-punctuation', + 'speech-rate', + 'stress', + 'text-align', + 'text-decoration', + 'text-indent', + 'unicode-bidi', + 'vertical-align', + 'voice-family', + 'volume', + 'white-space', + 'width', +)) + +allowed_css_keywords = frozenset(( + 'auto', + 'aqua', + 'black', + 'block', + 'blue', + 'bold', + 'both', + 'bottom', + 'brown', + 'center', + 'collapse', + 'dashed', + 'dotted', + 'fuchsia', + 'gray', + 'green', + '!important', + 'italic', + 'left', + 'lime', + 'maroon', + 'medium', + 'none', + 'navy', + 'normal', + 'nowrap', + 'olive', + 'pointer', + 'purple', + 'red', + 'right', + 'solid', + 'silver', + 'teal', + 'top', + 'transparent', + 'underline', + 'white', + 'yellow', +)) + +allowed_svg_properties = frozenset(( + 'fill', + 'fill-opacity', + 'fill-rule', + 'stroke', + 'stroke-width', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-opacity', +)) + +allowed_protocols = frozenset(( + 'ed2k', + 'ftp', + 'http', + 'https', + 'irc', + 'mailto', + 'news', + 'gopher', + 'nntp', + 'telnet', + 'webcal', + 'xmpp', + 'callto', + 'feed', + 'urn', + 'aim', + 'rsync', + 'tag', + 'ssh', + 'sftp', + 'rtsp', + 'afs', + 'data', +)) + +allowed_content_types = frozenset(( + 'image/png', + 'image/jpeg', + 'image/gif', + 'image/webp', + 'image/bmp', + 'text/plain', +)) + + +data_content_type = re.compile(r''' + ^ + # Match a content type <application>/<type> + (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) + # Match any character set and encoding + (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) + |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) + # Assume the rest is data + ,.* + $ + ''', + re.VERBOSE) + + +class Filter(base.Filter): + """ sanitization of XHTML+MathML+SVG and of inline style attributes.""" + def __init__(self, + source, + allowed_elements=allowed_elements, + allowed_attributes=allowed_attributes, + allowed_css_properties=allowed_css_properties, + allowed_css_keywords=allowed_css_keywords, + allowed_svg_properties=allowed_svg_properties, + allowed_protocols=allowed_protocols, + allowed_content_types=allowed_content_types, + attr_val_is_uri=attr_val_is_uri, + svg_attr_val_allows_ref=svg_attr_val_allows_ref, + svg_allow_local_href=svg_allow_local_href): + super(Filter, self).__init__(source) + self.allowed_elements = allowed_elements + self.allowed_attributes = allowed_attributes + self.allowed_css_properties = allowed_css_properties + self.allowed_css_keywords = allowed_css_keywords + self.allowed_svg_properties = allowed_svg_properties + self.allowed_protocols = allowed_protocols + self.allowed_content_types = allowed_content_types + self.attr_val_is_uri = attr_val_is_uri + self.svg_attr_val_allows_ref = svg_attr_val_allows_ref + self.svg_allow_local_href = svg_allow_local_href + + def __iter__(self): + for token in base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all # attributes not in ALLOWED_ATTRIBUTES. Style + # attributes are parsed, and a restricted set, # specified by + # ALLOWED_CSS_PROPERTIES and ALLOWED_CSS_KEYWORDS, are allowed through. + # attributes in ATTR_VAL_IS_URI are scanned, and only URI schemes specified + # in ALLOWED_PROTOCOLS are allowed. + # + # sanitize_html('<script> do_nasty_stuff() </script>') + # => <script> do_nasty_stuff() </script> + # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') + # => <a>Click here for $100</a> + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search('^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "</%s>" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match("^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall("([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/whitespace.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000000000000000000000000000000000000..89210528717dcd653e5313c62bf6b83e8445309f --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/html5parser.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000000000000000000000000000000000000..f7043cb19891a8f93b1476ce2dcbdead32e526d8 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2733 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys, PY3 + +import types + +try: + from collections import OrderedDict +except ImportError: + from pip._vendor.ordereddict import OrderedDict + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse a string or file-like object into a tree""" + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser. Generates a tree structure from a stream of (possibly + malformed) HTML""" + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + strict - raise an exception when a parse error is encountered + + tree - a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """The name of the character encoding + that was used to decode the input stream, + or :obj:`None` if that is not determined yet. + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + stream - a filelike object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + scripting - treat noscript elements as if javascript was turned on + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + container - name of the element we're setting the innerHTML property + if set to None, default to 'div' + + stream - a filelike object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + scripting - treat noscript elements as if javascript was turned on + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def normalizeToken(self, token): + """ HTML5 specific normalizations to the token stream """ + + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + """Generic RCDATA/RAWTEXT Parsing algorithm + contentType - RCDATA or RAWTEXT + """ + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we + # want to drop leading newlines + data = token["data"] + self.processSpaceCharacters = self.processSpaceCharactersNonPre + if (data.startswith("\n") and + self.tree.openElements[-1].name in ("pre", "listing", "textarea") and + not self.tree.openElements[-1].hasContent()): + data = data[1:] + if data: + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(data) + + def processCharacters(self, token): + if token["data"] == "\u0000": + # The tokenizer should always emit null on its own + return + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + # This must be bad for performance + if (self.parser.framesetOK and + any([char not in spaceCharacters + for char in token["data"]])): + self.parser.framesetOK = False + + def processSpaceCharactersNonPre(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + + def startTagProcessInHead(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagBody(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "body"}) + if (len(self.tree.openElements) == 1 or + self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + else: + self.parser.framesetOK = False + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[1].attributes: + self.tree.openElements[1].attributes[attr] = value + + def startTagFrameset(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) + if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + elif not self.parser.framesetOK: + pass + else: + if self.tree.openElements[1].parent: + self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) + while self.tree.openElements[-1].name != "html": + self.tree.openElements.pop() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagCloseP(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + + def startTagPreListing(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + + def startTagForm(self, token): + if self.tree.formPointer: + self.parser.parseError("unexpected-start-tag", {"name": "form"}) + else: + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + + def startTagListItem(self, token): + self.parser.framesetOK = False + + stopNamesMap = {"li": ["li"], + "dt": ["dt", "dd"], + "dd": ["dt", "dd"]} + stopNames = stopNamesMap[token["name"]] + for node in reversed(self.tree.openElements): + if node.name in stopNames: + self.parser.phase.processEndTag( + impliedTagToken(node.name, "EndTag")) + break + if (node.nameTuple in specialElements and + node.name not in ("address", "div", "p")): + break + + if self.tree.elementInScope("p", variant="button"): + self.parser.phase.processEndTag( + impliedTagToken("p", "EndTag")) + + self.tree.insertElement(token) + + def startTagPlaintext(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.plaintextState + + def startTagHeading(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + if self.tree.openElements[-1].name in headingElements: + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagA(self, token): + afeAElement = self.tree.elementInActiveFormattingElements("a") + if afeAElement: + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "a", "endName": "a"}) + self.endTagFormatting(impliedTagToken("a")) + if afeAElement in self.tree.openElements: + self.tree.openElements.remove(afeAElement) + if afeAElement in self.tree.activeFormattingElements: + self.tree.activeFormattingElements.remove(afeAElement) + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagNobr(self, token): + self.tree.reconstructActiveFormattingElements() + if self.tree.elementInScope("nobr"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "nobr", "endName": "nobr"}) + self.processEndTag(impliedTagToken("nobr")) + # XXX Need tests that trigger the following + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagButton(self, token): + if self.tree.elementInScope("button"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "button", "endName": "button"}) + self.processEndTag(impliedTagToken("button")) + return token + else: + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + + def startTagAppletMarqueeObject(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.activeFormattingElements.append(Marker) + self.parser.framesetOK = False + + def startTagXmp(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.reconstructActiveFormattingElements() + self.parser.framesetOK = False + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagTable(self, token): + if self.parser.compatMode != "quirks": + if self.tree.elementInScope("p", variant="button"): + self.processEndTag(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.parser.phase = self.parser.phases["inTable"] + + def startTagVoidFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagInput(self, token): + framesetOK = self.parser.framesetOK + self.startTagVoidFormatting(token) + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + # input type=hidden doesn't change framesetOK + self.parser.framesetOK = framesetOK + + def startTagParamSource(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagHr(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagImage(self, token): + # No really... + self.parser.parseError("unexpected-start-tag-treated-as", + {"originalName": "image", "newName": "img"}) + self.processStartTag(impliedTagToken("img", "StartTag", + attributes=token["data"], + selfClosing=token["selfClosing"])) + + def startTagIsIndex(self, token): + self.parser.parseError("deprecated-tag", {"name": "isindex"}) + if self.tree.formPointer: + return + form_attrs = {} + if "action" in token["data"]: + form_attrs["action"] = token["data"]["action"] + self.processStartTag(impliedTagToken("form", "StartTag", + attributes=form_attrs)) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processStartTag(impliedTagToken("label", "StartTag")) + # XXX Localization ... + if "prompt" in token["data"]: + prompt = token["data"]["prompt"] + else: + prompt = "This is a searchable index. Enter search keywords: " + self.processCharacters( + {"type": tokenTypes["Characters"], "data": prompt}) + attributes = token["data"].copy() + if "action" in attributes: + del attributes["action"] + if "prompt" in attributes: + del attributes["prompt"] + attributes["name"] = "isindex" + self.processStartTag(impliedTagToken("input", "StartTag", + attributes=attributes, + selfClosing=token["selfClosing"])) + self.processEndTag(impliedTagToken("label")) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processEndTag(impliedTagToken("form")) + + def startTagTextarea(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.rcdataState + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + self.parser.framesetOK = False + + def startTagIFrame(self, token): + self.parser.framesetOK = False + self.startTagRawtext(token) + + def startTagNoscript(self, token): + if self.parser.scripting: + self.startTagRawtext(token) + else: + self.startTagOther(token) + + def startTagRawtext(self, token): + """iframe, noembed noframes, noscript(if scripting enabled)""" + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagOpt(self, token): + if self.tree.openElements[-1].name == "option": + self.parser.phase.processEndTag(impliedTagToken("option")) + self.tree.reconstructActiveFormattingElements() + self.parser.tree.insertElement(token) + + def startTagSelect(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + if self.parser.phase in (self.parser.phases["inTable"], + self.parser.phases["inCaption"], + self.parser.phases["inColumnGroup"], + self.parser.phases["inTableBody"], + self.parser.phases["inRow"], + self.parser.phases["inCell"]): + self.parser.phase = self.parser.phases["inSelectInTable"] + else: + self.parser.phase = self.parser.phases["inSelect"] + + def startTagRpRt(self, token): + if self.tree.elementInScope("ruby"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "ruby": + self.parser.parseError() + self.tree.insertElement(token) + + def startTagMath(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustMathMLAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["mathml"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagSvg(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["svg"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMisplaced(self, token): + """ Elements that should be children of other elements that have a + different insertion mode; here they are ignored + "caption", "col", "colgroup", "frame", "frameset", "head", + "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", + "tr", "noscript" + """ + self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) + + def startTagOther(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + + def endTagP(self, token): + if not self.tree.elementInScope("p", variant="button"): + self.startTagCloseP(impliedTagToken("p", "StartTag")) + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + self.endTagP(impliedTagToken("p", "EndTag")) + else: + self.tree.generateImpliedEndTags("p") + if self.tree.openElements[-1].name != "p": + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + node = self.tree.openElements.pop() + while node.name != "p": + node = self.tree.openElements.pop() + + def endTagBody(self, token): + if not self.tree.elementInScope("body"): + self.parser.parseError() + return + elif self.tree.openElements[-1].name != "body": + for node in self.tree.openElements[2:]: + if node.name not in frozenset(("dd", "dt", "li", "optgroup", + "option", "p", "rp", "rt", + "tbody", "td", "tfoot", + "th", "thead", "tr", "body", + "html")): + # Not sure this is the correct name for the parse error + self.parser.parseError( + "expected-one-end-tag-but-got-another", + {"gotName": "body", "expectedName": node.name}) + break + self.parser.phase = self.parser.phases["afterBody"] + + def endTagHtml(self, token): + # We repeat the test for the body end tag token being ignored here + if self.tree.elementInScope("body"): + self.endTagBody(impliedTagToken("body")) + return token + + def endTagBlock(self, token): + # Put us back in the right whitespace handling mode + if token["name"] == "pre": + self.processSpaceCharacters = self.processSpaceCharactersNonPre + inScope = self.tree.elementInScope(token["name"]) + if inScope: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + if inScope: + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagForm(self, token): + node = self.tree.formPointer + self.tree.formPointer = None + if node is None or not self.tree.elementInScope(node): + self.parser.parseError("unexpected-end-tag", + {"name": "form"}) + else: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1] != node: + self.parser.parseError("end-tag-too-early-ignored", + {"name": "form"}) + self.tree.openElements.remove(node) + + def endTagListItem(self, token): + if token["name"] == "li": + variant = "list" + else: + variant = None + if not self.tree.elementInScope(token["name"], variant=variant): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + else: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError( + "end-tag-too-early", + {"name": token["name"]}) + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagHeading(self, token): + for item in headingElements: + if self.tree.elementInScope(item): + self.tree.generateImpliedEndTags() + break + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + for item in headingElements: + if self.tree.elementInScope(item): + item = self.tree.openElements.pop() + while item.name not in headingElements: + item = self.tree.openElements.pop() + break + + def endTagFormatting(self, token): + """The much-feared adoption agency algorithm""" + # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 + # XXX Better parseError messages appreciated. + + # Step 1 + outerLoopCounter = 0 + + # Step 2 + while outerLoopCounter < 8: + + # Step 3 + outerLoopCounter += 1 + + # Step 4: + + # Let the formatting element be the last element in + # the list of active formatting elements that: + # - is between the end of the list and the last scope + # marker in the list, if any, or the start of the list + # otherwise, and + # - has the same tag name as the token. + formattingElement = self.tree.elementInActiveFormattingElements( + token["name"]) + if (not formattingElement or + (formattingElement in self.tree.openElements and + not self.tree.elementInScope(formattingElement.name))): + # If there is no such node, then abort these steps + # and instead act as described in the "any other + # end tag" entry below. + self.endTagOther(token) + return + + # Otherwise, if there is such a node, but that node is + # not in the stack of open elements, then this is a + # parse error; remove the element from the list, and + # abort these steps. + elif formattingElement not in self.tree.openElements: + self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) + self.tree.activeFormattingElements.remove(formattingElement) + return + + # Otherwise, if there is such a node, and that node is + # also in the stack of open elements, but the element + # is not in scope, then this is a parse error; ignore + # the token, and abort these steps. + elif not self.tree.elementInScope(formattingElement.name): + self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) + return + + # Otherwise, there is a formatting element and that + # element is in the stack and is in scope. If the + # element is not the current node, this is a parse + # error. In any case, proceed with the algorithm as + # written in the following steps. + else: + if formattingElement != self.tree.openElements[-1]: + self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) + + # Step 5: + + # Let the furthest block be the topmost node in the + # stack of open elements that is lower in the stack + # than the formatting element, and is an element in + # the special category. There might not be one. + afeIndex = self.tree.openElements.index(formattingElement) + furthestBlock = None + for element in self.tree.openElements[afeIndex:]: + if element.nameTuple in specialElements: + furthestBlock = element + break + + # Step 6: + + # If there is no furthest block, then the UA must + # first pop all the nodes from the bottom of the stack + # of open elements, from the current node up to and + # including the formatting element, then remove the + # formatting element from the list of active + # formatting elements, and finally abort these steps. + if furthestBlock is None: + element = self.tree.openElements.pop() + while element != formattingElement: + element = self.tree.openElements.pop() + self.tree.activeFormattingElements.remove(element) + return + + # Step 7 + commonAncestor = self.tree.openElements[afeIndex - 1] + + # Step 8: + # The bookmark is supposed to help us identify where to reinsert + # nodes in step 15. We have to ensure that we reinsert nodes after + # the node before the active formatting element. Note the bookmark + # can move in step 9.7 + bookmark = self.tree.activeFormattingElements.index(formattingElement) + + # Step 9 + lastNode = node = furthestBlock + innerLoopCounter = 0 + + index = self.tree.openElements.index(node) + while innerLoopCounter < 3: + innerLoopCounter += 1 + # Node is element before node in open elements + index -= 1 + node = self.tree.openElements[index] + if node not in self.tree.activeFormattingElements: + self.tree.openElements.remove(node) + continue + # Step 9.6 + if node == formattingElement: + break + # Step 9.7 + if lastNode == furthestBlock: + bookmark = self.tree.activeFormattingElements.index(node) + 1 + # Step 9.8 + clone = node.cloneNode() + # Replace node with clone + self.tree.activeFormattingElements[ + self.tree.activeFormattingElements.index(node)] = clone + self.tree.openElements[ + self.tree.openElements.index(node)] = clone + node = clone + # Step 9.9 + # Remove lastNode from its parents, if any + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + node.appendChild(lastNode) + # Step 9.10 + lastNode = node + + # Step 10 + # Foster parent lastNode if commonAncestor is a + # table, tbody, tfoot, thead, or tr we need to foster + # parent the lastNode + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + + if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): + parent, insertBefore = self.tree.getTableMisnestedNodePosition() + parent.insertBefore(lastNode, insertBefore) + else: + commonAncestor.appendChild(lastNode) + + # Step 11 + clone = formattingElement.cloneNode() + + # Step 12 + furthestBlock.reparentChildren(clone) + + # Step 13 + furthestBlock.appendChild(clone) + + # Step 14 + self.tree.activeFormattingElements.remove(formattingElement) + self.tree.activeFormattingElements.insert(bookmark, clone) + + # Step 15 + self.tree.openElements.remove(formattingElement) + self.tree.openElements.insert( + self.tree.openElements.index(furthestBlock) + 1, clone) + + def endTagAppletMarqueeObject(self, token): + if self.tree.elementInScope(token["name"]): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + if self.tree.elementInScope(token["name"]): + element = self.tree.openElements.pop() + while element.name != token["name"]: + element = self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + + def endTagBr(self, token): + self.parser.parseError("unexpected-end-tag-treated-as", + {"originalName": "br", "newName": "br element"}) + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(impliedTagToken("br", "StartTag")) + self.tree.openElements.pop() + + def endTagOther(self, token): + for node in self.tree.openElements[::-1]: + if node.name == token["name"]: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + while self.tree.openElements.pop() != node: + pass + break + else: + if node.nameTuple in specialElements: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + break + + class TextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([ + ("script", self.endTagScript)]) + self.endTagHandler.default = self.endTagOther + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processEOF(self): + self.parser.parseError("expected-named-closing-tag-but-got-eof", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + return True + + def startTagOther(self, token): + assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] + + def endTagScript(self, token): + node = self.tree.openElements.pop() + assert node.name == "script" + self.parser.phase = self.parser.originalPhase + # The rest of this method is all stuff that only happens if + # document.write works + + def endTagOther(self, token): + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + + class InTablePhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("caption", self.startTagCaption), + ("colgroup", self.startTagColgroup), + ("col", self.startTagCol), + (("tbody", "tfoot", "thead"), self.startTagRowGroup), + (("td", "th", "tr"), self.startTagImplyTbody), + ("table", self.startTagTable), + (("style", "script"), self.startTagStyleScript), + ("input", self.startTagInput), + ("form", self.startTagForm) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "tbody", "td", + "tfoot", "th", "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableContext(self): + # "clear the stack back to a table context" + while self.tree.openElements[-1].name not in ("table", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + # When the current node is <html> it's an innerHTML case + + # processing methods + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-table") + else: + assert self.parser.innerHTML + # Stop parsing + + def processSpaceCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processSpaceCharacters(token) + + def processCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processCharacters(token) + + def insertText(self, token): + # If we get here there must be at least one non-whitespace character + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processCharacters(token) + self.tree.insertFromTable = False + + def startTagCaption(self, token): + self.clearStackToTableContext() + self.tree.activeFormattingElements.append(Marker) + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCaption"] + + def startTagColgroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inColumnGroup"] + + def startTagCol(self, token): + self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) + return token + + def startTagRowGroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inTableBody"] + + def startTagImplyTbody(self, token): + self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) + return token + + def startTagTable(self, token): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "table", "endName": "table"}) + self.parser.phase.processEndTag(impliedTagToken("table")) + if not self.parser.innerHTML: + return token + + def startTagStyleScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagInput(self, token): + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + self.parser.parseError("unexpected-hidden-input-in-table") + self.tree.insertElement(token) + # XXX associate with form + self.tree.openElements.pop() + else: + self.startTagOther(token) + + def startTagForm(self, token): + self.parser.parseError("unexpected-form-in-table") + if self.tree.formPointer is None: + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + self.tree.openElements.pop() + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processStartTag(token) + self.tree.insertFromTable = False + + def endTagTable(self, token): + if self.tree.elementInScope("table", variant="table"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "table": + self.parser.parseError("end-tag-too-early-named", + {"gotName": "table", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "table": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processEndTag(token) + self.tree.insertFromTable = False + + class InTableTextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.originalPhase = None + self.characterTokens = [] + + def flushCharacters(self): + data = "".join([item["data"] for item in self.characterTokens]) + if any([item not in spaceCharacters for item in data]): + token = {"type": tokenTypes["Characters"], "data": data} + self.parser.phases["inTable"].insertText(token) + elif data: + self.tree.insertText(data) + self.characterTokens = [] + + def processComment(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEOF(self): + self.flushCharacters() + self.parser.phase = self.originalPhase + return True + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.characterTokens.append(token) + + def processSpaceCharacters(self, token): + # pretty sure we should never reach here + self.characterTokens.append(token) + # assert False + + def processStartTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEndTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + class InCaptionPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-caption + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableElement) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("caption", self.endTagCaption), + ("table", self.endTagTable), + (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagCaption(self): + return not self.tree.elementInScope("caption", variant="table") + + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableElement(self, token): + self.parser.parseError() + # XXX Have to duplicate logic here to find out if the tag is ignored + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagCaption(self, token): + if not self.ignoreEndTagCaption(): + # AT this code is quite similar to endTagTable in "InTable" + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "caption": + self.parser.parseError("expected-one-end-tag-but-got-another", + {"gotName": "caption", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "caption": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inTable"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + self.parser.parseError() + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InColumnGroupPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-column + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("col", self.startTagCol) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("colgroup", self.endTagColgroup), + ("col", self.endTagCol) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagColgroup(self): + return self.tree.openElements[-1].name == "html" + + def processEOF(self): + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + return + else: + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return True + + def processCharacters(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def startTagCol(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def endTagColgroup(self, token): + if self.ignoreEndTagColgroup(): + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + else: + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + + def endTagCol(self, token): + self.parser.parseError("no-end-tag", {"name": "col"}) + + def endTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + class InTableBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("tr", self.startTagTr), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), + self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "td", "th", + "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableBodyContext(self): + while self.tree.openElements[-1].name not in ("tbody", "tfoot", + "thead", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTr(self, token): + self.clearStackToTableBodyContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inRow"] + + def startTagTableCell(self, token): + self.parser.parseError("unexpected-cell-in-table-body", + {"name": token["name"]}) + self.startTagTr(impliedTagToken("tr", "StartTag")) + return token + + def startTagTableOther(self, token): + # XXX AT Any ideas on how to share this with endTagTable? + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.clearStackToTableBodyContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + else: + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagTable(self, token): + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InRowPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-row + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead", + "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("tr", self.endTagTr), + ("table", self.endTagTable), + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + (("body", "caption", "col", "colgroup", "html", "td", "th"), + self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods (XXX unify this with other table helper methods) + def clearStackToTableRowContext(self): + while self.tree.openElements[-1].name not in ("tr", "html"): + self.parser.parseError("unexpected-implied-end-tag-in-table-row", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + + def ignoreEndTagTr(self): + return not self.tree.elementInScope("tr", variant="table") + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTableCell(self, token): + self.clearStackToTableRowContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCell"] + self.tree.activeFormattingElements.append(Marker) + + def startTagTableOther(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTr(self, token): + if not self.ignoreEndTagTr(): + self.clearStackToTableRowContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTableBody"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # Reprocess the current tag if the tr end tag was not ignored + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagTr(impliedTagToken("tr")) + return token + else: + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-row", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InCellPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-cell + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("td", "th"), self.endTagTableCell), + (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), + (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) + ]) + self.endTagHandler.default = self.endTagOther + + # helper + def closeCell(self): + if self.tree.elementInScope("td", variant="table"): + self.endTagTableCell(impliedTagToken("td")) + elif self.tree.elementInScope("th", variant="table"): + self.endTagTableCell(impliedTagToken("th")) + + # the rest + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableOther(self, token): + if (self.tree.elementInScope("td", variant="table") or + self.tree.elementInScope("th", variant="table")): + self.closeCell() + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagTableCell(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.tree.generateImpliedEndTags(token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-cell-end-tag", + {"name": token["name"]}) + while True: + node = self.tree.openElements.pop() + if node.name == token["name"]: + break + else: + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inRow"] + else: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagImply(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.closeCell() + return token + else: + # sometimes innerHTML case + self.parser.parseError() + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InSelectPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("option", self.startTagOption), + ("optgroup", self.startTagOptgroup), + ("select", self.startTagSelect), + (("input", "keygen", "textarea"), self.startTagInput), + ("script", self.startTagScript) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("option", self.endTagOption), + ("optgroup", self.endTagOptgroup), + ("select", self.endTagSelect) + ]) + self.endTagHandler.default = self.endTagOther + + # http://www.whatwg.org/specs/web-apps/current-work/#in-select + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-select") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.tree.insertText(token["data"]) + + def startTagOption(self, token): + # We need to imply </option> if <option> is the current node. + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagOptgroup(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagSelect(self, token): + self.parser.parseError("unexpected-select-in-select") + self.endTagSelect(impliedTagToken("select")) + + def startTagInput(self, token): + self.parser.parseError("unexpected-input-in-select") + if self.tree.elementInScope("select", variant="select"): + self.endTagSelect(impliedTagToken("select")) + return token + else: + assert self.parser.innerHTML + + def startTagScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-select", + {"name": token["name"]}) + + def endTagOption(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "option"}) + + def endTagOptgroup(self, token): + # </optgroup> implicitly closes <option> + if (self.tree.openElements[-1].name == "option" and + self.tree.openElements[-2].name == "optgroup"): + self.tree.openElements.pop() + # It also closes </optgroup> + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + # But nothing else + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "optgroup"}) + + def endTagSelect(self, token): + if self.tree.elementInScope("select", variant="select"): + node = self.tree.openElements.pop() + while node.name != "select": + node = self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-select", + {"name": token["name"]}) + + class InSelectInTablePhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.startTagTable) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.endTagTable) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.phases["inSelect"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inSelect"].processCharacters(token) + + def startTagTable(self, token): + self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) + self.endTagOther(impliedTagToken("select")) + return token + + def startTagOther(self, token): + return self.parser.phases["inSelect"].processStartTag(token) + + def endTagTable(self, token): + self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagOther(impliedTagToken("select")) + return token + + def endTagOther(self, token): + return self.parser.phases["inSelect"].processEndTag(token) + + class InForeignContentPhase(Phase): + breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", + "center", "code", "dd", "div", "dl", "dt", + "em", "embed", "h1", "h2", "h3", + "h4", "h5", "h6", "head", "hr", "i", "img", + "li", "listing", "menu", "meta", "nobr", + "ol", "p", "pre", "ruby", "s", "small", + "span", "strong", "strike", "sub", "sup", + "table", "tt", "u", "ul", "var"]) + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + def adjustSVGTagNames(self, token): + replacements = {"altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath"} + + if token["name"] in replacements: + token["name"] = replacements[token["name"]] + + def processCharacters(self, token): + if token["data"] == "\u0000": + token["data"] = "\uFFFD" + elif (self.parser.framesetOK and + any(char not in spaceCharacters for char in token["data"])): + self.parser.framesetOK = False + Phase.processCharacters(self, token) + + def processStartTag(self, token): + currentNode = self.tree.openElements[-1] + if (token["name"] in self.breakoutElements or + (token["name"] == "font" and + set(token["data"].keys()) & set(["color", "face", "size"]))): + self.parser.parseError("unexpected-html-element-in-foreign-content", + {"name": token["name"]}) + while (self.tree.openElements[-1].namespace != + self.tree.defaultNamespace and + not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and + not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): + self.tree.openElements.pop() + return token + + else: + if currentNode.namespace == namespaces["mathml"]: + self.parser.adjustMathMLAttributes(token) + elif currentNode.namespace == namespaces["svg"]: + self.adjustSVGTagNames(token) + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = currentNode.namespace + self.tree.insertElement(token) + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def processEndTag(self, token): + nodeIndex = len(self.tree.openElements) - 1 + node = self.tree.openElements[-1] + if node.name.translate(asciiUpper2Lower) != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + while True: + if node.name.translate(asciiUpper2Lower) == token["name"]: + # XXX this isn't in the spec but it seems necessary + if self.parser.phase == self.parser.phases["inTableText"]: + self.parser.phase.flushCharacters() + self.parser.phase = self.parser.phase.originalPhase + while self.tree.openElements.pop() != node: + assert self.tree.openElements + new_token = None + break + nodeIndex -= 1 + + node = self.tree.openElements[nodeIndex] + if node.namespace != self.tree.defaultNamespace: + continue + else: + new_token = self.parser.phase.processEndTag(token) + break + return new_token + + class AfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processComment(self, token): + # This is needed because data is to be appended to the <html> element + # here and not to whatever is currently open. + self.tree.insertComment(token, self.tree.openElements[0]) + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-body") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def endTagHtml(self, name): + if self.parser.innerHTML: + self.parser.parseError("unexpected-end-tag-after-body-innerhtml") + else: + self.parser.phase = self.parser.phases["afterAfterBody"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class InFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("frameset", self.startTagFrameset), + ("frame", self.startTagFrame), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("frameset", self.endTagFrameset) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-frameset") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-in-frameset") + + def startTagFrameset(self, token): + self.tree.insertElement(token) + + def startTagFrame(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagNoframes(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-frameset", + {"name": token["name"]}) + + def endTagFrameset(self, token): + if self.tree.openElements[-1].name == "html": + # innerHTML case + self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") + else: + self.tree.openElements.pop() + if (not self.parser.innerHTML and + self.tree.openElements[-1].name != "frameset"): + # If we're not in innerHTML mode and the current node is not a + # "frameset" element (anymore) then switch. + self.parser.phase = self.parser.phases["afterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-frameset", + {"name": token["name"]}) + + class AfterFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#after3 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("html", self.endTagHtml) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-frameset") + + def startTagNoframes(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-frameset", + {"name": token["name"]}) + + def endTagHtml(self, token): + self.parser.phase = self.parser.phases["afterAfterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-frameset", + {"name": token["name"]}) + + class AfterAfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class AfterAfterFramesetPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoFrames) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagNoFrames(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + # pylint:enable=unused-argument + + return { + "initial": InitialPhase, + "beforeHtml": BeforeHtmlPhase, + "beforeHead": BeforeHeadPhase, + "inHead": InHeadPhase, + "inHeadNoscript": InHeadNoscriptPhase, + "afterHead": AfterHeadPhase, + "inBody": InBodyPhase, + "text": TextPhase, + "inTable": InTablePhase, + "inTableText": InTableTextPhase, + "inCaption": InCaptionPhase, + "inColumnGroup": InColumnGroupPhase, + "inTableBody": InTableBodyPhase, + "inRow": InRowPhase, + "inCell": InCellPhase, + "inSelect": InSelectPhase, + "inSelectInTable": InSelectInTablePhase, + "inForeignContent": InForeignContentPhase, + "afterBody": AfterBodyPhase, + "inFrameset": InFramesetPhase, + "afterFrameset": AfterFramesetPhase, + "afterAfterBody": AfterAfterBodyPhase, + "afterAfterFrameset": AfterAfterFramesetPhase, + # XXX after after frameset + } + + +def adjust_attributes(token, replacements): + if PY3 or _utils.PY27: + needs_adjustment = viewkeys(token['data']) & viewkeys(replacements) + else: + needs_adjustment = frozenset(token['data']) & frozenset(replacements) + if needs_adjustment: + token['data'] = OrderedDict((replacements.get(k, k), v) + for k, v in token['data'].items()) + + +def impliedTagToken(name, type="EndTag", attributes=None, + selfClosing=False): + if attributes is None: + attributes = {} + return {"type": tokenTypes[type], "name": name, "data": attributes, + "selfClosing": selfClosing} + + +class ParseError(Exception): + """Error in parsed document""" + pass diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/serializer.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/serializer.py new file mode 100644 index 0000000000000000000000000000000000000000..2fb3481512a8dfaf6ee2217fd14056ab368afafc --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/serializer.py @@ -0,0 +1,334 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +import re + +from codecs import register_error, xmlcharrefreplace_errors + +from .constants import voidElements, booleanAttributes, spaceCharacters +from .constants import rcdataElements, entities, xmlEntities +from . import treewalkers, _utils +from xml.sax.saxutils import escape + +_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`" +_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]") +_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars + + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n" + "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15" + "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000" + "\u2001\u2002\u2003\u2004\u2005\u2006\u2007" + "\u2008\u2009\u200a\u2028\u2029\u202f\u205f" + "\u3000]") + + +_encode_entity_map = {} +_is_ucs4 = len("\U0010FFFF") == 1 +for k, v in list(entities.items()): + # skip multi-character entities + if ((_is_ucs4 and len(v) > 1) or + (not _is_ucs4 and len(v) > 2)): + continue + if v != "&": + if len(v) == 2: + v = _utils.surrogatePairToCodepoint(v) + else: + v = ord(v) + if v not in _encode_entity_map or k.islower(): + # prefer < over < and similarly for &, >, etc. + _encode_entity_map[v] = k + + +def htmlentityreplace_errors(exc): + if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): + res = [] + codepoints = [] + skip = False + for i, c in enumerate(exc.object[exc.start:exc.end]): + if skip: + skip = False + continue + index = i + exc.start + if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): + codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2]) + skip = True + else: + codepoint = ord(c) + codepoints.append(codepoint) + for cp in codepoints: + e = _encode_entity_map.get(cp) + if e: + res.append("&") + res.append(e) + if not e.endswith(";"): + res.append(";") + else: + res.append("&#x%s;" % (hex(cp)[2:])) + return ("".join(res), exc.end) + else: + return xmlcharrefreplace_errors(exc) + +register_error("htmlentityreplace", htmlentityreplace_errors) + + +def serialize(input, tree="etree", encoding=None, **serializer_opts): + # XXX: Should we cache this? + walker = treewalkers.getTreeWalker(tree) + s = HTMLSerializer(**serializer_opts) + return s.render(walker(input), encoding) + + +class HTMLSerializer(object): + + # attribute quoting options + quote_attr_values = "legacy" # be secure by default + quote_char = '"' + use_best_quote_char = True + + # tag syntax options + omit_optional_tags = True + minimize_boolean_attributes = True + use_trailing_solidus = False + space_before_trailing_solidus = True + + # escaping options + escape_lt_in_attrs = False + escape_rcdata = False + resolve_entities = True + + # miscellaneous options + alphabetical_attributes = False + inject_meta_charset = True + strip_whitespace = False + sanitize = False + + options = ("quote_attr_values", "quote_char", "use_best_quote_char", + "omit_optional_tags", "minimize_boolean_attributes", + "use_trailing_solidus", "space_before_trailing_solidus", + "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", + "alphabetical_attributes", "inject_meta_charset", + "strip_whitespace", "sanitize") + + def __init__(self, **kwargs): + """Initialize HTMLSerializer. + + Keyword options (default given first unless specified) include: + + inject_meta_charset=True|False + Whether it insert a meta element to define the character set of the + document. + quote_attr_values="legacy"|"spec"|"always" + Whether to quote attribute values that don't require quoting + per legacy browser behaviour, when required by the standard, or always. + quote_char=u'"'|u"'" + Use given quote character for attribute quoting. Default is to + use double quote unless attribute value contains a double quote, + in which case single quotes are used instead. + escape_lt_in_attrs=False|True + Whether to escape < in attribute values. + escape_rcdata=False|True + Whether to escape characters that need to be escaped within normal + elements within rcdata elements such as style. + resolve_entities=True|False + Whether to resolve named character entities that appear in the + source tree. The XML predefined entities < > & " ' + are unaffected by this setting. + strip_whitespace=False|True + Whether to remove semantically meaningless whitespace. (This + compresses all whitespace to a single space except within pre.) + minimize_boolean_attributes=True|False + Shortens boolean attributes to give just the attribute value, + for example <input disabled="disabled"> becomes <input disabled>. + use_trailing_solidus=False|True + Includes a close-tag slash at the end of the start tag of void + elements (empty elements whose end tag is forbidden). E.g. <hr/>. + space_before_trailing_solidus=True|False + Places a space immediately before the closing slash in a tag + using a trailing solidus. E.g. <hr />. Requires use_trailing_solidus. + sanitize=False|True + Strip all unsafe or unknown constructs from output. + See `html5lib user documentation`_ + omit_optional_tags=True|False + Omit start/end tags that are optional. + alphabetical_attributes=False|True + Reorder attributes to be in alphabetical order. + + .. _html5lib user documentation: http://code.google.com/p/html5lib/wiki/UserDocumentation + """ + unexpected_args = frozenset(kwargs) - frozenset(self.options) + if len(unexpected_args) > 0: + raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args))) + if 'quote_char' in kwargs: + self.use_best_quote_char = False + for attr in self.options: + setattr(self, attr, kwargs.get(attr, getattr(self, attr))) + self.errors = [] + self.strict = False + + def encode(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "htmlentityreplace") + else: + return string + + def encodeStrict(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "strict") + else: + return string + + def serialize(self, treewalker, encoding=None): + # pylint:disable=too-many-nested-blocks + self.encoding = encoding + in_cdata = False + self.errors = [] + + if encoding and self.inject_meta_charset: + from .filters.inject_meta_charset import Filter + treewalker = Filter(treewalker, encoding) + # Alphabetical attributes is here under the assumption that none of + # the later filters add or change order of attributes; it needs to be + # before the sanitizer so escaped elements come out correctly + if self.alphabetical_attributes: + from .filters.alphabeticalattributes import Filter + treewalker = Filter(treewalker) + # WhitespaceFilter should be used before OptionalTagFilter + # for maximum efficiently of this latter filter + if self.strip_whitespace: + from .filters.whitespace import Filter + treewalker = Filter(treewalker) + if self.sanitize: + from .filters.sanitizer import Filter + treewalker = Filter(treewalker) + if self.omit_optional_tags: + from .filters.optionaltags import Filter + treewalker = Filter(treewalker) + + for token in treewalker: + type = token["type"] + if type == "Doctype": + doctype = "<!DOCTYPE %s" % token["name"] + + if token["publicId"]: + doctype += ' PUBLIC "%s"' % token["publicId"] + elif token["systemId"]: + doctype += " SYSTEM" + if token["systemId"]: + if token["systemId"].find('"') >= 0: + if token["systemId"].find("'") >= 0: + self.serializeError("System identifer contains both single and double quote characters") + quote_char = "'" + else: + quote_char = '"' + doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) + + doctype += ">" + yield self.encodeStrict(doctype) + + elif type in ("Characters", "SpaceCharacters"): + if type == "SpaceCharacters" or in_cdata: + if in_cdata and token["data"].find("</") >= 0: + self.serializeError("Unexpected </ in CDATA") + yield self.encode(token["data"]) + else: + yield self.encode(escape(token["data"])) + + elif type in ("StartTag", "EmptyTag"): + name = token["name"] + yield self.encodeStrict("<%s" % name) + if name in rcdataElements and not self.escape_rcdata: + in_cdata = True + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + for (_, attr_name), attr_value in token["data"].items(): + # TODO: Add namespace support here + k = attr_name + v = attr_value + yield self.encodeStrict(' ') + + yield self.encodeStrict(k) + if not self.minimize_boolean_attributes or \ + (k not in booleanAttributes.get(name, tuple()) and + k not in booleanAttributes.get("", tuple())): + yield self.encodeStrict("=") + if self.quote_attr_values == "always" or len(v) == 0: + quote_attr = True + elif self.quote_attr_values == "spec": + quote_attr = _quoteAttributeSpec.search(v) is not None + elif self.quote_attr_values == "legacy": + quote_attr = _quoteAttributeLegacy.search(v) is not None + else: + raise ValueError("quote_attr_values must be one of: " + "'always', 'spec', or 'legacy'") + v = v.replace("&", "&") + if self.escape_lt_in_attrs: + v = v.replace("<", "<") + if quote_attr: + quote_char = self.quote_char + if self.use_best_quote_char: + if "'" in v and '"' not in v: + quote_char = '"' + elif '"' in v and "'" not in v: + quote_char = "'" + if quote_char == "'": + v = v.replace("'", "'") + else: + v = v.replace('"', """) + yield self.encodeStrict(quote_char) + yield self.encode(v) + yield self.encodeStrict(quote_char) + else: + yield self.encode(v) + if name in voidElements and self.use_trailing_solidus: + if self.space_before_trailing_solidus: + yield self.encodeStrict(" /") + else: + yield self.encodeStrict("/") + yield self.encode(">") + + elif type == "EndTag": + name = token["name"] + if name in rcdataElements: + in_cdata = False + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + yield self.encodeStrict("</%s>" % name) + + elif type == "Comment": + data = token["data"] + if data.find("--") >= 0: + self.serializeError("Comment contains --") + yield self.encodeStrict("<!--%s-->" % token["data"]) + + elif type == "Entity": + name = token["name"] + key = name + ";" + if key not in entities: + self.serializeError("Entity %s not recognized" % name) + if self.resolve_entities and key not in xmlEntities: + data = entities[key] + else: + data = "&%s;" % name + yield self.encodeStrict(data) + + else: + self.serializeError(token["data"]) + + def render(self, treewalker, encoding=None): + if encoding: + return b"".join(list(self.serialize(treewalker, encoding))) + else: + return "".join(list(self.serialize(treewalker))) + + def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): + # XXX The idea is to make data mandatory. + self.errors.append(data) + if self.strict: + raise SerializeError + + +class SerializeError(Exception): + """Error in serialized tree""" + pass diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..4f97846602bae0016a1894f689abcc583b2b71c3 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/__init__.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import sax + +__all__ = ["sax"] + +try: + from . import genshi # noqa +except ImportError: + pass +else: + __all__.append("genshi") diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/genshi.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/genshi.py new file mode 100644 index 0000000000000000000000000000000000000000..04e316df5e3763f345566e28a4e494fd156b567d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/genshi.py @@ -0,0 +1,47 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName, Attrs +from genshi.core import START, END, TEXT, COMMENT, DOCTYPE + + +def to_genshi(walker): + text = [] + for token in walker: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + text.append(token["data"]) + elif text: + yield TEXT, "".join(text), (None, -1, -1) + text = [] + + if type in ("StartTag", "EmptyTag"): + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) + for attr, value in token["data"].items()]) + yield (START, (QName(name), attrs), (None, -1, -1)) + if type == "EmptyTag": + type = "EndTag" + + if type == "EndTag": + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + + yield END, QName(name), (None, -1, -1) + + elif type == "Comment": + yield COMMENT, token["data"], (None, -1, -1) + + elif type == "Doctype": + yield DOCTYPE, (token["name"], token["publicId"], + token["systemId"]), (None, -1, -1) + + else: + pass # FIXME: What to do? + + if text: + yield TEXT, "".join(text), (None, -1, -1) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/sax.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/sax.py new file mode 100644 index 0000000000000000000000000000000000000000..ad47df95648cd79722504ac5ceb0a396557c1e71 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treeadapters/sax.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.sax.xmlreader import AttributesNSImpl + +from ..constants import adjustForeignAttributes, unadjustForeignAttributes + +prefix_mapping = {} +for prefix, localName, namespace in adjustForeignAttributes.values(): + if prefix is not None: + prefix_mapping[prefix] = namespace + + +def to_sax(walker, handler): + """Call SAX-like content handler based on treewalker walker""" + handler.startDocument() + for prefix, namespace in prefix_mapping.items(): + handler.startPrefixMapping(prefix, namespace) + + for token in walker: + type = token["type"] + if type == "Doctype": + continue + elif type in ("StartTag", "EmptyTag"): + attrs = AttributesNSImpl(token["data"], + unadjustForeignAttributes) + handler.startElementNS((token["namespace"], token["name"]), + token["name"], + attrs) + if type == "EmptyTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type == "EndTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type in ("Characters", "SpaceCharacters"): + handler.characters(token["data"]) + elif type == "Comment": + pass + else: + assert False, "Unknown token type" + + for prefix, namespace in prefix_mapping.items(): + handler.endPrefixMapping(prefix) + handler.endDocument() diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e23288474fc6445e48a0be0e2a554416af5431b6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/__init__.py @@ -0,0 +1,76 @@ +"""A collection of modules for building different kinds of tree from +HTML documents. + +To create a treebuilder for a new type of tree, you need to do +implement several things: + +1) A set of classes for various types of elements: Document, Doctype, +Comment, Element. These must implement the interface of +_base.treebuilders.Node (although comment nodes have a different +signature for their constructor, see treebuilders.etree.Comment) +Textual content may also be implemented as another node type, or not, as +your tree implementation requires. + +2) A treebuilder object (called TreeBuilder by convention) that +inherits from treebuilders._base.TreeBuilder. This has 4 required attributes: +documentClass - the class to use for the bottommost node of a document +elementClass - the class to use for HTML Elements +commentClass - the class to use for comments +doctypeClass - the class to use for doctypes +It also has one required method: +getDocument - Returns the root node of the complete document tree + +3) If you wish to run the unit tests, you must also create a +testSerializer method on your treebuilder which accepts a node and +returns a string containing Node and its children serialized according +to the format used in the unittests +""" + +from __future__ import absolute_import, division, unicode_literals + +from .._utils import default_etree + +treeBuilderCache = {} + + +def getTreeBuilder(treeType, implementation=None, **kwargs): + """Get a TreeBuilder class for various types of tree with built-in support + + treeType - the name of the tree type required (case-insensitive). Supported + values are: + + "dom" - A generic builder for DOM implementations, defaulting to + a xml.dom.minidom based implementation. + "etree" - A generic builder for tree implementations exposing an + ElementTree-like interface, defaulting to + xml.etree.cElementTree if available and + xml.etree.ElementTree if not. + "lxml" - A etree-based builder for lxml.etree, handling + limitations of lxml's implementation. + + implementation - (Currently applies to the "etree" and "dom" tree types). A + module implementing the tree type e.g. + xml.etree.ElementTree or xml.etree.cElementTree.""" + + treeType = treeType.lower() + if treeType not in treeBuilderCache: + if treeType == "dom": + from . import dom + # Come up with a sane default (pref. from the stdlib) + if implementation is None: + from xml.dom import minidom + implementation = minidom + # NEVER cache here, caching is done in the dom submodule + return dom.getDomModule(implementation, **kwargs).TreeBuilder + elif treeType == "lxml": + from . import etree_lxml + treeBuilderCache[treeType] = etree_lxml.TreeBuilder + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeBuilder + else: + raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) + return treeBuilderCache.get(treeType) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/base.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/base.py new file mode 100644 index 0000000000000000000000000000000000000000..9798f7cfb979ae5324a0fba27ae56b79dce716dc --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/base.py @@ -0,0 +1,383 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from ..constants import scopingElements, tableInsertModeElements, namespaces + +# The scope markers are inserted when entering object elements, +# marquees, table cells, and table captions, and are used to prevent formatting +# from "leaking" into tables, object elements, and marquees. +Marker = None + +listElementsMap = { + None: (frozenset(scopingElements), False), + "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), + "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), + (namespaces["html"], "ul")])), False), + "table": (frozenset([(namespaces["html"], "html"), + (namespaces["html"], "table")]), False), + "select": (frozenset([(namespaces["html"], "optgroup"), + (namespaces["html"], "option")]), True) +} + + +class Node(object): + def __init__(self, name): + """Node representing an item in the tree. + name - The tag name associated with the node + parent - The parent of the current node (or None for the document node) + value - The value of the current node (applies to text nodes and + comments + attributes - a dict holding name, value pairs for attributes of the node + childNodes - a list of child nodes of the current node. This must + include all elements but not necessarily other node types + _flags - A list of miscellaneous flags that can be set on the node + """ + self.name = name + self.parent = None + self.value = None + self.attributes = {} + self.childNodes = [] + self._flags = [] + + def __str__(self): + attributesStr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in + self.attributes.items()]) + if attributesStr: + return "<%s %s>" % (self.name, attributesStr) + else: + return "<%s>" % (self.name) + + def __repr__(self): + return "<%s>" % (self.name) + + def appendChild(self, node): + """Insert node as a child of the current node + """ + raise NotImplementedError + + def insertText(self, data, insertBefore=None): + """Insert data as text in the current node, positioned before the + start of node insertBefore or to the end of the node's text. + """ + raise NotImplementedError + + def insertBefore(self, node, refNode): + """Insert node as a child of the current node, before refNode in the + list of child nodes. Raises ValueError if refNode is not a child of + the current node""" + raise NotImplementedError + + def removeChild(self, node): + """Remove node from the children of the current node + """ + raise NotImplementedError + + def reparentChildren(self, newParent): + """Move all the children of the current node to newParent. + This is needed so that trees that don't store text as nodes move the + text in the correct way + """ + # XXX - should this method be made more general? + for child in self.childNodes: + newParent.appendChild(child) + self.childNodes = [] + + def cloneNode(self): + """Return a shallow copy of the current node i.e. a node with the same + name and attributes but with no parent or child nodes + """ + raise NotImplementedError + + def hasContent(self): + """Return true if the node has children or text, false otherwise + """ + raise NotImplementedError + + +class ActiveFormattingElements(list): + def append(self, node): + equalCount = 0 + if node != Marker: + for element in self[::-1]: + if element == Marker: + break + if self.nodesEqual(element, node): + equalCount += 1 + if equalCount == 3: + self.remove(element) + break + list.append(self, node) + + def nodesEqual(self, node1, node2): + if not node1.nameTuple == node2.nameTuple: + return False + + if not node1.attributes == node2.attributes: + return False + + return True + + +class TreeBuilder(object): + """Base treebuilder implementation + documentClass - the class to use for the bottommost node of a document + elementClass - the class to use for HTML Elements + commentClass - the class to use for comments + doctypeClass - the class to use for doctypes + """ + # pylint:disable=not-callable + + # Document class + documentClass = None + + # The class to use for creating a node + elementClass = None + + # The class to use for creating comments + commentClass = None + + # The class to use for creating doctypes + doctypeClass = None + + # Fragment class + fragmentClass = None + + def __init__(self, namespaceHTMLElements): + if namespaceHTMLElements: + self.defaultNamespace = "http://www.w3.org/1999/xhtml" + else: + self.defaultNamespace = None + self.reset() + + def reset(self): + self.openElements = [] + self.activeFormattingElements = ActiveFormattingElements() + + # XXX - rename these to headElement, formElement + self.headPointer = None + self.formPointer = None + + self.insertFromTable = False + + self.document = self.documentClass() + + def elementInScope(self, target, variant=None): + + # If we pass a node in we match that. if we pass a string + # match any node with that name + exactNode = hasattr(target, "nameTuple") + if not exactNode: + if isinstance(target, text_type): + target = (namespaces["html"], target) + assert isinstance(target, tuple) + + listElements, invert = listElementsMap[variant] + + for node in reversed(self.openElements): + if exactNode and node == target: + return True + elif not exactNode and node.nameTuple == target: + return True + elif (invert ^ (node.nameTuple in listElements)): + return False + + assert False # We should never reach this point + + def reconstructActiveFormattingElements(self): + # Within this algorithm the order of steps described in the + # specification is not quite the same as the order of steps in the + # code. It should still do the same though. + + # Step 1: stop the algorithm when there's nothing to do. + if not self.activeFormattingElements: + return + + # Step 2 and step 3: we start with the last element. So i is -1. + i = len(self.activeFormattingElements) - 1 + entry = self.activeFormattingElements[i] + if entry == Marker or entry in self.openElements: + return + + # Step 6 + while entry != Marker and entry not in self.openElements: + if i == 0: + # This will be reset to 0 below + i = -1 + break + i -= 1 + # Step 5: let entry be one earlier in the list. + entry = self.activeFormattingElements[i] + + while True: + # Step 7 + i += 1 + + # Step 8 + entry = self.activeFormattingElements[i] + clone = entry.cloneNode() # Mainly to get a new copy of the attributes + + # Step 9 + element = self.insertElement({"type": "StartTag", + "name": clone.name, + "namespace": clone.namespace, + "data": clone.attributes}) + + # Step 10 + self.activeFormattingElements[i] = element + + # Step 11 + if element == self.activeFormattingElements[-1]: + break + + def clearActiveFormattingElements(self): + entry = self.activeFormattingElements.pop() + while self.activeFormattingElements and entry != Marker: + entry = self.activeFormattingElements.pop() + + def elementInActiveFormattingElements(self, name): + """Check if an element exists between the end of the active + formatting elements and the last marker. If it does, return it, else + return false""" + + for item in self.activeFormattingElements[::-1]: + # Check for Marker first because if it's a Marker it doesn't have a + # name attribute. + if item == Marker: + break + elif item.name == name: + return item + return False + + def insertRoot(self, token): + element = self.createElement(token) + self.openElements.append(element) + self.document.appendChild(element) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + doctype = self.doctypeClass(name, publicId, systemId) + self.document.appendChild(doctype) + + def insertComment(self, token, parent=None): + if parent is None: + parent = self.openElements[-1] + parent.appendChild(self.commentClass(token["data"])) + + def createElement(self, token): + """Create an element but don't insert it anywhere""" + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + return element + + def _getInsertFromTable(self): + return self._insertFromTable + + def _setInsertFromTable(self, value): + """Switch the function used to insert an element from the + normal one to the misnested table one and back again""" + self._insertFromTable = value + if value: + self.insertElement = self.insertElementTable + else: + self.insertElement = self.insertElementNormal + + insertFromTable = property(_getInsertFromTable, _setInsertFromTable) + + def insertElementNormal(self, token): + name = token["name"] + assert isinstance(name, text_type), "Element %s not unicode" % name + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + self.openElements[-1].appendChild(element) + self.openElements.append(element) + return element + + def insertElementTable(self, token): + """Create an element and insert it into the tree""" + element = self.createElement(token) + if self.openElements[-1].name not in tableInsertModeElements: + return self.insertElementNormal(token) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + if insertBefore is None: + parent.appendChild(element) + else: + parent.insertBefore(element, insertBefore) + self.openElements.append(element) + return element + + def insertText(self, data, parent=None): + """Insert text data.""" + if parent is None: + parent = self.openElements[-1] + + if (not self.insertFromTable or (self.insertFromTable and + self.openElements[-1].name + not in tableInsertModeElements)): + parent.insertText(data) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + parent.insertText(data, insertBefore) + + def getTableMisnestedNodePosition(self): + """Get the foster parent element, and sibling to insert before + (or None) when inserting a misnested table node""" + # The foster parent element is the one which comes before the most + # recently opened table element + # XXX - this is really inelegant + lastTable = None + fosterParent = None + insertBefore = None + for elm in self.openElements[::-1]: + if elm.name == "table": + lastTable = elm + break + if lastTable: + # XXX - we should really check that this parent is actually a + # node here + if lastTable.parent: + fosterParent = lastTable.parent + insertBefore = lastTable + else: + fosterParent = self.openElements[ + self.openElements.index(lastTable) - 1] + else: + fosterParent = self.openElements[0] + return fosterParent, insertBefore + + def generateImpliedEndTags(self, exclude=None): + name = self.openElements[-1].name + # XXX td, th and tr are not actually needed + if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and + name != exclude): + self.openElements.pop() + # XXX This is not entirely what the specification says. We should + # investigate it more closely. + self.generateImpliedEndTags(exclude) + + def getDocument(self): + "Return the final tree" + return self.document + + def getFragment(self): + "Return the final fragment" + # assert self.innerHTML + fragment = self.fragmentClass() + self.openElements[0].reparentChildren(fragment) + return fragment + + def testSerializer(self, node): + """Serialize the subtree of node in the format required by unit tests + node - the node from which to start serializing""" + raise NotImplementedError diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/dom.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/dom.py new file mode 100644 index 0000000000000000000000000000000000000000..dcfac220bfaf9906b1f57ee747baff2a627cfa58 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/dom.py @@ -0,0 +1,236 @@ +from __future__ import absolute_import, division, unicode_literals + + +from collections import MutableMapping +from xml.dom import minidom, Node +import weakref + +from . import base +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + + +def getDomBuilder(DomImplementation): + Dom = DomImplementation + + class AttrList(MutableMapping): + def __init__(self, element): + self.element = element + + def __iter__(self): + return iter(self.element.attributes.keys()) + + def __setitem__(self, name, value): + if isinstance(name, tuple): + raise NotImplementedError + else: + attr = self.element.ownerDocument.createAttribute(name) + attr.value = value + self.element.attributes[name] = attr + + def __len__(self): + return len(self.element.attributes) + + def items(self): + return list(self.element.attributes.items()) + + def values(self): + return list(self.element.attributes.values()) + + def __getitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + return self.element.attributes[name].value + + def __delitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + del self.element.attributes[name] + + class NodeBuilder(base.Node): + def __init__(self, element): + base.Node.__init__(self, element.nodeName) + self.element = element + + namespace = property(lambda self: hasattr(self.element, "namespaceURI") and + self.element.namespaceURI or None) + + def appendChild(self, node): + node.parent = self + self.element.appendChild(node.element) + + def insertText(self, data, insertBefore=None): + text = self.element.ownerDocument.createTextNode(data) + if insertBefore: + self.element.insertBefore(text, insertBefore.element) + else: + self.element.appendChild(text) + + def insertBefore(self, node, refNode): + self.element.insertBefore(node.element, refNode.element) + node.parent = self + + def removeChild(self, node): + if node.element.parentNode == self.element: + self.element.removeChild(node.element) + node.parent = None + + def reparentChildren(self, newParent): + while self.element.hasChildNodes(): + child = self.element.firstChild + self.element.removeChild(child) + newParent.element.appendChild(child) + self.childNodes = [] + + def getAttributes(self): + return AttrList(self.element) + + def setAttributes(self, attributes): + if attributes: + for name, value in list(attributes.items()): + if isinstance(name, tuple): + if name[0] is not None: + qualifiedName = (name[0] + ":" + name[1]) + else: + qualifiedName = name[1] + self.element.setAttributeNS(name[2], qualifiedName, + value) + else: + self.element.setAttribute( + name, value) + attributes = property(getAttributes, setAttributes) + + def cloneNode(self): + return NodeBuilder(self.element.cloneNode(False)) + + def hasContent(self): + return self.element.hasChildNodes() + + def getNameTuple(self): + if self.namespace is None: + return namespaces["html"], self.name + else: + return self.namespace, self.name + + nameTuple = property(getNameTuple) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + def documentClass(self): + self.dom = Dom.getDOMImplementation().createDocument(None, None, None) + return weakref.proxy(self) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + domimpl = Dom.getDOMImplementation() + doctype = domimpl.createDocumentType(name, publicId, systemId) + self.document.appendChild(NodeBuilder(doctype)) + if Dom == minidom: + doctype.ownerDocument = self.dom + + def elementClass(self, name, namespace=None): + if namespace is None and self.defaultNamespace is None: + node = self.dom.createElement(name) + else: + node = self.dom.createElementNS(namespace, name) + + return NodeBuilder(node) + + def commentClass(self, data): + return NodeBuilder(self.dom.createComment(data)) + + def fragmentClass(self): + return NodeBuilder(self.dom.createDocumentFragment()) + + def appendChild(self, node): + self.dom.appendChild(node.element) + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + return self.dom + + def getFragment(self): + return base.TreeBuilder.getFragment(self).element + + def insertText(self, data, parent=None): + data = data + if parent != self: + base.TreeBuilder.insertText(self, data, parent) + else: + # HACK: allow text nodes as children of the document node + if hasattr(self.dom, '_child_node_types'): + # pylint:disable=protected-access + if Node.TEXT_NODE not in self.dom._child_node_types: + self.dom._child_node_types = list(self.dom._child_node_types) + self.dom._child_node_types.append(Node.TEXT_NODE) + self.dom.appendChild(self.dom.createTextNode(data)) + + implementation = DomImplementation + name = None + + def testSerializer(element): + element.normalize() + rv = [] + + def serializeElement(element, indent=0): + if element.nodeType == Node.DOCUMENT_TYPE_NODE: + if element.name: + if element.publicId or element.systemId: + publicId = element.publicId or "" + systemId = element.systemId or "" + rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % + (' ' * indent, element.name, publicId, systemId)) + else: + rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) + else: + rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) + elif element.nodeType == Node.DOCUMENT_NODE: + rv.append("#document") + elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + rv.append("#document-fragment") + elif element.nodeType == Node.COMMENT_NODE: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) + elif element.nodeType == Node.TEXT_NODE: + rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) + else: + if (hasattr(element, "namespaceURI") and + element.namespaceURI is not None): + name = "%s %s" % (constants.prefixes[element.namespaceURI], + element.nodeName) + else: + name = element.nodeName + rv.append("|%s<%s>" % (' ' * indent, name)) + if element.hasAttributes(): + attributes = [] + for i in range(len(element.attributes)): + attr = element.attributes.item(i) + name = attr.nodeName + value = attr.value + ns = attr.namespaceURI + if ns: + name = "%s %s" % (constants.prefixes[ns], attr.localName) + else: + name = attr.nodeName + attributes.append((name, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + indent += 2 + for child in element.childNodes: + serializeElement(child, indent) + serializeElement(element, 0) + + return "\n".join(rv) + + return locals() + + +# The actual means to get a module! +getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree.py new file mode 100644 index 0000000000000000000000000000000000000000..0dedf441643902d5258b4aef64f001f9282e7220 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree.py @@ -0,0 +1,340 @@ +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +from pip._vendor.six import text_type + +import re + +from . import base +from .. import _ihatexml +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation, fullTree=False): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class Element(base.Node): + def __init__(self, name, namespace=None): + self._name = name + self._namespace = namespace + self._element = ElementTree.Element(self._getETreeTag(name, + namespace)) + if namespace is None: + self.nameTuple = namespaces["html"], self._name + else: + self.nameTuple = self._namespace, self._name + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getETreeTag(self, name, namespace): + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + return etree_tag + + def _setName(self, name): + self._name = name + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getName(self): + return self._name + + name = property(_getName, _setName) + + def _setNamespace(self, namespace): + self._namespace = namespace + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getNamespace(self): + return self._namespace + + namespace = property(_getNamespace, _setNamespace) + + def _getAttributes(self): + return self._element.attrib + + def _setAttributes(self, attributes): + # Delete existing attributes first + # XXX - there may be a better way to do this... + for key in list(self._element.attrib.keys()): + del self._element.attrib[key] + for key, value in attributes.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], key[1]) + else: + name = key + self._element.set(name, value) + + attributes = property(_getAttributes, _setAttributes) + + def _getChildNodes(self): + return self._childNodes + + def _setChildNodes(self, value): + del self._element[:] + self._childNodes = [] + for element in value: + self.insertChild(element) + + childNodes = property(_getChildNodes, _setChildNodes) + + def hasContent(self): + """Return true if the node has children or text""" + return bool(self._element.text or len(self._element)) + + def appendChild(self, node): + self._childNodes.append(node) + self._element.append(node._element) + node.parent = self + + def insertBefore(self, node, refNode): + index = list(self._element).index(refNode._element) + self._element.insert(index, node._element) + node.parent = self + + def removeChild(self, node): + self._childNodes.remove(node) + self._element.remove(node._element) + node.parent = None + + def insertText(self, data, insertBefore=None): + if not(len(self._element)): + if not self._element.text: + self._element.text = "" + self._element.text += data + elif insertBefore is None: + # Insert the text as the tail of the last child element + if not self._element[-1].tail: + self._element[-1].tail = "" + self._element[-1].tail += data + else: + # Insert the text before the specified node + children = list(self._element) + index = children.index(insertBefore._element) + if index > 0: + if not self._element[index - 1].tail: + self._element[index - 1].tail = "" + self._element[index - 1].tail += data + else: + if not self._element.text: + self._element.text = "" + self._element.text += data + + def cloneNode(self): + element = type(self)(self.name, self.namespace) + for name, value in self.attributes.items(): + element.attributes[name] = value + return element + + def reparentChildren(self, newParent): + if newParent.childNodes: + newParent.childNodes[-1]._element.tail += self._element.text + else: + if not newParent._element.text: + newParent._element.text = "" + if self._element.text is not None: + newParent._element.text += self._element.text + self._element.text = "" + base.Node.reparentChildren(self, newParent) + + class Comment(Element): + def __init__(self, data): + # Use the superclass constructor to set all properties on the + # wrapper element + self._element = ElementTree.Comment(data) + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getData(self): + return self._element.text + + def _setData(self, value): + self._element.text = value + + data = property(_getData, _setData) + + class DocumentType(Element): + def __init__(self, name, publicId, systemId): + Element.__init__(self, "<!DOCTYPE>") + self._element.text = name + self.publicId = publicId + self.systemId = systemId + + def _getPublicId(self): + return self._element.get("publicId", "") + + def _setPublicId(self, value): + if value is not None: + self._element.set("publicId", value) + + publicId = property(_getPublicId, _setPublicId) + + def _getSystemId(self): + return self._element.get("systemId", "") + + def _setSystemId(self, value): + if value is not None: + self._element.set("systemId", value) + + systemId = property(_getSystemId, _setSystemId) + + class Document(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_ROOT") + + class DocumentFragment(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_FRAGMENT") + + def testSerializer(element): + rv = [] + + def serializeElement(element, indent=0): + if not(hasattr(element, "tag")): + element = element.getroot() + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + rv.append("#document") + if element.text is not None: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + elif element.tag == ElementTreeCommentType: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + else: + assert isinstance(element.tag, text_type), \ + "Expected unicode, got %s, %s" % (type(element.tag), element.tag) + nsmatch = tag_regexp.match(element.tag) + + if nsmatch is None: + name = element.tag + else: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + name = "%s %s" % (prefix, name) + rv.append("|%s<%s>" % (' ' * indent, name)) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = name + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + def tostring(element): # pylint:disable=unused-variable + """Serialize an element and its child nodes to a string""" + rv = [] + filter = _ihatexml.InfosetFilter() + + def serializeElement(element): + if isinstance(element, ElementTree.ElementTree): + element = element.getroot() + + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + if element.text is not None: + rv.append(element.text) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + + for child in element: + serializeElement(child) + + elif element.tag == ElementTreeCommentType: + rv.append("<!--%s-->" % (element.text,)) + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (filter.fromXmlName(element.tag),)) + else: + attr = " ".join(["%s=\"%s\"" % ( + filter.fromXmlName(name), value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + documentClass = Document + doctypeClass = DocumentType + elementClass = Element + commentClass = Comment + fragmentClass = DocumentFragment + implementation = ElementTreeImplementation + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._element + else: + if self.defaultNamespace is not None: + return self.document._element.find( + "{%s}html" % self.defaultNamespace) + else: + return self.document._element.find("html") + + def getFragment(self): + return base.TreeBuilder.getFragment(self)._element + + return locals() + + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 0000000000000000000000000000000000000000..908820c08104c24a9f9c7851252f6af8d8c25355 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treebuilders/etree_lxml.py @@ -0,0 +1,367 @@ +"""Module for supporting the lxml.etree library. The idea here is to use as much +of the native library as possible, without using fragile hacks like custom element +names that break between releases. The downside of this is that we cannot represent +all possible trees; specifically the following are known to cause problems: + +Text or comments as siblings of the root element +Docypes with no name + +When any of these things occur, we emit a DataLossWarning +""" + +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +import warnings +import re +import sys + +from . import base +from ..constants import DataLossWarning +from .. import constants +from . import etree as etree_builders +from .. import _ihatexml + +import lxml.etree as etree + + +fullTree = True +tag_regexp = re.compile("{([^}]*)}(.*)") + +comment_type = etree.Comment("asd").tag + + +class DocumentType(object): + def __init__(self, name, publicId, systemId): + self.name = name + self.publicId = publicId + self.systemId = systemId + + +class Document(object): + def __init__(self): + self._elementTree = None + self._childNodes = [] + + def appendChild(self, element): + self._elementTree.getroot().addnext(element._element) + + def _getChildNodes(self): + return self._childNodes + + childNodes = property(_getChildNodes) + + +def testSerializer(element): + rv = [] + infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + + def serializeElement(element, indent=0): + if not hasattr(element, "tag"): + if hasattr(element, "getroot"): + # Full tree case + rv.append("#document") + if element.docinfo.internalDTD: + if not (element.docinfo.public_id or + element.docinfo.system_url): + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + else: + dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( + element.docinfo.root_name, + element.docinfo.public_id, + element.docinfo.system_url) + rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) + next_element = element.getroot() + while next_element.getprevious() is not None: + next_element = next_element.getprevious() + while next_element is not None: + serializeElement(next_element, indent + 2) + next_element = next_element.getnext() + elif isinstance(element, str) or isinstance(element, bytes): + # Text in a fragment + assert isinstance(element, str) or sys.version_info[0] == 2 + rv.append("|%s\"%s\"" % (' ' * indent, element)) + else: + # Fragment case + rv.append("#document-fragment") + for next_element in element: + serializeElement(next_element, indent + 2) + elif element.tag == comment_type: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) + else: + assert isinstance(element, etree._Element) + nsmatch = etree_builders.tag_regexp.match(element.tag) + if nsmatch is not None: + ns = nsmatch.group(1) + tag = nsmatch.group(2) + prefix = constants.prefixes[ns] + rv.append("|%s<%s %s>" % (' ' * indent, prefix, + infosetFilter.fromXmlName(tag))) + else: + rv.append("|%s<%s>" % (' ' * indent, + infosetFilter.fromXmlName(element.tag))) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + name = infosetFilter.fromXmlName(name) + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = infosetFilter.fromXmlName(name) + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + +def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + + def serializeElement(element): + if not hasattr(element, "tag"): + if element.docinfo.internalDTD: + if element.docinfo.doctype: + dtd_str = element.docinfo.doctype + else: + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + rv.append(dtd_str) + serializeElement(element.getroot()) + + elif element.tag == comment_type: + rv.append("<!--%s-->" % (element.text,)) + + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (element.tag,)) + else: + attr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if hasattr(element, "tail") and element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + +class TreeBuilder(base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = None + commentClass = None + fragmentClass = Document + implementation = etree + + def __init__(self, namespaceHTMLElements, fullTree=False): + builder = etree_builders.getETreeModule(etree, fullTree=fullTree) + infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + self.namespaceHTMLElements = namespaceHTMLElements + + class Attributes(dict): + def __init__(self, element, value=None): + if value is None: + value = {} + self._element = element + dict.__init__(self, value) # pylint:disable=non-parent-init-called + for key, value in self.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + class Element(builder.Element): + def __init__(self, name, namespace): + name = infosetFilter.coerceElement(name) + builder.Element.__init__(self, name, namespace=namespace) + self._attributes = Attributes(self) + + def _setName(self, name): + self._name = infosetFilter.coerceElement(name) + self._element.tag = self._getETreeTag( + self._name, self._namespace) + + def _getName(self): + return infosetFilter.fromXmlName(self._name) + + name = property(_getName, _setName) + + def _getAttributes(self): + return self._attributes + + def _setAttributes(self, attributes): + self._attributes = Attributes(self, attributes) + + attributes = property(_getAttributes, _setAttributes) + + def insertText(self, data, insertBefore=None): + data = infosetFilter.coerceCharacters(data) + builder.Element.insertText(self, data, insertBefore) + + def appendChild(self, child): + builder.Element.appendChild(self, child) + + class Comment(builder.Comment): + def __init__(self, data): + data = infosetFilter.coerceComment(data) + builder.Comment.__init__(self, data) + + def _setData(self, data): + data = infosetFilter.coerceComment(data) + self._element.text = data + + def _getData(self): + return self._element.text + + data = property(_getData, _setData) + + self.elementClass = Element + self.commentClass = Comment + # self.fragmentClass = builder.DocumentFragment + base.TreeBuilder.__init__(self, namespaceHTMLElements) + + def reset(self): + base.TreeBuilder.reset(self) + self.insertComment = self.insertCommentInitial + self.initial_comments = [] + self.doctype = None + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._elementTree + else: + return self.document._elementTree.getroot() + + def getFragment(self): + fragment = [] + element = self.openElements[0]._element + if element.text: + fragment.append(element.text) + fragment.extend(list(element)) + if element.tail: + fragment.append(element.tail) + return fragment + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + if not name: + warnings.warn("lxml cannot represent empty doctype", DataLossWarning) + self.doctype = None + else: + coercedName = self.infosetFilter.coerceElement(name) + if coercedName != name: + warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) + + doctype = self.doctypeClass(coercedName, publicId, systemId) + self.doctype = doctype + + def insertCommentInitial(self, data, parent=None): + assert parent is None or parent is self.document + assert self.document._elementTree is None + self.initial_comments.append(data) + + def insertCommentMain(self, data, parent=None): + if (parent == self.document and + self.document._elementTree.getroot()[-1].tag == comment_type): + warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) + super(TreeBuilder, self).insertComment(data, parent) + + def insertRoot(self, token): + """Create the document root""" + # Because of the way libxml2 works, it doesn't seem to be possible to + # alter information like the doctype after the tree has been parsed. + # Therefore we need to use the built-in parser to create our initial + # tree, after which we can add elements like normal + docStr = "" + if self.doctype: + assert self.doctype.name + docStr += "<!DOCTYPE %s" % self.doctype.name + if (self.doctype.publicId is not None or + self.doctype.systemId is not None): + docStr += (' PUBLIC "%s" ' % + (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) + if self.doctype.systemId: + sysid = self.doctype.systemId + if sysid.find("'") >= 0 and sysid.find('"') >= 0: + warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) + sysid = sysid.replace("'", 'U00027') + if sysid.find("'") >= 0: + docStr += '"%s"' % sysid + else: + docStr += "'%s'" % sysid + else: + docStr += "''" + docStr += ">" + if self.doctype.name != token["name"]: + warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) + docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" + root = etree.fromstring(docStr) + + # Append the initial comments: + for comment_token in self.initial_comments: + comment = self.commentClass(comment_token["data"]) + root.addprevious(comment._element) + + # Create the root document and add the ElementTree to it + self.document = self.documentClass() + self.document._elementTree = root.getroottree() + + # Give the root element the right name + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + root.tag = etree_tag + + # Add the root element to the internal child/open data structures + root_element = self.elementClass(name, namespace) + root_element._element = root + self.document._childNodes.append(root_element) + self.openElements.append(root_element) + + # Reset to the default insert comment function + self.insertComment = self.insertCommentMain diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/__init__.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9e19a5595af928738fa0e1ab2bc4513e02ebc026 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/__init__.py @@ -0,0 +1,143 @@ +"""A collection of modules for iterating through different kinds of +tree, generating tokens identical to those produced by the tokenizer +module. + +To create a tree walker for a new type of tree, you need to do +implement a tree walker object (called TreeWalker by convention) that +implements a 'serialize' method taking a tree as sole argument and +returning an iterator generating tokens. +""" + +from __future__ import absolute_import, division, unicode_literals + +from .. import constants +from .._utils import default_etree + +__all__ = ["getTreeWalker", "pprint", "dom", "etree", "genshi", "etree_lxml"] + +treeWalkerCache = {} + + +def getTreeWalker(treeType, implementation=None, **kwargs): + """Get a TreeWalker class for various types of tree with built-in support + + Args: + treeType (str): the name of the tree type required (case-insensitive). + Supported values are: + + - "dom": The xml.dom.minidom DOM implementation + - "etree": A generic walker for tree implementations exposing an + elementtree-like interface (known to work with + ElementTree, cElementTree and lxml.etree). + - "lxml": Optimized walker for lxml.etree + - "genshi": a Genshi stream + + Implementation: A module implementing the tree type e.g. + xml.etree.ElementTree or cElementTree (Currently applies to the + "etree" tree type only). + """ + + treeType = treeType.lower() + if treeType not in treeWalkerCache: + if treeType == "dom": + from . import dom + treeWalkerCache[treeType] = dom.TreeWalker + elif treeType == "genshi": + from . import genshi + treeWalkerCache[treeType] = genshi.TreeWalker + elif treeType == "lxml": + from . import etree_lxml + treeWalkerCache[treeType] = etree_lxml.TreeWalker + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # XXX: NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeWalker + return treeWalkerCache.get(treeType) + + +def concatenateCharacterTokens(tokens): + pendingCharacters = [] + for token in tokens: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + pendingCharacters.append(token["data"]) + else: + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + pendingCharacters = [] + yield token + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + + +def pprint(walker): + """Pretty printer for tree walkers""" + output = [] + indent = 0 + for token in concatenateCharacterTokens(walker): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + # tag name + if token["namespace"] and token["namespace"] != constants.namespaces["html"]: + if token["namespace"] in constants.prefixes: + ns = constants.prefixes[token["namespace"]] + else: + ns = token["namespace"] + name = "%s %s" % (ns, token["name"]) + else: + name = token["name"] + output.append("%s<%s>" % (" " * indent, name)) + indent += 2 + # attributes (sorted for consistent ordering) + attrs = token["data"] + for (namespace, localname), value in sorted(attrs.items()): + if namespace: + if namespace in constants.prefixes: + ns = constants.prefixes[namespace] + else: + ns = namespace + name = "%s %s" % (ns, localname) + else: + name = localname + output.append("%s%s=\"%s\"" % (" " * indent, name, value)) + # self-closing + if type == "EmptyTag": + indent -= 2 + + elif type == "EndTag": + indent -= 2 + + elif type == "Comment": + output.append("%s<!-- %s -->" % (" " * indent, token["data"])) + + elif type == "Doctype": + if token["name"]: + if token["publicId"]: + output.append("""%s<!DOCTYPE %s "%s" "%s">""" % + (" " * indent, + token["name"], + token["publicId"], + token["systemId"] if token["systemId"] else "")) + elif token["systemId"]: + output.append("""%s<!DOCTYPE %s "" "%s">""" % + (" " * indent, + token["name"], + token["systemId"])) + else: + output.append("%s<!DOCTYPE %s>" % (" " * indent, + token["name"])) + else: + output.append("%s<!DOCTYPE >" % (" " * indent,)) + + elif type == "Characters": + output.append("%s\"%s\"" % (" " * indent, token["data"])) + + elif type == "SpaceCharacters": + assert False, "concatenateCharacterTokens should have got rid of all Space tokens" + + else: + raise ValueError("Unknown token type, %s" % type) + + return "\n".join(output) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/base.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/base.py new file mode 100644 index 0000000000000000000000000000000000000000..36e1ba2420fb4375adf27f060ab8f15cf138174e --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/base.py @@ -0,0 +1,150 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node +from ..constants import namespaces, voidElements, spaceCharacters + +__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", + "TreeWalker", "NonRecursiveTreeWalker"] + +DOCUMENT = Node.DOCUMENT_NODE +DOCTYPE = Node.DOCUMENT_TYPE_NODE +TEXT = Node.TEXT_NODE +ELEMENT = Node.ELEMENT_NODE +COMMENT = Node.COMMENT_NODE +ENTITY = Node.ENTITY_NODE +UNKNOWN = "<#UNKNOWN#>" + +spaceCharacters = "".join(spaceCharacters) + + +class TreeWalker(object): + def __init__(self, tree): + self.tree = tree + + def __iter__(self): + raise NotImplementedError + + def error(self, msg): + return {"type": "SerializeError", "data": msg} + + def emptyTag(self, namespace, name, attrs, hasChildren=False): + yield {"type": "EmptyTag", "name": name, + "namespace": namespace, + "data": attrs} + if hasChildren: + yield self.error("Void element has children") + + def startTag(self, namespace, name, attrs): + return {"type": "StartTag", + "name": name, + "namespace": namespace, + "data": attrs} + + def endTag(self, namespace, name): + return {"type": "EndTag", + "name": name, + "namespace": namespace} + + def text(self, data): + data = data + middle = data.lstrip(spaceCharacters) + left = data[:len(data) - len(middle)] + if left: + yield {"type": "SpaceCharacters", "data": left} + data = middle + middle = data.rstrip(spaceCharacters) + right = data[len(middle):] + if middle: + yield {"type": "Characters", "data": middle} + if right: + yield {"type": "SpaceCharacters", "data": right} + + def comment(self, data): + return {"type": "Comment", "data": data} + + def doctype(self, name, publicId=None, systemId=None): + return {"type": "Doctype", + "name": name, + "publicId": publicId, + "systemId": systemId} + + def entity(self, name): + return {"type": "Entity", "name": name} + + def unknown(self, nodeType): + return self.error("Unknown node type: " + nodeType) + + +class NonRecursiveTreeWalker(TreeWalker): + def getNodeDetails(self, node): + raise NotImplementedError + + def getFirstChild(self, node): + raise NotImplementedError + + def getNextSibling(self, node): + raise NotImplementedError + + def getParentNode(self, node): + raise NotImplementedError + + def __iter__(self): + currentNode = self.tree + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + hasChildren = False + + if type == DOCTYPE: + yield self.doctype(*details) + + elif type == TEXT: + for token in self.text(*details): + yield token + + elif type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + for token in self.emptyTag(namespace, name, attributes, + hasChildren): + yield token + hasChildren = False + else: + yield self.startTag(namespace, name, attributes) + + elif type == COMMENT: + yield self.comment(details[0]) + + elif type == ENTITY: + yield self.entity(details[0]) + + elif type == DOCUMENT: + hasChildren = True + + else: + yield self.unknown(details[0]) + + if hasChildren: + firstChild = self.getFirstChild(currentNode) + else: + firstChild = None + + if firstChild is not None: + currentNode = firstChild + else: + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + if type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (namespace and namespace != namespaces["html"]) or name not in voidElements: + yield self.endTag(namespace, name) + if self.tree is currentNode: + currentNode = None + break + nextSibling = self.getNextSibling(currentNode) + if nextSibling is not None: + currentNode = nextSibling + break + else: + currentNode = self.getParentNode(currentNode) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/dom.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/dom.py new file mode 100644 index 0000000000000000000000000000000000000000..b0c89b001fd3b60511734c31e452c1d2053468d0 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/dom.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node + +from . import base + + +class TreeWalker(base.NonRecursiveTreeWalker): + def getNodeDetails(self, node): + if node.nodeType == Node.DOCUMENT_TYPE_NODE: + return base.DOCTYPE, node.name, node.publicId, node.systemId + + elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): + return base.TEXT, node.nodeValue + + elif node.nodeType == Node.ELEMENT_NODE: + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + if attr.namespaceURI: + attrs[(attr.namespaceURI, attr.localName)] = attr.value + else: + attrs[(None, attr.name)] = attr.value + return (base.ELEMENT, node.namespaceURI, node.nodeName, + attrs, node.hasChildNodes()) + + elif node.nodeType == Node.COMMENT_NODE: + return base.COMMENT, node.nodeValue + + elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): + return (base.DOCUMENT,) + + else: + return base.UNKNOWN, node.nodeType + + def getFirstChild(self, node): + return node.firstChild + + def getNextSibling(self, node): + return node.nextSibling + + def getParentNode(self, node): + return node.parentNode diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree.py new file mode 100644 index 0000000000000000000000000000000000000000..bcf17d170cbf6d6164a7c2fbf58c85844386c918 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree.py @@ -0,0 +1,137 @@ +from __future__ import absolute_import, division, unicode_literals + +try: + from collections import OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict + except ImportError: + OrderedDict = dict + +import re + +from pip._vendor.six import string_types + +from . import base +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class TreeWalker(base.NonRecursiveTreeWalker): # pylint:disable=unused-variable + """Given the particular ElementTree representation, this implementation, + to avoid using recursion, returns "nodes" as tuples with the following + content: + + 1. The current element + + 2. The index of the element relative to its parent + + 3. A stack of ancestor elements + + 4. A flag "text", "tail" or None to indicate if the current node is a + text node; either the text or tail of the current element (1) + """ + def getNodeDetails(self, node): + if isinstance(node, tuple): # It might be the root Element + elt, _, _, flag = node + if flag in ("text", "tail"): + return base.TEXT, getattr(elt, flag) + else: + node = elt + + if not(hasattr(node, "tag")): + node = node.getroot() + + if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): + return (base.DOCUMENT,) + + elif node.tag == "<!DOCTYPE>": + return (base.DOCTYPE, node.text, + node.get("publicId"), node.get("systemId")) + + elif node.tag == ElementTreeCommentType: + return base.COMMENT, node.text + + else: + assert isinstance(node.tag, string_types), type(node.tag) + # This is assumed to be an ordinary element + match = tag_regexp.match(node.tag) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = node.tag + attrs = OrderedDict() + for name, value in list(node.attrib.items()): + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, tag, + attrs, len(node) or node.text) + + def getFirstChild(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + element, key, parents, flag = node, None, [], None + + if flag in ("text", "tail"): + return None + else: + if element.text: + return element, key, parents, "text" + elif len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + + def getNextSibling(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + else: + if element.tail and flag != "tail": + return element, key, parents, "tail" + elif key < len(parents[-1]) - 1: + return parents[-1][key + 1], key + 1, parents, None + else: + return None + + def getParentNode(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if not parents: + return element + else: + return element, key, parents, None + else: + parent = parents.pop() + if not parents: + return parent + else: + assert list(parents[-1]).count(parent) == 1 + return parent, list(parents[-1]).index(parent), parents, None + + return locals() + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree_lxml.py new file mode 100644 index 0000000000000000000000000000000000000000..e81ddf33b2eff3b278effd4602ef1511311ee4f6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/etree_lxml.py @@ -0,0 +1,213 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from lxml import etree +from ..treebuilders.etree import tag_regexp + +from . import base + +from .. import _ihatexml + + +def ensure_str(s): + if s is None: + return None + elif isinstance(s, text_type): + return s + else: + return s.decode("ascii", "strict") + + +class Root(object): + def __init__(self, et): + self.elementtree = et + self.children = [] + + try: + if et.docinfo.internalDTD: + self.children.append(Doctype(self, + ensure_str(et.docinfo.root_name), + ensure_str(et.docinfo.public_id), + ensure_str(et.docinfo.system_url))) + except AttributeError: + pass + + try: + node = et.getroot() + except AttributeError: + node = et + + while node.getprevious() is not None: + node = node.getprevious() + while node is not None: + self.children.append(node) + node = node.getnext() + + self.text = None + self.tail = None + + def __getitem__(self, key): + return self.children[key] + + def getnext(self): + return None + + def __len__(self): + return 1 + + +class Doctype(object): + def __init__(self, root_node, name, public_id, system_id): + self.root_node = root_node + self.name = name + self.public_id = public_id + self.system_id = system_id + + self.text = None + self.tail = None + + def getnext(self): + return self.root_node.children[1] + + +class FragmentRoot(Root): + def __init__(self, children): + self.children = [FragmentWrapper(self, child) for child in children] + self.text = self.tail = None + + def getnext(self): + return None + + +class FragmentWrapper(object): + def __init__(self, fragment_root, obj): + self.root_node = fragment_root + self.obj = obj + if hasattr(self.obj, 'text'): + self.text = ensure_str(self.obj.text) + else: + self.text = None + if hasattr(self.obj, 'tail'): + self.tail = ensure_str(self.obj.tail) + else: + self.tail = None + + def __getattr__(self, name): + return getattr(self.obj, name) + + def getnext(self): + siblings = self.root_node.children + idx = siblings.index(self) + if idx < len(siblings) - 1: + return siblings[idx + 1] + else: + return None + + def __getitem__(self, key): + return self.obj[key] + + def __bool__(self): + return bool(self.obj) + + def getparent(self): + return None + + def __str__(self): + return str(self.obj) + + def __unicode__(self): + return str(self.obj) + + def __len__(self): + return len(self.obj) + + +class TreeWalker(base.NonRecursiveTreeWalker): + def __init__(self, tree): + # pylint:disable=redefined-variable-type + if isinstance(tree, list): + self.fragmentChildren = set(tree) + tree = FragmentRoot(tree) + else: + self.fragmentChildren = set() + tree = Root(tree) + base.NonRecursiveTreeWalker.__init__(self, tree) + self.filter = _ihatexml.InfosetFilter() + + def getNodeDetails(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + return base.TEXT, ensure_str(getattr(node, key)) + + elif isinstance(node, Root): + return (base.DOCUMENT,) + + elif isinstance(node, Doctype): + return base.DOCTYPE, node.name, node.public_id, node.system_id + + elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): + return base.TEXT, ensure_str(node.obj) + + elif node.tag == etree.Comment: + return base.COMMENT, ensure_str(node.text) + + elif node.tag == etree.Entity: + return base.ENTITY, ensure_str(node.text)[1:-1] # strip &; + + else: + # This is assumed to be an ordinary element + match = tag_regexp.match(ensure_str(node.tag)) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = ensure_str(node.tag) + attrs = {} + for name, value in list(node.attrib.items()): + name = ensure_str(name) + value = ensure_str(value) + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, self.filter.fromXmlName(tag), + attrs, len(node) > 0 or node.text) + + def getFirstChild(self, node): + assert not isinstance(node, tuple), "Text nodes have no children" + + assert len(node) or node.text, "Node has no children" + if node.text: + return (node, "text") + else: + return node[0] + + def getNextSibling(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + # XXX: we cannot use a "bool(node) and node[0] or None" construct here + # because node[0] might evaluate to False if it has no child element + if len(node): + return node[0] + else: + return None + else: # tail + return node.getnext() + + return (node, "tail") if node.tail else node.getnext() + + def getParentNode(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + return node + # else: fallback to "normal" processing + elif node in self.fragmentChildren: + return None + + return node.getparent() diff --git a/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/genshi.py b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/genshi.py new file mode 100644 index 0000000000000000000000000000000000000000..7483be27d4d24f845e56b6954ee63eec730c00aa --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/html5lib/treewalkers/genshi.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName +from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT +from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT + +from . import base + +from ..constants import voidElements, namespaces + + +class TreeWalker(base.TreeWalker): + def __iter__(self): + # Buffer the events so we can pass in the following one + previous = None + for event in self.tree: + if previous is not None: + for token in self.tokens(previous, event): + yield token + previous = event + + # Don't forget the final event! + if previous is not None: + for token in self.tokens(previous, None): + yield token + + def tokens(self, event, next): + kind, data, _ = event + if kind == START: + tag, attribs = data + name = tag.localname + namespace = tag.namespace + converted_attribs = {} + for k, v in attribs: + if isinstance(k, QName): + converted_attribs[(k.namespace, k.localname)] = v + else: + converted_attribs[(None, k)] = v + + if namespace == namespaces["html"] and name in voidElements: + for token in self.emptyTag(namespace, name, converted_attribs, + not next or next[0] != END or + next[1] != tag): + yield token + else: + yield self.startTag(namespace, name, converted_attribs) + + elif kind == END: + name = data.localname + namespace = data.namespace + if namespace != namespaces["html"] or name not in voidElements: + yield self.endTag(namespace, name) + + elif kind == COMMENT: + yield self.comment(data) + + elif kind == TEXT: + for token in self.text(data): + yield token + + elif kind == DOCTYPE: + yield self.doctype(*data) + + elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, + START_CDATA, END_CDATA, PI): + pass + + else: + yield self.unknown(kind) diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/__init__.py b/vendor/pip-9.0.3/pip/_vendor/idna/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..847bf9354781fddc44ed2f47055a67c025972fd4 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/codec.py b/vendor/pip-9.0.3/pip/_vendor/idna/codec.py new file mode 100644 index 0000000000000000000000000000000000000000..98c65ead146e42b359a11703d719bafe916b1ad7 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/compat.py b/vendor/pip-9.0.3/pip/_vendor/idna/compat.py new file mode 100644 index 0000000000000000000000000000000000000000..4d47f336dbc55ca7141150c14ec1a7924dd0e854 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/core.py b/vendor/pip-9.0.3/pip/_vendor/idna/core.py new file mode 100644 index 0000000000000000000000000000000000000000..b55b664568ea4fecf954196381047a9918bd4926 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/idna/core.py @@ -0,0 +1,387 @@ +from . import idnadata +import bisect +import unicodedata +import re +import sys +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +if sys.version_info[0] == 3: + unicode = str + unichr = chr + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp): + return unicodedata.combining(unichr(cp)) + +def _is_script(cp, script): + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s): + return s.encode('punycode') + +def _unot(s): + return 'U+{0:04X}'.format(s) + + +def valid_label_length(label): + + if len(label) > 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + break + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + try: + ulabel(label) + except IDNAError: + raise IDNAError('The label {0} is not a valid A-label'.format(label)) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + while labels and not labels[0]: + del labels[0] + if not labels: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + result.append(alabel(label)) + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + while labels and not labels[0]: + del labels[0] + if not labels: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + result.append(ulabel(label)) + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/idnadata.py b/vendor/pip-9.0.3/pip/_vendor/idna/idnadata.py new file mode 100644 index 0000000000000000000000000000000000000000..c48f1b5047dfd12a58bc46e0394bb7701577d7e4 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/idna/idnadata.py @@ -0,0 +1,1585 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "6.3.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0x101400001018b, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009fcd, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5f0000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b002, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 68, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 82, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x8a0: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 85, + 0x1886: 85, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5590000055a, + 0x56100000587, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5f0000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x8000000082e, + 0x8400000085c, + 0x8a0000008a1, + 0x8a2000008ad, + 0x8e4000008ff, + 0x90000000958, + 0x96000000964, + 0x96600000970, + 0x97100000978, + 0x97900000980, + 0x98100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0100000c04, + 0xc0500000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c34, + 0xc3500000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5a, + 0xc6000000c64, + 0xc6600000c70, + 0xc8200000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0200000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d3b, + 0xd3d00000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5700000d58, + 0xd6000000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f5, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001878, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191d, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cf7, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001de7, + 0x1dfc00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x31050000312e, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009fcd, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa69f0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a78f, + 0xa7910000a792, + 0xa7930000a794, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c5, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa9000000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aa7c, + 0xaa800000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe27, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x103000001031f, + 0x1033000010341, + 0x103420001034a, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a34, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10c0000010c49, + 0x1100000011047, + 0x1106600011070, + 0x11080000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x11180000111c5, + 0x111d0000111da, + 0x11680000116b8, + 0x116c0000116ca, + 0x120000001236f, + 0x130000001342f, + 0x1680000016a39, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x1b0000001b002, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/intranges.py b/vendor/pip-9.0.3/pip/_vendor/idna/intranges.py new file mode 100644 index 0000000000000000000000000000000000000000..fa8a735662d0afc1950ba75bc57e99e8480dac88 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/package_data.py b/vendor/pip-9.0.3/pip/_vendor/idna/package_data.py new file mode 100644 index 0000000000000000000000000000000000000000..fc3313927b2efb231b1ffd6870b7e5ce37bb1d9e --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.6' + diff --git a/vendor/pip-9.0.3/pip/_vendor/idna/uts46data.py b/vendor/pip-9.0.3/pip/_vendor/idna/uts46data.py new file mode 100644 index 0000000000000000000000000000000000000000..f9b3236f4aa810bba202b53ea65d3693b70b4de4 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/idna/uts46data.py @@ -0,0 +1,7634 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "6.3.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' Ì„'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' Ì'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1â„4'), + (0xBD, 'M', u'1â„2'), + (0xBE, 'M', u'3â„4'), + (0xBF, 'V'), + (0xC0, 'M', u'à '), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'Ã¥'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'Ã'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'Ä'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'Ä…'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'Ä‹'), + (0x10B, 'V'), + (0x10C, 'M', u'Ä'), + (0x10D, 'V'), + (0x10E, 'M', u'Ä'), + (0x10F, 'V'), + (0x110, 'M', u'Ä‘'), + (0x111, 'V'), + (0x112, 'M', u'Ä“'), + (0x113, 'V'), + (0x114, 'M', u'Ä•'), + (0x115, 'V'), + (0x116, 'M', u'Ä—'), + (0x117, 'V'), + (0x118, 'M', u'Ä™'), + (0x119, 'V'), + (0x11A, 'M', u'Ä›'), + (0x11B, 'V'), + (0x11C, 'M', u'Ä'), + (0x11D, 'V'), + (0x11E, 'M', u'ÄŸ'), + (0x11F, 'V'), + (0x120, 'M', u'Ä¡'), + (0x121, 'V'), + (0x122, 'M', u'Ä£'), + (0x123, 'V'), + (0x124, 'M', u'Ä¥'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'Ä©'), + (0x129, 'V'), + (0x12A, 'M', u'Ä«'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'Ä'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'Ä·'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'Å‚'), + (0x142, 'V'), + (0x143, 'M', u'Å„'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'Å‹'), + (0x14B, 'V'), + (0x14C, 'M', u'Å'), + (0x14D, 'V'), + (0x14E, 'M', u'Å'), + (0x14F, 'V'), + (0x150, 'M', u'Å‘'), + (0x151, 'V'), + (0x152, 'M', u'Å“'), + (0x153, 'V'), + (0x154, 'M', u'Å•'), + (0x155, 'V'), + (0x156, 'M', u'Å—'), + (0x157, 'V'), + (0x158, 'M', u'Å™'), + (0x159, 'V'), + (0x15A, 'M', u'Å›'), + (0x15B, 'V'), + (0x15C, 'M', u'Å'), + (0x15D, 'V'), + (0x15E, 'M', u'ÅŸ'), + (0x15F, 'V'), + (0x160, 'M', u'Å¡'), + (0x161, 'V'), + (0x162, 'M', u'Å£'), + (0x163, 'V'), + (0x164, 'M', u'Å¥'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'Å©'), + (0x169, 'V'), + (0x16A, 'M', u'Å«'), + (0x16B, 'V'), + (0x16C, 'M', u'Å'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'Å·'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'É“'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'Æ…'), + (0x185, 'V'), + (0x186, 'M', u'É”'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'É–'), + (0x18A, 'M', u'É—'), + (0x18B, 'M', u'ÆŒ'), + (0x18C, 'V'), + (0x18E, 'M', u'Ç'), + (0x18F, 'M', u'É™'), + (0x190, 'M', u'É›'), + (0x191, 'M', u'Æ’'), + (0x192, 'V'), + (0x193, 'M', u'É '), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'É£'), + (0x195, 'V'), + (0x196, 'M', u'É©'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'Æ™'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'Æ¡'), + (0x1A1, 'V'), + (0x1A2, 'M', u'Æ£'), + (0x1A3, 'V'), + (0x1A4, 'M', u'Æ¥'), + (0x1A5, 'V'), + (0x1A6, 'M', u'Ê€'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'Æ'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ÊŠ'), + (0x1B2, 'M', u'Ê‹'), + (0x1B3, 'M', u'Æ´'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'Ê’'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ÇŽ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'Ç'), + (0x1D0, 'V'), + (0x1D1, 'M', u'Ç’'), + (0x1D2, 'V'), + (0x1D3, 'M', u'Ç”'), + (0x1D4, 'V'), + (0x1D5, 'M', u'Ç–'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'Çš'), + (0x1DA, 'V'), + (0x1DB, 'M', u'Çœ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ÇŸ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'Ç¡'), + (0x1E1, 'V'), + (0x1E2, 'M', u'Ç£'), + (0x1E3, 'V'), + (0x1E4, 'M', u'Ç¥'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'Ç©'), + (0x1E9, 'V'), + (0x1EA, 'M', u'Ç«'), + (0x1EB, 'V'), + (0x1EC, 'M', u'Ç'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'Æ•'), + (0x1F7, 'M', u'Æ¿'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'Ç»'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'Ç¿'), + (0x1FF, 'V'), + (0x200, 'M', u'È'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'È…'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'È‹'), + (0x20B, 'V'), + (0x20C, 'M', u'È'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'È'), + (0x20F, 'V'), + (0x210, 'M', u'È‘'), + (0x211, 'V'), + (0x212, 'M', u'È“'), + (0x213, 'V'), + (0x214, 'M', u'È•'), + (0x215, 'V'), + (0x216, 'M', u'È—'), + (0x217, 'V'), + (0x218, 'M', u'È™'), + (0x219, 'V'), + (0x21A, 'M', u'È›'), + (0x21B, 'V'), + (0x21C, 'M', u'È'), + (0x21D, 'V'), + (0x21E, 'M', u'ÈŸ'), + (0x21F, 'V'), + (0x220, 'M', u'Æž'), + (0x221, 'V'), + (0x222, 'M', u'È£'), + (0x223, 'V'), + (0x224, 'M', u'È¥'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'È©'), + (0x229, 'V'), + (0x22A, 'M', u'È«'), + (0x22B, 'V'), + (0x22C, 'M', u'È'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'â±¥'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'Æš'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'É‚'), + (0x242, 'V'), + (0x243, 'M', u'Æ€'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ÊŒ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'É‹'), + (0x24B, 'V'), + (0x24C, 'M', u'É'), + (0x24D, 'V'), + (0x24E, 'M', u'É'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'É»'), + (0x2B6, 'M', u'Ê'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ÌŠ'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' Ì‹'), + (0x2DE, 'V'), + (0x2E0, 'M', u'É£'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'Ê•'), + (0x2E5, 'V'), + (0x340, 'M', u'Ì€'), + (0x341, 'M', u'Ì'), + (0x342, 'V'), + (0x343, 'M', u'Ì“'), + (0x344, 'M', u'̈Ì'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'Í·'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'X'), + (0x384, '3', u' Ì'), + (0x385, '3', u' ̈Ì'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'Î'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ÏŒ'), + (0x38D, 'X'), + (0x38E, 'M', u'Ï'), + (0x38F, 'M', u'ÏŽ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'Ï€'), + (0x3A1, 'M', u'Ï'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'Ï„'), + (0x3A5, 'M', u'Ï…'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ÏŠ'), + (0x3AB, 'M', u'Ï‹'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'Ï—'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'Ï…'), + (0x3D3, 'M', u'Ï'), + (0x3D4, 'M', u'Ï‹'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'Ï€'), + (0x3D7, 'V'), + (0x3D8, 'M', u'Ï™'), + (0x3D9, 'V'), + (0x3DA, 'M', u'Ï›'), + (0x3DB, 'V'), + (0x3DC, 'M', u'Ï'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ÏŸ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'Ï¡'), + (0x3E1, 'V'), + (0x3E2, 'M', u'Ï£'), + (0x3E3, 'V'), + (0x3E4, 'M', u'Ï¥'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'Ï©'), + (0x3E9, 'V'), + (0x3EA, 'M', u'Ï«'), + (0x3EB, 'V'), + (0x3EC, 'M', u'Ï'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'Ï'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'Ï»'), + (0x3FB, 'V'), + (0x3FD, 'M', u'Í»'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'Ñ'), + (0x401, 'M', u'Ñ‘'), + (0x402, 'M', u'Ñ’'), + (0x403, 'M', u'Ñ“'), + ] + +def _seg_7(): + return [ + (0x404, 'M', u'Ñ”'), + (0x405, 'M', u'Ñ•'), + (0x406, 'M', u'Ñ–'), + (0x407, 'M', u'Ñ—'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'Ñ™'), + (0x40A, 'M', u'Ñš'), + (0x40B, 'M', u'Ñ›'), + (0x40C, 'M', u'Ñœ'), + (0x40D, 'M', u'Ñ'), + (0x40E, 'M', u'Ñž'), + (0x40F, 'M', u'ÑŸ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'Ñ€'), + (0x421, 'M', u'Ñ'), + (0x422, 'M', u'Ñ‚'), + (0x423, 'M', u'у'), + (0x424, 'M', u'Ñ„'), + (0x425, 'M', u'Ñ…'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ÑŠ'), + (0x42B, 'M', u'Ñ‹'), + (0x42C, 'M', u'ÑŒ'), + (0x42D, 'M', u'Ñ'), + (0x42E, 'M', u'ÑŽ'), + (0x42F, 'M', u'Ñ'), + (0x430, 'V'), + (0x460, 'M', u'Ñ¡'), + (0x461, 'V'), + (0x462, 'M', u'Ñ£'), + (0x463, 'V'), + (0x464, 'M', u'Ñ¥'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'Ñ©'), + (0x469, 'V'), + (0x46A, 'M', u'Ñ«'), + (0x46B, 'V'), + (0x46C, 'M', u'Ñ'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'Ñ·'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'Ñ»'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'Ñ¿'), + (0x47F, 'V'), + (0x480, 'M', u'Ò'), + (0x481, 'V'), + (0x48A, 'M', u'Ò‹'), + (0x48B, 'V'), + (0x48C, 'M', u'Ò'), + (0x48D, 'V'), + (0x48E, 'M', u'Ò'), + (0x48F, 'V'), + (0x490, 'M', u'Ò‘'), + (0x491, 'V'), + (0x492, 'M', u'Ò“'), + (0x493, 'V'), + (0x494, 'M', u'Ò•'), + (0x495, 'V'), + (0x496, 'M', u'Ò—'), + (0x497, 'V'), + (0x498, 'M', u'Ò™'), + (0x499, 'V'), + (0x49A, 'M', u'Ò›'), + (0x49B, 'V'), + (0x49C, 'M', u'Ò'), + (0x49D, 'V'), + (0x49E, 'M', u'ÒŸ'), + ] + +def _seg_8(): + return [ + (0x49F, 'V'), + (0x4A0, 'M', u'Ò¡'), + (0x4A1, 'V'), + (0x4A2, 'M', u'Ò£'), + (0x4A3, 'V'), + (0x4A4, 'M', u'Ò¥'), + (0x4A5, 'V'), + (0x4A6, 'M', u'Ò§'), + (0x4A7, 'V'), + (0x4A8, 'M', u'Ò©'), + (0x4A9, 'V'), + (0x4AA, 'M', u'Ò«'), + (0x4AB, 'V'), + (0x4AC, 'M', u'Ò'), + (0x4AD, 'V'), + (0x4AE, 'M', u'Ò¯'), + (0x4AF, 'V'), + (0x4B0, 'M', u'Ò±'), + (0x4B1, 'V'), + (0x4B2, 'M', u'Ò³'), + (0x4B3, 'V'), + (0x4B4, 'M', u'Òµ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'Ò·'), + (0x4B7, 'V'), + (0x4B8, 'M', u'Ò¹'), + (0x4B9, 'V'), + (0x4BA, 'M', u'Ò»'), + (0x4BB, 'V'), + (0x4BC, 'M', u'Ò½'), + (0x4BD, 'V'), + (0x4BE, 'M', u'Ò¿'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'Ó‚'), + (0x4C2, 'V'), + (0x4C3, 'M', u'Ó„'), + (0x4C4, 'V'), + (0x4C5, 'M', u'Ó†'), + (0x4C6, 'V'), + (0x4C7, 'M', u'Óˆ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ÓŠ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ÓŒ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ÓŽ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'Ó‘'), + (0x4D1, 'V'), + (0x4D2, 'M', u'Ó“'), + (0x4D3, 'V'), + (0x4D4, 'M', u'Ó•'), + (0x4D5, 'V'), + (0x4D6, 'M', u'Ó—'), + (0x4D7, 'V'), + (0x4D8, 'M', u'Ó™'), + (0x4D9, 'V'), + (0x4DA, 'M', u'Ó›'), + (0x4DB, 'V'), + (0x4DC, 'M', u'Ó'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ÓŸ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'Ó¡'), + (0x4E1, 'V'), + (0x4E2, 'M', u'Ó£'), + (0x4E3, 'V'), + (0x4E4, 'M', u'Ó¥'), + (0x4E5, 'V'), + (0x4E6, 'M', u'Ó§'), + (0x4E7, 'V'), + (0x4E8, 'M', u'Ó©'), + (0x4E9, 'V'), + (0x4EA, 'M', u'Ó«'), + (0x4EB, 'V'), + (0x4EC, 'M', u'Ó'), + (0x4ED, 'V'), + (0x4EE, 'M', u'Ó¯'), + (0x4EF, 'V'), + (0x4F0, 'M', u'Ó±'), + (0x4F1, 'V'), + (0x4F2, 'M', u'Ó³'), + (0x4F3, 'V'), + (0x4F4, 'M', u'Óµ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'Ó·'), + (0x4F7, 'V'), + (0x4F8, 'M', u'Ó¹'), + (0x4F9, 'V'), + (0x4FA, 'M', u'Ó»'), + (0x4FB, 'V'), + (0x4FC, 'M', u'Ó½'), + (0x4FD, 'V'), + (0x4FE, 'M', u'Ó¿'), + (0x4FF, 'V'), + (0x500, 'M', u'Ô'), + (0x501, 'V'), + (0x502, 'M', u'Ôƒ'), + (0x503, 'V'), + ] + +def _seg_9(): + return [ + (0x504, 'M', u'Ô…'), + (0x505, 'V'), + (0x506, 'M', u'Ô‡'), + (0x507, 'V'), + (0x508, 'M', u'Ô‰'), + (0x509, 'V'), + (0x50A, 'M', u'Ô‹'), + (0x50B, 'V'), + (0x50C, 'M', u'Ô'), + (0x50D, 'V'), + (0x50E, 'M', u'Ô'), + (0x50F, 'V'), + (0x510, 'M', u'Ô‘'), + (0x511, 'V'), + (0x512, 'M', u'Ô“'), + (0x513, 'V'), + (0x514, 'M', u'Ô•'), + (0x515, 'V'), + (0x516, 'M', u'Ô—'), + (0x517, 'V'), + (0x518, 'M', u'Ô™'), + (0x519, 'V'), + (0x51A, 'M', u'Ô›'), + (0x51B, 'V'), + (0x51C, 'M', u'Ô'), + (0x51D, 'V'), + (0x51E, 'M', u'ÔŸ'), + (0x51F, 'V'), + (0x520, 'M', u'Ô¡'), + (0x521, 'V'), + (0x522, 'M', u'Ô£'), + (0x523, 'V'), + (0x524, 'M', u'Ô¥'), + (0x525, 'V'), + (0x526, 'M', u'Ô§'), + (0x527, 'V'), + (0x528, 'X'), + (0x531, 'M', u'Õ¡'), + (0x532, 'M', u'Õ¢'), + (0x533, 'M', u'Õ£'), + (0x534, 'M', u'Õ¤'), + (0x535, 'M', u'Õ¥'), + (0x536, 'M', u'Õ¦'), + (0x537, 'M', u'Õ§'), + (0x538, 'M', u'Õ¨'), + (0x539, 'M', u'Õ©'), + (0x53A, 'M', u'Õª'), + (0x53B, 'M', u'Õ«'), + (0x53C, 'M', u'Õ¬'), + (0x53D, 'M', u'Õ'), + (0x53E, 'M', u'Õ®'), + (0x53F, 'M', u'Õ¯'), + (0x540, 'M', u'Õ°'), + (0x541, 'M', u'Õ±'), + (0x542, 'M', u'Õ²'), + (0x543, 'M', u'Õ³'), + (0x544, 'M', u'Õ´'), + (0x545, 'M', u'Õµ'), + (0x546, 'M', u'Õ¶'), + (0x547, 'M', u'Õ·'), + (0x548, 'M', u'Õ¸'), + (0x549, 'M', u'Õ¹'), + (0x54A, 'M', u'Õº'), + (0x54B, 'M', u'Õ»'), + (0x54C, 'M', u'Õ¼'), + (0x54D, 'M', u'Õ½'), + (0x54E, 'M', u'Õ¾'), + (0x54F, 'M', u'Õ¿'), + (0x550, 'M', u'Ö€'), + (0x551, 'M', u'Ö'), + (0x552, 'M', u'Ö‚'), + (0x553, 'M', u'Öƒ'), + (0x554, 'M', u'Ö„'), + (0x555, 'M', u'Ö…'), + (0x556, 'M', u'Ö†'), + (0x557, 'X'), + (0x559, 'V'), + (0x560, 'X'), + (0x561, 'V'), + (0x587, 'M', u'Õ¥Ö‚'), + (0x588, 'X'), + (0x589, 'V'), + (0x58B, 'X'), + (0x58F, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5F0, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'Û‡Ù´'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + ] + +def _seg_10(): + return [ + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x800, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x8A0, 'V'), + (0x8A1, 'X'), + (0x8A2, 'V'), + (0x8AD, 'X'), + (0x8E4, 'V'), + (0x8FF, 'X'), + (0x900, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x978, 'X'), + (0x979, 'V'), + (0x980, 'X'), + (0x981, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FC, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + ] + +def _seg_11(): + return [ + (0xA66, 'V'), + (0xA76, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC01, 'V'), + (0xC04, 'X'), + (0xC05, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC34, 'X'), + (0xC35, 'V'), + ] + +def _seg_12(): + return [ + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5A, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC80, 'X'), + (0xC82, 'V'), + (0xC84, 'X'), + (0xC85, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD02, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD3B, 'X'), + (0xD3D, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD4F, 'X'), + (0xD57, 'V'), + (0xD58, 'X'), + (0xD60, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD76, 'X'), + (0xD79, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'à¹à¸²'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE87, 'V'), + ] + +def _seg_13(): + return [ + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + (0xE98, 'X'), + (0xE99, 'V'), + (0xEA0, 'X'), + (0xEA1, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEA8, 'X'), + (0xEAA, 'V'), + (0xEAC, 'X'), + (0xEAD, 'V'), + (0xEB3, 'M', u'à»àº²'), + (0xEB4, 'V'), + (0xEBA, 'X'), + (0xEBB, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'à¾à¾µ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'â´§'), + (0x10C8, 'X'), + (0x10CD, 'M', u'â´'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + ] + +def _seg_14(): + return [ + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F5, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F1, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1878, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191D, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + (0x1A9A, 'X'), + ] + +def _seg_15(): + return [ + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CF7, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'Ç'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'È£'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'É'), + (0x1D45, 'M', u'É‘'), + (0x1D46, 'M', u'á´‚'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'É™'), + (0x1D4B, 'M', u'É›'), + (0x1D4C, 'M', u'Éœ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + (0x1D51, 'M', u'Å‹'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'É”'), + (0x1D54, 'M', u'á´–'), + (0x1D55, 'M', u'á´—'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'á´'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'á´¥'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'Ï'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'É’'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'É•'), + (0x1D9E, 'M', u'ð'), + (0x1D9F, 'M', u'Éœ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ÉŸ'), + (0x1DA2, 'M', u'É¡'), + (0x1DA3, 'M', u'É¥'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'É©'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'áµ»'), + (0x1DA8, 'M', u'Ê'), + (0x1DA9, 'M', u'É'), + ] + +def _seg_16(): + return [ + (0x1DAA, 'M', u'á¶…'), + (0x1DAB, 'M', u'ÊŸ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'ɰ'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'É´'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'Ê‚'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'Æ«'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ÊŠ'), + (0x1DB8, 'M', u'á´œ'), + (0x1DB9, 'M', u'Ê‹'), + (0x1DBA, 'M', u'ÊŒ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'Ê'), + (0x1DBD, 'M', u'Ê‘'), + (0x1DBE, 'M', u'Ê’'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DE7, 'X'), + (0x1DFC, 'V'), + (0x1E00, 'M', u'á¸'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'á¸'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'á¸'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'á¸'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'á¸'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + (0x1E40, 'M', u'á¹'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'á¹…'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + ] + +def _seg_17(): + return [ + (0x1E4B, 'V'), + (0x1E4C, 'M', u'á¹'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'á¹'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'á¹—'), + (0x1E57, 'V'), + (0x1E58, 'M', u'á¹™'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'á¹›'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'á¹'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'á¹£'), + (0x1E63, 'V'), + (0x1E64, 'M', u'á¹¥'), + (0x1E65, 'V'), + (0x1E66, 'M', u'á¹§'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'á¹'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'á¹±'), + (0x1E71, 'V'), + (0x1E72, 'M', u'á¹³'), + (0x1E73, 'V'), + (0x1E74, 'M', u'á¹µ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'á¹·'), + (0x1E77, 'V'), + (0x1E78, 'M', u'á¹¹'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'á¹»'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'á¹½'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'áº'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'áº'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'áº'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'áº'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + ] + +def _seg_18(): + return [ + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'á»'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'á»…'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'á»'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'á»'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'á»—'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'á»™'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'á»›'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'á»'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'á»§'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', u'á»'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'á»±'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'á»·'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'á»»'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'á¼€'), + (0x1F09, 'M', u'á¼'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'á¼…'), + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'á¼'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'á¼’'), + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'á¼”'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'á¼ '), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'á¼¢'), + (0x1F2B, 'M', u'á¼£'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'á¼¥'), + ] + +def _seg_19(): + return [ + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'á¼§'), + (0x1F30, 'V'), + (0x1F38, 'M', u'á¼°'), + (0x1F39, 'M', u'á¼±'), + (0x1F3A, 'M', u'á¼²'), + (0x1F3B, 'M', u'á¼³'), + (0x1F3C, 'M', u'á¼´'), + (0x1F3D, 'M', u'á¼µ'), + (0x1F3E, 'M', u'á¼¶'), + (0x1F3F, 'M', u'á¼·'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'á½€'), + (0x1F49, 'M', u'á½'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'á½…'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'á½—'), + (0x1F60, 'V'), + (0x1F68, 'M', u'á½ '), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'á½¢'), + (0x1F6B, 'M', u'á½£'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'á½¥'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'á½§'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'Î'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ÏŒ'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'Ï'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ÏŽ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'á¼Î¹'), + (0x1F82, 'M', u'ἂι'), + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'á¼Î¹'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + ] + +def _seg_20(): + return [ + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'á¾°'), + (0x1FB9, 'M', u'á¾±'), + (0x1FBA, 'M', u'á½°'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' Ì“'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' Ì“'), + (0x1FC0, '3', u' Í‚'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'á½²'), + (0x1FC9, 'M', u'Î'), + (0x1FCA, 'M', u'á½´'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' ̓̀'), + (0x1FCE, '3', u' Ì“Ì'), + (0x1FCF, '3', u' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'Î'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'á¿'), + (0x1FD9, 'M', u'á¿‘'), + (0x1FDA, 'M', u'á½¶'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' Ì”Ì'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'á¿ '), + (0x1FE9, 'M', u'á¿¡'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'Ï'), + (0x1FEC, 'M', u'á¿¥'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈Ì'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ÏŒ'), + (0x1FFA, 'M', u'á½¼'), + (0x1FFB, 'M', u'ÏŽ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' Ì'), + (0x1FFE, '3', u' Ì”'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'â€'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' Ì…'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + ] + +def _seg_21(): + return [ + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'É™'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20BB, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'É›'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + (0x212A, 'M', u'k'), + (0x212B, 'M', u'Ã¥'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'×'), + ] + +def _seg_22(): + return [ + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'×’'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'Ï€'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'Ï€'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1â„7'), + (0x2151, 'M', u'1â„9'), + (0x2152, 'M', u'1â„10'), + (0x2153, 'M', u'1â„3'), + (0x2154, 'M', u'2â„3'), + (0x2155, 'M', u'1â„5'), + (0x2156, 'M', u'2â„5'), + (0x2157, 'M', u'3â„5'), + (0x2158, 'M', u'4â„5'), + (0x2159, 'M', u'1â„6'), + (0x215A, 'M', u'5â„6'), + (0x215B, 'M', u'1â„8'), + (0x215C, 'M', u'3â„8'), + (0x215D, 'M', u'5â„8'), + (0x215E, 'M', u'7â„8'), + (0x215F, 'M', u'1â„'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0â„3'), + (0x218A, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x23F4, 'X'), + (0x2400, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + ] + +def _seg_23(): + return [ + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + ] + +def _seg_24(): + return [ + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2700, 'X'), + (0x2701, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'â«Ì¸'), + (0x2ADD, 'V'), + (0x2B4D, 'X'), + (0x2B50, 'V'), + (0x2B5A, 'X'), + (0x2C00, 'M', u'â°°'), + (0x2C01, 'M', u'â°±'), + (0x2C02, 'M', u'â°²'), + (0x2C03, 'M', u'â°³'), + (0x2C04, 'M', u'â°´'), + (0x2C05, 'M', u'â°µ'), + (0x2C06, 'M', u'â°¶'), + (0x2C07, 'M', u'â°·'), + (0x2C08, 'M', u'â°¸'), + (0x2C09, 'M', u'â°¹'), + (0x2C0A, 'M', u'â°º'), + (0x2C0B, 'M', u'â°»'), + (0x2C0C, 'M', u'â°¼'), + (0x2C0D, 'M', u'â°½'), + (0x2C0E, 'M', u'â°¾'), + (0x2C0F, 'M', u'â°¿'), + (0x2C10, 'M', u'â±€'), + (0x2C11, 'M', u'â±'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'â±…'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'â±'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'â±'), + (0x2C20, 'M', u'â±'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'â±’'), + (0x2C23, 'M', u'ⱓ'), + (0x2C24, 'M', u'â±”'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'â±–'), + (0x2C27, 'M', u'â±—'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'â±™'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'â±›'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'â±'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'É«'), + (0x2C63, 'M', u'áµ½'), + (0x2C64, 'M', u'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'É‘'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'É'), + (0x2C70, 'M', u'É’'), + (0x2C71, 'V'), + (0x2C72, 'M', u'â±³'), + (0x2C73, 'V'), + (0x2C75, 'M', u'â±¶'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'È¿'), + (0x2C7F, 'M', u'É€'), + (0x2C80, 'M', u'â²'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + ] + +def _seg_25(): + return [ + (0x2C83, 'V'), + (0x2C84, 'M', u'â²…'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'â²'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'â²'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'â²—'), + (0x2C97, 'V'), + (0x2C98, 'M', u'â²™'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'â²›'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'â²'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'â²£'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'â²¥'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'â²§'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'â²'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'â²±'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'â²³'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'â²µ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'â²·'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'â²¹'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'â²»'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'â²½'), + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'â³'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'â³…'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'â³'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'â³'), + (0x2CCF, 'V'), + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'â³—'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'â³™'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'â³›'), + (0x2CDB, 'V'), + (0x2CDC, 'M', u'â³'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'â³£'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'â³®'), + ] + +def _seg_26(): + return [ + (0x2CEE, 'V'), + (0x2CF2, 'M', u'â³³'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E3C, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'æ¯'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'ä¹™'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'äº '), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'å„¿'), + (0x2F0A, 'M', u'å…¥'), + (0x2F0B, 'M', u'å…«'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'å‡ '), + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'å'), + (0x2F18, 'M', u'åœ'), + (0x2F19, 'M', u'å©'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'åˆ'), + (0x2F1D, 'M', u'å£'), + (0x2F1E, 'M', u'å›—'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'å'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'å°'), + (0x2F2A, 'M', u'å°¢'), + (0x2F2B, 'M', u'å°¸'), + (0x2F2C, 'M', u'å±®'), + (0x2F2D, 'M', u'å±±'), + (0x2F2E, 'M', u'å·›'), + (0x2F2F, 'M', u'å·¥'), + (0x2F30, 'M', u'å·±'), + (0x2F31, 'M', u'å·¾'), + (0x2F32, 'M', u'å¹²'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'å»´'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'å½'), + ] + +def _seg_27(): + return [ + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'å½³'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'æ”´'), + (0x2F42, 'M', u'æ–‡'), + (0x2F43, 'M', u'æ–—'), + (0x2F44, 'M', u'æ–¤'), + (0x2F45, 'M', u'æ–¹'), + (0x2F46, 'M', u'æ— '), + (0x2F47, 'M', u'æ—¥'), + (0x2F48, 'M', u'æ›°'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'æ¬ '), + (0x2F4C, 'M', u'æ¢'), + (0x2F4D, 'M', u'æ¹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'æ°'), + (0x2F53, 'M', u'æ°”'), + (0x2F54, 'M', u'æ°´'), + (0x2F55, 'M', u'ç«'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'瓜'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'ç”°'), + (0x2F66, 'M', u'ç–‹'), + (0x2F67, 'M', u'ç–’'), + (0x2F68, 'M', u'ç™¶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'çš®'), + (0x2F6B, 'M', u'çš¿'), + (0x2F6C, 'M', u'ç›®'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'ç©´'), + (0x2F74, 'M', u'ç«‹'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'ç±³'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'ç¼¶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'ç¾½'), + (0x2F7C, 'M', u'è€'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'è¿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'è™'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'è¡€'), + (0x2F8F, 'M', u'行'), + (0x2F90, 'M', u'è¡£'), + (0x2F91, 'M', u'襾'), + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'è§’'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'è°·'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'è²'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'èµ°'), + (0x2F9C, 'M', u'è¶³'), + (0x2F9D, 'M', u'身'), + ] + +def _seg_28(): + return [ + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'è¾›'), + (0x2FA0, 'M', u'è¾°'), + (0x2FA1, 'M', u'è¾µ'), + (0x2FA2, 'M', u'é‚‘'), + (0x2FA3, 'M', u'é…‰'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'é•·'), + (0x2FA8, 'M', u'é–€'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'éš¶'), + (0x2FAB, 'M', u'éš¹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'é‘'), + (0x2FAE, 'M', u'éž'), + (0x2FAF, 'M', u'é¢'), + (0x2FB0, 'M', u'é©'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'éŸ'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'é '), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'髟'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'éš'), + (0x2FC3, 'M', u'é³¥'), + (0x2FC4, 'M', u'é¹µ'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'é»'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'é¼ '), + (0x2FD0, 'M', u'é¼»'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'é½’'), + (0x2FD3, 'M', u'é¾'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'é¾ '), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'å'), + (0x3039, 'M', u'å„'), + (0x303A, 'M', u'å…'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ã‚™'), + (0x309C, '3', u' ゚'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x312E, 'X'), + (0x3131, 'M', u'á„€'), + (0x3132, 'M', u'á„'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'á„‚'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'á†'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'á„„'), + (0x3139, 'M', u'á„…'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'ᄚ'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'á„¡'), + ] + +def _seg_29(): + return [ + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'ᄊ'), + (0x3147, 'M', u'á„‹'), + (0x3148, 'M', u'ᄌ'), + (0x3149, 'M', u'á„'), + (0x314A, 'M', u'ᄎ'), + (0x314B, 'M', u'á„'), + (0x314C, 'M', u'á„'), + (0x314D, 'M', u'á„‘'), + (0x314E, 'M', u'á„’'), + (0x314F, 'M', u'á…¡'), + (0x3150, 'M', u'á…¢'), + (0x3151, 'M', u'á…£'), + (0x3152, 'M', u'á…¤'), + (0x3153, 'M', u'á…¥'), + (0x3154, 'M', u'á…¦'), + (0x3155, 'M', u'á…§'), + (0x3156, 'M', u'á…¨'), + (0x3157, 'M', u'á…©'), + (0x3158, 'M', u'á…ª'), + (0x3159, 'M', u'á…«'), + (0x315A, 'M', u'á…¬'), + (0x315B, 'M', u'á…'), + (0x315C, 'M', u'á…®'), + (0x315D, 'M', u'á…¯'), + (0x315E, 'M', u'á…°'), + (0x315F, 'M', u'á…±'), + (0x3160, 'M', u'á…²'), + (0x3161, 'M', u'á…³'), + (0x3162, 'M', u'á…´'), + (0x3163, 'M', u'á…µ'), + (0x3164, 'X'), + (0x3165, 'M', u'á„”'), + (0x3166, 'M', u'á„•'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'ᄜ'), + (0x316F, 'M', u'á‡'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'á„'), + (0x3172, 'M', u'ᄞ'), + (0x3173, 'M', u'á„ '), + (0x3174, 'M', u'á„¢'), + (0x3175, 'M', u'á„£'), + (0x3176, 'M', u'á„§'), + (0x3177, 'M', u'á„©'), + (0x3178, 'M', u'á„«'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'á„'), + (0x317B, 'M', u'á„®'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'á„¶'), + (0x317F, 'M', u'á…€'), + (0x3180, 'M', u'á…‡'), + (0x3181, 'M', u'á…Œ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'á…—'), + (0x3185, 'M', u'á…˜'), + (0x3186, 'M', u'á…™'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'å››'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'ä¸'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'ä¹™'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'ä¸'), + (0x319D, 'M', u'天'), + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(á„€)'), + (0x3201, '3', u'(á„‚)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(á„…)'), + (0x3204, '3', u'(ᄆ)'), + ] + +def _seg_30(): + return [ + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(á„‹)'), + (0x3208, '3', u'(ᄌ)'), + (0x3209, '3', u'(ᄎ)'), + (0x320A, '3', u'(á„)'), + (0x320B, '3', u'(á„)'), + (0x320C, '3', u'(á„‘)'), + (0x320D, '3', u'(á„’)'), + (0x320E, '3', u'(ê°€)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(ë¼)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(ë°”)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(ì•„)'), + (0x3216, '3', u'(ìž)'), + (0x3217, '3', u'(ì°¨)'), + (0x3218, '3', u'(ì¹´)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(ì˜¤ì „)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(å››)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(å…)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(å…«)'), + (0x3228, '3', u'(ä¹)'), + (0x3229, '3', u'(å)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(ç«)'), + (0x322C, '3', u'(æ°´)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(æ—¥)'), + (0x3231, '3', u'(æ ª)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(å)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(ç¥)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(å¦)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(ä¼)'), + (0x323E, '3', u'(資)'), + (0x323F, '3', u'(å”)'), + (0x3240, '3', u'(ç¥)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'å•'), + (0x3245, 'M', u'å¹¼'), + (0x3246, 'M', u'æ–‡'), + (0x3247, 'M', u'ç®'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'á„€'), + (0x3261, 'M', u'á„‚'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'á„…'), + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'á„‹'), + (0x3268, 'M', u'ᄌ'), + (0x3269, 'M', u'ᄎ'), + (0x326A, 'M', u'á„'), + (0x326B, 'M', u'á„'), + (0x326C, 'M', u'á„‘'), + (0x326D, 'M', u'á„’'), + (0x326E, 'M', u'ê°€'), + (0x326F, 'M', u'나'), + ] + +def _seg_31(): + return [ + (0x3270, 'M', u'다'), + (0x3271, 'M', u'ë¼'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'ë°”'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'ì•„'), + (0x3276, 'M', u'ìž'), + (0x3277, 'M', u'ì°¨'), + (0x3278, 'M', u'ì¹´'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'ì°¸ê³ '), + (0x327D, 'M', u'주ì˜'), + (0x327E, 'M', u'ìš°'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'å››'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'å…'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'å…«'), + (0x3288, 'M', u'ä¹'), + (0x3289, 'M', u'å'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'ç«'), + (0x328C, 'M', u'æ°´'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'æ—¥'), + (0x3291, 'M', u'æ ª'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'å'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'ç¥'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'ç”·'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'é©'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'å°'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'é …'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'æ£'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'ä¸'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'å·¦'), + (0x32A8, 'M', u'å³'), + (0x32A9, 'M', u'医'), + (0x32AA, 'M', u'å®—'), + (0x32AB, 'M', u'å¦'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'ä¼'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'å”'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ã‚¢'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + ] + +def _seg_32(): + return [ + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'ã‚«'), + (0x32D6, 'M', u'ã‚'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'ã‚·'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'ã‚»'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'ã‚¿'), + (0x32E0, 'M', u'ãƒ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ãƒ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ãƒ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ãƒ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'X'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インãƒ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'ã‚«ãƒãƒªãƒ¼'), + (0x330E, 'M', u'ガãƒãƒ³'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'ã‚ュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'ã‚ãƒ'), + (0x3315, 'M', u'ã‚ãƒã‚°ãƒ©ãƒ '), + (0x3316, 'M', u'ã‚ãƒãƒ¡ãƒ¼ãƒˆãƒ«'), + (0x3317, 'M', u'ã‚ãƒãƒ¯ãƒƒãƒˆ'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイãƒ'), + (0x331B, 'M', u'クãƒãƒ¼ãƒ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーãƒ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンãƒãƒ¼ãƒ '), + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センãƒ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ãƒã‚¤ãƒ„'), + (0x332B, 'M', u'パーセント'), + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'ãƒãƒ¼ãƒ¬ãƒ«'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + ] + +def _seg_33(): + return [ + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ãƒã‚¤ãƒ³ãƒˆ'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ãƒãƒ³ãƒ‰'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクãƒ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッãƒ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクãƒãƒ³'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリãƒãƒ¼ãƒ«'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'å¹³æˆ'), + (0x337C, 'M', u'æ˜å’Œ'), + (0x337D, 'M', u'大æ£'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'æ ªå¼ä¼šç¤¾'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + ] + +def _seg_34(): + return [ + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1æ—¥'), + (0x33E1, 'M', u'2æ—¥'), + (0x33E2, 'M', u'3æ—¥'), + (0x33E3, 'M', u'4æ—¥'), + (0x33E4, 'M', u'5æ—¥'), + (0x33E5, 'M', u'6æ—¥'), + (0x33E6, 'M', u'7æ—¥'), + (0x33E7, 'M', u'8æ—¥'), + (0x33E8, 'M', u'9æ—¥'), + (0x33E9, 'M', u'10æ—¥'), + (0x33EA, 'M', u'11æ—¥'), + (0x33EB, 'M', u'12æ—¥'), + (0x33EC, 'M', u'13æ—¥'), + (0x33ED, 'M', u'14æ—¥'), + (0x33EE, 'M', u'15æ—¥'), + (0x33EF, 'M', u'16æ—¥'), + (0x33F0, 'M', u'17æ—¥'), + (0x33F1, 'M', u'18æ—¥'), + (0x33F2, 'M', u'19æ—¥'), + (0x33F3, 'M', u'20æ—¥'), + (0x33F4, 'M', u'21æ—¥'), + (0x33F5, 'M', u'22æ—¥'), + (0x33F6, 'M', u'23æ—¥'), + (0x33F7, 'M', u'24æ—¥'), + (0x33F8, 'M', u'25æ—¥'), + (0x33F9, 'M', u'26æ—¥'), + (0x33FA, 'M', u'27æ—¥'), + (0x33FB, 'M', u'28æ—¥'), + (0x33FC, 'M', u'29æ—¥'), + (0x33FD, 'M', u'30æ—¥'), + (0x33FE, 'M', u'31æ—¥'), + (0x33FF, 'M', u'gal'), + ] + +def _seg_35(): + return [ + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FCD, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ê™'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ê™…'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ê™'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ê™'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ê™—'), + (0xA657, 'V'), + (0xA658, 'M', u'ê™™'), + (0xA659, 'V'), + (0xA65A, 'M', u'ê™›'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ê™'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ê™§'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ê™'), + (0xA66D, 'V'), + (0xA680, 'M', u'êš'), + (0xA681, 'V'), + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'êš…'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'êš‹'), + (0xA68B, 'V'), + (0xA68C, 'M', u'êš'), + (0xA68D, 'V'), + (0xA68E, 'M', u'êš'), + (0xA68F, 'V'), + (0xA690, 'M', u'êš‘'), + (0xA691, 'V'), + (0xA692, 'M', u'êš“'), + (0xA693, 'V'), + (0xA694, 'M', u'êš•'), + (0xA695, 'V'), + (0xA696, 'M', u'êš—'), + (0xA697, 'V'), + (0xA698, 'X'), + (0xA69F, 'V'), + (0xA6F8, 'X'), + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'êœ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + ] + +def _seg_36(): + return [ + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ê'), + (0xA741, 'V'), + (0xA742, 'M', u'êƒ'), + (0xA743, 'V'), + (0xA744, 'M', u'ê…'), + (0xA745, 'V'), + (0xA746, 'M', u'ê‡'), + (0xA747, 'V'), + (0xA748, 'M', u'ê‰'), + (0xA749, 'V'), + (0xA74A, 'M', u'ê‹'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ê'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ê'), + (0xA74F, 'V'), + (0xA750, 'M', u'ê‘'), + (0xA751, 'V'), + (0xA752, 'M', u'ê“'), + (0xA753, 'V'), + (0xA754, 'M', u'ê•'), + (0xA755, 'V'), + (0xA756, 'M', u'ê—'), + (0xA757, 'V'), + (0xA758, 'M', u'ê™'), + (0xA759, 'V'), + (0xA75A, 'M', u'ê›'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ê'), + (0xA75D, 'V'), + (0xA75E, 'M', u'êŸ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ê¡'), + (0xA761, 'V'), + (0xA762, 'M', u'ê£'), + (0xA763, 'V'), + (0xA764, 'M', u'ê¥'), + (0xA765, 'V'), + (0xA766, 'M', u'ê§'), + (0xA767, 'V'), + (0xA768, 'M', u'ê©'), + (0xA769, 'V'), + (0xA76A, 'M', u'ê«'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ê'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ê¯'), + (0xA76F, 'V'), + (0xA770, 'M', u'ê¯'), + (0xA771, 'V'), + (0xA779, 'M', u'êº'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ê¼'), + (0xA77C, 'V'), + (0xA77D, 'M', u'áµ¹'), + (0xA77E, 'M', u'ê¿'), + (0xA77F, 'V'), + (0xA780, 'M', u'êž'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', u'êž…'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'É¥'), + (0xA78E, 'V'), + (0xA78F, 'X'), + (0xA790, 'M', u'êž‘'), + (0xA791, 'V'), + (0xA792, 'M', u'êž“'), + (0xA793, 'V'), + (0xA794, 'X'), + (0xA7A0, 'M', u'êž¡'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'êž§'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'êž©'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'X'), + (0xA7F8, 'M', u'ħ'), + ] + +def _seg_37(): + return [ + (0xA7F9, 'M', u'Å“'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C5, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA8FC, 'X'), + (0xA900, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9E0, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAA7C, 'X'), + (0xAA80, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'æ›´'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'å¥'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + (0xF90B, 'M', u'å–‡'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'ç¾…'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'é‚'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'æ´›'), + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'çž'), + (0xF918, 'M', u'è½'), + (0xF919, 'M', u'é…ª'), + (0xF91A, 'M', u'é§±'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'åµ'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'è˜'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'åµ'), + (0xF922, 'M', u'æ¿«'), + (0xF923, 'M', u'è—'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'è Ÿ'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + ] + +def _seg_38(): + return [ + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'勞'), + (0xF930, 'M', u'æ“„'), + (0xF931, 'M', u'æ«“'), + (0xF932, 'M', u'çˆ'), + (0xF933, 'M', u'ç›§'), + (0xF934, 'M', u'è€'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'è·¯'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'é¯'), + (0xF93A, 'M', u'é·º'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'ç¶ '), + (0xF93E, 'M', u'è‰'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'è«–'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'ç± '), + (0xF945, 'M', u'è¾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'é›·'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'å±¢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'æ·š'), + (0xF94E, 'M', u'æ¼'), + (0xF94F, 'M', u'ç´¯'), + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'å‹’'), + (0xF953, 'M', u'è‚‹'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'ç¶¾'), + (0xF958, 'M', u'è±'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'æ‹'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'ç•°'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'ä¸'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'ç´¢'), + (0xF96B, 'M', u'åƒ'), + (0xF96C, 'M', u'塞'), + (0xF96D, 'M', u'çœ'), + (0xF96E, 'M', u'葉'), + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'è¾°'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'è‹¥'), + (0xF975, 'M', u'æŽ '), + (0xF976, 'M', u'ç•¥'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'å…©'), + (0xF979, 'M', u'凉'), + (0xF97A, 'M', u'æ¢'), + (0xF97B, 'M', u'ç³§'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'è«’'), + (0xF97E, 'M', u'é‡'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'å‘‚'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'æ—…'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'é–'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'æ·'), + (0xF98D, 'M', u'è½¢'), + (0xF98E, 'M', u'å¹´'), + (0xF98F, 'M', u'æ†'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'æ’š'), + ] + +def _seg_39(): + return [ + (0xF992, 'M', u'æ¼£'), + (0xF993, 'M', u'ç…‰'), + (0xF994, 'M', u'ç’‰'), + (0xF995, 'M', u'ç§Š'), + (0xF996, 'M', u'ç·´'), + (0xF997, 'M', u'è¯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'è“®'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'éŠ'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'å’½'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'æ»'), + (0xF9A5, 'M', u'æ®®'), + (0xF9A6, 'M', u'ç°¾'), + (0xF9A7, 'M', u'çµ'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'ç‘©'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'è†'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'é›¶'), + (0xF9B3, 'M', u'éˆ'), + (0xF9B4, 'M', u'é ˜'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'å°¿'), + (0xF9BE, 'M', u'æ–™'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'é¼'), + (0xF9C4, 'M', u'é¾'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'æ»'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'æµ'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'ç‰'), + (0xF9CD, 'M', u'ç•™'), + (0xF9CE, 'M', u'ç¡«'), + (0xF9CF, 'M', u'ç´'), + (0xF9D0, 'M', u'類'), + (0xF9D1, 'M', u'å…'), + (0xF9D2, 'M', u'戮'), + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'å´™'), + (0xF9D6, 'M', u'æ·ª'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'æ…„'), + (0xF9DA, 'M', u'æ —'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + (0xF9DE, 'M', u'å'), + (0xF9DF, 'M', u'å±¥'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'æŽ'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'æ³¥'), + (0xF9E4, 'M', u'ç†'), + (0xF9E5, 'M', u'ç—¢'), + (0xF9E6, 'M', u'ç½¹'), + (0xF9E7, 'M', u'è£'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'å'), + (0xF9EE, 'M', u'ç‡'), + (0xF9EF, 'M', u'ç’˜'), + (0xF9F0, 'M', u'è—º'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'é±—'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'æž—'), + (0xF9F5, 'M', u'æ·‹'), + ] + +def _seg_40(): + return [ + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'ç«‹'), + (0xF9F8, 'M', u'ç¬ '), + (0xF9F9, 'M', u'ç²’'), + (0xF9FA, 'M', u'ç‹€'), + (0xF9FB, 'M', u'ç‚™'), + (0xF9FC, 'M', u'è˜'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'æ‹“'), + (0xFA03, 'M', u'ç³–'), + (0xFA04, 'M', u'å®…'), + (0xFA05, 'M', u'æ´ž'), + (0xFA06, 'M', u'æš´'), + (0xFA07, 'M', u'è¼»'), + (0xFA08, 'M', u'行'), + (0xFA09, 'M', u'é™'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'å…€'), + (0xFA0D, 'M', u'å—€'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'塚'), + (0xFA11, 'V'), + (0xFA12, 'M', u'æ™´'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'ç¦'), + (0xFA1C, 'M', u'é–'), + (0xFA1D, 'M', u'ç²¾'), + (0xFA1E, 'M', u'ç¾½'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'é¶´'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'éš·'), + (0xFA30, 'M', u'ä¾®'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'å…'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'å‘'), + (0xFA36, 'M', u'å–'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'å¡€'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + (0xFA3C, 'M', u'å±®'), + (0xFA3D, 'M', u'æ‚”'), + (0xFA3E, 'M', u'æ…¨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'æ•'), + (0xFA42, 'M', u'æ—¢'), + (0xFA43, 'M', u'æš‘'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'æµ·'), + (0xFA46, 'M', u'渚'), + (0xFA47, 'M', u'æ¼¢'), + (0xFA48, 'M', u'ç…®'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'ç¢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'ç¥'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'ç¥'), + (0xFA52, 'M', u'ç¦'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'ç©€'), + (0xFA55, 'M', u'çª'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'ç·´'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'ç¹'), + (0xFA5A, 'M', u'ç½²'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'è‡'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'è‘—'), + ] + +def _seg_41(): + return [ + (0xFA60, 'M', u'è¤'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'è¬'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'è´ˆ'), + (0xFA66, 'M', u'è¾¶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'é »'), + (0xFA6B, 'M', u'æµ'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'å…¨'), + (0xFA73, 'M', u'ä¾€'), + (0xFA74, 'M', u'å……'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'å–'), + (0xFA79, 'M', u'å••'), + (0xFA7A, 'M', u'å–™'), + (0xFA7B, 'M', u'å—¢'), + (0xFA7C, 'M', u'塚'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'å©¢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'å»’'), + (0xFA83, 'M', u'å»™'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'å¾'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'æ…Ž'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'æ… '), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'æ„'), + (0xFA8E, 'M', u'æœ'), + (0xFA8F, 'M', u'æ‘’'), + (0xFA90, 'M', u'æ•–'), + (0xFA91, 'M', u'æ™´'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'æ–'), + (0xFA95, 'M', u'æ¹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'æµ'), + (0xFA98, 'M', u'æ»›'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'æ¼¢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'ç…®'), + (0xFA9D, 'M', u'çž§'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'ç”»'), + (0xFAA4, 'M', u'ç˜'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'ç››'), + (0xFAA8, 'M', u'ç›´'), + (0xFAA9, 'M', u'çŠ'), + (0xFAAA, 'M', u'ç€'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'ç±»'), + (0xFAAF, 'M', u'çµ›'), + (0xFAB0, 'M', u'ç·´'), + (0xFAB1, 'M', u'ç¼¾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'è’'), + (0xFAB4, 'M', u'è¯'), + (0xFAB5, 'M', u'è¹'), + (0xFAB6, 'M', u'è¥'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'è«‹'), + (0xFABC, 'M', u'è¬'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'è«'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'è´ˆ'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'é²'), + (0xFAC4, 'M', u'醙'), + ] + +def _seg_42(): + return [ + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'é–'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'é ‹'), + (0xFACC, 'M', u'é »'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'ð£•'), + (0xFAD2, 'M', u'ã®'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'ð¥³'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'Õ´Õ¶'), + (0xFB14, 'M', u'Õ´Õ¥'), + (0xFB15, 'M', u'Õ´Õ«'), + (0xFB16, 'M', u'Õ¾Õ¶'), + (0xFB17, 'M', u'Õ´Õ'), + (0xFB18, 'X'), + (0xFB1D, 'M', u'×™Ö´'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'×¢'), + (0xFB21, 'M', u'×'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'×”'), + (0xFB24, 'M', u'×›'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'×'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'ש×'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּ×'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'×Ö·'), + (0xFB2F, 'M', u'×Ö¸'), + (0xFB30, 'M', u'×Ö¼'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'×’Ö¼'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'×”Ö¼'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'×–Ö¼'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'×™Ö¼'), + (0xFB3A, 'M', u'ךּ'), + (0xFB3B, 'M', u'×›Ö¼'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'× Ö¼'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'×£Ö¼'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'×§Ö¼'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'×›Ö¿'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'×ל'), + (0xFB50, 'M', u'Ù±'), + (0xFB52, 'M', u'Ù»'), + (0xFB56, 'M', u'Ù¾'), + (0xFB5A, 'M', u'Ú€'), + (0xFB5E, 'M', u'Ùº'), + (0xFB62, 'M', u'Ù¿'), + (0xFB66, 'M', u'Ù¹'), + (0xFB6A, 'M', u'Ú¤'), + (0xFB6E, 'M', u'Ú¦'), + (0xFB72, 'M', u'Ú„'), + (0xFB76, 'M', u'Úƒ'), + (0xFB7A, 'M', u'Ú†'), + (0xFB7E, 'M', u'Ú‡'), + (0xFB82, 'M', u'Ú'), + ] + +def _seg_43(): + return [ + (0xFB84, 'M', u'ÚŒ'), + (0xFB86, 'M', u'ÚŽ'), + (0xFB88, 'M', u'Úˆ'), + (0xFB8A, 'M', u'Ú˜'), + (0xFB8C, 'M', u'Ú‘'), + (0xFB8E, 'M', u'Ú©'), + (0xFB92, 'M', u'Ú¯'), + (0xFB96, 'M', u'Ú³'), + (0xFB9A, 'M', u'Ú±'), + (0xFB9E, 'M', u'Úº'), + (0xFBA0, 'M', u'Ú»'), + (0xFBA4, 'M', u'Û€'), + (0xFBA6, 'M', u'Û'), + (0xFBAA, 'M', u'Ú¾'), + (0xFBAE, 'M', u'Û’'), + (0xFBB0, 'M', u'Û“'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'Ú'), + (0xFBD7, 'M', u'Û‡'), + (0xFBD9, 'M', u'Û†'), + (0xFBDB, 'M', u'Ûˆ'), + (0xFBDD, 'M', u'Û‡Ù´'), + (0xFBDE, 'M', u'Û‹'), + (0xFBE0, 'M', u'Û…'), + (0xFBE2, 'M', u'Û‰'), + (0xFBE4, 'M', u'Û'), + (0xFBE8, 'M', u'Ù‰'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + (0xFBF6, 'M', u'ئÛ'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ÛŒ'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئØ'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بØ'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تØ'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جØ'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'ØØ¬'), + (0xFC18, 'M', u'ØÙ…'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'Ø®Ø'), + (0xFC1B, 'M', u'خم'), + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سØ'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صØ'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضØ'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'Ø·Ø'), + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'ÙØ¬'), + (0xFC2E, 'M', u'ÙØ'), + (0xFC2F, 'M', u'ÙØ®'), + (0xFC30, 'M', u'ÙÙ…'), + (0xFC31, 'M', u'ÙÙ‰'), + (0xFC32, 'M', u'ÙÙŠ'), + (0xFC33, 'M', u'Ù‚Ø'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'ÙƒØ'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + ] + +def _seg_44(): + return [ + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'Ù„Ø'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'Ù…Ø'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'Ù†Ø'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'ÙŠØ'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ÙÙ‘'), + (0xFC60, '3', u' ÙŽÙ‘'), + (0xFC61, '3', u' ÙÙ‘'), + (0xFC62, '3', u' ÙÙ‘'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'ÙÙ‰'), + (0xFC7D, 'M', u'ÙÙŠ'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئØ'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بØ'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تØ'), + ] + +def _seg_45(): + return [ + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جØ'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'ØØ¬'), + (0xFCAA, 'M', u'ØÙ…'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سØ'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صØ'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضØ'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'Ø·Ø'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'ÙØ¬'), + (0xFCBF, 'M', u'ÙØ'), + (0xFCC0, 'M', u'ÙØ®'), + (0xFCC1, 'M', u'ÙÙ…'), + (0xFCC2, 'M', u'Ù‚Ø'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + (0xFCC5, 'M', u'ÙƒØ'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'Ù„Ø'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'Ù…Ø'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'Ù†Ø'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'ÙŠØ'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'Ù€ÙŽÙ‘'), + (0xFCF3, 'M', u'Ù€ÙÙ‘'), + (0xFCF4, 'M', u'Ù€ÙÙ‘'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'ØÙ‰'), + (0xFD00, 'M', u'ØÙŠ'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + ] + +def _seg_46(): + return [ + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'Ø´Ø'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'ØÙ‰'), + (0xFD1C, 'M', u'ØÙŠ'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'Ø´Ø'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'Ø´Ø'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سØ'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'Ø´Ø'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'ØªØØ¬'), + (0xFD53, 'M', u'تØÙ…'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمØ'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمØ'), + (0xFD5A, 'M', u'ØÙ…ÙŠ'), + (0xFD5B, 'M', u'ØÙ…Ù‰'), + (0xFD5C, 'M', u'Ø³ØØ¬'), + (0xFD5D, 'M', u'سجØ'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمØ'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'ØµØØ'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'Ø´ØÙ…'), + (0xFD69, 'M', u'شجي'), + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضØÙ‰'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمØ'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'ÙØ®Ù…'), + (0xFD7E, 'M', u'قمØ'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'Ù„ØÙ…'), + (0xFD81, 'M', u'Ù„ØÙŠ'), + (0xFD82, 'M', u'Ù„ØÙ‰'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمØ'), + (0xFD89, 'M', u'Ù…ØØ¬'), + (0xFD8A, 'M', u'Ù…ØÙ…'), + ] + +def _seg_47(): + return [ + (0xFD8B, 'M', u'Ù…ØÙŠ'), + (0xFD8C, 'M', u'مجØ'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'Ù†ØÙ…'), + (0xFD96, 'M', u'Ù†ØÙ‰'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جØÙ‰'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صØÙŠ'), + (0xFDAA, 'M', u'Ø´ØÙŠ'), + (0xFDAB, 'M', u'ضØÙŠ'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'ÙŠØÙŠ'), + (0xFDAF, 'M', u'يجي'), + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'Ù†ØÙŠ'), + (0xFDB4, 'M', u'قمØ'), + (0xFDB5, 'M', u'Ù„ØÙ…'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجØ'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجØ'), + (0xFDBE, 'M', u'جØÙŠ'), + (0xFDBF, 'M', u'ØØ¬ÙŠ'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'Ùمي'), + (0xFDC2, 'M', u'بØÙŠ'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'Ù…ØÙ…د'), + (0xFDF5, 'M', u'صلعم'), + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + (0xFE11, 'M', u'ã€'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE27, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'ã€'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + ] + +def _seg_48(): + return [ + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'ã€'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'ã€'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' Ì…'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'ã€'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' Ù‹'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ÙŒ'), + (0xFE73, 'V'), + (0xFE74, '3', u' Ù'), + (0xFE75, 'X'), + (0xFE76, '3', u' ÙŽ'), + (0xFE77, 'M', u'Ù€ÙŽ'), + (0xFE78, '3', u' Ù'), + (0xFE79, 'M', u'Ù€Ù'), + (0xFE7A, '3', u' Ù'), + (0xFE7B, 'M', u'Ù€Ù'), + (0xFE7C, '3', u' Ù‘'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' Ù’'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'Ø¡'), + (0xFE81, 'M', u'Ø¢'), + (0xFE83, 'M', u'Ø£'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'Ø¥'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'Ø©'), + (0xFE95, 'M', u'ت'), + (0xFE99, 'M', u'Ø«'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'Ø'), + (0xFEA5, 'M', u'Ø®'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'ذ'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'Ø´'), + (0xFEB9, 'M', u'ص'), + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'Ø·'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'Ù'), + (0xFED5, 'M', u'Ù‚'), + (0xFED9, 'M', u'Ùƒ'), + (0xFEDD, 'M', u'Ù„'), + (0xFEE1, 'M', u'Ù…'), + (0xFEE5, 'M', u'Ù†'), + (0xFEE9, 'M', u'Ù‡'), + (0xFEED, 'M', u'Ùˆ'), + (0xFEEF, 'M', u'Ù‰'), + (0xFEF1, 'M', u'ÙŠ'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + ] + +def _seg_49(): + return [ + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'ã€'), + (0xFF64, 'M', u'ã€'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + ] + +def _seg_50(): + return [ + (0xFF67, 'M', u'ã‚¡'), + (0xFF68, 'M', u'ã‚£'), + (0xFF69, 'M', u'ã‚¥'), + (0xFF6A, 'M', u'ã‚§'), + (0xFF6B, 'M', u'ã‚©'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ã‚¢'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'ã‚«'), + (0xFF77, 'M', u'ã‚'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'ã‚·'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'ã‚»'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'ã‚¿'), + (0xFF81, 'M', u'ãƒ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ãƒ'), + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ãƒ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ãƒ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'ã‚™'), + (0xFF9F, 'M', u'゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'á„€'), + (0xFFA2, 'M', u'á„'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'á„‚'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'á†'), + (0xFFA7, 'M', u'ᄃ'), + (0xFFA8, 'M', u'á„„'), + (0xFFA9, 'M', u'á„…'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'ᄚ'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'á„¡'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'ᄊ'), + (0xFFB7, 'M', u'á„‹'), + (0xFFB8, 'M', u'ᄌ'), + (0xFFB9, 'M', u'á„'), + (0xFFBA, 'M', u'ᄎ'), + (0xFFBB, 'M', u'á„'), + (0xFFBC, 'M', u'á„'), + (0xFFBD, 'M', u'á„‘'), + (0xFFBE, 'M', u'á„’'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'á…¡'), + (0xFFC3, 'M', u'á…¢'), + (0xFFC4, 'M', u'á…£'), + (0xFFC5, 'M', u'á…¤'), + (0xFFC6, 'M', u'á…¥'), + (0xFFC7, 'M', u'á…¦'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'á…§'), + (0xFFCB, 'M', u'á…¨'), + (0xFFCC, 'M', u'á…©'), + (0xFFCD, 'M', u'á…ª'), + ] + +def _seg_51(): + return [ + (0xFFCE, 'M', u'á…«'), + (0xFFCF, 'M', u'á…¬'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'á…'), + (0xFFD3, 'M', u'á…®'), + (0xFFD4, 'M', u'á…¯'), + (0xFFD5, 'M', u'á…°'), + (0xFFD6, 'M', u'á…±'), + (0xFFD7, 'M', u'á…²'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'á…³'), + (0xFFDB, 'M', u'á…´'), + (0xFFDC, 'M', u'á…µ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' Ì„'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'Â¥'), + (0xFFE6, 'M', u'â‚©'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'â†'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'â– '), + (0xFFEE, 'M', u'â—‹'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018B, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x10300, 'V'), + (0x1031F, 'X'), + (0x10320, 'V'), + (0x10324, 'X'), + (0x10330, 'V'), + (0x1034B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'ð¨'), + (0x10401, 'M', u'ð©'), + (0x10402, 'M', u'ðª'), + (0x10403, 'M', u'ð«'), + (0x10404, 'M', u'ð¬'), + (0x10405, 'M', u'ð'), + (0x10406, 'M', u'ð®'), + (0x10407, 'M', u'ð¯'), + (0x10408, 'M', u'ð°'), + (0x10409, 'M', u'ð±'), + (0x1040A, 'M', u'ð²'), + (0x1040B, 'M', u'ð³'), + (0x1040C, 'M', u'ð´'), + (0x1040D, 'M', u'ðµ'), + (0x1040E, 'M', u'ð¶'), + (0x1040F, 'M', u'ð·'), + (0x10410, 'M', u'ð¸'), + (0x10411, 'M', u'ð¹'), + (0x10412, 'M', u'ðº'), + (0x10413, 'M', u'ð»'), + (0x10414, 'M', u'ð¼'), + (0x10415, 'M', u'ð½'), + (0x10416, 'M', u'ð¾'), + (0x10417, 'M', u'ð¿'), + (0x10418, 'M', u'ð‘€'), + (0x10419, 'M', u'ð‘'), + (0x1041A, 'M', u'ð‘‚'), + (0x1041B, 'M', u'ð‘ƒ'), + (0x1041C, 'M', u'ð‘„'), + (0x1041D, 'M', u'ð‘…'), + ] + +def _seg_52(): + return [ + (0x1041E, 'M', u'ð‘†'), + (0x1041F, 'M', u'ð‘‡'), + (0x10420, 'M', u'ð‘ˆ'), + (0x10421, 'M', u'ð‘‰'), + (0x10422, 'M', u'ð‘Š'), + (0x10423, 'M', u'ð‘‹'), + (0x10424, 'M', u'ð‘Œ'), + (0x10425, 'M', u'ð‘'), + (0x10426, 'M', u'ð‘Ž'), + (0x10427, 'M', u'ð‘'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x10860, 'X'), + (0x10900, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BE, 'V'), + (0x109C0, 'X'), + (0x10A00, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A34, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A48, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10A80, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B80, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x11080, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11144, 'X'), + (0x11180, 'V'), + (0x111C9, 'X'), + (0x111D0, 'V'), + (0x111DA, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x12000, 'V'), + (0x1236F, 'X'), + (0x12400, 'V'), + (0x12463, 'X'), + (0x12470, 'V'), + (0x12474, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + ] + +def _seg_53(): + return [ + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x1B000, 'V'), + (0x1B002, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'ð…—ð…¥'), + (0x1D15F, 'M', u'ð…˜ð…¥'), + (0x1D160, 'M', u'ð…˜ð…¥ð…®'), + (0x1D161, 'M', u'ð…˜ð…¥ð…¯'), + (0x1D162, 'M', u'ð…˜ð…¥ð…°'), + (0x1D163, 'M', u'ð…˜ð…¥ð…±'), + (0x1D164, 'M', u'ð…˜ð…¥ð…²'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'ð†¹ð…¥'), + (0x1D1BC, 'M', u'ð†ºð…¥'), + (0x1D1BD, 'M', u'ð†¹ð…¥ð…®'), + (0x1D1BE, 'M', u'ð†ºð…¥ð…®'), + (0x1D1BF, 'M', u'ð†¹ð…¥ð…¯'), + (0x1D1C0, 'M', u'ð†ºð…¥ð…¯'), + (0x1D1C1, 'V'), + (0x1D1DE, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D372, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + (0x1D406, 'M', u'g'), + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + ] + +def _seg_54(): + return [ + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + (0x1D46A, 'M', u'c'), + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + ] + +def _seg_55(): + return [ + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + (0x1D4D1, 'M', u'b'), + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + ] + +def _seg_56(): + return [ + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + (0x1D536, 'M', u'y'), + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + ] + +def _seg_57(): + return [ + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + (0x1D59C, 'M', u'w'), + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + ] + +def _seg_58(): + return [ + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + (0x1D600, 'M', u's'), + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + ] + +def _seg_59(): + return [ + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + (0x1D664, 'M', u'o'), + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + ] + +def _seg_60(): + return [ + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'È·'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'Ï€'), + (0x1D6B8, 'M', u'Ï'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'Ï„'), + (0x1D6BC, 'M', u'Ï…'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + (0x1D6C9, 'M', u'θ'), + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'Ï€'), + (0x1D6D2, 'M', u'Ï'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'Ï„'), + (0x1D6D6, 'M', u'Ï…'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'Ï'), + (0x1D6E1, 'M', u'Ï€'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'Ï€'), + (0x1D6F2, 'M', u'Ï'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'Ï„'), + (0x1D6F6, 'M', u'Ï…'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + ] + +def _seg_61(): + return [ + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'Ï€'), + (0x1D70C, 'M', u'Ï'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'Ï„'), + (0x1D710, 'M', u'Ï…'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'Ï'), + (0x1D71B, 'M', u'Ï€'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'Ï€'), + (0x1D72C, 'M', u'Ï'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + (0x1D72F, 'M', u'Ï„'), + (0x1D730, 'M', u'Ï…'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'Ï€'), + (0x1D746, 'M', u'Ï'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'Ï„'), + (0x1D74A, 'M', u'Ï…'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'Ï'), + (0x1D755, 'M', u'Ï€'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'Ï€'), + (0x1D766, 'M', u'Ï'), + ] + +def _seg_62(): + return [ + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'Ï„'), + (0x1D76A, 'M', u'Ï…'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'Ï€'), + (0x1D780, 'M', u'Ï'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'Ï„'), + (0x1D784, 'M', u'Ï…'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'Ï'), + (0x1D78F, 'M', u'Ï€'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + (0x1D795, 'M', u'ζ'), + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'Ï€'), + (0x1D7A0, 'M', u'Ï'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'Ï„'), + (0x1D7A4, 'M', u'Ï…'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'Ï€'), + (0x1D7BA, 'M', u'Ï'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'Ï„'), + (0x1D7BE, 'M', u'Ï…'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'Ï'), + (0x1D7C9, 'M', u'Ï€'), + (0x1D7CA, 'M', u'Ï'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + ] + +def _seg_63(): + return [ + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + (0x1D7FC, 'M', u'6'), + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'Ùˆ'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'Ø'), + (0x1EE08, 'M', u'Ø·'), + (0x1EE09, 'M', u'ÙŠ'), + (0x1EE0A, 'M', u'Ùƒ'), + (0x1EE0B, 'M', u'Ù„'), + (0x1EE0C, 'M', u'Ù…'), + (0x1EE0D, 'M', u'Ù†'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'Ù'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'Ù‚'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'Ø´'), + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'Ø«'), + (0x1EE17, 'M', u'Ø®'), + (0x1EE18, 'M', u'ذ'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'Ù®'), + (0x1EE1D, 'M', u'Úº'), + (0x1EE1E, 'M', u'Ú¡'), + (0x1EE1F, 'M', u'Ù¯'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', u'Ù‡'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'Ø'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ÙŠ'), + (0x1EE2A, 'M', u'Ùƒ'), + (0x1EE2B, 'M', u'Ù„'), + (0x1EE2C, 'M', u'Ù…'), + (0x1EE2D, 'M', u'Ù†'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'Ù'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'Ù‚'), + ] + +def _seg_64(): + return [ + (0x1EE33, 'X'), + (0x1EE34, 'M', u'Ø´'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'Ø«'), + (0x1EE37, 'M', u'Ø®'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'Ø'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ÙŠ'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'Ù„'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'Ù†'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'Ù‚'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'Ø´'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'Ø®'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'Úº'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'Ù¯'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'Ù‡'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'Ø'), + (0x1EE68, 'M', u'Ø·'), + (0x1EE69, 'M', u'ÙŠ'), + (0x1EE6A, 'M', u'Ùƒ'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'Ù…'), + (0x1EE6D, 'M', u'Ù†'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'Ù'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'Ù‚'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'Ø´'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'Ø«'), + (0x1EE77, 'M', u'Ø®'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'Ù®'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'Ú¡'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + (0x1EE84, 'M', u'Ù‡'), + (0x1EE85, 'M', u'Ùˆ'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'Ø'), + (0x1EE88, 'M', u'Ø·'), + (0x1EE89, 'M', u'ÙŠ'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'Ù„'), + (0x1EE8C, 'M', u'Ù…'), + (0x1EE8D, 'M', u'Ù†'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'Ù'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'Ù‚'), + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'Ø´'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'Ø«'), + (0x1EE97, 'M', u'Ø®'), + (0x1EE98, 'M', u'ذ'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + ] + +def _seg_65(): + return [ + (0x1EEA5, 'M', u'Ùˆ'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'Ø'), + (0x1EEA8, 'M', u'Ø·'), + (0x1EEA9, 'M', u'ÙŠ'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'Ù„'), + (0x1EEAC, 'M', u'Ù…'), + (0x1EEAD, 'M', u'Ù†'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'Ù'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'Ù‚'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'Ø´'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'Ø«'), + (0x1EEB7, 'M', u'Ø®'), + (0x1EEB8, 'M', u'ذ'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0BF, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0E0, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'X'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + ] + +def _seg_66(): + return [ + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F19B, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ã»ã‹'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'å—'), + (0x1F212, 'M', u'åŒ'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'è§£'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'æ˜ '), + (0x1F21A, 'M', u'ç„¡'), + (0x1F21B, 'M', u'æ–™'), + (0x1F21C, 'M', u'å‰'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'å†'), + (0x1F21F, 'M', u'æ–°'), + (0x1F220, 'M', u'åˆ'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'å¹'), + (0x1F226, 'M', u'æ¼”'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'æ•'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'éŠ'), + (0x1F22C, 'M', u'å·¦'), + (0x1F22D, 'M', u'ä¸'), + (0x1F22E, 'M', u'å³'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'èµ°'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'ç¦'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'åˆ'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'å–¶'), + (0x1F23B, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔å‹ã€•'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'å¾—'), + (0x1F251, 'M', u'å¯'), + (0x1F252, 'X'), + (0x1F300, 'V'), + (0x1F321, 'X'), + (0x1F330, 'V'), + (0x1F336, 'X'), + (0x1F337, 'V'), + (0x1F37D, 'X'), + (0x1F380, 'V'), + (0x1F394, 'X'), + (0x1F3A0, 'V'), + (0x1F3C5, 'X'), + (0x1F3C6, 'V'), + (0x1F3CB, 'X'), + (0x1F3E0, 'V'), + (0x1F3F1, 'X'), + (0x1F400, 'V'), + (0x1F43F, 'X'), + (0x1F440, 'V'), + ] + +def _seg_67(): + return [ + (0x1F441, 'X'), + (0x1F442, 'V'), + (0x1F4F8, 'X'), + (0x1F4F9, 'V'), + (0x1F4FD, 'X'), + (0x1F500, 'V'), + (0x1F53E, 'X'), + (0x1F540, 'V'), + (0x1F544, 'X'), + (0x1F550, 'V'), + (0x1F568, 'X'), + (0x1F5FB, 'V'), + (0x1F641, 'X'), + (0x1F645, 'V'), + (0x1F650, 'X'), + (0x1F680, 'V'), + (0x1F6C6, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'ä¹'), + (0x2F803, 'M', u'ð „¢'), + (0x2F804, 'M', u'ä½ '), + (0x2F805, 'M', u'ä¾®'), + (0x2F806, 'M', u'ä¾»'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'åº'), + (0x2F809, 'M', u'å‚™'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'åƒ'), + (0x2F80C, 'M', u'ã’ž'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'å…'), + (0x2F80F, 'M', u'å…”'), + (0x2F810, 'M', u'å…¤'), + (0x2F811, 'M', u'å…·'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'ã’¹'), + (0x2F814, 'M', u'å…§'), + (0x2F815, 'M', u'å†'), + (0x2F816, 'M', u'ð •‹'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'㓟'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'å‰'), + (0x2F82D, 'M', u'å‘'), + (0x2F82E, 'M', u'åš'), + (0x2F82F, 'M', u'å³'), + (0x2F830, 'M', u'å½'), + (0x2F831, 'M', u'å¿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'ç°'), + (0x2F836, 'M', u'åŠ'), + (0x2F837, 'M', u'åŸ'), + (0x2F838, 'M', u'ð £'), + (0x2F839, 'M', u'å«'), + (0x2F83A, 'M', u'å±'), + (0x2F83B, 'M', u'å†'), + (0x2F83C, 'M', u'å’ž'), + (0x2F83D, 'M', u'å¸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'å’¢'), + (0x2F841, 'M', u'å“¶'), + (0x2F842, 'M', u'å”'), + (0x2F843, 'M', u'å•“'), + (0x2F844, 'M', u'å•£'), + (0x2F845, 'M', u'å–„'), + (0x2F847, 'M', u'å–™'), + (0x2F848, 'M', u'å–«'), + (0x2F849, 'M', u'å–³'), + (0x2F84A, 'M', u'å—‚'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + ] + +def _seg_68(): + return [ + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'å™´'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'å '), + (0x2F855, 'M', u'åž‹'), + (0x2F856, 'M', u'å ²'), + (0x2F857, 'M', u'å ±'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'ã›®'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'å°†'), + (0x2F874, 'X'), + (0x2F875, 'M', u'å°¢'), + (0x2F876, 'M', u'ãž'), + (0x2F877, 'M', u'å± '), + (0x2F878, 'M', u'å±®'), + (0x2F879, 'M', u'å³€'), + (0x2F87A, 'M', u'å²'), + (0x2F87B, 'M', u'ð¡·¤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'ð¡·¦'), + (0x2F87E, 'M', u'åµ®'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'åµ¼'), + (0x2F881, 'M', u'å·¡'), + (0x2F882, 'M', u'å·¢'), + (0x2F883, 'M', u'ã ¯'), + (0x2F884, 'M', u'å·½'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'ã¡¢'), + (0x2F889, 'M', u'𢆃'), + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'èˆ'), + (0x2F894, 'M', u'å¼¢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'å½¢'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'å¿'), + (0x2F89E, 'M', u'å¿—'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'æ‚'), + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'æ‚”'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'æ…ˆ'), + (0x2F8A7, 'M', u'æ…Œ'), + (0x2F8A8, 'M', u'æ…Ž'), + (0x2F8A9, 'M', u'æ…Œ'), + (0x2F8AA, 'M', u'æ…º'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'æˆ'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'æ‰'), + ] + +def _seg_69(): + return [ + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'æ‹”'), + (0x2F8B7, 'M', u'æ'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'æ¨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'æ¤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'æ¢'), + (0x2F8C0, 'M', u'æ…'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'æ‘©'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'æ’'), + (0x2F8C6, 'M', u'æ‘·'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'æ•'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'æ—£'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'æš‘'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'æšœ'), + (0x2F8D6, 'M', u'è‚'), + (0x2F8D7, 'M', u'ä™'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'æž'), + (0x2F8DC, 'M', u'æ“'), + (0x2F8DD, 'M', u'ð£ƒ'), + (0x2F8DE, 'M', u'ã‰'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'æž…'), + (0x2F8E1, 'M', u'æ¡’'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'ð£‘'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'æ Ÿ'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'ã®'), + (0x2F8E8, 'M', u'楂'), + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'æ«›'), + (0x2F8EE, 'M', u'ã°˜'), + (0x2F8EF, 'M', u'次'), + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'æ”'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'æ²'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'æ®»'), + (0x2F8F7, 'M', u'ð£ª'), + (0x2F8F8, 'M', u'ð¡´‹'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'æ³'), + (0x2F8FE, 'M', u'æ±§'), + (0x2F8FF, 'M', u'æ´–'), + (0x2F900, 'M', u'æ´¾'), + (0x2F901, 'M', u'æµ·'), + (0x2F902, 'M', u'æµ'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + (0x2F905, 'M', u'æ¶…'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'æ´´'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'æ¹®'), + (0x2F90A, 'M', u'ã´³'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'æ·¹'), + (0x2F90F, 'M', u'æ½®'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'ã¶–'), + (0x2F917, 'M', u'çŠ'), + (0x2F918, 'M', u'ç½'), + ] + +def _seg_70(): + return [ + (0x2F919, 'M', u'ç·'), + (0x2F91A, 'M', u'ç‚'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'ç……'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'ç‰'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'çº'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'瑜'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'ç’…'), + (0x2F932, 'M', u'瓊'), + (0x2F933, 'M', u'ã¼›'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'ç•°'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'ç˜'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'ð¥„'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'ç›´'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'çŠ'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'çž‹'), + (0x2F94B, 'M', u'ä†'), + (0x2F94C, 'M', u'ä‚–'), + (0x2F94D, 'M', u'ð¥'), + (0x2F94E, 'M', u'硎'), + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + (0x2F956, 'M', u'ç¦'), + (0x2F957, 'M', u'ç§«'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'ç©€'), + (0x2F95A, 'M', u'穊'), + (0x2F95B, 'M', u'ç©'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'ç³’'), + (0x2F967, 'M', u'äŠ '), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'ç³£'), + (0x2F96A, 'M', u'ç´€'), + (0x2F96B, 'M', u'𥾆'), + (0x2F96C, 'M', u'çµ£'), + (0x2F96D, 'M', u'äŒ'), + (0x2F96E, 'M', u'ç·‡'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'ç¹…'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'ä™'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'è '), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'è°'), + ] + +def _seg_71(): + return [ + (0x2F980, 'M', u'ð£Ÿ'), + (0x2F981, 'M', u'ä•'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'ä‹'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'èˆ'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'ä‘«'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'èŠ'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'è‹¥'), + (0x2F999, 'M', u'èŒ'), + (0x2F99A, 'M', u'è£'), + (0x2F99B, 'M', u'èŽ'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'è§'), + (0x2F99F, 'M', u'è‘—'), + (0x2F9A0, 'M', u'è“'), + (0x2F9A1, 'M', u'èŠ'), + (0x2F9A2, 'M', u'èŒ'), + (0x2F9A3, 'M', u'èœ'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'è”–'), + (0x2F9AB, 'M', u'ð§Š'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'ä•'), + (0x2F9AF, 'M', u'ä•¡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'ä•«'), + (0x2F9B3, 'M', u'è™'), + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'è™§'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'èš©'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + (0x2F9BB, 'M', u'è¹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'è«'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'è '), + (0x2F9C2, 'M', u'ä—¹'), + (0x2F9C3, 'M', u'è¡ '), + (0x2F9C4, 'M', u'è¡£'), + (0x2F9C5, 'M', u'ð§™§'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'ã’»'), + (0x2F9CB, 'M', u'ð§¢®'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'äš¾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'èª '), + (0x2F9D0, 'M', u'è«'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'è³'), + (0x2F9D6, 'M', u'è´›'), + (0x2F9D7, 'M', u'èµ·'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'ð „'), + (0x2F9DA, 'M', u'è·‹'), + (0x2F9DB, 'M', u'è¶¼'), + (0x2F9DC, 'M', u'è·°'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'è»”'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'ð¨—'), + (0x2F9E2, 'M', u'é‚”'), + (0x2F9E3, 'M', u'郱'), + ] + +def _seg_72(): + return [ + (0x2F9E4, 'M', u'é„‘'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'é„›'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'é‹—'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'é¹'), + (0x2F9EC, 'M', u'é•'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'é–‹'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'é–·'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'å¶²'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'ð©……'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'ä©®'), + (0x2F9F9, 'M', u'ä©¶'), + (0x2F9FA, 'M', u'éŸ '), + (0x2F9FB, 'M', u'ð©Š'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'ð©’–'), + (0x2F9FE, 'M', u'é ‹'), + (0x2FA00, 'M', u'é ©'), + (0x2FA01, 'M', u'ð©–¶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'é§‚'), + (0x2FA07, 'M', u'é§¾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'é±€'), + (0x2FA0C, 'M', u'é³½'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'ä³'), + (0x2FA0F, 'M', u'éµ§'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'äµ–'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + (0x2FA19, 'M', u'é¼…'), + (0x2FA1A, 'M', u'é¼'), + (0x2FA1B, 'M', u'é¼–'), + (0x2FA1C, 'M', u'é¼»'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() +) diff --git a/vendor/pip-9.0.3/pip/_vendor/ipaddress.py b/vendor/pip-9.0.3/pip/_vendor/ipaddress.py new file mode 100644 index 0000000000000000000000000000000000000000..9cf71a744bc79d33bb62b0477d56e664d6f49356 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/ipaddress.py @@ -0,0 +1,2425 @@ +# Copyright 2007 Google Inc. +# Licensed to PSF under a Contributor Agreement. + +"""A fast, lightweight IPv4/IPv6 manipulation library in Python. + +This library is used to create/poke/manipulate IPv4 and IPv6 addresses +and networks. + +""" + +from __future__ import unicode_literals + + +import itertools +import struct + +__version__ = '1.0.17' + +# Compatibility functions +_compat_int_types = (int,) +try: + _compat_int_types = (int, long) +except NameError: + pass +try: + _compat_str = unicode +except NameError: + _compat_str = str + assert bytes != str +if b'\0'[0] == 0: # Python 3 semantics + def _compat_bytes_to_byte_vals(byt): + return byt +else: + def _compat_bytes_to_byte_vals(byt): + return [struct.unpack(b'!B', b)[0] for b in byt] +try: + _compat_int_from_byte_vals = int.from_bytes +except AttributeError: + def _compat_int_from_byte_vals(bytvals, endianess): + assert endianess == 'big' + res = 0 + for bv in bytvals: + assert isinstance(bv, _compat_int_types) + res = (res << 8) + bv + return res + + +def _compat_to_bytes(intval, length, endianess): + assert isinstance(intval, _compat_int_types) + assert endianess == 'big' + if length == 4: + if intval < 0 or intval >= 2 ** 32: + raise struct.error("integer out of range for 'I' format code") + return struct.pack(b'!I', intval) + elif length == 16: + if intval < 0 or intval >= 2 ** 128: + raise struct.error("integer out of range for 'QQ' format code") + return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) + else: + raise NotImplementedError() +if hasattr(int, 'bit_length'): + # Not int.bit_length , since that won't work in 2.7 where long exists + def _compat_bit_length(i): + return i.bit_length() +else: + def _compat_bit_length(i): + for res in itertools.count(): + if i >> res == 0: + return res + + +def _compat_range(start, end, step=1): + assert step > 0 + i = start + while i < end: + yield i + i += step + + +class _TotalOrderingMixin(object): + __slots__ = () + + # Helper that derives the other comparison operations from + # __lt__ and __eq__ + # We avoid functools.total_ordering because it doesn't handle + # NotImplemented correctly yet (http://bugs.python.org/issue10042) + def __eq__(self, other): + raise NotImplementedError + + def __ne__(self, other): + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not equal + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + less = self.__lt__(other) + if less is NotImplemented or not less: + return self.__eq__(other) + return less + + def __gt__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not (less or equal) + + def __ge__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + return not less + + +IPV4LENGTH = 32 +IPV6LENGTH = 128 + + +class AddressValueError(ValueError): + """A Value Error related to the address.""" + + +class NetmaskValueError(ValueError): + """A Value Error related to the netmask.""" + + +def ip_address(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Address or IPv6Address object. + + Raises: + ValueError: if the *address* passed isn't either a v4 or a v6 + address + + """ + try: + return IPv4Address(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Address(address) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % + address) + + +def ip_network(address, strict=True): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP network. Either IPv4 or + IPv6 networks may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Network or IPv6Network object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. Or if the network has host bits set. + + """ + try: + return IPv4Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 network. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % + address) + + +def ip_interface(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Interface or IPv6Interface object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. + + Notes: + The IPv?Interface classes describe an Address on a particular + Network, so they're basically a combination of both the Address + and Network classes. + + """ + try: + return IPv4Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % + address) + + +def v4_int_to_packed(address): + """Represent an address as 4 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv4 IP address. + + Returns: + The integer address packed as 4 bytes in network (big-endian) order. + + Raises: + ValueError: If the integer is negative or too large to be an + IPv4 IP address. + + """ + try: + return _compat_to_bytes(address, 4, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv4") + + +def v6_int_to_packed(address): + """Represent an address as 16 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv6 IP address. + + Returns: + The integer address packed as 16 bytes in network (big-endian) order. + + """ + try: + return _compat_to_bytes(address, 16, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv6") + + +def _split_optional_netmask(address): + """Helper to split the netmask and raise AddressValueError if needed""" + addr = _compat_str(address).split('/') + if len(addr) > 2: + raise AddressValueError("Only one '/' permitted in %r" % address) + return addr + + +def _find_address_range(addresses): + """Find a sequence of sorted deduplicated IPv#Address. + + Args: + addresses: a list of IPv#Address objects. + + Yields: + A tuple containing the first and last IP addresses in the sequence. + + """ + it = iter(addresses) + first = last = next(it) + for ip in it: + if ip._ip != last._ip + 1: + yield first, last + first = ip + last = ip + yield first, last + + +def _count_righthand_zero_bits(number, bits): + """Count the number of zero bits on the right hand side. + + Args: + number: an integer. + bits: maximum number of bits to count. + + Returns: + The number of zero bits on the right hand side of the number. + + """ + if number == 0: + return bits + return min(bits, _compat_bit_length(~number & (number - 1))) + + +def summarize_address_range(first, last): + """Summarize a network range given the first and last IP addresses. + + Example: + >>> list(summarize_address_range(IPv4Address('192.0.2.0'), + ... IPv4Address('192.0.2.130'))) + ... #doctest: +NORMALIZE_WHITESPACE + [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), + IPv4Network('192.0.2.130/32')] + + Args: + first: the first IPv4Address or IPv6Address in the range. + last: the last IPv4Address or IPv6Address in the range. + + Returns: + An iterator of the summarized IPv(4|6) network objects. + + Raise: + TypeError: + If the first and last objects are not IP addresses. + If the first and last objects are not the same version. + ValueError: + If the last object is not greater than the first. + If the version of the first address is not 4 or 6. + + """ + if (not (isinstance(first, _BaseAddress) and + isinstance(last, _BaseAddress))): + raise TypeError('first and last must be IP addresses, not networks') + if first.version != last.version: + raise TypeError("%s and %s are not of the same version" % ( + first, last)) + if first > last: + raise ValueError('last IP address must be greater than first') + + if first.version == 4: + ip = IPv4Network + elif first.version == 6: + ip = IPv6Network + else: + raise ValueError('unknown IP version') + + ip_bits = first._max_prefixlen + first_int = first._ip + last_int = last._ip + while first_int <= last_int: + nbits = min(_count_righthand_zero_bits(first_int, ip_bits), + _compat_bit_length(last_int - first_int + 1) - 1) + net = ip((first_int, ip_bits - nbits)) + yield net + first_int += 1 << nbits + if first_int - 1 == ip._ALL_ONES: + break + + +def _collapse_addresses_internal(addresses): + """Loops through the addresses, collapsing concurrent netblocks. + + Example: + + ip1 = IPv4Network('192.0.2.0/26') + ip2 = IPv4Network('192.0.2.64/26') + ip3 = IPv4Network('192.0.2.128/26') + ip4 = IPv4Network('192.0.2.192/26') + + _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> + [IPv4Network('192.0.2.0/24')] + + This shouldn't be called directly; it is called via + collapse_addresses([]). + + Args: + addresses: A list of IPv4Network's or IPv6Network's + + Returns: + A list of IPv4Network's or IPv6Network's depending on what we were + passed. + + """ + # First merge + to_merge = list(addresses) + subnets = {} + while to_merge: + net = to_merge.pop() + supernet = net.supernet() + existing = subnets.get(supernet) + if existing is None: + subnets[supernet] = net + elif existing != net: + # Merge consecutive subnets + del subnets[supernet] + to_merge.append(supernet) + # Then iterate over resulting networks, skipping subsumed subnets + last = None + for net in sorted(subnets.values()): + if last is not None: + # Since they are sorted, + # last.network_address <= net.network_address is a given. + if last.broadcast_address >= net.broadcast_address: + continue + yield net + last = net + + +def collapse_addresses(addresses): + """Collapse a list of IP objects. + + Example: + collapse_addresses([IPv4Network('192.0.2.0/25'), + IPv4Network('192.0.2.128/25')]) -> + [IPv4Network('192.0.2.0/24')] + + Args: + addresses: An iterator of IPv4Network or IPv6Network objects. + + Returns: + An iterator of the collapsed IPv(4|6)Network objects. + + Raises: + TypeError: If passed a list of mixed version objects. + + """ + addrs = [] + ips = [] + nets = [] + + # split IP addresses and networks + for ip in addresses: + if isinstance(ip, _BaseAddress): + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + ips.append(ip) + elif ip._prefixlen == ip._max_prefixlen: + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + try: + ips.append(ip.ip) + except AttributeError: + ips.append(ip.network_address) + else: + if nets and nets[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, nets[-1])) + nets.append(ip) + + # sort and dedup + ips = sorted(set(ips)) + + # find consecutive address ranges in the sorted sequence and summarize them + if ips: + for first, last in _find_address_range(ips): + addrs.extend(summarize_address_range(first, last)) + + return _collapse_addresses_internal(addrs + nets) + + +def get_mixed_type_key(obj): + """Return a key suitable for sorting between networks and addresses. + + Address and Network objects are not sortable by default; they're + fundamentally different so the expression + + IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') + + doesn't make any sense. There are some times however, where you may wish + to have ipaddress sort these for you anyway. If you need to do this, you + can use this function as the key= argument to sorted(). + + Args: + obj: either a Network or Address object. + Returns: + appropriate key. + + """ + if isinstance(obj, _BaseNetwork): + return obj._get_networks_key() + elif isinstance(obj, _BaseAddress): + return obj._get_address_key() + return NotImplemented + + +class _IPAddressBase(_TotalOrderingMixin): + + """The mother class.""" + + __slots__ = () + + @property + def exploded(self): + """Return the longhand version of the IP address as a string.""" + return self._explode_shorthand_ip_string() + + @property + def compressed(self): + """Return the shorthand version of the IP address as a string.""" + return _compat_str(self) + + @property + def reverse_pointer(self): + """The name of the reverse DNS pointer for the IP address, e.g.: + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + """ + return self._reverse_pointer() + + @property + def version(self): + msg = '%200s has no version specified' % (type(self),) + raise NotImplementedError(msg) + + def _check_int_address(self, address): + if address < 0: + msg = "%d (< 0) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._version)) + if address > self._ALL_ONES: + msg = "%d (>= 2**%d) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._max_prefixlen, + self._version)) + + def _check_packed_address(self, address, expected_len): + address_len = len(address) + if address_len != expected_len: + msg = ( + '%r (len %d != %d) is not permitted as an IPv%d address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' + ) + raise AddressValueError(msg % (address, address_len, + expected_len, self._version)) + + @classmethod + def _ip_int_from_prefix(cls, prefixlen): + """Turn the prefix length into a bitwise netmask + + Args: + prefixlen: An integer, the prefix length. + + Returns: + An integer. + + """ + return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) + + @classmethod + def _prefix_from_ip_int(cls, ip_int): + """Return prefix length from the bitwise netmask. + + Args: + ip_int: An integer, the netmask in expanded bitwise format + + Returns: + An integer, the prefix length. + + Raises: + ValueError: If the input intermingles zeroes & ones + """ + trailing_zeroes = _count_righthand_zero_bits(ip_int, + cls._max_prefixlen) + prefixlen = cls._max_prefixlen - trailing_zeroes + leading_ones = ip_int >> trailing_zeroes + all_ones = (1 << prefixlen) - 1 + if leading_ones != all_ones: + byteslen = cls._max_prefixlen // 8 + details = _compat_to_bytes(ip_int, byteslen, 'big') + msg = 'Netmask pattern %r mixes zeroes & ones' + raise ValueError(msg % details) + return prefixlen + + @classmethod + def _report_invalid_netmask(cls, netmask_str): + msg = '%r is not a valid netmask' % netmask_str + raise NetmaskValueError(msg) + + @classmethod + def _prefix_from_prefix_string(cls, prefixlen_str): + """Return prefix length from a numeric string + + Args: + prefixlen_str: The string to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask + """ + # int allows a leading +/- as well as surrounding whitespace, + # so we ensure that isn't the case + if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): + cls._report_invalid_netmask(prefixlen_str) + try: + prefixlen = int(prefixlen_str) + except ValueError: + cls._report_invalid_netmask(prefixlen_str) + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen_str) + return prefixlen + + @classmethod + def _prefix_from_ip_string(cls, ip_str): + """Turn a netmask/hostmask string into a prefix length + + Args: + ip_str: The netmask/hostmask to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask/hostmask + """ + # Parse the netmask/hostmask like an IP address. + try: + ip_int = cls._ip_int_from_string(ip_str) + except AddressValueError: + cls._report_invalid_netmask(ip_str) + + # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). + # Note that the two ambiguous cases (all-ones and all-zeroes) are + # treated as netmasks. + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + pass + + # Invert the bits, and try matching a /0+1+/ hostmask instead. + ip_int ^= cls._ALL_ONES + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + cls._report_invalid_netmask(ip_str) + + def __reduce__(self): + return self.__class__, (_compat_str(self),) + + +class _BaseAddress(_IPAddressBase): + + """A generic IP object. + + This IP class contains the version independent methods which are + used by single IP addresses. + """ + + __slots__ = () + + def __int__(self): + return self._ip + + def __eq__(self, other): + try: + return (self._ip == other._ip and + self._version == other._version) + except AttributeError: + return NotImplemented + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseAddress): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self._ip != other._ip: + return self._ip < other._ip + return False + + # Shorthand for Integer addition and subtraction. This is not + # meant to ever support addition/subtraction of addresses. + def __add__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) + other) + + def __sub__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) - other) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return _compat_str(self._string_from_ip_int(self._ip)) + + def __hash__(self): + return hash(hex(int(self._ip))) + + def _get_address_key(self): + return (self._version, self) + + def __reduce__(self): + return self.__class__, (self._ip,) + + +class _BaseNetwork(_IPAddressBase): + + """A generic IP network object. + + This IP class contains the version independent methods which are + used by networks. + + """ + def __init__(self, address): + self._cache = {} + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return '%s/%d' % (self.network_address, self.prefixlen) + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the network + or broadcast addresses. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast): + yield self._address_class(x) + + def __iter__(self): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network, broadcast + 1): + yield self._address_class(x) + + def __getitem__(self, n): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + if n >= 0: + if network + n > broadcast: + raise IndexError('address out of range') + return self._address_class(network + n) + else: + n += 1 + if broadcast + n < network: + raise IndexError('address out of range') + return self._address_class(broadcast + n) + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseNetwork): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self.network_address != other.network_address: + return self.network_address < other.network_address + if self.netmask != other.netmask: + return self.netmask < other.netmask + return False + + def __eq__(self, other): + try: + return (self._version == other._version and + self.network_address == other.network_address and + int(self.netmask) == int(other.netmask)) + except AttributeError: + return NotImplemented + + def __hash__(self): + return hash(int(self.network_address) ^ int(self.netmask)) + + def __contains__(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if isinstance(other, _BaseNetwork): + return False + # dealing with another address + else: + # address + return (int(self.network_address) <= int(other._ip) <= + int(self.broadcast_address)) + + def overlaps(self, other): + """Tell if self is partly contained in other.""" + return self.network_address in other or ( + self.broadcast_address in other or ( + other.network_address in self or ( + other.broadcast_address in self))) + + @property + def broadcast_address(self): + x = self._cache.get('broadcast_address') + if x is None: + x = self._address_class(int(self.network_address) | + int(self.hostmask)) + self._cache['broadcast_address'] = x + return x + + @property + def hostmask(self): + x = self._cache.get('hostmask') + if x is None: + x = self._address_class(int(self.netmask) ^ self._ALL_ONES) + self._cache['hostmask'] = x + return x + + @property + def with_prefixlen(self): + return '%s/%d' % (self.network_address, self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self.network_address, self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self.network_address, self.hostmask) + + @property + def num_addresses(self): + """Number of hosts in the current subnet.""" + return int(self.broadcast_address) - int(self.network_address) + 1 + + @property + def _address_class(self): + # Returning bare address objects (rather than interfaces) allows for + # more consistent behaviour across the network address, broadcast + # address and individual host addresses. + msg = '%200s has no associated address class' % (type(self),) + raise NotImplementedError(msg) + + @property + def prefixlen(self): + return self._prefixlen + + def address_exclude(self, other): + """Remove an address from a larger block. + + For example: + + addr1 = ip_network('192.0.2.0/28') + addr2 = ip_network('192.0.2.1/32') + list(addr1.address_exclude(addr2)) = + [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), + IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] + + or IPv6: + + addr1 = ip_network('2001:db8::1/32') + addr2 = ip_network('2001:db8::1/128') + list(addr1.address_exclude(addr2)) = + [ip_network('2001:db8::1/128'), + ip_network('2001:db8::2/127'), + ip_network('2001:db8::4/126'), + ip_network('2001:db8::8/125'), + ... + ip_network('2001:db8:8000::/33')] + + Args: + other: An IPv4Network or IPv6Network object of the same type. + + Returns: + An iterator of the IPv(4|6)Network objects which is self + minus other. + + Raises: + TypeError: If self and other are of differing address + versions, or if other is not a network object. + ValueError: If other is not completely contained by self. + + """ + if not self._version == other._version: + raise TypeError("%s and %s are not of the same version" % ( + self, other)) + + if not isinstance(other, _BaseNetwork): + raise TypeError("%s is not a network object" % other) + + if not other.subnet_of(self): + raise ValueError('%s not contained in %s' % (other, self)) + if other == self: + return + + # Make sure we're comparing the network of other. + other = other.__class__('%s/%s' % (other.network_address, + other.prefixlen)) + + s1, s2 = self.subnets() + while s1 != other and s2 != other: + if other.subnet_of(s1): + yield s2 + s1, s2 = s1.subnets() + elif other.subnet_of(s2): + yield s1 + s1, s2 = s2.subnets() + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + if s1 == other: + yield s2 + elif s2 == other: + yield s1 + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + + def compare_networks(self, other): + """Compare two IP objects. + + This is only concerned about the comparison of the integer + representation of the network addresses. This means that the + host bits aren't considered at all in this method. If you want + to compare host bits, you can easily enough do a + 'HostA._ip < HostB._ip' + + Args: + other: An IP object. + + Returns: + If the IP versions of self and other are the same, returns: + + -1 if self < other: + eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') + IPv6Network('2001:db8::1000/124') < + IPv6Network('2001:db8::2000/124') + 0 if self == other + eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') + IPv6Network('2001:db8::1000/124') == + IPv6Network('2001:db8::1000/124') + 1 if self > other + eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') + IPv6Network('2001:db8::2000/124') > + IPv6Network('2001:db8::1000/124') + + Raises: + TypeError if the IP versions are different. + + """ + # does this need to raise a ValueError? + if self._version != other._version: + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + # self._version == other._version below here: + if self.network_address < other.network_address: + return -1 + if self.network_address > other.network_address: + return 1 + # self.network_address == other.network_address below here: + if self.netmask < other.netmask: + return -1 + if self.netmask > other.netmask: + return 1 + return 0 + + def _get_networks_key(self): + """Network-only key function. + + Returns an object that identifies this address' network and + netmask. This function is a suitable "key" argument for sorted() + and list.sort(). + + """ + return (self._version, self.network_address, self.netmask) + + def subnets(self, prefixlen_diff=1, new_prefix=None): + """The subnets which join to make the current subnet. + + In the case that self contains only one IP + (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 + for IPv6), yield an iterator with just ourself. + + Args: + prefixlen_diff: An integer, the amount the prefix length + should be increased by. This should not be set if + new_prefix is also set. + new_prefix: The desired new prefix length. This must be a + larger number (smaller prefix) than the existing prefix. + This should not be set if prefixlen_diff is also set. + + Returns: + An iterator of IPv(4|6) objects. + + Raises: + ValueError: The prefixlen_diff is too small or too large. + OR + prefixlen_diff and new_prefix are both set or new_prefix + is a smaller number than the current prefix (smaller + number means a larger network) + + """ + if self._prefixlen == self._max_prefixlen: + yield self + return + + if new_prefix is not None: + if new_prefix < self._prefixlen: + raise ValueError('new prefix must be longer') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = new_prefix - self._prefixlen + + if prefixlen_diff < 0: + raise ValueError('prefix length diff must be > 0') + new_prefixlen = self._prefixlen + prefixlen_diff + + if new_prefixlen > self._max_prefixlen: + raise ValueError( + 'prefix length diff %d is invalid for netblock %s' % ( + new_prefixlen, self)) + + start = int(self.network_address) + end = int(self.broadcast_address) + 1 + step = (int(self.hostmask) + 1) >> prefixlen_diff + for new_addr in _compat_range(start, end, step): + current = self.__class__((new_addr, new_prefixlen)) + yield current + + def supernet(self, prefixlen_diff=1, new_prefix=None): + """The supernet containing the current network. + + Args: + prefixlen_diff: An integer, the amount the prefix length of + the network should be decreased by. For example, given a + /24 network and a prefixlen_diff of 3, a supernet with a + /21 netmask is returned. + + Returns: + An IPv4 network object. + + Raises: + ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have + a negative prefix length. + OR + If prefixlen_diff and new_prefix are both set or new_prefix is a + larger number than the current prefix (larger number means a + smaller network) + + """ + if self._prefixlen == 0: + return self + + if new_prefix is not None: + if new_prefix > self._prefixlen: + raise ValueError('new prefix must be shorter') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = self._prefixlen - new_prefix + + new_prefixlen = self.prefixlen - prefixlen_diff + if new_prefixlen < 0: + raise ValueError( + 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % + (self.prefixlen, prefixlen_diff)) + return self.__class__(( + int(self.network_address) & (int(self.netmask) << prefixlen_diff), + new_prefixlen + )) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return (self.network_address.is_multicast and + self.broadcast_address.is_multicast) + + def subnet_of(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if (hasattr(other, 'network_address') and + hasattr(other, 'broadcast_address')): + return (other.network_address <= self.network_address and + other.broadcast_address >= self.broadcast_address) + # dealing with another address + else: + raise TypeError('Unable to test subnet containment with element ' + 'of type %s' % type(other)) + + def supernet_of(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if (hasattr(other, 'network_address') and + hasattr(other, 'broadcast_address')): + return (other.network_address >= self.network_address and + other.broadcast_address <= self.broadcast_address) + # dealing with another address + else: + raise TypeError('Unable to test subnet containment with element ' + 'of type %s' % type(other)) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return (self.network_address.is_reserved and + self.broadcast_address.is_reserved) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return (self.network_address.is_link_local and + self.broadcast_address.is_link_local) + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return (self.network_address.is_private and + self.broadcast_address.is_private) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return (self.network_address.is_unspecified and + self.broadcast_address.is_unspecified) + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return (self.network_address.is_loopback and + self.broadcast_address.is_loopback) + + +class _BaseV4(object): + + """Base IPv4 object. + + The following methods are used by IPv4 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 4 + # Equivalent to 255.255.255.255 or 32 bits of 1's. + _ALL_ONES = (2 ** IPV4LENGTH) - 1 + _DECIMAL_DIGITS = frozenset('0123456789') + + # the valid octets for host and netmasks. only useful for IPv4. + _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) + + _max_prefixlen = IPV4LENGTH + # There are only a handful of valid v4 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + def _explode_shorthand_ip_string(self): + return _compat_str(self) + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + try: + # Check for a netmask in prefix length form + prefixlen = cls._prefix_from_prefix_string(arg) + except NetmaskValueError: + # Check for a netmask or hostmask in dotted-quad form. + # This may raise NetmaskValueError. + prefixlen = cls._prefix_from_ip_string(arg) + netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn the given IP string into an integer for comparison. + + Args: + ip_str: A string, the IP ip_str. + + Returns: + The IP ip_str as an integer. + + Raises: + AddressValueError: if ip_str isn't a valid IPv4 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + octets = ip_str.split('.') + if len(octets) != 4: + raise AddressValueError("Expected 4 octets in %r" % ip_str) + + try: + return _compat_int_from_byte_vals( + map(cls._parse_octet, octets), 'big') + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_octet(cls, octet_str): + """Convert a decimal octet into an integer. + + Args: + octet_str: A string, the number to parse. + + Returns: + The octet as an integer. + + Raises: + ValueError: if the octet isn't strictly a decimal from [0..255]. + + """ + if not octet_str: + raise ValueError("Empty octet not permitted") + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._DECIMAL_DIGITS.issuperset(octet_str): + msg = "Only decimal digits permitted in %r" + raise ValueError(msg % octet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(octet_str) > 3: + msg = "At most 3 characters permitted in %r" + raise ValueError(msg % octet_str) + # Convert to integer (we know digits are legal) + octet_int = int(octet_str, 10) + # Any octets that look like they *might* be written in octal, + # and which don't look exactly the same in both octal and + # decimal are rejected as ambiguous + if octet_int > 7 and octet_str[0] == '0': + msg = "Ambiguous (octal/decimal) value in %r not permitted" + raise ValueError(msg % octet_str) + if octet_int > 255: + raise ValueError("Octet %d (> 255) not permitted" % octet_int) + return octet_int + + @classmethod + def _string_from_ip_int(cls, ip_int): + """Turns a 32-bit integer into dotted decimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + The IP address as a string in dotted decimal notation. + + """ + return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] + if isinstance(b, bytes) + else b) + for b in _compat_to_bytes(ip_int, 4, 'big')) + + def _is_hostmask(self, ip_str): + """Test if the IP string is a hostmask (rather than a netmask). + + Args: + ip_str: A string, the potential hostmask. + + Returns: + A boolean, True if the IP string is a hostmask. + + """ + bits = ip_str.split('.') + try: + parts = [x for x in map(int, bits) if x in self._valid_mask_octets] + except ValueError: + return False + if len(parts) != len(bits): + return False + if parts[0] < parts[-1]: + return True + return False + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv4 address. + + This implements the method described in RFC1035 3.5. + + """ + reverse_octets = _compat_str(self).split('.')[::-1] + return '.'.join(reverse_octets) + '.in-addr.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv4Address(_BaseV4, _BaseAddress): + + """Represent and manipulate single IPv4 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + + """ + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv4Address('192.0.2.1') == IPv4Address(3221225985). + or, more generally + IPv4Address(int(IPv4Address('192.0.2.1'))) == + IPv4Address('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 4) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v4_int_to_packed(self._ip) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within the + reserved IPv4 Network range. + + """ + return self in self._constants._reserved_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + return ( + self not in self._constants._public_network and + not self.is_private) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is multicast. + See RFC 3171 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 5735 3. + + """ + return self == self._constants._unspecified_address + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback per RFC 3330. + + """ + return self in self._constants._loopback_network + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is link-local per RFC 3927. + + """ + return self in self._constants._linklocal_network + + +class IPv4Interface(IPv4Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv4Address.__init__(self, address) + self.network = IPv4Network(self._ip) + self._prefixlen = self._max_prefixlen + return + + if isinstance(address, tuple): + IPv4Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + + self.network = IPv4Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv4Address.__init__(self, addr[0]) + + self.network = IPv4Network(address, strict=False) + self._prefixlen = self.network._prefixlen + + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv4Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv4Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return self.network < other.network + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv4Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + +class IPv4Network(_BaseV4, _BaseNetwork): + + """This class represents and manipulates 32-bit IPv4 network + addresses.. + + Attributes: [examples for IPv4Network('192.0.2.0/27')] + .network_address: IPv4Address('192.0.2.0') + .hostmask: IPv4Address('0.0.0.31') + .broadcast_address: IPv4Address('192.0.2.32') + .netmask: IPv4Address('255.255.255.224') + .prefixlen: 27 + + """ + # Class to use when creating address objects + _address_class = IPv4Address + + def __init__(self, address, strict=True): + + """Instantiate a new IPv4 network object. + + Args: + address: A string or integer representing the IP [& network]. + '192.0.2.0/24' + '192.0.2.0/255.255.255.0' + '192.0.0.2/0.0.0.255' + are all functionally the same in IPv4. Similarly, + '192.0.2.1' + '192.0.2.1/255.255.255.255' + '192.0.2.1/32' + are also functionally equivalent. That is to say, failing to + provide a subnetmask will create an object with a mask of /32. + + If the mask (portion after the / in the argument) is given in + dotted quad form, it is treated as a netmask if it starts with a + non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it + starts with a zero field (e.g. 0.255.255.255 == /8), with the + single exception of an all-zero mask which is treated as a + netmask == /0. If no mask is given, a default of /32 is used. + + Additionally, an integer can be passed, so + IPv4Network('192.0.2.1') == IPv4Network(3221225985) + or, more generally + IPv4Interface(int(IPv4Interface('192.0.2.1'))) == + IPv4Interface('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + NetmaskValueError: If the netmask isn't valid for + an IPv4 address. + ValueError: If strict is True and a network address is not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Constructing from a packed address or integer + if isinstance(address, (_compat_int_types, bytes)): + self.network_address = IPv4Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + # fixme: address/network test here. + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + # We weren't given an address[1] + arg = self._max_prefixlen + self.network_address = IPv4Address(address[0]) + self.netmask, self._prefixlen = self._make_netmask(arg) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv4Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv4Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv4Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + +class _IPv4Constants(object): + + _linklocal_network = IPv4Network('169.254.0.0/16') + + _loopback_network = IPv4Network('127.0.0.0/8') + + _multicast_network = IPv4Network('224.0.0.0/4') + + _public_network = IPv4Network('100.64.0.0/10') + + _private_networks = [ + IPv4Network('0.0.0.0/8'), + IPv4Network('10.0.0.0/8'), + IPv4Network('127.0.0.0/8'), + IPv4Network('169.254.0.0/16'), + IPv4Network('172.16.0.0/12'), + IPv4Network('192.0.0.0/29'), + IPv4Network('192.0.0.170/31'), + IPv4Network('192.0.2.0/24'), + IPv4Network('192.168.0.0/16'), + IPv4Network('198.18.0.0/15'), + IPv4Network('198.51.100.0/24'), + IPv4Network('203.0.113.0/24'), + IPv4Network('240.0.0.0/4'), + IPv4Network('255.255.255.255/32'), + ] + + _reserved_network = IPv4Network('240.0.0.0/4') + + _unspecified_address = IPv4Address('0.0.0.0') + + +IPv4Address._constants = _IPv4Constants + + +class _BaseV6(object): + + """Base IPv6 object. + + The following methods are used by IPv6 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 6 + _ALL_ONES = (2 ** IPV6LENGTH) - 1 + _HEXTET_COUNT = 8 + _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') + _max_prefixlen = IPV6LENGTH + + # There are only a bunch of valid v6 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + prefixlen = cls._prefix_from_prefix_string(arg) + netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn an IPv6 ip_str into an integer. + + Args: + ip_str: A string, the IPv6 ip_str. + + Returns: + An int, the IPv6 address + + Raises: + AddressValueError: if ip_str isn't a valid IPv6 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + parts = ip_str.split(':') + + # An IPv6 address needs at least 2 colons (3 parts). + _min_parts = 3 + if len(parts) < _min_parts: + msg = "At least %d parts expected in %r" % (_min_parts, ip_str) + raise AddressValueError(msg) + + # If the address has an IPv4-style suffix, convert it to hexadecimal. + if '.' in parts[-1]: + try: + ipv4_int = IPv4Address(parts.pop())._ip + except AddressValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) + parts.append('%x' % (ipv4_int & 0xFFFF)) + + # An IPv6 address can't have more than 8 colons (9 parts). + # The extra colon comes from using the "::" notation for a single + # leading or trailing zero part. + _max_parts = cls._HEXTET_COUNT + 1 + if len(parts) > _max_parts: + msg = "At most %d colons permitted in %r" % ( + _max_parts - 1, ip_str) + raise AddressValueError(msg) + + # Disregarding the endpoints, find '::' with nothing in between. + # This indicates that a run of zeroes has been skipped. + skip_index = None + for i in _compat_range(1, len(parts) - 1): + if not parts[i]: + if skip_index is not None: + # Can't have more than one '::' + msg = "At most one '::' permitted in %r" % ip_str + raise AddressValueError(msg) + skip_index = i + + # parts_hi is the number of parts to copy from above/before the '::' + # parts_lo is the number of parts to copy from below/after the '::' + if skip_index is not None: + # If we found a '::', then check if it also covers the endpoints. + parts_hi = skip_index + parts_lo = len(parts) - skip_index - 1 + if not parts[0]: + parts_hi -= 1 + if parts_hi: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + parts_lo -= 1 + if parts_lo: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) + if parts_skipped < 1: + msg = "Expected at most %d other parts with '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) + else: + # Otherwise, allocate the entire address to parts_hi. The + # endpoints could still be empty, but _parse_hextet() will check + # for that. + if len(parts) != cls._HEXTET_COUNT: + msg = "Exactly %d parts expected without '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) + if not parts[0]: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_hi = len(parts) + parts_lo = 0 + parts_skipped = 0 + + try: + # Now, parse the hextets into a 128-bit integer. + ip_int = 0 + for i in range(parts_hi): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + ip_int <<= 16 * parts_skipped + for i in range(-parts_lo, 0): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + return ip_int + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_hextet(cls, hextet_str): + """Convert an IPv6 hextet string into an integer. + + Args: + hextet_str: A string, the number to parse. + + Returns: + The hextet as an integer. + + Raises: + ValueError: if the input isn't strictly a hex number from + [0..FFFF]. + + """ + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._HEX_DIGITS.issuperset(hextet_str): + raise ValueError("Only hex digits permitted in %r" % hextet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(hextet_str) > 4: + msg = "At most 4 characters permitted in %r" + raise ValueError(msg % hextet_str) + # Length check means we can skip checking the integer value + return int(hextet_str, 16) + + @classmethod + def _compress_hextets(cls, hextets): + """Compresses a list of hextets. + + Compresses a list of strings, replacing the longest continuous + sequence of "0" in the list with "" and adding empty strings at + the beginning or at the end of the string such that subsequently + calling ":".join(hextets) will produce the compressed version of + the IPv6 address. + + Args: + hextets: A list of strings, the hextets to compress. + + Returns: + A list of strings. + + """ + best_doublecolon_start = -1 + best_doublecolon_len = 0 + doublecolon_start = -1 + doublecolon_len = 0 + for index, hextet in enumerate(hextets): + if hextet == '0': + doublecolon_len += 1 + if doublecolon_start == -1: + # Start of a sequence of zeros. + doublecolon_start = index + if doublecolon_len > best_doublecolon_len: + # This is the longest sequence of zeros so far. + best_doublecolon_len = doublecolon_len + best_doublecolon_start = doublecolon_start + else: + doublecolon_len = 0 + doublecolon_start = -1 + + if best_doublecolon_len > 1: + best_doublecolon_end = (best_doublecolon_start + + best_doublecolon_len) + # For zeros at the end of the address. + if best_doublecolon_end == len(hextets): + hextets += [''] + hextets[best_doublecolon_start:best_doublecolon_end] = [''] + # For zeros at the beginning of the address. + if best_doublecolon_start == 0: + hextets = [''] + hextets + + return hextets + + @classmethod + def _string_from_ip_int(cls, ip_int=None): + """Turns a 128-bit integer into hexadecimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + A string, the hexadecimal representation of the address. + + Raises: + ValueError: The address is bigger than 128 bits of all ones. + + """ + if ip_int is None: + ip_int = int(cls._ip) + + if ip_int > cls._ALL_ONES: + raise ValueError('IPv6 address is too large') + + hex_str = '%032x' % ip_int + hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] + + hextets = cls._compress_hextets(hextets) + return ':'.join(hextets) + + def _explode_shorthand_ip_string(self): + """Expand a shortened IPv6 address. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + A string, the expanded IPv6 address. + + """ + if isinstance(self, IPv6Network): + ip_str = _compat_str(self.network_address) + elif isinstance(self, IPv6Interface): + ip_str = _compat_str(self.ip) + else: + ip_str = _compat_str(self) + + ip_int = self._ip_int_from_string(ip_str) + hex_str = '%032x' % ip_int + parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] + if isinstance(self, (_BaseNetwork, IPv6Interface)): + return '%s/%d' % (':'.join(parts), self._prefixlen) + return ':'.join(parts) + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv6 address. + + This implements the method described in RFC3596 2.5. + + """ + reverse_chars = self.exploded[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv6Address(_BaseV6, _BaseAddress): + + """Represent and manipulate single IPv6 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + """Instantiate a new IPv6 address object. + + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv6Address('2001:db8::') == + IPv6Address(42540766411282592856903984951653826560) + or, more generally + IPv6Address(int(IPv6Address('2001:db8::'))) == + IPv6Address('2001:db8::') + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 16) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v6_int_to_packed(self._ip) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return any(self in x for x in self._constants._reserved_networks) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return self in self._constants._linklocal_network + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return self in self._constants._sitelocal_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv6-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return self._ip == 0 + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return self._ip == 1 + + @property + def ipv4_mapped(self): + """Return the IPv4 mapped address. + + Returns: + If the IPv6 address is a v4 mapped address, return the + IPv4 mapped address. Return None otherwise. + + """ + if (self._ip >> 32) != 0xFFFF: + return None + return IPv4Address(self._ip & 0xFFFFFFFF) + + @property + def teredo(self): + """Tuple of embedded teredo IPs. + + Returns: + Tuple of the (server, client) IPs or None if the address + doesn't appear to be a teredo address (doesn't start with + 2001::/32) + + """ + if (self._ip >> 96) != 0x20010000: + return None + return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), + IPv4Address(~self._ip & 0xFFFFFFFF)) + + @property + def sixtofour(self): + """Return the IPv4 6to4 embedded address. + + Returns: + The IPv4 6to4-embedded address if present or None if the + address doesn't appear to contain a 6to4 embedded address. + + """ + if (self._ip >> 112) != 0x2002: + return None + return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) + + +class IPv6Interface(IPv6Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv6Address.__init__(self, address) + self.network = IPv6Network(self._ip) + self._prefixlen = self._max_prefixlen + return + if isinstance(address, tuple): + IPv6Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv6Address.__init__(self, addr[0]) + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self._prefixlen = self.network._prefixlen + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv6Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv6Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return self.network < other.network + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv6Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + @property + def is_unspecified(self): + return self._ip == 0 and self.network.is_unspecified + + @property + def is_loopback(self): + return self._ip == 1 and self.network.is_loopback + + +class IPv6Network(_BaseV6, _BaseNetwork): + + """This class represents and manipulates 128-bit IPv6 networks. + + Attributes: [examples for IPv6('2001:db8::1000/124')] + .network_address: IPv6Address('2001:db8::1000') + .hostmask: IPv6Address('::f') + .broadcast_address: IPv6Address('2001:db8::100f') + .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') + .prefixlen: 124 + + """ + + # Class to use when creating address objects + _address_class = IPv6Address + + def __init__(self, address, strict=True): + """Instantiate a new IPv6 Network object. + + Args: + address: A string or integer representing the IPv6 network or the + IP and prefix/netmask. + '2001:db8::/128' + '2001:db8:0000:0000:0000:0000:0000:0000/128' + '2001:db8::' + are all functionally the same in IPv6. That is to say, + failing to provide a subnetmask will create an object with + a mask of /128. + + Additionally, an integer can be passed, so + IPv6Network('2001:db8::') == + IPv6Network(42540766411282592856903984951653826560) + or, more generally + IPv6Network(int(IPv6Network('2001:db8::'))) == + IPv6Network('2001:db8::') + + strict: A boolean. If true, ensure that we have been passed + A true network address, eg, 2001:db8::1000/124 and not an + IP address on a network, eg, 2001:db8::1/124. + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + NetmaskValueError: If the netmask isn't valid for + an IPv6 address. + ValueError: If strict was True and a network address was not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Efficient constructor from integer or packed address + if isinstance(address, (bytes, _compat_int_types)): + self.network_address = IPv6Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + self.network_address = IPv6Address(address[0]) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv6Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + + self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv6Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv6Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the + Subnet-Router anycast address. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast + 1): + yield self._address_class(x) + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return (self.network_address.is_site_local and + self.broadcast_address.is_site_local) + + +class _IPv6Constants(object): + + _linklocal_network = IPv6Network('fe80::/10') + + _multicast_network = IPv6Network('ff00::/8') + + _private_networks = [ + IPv6Network('::1/128'), + IPv6Network('::/128'), + IPv6Network('::ffff:0:0/96'), + IPv6Network('100::/64'), + IPv6Network('2001::/23'), + IPv6Network('2001:2::/48'), + IPv6Network('2001:db8::/32'), + IPv6Network('2001:10::/28'), + IPv6Network('fc00::/7'), + IPv6Network('fe80::/10'), + ] + + _reserved_networks = [ + IPv6Network('::/8'), IPv6Network('100::/8'), + IPv6Network('200::/7'), IPv6Network('400::/6'), + IPv6Network('800::/5'), IPv6Network('1000::/4'), + IPv6Network('4000::/3'), IPv6Network('6000::/3'), + IPv6Network('8000::/3'), IPv6Network('A000::/3'), + IPv6Network('C000::/3'), IPv6Network('E000::/4'), + IPv6Network('F000::/5'), IPv6Network('F800::/6'), + IPv6Network('FE00::/9'), + ] + + _sitelocal_network = IPv6Network('fec0::/10') + + +IPv6Address._constants = _IPv6Constants diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/__init__.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..a6f44a55c6377c746ec8ca831999fdde5e401aa6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/__init__.py @@ -0,0 +1,347 @@ +# -*- coding: utf-8 -*- + +""" +lockfile.py - Platform-independent advisory file locks. + +Requires Python 2.5 unless you apply 2.4.diff +Locking is done on a per-thread basis instead of a per-process basis. + +Usage: + +>>> lock = LockFile('somefile') +>>> try: +... lock.acquire() +... except AlreadyLocked: +... print 'somefile', 'is locked already.' +... except LockFailed: +... print 'somefile', 'can\\'t be locked.' +... else: +... print 'got lock' +got lock +>>> print lock.is_locked() +True +>>> lock.release() + +>>> lock = LockFile('somefile') +>>> print lock.is_locked() +False +>>> with lock: +... print lock.is_locked() +True +>>> print lock.is_locked() +False + +>>> lock = LockFile('somefile') +>>> # It is okay to lock twice from the same thread... +>>> with lock: +... lock.acquire() +... +>>> # Though no counter is kept, so you can't unlock multiple times... +>>> print lock.is_locked() +False + +Exceptions: + + Error - base class for other exceptions + LockError - base class for all locking exceptions + AlreadyLocked - Another thread or process already holds the lock + LockFailed - Lock failed for some other reason + UnlockError - base class for all unlocking exceptions + AlreadyUnlocked - File was not locked. + NotMyLock - File was locked but not by the current thread/process +""" + +from __future__ import absolute_import + +import functools +import os +import socket +import threading +import warnings + +# Work with PEP8 and non-PEP8 versions of threading module. +if not hasattr(threading, "current_thread"): + threading.current_thread = threading.currentThread +if not hasattr(threading.Thread, "get_name"): + threading.Thread.get_name = threading.Thread.getName + +__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', + 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', + 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', + 'LockBase', 'locked'] + + +class Error(Exception): + """ + Base class for other exceptions. + + >>> try: + ... raise Error + ... except Exception: + ... pass + """ + pass + + +class LockError(Error): + """ + Base class for error arising from attempts to acquire the lock. + + >>> try: + ... raise LockError + ... except Error: + ... pass + """ + pass + + +class LockTimeout(LockError): + """Raised when lock creation fails within a user-defined period of time. + + >>> try: + ... raise LockTimeout + ... except LockError: + ... pass + """ + pass + + +class AlreadyLocked(LockError): + """Some other thread/process is locking the file. + + >>> try: + ... raise AlreadyLocked + ... except LockError: + ... pass + """ + pass + + +class LockFailed(LockError): + """Lock file creation failed for some other reason. + + >>> try: + ... raise LockFailed + ... except LockError: + ... pass + """ + pass + + +class UnlockError(Error): + """ + Base class for errors arising from attempts to release the lock. + + >>> try: + ... raise UnlockError + ... except Error: + ... pass + """ + pass + + +class NotLocked(UnlockError): + """Raised when an attempt is made to unlock an unlocked file. + + >>> try: + ... raise NotLocked + ... except UnlockError: + ... pass + """ + pass + + +class NotMyLock(UnlockError): + """Raised when an attempt is made to unlock a file someone else locked. + + >>> try: + ... raise NotMyLock + ... except UnlockError: + ... pass + """ + pass + + +class _SharedBase(object): + def __init__(self, path): + self.path = path + + def acquire(self, timeout=None): + """ + Acquire the lock. + + * If timeout is omitted (or None), wait forever trying to lock the + file. + + * If timeout > 0, try to acquire the lock for that many seconds. If + the lock period expires and the file is still locked, raise + LockTimeout. + + * If timeout <= 0, raise AlreadyLocked immediately if the file is + already locked. + """ + raise NotImplemented("implement in subclass") + + def release(self): + """ + Release the lock. + + If the file is not locked, raise NotLocked. + """ + raise NotImplemented("implement in subclass") + + def __enter__(self): + """ + Context manager support. + """ + self.acquire() + return self + + def __exit__(self, *_exc): + """ + Context manager support. + """ + self.release() + + def __repr__(self): + return "<%s: %r>" % (self.__class__.__name__, self.path) + + +class LockBase(_SharedBase): + """Base class for platform-specific lock classes.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = LockBase('somefile') + >>> lock = LockBase('somefile', threaded=False) + """ + super(LockBase, self).__init__(path) + self.lock_file = os.path.abspath(path) + ".lock" + self.hostname = socket.gethostname() + self.pid = os.getpid() + if threaded: + t = threading.current_thread() + # Thread objects in Python 2.4 and earlier do not have ident + # attrs. Worm around that. + ident = getattr(t, "ident", hash(t)) + self.tname = "-%x" % (ident & 0xffffffff) + else: + self.tname = "" + dirname = os.path.dirname(self.lock_file) + + # unique name is mostly about the current process, but must + # also contain the path -- otherwise, two adjacent locked + # files conflict (one file gets locked, creating lock-file and + # unique file, the other one gets locked, creating lock-file + # and overwriting the already existing lock-file, then one + # gets unlocked, deleting both lock-file and unique file, + # finally the last lock errors out upon releasing. + self.unique_name = os.path.join(dirname, + "%s%s.%s%s" % (self.hostname, + self.tname, + self.pid, + hash(self.path))) + self.timeout = timeout + + def is_locked(self): + """ + Tell whether or not the file is locked. + """ + raise NotImplemented("implement in subclass") + + def i_am_locking(self): + """ + Return True if this object is locking the file. + """ + raise NotImplemented("implement in subclass") + + def break_lock(self): + """ + Remove a lock. Useful if a locking thread failed to unlock. + """ + raise NotImplemented("implement in subclass") + + def __repr__(self): + return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, + self.path) + + +def _fl_helper(cls, mod, *args, **kwds): + warnings.warn("Import from %s module instead of lockfile package" % mod, + DeprecationWarning, stacklevel=2) + # This is a bit funky, but it's only for awhile. The way the unit tests + # are constructed this function winds up as an unbound method, so it + # actually takes three args, not two. We want to toss out self. + if not isinstance(args[0], str): + # We are testing, avoid the first arg + args = args[1:] + if len(args) == 1 and not kwds: + kwds["threaded"] = True + return cls(*args, **kwds) + + +def LinkFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import LinkLockFile from the + lockfile.linklockfile module. + """ + from . import linklockfile + return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile", + *args, **kwds) + + +def MkdirFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import MkdirLockFile from the + lockfile.mkdirlockfile module. + """ + from . import mkdirlockfile + return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile", + *args, **kwds) + + +def SQLiteFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import SQLiteLockFile from the + lockfile.mkdirlockfile module. + """ + from . import sqlitelockfile + return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile", + *args, **kwds) + + +def locked(path, timeout=None): + """Decorator which enables locks for decorated function. + + Arguments: + - path: path for lockfile. + - timeout (optional): Timeout for acquiring lock. + + Usage: + @locked('/var/run/myname', timeout=0) + def myname(...): + ... + """ + def decor(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + lock = FileLock(path, timeout=timeout) + lock.acquire() + try: + return func(*args, **kwargs) + finally: + lock.release() + return wrapper + return decor + + +if hasattr(os, "link"): + from . import linklockfile as _llf + LockFile = _llf.LinkLockFile +else: + from . import mkdirlockfile as _mlf + LockFile = _mlf.MkdirLockFile + +FileLock = LockFile diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/linklockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/linklockfile.py new file mode 100644 index 0000000000000000000000000000000000000000..2ca9be0423591e61b3382b559473fcc56363cc46 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/linklockfile.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import + +import time +import os + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class LinkLockFile(LockBase): + """Lock access to a file using atomic property of link(2). + + >>> lock = LinkLockFile('somefile') + >>> lock = LinkLockFile('somefile', threaded=False) + """ + + def acquire(self, timeout=None): + try: + open(self.unique_name, "wb").close() + except IOError: + raise LockFailed("failed to create %s" % self.unique_name) + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a hard link to it. + try: + os.link(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + nlinks = os.stat(self.unique_name).st_nlink + if nlinks == 2: + # The original link plus the one I created == 2. We're + # good to go. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + os.unlink(self.unique_name) + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name) and + os.stat(self.unique_name).st_nlink == 2) + + def break_lock(self): + if os.path.exists(self.lock_file): + os.unlink(self.lock_file) diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/mkdirlockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/mkdirlockfile.py new file mode 100644 index 0000000000000000000000000000000000000000..05a8c96ca517271bbd4953d0cf83dc4173521b2e --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/mkdirlockfile.py @@ -0,0 +1,84 @@ +from __future__ import absolute_import, division + +import time +import os +import sys +import errno + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class MkdirLockFile(LockBase): + """Lock file by creating a directory.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = MkdirLockFile('somefile') + >>> lock = MkdirLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + # Lock file itself is a directory. Place the unique file name into + # it. + self.unique_name = os.path.join(self.lock_file, + "%s.%s%s" % (self.hostname, + self.tname, + self.pid)) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + else: + wait = max(0, timeout / 10) + + while True: + try: + os.mkdir(self.lock_file) + except OSError: + err = sys.exc_info()[1] + if err.errno == errno.EEXIST: + # Already locked. + if os.path.exists(self.unique_name): + # Already locked by me. + return + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock. + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(wait) + else: + # Couldn't create the lock for some other reason + raise LockFailed("failed to create %s" % self.lock_file) + else: + open(self.unique_name, "wb").close() + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.rmdir(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name)) + + def break_lock(self): + if os.path.exists(self.lock_file): + for name in os.listdir(self.lock_file): + os.unlink(os.path.join(self.lock_file, name)) + os.rmdir(self.lock_file) diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/pidlockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/pidlockfile.py new file mode 100644 index 0000000000000000000000000000000000000000..069e85b15bdfcb4fd7042222516fbfb046db06c9 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/pidlockfile.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- + +# pidlockfile.py +# +# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au> +# +# This is free software: you may copy, modify, and/or distribute this work +# under the terms of the Python Software Foundation License, version 2 or +# later as published by the Python Software Foundation. +# No warranty expressed or implied. See the file LICENSE.PSF-2 for details. + +""" Lockfile behaviour implemented via Unix PID files. + """ + +from __future__ import absolute_import + +import errno +import os +import time + +from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock, + LockTimeout) + + +class PIDLockFile(LockBase): + """ Lockfile implemented as a Unix PID file. + + The lock file is a normal file named by the attribute `path`. + A lock's PID file contains a single line of text, containing + the process ID (PID) of the process that acquired the lock. + + >>> lock = PIDLockFile('somefile') + >>> lock = PIDLockFile('somefile') + """ + + def __init__(self, path, threaded=False, timeout=None): + # pid lockfiles don't support threaded operation, so always force + # False as the threaded arg. + LockBase.__init__(self, path, False, timeout) + self.unique_name = self.path + + def read_pid(self): + """ Get the PID from the lock file. + """ + return read_pid_from_pidfile(self.path) + + def is_locked(self): + """ Test if the lock is currently held. + + The lock is held if the PID file for this lock exists. + + """ + return os.path.exists(self.path) + + def i_am_locking(self): + """ Test if the lock is held by the current process. + + Returns ``True`` if the current process ID matches the + number stored in the PID file. + """ + return self.is_locked() and os.getpid() == self.read_pid() + + def acquire(self, timeout=None): + """ Acquire the lock. + + Creates the PID file for this lock, or raises an error if + the lock could not be acquired. + """ + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + try: + write_pid_to_pidfile(self.path) + except OSError as exc: + if exc.errno == errno.EEXIST: + # The lock creation failed. Maybe sleep a bit. + if time.time() > end_time: + if timeout is not None and timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + raise LockFailed("failed to create %s" % self.path) + else: + return + + def release(self): + """ Release the lock. + + Removes the PID file to release the lock, or raises an + error if the current process does not hold the lock. + + """ + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + remove_existing_pidfile(self.path) + + def break_lock(self): + """ Break an existing lock. + + Removes the PID file if it already exists, otherwise does + nothing. + + """ + remove_existing_pidfile(self.path) + + +def read_pid_from_pidfile(pidfile_path): + """ Read the PID recorded in the named PID file. + + Read and return the numeric PID recorded as text in the named + PID file. If the PID file cannot be read, or if the content is + not a valid PID, return ``None``. + + """ + pid = None + try: + pidfile = open(pidfile_path, 'r') + except IOError: + pass + else: + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. + # + # Programs that read PID files should be somewhat flexible + # in what they accept; i.e., they should ignore extra + # whitespace, leading zeroes, absence of the trailing + # newline, or additional lines in the PID file. + + line = pidfile.readline().strip() + try: + pid = int(line) + except ValueError: + pass + pidfile.close() + + return pid + + +def write_pid_to_pidfile(pidfile_path): + """ Write the PID in the named PID file. + + Get the numeric process ID (“PIDâ€) of the current process + and write it to the named file as a line of text. + + """ + open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) + open_mode = 0o644 + pidfile_fd = os.open(pidfile_path, open_flags, open_mode) + pidfile = os.fdopen(pidfile_fd, 'w') + + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. For + # example, if crond was process number 25, /var/run/crond.pid + # would contain three characters: two, five, and newline. + + pid = os.getpid() + pidfile.write("%s\n" % pid) + pidfile.close() + + +def remove_existing_pidfile(pidfile_path): + """ Remove the named PID file if it exists. + + Removing a PID file that doesn't already exist puts us in the + desired state, so we ignore the condition if the file does not + exist. + + """ + try: + os.remove(pidfile_path) + except OSError as exc: + if exc.errno == errno.ENOENT: + pass + else: + raise diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/sqlitelockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/sqlitelockfile.py new file mode 100644 index 0000000000000000000000000000000000000000..f997e2444e75b176761965bbf3e1f82c5c3ad0e2 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/sqlitelockfile.py @@ -0,0 +1,156 @@ +from __future__ import absolute_import, division + +import time +import os + +try: + unicode +except NameError: + unicode = str + +from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked + + +class SQLiteLockFile(LockBase): + "Demonstrate SQL-based locking." + + testdb = None + + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = SQLiteLockFile('somefile') + >>> lock = SQLiteLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + self.lock_file = unicode(self.lock_file) + self.unique_name = unicode(self.unique_name) + + if SQLiteLockFile.testdb is None: + import tempfile + _fd, testdb = tempfile.mkstemp() + os.close(_fd) + os.unlink(testdb) + del _fd, tempfile + SQLiteLockFile.testdb = testdb + + import sqlite3 + self.connection = sqlite3.connect(SQLiteLockFile.testdb) + + c = self.connection.cursor() + try: + c.execute("create table locks" + "(" + " lock_file varchar(32)," + " unique_name varchar(32)" + ")") + except sqlite3.OperationalError: + pass + else: + self.connection.commit() + import atexit + atexit.register(os.unlink, SQLiteLockFile.testdb) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + elif timeout <= 0: + wait = 0 + else: + wait = timeout / 10 + + cursor = self.connection.cursor() + + while True: + if not self.is_locked(): + # Not locked. Try to lock it. + cursor.execute("insert into locks" + " (lock_file, unique_name)" + " values" + " (?, ?)", + (self.lock_file, self.unique_name)) + self.connection.commit() + + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) > 1: + # Nope. Someone else got there. Remove our lock. + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + else: + # Yup. We're done, so go home. + return + else: + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) == 1: + # We're the locker, so go home. + return + + # Maybe we should wait a bit longer. + if timeout is not None and time.time() > end_time: + if timeout > 0: + # No more waiting. + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock and we are impatient.. + raise AlreadyLocked("%s is already locked" % self.path) + + # Well, okay. We'll give it a bit longer. + time.sleep(wait) + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me (by %s)" % + (self.unique_name, self._who_is_locking())) + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + + def _who_is_locking(self): + cursor = self.connection.cursor() + cursor.execute("select unique_name from locks" + " where lock_file = ?", + (self.lock_file,)) + return cursor.fetchone()[0] + + def is_locked(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?", + (self.lock_file,)) + rows = cursor.fetchall() + return not not rows + + def i_am_locking(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?" + " and unique_name = ?", + (self.lock_file, self.unique_name)) + return not not cursor.fetchall() + + def break_lock(self): + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where lock_file = ?", + (self.lock_file,)) + self.connection.commit() diff --git a/vendor/pip-9.0.3/pip/_vendor/lockfile/symlinklockfile.py b/vendor/pip-9.0.3/pip/_vendor/lockfile/symlinklockfile.py new file mode 100644 index 0000000000000000000000000000000000000000..23b41f582b9f8d40a1375b47ed1fb25da12d0c3b --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/lockfile/symlinklockfile.py @@ -0,0 +1,70 @@ +from __future__ import absolute_import + +import os +import time + +from . import (LockBase, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class SymlinkLockFile(LockBase): + """Lock access to a file using symlink(2).""" + + def __init__(self, path, threaded=True, timeout=None): + # super(SymlinkLockFile).__init(...) + LockBase.__init__(self, path, threaded, timeout) + # split it back! + self.unique_name = os.path.split(self.unique_name)[1] + + def acquire(self, timeout=None): + # Hopefully unnecessary for symlink. + # try: + # open(self.unique_name, "wb").close() + # except IOError: + # raise LockFailed("failed to create %s" % self.unique_name) + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a symbolic link to it. + try: + os.symlink(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + if self.i_am_locking(): + # Linked to out unique name. Proceed. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout / 10 if timeout is not None else 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.islink(self.lock_file) + + def i_am_locking(self): + return (os.path.islink(self.lock_file) + and os.readlink(self.lock_file) == self.unique_name) + + def break_lock(self): + if os.path.islink(self.lock_file): # exists && link + os.unlink(self.lock_file) diff --git a/vendor/pip-9.0.3/pip/_vendor/ordereddict.py b/vendor/pip-9.0.3/pip/_vendor/ordereddict.py new file mode 100644 index 0000000000000000000000000000000000000000..7242b5060de134c3e4b7cd41fa10843d7c2e4cdb --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/ordereddict.py @@ -0,0 +1,127 @@ +# Copyright (c) 2009 Raymond Hettinger +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +from UserDict import DictMixin + +class OrderedDict(dict, DictMixin): + + def __init__(self, *args, **kwds): + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__end + except AttributeError: + self.clear() + self.update(*args, **kwds) + + def clear(self): + self.__end = end = [] + end += [None, end, end] # sentinel node for doubly linked list + self.__map = {} # key --> [key, prev, next] + dict.clear(self) + + def __setitem__(self, key, value): + if key not in self: + end = self.__end + curr = end[1] + curr[2] = end[1] = self.__map[key] = [key, curr, end] + dict.__setitem__(self, key, value) + + def __delitem__(self, key): + dict.__delitem__(self, key) + key, prev, next = self.__map.pop(key) + prev[2] = next + next[1] = prev + + def __iter__(self): + end = self.__end + curr = end[2] + while curr is not end: + yield curr[0] + curr = curr[2] + + def __reversed__(self): + end = self.__end + curr = end[1] + while curr is not end: + yield curr[0] + curr = curr[1] + + def popitem(self, last=True): + if not self: + raise KeyError('dictionary is empty') + if last: + key = reversed(self).next() + else: + key = iter(self).next() + value = self.pop(key) + return key, value + + def __reduce__(self): + items = [[k, self[k]] for k in self] + tmp = self.__map, self.__end + del self.__map, self.__end + inst_dict = vars(self).copy() + self.__map, self.__end = tmp + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def keys(self): + return list(self) + + setdefault = DictMixin.setdefault + update = DictMixin.update + pop = DictMixin.pop + values = DictMixin.values + items = DictMixin.items + iterkeys = DictMixin.iterkeys + itervalues = DictMixin.itervalues + iteritems = DictMixin.iteritems + + def __repr__(self): + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + + def copy(self): + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + if isinstance(other, OrderedDict): + if len(self) != len(other): + return False + for p, q in zip(self.items(), other.items()): + if p != q: + return False + return True + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/__about__.py b/vendor/pip-9.0.3/pip/_vendor/packaging/__about__.py new file mode 100644 index 0000000000000000000000000000000000000000..95d330ef823aa2e12f7846bc63c0955b25df6029 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/__init__.py b/vendor/pip-9.0.3/pip/_vendor/packaging/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5ee6220203e5425f900fb5a43676c24ea377c2fa --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/_compat.py b/vendor/pip-9.0.3/pip/_vendor/packaging/_compat.py new file mode 100644 index 0000000000000000000000000000000000000000..210bb80b7e7b64cb79f7e7cdf3e42819fe3471fe --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/_structures.py b/vendor/pip-9.0.3/pip/_vendor/packaging/_structures.py new file mode 100644 index 0000000000000000000000000000000000000000..ccc27861c3a4d9efaa3db753c77c4515a627bd98 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/markers.py b/vendor/pip-9.0.3/pip/_vendor/packaging/markers.py new file mode 100644 index 0000000000000000000000000000000000000000..f9ca1ffa36c3de41e93b1b32b9b171679d89678f --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/packaging/markers.py @@ -0,0 +1,303 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pip._vendor.pyparsing import ( + ParseException, ParseResults, stringStart, stringEnd, +) +from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pip._vendor.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/requirements.py b/vendor/pip-9.0.3/pip/_vendor/packaging/requirements.py new file mode 100644 index 0000000000000000000000000000000000000000..49a4385be7e8be84a7d4be4b9efbfaae2fe5f986 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/packaging/requirements.py @@ -0,0 +1,129 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pip._vendor.pyparsing import ( + stringStart, stringEnd, originalTextFor, ParseException +) +from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pip._vendor.pyparsing import Literal as L # noqa +from pip._vendor.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/specifiers.py b/vendor/pip-9.0.3/pip/_vendor/packaging/specifiers.py new file mode 100644 index 0000000000000000000000000000000000000000..7f5a76cfd63f47dcce29b3ea82f59d10f4e8d771 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/utils.py b/vendor/pip-9.0.3/pip/_vendor/packaging/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..942387cef5d75f299a769b1eb43b6c7679e7a3a0 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/vendor/pip-9.0.3/pip/_vendor/packaging/version.py b/vendor/pip-9.0.3/pip/_vendor/packaging/version.py new file mode 100644 index 0000000000000000000000000000000000000000..83b5ee8c5efadf22ce2f16ff08c8a8d75f1eb5df --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/vendor/pip-9.0.3/pip/_vendor/pkg_resources/__init__.py b/vendor/pip-9.0.3/pip/_vendor/pkg_resources/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b8e598b92a82b02b53ebf9e1d7ad9a80be6e806c --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/pkg_resources/__init__.py @@ -0,0 +1,3052 @@ +# coding: utf-8 +""" +Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +from __future__ import absolute_import + +import sys +import os +import io +import time +import re +import types +import zipfile +import zipimport +import warnings +import stat +import functools +import pkgutil +import operator +import platform +import collections +import plistlib +import email.parser +import tempfile +import textwrap +import itertools +from pkgutil import get_importer + +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + +from pip._vendor import six +from pip._vendor.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from pip._vendor import appdirs +from pip._vendor import packaging +__import__('pip._vendor.packaging.version') +__import__('pip._vendor.packaging.specifiers') +__import__('pip._vendor.packaging.requirements') +__import__('pip._vendor.packaging.markers') + + +if (3, 0) < sys.version_info < (3, 3): + msg = ( + "Support for Python 3.0-3.2 has been dropped. Future versions " + "will fail here." + ) + warnings.warn(msg) + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +class _SetuptoolsVersionMixin(object): + def __hash__(self): + return super(_SetuptoolsVersionMixin, self).__hash__() + + def __lt__(self, other): + if isinstance(other, tuple): + return tuple(self) < other + else: + return super(_SetuptoolsVersionMixin, self).__lt__(other) + + def __le__(self, other): + if isinstance(other, tuple): + return tuple(self) <= other + else: + return super(_SetuptoolsVersionMixin, self).__le__(other) + + def __eq__(self, other): + if isinstance(other, tuple): + return tuple(self) == other + else: + return super(_SetuptoolsVersionMixin, self).__eq__(other) + + def __ge__(self, other): + if isinstance(other, tuple): + return tuple(self) >= other + else: + return super(_SetuptoolsVersionMixin, self).__ge__(other) + + def __gt__(self, other): + if isinstance(other, tuple): + return tuple(self) > other + else: + return super(_SetuptoolsVersionMixin, self).__gt__(other) + + def __ne__(self, other): + if isinstance(other, tuple): + return tuple(self) != other + else: + return super(_SetuptoolsVersionMixin, self).__ne__(other) + + def __getitem__(self, key): + return tuple(self)[key] + + def __iter__(self): + component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) + replace = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + }.get + + def _parse_version_parts(s): + for part in component_re.split(s): + part = replace(part, part) + if not part or part == '.': + continue + if part[:1] in '0123456789': + # pad for numeric comparison + yield part.zfill(8) + else: + yield '*' + part + + # ensure that alpha/beta/candidate are before final + yield '*final' + + def old_parse_version(s): + parts = [] + for part in _parse_version_parts(s.lower()): + if part.startswith('*'): + # remove '-' before a prerelease tag + if part < '*final': + while parts and parts[-1] == '*final-': + parts.pop() + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == '00000000': + parts.pop() + parts.append(part) + return tuple(parts) + + # Warn for use of this function + warnings.warn( + "You have iterated over the result of " + "pkg_resources.parse_version. This is a legacy behavior which is " + "inconsistent with the new version class introduced in setuptools " + "8.0. In most cases, conversion to a tuple is unnecessary. For " + "comparison of versions, sort the Version instances directly. If " + "you have another use case requiring the tuple, please file a " + "bug with the setuptools project describing that need.", + RuntimeWarning, + stacklevel=1, + ) + + for part in old_parse_version(str(self)): + yield part + + +class SetuptoolsVersion(_SetuptoolsVersionMixin, packaging.version.Version): + pass + + +class SetuptoolsLegacyVersion(_SetuptoolsVersionMixin, + packaging.version.LegacyVersion): + pass + + +def parse_version(v): + try: + return SetuptoolsVersion(v) + except packaging.version.InvalidVersion: + return SetuptoolsLegacyVersion(v) + + +_state_vars = {} + + +def _declare_state(vartype, **kw): + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) + + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_' + v](g[k]) + return state + + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_' + _state_vars[k]](k, g[k], v) + return state + + +def _sget_dict(val): + return val.copy() + + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + + +def _sget_object(val): + return val.__getstate__() + + +def _sset_object(key, ob, state): + ob.__setstate__(state) + + +_sget_none = _sset_none = lambda *args: None + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform() + m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + # not Mac OS X + pass + return plat + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] + + +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + + def __repr__(self): + return self.__class__.__name__ + repr(self.args) + + +class VersionConflict(ResolutionError): + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + + _template = ("The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}") + + @property + def req(self): + return self.args[0] + + @property + def requirers(self): + return self.args[1] + + @property + def requirers_str(self): + if not self.requirers: + return 'the application' + return ', '.join(self.requirers) + + def report(self): + return self._template.format(**locals()) + + def __str__(self): + return self.report() + + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" + + +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq, Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + + +def _macosx_vers(_cache=[]): + if not _cache: + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + + +def _macosx_arch(machine): + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + try: + # Python 2.7 or >=3.2 + from sysconfig import get_platform + except ImportError: + from distutils.util import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % (int(version[0]), int(version[1]), + _macosx_arch(machine)) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +# XXX backward compat +get_platform = get_build_platform + + +def compatible_platforms(provided, required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided == required: + # easy case + return True + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + return True + # egg isn't macosx or legacy darwin + return False + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + + +# backward compatibility +run_main = run_script + + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist, six.string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + +class WorkingSet(object): + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + def __contains__(self, dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + # XXX add more info + raise VersionConflict(dist, req) + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + for dist in self: + entries = dist.get_entry_map(group) + if name is None: + for ep in entries.values(): + yield ep + elif name in entries: + yield entries[name] + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key] = 1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True, replace=False): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set, unless `replace=True`. + If it's added, any callbacks registered with the ``subscribe()`` method + will be called. + """ + if insert: + dist.insert_on(self.entries, entry, replace=replace) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) + if not replace and dist.key in self.by_key: + # ignore hidden distros + return + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None, + replace_conflicting=False): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + + Unless `replace_conflicting=True`, raises a VersionConflict exception if + any requirements are found on the path that have the correct name but + the wrong version. Otherwise, if an `installer` is supplied it will be + invoked to obtain the correct version of the requirement and activate + it. + """ + + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} + to_activate = [] + + req_extras = _ReqExtras() + + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + + while requirements: + # process dependencies breadth-first + req = requirements.pop(0) + if req in processed: + # Ignore cyclic or redundant dependencies + continue + + if not req_extras.markers_pass(req): + continue + + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match(req, ws, installer) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras + + processed[req] = True + + # return list of distros to activate + return to_activate + + def find_plugins(self, plugin_env, full_env=None, installer=None, + fallback=True): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + # scan project names in alphabetic order + plugin_projects.sort() + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + # put all our entries in shadow_set + list(map(shadow_set.add, self)) + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError as v: + # save error info + error_info[dist] = v + if fallback: + # try the next older version of project + continue + else: + # give up on this project, keep going + break + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ + if callback in self.callbacks: + return + self.callbacks.append(callback) + if not existing: + return + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (None,) + ) + return not req.marker or any(extra_evals) + + +class Environment(object): + """Searchable snapshot of distributions on a search path""" + + def __init__(self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'3.3'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + return (self.python is None or dist.py_version is None + or dist.py_version == self.python) \ + and compatible_platforms(dist.platform, self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self, project_name): + """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + + """ + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) + + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key, []) + if dist not in dists: + dists.append(dist) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) + + def best_match(self, req, working_set, installer=None): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + dist = working_set.find(req) + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + # try to download/install + return self.obtain(req, installer) + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: + yield key + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other, Distribution): + self.add(other) + elif isinstance(other, Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +# XXX backward compatibility +AvailableDistributions = Environment + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + tmpl = textwrap.dedent(""" + Can't extract file(s) to egg cache + + The following error occurred while trying to extract file(s) to the Python egg + cache: + + {old_exc} + + The Python egg cache directory is currently set to: + + {cache_path} + + Perhaps your account does not have write access to this directory? You can + change the cache directory by setting the PYTHON_EGG_CACHE environment + variable to point to an accessible directory. + """).lstrip() + err = ExtractionError(tmpl.format(**locals())) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ("%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path) + warnings.warn(msg, UserWarning) + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 + os.chmod(tempname, mode) + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + +def get_default_cache(): + """ + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) + + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """ + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ', '.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-', '_') + + +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False + + +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) + + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return io.BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def has_metadata(self, name): + return self.egg_info and self._has(self._fn(self.egg_info, name)) + + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self, resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) + + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) + + def metadata_listdir(self, name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info, name)) + return [] + + def run_script(self, script_name, namespace): + script = 'scripts/' + script_name + if not self.has_metadata(script): + raise ResolutionError("No script named %r" % script_name) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text, script_filename, 'exec') + exec(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self, module): + NullProvider.__init__(self, module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path != old: + if _is_unpacked_egg(path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self, path): + return os.path.isdir(path) + + def _listdir(self, path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + with open(path, 'rb') as stream: + return stream.read() + + @classmethod + def _register(cls): + loader_cls = getattr(importlib_machinery, 'SourceFileLoader', + type(None)) + register_loader_type(loader_cls, cls) + + +DefaultProvider._register() + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + _isdir = _has = lambda self, path: False + _get = lambda self, path: '' + _listdir = lambda self, path: [] + module_path = None + + def __init__(self): + pass + + +empty_provider = EmptyProvider() + + +class ZipManifests(dict): + """ + zip manifest builder + """ + + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with ContextualZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): + """ + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ContextualZipFile(zipfile.ZipFile): + """ + Supplement ZipFile class to support context manager for Python 2.6 + """ + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + + def __new__(cls, *args, **kwargs): + """ + Construct a ZipFile or ContextualZipFile as appropriate + """ + if hasattr(zipfile.ZipFile, '__exit__'): + return zipfile.ZipFile(*args, **kwargs) + return super(ContextualZipFile, cls).__new__(cls) + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + _zip_manifests = MemoizedZipManifests() + + def __init__(self, module): + EggProvider.__init__(self, module) + self.zip_pre = self.loader.archive + os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.zip_pre) + ) + + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.egg_root) + ) + + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + # return the extracted directory name + return os.path.dirname(last) + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp(".$extract", dir=os.path.dirname(real_path)) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp, timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + # Windows, del old file and retry + elif os.name == 'nt': + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + # report a user-friendly error + manager.extraction_error() + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size != size or stat.st_mtime != timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + with open(file_path, 'rb') as f: + file_contents = f.read() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self, fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self, fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) + + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) + + +register_loader_type(zipimport.zipimporter, ZipProvider) + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self, path): + self.path = path + + def has_metadata(self, name): + return name == 'PKG-INFO' and os.path.isfile(self.path) + + def get_metadata(self, name): + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.6 and 3.2 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zip_pre = importer.archive + os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +_declare_state('dict', _distribution_finders={}) + + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + + +def find_eggs_in_zip(importer, path_item, only=False): + """ + Find eggs in zip files; possibly multiple nested eggs. + """ + if importer.archive.endswith('.whl'): + # wheels are not supported with this finder + # they don't have PKG-INFO metadata, and won't ever contain eggs + return + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + # don't yield nested distros + return + for subitem in metadata.resource_listdir('/'): + if _is_unpacked_egg(subitem): + subpath = os.path.join(path_item, subitem) + for dist in find_eggs_in_zip(zipimport.zipimporter(subpath), subpath): + yield dist + + +register_finder(zipimport.zipimporter, find_eggs_in_zip) + + +def find_nothing(importer, path_item, only=False): + return () + + +register_finder(object, find_nothing) + + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if os.path.isdir(path_item) and os.access(path_item, os.R_OK): + if _is_unpacked_egg(path_item): + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item, 'EGG-INFO') + ) + ) + else: + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(os.listdir(path_item)) + for entry in path_item_entries: + lower = entry.lower() + if lower.endswith('.egg-info') or lower.endswith('.dist-info'): + fullpath = os.path.join(path_item, entry) + if os.path.isdir(fullpath): + # egg-info directory, allow getting metadata + if len(os.listdir(fullpath)) == 0: + # Empty egg directory, skip. + continue + metadata = PathMetadata(path_item, fullpath) + else: + metadata = FileMetadata(fullpath) + yield Distribution.from_location( + path_item, entry, metadata, precedence=DEVELOP_DIST + ) + elif not only and _is_unpacked_egg(entry): + dists = find_distributions(os.path.join(path_item, entry)) + for dist in dists: + yield dist + elif not only and lower.endswith('.egg-link'): + with open(os.path.join(path_item, entry)) as entry_file: + entry_lines = entry_file.readlines() + for line in entry_lines: + if not line.strip(): + continue + path = os.path.join(path_item, line.rstrip()) + dists = find_distributions(path) + for item in dists: + yield item + break + + +register_finder(pkgutil.ImpImporter, find_on_path) + +if hasattr(importlib_machinery, 'FileFinder'): + register_finder(importlib_machinery.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer, path_entry, moduleName, module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + + importer = get_importer(path_item) + if importer is None: + return None + loader = importer.find_module(packageName) + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = types.ModuleType(packageName) + module.__path__ = [] + _set_parent_ns(packageName) + elif not hasattr(module, '__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer, path_item, packageName, module) + if subpath is not None: + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + _rebuild_mod_path(path, packageName, module) + return subpath + + +def _rebuild_mod_path(orig_path, package_name, module): + """ + Rebuild module.__path__ ensuring that all entries are ordered + corresponding to their sys.path order + """ + sys_path = [_normalize_cached(p) for p in sys.path] + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): + """ + Return the ordinal of the path based on its position in sys.path + """ + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + orig_path.sort(key=position_in_sys_path) + module.__path__[:] = [_normalize_cached(p) for p in orig_path] + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path, parent = sys.path, None + if '.' in packageName: + parent = '.'.join(packageName.split('.')[:-1]) + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent, []).append(packageName) + _namespace_packages.setdefault(packageName, []) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + _imp.release_lock() + + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + _imp.acquire_lock() + try: + for package in _namespace_packages.get(parent, ()): + subpath = _handle_ns(package, path_item) + if subpath: + fixup_namespace_packages(subpath, package) + finally: + _imp.release_lock() + + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item) == normalized: + break + else: + # Only return the path if it's not already there + return subpath + + +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) + +if hasattr(importlib_machinery, 'FileFinder'): + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + + +register_namespace_handler(object, null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(filename)) + + +def _normalize_cached(filename, _cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + + +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + path.lower().endswith('.egg') + ) + + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, six.string_types): + for s in strs.splitlines(): + s = s.strip() + # skip blank lines/comments + if s and not s.startswith('#'): + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + + +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r""" + (?P<name>[^-]+) ( + -(?P<ver>[^-]+) ( + -py(?P<pyver>[^-]+) ( + -(?P<plat>.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, +).match + + +class EntryPoint(object): + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = Requirement.parse(("x[%s]" % ','.join(extras))).extras + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + DeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) + + @classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1, extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras + + @classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name] = ep + return this + + @classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data, dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urllib.parse.urlparse(location) + if parsed[-1].startswith('md5='): + return urllib.parse.urlunparse(parsed[:-1] + ('',)) + return location + + +def _version_from_file(lines): + """ + Given an iterable of lines from a Metadata file, return + the value of the Version field, if present, or None otherwise. + """ + is_version_line = lambda line: line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) + line = next(iter(version_lines), '') + _, _, value = line.partition(':') + return safe_version(value.strip()) or None + + +class Distribution(object): + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__(self, location=None, metadata=None, project_name=None, + version=None, py_version=PY_MAJOR, platform=None, + precedence=EGG_DIST): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + @classmethod + def from_location(cls, location, basename, metadata=None, **kw): + project_name, version, py_version, platform = [None] * 4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + cls = _distributionImpl[ext.lower()] + + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name', 'ver', 'pyver', 'plat' + ) + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + )._reload_version() + + def _reload_version(self): + return self + + @property + def hashcmp(self): + return ( + self.parsed_version, + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version or '', + self.platform or '', + ) + + def __hash__(self): + return hash(self.hashcmp) + + def __lt__(self, other): + return self.hashcmp < other.hashcmp + + def __le__(self, other): + return self.hashcmp <= other.hashcmp + + def __gt__(self, other): + return self.hashcmp > other.hashcmp + + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + @property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + + @property + def parsed_version(self): + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + + return self._parsed_version + + def _warn_legacy_version(self): + LV = packaging.version.LegacyVersion + is_legacy = isinstance(self._parsed_version, LV) + if not is_legacy: + return + + # While an empty version is technically a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if not self.version: + return + + tmpl = textwrap.dedent(""" + '{project_name} ({version})' is being parsed as a legacy, + non PEP 440, + version. You may find odd behavior and sort order. + In particular it will be sorted as less than 0.0. It + is recommended to migrate to PEP 440 compatible + versions. + """).strip().replace('\n', ' ') + + warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + + @property + def version(self): + try: + return self._version + except AttributeError: + version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if version is None: + tmpl = "Missing 'Version:' header and/or %s file" + raise ValueError(tmpl % self.PKG_INFO, self) + return version + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + dm = self.__dep_map = {None: []} + for name in 'requires.txt', 'depends.txt': + for extra, reqs in split_sections(self._get_metadata(name)): + if extra: + if ':' in extra: + extra, marker = extra.split(':', 1) + if invalid_marker(marker): + # XXX warn + reqs = [] + elif not evaluate_marker(marker): + reqs = [] + extra = safe_extra(extra) or None + dm.setdefault(extra, []).extend(parse_requirements(reqs)) + return dm + + def requires(self, extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None, ())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def activate(self, path=None, replace=False): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: + path = sys.path + self.insert_on(path, replace=replace) + if path is sys.path: + fixup_namespace_packages(self.location) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-' + self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self, self.location) + else: + return str(self) + + def __str__(self): + try: + version = getattr(self, 'version', None) + except ValueError: + version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name, version) + + def __getattr__(self, attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + @classmethod + def from_filename(cls, filename, metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group, name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group, name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group, {}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + def insert_on(self, path, loc=None, replace=False): + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath = [(p and _normalize_cached(p) or p) for p in path] + + for p, item in enumerate(npath): + if item == nloc: + if replace: + break + else: + # don't modify path (even removing duplicates) if found and not replace + return + elif item == bdir and self.precedence == EGG_DIST: + # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + if replace: + path.insert(0, loc) + else: + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while True: + try: + np = npath.index(nloc, p + 1) + except ValueError: + break + else: + del npath[np], path[np] + # ha! + p = np + + return + + def check_version_conflict(self): + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for " + repr(self)) + return False + return True + + def clone(self, **kw): + """Copy this distribution, substituting in any changed keyword args""" + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + @property + def extras(self): + return [dep for dep in self._dep_map if dep] + + +class EggInfoDistribution(Distribution): + def _reload_version(self): + """ + Packages installed by distutils (e.g. numpy or scipy), + which uses an old safe_version, and so + their version numbers can get mangled when + converted to filenames (e.g., 1.11.0.dev0+2329eae to + 1.11.0.dev0_2329eae). These distributions will not be + parsed properly + downstream by Distribution and safe_version, so + take an extra step and try to get the version number from + the metadata file itself instead of the filename. + """ + md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if md_version: + self._version = md_version + return self + + +class DistInfoDistribution(Distribution): + """Wrap an actual or potential sys.path entry w/metadata, .dist-info style""" + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + reqs.extend(parse_requirements(req)) + + def reqs_for_extra(extra): + for req in reqs: + if not req.marker or req.marker.evaluate({'extra': extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = { + '.egg': Distribution, + '.egg-info': EggInfoDistribution, + '.dist-info': DistInfoDistribution, + } + + +def issue_warning(*args, **kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + warnings.warn(stacklevel=level + 1, *args, **kw) + + +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be a string, or a (possibly-nested) iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + line += next(lines) + yield Requirement(line) + + +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) + self.project_name, self.key = project_name, project_name.lower() + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) + self.hashCmp = ( + self.key, + self.specifier, + frozenset(self.extras), + str(self.marker) if self.marker else None, + ) + self.__hash = hash(self.hashCmp) + + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) + + def __ne__(self, other): + return not self == other + + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: + return False + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) + + def __hash__(self): + return self.__hash + + def __repr__(self): return "Requirement.parse(%r)" % str(self) + + @staticmethod + def parse(s): + req, = parse_requirements(s) + return req + + +def _get_mro(cls): + """Get an mro for a type or classic class""" + if not isinstance(cls, type): + + class cls(cls, object): + pass + + return cls.__mro__[1:] + return cls.__mro__ + + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + for t in _get_mro(getattr(ob, '__class__', type(ob))): + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + + +def _bypass_ensure_directory(path): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + mkdir(dirname, 0o755) + + +def split_sections(s): + """Split a string or iterable thereof into (section, content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + + +def _mkstemp(*args, **kw): + old_open = os.open + try: + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args, **kw) + finally: + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) + + +# from jaraco.functools 1.3 +def _call_aside(f, *args, **kwargs): + f(*args, **kwargs) + return f + + +@_call_aside +def _initialize(g=globals()): + "Set up global resource manager (deliberately not state-saved)" + manager = ResourceManager() + g['_manager'] = manager + for name in dir(manager): + if not name.startswith('_'): + g[name] = getattr(manager, name) + + +@_call_aside +def _initialize_master_working_set(): + """ + Prepare the master working set and make the ``require()`` + API available. + + This function has explicit effects on the global state + of pkg_resources. It is intended to be invoked once at + the initialization of this module. + + Invocation by other packages is unsupported and done + at their own risk. + """ + working_set = WorkingSet._build_master() + _declare_state('object', working_set=working_set) + + require = working_set.require + iter_entry_points = working_set.iter_entry_points + add_activation_listener = working_set.subscribe + run_script = working_set.run_script + # backward compatibility + run_main = run_script + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + dist = None # ensure dist is defined for del dist below + for dist in working_set: + dist.activate(replace=False) + del dist + add_activation_listener(lambda dist: dist.activate(replace=True), existing=False) + working_set.entries = [] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/__init__.py b/vendor/pip-9.0.3/pip/_vendor/progress/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5107bc0a7968d9f8357aa013f01248b15f785bb5 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/progress/__init__.py @@ -0,0 +1,123 @@ +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import division + +from collections import deque +from datetime import timedelta +from math import ceil +from sys import stderr +from time import time + + +__version__ = '1.2' + + +class Infinite(object): + file = stderr + sma_window = 10 + + def __init__(self, *args, **kwargs): + self.index = 0 + self.start_ts = time() + self._ts = self.start_ts + self._dt = deque(maxlen=self.sma_window) + for key, val in kwargs.items(): + setattr(self, key, val) + + def __getitem__(self, key): + if key.startswith('_'): + return None + return getattr(self, key, None) + + @property + def avg(self): + return sum(self._dt) / len(self._dt) if self._dt else 0 + + @property + def elapsed(self): + return int(time() - self.start_ts) + + @property + def elapsed_td(self): + return timedelta(seconds=self.elapsed) + + def update(self): + pass + + def start(self): + pass + + def finish(self): + pass + + def next(self, n=1): + if n > 0: + now = time() + dt = (now - self._ts) / n + self._dt.append(dt) + self._ts = now + + self.index = self.index + n + self.update() + + def iter(self, it): + for x in it: + yield x + self.next() + self.finish() + + +class Progress(Infinite): + def __init__(self, *args, **kwargs): + super(Progress, self).__init__(*args, **kwargs) + self.max = kwargs.get('max', 100) + + @property + def eta(self): + return int(ceil(self.avg * self.remaining)) + + @property + def eta_td(self): + return timedelta(seconds=self.eta) + + @property + def percent(self): + return self.progress * 100 + + @property + def progress(self): + return min(1, self.index / self.max) + + @property + def remaining(self): + return max(self.max - self.index, 0) + + def start(self): + self.update() + + def goto(self, index): + incr = index - self.index + self.next(incr) + + def iter(self, it): + try: + self.max = len(it) + except TypeError: + pass + + for x in it: + yield x + self.next() + self.finish() diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/bar.py b/vendor/pip-9.0.3/pip/_vendor/progress/bar.py new file mode 100644 index 0000000000000000000000000000000000000000..8ce1461004668676b884d3f5972e3ea00a679b98 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/progress/bar.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from . import Progress +from .helpers import WritelnMixin + + +class Bar(WritelnMixin, Progress): + width = 32 + message = '' + suffix = '%(index)d/%(max)d' + bar_prefix = ' |' + bar_suffix = '| ' + empty_fill = ' ' + fill = '#' + hide_cursor = True + + def update(self): + filled_length = int(self.width * self.progress) + empty_length = self.width - filled_length + + message = self.message % self + bar = self.fill * filled_length + empty = self.empty_fill * empty_length + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix, + suffix]) + self.writeln(line) + + +class ChargingBar(Bar): + suffix = '%(percent)d%%' + bar_prefix = ' ' + bar_suffix = ' ' + empty_fill = u'∙' + fill = u'â–ˆ' + + +class FillingSquaresBar(ChargingBar): + empty_fill = u'â–¢' + fill = u'â–£' + + +class FillingCirclesBar(ChargingBar): + empty_fill = u'â—¯' + fill = u'â—‰' + + +class IncrementalBar(Bar): + phases = (u' ', u'â–', u'â–Ž', u'â–', u'â–Œ', u'â–‹', u'â–Š', u'â–‰', u'â–ˆ') + + def update(self): + nphases = len(self.phases) + expanded_length = int(nphases * self.width * self.progress) + filled_length = int(self.width * self.progress) + empty_length = self.width - filled_length + phase = expanded_length - (filled_length * nphases) + + message = self.message % self + bar = self.phases[-1] * filled_length + current = self.phases[phase] if phase > 0 else '' + empty = self.empty_fill * max(0, empty_length - len(current)) + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, current, empty, + self.bar_suffix, suffix]) + self.writeln(line) + + +class ShadyBar(IncrementalBar): + phases = (u' ', u'â–‘', u'â–’', u'â–“', u'â–ˆ') diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/counter.py b/vendor/pip-9.0.3/pip/_vendor/progress/counter.py new file mode 100644 index 0000000000000000000000000000000000000000..caaddc680d31f646f9ebc1cfba1da2ed7e101a5a --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/progress/counter.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from . import Infinite, Progress +from .helpers import WriteMixin + + +class Counter(WriteMixin, Infinite): + message = '' + hide_cursor = True + + def update(self): + self.write(str(self.index)) + + +class Countdown(WriteMixin, Progress): + hide_cursor = True + + def update(self): + self.write(str(self.remaining)) + + +class Stack(WriteMixin, Progress): + phases = (u' ', u'â–', u'â–‚', u'â–ƒ', u'â–„', u'â–…', u'â–†', u'â–‡', u'â–ˆ') + hide_cursor = True + + def update(self): + nphases = len(self.phases) + i = min(nphases - 1, int(self.progress * nphases)) + self.write(self.phases[i]) + + +class Pie(Stack): + phases = (u'â—‹', u'â—”', u'â—‘', u'â—•', u'â—') diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/helpers.py b/vendor/pip-9.0.3/pip/_vendor/progress/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..9ed90b2bc4c90c506a0e9bc2452e3765c323fe66 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/progress/helpers.py @@ -0,0 +1,91 @@ +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import print_function + + +HIDE_CURSOR = '\x1b[?25l' +SHOW_CURSOR = '\x1b[?25h' + + +class WriteMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WriteMixin, self).__init__(**kwargs) + self._width = 0 + if message: + self.message = message + + if self.file.isatty(): + if self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + print(self.message, end='', file=self.file) + self.file.flush() + + def write(self, s): + if self.file.isatty(): + b = '\b' * self._width + c = s.ljust(self._width) + print(b + c, end='', file=self.file) + self._width = max(self._width, len(s)) + self.file.flush() + + def finish(self): + if self.file.isatty() and self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +class WritelnMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WritelnMixin, self).__init__(**kwargs) + if message: + self.message = message + + if self.file.isatty() and self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + + def clearln(self): + if self.file.isatty(): + print('\r\x1b[K', end='', file=self.file) + + def writeln(self, line): + if self.file.isatty(): + self.clearln() + print(line, end='', file=self.file) + self.file.flush() + + def finish(self): + if self.file.isatty(): + print(file=self.file) + if self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +from signal import signal, SIGINT +from sys import exit + + +class SigIntMixin(object): + """Registers a signal handler that calls finish on SIGINT""" + + def __init__(self, *args, **kwargs): + super(SigIntMixin, self).__init__(*args, **kwargs) + signal(SIGINT, self._sigint_handler) + + def _sigint_handler(self, signum, frame): + self.finish() + exit(0) diff --git a/vendor/pip-9.0.3/pip/_vendor/progress/spinner.py b/vendor/pip-9.0.3/pip/_vendor/progress/spinner.py new file mode 100644 index 0000000000000000000000000000000000000000..969bfbb5c80e5625bb6ffc83b93f629127951a61 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/progress/spinner.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from . import Infinite +from .helpers import WriteMixin + + +class Spinner(WriteMixin, Infinite): + message = '' + phases = ('-', '\\', '|', '/') + hide_cursor = True + + def update(self): + i = self.index % len(self.phases) + self.write(self.phases[i]) + + +class PieSpinner(Spinner): + phases = [u'â—·', u'â—¶', u'â—µ', u'â—´'] + + +class MoonSpinner(Spinner): + phases = [u'â—‘', u'â—’', u'â—', u'â—“'] + + +class LineSpinner(Spinner): + phases = [u'⎺', u'⎻', u'⎼', u'⎽', u'⎼', u'⎻'] diff --git a/vendor/pip-9.0.3/pip/_vendor/pyparsing.py b/vendor/pip-9.0.3/pip/_vendor/pyparsing.py new file mode 100644 index 0000000000000000000000000000000000000000..cb46d411ab9212b54eaab6163e0feb3b39609e7c --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/pyparsing.py @@ -0,0 +1,5696 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2016 Paul T. McGuire +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments +""" + +__version__ = "2.1.10" +__versionTime__ = "07 Oct 2016 01:31 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex('&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + """ + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +collections.MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [(frame_summary.filename, frame_summary.lineno)] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [(frame_summary.filename, frame_summary.lineno)] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define action to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or loc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.popitem(False) + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + prints:: + ['More', 'Iron', 'Lead', 'Gold', 'I'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, And._ErrorStop(), other ] ) + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + """ + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern,"\g<1>",ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, collections.Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, collections.Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) | Regex(r"\w", re.UNICODE) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + matchExpr.setParseAction( pa ) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/vendor/pip-9.0.3/pip/_vendor/re-vendor.py b/vendor/pip-9.0.3/pip/_vendor/re-vendor.py new file mode 100644 index 0000000000000000000000000000000000000000..0a52123e4f248648117bc4599da04dd4634e5253 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/re-vendor.py @@ -0,0 +1,34 @@ +import os +import sys +import pip +import glob +import shutil + +here = os.path.abspath(os.path.dirname(__file__)) + +def usage(): + print("Usage: re-vendor.py [clean|vendor]") + sys.exit(1) + +def clean(): + for fn in os.listdir(here): + dirname = os.path.join(here, fn) + if os.path.isdir(dirname): + shutil.rmtree(dirname) + # six is a single file, not a package + os.unlink(os.path.join(here, 'six.py')) + +def vendor(): + pip.main(['install', '-t', here, '-r', 'vendor.txt']) + for dirname in glob.glob('*.egg-info'): + shutil.rmtree(dirname) + +if __name__ == '__main__': + if len(sys.argv) != 2: + usage() + if sys.argv[1] == 'clean': + clean() + elif sys.argv[1] == 'vendor': + vendor() + else: + usage() diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/__init__.py b/vendor/pip-9.0.3/pip/_vendor/requests/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d679f2f93aa42455eadc14d161b511b1398871c3 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/__init__.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('http://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at <http://python-requests.org>. + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +from pip._vendor import urllib3 +from pip._vendor import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.22 + assert major == 1 + assert minor >= 21 + assert minor <= 22 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +# try: +# from pip._vendor.urllib3.contrib import pyopenssl +# pyopenssl.inject_into_urllib3() +# except ImportError: +# pass + +# urllib3's DependencyWarnings should be silenced. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + +from . import utils +from . import packages +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/__version__.py b/vendor/pip-9.0.3/pip/_vendor/requests/__version__.py new file mode 100644 index 0000000000000000000000000000000000000000..dc33eef651134203a7b98323015f606bbacdbbbb --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.18.4' +__build__ = 0x021804 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2017 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/_internal_utils.py b/vendor/pip-9.0.3/pip/_vendor/requests/_internal_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..759d9a56ba0102bb3b7b3abfcfae6731a2ecc243 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/adapters.py b/vendor/pip-9.0.3/pip/_vendor/requests/adapters.py new file mode 100644 index 0000000000000000000000000000000000000000..57876383c8baa2b4926e9b2792fe18744fd8b8d1 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/adapters.py @@ -0,0 +1,525 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket + +from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url +from pip._vendor.urllib3.response import HTTPResponse +from pip._vendor.urllib3.util import Timeout as TimeoutSauce +from pip._vendor.urllib3.util.retry import Retry +from pip._vendor.urllib3.exceptions import ClosedPoolError +from pip._vendor.urllib3.exceptions import ConnectTimeoutError +from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError +from pip._vendor.urllib3.exceptions import MaxRetryError +from pip._vendor.urllib3.exceptions import NewConnectionError +from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError +from pip._vendor.urllib3.exceptions import ProtocolError +from pip._vendor.urllib3.exceptions import ReadTimeoutError +from pip._vendor.urllib3.exceptions import SSLError as _SSLError +from pip._vendor.urllib3.exceptions import ResponseError + +from .models import Response +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, + prepend_scheme_if_needed, get_auth_from_url, urldefragauth, + select_proxy) +from .structures import CaseInsensitiveDict +from .cookies import extract_cookies_to_jar +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema) +from .auth import _basic_auth_str + +try: + from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session <Session>` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return dict((attr, getattr(self, attr, None)) for attr in + self.__attrs__) + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = DEFAULT_CA_BUNDLE_PATH + + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {0}".format(cert_loc)) + + conn.cert_reqs = 'CERT_REQUIRED' + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {0}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {0}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`Response <requests.Response>` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` + + :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxies: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + conn = self.get_connection(request.url, proxies) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {0}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7+ versions, use buffering of HTTP + # responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 2.6 versions and back + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/api.py b/vendor/pip-9.0.3/pip/_vendor/requests/api.py new file mode 100644 index 0000000000000000000000000000000000000000..bc2115c150f2d1248820b6671111e29e2b5163a7 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/api.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request <Request>`. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response <Response>` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'http://httpbin.org/get') + <Response [200]> + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/auth.py b/vendor/pip-9.0.3/pip/_vendor/requests/auth.py new file mode 100644 index 0000000000000000000000000000000000000000..1a182dffdd3f89a2e64e5bf6fdc288fcbbf242b0 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/auth.py @@ -0,0 +1,293 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import re +import time +import hashlib +import threading +import warnings + +from base64 import b64encode + +from .compat import urlparse, str, basestring +from .cookies import extract_cookies_to_jar +from ._internal_utils import to_native_string +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({0!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({0!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(password), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/cacert.pem b/vendor/pip-9.0.3/pip/_vendor/requests/cacert.pem new file mode 100644 index 0000000000000000000000000000000000000000..101ac98fa42d9eb4b27836e122cc81d495e33c21 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/cacert.pem @@ -0,0 +1,4433 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" +# Serial: 156233699172481 +# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e +# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb +# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE +BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn +aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg +QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 +MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD +VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom +/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR +Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 +4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z +5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 +hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID +AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX +SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l +VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf +peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF +Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW ++qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G1 O=Certplus +# Subject: CN=Certplus Root CA G1 O=Certplus +# Label: "Certplus Root CA G1" +# Serial: 1491911565779898356709731176965615564637713 +# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 +# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 +# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a +iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt +6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP +0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f +6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE +EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN +1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc +h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT +mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV +4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO +WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud +DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd +Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq +hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 +/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS +S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j +2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R +Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr +RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy +6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV +V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 +g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl +++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G2 O=Certplus +# Subject: CN=Certplus Root CA G2 O=Certplus +# Label: "Certplus Root CA G2" +# Serial: 1492087096131536844209563509228951875861589 +# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 +# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a +# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat +93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x +Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj +FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG +SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch +p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal +U5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust +# Subject: CN=OpenTrust Root CA G1 O=OpenTrust +# Label: "OpenTrust Root CA G1" +# Serial: 1492036577811947013770400127034825178844775 +# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da +# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e +# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b +wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX +/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 +77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP +uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx +p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx +Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 +TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W +G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw +vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY +EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 +2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw +DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf +gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS +FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 +V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P +XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I +i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t +TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 +09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky +Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ +AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj +1oxx +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust +# Subject: CN=OpenTrust Root CA G2 O=OpenTrust +# Label: "OpenTrust Root CA G2" +# Serial: 1492012448042702096986875987676935573415441 +# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb +# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b +# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh +/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e +CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 +1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE +FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS +gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X +G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy +YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH +vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 +t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ +gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 +5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w +DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 +nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT +RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT +wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 +t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa +TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 +o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU +3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA +iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f +WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM +S1IK +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust +# Subject: CN=OpenTrust Root CA G3 O=OpenTrust +# Label: "OpenTrust Root CA G3" +# Serial: 1492104908271485653071219941864171170455615 +# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 +# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 +# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx +CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U +cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow +QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl +blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm +3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d +oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 +DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK +BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q +j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx +4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL +BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV +BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw +MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B +LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F +ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem +hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 +EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn +Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 +zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ +96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m +j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g +DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ +8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j +X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH +hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB +KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 +Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL +BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 +BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO +jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 +loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c +qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ +2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ +JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre +zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf +LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ +x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 +oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/certs.py b/vendor/pip-9.0.3/pip/_vendor/requests/certs.py new file mode 100644 index 0000000000000000000000000000000000000000..06a594e58f6746041edf371bc3dc8ca42b612322 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/certs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from pip._vendor.certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/compat.py b/vendor/pip-9.0.3/pip/_vendor/requests/compat.py new file mode 100644 index 0000000000000000000000000000000000000000..9c7d6d8d4cf9415e65ce4cd2d1b360298e491f9a --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/compat.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +from pip._vendor import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +# try: +# import simplejson as json +# except ImportError: +import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + + from pip._vendor.urllib3.packages.ordered_dict import OrderedDict + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + integer_types = (int, long) + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/cookies.py b/vendor/pip-9.0.3/pip/_vendor/requests/cookies.py new file mode 100644 index 0000000000000000000000000000000000000000..ab3c88b9bf3be75044fbe584ac2511b88f2c4962 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/cookies.py @@ -0,0 +1,542 @@ +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar +import collections + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.update(self) + return new_cj + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = dict( + version=0, + name=name, + value=value, + port=None, + domain='', + path='/', + secure=False, + expires=None, + discard=True, + comment=None, + comment_url=None, + rest={'HttpOnly': None}, + rfc2109=False,) + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/exceptions.py b/vendor/pip-9.0.3/pip/_vendor/requests/exceptions.py new file mode 100644 index 0000000000000000000000000000000000000000..3e5d0b2dbe9c5b8fbce4f52fc65010183b224040 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/exceptions.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/help.py b/vendor/pip-9.0.3/pip/_vendor/requests/help.py new file mode 100644 index 0000000000000000000000000000000000000000..7c4b193c90649a72d63f125362897b87a2868c80 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/help.py @@ -0,0 +1,120 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +from pip._vendor import idna +from pip._vendor import urllib3 +from pip._vendor import chardet + +from . import __version__ as requests_version + +try: + from .packages.urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module. + system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None) + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/hooks.py b/vendor/pip-9.0.3/pip/_vendor/requests/hooks.py new file mode 100644 index 0000000000000000000000000000000000000000..32b32de75047dbc94bc7757801fe3ec4733bad43 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ['response'] + + +def default_hooks(): + return dict((event, []) for event in HOOKS) + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or dict() + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/models.py b/vendor/pip-9.0.3/pip/_vendor/requests/models.py new file mode 100644 index 0000000000000000000000000000000000000000..4254fbd20cff7316da191e54fe2e7b1559deafee --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/models.py @@ -0,0 +1,948 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import collections +import datetime +import sys + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. +import encodings.idna + +from pip._vendor.urllib3.fields import RequestField +from pip._vendor.urllib3.filepost import encode_multipart_formdata +from pip._vendor.urllib3.util import parse_url +from pip._vendor.urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar +from .exceptions import ( + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) +from ._internal_utils import to_native_string, unicode_is_ascii +from .utils import ( + guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len, check_header_validity) +from .compat import ( + cookielib, urlunparse, urlsplit, urlencode, str, bytes, + is_py2, chardet, builtin_str, basestring) +from .compat import json as complexjson +from .status_codes import codes + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if (not files): + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + (field.decode('utf-8') if isinstance(field, bytes) else field, + v.encode('utf-8') if isinstance(v, str) else v)) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + else: + fdata = fp.read() + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError('Unsupported event specified, with event name "%s"' % (event)) + + if isinstance(hook, collections.Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request <Request>` object. + + Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: dictionary of URL parameters to append to the URL. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req.prepare() + <PreparedRequest [GET]> + """ + + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '<Request [%s]>' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request <Request>` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> r = req.prepare() + <PreparedRequest [GET]> + + >>> s = requests.Session() + >>> s.send(r) + <Response [200]> + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '<PreparedRequest [%s]>' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + import idna + + try: + host = idna.encode(host, uts46=True).decode('utf-8') + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/requests/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + elif host.startswith(u'*'): + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + body = complexjson.dumps(json) + if not isinstance(body, bytes): + body = body.encode('utf-8') + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, collections.Mapping)) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + if is_stream: + body = data + + if getattr(body, 'tell', None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers['Content-Length'] = builtin_str(length) + elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response <Response>` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response <Response>` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest <PreparedRequest>` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return dict( + (attr, getattr(self, attr, None)) + for attr in self.__attrs__ + ) + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '<Response [%s]>' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the chardet library.""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises ValueError: If the response body does not contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/packages.py b/vendor/pip-9.0.3/pip/_vendor/requests/packages.py new file mode 100644 index 0000000000000000000000000000000000000000..9582fa730f121634348a79c1a8b0cc2df99c616f --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/packages.py @@ -0,0 +1,16 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + vendored_package = "pip._vendor." + package + locals()[package] = __import__(vendored_package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == vendored_package or mod.startswith(vendored_package + '.'): + unprefixed_mod = mod[len("pip._vendor."):] + sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/sessions.py b/vendor/pip-9.0.3/pip/_vendor/requests/sessions.py new file mode 100644 index 0000000000000000000000000000000000000000..6570e7334901fac990c2798053ae31b64e34ce1e --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/sessions.py @@ -0,0 +1,737 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import platform +import time +from collections import Mapping +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if platform.system() == 'Windows': + try: # Python 3.3+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) + + # The scheme should be lower case... + parsed = urlparse(url) + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/requests/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/requests/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers: + # If we get redirected to a new host, we should strip out any + # authentication headers. + original_parsed = urlparse(response.request.url) + redirect_parsed = urlparse(url) + + if (original_parsed.hostname != redirect_parsed.hostname): + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') + + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # http://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('http://httpbin.org/get') + <Response [200]> + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('http://httpbin.org/get') + <Response [200]> + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request <Request>` sent from this + #: :class:`Session <Session>`. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request <Request>`. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request <Request>`. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request <Request>`. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request <Request>` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): + """Constructs a :class:`Request <Request>`, prepares it and sends it. + Returns :class:`Response <Response>` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, bytes, or file-like object to send + in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + :rtype: Session + """ + + return Session() diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/status_codes.py b/vendor/pip-9.0.3/pip/_vendor/requests/status_codes.py new file mode 100644 index 0000000000000000000000000000000000000000..dee89190c06f5fd7ec70ba804eb357ba20acf828 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/status_codes.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), +} + +codes = LookupDict(name='status_codes') + +for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/structures.py b/vendor/pip-9.0.3/pip/_vendor/requests/structures.py new file mode 100644 index 0000000000000000000000000000000000000000..05d2b3f57beadb7dd36718487281e746d96de014 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/structures.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +import collections + +from .compat import OrderedDict + + +class CaseInsensitiveDict(collections.MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``collections.MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, collections.Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '<lookup \'%s\'>' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/vendor/pip-9.0.3/pip/_vendor/requests/utils.py b/vendor/pip-9.0.3/pip/_vendor/requests/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..5c47de98931adfe6412d9f66f28252cd3ab2e5b9 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/requests/utils.py @@ -0,0 +1,904 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import cgi +import codecs +import collections +import contextlib +import io +import os +import platform +import re +import socket +import struct +import warnings + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + + +if platform.system() == 'Windows': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + if is_py3: + import winreg + else: + import _winreg as winreg + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + proxyEnable = winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0] + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '<local>' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '<local>': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{0}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See http://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: need more than 1 value to unpack + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, collections.Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) + pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = cgi.parse_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + netloc = urlparse(url).netloc + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the netloc, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + ip = netloc.split(':')[0] + if is_ipv4_address(ip): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(ip, proxy_ip): + return True + elif ip == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + for host in no_proxy: + if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + # If the system proxy settings indicate that this URL should be bypassed, + # don't proxy. + # The proxy_bypass function is incredibly buggy on OS X in early versions + # of Python 2.6, so allow this call to fail. Only catch the specific + # exceptions we've seen, though: this call failing in other ways can reveal + # legitimate problems. + with set_environ('no_proxy', no_proxy_arg): + try: + bypass = proxy_bypass(netloc) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a dict of parsed link headers proxies. + + i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/vendor/pip-9.0.3/pip/_vendor/retrying.py b/vendor/pip-9.0.3/pip/_vendor/retrying.py new file mode 100644 index 0000000000000000000000000000000000000000..6d1e627aae8130f76781f9a2861a90a22329c930 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/retrying.py @@ -0,0 +1,267 @@ +## Copyright 2013-2014 Ray Holder +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +import random +from pip._vendor import six +import sys +import time +import traceback + + +# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... +MAX_WAIT = 1073741823 + + +def retry(*dargs, **dkw): + """ + Decorator function that instantiates the Retrying object + @param *dargs: positional arguments passed to Retrying object + @param **dkw: keyword arguments passed to the Retrying object + """ + # support both @retry and @retry() as valid syntax + if len(dargs) == 1 and callable(dargs[0]): + def wrap_simple(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying().call(f, *args, **kw) + + return wrapped_f + + return wrap_simple(dargs[0]) + + else: + def wrap(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying(*dargs, **dkw).call(f, *args, **kw) + + return wrapped_f + + return wrap + + +class Retrying(object): + + def __init__(self, + stop=None, wait=None, + stop_max_attempt_number=None, + stop_max_delay=None, + wait_fixed=None, + wait_random_min=None, wait_random_max=None, + wait_incrementing_start=None, wait_incrementing_increment=None, + wait_exponential_multiplier=None, wait_exponential_max=None, + retry_on_exception=None, + retry_on_result=None, + wrap_exception=False, + stop_func=None, + wait_func=None, + wait_jitter_max=None): + + self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number + self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay + self._wait_fixed = 1000 if wait_fixed is None else wait_fixed + self._wait_random_min = 0 if wait_random_min is None else wait_random_min + self._wait_random_max = 1000 if wait_random_max is None else wait_random_max + self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start + self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment + self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier + self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max + self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max + + # TODO add chaining of stop behaviors + # stop behavior + stop_funcs = [] + if stop_max_attempt_number is not None: + stop_funcs.append(self.stop_after_attempt) + + if stop_max_delay is not None: + stop_funcs.append(self.stop_after_delay) + + if stop_func is not None: + self.stop = stop_func + + elif stop is None: + self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs) + + else: + self.stop = getattr(self, stop) + + # TODO add chaining of wait behaviors + # wait behavior + wait_funcs = [lambda *args, **kwargs: 0] + if wait_fixed is not None: + wait_funcs.append(self.fixed_sleep) + + if wait_random_min is not None or wait_random_max is not None: + wait_funcs.append(self.random_sleep) + + if wait_incrementing_start is not None or wait_incrementing_increment is not None: + wait_funcs.append(self.incrementing_sleep) + + if wait_exponential_multiplier is not None or wait_exponential_max is not None: + wait_funcs.append(self.exponential_sleep) + + if wait_func is not None: + self.wait = wait_func + + elif wait is None: + self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs) + + else: + self.wait = getattr(self, wait) + + # retry on exception filter + if retry_on_exception is None: + self._retry_on_exception = self.always_reject + else: + self._retry_on_exception = retry_on_exception + + # TODO simplify retrying by Exception types + # retry on result filter + if retry_on_result is None: + self._retry_on_result = self.never_reject + else: + self._retry_on_result = retry_on_result + + self._wrap_exception = wrap_exception + + def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the previous attempt >= stop_max_attempt_number.""" + return previous_attempt_number >= self._stop_max_attempt_number + + def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the time from the first attempt >= stop_max_delay.""" + return delay_since_first_attempt_ms >= self._stop_max_delay + + def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Don't sleep at all before retrying.""" + return 0 + + def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a fixed amount of time between each retry.""" + return self._wait_fixed + + def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a random amount of time between wait_random_min and wait_random_max""" + return random.randint(self._wait_random_min, self._wait_random_max) + + def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """ + Sleep an incremental amount of time after each attempt, starting at + wait_incrementing_start and incrementing by wait_incrementing_increment + """ + result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1)) + if result < 0: + result = 0 + return result + + def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + exp = 2 ** previous_attempt_number + result = self._wait_exponential_multiplier * exp + if result > self._wait_exponential_max: + result = self._wait_exponential_max + if result < 0: + result = 0 + return result + + def never_reject(self, result): + return False + + def always_reject(self, result): + return True + + def should_reject(self, attempt): + reject = False + if attempt.has_exception: + reject |= self._retry_on_exception(attempt.value[1]) + else: + reject |= self._retry_on_result(attempt.value) + + return reject + + def call(self, fn, *args, **kwargs): + start_time = int(round(time.time() * 1000)) + attempt_number = 1 + while True: + try: + attempt = Attempt(fn(*args, **kwargs), attempt_number, False) + except: + tb = sys.exc_info() + attempt = Attempt(tb, attempt_number, True) + + if not self.should_reject(attempt): + return attempt.get(self._wrap_exception) + + delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time + if self.stop(attempt_number, delay_since_first_attempt_ms): + if not self._wrap_exception and attempt.has_exception: + # get() on an attempt with an exception should cause it to be raised, but raise just in case + raise attempt.get() + else: + raise RetryError(attempt) + else: + sleep = self.wait(attempt_number, delay_since_first_attempt_ms) + if self._wait_jitter_max: + jitter = random.random() * self._wait_jitter_max + sleep = sleep + max(0, jitter) + time.sleep(sleep / 1000.0) + + attempt_number += 1 + + +class Attempt(object): + """ + An Attempt encapsulates a call to a target function that may end as a + normal return value from the function or an Exception depending on what + occurred during the execution. + """ + + def __init__(self, value, attempt_number, has_exception): + self.value = value + self.attempt_number = attempt_number + self.has_exception = has_exception + + def get(self, wrap_exception=False): + """ + Return the return value of this Attempt instance or raise an Exception. + If wrap_exception is true, this Attempt is wrapped inside of a + RetryError before being raised. + """ + if self.has_exception: + if wrap_exception: + raise RetryError(self) + else: + six.reraise(self.value[0], self.value[1], self.value[2]) + else: + return self.value + + def __repr__(self): + if self.has_exception: + return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) + else: + return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) + + +class RetryError(Exception): + """ + A RetryError encapsulates the last Attempt instance right before giving up. + """ + + def __init__(self, last_attempt): + self.last_attempt = last_attempt + + def __str__(self): + return "RetryError[{0}]".format(self.last_attempt) diff --git a/vendor/pip-9.0.3/pip/_vendor/six.py b/vendor/pip-9.0.3/pip/_vendor/six.py new file mode 100644 index 0000000000000000000000000000000000000000..190c0239cd7d7af82a6e0cbc8d68053fa2e3dfaf --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..aaa6b1c6d94a446058d14dc0c27a1f28bd48d6e9 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/__init__.py @@ -0,0 +1,97 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +from __future__ import absolute_import +import warnings + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.22' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/_collections.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/_collections.py new file mode 100644 index 0000000000000000000000000000000000000000..5df2372c4e04fc41fe5142422b06db038c86d372 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/_collections.py @@ -0,0 +1,319 @@ +from __future__ import absolute_import +from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +try: # Python 2.7+ + from collections import OrderedDict +except ImportError: + from .packages.ordered_dict import OrderedDict +from .packages.six import iterkeys, itervalues, PY3 + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + headers = [] + + for line in message.headers: + if line.startswith((' ', '\t')): + key, value = headers[-1] + headers[-1] = (key, value + '\r\n' + line.rstrip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/connection.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/connection.py new file mode 100644 index 0000000000000000000000000000000000000000..c0d832998528fc7d55e85b04ef5ab73109481732 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/connection.py @@ -0,0 +1,373 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import sys +import socket +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 + +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass + + +from .exceptions import ( + NewConnectionError, + ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( + resolve_cert_reqs, + resolve_ssl_version, + assert_fingerprint, + create_urllib3_context, + ssl_wrap_socket +) + + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +# When updating RECENT_DATE, move it to +# within two years of the current date, and no +# earlier than 6 months ago. +RECENT_DATE = datetime.date(2016, 1, 1) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + + .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x + + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address in case we have an older Python like 2.6. + self.source_address = kw.get('source_address') + + if sys.version_info < (2, 7): # Python 2.6 + # _HTTPConnection on Python 2.6 will balk at this keyword arg, but + # not newer versions. We can still use it when creating a + # connection though, so we pop it *after* we have saved it as + # self.source_address. + kw.pop('source_address', None) + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + # Superclass also sets self.source_address in Python 2.7+. + _HTTPConnection.__init__(self, *args, **kw) + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self.host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + # the _tunnel_host attribute was added in python 2.6.3 (via + # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do + # not have them. + if getattr(self, '_tunnel_host', None): + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + skip_host = 'host' in headers + self.putrequest( + method, + url, + skip_accept_encoding=skip_accept_encoding, + skip_host=skip_host + ) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (six.binary_type,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, six.binary_type): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + ssl_version = None + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.ssl_context = ssl_context + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(None), + cert_reqs=resolve_cert_reqs(None), + ) + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ssl_context=self.ssl_context, + ) + + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ssl_version = None + assert_fingerprint = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided, we can try to guess. If the user gave + # us a cert database, we assume they want to use it: otherwise, if + # they gave us an SSL Context object we should use whatever is set for + # it. + if cert_reqs is None: + if ca_certs or ca_cert_dir: + cert_reqs = 'CERT_REQUIRED' + elif self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + + def connect(self): + # Add certificate verification + conn = self._new_conn() + + hostname = self.host + if getattr(self, '_tunnel_host', None): + # _tunnel_host was added in Python 2.6.3 + # (See: http://hg.python.org/cpython/rev/0f57b30a152f) + + self.sock = conn + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + server_hostname=hostname, + ssl_context=context) + + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ + and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/connectionpool.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/connectionpool.py new file mode 100644 index 0000000000000000000000000000000000000000..ec9600f8fa35a55b734db78058497ac570ec8be6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/connectionpool.py @@ -0,0 +1,905 @@ +from __future__ import absolute_import +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, + NewConnectionError, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .packages.six.moves import queue +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url + + +if six.PY2: + # Queue is imported for side effects on MS Windows + import Queue as _unused_module_Queue # noqa: F401 + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = queue.LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host).lower() + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTP connection (%d): %s", + self.num_connections, self.host) + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 2.6 and older, Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, + method, url, http_version, httplib_response.status, + httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + host = _ipv6_host(host).lower() + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, chunked=False, + body_pos=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] <https://github.com/shazow/urllib3/issues/651> + release_this_conn = release_conn + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw['request_method'] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw) + + # Everything went great! + clean_exit = True + + except queue.Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader('Retry-After')) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, + body_pos=body_pos, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + # Python 2.7+ + try: + set_tunnel = conn.set_tunnel + except AttributeError: # Platform-specific: Python 2.6 + set_tunnel = conn._set_tunnel + + if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older + set_tunnel(self._proxy_host, self.port) + else: + set_tunnel(self._proxy_host, self.port, self.proxy_headers) + + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTPS connection (%d): %s", + self.num_connections, self.host) + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _ipv6_host(host): + """ + Process IPv6 address literals + """ + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + # + # Also if an IPv6 address literal has a zone identifier, the + # percent sign might be URIencoded, convert it back into ASCII + if host.startswith('[') and host.endswith(']'): + host = host.replace('%25', '%').strip('[]') + return host diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 0000000000000000000000000000000000000000..bcf41c02b2a3570002f0bb48c610109bba248ab8 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond <will@wbond.net> + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000000000000000000000000000000000000..5e3494bce66b4a2e40fe89e0c5bc90a692b39c37 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,343 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import re +import os +import ssl +import tempfile + +from .bindings import Security, CoreFoundation, CFConst + + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, + CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError('Error copying C string from CFStringRef') + string = buffer.value + if string is not None: + string = string.decode('utf-8') + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u'': + output = u'OSStatus %s' % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + der_certs = [ + base64.b64decode(match.group(1)) + for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b64encode(random_bytes[:8]).decode('utf-8') + password = base64.b64encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/appengine.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/appengine.py new file mode 100644 index 0000000000000000000000000000000000000000..814b0222d9a4c0249c61431f57aaa76326ac963a --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/appengine.py @@ -0,0 +1,296 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + +Example usage:: + + from urllib3 import PoolManager + from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations <https://cloud.google.com/appengine/docs/python/\ +urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + <https://cloud.google.com/appengine/docs/python/sockets/\ + #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import logging +import os +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..packages.six import BytesIO +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True, + urlfetch_retries=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = ( + redirect and + retries.redirect != 0 and + retries.total) + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if (self.urlfetch_retries and retries.raise_on_redirect): + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=http_response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, redirect_url, body, headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader('Retry-After')) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + return HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/ntlmpool.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000000000000000000000000000000000000..642e99ed2d37e41b3d321ab39fdd52a9c8db7d83 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/ntlmpool.py @@ -0,0 +1,112 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +from logging import getLogger +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) + + headers = {} + headers['Connection'] = 'Keep-Alive' + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/pyopenssl.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000000000000000000000000000000000000..f63b84013a37300ed0d1065490767d72829fa69d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -0,0 +1,455 @@ +""" +SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 16.0.0) +* cryptography (minimum 1.3.4, from pyopenssl) +* idna (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + + pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate + +from socket import timeout, error as SocketError +from io import BytesIO + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +from ..packages import six +import sys + +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict( + (v, k) for k, v in _stdlib_to_openssl_verify.items() +) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + _validate_dependencies_met() + + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError("'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer.") + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError("'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer.") + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + """ + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + import idna + + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + + name = idna_encode(name) + if sys.version_info >= (3, 0): + name = name.decode('utf-8') + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class( + x509.SubjectAlternativeName + ).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except (x509.DuplicateExtension, x509.UnsupportedExtension, + x509.UnsupportedGeneralNameType, UnicodeError) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + names = [ + ('DNS', _dnsname_to_stdlib(name)) + for name in ext.get_values_for_type(x509.DNSName) + ] + names.extend( + ('IP Address', str(name)) + for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + rd = util.wait_for_read(self.socket, self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + rd = util.wait_for_read(self.socket, self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + wr = util.wait_for_write(self.socket, self.socket.gettimeout()) + if not wr: + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': get_subj_alt_name(x509) + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify( + _stdlib_to_openssl_verify[value], + _verify_callback + ) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode('utf-8') + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode('utf-8') + if capath is not None: + capath = capath.encode('utf-8') + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_file(certfile) + if password is not None: + self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + rd = util.wait_for_read(sock, sock.gettimeout()) + if not rd: + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/securetransport.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/securetransport.py new file mode 100644 index 0000000000000000000000000000000000000000..2cac70f7f7701760a54e1679b50eb954527b126c --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/securetransport.py @@ -0,0 +1,810 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import threading +import weakref + +from .. import util +from ._securetransport.bindings import ( + Security, SecurityConst, CoreFoundation +) +from ._securetransport.low_level import ( + _assert_no_error, _cert_array_from_pem, _temporary_keychain, + _load_client_cert_chain +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +try: + memoryview(b'') +except NameError: + raise ImportError("SecureTransport only works on Pythons with memoryview") + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this becuase this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +_protocol_to_min_max = { + ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 + ) +if hasattr(ssl, "PROTOCOL_TLS"): + _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + buffer = (ctypes.c_char * requested_length).from_address(data_buffer) + buffer_view = memoryview(buffer) + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + readables = util.wait_for_read([base_socket], timeout) + if not readables: + raise socket.error(errno.EAGAIN, 'timed out') + + # We need to tell ctypes that we have a buffer that can be + # written to. Upsettingly, we do that like this: + chunk_size = base_socket.recv_into( + buffer_view[read_count:requested_length] + ) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + if error == errno.ECONNRESET: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + writables = util.wait_for_write([base_socket], timeout) + if not writables: + raise socket.error(errno.EAGAIN, 'timed out') + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + if error == errno.ECONNRESET: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, 'rb') as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate( + trust, ctypes.byref(trust_result) + ) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/socks.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/socks.py new file mode 100644 index 0000000000000000000000000000000000000000..39e92fde19b1332a7c90f6b6afe2a69601e9a66d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/contrib/socks.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4 +- SOCKS4a +- SOCKS5 +- Usernames and passwords for the SOCKS proxy + +Known Limitations: + +- Currently PySocks does not support contacting remote websites via literal + IPv6 addresses. Any such connection attempt will fail. You must use a domain + name. +- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any + such connection attempt will fail. +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + from ..exceptions import DependencyWarning + + warnings.warn(( + 'SOCKS support in urllib3 requires the installation of optional ' + 'dependencies: specifically, PySocks. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' + ), + DependencyWarning + ) + raise + +from socket import error as SocketError, timeout as SocketTimeout + +from ..connection import ( + HTTPConnection, HTTPSConnection +) +from ..connectionpool import ( + HTTPConnectionPool, HTTPSConnectionPool +) +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop('_socks_options') + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options['socks_version'], + proxy_addr=self._socks_options['proxy_host'], + proxy_port=self._socks_options['proxy_port'], + proxy_username=self._socks_options['username'], + proxy_password=self._socks_options['password'], + proxy_rdns=self._socks_options['rdns'], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout) + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + pool_classes_by_scheme = { + 'http': SOCKSHTTPConnectionPool, + 'https': SOCKSHTTPSConnectionPool, + } + + def __init__(self, proxy_url, username=None, password=None, + num_pools=10, headers=None, **connection_pool_kw): + parsed = parse_url(proxy_url) + + if parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == 'socks5h': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == 'socks4a': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + 'rdns': rdns + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/exceptions.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/exceptions.py new file mode 100644 index 0000000000000000000000000000000000000000..6c4be58106be12223017c6bd3d40fb4144be552d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/exceptions.py @@ -0,0 +1,246 @@ +from __future__ import absolute_import +from .packages.six.moves.http_client import ( + IncompleteRead as httplib_IncompleteRead +) +# Base Exceptions + + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when perfoming security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be httplib.HTTPResponse like (have an fp attribute which + returns raw chunks) for read_chunked(). + """ + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of http_client.IncompleteRead to allow int value + for `partial` to avoid creating large objects on streamed + reads. + """ + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return ('IncompleteRead(%i bytes read, ' + '%i more expected)' % (self.partial, self.expected)) + + +class InvalidHeader(HTTPError): + "The header provided was somehow invalid." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + "urllib3 encountered an error when trying to rewind a body" + pass diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/fields.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/fields.py new file mode 100644 index 0000000000000000000000000000000000000000..19b0ae0c88765ace36378231252cbe4b8be8af56 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/fields.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + if not six.PY3 and isinstance(value, six.text_type): # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) typles or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/filepost.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/filepost.py new file mode 100644 index 0000000000000000000000000000000000000000..cd11cee4644711d7ede77e5c01974f45015b5746 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/filepost.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import +import codecs + +from uuid import uuid4 +from io import BytesIO + +from .packages import six +from .packages.six import b +from .fields import RequestField + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + return uuid4().hex + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`mimetools.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b('--%s\r\n' % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = str('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..170e974c15746c3aa6e960d3c7a53981459a528d --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + +__all__ = ('ssl_match_hostname', ) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/makefile.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/makefile.py new file mode 100644 index 0000000000000000000000000000000000000000..75b80dcf8465cc6d2ce5692eaaa62b60555db60e --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io + +from socket import SocketIO + + +def backport_makefile(self, mode="r", buffering=None, encoding=None, + errors=None, newline=None): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= set(["r", "w", "b"]): + raise ValueError( + "invalid mode %r (only r, w, b allowed)" % (mode,) + ) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ordered_dict.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ordered_dict.py new file mode 100644 index 0000000000000000000000000000000000000000..4479363cc45b5c7e0588072ccc19cab03fecce28 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ordered_dict.py @@ -0,0 +1,259 @@ +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. +# Copyright 2009 Raymond Hettinger, released under the MIT License. +# http://code.activestate.com/recipes/576693/ +try: + from thread import get_ident as _get_ident +except ImportError: + from dummy_thread import get_ident as _get_ident + +try: + from _abcoll import KeysView, ValuesView, ItemsView +except ImportError: + pass + + +class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running={}): + 'od.__repr__() <==> repr(od)' + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/six.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/six.py new file mode 100644 index 0000000000000000000000000000000000000000..190c0239cd7d7af82a6e0cbc8d68053fa2e3dfaf --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d6594eb264d3bbe36b98209d77de55a806817751 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,19 @@ +import sys + +try: + # Our match_hostname function is the same as 3.5's, so we only want to + # import the match_hostname function if it's at least that good. + if sys.version_info < (3, 5): + raise ImportError("Fallback to vendored code") + + from ssl import CertificateError, match_hostname +except ImportError: + try: + # Backport of the function from a pypi module + from backports.ssl_match_hostname import CertificateError, match_hostname + except ImportError: + # Our vendored copy + from ._implementation import CertificateError, match_hostname + +# Not needed, but documenting what we provide. +__all__ = ('CertificateError', 'match_hostname') diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 0000000000000000000000000000000000000000..1fd42f38aec5c0ca639f03d1a900e4e58c22eb1f --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,157 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# backports.ssl_match_hostname to continue to be used all the way back to +# python-2.4. +try: + import ipaddress +except ImportError: + ipaddress = None + +__version__ = '3.5.0.1' + + +class CertificateError(ValueError): + pass + + +def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + +def _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + obj = unicode(obj, encoding='ascii', errors='strict') + return obj + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except ValueError: + # Not an IP address (common case) + host_ip = None + except UnicodeError: + # Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: + raise + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == 'IP Address': + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/poolmanager.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/poolmanager.py new file mode 100644 index 0000000000000000000000000000000000000000..4ae91744dba03897bf1f7c6ea2d7614c8d653841 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/poolmanager.py @@ -0,0 +1,440 @@ +from __future__ import absolute_import +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.url import parse_url +from .util.retry import Retry + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir', 'ssl_context') + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + + if scheme == 'http': + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + if 'headers' not in kw: + kw['headers'] = self.headers + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary contaning headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/request.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/request.py new file mode 100644 index 0000000000000000000000000000000000000000..c0fddff042c3078d71b42aa5c04d8fea96a0f260 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/request.py @@ -0,0 +1,148 @@ +from __future__ import absolute_import + +from .filepost import encode_multipart_formdata +from .packages.six.moves.urllib.parse import urlencode + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplemented("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, headers=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': headers} + extra_kw.update(urlopen_kw) + + if fields: + url += '?' + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimick behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/response.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/response.py new file mode 100644 index 0000000000000000000000000000000000000000..d3e5a1e60105681cc855b05d3dada7ead651e337 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/response.py @@ -0,0 +1,626 @@ +from __future__ import absolute_import +from contextlib import contextmanager +import zlib +import io +import logging +from socket import timeout as SocketTimeout +from socket import error as SocketError + +from ._collections import HTTPHeaderDict +from .exceptions import ( + BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, + ResponseNotChunked, IncompleteRead, InvalidHeader +) +from .packages.six import string_types as basestring, binary_type, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = binary_type() + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + return self._obj.decompress(data) + + +def _get_decoder(mode): + if mode == 'gzip': + return GzipDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, attempts to decode specific content-encoding's based on headers + (like 'gzip' and 'deflate') will be skipped and raw data will be used + instead. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None, + retries=None, enforce_content_length=False, request_method=None): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + + if body and isinstance(body, (basestring, binary_type)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get('content-length') + + if length is not None and self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + + elif length is not None: + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(',')]) + if len(lengths) > 1: + raise InvalidHeader("Content-Length contained multiple " + "unmatching values (%s)" % length) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None and content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + data = None + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in (0, None): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + resp = ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + return resp + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() + elif hasattr(self._fp, 'closed'): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + httplib.HTTPResponse object. We do this by testing for the fp + attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, 'fp') + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be httplib.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks.") + + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + with self._error_catcher(): + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/__init__.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2f2770b62277d59e83a0e696df370759e05a7b5c --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) +from .wait import ( + wait_for_read, + wait_for_write +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', + 'wait_for_read', + 'wait_for_write' +) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/connection.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/connection.py new file mode 100644 index 0000000000000000000000000000000000000000..bf699cfd0e8ba65b2e7a29ddedb3fa273019dbf6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/connection.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import +import socket +from .wait import wait_for_read +from .selectors import HAS_SELECT, SelectorError + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + + if not HAS_SELECT: + return False + + try: + return bool(wait_for_read(sock, timeout=0.0)) + except SelectorError: + return True + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith('['): + host = host.strip('[]') + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """ Returns True if the system can bind an IPv6 address. """ + sock = None + has_ipv6 = False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6('::1') diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/request.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/request.py new file mode 100644 index 0000000000000000000000000000000000000000..3ddfcd559476bacf7d2471ee6f7b20a4b5e4dc0f --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/request.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b, integer_types +from ..exceptions import UnrewindableBodyError + +ACCEPT_ENCODING = 'gzip,deflate' +_FAILEDTELL = object() + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, 'tell', None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, 'seek', None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect/retry.") + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError("Unable to record file position for rewinding " + "request body during a redirect/retry.") + else: + raise ValueError("body_pos must be of type integer, " + "instead it was %s." % type(body_pos)) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/response.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/response.py new file mode 100644 index 0000000000000000000000000000000000000000..67cf730ab0f04881946d6f616aa52e4e3c5a82f6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/response.py @@ -0,0 +1,81 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: # Platform-specific: Python 3. + unparsed_data = get_payload() + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/retry.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/retry.py new file mode 100644 index 0000000000000000000000000000000000000000..c603cb4904c133701e935cf0792431dff13cdfbc --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/retry.py @@ -0,0 +1,401 @@ +from __future__ import absolute_import +import time +import logging +from collections import namedtuple +from itertools import takewhile +import email +import re + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, + InvalidHeader, +) +from ..packages import six + + +log = logging.getLogger(__name__) + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", + "status", "redirect_location"]) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + Set to a ``False`` value to retry on any verb. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``method_whitelist`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ^ ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, raise_on_status=True, + history=None, respect_retry_after_header=True): + + self.total = total + self.connect = connect + self.read = read + self.status = status + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, + reversed(self.history)))) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + retry_date = time.mktime(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """ Get the value of Retry-After in seconds. """ + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """ Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """ Checks if a given HTTP method should be retried upon, depending if + it is included on the method whitelist. + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """ Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return (self.total and self.respect_retry_after_header and + has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + cause = 'unknown' + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + status = response.status + + history = self.history + (RequestHistory(method, url, error, status, redirect_location),) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, status=status_count, + history=history) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/selectors.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/selectors.py new file mode 100644 index 0000000000000000000000000000000000000000..d75cb266bc3d1184c3971955ba8dba8d50d440da --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/selectors.py @@ -0,0 +1,581 @@ +# Backport of selectors.py from Python 3.5+ to support Python < 3.4 +# Also has the behavior specified in PEP 475 which is to retry syscalls +# in the case of an EINTR error. This module is required because selectors34 +# does not follow this behavior and instead returns that no dile descriptor +# events have occurred rather than retry the syscall. The decision to drop +# support for select.devpoll is made to maintain 100% test coverage. + +import errno +import math +import select +import socket +import sys +import time +from collections import namedtuple, Mapping + +try: + monotonic = time.monotonic +except (AttributeError, ImportError): # Python 3.3< + monotonic = time.time + +EVENT_READ = (1 << 0) +EVENT_WRITE = (1 << 1) + +HAS_SELECT = True # Variable that shows whether the platform has a selector. +_SYSCALL_SENTINEL = object() # Sentinel in case a system call returns None. +_DEFAULT_SELECTOR = None + + +class SelectorError(Exception): + def __init__(self, errcode): + super(SelectorError, self).__init__() + self.errno = errcode + + def __repr__(self): + return "<SelectorError errno={0}>".format(self.errno) + + def __str__(self): + return self.__repr__() + + +def _fileobj_to_fd(fileobj): + """ Return a file descriptor from a file object. If + given an integer will simply return that integer back. """ + if isinstance(fileobj, int): + fd = fileobj + else: + try: + fd = int(fileobj.fileno()) + except (AttributeError, TypeError, ValueError): + raise ValueError("Invalid file object: {0!r}".format(fileobj)) + if fd < 0: + raise ValueError("Invalid file descriptor: {0}".format(fd)) + return fd + + +# Determine which function to use to wrap system calls because Python 3.5+ +# already handles the case when system calls are interrupted. +if sys.version_info >= (3, 5): + def _syscall_wrapper(func, _, *args, **kwargs): + """ This is the short-circuit version of the below logic + because in Python 3.5+ all system calls automatically restart + and recalculate their timeouts. """ + try: + return func(*args, **kwargs) + except (OSError, IOError, select.error) as e: + errcode = None + if hasattr(e, "errno"): + errcode = e.errno + raise SelectorError(errcode) +else: + def _syscall_wrapper(func, recalc_timeout, *args, **kwargs): + """ Wrapper function for syscalls that could fail due to EINTR. + All functions should be retried if there is time left in the timeout + in accordance with PEP 475. """ + timeout = kwargs.get("timeout", None) + if timeout is None: + expires = None + recalc_timeout = False + else: + timeout = float(timeout) + if timeout < 0.0: # Timeout less than 0 treated as no timeout. + expires = None + else: + expires = monotonic() + timeout + + args = list(args) + if recalc_timeout and "timeout" not in kwargs: + raise ValueError( + "Timeout must be in args or kwargs to be recalculated") + + result = _SYSCALL_SENTINEL + while result is _SYSCALL_SENTINEL: + try: + result = func(*args, **kwargs) + # OSError is thrown by select.select + # IOError is thrown by select.epoll.poll + # select.error is thrown by select.poll.poll + # Aren't we thankful for Python 3.x rework for exceptions? + except (OSError, IOError, select.error) as e: + # select.error wasn't a subclass of OSError in the past. + errcode = None + if hasattr(e, "errno"): + errcode = e.errno + elif hasattr(e, "args"): + errcode = e.args[0] + + # Also test for the Windows equivalent of EINTR. + is_interrupt = (errcode == errno.EINTR or (hasattr(errno, "WSAEINTR") and + errcode == errno.WSAEINTR)) + + if is_interrupt: + if expires is not None: + current_time = monotonic() + if current_time > expires: + raise OSError(errno=errno.ETIMEDOUT) + if recalc_timeout: + if "timeout" in kwargs: + kwargs["timeout"] = expires - current_time + continue + if errcode: + raise SelectorError(errcode) + else: + raise + return result + + +SelectorKey = namedtuple('SelectorKey', ['fileobj', 'fd', 'events', 'data']) + + +class _SelectorMapping(Mapping): + """ Mapping of file objects to selector keys """ + + def __init__(self, selector): + self._selector = selector + + def __len__(self): + return len(self._selector._fd_to_key) + + def __getitem__(self, fileobj): + try: + fd = self._selector._fileobj_lookup(fileobj) + return self._selector._fd_to_key[fd] + except KeyError: + raise KeyError("{0!r} is not registered.".format(fileobj)) + + def __iter__(self): + return iter(self._selector._fd_to_key) + + +class BaseSelector(object): + """ Abstract Selector class + + A selector supports registering file objects to be monitored + for specific I/O events. + + A file object is a file descriptor or any object with a + `fileno()` method. An arbitrary object can be attached to the + file object which can be used for example to store context info, + a callback, etc. + + A selector can use various implementations (select(), poll(), epoll(), + and kqueue()) depending on the platform. The 'DefaultSelector' class uses + the most efficient implementation for the current platform. + """ + def __init__(self): + # Maps file descriptors to keys. + self._fd_to_key = {} + + # Read-only mapping returned by get_map() + self._map = _SelectorMapping(self) + + def _fileobj_lookup(self, fileobj): + """ Return a file descriptor from a file object. + This wraps _fileobj_to_fd() to do an exhaustive + search in case the object is invalid but we still + have it in our map. Used by unregister() so we can + unregister an object that was previously registered + even if it is closed. It is also used by _SelectorMapping + """ + try: + return _fileobj_to_fd(fileobj) + except ValueError: + + # Search through all our mapped keys. + for key in self._fd_to_key.values(): + if key.fileobj is fileobj: + return key.fd + + # Raise ValueError after all. + raise + + def register(self, fileobj, events, data=None): + """ Register a file object for a set of events to monitor. """ + if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)): + raise ValueError("Invalid events: {0!r}".format(events)) + + key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) + + if key.fd in self._fd_to_key: + raise KeyError("{0!r} (FD {1}) is already registered" + .format(fileobj, key.fd)) + + self._fd_to_key[key.fd] = key + return key + + def unregister(self, fileobj): + """ Unregister a file object from being monitored. """ + try: + key = self._fd_to_key.pop(self._fileobj_lookup(fileobj)) + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + # Getting the fileno of a closed socket on Windows errors with EBADF. + except socket.error as e: # Platform-specific: Windows. + if e.errno != errno.EBADF: + raise + else: + for key in self._fd_to_key.values(): + if key.fileobj is fileobj: + self._fd_to_key.pop(key.fd) + break + else: + raise KeyError("{0!r} is not registered".format(fileobj)) + return key + + def modify(self, fileobj, events, data=None): + """ Change a registered file object monitored events and data. """ + # NOTE: Some subclasses optimize this operation even further. + try: + key = self._fd_to_key[self._fileobj_lookup(fileobj)] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + if events != key.events: + self.unregister(fileobj) + key = self.register(fileobj, events, data) + + elif data != key.data: + # Use a shortcut to update the data. + key = key._replace(data=data) + self._fd_to_key[key.fd] = key + + return key + + def select(self, timeout=None): + """ Perform the actual selection until some monitored file objects + are ready or the timeout expires. """ + raise NotImplementedError() + + def close(self): + """ Close the selector. This must be called to ensure that all + underlying resources are freed. """ + self._fd_to_key.clear() + self._map = None + + def get_key(self, fileobj): + """ Return the key associated with a registered file object. """ + mapping = self.get_map() + if mapping is None: + raise RuntimeError("Selector is closed") + try: + return mapping[fileobj] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + def get_map(self): + """ Return a mapping of file objects to selector keys """ + return self._map + + def _key_from_fd(self, fd): + """ Return the key associated to a given file descriptor + Return None if it is not found. """ + try: + return self._fd_to_key[fd] + except KeyError: + return None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + +# Almost all platforms have select.select() +if hasattr(select, "select"): + class SelectSelector(BaseSelector): + """ Select-based selector. """ + def __init__(self): + super(SelectSelector, self).__init__() + self._readers = set() + self._writers = set() + + def register(self, fileobj, events, data=None): + key = super(SelectSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + self._readers.add(key.fd) + if events & EVENT_WRITE: + self._writers.add(key.fd) + return key + + def unregister(self, fileobj): + key = super(SelectSelector, self).unregister(fileobj) + self._readers.discard(key.fd) + self._writers.discard(key.fd) + return key + + def _select(self, r, w, timeout=None): + """ Wrapper for select.select because timeout is a positional arg """ + return select.select(r, w, [], timeout) + + def select(self, timeout=None): + # Selecting on empty lists on Windows errors out. + if not len(self._readers) and not len(self._writers): + return [] + + timeout = None if timeout is None else max(timeout, 0.0) + ready = [] + r, w, _ = _syscall_wrapper(self._select, True, self._readers, + self._writers, timeout) + r = set(r) + w = set(w) + for fd in r | w: + events = 0 + if fd in r: + events |= EVENT_READ + if fd in w: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + +if hasattr(select, "poll"): + class PollSelector(BaseSelector): + """ Poll-based selector """ + def __init__(self): + super(PollSelector, self).__init__() + self._poll = select.poll() + + def register(self, fileobj, events, data=None): + key = super(PollSelector, self).register(fileobj, events, data) + event_mask = 0 + if events & EVENT_READ: + event_mask |= select.POLLIN + if events & EVENT_WRITE: + event_mask |= select.POLLOUT + self._poll.register(key.fd, event_mask) + return key + + def unregister(self, fileobj): + key = super(PollSelector, self).unregister(fileobj) + self._poll.unregister(key.fd) + return key + + def _wrap_poll(self, timeout=None): + """ Wrapper function for select.poll.poll() so that + _syscall_wrapper can work with only seconds. """ + if timeout is not None: + if timeout <= 0: + timeout = 0 + else: + # select.poll.poll() has a resolution of 1 millisecond, + # round away from zero to wait *at least* timeout seconds. + timeout = math.ceil(timeout * 1e3) + + result = self._poll.poll(timeout) + return result + + def select(self, timeout=None): + ready = [] + fd_events = _syscall_wrapper(self._wrap_poll, True, timeout=timeout) + for fd, event_mask in fd_events: + events = 0 + if event_mask & ~select.POLLIN: + events |= EVENT_WRITE + if event_mask & ~select.POLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + + return ready + + +if hasattr(select, "epoll"): + class EpollSelector(BaseSelector): + """ Epoll-based selector """ + def __init__(self): + super(EpollSelector, self).__init__() + self._epoll = select.epoll() + + def fileno(self): + return self._epoll.fileno() + + def register(self, fileobj, events, data=None): + key = super(EpollSelector, self).register(fileobj, events, data) + events_mask = 0 + if events & EVENT_READ: + events_mask |= select.EPOLLIN + if events & EVENT_WRITE: + events_mask |= select.EPOLLOUT + _syscall_wrapper(self._epoll.register, False, key.fd, events_mask) + return key + + def unregister(self, fileobj): + key = super(EpollSelector, self).unregister(fileobj) + try: + _syscall_wrapper(self._epoll.unregister, False, key.fd) + except SelectorError: + # This can occur when the fd was closed since registry. + pass + return key + + def select(self, timeout=None): + if timeout is not None: + if timeout <= 0: + timeout = 0.0 + else: + # select.epoll.poll() has a resolution of 1 millisecond + # but luckily takes seconds so we don't need a wrapper + # like PollSelector. Just for better rounding. + timeout = math.ceil(timeout * 1e3) * 1e-3 + timeout = float(timeout) + else: + timeout = -1.0 # epoll.poll() must have a float. + + # We always want at least 1 to ensure that select can be called + # with no file descriptors registered. Otherwise will fail. + max_events = max(len(self._fd_to_key), 1) + + ready = [] + fd_events = _syscall_wrapper(self._epoll.poll, True, + timeout=timeout, + maxevents=max_events) + for fd, event_mask in fd_events: + events = 0 + if event_mask & ~select.EPOLLIN: + events |= EVENT_WRITE + if event_mask & ~select.EPOLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + def close(self): + self._epoll.close() + super(EpollSelector, self).close() + + +if hasattr(select, "kqueue"): + class KqueueSelector(BaseSelector): + """ Kqueue / Kevent-based selector """ + def __init__(self): + super(KqueueSelector, self).__init__() + self._kqueue = select.kqueue() + + def fileno(self): + return self._kqueue.fileno() + + def register(self, fileobj, events, data=None): + key = super(KqueueSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + kevent = select.kevent(key.fd, + select.KQ_FILTER_READ, + select.KQ_EV_ADD) + + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + + if events & EVENT_WRITE: + kevent = select.kevent(key.fd, + select.KQ_FILTER_WRITE, + select.KQ_EV_ADD) + + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + + return key + + def unregister(self, fileobj): + key = super(KqueueSelector, self).unregister(fileobj) + if key.events & EVENT_READ: + kevent = select.kevent(key.fd, + select.KQ_FILTER_READ, + select.KQ_EV_DELETE) + try: + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + except SelectorError: + pass + if key.events & EVENT_WRITE: + kevent = select.kevent(key.fd, + select.KQ_FILTER_WRITE, + select.KQ_EV_DELETE) + try: + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + except SelectorError: + pass + + return key + + def select(self, timeout=None): + if timeout is not None: + timeout = max(timeout, 0) + + max_events = len(self._fd_to_key) * 2 + ready_fds = {} + + kevent_list = _syscall_wrapper(self._kqueue.control, True, + None, max_events, timeout) + + for kevent in kevent_list: + fd = kevent.ident + event_mask = kevent.filter + events = 0 + if event_mask == select.KQ_FILTER_READ: + events |= EVENT_READ + if event_mask == select.KQ_FILTER_WRITE: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + if key.fd not in ready_fds: + ready_fds[key.fd] = (key, events & key.events) + else: + old_events = ready_fds[key.fd][1] + ready_fds[key.fd] = (key, (events | old_events) & key.events) + + return list(ready_fds.values()) + + def close(self): + self._kqueue.close() + super(KqueueSelector, self).close() + + +if not hasattr(select, 'select'): # Platform-specific: AppEngine + HAS_SELECT = False + + +def _can_allocate(struct): + """ Checks that select structs can be allocated by the underlying + operating system, not just advertised by the select module. We don't + check select() because we'll be hopeful that most platforms that + don't have it available will not advertise it. (ie: GAE) """ + try: + # select.poll() objects won't fail until used. + if struct == 'poll': + p = select.poll() + p.poll(0) + + # All others will fail on allocation. + else: + getattr(select, struct)().close() + return True + except (OSError, AttributeError) as e: + return False + + +# Choose the best implementation, roughly: +# kqueue == epoll > poll > select. Devpoll not supported. (See above) +# select() also can't accept a FD > FD_SETSIZE (usually around 1024) +def DefaultSelector(): + """ This function serves as a first call for DefaultSelector to + detect if the select module is being monkey-patched incorrectly + by eventlet, greenlet, and preserve proper behavior. """ + global _DEFAULT_SELECTOR + if _DEFAULT_SELECTOR is None: + if _can_allocate('kqueue'): + _DEFAULT_SELECTOR = KqueueSelector + elif _can_allocate('epoll'): + _DEFAULT_SELECTOR = EpollSelector + elif _can_allocate('poll'): + _DEFAULT_SELECTOR = PollSelector + elif hasattr(select, 'select'): + _DEFAULT_SELECTOR = SelectSelector + else: # Platform-specific: AppEngine + raise ValueError('Platform does not have a selector') + return _DEFAULT_SELECTOR() diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/ssl_.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/ssl_.py new file mode 100644 index 0000000000000000000000000000000000000000..32fd9eda8c4631fbc75c01bdd773230a35723ea1 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/ssl_.py @@ -0,0 +1,341 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning + + +SSLContext = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', + 'ECDH+AESGCM', + 'ECDH+CHACHA20', + 'DH+AESGCM', + 'DH+CHACHA20', + 'ECDH+AES256', + 'DH+AES256', + 'ECDH+AES128', + 'DH+AES', + 'RSA+AESGCM', + 'RSA+AES', + '!aNULL', + '!eNULL', + '!MD5', +]) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 & 3.1 + supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or + (3, 2) <= sys.version_info) + + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + if not self.supports_set_ciphers: + raise TypeError( + 'Your version of Python does not support setting ' + 'a custom cipher suite. Please upgrade to Python ' + '2.7, 3.2, or later if you need this functionality.' + ) + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + if self.supports_set_ciphers: # Platform-specific: Python 2.7+ + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + else: # Platform-specific: Python 2.6 + return wrap_socket(socket, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbrevation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. This is not + supported on Python 2.6 as the ssl module does not support it. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + elif getattr(context, 'load_default_certs', None) is not None: + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + if certfile: + context.load_cert_chain(certfile, keyfile) + if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Subject Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + return context.wrap_socket(sock) diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/timeout.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/timeout.py new file mode 100644 index 0000000000000000000000000000000000000000..cec817e6efa53e830cb2b5877faa42013743d5db --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/url.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/url.py new file mode 100644 index 0000000000000000000000000000000000000000..6b6f9968d7a106931ef315066d0ec156a1823112 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/url.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + __slots__ = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + if scheme: + scheme = scheme.lower() + if host and scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. No whitespace, no plus or + # minus prefixes, no non-integer digits such as ^2 (superscript). + if not port.isdigit(): + raise LocationParseError(url) + try: + port = int(port) + except ValueError: + raise LocationParseError(url) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/vendor/pip-9.0.3/pip/_vendor/urllib3/util/wait.py b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/wait.py new file mode 100644 index 0000000000000000000000000000000000000000..cb396e508c8cf26258a00bc55ee1479c53f9682f --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/urllib3/util/wait.py @@ -0,0 +1,40 @@ +from .selectors import ( + HAS_SELECT, + DefaultSelector, + EVENT_READ, + EVENT_WRITE +) + + +def _wait_for_io_events(socks, events, timeout=None): + """ Waits for IO events to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be interacted with immediately. """ + if not HAS_SELECT: + raise ValueError('Platform does not have a selector') + if not isinstance(socks, list): + # Probably just a single socket. + if hasattr(socks, "fileno"): + socks = [socks] + # Otherwise it might be a non-list iterable. + else: + socks = list(socks) + with DefaultSelector() as selector: + for sock in socks: + selector.register(sock, events) + return [key[0].fileobj for key in + selector.select(timeout) if key[1] & events] + + +def wait_for_read(socks, timeout=None): + """ Waits for reading to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be read from immediately. """ + return _wait_for_io_events(socks, EVENT_READ, timeout) + + +def wait_for_write(socks, timeout=None): + """ Waits for writing to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be written to immediately. """ + return _wait_for_io_events(socks, EVENT_WRITE, timeout) diff --git a/vendor/pip-9.0.3/pip/_vendor/vendor.txt b/vendor/pip-9.0.3/pip/_vendor/vendor.txt new file mode 100644 index 0000000000000000000000000000000000000000..6d07f2d1f20c28342d21f71365238e98b6478409 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/vendor.txt @@ -0,0 +1,16 @@ +appdirs==1.4.0 +distlib==0.2.4 +distro==1.0.1 +html5lib==1.0b10 +six==1.10.0 +colorama==0.3.7 +requests==2.11.1 +CacheControl==0.11.7 +lockfile==0.12.2 +ordereddict==1.1 # Only needed on 2.6 +progress==1.2 +ipaddress==1.0.17 # Only needed on 2.6 and 2.7 +packaging==16.8 +pyparsing==2.1.10 +retrying==1.3.3 +webencodings==0.5 diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/__init__.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..03d5d3576290be2b640774b566cedaef1a401ff8 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/__init__.py @@ -0,0 +1,342 @@ +# coding: utf8 +""" + + webencodings + ~~~~~~~~~~~~ + + This is a Python implementation of the `WHATWG Encoding standard + <http://encoding.spec.whatwg.org/>`. See README for details. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + +from .labels import LABELS + + +VERSION = '0.5' + + +# Some names in Encoding are not valid Python aliases. Remap these. +PYTHON_NAMES = { + 'iso-8859-8-i': 'iso-8859-8', + 'x-mac-cyrillic': 'mac-cyrillic', + 'macintosh': 'mac-roman', + 'windows-874': 'cp874'} + +CACHE = {} + + +def ascii_lower(string): + r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. + + :param string: An Unicode string. + :returns: A new Unicode string. + + This is used for `ASCII case-insensitive + <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_ + matching of encoding labels. + The same matching is also used, among other things, + for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_. + + This is different from the :meth:`~py:str.lower` method of Unicode strings + which also affect non-ASCII characters, + sometimes mapping them into the ASCII range: + + >>> keyword = u'Bac\N{KELVIN SIGN}ground' + >>> assert keyword.lower() == u'background' + >>> assert ascii_lower(keyword) != keyword.lower() + >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' + + """ + # This turns out to be faster than unicode.translate() + return string.encode('utf8').lower().decode('utf8') + + +def lookup(label): + """ + Look for an encoding by its label. + This is the spec’s `get an encoding + <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm. + Supported labels are listed there. + + :param label: A string. + :returns: + An :class:`Encoding` object, or :obj:`None` for an unknown label. + + """ + # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. + label = ascii_lower(label.strip('\t\n\f\r ')) + name = LABELS.get(label) + if name is None: + return None + encoding = CACHE.get(name) + if encoding is None: + if name == 'x-user-defined': + from .x_user_defined import codec_info + else: + python_name = PYTHON_NAMES.get(name, name) + # Any python_name value that gets to here should be valid. + codec_info = codecs.lookup(python_name) + encoding = Encoding(name, codec_info) + CACHE[name] = encoding + return encoding + + +def _get_encoding(encoding_or_label): + """ + Accept either an encoding object or label. + + :param encoding: An :class:`Encoding` object or a label string. + :returns: An :class:`Encoding` object. + :raises: :exc:`~exceptions.LookupError` for an unknown label. + + """ + if hasattr(encoding_or_label, 'codec_info'): + return encoding_or_label + + encoding = lookup(encoding_or_label) + if encoding is None: + raise LookupError('Unknown encoding label: %r' % encoding_or_label) + return encoding + + +class Encoding(object): + """Reresents a character encoding such as UTF-8, + that can be used for decoding or encoding. + + .. attribute:: name + + Canonical name of the encoding + + .. attribute:: codec_info + + The actual implementation of the encoding, + a stdlib :class:`~codecs.CodecInfo` object. + See :func:`codecs.register`. + + """ + def __init__(self, name, codec_info): + self.name = name + self.codec_info = codec_info + + def __repr__(self): + return '<Encoding %s>' % self.name + + +#: The UTF-8 encoding. Should be used for new content and formats. +UTF8 = lookup('utf-8') + +_UTF16LE = lookup('utf-16le') +_UTF16BE = lookup('utf-16be') + + +def decode(input, fallback_encoding, errors='replace'): + """ + Decode a single string. + + :param input: A byte string + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: + A ``(output, encoding)`` tuple of an Unicode string + and an :obj:`Encoding`. + + """ + # Fail early if `encoding` is an invalid label. + fallback_encoding = _get_encoding(fallback_encoding) + bom_encoding, input = _detect_bom(input) + encoding = bom_encoding or fallback_encoding + return encoding.codec_info.decode(input, errors)[0], encoding + + +def _detect_bom(input): + """Return (bom_encoding, input), with any BOM removed from the input.""" + if input.startswith(b'\xFF\xFE'): + return _UTF16LE, input[2:] + if input.startswith(b'\xFE\xFF'): + return _UTF16BE, input[2:] + if input.startswith(b'\xEF\xBB\xBF'): + return UTF8, input[3:] + return None, input + + +def encode(input, encoding=UTF8, errors='strict'): + """ + Encode a single string. + + :param input: An Unicode string. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: A byte string. + + """ + return _get_encoding(encoding).codec_info.encode(input, errors)[0] + + +def iter_decode(input, fallback_encoding, errors='replace'): + """ + "Pull"-based decoder. + + :param input: + An iterable of byte strings. + + The input is first consumed just enough to determine the encoding + based on the precense of a BOM, + then consumed on demand when the return value is. + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: + An ``(output, encoding)`` tuple. + :obj:`output` is an iterable of Unicode strings, + :obj:`encoding` is the :obj:`Encoding` that is being used. + + """ + + decoder = IncrementalDecoder(fallback_encoding, errors) + generator = _iter_decode_generator(input, decoder) + encoding = next(generator) + return generator, encoding + + +def _iter_decode_generator(input, decoder): + """Return a generator that first yields the :obj:`Encoding`, + then yields output chukns as Unicode strings. + + """ + decode = decoder.decode + input = iter(input) + for chunck in input: + output = decode(chunck) + if output: + assert decoder.encoding is not None + yield decoder.encoding + yield output + break + else: + # Input exhausted without determining the encoding + output = decode(b'', final=True) + assert decoder.encoding is not None + yield decoder.encoding + if output: + yield output + return + + for chunck in input: + output = decode(chunck) + if output: + yield output + output = decode(b'', final=True) + if output: + yield output + + +def iter_encode(input, encoding=UTF8, errors='strict'): + """ + “Pullâ€-based encoder. + + :param input: An iterable of Unicode strings. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: An iterable of byte strings. + + """ + # Fail early if `encoding` is an invalid label. + encode = IncrementalEncoder(encoding, errors).encode + return _iter_encode_generator(input, encode) + + +def _iter_encode_generator(input, encode): + for chunck in input: + output = encode(chunck) + if output: + yield output + output = encode('', final=True) + if output: + yield output + + +class IncrementalDecoder(object): + """ + “Pushâ€-based decoder. + + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + """ + def __init__(self, fallback_encoding, errors='replace'): + # Fail early if `encoding` is an invalid label. + self._fallback_encoding = _get_encoding(fallback_encoding) + self._errors = errors + self._buffer = b'' + self._decoder = None + #: The actual :class:`Encoding` that is being used, + #: or :obj:`None` if that is not determined yet. + #: (Ie. if there is not enough input yet to determine + #: if there is a BOM.) + self.encoding = None # Not known yet. + + def decode(self, input, final=False): + """Decode one chunk of the input. + + :param input: A byte string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: An Unicode string. + + """ + decoder = self._decoder + if decoder is not None: + return decoder(input, final) + + input = self._buffer + input + encoding, input = _detect_bom(input) + if encoding is None: + if len(input) < 3 and not final: # Not enough data yet. + self._buffer = input + return '' + else: # No BOM + encoding = self._fallback_encoding + decoder = encoding.codec_info.incrementaldecoder(self._errors).decode + self._decoder = decoder + self.encoding = encoding + return decoder(input, final) + + +class IncrementalEncoder(object): + """ + “Pushâ€-based encoder. + + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + .. method:: encode(input, final=False) + + :param input: An Unicode string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: A byte string. + + """ + def __init__(self, encoding=UTF8, errors='strict'): + encoding = _get_encoding(encoding) + self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/labels.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/labels.py new file mode 100644 index 0000000000000000000000000000000000000000..29cbf91ef79b89971e51db9ddfc3720d8b4db82a --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/labels.py @@ -0,0 +1,231 @@ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { + 'unicode-1-1-utf-8': 'utf-8', + 'utf-8': 'utf-8', + 'utf8': 'utf-8', + '866': 'ibm866', + 'cp866': 'ibm866', + 'csibm866': 'ibm866', + 'ibm866': 'ibm866', + 'csisolatin2': 'iso-8859-2', + 'iso-8859-2': 'iso-8859-2', + 'iso-ir-101': 'iso-8859-2', + 'iso8859-2': 'iso-8859-2', + 'iso88592': 'iso-8859-2', + 'iso_8859-2': 'iso-8859-2', + 'iso_8859-2:1987': 'iso-8859-2', + 'l2': 'iso-8859-2', + 'latin2': 'iso-8859-2', + 'csisolatin3': 'iso-8859-3', + 'iso-8859-3': 'iso-8859-3', + 'iso-ir-109': 'iso-8859-3', + 'iso8859-3': 'iso-8859-3', + 'iso88593': 'iso-8859-3', + 'iso_8859-3': 'iso-8859-3', + 'iso_8859-3:1988': 'iso-8859-3', + 'l3': 'iso-8859-3', + 'latin3': 'iso-8859-3', + 'csisolatin4': 'iso-8859-4', + 'iso-8859-4': 'iso-8859-4', + 'iso-ir-110': 'iso-8859-4', + 'iso8859-4': 'iso-8859-4', + 'iso88594': 'iso-8859-4', + 'iso_8859-4': 'iso-8859-4', + 'iso_8859-4:1988': 'iso-8859-4', + 'l4': 'iso-8859-4', + 'latin4': 'iso-8859-4', + 'csisolatincyrillic': 'iso-8859-5', + 'cyrillic': 'iso-8859-5', + 'iso-8859-5': 'iso-8859-5', + 'iso-ir-144': 'iso-8859-5', + 'iso8859-5': 'iso-8859-5', + 'iso88595': 'iso-8859-5', + 'iso_8859-5': 'iso-8859-5', + 'iso_8859-5:1988': 'iso-8859-5', + 'arabic': 'iso-8859-6', + 'asmo-708': 'iso-8859-6', + 'csiso88596e': 'iso-8859-6', + 'csiso88596i': 'iso-8859-6', + 'csisolatinarabic': 'iso-8859-6', + 'ecma-114': 'iso-8859-6', + 'iso-8859-6': 'iso-8859-6', + 'iso-8859-6-e': 'iso-8859-6', + 'iso-8859-6-i': 'iso-8859-6', + 'iso-ir-127': 'iso-8859-6', + 'iso8859-6': 'iso-8859-6', + 'iso88596': 'iso-8859-6', + 'iso_8859-6': 'iso-8859-6', + 'iso_8859-6:1987': 'iso-8859-6', + 'csisolatingreek': 'iso-8859-7', + 'ecma-118': 'iso-8859-7', + 'elot_928': 'iso-8859-7', + 'greek': 'iso-8859-7', + 'greek8': 'iso-8859-7', + 'iso-8859-7': 'iso-8859-7', + 'iso-ir-126': 'iso-8859-7', + 'iso8859-7': 'iso-8859-7', + 'iso88597': 'iso-8859-7', + 'iso_8859-7': 'iso-8859-7', + 'iso_8859-7:1987': 'iso-8859-7', + 'sun_eu_greek': 'iso-8859-7', + 'csiso88598e': 'iso-8859-8', + 'csisolatinhebrew': 'iso-8859-8', + 'hebrew': 'iso-8859-8', + 'iso-8859-8': 'iso-8859-8', + 'iso-8859-8-e': 'iso-8859-8', + 'iso-ir-138': 'iso-8859-8', + 'iso8859-8': 'iso-8859-8', + 'iso88598': 'iso-8859-8', + 'iso_8859-8': 'iso-8859-8', + 'iso_8859-8:1988': 'iso-8859-8', + 'visual': 'iso-8859-8', + 'csiso88598i': 'iso-8859-8-i', + 'iso-8859-8-i': 'iso-8859-8-i', + 'logical': 'iso-8859-8-i', + 'csisolatin6': 'iso-8859-10', + 'iso-8859-10': 'iso-8859-10', + 'iso-ir-157': 'iso-8859-10', + 'iso8859-10': 'iso-8859-10', + 'iso885910': 'iso-8859-10', + 'l6': 'iso-8859-10', + 'latin6': 'iso-8859-10', + 'iso-8859-13': 'iso-8859-13', + 'iso8859-13': 'iso-8859-13', + 'iso885913': 'iso-8859-13', + 'iso-8859-14': 'iso-8859-14', + 'iso8859-14': 'iso-8859-14', + 'iso885914': 'iso-8859-14', + 'csisolatin9': 'iso-8859-15', + 'iso-8859-15': 'iso-8859-15', + 'iso8859-15': 'iso-8859-15', + 'iso885915': 'iso-8859-15', + 'iso_8859-15': 'iso-8859-15', + 'l9': 'iso-8859-15', + 'iso-8859-16': 'iso-8859-16', + 'cskoi8r': 'koi8-r', + 'koi': 'koi8-r', + 'koi8': 'koi8-r', + 'koi8-r': 'koi8-r', + 'koi8_r': 'koi8-r', + 'koi8-u': 'koi8-u', + 'csmacintosh': 'macintosh', + 'mac': 'macintosh', + 'macintosh': 'macintosh', + 'x-mac-roman': 'macintosh', + 'dos-874': 'windows-874', + 'iso-8859-11': 'windows-874', + 'iso8859-11': 'windows-874', + 'iso885911': 'windows-874', + 'tis-620': 'windows-874', + 'windows-874': 'windows-874', + 'cp1250': 'windows-1250', + 'windows-1250': 'windows-1250', + 'x-cp1250': 'windows-1250', + 'cp1251': 'windows-1251', + 'windows-1251': 'windows-1251', + 'x-cp1251': 'windows-1251', + 'ansi_x3.4-1968': 'windows-1252', + 'ascii': 'windows-1252', + 'cp1252': 'windows-1252', + 'cp819': 'windows-1252', + 'csisolatin1': 'windows-1252', + 'ibm819': 'windows-1252', + 'iso-8859-1': 'windows-1252', + 'iso-ir-100': 'windows-1252', + 'iso8859-1': 'windows-1252', + 'iso88591': 'windows-1252', + 'iso_8859-1': 'windows-1252', + 'iso_8859-1:1987': 'windows-1252', + 'l1': 'windows-1252', + 'latin1': 'windows-1252', + 'us-ascii': 'windows-1252', + 'windows-1252': 'windows-1252', + 'x-cp1252': 'windows-1252', + 'cp1253': 'windows-1253', + 'windows-1253': 'windows-1253', + 'x-cp1253': 'windows-1253', + 'cp1254': 'windows-1254', + 'csisolatin5': 'windows-1254', + 'iso-8859-9': 'windows-1254', + 'iso-ir-148': 'windows-1254', + 'iso8859-9': 'windows-1254', + 'iso88599': 'windows-1254', + 'iso_8859-9': 'windows-1254', + 'iso_8859-9:1989': 'windows-1254', + 'l5': 'windows-1254', + 'latin5': 'windows-1254', + 'windows-1254': 'windows-1254', + 'x-cp1254': 'windows-1254', + 'cp1255': 'windows-1255', + 'windows-1255': 'windows-1255', + 'x-cp1255': 'windows-1255', + 'cp1256': 'windows-1256', + 'windows-1256': 'windows-1256', + 'x-cp1256': 'windows-1256', + 'cp1257': 'windows-1257', + 'windows-1257': 'windows-1257', + 'x-cp1257': 'windows-1257', + 'cp1258': 'windows-1258', + 'windows-1258': 'windows-1258', + 'x-cp1258': 'windows-1258', + 'x-mac-cyrillic': 'x-mac-cyrillic', + 'x-mac-ukrainian': 'x-mac-cyrillic', + 'chinese': 'gbk', + 'csgb2312': 'gbk', + 'csiso58gb231280': 'gbk', + 'gb2312': 'gbk', + 'gb_2312': 'gbk', + 'gb_2312-80': 'gbk', + 'gbk': 'gbk', + 'iso-ir-58': 'gbk', + 'x-gbk': 'gbk', + 'gb18030': 'gb18030', + 'hz-gb-2312': 'hz-gb-2312', + 'big5': 'big5', + 'big5-hkscs': 'big5', + 'cn-big5': 'big5', + 'csbig5': 'big5', + 'x-x-big5': 'big5', + 'cseucpkdfmtjapanese': 'euc-jp', + 'euc-jp': 'euc-jp', + 'x-euc-jp': 'euc-jp', + 'csiso2022jp': 'iso-2022-jp', + 'iso-2022-jp': 'iso-2022-jp', + 'csshiftjis': 'shift_jis', + 'ms_kanji': 'shift_jis', + 'shift-jis': 'shift_jis', + 'shift_jis': 'shift_jis', + 'sjis': 'shift_jis', + 'windows-31j': 'shift_jis', + 'x-sjis': 'shift_jis', + 'cseuckr': 'euc-kr', + 'csksc56011987': 'euc-kr', + 'euc-kr': 'euc-kr', + 'iso-ir-149': 'euc-kr', + 'korean': 'euc-kr', + 'ks_c_5601-1987': 'euc-kr', + 'ks_c_5601-1989': 'euc-kr', + 'ksc5601': 'euc-kr', + 'ksc_5601': 'euc-kr', + 'windows-949': 'euc-kr', + 'csiso2022kr': 'iso-2022-kr', + 'iso-2022-kr': 'iso-2022-kr', + 'utf-16be': 'utf-16be', + 'utf-16': 'utf-16le', + 'utf-16le': 'utf-16le', + 'x-user-defined': 'x-user-defined', +} diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/mklabels.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/mklabels.py new file mode 100644 index 0000000000000000000000000000000000000000..295dc928ba71fc00caa52708ac70097abe6dc3e4 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/mklabels.py @@ -0,0 +1,59 @@ +""" + + webencodings.mklabels + ~~~~~~~~~~~~~~~~~~~~~ + + Regenarate the webencodings.labels module. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +import json +try: + from urllib import urlopen +except ImportError: + from urllib.request import urlopen + + +def assert_lower(string): + assert string == string.lower() + return string + + +def generate(url): + parts = ['''\ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { +'''] + labels = [ + (repr(assert_lower(label)).lstrip('u'), + repr(encoding['name']).lstrip('u')) + for category in json.loads(urlopen(url).read().decode('ascii')) + for encoding in category['encodings'] + for label in encoding['labels']] + max_len = max(len(label) for label, name in labels) + parts.extend( + ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name) + for label, name in labels) + parts.append('}') + return ''.join(parts) + + +if __name__ == '__main__': + print(generate('http://encoding.spec.whatwg.org/encodings.json')) diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/tests.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..b8c5653ec1f07d39a7148cdfdafdebf83a9063c9 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/tests.py @@ -0,0 +1,153 @@ +# coding: utf8 +""" + + webencodings.tests + ~~~~~~~~~~~~~~~~~~ + + A basic test suite for Encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, + IncrementalDecoder, IncrementalEncoder, UTF8) + + +def assert_raises(exception, function, *args, **kwargs): + try: + function(*args, **kwargs) + except exception: + return + else: # pragma: no cover + raise AssertionError('Did not raise %s.' % exception) + + +def test_labels(): + assert lookup('utf-8').name == 'utf-8' + assert lookup('Utf-8').name == 'utf-8' + assert lookup('UTF-8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8 ').name == 'utf-8' + assert lookup(' \r\nutf8\t').name == 'utf-8' + assert lookup('u8') is None # Python label. + assert lookup('utf-8 ') is None # Non-ASCII white space. + + assert lookup('US-ASCII').name == 'windows-1252' + assert lookup('iso-8859-1').name == 'windows-1252' + assert lookup('latin1').name == 'windows-1252' + assert lookup('LATIN1').name == 'windows-1252' + assert lookup('latin-1') is None + assert lookup('LATİN1') is None # ASCII-only case insensitivity. + + +def test_all_labels(): + for label in LABELS: + assert decode(b'', label) == ('', lookup(label)) + assert encode('', label) == b'' + for repeat in [0, 1, 12]: + output, _ = iter_decode([b''] * repeat, label) + assert list(output) == [] + assert list(iter_encode([''] * repeat, label)) == [] + decoder = IncrementalDecoder(label) + assert decoder.decode(b'') == '' + assert decoder.decode(b'', final=True) == '' + encoder = IncrementalEncoder(label) + assert encoder.encode('') == b'' + assert encoder.encode('', final=True) == b'' + # All encoding names are valid labels too: + for name in set(LABELS.values()): + assert lookup(name).name == name + + +def test_invalid_label(): + assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') + assert_raises(LookupError, encode, 'é', 'invalid') + assert_raises(LookupError, iter_decode, [], 'invalid') + assert_raises(LookupError, iter_encode, [], 'invalid') + assert_raises(LookupError, IncrementalDecoder, 'invalid') + assert_raises(LookupError, IncrementalEncoder, 'invalid') + + +def test_decode(): + assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) + assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) + assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) + assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM + + assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM + assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM + assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) + assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) + + assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) + assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) + assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) + + assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) + assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) + assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) + + +def test_encode(): + assert encode('é', 'latin1') == b'\xe9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf-16') == b'\xe9\x00' + assert encode('é', 'utf-16le') == b'\xe9\x00' + assert encode('é', 'utf-16be') == b'\x00\xe9' + + +def test_iter_decode(): + def iter_decode_to_string(input, fallback_encoding): + output, _encoding = iter_decode(input, fallback_encoding) + return ''.join(output) + assert iter_decode_to_string([], 'latin1') == '' + assert iter_decode_to_string([b''], 'latin1') == '' + assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' + assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' + assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' + assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' + assert iter_decode_to_string([ + b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' + assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' + assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' + + +def test_iter_encode(): + assert b''.join(iter_encode([], 'latin1')) == b'' + assert b''.join(iter_encode([''], 'latin1')) == b'' + assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' + assert b''.join(iter_encode([ + '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' + + +def test_x_user_defined(): + encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' + decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' + encoded = b'aa' + decoded = 'aa' + assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) + assert encode(decoded, 'x-user-defined') == encoded diff --git a/vendor/pip-9.0.3/pip/_vendor/webencodings/x_user_defined.py b/vendor/pip-9.0.3/pip/_vendor/webencodings/x_user_defined.py new file mode 100644 index 0000000000000000000000000000000000000000..f0daa11a761f78c918fb05daa3d8e801f156cd72 --- /dev/null +++ b/vendor/pip-9.0.3/pip/_vendor/webencodings/x_user_defined.py @@ -0,0 +1,325 @@ +# coding: utf8 +""" + + webencodings.x_user_defined + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + An implementation of the x-user-defined encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + return codecs.charmap_encode(input, errors, encoding_table) + + def decode(self, input, errors='strict'): + return codecs.charmap_decode(input, errors, decoding_table) + + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, encoding_table)[0] + + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, decoding_table)[0] + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +### encodings module API + +codec_info = codecs.CodecInfo( + name='x-user-defined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, +) + + +### Decoding Table + +# Python 3: +# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700)) +decoding_table = ( + '\x00' + '\x01' + '\x02' + '\x03' + '\x04' + '\x05' + '\x06' + '\x07' + '\x08' + '\t' + '\n' + '\x0b' + '\x0c' + '\r' + '\x0e' + '\x0f' + '\x10' + '\x11' + '\x12' + '\x13' + '\x14' + '\x15' + '\x16' + '\x17' + '\x18' + '\x19' + '\x1a' + '\x1b' + '\x1c' + '\x1d' + '\x1e' + '\x1f' + ' ' + '!' + '"' + '#' + '$' + '%' + '&' + "'" + '(' + ')' + '*' + '+' + ',' + '-' + '.' + '/' + '0' + '1' + '2' + '3' + '4' + '5' + '6' + '7' + '8' + '9' + ':' + ';' + '<' + '=' + '>' + '?' + '@' + 'A' + 'B' + 'C' + 'D' + 'E' + 'F' + 'G' + 'H' + 'I' + 'J' + 'K' + 'L' + 'M' + 'N' + 'O' + 'P' + 'Q' + 'R' + 'S' + 'T' + 'U' + 'V' + 'W' + 'X' + 'Y' + 'Z' + '[' + '\\' + ']' + '^' + '_' + '`' + 'a' + 'b' + 'c' + 'd' + 'e' + 'f' + 'g' + 'h' + 'i' + 'j' + 'k' + 'l' + 'm' + 'n' + 'o' + 'p' + 'q' + 'r' + 's' + 't' + 'u' + 'v' + 'w' + 'x' + 'y' + 'z' + '{' + '|' + '}' + '~' + '\x7f' + '\uf780' + '\uf781' + '\uf782' + '\uf783' + '\uf784' + '\uf785' + '\uf786' + '\uf787' + '\uf788' + '\uf789' + '\uf78a' + '\uf78b' + '\uf78c' + '\uf78d' + '\uf78e' + '\uf78f' + '\uf790' + '\uf791' + '\uf792' + '\uf793' + '\uf794' + '\uf795' + '\uf796' + '\uf797' + '\uf798' + '\uf799' + '\uf79a' + '\uf79b' + '\uf79c' + '\uf79d' + '\uf79e' + '\uf79f' + '\uf7a0' + '\uf7a1' + '\uf7a2' + '\uf7a3' + '\uf7a4' + '\uf7a5' + '\uf7a6' + '\uf7a7' + '\uf7a8' + '\uf7a9' + '\uf7aa' + '\uf7ab' + '\uf7ac' + '\uf7ad' + '\uf7ae' + '\uf7af' + '\uf7b0' + '\uf7b1' + '\uf7b2' + '\uf7b3' + '\uf7b4' + '\uf7b5' + '\uf7b6' + '\uf7b7' + '\uf7b8' + '\uf7b9' + '\uf7ba' + '\uf7bb' + '\uf7bc' + '\uf7bd' + '\uf7be' + '\uf7bf' + '\uf7c0' + '\uf7c1' + '\uf7c2' + '\uf7c3' + '\uf7c4' + '\uf7c5' + '\uf7c6' + '\uf7c7' + '\uf7c8' + '\uf7c9' + '\uf7ca' + '\uf7cb' + '\uf7cc' + '\uf7cd' + '\uf7ce' + '\uf7cf' + '\uf7d0' + '\uf7d1' + '\uf7d2' + '\uf7d3' + '\uf7d4' + '\uf7d5' + '\uf7d6' + '\uf7d7' + '\uf7d8' + '\uf7d9' + '\uf7da' + '\uf7db' + '\uf7dc' + '\uf7dd' + '\uf7de' + '\uf7df' + '\uf7e0' + '\uf7e1' + '\uf7e2' + '\uf7e3' + '\uf7e4' + '\uf7e5' + '\uf7e6' + '\uf7e7' + '\uf7e8' + '\uf7e9' + '\uf7ea' + '\uf7eb' + '\uf7ec' + '\uf7ed' + '\uf7ee' + '\uf7ef' + '\uf7f0' + '\uf7f1' + '\uf7f2' + '\uf7f3' + '\uf7f4' + '\uf7f5' + '\uf7f6' + '\uf7f7' + '\uf7f8' + '\uf7f9' + '\uf7fa' + '\uf7fb' + '\uf7fc' + '\uf7fd' + '\uf7fe' + '\uf7ff' +) + +### Encoding table +encoding_table = codecs.charmap_build(decoding_table) diff --git a/vendor/pip-9.0.3/pip/basecommand.py b/vendor/pip-9.0.3/pip/basecommand.py new file mode 100644 index 0000000000000000000000000000000000000000..54c67067204e72af095e29c8b44c0c56fd591142 --- /dev/null +++ b/vendor/pip-9.0.3/pip/basecommand.py @@ -0,0 +1,337 @@ +"""Base Command class, and related routines""" +from __future__ import absolute_import + +import logging +import os +import sys +import optparse +import warnings + +from pip import cmdoptions +from pip.index import PackageFinder +from pip.locations import running_under_virtualenv +from pip.download import PipSession +from pip.exceptions import (BadCommand, InstallationError, UninstallationError, + CommandError, PreviousBuildDirError) + +from pip.compat import logging_dictConfig +from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip.req import InstallRequirement, parse_requirements +from pip.status_codes import ( + SUCCESS, ERROR, UNKNOWN_ERROR, VIRTUALENV_NOT_FOUND, + PREVIOUS_BUILD_DIR_ERROR, +) +from pip.utils import deprecation, get_prog, normalize_path +from pip.utils.logging import IndentingFormatter +from pip.utils.outdated import pip_version_check + + +__all__ = ['Command'] + + +logger = logging.getLogger(__name__) + + +class Command(object): + name = None + usage = None + hidden = False + log_streams = ("ext://sys.stdout", "ext://sys.stderr") + + def __init__(self, isolated=False): + parser_kw = { + 'usage': self.usage, + 'prog': '%s %s' % (get_prog(), self.name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': self.name, + 'description': self.__doc__, + 'isolated': isolated, + } + + self.parser = ConfigOptionParser(**parser_kw) + + # Commands should add options to this option group + optgroup_name = '%s Options' % self.name.capitalize() + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + def _build_session(self, options, retries=None, timeout=None): + session = PipSession( + cache=( + normalize_path(os.path.join(options.cache_dir, "http")) + if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + insecure_hosts=options.trusted_hosts, + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = ( + timeout if timeout is not None else options.timeout + ) + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + + return session + + def parse_args(self, args): + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + options, args = self.parse_args(args) + + if options.quiet: + if options.quiet == 1: + level = "WARNING" + if options.quiet == 2: + level = "ERROR" + else: + level = "CRITICAL" + elif options.verbose: + level = "DEBUG" + else: + level = "INFO" + + # The root logger should match the "console" level *unless* we + # specified "--log" to send debug logs to a file. + root_level = level + if options.log: + root_level = "DEBUG" + + logging_dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + }, + "handlers": { + "console": { + "level": level, + "class": "pip.utils.logging.ColorizedStreamHandler", + "stream": self.log_streams[0], + "filters": ["exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": "pip.utils.logging.ColorizedStreamHandler", + "stream": self.log_streams[1], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": "pip.utils.logging.BetterRotatingFileHandler", + "filename": options.log or "/dev/null", + "delay": True, + "formatter": "indent", + }, + }, + "root": { + "level": root_level, + "handlers": list(filter(None, [ + "console", + "console_errors", + "user_log" if options.log else None, + ])), + }, + # Disable any logging besides WARNING unless we have DEBUG level + # logging enabled. These use both pip._vendor and the bare names + # for the case where someone unbundles our libraries. + "loggers": dict( + ( + name, + { + "level": ( + "WARNING" + if level in ["INFO", "ERROR"] + else "DEBUG" + ), + }, + ) + for name in ["pip._vendor", "distlib", "requests", "urllib3"] + ), + }) + + if sys.version_info[:2] == (2, 6): + warnings.warn( + "Python 2.6 is no longer supported by the Python core team, " + "please upgrade your Python. A future version of pip will " + "drop support for Python 2.6", + deprecation.Python26DeprecationWarning + ) + + # TODO: try to get these passing down from the command? + # without resorting to os.environ to hold these. + + if options.no_input: + os.environ['PIP_NO_INPUT'] = '1' + + if options.exists_action: + os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) + + if options.require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical( + 'Could not find an activated virtualenv (required).' + ) + sys.exit(VIRTUALENV_NOT_FOUND) + + try: + status = self.run(options, args) + # FIXME: all commands should return an exit status + # and when it is done, isinstance is not needed anymore + if isinstance(status, int): + return status + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except (InstallationError, UninstallationError, BadCommand) as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical('ERROR: %s', exc) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except KeyboardInterrupt: + logger.critical('Operation cancelled by user') + logger.debug('Exception information:', exc_info=True) + + return ERROR + except: + logger.critical('Exception:', exc_info=True) + + return UNKNOWN_ERROR + finally: + # Check if we're using the latest version of pip available + if (not options.disable_pip_version_check and not + getattr(options, "no_index", False)): + with self._build_session( + options, + retries=0, + timeout=min(5, options.timeout)) as session: + pip_version_check(session) + + return SUCCESS + + +class RequirementCommand(Command): + + @staticmethod + def populate_requirement_set(requirement_set, args, options, finder, + session, name, wheel_cache): + """ + Marshal cmd line args into a requirement set. + """ + for filename in options.constraints: + for req in parse_requirements( + filename, + constraint=True, finder=finder, options=options, + session=session, wheel_cache=wheel_cache): + requirement_set.add_requirement(req) + + for req in args: + requirement_set.add_requirement( + InstallRequirement.from_line( + req, None, isolated=options.isolated_mode, + wheel_cache=wheel_cache + ) + ) + + for req in options.editables: + requirement_set.add_requirement( + InstallRequirement.from_editable( + req, + default_vcs=options.default_vcs, + isolated=options.isolated_mode, + wheel_cache=wheel_cache + ) + ) + + found_req_in_file = False + for filename in options.requirements: + for req in parse_requirements( + filename, + finder=finder, options=options, session=session, + wheel_cache=wheel_cache): + found_req_in_file = True + requirement_set.add_requirement(req) + # If --require-hashes was a line in a requirements file, tell + # RequirementSet about it: + requirement_set.require_hashes = options.require_hashes + + if not (args or options.editables or found_req_in_file): + opts = {'name': name} + if options.find_links: + msg = ('You must give at least one requirement to ' + '%(name)s (maybe you meant "pip %(name)s ' + '%(links)s"?)' % + dict(opts, links=' '.join(options.find_links))) + else: + msg = ('You must give at least one requirement ' + 'to %(name)s (see "pip help %(name)s")' % opts) + logger.warning(msg) + + def _build_package_finder(self, options, session, + platform=None, python_versions=None, + abi=None, implementation=None): + """ + Create a package finder appropriate to this requirement command. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + return PackageFinder( + find_links=options.find_links, + format_control=options.format_control, + index_urls=index_urls, + trusted_hosts=options.trusted_hosts, + allow_all_prereleases=options.pre, + process_dependency_links=options.process_dependency_links, + session=session, + platform=platform, + versions=python_versions, + abi=abi, + implementation=implementation, + ) diff --git a/vendor/pip-9.0.3/pip/baseparser.py b/vendor/pip-9.0.3/pip/baseparser.py new file mode 100644 index 0000000000000000000000000000000000000000..2dd4533016b22becf6501be3061e515e582be93e --- /dev/null +++ b/vendor/pip-9.0.3/pip/baseparser.py @@ -0,0 +1,293 @@ +"""Base option parser setup""" +from __future__ import absolute_import + +import sys +import optparse +import os +import re +import textwrap +from distutils.util import strtobool + +from pip._vendor.six import string_types +from pip._vendor.six.moves import configparser +from pip.locations import ( + legacy_config_file, config_basename, running_under_virtualenv, + site_config_files +) +from pip.utils import appdirs, get_terminal_size + + +_environ_prefix_re = re.compile(r"^PIP_", re.I) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args, **kwargs): + # help position must be aligned with __init__.parseopts.description + kwargs['max_help_position'] = 30 + kwargs['indent_increment'] = 1 + kwargs['width'] = get_terminal_size()[0] - 2 + optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) + + def format_option_strings(self, option): + return self._format_option_strings(option, ' <%s>', ', ') + + def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt % metavar.lower()) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") + return msg + + def format_description(self, description): + # leave full control over description to us + if description: + if hasattr(self.parser, 'main'): + label = 'Commands' + else: + label = 'Description' + # some doc strings have initial newlines, some don't + description = description.lstrip('\n') + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = '%s:\n%s\n' % (label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + new_lines = [indent + line for line in text.split('\n')] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + """ + + def expand_default(self, option): + if self.parser is not None: + self.parser._update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + + def insert_option_group(self, idx, *args, **kwargs): + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self): + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + isolated = False + + def __init__(self, *args, **kwargs): + self.config = configparser.RawConfigParser() + self.name = kwargs.pop('name') + self.isolated = kwargs.pop("isolated", False) + self.files = self.get_config_files() + if self.files: + self.config.read(self.files) + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def get_config_files(self): + # the files returned by this method will be parsed in order with the + # first files listed being overridden by later files in standard + # ConfigParser fashion + config_file = os.environ.get('PIP_CONFIG_FILE', False) + if config_file == os.devnull: + return [] + + # at the base we have any site-wide configuration + files = list(site_config_files) + + # per-user configuration next + if not self.isolated: + if config_file and os.path.exists(config_file): + files.append(config_file) + else: + # This is the legacy config file, we consider it to be a lower + # priority than the new file location. + files.append(legacy_config_file) + + # This is the new config file, we consider it to be a higher + # priority than the legacy file. + files.append( + os.path.join( + appdirs.user_config_dir("pip"), + config_basename, + ) + ) + + # finally virtualenv configuration first trumping others + if running_under_virtualenv(): + venv_config_file = os.path.join( + sys.prefix, + config_basename, + ) + if os.path.exists(venv_config_file): + files.append(venv_config_file) + + return files + + def check_default(self, option, key, val): + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print("An error occurred during configuration: %s" % exc) + sys.exit(3) + + def _update_defaults(self, defaults): + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + # Then go and look for the other sources of configuration: + config = {} + # 1. config files + for section in ('global', self.name): + config.update( + self.normalize_keys(self.get_config_section(section)) + ) + # 2. environmental variables + if not self.isolated: + config.update(self.normalize_keys(self.get_environ_vars())) + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in config.items(): + # ignore empty values + if not val: + continue + + option = self.get_option(key) + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + if option.action in ('store_true', 'store_false', 'count'): + val = strtobool(val) + elif option.action == 'append': + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == 'callback': + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def normalize_keys(self, items): + """Return a config dictionary with normalized keys regardless of + whether the keys were specified in environment variables or in config + files""" + normalized = {} + for key, val in items: + key = key.replace('_', '-') + if not key.startswith('--'): + key = '--%s' % key # only prefer long opts + normalized[key] = val + return normalized + + def get_config_section(self, name): + """Get a section of a configuration""" + if self.config.has_section(name): + return self.config.items(name) + return [] + + def get_environ_vars(self): + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + if _environ_prefix_re.search(key): + yield (_environ_prefix_re.sub("", key).lower(), val) + + def get_default_values(self): + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(2, "%s\n" % msg) diff --git a/vendor/pip-9.0.3/pip/cmdoptions.py b/vendor/pip-9.0.3/pip/cmdoptions.py new file mode 100644 index 0000000000000000000000000000000000000000..f71488cdf51ba686efdcf99b240b487d5d66ed67 --- /dev/null +++ b/vendor/pip-9.0.3/pip/cmdoptions.py @@ -0,0 +1,633 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. + +""" +from __future__ import absolute_import + +from functools import partial +from optparse import OptionGroup, SUPPRESS_HELP, Option +import warnings + +from pip.index import ( + FormatControl, fmt_ctl_handle_mutual_exclude, fmt_ctl_no_binary, + fmt_ctl_no_use_wheel) +from pip.models import PyPI +from pip.locations import USER_CACHE_DIR, src_prefix +from pip.utils.hashes import STRONG_HASHES + + +def make_option_group(group, parser): + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group['name']) + for option in group['options']: + option_group.add_option(option()) + return option_group + + +def resolve_wheel_no_use_binary(options): + if not options.use_wheel: + control = options.format_control + fmt_ctl_no_use_wheel(control) + + +def check_install_build_global(options, check_options=None): + """Disable wheels if per-setup.py call options are set. + + :param options: The OptionParser options to update. + :param check_options: The options to check, if not supplied defaults to + options. + """ + if check_options is None: + check_options = options + + def getname(n): + return getattr(check_options, n, None) + names = ["build_options", "global_options", "install_options"] + if any(map(getname, names)): + control = options.format_control + fmt_ctl_no_binary(control) + warnings.warn( + 'Disabling all use of wheels due to the use of --build-options ' + '/ --global-options / --install-options.', stacklevel=2) + + +########### +# options # +########### + +help_ = partial( + Option, + '-h', '--help', + dest='help', + action='help', + help='Show help.') + +isolated_mode = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) + +require_virtualenv = partial( + Option, + # Run only if inside a virtualenv, bail if not. + '--require-virtualenv', '--require-venv', + dest='require_venv', + action='store_true', + default=False, + help=SUPPRESS_HELP) + +verbose = partial( + Option, + '-v', '--verbose', + dest='verbose', + action='count', + default=0, + help='Give more output. Option is additive, and can be used up to 3 times.' +) + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.') + +quiet = partial( + Option, + '-q', '--quiet', + dest='quiet', + action='count', + default=0, + help=('Give less output. Option is additive, and can be used up to 3' + ' times (corresponding to WARNING, ERROR, and CRITICAL logging' + ' levels).') +) + +log = partial( + Option, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + help="Path to a verbose appending log." +) + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=SUPPRESS_HELP) + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port.") + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).") + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).') + +default_vcs = partial( + Option, + # The default version control system for editables, e.g. 'svn' + '--default-vcs', + dest='default_vcs', + type='str', + default='', + help=SUPPRESS_HELP) + +skip_requirements_regex = partial( + Option, + # A regex to be used to skip requirements + '--skip-requirements-regex', + dest='skip_requirements_regex', + type='str', + default='', + help=SUPPRESS_HELP) + + +def exists_action(): + return Option( + # Option when path already exist + '--exists-action', + dest='exists_action', + type='choice', + choices=['s', 'i', 'w', 'b', 'a'], + default=[], + action='append', + metavar='action', + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.") + + +cert = partial( + Option, + '--cert', + dest='cert', + type='str', + metavar='path', + help="Path to alternate CA bundle.") + +client_cert = partial( + Option, + '--client-cert', + dest='client_cert', + type='str', + default=None, + metavar='path', + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.") + +index_url = partial( + Option, + '-i', '--index-url', '--pypi-url', + dest='index_url', + metavar='URL', + default=PyPI.simple_url, + help="Base URL of Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.") + + +def extra_index_url(): + return Option( + '--extra-index-url', + dest='extra_index_urls', + metavar='URL', + action='append', + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url." + ) + + +no_index = partial( + Option, + '--no-index', + dest='no_index', + action='store_true', + default=False, + help='Ignore package index (only looking at --find-links URLs instead).') + + +def find_links(): + return Option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='url', + help="If a url or path to an html file, then parse for links to " + "archives. If a local path or file:// url that's a directory, " + "then look for archives in the directory listing.") + + +def allow_external(): + return Option( + "--allow-external", + dest="allow_external", + action="append", + default=[], + metavar="PACKAGE", + help=SUPPRESS_HELP, + ) + + +allow_all_external = partial( + Option, + "--allow-all-external", + dest="allow_all_external", + action="store_true", + default=False, + help=SUPPRESS_HELP, +) + + +def trusted_host(): + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host as trusted, even though it does not have valid " + "or any HTTPS.", + ) + + +# Remove after 7.0 +no_allow_external = partial( + Option, + "--no-allow-external", + dest="allow_all_external", + action="store_false", + default=False, + help=SUPPRESS_HELP, +) + + +# Remove --allow-insecure after 7.0 +def allow_unsafe(): + return Option( + "--allow-unverified", "--allow-insecure", + dest="allow_unverified", + action="append", + default=[], + metavar="PACKAGE", + help=SUPPRESS_HELP, + ) + +# Remove after 7.0 +no_allow_unsafe = partial( + Option, + "--no-allow-insecure", + dest="allow_all_insecure", + action="store_false", + default=False, + help=SUPPRESS_HELP +) + +# Remove after 1.5 +process_dependency_links = partial( + Option, + "--process-dependency-links", + dest="process_dependency_links", + action="store_true", + default=False, + help="Enable the processing of dependency links.", +) + + +def constraints(): + return Option( + '-c', '--constraint', + dest='constraints', + action='append', + default=[], + metavar='file', + help='Constrain versions using the given constraints file. ' + 'This option can be used multiple times.') + + +def requirements(): + return Option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Install from the given requirements file. ' + 'This option can be used multiple times.') + + +def editable(): + return Option( + '-e', '--editable', + dest='editables', + action='append', + default=[], + metavar='path/url', + help=('Install a project in editable mode (i.e. setuptools ' + '"develop mode") from a local project path or a VCS url.'), + ) + +src = partial( + Option, + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + metavar='dir', + default=src_prefix, + help='Directory to check out editable projects into. ' + 'The default in a virtualenv is "<venv path>/src". ' + 'The default for global installs is "<current dir>/src".' +) + +# XXX: deprecated, remove in 9.0 +use_wheel = partial( + Option, + '--use-wheel', + dest='use_wheel', + action='store_true', + default=True, + help=SUPPRESS_HELP, +) + +# XXX: deprecated, remove in 9.0 +no_use_wheel = partial( + Option, + '--no-use-wheel', + dest='use_wheel', + action='store_false', + default=True, + help=('Do not Find and prefer wheel archives when searching indexes and ' + 'find-links locations. DEPRECATED in favour of --no-binary.'), +) + + +def _get_format_control(values, option): + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + existing = getattr(parser.values, option.dest) + fmt_ctl_handle_mutual_exclude( + value, existing.no_binary, existing.only_binary) + + +def _handle_only_binary(option, opt_str, value, parser): + existing = getattr(parser.values, option.dest) + fmt_ctl_handle_mutual_exclude( + value, existing.only_binary, existing.no_binary) + + +def no_binary(): + return Option( + "--no-binary", dest="format_control", action="callback", + callback=_handle_no_binary, type="str", + default=FormatControl(set(), set()), + help="Do not use binary packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all binary packages, :none: to empty the set, or one or " + "more package names with commas between them. Note that some " + "packages are tricky to compile and may fail to install when " + "this option is used on them.") + + +def only_binary(): + return Option( + "--only-binary", dest="format_control", action="callback", + callback=_handle_only_binary, type="str", + default=FormatControl(set(), set()), + help="Do not use source packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all source packages, :none: to empty the set, or one or " + "more package names with commas between them. Packages without " + "binary distributions will fail to install when this option is " + "used on them.") + + +cache_dir = partial( + Option, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + help="Store the cache data in <dir>." +) + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="store_false", + help="Disable the cache.", +) + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.") + +build_dir = partial( + Option, + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + metavar='dir', + help='Directory to unpack packages into and build in.' +) + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.') + +install_options = partial( + Option, + '--install-option', + dest='install_options', + action='append', + metavar='options', + help="Extra arguments to be supplied to the setup.py install " + "command (use like --install-option=\"--install-scripts=/usr/local/" + "bin\"). Use multiple --install-option options to pass multiple " + "options to setup.py install. If you are using an option with a " + "directory path, be sure to use absolute path.") + +global_options = partial( + Option, + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the install command.") + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories.") + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.") + +disable_pip_version_check = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=False, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.") + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) + + +def _merge_hash(option, opt_str, value, parser): + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(':', 1) + except ValueError: + parser.error('Arguments to %s must be a hash name ' + 'followed by a value, like --hash=sha256:abcde...' % + opt_str) + if algo not in STRONG_HASHES: + parser.error('Allowed hash algorithms for %s are %s.' % + (opt_str, ', '.join(STRONG_HASHES))) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash = partial( + Option, + '--hash', + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest='hashes', + action='callback', + callback=_merge_hash, + type='string', + help="Verify that the package's archive matches this " + 'hash before installing. Example: --hash=sha256:abcdef...') + + +require_hashes = partial( + Option, + '--require-hashes', + dest='require_hashes', + action='store_true', + default=False, + help='Require a hash to check each requirement against, for ' + 'repeatable installs. This option is implied when any package in a ' + 'requirements file has a --hash option.') + + +########## +# groups # +########## + +general_group = { + 'name': 'General Options', + 'options': [ + help_, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + default_vcs, + skip_requirements_regex, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + ] +} + +non_deprecated_index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + process_dependency_links, + ] +} + +index_group = { + 'name': 'Package Index Options (including deprecated options)', + 'options': non_deprecated_index_group['options'] + [ + allow_external, + allow_all_external, + no_allow_external, + allow_unsafe, + no_allow_unsafe, + ] +} diff --git a/vendor/pip-9.0.3/pip/commands/__init__.py b/vendor/pip-9.0.3/pip/commands/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..62c64ebed2704a2322d3c6458fd8d7d8ff2f7feb --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/__init__.py @@ -0,0 +1,86 @@ +""" +Package containing all pip commands +""" +from __future__ import absolute_import + +from pip.commands.completion import CompletionCommand +from pip.commands.download import DownloadCommand +from pip.commands.freeze import FreezeCommand +from pip.commands.hash import HashCommand +from pip.commands.help import HelpCommand +from pip.commands.list import ListCommand +from pip.commands.check import CheckCommand +from pip.commands.search import SearchCommand +from pip.commands.show import ShowCommand +from pip.commands.install import InstallCommand +from pip.commands.uninstall import UninstallCommand +from pip.commands.wheel import WheelCommand + + +commands_dict = { + CompletionCommand.name: CompletionCommand, + FreezeCommand.name: FreezeCommand, + HashCommand.name: HashCommand, + HelpCommand.name: HelpCommand, + SearchCommand.name: SearchCommand, + ShowCommand.name: ShowCommand, + InstallCommand.name: InstallCommand, + UninstallCommand.name: UninstallCommand, + DownloadCommand.name: DownloadCommand, + ListCommand.name: ListCommand, + CheckCommand.name: CheckCommand, + WheelCommand.name: WheelCommand, +} + + +commands_order = [ + InstallCommand, + DownloadCommand, + UninstallCommand, + FreezeCommand, + ListCommand, + ShowCommand, + CheckCommand, + SearchCommand, + WheelCommand, + HashCommand, + CompletionCommand, + HelpCommand, +] + + +def get_summaries(ordered=True): + """Yields sorted (command name, command summary) tuples.""" + + if ordered: + cmditems = _sort_commands(commands_dict, commands_order) + else: + cmditems = commands_dict.items() + + for name, command_class in cmditems: + yield (name, command_class.summary) + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False + + +def _sort_commands(cmddict, order): + def keyfn(key): + try: + return order.index(key[1]) + except ValueError: + # unordered items should come last + return 0xff + + return sorted(cmddict.items(), key=keyfn) diff --git a/vendor/pip-9.0.3/pip/commands/check.py b/vendor/pip-9.0.3/pip/commands/check.py new file mode 100644 index 0000000000000000000000000000000000000000..70458adf47d73a88ba9bef862e0546177eb4de55 --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/check.py @@ -0,0 +1,39 @@ +import logging + +from pip.basecommand import Command +from pip.operations.check import check_requirements +from pip.utils import get_installed_distributions + + +logger = logging.getLogger(__name__) + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + name = 'check' + usage = """ + %prog [options]""" + summary = 'Verify installed packages have compatible dependencies.' + + def run(self, options, args): + dists = get_installed_distributions(local_only=False, skip=()) + missing_reqs_dict, incompatible_reqs_dict = check_requirements(dists) + + for dist in dists: + key = '%s==%s' % (dist.project_name, dist.version) + + for requirement in missing_reqs_dict.get(key, []): + logger.info( + "%s %s requires %s, which is not installed.", + dist.project_name, dist.version, requirement.project_name) + + for requirement, actual in incompatible_reqs_dict.get(key, []): + logger.info( + "%s %s has requirement %s, but you have %s %s.", + dist.project_name, dist.version, requirement, + actual.project_name, actual.version) + + if missing_reqs_dict or incompatible_reqs_dict: + return 1 + else: + logger.info("No broken requirements found.") diff --git a/vendor/pip-9.0.3/pip/commands/completion.py b/vendor/pip-9.0.3/pip/commands/completion.py new file mode 100644 index 0000000000000000000000000000000000000000..66e41a679123201415370edf9e1c7bc6416f5daf --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/completion.py @@ -0,0 +1,81 @@ +from __future__ import absolute_import + +import sys +from pip.basecommand import Command + +BASE_COMPLETION = """ +# pip %(shell)s completion start%(script)s# pip %(shell)s completion end +""" + +COMPLETION_SCRIPTS = { + 'bash': """ +_pip_completion() +{ + COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 ) ) +} +complete -o default -F _pip_completion pip +""", 'zsh': """ +function _pip_completion { + local words cword + read -Ac words + read -cn cword + reply=( $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$(( cword-1 )) \\ + PIP_AUTO_COMPLETE=1 $words[1] ) ) +} +compctl -K _pip_completion pip +""", 'fish': """ +function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD (math (contains -i -- (commandline -t) $COMP_WORDS)-1) + set -lx PIP_AUTO_COMPLETE 1 + string split \ -- (eval $COMP_WORDS[1]) +end +complete -fa "(__fish_complete_pip)" -c pip +"""} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + name = 'completion' + summary = 'A helper command used for command completion.' + + def __init__(self, *args, **kw): + super(CompletionCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '--bash', '-b', + action='store_const', + const='bash', + dest='shell', + help='Emit completion code for bash') + cmd_opts.add_option( + '--zsh', '-z', + action='store_const', + const='zsh', + dest='shell', + help='Emit completion code for zsh') + cmd_opts.add_option( + '--fish', '-f', + action='store_const', + const='fish', + dest='shell', + help='Emit completion code for fish') + + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ['--' + shell for shell in sorted(shells)] + if options.shell in shells: + script = COMPLETION_SCRIPTS.get(options.shell, '') + print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) + else: + sys.stderr.write( + 'ERROR: You must pass %s\n' % ' or '.join(shell_options) + ) diff --git a/vendor/pip-9.0.3/pip/commands/download.py b/vendor/pip-9.0.3/pip/commands/download.py new file mode 100644 index 0000000000000000000000000000000000000000..4bc06408751da1cb3d1ee9372b2ec00ffcdd0c30 --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/download.py @@ -0,0 +1,212 @@ +from __future__ import absolute_import + +import logging +import os + +from pip.exceptions import CommandError +from pip.index import FormatControl +from pip.req import RequirementSet +from pip.basecommand import RequirementCommand +from pip import cmdoptions +from pip.utils import ensure_dir, normalize_path +from pip.utils.build import BuildDirectory +from pip.utils.filesystem import check_path_owner + + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + name = 'download' + + usage = """ + %prog [options] <requirement specifier> [package-index-options] ... + %prog [options] -r <requirements file> [package-index-options] ... + %prog [options] [-e] <vcs project url> ... + %prog [options] [-e] <local project path> ... + %prog [options] <archive url/path> ...""" + + summary = 'Download packages.' + + def __init__(self, *args, **kw): + super(DownloadCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.global_options()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.pre()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + + cmd_opts.add_option( + '-d', '--dest', '--destination-dir', '--destination-directory', + dest='download_dir', + metavar='dir', + default=os.curdir, + help=("Download packages into <dir>."), + ) + + cmd_opts.add_option( + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only download wheels compatible with <platform>. " + "Defaults to the platform of the running system."), + ) + + cmd_opts.add_option( + '--python-version', + dest='python_version', + metavar='python_version', + default=None, + help=("Only download wheels compatible with Python " + "interpreter version <version>. If not specified, then the " + "current system interpreter minor version is used. A major " + "version (e.g. '2') can be specified to match all " + "minor revs of that major version. A minor version " + "(e.g. '34') can also be specified."), + ) + + cmd_opts.add_option( + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only download wheels compatible with Python " + "implementation <implementation>, e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels."), + ) + + cmd_opts.add_option( + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only download wheels compatible with Python " + "abi <abi>, e.g. 'pypy_41'. If not specified, then the " + "current interpreter abi tag is used. Generally " + "you will need to specify --implementation, " + "--platform, and --python-version when using " + "this option."), + ) + + index_opts = cmdoptions.make_option_group( + cmdoptions.non_deprecated_index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + options.ignore_installed = True + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + binary_only = FormatControl(set(), set([':all:'])) + if dist_restriction_set and options.format_control != binary_only: + raise CommandError( + "--only-binary=:all: must be set and --no-binary must not " + "be set (or must be set to :none:) when restricting platform " + "and interpreter constraints using --python-version, " + "--platform, --abi, or --implementation." + ) + + options.src_dir = os.path.abspath(options.src_dir) + options.download_dir = normalize_path(options.download_dir) + + ensure_dir(options.download_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with BuildDirectory(options.build_dir, + delete=build_delete) as build_dir: + + requirement_set = RequirementSet( + build_dir=build_dir, + src_dir=options.src_dir, + download_dir=options.download_dir, + ignore_installed=True, + ignore_dependencies=options.ignore_dependencies, + session=session, + isolated=options.isolated_mode, + require_hashes=options.require_hashes + ) + self.populate_requirement_set( + requirement_set, + args, + options, + finder, + session, + self.name, + None + ) + + if not requirement_set.has_requirements: + return + + requirement_set.prepare_files(finder) + + downloaded = ' '.join([ + req.name for req in requirement_set.successfully_downloaded + ]) + if downloaded: + logger.info( + 'Successfully downloaded %s', downloaded + ) + + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + + return requirement_set diff --git a/vendor/pip-9.0.3/pip/commands/freeze.py b/vendor/pip-9.0.3/pip/commands/freeze.py new file mode 100644 index 0000000000000000000000000000000000000000..c1987961985b4fb4c67d69561c3b301432da0f8d --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/freeze.py @@ -0,0 +1,87 @@ +from __future__ import absolute_import + +import sys + +import pip +from pip.compat import stdlib_pkgs +from pip.basecommand import Command +from pip.operations.freeze import freeze +from pip.wheel import WheelCache + + +DEV_PKGS = ('pip', 'setuptools', 'distribute', 'wheel') + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + name = 'freeze' + usage = """ + %prog [options]""" + summary = 'Output installed packages in requirements format.' + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def __init__(self, *args, **kw): + super(FreezeCommand, self).__init__(*args, **kw) + + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help="Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times.") + self.cmd_opts.add_option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='URL', + help='URL for finding packages, which will be added to the ' + 'output.') + self.cmd_opts.add_option( + '-l', '--local', + dest='local', + action='store_true', + default=False, + help='If in a virtualenv that has global access, do not output ' + 'globally-installed packages.') + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + self.cmd_opts.add_option( + '--all', + dest='freeze_all', + action='store_true', + help='Do not skip these packages in the output:' + ' %s' % ', '.join(DEV_PKGS)) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + format_control = pip.index.FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + freeze_kwargs = dict( + requirement=options.requirements, + find_links=options.find_links, + local_only=options.local, + user_only=options.user, + skip_regex=options.skip_requirements_regex, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + skip=skip) + + for line in freeze(**freeze_kwargs): + sys.stdout.write(line + '\n') diff --git a/vendor/pip-9.0.3/pip/commands/hash.py b/vendor/pip-9.0.3/pip/commands/hash.py new file mode 100644 index 0000000000000000000000000000000000000000..27cca0bfa409121799aa9260d659727b094a76db --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/hash.py @@ -0,0 +1,57 @@ +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip.basecommand import Command +from pip.status_codes import ERROR +from pip.utils import read_chunks +from pip.utils.hashes import FAVORITE_HASH, STRONG_HASHES + + +logger = logging.getLogger(__name__) + + +class HashCommand(Command): + """ + Compute a hash of a local package archive. + + These can be used with --hash in a requirements file to do repeatable + installs. + + """ + name = 'hash' + usage = '%prog [options] <file> ...' + summary = 'Compute hashes of package archives.' + + def __init__(self, *args, **kw): + super(HashCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-a', '--algorithm', + dest='algorithm', + choices=STRONG_HASHES, + action='store', + default=FAVORITE_HASH, + help='The hash algorithm to use: one of %s' % + ', '.join(STRONG_HASHES)) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + logger.info('%s:\n--hash=%s:%s', + path, algorithm, _hash_of_file(path, algorithm)) + + +def _hash_of_file(path, algorithm): + """Return the hash digest of a file.""" + with open(path, 'rb') as archive: + hash = hashlib.new(algorithm) + for chunk in read_chunks(archive): + hash.update(chunk) + return hash.hexdigest() diff --git a/vendor/pip-9.0.3/pip/commands/help.py b/vendor/pip-9.0.3/pip/commands/help.py new file mode 100644 index 0000000000000000000000000000000000000000..11722f1e067fc9b1d41adc44f91b5686fedb7d70 --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/help.py @@ -0,0 +1,35 @@ +from __future__ import absolute_import + +from pip.basecommand import Command, SUCCESS +from pip.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + name = 'help' + usage = """ + %prog <command>""" + summary = 'Show help for commands.' + + def run(self, options, args): + from pip.commands import commands_dict, get_similar_commands + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + command = commands_dict[cmd_name]() + command.parser.print_help() + + return SUCCESS diff --git a/vendor/pip-9.0.3/pip/commands/install.py b/vendor/pip-9.0.3/pip/commands/install.py new file mode 100644 index 0000000000000000000000000000000000000000..227c5264a0d60e8eaadcc2b5139df252a1e4c223 --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/install.py @@ -0,0 +1,437 @@ +from __future__ import absolute_import + +import logging +import operator +import os +import tempfile +import shutil +import warnings +try: + import wheel +except ImportError: + wheel = None + +from pip.req import RequirementSet +from pip.basecommand import RequirementCommand +from pip.locations import virtualenv_no_global, distutils_scheme +from pip.exceptions import ( + InstallationError, CommandError, PreviousBuildDirError, +) +from pip import cmdoptions +from pip.utils import ensure_dir, get_installed_version +from pip.utils.build import BuildDirectory +from pip.utils.deprecation import RemovedInPip10Warning +from pip.utils.filesystem import check_path_owner +from pip.wheel import WheelCache, WheelBuilder + + +logger = logging.getLogger(__name__) + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + name = 'install' + + usage = """ + %prog [options] <requirement specifier> [package-index-options] ... + %prog [options] -r <requirements file> [package-index-options] ... + %prog [options] [-e] <vcs project url> ... + %prog [options] [-e] <local project path> ... + %prog [options] <archive url/path> ...""" + + summary = 'Install packages.' + + def __init__(self, *args, **kw): + super(InstallCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.build_dir()) + + cmd_opts.add_option( + '-t', '--target', + dest='target_dir', + metavar='dir', + default=None, + help='Install packages into <dir>. ' + 'By default this will not replace existing files/folders in ' + '<dir>. Use --upgrade to replace existing packages in <dir> ' + 'with new versions.' + ) + + cmd_opts.add_option( + '-d', '--download', '--download-dir', '--download-directory', + dest='download_dir', + metavar='dir', + default=None, + help=("Download packages into <dir> instead of installing them, " + "regardless of what's already installed."), + ) + + cmd_opts.add_option(cmdoptions.src()) + + cmd_opts.add_option( + '-U', '--upgrade', + dest='upgrade', + action='store_true', + help='Upgrade all specified packages to the newest available ' + 'version. The handling of dependencies depends on the ' + 'upgrade-strategy used.' + ) + + cmd_opts.add_option( + '--upgrade-strategy', + dest='upgrade_strategy', + default='eager', + choices=['only-if-needed', 'eager'], + help='Determines how dependency upgrading should be handled. ' + '"eager" - dependencies are upgraded regardless of ' + 'whether the currently installed version satisfies the ' + 'requirements of the upgraded package(s). ' + '"only-if-needed" - are upgraded only when they do not ' + 'satisfy the requirements of the upgraded package(s).' + ) + + cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='When upgrading, reinstall all packages even if they are ' + 'already up-to-date.') + + cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages (reinstalling instead).') + + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_deps()) + + cmd_opts.add_option(cmdoptions.install_options()) + cmd_opts.add_option(cmdoptions.global_options()) + + cmd_opts.add_option( + '--user', + dest='use_user_site', + action='store_true', + help="Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)") + + cmd_opts.add_option( + '--egg', + dest='as_egg', + action='store_true', + help="Install packages as eggs, not 'flat', like pip normally " + "does. This option is not about installing *from* eggs. " + "(WARNING: Because this option overrides pip's normal install" + " logic, requirements files may not behave as expected.)") + + cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root " + "directory.") + + cmd_opts.add_option( + '--prefix', + dest='prefix_path', + metavar='dir', + default=None, + help="Installation prefix where lib, bin and other top-level " + "folders are placed") + + cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile py files to pyc", + ) + + cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile py files to pyc", + ) + + cmd_opts.add_option(cmdoptions.use_wheel()) + cmd_opts.add_option(cmdoptions.no_use_wheel()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.pre()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + cmdoptions.resolve_wheel_no_use_binary(options) + cmdoptions.check_install_build_global(options) + + if options.as_egg: + warnings.warn( + "--egg has been deprecated and will be removed in the future. " + "This flag is mutually exclusive with large parts of pip, and " + "actually using it invalidates pip's ability to manage the " + "installation process.", + RemovedInPip10Warning, + ) + + if options.allow_external: + warnings.warn( + "--allow-external has been deprecated and will be removed in " + "the future. Due to changes in the repository protocol, it no " + "longer has any effect.", + RemovedInPip10Warning, + ) + + if options.allow_all_external: + warnings.warn( + "--allow-all-external has been deprecated and will be removed " + "in the future. Due to changes in the repository protocol, it " + "no longer has any effect.", + RemovedInPip10Warning, + ) + + if options.allow_unverified: + warnings.warn( + "--allow-unverified has been deprecated and will be removed " + "in the future. Due to changes in the repository protocol, it " + "no longer has any effect.", + RemovedInPip10Warning, + ) + + if options.download_dir: + warnings.warn( + "pip install --download has been deprecated and will be " + "removed in the future. Pip now has a download command that " + "should be used instead.", + RemovedInPip10Warning, + ) + options.ignore_installed = True + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + options.src_dir = os.path.abspath(options.src_dir) + install_options = options.install_options or [] + if options.use_user_site: + if options.prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + install_options.append('--user') + install_options.append('--prefix=') + + temp_target_dir = None + if options.target_dir: + options.ignore_installed = True + temp_target_dir = tempfile.mkdtemp() + options.target_dir = os.path.abspath(options.target_dir) + if (os.path.exists(options.target_dir) and not + os.path.isdir(options.target_dir)): + raise CommandError( + "Target path exists but is not a directory, will not " + "continue." + ) + install_options.append('--home=' + temp_target_dir) + + global_options = options.global_options or [] + + with self._build_session(options) as session: + + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with BuildDirectory(options.build_dir, + delete=build_delete) as build_dir: + requirement_set = RequirementSet( + build_dir=build_dir, + src_dir=options.src_dir, + download_dir=options.download_dir, + upgrade=options.upgrade, + upgrade_strategy=options.upgrade_strategy, + as_egg=options.as_egg, + ignore_installed=options.ignore_installed, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + force_reinstall=options.force_reinstall, + use_user_site=options.use_user_site, + target_dir=temp_target_dir, + session=session, + pycompile=options.compile, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + require_hashes=options.require_hashes, + ) + + self.populate_requirement_set( + requirement_set, args, options, finder, session, self.name, + wheel_cache + ) + + if not requirement_set.has_requirements: + return + + try: + if (options.download_dir or not wheel or not + options.cache_dir): + # on -d don't do complex things like building + # wheels, and don't try to build wheels when wheel is + # not installed. + requirement_set.prepare_files(finder) + else: + # build wheels before install. + wb = WheelBuilder( + requirement_set, + finder, + build_options=[], + global_options=[], + ) + # Ignore the result: a failed wheel will be + # installed from the sdist/vcs whatever. + wb.build(autobuilding=True) + + if not options.download_dir: + requirement_set.install( + install_options, + global_options, + root=options.root_path, + prefix=options.prefix_path, + ) + + possible_lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=temp_target_dir, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + reqs = sorted( + requirement_set.successfully_installed, + key=operator.attrgetter('name')) + items = [] + for req in reqs: + item = req.name + try: + installed_version = get_installed_version( + req.name, possible_lib_locations + ) + if installed_version: + item += '-' + installed_version + except Exception: + pass + items.append(item) + installed = ' '.join(items) + if installed: + logger.info('Successfully installed %s', installed) + else: + downloaded = ' '.join([ + req.name + for req in requirement_set.successfully_downloaded + ]) + if downloaded: + logger.info( + 'Successfully downloaded %s', downloaded + ) + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + + if options.target_dir: + ensure_dir(options.target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + purelib_dir = distutils_scheme('', home=temp_target_dir)['purelib'] + platlib_dir = distutils_scheme('', home=temp_target_dir)['platlib'] + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + target_item_dir = os.path.join(options.target_dir, item) + if os.path.exists(target_item_dir): + if not options.upgrade: + logger.warning( + 'Target directory %s already exists. Specify ' + '--upgrade to force replacement.', + target_item_dir + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + 'Target directory %s already exists and is ' + 'a link. Pip will not automatically replace ' + 'links, please remove if replacement is ' + 'desired.', + target_item_dir + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move( + os.path.join(lib_dir, item), + target_item_dir + ) + shutil.rmtree(temp_target_dir) + return requirement_set + + +def get_lib_location_guesses(*args, **kwargs): + scheme = distutils_scheme('', *args, **kwargs) + return [scheme['purelib'], scheme['platlib']] diff --git a/vendor/pip-9.0.3/pip/commands/list.py b/vendor/pip-9.0.3/pip/commands/list.py new file mode 100644 index 0000000000000000000000000000000000000000..6f6995d70f58764f081a35b0905d78ccd5b7dad6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/list.py @@ -0,0 +1,337 @@ +from __future__ import absolute_import + +import json +import logging +import warnings +try: + from itertools import zip_longest +except ImportError: + from itertools import izip_longest as zip_longest + +from pip._vendor import six + +from pip.basecommand import Command +from pip.exceptions import CommandError +from pip.index import PackageFinder +from pip.utils import ( + get_installed_distributions, dist_is_editable) +from pip.utils.deprecation import RemovedInPip10Warning +from pip.cmdoptions import make_option_group, index_group + +logger = logging.getLogger(__name__) + + +class ListCommand(Command): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + name = 'list' + usage = """ + %prog [options]""" + summary = 'List installed packages.' + + def __init__(self, *args, **kw): + super(ListCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages') + cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages') + cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + cmd_opts.add_option( + '-l', '--local', + action='store_true', + default=False, + help=('If in a virtualenv that has global access, do not list ' + 'globally-installed packages.'), + ) + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option( + '--format', + action='store', + dest='list_format', + choices=('legacy', 'columns', 'freeze', 'json'), + help="Select the output format among: legacy (default), columns, " + "freeze or json.", + ) + + cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + + index_opts = make_option_group(index_group, self.parser) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def _build_package_finder(self, options, index_urls, session): + """ + Create a package finder appropriate to this list command. + """ + return PackageFinder( + find_links=options.find_links, + index_urls=index_urls, + allow_all_prereleases=options.pre, + trusted_hosts=options.trusted_hosts, + process_dependency_links=options.process_dependency_links, + session=session, + ) + + def run(self, options, args): + if options.allow_external: + warnings.warn( + "--allow-external has been deprecated and will be removed in " + "the future. Due to changes in the repository protocol, it no " + "longer has any effect.", + RemovedInPip10Warning, + ) + + if options.allow_all_external: + warnings.warn( + "--allow-all-external has been deprecated and will be removed " + "in the future. Due to changes in the repository protocol, it " + "no longer has any effect.", + RemovedInPip10Warning, + ) + + if options.allow_unverified: + warnings.warn( + "--allow-unverified has been deprecated and will be removed " + "in the future. Due to changes in the repository protocol, it " + "no longer has any effect.", + RemovedInPip10Warning, + ) + + if options.list_format is None: + warnings.warn( + "The default format will switch to columns in the future. " + "You can use --format=(legacy|columns) (or define a " + "format=(legacy|columns) in your pip.conf under the [list] " + "section) to disable this warning.", + RemovedInPip10Warning, + ) + + if options.outdated and options.uptodate: + raise CommandError( + "Options --outdated and --uptodate cannot be combined.") + + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + ) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + if options.not_required: + packages = self.get_not_required(packages, options) + + self.output_package_listing(packages, options) + + def get_outdated(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version > dist.parsed_version + ] + + def get_uptodate(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version == dist.parsed_version + ] + + def get_not_required(self, packages, options): + dep_keys = set() + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + return set(pkg for pkg in packages if pkg.key not in dep_keys) + + def iter_packages_latest_infos(self, packages, options): + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + dependency_links = [] + for dist in packages: + if dist.has_metadata('dependency_links.txt'): + dependency_links.extend( + dist.get_metadata_lines('dependency_links.txt'), + ) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, index_urls, session) + finder.add_dependency_links(dependency_links) + + for dist in packages: + typ = 'unknown' + all_candidates = finder.find_all_candidates(dist.key) + if not options.pre: + # Remove prereleases + all_candidates = [candidate for candidate in all_candidates + if not candidate.version.is_prerelease] + + if not all_candidates: + continue + best_candidate = max(all_candidates, + key=finder._candidate_sort_key) + remote_version = best_candidate.version + if best_candidate.location.is_wheel: + typ = 'wheel' + else: + typ = 'sdist' + # This is dirty but makes the rest of the code much cleaner + dist.latest_version = remote_version + dist.latest_filetype = typ + yield dist + + def output_legacy(self, dist): + if dist_is_editable(dist): + return '%s (%s, %s)' % ( + dist.project_name, + dist.version, + dist.location, + ) + else: + return '%s (%s)' % (dist.project_name, dist.version) + + def output_legacy_latest(self, dist): + return '%s - Latest: %s [%s]' % ( + self.output_legacy(dist), + dist.latest_version, + dist.latest_filetype, + ) + + def output_package_listing(self, packages, options): + packages = sorted( + packages, + key=lambda dist: dist.project_name.lower(), + ) + if options.list_format == 'columns' and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == 'freeze': + for dist in packages: + logger.info("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + logger.info(format_for_json(packages, options)) + else: # legacy + for dist in packages: + if options.outdated: + logger.info(self.output_legacy_latest(dist)) + else: + logger.info(self.output_legacy(dist)) + + def output_package_listing_columns(self, data, header): + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) + + for val in pkg_strings: + logger.info(val) + + +def tabulate(vals): + # From pfmoore on GitHub: + # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 + assert len(vals) > 0 + + sizes = [0] * max(len(x) for x in vals) + for row in vals: + sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] + + result = [] + for row in vals: + display = " ".join([str(c).ljust(s) if c is not None else '' + for s, c in zip_longest(sizes, row)]) + result.append(display) + + return result, sizes + + +def format_for_columns(pkgs, options): + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + running_outdated = options.outdated + # Adjust the header for the `pip list --outdated` case. + if running_outdated: + header = ["Package", "Version", "Latest", "Type"] + else: + header = ["Package", "Version"] + + data = [] + if any(dist_is_editable(x) for x in pkgs): + header.append("Location") + + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.project_name, proj.version] + + if running_outdated: + row.append(proj.latest_version) + row.append(proj.latest_filetype) + + if dist_is_editable(proj): + row.append(proj.location) + + data.append(row) + + return data, header + + +def format_for_json(packages, options): + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + if options.outdated: + info['latest_version'] = six.text_type(dist.latest_version) + info['latest_filetype'] = dist.latest_filetype + data.append(info) + return json.dumps(data) diff --git a/vendor/pip-9.0.3/pip/commands/search.py b/vendor/pip-9.0.3/pip/commands/search.py new file mode 100644 index 0000000000000000000000000000000000000000..bd2ea8ad3e5dea9baa95aea331241533f1c21a42 --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/search.py @@ -0,0 +1,133 @@ +from __future__ import absolute_import + +import logging +import sys +import textwrap + +from pip.basecommand import Command, SUCCESS +from pip.compat import OrderedDict +from pip.download import PipXmlrpcTransport +from pip.models import PyPI +from pip.utils import get_terminal_size +from pip.utils.logging import indent_log +from pip.exceptions import CommandError +from pip.status_codes import NO_MATCHES_FOUND +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor import pkg_resources +from pip._vendor.six.moves import xmlrpc_client + + +logger = logging.getLogger(__name__) + + +class SearchCommand(Command): + """Search for PyPI packages whose name or summary contains <query>.""" + name = 'search' + usage = """ + %prog [options] <query>""" + summary = 'Search PyPI for packages.' + + def __init__(self, *args, **kw): + super(SearchCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-i', '--index', + dest='index', + metavar='URL', + default=PyPI.pypi_url, + help='Base URL of Python Package Index (default %default)') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + raise CommandError('Missing required argument (search query).') + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query, options): + index_url = options.index + with self._build_session(options) as session: + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc_client.ServerProxy(index_url, transport) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages = OrderedDict() + for hit in hits: + name = hit['name'] + summary = hit['summary'] + version = hit['version'] + + if name not in packages.keys(): + packages[name] = { + 'name': name, + 'summary': summary, + 'versions': [version], + } + else: + packages[name]['versions'].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]['versions']): + packages[name]['summary'] = summary + + return list(packages.values()) + + +def print_results(hits, name_column_width=None, terminal_width=None): + if not hits: + return + if name_column_width is None: + name_column_width = max([ + len(hit['name']) + len(hit.get('versions', ['-'])[-1]) + for hit in hits + ]) + 4 + + installed_packages = [p.project_name for p in pkg_resources.working_set] + for hit in hits: + name = hit['name'] + summary = hit['summary'] or '' + version = hit.get('versions', ['-'])[-1] + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + + line = '%-*s - %s' % (name_column_width, + '%s (%s)' % (name, version), summary) + try: + logger.info(line) + if name in installed_packages: + dist = pkg_resources.get_distribution(name) + with indent_log(): + latest = highest_version(hit['versions']) + if dist.version == latest: + logger.info('INSTALLED: %s (latest)', dist.version) + else: + logger.info('INSTALLED: %s', dist.version) + logger.info('LATEST: %s', latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions): + return max(versions, key=parse_version) diff --git a/vendor/pip-9.0.3/pip/commands/show.py b/vendor/pip-9.0.3/pip/commands/show.py new file mode 100644 index 0000000000000000000000000000000000000000..111c16d1a88dc293a33d3df2343f4d4d7b1384b7 --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/show.py @@ -0,0 +1,154 @@ +from __future__ import absolute_import + +from email.parser import FeedParser +import logging +import os + +from pip.basecommand import Command +from pip.status_codes import SUCCESS, ERROR +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """Show information about one or more installed packages.""" + name = 'show' + usage = """ + %prog [options] <package> ...""" + summary = 'Show information about installed packages.' + + def __init__(self, *args, **kw): + super(ShowCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-f', '--files', + dest='files', + action='store_true', + default=False, + help='Show the full list of installed files for each package.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + logger.warning('ERROR: Please provide a package name or names.') + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose): + return ERROR + return SUCCESS + + +def search_packages_info(query): + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + installed = {} + for p in pkg_resources.working_set: + installed[canonicalize_name(p.project_name)] = p + + query_names = [canonicalize_name(name) for name in query] + + for dist in [installed[pkg] for pkg in query_names if pkg in installed]: + package = { + 'name': dist.project_name, + 'version': dist.version, + 'location': dist.location, + 'requires': [dep.project_name for dep in dist.requires()], + } + file_list = None + metadata = None + if isinstance(dist, pkg_resources.DistInfoDistribution): + # RECORDs should be part of .dist-info metadatas + if dist.has_metadata('RECORD'): + lines = dist.get_metadata_lines('RECORD') + paths = [l.split(',')[0] for l in lines] + paths = [os.path.join(dist.location, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('METADATA'): + metadata = dist.get_metadata('METADATA') + else: + # Otherwise use pip's log for .egg-info's + if dist.has_metadata('installed-files.txt'): + paths = dist.get_metadata_lines('installed-files.txt') + paths = [os.path.join(dist.egg_info, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + + if dist.has_metadata('entry_points.txt'): + entry_points = dist.get_metadata_lines('entry_points.txt') + package['entry_points'] = entry_points + + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + package['installer'] = line.strip() + break + + # @todo: Should pkg_resources.Distribution have a + # `get_pkg_info` method? + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + for key in ('metadata-version', 'summary', + 'home-page', 'author', 'author-email', 'license'): + package[key] = pkg_info_dict.get(key) + + # It looks like FeedParser cannot deal with repeated headers + classifiers = [] + for line in metadata.splitlines(): + if line.startswith('Classifier: '): + classifiers.append(line[len('Classifier: '):]) + package['classifiers'] = classifiers + + if file_list: + package['files'] = sorted(file_list) + yield package + + +def print_results(distributions, list_files=False, verbose=False): + """ + Print the informations from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + logger.info("---") + logger.info("Name: %s", dist.get('name', '')) + logger.info("Version: %s", dist.get('version', '')) + logger.info("Summary: %s", dist.get('summary', '')) + logger.info("Home-page: %s", dist.get('home-page', '')) + logger.info("Author: %s", dist.get('author', '')) + logger.info("Author-email: %s", dist.get('author-email', '')) + logger.info("License: %s", dist.get('license', '')) + logger.info("Location: %s", dist.get('location', '')) + logger.info("Requires: %s", ', '.join(dist.get('requires', []))) + if verbose: + logger.info("Metadata-Version: %s", + dist.get('metadata-version', '')) + logger.info("Installer: %s", dist.get('installer', '')) + logger.info("Classifiers:") + for classifier in dist.get('classifiers', []): + logger.info(" %s", classifier) + logger.info("Entry-points:") + for entry in dist.get('entry_points', []): + logger.info(" %s", entry.strip()) + if list_files: + logger.info("Files:") + for line in dist.get('files', []): + logger.info(" %s", line.strip()) + if "files" not in dist: + logger.info("Cannot locate installed-files.txt") + return results_printed diff --git a/vendor/pip-9.0.3/pip/commands/uninstall.py b/vendor/pip-9.0.3/pip/commands/uninstall.py new file mode 100644 index 0000000000000000000000000000000000000000..8ba1a7c65d92c70f65c48783a00ce2d48e2983af --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/uninstall.py @@ -0,0 +1,76 @@ +from __future__ import absolute_import + +import pip +from pip.wheel import WheelCache +from pip.req import InstallRequirement, RequirementSet, parse_requirements +from pip.basecommand import Command +from pip.exceptions import InstallationError + + +class UninstallCommand(Command): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + name = 'uninstall' + usage = """ + %prog [options] <package> ... + %prog [options] -r <requirements file> ...""" + summary = 'Uninstall packages.' + + def __init__(self, *args, **kw): + super(UninstallCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Uninstall all the packages listed in the given requirements ' + 'file. This option can be used multiple times.', + ) + self.cmd_opts.add_option( + '-y', '--yes', + dest='yes', + action='store_true', + help="Don't ask for confirmation of uninstall deletions.") + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + with self._build_session(options) as session: + format_control = pip.index.FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + requirement_set = RequirementSet( + build_dir=None, + src_dir=None, + download_dir=None, + isolated=options.isolated_mode, + session=session, + wheel_cache=wheel_cache, + ) + for name in args: + requirement_set.add_requirement( + InstallRequirement.from_line( + name, isolated=options.isolated_mode, + wheel_cache=wheel_cache + ) + ) + for filename in options.requirements: + for req in parse_requirements( + filename, + options=options, + session=session, + wheel_cache=wheel_cache): + requirement_set.add_requirement(req) + if not requirement_set.has_requirements: + raise InstallationError( + 'You must give at least one requirement to %(name)s (see ' + '"pip help %(name)s")' % dict(name=self.name) + ) + requirement_set.uninstall(auto_confirm=options.yes) diff --git a/vendor/pip-9.0.3/pip/commands/wheel.py b/vendor/pip-9.0.3/pip/commands/wheel.py new file mode 100644 index 0000000000000000000000000000000000000000..70e95eb8e0bf997b86cb433ef97c9ddf5b00d337 --- /dev/null +++ b/vendor/pip-9.0.3/pip/commands/wheel.py @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import logging +import os +import warnings + +from pip.basecommand import RequirementCommand +from pip.exceptions import CommandError, PreviousBuildDirError +from pip.req import RequirementSet +from pip.utils import import_or_raise +from pip.utils.build import BuildDirectory +from pip.utils.deprecation import RemovedInPip10Warning +from pip.wheel import WheelCache, WheelBuilder +from pip import cmdoptions + + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel + package to build individual wheels. + + """ + + name = 'wheel' + usage = """ + %prog [options] <requirement specifier> ... + %prog [options] -r <requirements file> ... + %prog [options] [-e] <vcs project url> ... + %prog [options] [-e] <local project path> ... + %prog [options] <archive url/path> ...""" + + summary = 'Build wheels from your requirements.' + + def __init__(self, *args, **kw): + super(WheelCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-w', '--wheel-dir', + dest='wheel_dir', + metavar='dir', + default=os.curdir, + help=("Build wheels into <dir>, where the default is the " + "current working directory."), + ) + cmd_opts.add_option(cmdoptions.use_wheel()) + cmd_opts.add_option(cmdoptions.no_use_wheel()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.") + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.build_dir()) + + cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def check_required_packages(self): + import_or_raise( + 'wheel.bdist_wheel', + CommandError, + "'pip wheel' requires the 'wheel' package. To fix this, run: " + "pip install wheel" + ) + pkg_resources = import_or_raise( + 'pkg_resources', + CommandError, + "'pip wheel' requires setuptools >= 0.8 for dist-info support." + " To fix this, run: pip install --upgrade setuptools" + ) + if not hasattr(pkg_resources, 'DistInfoDistribution'): + raise CommandError( + "'pip wheel' requires setuptools >= 0.8 for dist-info " + "support. To fix this, run: pip install --upgrade " + "setuptools" + ) + + def run(self, options, args): + self.check_required_packages() + cmdoptions.resolve_wheel_no_use_binary(options) + cmdoptions.check_install_build_global(options) + + if options.allow_external: + warnings.warn( + "--allow-external has been deprecated and will be removed in " + "the future. Due to changes in the repository protocol, it no " + "longer has any effect.", + RemovedInPip10Warning, + ) + + if options.allow_all_external: + warnings.warn( + "--allow-all-external has been deprecated and will be removed " + "in the future. Due to changes in the repository protocol, it " + "no longer has any effect.", + RemovedInPip10Warning, + ) + + if options.allow_unverified: + warnings.warn( + "--allow-unverified has been deprecated and will be removed " + "in the future. Due to changes in the repository protocol, it " + "no longer has any effect.", + RemovedInPip10Warning, + ) + + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + options.src_dir = os.path.abspath(options.src_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + with BuildDirectory(options.build_dir, + delete=build_delete) as build_dir: + requirement_set = RequirementSet( + build_dir=build_dir, + src_dir=options.src_dir, + download_dir=None, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=True, + ignore_requires_python=options.ignore_requires_python, + isolated=options.isolated_mode, + session=session, + wheel_cache=wheel_cache, + wheel_download_dir=options.wheel_dir, + require_hashes=options.require_hashes + ) + + self.populate_requirement_set( + requirement_set, args, options, finder, session, self.name, + wheel_cache + ) + + if not requirement_set.has_requirements: + return + + try: + # build wheels + wb = WheelBuilder( + requirement_set, + finder, + build_options=options.build_options or [], + global_options=options.global_options or [], + ) + if not wb.build(): + raise CommandError( + "Failed to build one or more wheels" + ) + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + if not options.no_clean: + requirement_set.cleanup_files() diff --git a/vendor/pip-9.0.3/pip/compat/__init__.py b/vendor/pip-9.0.3/pip/compat/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..099672cd1ad42d6b54c4343a78b88b2d1fcfc85c --- /dev/null +++ b/vendor/pip-9.0.3/pip/compat/__init__.py @@ -0,0 +1,164 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" +from __future__ import absolute_import, division + +import os +import sys + +from pip._vendor.six import text_type + +try: + from logging.config import dictConfig as logging_dictConfig +except ImportError: + from pip.compat.dictconfig import dictConfig as logging_dictConfig + +try: + from collections import OrderedDict +except ImportError: + from pip._vendor.ordereddict import OrderedDict + +try: + import ipaddress +except ImportError: + try: + from pip._vendor import ipaddress + except ImportError: + import ipaddr as ipaddress + ipaddress.ip_address = ipaddress.IPAddress + ipaddress.ip_network = ipaddress.IPNetwork + + +try: + import sysconfig + + def get_stdlib(): + paths = [ + sysconfig.get_path("stdlib"), + sysconfig.get_path("platstdlib"), + ] + return set(filter(bool, paths)) +except ImportError: + from distutils import sysconfig + + def get_stdlib(): + paths = [ + sysconfig.get_python_lib(standard_lib=True), + sysconfig.get_python_lib(standard_lib=True, plat_specific=True), + ] + return set(filter(bool, paths)) + + +__all__ = [ + "logging_dictConfig", "ipaddress", "uses_pycache", "console_to_str", + "native_str", "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", + "OrderedDict", +] + + +if sys.version_info >= (3, 4): + uses_pycache = True + from importlib.util import cache_from_source +else: + import imp + uses_pycache = hasattr(imp, 'cache_from_source') + if uses_pycache: + cache_from_source = imp.cache_from_source + else: + cache_from_source = None + + +if sys.version_info >= (3,): + def console_to_str(s): + try: + return s.decode(sys.__stdout__.encoding) + except UnicodeDecodeError: + return s.decode('utf_8') + + def native_str(s, replace=False): + if isinstance(s, bytes): + return s.decode('utf-8', 'replace' if replace else 'strict') + return s + +else: + def console_to_str(s): + return s + + def native_str(s, replace=False): + # Replace is ignored -- unicode to UTF-8 can't fail + if isinstance(s, text_type): + return s.encode('utf-8') + return s + + +def total_seconds(td): + if hasattr(td, "total_seconds"): + return td.total_seconds() + else: + val = td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6 + return val / 10 ** 6 + + +def get_path_uid(path): + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, 'O_NOFOLLOW'): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError( + "%s is a symlink; Will not return uid for symlinks" % path + ) + return file_uid + + +def expanduser(path): + """ + Expand ~ and ~user constructions. + + Includes a workaround for http://bugs.python.org/issue14768 + """ + expanded = os.path.expanduser(path) + if path.startswith('~/') and expanded.startswith('//'): + expanded = expanded[1:] + return expanded + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = ('python', 'wsgiref') +if sys.version_info >= (2, 7): + stdlib_pkgs += ('argparse',) + + +# windows detection, covers cpython and ironpython +WINDOWS = (sys.platform.startswith("win") or + (sys.platform == 'cli' and os.name == 'nt')) + + +def samefile(file1, file2): + """Provide an alternative for os.path.samefile on Windows/Python2""" + if hasattr(os.path, 'samefile'): + return os.path.samefile(file1, file2) + else: + path1 = os.path.normcase(os.path.abspath(file1)) + path2 = os.path.normcase(os.path.abspath(file2)) + return path1 == path2 diff --git a/vendor/pip-9.0.3/pip/compat/dictconfig.py b/vendor/pip-9.0.3/pip/compat/dictconfig.py new file mode 100644 index 0000000000000000000000000000000000000000..ec684aac2033a5d9897e5a9330d2090372ddf298 --- /dev/null +++ b/vendor/pip-9.0.3/pip/compat/dictconfig.py @@ -0,0 +1,565 @@ +# This is a copy of the Python logging.config.dictconfig module, +# reproduced with permission. It is provided here for backwards +# compatibility for Python versions prior to 2.7. +# +# Copyright 2009-2010 by Vinay Sajip. All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appear in all copies and that +# both that copyright notice and this permission notice appear in +# supporting documentation, and that the name of Vinay Sajip +# not be used in advertising or publicity pertaining to distribution +# of the software without specific, written prior permission. +# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL +# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +from __future__ import absolute_import + +import logging.handlers +import re +import sys +import types + +from pip._vendor import six + +# flake8: noqa + +IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + +def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + +# +# This function is defined in logging only in recent versions of Python +# +try: + from logging import _checkLevel +except ImportError: + def _checkLevel(level): + if isinstance(level, int): + rv = level + elif str(level) == level: + if level not in logging._levelNames: + raise ValueError('Unknown level: %r' % level) + rv = logging._levelNames[level] + else: + raise TypeError('Level not an integer or a ' + 'valid string: %r' % level) + return rv + +# The ConvertingXXX classes are wrappers around standard Python containers, +# and they serve to convert any suitable values in the container. The +# conversion converts base dicts, lists and tuples to their wrapped +# equivalents, whereas strings which match a conversion format are converted +# appropriately. +# +# Each wrapper should have a configurator attribute holding the actual +# configurator to use for conversion. + + +class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + # If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + # If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + +class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + # If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + +class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + +class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = __import__ + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + # print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + # rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, six.string_types): # str for py3k + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType: + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict((k, config[k]) for k in config if valid_ident(k)) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value + + +class DictConfigurator(BaseConfigurator): + """ + Configure logging using a dictionary-like object to describe the + configuration. + """ + + def configure(self): + """Do the configuration.""" + + config = self.config + if 'version' not in config: + raise ValueError("dictionary doesn't specify a version") + if config['version'] != 1: + raise ValueError("Unsupported version: %s" % config['version']) + incremental = config.pop('incremental', False) + EMPTY_DICT = {} + logging._acquireLock() + try: + if incremental: + handlers = config.get('handlers', EMPTY_DICT) + # incremental handler config only if handler name + # ties in to logging._handlers (Python 2.7) + if sys.version_info[:2] == (2, 7): + for name in handlers: + if name not in logging._handlers: + raise ValueError('No handler found with ' + 'name %r' % name) + else: + try: + handler = logging._handlers[name] + handler_config = handlers[name] + level = handler_config.get('level', None) + if level: + handler.setLevel(_checkLevel(level)) + except StandardError as e: + raise ValueError('Unable to configure handler ' + '%r: %s' % (name, e)) + loggers = config.get('loggers', EMPTY_DICT) + for name in loggers: + try: + self.configure_logger(name, loggers[name], True) + except StandardError as e: + raise ValueError('Unable to configure logger ' + '%r: %s' % (name, e)) + root = config.get('root', None) + if root: + try: + self.configure_root(root, True) + except StandardError as e: + raise ValueError('Unable to configure root ' + 'logger: %s' % e) + else: + disable_existing = config.pop('disable_existing_loggers', True) + + logging._handlers.clear() + del logging._handlerList[:] + + # Do formatters first - they don't refer to anything else + formatters = config.get('formatters', EMPTY_DICT) + for name in formatters: + try: + formatters[name] = self.configure_formatter( + formatters[name]) + except StandardError as e: + raise ValueError('Unable to configure ' + 'formatter %r: %s' % (name, e)) + # Next, do filters - they don't refer to anything else, either + filters = config.get('filters', EMPTY_DICT) + for name in filters: + try: + filters[name] = self.configure_filter(filters[name]) + except StandardError as e: + raise ValueError('Unable to configure ' + 'filter %r: %s' % (name, e)) + + # Next, do handlers - they refer to formatters and filters + # As handlers can refer to other handlers, sort the keys + # to allow a deterministic order of configuration + handlers = config.get('handlers', EMPTY_DICT) + for name in sorted(handlers): + try: + handler = self.configure_handler(handlers[name]) + handler.name = name + handlers[name] = handler + except StandardError as e: + raise ValueError('Unable to configure handler ' + '%r: %s' % (name, e)) + # Next, do loggers - they refer to handlers and filters + + # we don't want to lose the existing loggers, + # since other threads may have pointers to them. + # existing is set to contain all existing loggers, + # and as we go through the new configuration we + # remove any which are configured. At the end, + # what's left in existing is the set of loggers + # which were in the previous configuration but + # which are not in the new configuration. + root = logging.root + existing = list(root.manager.loggerDict) + # The list needs to be sorted so that we can + # avoid disabling child loggers of explicitly + # named loggers. With a sorted list it is easier + # to find the child loggers. + existing.sort() + # We'll keep the list of existing loggers + # which are children of named loggers here... + child_loggers = [] + # now set up the new ones... + loggers = config.get('loggers', EMPTY_DICT) + for name in loggers: + if name in existing: + i = existing.index(name) + prefixed = name + "." + pflen = len(prefixed) + num_existing = len(existing) + i = i + 1 # look at the entry after name + while (i < num_existing) and\ + (existing[i][:pflen] == prefixed): + child_loggers.append(existing[i]) + i = i + 1 + existing.remove(name) + try: + self.configure_logger(name, loggers[name]) + except StandardError as e: + raise ValueError('Unable to configure logger ' + '%r: %s' % (name, e)) + + # Disable any old loggers. There's no point deleting + # them as other threads may continue to hold references + # and by disabling them, you stop them doing any logging. + # However, don't disable children of named loggers, as that's + # probably not what was intended by the user. + for log in existing: + logger = root.manager.loggerDict[log] + if log in child_loggers: + logger.level = logging.NOTSET + logger.handlers = [] + logger.propagate = True + elif disable_existing: + logger.disabled = True + + # And finally, do the root logger + root = config.get('root', None) + if root: + try: + self.configure_root(root) + except StandardError as e: + raise ValueError('Unable to configure root ' + 'logger: %s' % e) + finally: + logging._releaseLock() + + def configure_formatter(self, config): + """Configure a formatter from a dictionary.""" + if '()' in config: + factory = config['()'] # for use in exception handler + try: + result = self.configure_custom(config) + except TypeError as te: + if "'format'" not in str(te): + raise + # Name of parameter changed from fmt to format. + # Retry with old name. + # This is so that code can be used with older Python versions + #(e.g. by Django) + config['fmt'] = config.pop('format') + config['()'] = factory + result = self.configure_custom(config) + else: + fmt = config.get('format', None) + dfmt = config.get('datefmt', None) + result = logging.Formatter(fmt, dfmt) + return result + + def configure_filter(self, config): + """Configure a filter from a dictionary.""" + if '()' in config: + result = self.configure_custom(config) + else: + name = config.get('name', '') + result = logging.Filter(name) + return result + + def add_filters(self, filterer, filters): + """Add filters to a filterer from a list of names.""" + for f in filters: + try: + filterer.addFilter(self.config['filters'][f]) + except StandardError as e: + raise ValueError('Unable to add filter %r: %s' % (f, e)) + + def configure_handler(self, config): + """Configure a handler from a dictionary.""" + formatter = config.pop('formatter', None) + if formatter: + try: + formatter = self.config['formatters'][formatter] + except StandardError as e: + raise ValueError('Unable to set formatter ' + '%r: %s' % (formatter, e)) + level = config.pop('level', None) + filters = config.pop('filters', None) + if '()' in config: + c = config.pop('()') + if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType: + c = self.resolve(c) + factory = c + else: + klass = self.resolve(config.pop('class')) + # Special case for handler which refers to another handler + if issubclass(klass, logging.handlers.MemoryHandler) and\ + 'target' in config: + try: + config['target'] = self.config['handlers'][config['target']] + except StandardError as e: + raise ValueError('Unable to set target handler ' + '%r: %s' % (config['target'], e)) + elif issubclass(klass, logging.handlers.SMTPHandler) and\ + 'mailhost' in config: + config['mailhost'] = self.as_tuple(config['mailhost']) + elif issubclass(klass, logging.handlers.SysLogHandler) and\ + 'address' in config: + config['address'] = self.as_tuple(config['address']) + factory = klass + kwargs = dict((k, config[k]) for k in config if valid_ident(k)) + try: + result = factory(**kwargs) + except TypeError as te: + if "'stream'" not in str(te): + raise + # The argument name changed from strm to stream + # Retry with old name. + # This is so that code can be used with older Python versions + #(e.g. by Django) + kwargs['strm'] = kwargs.pop('stream') + result = factory(**kwargs) + if formatter: + result.setFormatter(formatter) + if level is not None: + result.setLevel(_checkLevel(level)) + if filters: + self.add_filters(result, filters) + return result + + def add_handlers(self, logger, handlers): + """Add handlers to a logger from a list of names.""" + for h in handlers: + try: + logger.addHandler(self.config['handlers'][h]) + except StandardError as e: + raise ValueError('Unable to add handler %r: %s' % (h, e)) + + def common_logger_config(self, logger, config, incremental=False): + """ + Perform configuration which is common to root and non-root loggers. + """ + level = config.get('level', None) + if level is not None: + logger.setLevel(_checkLevel(level)) + if not incremental: + # Remove any existing handlers + for h in logger.handlers[:]: + logger.removeHandler(h) + handlers = config.get('handlers', None) + if handlers: + self.add_handlers(logger, handlers) + filters = config.get('filters', None) + if filters: + self.add_filters(logger, filters) + + def configure_logger(self, name, config, incremental=False): + """Configure a non-root logger from a dictionary.""" + logger = logging.getLogger(name) + self.common_logger_config(logger, config, incremental) + propagate = config.get('propagate', None) + if propagate is not None: + logger.propagate = propagate + + def configure_root(self, config, incremental=False): + """Configure a root logger from a dictionary.""" + root = logging.getLogger() + self.common_logger_config(root, config, incremental) + +dictConfigClass = DictConfigurator + + +def dictConfig(config): + """Configure logging using a dictionary.""" + dictConfigClass(config).configure() diff --git a/vendor/pip-9.0.3/pip/download.py b/vendor/pip-9.0.3/pip/download.py new file mode 100644 index 0000000000000000000000000000000000000000..039e55aed191a582628db880b0b6f3ea4b30abb7 --- /dev/null +++ b/vendor/pip-9.0.3/pip/download.py @@ -0,0 +1,906 @@ +from __future__ import absolute_import + +import cgi +import email.utils +import getpass +import json +import logging +import mimetypes +import os +import platform +import re +import shutil +import sys +import tempfile + +try: + import ssl # noqa + HAS_TLS = True +except ImportError: + HAS_TLS = False + +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +import pip + +from pip.exceptions import InstallationError, HashMismatch +from pip.models import PyPI +from pip.utils import (splitext, rmtree, format_size, display_path, + backup_dir, ask_path_exists, unpack_file, + ARCHIVE_EXTENSIONS, consume, call_subprocess) +from pip.utils.encoding import auto_decode +from pip.utils.filesystem import check_path_owner +from pip.utils.logging import indent_log +from pip.utils.setuptools_build import SETUPTOOLS_SHIM +from pip.utils.glibc import libc_ver +from pip.utils.ui import DownloadProgressBar, DownloadProgressSpinner +from pip.locations import write_delete_marker_file +from pip.vcs import vcs +from pip._vendor import requests, six +from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.utils import get_netrc_auth +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor import urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.lockfile import LockError +from pip._vendor.six.moves import xmlrpc_client + + +__all__ = ['get_file_content', + 'is_url', 'url_to_path', 'path_to_url', + 'is_archive_file', 'unpack_vcs_link', + 'unpack_file_url', 'is_vcs_url', 'is_file_url', + 'unpack_http_url', 'unpack_url'] + + +logger = logging.getLogger(__name__) + + +def user_agent(): + """ + Return a string representing the user agent. + """ + data = { + "installer": {"name": "pip", "version": pip.__version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == 'CPython': + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'PyPy': + if sys.pypy_version_info.releaselevel == 'final': + pypy_version_info = sys.pypy_version_info[:3] + else: + pypy_version_info = sys.pypy_version_info + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == 'Jython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'IronPython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + distro_infos = dict(filter( + lambda x: x[1], + zip(["name", "version", "id"], distro.linux_distribution()), + )) + libc = dict(filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + )) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + # Python 2.6 doesn't have ssl.OPENSSL_VERSION. + if HAS_TLS and sys.version_info[:2] > (2, 6): + data["openssl_version"] = ssl.OPENSSL_VERSION + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class MultiDomainBasicAuth(AuthBase): + + def __init__(self, prompting=True): + self.prompting = prompting + self.passwords = {} + + def __call__(self, req): + parsed = urllib_parse.urlparse(req.url) + + # Get the netloc without any embedded credentials + netloc = parsed.netloc.rsplit("@", 1)[-1] + + # Set the url of the request to the url without any credentials + req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) + + # Use any stored credentials that we have for this netloc + username, password = self.passwords.get(netloc, (None, None)) + + # Extract credentials embedded in the url if we have none stored + if username is None: + username, password = self.parse_credentials(parsed.netloc) + + # Get creds from netrc if we still don't have them + if username is None and password is None: + netrc_auth = get_netrc_auth(req.url) + username, password = netrc_auth if netrc_auth else (None, None) + + if username or password: + # Store the username and password + self.passwords[netloc] = (username, password) + + # Send the basic auth with this request + req = HTTPBasicAuth(username or "", password or "")(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + def handle_401(self, resp, **kwargs): + # We only care about 401 responses, anything else we want to just + # pass through the actual response + if resp.status_code != 401: + return resp + + # We are not able to prompt the user so simply return the response + if not self.prompting: + return resp + + parsed = urllib_parse.urlparse(resp.url) + + # Prompt the user for a new username and password + username = six.moves.input("User for %s: " % parsed.netloc) + password = getpass.getpass("Password: ") + + # Store the new username and password to use for future requests + if username or password: + self.passwords[parsed.netloc] = (username, password) + + # Consume content and release the original connection to allow our new + # request to reuse the same one. + resp.content + resp.raw.release_conn() + + # Add our new username and password to the request + req = HTTPBasicAuth(username or "", password or "")(resp.request) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def parse_credentials(self, netloc): + if "@" in netloc: + userinfo = netloc.rsplit("@", 1)[0] + if ":" in userinfo: + return userinfo.split(":", 1) + return userinfo, None + return None, None + + +class LocalFSAdapter(BaseAdapter): + + def send(self, request, stream=None, timeout=None, verify=None, cert=None, + proxies=None): + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + resp.status_code = 404 + resp.raw = exc + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict({ + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + }) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self): + pass + + +class SafeFileCache(FileCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, *args, **kwargs): + super(SafeFileCache, self).__init__(*args, **kwargs) + + # Check to ensure that the directory containing our cache directory + # is owned by the user current executing pip. If it does not exist + # we will check the parent directory until we find one that does exist. + # If it is not owned by the user executing pip then we will disable + # the cache and log a warning. + if not check_path_owner(self.directory): + logger.warning( + "The directory '%s' or its parent directory is not owned by " + "the current user and the cache has been disabled. Please " + "check the permissions and owner of that directory. If " + "executing pip with sudo, you may want sudo's -H flag.", + self.directory, + ) + + # Set our directory to None to disable the Cache + self.directory = None + + def get(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).get(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def set(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).set(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def delete(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).delete(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + + def cert_verify(self, conn, url, verify, cert): + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + + +class PipSession(requests.Session): + + timeout = None + + def __init__(self, *args, **kwargs): + retries = kwargs.pop("retries", 0) + cache = kwargs.pop("cache", None) + insecure_hosts = kwargs.pop("insecure_hosts", []) + + super(PipSession, self).__init__(*args, **kwargs) + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth() + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + status_forcelist=[503], + + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) + + # We want to _only_ cache responses on securely fetched origins. We do + # this because we can't validate the response of an insecurely fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache, use_dir_lock=True), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching (see above) so we'll use it for all http:// URLs as + # well as any https:// host that we've marked as ignoring TLS errors + # for. + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + # We want to use a non-validating adapter for any requests which are + # deemed insecure. + for host in insecure_hosts: + self.mount("https://{0}/".format(host), insecure_adapter) + + def request(self, method, url, *args, **kwargs): + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super(PipSession, self).request(method, url, *args, **kwargs) + + +def get_file_content(url, comes_from=None, session=None): + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode.""" + if session is None: + raise TypeError( + "get_file_content() missing 1 required keyword argument: 'session'" + ) + + match = _scheme_re.search(url) + if match: + scheme = match.group(1).lower() + if (scheme == 'file' and comes_from and + comes_from.startswith('http')): + raise InstallationError( + 'Requirements file %s references URL %s, which is local' + % (comes_from, url)) + if scheme == 'file': + path = url.split(':', 1)[1] + path = path.replace('\\', '/') + match = _url_slash_drive_re.match(path) + if match: + path = match.group(1) + ':' + path.split('|', 1)[1] + path = urllib_parse.unquote(path) + if path.startswith('/'): + path = '/' + path.lstrip('/') + url = path + else: + # FIXME: catch some errors + resp = session.get(url) + resp.raise_for_status() + return resp.url, resp.text + try: + with open(url, 'rb') as f: + content = auto_decode(f.read()) + except IOError as exc: + raise InstallationError( + 'Could not open requirements file: %s' % str(exc) + ) + return url, content + + +_scheme_re = re.compile(r'^(http|https|file):', re.I) +_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) + + +def is_url(name): + """Returns true if the name looks like a URL""" + if ':' not in name: + return False + scheme = name.split(':', 1)[0].lower() + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def url_to_path(url): + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not %r)" % url) + + _, netloc, path, _, _ = urllib_parse.urlsplit(url) + + # if we have a UNC path, prepend UNC share notation + if netloc: + netloc = '\\\\' + netloc + + path = urllib_request.url2pathname(netloc + path) + return path + + +def path_to_url(path): + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) + return url + + +def is_archive_file(name): + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False + + +def unpack_vcs_link(link, location): + vcs_backend = _get_used_vcs_backend(link) + vcs_backend.unpack(location) + + +def _get_used_vcs_backend(link): + for backend in vcs.backends: + if link.scheme in backend.schemes: + vcs_backend = backend(link.url) + return vcs_backend + + +def is_vcs_url(link): + return bool(_get_used_vcs_backend(link)) + + +def is_file_url(link): + return link.url.lower().startswith('file:') + + +def is_dir_url(link): + """Return whether a file:// Link points to a directory. + + ``link`` must not have any other scheme but file://. Call is_file_url() + first. + + """ + link_path = url_to_path(link.url_without_fragment) + return os.path.isdir(link_path) + + +def _progress_indicator(iterable, *args, **kwargs): + return iterable + + +def _download_url(resp, link, content_file, hashes): + try: + total_length = int(resp.headers['content-length']) + except (ValueError, KeyError, TypeError): + total_length = 0 + + cached_resp = getattr(resp, "from_cache", False) + + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif cached_resp: + show_progress = False + elif total_length > (40 * 1000): + show_progress = True + elif not total_length: + show_progress = True + else: + show_progress = False + + show_url = link.show_url + + def resp_read(chunk_size): + try: + # Special case for urllib3. + for chunk in resp.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = resp.raw.read(chunk_size) + if not chunk: + break + yield chunk + + def written_chunks(chunks): + for chunk in chunks: + content_file.write(chunk) + yield chunk + + progress_indicator = _progress_indicator + + if link.netloc == PyPI.netloc: + url = show_url + else: + url = link.url_without_fragment + + if show_progress: # We don't show progress on cached responses + if total_length: + logger.info("Downloading %s (%s)", url, format_size(total_length)) + progress_indicator = DownloadProgressBar(max=total_length).iter + else: + logger.info("Downloading %s", url) + progress_indicator = DownloadProgressSpinner().iter + elif cached_resp: + logger.info("Using cached %s", url) + else: + logger.info("Downloading %s", url) + + logger.debug('Downloading from URL %s', link) + + downloaded_chunks = written_chunks( + progress_indicator( + resp_read(CONTENT_CHUNK_SIZE), + CONTENT_CHUNK_SIZE + ) + ) + if hashes: + hashes.check_against_chunks(downloaded_chunks) + else: + consume(downloaded_chunks) + + +def _copy_file(filename, location, link): + copy = True + download_location = os.path.join(location, link.filename) + if os.path.exists(download_location): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % + display_path(download_location), ('i', 'w', 'b', 'a')) + if response == 'i': + copy = False + elif response == 'w': + logger.warning('Deleting %s', display_path(download_location)) + os.remove(download_location) + elif response == 'b': + dest_file = backup_dir(download_location) + logger.warning( + 'Backing up %s to %s', + display_path(download_location), + display_path(dest_file), + ) + shutil.move(download_location, dest_file) + elif response == 'a': + sys.exit(-1) + if copy: + shutil.copy(filename, download_location) + logger.info('Saved %s', display_path(download_location)) + + +def unpack_http_url(link, location, download_dir=None, + session=None, hashes=None): + if session is None: + raise TypeError( + "unpack_http_url() missing 1 required keyword argument: 'session'" + ) + + temp_dir = tempfile.mkdtemp('-unpack', 'pip-') + + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = mimetypes.guess_type(from_path)[0] + else: + # let's download to a tmp dir + from_path, content_type = _download_http_url(link, + session, + temp_dir, + hashes) + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified; let's copy the archive there + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + if not already_downloaded_path: + os.unlink(from_path) + rmtree(temp_dir) + + +def unpack_file_url(link, location, download_dir=None, hashes=None): + """Unpack link into location. + + If download_dir is provided and link points to a file, make a copy + of the link file inside download_dir. + """ + link_path = url_to_path(link.url_without_fragment) + + # If it's a url to a local directory + if is_dir_url(link): + if os.path.isdir(location): + rmtree(location) + shutil.copytree(link_path, location, symlinks=True) + if download_dir: + logger.info('Link is a directory, ignoring download_dir') + return + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(link_path) + + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link_path + + content_type = mimetypes.guess_type(from_path)[0] + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified and not already downloaded + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + +def _copy_dist_from_dir(link_path, location): + """Copy distribution files in `link_path` to `location`. + + Invoked when user requests to install a local directory. E.g.: + + pip install . + pip install ~/dev/git-repos/python-prompt-toolkit + + """ + + # Note: This is currently VERY SLOW if you have a lot of data in the + # directory, because it copies everything with `shutil.copytree`. + # What it should really do is build an sdist and install that. + # See https://github.com/pypa/pip/issues/2195 + + if os.path.isdir(location): + rmtree(location) + + # build an sdist + setup_py = 'setup.py' + sdist_args = [sys.executable] + sdist_args.append('-c') + sdist_args.append(SETUPTOOLS_SHIM % setup_py) + sdist_args.append('sdist') + sdist_args += ['--dist-dir', location] + logger.info('Running setup.py sdist for %s', link_path) + + with indent_log(): + call_subprocess(sdist_args, cwd=link_path, show_stdout=False) + + # unpack sdist into `location` + sdist = os.path.join(location, os.listdir(location)[0]) + logger.info('Unpacking sdist %s into %s', sdist, location) + unpack_file(sdist, location, content_type=None, link=None) + + +class PipXmlrpcTransport(xmlrpc_client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__(self, index_url, session, use_datetime=False): + xmlrpc_client.Transport.__init__(self, use_datetime) + index_parts = urllib_parse.urlparse(index_url) + self._scheme = index_parts.scheme + self._session = session + + def request(self, host, handler, request_body, verbose=False): + parts = (self._scheme, host, handler, None, None, None) + url = urllib_parse.urlunparse(parts) + try: + headers = {'Content-Type': 'text/xml'} + response = self._session.post(url, data=request_body, + headers=headers, stream=True) + response.raise_for_status() + self.verbose = verbose + return self.parse_response(response.raw) + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, url, + ) + raise + + +def unpack_url(link, location, download_dir=None, + only_download=False, session=None, hashes=None): + """Unpack link. + If link is a VCS link: + if only_download, export into download_dir and ignore location + else unpack into location + for other types of link: + - unpack into location + - if download_dir, copy the file into download_dir + - if only_download, mark location for deletion + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if is_vcs_url(link): + unpack_vcs_link(link, location) + + # file urls + elif is_file_url(link): + unpack_file_url(link, location, download_dir, hashes=hashes) + + # http urls + else: + if session is None: + session = PipSession() + + unpack_http_url( + link, + location, + download_dir, + session, + hashes=hashes + ) + if only_download: + write_delete_marker_file(location) + + +def _download_http_url(link, session, temp_dir, hashes): + """Download link url into temp_dir using provided session""" + target_url = link.url.split('#', 1)[0] + try: + resp = session.get( + target_url, + # We use Accept-Encoding: identity here because requests + # defaults to accepting compressed responses. This breaks in + # a variety of ways depending on how the server is configured. + # - Some servers will notice that the file isn't a compressible + # file and will leave the file alone and with an empty + # Content-Encoding + # - Some servers will notice that the file is already + # compressed and will leave the file alone and will add a + # Content-Encoding: gzip header + # - Some servers won't notice anything at all and will take + # a file that's already been compressed and compress it again + # and set the Content-Encoding: gzip header + # By setting this to request only the identity encoding We're + # hoping to eliminate the third case. Hopefully there does not + # exist a server which when given a file will notice it is + # already compressed and that you're not asking for a + # compressed file and will then decompress it before sending + # because if that's the case I don't think it'll ever be + # possible to make this work. + headers={"Accept-Encoding": "identity"}, + stream=True, + ) + resp.raise_for_status() + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", exc.response.status_code, link, + ) + raise + + content_type = resp.headers.get('content-type', '') + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get('content-disposition') + if content_disposition: + type, params = cgi.parse_header(content_disposition) + # We use ``or`` here because we don't want to use an "empty" value + # from the filename param. + filename = params.get('filename') or filename + ext = splitext(filename)[1] + if not ext: + ext = mimetypes.guess_extension(content_type) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + file_path = os.path.join(temp_dir, filename) + with open(file_path, 'wb') as content_file: + _download_url(resp, link, content_file, hashes) + return file_path, content_type + + +def _check_download_dir(link, download_dir, hashes): + """ Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + if os.path.exists(download_path): + # If already downloaded, does its hash match? + logger.info('File was already downloaded %s', download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + logger.warning( + 'Previously-downloaded file %s has bad hash. ' + 'Re-downloading.', + download_path + ) + os.unlink(download_path) + return None + return download_path + return None diff --git a/vendor/pip-9.0.3/pip/exceptions.py b/vendor/pip-9.0.3/pip/exceptions.py new file mode 100644 index 0000000000000000000000000000000000000000..50b527f90187ae7f2df69b822bf40f3069d3e6c2 --- /dev/null +++ b/vendor/pip-9.0.3/pip/exceptions.py @@ -0,0 +1,244 @@ +"""Exceptions used throughout package""" +from __future__ import absolute_import + +from itertools import chain, groupby, repeat + +from pip._vendor.six import iteritems + + +class PipError(Exception): + """Base pip exception""" + + +class InstallationError(PipError): + """General exception during installation""" + + +class UninstallationError(PipError): + """General exception during uninstallation""" + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self): + self.errors = [] + + def append(self, error): + self.errors.append(error) + + def __str__(self): + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return '\n'.join(lines) + + def __nonzero__(self): + return bool(self.errors) + + def __bool__(self): + return self.__nonzero__() + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + req = None + head = '' + + def body(self): + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + populate_link() having already been called + + """ + return ' %s' % self._requirement_name() + + def __str__(self): + return '%s\n%s' % (self.head, self.body()) + + def _requirement_name(self): + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else 'unknown package' + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ("Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:") + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ("Can't verify hashes for these file:// requirements because they " + "point to directories:") + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ('Hashes are required in --require-hashes mode, but they are ' + 'missing from some requirements. Here is a list of those ' + 'requirements along with the hashes their downloaded archives ' + 'actually had. Add lines like these to your requirements files to ' + 'prevent tampering. (If you did not enable --require-hashes ' + 'manually, note that it turns on automatically when any package ' + 'has a hash.)') + + def __init__(self, gotten_hash): + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self): + from pip.utils.hashes import FAVORITE_HASH # Dodge circular import. + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = (self.req.original_link if self.req.original_link + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, 'req', None)) + return ' %s --hash=%s:%s' % (package or 'unknown package', + FAVORITE_HASH, + self.gotten_hash) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ('In --require-hashes mode, all requirements must have their ' + 'versions pinned with ==. These do not:') + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + order = 4 + head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' + 'FILE. If you have updated the package versions, please update ' + 'the hashes. Otherwise, examine the package contents carefully; ' + 'someone may have tampered with them.') + + def __init__(self, allowed, gots): + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self): + return ' %s:\n%s' % (self._requirement_name(), + self._hash_comparison()) + + def _hash_comparison(self): + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + def hash_then_or(hash_name): + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(' or')) + + lines = [] + for hash_name, expecteds in iteritems(self.allowed): + prefix = hash_then_or(hash_name) + lines.extend((' Expected %s %s' % (next(prefix), e)) + for e in expecteds) + lines.append(' Got %s\n' % + self.gots[hash_name].hexdigest()) + prefix = ' or' + return '\n'.join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" diff --git a/vendor/pip-9.0.3/pip/index.py b/vendor/pip-9.0.3/pip/index.py new file mode 100644 index 0000000000000000000000000000000000000000..f653f6e6a6e0845891e1e0d770ded6eb0d0b0039 --- /dev/null +++ b/vendor/pip-9.0.3/pip/index.py @@ -0,0 +1,1102 @@ +"""Routines related to PyPI, indexes""" +from __future__ import absolute_import + +import logging +import cgi +from collections import namedtuple +import itertools +import sys +import os +import re +import mimetypes +import posixpath +import warnings + +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip.compat import ipaddress +from pip.utils import ( + cached_property, splitext, normalize_path, + ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, +) +from pip.utils.deprecation import RemovedInPip10Warning +from pip.utils.logging import indent_log +from pip.utils.packaging import check_requires_python +from pip.exceptions import ( + DistributionNotFound, BestVersionAlreadyInstalled, InvalidWheelFilename, + UnsupportedWheel, +) +from pip.download import HAS_TLS, is_url, path_to_url, url_to_path +from pip.wheel import Wheel, wheel_ext +from pip.pep425tags import get_supported +from pip._vendor import html5lib, requests, six +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging import specifiers +from pip._vendor.requests.exceptions import SSLError +from pip._vendor.distlib.compat import unescape + + +__all__ = ['FormatControl', 'fmt_ctl_handle_mutual_exclude', 'PackageFinder'] + + +SECURE_ORIGINS = [ + # protocol, hostname, port + # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) + ("https", "*", "*"), + ("*", "localhost", "*"), + ("*", "127.0.0.0/8", "*"), + ("*", "::1/128", "*"), + ("file", "*", None), + # ssh is always secure. + ("ssh", "*", "*"), +] + + +logger = logging.getLogger(__name__) + + +class InstallationCandidate(object): + + def __init__(self, project, version, location): + self.project = project + self.version = parse_version(version) + self.location = location + self._key = (self.project, self.version, self.location) + + def __repr__(self): + return "<InstallationCandidate({0!r}, {1!r}, {2!r})>".format( + self.project, self.version, self.location, + ) + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, InstallationCandidate): + return NotImplemented + + return method(self._key, other._key) + + +class PackageFinder(object): + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__(self, find_links, index_urls, allow_all_prereleases=False, + trusted_hosts=None, process_dependency_links=False, + session=None, format_control=None, platform=None, + versions=None, abi=None, implementation=None): + """Create a PackageFinder. + + :param format_control: A FormatControl object or None. Used to control + the selection of source packages / binary packages when consulting + the index and links. + :param platform: A string or None. If None, searches for packages + that are supported by the current system. Otherwise, will find + packages that can be built on the platform passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param versions: A list of strings or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param abi: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param implementation: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + """ + if session is None: + raise TypeError( + "PackageFinder() missing 1 required keyword argument: " + "'session'" + ) + + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + self.find_links = [] + for link in find_links: + if link.startswith('~'): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + self.find_links.append(link) + + self.index_urls = index_urls + self.dependency_links = [] + + # These are boring links that have already been logged somehow: + self.logged_links = set() + + self.format_control = format_control or FormatControl(set(), set()) + + # Domains that we won't emit warnings for when not using HTTPS + self.secure_origins = [ + ("*", host, "*") + for host in (trusted_hosts if trusted_hosts else []) + ] + + # Do we want to allow _all_ pre-releases? + self.allow_all_prereleases = allow_all_prereleases + + # Do we process dependency links? + self.process_dependency_links = process_dependency_links + + # The Session we'll use to make requests + self.session = session + + # The valid tags to check potential found wheel candidates against + self.valid_tags = get_supported( + versions=versions, + platform=platform, + abi=abi, + impl=implementation, + ) + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not HAS_TLS: + for link in itertools.chain(self.index_urls, self.find_links): + parsed = urllib_parse.urlparse(link) + if parsed.scheme == "https": + logger.warning( + "pip is configured with locations that require " + "TLS/SSL, however the ssl module in Python is not " + "available." + ) + break + + def add_dependency_links(self, links): + # # FIXME: this shouldn't be global list this, it should only + # # apply to requirements of the package that specifies the + # # dependency_links value + # # FIXME: also, we should track comes_from (i.e., use Link) + if self.process_dependency_links: + warnings.warn( + "Dependency Links processing has been deprecated and will be " + "removed in a future release.", + RemovedInPip10Warning, + ) + self.dependency_links.extend(links) + + @staticmethod + def _sort_locations(locations, expand_dir=False): + """ + Sort locations into "files" (archives) and "urls", and return + a pair of lists (files,urls) + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + url = path_to_url(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if os.path.isdir(path): + if expand_dir: + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url: + urls.append(url) + elif os.path.isfile(path): + sort_path(path) + else: + logger.warning( + "Url '%s' is ignored: it is neither a file " + "nor a directory.", url) + elif is_url(url): + # Only add url with clear scheme + urls.append(url) + else: + logger.warning( + "Url '%s' is ignored. It is either a non-existing " + "path or lacks a specific scheme.", url) + + return files, urls + + def _candidate_sort_key(self, candidate): + """ + Function used to generate link sort key for link tuples. + The greater the return value, the more preferred it is. + If not finding wheels, then sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self.valid_tags) + 3. source archives + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + support_num = len(self.valid_tags) + if candidate.location.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(candidate.location.filename) + if not wheel.supported(self.valid_tags): + raise UnsupportedWheel( + "%s is not a supported wheel for this platform. It " + "can't be sorted." % wheel.filename + ) + pri = -(wheel.support_index_min(self.valid_tags)) + else: # sdist + pri = -(support_num) + return (candidate.version, pri) + + def _validate_secure_origin(self, logger, location): + # Determine if this url used a secure transport mechanism + parsed = urllib_parse.urlparse(str(location)) + origin = (parsed.scheme, parsed.hostname, parsed.port) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + protocol = origin[0].rsplit('+', 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in (SECURE_ORIGINS + self.secure_origins): + if protocol != secure_origin[0] and secure_origin[0] != "*": + continue + + try: + # We need to do this decode dance to ensure that we have a + # unicode object, even on Python 2.x. + addr = ipaddress.ip_address( + origin[1] + if ( + isinstance(origin[1], six.text_type) or + origin[1] is None + ) + else origin[1].decode("utf8") + ) + network = ipaddress.ip_network( + secure_origin[1] + if isinstance(secure_origin[1], six.text_type) + else secure_origin[1].decode("utf8") + ) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if (origin[1] and + origin[1].lower() != secure_origin[1].lower() and + secure_origin[1] != "*"): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port patches + if (origin[2] != secure_origin[2] and + secure_origin[2] != "*" and + secure_origin[2] is not None): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS it " + "is recommended to use HTTPS instead, otherwise you may silence " + "this warning and allow it anyways with '--trusted-host %s'.", + parsed.hostname, + parsed.hostname, + ) + + return False + + def _get_index_urls_locations(self, project_name): + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url): + loc = posixpath.join( + url, + urllib_parse.quote(canonicalize_name(project_name))) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith('/'): + loc = loc + '/' + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] + + def find_all_candidates(self, project_name): + """Find all available InstallationCandidate for project_name + + This checks index_urls, find_links and dependency_links. + All versions found are returned as an InstallationCandidate list. + + See _link_package_versions for details on which files are accepted + """ + index_locations = self._get_index_urls_locations(project_name) + index_file_loc, index_url_loc = self._sort_locations(index_locations) + fl_file_loc, fl_url_loc = self._sort_locations( + self.find_links, expand_dir=True) + dep_file_loc, dep_url_loc = self._sort_locations(self.dependency_links) + + file_locations = ( + Link(url) for url in itertools.chain( + index_file_loc, fl_file_loc, dep_file_loc) + ) + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links + # We explicitly do not trust links that came from dependency_links + # We want to filter out any thing which does not have a secure origin. + url_locations = [ + link for link in itertools.chain( + (Link(url) for url in index_url_loc), + (Link(url) for url in fl_url_loc), + (Link(url) for url in dep_url_loc), + ) + if self._validate_secure_origin(logger, link) + ] + + logger.debug('%d location(s) to search for versions of %s:', + len(url_locations), project_name) + + for location in url_locations: + logger.debug('* %s', location) + + canonical_name = canonicalize_name(project_name) + formats = fmt_ctl_formats(self.format_control, canonical_name) + search = Search(project_name, canonical_name, formats) + find_links_versions = self._package_versions( + # We trust every directly linked archive in find_links + (Link(url, '-f') for url in self.find_links), + search + ) + + page_versions = [] + for page in self._get_pages(url_locations, project_name): + logger.debug('Analyzing links from page %s', page.url) + with indent_log(): + page_versions.extend( + self._package_versions(page.links, search) + ) + + dependency_versions = self._package_versions( + (Link(url) for url in self.dependency_links), search + ) + if dependency_versions: + logger.debug( + 'dependency_links found: %s', + ', '.join([ + version.location.url for version in dependency_versions + ]) + ) + + file_versions = self._package_versions(file_locations, search) + if file_versions: + file_versions.sort(reverse=True) + logger.debug( + 'Local files found: %s', + ', '.join([ + url_to_path(candidate.location.url) + for candidate in file_versions + ]) + ) + + # This is an intentional priority ordering + return ( + file_versions + find_links_versions + page_versions + + dependency_versions + ) + + def find_requirement(self, req, upgrade): + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a Link if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + all_candidates = self.find_all_candidates(req.name) + + # Filter out anything which doesn't match our specifier + compatible_versions = set( + req.specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + [str(c.version) for c in all_candidates], + prereleases=( + self.allow_all_prereleases + if self.allow_all_prereleases else None + ), + ) + ) + applicable_candidates = [ + # Again, converting to str to deal with debundling. + c for c in all_candidates if str(c.version) in compatible_versions + ] + + if applicable_candidates: + best_candidate = max(applicable_candidates, + key=self._candidate_sort_key) + else: + best_candidate = None + + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + else: + installed_version = None + + if installed_version is None and best_candidate is None: + logger.critical( + 'Could not find a version that satisfies the requirement %s ' + '(from versions: %s)', + req, + ', '.join( + sorted( + set(str(c.version) for c in all_candidates), + key=parse_version, + ) + ) + ) + + raise DistributionNotFound( + 'No matching distribution found for %s' % req + ) + + best_installed = False + if installed_version and ( + best_candidate is None or + best_candidate.version <= installed_version): + best_installed = True + + if not upgrade and installed_version is not None: + if best_installed: + logger.debug( + 'Existing installed version (%s) is most up-to-date and ' + 'satisfies requirement', + installed_version, + ) + else: + logger.debug( + 'Existing installed version (%s) satisfies requirement ' + '(most up-to-date version is %s)', + installed_version, + best_candidate.version, + ) + return None + + if best_installed: + # We have an existing version, and its the best version + logger.debug( + 'Installed version (%s) is most up-to-date (past versions: ' + '%s)', + installed_version, + ', '.join(sorted(compatible_versions, key=parse_version)) or + "none", + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + ', '.join(sorted(compatible_versions, key=parse_version)) + ) + return best_candidate.location + + def _get_pages(self, locations, project_name): + """ + Yields (page, page_url) from the given locations, skipping + locations that have errors. + """ + seen = set() + for location in locations: + if location in seen: + continue + seen.add(location) + + page = self._get_page(location) + if page is None: + continue + + yield page + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + def _sort_links(self, links): + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _package_versions(self, links, search): + result = [] + for link in self._sort_links(links): + v = self._link_package_versions(link, search) + if v is not None: + result.append(v) + return result + + def _log_skipped_link(self, link, reason): + if link not in self.logged_links: + logger.debug('Skipping link %s; %s', link, reason) + self.logged_links.add(link) + + def _link_package_versions(self, link, search): + """Return an InstallationCandidate or None""" + version = None + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + self._log_skipped_link(link, 'not a file') + return + if ext not in SUPPORTED_EXTENSIONS: + self._log_skipped_link( + link, 'unsupported archive format: %s' % ext) + return + if "binary" not in search.formats and ext == wheel_ext: + self._log_skipped_link( + link, 'No binaries permitted for %s' % search.supplied) + return + if "macosx10" in link.path and ext == '.zip': + self._log_skipped_link(link, 'macosx10 one') + return + if ext == wheel_ext: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + self._log_skipped_link(link, 'invalid wheel filename') + return + if canonicalize_name(wheel.name) != search.canonical: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return + + if not wheel.supported(self.valid_tags): + self._log_skipped_link( + link, 'it is not compatible with this Python') + return + + version = wheel.version + + # This should be up by the search.ok_binary check, but see issue 2700. + if "source" not in search.formats and ext != wheel_ext: + self._log_skipped_link( + link, 'No sources permitted for %s' % search.supplied) + return + + if not version: + version = egg_info_matches(egg_info, search.supplied, link) + if version is None: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != sys.version[:3]: + self._log_skipped_link( + link, 'Python version is incorrect') + return + try: + support_this_python = check_requires_python(link.requires_python) + except specifiers.InvalidSpecifier: + logger.debug("Package %s has an invalid Requires-Python entry: %s", + link.filename, link.requires_python) + support_this_python = True + + if not support_this_python: + logger.debug("The package %s is incompatible with the python" + "version in use. Acceptable python versions are:%s", + link, link.requires_python) + return + logger.debug('Found link %s, version: %s', link, version) + + return InstallationCandidate(search.supplied, version, link) + + def _get_page(self, link): + return HTMLPage.get_page(link, session=self.session) + + +def egg_info_matches( + egg_info, search_name, link, + _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + """Pull the version part out of a string. + + :param egg_info: The string to parse. E.g. foo-2.1 + :param search_name: The name of the package this belongs to. None to + infer the name. Note that this cannot unambiguously parse strings + like foo-2-2 which might be foo, 2-2 or foo-2, 2. + :param link: The link the string came from, for logging on failure. + """ + match = _egg_info_re.search(egg_info) + if not match: + logger.debug('Could not parse version from link: %s', link) + return None + if search_name is None: + full_match = match.group(0) + return full_match[full_match.index('-'):] + name = match.group(0).lower() + # To match the "safe" name that pkg_resources creates: + name = name.replace('_', '-') + # project name and version must be separated by a dash + look_for = search_name.lower() + "-" + if name.startswith(look_for): + return match.group(0)[len(look_for):] + else: + return None + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__(self, content, url, headers=None): + # Determine if we have any encoding information in our headers + encoding = None + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + + if "charset" in params: + encoding = params['charset'] + + self.content = content + self.parsed = html5lib.parse( + self.content, + transport_encoding=encoding, + namespaceHTMLElements=False, + ) + self.url = url + self.headers = headers + + def __str__(self): + return self.url + + @classmethod + def get_page(cls, link, skip_archives=True, session=None): + if session is None: + raise TypeError( + "get_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url + url = url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + from pip.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + logger.debug('Cannot look at %s URL %s', scheme, link) + return None + + try: + if skip_archives: + filename = link.filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + content_type = cls._get_content_type( + url, session=session, + ) + if content_type.lower().startswith('text/html'): + break + else: + logger.debug( + 'Skipping page %s because of Content-Type: %s', + link, + content_type, + ) + return + + logger.debug('Getting page %s', url) + + # Tack index.html onto file:// URLs that point to directories + (scheme, netloc, path, params, query, fragment) = \ + urllib_parse.urlparse(url) + if (scheme == 'file' and + os.path.isdir(urllib_request.url2pathname(path))): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith('/'): + url += '/' + url = urllib_parse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s', url) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + "Cache-Control": "max-age=600", + }, + ) + resp.raise_for_status() + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is HTML + # or not. However we can check after we've downloaded it. + content_type = resp.headers.get('Content-Type', 'unknown') + if not content_type.lower().startswith("text/html"): + logger.debug( + 'Skipping page %s because of Content-Type: %s', + link, + content_type, + ) + return + + inst = cls(resp.content, resp.url, resp.headers) + except requests.HTTPError as exc: + cls._handle_fail(link, exc, url) + except SSLError as exc: + reason = ("There was a problem confirming the ssl certificate: " + "%s" % exc) + cls._handle_fail(link, reason, url, meth=logger.info) + except requests.ConnectionError as exc: + cls._handle_fail(link, "connection error: %s" % exc, url) + except requests.Timeout: + cls._handle_fail(link, "timed out", url) + else: + return inst + + @staticmethod + def _handle_fail(link, reason, url, meth=None): + if meth is None: + meth = logger.debug + + meth("Could not fetch URL %s: %s - skipping", link, reason) + + @staticmethod + def _get_content_type(url, session): + """Get the Content-Type of the given url, using a HEAD request""" + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in ('http', 'https'): + # FIXME: some warning or something? + # assertion error? + return '' + + resp = session.head(url, allow_redirects=True) + resp.raise_for_status() + + return resp.headers.get("Content-Type", "") + + @cached_property + def base_url(self): + bases = [ + x for x in self.parsed.findall(".//base") + if x.get("href") is not None + ] + if bases and bases[0].get("href"): + return bases[0].get("href") + else: + return self.url + + @property + def links(self): + """Yields all links in the page""" + for anchor in self.parsed.findall(".//a"): + if anchor.get("href"): + href = anchor.get("href") + url = self.clean_link( + urllib_parse.urljoin(self.base_url, href) + ) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + yield Link(url, self, requires_python=pyrequire) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + def clean_link(self, url): + """Makes sure a link is fully encoded. That is, if a ' ' shows up in + the link, it will be rewritten to %20 (while not over-quoting + % or other characters).""" + return self._clean_re.sub( + lambda match: '%%%2x' % ord(match.group(0)), url) + + +class Link(object): + + def __init__(self, url, comes_from=None, requires_python=None): + """ + Object representing a parsed link from https://pypi.python.org/simple/* + + url: + url of the resource pointed to (href of the link) + comes_from: + instance of HTMLPage where the link was found, or string. + requires_python: + String containing the `Requires-Python` metadata field, specified + in PEP 345. This may be specified by a data-requires-python + attribute in the HTML link tag, as described in PEP 503. + """ + + # url can be a UNC windows share + if url.startswith('\\\\'): + url = path_to_url(url) + + self.url = url + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + + def __str__(self): + if self.requires_python: + rp = ' (requires-python:%s)' % self.requires_python + else: + rp = '' + if self.comes_from: + return '%s (from %s)%s' % (self.url, self.comes_from, rp) + else: + return str(self.url) + + def __repr__(self): + return '<Link %s>' % self + + def __eq__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url == other.url + + def __ne__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url != other.url + + def __lt__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url < other.url + + def __le__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url <= other.url + + def __gt__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url > other.url + + def __ge__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url >= other.url + + def __hash__(self): + return hash(self.url) + + @property + def filename(self): + _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) + name = posixpath.basename(path.rstrip('/')) or netloc + name = urllib_parse.unquote(name) + assert name, ('URL %r produced no filename' % self.url) + return name + + @property + def scheme(self): + return urllib_parse.urlsplit(self.url)[0] + + @property + def netloc(self): + return urllib_parse.urlsplit(self.url)[1] + + @property + def path(self): + return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) + + def splitext(self): + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + return self.splitext()[1] + + @property + def url_without_fragment(self): + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url) + return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) + + _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') + + @property + def egg_fragment(self): + match = self._egg_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') + + @property + def subdirectory_fragment(self): + match = self._subdirectory_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile( + r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' + ) + + @property + def hash(self): + match = self._hash_re.search(self.url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + match = self._hash_re.search(self.url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_wheel(self): + return self.ext == wheel_ext + + @property + def is_artifact(self): + """ + Determines if this points to an actual artifact (e.g. a tarball) or if + it points to an "abstract" thing like a path or a VCS location. + """ + from pip.vcs import vcs + + if self.scheme in vcs.all_schemes: + return False + + return True + + +FormatControl = namedtuple('FormatControl', 'no_binary only_binary') +"""This object has two fields, no_binary and only_binary. + +If a field is falsy, it isn't set. If it is {':all:'}, it should match all +packages except those listed in the other field. Only one field can be set +to {':all:'} at a time. The rest of the time exact package name matches +are listed, with any given package only showing up in one field at a time. +""" + + +def fmt_ctl_handle_mutual_exclude(value, target, other): + new = value.split(',') + while ':all:' in new: + other.clear() + target.clear() + target.add(':all:') + del new[:new.index(':all:') + 1] + if ':none:' not in new: + # Without a none, we want to discard everything as :all: covers it + return + for name in new: + if name == ':none:': + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + +def fmt_ctl_formats(fmt_ctl, canonical_name): + result = set(["binary", "source"]) + if canonical_name in fmt_ctl.only_binary: + result.discard('source') + elif canonical_name in fmt_ctl.no_binary: + result.discard('binary') + elif ':all:' in fmt_ctl.only_binary: + result.discard('source') + elif ':all:' in fmt_ctl.no_binary: + result.discard('binary') + return frozenset(result) + + +def fmt_ctl_no_binary(fmt_ctl): + fmt_ctl_handle_mutual_exclude( + ':all:', fmt_ctl.no_binary, fmt_ctl.only_binary) + + +def fmt_ctl_no_use_wheel(fmt_ctl): + fmt_ctl_no_binary(fmt_ctl) + warnings.warn( + '--no-use-wheel is deprecated and will be removed in the future. ' + ' Please use --no-binary :all: instead.', RemovedInPip10Warning, + stacklevel=2) + + +Search = namedtuple('Search', 'supplied canonical formats') +"""Capture key aspects of a search. + +:attribute supplied: The user supplied package. +:attribute canonical: The canonical package name. +:attribute formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. +""" diff --git a/vendor/pip-9.0.3/pip/locations.py b/vendor/pip-9.0.3/pip/locations.py new file mode 100644 index 0000000000000000000000000000000000000000..e598ef105a440e371a9127da646ed1dcf877844f --- /dev/null +++ b/vendor/pip-9.0.3/pip/locations.py @@ -0,0 +1,182 @@ +"""Locations where we look for configs, install stuff, etc""" +from __future__ import absolute_import + +import os +import os.path +import site +import sys + +from distutils import sysconfig +from distutils.command.install import install, SCHEME_KEYS # noqa + +from pip.compat import WINDOWS, expanduser +from pip.utils import appdirs + + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + + +DELETE_MARKER_MESSAGE = '''\ +This file is placed here by pip to indicate the source was put +here by pip. + +Once this package is successfully installed this source code will be +deleted (unless you remove this file). +''' +PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' + + +def write_delete_marker_file(directory): + """ + Write the pip delete marker file into this directory. + """ + filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) + with open(filepath, 'w') as marker_fp: + marker_fp.write(DELETE_MARKER_MESSAGE) + + +def running_under_virtualenv(): + """ + Return True if we're running inside a virtualenv, False otherwise. + + """ + if hasattr(sys, 'real_prefix'): + return True + elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): + return True + + return False + + +def virtualenv_no_global(): + """ + Return True if in a venv and no system site packages. + """ + # this mirrors the logic in virtualenv.py for locating the + # no-global-site-packages.txt file + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') + if running_under_virtualenv() and os.path.isfile(no_global_file): + return True + + +if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, 'src') +else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), 'src') + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit( + "The folder you are executing pip from can no longer be found." + ) + +# under macOS + virtualenv sys.prefix is not properly resolved +# it is something like /path/to/python/bin/.. +# Note: using realpath due to tmp dirs on OSX being symlinks +src_prefix = os.path.abspath(src_prefix) + +# FIXME doesn't account for venv linked to global site-packages + +site_packages = sysconfig.get_python_lib() +user_site = site.USER_SITE +user_dir = expanduser('~') +if WINDOWS: + bin_py = os.path.join(sys.prefix, 'Scripts') + bin_user = os.path.join(user_site, 'Scripts') + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.ini' + + legacy_storage_dir = os.path.join(user_dir, 'pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) +else: + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.conf' + + legacy_storage_dir = os.path.join(user_dir, '.pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) + + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': + bin_py = '/usr/local/bin' + +site_config_files = [ + os.path.join(path, config_basename) + for path in appdirs.site_config_dirs('pip') +] + + +def distutils_scheme(dist_name, user=False, home=None, root=None, + isolated=False, prefix=None): + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + scheme = {} + + if isolated: + extra_dist_args = {"script_args": ["--no-user-cfg"]} + else: + extra_dist_args = {} + dist_args = {'name': dist_name} + dist_args.update(extra_dist_args) + + d = Distribution(dist_args) + d.parse_config_files() + i = d.get_command_obj('install', create=True) + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), "user={0} prefix={1}".format(user, prefix) + i.user = user or i.user + if user: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + for key in SCHEME_KEYS: + scheme[key] = getattr(i, 'install_' + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + if 'install_lib' in d.get_option_dict('install'): + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + scheme['headers'] = os.path.join( + sys.prefix, + 'include', + 'site', + 'python' + sys.version[:3], + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive( + os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join( + root, + path_no_drive[1:], + ) + + return scheme diff --git a/vendor/pip-9.0.3/pip/models/__init__.py b/vendor/pip-9.0.3/pip/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1d727d7eea7ba617ebb5921be0c2f4d314cd06ed --- /dev/null +++ b/vendor/pip-9.0.3/pip/models/__init__.py @@ -0,0 +1,4 @@ +from pip.models.index import Index, PyPI + + +__all__ = ["Index", "PyPI"] diff --git a/vendor/pip-9.0.3/pip/models/index.py b/vendor/pip-9.0.3/pip/models/index.py new file mode 100644 index 0000000000000000000000000000000000000000..be9911988cf7d7e4231ca7256f3e7311d8e8a5f5 --- /dev/null +++ b/vendor/pip-9.0.3/pip/models/index.py @@ -0,0 +1,16 @@ +from pip._vendor.six.moves.urllib import parse as urllib_parse + + +class Index(object): + def __init__(self, url): + self.url = url + self.netloc = urllib_parse.urlsplit(url).netloc + self.simple_url = self.url_to_path('simple') + self.pypi_url = self.url_to_path('pypi') + self.pip_json_url = self.url_to_path('pypi/pip/json') + + def url_to_path(self, path): + return urllib_parse.urljoin(self.url, path) + + +PyPI = Index('https://pypi.python.org/') diff --git a/vendor/pip-9.0.3/pip/operations/__init__.py b/vendor/pip-9.0.3/pip/operations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/vendor/pip-9.0.3/pip/operations/check.py b/vendor/pip-9.0.3/pip/operations/check.py new file mode 100644 index 0000000000000000000000000000000000000000..2cf67aaeaf4023887e383482ef6086826caeb225 --- /dev/null +++ b/vendor/pip-9.0.3/pip/operations/check.py @@ -0,0 +1,49 @@ + + +def check_requirements(installed_dists): + missing_reqs_dict = {} + incompatible_reqs_dict = {} + + for dist in installed_dists: + key = '%s==%s' % (dist.project_name, dist.version) + + missing_reqs = list(get_missing_reqs(dist, installed_dists)) + if missing_reqs: + missing_reqs_dict[key] = missing_reqs + + incompatible_reqs = list(get_incompatible_reqs( + dist, installed_dists)) + if incompatible_reqs: + incompatible_reqs_dict[key] = incompatible_reqs + + return (missing_reqs_dict, incompatible_reqs_dict) + + +def get_missing_reqs(dist, installed_dists): + """Return all of the requirements of `dist` that aren't present in + `installed_dists`. + + """ + installed_names = set(d.project_name.lower() for d in installed_dists) + missing_requirements = set() + + for requirement in dist.requires(): + if requirement.project_name.lower() not in installed_names: + missing_requirements.add(requirement) + yield requirement + + +def get_incompatible_reqs(dist, installed_dists): + """Return all of the requirements of `dist` that are present in + `installed_dists`, but have incompatible versions. + + """ + installed_dists_by_name = {} + for installed_dist in installed_dists: + installed_dists_by_name[installed_dist.project_name] = installed_dist + + for requirement in dist.requires(): + present_dist = installed_dists_by_name.get(requirement.project_name) + + if present_dist and present_dist not in requirement: + yield (requirement, present_dist) diff --git a/vendor/pip-9.0.3/pip/operations/freeze.py b/vendor/pip-9.0.3/pip/operations/freeze.py new file mode 100644 index 0000000000000000000000000000000000000000..920c2c12848c31853af6cefc35efddc8e08d3b9e --- /dev/null +++ b/vendor/pip-9.0.3/pip/operations/freeze.py @@ -0,0 +1,132 @@ +from __future__ import absolute_import + +import logging +import re + +import pip +from pip.req import InstallRequirement +from pip.req.req_file import COMMENT_RE +from pip.utils import get_installed_distributions +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, + find_links=None, local_only=None, user_only=None, skip_regex=None, + default_vcs=None, + isolated=False, + wheel_cache=None, + skip=()): + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + dependency_links = [] + + for dist in pkg_resources.working_set: + if dist.has_metadata('dependency_links.txt'): + dependency_links.extend( + dist.get_metadata_lines('dependency_links.txt') + ) + for link in find_links: + if '#egg=' in link: + dependency_links.append(link) + for link in find_links: + yield '-f %s' % link + installations = {} + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only): + try: + req = pip.FrozenRequirement.from_dist( + dist, + dependency_links + ) + except RequirementParseError: + logger.warning( + "Could not parse requirement: %s", + dist.project_name + ) + continue + installations[req.name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options = set() + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if (not line.strip() or + line.strip().startswith('#') or + (skip_match and skip_match(line)) or + line.startswith(( + '-r', '--requirement', + '-Z', '--always-unzip', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url'))): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith('-e') or line.startswith('--editable'): + if line.startswith('-e'): + line = line[2:].strip() + else: + line = line[len('--editable'):].strip().lstrip('=') + line_req = InstallRequirement.from_editable( + line, + default_vcs=default_vcs, + isolated=isolated, + wheel_cache=wheel_cache, + ) + else: + line_req = InstallRequirement.from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + wheel_cache=wheel_cache, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + elif line_req.name not in installations: + logger.warning( + "Requirement file [%s] contains %s, but that " + "package is not installed", + req_file_path, COMMENT_RE.sub('', line).strip(), + ) + else: + yield str(installations[line_req.name]).rstrip() + del installations[line_req.name] + + yield( + '## The following requirements were added by ' + 'pip freeze:' + ) + for installation in sorted( + installations.values(), key=lambda x: x.name.lower()): + if canonicalize_name(installation.name) not in skip: + yield str(installation).rstrip() diff --git a/vendor/pip-9.0.3/pip/pep425tags.py b/vendor/pip-9.0.3/pip/pep425tags.py new file mode 100644 index 0000000000000000000000000000000000000000..ad202ef313f57697c79dc0a4802956d1d49a7b4e --- /dev/null +++ b/vendor/pip-9.0.3/pip/pep425tags.py @@ -0,0 +1,324 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import re +import sys +import warnings +import platform +import logging + +try: + import sysconfig +except ImportError: # pragma nocover + # Python < 2.7 + import distutils.sysconfig as sysconfig +import distutils.util + +from pip.compat import OrderedDict +import pip.utils.glibc + +logger = logging.getLogger(__name__) + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{0}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + """ + Returns the Tag for this specific implementation. + """ + return "{0}{1}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + logger.debug("Config variable '%s' is unset, Python ABI tag may " + "be incorrect", var) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + return sys.maxsize == 2147483647 + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{0}_{1}_{2}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # Only Linux, and only x86-64 / i686 + if get_platform() not in ("linux_x86_64", "linux_i686"): + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return pip.utils.glibc.have_compatible_glibc(2, 5) + + +def get_darwin_arches(major, minor, machine): + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of an macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = impl or get_abbr_impl() + + abis = [] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + import imp + for suffix in imp.get_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{0}_{1}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif platform is None and is_manylinux1_compatible(): + arches = [arch.replace('linux', 'manylinux1'), arch] + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in ('31', '30'): + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + +supported_tags = get_supported() +supported_tags_noarch = get_supported(noarch=True) + +implementation_tag = get_impl_tag() diff --git a/vendor/pip-9.0.3/pip/req/__init__.py b/vendor/pip-9.0.3/pip/req/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..00185a4308337a11602f40dc238e93d9b3d47f2d --- /dev/null +++ b/vendor/pip-9.0.3/pip/req/__init__.py @@ -0,0 +1,10 @@ +from __future__ import absolute_import + +from .req_install import InstallRequirement +from .req_set import RequirementSet, Requirements +from .req_file import parse_requirements + +__all__ = [ + "RequirementSet", "Requirements", "InstallRequirement", + "parse_requirements", +] diff --git a/vendor/pip-9.0.3/pip/req/req_file.py b/vendor/pip-9.0.3/pip/req/req_file.py new file mode 100644 index 0000000000000000000000000000000000000000..821df2271db505f1f6cb4ad612868251361cb99b --- /dev/null +++ b/vendor/pip-9.0.3/pip/req/req_file.py @@ -0,0 +1,342 @@ +""" +Requirements file parsing +""" + +from __future__ import absolute_import + +import os +import re +import shlex +import sys +import optparse +import warnings + +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves import filterfalse + +import pip +from pip.download import get_file_content +from pip.req.req_install import InstallRequirement +from pip.exceptions import (RequirementsFileParseError) +from pip.utils.deprecation import RemovedInPip10Warning +from pip import cmdoptions + +__all__ = ['parse_requirements'] + +SCHEME_RE = re.compile(r'^(http|https|file):', re.I) +COMMENT_RE = re.compile(r'(^|\s)+#.*$') + +SUPPORTED_OPTIONS = [ + cmdoptions.constraints, + cmdoptions.editable, + cmdoptions.requirements, + cmdoptions.no_index, + cmdoptions.index_url, + cmdoptions.find_links, + cmdoptions.extra_index_url, + cmdoptions.allow_external, + cmdoptions.allow_all_external, + cmdoptions.no_allow_external, + cmdoptions.allow_unsafe, + cmdoptions.no_allow_unsafe, + cmdoptions.use_wheel, + cmdoptions.no_use_wheel, + cmdoptions.always_unzip, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.pre, + cmdoptions.process_dependency_links, + cmdoptions.trusted_host, + cmdoptions.require_hashes, +] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [o().dest for o in SUPPORTED_OPTIONS_REQ] + + +def parse_requirements(filename, finder=None, comes_from=None, options=None, + session=None, constraint=False, wheel_cache=None): + """Parse a requirements file and yield InstallRequirement instances. + + :param filename: Path or url of requirements file. + :param finder: Instance of pip.index.PackageFinder. + :param comes_from: Origin description of requirements. + :param options: cli options. + :param session: Instance of pip.download.PipSession. + :param constraint: If true, parsing a constraint file rather than + requirements file. + :param wheel_cache: Instance of pip.wheel.WheelCache + """ + if session is None: + raise TypeError( + "parse_requirements() missing 1 required keyword argument: " + "'session'" + ) + + _, content = get_file_content( + filename, comes_from=comes_from, session=session + ) + + lines_enum = preprocess(content, options) + + for line_number, line in lines_enum: + req_iter = process_line(line, filename, line_number, finder, + comes_from, options, session, wheel_cache, + constraint=constraint) + for req in req_iter: + yield req + + +def preprocess(content, options): + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + :param options: cli options + """ + lines_enum = enumerate(content.splitlines(), start=1) + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = skip_regex(lines_enum, options) + return lines_enum + + +def process_line(line, filename, line_number, finder=None, comes_from=None, + options=None, session=None, wheel_cache=None, + constraint=False): + """Process a single requirements line; This can result in creating/yielding + requirements, or updating the finder. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + + :param constraint: If True, parsing a constraints file. + :param options: OptionParser options that we may update + """ + parser = build_parser() + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + # `finder.format_control` will be updated during parsing + defaults.format_control = finder.format_control + args_str, options_str = break_args_options(line) + if sys.version_info < (2, 7, 3): + # Prior to 2.7.3, shlex cannot deal with unicode entries + options_str = options_str.encode('utf8') + opts, _ = parser.parse_args(shlex.split(options_str), defaults) + + # preserve for the nested code path + line_comes_from = '%s %s (line %s)' % ( + '-c' if constraint else '-r', filename, line_number) + + # yield a line requirement + if args_str: + isolated = options.isolated_mode if options else False + if options: + cmdoptions.check_install_build_global(options, opts) + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in opts.__dict__ and opts.__dict__[dest]: + req_options[dest] = opts.__dict__[dest] + yield InstallRequirement.from_line( + args_str, line_comes_from, constraint=constraint, + isolated=isolated, options=req_options, wheel_cache=wheel_cache + ) + + # yield an editable requirement + elif opts.editables: + isolated = options.isolated_mode if options else False + default_vcs = options.default_vcs if options else None + yield InstallRequirement.from_editable( + opts.editables[0], comes_from=line_comes_from, + constraint=constraint, default_vcs=default_vcs, isolated=isolated, + wheel_cache=wheel_cache + ) + + # parse a nested requirements file + elif opts.requirements or opts.constraints: + if opts.requirements: + req_path = opts.requirements[0] + nested_constraint = False + else: + req_path = opts.constraints[0] + nested_constraint = True + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib_parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join(os.path.dirname(filename), req_path) + # TODO: Why not use `comes_from='-r {} (line {})'` here as well? + parser = parse_requirements( + req_path, finder, comes_from, options, session, + constraint=nested_constraint, wheel_cache=wheel_cache + ) + for req in parser: + yield req + + # percolate hash-checking option upward + elif opts.require_hashes: + options.require_hashes = opts.require_hashes + + # set finder options + elif finder: + if opts.allow_external: + warnings.warn( + "--allow-external has been deprecated and will be removed in " + "the future. Due to changes in the repository protocol, it no " + "longer has any effect.", + RemovedInPip10Warning, + ) + + if opts.allow_all_external: + warnings.warn( + "--allow-all-external has been deprecated and will be removed " + "in the future. Due to changes in the repository protocol, it " + "no longer has any effect.", + RemovedInPip10Warning, + ) + + if opts.allow_unverified: + warnings.warn( + "--allow-unverified has been deprecated and will be removed " + "in the future. Due to changes in the repository protocol, it " + "no longer has any effect.", + RemovedInPip10Warning, + ) + + if opts.index_url: + finder.index_urls = [opts.index_url] + if opts.use_wheel is False: + finder.use_wheel = False + pip.index.fmt_ctl_no_use_wheel(finder.format_control) + if opts.no_index is True: + finder.index_urls = [] + if opts.extra_index_urls: + finder.index_urls.extend(opts.extra_index_urls) + if opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + finder.find_links.append(value) + if opts.pre: + finder.allow_all_prereleases = True + if opts.process_dependency_links: + finder.process_dependency_links = True + if opts.trusted_hosts: + finder.secure_origins.extend( + ("*", host, "*") for host in opts.trusted_hosts) + + +def break_args_options(line): + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(' ') + args = [] + options = tokens[:] + for token in tokens: + if token.startswith('-') or token.startswith('--'): + break + else: + args.append(token) + options.pop(0) + return ' '.join(args), ' '.join(options) + + +def build_parser(): + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self, msg): + raise RequirementsFileParseError(msg) + parser.exit = parser_exit + + return parser + + +def join_lines(lines_enum): + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line = [] + for line_number, line in lines_enum: + if not line.endswith('\\') or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = ' ' + line + if new_line: + new_line.append(line) + yield primary_line_number, ''.join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip('\\')) + + # last line contains \ + if new_line: + yield primary_line_number, ''.join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum): + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub('', line) + line = line.strip() + if line: + yield line_number, line + + +def skip_regex(lines_enum, options): + """ + Skip lines that match '--skip-requirements-regex' pattern + + Note: the regex pattern is only built once + """ + skip_regex = options.skip_requirements_regex if options else None + if skip_regex: + pattern = re.compile(skip_regex) + lines_enum = filterfalse( + lambda e: pattern.search(e[1]), + lines_enum) + return lines_enum diff --git a/vendor/pip-9.0.3/pip/req/req_install.py b/vendor/pip-9.0.3/pip/req/req_install.py new file mode 100644 index 0000000000000000000000000000000000000000..1a98f377b6f2a85cbf173b8a49027e51b8b79c7b --- /dev/null +++ b/vendor/pip-9.0.3/pip/req/req_install.py @@ -0,0 +1,1204 @@ +from __future__ import absolute_import + +import logging +import os +import re +import shutil +import sys +import tempfile +import traceback +import warnings +import zipfile + +from distutils import sysconfig +from distutils.util import change_root +from email.parser import FeedParser + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version, parse as parse_version +from pip._vendor.six.moves import configparser + +import pip.wheel + +from pip.compat import native_str, get_stdlib, WINDOWS +from pip.download import is_url, url_to_path, path_to_url, is_archive_file +from pip.exceptions import ( + InstallationError, UninstallationError, +) +from pip.locations import ( + bin_py, running_under_virtualenv, PIP_DELETE_MARKER_FILENAME, bin_user, +) +from pip.utils import ( + display_path, rmtree, ask_path_exists, backup_dir, is_installable_dir, + dist_in_usersite, dist_in_site_packages, egg_link_path, + call_subprocess, read_text_file, FakeFile, _make_build_dir, ensure_dir, + get_installed_version, normalize_path, dist_is_local, +) + +from pip.utils.hashes import Hashes +from pip.utils.deprecation import RemovedInPip10Warning +from pip.utils.logging import indent_log +from pip.utils.setuptools_build import SETUPTOOLS_SHIM +from pip.utils.ui import open_spinner +from pip.req.req_uninstall import UninstallPathSet +from pip.vcs import vcs +from pip.wheel import move_wheel_files, Wheel + + +logger = logging.getLogger(__name__) + +operators = specifiers.Specifier._operators.keys() + + +def _strip_extras(path): + m = re.match(r'^(.+)(\[[^\]]+\])$', path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +def _safe_extras(extras): + return set(pkg_resources.safe_extra(extra) for extra in extras) + + +class InstallRequirement(object): + + def __init__(self, req, comes_from, source_dir=None, editable=False, + link=None, as_egg=False, update=True, + pycompile=True, markers=None, isolated=False, options=None, + wheel_cache=None, constraint=False): + self.extras = () + if isinstance(req, six.string_types): + try: + req = Requirement(req) + except InvalidRequirement: + if os.path.sep in req: + add_msg = "It looks like a path. Does it exist ?" + elif '=' in req and not any(op in req for op in operators): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = traceback.format_exc() + raise InstallationError( + "Invalid requirement: '%s'\n%s" % (req, add_msg)) + self.extras = _safe_extras(req.extras) + + self.req = req + self.comes_from = comes_from + self.constraint = constraint + self.source_dir = source_dir + self.editable = editable + + self._wheel_cache = wheel_cache + self.link = self.original_link = link + self.as_egg = as_egg + if markers is not None: + self.markers = markers + else: + self.markers = req and req.marker + self._egg_info_path = None + # This holds the pkg_resources.Distribution object if this requirement + # is already available: + self.satisfied_by = None + # This hold the pkg_resources.Distribution object if this requirement + # conflicts with another installed distribution: + self.conflicts_with = None + # Temporary build location + self._temp_build_dir = None + # Used to store the global directory where the _temp_build_dir should + # have been created. Cf _correct_build_location method. + self._ideal_build_dir = None + # True if the editable should be updated: + self.update = update + # Set to True after successful installation + self.install_succeeded = None + # UninstallPathSet of uninstalled distribution (for possible rollback) + self.uninstalled = None + # Set True if a legitimate do-nothing-on-uninstall has happened - e.g. + # system site packages, stdlib packages. + self.nothing_to_uninstall = False + self.use_user_site = False + self.target_dir = None + self.options = options if options else {} + self.pycompile = pycompile + # Set to True after successful preparation of this requirement + self.prepared = False + + self.isolated = isolated + + @classmethod + def from_editable(cls, editable_req, comes_from=None, default_vcs=None, + isolated=False, options=None, wheel_cache=None, + constraint=False): + from pip.index import Link + + name, url, extras_override = parse_editable( + editable_req, default_vcs) + if url.startswith('file:'): + source_dir = url_to_path(url) + else: + source_dir = None + + res = cls(name, comes_from, source_dir=source_dir, + editable=True, + link=Link(url), + constraint=constraint, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache) + + if extras_override is not None: + res.extras = _safe_extras(extras_override) + + return res + + @classmethod + def from_line( + cls, name, comes_from=None, isolated=False, options=None, + wheel_cache=None, constraint=False): + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + """ + from pip.index import Link + + if is_url(name): + marker_sep = '; ' + else: + marker_sep = ';' + if marker_sep in name: + name, markers = name.split(marker_sep, 1) + markers = markers.strip() + if not markers: + markers = None + else: + markers = Marker(markers) + else: + markers = None + name = name.strip() + req = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras = None + + if is_url(name): + link = Link(name) + else: + p, extras = _strip_extras(path) + if (os.path.isdir(p) and + (os.path.sep in name or name.startswith('.'))): + + if not is_installable_dir(p): + raise InstallationError( + "Directory %r is not installable. File 'setup.py' " + "not found." % name + ) + link = Link(path_to_url(p)) + elif is_archive_file(p): + if not os.path.isfile(p): + logger.warning( + 'Requirement %r looks like a filename, but the ' + 'file does not exist', + name + ) + link = Link(path_to_url(p)) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == 'file' and re.search(r'\.\./', link.url): + link = Link( + path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req = "%s==%s" % (wheel.name, wheel.version) + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req = link.egg_fragment + + # a requirement specifier + else: + req = name + + options = options if options else {} + res = cls(req, comes_from, link=link, markers=markers, + isolated=isolated, options=options, + wheel_cache=wheel_cache, constraint=constraint) + + if extras: + res.extras = _safe_extras( + Requirement('placeholder' + extras).extras) + + return res + + def __str__(self): + if self.req: + s = str(self.req) + if self.link: + s += ' from %s' % self.link.url + else: + s = self.link.url if self.link else None + if self.satisfied_by is not None: + s += ' in %s' % display_path(self.satisfied_by.location) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += ' (from %s)' % comes_from + return s + + def __repr__(self): + return '<%s object: %s editable=%r>' % ( + self.__class__.__name__, str(self), self.editable) + + def populate_link(self, finder, upgrade, require_hashes): + """Ensure that if a link can be found for this, that it is found. + + Note that self.link may still be None - if Upgrade is False and the + requirement is already installed. + + If require_hashes is True, don't use the wheel cache, because cached + wheels, always built locally, have different hashes than the files + downloaded from the index server and thus throw false hash mismatches. + Furthermore, cached wheels at present have undeterministic contents due + to file modification times. + """ + if self.link is None: + self.link = finder.find_requirement(self, upgrade) + if self._wheel_cache is not None and not require_hashes: + old_link = self.link + self.link = self._wheel_cache.cached_wheel(self.link, self.name) + if old_link != self.link: + logger.debug('Using cached wheel link: %s', self.link) + + @property + def specifier(self): + return self.req.specifier + + @property + def is_pinned(self): + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + specifiers = self.specifier + return (len(specifiers) == 1 and + next(iter(specifiers)).operator in ('==', '===')) + + def from_path(self): + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += '->' + comes_from + return s + + def build_location(self, build_dir): + if self._temp_build_dir is not None: + return self._temp_build_dir + if self.req is None: + # for requirement via a path to a directory: the name of the + # package is not available yet so we create a temp directory + # Once run_egg_info will have run, we'll be able + # to fix it via _correct_build_location + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir = os.path.realpath( + tempfile.mkdtemp('-build', 'pip-') + ) + self._ideal_build_dir = build_dir + return self._temp_build_dir + if self.editable: + name = self.name.lower() + else: + name = self.name + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug('Creating directory %s', build_dir) + _make_build_dir(build_dir) + return os.path.join(build_dir, name) + + def _correct_build_location(self): + """Move self._temp_build_dir to self._ideal_build_dir/self.req.name + + For some requirements (e.g. a path to a directory), the name of the + package is not available until we run egg_info, so the build_location + will return a temporary directory and store the _ideal_build_dir. + + This is only called by self.egg_info_path to fix the temporary build + directory. + """ + if self.source_dir is not None: + return + assert self.req is not None + assert self._temp_build_dir + assert self._ideal_build_dir + old_location = self._temp_build_dir + self._temp_build_dir = None + new_location = self.build_location(self._ideal_build_dir) + if os.path.exists(new_location): + raise InstallationError( + 'A package already exists in %s; please remove it to continue' + % display_path(new_location)) + logger.debug( + 'Moving package %s from %s to new location %s', + self, display_path(old_location), display_path(new_location), + ) + shutil.move(old_location, new_location) + self._temp_build_dir = new_location + self._ideal_build_dir = None + self.source_dir = new_location + self._egg_info_path = None + + @property + def name(self): + if self.req is None: + return None + return native_str(pkg_resources.safe_name(self.req.name)) + + @property + def setup_py_dir(self): + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py(self): + assert self.source_dir, "No source dir for %s" % self + try: + import setuptools # noqa + except ImportError: + if get_installed_version('setuptools') is None: + add_msg = "Please install setuptools." + else: + add_msg = traceback.format_exc() + # Setuptools is not available + raise InstallationError( + "Could not import setuptools which is required to " + "install from a source distribution.\n%s" % add_msg + ) + + setup_py = os.path.join(self.setup_py_dir, 'setup.py') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(setup_py, six.text_type): + setup_py = setup_py.encode(sys.getfilesystemencoding()) + + return setup_py + + def run_egg_info(self): + assert self.source_dir + if self.name: + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + self.setup_py, self.name, + ) + else: + logger.debug( + 'Running setup.py (path:%s) egg_info for package from %s', + self.setup_py, self.link, + ) + + with indent_log(): + script = SETUPTOOLS_SHIM % self.setup_py + base_cmd = [sys.executable, '-c', script] + if self.isolated: + base_cmd += ["--no-user-cfg"] + egg_info_cmd = base_cmd + ['egg_info'] + # We can't put the .egg-info files at the root, because then the + # source code will be mistaken for an installed egg, causing + # problems + if self.editable: + egg_base_option = [] + else: + egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') + ensure_dir(egg_info_dir) + egg_base_option = ['--egg-base', 'pip-egg-info'] + call_subprocess( + egg_info_cmd + egg_base_option, + cwd=self.setup_py_dir, + show_stdout=False, + command_desc='python setup.py egg_info') + + if not self.req: + if isinstance(parse_version(self.pkg_info()["Version"]), Version): + op = "==" + else: + op = "===" + self.req = Requirement( + "".join([ + self.pkg_info()["Name"], + op, + self.pkg_info()["Version"], + ]) + ) + self._correct_build_location() + else: + metadata_name = canonicalize_name(self.pkg_info()["Name"]) + if canonicalize_name(self.req.name) != metadata_name: + logger.warning( + 'Running setup.py (path:%s) egg_info for package %s ' + 'produced metadata for project name %s. Fix your ' + '#egg=%s fragments.', + self.setup_py, self.name, metadata_name, self.name + ) + self.req = Requirement(metadata_name) + + def egg_info_data(self, filename): + if self.satisfied_by is not None: + if not self.satisfied_by.has_metadata(filename): + return None + return self.satisfied_by.get_metadata(filename) + assert self.source_dir + filename = self.egg_info_path(filename) + if not os.path.exists(filename): + return None + data = read_text_file(filename) + return data + + def egg_info_path(self, filename): + if self._egg_info_path is None: + if self.editable: + base = self.source_dir + else: + base = os.path.join(self.setup_py_dir, 'pip-egg-info') + filenames = os.listdir(base) + if self.editable: + filenames = [] + for root, dirs, files in os.walk(base): + for dir in vcs.dirnames: + if dir in dirs: + dirs.remove(dir) + # Iterate over a copy of ``dirs``, since mutating + # a list while iterating over it can cause trouble. + # (See https://github.com/pypa/pip/pull/462.) + for dir in list(dirs): + # Don't search in anything that looks like a virtualenv + # environment + if ( + os.path.lexists( + os.path.join(root, dir, 'bin', 'python') + ) or + os.path.exists( + os.path.join( + root, dir, 'Scripts', 'Python.exe' + ) + )): + dirs.remove(dir) + # Also don't search through tests + elif dir == 'test' or dir == 'tests': + dirs.remove(dir) + filenames.extend([os.path.join(root, dir) + for dir in dirs]) + filenames = [f for f in filenames if f.endswith('.egg-info')] + + if not filenames: + raise InstallationError( + 'No files/directories in %s (from %s)' % (base, filename) + ) + assert filenames, \ + "No files/directories in %s (from %s)" % (base, filename) + + # if we have more than one match, we pick the toplevel one. This + # can easily be the case if there is a dist folder which contains + # an extracted tarball for testing purposes. + if len(filenames) > 1: + filenames.sort( + key=lambda x: x.count(os.path.sep) + + (os.path.altsep and x.count(os.path.altsep) or 0) + ) + self._egg_info_path = os.path.join(base, filenames[0]) + return os.path.join(self._egg_info_path, filename) + + def pkg_info(self): + p = FeedParser() + data = self.egg_info_data('PKG-INFO') + if not data: + logger.warning( + 'No PKG-INFO file found in %s', + display_path(self.egg_info_path('PKG-INFO')), + ) + p.feed(data or '') + return p.close() + + _requirements_section_re = re.compile(r'\[(.*?)\]') + + @property + def installed_version(self): + return get_installed_version(self.name) + + def assert_source_matches_version(self): + assert self.source_dir + version = self.pkg_info()['version'] + if self.req.specifier and version not in self.req.specifier: + logger.warning( + 'Requested %s, but installing version %s', + self, + self.installed_version, + ) + else: + logger.debug( + 'Source in %s has version %s, which satisfies requirement %s', + display_path(self.source_dir), + version, + self, + ) + + def update_editable(self, obtain=True): + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is " + "unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == 'file': + # Static paths don't get updated + return + assert '+' in self.link.url, "bad url: %r" % self.link.url + if not self.update: + return + vc_type, url = self.link.url.split('+', 1) + backend = vcs.get_backend(vc_type) + if backend: + vcs_backend = backend(self.link.url) + if obtain: + vcs_backend.obtain(self.source_dir) + else: + vcs_backend.export(self.source_dir) + else: + assert 0, ( + 'Unexpected version control type (in %s): %s' + % (self.link, vc_type)) + + def uninstall(self, auto_confirm=False): + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + if not self.check_if_exists(): + raise UninstallationError( + "Cannot uninstall requirement %s, not installed" % (self.name,) + ) + dist = self.satisfied_by or self.conflicts_with + + dist_path = normalize_path(dist.location) + if not dist_is_local(dist): + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.key, + dist_path, + sys.prefix, + ) + self.nothing_to_uninstall = True + return + + if dist_path in get_stdlib(): + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.key, + dist_path, + ) + self.nothing_to_uninstall = True + return + + paths_to_remove = UninstallPathSet(dist) + develop_egg_link = egg_link_path(dist) + develop_egg_link_egg_info = '{0}.egg-info'.format( + pkg_resources.to_filename(dist.project_name)) + egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) + # Special case for distutils installed package + distutils_egg_info = getattr(dist._provider, 'path', None) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if (egg_info_exists and dist.egg_info.endswith('.egg-info') and + not dist.egg_info.endswith(develop_egg_link_egg_info)): + # if dist.egg_info.endswith(develop_egg_link_egg_info), we + # are in fact in the develop_egg_link case + paths_to_remove.add(dist.egg_info) + if dist.has_metadata('installed-files.txt'): + for installed_file in dist.get_metadata( + 'installed-files.txt').splitlines(): + path = os.path.normpath( + os.path.join(dist.egg_info, installed_file) + ) + paths_to_remove.add(path) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.has_metadata('top_level.txt'): + if dist.has_metadata('namespace_packages.txt'): + namespaces = dist.get_metadata('namespace_packages.txt') + else: + namespaces = [] + for top_level_pkg in [ + p for p + in dist.get_metadata('top_level.txt').splitlines() + if p and p not in namespaces]: + path = os.path.join(dist.location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(path + '.py') + paths_to_remove.add(path + '.pyc') + paths_to_remove.add(path + '.pyo') + + elif distutils_egg_info: + warnings.warn( + "Uninstalling a distutils installed project ({0}) has been " + "deprecated and will be removed in a future version. This is " + "due to the fact that uninstalling a distutils project will " + "only partially uninstall the project.".format(self.name), + RemovedInPip10Warning, + ) + paths_to_remove.add(distutils_egg_info) + + elif dist.location.endswith('.egg'): + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist.location) + easy_install_egg = os.path.split(dist.location)[1] + easy_install_pth = os.path.join(os.path.dirname(dist.location), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) + + elif egg_info_exists and dist.egg_info.endswith('.dist-info'): + for path in pip.wheel.uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # develop egg + with open(develop_egg_link, 'r') as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert (link_pointer == dist.location), ( + 'Egg-link %s does not match installed location of %s ' + '(at %s)' % (link_pointer, self.name, dist.location) + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, dist.location) + + else: + logger.debug( + 'Not sure how to uninstall: %s - Check: %s', + dist, dist.location) + + # find distutils scripts= scripts + if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): + for script in dist.metadata_listdir('scripts'): + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') + + # find console_scripts + if dist.has_metadata('entry_points.txt'): + if six.PY2: + options = {} + else: + options = {"delimiters": ('=', )} + config = configparser.SafeConfigParser(**options) + config.readfp( + FakeFile(dist.get_metadata_lines('entry_points.txt')) + ) + if config.has_section('console_scripts'): + for name, value in config.items('console_scripts'): + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + paths_to_remove.add(os.path.join(bin_dir, name)) + if WINDOWS: + paths_to_remove.add( + os.path.join(bin_dir, name) + '.exe' + ) + paths_to_remove.add( + os.path.join(bin_dir, name) + '.exe.manifest' + ) + paths_to_remove.add( + os.path.join(bin_dir, name) + '-script.py' + ) + + paths_to_remove.remove(auto_confirm) + self.uninstalled = paths_to_remove + + def rollback_uninstall(self): + if self.uninstalled: + self.uninstalled.rollback() + else: + logger.error( + "Can't rollback %s, nothing uninstalled.", self.name, + ) + + def commit_uninstall(self): + if self.uninstalled: + self.uninstalled.commit() + elif not self.nothing_to_uninstall: + logger.error( + "Can't commit %s, nothing uninstalled.", self.name, + ) + + def archive(self, build_dir): + assert self.source_dir + create_archive = True + archive_name = '%s-%s.zip' % (self.name, self.pkg_info()["version"]) + archive_path = os.path.join(build_dir, archive_name) + if os.path.exists(archive_path): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % + display_path(archive_path), ('i', 'w', 'b', 'a')) + if response == 'i': + create_archive = False + elif response == 'w': + logger.warning('Deleting %s', display_path(archive_path)) + os.remove(archive_path) + elif response == 'b': + dest_file = backup_dir(archive_path) + logger.warning( + 'Backing up %s to %s', + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == 'a': + sys.exit(-1) + if create_archive: + zip = zipfile.ZipFile( + archive_path, 'w', zipfile.ZIP_DEFLATED, + allowZip64=True + ) + dir = os.path.normcase(os.path.abspath(self.setup_py_dir)) + for dirpath, dirnames, filenames in os.walk(dir): + if 'pip-egg-info' in dirnames: + dirnames.remove('pip-egg-info') + for dirname in dirnames: + dirname = os.path.join(dirpath, dirname) + name = self._clean_zip_name(dirname, dir) + zipdir = zipfile.ZipInfo(self.name + '/' + name + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + filename = os.path.join(dirpath, filename) + name = self._clean_zip_name(filename, dir) + zip.write(filename, self.name + '/' + name) + zip.close() + logger.info('Saved %s', display_path(archive_path)) + + def _clean_zip_name(self, name, prefix): + assert name.startswith(prefix + os.path.sep), ( + "name %r doesn't start with prefix %r" % (name, prefix) + ) + name = name[len(prefix) + 1:] + name = name.replace(os.path.sep, '/') + return name + + def match_markers(self, extras_requested=None): + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ('',) + if self.markers is not None: + return any( + self.markers.evaluate({'extra': extra}) + for extra in extras_requested) + else: + return True + + def install(self, install_options, global_options=[], root=None, + prefix=None): + if self.editable: + self.install_editable( + install_options, global_options, prefix=prefix) + return + if self.is_wheel: + version = pip.wheel.wheel_version(self.source_dir) + pip.wheel.check_compatibility(version, self.name) + + self.move_wheel_files(self.source_dir, root=root, prefix=prefix) + self.install_succeeded = True + return + + # Extend the list of global and install options passed on to + # the setup.py call with the ones from the requirements file. + # Options specified in requirements file override those + # specified on the command line, since the last option given + # to setup.py is the one that is used. + global_options += self.options.get('global_options', []) + install_options += self.options.get('install_options', []) + + if self.isolated: + global_options = list(global_options) + ["--no-user-cfg"] + + temp_location = tempfile.mkdtemp('-record', 'pip-') + record_filename = os.path.join(temp_location, 'install-record.txt') + try: + install_args = self.get_install_args( + global_options, record_filename, root, prefix) + msg = 'Running setup.py install for %s' % (self.name,) + with open_spinner(msg) as spinner: + with indent_log(): + call_subprocess( + install_args + install_options, + cwd=self.setup_py_dir, + show_stdout=False, + spinner=spinner, + ) + + if not os.path.exists(record_filename): + logger.debug('Record file %s not found', record_filename) + return + self.install_succeeded = True + if self.as_egg: + # there's no --always-unzip option we can pass to install + # command so we unable to save the installed-files.txt + return + + def prepend_root(path): + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + with open(record_filename) as f: + for line in f: + directory = os.path.dirname(line) + if directory.endswith('.egg-info'): + egg_info_dir = prepend_root(directory) + break + else: + logger.warning( + 'Could not find .egg-info directory in install record' + ' for %s', + self, + ) + # FIXME: put the record somewhere + # FIXME: should this be an error? + return + new_lines = [] + with open(record_filename) as f: + for line in f: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append( + os.path.relpath( + prepend_root(filename), egg_info_dir) + ) + inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') + with open(inst_files_path, 'w') as f: + f.write('\n'.join(new_lines) + '\n') + finally: + if os.path.exists(record_filename): + os.remove(record_filename) + rmtree(temp_location) + + def ensure_has_source_dir(self, parent_dir): + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.build_location(parent_dir) + return self.source_dir + + def get_install_args(self, global_options, record_filename, root, prefix): + install_args = [sys.executable, "-u"] + install_args.append('-c') + install_args.append(SETUPTOOLS_SHIM % self.setup_py) + install_args += list(global_options) + \ + ['install', '--record', record_filename] + + if not self.as_egg: + install_args += ['--single-version-externally-managed'] + + if root is not None: + install_args += ['--root', root] + if prefix is not None: + install_args += ['--prefix', prefix] + + if self.pycompile: + install_args += ["--compile"] + else: + install_args += ["--no-compile"] + + if running_under_virtualenv(): + py_ver_str = 'python' + sysconfig.get_python_version() + install_args += ['--install-headers', + os.path.join(sys.prefix, 'include', 'site', + py_ver_str, self.name)] + + return install_args + + def remove_temporary_source(self): + """Remove the source files from this requirement, if they are marked + for deletion""" + if self.source_dir and os.path.exists( + os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)): + logger.debug('Removing source in %s', self.source_dir) + rmtree(self.source_dir) + self.source_dir = None + if self._temp_build_dir and os.path.exists(self._temp_build_dir): + rmtree(self._temp_build_dir) + self._temp_build_dir = None + + def install_editable(self, install_options, + global_options=(), prefix=None): + logger.info('Running setup.py develop for %s', self.name) + + if self.isolated: + global_options = list(global_options) + ["--no-user-cfg"] + + if prefix: + prefix_param = ['--prefix={0}'.format(prefix)] + install_options = list(install_options) + prefix_param + + with indent_log(): + # FIXME: should we do --install-headers here too? + call_subprocess( + [ + sys.executable, + '-c', + SETUPTOOLS_SHIM % self.setup_py + ] + + list(global_options) + + ['develop', '--no-deps'] + + list(install_options), + + cwd=self.setup_py_dir, + show_stdout=False) + + self.install_succeeded = True + + def check_if_exists(self): + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.conflicts_with appropriately. + """ + if self.req is None: + return False + try: + # get_distribution() will resolve the entire list of requirements + # anyway, and we've already determined that we need the requirement + # in question, so strip the marker so that we don't try to + # evaluate it. + no_marker = Requirement(str(self.req)) + no_marker.marker = None + self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) + if self.editable and self.satisfied_by: + self.conflicts_with = self.satisfied_by + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + return True + except pkg_resources.DistributionNotFound: + return False + except pkg_resources.VersionConflict: + existing_dist = pkg_resources.get_distribution( + self.req.name + ) + if self.use_user_site: + if dist_in_usersite(existing_dist): + self.conflicts_with = existing_dist + elif (running_under_virtualenv() and + dist_in_site_packages(existing_dist)): + raise InstallationError( + "Will not install to the user site because it will " + "lack sys.path precedence to %s in %s" % + (existing_dist.project_name, existing_dist.location) + ) + else: + self.conflicts_with = existing_dist + return True + + @property + def is_wheel(self): + return self.link and self.link.is_wheel + + def move_wheel_files(self, wheeldir, root=None, prefix=None): + move_wheel_files( + self.name, self.req, wheeldir, + user=self.use_user_site, + home=self.target_dir, + root=root, + prefix=prefix, + pycompile=self.pycompile, + isolated=self.isolated, + ) + + def get_dist(self): + """Return a pkg_resources.Distribution built from self.egg_info_path""" + egg_info = self.egg_info_path('').rstrip('/') + base_dir = os.path.dirname(egg_info) + metadata = pkg_resources.PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + return pkg_resources.Distribution( + os.path.dirname(egg_info), + project_name=dist_name, + metadata=metadata) + + @property + def has_hash_options(self): + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.options.get('hashes', {})) + + def hashes(self, trust_internet=True): + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.options.get('hashes', {}).copy() + link = self.link if trust_internet else self.original_link + if link and link.hash: + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + +def _strip_postfix(req): + """ + Strip req postfix ( -dev, 0.2, etc ) + """ + # FIXME: use package_to_requirement? + match = re.search(r'^(.*?)(?:-dev|-\d.*)$', req) + if match: + # Strip off -dev, -0.2, etc. + req = match.group(1) + return req + + +def parse_editable(editable_req, default_vcs=None): + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + from pip.index import Link + + url = editable_req + extras = None + + # If a file path is specified with extras, strip off the extras. + m = re.match(r'^(.+)(\[[^\]]+\])$', url) + if m: + url_no_extras = m.group(1) + extras = m.group(2) + else: + url_no_extras = url + + if os.path.isdir(url_no_extras): + if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): + raise InstallationError( + "Directory %r is not installable. File 'setup.py' not found." % + url_no_extras + ) + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith('file:'): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + Requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, None + + for version_control in vcs: + if url.lower().startswith('%s:' % version_control): + url = '%s+%s' % (version_control, url) + break + + if '+' not in url: + if default_vcs: + warnings.warn( + "--default-vcs has been deprecated and will be removed in " + "the future.", + RemovedInPip10Warning, + ) + url = default_vcs + '+' + url + else: + raise InstallationError( + '%s should either be a path to a local project or a VCS url ' + 'beginning with svn+, git+, hg+, or bzr+' % + editable_req + ) + + vc_type = url.split('+', 1)[0].lower() + + if not vcs.get_backend(vc_type): + error_message = 'For --editable=%s only ' % editable_req + \ + ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ + ' is currently supported' + raise InstallationError(error_message) + + package_name = Link(url).egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name, please specify one with #egg=" + ) + if not package_name: + raise InstallationError( + '--editable=%s is not the right format; it must have ' + '#egg=Package' % editable_req + ) + return _strip_postfix(package_name), url, None diff --git a/vendor/pip-9.0.3/pip/req/req_set.py b/vendor/pip-9.0.3/pip/req/req_set.py new file mode 100644 index 0000000000000000000000000000000000000000..76aec0616612e22f2864fe8dba13886c10b579bc --- /dev/null +++ b/vendor/pip-9.0.3/pip/req/req_set.py @@ -0,0 +1,798 @@ +from __future__ import absolute_import + +from collections import defaultdict +from itertools import chain +import logging +import os + +from pip._vendor import pkg_resources +from pip._vendor import requests + +from pip.compat import expanduser +from pip.download import (is_file_url, is_dir_url, is_vcs_url, url_to_path, + unpack_url) +from pip.exceptions import (InstallationError, BestVersionAlreadyInstalled, + DistributionNotFound, PreviousBuildDirError, + HashError, HashErrors, HashUnpinned, + DirectoryUrlHashUnsupported, VcsHashUnsupported, + UnsupportedPythonVersion) +from pip.req.req_install import InstallRequirement +from pip.utils import ( + display_path, dist_in_usersite, ensure_dir, normalize_path) +from pip.utils.hashes import MissingHashes +from pip.utils.logging import indent_log +from pip.utils.packaging import check_dist_requires_python +from pip.vcs import vcs +from pip.wheel import Wheel + +logger = logging.getLogger(__name__) + + +class Requirements(object): + + def __init__(self): + self._keys = [] + self._dict = {} + + def keys(self): + return self._keys + + def values(self): + return [self._dict[key] for key in self._keys] + + def __contains__(self, item): + return item in self._keys + + def __setitem__(self, key, value): + if key not in self._keys: + self._keys.append(key) + self._dict[key] = value + + def __getitem__(self, key): + return self._dict[key] + + def __repr__(self): + values = ['%s: %s' % (repr(k), repr(self[k])) for k in self.keys()] + return 'Requirements({%s})' % ', '.join(values) + + +class DistAbstraction(object): + """Abstracts out the wheel vs non-wheel prepare_files logic. + + The requirements for anything installable are as follows: + - we must be able to determine the requirement name + (or we can't correctly handle the non-upgrade case). + - we must be able to generate a list of run-time dependencies + without installing any additional packages (or we would + have to either burn time by doing temporary isolated installs + or alternatively violate pips 'don't start installing unless + all requirements are available' rule - neither of which are + desirable). + - for packages with setup requirements, we must also be able + to determine their requirements without installing additional + packages (for the same reason as run-time dependencies) + - we must be able to create a Distribution object exposing the + above metadata. + """ + + def __init__(self, req_to_install): + self.req_to_install = req_to_install + + def dist(self, finder): + """Return a setuptools Dist object.""" + raise NotImplementedError(self.dist) + + def prep_for_dist(self): + """Ensure that we can get a Dist for this requirement.""" + raise NotImplementedError(self.dist) + + +def make_abstract_dist(req_to_install): + """Factory to make an abstract dist object. + + Preconditions: Either an editable req with a source_dir, or satisfied_by or + a wheel link, or a non-editable req with a source_dir. + + :return: A concrete DistAbstraction. + """ + if req_to_install.editable: + return IsSDist(req_to_install) + elif req_to_install.link and req_to_install.link.is_wheel: + return IsWheel(req_to_install) + else: + return IsSDist(req_to_install) + + +class IsWheel(DistAbstraction): + + def dist(self, finder): + return list(pkg_resources.find_distributions( + self.req_to_install.source_dir))[0] + + def prep_for_dist(self): + # FIXME:https://github.com/pypa/pip/issues/1112 + pass + + +class IsSDist(DistAbstraction): + + def dist(self, finder): + dist = self.req_to_install.get_dist() + # FIXME: shouldn't be globally added: + if dist.has_metadata('dependency_links.txt'): + finder.add_dependency_links( + dist.get_metadata_lines('dependency_links.txt') + ) + return dist + + def prep_for_dist(self): + self.req_to_install.run_egg_info() + self.req_to_install.assert_source_matches_version() + + +class Installed(DistAbstraction): + + def dist(self, finder): + return self.req_to_install.satisfied_by + + def prep_for_dist(self): + pass + + +class RequirementSet(object): + + def __init__(self, build_dir, src_dir, download_dir, upgrade=False, + upgrade_strategy=None, ignore_installed=False, as_egg=False, + target_dir=None, ignore_dependencies=False, + force_reinstall=False, use_user_site=False, session=None, + pycompile=True, isolated=False, wheel_download_dir=None, + wheel_cache=None, require_hashes=False, + ignore_requires_python=False): + """Create a RequirementSet. + + :param wheel_download_dir: Where still-packed .whl files should be + written to. If None they are written to the download_dir parameter. + Separate to download_dir to permit only keeping wheel archives for + pip wheel. + :param download_dir: Where still packed archives should be written to. + If None they are not saved, and are deleted immediately after + unpacking. + :param wheel_cache: The pip wheel cache, for passing to + InstallRequirement. + """ + if session is None: + raise TypeError( + "RequirementSet() missing 1 required keyword argument: " + "'session'" + ) + + self.build_dir = build_dir + self.src_dir = src_dir + # XXX: download_dir and wheel_download_dir overlap semantically and may + # be combined if we're willing to have non-wheel archives present in + # the wheelhouse output by 'pip wheel'. + self.download_dir = download_dir + self.upgrade = upgrade + self.upgrade_strategy = upgrade_strategy + self.ignore_installed = ignore_installed + self.force_reinstall = force_reinstall + self.requirements = Requirements() + # Mapping of alias: real_name + self.requirement_aliases = {} + self.unnamed_requirements = [] + self.ignore_dependencies = ignore_dependencies + self.ignore_requires_python = ignore_requires_python + self.successfully_downloaded = [] + self.successfully_installed = [] + self.reqs_to_cleanup = [] + self.as_egg = as_egg + self.use_user_site = use_user_site + self.target_dir = target_dir # set from --target option + self.session = session + self.pycompile = pycompile + self.isolated = isolated + if wheel_download_dir: + wheel_download_dir = normalize_path(wheel_download_dir) + self.wheel_download_dir = wheel_download_dir + self._wheel_cache = wheel_cache + self.require_hashes = require_hashes + # Maps from install_req -> dependencies_of_install_req + self._dependencies = defaultdict(list) + + def __str__(self): + reqs = [req for req in self.requirements.values() + if not req.comes_from] + reqs.sort(key=lambda req: req.name.lower()) + return ' '.join([str(req.req) for req in reqs]) + + def __repr__(self): + reqs = [req for req in self.requirements.values()] + reqs.sort(key=lambda req: req.name.lower()) + reqs_str = ', '.join([str(req.req) for req in reqs]) + return ('<%s object; %d requirement(s): %s>' + % (self.__class__.__name__, len(reqs), reqs_str)) + + def add_requirement(self, install_req, parent_req_name=None, + extras_requested=None): + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environement markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + name = install_req.name + if not install_req.match_markers(extras_requested): + logger.warning("Ignoring %s: markers '%s' don't match your " + "environment", install_req.name, + install_req.markers) + return [] + + # This check has to come after we filter requirements with the + # environment markers. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + if not wheel.supported(): + raise InstallationError( + "%s is not a supported wheel on this platform." % + wheel.filename + ) + + install_req.as_egg = self.as_egg + install_req.use_user_site = self.use_user_site + install_req.target_dir = self.target_dir + install_req.pycompile = self.pycompile + install_req.is_direct = (parent_req_name is None) + + if not name: + # url or path requirement w/o an egg fragment + self.unnamed_requirements.append(install_req) + return [install_req] + else: + try: + existing_req = self.get_requirement(name) + except KeyError: + existing_req = None + if (parent_req_name is None and existing_req and not + existing_req.constraint and + existing_req.extras == install_req.extras and not + existing_req.req.specifier == install_req.req.specifier): + raise InstallationError( + 'Double requirement given: %s (already in %s, name=%r)' + % (install_req, existing_req, name)) + if not existing_req: + # Add requirement + self.requirements[name] = install_req + # FIXME: what about other normalizations? E.g., _ vs. -? + if name.lower() != name: + self.requirement_aliases[name.lower()] = name + result = [install_req] + else: + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + result = [] + if not install_req.constraint and existing_req.constraint: + if (install_req.link and not (existing_req.link and + install_req.link.path == existing_req.link.path)): + self.reqs_to_cleanup.append(install_req) + raise InstallationError( + "Could not satisfy constraints for '%s': " + "installation from path or url cannot be " + "constrained to a version" % name) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + existing_req.extras = tuple( + sorted(set(existing_req.extras).union( + set(install_req.extras)))) + logger.debug("Setting %s extras to: %s", + existing_req, existing_req.extras) + # And now we need to scan this. + result = [existing_req] + # Canonicalise to the already-added object for the backref + # check below. + install_req = existing_req + if parent_req_name: + parent_req = self.get_requirement(parent_req_name) + self._dependencies[parent_req].append(install_req) + return result + + def has_requirement(self, project_name): + name = project_name.lower() + if (name in self.requirements and + not self.requirements[name].constraint or + name in self.requirement_aliases and + not self.requirements[self.requirement_aliases[name]].constraint): + return True + return False + + @property + def has_requirements(self): + return list(req for req in self.requirements.values() if not + req.constraint) or self.unnamed_requirements + + @property + def is_download(self): + if self.download_dir: + self.download_dir = expanduser(self.download_dir) + if os.path.exists(self.download_dir): + return True + else: + logger.critical('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '%s'" + % display_path(self.download_dir)) + return False + + def get_requirement(self, project_name): + for name in project_name, project_name.lower(): + if name in self.requirements: + return self.requirements[name] + if name in self.requirement_aliases: + return self.requirements[self.requirement_aliases[name]] + raise KeyError("No project with the name %r" % project_name) + + def uninstall(self, auto_confirm=False): + for req in self.requirements.values(): + if req.constraint: + continue + req.uninstall(auto_confirm=auto_confirm) + req.commit_uninstall() + + def prepare_files(self, finder): + """ + Prepare process. Create temp directories, download and/or unpack files. + """ + # make the wheelhouse + if self.wheel_download_dir: + ensure_dir(self.wheel_download_dir) + + # If any top-level requirement has a hash specified, enter + # hash-checking mode, which requires hashes from all. + root_reqs = self.unnamed_requirements + self.requirements.values() + require_hashes = (self.require_hashes or + any(req.has_hash_options for req in root_reqs)) + if require_hashes and self.as_egg: + raise InstallationError( + '--egg is not allowed with --require-hashes mode, since it ' + 'delegates dependency resolution to setuptools and could thus ' + 'result in installation of unhashed packages.') + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # req.populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs = [] + hash_errors = HashErrors() + for req in chain(root_reqs, discovered_reqs): + try: + discovered_reqs.extend(self._prepare_file( + finder, + req, + require_hashes=require_hashes, + ignore_dependencies=self.ignore_dependencies)) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + def _is_upgrade_allowed(self, req): + return self.upgrade and ( + self.upgrade_strategy == "eager" or ( + self.upgrade_strategy == "only-if-needed" and req.is_direct + ) + ) + + def _check_skip_installed(self, req_to_install, finder): + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + # Check whether to upgrade/reinstall this req or not. + req_to_install.check_if_exists() + if req_to_install.satisfied_by: + upgrade_allowed = self._is_upgrade_allowed(req_to_install) + + # Is the best version is installed. + best_installed = False + + if upgrade_allowed: + # For link based requirements we have to pull the + # tree down and inspect to assess the version #, so + # its handled way down. + if not (self.force_reinstall or req_to_install.link): + try: + finder.find_requirement( + req_to_install, upgrade_allowed) + except BestVersionAlreadyInstalled: + best_installed = True + except DistributionNotFound: + # No distribution found, so we squash the + # error - it will be raised later when we + # re-try later to do the install. + # Why don't we just raise here? + pass + + if not best_installed: + # don't uninstall conflict if user install and + # conflict is not user install + if not (self.use_user_site and not + dist_in_usersite(req_to_install.satisfied_by)): + req_to_install.conflicts_with = \ + req_to_install.satisfied_by + req_to_install.satisfied_by = None + + # Figure out a nice message to say why we're skipping this. + if best_installed: + skip_reason = 'already up-to-date' + elif self.upgrade_strategy == "only-if-needed": + skip_reason = 'not upgraded as not directly required' + else: + skip_reason = 'already satisfied' + + return skip_reason + else: + return None + + def _prepare_file(self, + finder, + req_to_install, + require_hashes=False, + ignore_dependencies=False): + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # ###################### # + # # print log messages # # + # ###################### # + if req_to_install.editable: + logger.info('Obtaining %s', req_to_install) + else: + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req_to_install.satisfied_by is None + if not self.ignore_installed: + skip_reason = self._check_skip_installed( + req_to_install, finder) + + if req_to_install.satisfied_by: + assert skip_reason is not None, ( + '_check_skip_installed returned None but ' + 'req_to_install.satisfied_by is set to %r' + % (req_to_install.satisfied_by,)) + logger.info( + 'Requirement %s: %s', skip_reason, + req_to_install) + else: + if (req_to_install.link and + req_to_install.link.scheme == 'file'): + path = url_to_path(req_to_install.link.url) + logger.info('Processing %s', display_path(path)) + else: + logger.info('Collecting %s', req_to_install) + + with indent_log(): + # ################################ # + # # vcs update or unpack archive # # + # ################################ # + if req_to_install.editable: + if require_hashes: + raise InstallationError( + 'The editable requirement %s cannot be installed when ' + 'requiring hashes, because there is no single file to ' + 'hash.' % req_to_install) + req_to_install.ensure_has_source_dir(self.src_dir) + req_to_install.update_editable(not self.is_download) + abstract_dist = make_abstract_dist(req_to_install) + abstract_dist.prep_for_dist() + if self.is_download: + req_to_install.archive(self.download_dir) + req_to_install.check_if_exists() + elif req_to_install.satisfied_by: + if require_hashes: + logger.debug( + 'Since it is already installed, we are trusting this ' + 'package without checking its hash. To ensure a ' + 'completely repeatable environment, install into an ' + 'empty virtualenv.') + abstract_dist = Installed(req_to_install) + else: + # @@ if filesystem packages are not marked + # editable in a req, a non deterministic error + # occurs when the script attempts to unpack the + # build directory + req_to_install.ensure_has_source_dir(self.build_dir) + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + # FIXME: this won't upgrade when there's an existing + # package unpacked in `req_to_install.source_dir` + if os.path.exists( + os.path.join(req_to_install.source_dir, 'setup.py')): + raise PreviousBuildDirError( + "pip can't proceed with requirements '%s' due to a" + " pre-existing build directory (%s). This is " + "likely due to a previous installation that failed" + ". pip is being responsible and not assuming it " + "can delete this. Please delete it and try again." + % (req_to_install, req_to_install.source_dir) + ) + req_to_install.populate_link( + finder, + self._is_upgrade_allowed(req_to_install), + require_hashes + ) + # We can't hit this spot and have populate_link return None. + # req_to_install.satisfied_by is None here (because we're + # guarded) and upgrade has no impact except when satisfied_by + # is not None. + # Then inside find_requirement existing_applicable -> False + # If no new versions are found, DistributionNotFound is raised, + # otherwise a result is guaranteed. + assert req_to_install.link + link = req_to_install.link + + # Now that we have the real link, we can tell what kind of + # requirements we have and raise some more informative errors + # than otherwise. (For example, we can raise VcsHashUnsupported + # for a VCS URL rather than HashMissing.) + if require_hashes: + # We could check these first 2 conditions inside + # unpack_url and save repetition of conditions, but then + # we would report less-useful error messages for + # unhashable requirements, complaining that there's no + # hash provided. + if is_vcs_url(link): + raise VcsHashUnsupported() + elif is_file_url(link) and is_dir_url(link): + raise DirectoryUrlHashUnsupported() + if (not req_to_install.original_link and + not req_to_install.is_pinned): + # Unpinned packages are asking for trouble when a new + # version is uploaded. This isn't a security check, but + # it saves users a surprising hash mismatch in the + # future. + # + # file:/// URLs aren't pinnable, so don't complain + # about them not being pinned. + raise HashUnpinned() + hashes = req_to_install.hashes( + trust_internet=not require_hashes) + if require_hashes and not hashes: + # Known-good hashes are missing for this requirement, so + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + hashes = MissingHashes() + + try: + download_dir = self.download_dir + # We always delete unpacked sdists after pip ran. + autodelete_unpacked = True + if req_to_install.link.is_wheel \ + and self.wheel_download_dir: + # when doing 'pip wheel` we download wheels to a + # dedicated dir. + download_dir = self.wheel_download_dir + if req_to_install.link.is_wheel: + if download_dir: + # When downloading, we only unpack wheels to get + # metadata. + autodelete_unpacked = True + else: + # When installing a wheel, we use the unpacked + # wheel. + autodelete_unpacked = False + unpack_url( + req_to_install.link, req_to_install.source_dir, + download_dir, autodelete_unpacked, + session=self.session, hashes=hashes) + except requests.HTTPError as exc: + logger.critical( + 'Could not install requirement %s because ' + 'of error %s', + req_to_install, + exc, + ) + raise InstallationError( + 'Could not install requirement %s because ' + 'of HTTP error %s for URL %s' % + (req_to_install, exc, req_to_install.link) + ) + abstract_dist = make_abstract_dist(req_to_install) + abstract_dist.prep_for_dist() + if self.is_download: + # Make a .zip of the source_dir we already created. + if req_to_install.link.scheme in vcs.all_schemes: + req_to_install.archive(self.download_dir) + # req_to_install.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req_to_install.check_if_exists() + if req_to_install.satisfied_by: + if self.upgrade or self.ignore_installed: + # don't uninstall conflict if user install and + # conflict is not user install + if not (self.use_user_site and not + dist_in_usersite( + req_to_install.satisfied_by)): + req_to_install.conflicts_with = \ + req_to_install.satisfied_by + req_to_install.satisfied_by = None + else: + logger.info( + 'Requirement already satisfied (use ' + '--upgrade to upgrade): %s', + req_to_install, + ) + + # ###################### # + # # parse dependencies # # + # ###################### # + dist = abstract_dist.dist(finder) + try: + check_dist_requires_python(dist) + except UnsupportedPythonVersion as e: + if self.ignore_requires_python: + logger.warning(e.args[0]) + else: + req_to_install.remove_temporary_source() + raise + more_reqs = [] + + def add_req(subreq, extras_requested): + sub_install_req = InstallRequirement( + str(subreq), + req_to_install, + isolated=self.isolated, + wheel_cache=self._wheel_cache, + ) + more_reqs.extend(self.add_requirement( + sub_install_req, req_to_install.name, + extras_requested=extras_requested)) + + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not self.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + self.add_requirement(req_to_install, None) + + if not ignore_dependencies: + if (req_to_install.extras): + logger.debug( + "Installing extra requirements: %r", + ','.join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.extras) + ) + for missing in missing_requested: + logger.warning( + '%s does not provide the extra \'%s\'', + dist, missing + ) + + available_requested = sorted( + set(dist.extras) & set(req_to_install.extras) + ) + for subreq in dist.requires(available_requested): + add_req(subreq, extras_requested=available_requested) + + # cleanup tmp src + self.reqs_to_cleanup.append(req_to_install) + + if not req_to_install.editable and not req_to_install.satisfied_by: + # XXX: --no-install leads this to report 'Successfully + # downloaded' for only non-editable reqs, even though we took + # action on them. + self.successfully_downloaded.append(req_to_install) + + return more_reqs + + def cleanup_files(self): + """Clean up files, remove builds.""" + logger.debug('Cleaning up...') + with indent_log(): + for req in self.reqs_to_cleanup: + req.remove_temporary_source() + + def _to_install(self): + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs = set() + + def schedule(req): + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._dependencies[req]: + schedule(dep) + order.append(req) + for install_req in self.requirements.values(): + schedule(install_req) + return order + + def install(self, install_options, global_options=(), *args, **kwargs): + """ + Install everything in this set (after having downloaded and unpacked + the packages) + """ + to_install = self._to_install() + + if to_install: + logger.info( + 'Installing collected packages: %s', + ', '.join([req.name for req in to_install]), + ) + + with indent_log(): + for requirement in to_install: + if requirement.conflicts_with: + logger.info( + 'Found existing installation: %s', + requirement.conflicts_with, + ) + with indent_log(): + requirement.uninstall(auto_confirm=True) + try: + requirement.install( + install_options, + global_options, + *args, + **kwargs + ) + except: + # if install did not succeed, rollback previous uninstall + if (requirement.conflicts_with and not + requirement.install_succeeded): + requirement.rollback_uninstall() + raise + else: + if (requirement.conflicts_with and + requirement.install_succeeded): + requirement.commit_uninstall() + requirement.remove_temporary_source() + + self.successfully_installed = to_install diff --git a/vendor/pip-9.0.3/pip/req/req_uninstall.py b/vendor/pip-9.0.3/pip/req/req_uninstall.py new file mode 100644 index 0000000000000000000000000000000000000000..5248430a9b17c102fcabe4f9ccbafd2a307f5701 --- /dev/null +++ b/vendor/pip-9.0.3/pip/req/req_uninstall.py @@ -0,0 +1,195 @@ +from __future__ import absolute_import + +import logging +import os +import tempfile + +from pip.compat import uses_pycache, WINDOWS, cache_from_source +from pip.exceptions import UninstallationError +from pip.utils import rmtree, ask, is_local, renames, normalize_path +from pip.utils.logging import indent_log + + +logger = logging.getLogger(__name__) + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + self.paths = set() + self._refuse = set() + self.pth = {} + self.dist = dist + self.save_dir = None + self._moved_paths = [] + + def _permitted(self, path): + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(normalize_path(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self.paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == '.py' and uses_pycache: + self.add(cache_from_source(path)) + + def add_pth(self, pth_file, entry): + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self.pth: + self.pth[pth_file] = UninstallPthEntries(pth_file) + self.pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def compact(self, paths): + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + short_paths = set() + for path in sorted(paths, key=len): + if not any([ + (path.startswith(shortpath) and + path[len(shortpath.rstrip(os.path.sep))] == os.path.sep) + for shortpath in short_paths]): + short_paths.add(path) + return short_paths + + def _stash(self, path): + return os.path.join( + self.save_dir, os.path.splitdrive(path)[1].lstrip(os.path.sep)) + + def remove(self, auto_confirm=False): + """Remove paths in ``self.paths`` with confirmation (unless + ``auto_confirm`` is True).""" + if not self.paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self.dist.project_name, + ) + return + logger.info( + 'Uninstalling %s-%s:', + self.dist.project_name, self.dist.version + ) + + with indent_log(): + paths = sorted(self.compact(self.paths)) + + if auto_confirm: + response = 'y' + else: + for path in paths: + logger.info(path) + response = ask('Proceed (y/n)? ', ('y', 'n')) + if self._refuse: + logger.info('Not removing or modifying (outside of prefix):') + for path in self.compact(self._refuse): + logger.info(path) + if response == 'y': + self.save_dir = tempfile.mkdtemp(suffix='-uninstall', + prefix='pip-') + for path in paths: + new_path = self._stash(path) + logger.debug('Removing file or directory %s', path) + self._moved_paths.append(path) + renames(path, new_path) + for pth in self.pth.values(): + pth.remove() + logger.info( + 'Successfully uninstalled %s-%s', + self.dist.project_name, self.dist.version + ) + + def rollback(self): + """Rollback the changes previously made by remove().""" + if self.save_dir is None: + logger.error( + "Can't roll back %s; was not uninstalled", + self.dist.project_name, + ) + return False + logger.info('Rolling back uninstall of %s', self.dist.project_name) + for path in self._moved_paths: + tmp_path = self._stash(path) + logger.debug('Replacing %s', path) + renames(tmp_path, path) + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + """Remove temporary save dir: rollback will no longer be possible.""" + if self.save_dir is not None: + rmtree(self.save_dir) + self.save_dir = None + self._moved_paths = [] + + +class UninstallPthEntries(object): + def __init__(self, pth_file): + if not os.path.isfile(pth_file): + raise UninstallationError( + "Cannot remove entries from nonexistent file %s" % pth_file + ) + self.file = pth_file + self.entries = set() + self._saved_lines = None + + def add(self, entry): + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + logger.debug('Removing pth entries from %s:', self.file) + with open(self.file, 'rb') as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b'\r\n' in line for line in lines): + endline = '\r\n' + else: + endline = '\n' + for entry in self.entries: + try: + logger.debug('Removing entry: %s', entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, 'wb') as fh: + fh.writelines(lines) + + def rollback(self): + if self._saved_lines is None: + logger.error( + 'Cannot roll back changes to %s, none were made', self.file + ) + return False + logger.debug('Rolling %s back to previous state', self.file) + with open(self.file, 'wb') as fh: + fh.writelines(self._saved_lines) + return True diff --git a/vendor/pip-9.0.3/pip/status_codes.py b/vendor/pip-9.0.3/pip/status_codes.py new file mode 100644 index 0000000000000000000000000000000000000000..275360a3175abaeab86148d61b735904f96d72f6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/status_codes.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/vendor/pip-9.0.3/pip/utils/__init__.py b/vendor/pip-9.0.3/pip/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..815bd33831d5b47490a07f89d7bcfc370c42e31a --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/__init__.py @@ -0,0 +1,852 @@ +from __future__ import absolute_import + +from collections import deque +import contextlib +import errno +import io +import locale +# we have a submodule named 'logging' which would shadow this if we used the +# regular name: +import logging as std_logging +import re +import os +import posixpath +import shutil +import stat +import subprocess +import sys +import tarfile +import zipfile + +from pip.exceptions import InstallationError +from pip.compat import console_to_str, expanduser, stdlib_pkgs +from pip.locations import ( + site_packages, user_site, running_under_virtualenv, virtualenv_no_global, + write_delete_marker_file, +) +from pip._vendor import pkg_resources +from pip._vendor.six.moves import input +from pip._vendor.six import PY2 +from pip._vendor.retrying import retry + +if PY2: + from io import BytesIO as StringIO +else: + from io import StringIO + +__all__ = ['rmtree', 'display_path', 'backup_dir', + 'ask', 'splitext', + 'format_size', 'is_installable_dir', + 'is_svn_page', 'file_contents', + 'split_leading_dir', 'has_leading_dir', + 'normalize_path', + 'renames', 'get_terminal_size', 'get_prog', + 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', + 'captured_stdout', 'ensure_dir', + 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', + 'get_installed_version'] + + +logger = std_logging.getLogger(__name__) + +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') +ZIP_EXTENSIONS = ('.zip', '.whl') +TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') +ARCHIVE_EXTENSIONS = ( + ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS +try: + import bz2 # noqa + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug('bz2 module is not available') + +try: + # Only for Python 3.3+ + import lzma # noqa + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug('lzma module is not available') + + +def import_or_raise(pkg_or_module_string, ExceptionType, *args, **kwargs): + try: + return __import__(pkg_or_module_string) + except ImportError: + raise ExceptionType(*args, **kwargs) + + +def ensure_dir(path): + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def get_prog(): + try: + if os.path.basename(sys.argv[0]) in ('__main__.py', '-c'): + return "%s -m pip" % sys.executable + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +# Retry every half second for up to 3 seconds +@retry(stop_max_delay=3000, wait_fixed=500) +def rmtree(dir, ignore_errors=False): + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + # if file type currently read only + if os.stat(path).st_mode & stat.S_IREAD: + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + return + else: + raise + + +def display_path(path): + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if sys.version_info[0] == 2: + path = path.decode(sys.getfilesystemencoding(), 'replace') + path = path.encode(sys.getdefaultencoding(), 'replace') + if path.startswith(os.getcwd() + os.path.sep): + path = '.' + path[len(os.getcwd()):] + return path + + +def backup_dir(dir, ext='.bak'): + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message, options): + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def ask(message, options): + """Ask the message interactively, with the given possible responses""" + while 1: + if os.environ.get('PIP_NO_INPUT'): + raise Exception( + 'No input was expected ($PIP_NO_INPUT set); question: %s' % + message + ) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + 'Your response (%r) was not one of the expected responses: ' + '%s' % (response, ', '.join(options)) + ) + else: + return response + + +def format_size(bytes): + if bytes > 1000 * 1000: + return '%.1fMB' % (bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return '%ikB' % (bytes / 1000) + elif bytes > 1000: + return '%.1fkB' % (bytes / 1000.0) + else: + return '%ibytes' % bytes + + +def is_installable_dir(path): + """Return True if `path` is a directory containing a setup.py file.""" + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + return False + + +def is_svn_page(html): + """ + Returns true if the page appears to be the index page of an svn repository + """ + return (re.search(r'<title>[^<]*Revision \d+:', html) and + re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) + + +def file_contents(filename): + with open(filename, 'rb') as fp: + return fp.read().decode('utf-8') + + +def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def split_leading_dir(path): + path = path.lstrip('/').lstrip('\\') + if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or + '\\' not in path): + return path.split('/', 1) + elif '\\' in path: + return path.split('\\', 1) + else: + return path, '' + + +def has_leading_dir(paths): + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def normalize_path(path, resolve_symlinks=True): + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path): + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith('.tar'): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old, new): + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path): + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + """ + if not running_under_virtualenv(): + return True + return normalize_path(path).startswith(normalize_path(sys.prefix)) + + +def dist_is_local(dist): + """ + Return True if given Distribution object is installed locally + (i.e. within current virtualenv). + + Always True if we're not in a virtualenv. + + """ + return is_local(dist_location(dist)) + + +def dist_in_usersite(dist): + """ + Return True if given Distribution is installed in user site. + """ + norm_path = normalize_path(dist_location(dist)) + return norm_path.startswith(normalize_path(user_site)) + + +def dist_in_site_packages(dist): + """ + Return True if given Distribution is installed in + distutils.sysconfig.get_python_lib(). + """ + return normalize_path( + dist_location(dist) + ).startswith(normalize_path(site_packages)) + + +def dist_is_editable(dist): + """Is distribution an editable install?""" + for path_item in sys.path: + egg_link = os.path.join(path_item, dist.project_name + '.egg-link') + if os.path.isfile(egg_link): + return True + return False + + +def get_installed_distributions(local_only=True, + skip=stdlib_pkgs, + include_editables=True, + editables_only=False, + user_only=False): + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to stdlib_pkgs + + If ``editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + If ``user_only`` is True , only report installations in the user + site directory. + + """ + if local_only: + local_test = dist_is_local + else: + def local_test(d): + return True + + if include_editables: + def editable_test(d): + return True + else: + def editable_test(d): + return not dist_is_editable(d) + + if editables_only: + def editables_only_test(d): + return dist_is_editable(d) + else: + def editables_only_test(d): + return True + + if user_only: + user_test = dist_in_usersite + else: + def user_test(d): + return True + + return [d for d in pkg_resources.working_set + if local_test(d) and + d.key not in skip and + editable_test(d) and + editables_only_test(d) and + user_test(d) + ] + + +def egg_link_path(dist): + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites = [] + if running_under_virtualenv(): + if virtualenv_no_global(): + sites.append(site_packages) + else: + sites.append(site_packages) + if user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + for site in sites: + egglink = os.path.join(site, dist.project_name) + '.egg-link' + if os.path.isfile(egglink): + return egglink + + +def dist_location(dist): + """ + Get the site-packages location of this distribution. Generally + this is dist.location, except in the case of develop-installed + packages, where dist.location is the source code location, and we + want to know where the egg-link file is. + + """ + egg_link = egg_link_path(dist) + if egg_link: + return egg_link + return dist.location + + +def get_terminal_size(): + """Returns a tuple (x, y) representing the width(x) and the height(x) + in characters of the terminal window.""" + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack( + 'hh', + fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234') + ) + except: + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) + + +def current_umask(): + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def unzip_file(filename, location, flatten=True): + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, 'rb') + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + data = zip.read(name) + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if fn.endswith('/') or fn.endswith('\\'): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + fp = open(fn, 'wb') + try: + fp.write(data) + finally: + fp.close() + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + if mode and stat.S_ISREG(mode) and mode & 0o111: + # make dest file have execute for user/group/world + # (chmod +x) no-op on windows per python docs + os.chmod(fn, (0o777 - current_umask() | 0o111)) + finally: + zipfp.close() + + +def untar_file(filename, location): + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): + mode = 'r:gz' + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = 'r:bz2' + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = 'r:xz' + elif filename.lower().endswith('.tar'): + mode = 'r' + else: + logger.warning( + 'Cannot determine compression type for file %s', filename, + ) + mode = 'r:*' + tar = tarfile.open(filename, mode) + try: + # note: python<=2.5 doesn't seem to know about pax headers, filter them + leading = has_leading_dir([ + member.name for member in tar.getmembers() + if member.name != 'pax_global_header' + ]) + for member in tar.getmembers(): + fn = member.name + if fn == 'pax_global_header': + continue + if leading: + fn = split_leading_dir(fn)[1] + path = os.path.join(location, fn) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + tar._extract_member(member, path) + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + ensure_dir(os.path.dirname(path)) + with open(path, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + tar.utime(member, path) + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + # make dest file have execute for user/group/world + # no-op on windows per python docs + os.chmod(path, (0o777 - current_umask() | 0o111)) + finally: + tar.close() + + +def unpack_file(filename, location, content_type, link): + filename = os.path.realpath(filename) + if (content_type == 'application/zip' or + filename.lower().endswith(ZIP_EXTENSIONS) or + zipfile.is_zipfile(filename)): + unzip_file( + filename, + location, + flatten=not filename.endswith('.whl') + ) + elif (content_type == 'application/x-gzip' or + tarfile.is_tarfile(filename) or + filename.lower().endswith( + TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)): + untar_file(filename, location) + elif (content_type and content_type.startswith('text/html') and + is_svn_page(file_contents(filename))): + # We don't really care about this + from pip.vcs.subversion import Subversion + Subversion('svn+' + link.url).unpack(location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' + 'cannot detect archive format', + filename, location, content_type, + ) + raise InstallationError( + 'Cannot determine archive format of %s' % location + ) + + +def call_subprocess(cmd, show_stdout=True, cwd=None, + on_returncode='raise', + command_desc=None, + extra_environ=None, spinner=None): + # This function's handling of subprocess output is confusing and I + # previously broke it terribly, so as penance I will write a long comment + # explaining things. + # + # The obvious thing that affects output is the show_stdout= + # kwarg. show_stdout=True means, let the subprocess write directly to our + # stdout. Even though it is nominally the default, it is almost never used + # inside pip (and should not be used in new code without a very good + # reason); as of 2016-02-22 it is only used in a few places inside the VCS + # wrapper code. Ideally we should get rid of it entirely, because it + # creates a lot of complexity here for a rarely used feature. + # + # Most places in pip set show_stdout=False. What this means is: + # - We connect the child stdout to a pipe, which we read. + # - By default, we hide the output but show a spinner -- unless the + # subprocess exits with an error, in which case we show the output. + # - If the --verbose option was passed (= loglevel is DEBUG), then we show + # the output unconditionally. (But in this case we don't want to show + # the output a second time if it turns out that there was an error.) + # + # stderr is always merged with stdout (even if show_stdout=True). + if show_stdout: + stdout = None + else: + stdout = subprocess.PIPE + if command_desc is None: + cmd_parts = [] + for part in cmd: + if ' ' in part or '\n' in part or '"' in part or "'" in part: + part = '"%s"' % part.replace('"', '\\"') + cmd_parts.append(part) + command_desc = ' '.join(cmd_parts) + logger.debug("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + try: + proc = subprocess.Popen( + cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout, + cwd=cwd, env=env) + except Exception as exc: + logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + if stdout is not None: + all_output = [] + while True: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + if logger.getEffectiveLevel() <= std_logging.DEBUG: + # Show the line immediately + logger.debug(line) + else: + # Update the spinner + if spinner is not None: + spinner.spin() + proc.wait() + if spinner is not None: + if proc.returncode: + spinner.finish("error") + else: + spinner.finish("done") + if proc.returncode: + if on_returncode == 'raise': + if (logger.getEffectiveLevel() > std_logging.DEBUG and + not show_stdout): + logger.info( + 'Complete output from command %s:', command_desc, + ) + logger.info( + ''.join(all_output) + + '\n----------------------------------------' + ) + raise InstallationError( + 'Command "%s" failed with error code %s in %s' + % (command_desc, proc.returncode, cwd)) + elif on_returncode == 'warn': + logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, proc.returncode, cwd, + ) + elif on_returncode == 'ignore': + pass + else: + raise ValueError('Invalid value: on_returncode=%s' % + repr(on_returncode)) + if not show_stdout: + return ''.join(all_output) + + +def read_text_file(filename): + """Return the contents of *filename*. + + Try to decode the file contents with utf-8, the preferred system encoding + (e.g., cp1252 on some Windows machines), and latin1, in that order. + Decoding a byte string with latin1 will never raise an error. In the worst + case, the returned string will contain some garbage characters. + + """ + with open(filename, 'rb') as fp: + data = fp.read() + + encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1'] + for enc in encodings: + try: + data = data.decode(enc) + except UnicodeDecodeError: + continue + break + + assert type(data) != bytes # Latin1 should have worked. + return data + + +def _make_build_dir(build_dir): + os.makedirs(build_dir) + write_delete_marker_file(build_dir) + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = (l for l in lines) + + def readline(self): + try: + try: + return next(self._gen) + except NameError: + return self._gen.next() + except StopIteration: + return '' + + def __iter__(self): + return self._gen + + +class StreamWrapper(StringIO): + + @classmethod + def from_stream(cls, orig_stream): + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + @property + def encoding(self): + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name): + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout(): + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output('stdout') + + +class cached_property(object): + """A property that is only computed once per instance and then replaces + itself with an ordinary attribute. Deleting the attribute resets the + property. + + Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 + """ + + def __init__(self, func): + self.__doc__ = getattr(func, '__doc__') + self.func = func + + def __get__(self, obj, cls): + if obj is None: + # We're being accessed from the class itself, not from an object + return self + value = obj.__dict__[self.func.__name__] = self.func(obj) + return value + + +def get_installed_version(dist_name, lookup_dirs=None): + """Get the installed version of dist_name avoiding pkg_resources cache""" + # Create a requirement that we'll look for inside of setuptools. + req = pkg_resources.Requirement.parse(dist_name) + + # We want to avoid having this cached, so we need to construct a new + # working set each time. + if lookup_dirs is None: + working_set = pkg_resources.WorkingSet() + else: + working_set = pkg_resources.WorkingSet(lookup_dirs) + + # Get the installed distribution from our working set + dist = working_set.find(req) + + # Check to see if we got an installed distribution or not, if we did + # we want to return it's version. + return dist.version if dist else None + + +def consume(iterator): + """Consume an iterable at C speed.""" + deque(iterator, maxlen=0) diff --git a/vendor/pip-9.0.3/pip/utils/appdirs.py b/vendor/pip-9.0.3/pip/utils/appdirs.py new file mode 100644 index 0000000000000000000000000000000000000000..9b8280144d75690ed46f82dfcd961547f58cc1b1 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/appdirs.py @@ -0,0 +1,248 @@ +""" +This code was taken from https://github.com/ActiveState/appdirs and modified +to suit our purposes. +""" +from __future__ import absolute_import + +import os +import sys + +from pip.compat import WINDOWS, expanduser +from pip._vendor.six import PY2, text_type + + +def user_cache_dir(appname): + r""" + Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + + Typical user cache directories are: + macOS: ~/Library/Caches/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Windows: C:\Users\<username>\AppData\Local\<AppName>\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go + in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the + non-roaming app data dir (the default returned by `user_data_dir`). Apps + typically put cache data somewhere *under* the given dir here. Some + examples: + ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache + ...\Acme\SuperApp\Cache\1.0 + + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + """ + if WINDOWS: + # Get the base path + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + + # When using Python 2, return paths as bytes on Windows like we do on + # other operating systems. See helper function docs for more details. + if PY2 and isinstance(path, text_type): + path = _win_path_to_bytes(path) + + # Add our app name and Cache directory to it + path = os.path.join(path, appname, "Cache") + elif sys.platform == "darwin": + # Get the base path + path = expanduser("~/Library/Caches") + + # Add our app name to it + path = os.path.join(path, appname) + else: + # Get the base path + path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache")) + + # Add our app name to it + path = os.path.join(path, appname) + + return path + + +def user_data_dir(appname, roaming=False): + """ + Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + macOS: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in + $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\ ... + ...Application Data\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local ... + ...Settings\Application Data\<AppName> + Win 7 (not roaming): C:\\Users\<username>\AppData\Local\<AppName> + Win 7 (roaming): C:\\Users\<username>\AppData\Roaming\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + if WINDOWS: + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.join(os.path.normpath(_get_win_folder(const)), appname) + elif sys.platform == "darwin": + path = os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) + else: + path = os.path.join( + os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")), + appname, + ) + + return path + + +def user_config_dir(appname, roaming=True): + """Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default True) can be set False to not use the + Windows roaming appdata directory. That means that for users on a + Windows network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + macOS: same as user_data_dir + Unix: ~/.config/<AppName> + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/<AppName>". + """ + if WINDOWS: + path = user_data_dir(appname, roaming=roaming) + elif sys.platform == "darwin": + path = user_data_dir(appname) + else: + path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config")) + path = os.path.join(path, appname) + + return path + + +# for the discussion regarding site_config_dirs locations +# see <https://github.com/pypa/pip/issues/1733> +def site_config_dirs(appname): + """Return a list of potential user-shared config dirs for this application. + + "appname" is the name of application. + + Typical user config directories are: + macOS: /Library/Application Support/<AppName>/ + Unix: /etc or $XDG_CONFIG_DIRS[i]/<AppName>/ for each value in + $XDG_CONFIG_DIRS + Win XP: C:\Documents and Settings\All Users\Application ... + ...Data\<AppName>\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory + on Vista.) + Win 7: Hidden, but writeable on Win 7: + C:\ProgramData\<AppName>\ + """ + if WINDOWS: + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + pathlist = [os.path.join(path, appname)] + elif sys.platform == 'darwin': + pathlist = [os.path.join('/Library/Application Support', appname)] + else: + # try looking in $XDG_CONFIG_DIRS + xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + if xdg_config_dirs: + pathlist = [ + os.path.join(expanduser(x), appname) + for x in xdg_config_dirs.split(os.pathsep) + ] + else: + pathlist = [] + + # always look in /etc directly as well + pathlist.append('/etc') + + return pathlist + + +# -- Windows support functions -- + +def _get_win_folder_from_registry(csidl_name): + """ + This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + directory, _type = _winreg.QueryValueEx(key, shell_folder_name) + return directory + + +def _get_win_folder_with_ctypes(csidl_name): + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +if WINDOWS: + try: + import ctypes + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +def _win_path_to_bytes(path): + """Encode Windows paths to bytes. Only used on Python 2. + + Motivation is to be consistent with other operating systems where paths + are also returned as bytes. This avoids problems mixing bytes and Unicode + elsewhere in the codebase. For more details and discussion see + <https://github.com/pypa/pip/issues/3463>. + + If encoding using ASCII and MBCS fails, return the original Unicode path. + """ + for encoding in ('ASCII', 'MBCS'): + try: + return path.encode(encoding) + except (UnicodeEncodeError, LookupError): + pass + return path diff --git a/vendor/pip-9.0.3/pip/utils/build.py b/vendor/pip-9.0.3/pip/utils/build.py new file mode 100644 index 0000000000000000000000000000000000000000..fc65cfab3e01ec5c2a092dadb1ca9a05737225f9 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/build.py @@ -0,0 +1,42 @@ +from __future__ import absolute_import + +import os.path +import tempfile + +from pip.utils import rmtree + + +class BuildDirectory(object): + + def __init__(self, name=None, delete=None): + # If we were not given an explicit directory, and we were not given an + # explicit delete option, then we'll default to deleting. + if name is None and delete is None: + delete = True + + if name is None: + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + name = os.path.realpath(tempfile.mkdtemp(prefix="pip-build-")) + # If we were not given an explicit directory, and we were not given + # an explicit delete option, then we'll default to deleting. + if delete is None: + delete = True + + self.name = name + self.delete = delete + + def __repr__(self): + return "<{} {!r}>".format(self.__class__.__name__, self.name) + + def __enter__(self): + return self.name + + def __exit__(self, exc, value, tb): + self.cleanup() + + def cleanup(self): + if self.delete: + rmtree(self.name) diff --git a/vendor/pip-9.0.3/pip/utils/deprecation.py b/vendor/pip-9.0.3/pip/utils/deprecation.py new file mode 100644 index 0000000000000000000000000000000000000000..c3f799e64a8a503accaf9923850db6e9883be5d6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/deprecation.py @@ -0,0 +1,76 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" +from __future__ import absolute_import + +import logging +import warnings + + +class PipDeprecationWarning(Warning): + pass + + +class Pending(object): + pass + + +class RemovedInPip10Warning(PipDeprecationWarning): + pass + + +class RemovedInPip11Warning(PipDeprecationWarning, Pending): + pass + + +class Python26DeprecationWarning(PipDeprecationWarning): + pass + + +# Warnings <-> Logging Integration + + +_warnings_showwarning = None + + +def _showwarning(message, category, filename, lineno, file=None, line=None): + if file is not None: + if _warnings_showwarning is not None: + _warnings_showwarning( + message, category, filename, lineno, file, line, + ) + else: + if issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip.deprecations") + + # This is purposely using the % formatter here instead of letting + # the logging module handle the interpolation. This is because we + # want it to appear as if someone typed this entire message out. + log_message = "DEPRECATION: %s" % message + + # PipDeprecationWarnings that are Pending still have at least 2 + # versions to go until they are removed so they can just be + # warnings. Otherwise, they will be removed in the very next + # version of pip. We want these to be more obvious so we use the + # ERROR logging level. + if issubclass(category, Pending): + logger.warning(log_message) + else: + logger.error(log_message) + else: + _warnings_showwarning( + message, category, filename, lineno, file, line, + ) + + +def install_warning_logger(): + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _warnings_showwarning + + if _warnings_showwarning is None: + _warnings_showwarning = warnings.showwarning + warnings.showwarning = _showwarning diff --git a/vendor/pip-9.0.3/pip/utils/encoding.py b/vendor/pip-9.0.3/pip/utils/encoding.py new file mode 100644 index 0000000000000000000000000000000000000000..24831686cf4058c18e04eb2b1dc1201d22852cef --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/encoding.py @@ -0,0 +1,31 @@ +import codecs +import locale +import re + + +BOMS = [ + (codecs.BOM_UTF8, 'utf8'), + (codecs.BOM_UTF16, 'utf16'), + (codecs.BOM_UTF16_BE, 'utf16-be'), + (codecs.BOM_UTF16_LE, 'utf16-le'), + (codecs.BOM_UTF32, 'utf32'), + (codecs.BOM_UTF32_BE, 'utf32-be'), + (codecs.BOM_UTF32_LE, 'utf32-le'), +] + +ENCODING_RE = re.compile(b'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom):].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b'\n')[:2]: + if line[0:1] == b'#' and ENCODING_RE.search(line): + encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') + return data.decode(encoding) + return data.decode(locale.getpreferredencoding(False)) diff --git a/vendor/pip-9.0.3/pip/utils/filesystem.py b/vendor/pip-9.0.3/pip/utils/filesystem.py new file mode 100644 index 0000000000000000000000000000000000000000..25ad51660d4b4d89d8d2c09e91b9516bb982a308 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/filesystem.py @@ -0,0 +1,28 @@ +import os +import os.path + +from pip.compat import get_path_uid + + +def check_path_owner(path): + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if not hasattr(os, "geteuid"): + return True + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) diff --git a/vendor/pip-9.0.3/pip/utils/glibc.py b/vendor/pip-9.0.3/pip/utils/glibc.py new file mode 100644 index 0000000000000000000000000000000000000000..7847885c4f93946545549bb79e5989b83271a7e1 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/glibc.py @@ -0,0 +1,81 @@ +from __future__ import absolute_import + +import re +import ctypes +import platform +import warnings + + +def glibc_version_string(): + "Returns glibc version string, or None if not using glibc." + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + version_str = glibc_version_string() + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + glibc_version = glibc_version_string() + if glibc_version is None: + # For non-glibc platforms, fall back on platform.libc_ver + return platform.libc_ver() + else: + return ("glibc", glibc_version) diff --git a/vendor/pip-9.0.3/pip/utils/hashes.py b/vendor/pip-9.0.3/pip/utils/hashes.py new file mode 100644 index 0000000000000000000000000000000000000000..960297007ae54a8ff0316850f92c49437fe85c72 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/hashes.py @@ -0,0 +1,92 @@ +from __future__ import absolute_import + +import hashlib + +from pip.exceptions import HashMismatch, HashMissing, InstallationError +from pip.utils import read_chunks +from pip._vendor.six import iteritems, iterkeys, itervalues + + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = 'sha256' + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ['sha256', 'sha384', 'sha512'] + + +class Hashes(object): + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + def __init__(self, hashes=None): + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + self._allowed = {} if hashes is None else hashes + + def check_against_chunks(self, chunks): + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in iterkeys(self._allowed): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError('Unknown hash name: %s' % hash_name) + + for chunk in chunks: + for hash in itervalues(gots): + hash.update(chunk) + + for hash_name, got in iteritems(gots): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots): + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path): + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + return self.__nonzero__() + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + def __init__(self): + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots): + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/vendor/pip-9.0.3/pip/utils/logging.py b/vendor/pip-9.0.3/pip/utils/logging.py new file mode 100644 index 0000000000000000000000000000000000000000..1c1053abfb4d2f086b2a94f7679a970a5bd269e2 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/logging.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import + +import contextlib +import logging +import logging.handlers +import os + +try: + import threading +except ImportError: + import dummy_threading as threading + +from pip.compat import WINDOWS +from pip.utils import ensure_dir + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + + +_log_state = threading.local() +_log_state.indentation = 0 + + +@contextlib.contextmanager +def indent_log(num=2): + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation(): + return getattr(_log_state, 'indentation', 0) + + +class IndentingFormatter(logging.Formatter): + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log messages + by our current indentation level. + """ + formatted = logging.Formatter.format(self, record) + formatted = "".join([ + (" " * get_indentation()) + line + for line in formatted.splitlines(True) + ]) + return formatted + + +def _color_wrap(*colors): + def wrapped(inp): + return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) + return wrapped + + +class ColorizedStreamHandler(logging.StreamHandler): + + # Don't build up a list of colors if we don't have colorama + if colorama: + COLORS = [ + # This needs to be in order from highest logging level to lowest. + (logging.ERROR, _color_wrap(colorama.Fore.RED)), + (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), + ] + else: + COLORS = [] + + def __init__(self, stream=None): + logging.StreamHandler.__init__(self, stream) + + if WINDOWS and colorama: + self.stream = colorama.AnsiToWin32(self.stream) + + def should_color(self): + # Don't colorize things if we do not have colorama + if not colorama: + return False + + real_stream = ( + self.stream if not isinstance(self.stream, colorama.AnsiToWin32) + else self.stream.wrapped + ) + + # If the stream is a tty we should color it + if hasattr(real_stream, "isatty") and real_stream.isatty(): + return True + + # If we have an ASNI term we should color it + if os.environ.get("TERM") == "ANSI": + return True + + # If anything else we should not color it + return False + + def format(self, record): + msg = logging.StreamHandler.format(self, record) + + if self.should_color(): + for level, color in self.COLORS: + if record.levelno >= level: + msg = color(msg) + break + + return msg + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(logging.Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level diff --git a/vendor/pip-9.0.3/pip/utils/outdated.py b/vendor/pip-9.0.3/pip/utils/outdated.py new file mode 100644 index 0000000000000000000000000000000000000000..2164cc3cc2f2eb53e954fb80281ccdc927d10600 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/outdated.py @@ -0,0 +1,162 @@ +from __future__ import absolute_import + +import datetime +import json +import logging +import os.path +import sys + +from pip._vendor import lockfile +from pip._vendor.packaging import version as packaging_version + +from pip.compat import total_seconds, WINDOWS +from pip.models import PyPI +from pip.locations import USER_CACHE_DIR, running_under_virtualenv +from pip.utils import ensure_dir, get_installed_version +from pip.utils.filesystem import check_path_owner + + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +class VirtualenvSelfCheckState(object): + def __init__(self): + self.statefile_path = os.path.join(sys.prefix, "pip-selfcheck.json") + + # Load the existing state + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile) + except (IOError, ValueError): + self.state = {} + + def save(self, pypi_version, current_time): + # Attempt to write out our version check file + with open(self.statefile_path, "w") as statefile: + json.dump( + { + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + }, + statefile, + sort_keys=True, + separators=(",", ":") + ) + + +class GlobalSelfCheckState(object): + def __init__(self): + self.statefile_path = os.path.join(USER_CACHE_DIR, "selfcheck.json") + + # Load the existing state + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile)[sys.prefix] + except (IOError, ValueError, KeyError): + self.state = {} + + def save(self, pypi_version, current_time): + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self.statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self.statefile_path)) + + # Attempt to write out our version check file + with lockfile.LockFile(self.statefile_path): + if os.path.exists(self.statefile_path): + with open(self.statefile_path) as statefile: + state = json.load(statefile) + else: + state = {} + + state[sys.prefix] = { + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + with open(self.statefile_path, "w") as statefile: + json.dump(state, statefile, sort_keys=True, + separators=(",", ":")) + + +def load_selfcheck_statefile(): + if running_under_virtualenv(): + return VirtualenvSelfCheckState() + else: + return GlobalSelfCheckState() + + +def pip_version_check(session): + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_version = get_installed_version("pip") + if installed_version is None: + return + + pip_version = packaging_version.parse(installed_version) + pypi_version = None + + try: + state = load_selfcheck_statefile() + + current_time = datetime.datetime.utcnow() + # Determine if we need to refresh the state + if "last_check" in state.state and "pypi_version" in state.state: + last_check = datetime.datetime.strptime( + state.state["last_check"], + SELFCHECK_DATE_FMT + ) + if total_seconds(current_time - last_check) < 7 * 24 * 60 * 60: + pypi_version = state.state["pypi_version"] + + # Refresh the version if we need to or just see if we need to warn + if pypi_version is None: + resp = session.get( + PyPI.pip_json_url, + headers={"Accept": "application/json"}, + ) + resp.raise_for_status() + pypi_version = [ + v for v in sorted( + list(resp.json()["releases"]), + key=packaging_version.parse, + ) + if not packaging_version.parse(v).is_prerelease + ][-1] + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = packaging_version.parse(pypi_version) + + # Determine if our pypi_version is older + if (pip_version < remote_version and + pip_version.base_version != remote_version.base_version): + # Advise "python -m pip" on Windows to avoid issues + # with overwriting pip.exe. + if WINDOWS: + pip_cmd = "python -m pip" + else: + pip_cmd = "pip" + logger.warning( + "You are using pip version %s, however version %s is " + "available.\nYou should consider upgrading via the " + "'%s install --upgrade pip' command.", + pip_version, pypi_version, pip_cmd + ) + + except Exception: + logger.debug( + "There was an error checking the latest version of pip", + exc_info=True, + ) diff --git a/vendor/pip-9.0.3/pip/utils/packaging.py b/vendor/pip-9.0.3/pip/utils/packaging.py new file mode 100644 index 0000000000000000000000000000000000000000..e93b20d158d51265a4ed9178717061ad830b5112 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/packaging.py @@ -0,0 +1,63 @@ +from __future__ import absolute_import + +from email.parser import FeedParser + +import logging +import sys + +from pip._vendor.packaging import specifiers +from pip._vendor.packaging import version +from pip._vendor import pkg_resources + +from pip import exceptions + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python): + """ + Check if the python version in use match the `requires_python` specifier. + + Returns `True` if the version of python in use matches the requirement. + Returns `False` if the version of python in use does not matches the + requirement. + + Raises an InvalidSpecifier if `requires_python` have an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + # We only use major.minor.micro + python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata('METADATA')): + return dist.get_metadata('METADATA') + elif dist.has_metadata('PKG-INFO'): + return dist.get_metadata('PKG-INFO') + + +def check_dist_requires_python(dist): + metadata = get_metadata(dist) + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + requires_python = pkg_info_dict.get('Requires-Python') + try: + if not check_requires_python(requires_python): + raise exceptions.UnsupportedPythonVersion( + "%s requires Python '%s' but the running Python is %s" % ( + dist.project_name, + requires_python, + '.'.join(map(str, sys.version_info[:3])),) + ) + except specifiers.InvalidSpecifier as e: + logger.warning( + "Package %s has an invalid Requires-Python entry %s - %s" % ( + dist.project_name, requires_python, e)) + return diff --git a/vendor/pip-9.0.3/pip/utils/setuptools_build.py b/vendor/pip-9.0.3/pip/utils/setuptools_build.py new file mode 100644 index 0000000000000000000000000000000000000000..03973e976cad1b9f3363fafb9f3513dffa1b2a5e --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/setuptools_build.py @@ -0,0 +1,8 @@ +# Shim to wrap setup.py invocation with setuptools +SETUPTOOLS_SHIM = ( + "import setuptools, tokenize;__file__=%r;" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))" +) diff --git a/vendor/pip-9.0.3/pip/utils/ui.py b/vendor/pip-9.0.3/pip/utils/ui.py new file mode 100644 index 0000000000000000000000000000000000000000..bba73e3b13307dc4863740da67244f46d3e23ff6 --- /dev/null +++ b/vendor/pip-9.0.3/pip/utils/ui.py @@ -0,0 +1,344 @@ +from __future__ import absolute_import +from __future__ import division + +import itertools +import sys +from signal import signal, SIGINT, default_int_handler +import time +import contextlib +import logging + +from pip.compat import WINDOWS +from pip.utils import format_size +from pip.utils.logging import get_indentation +from pip._vendor import six +from pip._vendor.progress.bar import Bar, IncrementalBar +from pip._vendor.progress.helpers import (WritelnMixin, + HIDE_CURSOR, SHOW_CURSOR) +from pip._vendor.progress.spinner import Spinner + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + +logger = logging.getLogger(__name__) + + +def _select_progress_class(preferred, fallback): + encoding = getattr(preferred.file, "encoding", None) + + # If we don't know what encoding this file is in, then we'll just assume + # that it doesn't support unicode and use the ASCII bar. + if not encoding: + return fallback + + # Collect all of the possible characters we want to use with the preferred + # bar. + characters = [ + getattr(preferred, "empty_fill", six.text_type()), + getattr(preferred, "fill", six.text_type()), + ] + characters += list(getattr(preferred, "phases", [])) + + # Try to decode the characters we're using for the bar using the encoding + # of the given file, if this works then we'll assume that we can use the + # fancier bar and if not we'll fall back to the plaintext bar. + try: + six.text_type().join(characters).encode(encoding) + except UnicodeEncodeError: + return fallback + else: + return preferred + + +_BaseBar = _select_progress_class(IncrementalBar, Bar) + + +class InterruptibleMixin(object): + """ + Helper to ensure that self.finish() gets called on keyboard interrupt. + + This allows downloads to be interrupted without leaving temporary state + (like hidden cursors) behind. + + This class is similar to the progress library's existing SigIntMixin + helper, but as of version 1.2, that helper has the following problems: + + 1. It calls sys.exit(). + 2. It discards the existing SIGINT handler completely. + 3. It leaves its own handler in place even after an uninterrupted finish, + which will have unexpected delayed effects if the user triggers an + unrelated keyboard interrupt some time after a progress-displaying + download has already completed, for example. + """ + + def __init__(self, *args, **kwargs): + """ + Save the original SIGINT handler for later. + """ + super(InterruptibleMixin, self).__init__(*args, **kwargs) + + self.original_handler = signal(SIGINT, self.handle_sigint) + + # If signal() returns None, the previous handler was not installed from + # Python, and we cannot restore it. This probably should not happen, + # but if it does, we must restore something sensible instead, at least. + # The least bad option should be Python's default SIGINT handler, which + # just raises KeyboardInterrupt. + if self.original_handler is None: + self.original_handler = default_int_handler + + def finish(self): + """ + Restore the original SIGINT handler after finishing. + + This should happen regardless of whether the progress display finishes + normally, or gets interrupted. + """ + super(InterruptibleMixin, self).finish() + signal(SIGINT, self.original_handler) + + def handle_sigint(self, signum, frame): + """ + Call self.finish() before delegating to the original SIGINT handler. + + This handler should only be in place while the progress display is + active. + """ + self.finish() + self.original_handler(signum, frame) + + +class DownloadProgressMixin(object): + + def __init__(self, *args, **kwargs): + super(DownloadProgressMixin, self).__init__(*args, **kwargs) + self.message = (" " * (get_indentation() + 2)) + self.message + + @property + def downloaded(self): + return format_size(self.index) + + @property + def download_speed(self): + # Avoid zero division errors... + if self.avg == 0.0: + return "..." + return format_size(1 / self.avg) + "/s" + + @property + def pretty_eta(self): + if self.eta: + return "eta %s" % self.eta_td + return "" + + def iter(self, it, n=1): + for x in it: + yield x + self.next(n) + self.finish() + + +class WindowsMixin(object): + + def __init__(self, *args, **kwargs): + # The Windows terminal does not support the hide/show cursor ANSI codes + # even with colorama. So we'll ensure that hide_cursor is False on + # Windows. + # This call neds to go before the super() call, so that hide_cursor + # is set in time. The base progress bar class writes the "hide cursor" + # code to the terminal in its init, so if we don't set this soon + # enough, we get a "hide" with no corresponding "show"... + if WINDOWS and self.hide_cursor: + self.hide_cursor = False + + super(WindowsMixin, self).__init__(*args, **kwargs) + + # Check if we are running on Windows and we have the colorama module, + # if we do then wrap our file with it. + if WINDOWS and colorama: + self.file = colorama.AnsiToWin32(self.file) + # The progress code expects to be able to call self.file.isatty() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.isatty = lambda: self.file.wrapped.isatty() + # The progress code expects to be able to call self.file.flush() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.flush = lambda: self.file.wrapped.flush() + + +class DownloadProgressBar(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, _BaseBar): + + file = sys.stdout + message = "%(percent)d%%" + suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, WritelnMixin, Spinner): + + file = sys.stdout + suffix = "%(downloaded)s %(download_speed)s" + + def next_phase(self): + if not hasattr(self, "_phaser"): + self._phaser = itertools.cycle(self.phases) + return next(self._phaser) + + def update(self): + message = self.message % self + phase = self.next_phase() + suffix = self.suffix % self + line = ''.join([ + message, + " " if message else "", + phase, + " " if suffix else "", + suffix, + ]) + + self.writeln(line) + + +################################################################ +# Generic "something is happening" spinners +# +# We don't even try using progress.spinner.Spinner here because it's actually +# simpler to reimplement from scratch than to coerce their code into doing +# what we need. +################################################################ + +@contextlib.contextmanager +def hidden_cursor(file): + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) + + +class RateLimiter(object): + def __init__(self, min_update_interval_seconds): + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 + + def ready(self): + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + self._last_update = time.time() + + +class InteractiveSpinner(object): + def __init__(self, message, file=None, spin_chars="-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds=0.125): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status): + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self): + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(object): + def __init__(self, message, min_update_interval_seconds=60): + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status): + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self): + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + if self._finished: + return + self._update("finished with status '%s'" % (final_status,)) + self._finished = True + + +@contextlib.contextmanager +def open_spinner(message): + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner = InteractiveSpinner(message) + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") diff --git a/vendor/pip-9.0.3/pip/vcs/__init__.py b/vendor/pip-9.0.3/pip/vcs/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..8d3dbb271d8ec0863629125ca9788a7b11e81b21 --- /dev/null +++ b/vendor/pip-9.0.3/pip/vcs/__init__.py @@ -0,0 +1,366 @@ +"""Handles all VCS (version control) support""" +from __future__ import absolute_import + +import errno +import logging +import os +import shutil +import sys + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip.exceptions import BadCommand +from pip.utils import (display_path, backup_dir, call_subprocess, + rmtree, ask_path_exists) + + +__all__ = ['vcs', 'get_src_requirement'] + + +logger = logging.getLogger(__name__) + + +class VcsSupport(object): + _registry = {} + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # Register more schemes with urlparse for various version control + # systems + urllib_parse.uses_netloc.extend(self.schemes) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + return self._registry.__iter__() + + @property + def backends(self): + return list(self._registry.values()) + + @property + def dirnames(self): + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + schemes = [] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + if not hasattr(cls, 'name'): + logger.warning('Cannot register VCS %s', cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls + logger.debug('Registered VCS backend: %s', cls.name) + + def unregister(self, cls=None, name=None): + if name in self._registry: + del self._registry[name] + elif cls in self._registry.values(): + del self._registry[cls.name] + else: + logger.warning('Cannot unregister because no class or name given') + + def get_backend_name(self, location): + """ + Return the name of the version control backend if found at given + location, e.g. vcs.get_backend_name('/path/to/vcs/checkout') + """ + for vc_type in self._registry.values(): + if vc_type.controls_location(location): + logger.debug('Determine that %s uses VCS: %s', + location, vc_type.name) + return vc_type.name + return None + + def get_backend(self, name): + name = name.lower() + if name in self._registry: + return self._registry[name] + + def get_backend_from_location(self, location): + vc_type = self.get_backend_name(location) + if vc_type: + return self.get_backend(vc_type) + return None + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + # List of supported schemes for this Version Control + schemes = () + + def __init__(self, url=None, *args, **kwargs): + self.url = url + super(VersionControl, self).__init__(*args, **kwargs) + + def _is_local_repository(self, repo): + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or drive + + # See issue #1083 for why this method was introduced: + # https://github.com/pypa/pip/issues/1083 + def translate_egg_surname(self, surname): + # For example, Django has branches of the form "stable/1.7.x". + return surname.replace('/', '_') + + def export(self, location): + """ + Export the repository at the url to the destination location + i.e. only download the files, without vcs informations + """ + raise NotImplementedError + + def get_url_rev(self): + """ + Returns the correct repository URL and revision by parsing the given + repository URL + """ + error_message = ( + "Sorry, '%s' is a malformed VCS url. " + "The format is <vcs>+<protocol>://<url>, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp" + ) + assert '+' in self.url, error_message % self.url + url = self.url.split('+', 1)[1] + scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev + + def get_info(self, location): + """ + Returns (url, revision), where both are strings + """ + assert not location.rstrip('/').endswith(self.dirname), \ + 'Bad directory: %s' % location + return self.get_url(location), self.get_revision(location) + + def normalize_url(self, url): + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + def compare_urls(self, url1, url2): + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (self.normalize_url(url1) == self.normalize_url(url2)) + + def obtain(self, dest): + """ + Called when installing or updating an editable package, takes the + source path of the checkout. + """ + raise NotImplementedError + + def switch(self, dest, url, rev_options): + """ + Switch the repo at ``dest`` to point to ``URL``. + """ + raise NotImplementedError + + def update(self, dest, rev_options): + """ + Update an already-existing repo to the given ``rev_options``. + """ + raise NotImplementedError + + def check_version(self, dest, rev_options): + """ + Return True if the version is identical to what exists and + doesn't need to be updated. + """ + raise NotImplementedError + + def check_destination(self, dest, url, rev_options, rev_display): + """ + Prepare a location to receive a checkout/clone. + + Return True if the location is ready for (and requires) a + checkout/clone, False otherwise. + """ + checkout = True + prompt = False + if os.path.exists(dest): + checkout = False + if os.path.exists(os.path.join(dest, self.dirname)): + existing_url = self.get_url(dest) + if self.compare_urls(existing_url, url): + logger.debug( + '%s in %s exists, and has correct URL (%s)', + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.check_version(dest, rev_options): + logger.info( + 'Updating %s %s%s', + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, rev_options) + else: + logger.info( + 'Skipping because already up-to-date.') + else: + logger.warning( + '%s %s in %s exists with URL %s', + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', + ('s', 'i', 'w', 'b')) + else: + logger.warning( + 'Directory %s already exists, and is not a %s %s.', + dest, + self.name, + self.repo_name, + ) + prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('i', 'w', 'b')) + if prompt: + logger.warning( + 'The plan is to install the %s repository %s', + self.name, + url, + ) + response = ask_path_exists('What to do? %s' % prompt[0], + prompt[1]) + + if response == 's': + logger.info( + 'Switching %s %s to %s%s', + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + elif response == 'i': + # do nothing + pass + elif response == 'w': + logger.warning('Deleting %s', display_path(dest)) + rmtree(dest) + checkout = True + elif response == 'b': + dest_dir = backup_dir(dest) + logger.warning( + 'Backing up %s to %s', display_path(dest), dest_dir, + ) + shutil.move(dest, dest_dir) + checkout = True + elif response == 'a': + sys.exit(-1) + return checkout + + def unpack(self, location): + """ + Clean up current location and download the url repository + (and vcs infos) into location + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location) + + def get_src_requirement(self, dist, location): + """ + Return a string representing the requirement needed to + redownload the files currently present in location, something + like: + {repository_url}@{revision}#egg={project_name}-{version_identifier} + """ + raise NotImplementedError + + def get_url(self, location): + """ + Return the url used at location + Used in get_info or check_destination + """ + raise NotImplementedError + + def get_revision(self, location): + """ + Return the current revision of the files at location + Used in get_info + """ + raise NotImplementedError + + def run_command(self, cmd, show_stdout=True, cwd=None, + on_returncode='raise', + command_desc=None, + extra_environ=None, spinner=None): + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = [self.name] + cmd + try: + return call_subprocess(cmd, show_stdout, cwd, + on_returncode, + command_desc, extra_environ, + spinner) + except OSError as e: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + if e.errno == errno.ENOENT: + raise BadCommand('Cannot find command %r' % self.name) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def controls_location(cls, location): + """ + Check if a location is controlled by the vcs. + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + """ + logger.debug('Checking in %s for %s (%s)...', + location, cls.dirname, cls.name) + path = os.path.join(location, cls.dirname) + return os.path.exists(path) + + +def get_src_requirement(dist, location): + version_control = vcs.get_backend_from_location(location) + if version_control: + try: + return version_control().get_src_requirement(dist, + location) + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + version_control.name, + ) + return dist.as_requirement() + logger.warning( + 'cannot determine version of editable source in %s (is not SVN ' + 'checkout, Git clone, Mercurial clone or Bazaar branch)', + location, + ) + return dist.as_requirement() diff --git a/vendor/pip-9.0.3/pip/vcs/bazaar.py b/vendor/pip-9.0.3/pip/vcs/bazaar.py new file mode 100644 index 0000000000000000000000000000000000000000..0f095841d361f43925af6d766bf9ec3a86a4a22c --- /dev/null +++ b/vendor/pip-9.0.3/pip/vcs/bazaar.py @@ -0,0 +1,116 @@ +from __future__ import absolute_import + +import logging +import os +import tempfile + +# TODO: Get this into six.moves.urllib.parse +try: + from urllib import parse as urllib_parse +except ImportError: + import urlparse as urllib_parse + +from pip.utils import rmtree, display_path +from pip.vcs import vcs, VersionControl +from pip.download import path_to_url + + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = 'bzr' + dirname = '.bzr' + repo_name = 'branch' + schemes = ( + 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', + 'bzr+lp', + ) + + def __init__(self, url=None, *args, **kwargs): + super(Bazaar, self).__init__(url, *args, **kwargs) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment or non_hierarchical + # Register lp but do not expose as a scheme to support bzr+lp. + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(['lp']) + urllib_parse.non_hierarchical.extend(['lp']) + + def export(self, location): + """ + Export the Bazaar repository at the url to the destination location + """ + temp_dir = tempfile.mkdtemp('-export', 'pip-') + self.unpack(temp_dir) + if os.path.exists(location): + # Remove the location to make sure Bazaar can export it correctly + rmtree(location) + try: + self.run_command(['export', location], cwd=temp_dir, + show_stdout=False) + finally: + rmtree(temp_dir) + + def switch(self, dest, url, rev_options): + self.run_command(['switch', url], cwd=dest) + + def update(self, dest, rev_options): + self.run_command(['pull', '-q'] + rev_options, cwd=dest) + + def obtain(self, dest): + url, rev = self.get_url_rev() + if rev: + rev_options = ['-r', rev] + rev_display = ' (to revision %s)' % rev + else: + rev_options = [] + rev_display = '' + if self.check_destination(dest, url, rev_options, rev_display): + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(['branch', '-q'] + rev_options + [url, dest]) + + def get_url_rev(self): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev = super(Bazaar, self).get_url_rev() + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev + + def get_url(self, location): + urls = self.run_command(['info'], show_stdout=False, cwd=location) + for line in urls.splitlines(): + line = line.strip() + for x in ('checkout of branch: ', + 'parent branch: '): + if line.startswith(x): + repo = line.split(x)[1] + if self._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + def get_revision(self, location): + revision = self.run_command( + ['revno'], show_stdout=False, cwd=location) + return revision.splitlines()[-1] + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo: + return None + if not repo.lower().startswith('bzr:'): + repo = 'bzr+' + repo + egg_project_name = dist.egg_name().split('-', 1)[0] + current_rev = self.get_revision(location) + return '%s@%s#egg=%s' % (repo, current_rev, egg_project_name) + + def check_version(self, dest, rev_options): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/vendor/pip-9.0.3/pip/vcs/git.py b/vendor/pip-9.0.3/pip/vcs/git.py new file mode 100644 index 0000000000000000000000000000000000000000..2187dd84629b4cacc585ca019774764b81d30e4a --- /dev/null +++ b/vendor/pip-9.0.3/pip/vcs/git.py @@ -0,0 +1,300 @@ +from __future__ import absolute_import + +import logging +import tempfile +import os.path + +from pip.compat import samefile +from pip.exceptions import BadCommand +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request +from pip._vendor.packaging.version import parse as parse_version + +from pip.utils import display_path, rmtree +from pip.vcs import vcs, VersionControl + + +urlsplit = urllib_parse.urlsplit +urlunsplit = urllib_parse.urlunsplit + + +logger = logging.getLogger(__name__) + + +class Git(VersionControl): + name = 'git' + dirname = '.git' + repo_name = 'clone' + schemes = ( + 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', + ) + + def __init__(self, url=None, *args, **kwargs): + + # Works around an apparent Git bug + # (see http://article.gmane.org/gmane.comp.version-control.git/146500) + if url: + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith('file'): + initial_slashes = path[:-len(path.lstrip('/'))] + newpath = ( + initial_slashes + + urllib_request.url2pathname(path) + .replace('\\', '/').lstrip('/') + ) + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + super(Git, self).__init__(url, *args, **kwargs) + + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version'], show_stdout=False) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):] + else: + version = '' + # get first 3 positions of the git version becasue + # on windows it is x.y.z.windows.t, and this parses as + # LegacyVersion which always smaller than a Version. + version = '.'.join(version.split('.')[:3]) + return parse_version(version) + + def export(self, location): + """Export the Git repository at the url to the destination location""" + temp_dir = tempfile.mkdtemp('-export', 'pip-') + self.unpack(temp_dir) + try: + if not location.endswith('/'): + location = location + '/' + self.run_command( + ['checkout-index', '-a', '-f', '--prefix', location], + show_stdout=False, cwd=temp_dir) + finally: + rmtree(temp_dir) + + def check_rev_options(self, rev, dest, rev_options): + """Check the revision options before checkout to compensate that tags + and branches may need origin/ as a prefix. + Returns the SHA1 of the branch or tag if found. + """ + revisions = self.get_short_refs(dest) + + origin_rev = 'origin/%s' % rev + if origin_rev in revisions: + # remote branch + return [revisions[origin_rev]] + elif rev in revisions: + # a local tag or branch name + return [revisions[rev]] + else: + logger.warning( + "Could not find a tag or branch '%s', assuming commit.", rev, + ) + return rev_options + + def check_version(self, dest, rev_options): + """ + Compare the current sha to the ref. ref may be a branch or tag name, + but current rev will always point to a sha. This means that a branch + or tag will never compare as True. So this ultimately only matches + against exact shas. + """ + return self.get_revision(dest).startswith(rev_options[0]) + + def switch(self, dest, url, rev_options): + self.run_command(['config', 'remote.origin.url', url], cwd=dest) + self.run_command(['checkout', '-q'] + rev_options, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, rev_options): + # First fetch changes from the default remote + if self.get_git_version() >= parse_version('1.9.0'): + # fetch tags in addition to everything else + self.run_command(['fetch', '-q', '--tags'], cwd=dest) + else: + self.run_command(['fetch', '-q'], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + if rev_options: + rev_options = self.check_rev_options( + rev_options[0], dest, rev_options, + ) + self.run_command(['reset', '--hard', '-q'] + rev_options, cwd=dest) + #: update submodules + self.update_submodules(dest) + + def obtain(self, dest): + url, rev = self.get_url_rev() + if rev: + rev_options = [rev] + rev_display = ' (to %s)' % rev + else: + rev_options = ['origin/master'] + rev_display = '' + if self.check_destination(dest, url, rev_options, rev_display): + logger.info( + 'Cloning %s%s to %s', url, rev_display, display_path(dest), + ) + self.run_command(['clone', '-q', url, dest]) + + if rev: + rev_options = self.check_rev_options(rev, dest, rev_options) + # Only do a checkout if rev_options differs from HEAD + if not self.check_version(dest, rev_options): + self.run_command( + ['checkout', '-q'] + rev_options, + cwd=dest, + ) + #: repo may contain submodules + self.update_submodules(dest) + + def get_url(self, location): + """Return URL of the first remote encountered.""" + remotes = self.run_command( + ['config', '--get-regexp', 'remote\..*\.url'], + show_stdout=False, cwd=location) + remotes = remotes.splitlines() + found_remote = remotes[0] + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + def get_revision(self, location): + current_rev = self.run_command( + ['rev-parse', 'HEAD'], show_stdout=False, cwd=location) + return current_rev.strip() + + def get_full_refs(self, location): + """Yields tuples of (commit, ref) for branches and tags""" + output = self.run_command(['show-ref'], + show_stdout=False, cwd=location) + for line in output.strip().splitlines(): + commit, ref = line.split(' ', 1) + yield commit.strip(), ref.strip() + + def is_ref_remote(self, ref): + return ref.startswith('refs/remotes/') + + def is_ref_branch(self, ref): + return ref.startswith('refs/heads/') + + def is_ref_tag(self, ref): + return ref.startswith('refs/tags/') + + def is_ref_commit(self, ref): + """A ref is a commit sha if it is not anything else""" + return not any(( + self.is_ref_remote(ref), + self.is_ref_branch(ref), + self.is_ref_tag(ref), + )) + + # Should deprecate `get_refs` since it's ambiguous + def get_refs(self, location): + return self.get_short_refs(location) + + def get_short_refs(self, location): + """Return map of named refs (branches or tags) to commit hashes.""" + rv = {} + for commit, ref in self.get_full_refs(location): + ref_name = None + if self.is_ref_remote(ref): + ref_name = ref[len('refs/remotes/'):] + elif self.is_ref_branch(ref): + ref_name = ref[len('refs/heads/'):] + elif self.is_ref_tag(ref): + ref_name = ref[len('refs/tags/'):] + if ref_name is not None: + rv[ref_name] = commit + return rv + + def _get_subdirectory(self, location): + """Return the relative path of setup.py to the git repo root.""" + # find the repo root + git_dir = self.run_command(['rev-parse', '--git-dir'], + show_stdout=False, cwd=location).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + root_dir = os.path.join(git_dir, '..') + # find setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + # relative path of setup.py to repo root + if samefile(root_dir, location): + return None + return os.path.relpath(location, root_dir) + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo.lower().startswith('git:'): + repo = 'git+' + repo + egg_project_name = dist.egg_name().split('-', 1)[0] + if not repo: + return None + current_rev = self.get_revision(location) + req = '%s@%s#egg=%s' % (repo, current_rev, egg_project_name) + subdirectory = self._get_subdirectory(location) + if subdirectory: + req += '&subdirectory=' + subdirectory + return req + + def get_url_rev(self): + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes doesn't + work with a ssh:// scheme (e.g. Github). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + if '://' not in self.url: + assert 'file:' not in self.url + self.url = self.url.replace('git+', 'git+ssh://') + url, rev = super(Git, self).get_url_rev() + url = url.replace('ssh://', '') + else: + url, rev = super(Git, self).get_url_rev() + + return url, rev + + def update_submodules(self, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + self.run_command( + ['submodule', 'update', '--init', '--recursive', '-q'], + cwd=location, + ) + + @classmethod + def controls_location(cls, location): + if super(Git, cls).controls_location(location): + return True + try: + r = cls().run_command(['rev-parse'], + cwd=location, + show_stdout=False, + on_returncode='ignore') + return not r + except BadCommand: + logger.debug("could not determine if %s is under git control " + "because git is not available", location) + return False + + +vcs.register(Git) diff --git a/vendor/pip-9.0.3/pip/vcs/mercurial.py b/vendor/pip-9.0.3/pip/vcs/mercurial.py new file mode 100644 index 0000000000000000000000000000000000000000..1aa83b914523839c133adf1649a913e8e94b14ef --- /dev/null +++ b/vendor/pip-9.0.3/pip/vcs/mercurial.py @@ -0,0 +1,103 @@ +from __future__ import absolute_import + +import logging +import os +import tempfile + +from pip.utils import display_path, rmtree +from pip.vcs import vcs, VersionControl +from pip.download import path_to_url +from pip._vendor.six.moves import configparser + + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = 'hg' + dirname = '.hg' + repo_name = 'clone' + schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') + + def export(self, location): + """Export the Hg repository at the url to the destination location""" + temp_dir = tempfile.mkdtemp('-export', 'pip-') + self.unpack(temp_dir) + try: + self.run_command( + ['archive', location], show_stdout=False, cwd=temp_dir) + finally: + rmtree(temp_dir) + + def switch(self, dest, url, rev_options): + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = configparser.SafeConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url) + with open(repo_config, 'w') as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning( + 'Could not switch Mercurial repository to %s: %s', url, exc, + ) + else: + self.run_command(['update', '-q'] + rev_options, cwd=dest) + + def update(self, dest, rev_options): + self.run_command(['pull', '-q'], cwd=dest) + self.run_command(['update', '-q'] + rev_options, cwd=dest) + + def obtain(self, dest): + url, rev = self.get_url_rev() + if rev: + rev_options = [rev] + rev_display = ' (to revision %s)' % rev + else: + rev_options = [] + rev_display = '' + if self.check_destination(dest, url, rev_options, rev_display): + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(['clone', '--noupdate', '-q', url, dest]) + self.run_command(['update', '-q'] + rev_options, cwd=dest) + + def get_url(self, location): + url = self.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if self._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + def get_revision(self, location): + current_revision = self.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + def get_revision_hash(self, location): + current_rev_hash = self.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo.lower().startswith('hg:'): + repo = 'hg+' + repo + egg_project_name = dist.egg_name().split('-', 1)[0] + if not repo: + return None + current_rev_hash = self.get_revision_hash(location) + return '%s@%s#egg=%s' % (repo, current_rev_hash, egg_project_name) + + def check_version(self, dest, rev_options): + """Always assume the versions don't match""" + return False + +vcs.register(Mercurial) diff --git a/vendor/pip-9.0.3/pip/vcs/subversion.py b/vendor/pip-9.0.3/pip/vcs/subversion.py new file mode 100644 index 0000000000000000000000000000000000000000..4b2315667af539f0fc7dd87a3ce38699632f5d2a --- /dev/null +++ b/vendor/pip-9.0.3/pip/vcs/subversion.py @@ -0,0 +1,269 @@ +from __future__ import absolute_import + +import logging +import os +import re + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip.index import Link +from pip.utils import rmtree, display_path +from pip.utils.logging import indent_log +from pip.vcs import vcs, VersionControl + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile('committed-rev="(\d+)"') +_svn_url_re = re.compile(r'URL: (.+)') +_svn_revision_re = re.compile(r'Revision: (.+)') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') + + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + def get_info(self, location): + """Returns (url, revision), where both are strings""" + assert not location.rstrip('/').endswith(self.dirname), \ + 'Bad directory: %s' % location + output = self.run_command( + ['info', location], + show_stdout=False, + extra_environ={'LANG': 'C'}, + ) + match = _svn_url_re.search(output) + if not match: + logger.warning( + 'Cannot determine URL of svn checkout %s', + display_path(location), + ) + logger.debug('Output that cannot be parsed: \n%s', output) + return None, None + url = match.group(1).strip() + match = _svn_revision_re.search(output) + if not match: + logger.warning( + 'Cannot determine revision of svn checkout %s', + display_path(location), + ) + logger.debug('Output that cannot be parsed: \n%s', output) + return url, None + return url, match.group(1) + + def export(self, location): + """Export the svn repository at the url to the destination location""" + url, rev = self.get_url_rev() + rev_options = get_rev_options(url, rev) + url = self.remove_auth_from_url(url) + logger.info('Exporting svn repository %s to %s', url, location) + with indent_log(): + if os.path.exists(location): + # Subversion doesn't like to check out over an existing + # directory --force fixes this, but was only added in svn 1.5 + rmtree(location) + self.run_command( + ['export'] + rev_options + [url, location], + show_stdout=False) + + def switch(self, dest, url, rev_options): + self.run_command(['switch'] + rev_options + [url, dest]) + + def update(self, dest, rev_options): + self.run_command(['update'] + rev_options + [dest]) + + def obtain(self, dest): + url, rev = self.get_url_rev() + rev_options = get_rev_options(url, rev) + url = self.remove_auth_from_url(url) + if rev: + rev_display = ' (to revision %s)' % rev + else: + rev_display = '' + if self.check_destination(dest, url, rev_options, rev_display): + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(['checkout', '-q'] + rev_options + [url, dest]) + + def get_location(self, dist, dependency_links): + for url in dependency_links: + egg_fragment = Link(url).egg_fragment + if not egg_fragment: + continue + if '-' in egg_fragment: + # FIXME: will this work when a package has - in the name? + key = '-'.join(egg_fragment.split('-')[:-1]).lower() + else: + key = egg_fragment + if key == dist.key: + return url.split('#', 1)[0] + return None + + def get_revision(self, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, files in os.walk(location): + if self.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(self.dirname) + entries_fn = os.path.join(base, self.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = self._get_svn_url_rev(base) + + if base == location: + base_url = dirurl + '/' # save the root url + elif not dirurl or not dirurl.startswith(base_url): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return revision + + def get_url_rev(self): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev = super(Subversion, self).get_url_rev() + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev + + def get_url(self, location): + # In cases where the source is in a subdirectory, not alongside + # setup.py we have to look up in the location until we find a real + # setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + return self._get_svn_url_rev(location)[0] + + def _get_svn_url_rev(self, location): + from pip.exceptions import InstallationError + + entries_path = os.path.join(location, self.dirname, 'entries') + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = '' + + if (data.startswith('8') or + data.startswith('9') or + data.startswith('10')): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('<?xml'): + match = _svn_xml_url_re.search(data) + if not match: + raise ValueError('Badly formatted data: %r' % data) + url = match.group(1) # get repository URL + revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] + else: + try: + # subversion >= 1.7 + xml = self.run_command( + ['info', '--xml', location], + show_stdout=False, + ) + url = _svn_info_xml_url_re.search(xml).group(1) + revs = [ + int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) + ] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if repo is None: + return None + # FIXME: why not project name? + egg_project_name = dist.egg_name().split('-', 1)[0] + rev = self.get_revision(location) + return 'svn+%s@%s#egg=%s' % (repo, rev, egg_project_name) + + def check_version(self, dest, rev_options): + """Always assume the versions don't match""" + return False + + @staticmethod + def remove_auth_from_url(url): + # Return a copy of url with 'username:password@' removed. + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + + # parsed url + purl = urllib_parse.urlsplit(url) + stripped_netloc = \ + purl.netloc.split('@')[-1] + + # stripped url + url_pieces = ( + purl.scheme, stripped_netloc, purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl + + +def get_rev_options(url, rev): + if rev: + rev_options = ['-r', rev] + else: + rev_options = [] + + r = urllib_parse.urlsplit(url) + if hasattr(r, 'username'): + # >= Python-2.5 + username, password = r.username, r.password + else: + netloc = r[1] + if '@' in netloc: + auth = netloc.split('@')[0] + if ':' in auth: + username, password = auth.split(':', 1) + else: + username, password = auth, None + else: + username, password = None, None + + if username: + rev_options += ['--username', username] + if password: + rev_options += ['--password', password] + return rev_options + + +vcs.register(Subversion) diff --git a/vendor/pip-9.0.3/pip/wheel.py b/vendor/pip-9.0.3/pip/wheel.py new file mode 100644 index 0000000000000000000000000000000000000000..9ac9dffed6a13d59c439941552d06c537b3aff51 --- /dev/null +++ b/vendor/pip-9.0.3/pip/wheel.py @@ -0,0 +1,853 @@ +""" +Support for installing and building the "wheel" binary package format. +""" +from __future__ import absolute_import + +import compileall +import csv +import errno +import functools +import hashlib +import logging +import os +import os.path +import re +import shutil +import stat +import sys +import tempfile +import warnings + +from base64 import urlsafe_b64encode +from email.parser import Parser + +from pip._vendor.six import StringIO + +import pip +from pip.compat import expanduser +from pip.download import path_to_url, unpack_url +from pip.exceptions import ( + InstallationError, InvalidWheelFilename, UnsupportedWheel) +from pip.locations import distutils_scheme, PIP_DELETE_MARKER_FILENAME +from pip import pep425tags +from pip.utils import ( + call_subprocess, ensure_dir, captured_stdout, rmtree, read_chunks, +) +from pip.utils.ui import open_spinner +from pip.utils.logging import indent_log +from pip.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.six.moves import configparser + + +wheel_ext = '.whl' + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +class WheelCache(object): + """A cache of wheels for future installs.""" + + def __init__(self, cache_dir, format_control): + """Create a wheel cache. + + :param cache_dir: The root of the cache. + :param format_control: A pip.index.FormatControl object to limit + binaries being read from the cache. + """ + self._cache_dir = expanduser(cache_dir) if cache_dir else None + self._format_control = format_control + + def cached_wheel(self, link, package_name): + return cached_wheel( + self._cache_dir, link, self._format_control, package_name) + + +def _cache_for_link(cache_dir, link): + """ + Return a directory to store cached wheels in for link. + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were not + unique. E.g. ./package might have dozens of installs done for it and build + a version of 0.0...and if we built and cached a wheel, we'd end up using + the same wheel even if the source has been edited. + + :param cache_dir: The cache_dir being used by pip. + :param link: The link of the sdist for which this will cache wheels. + """ + + # We want to generate an url to use as our cache key, we don't want to just + # re-use the URL because it might have other items in the fragment and we + # don't care about those. + key_parts = [link.url_without_fragment] + if link.hash_name is not None and link.hash is not None: + key_parts.append("=".join([link.hash_name, link.hash])) + key_url = "#".join(key_parts) + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and thus + # less secure). However the differences don't make a lot of difference for + # our use case here. + hashed = hashlib.sha224(key_url.encode()).hexdigest() + + # We want to nest the directories some to prevent having a ton of top level + # directories where we might run out of sub directories on some FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + # Inside of the base location for cached wheels, expand our parts and join + # them all together. + return os.path.join(cache_dir, "wheels", *parts) + + +def cached_wheel(cache_dir, link, format_control, package_name): + if not cache_dir: + return link + if not link: + return link + if link.is_wheel: + return link + if not link.is_artifact: + return link + if not package_name: + return link + canonical_name = canonicalize_name(package_name) + formats = pip.index.fmt_ctl_formats(format_control, canonical_name) + if "binary" not in formats: + return link + root = _cache_for_link(cache_dir, link) + try: + wheel_names = os.listdir(root) + except OSError as e: + if e.errno in (errno.ENOENT, errno.ENOTDIR): + return link + raise + candidates = [] + for wheel_name in wheel_names: + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if not wheel.supported(): + # Built for a different python/arch/etc + continue + candidates.append((wheel.support_index_min(), wheel_name)) + if not candidates: + return link + candidates.sort() + path = os.path.join(root, candidates[0][1]) + return pip.index.Link(path_to_url(path)) + + +def rehash(path, algo='sha256', blocksize=1 << 20): + """Return (hash, length) for path using hashlib.new(algo)""" + h = hashlib.new(algo) + length = 0 + with open(path, 'rb') as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + digest = 'sha256=' + urlsafe_b64encode( + h.digest() + ).decode('latin1').rstrip('=') + return (digest, length) + + +def open_for_csv(name, mode): + if sys.version_info[0] < 3: + nl = {} + bin = 'b' + else: + nl = {'newline': ''} + bin = '' + return open(name, mode + bin, **nl) + + +def fix_script(path): + """Replace #!python with #!/path/to/python + Return True if file was changed.""" + # XXX RECORD hashes will need to be updated + if os.path.isfile(path): + with open(path, 'rb') as script: + firstline = script.readline() + if not firstline.startswith(b'#!python'): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b'#!' + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, 'wb') as script: + script.write(firstline) + script.write(rest) + return True + +dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?) + \.dist-info$""", re.VERBOSE) + + +def root_is_purelib(name, wheeldir): + """ + Return True if the extracted wheel in wheeldir should go into purelib. + """ + name_folded = name.replace("-", "_") + for item in os.listdir(wheeldir): + match = dist_info_re.match(item) + if match and match.group('name') == name_folded: + with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: + for line in wheel: + line = line.lower().rstrip() + if line == "root-is-purelib: true": + return True + return False + + +def get_entrypoints(filename): + if not os.path.exists(filename): + return {}, {} + + # This is done because you can pass a string to entry_points wrappers which + # means that they may or may not be valid INI files. The attempt here is to + # strip leading and trailing whitespace in order to make them valid INI + # files. + with open(filename) as fp: + data = StringIO() + for line in fp: + data.write(line.strip()) + data.write("\n") + data.seek(0) + + cp = configparser.RawConfigParser() + cp.optionxform = lambda option: option + cp.readfp(data) + + console = {} + gui = {} + if cp.has_section('console_scripts'): + console = dict(cp.items('console_scripts')) + if cp.has_section('gui_scripts'): + gui = dict(cp.items('gui_scripts')) + return console, gui + + +def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, + pycompile=True, scheme=None, isolated=False, prefix=None): + """Install a wheel""" + + if not scheme: + scheme = distutils_scheme( + name, user=user, home=home, root=root, isolated=isolated, + prefix=prefix, + ) + + if root_is_purelib(name, wheeldir): + lib_dir = scheme['purelib'] + else: + lib_dir = scheme['platlib'] + + info_dir = [] + data_dirs = [] + source = wheeldir.rstrip(os.path.sep) + os.path.sep + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed = {} + changed = set() + generated = [] + + # Compile all of the pyc files that we're going to be installing + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + compileall.compile_dir(source, force=True, quiet=True) + logger.debug(stdout.getvalue()) + + def normpath(src, p): + return os.path.relpath(src, p).replace(os.path.sep, '/') + + def record_installed(srcfile, destfile, modified=False): + """Map archive RECORD paths to installation RECORD paths.""" + oldpath = normpath(srcfile, wheeldir) + newpath = normpath(destfile, lib_dir) + installed[oldpath] = newpath + if modified: + changed.add(destfile) + + def clobber(source, dest, is_base, fixer=None, filter=None): + ensure_dir(dest) # common for the 'include' path + + for dir, subdirs, files in os.walk(source): + basedir = dir[len(source):].lstrip(os.path.sep) + destdir = os.path.join(dest, basedir) + if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): + continue + for s in subdirs: + destsubdir = os.path.join(dest, basedir, s) + if is_base and basedir == '' and destsubdir.endswith('.data'): + data_dirs.append(s) + continue + elif (is_base and + s.endswith('.dist-info') and + canonicalize_name(s).startswith( + canonicalize_name(req.name))): + assert not info_dir, ('Multiple .dist-info directories: ' + + destsubdir + ', ' + + ', '.join(info_dir)) + info_dir.append(destsubdir) + for f in files: + # Skip unwanted files + if filter and filter(f): + continue + srcfile = os.path.join(dir, f) + destfile = os.path.join(dest, basedir, f) + # directory creation is lazy and after the file filtering above + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + ensure_dir(destdir) + + # We use copyfile (not move, copy, or copy2) to be extra sure + # that we are not moving directories over (copyfile fails for + # directories) as well as to ensure that we are not copying + # over any metadata because we want more control over what + # metadata we actually copy over. + shutil.copyfile(srcfile, destfile) + + # Copy over the metadata for the file, currently this only + # includes the atime and mtime. + st = os.stat(srcfile) + if hasattr(os, "utime"): + os.utime(destfile, (st.st_atime, st.st_mtime)) + + # If our file is executable, then make our destination file + # executable. + if os.access(srcfile, os.X_OK): + st = os.stat(srcfile) + permissions = ( + st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + ) + os.chmod(destfile, permissions) + + changed = False + if fixer: + changed = fixer(destfile) + record_installed(srcfile, destfile, changed) + + clobber(source, lib_dir, True) + + assert info_dir, "%s .dist-info directory not found" % req + + # Get the defined entry points + ep_file = os.path.join(info_dir[0], 'entry_points.txt') + console, gui = get_entrypoints(ep_file) + + def is_entrypoint_wrapper(name): + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + if name.lower().endswith('.exe'): + matchname = name[:-4] + elif name.lower().endswith('-script.py'): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return (matchname in console or matchname in gui) + + for datadir in data_dirs: + fixer = None + filter = None + for subdir in os.listdir(os.path.join(wheeldir, datadir)): + fixer = None + if subdir == 'scripts': + fixer = fix_script + filter = is_entrypoint_wrapper + source = os.path.join(wheeldir, datadir, subdir) + dest = scheme[subdir] + clobber(source, dest, False, fixer=fixer, filter=filter) + + maker = ScriptMaker(None, scheme['scripts']) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = set(('', )) + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + # Simplify the script and fix the fact that the default script swallows + # every single stack trace. + # See https://bitbucket.org/pypa/distlib/issue/34/ + # See https://bitbucket.org/pypa/distlib/issue/33/ + def _get_script_text(entry): + if entry.suffix is None: + raise InstallationError( + "Invalid script entry point: %s for req: %s - A callable " + "suffix is required. Cf https://packaging.python.org/en/" + "latest/distributing.html#console-scripts for more " + "information." % (entry, req) + ) + return maker.script_template % { + "module": entry.prefix, + "import_name": entry.suffix.split(".")[0], + "func": entry.suffix, + } + + maker._get_script_text = _get_script_text + maker.script_template = """# -*- coding: utf-8 -*- +import re +import sys + +from %(module)s import %(import_name)s + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +""" + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop('pip', None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'pip = ' + pip_script + generated.extend(maker.make(spec)) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + spec = 'pip%s = %s' % (sys.version[:1], pip_script) + generated.extend(maker.make(spec)) + + spec = 'pip%s = %s' % (sys.version[:3], pip_script) + generated.extend(maker.make(spec)) + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop('easy_install', None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'easy_install = ' + easy_install_script + generated.extend(maker.make(spec)) + + spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script) + generated.extend(maker.make(spec)) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console and GUI entry points specified in the wheel + if len(console) > 0: + generated.extend( + maker.make_multiple(['%s = %s' % kv for kv in console.items()]) + ) + if len(gui) > 0: + generated.extend( + maker.make_multiple( + ['%s = %s' % kv for kv in gui.items()], + {'gui': True} + ) + ) + + # Record pip as the installer + installer = os.path.join(info_dir[0], 'INSTALLER') + temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip') + with open(temp_installer, 'wb') as installer_file: + installer_file.write(b'pip\n') + shutil.move(temp_installer, installer) + generated.append(installer) + + # Record details of all files installed + record = os.path.join(info_dir[0], 'RECORD') + temp_record = os.path.join(info_dir[0], 'RECORD.pip') + with open_for_csv(record, 'r') as record_in: + with open_for_csv(temp_record, 'w+') as record_out: + reader = csv.reader(record_in) + writer = csv.writer(record_out) + for row in reader: + row[0] = installed.pop(row[0], row[0]) + if row[0] in changed: + row[1], row[2] = rehash(row[0]) + writer.writerow(row) + for f in generated: + h, l = rehash(f) + writer.writerow((normpath(f, lib_dir), h, l)) + for f in installed: + writer.writerow((installed[f], '', '')) + shutil.move(temp_record, record) + + +def _unique(fn): + @functools.wraps(fn) + def unique(*args, **kw): + seen = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +# TODO: this goes somewhere besides the wheel module +@_unique +def uninstallation_paths(dist): + """ + Yield all the uninstallation paths for dist based on RECORD-without-.pyc + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .pyc. + """ + from pip.utils import FakeFile # circular import + r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) + for row in r: + path = os.path.join(dist.location, row[0]) + yield path + if path.endswith('.py'): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + '.pyc') + yield path + + +def wheel_version(source_dir): + """ + Return the Wheel-Version of an extracted wheel, if possible. + + Otherwise, return False if we couldn't parse / extract it. + """ + try: + dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] + + wheel_data = dist.get_metadata('WHEEL') + wheel_data = Parser().parsestr(wheel_data) + + version = wheel_data['Wheel-Version'].strip() + version = tuple(map(int, version.split('.'))) + return version + except: + return False + + +def check_compatibility(version, name): + """ + Raises errors or warns if called with an incompatible Wheel-Version. + + Pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if not version: + raise UnsupportedWheel( + "%s is in an unsupported or invalid wheel" % name + ) + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "%s's Wheel-Version (%s) is not compatible with this version " + "of pip" % (name, '.'.join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + 'Installing from a newer Wheel-Version (%s)', + '.'.join(map(str, version)), + ) + + +class Wheel(object): + """A wheel file""" + + # TODO: maybe move the install code into this class + + wheel_file_re = re.compile( + r"""^(?P<namever>(?P<name>.+?)-(?P<ver>\d.*?)) + ((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) + \.whl|\.dist-info)$""", + re.VERBOSE + ) + + def __init__(self, filename): + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename( + "%s is not a valid wheel filename." % filename + ) + self.filename = filename + self.name = wheel_info.group('name').replace('_', '-') + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group('ver').replace('_', '-') + self.pyversions = wheel_info.group('pyver').split('.') + self.abis = wheel_info.group('abi').split('.') + self.plats = wheel_info.group('plat').split('.') + + # All the tag combinations from this file + self.file_tags = set( + (x, y, z) for x in self.pyversions + for y in self.abis for z in self.plats + ) + + def support_index_min(self, tags=None): + """ + Return the lowest index that one of the wheel's file_tag combinations + achieves in the supported_tags list e.g. if there are 8 supported tags, + and one of the file tags is first in the list, then return 0. Returns + None is the wheel is not supported. + """ + if tags is None: # for mock + tags = pep425tags.supported_tags + indexes = [tags.index(c) for c in self.file_tags if c in tags] + return min(indexes) if indexes else None + + def supported(self, tags=None): + """Is this wheel supported on this system?""" + if tags is None: # for mock + tags = pep425tags.supported_tags + return bool(set(tags).intersection(self.file_tags)) + + +class WheelBuilder(object): + """Build wheels from a RequirementSet.""" + + def __init__(self, requirement_set, finder, build_options=None, + global_options=None): + self.requirement_set = requirement_set + self.finder = finder + self._cache_root = requirement_set._wheel_cache._cache_dir + self._wheel_dir = requirement_set.wheel_download_dir + self.build_options = build_options or [] + self.global_options = global_options or [] + + def _build_one(self, req, output_dir, python_tag=None): + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + tempd = tempfile.mkdtemp('pip-wheel-') + try: + if self.__build_one(req, tempd, python_tag=python_tag): + try: + wheel_name = os.listdir(tempd)[0] + wheel_path = os.path.join(output_dir, wheel_name) + shutil.move(os.path.join(tempd, wheel_name), wheel_path) + logger.info('Stored in directory: %s', output_dir) + return wheel_path + except: + pass + # Ignore return, we can't do anything else useful. + self._clean_one(req) + return None + finally: + rmtree(tempd) + + def _base_setup_args(self, req): + return [ + sys.executable, "-u", '-c', + SETUPTOOLS_SHIM % req.setup_py + ] + list(self.global_options) + + def __build_one(self, req, tempd, python_tag=None): + base_args = self._base_setup_args(req) + + spin_message = 'Running setup.py bdist_wheel for %s' % (req.name,) + with open_spinner(spin_message) as spinner: + logger.debug('Destination directory: %s', tempd) + wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ + + self.build_options + + if python_tag is not None: + wheel_args += ["--python-tag", python_tag] + + try: + call_subprocess(wheel_args, cwd=req.setup_py_dir, + show_stdout=False, spinner=spinner) + return True + except: + spinner.finish("error") + logger.error('Failed building wheel for %s', req.name) + return False + + def _clean_one(self, req): + base_args = self._base_setup_args(req) + + logger.info('Running setup.py clean for %s', req.name) + clean_args = base_args + ['clean', '--all'] + try: + call_subprocess(clean_args, cwd=req.source_dir, show_stdout=False) + return True + except: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + def build(self, autobuilding=False): + """Build wheels. + + :param unpack: If True, replace the sdist we built from with the + newly built wheel, in preparation for installation. + :return: True if all the wheels built correctly. + """ + assert self._wheel_dir or (autobuilding and self._cache_root) + # unpack sdists and constructs req set + self.requirement_set.prepare_files(self.finder) + + reqset = self.requirement_set.requirements.values() + + buildset = [] + for req in reqset: + if req.constraint: + continue + if req.is_wheel: + if not autobuilding: + logger.info( + 'Skipping %s, due to already being wheel.', req.name) + elif autobuilding and req.editable: + pass + elif autobuilding and req.link and not req.link.is_artifact: + pass + elif autobuilding and not req.source_dir: + pass + else: + if autobuilding: + link = req.link + base, ext = link.splitext() + if pip.index.egg_info_matches(base, None, link) is None: + # Doesn't look like a package - don't autobuild a wheel + # because we'll have no way to lookup the result sanely + continue + if "binary" not in pip.index.fmt_ctl_formats( + self.finder.format_control, + canonicalize_name(req.name)): + logger.info( + "Skipping bdist_wheel for %s, due to binaries " + "being disabled for it.", req.name) + continue + buildset.append(req) + + if not buildset: + return True + + # Build the wheels. + logger.info( + 'Building wheels for collected packages: %s', + ', '.join([req.name for req in buildset]), + ) + with indent_log(): + build_success, build_failure = [], [] + for req in buildset: + python_tag = None + if autobuilding: + python_tag = pep425tags.implementation_tag + output_dir = _cache_for_link(self._cache_root, req.link) + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning("Building wheel for %s failed: %s", + req.name, e) + build_failure.append(req) + continue + else: + output_dir = self._wheel_dir + wheel_file = self._build_one( + req, output_dir, + python_tag=python_tag, + ) + if wheel_file: + build_success.append(req) + if autobuilding: + # XXX: This is mildly duplicative with prepare_files, + # but not close enough to pull out to a single common + # method. + # The code below assumes temporary source dirs - + # prevent it doing bad things. + if req.source_dir and not os.path.exists(os.path.join( + req.source_dir, PIP_DELETE_MARKER_FILENAME)): + raise AssertionError( + "bad source dir - missing marker") + # Delete the source we built the wheel from + req.remove_temporary_source() + # set the build directory again - name is known from + # the work prepare_files did. + req.source_dir = req.build_location( + self.requirement_set.build_dir) + # Update the link for this. + req.link = pip.index.Link( + path_to_url(wheel_file)) + assert req.link.is_wheel + # extract the wheel into the dir + unpack_url( + req.link, req.source_dir, None, False, + session=self.requirement_set.session) + else: + build_failure.append(req) + + # notify success/failure + if build_success: + logger.info( + 'Successfully built %s', + ' '.join([req.name for req in build_success]), + ) + if build_failure: + logger.info( + 'Failed to build %s', + ' '.join([req.name for req in build_failure]), + ) + # Return True if all builds were successful + return len(build_failure) == 0 diff --git a/vendor/pip-9.0.3/setup.cfg b/vendor/pip-9.0.3/setup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..d9f3c26b6074f8fc64035541cf535cfc659e1ff1 --- /dev/null +++ b/vendor/pip-9.0.3/setup.cfg @@ -0,0 +1,10 @@ +[pytest] +addopts = --ignore pip/_vendor --ignore tests/tests_cache + +[bdist_wheel] +universal = 1 + +[egg_info] +tag_build = +tag_date = 0 + diff --git a/vendor/pip-9.0.3/setup.py b/vendor/pip-9.0.3/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..6de49987ec9b77b479300f27e3f7cf0968fff8a5 --- /dev/null +++ b/vendor/pip-9.0.3/setup.py @@ -0,0 +1,93 @@ +import codecs +import os +import re +import sys + +from setuptools import setup, find_packages +from setuptools.command.test import test as TestCommand + + +here = os.path.abspath(os.path.dirname(__file__)) + + +class PyTest(TestCommand): + + def finalize_options(self): + TestCommand.finalize_options(self) + + self.test_args = [] + self.test_suite = True + + def run_tests(self): + # import here, cause outside the eggs aren't loaded + import pytest + + sys.exit(pytest.main(self.test_args)) + + +def read(*parts): + # intentionally *not* adding an encoding option to open, See: + # https://github.com/pypa/virtualenv/issues/201#issuecomment-3145690 + return codecs.open(os.path.join(here, *parts), 'r').read() + + +def find_version(*file_paths): + version_file = read(*file_paths) + version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", + version_file, re.M) + if version_match: + return version_match.group(1) + raise RuntimeError("Unable to find version string.") + +long_description = read('README.rst') + +tests_require = ['pytest', 'virtualenv>=1.10', 'scripttest>=1.3', 'mock', + 'pretend'] + + +setup( + name="pip", + version=find_version("pip", "__init__.py"), + description="The PyPA recommended tool for installing Python packages.", + long_description=long_description, + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Topic :: Software Development :: Build Tools", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.6", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: Implementation :: PyPy" + ], + keywords='easy_install distutils setuptools egg virtualenv', + author='The pip developers', + author_email='python-virtualenv@groups.google.com', + url='https://pip.pypa.io/', + license='MIT', + packages=find_packages(exclude=["contrib", "docs", "tests*", "tasks"]), + package_data={ + "pip._vendor.certifi": ["*.pem"], + "pip._vendor.requests": ["*.pem"], + "pip._vendor.distlib._backport": ["sysconfig.cfg"], + "pip._vendor.distlib": ["t32.exe", "t64.exe", "w32.exe", "w64.exe"], + }, + entry_points={ + "console_scripts": [ + "pip=pip:main", + "pip%s=pip:main" % sys.version[:1], + "pip%s=pip:main" % sys.version[:3], + ], + }, + tests_require=tests_require, + zip_safe=False, + python_requires='>=2.6,!=3.0.*,!=3.1.*,!=3.2.*', + extras_require={ + 'testing': tests_require, + }, + cmdclass={'test': PyTest}, +)