Flask-WTF-0.6/000755 000765 000024 00000000000 11732233667 014013 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/docs/000755 000765 000024 00000000000 11732233667 014743 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/Flask_WTF.egg-info/000755 000765 000024 00000000000 11732233667 017265 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/flaskext/000755 000765 000024 00000000000 11732233667 015634 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/LICENSE000644 000765 000024 00000002654 11727243563 015027 0ustar00dplepagestaff000000 000000 Copyright (c) 2010 by Dan Jacob. Some rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Flask-WTF-0.6/MANIFEST.in000644 000765 000024 00000000344 11727243563 015552 0ustar00dplepagestaff000000 000000 include LICENSE recursive-include tests * recursive-exclude tests *.pyc recursive-exclude tests *.pyc recursive-include docs * recursive-exclude docs *.pyc recursive-exclude docs *.pyo prune docs/_build prune docs/_themes/.git Flask-WTF-0.6/PKG-INFO000644 000765 000024 00000002036 11732233667 015111 0ustar00dplepagestaff000000 000000 Metadata-Version: 1.0 Name: Flask-WTF Version: 0.6 Summary: Simple integration of Flask and WTForms Home-page: http://github.com/rduplain/flask-wtf Author: Ron DuPlain Author-email: ron.duplain@gmail.com License: BSD Description: Flask-WTF --------- Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration. Links ````` * `documentation `_ * `development version `_ Platform: any Classifier: Development Status :: 4 - Beta Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Classifier: Topic :: Software Development :: Libraries :: Python Modules Flask-WTF-0.6/README000644 000765 000024 00000000310 11727243563 014665 0ustar00dplepagestaff000000 000000 Flask-WTF Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration. For more information please refer to the online docs: http://packages.python.org/Flask-WTF Flask-WTF-0.6/setup.cfg000644 000765 000024 00000000073 11732233667 015634 0ustar00dplepagestaff000000 000000 [egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 Flask-WTF-0.6/._setup.py000644 000765 000024 00000000273 11732233610 015730 0ustar00dplepagestaff000000 000000 Mac OS X  2ATTR##com.macromates.caret{ column = 16; line = 21; }Flask-WTF-0.6/setup.py000644 000765 000024 00000002665 11732233610 015522 0ustar00dplepagestaff000000 000000 """ Flask-WTF --------- Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration. Links ````` * `documentation `_ * `development version `_ """ from setuptools import setup setup( name='Flask-WTF', version='0.6', url='http://github.com/rduplain/flask-wtf', license='BSD', author='Dan Jacob', author_email='danjac354@gmail.com', maintainer='Ron DuPlain', maintainer_email='ron.duplain@gmail.com', description='Simple integration of Flask and WTForms', long_description=__doc__, packages=['flaskext', 'flaskext.wtf', 'flaskext.wtf.recaptcha'], namespace_packages=['flaskext'], test_suite='nose.collector', zip_safe=False, platforms='any', install_requires=[ 'Flask', 'WTForms>=1.0' ], tests_require=[ 'nose', 'Flask-Testing', 'Flask-Uploads', ], classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Web Environment', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', 'Topic :: Software Development :: Libraries :: Python Modules' ] ) Flask-WTF-0.6/tests/000755 000765 000024 00000000000 11732233667 015155 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/tests/.___init__.py000644 000765 000024 00000000273 11727272447 017510 0ustar00dplepagestaff000000 000000 Mac OS X  2ATTR##com.macromates.caret{ column = 0; line = 241; }Flask-WTF-0.6/tests/__init__.py000644 000765 000024 00000000253 11727272447 017271 0ustar00dplepagestaff000000 000000 # This tests whether __all__ namespace of WTForms is available. # Fails as AttributeError immediately if an import is missing in flaskext.wtf. from flaskext.wtf import * Flask-WTF-0.6/tests/base.py000644 000765 000024 00000004713 11727470242 016442 0ustar00dplepagestaff000000 000000 from __future__ import with_statement from flask import Flask, render_template, jsonify from flaskext.testing import TestCase as _TestCase from flaskext.wtf import Form, TextField, HiddenField, SubmitField, Required class MyForm(Form): SECRET_KEY = "a poorly kept secret." name = TextField("Name", validators=[Required()]) submit = SubmitField("Submit") class HiddenFieldsForm(Form): SECRET_KEY = "a poorly kept secret." name = HiddenField() url = HiddenField() method = HiddenField() secret = HiddenField() submit = SubmitField("Submit") def __init__(self, *args, **kwargs): super(HiddenFieldsForm, self).__init__(*args, **kwargs) self.method.name = '_method' class SimpleForm(Form): SECRET_KEY = "a poorly kept secret." pass class TestCase(_TestCase): def create_app(self): app = Flask(__name__) app.secret_key = "secret" @app.route("/", methods=("GET", "POST")) def index(): form = MyForm() if form.validate_on_submit(): name = form.name.data.upper() else: name = '' return render_template("index.html", form=form, name=name) @app.route("/simple/", methods=("POST",)) def simple(): form = SimpleForm() form.validate() assert form.csrf_enabled assert not form.validate() return "OK" @app.route("/two_forms/", methods=("POST",)) def two_forms(): form = SimpleForm() assert form.csrf_enabled assert form.validate() assert form.validate() form2 = SimpleForm() assert form2.csrf_enabled assert form2.validate() return "OK" @app.route("/hidden/") def hidden(): form = HiddenFieldsForm() return render_template("hidden.html", form=form) @app.route("/ajax/", methods=("POST",)) def ajax_submit(): form = MyForm() if form.validate_on_submit(): return jsonify(name=form.name.data, success=True, errors=None) return jsonify(name=None, errors=form.errors, success=False) return app Flask-WTF-0.6/tests/flask.png000644 000765 000024 00000640760 11727243563 017000 0ustar00dplepagestaff000000 000000 PNG  IHDR sBIT|d pHYsZEZEp+tEXtSoftwarewww.inkscape.org< IDATxyw]==/Y$l  &y@" >"DP@EPQA0l 5 d*dg&=Usg&z% ?UmH X,w; `B0p`! X,w; `B0p`! X,w; `B0p`! X,w; `B0p`! X{vIr$ۦWo>wT'BuXzUUI~#Iޗ/= QU]3/&ytHb'y}wvNÜUIL$G$2?vG@bsSU'yr\eIjwBgu;fj0cU%/'y^}!&\Ӧ陜k'Os;c f0CUu$x%ySc?L$W\sד:3p3Ƈ0ɋ<-{$wOr5<Ŀ&9;jk&cvaNH>y6UU_ggҶu},`g a7TIޚk|<-K{.M$7]_Mrⶌ*qyI/=ICIny*ISU?9*8'UՋNr~ VKr*o;=ɭ9$@wXzlWuz%dWy;; -`+%yn[W^2]%^3|[CT풼)uwfBU]9I+I.:ɉI^ݽmNy[ ajk&Vxz;y'9rzr)svc|fo%v׷|/˖$7H$Mr=e| RT<-#ubc3 2p% ?%f$9tm;pV~4xv\azd k8i67NrX&ɻ=~mINI~#lCq'!! V^WWgvwkgũfhtl$Uu$Or$ +ɱyI<ǧyU_6r`QgNX^m+SUWccIޗYٸ=ILr$YUﮪͫo:sۓ2B0p$gsMг>=:]Uݨ(I^wJrRUn &IduzGW#` a$oZoIS۳/ZUuxUs&=)Ɂrje GU6^TUp1:YyrS`Tͫ|$99kT?ɡSêt|f~T&lSUu$MruzڭI^fd=S돎`zwv?Ss;KSU&DerzLgsnId9۫$rJU IO}w5o$_Nr9歧'JM%UUWK[I~1ɞs.Jr`ۣ&yR&̶>Nq`'*u9IOXUlzYیXFUu`U(rƏۓğ>:ع$LrLwܞ$׫ی`yڼ2ɩ+-qΥh?:SUm_J$OMKwU=::ޘI5g;:ekd+3U}_I久X/Uu$+ٙ$9bt#UutO'yU;|lҪ:*I$ͭj}VUת7%l/>`tTߒ&GF a<>E+Jڪ[<6ɷնTUUճG=G2INNr=*Uu,'w IOߚ䯪ꗒ|=6_%yzX$$ Y ۟Ž|tv߳|pwW&yO&}˼0kUuhU?_&pLU$Hr=3t,'wM}a'9g!G|'蚣Y+Uk| mG̀;ڳ$3r2p'9f1I}|9:fc|6ɣآ1p9$X&pμ0;HwY?PUw]_ګͪRUoHoIn{wtlD5L I.78iF awؖ#TՑI>9Yޡ`#|([28gQ8! aκ$UU׭亣{(UI)ɭF,'0;>6ɍ*IYGTw39= .EUݲޖI8gA0;Vw?6||t*7:WUWo&95o&{p"1pV՛|$ɽF,mXNκ?:ɋG Ij:&a&9hp"2pKkUk2yOR6'0; tS/wF;CUU$'-sF+U%ll0; oMI>:QOrrHrI;KXU$OOPǵs;C?ɛGaXUu$J7In<8g#2p`TMϒYI.78i30p`=F}AU=4ɹIݳ`s;%yn&x)I>8g36:d /G%98?|/T}6:,a/Dφ;ZU$9dpfw2:ޖI4GG9đUoI>Y2p`S+Ws1n7w0pL$ncFUվU+I>$wT-390I0hilr2pNpXU1:gzsW' ooG<2^ 5:^SU mw3آpXlU=>)I!m$'0;,f?q WM, kMrRޜRU[ꈪzC%$7FUUut&d%eePU7&9=?%yh}Vwctkbr Irzpw+%yB% X`UuLLsصmXNNpᝣv$`}U^UuߪLNY/ wuW'9#Kbܾ8!F!I.3Sm<8c,:<#<$^G؈ 6 FܯޗIgn`I~az]opa|s#ppg;l =:`n?^UUN$'N?~ϙw@U2;?ߝ]g%9mz}1W{#&Uu$ ҷ=ɓ+ɖË6XIn29mUuJ|+9I:g{evyv^U})G?1X7UWdFc2م<1ɍ0{ Q"WU'%v$&yCw9:`궙m48sQw;'yB\vp~aUI.zQU=ɳMnI9$%9wzKI8N VU{'yH_ 60UUI䵄{&E'0;,&st+g$zz6:$Mr${h~v?b}\fzݏ/d$${~}LIΜ~ᯝ#SUWK$\ uW7/w(X\UcINlgN aTվ~uINL$K>oP Iv8d3bw_gtCUId/vkGG||qFBw?{t[&$kgv|E }5c]|^In3U$ZdꡙKF.LT1G0 LNq~tیnYN߹+I$g_0"e{g4^~ls`g~<ے2 XzF۹ y ;,:(qIZ$mIϹn7:`'::Mc֡FMUߓ\qt Ý3:乣;X8Np`wXUG&'`O$t{$wsܤ.g+GwNTՏ%9>L8Udt ! aq$Lrdwc_$yWIΜ^Or$WNrQ358:`;w{\GlUgMr-, wV뷓<:mtJ$S?_પ{&wW.L$d|>qz蕓\eVIJru)EF;0o';+VUJ,,'0; TU{$yuGNvV+ywI^}Jn>YI$HSgjp,-$,wVcC0? Uo7'uxw'eU6e2dںϻ#dl}$JzB&<ǝ#' $9ltKINI<'#X8Gж`9UuP~'f>jzGI3>IwGlg$`)4MU+ ;+RUWLrYU]-?'-I>/ۓY?78:`W9;fJ]{t !eRUIrBoܞ$>q{U]'ɿg$g؎A}Fq,mXNN >evにULN>䦣[XXNp`0RU{'yA'nY 7Jã#.QU'% IDATGFl_N$B6s;Cx{abŽ//Rq tw7 s`Cyq;g0#Uut&_Xο؅N, <:bnq8SI8mtvSU]ޘ5IBz<$WF}0:etkvCUc `GNFGJww'9t ډ6waax\O`0;AUm'$?>WV#ɽ5M}{[G&X>'mzt e;RU]%;.M3p`wXګ0I8 k_Hr$9lgN9'%yT1p`&}$wK$ NbmXNp)INH-l8X_I; K6>6ɭ||t C0S_&y~3' Uu$dkkݟ;&9"o8}t2$9 X7}bw?.U<: v3r;CvꦙFy-lJOU!d'Uwڙ}dž1o`t9;,',f! a~&&6%yU2:`w%EOI,.'O>I~*ɛ\88s;Cu~TNblr2p$Uu$oMaINU߇ o:tK&<4)X< ZI냓wBwݯ;&9$$9spwnr'y}=FNHY~C<+0ۡ J$Oٸ>݇q$OX|GG|RG&3m|4w`m$_[`j'9<_$9pkw5~$ĥ6:dLҪ_J$[GI$'WX>6ɍ<&W'0ƗFr~Dk$$g Nbu _$MrvG YJUuh%-'yM/VoTՁf/WgWƋ}&^Ir$Vl(InaI>78tSUf6{nj'zQU]}t,tw%^X&`$?9\:'t~c&?<3~lr2pg GGKNL&9XU]In\88s&ݧv;ɩ{)w67!8A Y*Uu$O.$I-b$J$ߨTC]k6= 7#{+M4߉;^w$ݳ e$5:]zEw_wLr$ω/~I䍙ZUPUXXÓ<-0~~og2t?~p4ϓ-Sٶ,MV,:4GwK'ZwyɿPUI[a_c}6dr{8`U:I^䮣[X(7?鵳L׎~|i}}[3y??${wEC:2K\gt >ztZUj }֝;K䙣;إtVUuLNr8GȏJ$KWUG'I.7$'r&~3W{iO/9|_d$glwFG0UO?H-KU0Uu$oCӏuFG| YU$.ڛ*Id~$:lؖINJǓCvnmI;A&|$֪fe39͞}$H%'0/Uu$Or%qPwgtg>I^UU_{$O&+.oےF?ŪVO$9e3INm:ݟ$nR'yw9Jw_{k&\uU\1X_:)&%gԺ̪WO=K a2T`Ng2ztqL/qzmܪ\&c߻ME&yMa>Iac:>ϫ=\9;_5߀KX}rU:Ԏݳd =NGlr a2y.LO#;~~"?f|>In:.O{twk!uyI^U7$yzv7M|yzPUVߡIn ܗTwIݳD륻UU$yMlSZ3ˢ$hnaOTUWMrL?dx%$OrxSanYFS$o|dQUՕ2ǃFm~8UUI^WF,멪y81pgTݓct;~z?iU]&=3+Aݰɝ=lTUu$[_NKrXv'9: lNuFG0^U~_ݱU㓬ˡKfϖ_ݿI+SIάO!Vߓ6I>7lD}ZwoSY6LFw,G$/ݱ mrr;K^ ;_o7:⇪ƙ}#88g3ۖ-}`KIn5$ɩInY<0Som;.⨪%9jt&vLwdtPU{$$wݲ獎`F&:89/eg,0DA$ k"5" ʲ O1`X5Q$QD A$(A$ 8&tuݧ9}꩷4UUw7cw+y$IMhE:ɾCHPUvv6Y ̏ Z8xZ,cj:I$I&RUmجu1x$Ia^R Oz'.nGYxtJr}/$y,Dz%* |Y˪sUuƙ$IҐJr9"m@$%y7p_zE&)ܮeO8u1 gI$IDM_[g[$M& hI:2ԷJrB-Mtu19Us@$i$9xpm,$! ZI|qQpUN;#Y$I$Ij-Y{Z$5a]/)s6VUC)7qZU~@$i$9rB\JrM;|ʕhx%#9ƐwI$Iz8u1`]ЗH9t{kb*ܘA[xpvU=uI4\ |u ?mwT7Z3 Z$I$i$J$IMXpz \:n3Rӻ\d'LMcjA$Iy?plVҳ ?8Ұன u1wI$I^J4,K@ZmYU1]I~ lqIhUL$M'<׮i@j-5I^<8u!re~Iw'uÂ$I$IK{'ps#*H&@om@)խCD -[gou[$I!ɥXkܥ$OneH8]SsH$I4L\|uuI.͏Zm^^U1InvsCHCH\sLpK+3Sl@#=C8/$I$i!hc-n@4,KK;u-a[ZXgU=$W,̅ʟm$V.kBdKy4wMK?mc-j@$I!#Ȯ$KNo@zP˪wUUeMc3sqR=!(B$ͭ$)@Á`.ஙOJ$I%-9Fh$IXpZ9/VUݖy}`W̪:^ndzkUoB$ }k[$wu$G!I$IƒSܧgqe]=w73g'qByk+JGUUV.DتuI4\|uIHr> q-5Chdy'QU;+Mb[ɟjZj!$IHrp|gJwQ#I.NkC$I$ SuI.8><6}1ϒ $WĿb UU1H+sD}kY$u㻭H$xkuZ$I$Icǂ8]Ԍw:,] | xTK~a|$#piVS$i|uIZ/?m#NpWW,K$ISῑ$ =u8{'9qYKr,)>KUYm_M%IR\Y$ $vҁZ8uI$I4>\uuI:4L>FcLWy+W<`S``cK,w7;x2˲ $ɵK-@SxwmIp+daUh^1 UUg'uI4T$ $Wǁ2K7䦪:غuI$I4VN:Đs$ 6o` |r)߶<xTÀuXU7dޭʯJOƮ{V$Y43t.>>K,g'$S|$cE41ե.I$IuA#$ Ҟ:J W+BUx:\XY~}n`ܯKr ֟`uT%ϗX~dƓ$Is$iePUme,KG I$I%ŭH&wii۴ /LU=K<`ƛ5vN%9m/ko_u7zlƪ:884u͒IHru"_JRgVU/nenl@cT&8$I$IW fj41 ׭_5S,88O=8~65֦w7˫کGI4>l@u^twu&IZ$I$IcłYp$5c]mW9}IʓwU:8࣍V]oV6zY \ |G`Adc-.6PUlI$u$iU\ uiR}>I$I4Y,$Ik~0ys,F`aUUBm;wv7m9O9:kUe]g:l8q%eE+KvЪ +&Y6$I!'K{Ѻne]$I$uɂyOLyIz 9c1[_ ,Wh}aNސ䧳HU8xH'f,QhOrl6XU[GOu'$ [$ISWUO~:ǘo?!Jpe[xһ\+$'!I$I(uZbH!$IɂT#[М6𶙔qYz:It:خN&^ $ij+^:ǘ. XUɤ 4F9s $I$MQUh9q>Ƀ[$M&@kUs>^]UGVծUu=֮;i M!p$KcO% }v'GUa$IҪ% uI$kcnh@c$I$Iعu!\IR3[ZO@@jju3Uu)ppaXkn~  p嚍;N TUHrq<$i:$M7=25I$I +g]ԌwM7nBC' x_c m[ l_U{Mr}L$idqU8u)u$ "^H$Ia} I\NĪ{k-N<:ɦI^Pn'oc̬CU+I9uI1:uI$I4V,%IXD>:9 IDAT5& 5I>ƹg݀/#IrV4IBBag]b]$I$uwIR3[ Ch,88 8>ɢyV6ocl y$I\:$MWWI~V5(%I$IRr[$M. 8UOshl,Wh?4(h}fbM#6UsJ_[z7px+qc[xE$I$ ZrNp$5c]By+ddQUusLwKUϒ$1$M$?-ZgY'kP,K$I.:.IjƂ&FU=V,9N?M_UwT(j-ց$I@׷ I.!Vł$I$IsX$ Ud`Y42Wh?$I$IR`nE I\pȩ-k4-~ |88ɟ-IV^+W-p4uYUSIe$Ic]Ҹ5v I$It3NC f MEU=^U/r88$I>c}Ʈ,v.h"uUa$Iq׷ I]Hr9, kB$I$uɡr$ !'k(UՆVsgwoHpp ppdONvUuqI.‘Q{Uu4$$IZ:$uC`YK$I$uX I\TUp_Q#oܫe. O$V{Uռ${NauO8ޝց$I$5=|zZZA$I$KNp_1 f,kT]-<Xe. &Zj?-IF8^Cۦ#>ZU|dU+$\U=xiVv^VU>dQH$IR[GA%I$Id]!d]SUG`Dze&Ҁ-~ '&Y6TӁWV MipUSXo7惉9!)`תz+p(]\"I$i־Xa'lk,ܼ$I$I170Ĝ.IjƂ:UU/v8k1[GI6UcYܾ-j$a8S'{e+%?4¨{p(pFU}Z1$I\k"ܐdq}k2Xp_9OXnW6Ny$8^T^$ԟe>#AR\PU頻;$I$i>E.h_Mrx$I$I]8$ zp*pfD9Л$K$'Kl)>תj_̟ºyMVAUZq&I$I|F?~59r|J$I$3HnUuWcS?Mra4$r3-"YfTǯ|ޑ?dêHY([,I4M&I$iY^M5%͎'%I$IRW< IjƂVvhEdInFX=vl}`@U|'LwZ}k f~VծI]`|6^e>y,knZdU} \g$I$?}a}Xdx$I$I]8$oWWr mݓ<&IIXU[UU#-rܗ^Wgj,3|66 }?4 8WjCI$I.ySs?ѻ<,I$IqIR3ܵ\Ut`o| >Hl~$;$JK_U]Uup5^ܥ8 CUr/gu3)܁̪ڦޅ.5UΫwT]g$I&Z l[xY$I$I4,/v.ҕ]l]I~䖩n֫V^Uu

lUU;%8O_ޤmfx\}]rpe I 9î/Uu_K|5 +I$iJ,/F'%I$IRW< IjƂ镧՝EAׁ#,U`[qk RU/OrHU}6sQw//狒\.HW4`isO۫$I$ixY$I$I4,Vh`,Wj_sRUzm\sk#U&w`mRUj.5B.]J'afH`I$I\%I$IRW< IjƂ/lcL>YSypUWh1i>\ TU*/V ˖uz[I^U/}nӻsk@zݏObJ$I4<,I$IqIR3|A҅ˀLrTU+oe4^\ܡm/_VfoE,ٴjcv%WU'9K$I4 I$IƆ}2IR3D+WVvo44O'Oh[UHm.̧Wǒ|׬| *)e:^GIh$I$ OO_/^\U?vLryW֔|ޝ~֡upaU}/ޯ$I$IyY$I$I4,HI.ƪ+Y~SU/bem^%$kU tw{O``:V0$I$Isł$I$I$IXpHlsU$t#UughΝ%3Y~j骪}ڽU+|s|7U=ze0$I$I]ij$I$I$IXpHnSU$ߚUpYɖvKOe?8;ɢw [8L_Ǚ|oX ء\RU&SX$I$͚'%I$IRW< IjƂi`nW<^u˶qZfUxW#RUm<, oӒ\>aY?Uu~tfj>8`ko^IZN=0ܗt7[P`$4$I$ILk@$I$ f,OZXu]G{2pJPU'y46~PU?,K>޴;vϫ?/kfTT}r3kU'9g֡V;f+x#˿TNIt9 /«/^XUgѻxd$׵%I$IҴ ے$I$ityAԌ6 8 8u,UXnhxp$:p1O[}݌tê IhKyOqy('nd=4'ə3I$I4x$I$I$< m*}_ E~DWચ|x+)e&ѻړ\QaU:&UukSgݦiVcKZsa!7pH[ƒ$I$i<*I$IqIR3'X aMh? yESYxIZVheFx{V VЛ?] we: m_._H26H$IƆ'%I$IRW< IjƂ~oWh?<YMd?Wh]m#5wbzRvcU3[5+j9zҽﭪo{'9q&I$IngI$I3H_/oc4ݕ[tL7+ E{U=M-M]ڮdB^p՚#;W/o'Y6$I$i$I$IXp$5n:o۫Uuүv'{6Hu&9y}c6+WoMcg$y:<*pnUjH$I4<,I$IqIR3NppIN5p $Mg#ɹ<`R#ӻXh$731V'$tWOqsNzJ)iUg$I$MOӛ2<[WoLtV ;`+pJrfImI$I4<,I$I$IyE3jsݧ:ӛ0b$(z,li K ?z'%_ II]PU͸0I8$I$iYp$I$I]8$ O2}xgçz O`.iЮکAۈƟNU9Gݏ 9Odn2,6^UWtq&I$Ixij$I$I$IXpI.'+>M/WDVxsHs zC8ϸcNAU52ttj4:@c $3I$IƋ'%I$IRW< IjƂn䪪 YnO%9we'#q &9qI1?>ǽx=,#6^:ǐ5 U$?nG$I4> I$IƆ.IR3ܵ$Ws_8BkVZx!R-5r y&0߶kud킥e=QU5YI$IF'%I$IRW< IjƂn'-UqK,&YmVZ57 zSNHqI7?UTzזt@Ҍ*`9T=\:$I$idyY$I$I4,k}UOWhXpXGԞy`L1No8 #l+C zM[$I$$ $I$+g$5c]{/ <Xm"iƮWl>*ɵhs2=<{_!hc nU6I$IF'%I$IRW< IjƂfll/l4NWh?8!y45^Ddn?` υ ]E9FَتvOa$I$I#㳒$I$+g$5c]VU/^ <Xi if+y4I|l<,7MGJrI شu1l4/#I$Ijx$I$I]8$ . IDATZZ`WzdQs:B!I7γ\UuN.YceyoQKIn~_PUw ܫv?..IU?ڮ.qq.xM[$I$ %Odd0EcIUK[$I$ O=3Ϻ׳$IIgI$I$Iěf(fINrrUuzmUتܞd$.><~.UuPˋ$ ੭Uzp/tM+r;Iv[DI$I`]$I$uIR3%Y ݎ7#tl$ofy US?pW`Vs|n4 +]k>\^4MorWnUuĨ8J(T,Kӓ;AtOTrI$IgI$I$I͸K j{ S꺶zu3!;cp>8NZ`oiN,^KIN7q^<z_Uu|BJ$IƚkŒ$I$/3H6|x^,x˭SNIv+V!V'β= 8)ټNQ<_I~QU?#$I$ixY$I$uIR3'̠p%h"] |[ ?F$o~ ֙IIǁzn9p"ppX ?86X{)äzwofLz<,I$I:$ $Ɏ΢q!]:qH5sH&ϝPW?#ӝgIJ$oSUׯEU$OZkRI$I8~$I$I$IǂHi]m88.]m#^7:EiR$Yxf`y u߫O}d .9%ن >}56$K[$J$IwV$I$I}qAԌ Jm[\hp 6]}$/Z&AG 0a x֪`lKWt*X`34-$;U.Y6xvo$I$Iϒ$I$/3H>:)QU*..VGy7s(4֒<˾R`Sn&؍d`Vh=cCWW|K*I$I8ij$I$I f,$c}3cn[fyU4ՄK>lqS$;HWSw=Ջ "$ <x.pz$OV|x_T }$I$5gI$I$IXpSI^:ܶ~NUUTms76"$+?!TU4^裏&y=3<-`;W̦3c{o%$I$5OIcIIO}-#2S[f$ٱ$316>w8I$Iȹ$I$I$iYp#I94+O+B+ !oNO)M$vOb;q!UuI@W~.8` p_4q^wI$IZ,K$I$XJZ>&<7GVU773lngw\c۪w)MA {;`gBc-F4OXw1cII-sINYk{U9C'I$Iח%I$IRXp$1G%ho>PU3 I < xiUa<I?Uul$[~/`[R"LpcG~x_\`VIa.ϿxM$I$If]$I$ɵIRK5p8ݎ_Ϫ2 ,2'r{al4w ҂dS`_Y[IyXBU%YF;3{̵zajy_$I$I#IgI$I'$IMcxCIG[΢UZ<|!ۓl?rrsF -$'f-HI6N$G`7ƫE0^U^UWC[$I$͋kh$I$Im :Vتu% `y1$ IbΡYu>%Y/au s{)y[?Hr!/ U<;KOOcUUgV[j>Oǚ=ꝭH$IœΒ$I$O5H@vdx|ї0<|9ڣa5So5d!!&ɺI\Tr >Lօ3kbTUOU Nt4m*Cz0$Iy$I$Ik &l`>&c^KIXU+*O}.۽ܪj^d{ {{ dHK=2YeZU:ĤOH``w`7``FѮׅM$IxY$I$˵IRGtj8!^U5GNNy<x?+?/UՕC_$OR]&ѭ,UUǻ<0`ŐcI#V<$I$i<,I$IZ$ #shζNJ.MUu}@㪪n^!LC[Z.+? ؙfkC,TUu@-; >.l8i.~HwUu|2K$Iƞ'%I$I$IoN-ic8888XkDsxz/hމTUJk?yIv:[K[ffg 3 <8:KU$GcsV'I&A%췔4A$I$iV<,I$IZ$ Cd=sӸuWJ7g;Lr]ցMU}#O`=`V %o_($;qkFMC[$I$IIgI$I'$IMXp7hs'߮z{w`co'9ցf#twؑn o|\xO/t%eUǹ!MntܲCMCM+!$I$IҬxY$I$ɵIR܇(mcⶅ qG qz$o*I6 W绣`keKJpA|ܴe $I$MO:K$I$I&Wte##{ޡ}u0¹jO`$_^[Ug4]]wKIw$yӰI+d=[v#a]$Ic]$I$ɵIR |Lǵ1$W_+UUlcF^ISU-o ɣc'9HUg> ɝs2%-s-%I$IYp$5a}xngW_U׷ dSfX ;¦I$ˀ[}-/M̪|iI1]i}q/`ߴ I$If͓Β$I$O5H>IJ`9 $IZ< dC7ѭ7 3;*IҘ.I$IZ$ z_ ]a檪K ྭL!V&Nt'GI\UxE/ɖ~ft3SIWtH$I-% gw6$ݡK1UupSJR/ I$I &,$ZXs[i[XQ>AIw6l v p%o88몺fX-[o%rtwѸa.$Yn\sIxÏ($IYK7V`l^lCw7$9~dU]{PI'%I$IR\k$5a?[/ҳonb!V&ɆzGȆFf{Vpl5qo+ l<ϘjsyqaYfWw4!$I4vxsC-Or":%Ot$I$I}rAԄS7Ik[:I6?6hIXU7ѫ$[@WdtH-e%y5s=y}5+VU]t_fj$IN{^8GLUU!#IsIgI$I'$IMXpA5}[LUAL9/[g8"ɞUu*; ¦gZU7 qJ)X~mˀK?Uuys ,^_;%Y2w$IV >S콐`$MO:K$I$I&~<جuv窺ux/pF O>Uue0SUՏWЙ < yzCh<"I] ;K(\M[\otdžTi3}AU]_w%KM$IDIPM#r $OF8$wI$I'$IMXpdzZx^U*@5F3wUlP|ͨ朁S<~:lTյ IxzuIRU'e90[`]$I&Rӌ~kIvM4Wn I$Id]Ԅy8ݧu"iUu0'I#'n֛N96&5񿿮MvC{NI^-Uցf-{݀4tJesJ6~L^tUeQwI$ICLލx+FKxY$I$˵IRow`~<{AoR3xٖcwp p4p|U]=ߌUumCWkOnЫ3 I+oЏNRcḰ^ܿqܶ~fU]4U{̾o1,$I0'>;$i<,I$IZ$ oW:k<׀Gܾp&p"fVn_/ \I6ts~8¼5 ;I:|Tǁ큏}ߞم6IvNIXnd_+,jzuU}~hr> Y$II0VpmHI$IgI$I'$IMXp4vns&yx9LT IDAT4kO 80ɼNBW77m0ɡIiY˫cvŞ?%Y/K8 ؟ߢ&˟xyUWU﫪3F{ߜ]$I/ZG5O:K$I$I&^$+Vp ̝d p(r{"]SU5pU}:ɥ瀍GKv;˪ց檪;ؑU83v$/pѰS | q77y%I4ivm`NHZ,K$I> Ij‚lܡO0g}sk#OVՍCFG|a3OwNUUui@s1{|w0%ٰ;"2`"w'ҕٿ`.Xݝ$,K$ib$X:խHZ<,I$IZ$ ˞s^ ]U5` cNAyUu(JUu6ۀ=<<83nGU_UO~=˗ w$NgnBw7WnUU= 3x"I$hDHZ\$I$I}uWI"b Ij‚zUa=A}PUo?Uz{Uv͏wI$-4;0iHZ<,I$IZ$ 3ʂ!}38إyy8ΊطuT/~u$OJ[] رWUo[Z9"$Iԓ0Ǫ:uI'%I$I$Iς%;|SU]`IRUV =ۛl<8`=..ioUueU7ݿÀo'QU?͘k{ئ^SU?kH{!.$I$I$iYpQ<NyWUՏsIֲN.R8~TUy'DG۟:z+$8:ˁV $IkI6nc৭H%I$IR\k$5a}FQp?vO{!9q\\II_USU;tQޗ/~&g]$In\ WTo[$<,I$IZ$ sw?,xodRI^ 8bu֪?TU#9'C̶ >I6yt{+$Iݲܽ]ҸpV$I$I4l` ~mc=nwa p! duwnfVSp.48H1 +X('I^ZUyl %YZU7$$I4 Id|:$i$I$w8:ڃcWh}|pL^cWWWLXU DFǵIRn qy&5dgSqqRUȼJUuA 鏡+?~v8,ɇWVUݰH$Is8uIp=NfipuΛ^4Z+O/u[e$70ܮ$̵IRn >!ϡ1dwbc[gU'A AwB`^ lUuVUGrAԄ~'˪Y,vvl88xWUMU^^GS;npd){c]l dOKC3CO!I$8:$ ,i@d ܶ~i0H/sZU4ؑۖ.f 9yUU#)iq.Ij‚MD=ɺ⇞koT#kb ~x^d3_k`$ˆr<x-}8ZSQO:뉃$w!WWx_I $I;I/蟩 [O:K8],;lpx1/$Aٝ[gTU_I$َ-vm-౫IWv?ǵIRnػ+@FA#k v13."e{t0ּ .x1j஍hf:-<< |.]n;Nx݂c&?Zp$I8I䰤1IgIckpp2n,;ݦ|$Nl$#Icepnܶ~Ǧ"m 0}s$In;ߡq83gVF8P v[ =8ҕo9|9t!JI6^ ˮ䤪ZRU2K,R3> u$I: IS,1d{n-?>"EMn-"& tc괖$-^;{?$wL++_Wţ'il IjE9\Hs0,aQ-ɱU51N?Nn- 4]b$^ <XEuCh΋Z$I4Ʃ$i O:Kj"vG-l{ \LUa6I =1~>&l:8Hr㏪$5Z$ s"!CO㌺1${Vյ#{nb5~:lOWlU^VU?lBco&Xp$I8;K't4IέeG6 ݑ|xUm,I Eӕڟwtb' SJU嚈8 Ij‚ zgwG&kB)p#rÞ7W[D.IdmADž;K't4I NWhq5z^tꢶ$M׻ӕ6iHcn- oGGUUI",]_lEp)p p!pAU],$50Iq.:=[vUuC 3RU&9:9>aUu0Nrt;~[xaU:&LhuD$IZѝTV&i,i@‘dC``oX|GˀwoKr,rL\'/wl8n\xu8peKI$;b_738V65ܶ> p9Gy%i,CUݘ`!M[4$ϬgY߷'TՏ;H{ڟ^>4ƴ͒ji$Iٹu)IwIAZjwc $?+u I$;;qht!)$>SU6M&i.\kQGua=`* Z|_}/4*DWpߡ1ZܡB IP6%x ݿ.P/~G[TU,+߉j˵s,讨<.7Ek&AE$Ij.t?王_ IxYj%Yt4 ay0$ݿ:I+p ݆t*I3$>`9R(5$C1_C^\mW׬v,IC{/5c $Uì8 ;KLsO[i6/i֝$ICLqn4'%T6kG+I~~:H.|Է; CgQ5 ɚg[g:txީ\ʋ7Xz<8jǕzujҸ>ߣ{c.6Uh%٨4)bI$i:4.ixYm$xy-^_7V84;s Gs:Ҹۊn}No5%vCL&L$_پb\|Ɵ&y?n!M`NwsO&`8*c˭vo:^亪zc LI|- iW%Iq0nwwp4n<,$ҝczd!Lw>o/$I"3sLƍk"| D|_ЊmOw=InВf(ɮܮɶ$"IC8fϐ{87:qQ؛Ok 'y2.E{up\ c,IL/o 3}!-I$ָ^Zi}MXRϒ;[4 I88mP4,Kr-aH=Yr7!i\kZ&αHYpAU9^S dž;{0 n}#U_U=ػuy(J{z v9$I4GOi`Kj^$-.t$k%ynp#=:KM?eIlcoZB5̟wiG3L;NZ@,CI{5'{$rQB tR;;U}-ghr .oO6ɽ{r6.Ih>ui.j@Vd$Hw';7c $Of0nd$^-luHK5C-mZ&ÁwvHc/=MROHI6ќ72&y|- =s?>):l&6:$HraM_3}2mU'UUCh2$eO%I4I^: qIgiHfg'9 a 8ipFRoN5#Zt;5̏H!4Zwu?c:YJdn0( R**A\&֕Lb=B4*C۾thI;7tpاt1{DQE4% P8RIJ^^:H04}?/*'tp5LN3#=Dhk >sEV S)vN%[y+:|p JFi{;Lx&RTƌI1tp:ʢsDHz?連[Z"GZ;]_L5vQ?k٥D 6͍dK;ؗ޽ھhz j`:0t``M+zTF5a 2p[H⒦跺votpzgDvi,pMm_]:LĠp`,5%&PIEDw@"*$z/]f{z4RT}<˵%h{!qa⻩ cOŁ{0nDDDDD[$}x}H,:GX}`?`q"&b9`Z=#@BTtZt5L΃D )PhQ]gyl ܯ2Az%g lj觥n$mذtZtߛ$ۗ/#b ѐH{~|X8^|cJ0@}KǍ(fn /=t le?7oU;?1uK搴Ci GT&O#'5P>cXسt:pY"*"#s >`V"k4C"q4pw>1^pzp%6I ?>"JjBv5߳=t(Ktpx۷6uRTDDDpH{IJ9I|xVhQWYt1I+J'5D%W:DDH8XtK\CpH"Cb$aK2- ]k!`o`oIN^q"Rksdʶ7f;Qv{:GDDX֓4%7'IS[%Ձn_Q2QWij#>JnDTmz=3J(M"D4\:G x6A"l&!?R?GQuֵ}]Kw GZطG׏)ZwKFZ'I6奛8~A`^GDDX S8GL)b#~m5q[cHW.4AT}#^ Q:HDI^M9"&gUISm?V:HDd[lϔNA`y"|>oIgpokM3fybHHz!J1^[ы(6l57#"";U,E}0kD z011|o"IoڽD4g%}CD i%JgP@A""s d$ t߱T#o={l?\z i``>i=PMr:/$=85VKFyL-IuSIDDD @T%z?^ѶGDe9b$| شt3pU#[ϓ䩟*^XX|/kIhM"Ӏg nEWyYkwZQIzU__Dk=I)pj9>a#0v/9#""""A #β1V/fGNonN4خt)J6IS,'M.Uny VNUF`cmRQZkʭY>ï*vHxs3 DYs#J?6bXu Bk FywgqGDDDDL^ #β1 IH')n?X}4gO^ X̲إ510ZORvۇ[qll`/Z;p[t\ }o~=4-3)涷Hq{@ K: `DtzawȺB<8AR,:GA󁋩^p&z xW[0}~Wҳוeߣf%%o~pZ{ۻv"ea؞nVJk NJt' iNR^qsDLǥCDIk:8㼶_/F4A eV۟VC o"ȰK`->ǶKjVOmoOuǀ jJtA%@olF FU3*M+XCDt?lQ:DDͬyo:s_q|7{DDDDDzKS@Ҳ4olZ:d~$m7UFǖV}} !iS9 Y4;K X_c \Q:HCuڙΦu |TQc;6V3 匆K{A.KJgJ5;<ў4?֏s8w4aRQoYt'ik4][(iLW:HD$- pV< i{f0l໒~ ,\6UM #J\3DS1\ EwٞU,a aV7ǒ,Kh$۾txvp<8Z #-ՅkDDDDD4] #""jHBn4lt^}uQlGo"iVLD}Xt?Kd>/]yʦuJb)pB>)rI 2p 7M1B+-G@uWwIIm?:k;xuaNY艈H{D\CPO}aHٞi|ja?zYCDtB󀏕Q)n۷ޕjG_SC/* bea>xtGG^,f{UoEg=&پ8t.Z:ܴ;ɢGs;8g풦ۏ 8g%`2))ps U>Xt;Pz۾nݥ JСC `gۻ~tad^ t٨t!y!g,sD;S5\w}KZ]#j-[Gñݍ7cTN/I5q0_1Xz/iVy|;˭[sEGyB۷qΫ:4Ku:M5 xts I v,eMU8tRl%EIx/8t9C}&ۧ`Er3[ZIZuy;{/o{ZmG9v:cye洠l?ޥEDDDD4ͽDDaJ$iC4&.197P4>R:H] ?,‘` GDT`:J~S7ڽ'"/[$]lS:ː s讏'il_e?lT? KnڽtD?s0 gnxIkžtqa@ms ,IoPɛ =ԑ2@^[:@D;$-|t>=`zqC, 1Rd1qy`k)na}pqQ$]"uA}#mX8eVhEèkc{8yUeXBDDDDDiD4Ace }mt:}6h,b˒k_l}rKپx9p0U0YKҢCD \:N _b{ۿ=l?#R^3ǖ _[3J7;;RmuҎE7.UD,yKKz5Մ՜zs;;,,MYx"iT`YWKhH{,_:Dx$=أt>5!blϴ]g7nk{[߱}kP^~B:œVnSIT߬S_).MDLf ۵Z;"21?=⊤~GDDD0KaSD4Ac`HZؾpAr#t~ksm^7t(0_}0AsϢZt>ڸt`NJk-)p,#jg^`I:@J%ؾKj=YM* 8q30$Mƍah@(pYL-)il ƀI֎!,O}Y1yo^Iuv822#}#F9tK:S$ˁϵyGz%!&S=p5Ս%8o6ǒ1RMyh֎6,e|C4ӀKhJہJJ=~Tkl"T ISM`W`{g@u9xt)V)MF?hαHz^|嶵'ڞ5 ˓] Ҙì#"% h/+e R3t$ƷJÇKl?\:Dtsn$tZ*Gyx. 8C`c>:"ڗ͚ՖZ\ҥBgl C^S:@4Z/ `絷Ӏ偅ŷ)1=" XN^Y:n5Z#o7Xt9I Xt>זll[:Kmj,Yx>"ptם^C VAGHz&C}08t֍ ;)p3IQs[]:P H{ ~8tk_ntpkfR$:S^#ՓI_|#&sGDDD0K{D4A ܣq$xk)b@B|LL ܣnW:Dm!lv+֒hC& /!j<7=tA:t8{t:8 I}*^]ND#uufMGDDD0{t64v.ՀKPl_:Ġ9hmIYZ4/k}Iӣh8۳w1f AC& CLKK稡MmJT<3JR7Puf˖![SM|8 .Yo/hI+y7wp^|Jf=T'&xZ #"""b{D4A1$,\:|tAgs4*CDlP:D{Ր=tƥD )I S2o,5aΗ~KKtSStU, ;W7~J76IkRmRmRsm`I Ϙ<,Uۀ:r$U7N|QO[ۡ5WX"@Ī[aKɠSKݧÒ|TқmK )`E`/ Fp߸3M.s-"""""b=" ^]:ǀzBU''b"$ زt>l*r\,<z@_۾taJ4`fn`coj}4 `s[;?OѝH*癄9BRnp@'[czj^@.\c.wo dDDDDD\ # u=JjۥC +.!=i}rGk^:DR?gZtN+&"}paY=+$8-IzU3g?mv^#i=m:xK/2DO|8c eg=?MtpahGeGC tqoO ܣͩr [K=xY:^3DēR>Z;="""" ц,GJKhEQGoJ8t(D*UUJnE[Z%>\:m\:@Đ<Brt`E]:LDgm'/+b@l^8ѓ%}سbu׳~8O--Q[:HN3o&'usۿQq3hۧP۷KK:ODDDDDM㈈:s J@3K'پZ߁KgKy}h%Q:K(33 IN/O.vA"bbR_#oe"I}b;'H &)Կ K:=L4!`Gḿl*>>wO cr87sc.fP}FQױs{}2CuSh>Wd{D4A~E-IZΥFw|CӜB 禝f+lq>AuSaiIPDeaHUa}؇sKoTMi[~Xl8ցV~H=o(cBl?&,`O/ BQxGK O_ x[cJ{DDDL Ǿv-o4U1uύ#~]tp&R:@ҽ>W:DQ@ ܣayh,gI u1J48Fa3öo.$":f9Nv2gA݀CJ"tJ'l.ig`ϔ1-Gttɺs)pxJ34O-|Y>cח&U-" u5l%wOg2IWRc)pRQ cl'i;Kpgh8I 'ە}r 1y)poSZꤱm(iyE _-d~3k/~#gvc@ۗ[Iz.p3qzwy\ #""bmP^g"iQ:s Lva#!upzCĸN.R}'iA`9,WJz3p&0O<ظt: `YGlOz%"! b:I^R:[ Qu{dýs-#{ٰJ ܯv1^2vI}~}1pqAܧJZp/"""bhۺ 3 MWXIK0z1/$EIq{D4EG]S:Cĸ."I{0t>K{t4I7խ%i$gh(ISP:K=|qDDwyN&Э|g?ΰ=}Z[o KvOlDҥ jֱ]l[_5t"I7>]Ą[$CўVג%M>nJUOU:@DDuuw ?*"j`#Q J(`l-Kg`J`gh I'0] uDD Ƀm3~SG+njkzۗ3}?hec_&pNۨ}版?a^ۧQT2T tpsU:w.Cپ6vZbY#}9IcDѮS﹡n50ea$}8.n "+ c@:?7 mV'{g2FN㱚X~_2pz'S)pNdeqۗ 2/{8h="" QW}GѶ_Pc)p`lQ:8R[ghIJ: 8 3o1 ;th$}݃%=Xy&cd=k IKxntafULIIzNDt,1*>x'wd<""QW>y߲~7X ܣ5J(dlV:6* b$-|tߕf*Q~7QGH:]zm;}S_ڇVt$%MF=""""eۇQ}NܝenvmcD:Oοn4fIW:@ Ibx;;=Ғ<"VelåDDΥ] b[}wPlYҍ-iI<@ҖGk[%-)A}o>MtS}].i.\/xɞڳ#5'M%ۏӝa4v5߀_.7F,X:D!k@ۻƥD 3Ԙ2?k>t7{qSmh}u>=H )pIIN?I}N}iⵞ &LIZ,kG:GDDD^p^KND4E]:@CoCٞ\Q:GM跥K( b'OJE #z' 5%rL`/`K۷1uV_؞ISvPuOS\: +2I#s_VDDDDmid'"" Qg@rm5H)TuQ, 5$mlj{ЛDR\gqgt ^(i\Z:ܣ|UU!EGDDDS>x)pY,=h,9~? }6phTu{L0{?4oLROcjYuܪzRMy Jh~tkJܸ.}p\#,^:DĀJJMHZ t:[K2Pgi7Kʈs?e{(4i,݇q $- ysȒDDDDD=~NJgDDSd9j?Kh;lY:HtE:.7F {g%-S:D =[Jh 4^Dd$ جtyxٞY:LDC ܛ>{%8<֧,!&h>JNJ[\s+p~]h,s%>cxgR)pqٞAtI>Fƹh JlNT4m ܡ=ln#72PwQj)Km_^:HDO M?J"^)lU:Dٞa{Wf z;۳RItm;KgDDSd9!jh&ܽ75|}5H)Vy1>\Sp=l. E{,`/;~t7ٓ< EyE rr;vۯ}e0akvdt.ֵl۟o[KC쒥CDDDDDپxt!5Q3[>t;J@tq~ࣶ& }&i*p"Yzvն-$"-z7Nk{t)ˠ=%-? 10_\M5 Xt3M J_n`^SKGDDDD[lx7Q&c""ڔhÀJMmO+$zj(ܣJjp%iUyE 3go*W~ DD.:| cnt%]#/-qd{&tm_8W~,)$T -&kEDDDDgJ瘄yJhSZsÇQ6l+`.H跬U*"hl=='"*}"i- KgWؾthLt7ǀ_uxȂ˻gXL*F~`8Q7ﶽ#&ޅh3\I]CA)Re!:Yx8梤/}[ )ptp~K' i!b0v{Upɻcv^ou#"jEҖTs+#ڪuhK _=z;<:S.BOEl | بtH{DDDDL˨&Yx&*p~}t J{N˿TTHzG1l?`W^ |xjT+mk;7Dy4Eרnꙧt3 DD3eanؾB J<I xeE*;f/;)m:pW\~:إtXthoas%e-"" Kz=p!n<=4mOJ ?]:G鎐tkJgY"b2N-GuDDs8s6ꢝk ֱaJ}% +pW== fN;h]:GDDDDGl?LU bLYx<^nr1O)SH$̔LQ!&4==B"EP"y!SB\2][m=\k9{~k]ZwE_06tʟ5l1C-3K|<ђ=- m&iq\`GDR>8N) Tv:^kl(41 =PpA`wl?R:CXt_X:G="Eؾt6z2K-{t[:m5kCDDDOK{IZXt>UKq ewRm,_Qpt OI1pInY8K kX*Ys~K" "P;,&{t[ yIm L;_z#sC.X:Kg?Wޮue`IOp$I6pBmU:K"ѷl_,i9>A䇵'#t{t[ '(I>t9sYϒ9ug>t, st;;k~>9)n> ='J+bKc?{DDDDwK)3DD!l?hc FcMq{#{3KKqb sIS%Br. X3 <5XN."z޿K)9}cŵہ;jo؂ߑC#0vGU6M"iY:u3 ѥSHɈ}x`\I+_V8H''Xa YZm>yS$_Ku&I8ؠtD`J`H7b,vAz1qC..nt(-R.پGc$-is ^? d3(dSJD6c`~ JaMwoRl./ߛgC-O, %-&""zB^6Aˁ.C6)fI0@jB)#z҃mo"xU`U>%id{eY-=g4eQI_.M-pj3""""%)i 1pl?hHۛ [ހx;me)n&eOvfݖ΢'iA""'dA\ll Kra% ؑzOA[{;PUT/N}e=C3WgkhU Ig>t= =EDDDD f-dYK~"h4;r` e%F B8Ow?)C7,ܣna>>ja"""QX:{,cjDt\6όl~8@O]58̊=%H}p93gqIW^_:O=""""}2ED?Hgu?"zY gJ!i`ZS>NvbpG1<2x("z^:HIZ^vM%PϽWQu*xSґl/GkHzO -J{DDDD"( IDATv@R:@DDu5"eOvf]e)s݀$R:HDDuIHUґ sN)nnbʀpN}q&i1 cNZeNۇ X;?iv`k|IWKQҼWE YKi|MܳPSDDDDв}5pzHf+{pk}lbIߒ4G0UYgSio]:K< JtvQܵ/K(d#J[$͐z]mox;p&Uɼ8KҡVg}Nv.ۥL {f/{LjvuJ:8$- \U:K< ldץDpJ`J{gۥC:6SvIHzQ#~j{=u '[ \Œ4g#GO:뮒.y{DDDDKG #d9"}f%=^)ǒ[u1Xtf3JtPQѥC'y݀KڻEOڞa{[Q}-Nfu%?zQ=`YQ\KG #d?"}f%> \/iA"""I@C4MT:HD ,t c  [́Pu.mtؾ8[v*t߫n}핀m[$}Ne~E폟4[-f- l[0Gycg~90t:d9"}f%\]:Aҗ+"bd=5p(t1)pdgcmb+;^X3&O7jqk%m@/VNϟE$}LR(Kj~Ll1JC6#d9"}f]W; ަTѸ}k6"b :Ձˀ7A~t}p] <\:D^{[K_ѮpmtJ(3R$#%Feftu:pIa0zRJiB 5EDDDDD{I # sDDJ=Jt!Rk%mQ:LDDl$mChvY:,`#ۏ1R g4hIiuZ^:fXۗ?h:Vo'IMיִWZy[_NU8gIoov芣'jt 0g/,(cGD?爈{Y%S:LDD4m($MtpzT+$"bK1?KI-wOn9]{vlx.RپǩfoKNtZg!{?&iy0{="""":FiЈnʍ爈71J(Nb05<إt=KK یz:qJ'ٞlrt^baSz5RIߑ4w~Q7ԾInێX [?:rU?H{DDDDK!#d?"V:@J(2WʆtKukM //~ DD' ݃ !zT`k9U릖klԁ,iv j6Ko:hcNtyڕ!ZgY%M+/Զ#ؾ8tR`6#"D:,ܣۏJ!$e)" :CBt1{lRs}~8tpS%űz]?D^)S;3~xt%5+gXp8oO}v 0+UG^ѫ+`GD?uʈx,JQUW+" :*_~]8NتVWR>f'6ΕtY҆2հ+pp IgJ5ۀ=586ImoQۇ^T G2n>mdFNRtp^u+dR`7#"P gQR {TB4 *lߓo~lk;FD_H;t>.0Cْ֫Ikm-kXCO%ܦyoX p7tb7Su?8{ۧeuHIzȷY:@DD}36"lۥCP?EYp -""Z6 ^\l^:KwX}钮^6IJ:8opl3`B}CjG9Ƈ> \.ZVd+c44[&mb{N/N(&# sDDK &O9bL/:VIIZtL./ c{e/}ml{:*Uf_WM7H:ER/,m  y^ޥ9#"I- PDDDDDcF5)p~ޓztw |E(("b :]Sa81۶?[:DDD3R>f0)p 6 mn[mU;f3I.Jҡ&mƪ6Z畔 Y:)puޓJ)p;7K:\ҲED )p4#)t//Ѭ,tKCt[Lr`{E$5T\`<49'H]7^0FDDDDDԫ7R``6#"H _(ܣsDݦtK" i1`Yt`;.$"Y)p mVV.:.Q֒~Am`}6GTOE%]7(p_ cDDDDDL$爈3[=&ܣW{R%t! /.V+Kn]OUDDJpAѐJ(z \8T s9FsMUIY:@DD~9"bHɎ+R\ LI1zAG"t~tVe1exB+ۿm3$ uc+{ |^dH gH}1ҽ}f= K爖."I6rwDD .IS%} 0k<]vnQZ|~a7*ijsW61of"i.=B3a6QM.)p~ҋk¥{JY8XDD:;RHu􈈶 q d;X~|x&8[-;n* _vӀ] ^f*]snyw_:^ۆ1RPGD?ȺDDoĬSmZh&I4w@} %\ pR*""=$l?\֥)W7{XlmxJ`%R^cGhǪT;48sϫ}.,,|N,p-̐ͥT{ry6 PƈL #"&WC 3K/#:b) vIߔx@}o$m ,Y8JIs˕)p.vik3cKyx/۾g m_e]G4svKj{凉~$w*uv?[ w~10O iӘћ+`vtotpx)p~7C"3K5A6?Eo~)iҁ""Lϯ3HEWcJk)p.*p$$p{7ჶjZqtw}.i c$)iFn`Mν pw4y9}~EejewI cEok=""""F F爈!{7'7 p6:y]Kg!o( "b}\@w ]V((":/'v) "U)p>vaS 2F^ ߦdll&i:=IfpŚSiB[J֥Jlğ_ Qҧ-[;Z28Oz-3)ۧ~'U1?0y$bL6l8=""""|W`ΈFsDDG gѳlϠa{^&ioIiæ:V.l'i!""t^ǟ DxYƲ:p%55v'k]><6S%Vo}jq|$m8u~;UaɌ51 {7rP95|lw^Y,EDDDDW6S_X`ΈFxJmj9zP:GDs^Bvkm/cGDI84k\JhV ܇ӹ]cI+NvӻgみHQҜ  xciWIS4Wپ!i-ISf"Z4 8B[!}퍩^o|8ꁊˁ?v3S >~(L{DDDDtSO8J{DDX%ܣN>tYQe_#鏒6(("Ê3H&Gjy9n.."'}8u}V(Isqi3%"]&Wv<]{4WC$"iI@)cz^IIN0Mfᛒ׆qf!?yv۫N<1ԎjE:"""""blwqc8_DDR;-G{zc|oNtJJfD 3HZkݞ{\H.LpMrE]2d p%!Mn_ڽxV;Ʋ~x?KIJZ>~ Y[ f?1aVm8ޑcm〻4lۥ""ZsHҼstpg1KsDX97I1(Z.ie2`n;(i!""u^y3p%&J.`M`/nIW-i9`.׈jN6.:lx#%sn*roA9$-8}}?eNes owavHް>C,ܣ/99,Ou~wki%mCUӖz57U\DD_IV;TKZL+*re/l|H=<(PAb%mHyG35TJz㨱*rWe1##յ \E(Y:`cOtpvJ{DDaO{퀻J3/UsI:RJhK:=ijvD;㣒^]:DDD#R>| GIzqCf9ӣ>Kz}C4Xy=pFex"Yc 6y_ k%C|S.c`Mt`숈NI{DDy ={Ndm4c5'I~@Mh ŀ;9O0fHx+gI:KҎ)zUCf|xUIߗ4gc]|SIȓlh{w| 8αok"OĠh;{DDDD`Q``_Zp ~|]$}_:G_=Z &JI[IZ:PDD:]:5Gƒ)""^]:C"T`1 \Z{۩s=IPǴiOo}f #ImlmIƚXl&+`[ONvkyEu%!-(.lMlSy"""Mҏ&0&r/"yV>lA}>I35o\ˆhGv!""N]z2!TGG)&bIXt7{=58Yy৻VuF#v. ^{sө6_ ,, l lD_ /M1m0^,7eRus1;t~T>!]X+\?y"M ^Qˁ%LU'joS_<ϧ}*#" ZO.B?|G{Lvt(p; g+1chV/J,DQ%>㶟}ma{cb݀وD37K*igڱOpT`o -=0kَA$mMU(z!i!""&vt]AwUGw-YkIZ$ ې IDAT)|I_ؼn ?^\%cs/?SI[#b5D"""""""J. ť0i]Ck ~mQiO%M)$"Rh9_H:PԱ.}pssLҜ֐4Ya_7 KzEK"zS #""""""K #bhH&ieIzp1p0ZI lE<[ R Iے4AtsH{DDDDDDD9Y$iJN.*f8X/z[:а}4FYb|E.(""z^^S:DDDy+"zc૵_]}-4IA۷l\yz؍vrY m{lوw-AU`Qc<6΂ Iz' L9!""""""tpWkHkŞO՜j0`G`u&XÏ1Tl_\:K0/77IHʿ1lᒦ-mEm_^ֺi9훀 [7NI.6C2¿e#%e#sv>P:DٔNh;ۚ""""""""u;nIߖt6p=p$iksm1tl?lBl+yD/X8IҖDDDYR1R#[:@tmc.}흀3Zk-} ȳTcwh{&6/0?`=DҢf:)"""""""^)p'iYI3I7wQ)-Ž1\!y"jJ:YDDDOCJ); i<u-ؾTޛ ؾ'r'Ǚ~# WjE:/kzj~Pݚ^S0{hRmMJ{DIS%.鳒tՉ?.0JHjOV.*%bIxM""bL4tN)psݳV`y-nfQw5C>:G59DΚ胶xɣ= 8ZҼMdOUȽv7&p s$I_Ƽ Xn'-pASQF #(IsK@^. l,X4`tpg+޳萹K-""jVv+""S ?l?Me`Isww{mAlx!4QW59xۧ~lOX?}x+h}mگ:i`UREߝ6х^ |@RQF#$-"ݒ+rATu}##mx+p{<#\$ I}YʥCDBwvnCѬo$}.u6ӎll<O03ͥŶjXcu{(I tr!D^L Y>Y9%h:U #""""""JI(I KJanZ?{O^ ^8JH,ia""f-$"K cw|Yi[T eWhؼ${lA]Gڿ ccOߣ77s~] s}Wuaz]4`q LR#""""""y)p4 %/OTωhT:Gb!Y:OK:Qa""偯%1څ33>\[0 9ث>B$i܂\ohr|u cF}蓒&{}9IwLҼ|x Nݠ=-^[)p,ќGDK$"iI_tp 9uL.#awTW:K(K1(i!"bx=^c#,:"#&nz]l8[>8WkW51M4۷~6)O/:!hsA|Wݬw0q:8w]$E5yONpJ$cOX#""""""q)&"MF"m6tp'$-J^i=Q&X=""""""R4%@M-˦!l婚jEUK$ ia"")""C c,[ zmV&N_71uyI1EUt{"0^Gz?X{@(ھ_Eu[;1٨CFˎs; _x cDDDDDDDDcRc%] |XlBQ'wךjm Y:OS]'ia"">+i!"b=R;TO3T1[۾wl60%7^ L,an韰d9z+JA/pV:bo2vhzU.i3oHv{DDDDDDDe?"j]P/vR`w)eŐK5U-/~'I]1 p9J7wؾؿ@~Ǘ/4xۆlpkmζ^?}Os$IsItӍUn/`6 Wn-=bI[Җ~CuBNeE@:G4#wV..'bWHZte}KϹ瞩k ҧ~ S8ǁ6p;_-E2+Yz#~?g樷}vPOoS`Q~D=QK{Đ% KuVtAHD}:֤ړ}pΗ̩>%dLD x+8fN>S O? m a^`o۰Y͊M#;_ۡ9-povY>^v;l8|3Nvd߲e'BD;ID)[b(lIʒ}^?Ws]9szc,/3޹ysìE8:"h-3333333f= "拈DĭdN&k26fM􉤓?cHqQDL:*G䩃Ywr &eezCe1^o<ˁ LY,>^+"F&K~>-p{ՋGĤB,Ru<"b0abxXw2MD]Zf](2Daq?p$Y_NfN}(u>6)Y&̬rel+ޞ !>6Ax2Y"btWz*˩G{$U# o9Ic;g 0E\pYkݬD"quӦ2k;ULҍ>H,"bA̬VD̬r.pTb?mwI?o&TM-C'm`@9,Y_(^[ps"b>"~_/]ZVi@z P3lQ>΀\nffffffZ.p7pو~D =q,*Y $}$h{3G'd08>"~Q23N>"N̺yTQ~S [9"&#4{'ȟmKI 8&ҁvq$")76 ݧ-]B0[#í}~=`{DLL݃ Xtu2"k%2;Hқ#k;PFĤY-NH̺/tPn`$ 8#Ɂ 5O`;x 8oH`a?AV`DPu.W`Ss Q׃upqW҇ llhn!"bDD/_֬$='iGXcl\ӧbf]E!d %:t$PWC^YDl:u_ AIzxe>g=g眻0_Lnu)x a+`0C]>~9 Ld ֫.VwI}-xxpa;9Ē[X2<47Qƃ; \D,F5,m*rwc=oHuBuۀM$m '.w%[ҥMKsaf6뚜?NO:g݈fLcÚױFJ`mH 8tawރ^M,iޚ$"v0[7I {%'4It;$+iU -"&*0̚kfm("抈ɮzE7o2F&i`myKV| f>EI穥ՀWkkbf6f WB5̝Xn1Jֹ6Q "b8!"΍K"bTD\5Ⱦѱ̽0s ""KYwWDFāXC }`IC!UIDŽY+ݬMDnDx8djn+%=8逿DRYGz)n4,Lҝ3U3VK:߈U^ iLDlMV;6؛>Á7/A/[4T|ws2YvnG_oJzt-p x`AUpݽ5~ \qYb1 0g4fm'k~fD @{df͘}Icf<`_Ib1IF?IXID\-暑YrwGXbrK_?gO ցn֑~ }E`& ;5P; ]ҿۆYw{ಈl.W /3pq$P}9qi ǂUifffffffY"O's\.NNN~\F֕_u:wp7k>t 0p8^H{yR1`%IUU)IV18;"H:/t[tqtpsZ\gukIz7u"b u{Wxku'X~# Ȏjϯx?Pݬ"b*"&I{ Y%-"i=Iߑ%(igIߐ4/0%ɞ$Dnf$)`^{cG2 p0ͬw=|XVҭ5EefV -f ܇¾7X`Bn0Riq }Qx=7}8njקox'|̬u\nY3eG} G։}g`I`*I+J[n\%+hdM;)IK*Ԓktb?IҿWBNj.vl\MY7&ccA/wmf=2ԲsIOjrO02\nÒ1l=2_ܩdt/=p%}X3E6 IDAT,pOD|'uXX+0K]sf$ADTezd1 -ϊ}%hQ ׁkjXȃ7 հ7 *##ba |Rax%IsKAZtS6.bm:%-$coE!̬tѩB4NyP ]+R0w&/j-x{ݥO^*L DD#Oq:G32y.|L%<6{]DQ7 V4#Zq҇8r+07ZfMI"bw1d`đz: ,L%K/|IO$M8FԧĶ+wp7@>t0?Inku%"6MZcH`)Iw V9Df9\nyBE[7qr mGQk%0 MeիS$1Ctq8g6E`W[G_״vnffffffz]Ǭi1YD|3q#7 HZBNNtoaR8x.u6If֏%#i1SoMɺ"b!̬V+IWRBU!7rFgGĤYgn˥Q8~{l?{x}E` #bY^A#"֎o5=ߐ\7⽹xiJ E~Hkw333333pw"bʈx,i{ɺ Aҷ$.Ĺ"%l\n%$20*u:SҬ+} ,!o D+RB 2 VuMΟXcA{9pδpoD}qBOd6QD<<\G-p}ֈH Uwq?ĞG/Kt(pou %zшfS^.p7333333k DOȮ-̐8R/y>l븞_ShCne$"i`qynYީ0]I3S,pEZCYs1\m$&N}~G<'p}D',]s?cy: !sNBd3rgߍKdX~~M ` fjśY\n66"'zVp`:IJ:Eҳs!ڌ;u)IJ #YwNDl:5:LBԠ#b!̬݊F3֏I#b&Jzh^"bP>3qt= ?@kV`:>@oHz F>%vFgo4Rh|=÷JYfffffff֟ #"bwQ`?`đ{d )~ zI=S-9ڌ ̺HڕiY8>"IJXHұ:{AIwI :7[nϛ\fb`ӜQrR\bֈ8,"FָOy;o |/7("&fv/pOH8͚iB."%:fՁ{if$=8WjO͸YGfۯ:h`MϤӄSBkGĮCY7~VuMG2~ sνj`B`战=ިi]_uui4'x=up;)O;.|NSp#ǔYw333333Y1_D X8u.uC`>IK[Ւ^f:k5Oқ kڵ+ߏ5vCYn/Im ͒9Xf֞|ۊ}X0@I{y$OSJ5jXքc aLzT{9;pf&.yXS<]M%̬~nDqo`ysQ I\?.wp7Q>t094i)sN?S W*"*olQZ}KXҟ/""V#O$F9{L\ ޖ"b!O\nffffffV?[O "b`KwȮ3.\wp7q>tŁu[Rg1=!lHJz.u|:D8)u3k?.p2`-#ߞ{k<,]^$X8Uaa7r+MhW{)"v'{x{_bs,;@oHz/\2D}7Um%"f| 8ń|s5ֳ"b.d`qUd]vgkZ~.p?~$220*u;ER0]l)+%=:Gvau3qq]k |5FfW?#bf!pOƓ̱4:KzKsP+pp8"d-+?("3*)Ӯq(b?~7CfffffffV[ω#"F`qūρ%^Pڌ;x$"i`17O7] l.ۿ~'u.X,u3k.p2(pئ^<5"9j{uDNumk}k*puI-"b.Aޞ8/7{Xc8[Fāӎ,BƵ DVPk\a=%"6JKl.G _[caft́)6-S0#1MstI "LS3B.p$=I5Om;Jz]su'F`y[E~,p|<^2sK`!h8ɹ1O%\sWV;}tk1d Ư%;eY.p7333333 ܭ'D q)٩hi|LmqIKH:URRlfNF* IsGoMdmȈ*u3N`ImUQ'IWR]퍍k!̬=ʪ{D z0G5~4ڬ |/"Nn&>g[^F[t@/Jx(/y:5"Vpv!ZdC/8:"hυ+Z"b~]kNV08<qhH0YCG1[f=M[>vd x7u.yDl: VuN7IhvGHzDnpvD(9.y/ڍ Io Sr[}vqFD2\c8F|wRhs MWcfffffffswZ1uDA)oy:sJORPa;Yaޒt$0YcGgDTůVC99د#b!,-[YWc*ZQs:;V+0BzǦQ׹Te#oۢ{{9ƭ^ ߥ_'YtLkvku)A2oއ̬[W[$+lR!>.wp7$}$4dbߒ853Ef=7.I"cNM \w+E-(XI5~\o-"FDqdǐHXAv^Nrw3$Axđ~+GC%>$ :G0"&OZYUvq82`I7Sᒂ{"NE&Hz4Hǎ"]۱;j0K[`I3"_%\[`.5J״2.鹁l<8TEKCKzDb}~_W;NuתҚiD\KFDc|Mҳ9'Dfffffff ܭDt:Ҹirw3KFUV#ku~覛L|3u.!paLҫstD"CYkݚ"c`T.Iv+iF`*4yKy;qG%"bˆ8`}C`>CFĜ}4W~N9x`EC8":u510ЪK}ʩ~mk_(8qu'"^!iT]ͬmHzQCwٖϥa֥N a,:VPy0qMyo?[.ZRK$=-i'h gNtݒ{v|{DLLC pGD,EI%%N˳)>ruvpm{Ԣ٭G[ü>o.8wk{1p5S,:`1IyFfڎIZ XO޶βqf]C`TBSr[D^CY\nM6G.g[\Ƃ⃽S6sؼɽ>^(3Q{rKk|"37Dzl}N9EJoG-اּdz-춴}l^T"b|ZDLIvjtd'.awp;YےtU#q+g̺=>L4[^:G;*"VI VkXsZ`c"o,(FqHD,  Fqd]`%5sqGஂsNhI{Dp.Yw&΋Zm=:q4n_̬H-$`^ˉ#YS0Sٝ5H0u.MD:UV ܗ 7Q1uεol&XXU.(}I{w{e`7Iy{DDvaʊ3"VlbR(PHPT "έ/*ZszmfffffffFՋ5Sg 'Kz7u rw3x>K`nL̺[S$I?M2"VN̪w5j`z`ߜ.+}lZ!ii`&``}`Se$+p꘳e'N-\tαFPՁ+\EIUPlxb E;xE{Y"b"`Y:ȩvvHWrX6!IJƵ|f]T=Ct }YpUFȺYa͈X,Ǹ/{?kH:@Ҙ7Q$itK)p8/SAM.P$mAͽ 7VN.~OҀ_#bzOPX% 7333333%Av uY:%NCXm\>;YבURY!u. 4ꣶ|m&EͬBUIrFL⒮Kr #bfJ`*gXK SRhmfҀtu̎,Eot`&UܭfZ`3wnj.pfֵ$Lv|f庪JI 8*u,Y\3p.p]C}?}+"fn?G[GĞ9. KP˩V1;kV F5-с#U &,95 IDAT|Q>I֡~{=R %0333333ݒU^w>Jj̺ђ!t&"ͪ6;x$u]D:5V)IR_D9  3 ܟfi9&1aD rZ دv}h-PIHB<+K2W1%(ZHDL^b3333333 - b޼֒N V;Nf$=.i `syz u_g~+af!">3 IM ψ5+nK*ym="&.vofENj i yzczLRn+9 1S_1b7֊) 7-89u.YWS:@qw3)NŌ)ݬym$ :G(">:w5=%SL1Xe,p pVDFF"xq0fAEtu:ehHഈ(sD]*ikIK0u>T:|zQIO4 "X?E ĬYuzzAc{;fs$!i'`%ߩS0.pGSL̊sUN3jbH:8 *"*T#|#₈f+#b/"Vy#b }ʈXD9[I2dEnLJH)lIHrŏ|VPW 24:N=[p;'UM/CXK},wp7%6`IG#tS<3\^F-͖VX8.u3+.׸,f<L\DĔ}& \@V~nD,YF?D[;#mdO%/E]qYD*"(~;ǶE>^(2F[ǖw6p_Y@[i

)Ow&;u& 2o3EO."333333N"cki 7րwsIob- .llR0p#SrLG&"܀Ѭj!X&".}^8x w"X5(9okA ʹ\P"bֈ=YgJf{ TS!D3$=s͒3 >4ԃ!Jz}\bUJGI-uKcYO$lLvfqI l |:K \8: ܭNy]$#+KԽV#b&z@d79+{DL_=ba0{cs; x8{1ObЌ[W Y=,wkּ  ^#uAKcY?.#gmsYs\^3I5jffPrZg;]ߊi َ"7!͊F2M5;pD_#'cdrH ^&+ro%왔$[o 1HIW(R{'3If6 pyi.p7333333 ܭUH!i\>; Qܸ,\n1C􈅁 "bD f64[m$\Q)2Ak Gľ%[]B!r%Y7eidE1e N`Wɞ# c`#`GH-k%FPN.`?5333333 ܭvY!,)ff&>p00==fq{ 4j9JWN7k{.pw7lSG2!pDD.6:; %YX86_$.bIHm=S.˗Jj4AK]_`|WYukcE\57\.pAdo&-R0`.poIO{CvS0B*ן쉪$}WO pIDLVdS6=. N6>ƸW,Jאt 0'y`vIIz5m֑Y{+֑̬kX)u07,I%ݬ<ӁR!GG:C\n48mv+:A5dEה(r?Q-zQ167u*Ζ4Fҏm{\4d=aIϤΒǯPK 333333wMDL:G9OupX|03I#rd9.p7+od=hG!zx f6>[+ݙd\yT} < < ` "bDI~Nv78IW9c`I\ `>/mW$u _."Ys\nu>Pz| :BO; `#Y: s2C=d %u3ȬvQ;$H_{k JMg%M'i IuX8 xĞk'=l"b"$ 8:}$]Sp6~QDL]du)֍g*5e1333333.pZDČT΢dL)>;$}`]Y:s{DMemـ#bAl,[vQH}yUҪkIWJzD&IDҫFI0BL$`kP瘢vcρ3$/dGO |$}<^pڊud1333333!.plKC6\>; `MY: ʛ0"|!'S!Kgݬ}Z\ןظ$I'W']%&&yx# E&4 7NџW>)G V2pjخux5rۧa^Hچ rw3$=:KrYs=Io5 C !, ^X6w0vAu~ ,]r"ZIkw(oߖ-/4^6>$(i %m/R$} l7u+Ԓ̬w˔a5`!:^c\cfI_Jøݬ9.pOD_cR1?74k.pV}XVK5IW{٣R"q>pH9,:IWxcwsYY "V-;Y](i?k llY՚q3Ԓl`.333no;ЁMڊ rwUDLF"[D|'"6#b͚%_o:zC"b!z ܭy]K; L<DD#bx FN_`%~om ٤;/skTJ"-pwq73 3336.pJEtdGt[1q[osXn#TMg?~\<'E̚U@ҍVstwp7k;'8l `t,=d"X u^wkIy`"cVYs ͺ{KIS1;_P$ZOmf6ι"؇  roQt " |cNOUPDy_?6cY\nfffuw+ qVic%}O{'fq{IEs4$Y|Ĭ\n)Ocs9E164EĿk:gO" "ޏudf[>g\nff#irokFKQQ/`quE}n&xI~ЪR!Jfq{}x&up13+/t[28pmYUB.׀+z&v*&{(&0ZAD,l؇<>l~^`tk4{k:fffff40YFV:.p;[v~f]7Ɋm\.p7?XD lk0pR1#[jao\BSX}ˆxl>wVv#s~D,x9f>C'"b pSzfffVK2jMJrw2 <)f}pn%i#.k;\D\:GC.4S fuwK,z6ʱ|a+ -GE Ih"؇:N`وk2h߯JZ+fW%G\nsu.4ճw8 v/dQD7GO#bm}Á_~`S`ƈX="~vb2)^yC2`}FIZ0^fff:Yݺ.M#6 {֭}$AZU:@ɸCgmHN\%xE%cݹB[/,("`m^3iK$͗^D<GqpD{~DDe@DGtID 6.ff+nfffuwMH[rؤDĽ#دen"z _Sྪ7Y|:u333qg5놋6$Yn }3}hP1.9~'$:YXJ!"V{Xs KKEēd~- KJ9&ѬpdKi<( fffVW&epqv *u4oa}h.px{!̪V&aM$ɂxGyn~mwkO`yfIqO3#➜kܒcy333 ̬\lpqv qL*L*i!̆|%߈x.u+'IJ\^Qq p| =I?K¬\ner.Zc9E1f:ps]EҪ}Ӭ.αff .p733*KwS&gw@.p;[7gJI.2séX{{{ھCR0[iD[}j+IuiaD |N\&i>iVfy ?zz̬3afff#e*qqv.On}8pS1g\nq{{"9}%:Y>1ص5g"n.>o%FIsy_28ǚ/̚fffVgmx#uXBm,]̒fJy9 IDAT*JlO$\n{}|_,JQfew+1};F{pDyjF`TGV}zQVIy_x5Ja̬\nfffu woJ3CXi 7R uAl%S0ϿS(1CX͞:@E̘:#"^6ş`I?L¬\na;\.~#`{>o= 7I[y_" 9nXt33kyS0333![7|MJw˫MҺq5R0`Jdw-udVx!uIaVV.p:O!1:,I%-pwCIJR6Kk6(<5;Yݺbrǹ*sw)SL:@ <:;5F6a?!VJq p_ ت݃#<IsHS8OG3K~HY*XyIIoff]iEk33j5uX!u+IR(S*{;dSϗb+ͩX^A{\^OeqS0+ 2W$uoĞ%iwq4$=< <-IH:t| W;7\#i6+ث:\6 13f633*hg\^%%͖:;B.Pp7[ {-\:߳g߿ODGVY C$:Y)+}g~`?\<Kڙlطy$ @ &`%`X2"抈2po}SY̛:6e1KVi.p/CciR( i:5&ulBv,3u+=wpoPD•%a^?+x8O$iv+{Vԓ~'l V񣈸1"ƹ9u6`oSྎ ObffM 5iff(ޞi$͕:U ܋AV sPRۥ`T«I>uk^:Wt9*Sj+"O>#pb\nwP1;{׫ 6)N'mw&lB0PD=d76P08[R'̪*Lރ,ff_HfN[ 8YZX#5=Rқ-uqkMx2q$͔:Y*.p*8OL ΁6pjo4Һ&+D9`$M2AW!IoV5X$̚`UܑhӤ`ff2eXVMl5,Vc%OK:Uʘr 8G.X5ވx>u+S\DB9YCKK+u\nUp9p^Bm{\O4 Eݎl pH1X؁b;'ގqFUQgbffj̬}nx[N^}${XHHa-$P}%z`9:&uwo'pÛFǀ}kRz]S15[eD]fV78v6?L65%! IKYҡSd]P&IqP]GHZ*:iuQ2 bffԺf55S03F?u X:u$oj!/~,:DEPґ|&N# %m:ΒC$4pQV MK+"~:}ߴjjra!3; I;aD \e.G{PÀ!lI fVBXyIe`ff(+p33~V="!i!w$N3pPN0IsJZ]Ҷ6yRgL)iAVL ?DDWX=7S p ܭj.1ኈ:9 {qdekPL(l쌟Ƴ:S>bA̬<<l'ixVIPCÀzn(s.n/=ej-i2I HZOҮ~#BIoM!88x\~)iɄ񫪮EÁc%?#[I_O#cRp|<"b {Rg Q܉sV)'m (w >3DۀKe6MݑVOK7,:Ւ {k̬\gss52OVIS'R3!b{dUK)iV=%-JIO?\lȺrOUDXq"}צGc"A$]:G"FCX&@ƃߚ%"OhpX3u B fyU5TD-'p$ F[7^Dc"bLD+"EĪd~ &rG64Tn7Oԋ좺Ye.ľcffzج̬NՖ+9ISHxpPv;m:DɍZ*k"if`9jbkIa 8ZRHTnJa\36ꇙ$ۺe6O 5 c9jkFaiE4!Ī ia:wָ\>%DOX9s58QD%/qނ ]])ayqNnt0ΒɩCXza71G/bm B14J?`"জ˿*iA~pkk~ <3[}> |_{{ c:Ip.ȹnBSYL:q73iu-u[82u+xK 4%})u:4$< GZ͞:@ISĭ*hI~@Z!{v<Ӡ$-l:GM- |+u+' n,6Yٸ∜`~D3޹/o=SlMJ쌈1qfD,G6<o_/,[MYsIwo/ɀ$-:U:BC7$,uSRh $%iaFtto\`3`Ҵ̆ p`M0$M:uh`Y;'"K*`\#K?4*u+?PE3HZ8u,kw06γp# जٚf:#bc`(z7!rjwJŦ13 9 :u4%I*Ǟ~:ޥRh/F:u24]$]l L6YGfKzuN~ _#wEDO/t;o]lzìk&^"GyCfffu DAW~ ffVN6H.6WRr$I`Ql.N.щFҤdE}++~5i({ "N$,:GŽ H&BH`Fzn^ oEĽX5p/𹈸/u+I 7Sb]/"IĚV+V$͕FĠ% s lg ș) UJkd˒in4"oV9^m!l`Kώ/G7cR簎bff"i3pFXHq6[CfVࣂS$ eEM[eR稉 ;;- &i.qTV d8ƳUYLO۪+ oJV;?"|?g"h۩ehuBLd]_%5fDc1o"0`qHf-p\Dk&232

kr(I7uqFDϟꗴ0xD;/I"9=f"g#YIH:u]Tqc0ffǧaoVX:?d^mڄ:dNzM=_fBv7| e$`9jZ,I/$L8N<,b i'nhcI:jV"⿩XjGu8#"6ocCs-`b蕡HA# % )3I땈{!bfࠦI7$Zy^C IDAT,=IW881"^NG|m'Rg \0'XY|T>EPf5wD,utq ı/&S;&{ppc\;0!)KA6A,-ISX&u7ӁGX=jVj6YADJ~BѤSSGαiV:DBuha?wppR\s*z>K9~<'TII=34?N'$ iԁ,x35Ⱥ | 1שC[40`5IRҷ$}:qJ4%]O6r\>1?tqKd丸|Vt|Ϳ"-`}~FntZMrswV1c97?8Xo7x X""Y] &1#b# J[ض_{wJҤdoGY\/"H%ia9?/2pV,7/dՊYSg] ?GҬYj wRfl:4"yJMҢd]7H*4naX{~ c'i!`Y>n..籊qՖms,70GD3M^*֙.5ëUr.9"~W`AI8XX%E .q뵞YgNOHbn>6uu3*`Y+M`95]BґΩsANoa0{FS$N<ϛ6Q<,ϧb&ip Yp5:"LH_ӪdщXɹj~izDk8une&i'9WNZr_n)UD6IGCcx:|txwO$ǜLyHu5"O&Bi9Gd?FbǾ x<|̬TZ$>y8M<"^IzHүafVqEACT=CS\^%wq뉪L490? 5ZwFkDmX9&Y)چ&zV;pMD8a&ȗC:gxcVknϹ|ň=&{Ce,lD<:HGu02"*>UHZ8X<"L&@'=q_D,Vd33{}X5&pπ}ujf?Kb}3mT/)sbfVAc"ADҖɩsXx '4zE.קByu^yX7"NGl79DZ4fk\{'[bdt_:{['\_N.pړtKOr9 |I)Nαtӈ8su~s:dY<|jV9\ \dfIȊٷ!+np+ہ;ƾ\?!{*$:Քi{;-"JN$ ,:{D&uIk+bVj{R#I?Iì` uq5dlɱ|= ,ck/"AIҞr,SdV G/sgl ('XoffCh/lBJSļ \ \ Jc$-LVԾ%0[8fz}75I5q5{'$iU,8dgM$]L@̪ub!JUSVk:YqFMwkI;ԩe{lc#iMy:J434.""<ؒ4YA^иA5c\yo~/"͹#iV`nfyG6YRn2>^N~SW#NmV7ogukۓI$pfZ7WM$~6utT3_rf4`Y>`爸>u4 p f,f!(FOy7Vy/H -n݄'!% ecQ1bX XU$GﳷFr9ך5ɁZE:c\f5>p2݈x-u3kIMB1~au,`Y 2ppx%M \,_y-69S*Nv_s.!x5S߉7gIuxދ1KM3,u~_X:)?m9|Nt)8N vAN m;<Ċ۱lkA ~< C}{5\nKuCbYHWҹUm8+ Suu3sF~h$uڿ߁EO\/`fm;X'ipp8.npSV/ݧ4KifIs4.p&N$i6=x7߬'%-iR N@YZV_K& V33/IaiG2kO7I,u37It(p?Q'24 ܭqZ0ȱt+m2{X&6kE?pH'=SG%( Iv^Z3#s>l$}Fdr,)$-:Տᒾ< NGK=uǁcRg1kӕ:DDj: <*8XDuz!"lMp fZ89Sہ-ĬזJiDf$+9eKoc=NYO M(;t,e"ޤOp & |pVD<"G߁9E`riȦqtap툸ff#iMlKͯ&.INn;ȤC2 a yUm|wQ4Ӂ'qA:خnӓv _UmMsOH T ΡE$S\E)߁p_<8o=̡=EUOUm7+$ܔ@u8X?m'<xMwW: TCj~:w3P?g>ϗRUvi! CH UMKۥ->RUd$ypH9fI]I.v.l;n24̈́,no VkqPU>\RUk;ĤH.mТ}]iƚ$ˀ0WՑUЖ3%ɡAt U%ٝ8fGoUc n8cw'c3z a,qTUVi;9UUBx;?m;m<({ivt)M$y~~i \t|f1đInj;fI EIHrua42ogݻ%5v 2mТdYE+_OpC]hlDSݪMU=P;͡Vj9}er_~^UVUΤY1pbUptSgUx <1$iu~o%%V>K+vIs]#C;.XI~ <IJriat '}(I%`$_o;FvDRw0@IBqmgѢ%#ft]n—h fa7z_Um5.)I YOQ4۞UU=e7;\\UYvEdMS{uY$Sm['xA4zUg91ب&5cߵEmX.5]zmgzc1xeg[Njf9DvYUVrd޳pbUݻ9mUN.L UuhU:sF߰jeS]U{ #|7.i{\$m4^viLxyȒ ;7k)MIvKrBہ)wശ,$WFsKrT-Ǒ,~dFy:ͽtII&QKGk;w1 ܵ%98SXUb+i g5_uqbfTUwUUY8fcGUuxUYT\U-\@;+M9tyfT;kӪnݞz^FUm1tptIU6BZRƕzHcd׫4$-OHx7i@4 /h;˄: xhG$ea4?iw;&cImԺmTIΣiyeQ4fk!]j [sCUvoUxh#M~_V>U?Dӵ9JUկ?UuPU\U/˻voyvP<)UY%Yv $JrDbm? IDATh%|fCi|f͒3ɕmر4j;bԩ|261P^-]{v@a:vG^1ӋUͅQ{{U51_~71ﮪnvo49˗1 {<}mIZLvIOFhU CnvR<8<o6M$vO^_!ZSY4#ޛ䆶i|u|.S ~Aˋ4Y,UG$j=W.t: ,[_IC,VK+Hr=OMU41wU]A\Fܨ60T2Ƕ:s,>^UTE]<>$Mǧ^Vg~I3K`;YJEfym2w肖{h 4{wI$h9XKe}@|40I&~$pÀShϤOˁMdS|Hc%xEi>JZRISUm?pӓ||1ױ+lO:"W, _OKH U6M7۶EZ`BӴcmQjK~Z-YL~G=Uiov.-)6984Uu;&ui.tj"QSVTU R׬q76ߏ3UiiM}9s3=V_[W.y Iml+h ۿ亖hKMhCrAIe%4 1&%[%8Uaϳ]l3PUAm I<|FUHK\X07[$9,4N:|^kh~ /ݛNמh ȃ/\>|% ZUxn94éW&t5&aн>Isg: QPU01tL_Ÿ<1Vy4L-$-:U7pMqn)L`}͝9`m_?q"W4?0&WU8 2nYT>SBXTU W߳םϷ77ɕ-gѐU4+7g4K9lMC0U]`*qǏ-n­j(YIIriZUM:*+>.g Z4jmgѴ_.<..tc4NshVs2֧ͪ~$a\IZi~Fؖf֗?Z יi~icٔoik@R: > <,XFscd['Z[Cm-ӷ!vє\J`-8Uu"=b_lS7FDL=7.ߓ4^ xv F\l:Y6dw_߮;z4 6-fc̿H$W h~IV lrފ/Z2 ܥ.Uա4E3fn4Vq|-N-t\:btv-f;wz`$?%nWєI%I$I#477X5S?`IcVؚ,s߭ULpdm: Ke龼zL^,օg%`Bi,9Æ4y\;󙞻bKtj``O6#r-jrTK]h[&qxZV^UHt$퀪z.ǿi948] l)I$Ih+˔j!EDž40-d$MZ[7sKZ ۟+׋fxu$i2Tժ.ǎzj)./uy6 nwi%{cׯE'~(!$ibTrWh-Y#\~~e-ĕƖߓRMiI렪"WSUߦ4ap$4$I$I$I$I$MqJjMx:4śR?V ~\Uu:uk1|ڮq.D|U8FU|V%I$I$I$I$i]NA= 6ɯfi(R1qI8uCg: .s'ٿ1z7sмo춃H$I$I$I$I$]AU|ӿsa=/:;4\\ \lICE[NN\U `|pL?pPmgT!I$I$I$I$IwUUzߒ3+t޶%g$v@U4531MVI~vI$I$I$I$I4K 4+C^oUgp9$: 0f{OX̪mXm$I$I$I$IIdԣ$NM1π78<ͷ-5i vi/I$I$I$I$IjQKEULEW%xW<9$I3U`$' hPUc$ٱ$I$I$I$I4I.!I7{<}mnl943: 9)4tߡءi;$I$I$I$I$M ܥ@Ϯmf; tQh;ƮNrw`]Q߶Jj.8b㍻-u17Wjm$I$I$I$IIaԧ$?>Kû;{c[$N_}׶Nck=GnXko3\Z.|Ԋjs*m[ XUo< X{7I4ہUj#I5MC2tsWK[[$I$I$I$IƚTj9f$bՁ188o>YU/l'҂$OĪZf'>u.-dUWhڇ¼$I$I$I$I4,p [$6N6cqp# Il3XIrCUժ}&; :S,,YmGE@Gx;'ш$I$I$I$If4$ؿ6c|Nb<7wSۍԪIAZUk l89+^rټ*1Ϊe%#,ᜒ$I$I$I$I4,p|!.t^Ju-giӍjXTU)v5t+LCz,%`N$|$I$I$I$I4FTZ>|*L }7nEYixX$&8faÚWzmIt+6$I$I$I$I4. YU|a^]W49M̎WVgthՁtv(_$1mUFF83$I$I$I$I$ilY.@Uإ!NrN os}Or@Ux49W$lT!WTU pL<#v$Ǐp>I$I$I$I$IKK#PU;'9w<|s8Xy՞$yt/Th? Xo˧Lr#ή}WbGj7z[bTF494 |$I$I$I$I4@Z |aVUOǜns^gÙ^H4ɉI^xp^퀓;Z$%yq- \nrZAUUU,Uk= ̀Wh.I$I$I$I$I[vpFaly,}̩vmXU+/.H jU`'[hA4ɹmX Iz߫찱0u\/#K$I$I$I$IƒܥI 3}y>U{I%TZ>$!<}MZ\`qܪ4]U]-&JsՁ;Q$I$I$I$I$IӰ4BU)[`>=IEbʯtx+p$z9 A#lHj7,rnYUx6Hr<MI4$I$I$I$I$iX.XUxNÜly̻6c>}= NlܷذD#6VKeOƙ6.pXL\SڶӝNc4l7_$I$I$I$I4jK#VUnPKy}`>w'9mU?"`VRIj;(Tβ@kobiL5('I$I$I$I$Ica]J%MuU4݃W|"Ix瑧ٿv 'VU]Uo~nq{湍{UU}fֶG4$I$I$I$I$ ;K-_s -\6|ϹݡIf\h8/WwV'%s,Ux&-YHOC@=as(` `p)cx$I$I$I$I$M ܥT#o`O'yJ xgG/KrLT4FI6<vv֝r^I< 5}h߯8 PUΝ|V6尯$y|"Or}K$I$I$I$ID]jQU}xzB/s%1`qyI6A"#i:6c$?렪*` ?gްj;Oj9Bs9$j;ȸ{s}]2ޞ43yXM9qXQ IDATq$I$I$I$I$M ܥu:Xϡ.Lr<_ 8غ'C뮾\Um9n>9f1ukuh >/װU-p O?4xӼ`$׬p|? nG=/I$I$I$I$IcI,w `0?h_< oN[Ir&=>NVU;W߀bqt~H .W|d~39'cU8_$I$I$I$IƞܥN SU+O3êpFm |8^5e.B>=\h$I$I$I$I$iѱ]Z@\ n@=1W($;^<okڴqFm~RU;E-,9y8F{z,m鿸ǥcxʓ߷e x5plUvԱ$,őU~J$I$I$I$Iر]Z|u@=x^9J: p']UI.|,#HW'o;]sKz{}ϕ$I$I$I$Icp~@c6Nc&Id`k[Ck|i;H7\<x8vgU$fS{gÁx^U^$I$I$I$Iqb@%9x瀆[hU5(eλ1cs88YTUvn6AO3dGT'jͶh~MI^GT՝_$I$I$I$IƁkgEdeYnUSpܐ7K#mVӀO.h9ΰ=8v ՙYq[lU< $I$I$I$I`Y.-`I^1!PU[B?eEWO*x}vnuu-G-jhhR$3p7A$I$I$I$Ij$-TUU4p S+{/y x׈U##UMKC`gmg#O^Um;$&y.x#I$I$I$I$IHT3H8zN`@9q$?;Lz]vY% (D@((DN3" "AEr$Q@$$HHΰe[.˄[]3y{骮:6nwFSu'I3םKX="^;|6FdfffffffffffffffffV)wp7B(ی!'N+-}\31pCw8wJ݉$"^έ9npkPŬOqVq̬j.p7^g"f'g̣Q?..VWJ[NfB~Dx|Ĝ-^w"Η4t̪^j6pI8=c1qsyLG*8c.p)IDUw"=)^ GԝK|/";lӏ̬*.p7bE7[%2}jDd.͘`Dz#iux uGDću'cKҵJ >}h ̬c ;3+/ +U)19Xn+::w#Hh>!Kd4DIVY\n"i(i&|994dzoGN2un[;٧DC >} |ITYvJ ͬIx2cا"&X*c֘Eċu'I{jN\l֝uI|!'Edfffffffffffffffff; Eaޙ~]cnɜ5fYNIKԝHo"ÈXWt{%DDĻ.M J҆Ucfffffffffffffffff c3\M<^u'җXUs:njOΖ4KX爈K+r,'ED9Y&  E`dD3/d9?: ^f>NgN'i.>`,^t733333333333333333Xn6D/^Μ5g?RF _kOF*fk5J:X`XD<ĐI$:; 0ws "`GdsVI8 ^ݹtn.A$,R_>`&VY\n6IZ45 lLĸ5"JLzΥ\ oԛ&!`^=`Lj8¹V.obqeE)Y &"GǬ &VFFĨS23ksEucffff֩\n6@I-kWFM1p8e\oEf~l Lw#ʲ@D9wexxH*~6pSD|\[xc4"pxD<\QJffffffffD# M6#Y72 }xGU"ɺ23kɀ݀-9olgזYsUt=s# XA>łq4 'i``ψ8Z&Ek="h$ ?KKhnwIEo̪Wz ~XW`x/O9)"ncJffM48w= 5"kkbfffff]`H Y5m (ϵS_"ⅈ؍.DI*ʱ4I#qq{tԝsk 8ة bʃ6pV̺%3=,>֭%vrz/nXMi5Mj鹸``%effffE\n6sijfyXؚCO7$" 88[GTc+;Al5?4m gzFy8Pcv23333333'i Iw/ge6.i` WYs$/j `|̺ ݀3\ص;gj`[ ؾFs.t_yؒIN`Jz}#iٺv:^~cIkU0%#;13333333<"KH~_(%$M"i{RӦ '-03$ Pf\D RA%}8=|) xŐ_D |S%/7Ҟ;I0nّ/tIs0" [bi̝'iIg4LڰYG4H{f/lIP, x̬l?g; peDĕ2QHZ'Fij= Gik&]Gu'a@KrI֝LG㩀 %Us4phr{ffffffff54c)/]>jN Ű.p7ZHZҎ{kffff6l؎n%@D,NBcXүx(tw l,pb9g-iɺbg =aD<9ZYdffffffffH"ے"mGv [ǐ4ǁMI7ZqD̬a*<bH@Qwf&v#` fn̒pyD̠`y{yH݀T^CKoՕ}`D;{`x"CK ?2"v͙LT6x sLHZ1δ%U6FfZD\9YswX1gHJxXhX{[Gj [#b3``WR9fϰFQgHn݉t#`KeV1"i$ p84~qw% \MuUFТc/nxfffff]I_&um D" ;n4(Qb!Ј0oZr Zݹا| l;n"iiAIOP '7`وW=IWT_g+ìG6jTY0 B\TFafffful)$={HZ ŇuZOiP ] eGĘN(n7onX8ENu'M"#>2%EEPbpbIϜjR4h׎nfU#jfffff]f!}cN4y"Z`3[L4g$7IVD,\S^Үu'eN^V1iD] \Tt33333333|Fi[-7i:Y%$,ئm`̡7Z $i6`ʖ^NܚVԝ}e`xDo+9|4rDܐ/#33333333e`yw^լV66ֈX*sL3OHiwqMU̬kl*pUϊs)pZXs'DĨiH>0/u6IC;KxX4"ʗ%iz`= 31B"of {SD_XffE`҂aÏ8l ̺PD\ YA$#PD\#13IIJzK"A`IsO /,"F[cJTd23333333"8IɲbeFą ?Ž̬_tDlC/v2 zb43 x'H!Sm2ŲTz _݁BD<, \+{ԝ-"nk!W?z1Yu"ňX889 ̲[ w3kx2"$b2z%3#"^v 9E+9b٧L T~YN6:pvݹ'պ~ C:ffffffffֻcJs'Xwƒ]nfm3333>? TjHDN7vSܕS,i~ja0"If>뾒|ԺC%ǹ뱙uZw3333&t,psqW&uao|Ѳ]K5;Daua@z^Du'bZ 3L4R23333333 D%Pκͣ%ǹu?28"|63333 S""*[ Nϐ5geIJ`_?u'a; ב]-ƘPҰ gTb;[y8Y"q]nffff gD8]R˺,\-6I߮;"b4pjӼM*U</$M]wֻؚ/.rBffffffff֓2.nD1N IDATq:ŕ%mffff Yo RZ `1/$՝p]о&"~ ¹~x9ru8:C-$8C33333333Kqw6ewv#$3/w3333^z?HR8Zppo#OIQcqiD?vu+v."V"bw`ULyNb4fsu213333333q\ t .p7Nrqމ̬.p7^EmQ67$*3gb֒HYcUw /E"yݯ'&`mlWEЈx)C(gIZ$C,33333333K4q7X,\jf⥒|63333 ͬ?OVwMIH\(IMqγ2IHMybb7{_Q $MSwNҌUŏKK2 Y223333333ron;YpYf.p7>E(TsA7EA,lzM8[Yu&u&4*NtP31z(vx+KZx5:&;`()+c' qf&0yXffffffff zf)\nffff ͬ_7:xu},8,$])i6̷jHفEkRIK:@Ҟ!lk$sftUDij^} ffffffff-+S֎kfffVJ 1̬.:2F SA_J<|Xfr&p_Q]baĦU?%}H.Uq^3yg&ߵ}se$"n-L2}̬(,#_27z`Ljxءޏ.yY~#$] i ,YAܾ|KҾ DH=NMT|] sm)֏$0S,3333333rffffffffp5,"#iDD\ ,.i&c\PA^VHPҗ_פm%PDskgȯS(if{6uE @΢c%}#c<3333333Lu̬)qpU#}޼?]1\]f.ti2&좈)%h|JDK#b"%Y2u'$̜Eĥə .4oxffffffff; \>ffV˙c(iX3"ifpDx*sNVM%m#1)"$u([fLG9FĽpc5ZUDD+hX#3-h13333333LlrY/|̚/se?JƸ0_:FD q JZ07p%e)H[#b99b#0e&QFL!.4qxffffffff; \>ffVJD8!sKz /ȖaaI4cq#p_Ik  }|Dkˆ 80c033333334?33w3333^bwࡌ͔CfCv)SOKgέK%+i#bLD|wjPɑ[?&4u" m`֌6WxffffffffYgff\nffff _2"]`C࣌aV|(c.VwIZ6&pxZ=R7s""QM)"ΏづsևRG0">6&"_JZ7c<3333333L̺kvze3kID9!e:w.Țm~zIKE[V]ΐt/ oEľ<4q,7-?KƐΔHƘffffffffQw$̬xmfff]OҤt%-WwN60r8 {x[{3B\3|_҉fif`DXx&pqb72WЈx>"#u!sL0)`\b[E"T༌!'"i֌1R`̬xmfff]M?}-m$Zkb6 ZcM72_%siuH:LRÅqp_Uɕ0tbw$+pD|8*ipo\zDz["343333333HYsuÁ{N_2,"i`!g~Rr3)'𸤽%MȠxX ZZҽ4ՀjDlӾ.  l D9`4@qmVY"`zMp$}Vt.333|>^Y*ynˏgkg.60̲s2C%1LSIھNok:NZ VX>+ s`uVaqm<P0i׎ lpw3333333(N)C$Mܮ|l`-3mL&!mcҔu'vj<(i[I8ɕ4# |VEC" {yp`k ```V-ĴϚ!a^:I ".~3&iQVcukff$mfffP*KpMHZ!sL3333333nfff ̬HZضNRq*6▙e769jRA >ӓ?-Ism̭,im|"8[y專xMs vC*r?GRձ1؀|v .̬[l`su I3g9 ܭ%efUDء.I큇$] i ;|8 xRޒ)$"݁YWo VQl{B!9'W3\&iڌ1̺Uw˙u혙YW4 q'fV;FL!4}c.4u![%=QtuVqED< \Sk|8xFұ-$"> #bu`6`_> 2y xD)#"ǻHZ-|w \Tv33333336/J333'ip6h\n--3LD<)Ԥbf\4 _**I՚Uk&#?(ϒ/("G[zvDZ&iƜEi9c'fifffffffm6pYw1̺ZMqDLE:B^t ntk2m-c```,̀/N༈(G@IKK~S+S. )"^1#ic>r5Zd<,:iUffffffff]Ank}͚6"^˝Y$ffffH8e#ch ٠8CH˥s1.p›"ޞ I\b=WYN[ |7UI+l% ̑+.p#Œ1̺Ř ̬;m4=ඈkI8p׈YKԝ |*RR6ld>mYQI[I'DhDFR"v<(<#(Is՝GD<<~)iH*%cXgJZ4cL3333333nQ̺ I_t. ZI'Ԝ bJ: 8+.p(uf~ *9K}u`+ofz系3<<]<.ʱ?ER ?_|a>t< i2H( ۶ڝHWaYEHM2sj硗}EU畓yfwrD! B.p74?-H>FFc 9_8=!_ȉJrEN7sD@|7$MJ)k{/xxϓuũH7)&Lt~9ocL0Ha/Hr5R܈LK&vfwyplDsq7!:2؊BuHw xlBZFN9DҒ-M )"ΜC￿2433333H[OKQ>1v+RbEAԌV{ s雸G9 =TޗIݳ-ytuqSj?m|FD3+'O Kd$cGI 5P+YrFDБ]$m_beoK:뤛68CNiw{GcMؕQ]U^ȬGz҃C洽8Z+"w4%9K퍆fOc @n,v~YRBTmXgeRn΢WHon,7cH]$M AjJjG-?X<_"{b]ql^eoNRs>+"Oܯ}U`#R9#Rн.5XAG'tlq0ҹHo;_gZg~黤3c?Gģc&i-BΥIF5u'aq]qv%>Mh9g"mv=VwH).yEomUIw񷺓IƷzX8MGIǑi8"sL33333AOҺfO*xqE==(6{}X$u53#bf(dC*yO &ĸ _'7{.Evz)FGI 8Іo@*&AIN#u T4:s|kRѠ@RqRN.g;MV`vvÖ>pvkYN*Bݪ?"u m䈸(gMz yBn_ ieqeeK=zҽk8o(k $W{K7[\t؂<xy|?f**i `N99vh"ږ́mhq1+![⊴Qn2~ V"ISsLN5./SGkUO&v"wҤ큈h9Zq>9>&uݯ [(p&"^ϝOH6/xݹw z/HXDCsC[6,If̡?m3v*jVqrs I;SؑeOBs'V]ewV9?Eċ5+I_%-nĥTMB;'vFߏkI;γQ,kn^of],"'}k՗]|I']֥I& I{4: "^Iݐn VS%P`L&( 'mؿ3433333[COI7f8lws2S֔HI#u \k{,^4Tfäi_q;Ò]WDP$M'Z2-n޺%>ei3XD \3f>hdF:ǪR݁^d=Iw:`aRڇ$m+;I$-ݕEߓgLI3H:pg[bkޢWGI|q;+5I7Soq; 4R҅h?3!&sR$M%RVuC@Q$M"RFV(52ǬN!gN=ա+ W֝UfVrg& I70-k,Gqq)ez 9"fI7]!m+҉˻tQDKϠ&4=)Iwf&#)b5I[21p2433333֦Xz0pX݈Tc捈;zvb{/OzM؏̅):I_EgݯJw2]Xs+[vE0whvRڢ52IBu3H*o`s _%m]Gu'~/F8Nҟ%M_s.HXT{7B-'i~AIkaf4k_O4HEҙOL݉4C|H;NZ] r/F): IDAT$i=!`sTa"Ģfa; ^']04i7ҍVLsMor dM[DR՗)}% -y9"n"bXXtQ ryeD):ղ]^&6wI4So:tCQgUlM*\,ɘY""KjLu"FDĘ50k`tFDW4hID<ۓ;^m5fn#u9"&ˤ#?mBt=)ᒶ$MBI +nYw"cIi[3m~⣜'H:q.+Uo{"b*&#bb(/:;T7ZmqA`t39pg[N, ISK8J4h&jI蕉E/ZT,`܆tu=V+P~ҢV{N9GҙxsI1$M/xR 79pvhIZ{¼K~'!-> $MZtʂ^"g`&?i|rTpαStg?Plg50߶ֺW5#)iCEIwFD ́]hOgI?^++`lYU ҅S#HfV, 95X&"lP0pEl 88?"Z"_ ,! lwY/:nF.{_$-"8#"^ ) ];ɡWc\f$n'uAƤM$`.'o!5R(Tţv88Yvq MR ˁ"#C-P<V&OىM8=9=骚g<aOǶ3Iz؈x:CHcHǛ geǸbR8 ":]{o!"^ΝONŮ❺]A'(}?E3k{kBDĉ&S¹r_ю=*~'}&؈ay:@tK3oEĘ"H;y8yMg4nұ2Ɉxs05ZϚs ۱>%^ߙ`E#2Q]*'iE醞5])Y\nfA^`xrDxq pi軤D==Y63VC*ܽGIKlH8N!lKk??hbܭ | f {#oU\8i9HŻFĝG9n=ƒCH7}[.+p{IE7F7΄V o"]s|QÄ$mD, NlNݬ{I׶ [qKq}!`Q]ӈ(p/ /"&؀;?2"i1FBHǰܻb!u<Dn."-*w)IK71,H oQR_E;GQ⴬#"iwyh+^%-y(ҽYY K0W_WlO*KCZ-TTת'3KZ[כI "3\[#hx',"N; v~k%hM:?ܘt> &!EsD[>OEۄgo?Py& 2TQ)C%C*"dH2we* 3e/^{gRX6|viTEE{+;/Vp[Iʡ]3q]"=Ss%IyrÛHEnwicζ)6-1zM]B! (O⽑I;;c!PyoۻeH ݼ!}SjYM6%ۻJ1 O+pkӚ6A`ׇK8_=&sw(v&mԬҦkHv'L<>y*ԗum0( 6#.&{3<0WMt61a1^!B!޺L!XAI[T (oN5$$]]_VZ87"XY1T#E@ Us9xGI whbI Zu.{31 ;9cOdXr\Ŭ#M؝B׀OgF"m SnuHqg4$M@nͤ,l"+*yX9r*Blv[ Lس7>OQe:^>k1$i`5[HW2Y{HV!H߃wg]sm+ !6T7S峱S^#9^!d|mk2I[\7> ,jH ǟT aKސRL#{S~w(,sxo- (p!tI&2~M[8ގ ?n%uv'zvDbC_3Zx1> } PI叶dtE w#tENz岓v,B!Bhk+ⴤ(пXBڮZ$_%He8fu3篴&e`vW!i=Rq~]&ug=ՇEz%qHu|xl?Oq`Q`U`5;f)V MiY %-\OhesL$- \+^ !}F=0?$NKz?,L}V{h$({n۹d!#{/*iwqQp:vNJ_ v2ݽv(u*ԡdI7kqK'iJl7^SB!Ba`H\!i!RزE0cJm49Z?SGm?]_VC+6 D~`Y a\FWhL**%pNՂx(ܾm6 liSzI'9;v]¤"Ra5n'b{F/T ۧ'7IO{}w?3]/g%soИ v;eun Q9;a('-MRg6I6}B\;!iҦv7Np{Cސ$qL!OQXt 霩[~JQP$mHI#yT~@?(71bbg^7CRalcY034~#/s,OEgz|HjY8`>eUJ<mߕ30xZ-h !mT>)p\zDN~HkBXԩ,oKt ]"&ݒ.yZY ͢KCml6 _w)KZ4SB!B'f\0YuZmNGwHEQU4,LqV}cWd =Wx}EҪF_ةvۏ"C$^u2b3zٹ |03L)}7 N͑K k;v]i46<xBE$U uvn-w_2P#_ u}5-6?"MXT+uؾ Xj3mѿ$Mk]>:wq;@1gh^ uP7ۗ'5j;SWh:[Ti>+9<Lrrmh{o` ռ7), C]]T8mL]%Z7pn J`{)\M}b,X!B!2іJerRҦmv纒Iѵ݆"W۾|P͐G+r_L|HV'5e#I eh狤+@oBY,ngF)NRS5?~aIJ&VfZ3ںvDgS}Ԏ9riXG ܋SHn'~X<Ń{i<ϑ< mj:`%ڛ&5/K(cF_W Ϟ jU|wԱ)MҤާ XeHx`qksa# iS?(6Been;s_$YB/6[I1oSbTK30=еT q̣Ivp D.7Iݛ6%=tzic7BיTlK=1@+j6^;+rTLB!B!E*Y(lگH4cm)ǷZrԙGM#a\@{5JCbm?)QE_rusTiO`6^ya)ΪO|X:FՂEHSkW4lBVPg.C) ls3M^IY2iN; 3Nk"oۊMu+9:MC}?du랂4wc Xۿ$5^;!s;H(QG圜p-Fܐ͝*}T#Ӕ߭|ja{lMjdzuClh{&6g)TX-p/_^dasB(M҉T{ht<4OH7&pA$~ pG u6`sN>C*$Ml?dH7.Fo`:XEd%B^ B!Bg$=Bml)IةG|Z!iO`_KjLgHńX 0ƺ{ITR^U&HҗH Ḑ&~ |=SOEUO޽%`V]W "R2~a9I+q2]K)>bg-lW9*I#}gmN?`n/˪boھ2CJ-*0e~ s:-) C|܎ہO7y6I됧eϐϾ%]4KToV8ު)ֈN7fw9+$8`n.xpF'I c;n:IqU<|8 5igMb"5oDmE7v]w2{lTyXn~@NtzYG],{rkbOwrfC7H]OnK%O6@.I:AG:P?+Fp#DpmDqs~B!B{8iԉf{ٲhQw}[:Q^؎!6] U?H C-:b8` L!.ςhX^ؾ dbd9RN-Ig7 ]ܧ{#)&@qdInBMstBnfkB'jG "Mjd<7#SMv$u/KNUԩvx;2ڲ {WXXLwk՚T߳cV's2,n}&TI/uaEqOo!|u~۾t /2lk;(aSmoe{q ݀H0430/yMN!|3%-k5}<&ōF~2^}fGB! ؇jmښ}/lz1I˒IbVw]M?G2'iCw2ś؛%םtP_fj`cmu`.g 9HZ WC:#c&9ঢ+|~&Yk-im+k`6׼LS 9YK?2ݬ#EK,=mhko@2ǛX)s/p/&QeC3X=CVTy<\UltyPw`EdlTPl48Bn(ҟ)N&(yxQԤȷw* TʿG1J) gT1C\B5QBϠ Ȇ\}u]H'En!uE&F.WtپI&Ms֚@;S;YՒp('miR Rn|p~*iόB!BaDzKPdpW[IetX%jE~$ V/ɜΈ$:{xoYv:A] Z m{& mF"%vc5ĬmBUX|ueZx+53yJp3:Q9>Mt9W' 1ZQjOdˤ#S$9o$KD28ڮ;}pcLN IDAT1%wl5|bݣ%_Ӆ@U~V˖E=& C_+?^ҬU}I]g ۻ^ NX!~loL*L?xh,1bP.t&BOd;g)!##C!BWB6i +Q LN9,F֮l6bQ5'₝2J-{lcL>M=ߥu}%CM2زם`{=UZ׎59w%\WB!F+Jl?M\Ux\x\*:Эc*mn]Tg[Fx亲?ߵ}=i^MC:QB)_֡L8]݇M'8VX Ϸ1 T0VmaSg'Pta,(Ăem]@?%m")xex`a~>sI]r>C3 !B!Avk|(>nOR}:r҂Z|A=NnfپbJzO|z)x" ܫϷ KPMuGiGq /Gx pz w@ qsjzJ%ֽ \9~M)JpdFQ w9b,ہs>^6[+mu/| \ 䮟84s-p]P?\Bϱ FQًUme4bdηq}9~f%]K󹼣7l?dۛW#u"8oW}mfOm~۷*^UmI*8x\(pp%MU_[3K|յ;B!B_~Z!H 1TH~D>K~Yg.t$iB_biUŝHK"(p@4gK.MҤ֐th.o{ JvF2iz-,ם$Ez~RF%#*Rÿ ~6nDҊfT2n-w .=kM*[8ۍwF;]K4m[%iIg0zfo78MVz 6x?I g$ʼn78^- IQ_j;\1e尉uMcm_l{sRqʤ312ZHQkٞ4I9CIzo ʻwفt6:9 8B! mb 3{G~LQ}.]r9sO’vWRV@Άkخ{<ྊ1fʑHZĚlW`9f|+ Wtṡ9Xn㶢js%Ҋe_4SCQ$&(aLҴ\N]t+p/ Yr9sbiBv?Cؘ]=Lt-t,pPc|mJ$]C~27({IWf^Ѥ}*.ʆ,\r Y0f%Mz-v6HT2tp7xt`չ:u琡"I-"0^Zۗ՝0>NvOR9w$W2Gl/`{{7d)R!D/u1Cn=B.1\ܻc:#}'Jrmm{Ķ݊?KpŶ=Tۑ=) at,7{l' ZCXMْv TtA:jr8+J1A!B!w۵ڥΨm|(k%ޛ[Fѐʴw5c4 $TLus"C3^hhюHNt(p*|JK[R]r ϷlbǨ=+4>E1m_UW-=T'=oZxocMiK6fllLe zASu;sUXZ1]WBXE[/ ;gdtpo_p߭sIJƮwͿÀ/3m?5QBXa0,F*HlZ}\朆3`C`)gHZN.(-A"{2n)VI;>LۏJi T修o!&!p s^SӱB=1%V!B!P WH py|6uvQ]ZokCZ+h=hI3ᾍ_D^3ہ _]up/T)pչW-pT.*4 Hq U9 q^eX E|nн'>W9HT..` fMupt%N([;w-Hz_ߟ3Tڦ;WݤR1$ $o.Z5Ƒ_\XԴPܴsN! Hv:"#SHTt"M=_+.'ux a4FRQo")׃YH4UOz{!hØ4IFSt ilo>\.)gB!BU/'ileڴ\]ܷouf:^U"N^Wp1 0Elb)n-pځ2(ij|E'j|OI;)`=` PKq; M-k&Z>m5[x酶m]=I-ntεjv)s=k_+rIahrMM|6L)8RÍp9۟N'M2k7 xgH7Bʌ(8MyZQ{q4V~Uw%^cߪ֩"֤9l"9>l N;}sJҍISRα!It.ir4sN B!B}#pnY:K YPWv*p /v^+oLCyt+]0wdk{VNyUU|ؤbNj40mϓ'U&o_=ݝ ٤{םV>tr1p'k}^l5U^zcr┞NU9 ؜T˝:loh7xyQVC}I]$JSOVIt"O_lgJ:UR雌߰}!P$&ibVe=޶j{^(앁g:~}@6{=Kavg+Z>\]erB!B! (aUIȐÆGyEز¦,v[|>K h , n{sI\n]ZjЊ$Fq^5|j Ů)9@ӒiyIvFsrN_ /i{/7ۮ Bwȷ١)U%J wZm/d{%{B:QBK 閱er35q.19ps;*ۯIO?vɷH:!- E6uISfؾ폐6U, lGO]H}oBgu|AO`!B!Sl8BV: `Sۯq-;%R -//ste|?i{O7a\?ߋzA>Mq?vt1xҴ~BQ[S+NQÎhWU'Gk>vnW {{-{7o6҉'_fۇwr 5a`ś?vCIS$5uRA+𛸱 IcEojNRIV6n `1BЏK:^j;BSbT¤o_~ BˏWJi$BkO}We{M:sElk{~(pGwFtp-}M X foKoB*_b4YЃf}rI5l_|tM?QRu|w\tst+H:Pҧn%/ $ uFf1/}B!BI%;eL/mןkwһsΨ>uE/ylom{Wk:f7Sp/{ĚA&d,S]o/[ OPda! !6D4~\h,w4s$^oxW*MT,Y (p-}u}\|4lqۻ۾!sBvQBkBYۮu$9<бt"ɉC-Eg{w(:ޣs<%\IJZc[m _m,_+%-UKa$?tWKd !B!Sw_]fGw3%֞es3z8 ؄ )6 ~k͞E}I oG`{-ێۗŏ=pѽ}^z=N rVfSl?9dќ*˪2i' ܛۗ!/>vC0B{F]ޒV˙P1B#JzR҅v^S+ 8TR{ۗkkn2ScΖSIHZLR^_ H5N4gl9 (YtQf&(x{ ż}\Z,m !~ɵӌWIqIc&E ^=6CnmR^irtX;^tp/g2z:-:u ٞwm_dgVoQVCoI]5 IΜPCf uexFҝNIKqC9:C:UV^X&s¬Hxn^b3)i)Ir IH4aa6.6iRޥCzϜ-iN'B!B=`?`nx̣foۣMl~_[7ԅEe9:]gQNfϢcf̕π6pO8 3A+YpjS=mߓ%0v} kzLhsml޾S:ChUSB:V(Bl;+n:cGe I7j)÷MH/ih"uܗ|~-p}df(Vɕ˗65I E J ؉:k^"t$g,لJ$MkW-YVEU>pe\&a`ś?00Hڵ pJQ[3k>F/{ppQd/d3pF<{=kGW&uG[84f , Fz01I7~_UH9'4p%-9vx).́1t"!B!Rju5{љl6F"'6BNQl/;K;|\ <]qWd1x پjEa;IJf;%x^)pLWT^RvM(_>&kUT0ϥ5+j|7a~T^Q)FP1ĢTe}ג:pxƐ'HZ%c!~&5 IDATuzcweH2~Yt ~;5mEzIt"!B!Ѝ?g}!i> 1lMM,9$I_i!΋WV7 Esx,p'Ml Wn{mGbOFp@\+&8*ϐ+O`n`x߳gZW5sN(Qپ5mD|$-r4m3gbŒd g{m``&%&CIw:~cc~wQIKדR!B!J~>-)S']I {{ڃcm?[MxAXF{^nQ?בHHS.C{c'GTϏI .~ C2#kh 1)\w;f2XgZ`KIzO8apjoHB% 8Uk>F2;;Jd6v,(ϒ4K.k]A?!B2?l{QS@`FrI< !B!b5` !"#hag8o(0{*`׉ŀVi\Mqg 1QBd"v hZ2 9;l.i qW ^ cb0 sS<Z!P1ƼbZ*pxb/Iz_dPѹY< X3&{UMn&0^ ׫oBaS=z/p6[}%-iN'5}EIGދM]4IIڼxe{e`cAp?HZ ?m_31n#uoǔi̘[!B!H˘~F/ڭޖv4#I!Vtr躸^tRfQ_eGՑK+ՋTʐˠia"ų* 67$-Akg{ڮY 6# wۯWU 3 =)QҴ2$Is&q5Zq~ 1hj3\n).t(p! b\z?>JgJl8} '$!hI0vEA"6t;eʫ0)"!II>t#lwF~p T1*ߵ e$MY9B!BWsI$m |a5پ1IU,bOȫ5wJzbIK)W48196Mkb}-VEl*j`tHL1-hr3\N}]Ҕ_tWwwBn\+Iel QW"uX<I]ͿlF궲.|uOqf$ 8xDңΓUJ-i2I u+=i}FI t:'i|/~dIߖ I_IY:k?B uJ']395pnŽmx!1iOH7Þ$]%\I'I:TҞ~ i7IKM23tJZӉ@"i$3k,wbc$m!V!B!,#8J#y8پy})` qEgyJ"IjcA+^cۤ#9L&+()+ 4e 8 Xמ` R0iB?4Ĝо zQ봤)Jݨ[H[h8;4um$͟!N-; % A:oo{?$qWB{sg#ϲ$%yn>P9H%>! gI:PdN?734yxln8N~љ.B!0l_[S7HS鲱8pRΘvkϦڨo/IZH,;ܭJnX0}/p@}isQRnx>sG#2TXՔ*II/ί /҃VMhgg5#9OW4 ΖN4FؾTYj6'I+e&vV^}tN:/:T!NJt/v:zgKwI3K:t04_m (p! >7N!OBo\ҬNپػՁ{%(ivg9&\vΖ4uƘ!B!Ћv܄ќh@=Gv.jN ItlJp;'(cue%- $m6M}!WEE:~gI;d]Q1m &֞p-6s޲od)$mG*>tW+s}2ĩslgmCI>Mj~֪yg2s)6>+6R}HӠ(fodofѐ}&<|Z-#BxMK]r-?pd]C]iIt"=j/f#}Lz@}0i-nwaTǿHP "HN HDE(?3(% d$%si%MǭeqB[U3yݙsOtWwW{)!YW( 7sti,avWnq%ĭJ.kge$] X->oc`ڽWHs]Kg؏HKZho]YKDJJfXm4Bn2O&""=G0t+]sMV3ji$mO*l?Mr?]$prPsGf@R_'kvNpy jqn'O~h$~+iLVo IZYWJ:@+Зĭ,\A zIKh:k}[IdL] JofgnjIםHe;;%Zw"ffffff5x5c"ٌz; s{eY|/wNǒt!p 7}۽UI&4Mb r\DĔ^"N.rp}4[i|RjW2AzlX-+ 6fk5ZXCKwD rL8_g3jY֤_hTDL(9^Tsl&k^bΖM6fD.[w[_n𶣀M~>6a[(kҠWnur'f1#3p2j/i]v,iL&i:I$u!k9gGV j)p/&)ܞrj5$` RSZ'HZCcoE%ԬV'-5 $Hk{tB1cx +VYWE܁+"rLLNcc-7#T`w fpY"06B+ś䵀cʈofmIwE5@ԜJ#F33333%OՃ# q$SZE}%sVҼcIҬvt'[ ^d>*"8Z?M+!i' q7)",!\E#SjŬ-׉h[v>{,ٙbM+*&yKZ@oI.n/{>F]W;sO<-[·f9l`[ȵ@v1!"v"IeҲ՜pY?Rw"$"N'u+wp̬VEO " ^bt8 8:c/K:(w-%QMSDfky7Iv$;lXe`]V^C.S%ޔ$jF"ԖXI+!nU6.}CBwIKBךF֍sTI:'"!NG(h<)_m7].ifIe!-v{~+gN@f~+f8ݓ)䏋92뗤hAn7xPIrMy rTDZ^F-kpvvI|:{ZF&?eULs6{鬅J(ߖt8uUED;uT $`wWR;JQLhk|Fm$s{+6t|R</!V%64t&CҗH3%[1y|Y}U^wFWo?C ]lםH7G`׺hD72ffffff t%\C+vpE:@;/2 ?kU;'z':XJbumO꛳$l9I]OWs/mx+Ûs1738LNΊi2[3dKI+ |DK*~?.ǀE[]#"SoY`h[c2>>OdJcHZ}x8 WD4]D_-˔Wh҄ "mi#[ڳRjOiV}qD5Ss4ow:aEbE\Ǔ_\/d _t#;~o`Ո;vIEEm˙O;$HZ YsuǢ6BlϕO$M:s +95Lym*ͯ|qU 6s#b\ i%w?"ΗQ$]|GkEčSʮ8XI,& X\nfIN(j$};o$iFROЙ@:i OUKriD>둺@㝚5# 3@ۀI'ZmfffffU«;iΓg"b\'n`v,dN#o$HW7kkHkڹH&\nQ곤&^t"{_g-"j"/$,eiM,h$RgQ"tv#I!V4H֊o1!FRAۛ¹1n)RAjRKmNDO3Q R5H[IEos珑&g,Kϩ"64D kN8/"6̐RK$-K:<IDnb>nRh]B{OAhz iBhEqׁߓ,"ƴ:vY$-3yQ`V&ږAUQ+֌r.I6o#KsN,H 4}?֟gIѤ=_["5'*FlRD,I?l3rMpAmED+fH6đƭ2cxq"~aՈYR!ff tC!UpcVR9&:"~3?EuMpvAgK~T:t~;nQ.Vw.Mztq麺133333?6w"2̀[~|:I&`κs2IN&u®«7׋Hؖ>Xgi'aK$Cj |$WcQq:L0(D Rĺɥnv?0O|*"FϪsHڕv(xt&Met{pW{4r E*>1s臁s#&Iݶ^&]{xT;y{qNIM֦{G&t뉤S s&(i.V'+P INvuZ$m@: &H@w)r`6ÌI{ioB8`&KRM(VzVi a7V< xw낤Ok8Ċte."N,)w3T$ݪ7ުbڊ_']pv2anIYU ҇"bTJZt~Ly3gp?o:ODxFw(ހlA*x܆]:mNU|X\49p`',ifffffVbc4m^`:>!]pkX`a 5>E꨺xݹ9`8%dR񬋱3t:YynR!+]`x-W@I$Β+f n ulEGqttX[ vǪTc2D*ED<9$-KjVIϓVy){viv D6I =Rq`;J IDAT"T9^݉t8p-@ݹRRWN̬LMv&fD\Tf>#@QFOʧWO6;&M VKT3sMyڞCHMzV;]EjRsY-]b"SD;EHx>;v^!I:ت?,˨HZ8Dݹ4iiٹU*iIe@zp % lTx%9ئn\ƒ[Sw")@IHR'"$igE vpcDwP> ԙ9IFwTU.iAk/׀kj03y'38 x)Eḿ7/OeW]x>QxMxR۟g$Ojؙ#by.p73kR}C>|:3I8Ttm&]Xh bÈ87I nԧf2F;NlXo/KQ~Ti툸D"izR nZ/>IcF "-$dcs$Wqo]I+ ֝PV$q[ݹc"Aq{49/ߍ(3-R'a:Ty?iU,9##;kb҃#bLUJZBZ rvY^%5c;mIӔ9Nf{Eu'2!X2~'_47p(x-I .4 ʻ>4b%ghI >,K_c44",sb eD`x$mLj8_ýKq p%pMD+x"ve>JʲW-)V1\$-K:vSD|C Z iarJ{Sw.-@EPdfffff×HbD|R_D|:UsםK#u;$";xpy`[`m:rd{B:I8\ :_9IsE*?"XI"uR0]EҊDu'S5I됺䊈薕+^o'qwk3·+.l_-DUc6=`2VIrהϕ9Nc?Fiju'3!T>8E'N*I&NxS+xaE䣯>>`$Yn*HgY,ig`ƲhëIcGձrxь[_zVxń́me2֌IԲ&I:عMlg *j`1Qm+%uHplX%}n&\AZN4Rg"bs k't(fJ:SLi`xDABH`siE"133333˭(/v^kWR$MGjn1ЅI'tt(5~Ig8TuxD<_w2)&oEhPI+_/H<4^!PIƑ 3l#ݟN|Ԉ[w2ut ڗIu)$}tQs:&L X ":X9;+x/6iWuކH5IԝHoLj0S&c2e]D\"Gw3 &jpR&s';['lv'Ij:3#ιW*vgۤہ"܁%}4'gG#b A҆vNh /ɪ9FN2V `>H4 > N)<|Su:Is&,Uw.-z4"n;33333$}bo|!"8~I>p7ADWU>N҇?U3[\9f㷬(6[T@Q2/p|v68I#u¡o"5{DNE!AEr<"h3V$}=@ O6I$ ǏWRG&*9D\GҩwVon/5ժ=Cxp]OSw"}p տ6sq_#7,~Qr> `V&nʟR6ED<չ 5<WՓ&+>B?"iv'Iޯo=ɵGyݓ#b|Y/$ߊwDҙb +.p73kSKi`͈x(CJM)NL=X6ҁt;$mBzuiWb˨oٰvlefYtл[#b:鏤GE뺐Ɋw'uu!H/ꦢ˺Uu ? خݡ;Qщy?`c+F| +pbE[}t Kp&;[,E]2;H=\KkIZt-b )uN^G_eʤǑe7JҒfhˈ[;I?gNUF࢞P`2&^W]I;G3R8Î 2`6ügHaV!-cV[IicNqqs_R'.luϒ;nP`X!NƐN>~t"#btffffff)|~)y>yc_] 7ΧvW!ҭ|PHrQlFĘyv2I Esavp EQ{Dܝ!U@oՀi2 ZRs#vMDvTx-|l[PcI'rH:تǷ/"~_S:]E"-_넢$1{ Pl^lf̭%>Jz,HZ]&{$iVQmDRϓkx}NҤsh IiwIϳ>_'5׺<"j,M^j ?kugI:7 aiwH{, ע_g{D=Uыbɯn1{Lymt 1X`4osH%vneEۼ/_*sI[V&d6^fHiqYFgj,i6gI!UN?Ι& gV섥y`$@} 鷊k2433333I]FDN5/I_ہeJaN$- |6Wq{mo>5QZ0'~I*x x ~x;H0xf]Rf.֏#M4[{.VfO:LX):.JǶ9Iu=k=&=;Xn"M M4Y<{>g'!|N~ ?< 2x%`j}M*Tot{xιEqb #w8I!30Gm,bė^__ eeߊ9iHh yR.]wMQwz}{,`~\HZXtcĊ3qO4#iR0g^_WEI*uہ/ pq|hϥ픆o{/31eɓ^z7zN~=.Fw iDɓ޾LWoը$}8tZuFDl)affH$Z~'GgIO>U^Re^qݸH וd7t=Cd݉tqw{IKyqh໙ƃ!`N]2̬YEOWvrՀ{|kjf1$M|XTsxt.eHZԱ/ ي"yu6 WKlL)x 9y_C2*5V; {N4yT;zYf'Mn:oS&(tߺx2E!dLipYFnPU\=p|5u̾}T;sC0e{ɽ+qhRwv=ЇbVU män Fucf $mIn1=p3p!8@eFqG|l`ńi{) .p73L҂uE߮93$-ifS"gN[HZm:"`yIXM~SkY;$-/םYNm/w#&vBDYRJCZ3d33k@D< !ܷ$[L9q}212?pםHe۱K%}XXǶ9N_nD ̲]nffffff""jbW"k;DҺ?HńX+"Fe/Ik Pf"⹺)䫤s;&~ Kzpw33&FR<PF3D2[ nq)20WJ"U`5L! Jק~\/i1333333333333333*lvw3Eq \'iLg9uKDED-ΧMwIEN̬.*5!ff%}3T;%afeylISםH7I;6@z)u'cfffffffffffffff֡^o6Pw3 DnM U^x{YcYGZ8]_N; +i1333333333333333@ 6p#3ܡ̬"kQ4sp!DI[oo6pp7i}l'Ŗ|xq݉t Zx`Sj6N̬C|\PzC *sC*D]ZF`Iolvbb2Kӗa{vRDPw"&"Ntp6Di~I?3N̬ V>8Du'`f6D.QC. *i1? "v-+Yy بvH"b C{Ieܚ%m[w(" I_I%7;p3%͑9Y(]?Ng(sY "bg!?&8Ie%gͺ5B;"bBD'Dvy`V`5rmq6;nc M+W0W2>$m'ibuEr\nfVpL;7JZ(s\"`TۑجӼXFЈx+"}#bm` ې?@Ͻ%XCFDX8r1"&F ǀ$,i0333333333333333T?HdsY~9Reu]ce7V1H$FEŀف5WoV`!)"މ݀GKfCIS>xq0333333333333333&+JgSIHw,!#܁%mL;Y{3"I#H]ޗRl *a#bf~JɦH25" 233333333333zjaץ"$-BjNٟ?Dď+Jisw3EiCo 'i܁#\`}ܱcG<@4!`8͘ bIEO~. naf?| ,-i_IW4Y%$\WMFÃ;uq%X`ψ3U4K1 *n*|=5"*1~k&,LSa _+sH4-·jN'ǁFu'bfffffffffff̬֩{H8XwbD\WMVà :HQ~<]IC<lTҺyT[dk;("="i~R֤NeccYO%?X8",!v$}>iUۏ+u#b\y 6;LvN̬Ӹ̬;H8 XeVҰ2lHvN,ik$&i\A#b` `b֑4hwx*"EI]/!Tiد"HΟ<6Դvҩit:0 ؟!u?cmFķ՝Ob333333333333333!iQ/nسu}{+r%i\A#l`2[ 8YҴGĺ"[rM [IZHZ h^o;$"vFכM>  (i1333333333333333ko7`xuE'8"HI ;gi1ϒjfx4"vvo3uHhU6tE)$} UFLvOI %1!"N' } X9d1333333333333333닒_3r󗁵"3\nf֡"퀓Kf>R<FıOsųwIS7cDw\FIFb}G@Y3%WEI];$mSwCMDΣ ݧ"=OAɘ$iV"`6ߌ'k8S43NUt>h{xX1"^PiYG:4"ƷDb[M&p p3i2X:"PfU`"𭈸D*I'}ZTrQD<]w"ffffffffffffUtW .wl9RB q[Y ̺=K.F`fϚ_b{tLŶ6Ǻ8"ƵI t;lDLL҆99bU]`D2IK ݿYs*z pX獙Y7pYa`n~?Uff]DiunVs,pk,{1]7~ hqwsZ8JxuD&G Iߤ.o+D}u'2IZT Nݹ^`LjD̪w33!X`n:0"FhlXSIݭ)ie %M#XDD4lչv;"~1grN GڍWEmIYͬe>[w"C]D_.;6|^ f;333333333333333V瓀\^-uXx!+iLмٮ#w~p`KxDybNKƫ_rM!v.uXJFڤ J՝Ol<"i'IS՝ WGF^1,qYJbmE1 ؒ 탦!%;>~d6`o)I'KZ`1!"> ɐc("&7W9֪;""n5+ΧEsGwKZd:LF[fff6ű@ ,YY u`ff-4c% q*udm2 IDATxi`>+ۧ4TzpADEkJ?KIEGv&_A~&+Eu9M~IM&!՝p#oΥ {D#u'bfffffffffffZu8*w>fffÝ.ԛ̬I8&"v*)$}T.10CcCけbDī6B5g?D5S*%PSsŬH?Nd85RJ5Ҫ 27N̬]vna׿EĖ1333 rDq1dbՏI>]s:4Qbd݉BҵZj`1%333w3!F^%qD$p z[e^$T`;E[;,iiҊs_["⮺Iތv!GD"TB܆HZ8XR% <<}#IkT[8y#͒4 %*0[12 ;Iۼ5ӌq~1d#i5 defffq\nf6DI30MГ-#6<9}ڼM:a00 warP Io"24XT*  ."F4@BkL-";3333333L,*+U5133'iCOnFW7Dؒ2333+ ̆8I=`݈2sܦIZ8dݹؐq-bEcpXŠ>|ܽSSI]_쵍nV.I/Ws::iĞ̮6[7Y="6+33 iM  .vgH̺ ̆I.z FD'sܦI 8TAnn6Iż{V<3" >6HZ t3#xd̺9݁YQ5YuI$]޴T^~OԜ٠\nf6LHʙCV;2mIt`s 4qp.У5o'I#כр^~\ffffffffC=Xܬ̺}H̓9u333t.p73F$M  l9+@-)f|\ M +Q%_ ck xueeRfԯ}"1$bM퍈x̪"i!kbg#br233~|\DD[wffffq0$i7PRN.+DcLtQub8[D<_oJf i*`%R֚Pn"-ym݉Y}$} XTоxuwخ $ifffffVI6j!1֤̺Hש;ْqwI ffÔ3hO1f[$mCZLn= ށ{IkL)vތ?#➺1j+| ҈x+S\33333HX,fm@m{$"ɒY4W}"b|݉ ffØŁOf 0x)c̶HZt?;u 8nn7kʆ}yRfI/"⩚s1Ht."i `_P_23333nPn]Kdeff֕$=43kr+@6M3wuҵ|333lQW2X9"^-.%ozn"~<"֙ Dz٨>^oF@:q|,xd̬}~E>c?0"x\33333AI>-")!Yא!qo'Y+O̬ ̐4pEưkFcEҗ֝YbJm="bb]IR/ Bƀi-ev4G 1DLDIn_X( Izt$@L}M .#""""!i%tWgY'LT) 7ߩqؗgIyj+$?V }z88؞aQ`%`=L WSnLQt`qO˞x &NjoKEZ#b’p0w۱.p%&l㊈s(IRz×>YoDM)$%]w_m혤1w~s?*I3W2ap#6V|9Nj4_D Io9]y)՟@xy8 Z%bIzpcɍ3#"""""鮚H޽x"""""& I?cGl?PSHC- I~<桯> ~ pU5t)z 0}X$46}wJy݁f{O2mR=%wm1l$-IھR`m;nHz.p=j)""""b“6g5 k'"bv1>XsC/I}k{\o:9p. ۛy[6ZmfTJux.vn;l_Fy=xX*'KH61aIZr3~vݲ}L/1IvM-[8C/ 7۷j`t%9v@tƕ1,DՌ7t%oi hփo;X o, Mҵת5^M.BIHz%-#iX%]l:01;! j%'i6IIp=6hmNm19Q6q)]fo;&I8?mчTpO q&HZRE{N{ p+4=W$&`bk:IQ*bʍ'8*PMego`Ѩj#O-ێw?kҶ)Nfi9im+I[Gp.;LIF5 <74VDPK{DD4F,v7p"%dts5$&M=Q6f|F 6>&lv 15TM?v,]]n;~H6 7i;~QODDDDD&i_`51!L1l?f#<v-JƈggMd3iDL)!i5J5%ڎ ZcI`Šmo^,p*X}!MzٮczD$Nc锪HD̈}ێa_mѯ>*u1IZ a.Vh !EDLjZDD Vv,g66^EۧJ׃ڝߵ@L]6l;Cja,b8ɟ/SmѲTp(z!1$=""mzm1U?KZ1~PS+iSI/4Gہa^`Cc(~\/iTu6U-k;?""""""""""""w'=mOBBIm;Q< 8$BM6E<6q ?vVh9;&IS6[X|Ui -{8tGNDDDDĤ!i!`=3x=;m""S#"Uh;q 8c=/0k Ô#Q6lhn蕤P:7lv, R]¨Y)yBvlvuK{DDDD`IZ=c#"2SDDDpK۱ĸ>CiѢ#%]*[ ljd͹0-m_{InsVHr{ ̀KOp}%-nH1Iib$)Q7%="R=""ŀkKNj)~ lZm􋈈v1DDDI ێ%b883zgQ6 Bh_kKnTGۏOL~_o6}Qǝ A%"""""bR%ptncȚÉ)( 1$ lv,sm?4%-| PcXQ/Ii;!p;p<%ۏO oq3:}7""""""bKR XsZɈ֠^oC!0$ v,񤇁s3ofagLfX=@D$8a7p6rs5Ph;AI{DDL:w٫Olo$-OLǁoޥ""bX$=""&Iyexw;aEnUIKHDll|xplFa͒NW@ڔ6uYIߕIsI4 ok;>2{ .ELҚkciDD$=""&*#ڎa[Vpg*A3Q蔋o+i8u%%i7IcU!"t<;5ZS϶Iz% 6 bU]gFDD#"bb`uci؋)pn \ ݰ"j73IGKZ`":e2` E]= IDATS޽?pK$W """""""""sA)2Thu~ l_8X` JKD.tWLD'l?f Lq_ce]?wH:Vh9)Oҋ)ߗێeeM[$GDkwTp$GD`n- pS%":aۛoPRu,d{.`ZsIHW$NҬ-6T NM'k;莤m];|zg#ZP%+4"" ڎ'"j.ps$m*Im1#|x,fO=}m`z+.4'iam2@ﰝuvqH*G txH#"" 1>X8X"v.Uc~>,a`[R*LO՟́À$/i_I4s˱M~,v,t#&HDDDDDDDDDtNҲtMlIRة=d"""Q](|X"Zt!p'tgXX~k>jo$iNJ]G<jQ'I;0~?QJ_, ${twQON}KLHk)ũ~`mHDDDDDİ%ptncȚÉ)^y I?a'ޤx""bH{DDLzMiKvs3=(`[5ye/>^jn6LKvx"0W}aw=m<֓Y7GvDG$-LIt 0GL6.NNh4$N N۱ [mv $ 4ڎ%bJWnh;5өv?^""bI{DDL ^FiOT۱ m?/fjUqJT(~!pzP/,(9`ʦg8l#NS6DΝ^=dvC.f~ lv,qDDDDDDİI{D=5wS֧QmnV$@)5ӑJQ^i{C ( 1eH!cR~b'$}v{!E n,_Q}`gs#mvJE2m_)ii`O]ԗhC`{ۏ4БfT#iMJHU&=SlvCjOUA(m2`޾ """""$i`fKLlS!V!_|yHu݀ŧ+_1w)NU`>5 fTM܏ 1T>r83?7nfk'$lح<5Km_rHSy-5l'QoGDDDFҜM;۾v W=S:ܝӧ47PXxRSwAޗ%ivJgww?~ CC^] LpcVayl:b^V,P}v52~:C۫R I/t~.g}c^a3[ډvr"z0Ңoa $v%w&Z1^ܔ;WXe õruͷ pXdğq-pZ{hIx,O\Gz=zWw0P'WDH(2>O)^:%k17% RJ"Qu;(պ<>^m_*CxI*yi+xzOwTo)Q%Bw*ʦ>'i 55qIQӖn;.hmO_}rn5l>"i cy0׬5(M+;tmԚ@"k7Prqhbw/۾9BU`WB Ms>e 艜2%=""M'(;r8#b~.`I2M( QN;ЈIvbߴW+OH(/O|WS*L{\AigdnI_afJ"Y&JTU] `ciA6DDDLPV֧WI}r;eSDQզO6S?m }3?~:*ӡˁ}cl?\#iq`o``M{; hEu 9JjܫצN}ms؊Rrni{m(ӒڗlxǁRUoZ3JbY*Jה.PۛH)b㫪#oU=e0 ;ؾgs=)tN^9`2㿃3u2ԯ(SsT/6ߤ|&~WT=S`Ꜥe)/[0{xsKQGG(zU]/lD&yPֆ h)/ v}PAtJ(jP RkğCtQw% $LIr_z,P}??D\y$q&⟀MIvV}~N?J|'{F҆n1(Kc$|Xeu%qJr+k xKY`۾$GDD ׀K.^mc=\ ؘr4ZE ǁLAITR٪֔glhP*SU;Yϣq0&OFvC bJx?m$i.הvSїlvIoܨTV'2(;U2=9ںpl1H&Nd*r`J%b(ܫM#ߢTgm P^gE}nMt؁+ߗ~xKZR i?;;᭔D5C~F%頻*V3qùRlk U%}yh"WD$iF5jh9U%Nm0I%[/X~4^wgZR~{]oۿ Op?CH/_#n;m2%=""b:ՉW(;)Ʀ̻'KZ%DvL`|_ʶi;T{ޯƹGiE&J2|Q(TknK<= ҝ;kAL\- Bw/dDDD4`J[g<~6*aMm?9lMxrmҩj g gGɟQh;Jnm'kԭjb;`/z[(J6>X9sUk#UÐ,2).64bcm.&%ֶj;lDRv@ؔ) MӐNq.TPc=4`ۏ0ޣv=xE3ŗz84ۭ/GɡY5+aJ"}/kMy=T8]ub`:AB^(vCzt/ cZ"uS Mخyɚj[oGE1< |gbzUcuᶷa)fxT'qf*nGΔ eџ)7Hί>^`:'Bw_DDDCҋ('R{Kի&𖔪/cm>Q**~ 9b`pV\Xq>em2T G0zɠwI/$B.8,Lw1qAI,D-NJҒ&l]Y- ݋)_Na WRHyDs%\;Sm"ځ2u>dF= >鉪kM(7fqSl iyJZ5 w1so$:L s5Q୶3?HzZ'׳meD0,lnl1/ôc|F|ųS`oVIr1ƣܣ*Ԫ^r ϧXҳ)[Qef53Mʍv#fQ*+-R[Sm/#""b$mAt4fjTiev}g~(l |8yR۷X#MRon+Tu XU57IZ%ÛQ&KZF(0hBIi2~$wEsQ&뀷>I$7+ھK”3Nl $,R^Π$XC'(%!qu7B$mH2< luHZ3ǁP~'RɆg j;.Ͱx$Ծ5$;@$A鰷+^Ք.U½l{'넯/j- m2I;P6ws8L2'\CkSü&5%=""UCΖc^4;#B n2:}Q."9ѢsF6]eK5lø3^_A{'PZfW ^<ӵ<>-:8om*namO[}SΗݬ"^-mFΦXkIRH>Yw F4'ޤ W|d^ |:k)`O{W5HOVtMSoxoc`ԓݭAU݀DKXiնSu=4(O^v@һ})&Cyߍ ډJVݣ^7^;^I̳SCxb(&Bv î<PC\ lm̳g~inO%UoQ:SwN\}ܪ0ضkd<$mLyoZwjWQ~O'f(!KPKk7x0n:~`^@y]:mεcK-x]/y1$GDDtZ܆p%ymw}ʅBO'PUS*4u#?% `< v&(|;z/תX_^_C ,Jq/m9T=8[Q8oZ IQnRO3MmybۻODDs' 1U%wQAUUw6Qe{Ի_Q֊nT1~^Xf7OIszM+lŜ[?qNclo]6 \crOa̰B=q+n W?C~kOzU>(oMMyl'u_U췡[5U$74/Miڥwq{ޯ 'pVc㧔 'H{DDD$-|r2"Omo9bΗTe1f#k@U \;(IWv+5KD?CcqP%Lqi]S<ľQ{a([覢ƶϫagQソϡ~e{~j$}N | 8ʒ)%Tǘh:]d&NyyWsMս{WӁ>braG_[~_fH|$5=l8c"IQQnMЄmdҨEl>rsF鵘m9qVrKs֧Aa`]aS~qly8UENmǽQ~Ooꆁ;.4'%霅m9tiXnHہL#iJN] e50s?k! =*,}9gh0%M5Iz R1P'yMA=iU%X`]O}p);0|]|oko]8T7X":"O>ޣ~'z1xUȟ),}K,Hi[T=EҼm%u~YǂjMVE/#֠$va^Jkxߤw>xI[R*vw~6t+/54E S~X\'ttx\1mA`j57&I+SG4S^W}}WU)T׭'mwۭbJ^0޿6$IrniC<]`g꽷úP[ IDAT?I^?bb7>j On9d@KuǑXX%:>Colryğ}ua,Cs_HѷSM̰f1 ϡ6BҒIQZ E7q1+Fռݍ{(1k 1J5^Kj܃GK:ZG(f>bJ:+"t6j35 6GNdJav {3Χb%},N noTa:eo{ D+I7{O)[ʹ׵V^O٨Aqj$ގHz>%jyR 2?#b?WVsd%鍔vxA{]햤Q*k\M'/ X9ZV=hU$z`*:JZRHjOMM㍫ `Lw&KDKy 羽n^+O%عrJپ~/%ln$쳣Rg<1{ֹw_`97)Ez.?g\wtWR$!i~KT 7Ro:\B9= K/$-BzCڭ SzyM;r53m]x=p6 =H)yv,FYCg')-"""`۟T=)V&;rmہ)(;=rk{%,fil /XRʹ.JZR>ΓDr;;f`z"$i2ϾwTr;3WuUWTLlUu|%m{Ǧlj{3JNf*7] NJ!:'`9ʆ:\Q| ,wxM_Һ6dz79'O}]MnK֋jJ}/pVOAmi)^t3jClh{wgyͶU(DVk''Vݛ=ZCـױ$XX=6Ow6?Dr;uP\ߒQW~=JrUie/N_Li?%]UdZ=*^jq>(iE+j')6=/;)՟8JսdjfI?M9SEUk%JŁal+Y: %wYIߔSIJ@OIgJ:KKZOM'ַuŁ?V_y +"bJnD UGLo̭SӶզZUP:]Pr ۫>=u llPWÐ m?D4h/gfѻUm)?`Hc}WC/lal;k.Y<lo 3*QJa.Iuw훁]\{:و.TW5IGLb!8IucjouPkWZ]c(֥UTɊLBxD==2'7`BۛR6ioC}gt/spۧsѦl]mf϶k>=%uoBugN]Cɏj퓁9NyE4bS( TPn2< PvḗRv(&isʍ3Jo`;ۇ71pu1tc_p> vUK1,ٿk?nL)UҮ;kv 7l;3psVR*o$]H&tNUL&:IRC?SϿWUHz}v.Xjj$-Nw/XUWIR:vmEFS}v㒴2ecDOgTI%iJen|M39(]t2Ү^SHFu p yx+3&?ݦlc#Ꜥ(E$C)= k۾0XE1Ƴ:Kj&UI9PoUS4[1PX &I71}U7ZHڑޒþlu IWKp蚶ZwOQnqUt DgdΥ.H+xIc[69IڇiS閤SUf S^l`KOI,%}y`1kMZ7:Hځr[%PM# 5 ueٝ55C~DEPWӐmfF{}.1$$mL<ҭoptKnaIy=|[OD>|C[DӋԛS[8^תһ}Vcΐu(P>J%4J^̔tqerU} q5%ށO6IphـOPn;s= i;pǁÀ=/^`^lj$.,r3EҲo"؍l.p|z5)_s(nf֡Nc88rIԴ-eUU"{> 8[v*yP65Fyt҈I b=#}$>L>Jr55Cf(uh$mDIr/#NH8]l$DNSaCe'$5 qCh%}I+SOiڴ3-}%ZJ3lSvGW+۾xU_X '?{fIU}wINAAAP$ɂdP2 "*Q I@2H99I(93T:{Խgfz]9k ɱ2@9pH7yD'JZwЎ}%],14mD m4!s$!etE$ YzRއK)-6~W(_,)$lQ Ҷ,+J?p PBF$f_  {C$!6 b=ۻ E% @҉+`9/iiI Gߴ}H!-AW3ճ&fpnP7ŔCrIwJ:PjAJ$M^A`r&'/=.'kwR[;]3WJ3k΢癥s ]R_hnTb  vۏ>oma{{gWK1:TI]]겝 i ټv?*nHq18Z nx6s܇E#:9Ϲ'WQԙǨھr\_ xD1JqiNj`N+~A2ʝT L'T]~1P~ $b*BAmC6$.z}֯f+"'I_Innrm{IR ՋZHDET 7u$]HpiK,e{ۇ o{SImڹXI'Ω!G U՞OqJ Iώt$}unPt;Xu{˒n֬=%*iIKHZYw$}O$m icI?m$X+4u/;AiiAvJ\QA5 l"QIvKe4+,\$$M+Q@*_CՕt (u q{;jM]BM @Fxcm>kpQ50^5-yn( ZϟHvu9QSd EȨ> Xs?pr޺f7I:m5a.H\trD4uI۷"!(5jIuF  h/~&$LIn=X%Bɍg8>' otmN@\ߙT`p3ۏ4sՒwCu&$p7m{WHז#woYVsIxrhm[6-R!HOE`p^] 48fcRסn=6 Ǹ3UGHSSgkS?HϗHWD HZt?ilY:HڄTV}lK`IeX 8s.@H&c{4(-LxT!ir~I۞E)AˤFͲc SqʧT7 g ?Q~^fDL-gRӧ2h'U!?h{⨠ꪷ+ivy8Km9NӱrS#t?Gn[;'%=|a31pL}mw[|6~N҇rƖ!~#C!i&! $`'^d>Q=?LsE RI~_0;4U,  2ZP|/(X`g %l~_bS&g}(IB`U6I[>q%Hh `jvLr]4I?#I$ >-HPOt(`^^I"Uw5F:3ZxGTwOv21Iӓy7V3!H ZNoV1'bIT_Q$U>NUs`JR HXfh,ߑtY&q{Q V5[࿳t" dx"=[8n/_uET"md u^5piPL@ΩDgNl%io+iۏHkDai`3IщW;0, :h\ҮIMosJҼkB;|U$Gsҍk`}dnJϡLLr˿pI8AA0HXۖ?"?(Xp޷`^kp/G"=h>(iwI$X(KfrA3pg%$iSI JZUΒNtI#n>e{QCG<,k{Lq;[iG%&x'lRӒD"\ hpOHM^}A<% M( $ +'W" p ]0703C1=6~{$m\uu `SuY@{fS_Ԭp.(rT%sbf1 :wᘽ2tglrkOܓ{ISrؿd.%}e +mV,BU ~O}tN t_Fe~97ۧu@y|7X<鮏n~*EN1 7eD!wY Cթra(s  ow 9?-iax6H-Lc7C6Z6M݃HGj!C݄ym:&bC<+ (x$1൒nh~Y=+&$ X~ %'iJDQI}B]K#(#$~TRW (e;h9ϟ"u)j'"׋fQ\v ܗ׶.'LzR'~p̮GH8?l7d2m`m_/Ki,]3ǽA2; *S?gFA_4J9ߍ㠷ӑϿkNVeo]2&p nAClw[  l?d{Y`C ˅xΕt!Mj%i`8f&MҪ =F W_$}$lԕ~K^Iޟ/'I^o ^ʵfROI7:]'E8g$]!PIUNsIN$4%-!i]I;I:$#+Yc%)iN'A9$-̕99S Tc"ۍ\.CUIJN? ?ki>!IS%sikeYu3'Aa>IHE\lXè/ZD"A o0ڈ\C2ʡtBn@;x<֛]Z (ݍ0`1G4!p . ;} ]$i!rcsp$VZ=F.^p60iqfte4V)>xRa+&lm@۫\~Erv h3K[ ^ޒ4F i"qZ>B;. ,D (FRGn({=r>ϷJ(i"I+J:x5aCfN rn=B%SݹT[Σ 7ga.{[y45$Fz-z)ִuJ܃ ˰ P%O%m6mo , KL"I=:$'\ ,h_38ui8Ɛ^"lEUۭy&%uظWyQTlc{%Kc件AP31#sN$"|'sܕcQ?U9}`YPY>AYa@.}Ǖ4M$Tp!>y")mK3ss $Рc//H kl^X">1f u I皥[ŖA0$:'3w t5`N'QV|е˫S_^$@he:aJ AA>_ҥ$]) _N/ؾX4&t_z IDATXEҩom?d݃n.I׈qۏbՎ ƹXv;ZeRKIk/@X8[aa/눣SIH RhnJ~v LŌـoB#A&uu/ˢT tbfr|\q+7 i;L߂l+Ɛε}G ,9\2McHX!s=fp +t=+9OHz>F|[/0y! z/ޭ"֠}[qz?e۴]$2j*{پ= zI:؀[u%Pڶ/.&u+nI2Arvf+I^%M JzylӁMlvkV{8ST5$e5Uaoocvp%XX u|!pp6pG;Ojܤ>DžڑosJZ.cN$,֨1QUq+p/96.uz4-תx$jvͬ7% ęc{ iΠ, +f{?7DgU#}$1[56}I$f_C_<"]= zI:8Z{?3gK}9pBK:}8B&#+8;rρ9XHr[ XY>ǯCE$^f% +ؾW]1 ;#lŇ*v IN++{ǁ=3mcAQl]iHRCr@ԤNHR: Z< .E0~#Oe"jg5 WJǻbFBA=J4{3r=ˀ*.7?+`+Inx_\.i~RK Z43;M$rk]|1 ەBҚ _TI %Gru?~z06"쎔4lc[9ة}TS(jq S>S`Jz7ǽ5ǏhÅnGҧEH")Sbߠ+43_t2|7XO\s64OԒ6&͡,O=Íx4rI SPAAc5ŰROo"iO,'t_Ծ.CWNEj ~)7q~sIfȍ$d,Ġ9l4$n}kA?`~ޒ$ ݁I;Nqrg  }zͿ?SP Pp_݉٬)iRou: ׊9>\L;C+W>!f6Ai܇{ >*IX{/}`.H$`_6[AǩW=[ !0:KKVhX7.BA#ߖ2'`? l+i௶ھTN$PR&9 (M'>7^ft6w`.xQlo?=TFJVLSmTӁ׺T?++$٬'娺 4U(sqgH-x %-$6RcWHd?Rń.*f   zoV8VWkns[xft=&܇{ qnc$JZ!e0<¤b/SP/Iq$Kn N.'͡A.%L@''{VBI 1dRR[I:طreђVvˍ#hrC _V<ش@|ػ,upgEs @]s$]  lTNmzθ>)Hum3 I[)}m FAލwIHm)IӓoLG!p^b9Rs|:C+_,?Gm/mNŨĭ3k`/pp%]A5״ |\-Hu ss>$qu/QIXuEHBMb@pCIg{sj3ؾX҂$Gh_ec_`.CcC+~$٢s'7Tbdإ~] tfq&`.\zl<&#uZTEہfI3k&?mن*N}@/I[B-AYF{]Ee8G ijx%zIs >G{k"i;5hKP/hU5I2tZnN_&4%!uM    I{PvA~i u#I-H5*gܽm_Z'iwJئa:1 h-l?$1(Q`1۵Š'uu}%\ \J.}RGNpp(.Q^ >V7!W#=Hkn%YmwUE #ISK][|m8F嘢r3D.i2]E'oJ$ԽC݇_1n"Jq8hIKN$ѭ/np, 00If oPIIJҭ$3m/n8!0/0IuM2!DA']K˸< ,Lg{mdž}AA0W‡XXUSq98o_NpbZoK:xSR˻v03*ğAPqP&}}fǘԡc \<%}t`p]$ LԂ7r(,Mz i|"I`7<^9Eh/_O/QO36"YnwsJ$nl&=u"poA+ 7~R3C}`>Ԭv(}A- ݀k{#6$O1:IXt/qmhIzz{}E A(U$}=IRH*<} pOL5GK:8͹I6ՃHQ$ I/T#/Um$ӂ$gHZ:&pLUReH HZT3c8= Hb{% ,N\!;eh5A!"e%I;۾4H݋al1giME.nUAY 4eչN{ghEҽ5^T2A[:.c`t"İ_N)K;{pguS,F UGȵ=I\ \zJzt e5s=p8pT=A8N_yz#loS* TAbl&,`s 1= Ӏl":@n?+>55{H"mgOX۾^$2ý@eCj۳A9a}t6-iN(I,]: }[6H{g2KIbm5HN'$R( KJv]Yb$}T@ =Wz t/xAB(>՟nv*& ->wԩijmX|Ũuݼ,EN4q {W܃;C¢Y0yɟI@Z/hI'kl9CT^ Ao_yz&12EAr*!vv&/| H"u%87+'큕|aޒ."V?8RҢ$!hrGۧ5q%Or,iiyNIڻn1I{b2NBr g|!^#,H-7D*I>g54j*6wM I/~Zxm6` &7I ~ۑ4) m8*nCMOjCsնIb m?U'pY$Jgf&s.N'AS( ="p]/-N8vpl"-[& !һeb^${ESG]J} pIDF Dgģ%MNځe|`j;DҿKˁqE҄$jv`Z`jIoom+ ~ڕWi$}f#>^j& e `jC]Esybr~k}itfE){0ugWAi}bĠwxT`ˏ {PɁ9%eorLzjWd  !{br{=9|N_ #r zAA0'-:ԧ=]rvcIbȴ%[G(YM/` Xw?~̐_t9C~'ËW4Ir=tI )=wt` ߨ:ut?oJ$v I k fnqI$b9Q |g`AKr Wׁ9;KQyB [oj\5ƞY,Yr4|+'hRO྘۾TB1Js׆غ9Ϣǩ >5`#g +A_0,' W&W6+ B%D7 !AA H%"E}ZtMM$]Cr8_tbgUN@涯x%H8]γ0V'x$&yn8 !Z4ɵ}>&".jp`,"i>w.R{%0i1l2~ :^'t_˒$ lh,Łժmc`j1^#őM?u{~c_σpM~Wҍ\搴JBr_J%opLV/K0رf"yVG(H/Kھp>}}{YWj^>'ntηpH|N&ο%_jv.AA0$oM`WZ'tԎrCr@:F" FQN~-i7`-`+>.t 88XUm?ҷ)޹:9\liINtB-fq_~QҔ"fŒQh`&Cq7@j<WxKi̧پx%} iqiIXҳ${ߟO&&! '歶ic>XmE8Aq1P+Kiu\.M.M+gֈ1 !%JHQ} Õ{5b*i/ʩ%HN{E%gyt"ߐ֭{-Cn}tI?'5`?!0n/98^vkHRuJdwUzAA l_m{i҃b> <%0I7:lf{Q}ot\l'%Sl$;x}]g6$m%mAEѠw8r Azl!iHn- f4/2^h^9 #\.a}v_;d۷Of4D I.#~Ipuw@Rr{Nۃ {;@MsIWu\{:K˞+ ڴ@}DT;%~g0檻of2 X c̩1$-O.(Y/-2M7s>[bH|N&K\;${]be  5!9zRmR`K^IHZYR ﷽3IonvUg3u3A5%n{Swd?`ۏc%?ַAA)ntA4-:L0F,C_.,M$^VLj6r8Dߥ|#sHjup}+avi}{Yl; LT8m|/ӱ{M%P֖׊Q@܃  %M*_ކC.<(ǒht1/>0i2{$T BaU~!$J#9ֶ=y0!0uxrǹ Xqw4wUۿCl[!iRkZ N#/F?̗h IDATfbgluzIFAPhINJ\擴D8-vЧNgHfd҃HZq2lR2Amn!k!w/gBtl^z~IJ'7t= ZTBoZth<st\f{9vE$A$>$`[3׷XAWs@u? 9Ï6v/rEIG^g)x @5TI;dFv4?]2Ahe=K qݒ*8U1O2>J:KdTB ڱ3GNnJ-UlL14/71MK;{s,f1>en>C^s:6|ĵ!O3{AE}]%_ $=s%}߶}l$:xleXK#_l1 bQdtq>k{^].t+p;i$m;)om{$mB탃  A!.;BZqN^ ƤŠ72b%P`Q@WCoN*hc08h]FK2 ~pn-K|x/s\|NǦA-ڐO9i] n$ }偯'UK%#i]i~ wZ4<}wfGr˅V>wKۏVmw?|=X,-ʽ z IJ:u,w:GAЛ=z#ok )MNlY< v@%}@#iJIKZӹtL J#,ɄN hs4y8%Y1~2QD0,4JG 1*p- l)=$+s:6Sw:`Pڐ>@NK[I@#ijIKJZӹ!p %g%t_2ms$$+i6߳}IХ9uA`.ӂcq]HU?H?sȺ3cq MK$@q[4>Oj߹qFR j{ېvAI.A.{J@"HZXac fhzX^oPNԵ"IH:Mz"IUxe{JZP,$}2!l ]# )Ilqg4!i M cU|DMk}K+phA%0fLA {&Lɹ&@%͡\\!if;= bJ8pq;5 QIwQ~HA~qيHۗ>^H/+RrHX$5kƜ^)H A\E7bjI{"Qww&ROo?ɱ}]`!U9 8XF `R :@ m&(6UaC}G|dp0l8K@bHv9i>%:Ug{%D}L/iق1*8Gqx8%0c~ق\ZdN?^3t͒#"x͓2o,9K;࡝{ {=u/'Tϰ]J:dcwJ9 S{AmHr<;<\#6I?́=f% (z IkTq lj۶'ʯCZ(2-F#Hz4z Kz$T>P``6nc,SfZ$#lo@3׶Iߒ؞أ|}J_UxR1MO_ VN'AP v34Hu&|FMN9tut6gpU9``4Ztq Iˑ_uD&=/{r^`'H$f-+I҇l?ՂZ;8l,/L@ǩkBlqG.9u%-E3 s>:J_-EBGE7teJ1yЉ$垧MSu)U$_n 9=$}@ Z0!p ؾ$H`!HIsU߶_ou&? 'i3ICSm`{I$15rmEk^Z}t}l?ΒvyLIZGi g5 mux8# ۏA'!]Wo2ہlfO[6/ MB#o`/I.+iQ!`P+posbfl,H?bm&8I):4Ir?=Yu-pqThr=Y$?`樟QQr3_)E{ ƜK 8:c6-OQҦN@t> !N3󤣌k_\$L1tê>od96<@xn#@B^"W>[,ʑ;Ѝ:2Q ]23}Zҁ[`#ݞzAAl?j{{ /t)DݗKZSu}H4[7/WqIZ7Ç}d%F,oMR$zQ:>?8X]ne{ew\e\zsJy ,lwIۃ O܃`p0PJ\JhAy`E/ r]>Eyf1U^!pFJI±e#. vnXHPπilNVNt2WDԳU %}At&i-lI_XҔ4W/kaJN],N%m3}RA,=Z ;ǜ 2=9sZ*m!u`r,@o3u=EMQel P+$4L509I-On  :WlK_8$OElX83h?YU6pjEgbۥ_-H%- Gބi Ɛzlv&A$-ZU'WK4BaYOzA4kAEu; ]^p?mrʶ-U6.oFAx.Pu%՟[$m*$$Aj<]#kv- ??p]5_W{^Ҽ"T䴮9_WϐؾThS>{[. ]u?v[ ZjS݅Vd 78T%L=F2O "i*r9]J:Vb49B%kh/ YrXW, O S+=H:I⒦49s~=IH:F5E{3M+FSbY궐q!bŁh-pZLY $&nh'ͧ ǫ×[HD  :F%6~@jt+xܢH#oޟoB}KÏEU#O4V\ӟHBH fpr?ƻ,j/"j7em] Ha~G3<.u@I~RvuHXf[oTsՍ7 ھq{ IgeXSUG'>q$-@zm-Igkd ݳ,%6syE[:ɕ.ly[!I$Rʤ{]կkھ27H܃  ZE&݂~q{u\Ҽo{pK$֏|$zi(^$ ?$MhmImd;{:jJ~O>`AO7Ҫ `GcUMƂ wX#Ise IsuISa6.KRj>aV}n|J i9G.hl%";X'\a{@*Hݱ%-~z'&/VBhP&WIף$7'H۟- L݆f`Vu$=@nOߴHN%;$(V%EV~J *p)Kꅶ-Tn9d9t* zlz|Lt*.C+LF5B<dRDWu[Y{| Iۑ,f1-W 6;N4>@ᐂs_\o;ecTWջaU!5Be򩃤II3h{)F#+voUae$Hi_3Xn52=iqo| ( :3x]qܮsGw2νn  E Ⱦ=! ,B;Mw:Su?Jw9Ow=SΫZ󾶉~SwI"b h'݊E.)?wyߵ¢RzJS:1&"6^`} :/i{mf#FD@ o7ʗ {ܮ#PVkBʅo/h$|<3olIots2Ô?.1jyi/pVwQjLo9?hÔ.d5(:qʅ)紶اSi;)D'Ef+vh>qBfCRæL?p]/εxQ͛VWaWN|o:pjJ9y(R='L~(U B<uuuM(+&;yd]ps(yq %ypxV~v2L$~ȗ}>3fm}Z16{h"bcJ`jIo4:>3"~@y*3~צV1{Buumffmcձp%L2ѬIm|yo=."HYվUdf jPVoc X多w91 CyϡDʊ=C1.IFD =(a&gu-h} ʻ/Q.@uBjOl}J}mu_Puswuf[H8r`Jǿ2|qD{IR) {WncoEnV= |8s!Jmnv̼Ư:s%\uRӅx\M҂L|5v< ؎Xkulo)^SM!l>)gw2u83WӁ.tBlocI6] ] d!Js-)Է=8xm6;([zN{Mf]#⋔uYB@0|/,6DEe@CkN~B915%#Mѻ'%I[Fn,+wU!ߟQ:vRʱZc}\J7'"" 7{'|mVoor d/t]յ f9ÿڵw"5oP'=|Q;2O<);ZRJ7ss2vJnM`xCQ‚]]cw3sMѯ"b'nNEoԽшؚxk&Di=p3N4SytE~\f~VveNr|{Rf~'q#kjUK27as?~EnVJoo-Ny=wIתnHFgrx৙XEա픟e+؜Ē1؇)37>S.nwֱ(39/.Bz$M#7TK_CM҂ .d$1H< &eIq%\\"bq[imXQ8?3>VQLz=̬~ҡC X*`7d濵؀RG)]:m%Dr6%#%f6]K Nޗ.d4=kR.E7(+LG J9<:C'"[|wE4%">t,\]8ν?3RD 7W]$)r>^)+'p^':nW?M9ND0&{O9TUv)WQ&_ \کs؏`Eˀ?R]%ayNH?75%IҤP]=>]rbwm<"b?=x'{)w]DTˣ퍡wMMtS~5_f>9VKd$I bYJ$Z8`æk(_.fXK6i]K)iBzD r^7nR&M wlyKJtFQ_Gg%M"⹔,ފ[(-NSbDr.>0%ImUgegܦY* s"e~peՍ7]X&Y}ӅL5shfUnt=q`HDO.>ݍs+z:1 _DZJc/%wOv{ի~{zu]=GwQ&\ƪJ ?mNPw2n Oy~5[n)p%~QYslg] yS:[D czo 3.I&x6.J&:N98?/fNDlL9X}/֔CNE#?Iq ̼u̼i/=f8z]G 5 \މA&ه)6m,ؔ2(`J+Gυyɸؒ}:G VP8mzU˫t-L૔svou-kdl$"N-:3t!cOp)2yPf~]ׂK JFN7̙5lk\"b3ʪ;vk.4"b}Jsvk"~=HDB9v 򜿴mMjCu&]AY6_>VjҌV\=MAqO-R:qe2VcDZ թ IDATDdzeEWsm\1.I&j)݃){xN/I%&t|OtGՌTc;AъRLw7:c^E*L^H&)2gQp=\D<3.I{ T=ױ~vyDTu ]eN ",Ng Qd 0U˫2ۿ(澑"skl೔nmf#zIx)y(^l?_<8bf>t1UՄto(Ac28"E߂9(~MZ43qf۝5T'н RBd欱8" 'v |*+hU{/Pݶou6g(+e}P{=& {2s"T-+Dı5SwefG iLcR^+sa0.Ijv;( wi.Mgu w-lb Cə0]!Չ)tǓR/hkf~yOVCr.Jo.e3)Ŏ//.iꉈiہ̱o`RCoL{>(" ᵙNcrP{vOn,\S3JXxB+תZkq|WDCYW,3tD'("ΠRKޓǵwz`6xrg%/>Oز#bC!ϩi(Pi $iʪ: A $S%Mup%wOs&p~'f)"t=d"ʌ#MɦgC?ߤ I-)'ğڝ]R/m(ASӫ Vs^G ]ۯ=OH7aECF@`t1 3i{z)Ɣ Rp-p;ǖW[oc]VO 43Tjǫ] `SO )WWlv&x-%RZ98Tњ#" @=3/kԴp6n5TC/O""6l<ۍ(z},3om^ʋ)(Chύחs<mܷ̻Gn (] ˫L5Մ#)+(L<93ooeys*T^|Geblys~9)Y5׵=+?<߯8^{IDl 8~퓔.fm8ߚ&o,LR X0HKdu1RmP[PV^{xbG}n_K >0}.2rSnS}h|1cO{ U wCp^wDNY9 Yʃ9h1p$ItL@ ?\8p^{Qf/\8r0Գ'I j>っ2Ɉ ؝rb-1Pݢْ$i[L~K5n\y2tIXrj:%*HSPȱG U>n:dkSeҦQI⯮ƎVsC&IYcplu}(~7%"_'*M&>a)S&cTw`0ףK0v{_ua`[d-(Cvq-Ե6=R_CB/v7lZnL 2G>uKl؎)Xeсe9md5mG9'$%@xW$8U=3oT(tOnߗ h$ICT3St~~J _`kCe.֦: z `Q-tXkʩ35]$M1s wۅI$ [Q«7u;ZM?2yˀ_'V*Z 2P%I$I+3.I4>)KWu oi`m=QM]FYvy ~YfSӶRMx#)/I$%;q=\da$I"b=_Y9P%I=ŀSnʑ$If]$i"botrN (]ݏ39 W7TD:&$I}k>AqAvI$I=%I$>%IZ^G '0g9o[D Z`fGJ}&p-0KVݭ  D7-Irj ٯy$I4Up$Ip$IjSDwv#p6pvfnKDG Xr7s3sX́OX$,~`$I$uwI$IwI.goT\@ [lp9ìzX lL (IQ'՘KG$I%%I$>%I,"vtu JXB&z6pNfjqi4\$Ip \ G$I$IT$I  ?2n~KcL!Mˑ$IS\ ywH$Ie]$Ic]$GDľ sc"bKg6\$IZ{vb$I$ K$IR} K$Xr- s5pp 033oUDڔA--J$MV8935]$I$p$Ip$IaU@pPV 3ؔtyNz &IӍg抦$I$&$IT$I}"" 8{4[0$\˛-ido[V l\u$M OR&̭n@[Ӛ*pEgҦ$I$6$IT$I}*"tu?k`f+`!p9p)%>33oEĺ}zI/VwWagg梱6RMHے2lv^̻/I$I$`]$Ic]$igPؼي!]3sv%MLDLg$IS\ʤ +"֠hJ5Ù)I$I K$IR} K$M2UaإيVq%wpp#0+37ZU?X53l4W$IZJ gffK*"b/}i-n{?ešʓ$I$M!%I$>%I&ؑt ?:ip%>z )3oVDzN އ7i4Ikp.p:pnf.hq>Hy3d K$I4p$Ip$IBˁiVH oE}zs$i 8̥͖Ӟ؝t+(_v7̼kI$I&%$IT$ISX~%g7[фg,`vfhVDĚ~ߦ$IXWRgu 1NȯK$I4p$Ip$I"bG6m<J ,U\J9~ 6= B$F(33隈ľ#)%37[$I$i0.I$I1.IE i=`}|f>da툈M==A35#3DĞGYPDH$I4p$Ip$IҸDzΧ/ߧ5ZT3BwJ}Q+"`t *[nBg\|xf딤:< 1p%I$I,$IT$IjID %~IEuF2B#34X[m"bM` V c7S*0c0~pgf>V#bm ԱMI\d|z$I$I2 K$IR} K$ ޟhQ;͕Y% N5 ?OL&)>|,nog/>L.z ුNGG$I)ɀ$I$ǀ$I:&"`}`7`FꞧY9> 53k0uFDl  ”NjifmI$I:$IT$IꚈx)- ,;NUCQ{6Z6JǙyKH$IA%I$>%IԘ3a1BwJ',L<7nqX < c^_~՟Φ̅ #I$Ij Zxr5y^%I$IR2.I)!"3} 3fu~+37XԖF f{eqs6`u7pp\p=$I$f)px73gT$I$5$I"b=E w,!;ɺDsY5~p{f>`m҄Dijw0>6.^8oP_g #I$I:,"> +گJ$IwI$i q,,`0~pϰ1/37Vؚ6>6f^m)hZu0e2fK$I$Igis̳jڞ$I$$IT;a}"1xê!{3sYcjR-(]Y9ȾY88mf.Ákޟq/p+0W̅V%I$IQ...̹5o_$IzwI$&1w~ߢ E{3*Tψάf"bJ^ʪVx| Ǫe@VV$I$ix.p9i~rp%~If.>%I$%I.;2r}Fd#3lB-" l_^C{nnnonGaD`}!c9A(߀$I$IUG_(2w I$Ic]$IjXDl0^(]S3?\G>}?3kԩ'"aSa $I$q:{Q$Ip$IzXDl4>VM8= Z|TzCD>0f\Ӡ'ہ۪q%~Sf.l0I$I񊈷tc 35]$I$$I4DĚ֬> NS5jBS: êvf0ľmfk0I$IvE3YMײenM!I$Iu1.I$ x~zæjԘXA|$I$I:)"f(kWk3r3|ff$I3 K$I 1vBʅ9]b#3h4I$IDWQd6kXUfv+I$Iʀ$I(] oYݮLҤK v;6W$I$IRos5CK2sESH$Idg]$IRψ _gZ#oI2ǐ:$I$I$I>a]$IR_6c00|>&&hp5UcP\T$I$I$I$̀$I)#"6eh̀iMԫIg0?duI$I$I$ITd]$I2@=bi ,s<`x\@͒$I$I$I$ $I1w)FN <#2sE+$I$I$I$i0.I$I=""6ab:Me+h?tI$I$I$IzwI$Is:ackk_I$I$I$I^e]$I$I$I$I$IhI$I$I$I$I$I$I$I$I$I$I$Gp$I$I$I$I$I$$I$I$I$I$I`]$I$I$I$I$I K$I$I$I$I$IzwI$I$I$I$I$IRO0.I$I$I$I$I$I %I$I$I$I$I$I=$I$I$I$I$I$'p$I$I$I$I$I$$I$I$I$I$I`]$I$I$I$I$I K$I$I$I$I$IzwI$I$I$I$I$IRO0.I$I$I$I$I$I %I$I$I$I$I$I=$I$I$I$I$I$'p$I$I$I$I$I$$I$I$I$I$I`]$I$I$I$I$I K$I$I$I$I$IzwI$I$I$I$I 5IDAT$IRO0.I$I$I$I$I$I %I$I$I$I$I$I=$RIENDB`Flask-WTF-0.6/tests/templates/000755 000765 000024 00000000000 11732233667 017153 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/tests/test_html5.py000644 000765 000024 00000003101 11727272153 017607 0ustar00dplepagestaff000000 000000 from base import TestCase from flaskext.wtf import html5 class DummyField(object): def __init__(self, data, name='f', label='', id='', type='TextField'): self.data = data self.name = name self.label = label self.id = id self.type = type _value = lambda x: x.data __unicode__ = lambda x: x.data __call__ = lambda x, **k: x.data __iter__ = lambda x: iter(x.data) iter_choices = lambda x: iter(x.data) class HTML5Tests(TestCase): field = DummyField("name", id="name", name="name") def test_url_input(self): self.assertEqual(html5.URLInput()(self.field), '') def test_search_input(self): self.assertEqual(html5.SearchInput()(self.field), '') def test_date_input(self): self.assertEqual(html5.DateInput()(self.field), '') def test_email_input(self): self.assertEqual(html5.EmailInput()(self.field), '') def test_number_input(self): self.assertEqual(html5.NumberInput()(self.field, min=0, max=10), '') def test_range_input(self): self.assertEqual(html5.RangeInput()(self.field, min=0, max=10), '') Flask-WTF-0.6/tests/test_uploads.py000644 000765 000024 00000010550 11727506372 020236 0ustar00dplepagestaff000000 000000 from __future__ import with_statement from StringIO import StringIO from flask import render_template, request from flaskext.uploads import UploadSet, IMAGES, TEXT, configure_uploads from flaskext.wtf import Form, TextField, FileField, FieldList, \ file_required, file_allowed from base import TestCase images = UploadSet("images", IMAGES) text = UploadSet("text", TEXT) class FileUploadForm(Form): upload = FileField("Upload file") class MultipleFileUploadForm(Form): uploads = FieldList(FileField("upload"), min_entries=3) class ImageUploadForm(Form): upload = FileField("Upload file", validators=[file_required(), file_allowed(images)]) class TextUploadForm(Form): upload = FileField("Upload file", validators=[file_required(), file_allowed(text)]) class TestFileUpload(TestCase): def create_app(self): app = super(TestFileUpload, self).create_app() app.config['CSRF_ENABLED'] = False app.config['UPLOADED_FILES_DEST'] = 'uploads' app.config['UPLOADS_DEFAULT_DEST'] = 'uploads' configure_uploads(app, [images, text]) @app.route("/upload-image/", methods=("POST",)) def upload_image(): form = ImageUploadForm() if form.validate_on_submit(): return "OK" return "invalid" @app.route("/upload-text/", methods=("POST",)) def upload_text(): form = TextUploadForm() if form.validate_on_submit(): return "OK" return "invalid" @app.route("/upload-multiple/", methods=("POST",)) def upload_multiple(): form = MultipleFileUploadForm() if form.validate_on_submit(): assert len(form.uploads.entries) == 3 for upload in form.uploads.entries: assert upload.has_file() return "OK" @app.route("/upload/", methods=("POST",)) def upload(): form = FileUploadForm() if form.validate_on_submit(): filedata = form.upload.data else: filedata = None return render_template("upload.html", filedata=filedata, form=form) return app def test_multiple_files(self): fps = [self.app.open_resource("flask.png") for i in xrange(3)] data = [("uploads-%d" % i, fp) for i, fp in enumerate(fps)] response = self.client.post("/upload-multiple/", data=dict(data)) assert response.status_code == 200 def test_valid_file(self): with self.app.open_resource("flask.png") as fp: response = self.client.post("/upload-image/", data={'upload' : fp}) assert "OK" in response.data def test_missing_file(self): response = self.client.post("/upload-image/", data={'upload' : "test"}) assert "invalid" in response.data def test_invalid_file(self): with self.app.open_resource("flask.png") as fp: response = self.client.post("/upload-text/", data={'upload' : fp}) assert "invalid" in response.data def test_invalid_file_2(self): response = self.client.post("/upload/", data={'upload' : 'flask.png'}) assert "flask.png" not in response.data class BrokenForm(Form): text_fields = FieldList(TextField()) file_fields = FieldList(FileField()) text_data = [('text_fields-0', 'First input'), ('text_fields-1', 'Second input')] file_data = [('file_fields-0', (StringIO('contents 0'), 'file0.txt')), ('file_fields-1', (StringIO('contents 1'), 'file1.txt'))] class TestFileList(TestCase): def test_multiple_upload(self): with self.app.test_request_context(method='POST', data=dict(text_data + file_data)): assert len(request.files) # the files have been added to the # request f = BrokenForm(csrf_enabled=False) assert f.validate_on_submit() assert len(text_data) == len(f.text_fields) assert len(file_data) == len(f.file_fields) Flask-WTF-0.6/tests/test_validation.py000644 000765 000024 00000006142 11727473375 020731 0ustar00dplepagestaff000000 000000 from __future__ import with_statement import re from base import TestCase, MyForm class TestValidateOnSubmit(TestCase): def test_not_submitted(self): response = self.client.get("/") assert 'DANNY' not in response.data def test_submitted_not_valid(self): self.app.config['CSRF_ENABLED'] = False response = self.client.post("/", data={}) assert 'DANNY' not in response.data def test_submitted_and_valid(self): self.app.config['CSRF_ENABLED'] = False response = self.client.post("/", data={"name" : "danny"}) assert 'DANNY' in response.data class TestValidateWithoutSubmit(TestCase): def test_unsubmitted_valid(self): class obj: name = "foo" assert MyForm(obj=obj, csrf_enabled=False).validate() fake_session = {} t = MyForm(csrf_context=fake_session).generate_csrf_token(fake_session) assert MyForm(obj=obj, csrf_token=t, csrf_context=fake_session).validate() class TestHiddenTag(TestCase): def test_hidden_tag(self): response = self.client.get("/hidden/") assert response.data.count('type="hidden"') == 5 assert 'name="_method"' in response.data class TestCSRF(TestCase): def test_csrf_token(self): response = self.client.get("/") assert '

{% if name %}

{{ name }}

{% endif %} {{ form.errors }}
{{ form.hidden_tag() }}

{{ form.submit }}

Flask-WTF-0.6/tests/templates/index.html000644 000765 000024 00000000660 11727272601 021145 0ustar00dplepagestaff000000 000000 {% if name %}

{{ name }}

{% endif %} {{ form.errors }}
{{ form.hidden_tag() }}

{{ form.name.label }} {{ form.name }}

{{ form.submit }}

Flask-WTF-0.6/tests/templates/upload.html000644 000765 000024 00000000677 11727272703 021335 0ustar00dplepagestaff000000 000000 {% if filedata %}

{{ filedata.filename }}

{% endif %}
{{ form.hidden_tag() }}

{{ form.upload.label }} {{ form.upload }}

Flask-WTF-0.6/flaskext/__init__.py000644 000765 000024 00000000070 11727243563 017742 0ustar00dplepagestaff000000 000000 __import__('pkg_resources').declare_namespace(__name__) Flask-WTF-0.6/flaskext/wtf/000755 000765 000024 00000000000 11732233667 016434 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/flaskext/wtf/__init__.py000644 000765 000024 00000003442 11727546254 020553 0ustar00dplepagestaff000000 000000 # -*- coding: utf-8 -*- """ flaskext.wtf ~~~~~~~~~~~~ Flask-WTF extension :copyright: (c) 2010 by Dan Jacob. :license: BSD, see LICENSE for more details. """ try: import sqlalchemy _is_sqlalchemy = True except ImportError: _is_sqlalchemy = False from wtforms import fields, widgets, validators from wtforms.fields import * from wtforms.validators import * from wtforms.widgets import * from wtforms import ValidationError from flaskext.wtf import html5 from flaskext.wtf.form import Form from flaskext.wtf import recaptcha from flaskext.wtf.recaptcha.fields import RecaptchaField from flaskext.wtf.recaptcha.widgets import RecaptchaWidget from flaskext.wtf.recaptcha.validators import Recaptcha fields.RecaptchaField = RecaptchaField widgets.RecaptchaWidget = RecaptchaWidget validators.Recaptcha = Recaptcha from flaskext.wtf.file import FileField from flaskext.wtf.file import FileAllowed, FileRequired, file_allowed, \ file_required fields.FileField = FileField validators.file_allowed = file_allowed validators.file_required = file_required validators.FileAllowed = FileAllowed validators.FileRequired = FileRequired __all__ = ['Form', 'ValidationError', 'fields', 'validators', 'widgets', 'html5'] __all__ += validators.__all__ __all__ += fields.__all__ if hasattr(fields, '__all__') else fields.core.__all__ __all__ += widgets.__all__ if hasattr(widgets, '__all__') else widgets.core.__all__ __all__ += recaptcha.__all__ if _is_sqlalchemy: from wtforms.ext.sqlalchemy.fields import QuerySelectField, \ QuerySelectMultipleField __all__ += ['QuerySelectField', 'QuerySelectMultipleField'] for field in (QuerySelectField, QuerySelectMultipleField): setattr(fields, field.__name__, field) Flask-WTF-0.6/flaskext/wtf/file.py000644 000765 000024 00000003713 11727507007 017725 0ustar00dplepagestaff000000 000000 from werkzeug import FileStorage from wtforms import FileField as _FileField from wtforms import ValidationError class FileField(_FileField): """ Werkzeug-aware subclass of **wtforms.FileField** Provides a `has_file()` method to check if its data is a FileStorage instance with an actual file. """ @property def file(self): """ :deprecated: synonym for **data** """ return self.data def has_file(self): '''Return True iff self.data is a FileStorage with file data''' if not isinstance(self.data, FileStorage): return False # filename == None => the field was present but no file was entered # filename == '' is for a werkzeug hack: # large file uploads will get stored in a temporary file on disk and # show up as an extra FileStorage with name '' return self.data.filename not in [None, '', ''] class FileRequired(object): """ Validates that field has a file. `message` : error message You can also use the synonym **file_required**. """ def __init__(self, message=None): self.message=message def __call__(self, form, field): if not field.has_file(): raise ValidationError, self.message file_required = FileRequired class FileAllowed(object): """ Validates that the uploaded file is allowed by the given Flask-Uploads UploadSet. `upload_set` : instance of **flaskext.uploads.UploadSet** `message` : error message You can also use the synonym **file_allowed**. """ def __init__(self, upload_set, message=None): self.upload_set = upload_set self.message = message def __call__(self, form, field): if not field.has_file(): return if not self.upload_set.file_allowed(field.data, field.data.filename): raise ValidationError, self.message file_allowed = FileAllowed Flask-WTF-0.6/flaskext/wtf/form.py000644 000765 000024 00000010424 11727503265 017750 0ustar00dplepagestaff000000 000000 from jinja2 import Markup from flask import request, session, current_app from wtforms.fields import HiddenField from wtforms.ext.csrf.session import SessionSecureForm class _Auto(): '''Placeholder for unspecified variables that should be set to defaults. Used when None is a valid option and should not be replaced by a default. ''' pass class Form(SessionSecureForm): """ Flask-specific subclass of WTForms **SessionSecureForm** class. Flask-specific behaviors: If formdata is not specified, this will use flask.request.form. Explicitly pass formdata = None to prevent this. csrf_context - a session or dict-like object to use when making CSRF tokens. Default: flask.session. secret_key - a secret key for building CSRF tokens. If this isn't specified, the form will take the first of these that is defined: * the SECRET_KEY attribute on this class * the value of flask.current_app.config["SECRET_KEY"] * the session's secret_key If none of these are set, raise an exception. csrf_enabled - whether to use CSRF protection. If False, all csrf behavior is suppressed. Default: check app.config for CSRF_ENABLED, else True """ def __init__(self, formdata=_Auto, obj=None, prefix='', csrf_context=None, secret_key=None, csrf_enabled=None, *args, **kwargs): if csrf_enabled is None: csrf_enabled = current_app.config.get('CSRF_ENABLED', True) self.csrf_enabled = csrf_enabled if formdata is _Auto: if self.is_submitted: formdata = request.form if request.files: formdata = formdata.copy() formdata.update(request.files) else: formdata = None if self.csrf_enabled: if csrf_context is None: csrf_context = session if secret_key is None: # It wasn't passed in, check if the class has a SECRET_KEY set secret_key = getattr(self, "SECRET_KEY", None) if secret_key is None: # It wasn't on the class, check the application config secret_key = current_app.config.get("SECRET_KEY") if secret_key is None and session: # It's not there either! Is there a session secret key if we can secret_key = session.secret_key if secret_key is None: # It wasn't anywhere. This is an error. raise Exception('Must provide secret_key to use csrf.') self.SECRET_KEY = secret_key else: csrf_context = {} self.SECRET_KEY = "" super(Form, self).__init__(formdata, obj, prefix, csrf_context=csrf_context, *args, **kwargs) def generate_csrf_token(self, csrf_context=None): if not self.csrf_enabled: return None return super(Form, self).generate_csrf_token(csrf_context) def validate_csrf_token(self, field): if not self.csrf_enabled: return super(Form, self).validate_csrf_token(field) def is_submitted(self): """ Checks if form has been submitted. The default case is if the HTTP method is **PUT** or **POST**. """ return request and request.method in ("PUT", "POST") def hidden_tag(self, *fields): """ Wraps hidden fields in a hidden DIV tag, in order to keep XHTML compliance. .. versionadded:: 0.3 :param fields: list of hidden field names. If not provided will render all hidden fields, including the CSRF field. """ if not fields: fields = [f for f in self if isinstance(f, HiddenField)] rv = [u'
'] for field in fields: if isinstance(field, basestring): field = getattr(self, field) rv.append(unicode(field)) rv.append(u"
") return Markup(u"".join(rv)) def validate_on_submit(self): """ Checks if form has been submitted and if so runs validate. This is a shortcut, equivalent to ``form.is_submitted() and form.validate()`` """ return self.is_submitted() and self.validate() Flask-WTF-0.6/flaskext/wtf/html5.py000644 000765 000024 00000004100 11727511733 020027 0ustar00dplepagestaff000000 000000 from wtforms import TextField from wtforms import IntegerField as _IntegerField from wtforms import DecimalField as _DecimalField from wtforms import DateField as _DateField from wtforms.widgets import Input class DateInput(Input): """ Creates `` widget """ input_type = "date" class NumberInput(Input): """ Creates `` widget """ input_type="number" class RangeInput(Input): """ Creates `` widget """ input_type="range" class URLInput(Input): """ Creates `` widget """ input_type = "url" class EmailInput(Input): """ Creates `` widget """ input_type = "email" class SearchInput(Input): """ Creates `` widget """ input_type = "search" class TelInput(Input): """ Creates `` widget """ input_type = "tel" class SearchField(TextField): """ **TextField** using **SearchInput** by default """ widget = SearchInput() class DateField(_DateField): """ **DateField** using **DateInput** by default """ widget = DateInput() class URLField(TextField): """ **TextField** using **URLInput** by default """ widget = URLInput() class EmailField(TextField): """ **TextField** using **EmailInput** by default """ widget = EmailInput() class TelField(TextField): """ **TextField** using **TelInput** by default """ widget = TelInput() class IntegerField(_IntegerField): """ **IntegerField** using **NumberInput** by default """ widget = NumberInput() class DecimalField(_DecimalField): """ **DecimalField** using **NumberInput** by default """ widget = NumberInput() class IntegerRangeField(_IntegerField): """ **IntegerField** using **RangeInput** by default """ widget = RangeInput() class DecimalRangeField(_DecimalField): """ **DecimalField** using **RangeInput** by default """ widget = RangeInput() Flask-WTF-0.6/flaskext/wtf/recaptcha/000755 000765 000024 00000000000 11732233667 020366 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/flaskext/wtf/recaptcha/__init__.py000644 000765 000024 00000000307 11727243563 022477 0ustar00dplepagestaff000000 000000 from flaskext.wtf.recaptcha import fields from flaskext.wtf.recaptcha import validators from flaskext.wtf.recaptcha import widgets __all__ = fields.__all__ + validators.__all__ + widgets.__all__ Flask-WTF-0.6/flaskext/wtf/recaptcha/fields.py000644 000765 000024 00000000757 11727243563 022217 0ustar00dplepagestaff000000 000000 from wtforms.fields import Field from flaskext.wtf.recaptcha import widgets from flaskext.wtf.recaptcha.validators import Recaptcha __all__ = ["RecaptchaField"] class RecaptchaField(Field): widget = widgets.RecaptchaWidget() # error message if recaptcha validation fails recaptcha_error = None def __init__(self, label='', validators=None, **kwargs): validators = validators or [Recaptcha()] super(RecaptchaField, self).__init__(label, validators, **kwargs) Flask-WTF-0.6/flaskext/wtf/recaptcha/validators.py000644 000765 000024 00000004351 11727546577 023126 0ustar00dplepagestaff000000 000000 import urllib2 from flask import request, current_app from wtforms import ValidationError from werkzeug import url_encode RECAPTCHA_VERIFY_SERVER = 'http://api-verify.recaptcha.net/verify' __all__ = ["Recaptcha"] class Recaptcha(object): """Validates a ReCaptcha.""" _error_codes = { 'invalid-site-public-key': 'The public key for reCAPTCHA is invalid', 'invalid-site-private-key': 'The private key for reCAPTCHA is invalid', 'invalid-referrer': 'The public key for reCAPTCHA is not valid for ' 'this domainin', 'verify-params-incorrect': 'The parameters passed to reCAPTCHA ' 'verification are incorrect', } def __init__(self, message=u'Invalid word. Please try again.'): self.message = message def __call__(self, form, field): challenge = request.form.get('recaptcha_challenge_field', '') response = request.form.get('recaptcha_response_field', '') remote_ip = request.remote_addr if not challenge or not response: raise ValidationError(field.gettext('This field is required.')) if not self._validate_recaptcha(challenge, response, remote_ip): field.recaptcha_error = 'incorrect-captcha-sol' raise ValidationError(field.gettext(self.message)) def _validate_recaptcha(self, challenge, response, remote_addr): """Performs the actual validation.""" if current_app.testing: return True try: private_key = current_app.config['RECAPTCHA_PRIVATE_KEY'] except KeyError: raise RuntimeError, "No RECAPTCHA_PRIVATE_KEY config set" data = url_encode({ 'privatekey': private_key, 'remoteip': remote_addr, 'challenge': challenge, 'response': response }) response = urllib2.urlopen(RECAPTCHA_VERIFY_SERVER, data) if response.code != 200: return False rv = [l.strip() for l in response.readlines()] if rv and rv[0] == 'true': return True if len(rv) > 1: error = rv[1] if error in self._error_codes: raise RuntimeError(self._error_codes[error]) return False Flask-WTF-0.6/flaskext/wtf/recaptcha/widgets.py000644 000765 000024 00000005154 11727544052 022410 0ustar00dplepagestaff000000 000000 """ Custom widgets """ try: import json except ImportError: import simplejson as json from flask import current_app from werkzeug import url_encode # use flaskext.babel for translations, if available try: from flaskext.babel import gettext as _ except ImportError: _ = lambda(s) : s RECAPTCHA_API_SERVER = 'http://api.recaptcha.net/' RECAPTCHA_SSL_API_SERVER = 'https://www.google.com/recaptcha/api/' RECAPTCHA_HTML = u''' ''' __all__ = ["RecaptchaWidget"] class RecaptchaWidget(object): def recaptcha_html(self, server, query, options): return RECAPTCHA_HTML % dict( script_url='%schallenge?%s' % (server, query), frame_url='%snoscript?%s' % (server, query), options=json.dumps(options) ) def __call__(self, field, error=None, **kwargs): """Returns the recaptcha input HTML.""" if current_app.config.get('RECAPTCHA_USE_SSL', False): server = RECAPTCHA_SSL_API_SERVER else: server = RECAPTCHA_API_SERVER try: public_key = current_app.config['RECAPTCHA_PUBLIC_KEY'] except KeyError: raise RuntimeError, "RECAPTCHA_PUBLIC_KEY config not set" query_options = dict(k=public_key) if field.recaptcha_error is not None: query_options['error'] = unicode(field.recaptcha_error) query = url_encode(query_options) options = { 'theme': 'clean', 'custom_translations': { 'visual_challenge': _('Get a visual challenge'), 'audio_challenge': _('Get an audio challenge'), 'refresh_btn': _('Get a new challenge'), 'instructions_visual': _('Type the two words:'), 'instructions_audio': _('Type what you hear:'), 'help_btn': _('Help'), 'play_again': _('Play sound again'), 'cant_hear_this': _('Download sound as MP3'), 'incorrect_try_again': _('Incorrect. Try again.'), } } options.update(current_app.config.get('RECAPTCHA_OPTIONS', {})) return self.recaptcha_html(server, query, options) Flask-WTF-0.6/Flask_WTF.egg-info/dependency_links.txt000644 000765 000024 00000000001 11732233666 023332 0ustar00dplepagestaff000000 000000 Flask-WTF-0.6/Flask_WTF.egg-info/namespace_packages.txt000644 000765 000024 00000000011 11732233666 023607 0ustar00dplepagestaff000000 000000 flaskext Flask-WTF-0.6/Flask_WTF.egg-info/not-zip-safe000644 000765 000024 00000000001 11732233666 021512 0ustar00dplepagestaff000000 000000 Flask-WTF-0.6/Flask_WTF.egg-info/PKG-INFO000644 000765 000024 00000002036 11732233666 020362 0ustar00dplepagestaff000000 000000 Metadata-Version: 1.0 Name: Flask-WTF Version: 0.6 Summary: Simple integration of Flask and WTForms Home-page: http://github.com/rduplain/flask-wtf Author: Ron DuPlain Author-email: ron.duplain@gmail.com License: BSD Description: Flask-WTF --------- Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration. Links ````` * `documentation `_ * `development version `_ Platform: any Classifier: Development Status :: 4 - Beta Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Classifier: Topic :: Software Development :: Libraries :: Python Modules Flask-WTF-0.6/Flask_WTF.egg-info/requires.txt000644 000765 000024 00000000022 11732233666 021656 0ustar00dplepagestaff000000 000000 Flask WTForms>=1.0Flask-WTF-0.6/Flask_WTF.egg-info/SOURCES.txt000644 000765 000024 00000002026 11732233667 021151 0ustar00dplepagestaff000000 000000 LICENSE MANIFEST.in README setup.py Flask_WTF.egg-info/PKG-INFO Flask_WTF.egg-info/SOURCES.txt Flask_WTF.egg-info/dependency_links.txt Flask_WTF.egg-info/namespace_packages.txt Flask_WTF.egg-info/not-zip-safe Flask_WTF.egg-info/requires.txt Flask_WTF.egg-info/top_level.txt docs/Makefile docs/conf.py docs/index.rst docs/make.bat docs/_static/flask-wtf.png docs/_themes/README docs/_themes/flask_theme_support.py docs/_themes/flask/theme.conf docs/_themes/flask/static/flasky.css_t docs/_themes/flask_small/layout.html docs/_themes/flask_small/theme.conf docs/_themes/flask_small/static/flasky.css_t flaskext/__init__.py flaskext/wtf/__init__.py flaskext/wtf/file.py flaskext/wtf/form.py flaskext/wtf/html5.py flaskext/wtf/recaptcha/__init__.py flaskext/wtf/recaptcha/fields.py flaskext/wtf/recaptcha/validators.py flaskext/wtf/recaptcha/widgets.py tests/__init__.py tests/base.py tests/flask.png tests/test_html5.py tests/test_uploads.py tests/test_validation.py tests/templates/hidden.html tests/templates/index.html tests/templates/upload.htmlFlask-WTF-0.6/Flask_WTF.egg-info/top_level.txt000644 000765 000024 00000000011 11732233666 022006 0ustar00dplepagestaff000000 000000 flaskext Flask-WTF-0.6/docs/_static/000755 000765 000024 00000000000 11732233667 016371 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/docs/_themes/000755 000765 000024 00000000000 11732233667 016367 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/docs/conf.py000644 000765 000024 00000014505 11727243563 016247 0ustar00dplepagestaff000000 000000 # -*- coding: utf-8 -*- # # flask-wtf documentation build configuration file, created by # sphinx-quickstart on Fri May 28 11:39:14 2010. # # 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 sys, os # 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.append(os.path.abspath('_themes')) # -- 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', 'sphinx.ext.intersphinx'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # 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 = u'Flask-WTF' copyright = u'2010, Dan Jacob' # 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. version = '0.5' # The full version, including alpha/beta/rc tags. release = '0.5' # 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 = [] # -- 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 = 'flask_small' #html_theme = 'default' html_theme_options = { 'index_logo': 'flask-wtf.png', 'github_fork': None } # 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. html_theme_path = ['_themes'] # The name for this set of Sphinx documents. If None, it defaults to # " v 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 = None # 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 = None # 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 = ['_static'] # 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 = True # 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 = True # If false, no index is generated. #html_use_index = True # 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 = True # If true, an OpenSearch description file will be output, and all pages will # contain a 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 = 'flask-maildoc' # -- 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', 'flask-wtf.tex', u'flask-wtf Documentation', u'Dan Jacob', '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 Flask-WTF-0.6/docs/index.rst000644 000765 000024 00000025002 11727550326 016601 0ustar00dplepagestaff000000 000000 Flask-WTF ====================================== .. module:: Flask-WTF **Flask-WTF** offers simple integration with `WTForms `_. This integration includes optional CSRF handling for greater security. Source code and issue tracking at `GitHub`_. Installing Flask-WTF --------------------- Install with **pip** and **easy_install**:: pip install Flask-WTF or download the latest version from version control:: git clone https://github.com/rduplain/flask-wtf.git cd flask-wtf python setup.py develop If you are using **virtualenv**, it is assumed that you are installing Flask-WTF in the same virtualenv as your Flask application(s). Configuring Flask-WTF ---------------------- The following settings are used with **Flask-WTF**: * ``CSRF_ENABLED`` default ``True`` ``CSRF_ENABLED`` enables CSRF. You can disable by passing in the ``csrf_enabled`` parameter to your form:: form = MyForm(csrf_enabled=False) Generally speaking it's a good idea to enable CSRF. If you wish to disable checking in certain circumstances - for example, in unit tests - you can set ``CSRF_ENABLED`` to **False** in your configuration. CSRF support is built using ``wtforms.ext.csrf``; ``Form`` is a subclass of `SessionSecureForm `_. Essentially, each form generates a CSRF token deterministically based on a secret key and a randomly generated value stored in the user's session. You can specify a secret key by passing a value to the ``secret_key`` parameter of the form constructor, setting a ``SECRET_KEY`` variable on a form class, or setting the config variable ``SECRET_KEY``; if none of these are present, ``app.secret_key`` will be used (if this is also not present, then CSRF is impossible; creating a form with ``csrf_enabled = True`` will raise an exception). **NOTE:** Previous to version **0.5.2**, **Flask-WTF** automatically skipped CSRF validation in the case of AJAX POST requests, as AJAX toolkits added headers such as ``X-Requested-With`` when using the XMLHttpRequest and browsers enforced a strict same-origin policy. However it has since come to light that various browser plugins can circumvent these measures, rendering AJAX requests insecure by allowing forged requests to appear as an AJAX request. Therefore CSRF checking will now be applied to all POST requests, unless you disable CSRF at your own risk through the options described above. You can pass in the CSRF field manually in your AJAX request by accessing the **csrf** field in your form directly:: var params = {'csrf' : '{{ form.csrf }}'}; A more complete description of the issue can be found `here `_. In addition, there are additional configuration settings required for Recaptcha integration : see below. Creating forms -------------- **Flask-WTF** provides you with all the API features of WTForms. For example:: from flaskext.wtf import Form, TextField, Required class MyForm(Form): name = TextField(name, validators=[Required()]) In addition, a CSRF token hidden field is created. You can print this in your template as any other field::
{{ form.csrf }} {{ form.name.label }} {{ form.name(size=20) }}
However, in order to create valid XHTML/HTML the ``Form`` class has a method ``hidden_tag`` which renders any hidden fields, including the CSRF field, inside a hidden DIV tag::
{{ form.hidden_tag() }} Using the 'safe' filter ----------------------- The **safe** filter used to be required with WTForms in Jinja2 templates, otherwise your markup would be escaped. For example: {{ form.name|safe }} However widgets in the latest version of WTForms return a `HTML safe string `_ so you shouldn't need to use **safe**. Ensure you are running the latest stable version of WTForms so that you don't need to use this filter everywhere. File uploads ------------ Instances of the field type ``FileField`` automatically draw data from ``flask.request.files`` if the form is posted. The ``data`` attribute will be an instance of `Werkzeug FileStorage `_. For example:: from werkzeug import secure_filename class PhotoForm(Form): photo = FileField("Your photo") @app.route("/upload/", methods=("GET", "POST")) def upload(): form = PhotoForm() if form.validate_on_submit(): filename = secure_filename(form.photo.data.filename) else: filename = None return render_template("upload.html", form=form, filename=filename) It's recommended you use **werkzeug.secure_filename** on any uploaded files as shown in the example to prevent malicious attempts to access your filesystem. Remember to set the ``enctype`` of your HTML form to ``multipart/form-data`` to enable file uploads:: .... **Note:** as of version **0.4** all **FileField** instances have access to the corresponding **FileStorage** object in **request.files**, including those embedded in **FieldList** instances. Validating file uploads ----------------------- **Flask-WTF** supports validation through the `Flask Uploads `_ extension. If you use this (highly recommended) extension you can use it to add validation to your file fields. For example:: from flaskext.uploads import UploadSet, IMAGES from flaskext.wtf import Form, FileField, file_allowed, \ file_required images = UploadSet("images", IMAGES) class UploadForm(Form): upload = FileField("Upload your image", validators=[file_required(), file_allowed(images, "Images only!")]) In the above example, only image files (JPEGs, PNGs etc) can be uploaded. The **file_required** validator, which does not require **Flask-Uploads**, will raise a validation error if the field does not contain a **FileStorage** object. HTML5 widgets ------------- **Flask-WTF** supports a number of HTML5 widgets. Of course, these widgets must be supported by your target browser(s) in order to be properly used. HTML5-specific widgets are available under the **flaskext.wtf.html5** package:: from flaskext.wtf.html5 import URLField class LinkForm(): url = URLField(validators=[url()]) See the `API`_ for more details. Recaptcha --------- **Flask-WTF** also provides Recaptcha support through a ``RecaptchaField``:: from flaskext.wtf import Form, TextField, RecaptchaField class SignupForm(Form): username = TextField("Username") recaptcha = RecaptchaField() This field handles all the nitty-gritty details of Recaptcha validation and output. The following settings are required in order to use Recaptcha: * ``RECAPTCHA_USE_SSL`` : default ``False`` * ``RECAPTCHA_PUBLIC_KEY`` * ``RECAPTCHA_PRIVATE_KEY`` * ``RECAPTCHA_OPTIONS`` ``RECAPTCHA_OPTIONS`` is an optional dict of configuration options. The public and private keys are required in order to authenticate your request with Recaptcha - see `documentation `_ for details on how to obtain your keys. Under test conditions (i.e. Flask app ``testing`` is ``True``) Recaptcha will always validate - this is because it's hard to know the correct Recaptcha image when running tests. Bear in mind that you need to pass the data to `recaptcha_challenge_field` and `recaptcha_response_field`, not `recaptcha`:: response = self.client.post("/someurl/", data={ 'recaptcha_challenge_field' : 'test', 'recaptcha_response_field' : 'test'}) If `flaskext-babel `_ is installed then Recaptcha message strings can be localized. API changes ----------- The ``Form`` class provided by **Flask-WTF** is the same as for WTForms, but with a couple of changes. Aside from CSRF validation, a convenience method ``validate_on_submit`` is added:: from flask import Flask, request, flash, redirect, url_for, \ render_template from flaskext.wtf import Form, TextField app = Flask(__name__) class MyForm(Form): name = TextField("Name") @app.route("/submit/", methods=("GET", "POST")) def submit(): form = MyForm() if form.validate_on_submit(): flash("Success") return redirect(url_for("index")) return render_template("index.html", form=form) Note the difference from a pure WTForms solution:: from flask import Flask, request, flash, redirect, url_for, \ render_template from flaskext.wtf import Form, TextField app = Flask(__name__) class MyForm(Form): name = TextField("Name") @app.route("/submit/", methods=("GET", "POST")) def submit(): form = MyForm(request.form) if request.method == "POST" and form.validate(): flash("Success") return redirect(url_for("index")) return render_template("index.html", form=form) ``validate_on_submit`` will automatically check if the request method is PUT or POST. You don't need to pass ``request.form`` into your form instance, as the ``Form`` automatically populates from ``request.form`` unless alternate data is specified. Pass in ``None`` to suppress this. Other arguments are as with ``wtforms.Form``. API --- .. module:: flaskext.wtf .. autoclass:: Form :members: .. autoclass:: RecaptchaField .. autoclass:: Recaptcha .. autoclass:: RecaptchaWidget .. module:: flaskext.wtf.file .. autoclass:: FileField :members: .. autoclass:: FileAllowed .. autoclass:: FileRequired .. module:: flaskext.wtf.html5 .. autoclass:: SearchInput .. autoclass:: SearchField .. autoclass:: URLInput .. autoclass:: URLField .. autoclass:: EmailInput .. autoclass:: EmailField .. autoclass:: TelInput .. autoclass:: TelField .. autoclass:: NumberInput .. autoclass:: IntegerField .. autoclass:: DecimalField .. autoclass:: RangeInput .. autoclass:: IntegerRangeField .. autoclass:: DecimalRangeField .. _Flask: http://flask.pocoo.org .. _GitHub: http://github.com/rduplain/flask-wtf Flask-WTF-0.6/docs/make.bat000644 000765 000024 00000006007 11727243563 016353 0ustar00dplepagestaff000000 000000 @ECHO OFF REM Command file for Sphinx documentation set SPHINXBUILD=sphinx-build set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories 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. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. changes to make an overview over all changed/added/deprecated items 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 ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "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. goto end ) if "%1" == "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\flask-mail.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\flask-mail.ghc goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "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. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end Flask-WTF-0.6/docs/Makefile000644 000765 000024 00000006076 11727243563 016414 0ustar00dplepagestaff000000 000000 # Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @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 " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @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." 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/flask-mail.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/flask-mail.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." 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." Flask-WTF-0.6/docs/_themes/flask/000755 000765 000024 00000000000 11732233667 017467 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/docs/_themes/flask_small/000755 000765 000024 00000000000 11732233667 020657 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/docs/_themes/flask_theme_support.py000644 000765 000024 00000011413 11727243563 023017 0ustar00dplepagestaff000000 000000 # flasky extensions. flasky pygments style based on tango style from pygments.style import Style from pygments.token import Keyword, Name, Comment, String, Error, \ Number, Operator, Generic, Whitespace, Punctuation, Other, Literal class FlaskyStyle(Style): background_color = "#f8f8f8" default_style = "" styles = { # No corresponding class for the following: #Text: "", # class: '' Whitespace: "underline #f8f8f8", # class: 'w' Error: "#a40000 border:#ef2929", # class: 'err' Other: "#000000", # class 'x' Comment: "italic #8f5902", # class: 'c' Comment.Preproc: "noitalic", # class: 'cp' Keyword: "bold #004461", # class: 'k' Keyword.Constant: "bold #004461", # class: 'kc' Keyword.Declaration: "bold #004461", # class: 'kd' Keyword.Namespace: "bold #004461", # class: 'kn' Keyword.Pseudo: "bold #004461", # class: 'kp' Keyword.Reserved: "bold #004461", # class: 'kr' Keyword.Type: "bold #004461", # class: 'kt' Operator: "#582800", # class: 'o' Operator.Word: "bold #004461", # class: 'ow' - like keywords Punctuation: "bold #000000", # class: 'p' # because special names such as Name.Class, Name.Function, etc. # are not recognized as such later in the parsing, we choose them # to look the same as ordinary variables. Name: "#000000", # class: 'n' Name.Attribute: "#c4a000", # class: 'na' - to be revised Name.Builtin: "#004461", # class: 'nb' Name.Builtin.Pseudo: "#3465a4", # class: 'bp' Name.Class: "#000000", # class: 'nc' - to be revised Name.Constant: "#000000", # class: 'no' - to be revised Name.Decorator: "#888", # class: 'nd' - to be revised Name.Entity: "#ce5c00", # class: 'ni' Name.Exception: "bold #cc0000", # class: 'ne' Name.Function: "#000000", # class: 'nf' Name.Property: "#000000", # class: 'py' Name.Label: "#f57900", # class: 'nl' Name.Namespace: "#000000", # class: 'nn' - to be revised Name.Other: "#000000", # class: 'nx' Name.Tag: "bold #004461", # class: 'nt' - like a keyword Name.Variable: "#000000", # class: 'nv' - to be revised Name.Variable.Class: "#000000", # class: 'vc' - to be revised Name.Variable.Global: "#000000", # class: 'vg' - to be revised Name.Variable.Instance: "#000000", # class: 'vi' - to be revised Number: "#990000", # class: 'm' Literal: "#000000", # class: 'l' Literal.Date: "#000000", # class: 'ld' String: "#4e9a06", # class: 's' String.Backtick: "#4e9a06", # class: 'sb' String.Char: "#4e9a06", # class: 'sc' String.Doc: "italic #8f5902", # class: 'sd' - like a comment String.Double: "#4e9a06", # class: 's2' String.Escape: "#4e9a06", # class: 'se' String.Heredoc: "#4e9a06", # class: 'sh' String.Interpol: "#4e9a06", # class: 'si' String.Other: "#4e9a06", # class: 'sx' String.Regex: "#4e9a06", # class: 'sr' String.Single: "#4e9a06", # class: 's1' String.Symbol: "#4e9a06", # class: 'ss' Generic: "#000000", # class: 'g' Generic.Deleted: "#a40000", # class: 'gd' Generic.Emph: "italic #000000", # class: 'ge' Generic.Error: "#ef2929", # class: 'gr' Generic.Heading: "bold #000080", # class: 'gh' Generic.Inserted: "#00A000", # class: 'gi' Generic.Output: "#888", # class: 'go' Generic.Prompt: "#745334", # class: 'gp' Generic.Strong: "bold #000000", # class: 'gs' Generic.Subheading: "bold #800080", # class: 'gu' Generic.Traceback: "bold #a40000", # class: 'gt' } Flask-WTF-0.6/docs/_themes/README000644 000765 000024 00000002105 11727243563 017245 0ustar00dplepagestaff000000 000000 Flask Sphinx Styles =================== This repository contains sphinx styles for Flask and Flask related projects. To use this style in your Sphinx documentation, follow this guide: 1. put this folder as _themes into your docs folder. Alternatively you can also use git submodules to check out the contents there. 2. add this to your conf.py: sys.path.append(os.path.abspath('_themes')) html_theme_path = ['_themes'] html_theme = 'flask' The following themes exist: - 'flask' - the standard flask documentation theme for large projects - 'flask_small' - small one-page theme. Intended to be used by very small addon libraries for flask. The following options exist for the flask_small theme: [options] index_logo = '' filename of a picture in _static to be used as replacement for the h1 in the index.rst file. index_logo_height = 120px height of the index logo github_fork = '' repository name on github for the "fork me" badge Flask-WTF-0.6/docs/_themes/flask_small/layout.html000644 000765 000024 00000001253 11727243563 023063 0ustar00dplepagestaff000000 000000 {% extends "basic/layout.html" %} {% block header %} {{ super() }} {% if pagename == 'index' %}
{% endif %} {% endblock %} {% block footer %} {% if pagename == 'index' %}
{% endif %} {% endblock %} {# do not display relbars #} {% block relbar1 %}{% endblock %} {% block relbar2 %} {% if theme_github_fork %} Fork me on GitHub {% endif %} {% endblock %} {% block sidebar1 %}{% endblock %} {% block sidebar2 %}{% endblock %} Flask-WTF-0.6/docs/_themes/flask_small/static/000755 000765 000024 00000000000 11732233667 022146 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/docs/_themes/flask_small/theme.conf000644 000765 000024 00000000270 11727243563 022627 0ustar00dplepagestaff000000 000000 [theme] inherit = basic stylesheet = flasky.css nosidebar = true pygments_style = flask_theme_support.FlaskyStyle [options] index_logo = '' index_logo_height = 120px github_fork = '' Flask-WTF-0.6/docs/_themes/flask_small/static/flasky.css_t000644 000765 000024 00000011001 11727243563 024465 0ustar00dplepagestaff000000 000000 /* * flasky.css_t * ~~~~~~~~~~~~ * * Sphinx stylesheet -- flasky theme based on nature theme. * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: 'Georgia', serif; font-size: 17px; color: #000; background: white; margin: 0; padding: 0; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 40px auto 0 auto; width: 700px; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 30px 30px; } img.floatingflask { padding: 0 0 10px 10px; float: right; } div.footer { text-align: right; color: #888; padding: 10px; font-size: 14px; width: 650px; margin: 0 auto 40px auto; } div.footer a { color: #888; text-decoration: underline; } div.related { line-height: 32px; color: #888; } div.related ul { padding: 0 0 0 10px; } div.related a { color: #444; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body { padding-bottom: 40px; /* saved for footer */ } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } {% if theme_index_logo %} div.indexwrapper h1 { text-indent: -999999px; background: url({{ theme_index_logo }}) no-repeat center center; height: {{ theme_index_logo_height }}; } {% endif %} div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } a.headerlink { color: white; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #eaeaea; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { background: #fafafa; margin: 20px -30px; padding: 10px 30px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; } div.admonition p.admonition-title { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-bottom: 0; } div.highlight{ background-color: white; } dt:target, .highlight { background: #FAF3E8; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt { font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.85em; } img.screenshot { } tt.descname, tt.descclassname { font-size: 0.95em; } tt.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #eee; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td { padding: 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } pre { padding: 0; margin: 15px -30px; padding: 8px; line-height: 1.3em; padding: 7px 30px; background: #eee; border-radius: 2px; -moz-border-radius: 2px; -webkit-border-radius: 2px; } dl pre { margin-left: -60px; padding-left: 60px; } tt { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ } tt.xref, a tt { background-color: #FBFBFB; } a:hover tt { background: #EEE; } Flask-WTF-0.6/docs/_themes/flask/static/000755 000765 000024 00000000000 11732233667 020756 5ustar00dplepagestaff000000 000000 Flask-WTF-0.6/docs/_themes/flask/theme.conf000644 000765 000024 00000000141 11727243563 021434 0ustar00dplepagestaff000000 000000 [theme] inherit = basic stylesheet = flasky.css pygments_style = flask_theme_support.FlaskyStyle Flask-WTF-0.6/docs/_themes/flask/static/flasky.css_t000644 000765 000024 00000012453 11727243563 023311 0ustar00dplepagestaff000000 000000 /* * flasky.css_t * ~~~~~~~~~~~~ * * Sphinx stylesheet -- flasky theme based on nature theme. * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: 'Georgia', serif; font-size: 17px; background-color: #ddd; color: #000; margin: 0; padding: 0; } div.document { background: #fafafa; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 230px; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 30px 30px; min-height: 34em; } img.floatingflask { padding: 0 0 10px 10px; float: right; } div.footer { position: absolute; right: 0; margin-top: -70px; text-align: right; color: #888; padding: 10px; font-size: 14px; } div.footer a { color: #888; text-decoration: underline; } div.related { line-height: 32px; color: #888; } div.related ul { padding: 0 0 0 10px; } div.related a { color: #444; } div.sphinxsidebar { font-size: 14px; line-height: 1.5; } div.sphinxsidebarwrapper { padding: 0 20px; } div.sphinxsidebarwrapper p.logo { padding: 20px 0 10px 0; margin: 0; text-align: center; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: 'Garamond', 'Georgia', serif; color: #222; font-size: 24px; font-weight: normal; margin: 20px 0 5px 0; padding: 0; } div.sphinxsidebar h4 { font-size: 20px; } div.sphinxsidebar h3 a { color: #444; } div.sphinxsidebar p { color: #555; margin: 10px 0; } div.sphinxsidebar ul { margin: 10px 0; padding: 0; color: #000; } div.sphinxsidebar a { color: #444; text-decoration: none; } div.sphinxsidebar a:hover { text-decoration: underline; } div.sphinxsidebar input { border: 1px solid #ccc; font-family: 'Georgia', serif; font-size: 1em; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body { padding-bottom: 40px; /* saved for footer */ } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } div.body h1 { margin-top: 0; padding-top: 20px; font-size: 240%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } a.headerlink { color: white; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #eaeaea; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { background: #fafafa; margin: 20px -30px; padding: 10px 30px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; } div.admonition p.admonition-title { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-bottom: 0; } div.highlight{ background-color: white; } dt:target, .highlight { background: #FAF3E8; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt { font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.9em; } img.screenshot { } tt.descname, tt.descclassname { font-size: 0.95em; } tt.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #eee; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td { padding: 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } pre { background: #eee; padding: 7px 30px; margin: 15px -30px; line-height: 1.3em; } dl pre { margin-left: -60px; padding-left: 60px; } dl dl pre { margin-left: -90px; padding-left: 90px; } tt { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ } tt.xref, a tt { background-color: #FBFBFB; text-decoration: none!important; } a:hover tt { background: #EEE; } Flask-WTF-0.6/docs/_static/flask-wtf.png000644 000765 000024 00000025534 11727243563 021006 0ustar00dplepagestaff000000 000000 PNG  IHDRb5 +vsBIT|d pHYsa(atEXtSoftwarewww.inkscape.org< IDATxg$Uն8($EAA |P_A JQPD%Jxɒ*YA2 ~3=}:Wu0]^{g6L&d2L3d2L&3B&d2d!d2d2Lf@d2L&3l d2L&@62L& L&d L&d2n; fzxxxY"2d2P{JGhj̛ӳg2L&3tA4X`g`u`q@%yy/L&dF$b HXXO6pptL&d}3`}8sWd2LfJzn HZ=-ۧvG2L&*@.M`sG:5d2L&3ؔn HZ 8d wGٞ8؝d2Lf(@8pֵ`wdjG҇$m L8Lf4!! ,SJ=6 `FB[iy`-ۯV'f$- O,eԁ[[پpd27ex_B $ #s[r$lؕ5_S35Lei Xb[dz`I33s'~ 6!H_N%HZx8m`؝I"Vm`$EG붗wS|h.p) ̶TB;C_AsNS~(@xĶrpup?1u0oef`ZBzv$}Wҥ/1``هL5$ y3>}:fv iQۏvĀc=.zi.yc %Ȟ\M֏^OwJR)eOV7 X8x]zڡb,_;C'd۹I,+iNXBJ62 (sWăw0rZ^tp|sYM6}_Ƅ ΪLK %l.36v 'aXT4 -3ij o$8S@(ۯ?3,n_ 1erS+i/φ_<^=[`S ^ j ]SE "1^R͜J:;OsK-m!9"b0b%"qaMI_%n_i.hMC$|: R4ztl oI1*C ; 6U<%$4˾4/-il|&~`FdG8fiC@(#am!HbvwcN"ɺ?FxڡB"(fˠ Yu]Z͵3'~DJGm?{l bDtQ~KM#IؾpHҬ5$r_CqHm_l-BU;| pu@(:y!lii?t?- 艁 i)bn%5 Lr XpwV8~x 8 pK$-Y]]qlGJū^o|8(+֞^S>D^jMZBoi6 %it0xM'BIsҼ G<F)0p{&юB ࿶Yۋlof$fK"hI?N]Lm9ф(Ҵ5۾@-PoOʲi\ }};Sqw=&r.H`JB ,!ifl 4_ 53C^nJp8lwNlKR ȲZtV<͔H [&QRwf4Cmw.X:"FMc%Ԥ幅$J pxHTONYZ:ÇfJQť7RLUT]@Čx Wi4Bw žm]DI%ʭX9' MuKLSlOT! :8n4k&62C* n.hsi,Nc%<)-p'i,AqLd4T8- u<RG@<˹/$d+ؐTOx?aYݒ3mQD)@.Sq:e0mM$ƒp*n Hd2nJ 菁p0V-)IiYz(f/v^>S Ҳ0牂XϦ?Dl٫~5Ĺz0_%x^)IW!r]7&ƧvxM@(1n{62gEҟzn+|H')>_I1`x2r ph EQ D c S6$ !p$M4ZJ,LG)4CU{_tӈh0~lmdE)!\g3V=l IH:}K丷{USqq>qЊQwS@șRYXx8|XX06 ^"RT\ EGwiCæBpO2H"FSf*Lg{lSMI?}KCO'Qabtg O ^_sDH:v?pbU6XfI7Zے /a4֫q-ʔ)8Aҕ@,ҧu>zۜx[e+8^V$vĠ`-閗z EbIs4l=Z{ XR/: rLRBi{Lv!~@TBAA=+D̈́:; 5mIޏ:}[[cTB1(46]vFb޸娂}[G #"(^V/~}ϷqMMTjlRPoM`.4`tFDʅ |Qe&Ǻ ظvnC78'`~QV&a!FvNSl*qevµ x\)l;.24BI_!+7ۧ;QW3AI0'mX߮e} پ5Z+qmibo؝Ike=? 1S{2p83)@4e pJ"=p=. 5-db6==ֿO0Sz=`9R{=& fjQU8Qecb"IwYaAVJS81p<\ Fa۴9BG;F]uїBHځ|TZN P `bZf:ˈ{wa1 L۔A·ll"쒚߶Ǫ"Cx"WV8ۋ #˩SKmLs=u8Xl ?ik.drw 3dpTۘb NdTslYM݋7xI9ml_H I,ڃd`ubZ\ε xbi_*<[Hz>KY}6q"<2}]/Iђ6#"+ML)f"KЌGDAQ\8GRlۯ&a#mv8#&RX+ !23p}fn F7ɒd]cR` jNV D &t_a,p|ΐ4;Lu6MPez^۔<񜺮4:*8UcKEJSQED3u3kY5dݗG% ">{^@4(1IxmZw׮sr)~9,DxG`3=, шWKDf#mnTZDw, -ܠB<H-a$}8KOh\BL3"8߆x`YTG.JÙs~y*F: 0+ Z'>IL jzB?@Rk IErI-C"Ϸ}lz12='ou 'mp(a$+mIoo Tb_I :O.d  {;}.,Igԫq>6nLLñ:1铧%g0d`]&U_ l=hʱDZW?Y_$F!iBф$Zi]I+O%i `ʴH#14SSCHܾlR%ls6>^h#1!mmƹ.01}YYfK3*88 mz4p QrdLh0D1Ͱ!pU^2L63uQPy(Vv}+iV9KZȺP4pOJL4JS_&!jֿNxL9 "2STtFrϻ0yXֶv}F=V +* KNlP|g7\2H@VGB^,?oz}8\@6 ~v(S!6lv%Kھ3HO1aRӉsPh:8G)QV(H vA [x.Pn=kHBKZľtM4.U4PX ;,zEPWlj͹۾)Ne$ ]-Y+i#BsI:H6M)4Bo]bTwSN=Qk .NF]#F߷2~+}s~.4. #PiҧDN#Ci:d8 I0i IDAT &< SحSX Ѳ2@'BrE9ZR75wth)mhIPUm2-ohIGrEųX)+K otV"8 2H=`kR IsKmq;aX4>M%dE55%zݕ4Svam [DjNJ7H#^Vö%ɍwIKVG$&/Dj:h#ym纋nػyZOtsnEJ:k=p.pf MI`u;xh~y2+^^!Xx`l9B0e L~MꇕQ4Dޓ.mRlwl<`u sB)q"$QWS$񧳀wBʏku~3&h&gii(IU;LҦ]_I#IߣV ޟD ܍)XHn=1y[CCl?B?ڊl d STzՆ?ؒtBS~4kI۾[֯z{NiIb# / nԽmЪv+KTfNŋ nx'ST@],\v*T" /]=:-γTumؾk>U+ tFC+SeYb9S {oշlo{5؉oF(> .AI$Ucrs{BNN^Ah{A۫>S[Gjx_t:|HBը h6Z&4Y76@50IKU'$m*i'5֮8:1G|;93p[,d'mDR36P0ZJCH,sLfJl^jMO,`~LmC%g0ʵkU;'k?Ѣ_^+9灯} }fu=I#z:ioM"e/BzYoפo7Wi|!j9seښk `>^_"”V>m\ӯZWkcKhgu``Oӏ~$ziqx(`վgVpLݗ/4pkGBw!}Vu mGգx#ne&~OY@cD!W{ 5FzhmB^չߥkt1_c޲D@v(_G\y02Oӏ}Fnn8{Sk#>g:bj"/M 13>}"bu<\Lҗc/#qG9j1?H;Y^!%}Wޠ%:8(Mot`+a\o" Jjr`Yx>MCۤ@!KYA09`p2։B= ui$-N\T>ȱ 2 ;e[ mZ*!˼~=O":ude탈@< )]ǫVھ ]]wŔ$b$Pzl.uTd QfH擒ft*x 8FiK@Io_u)z"Pۇms8`$޴:1"})-/WV"gIu^}K$a?tZjoelu 7JZ ؚPڼvZ&`1~C#''&텈ij^{0+˝&ݰ8YOby6RmZ3X~}O=¹5 Pfȫhrzc$\#4&]NTp-e%0#QpR63#UZ=^NXi6v j4zoŀnTHP-*jhϐ4\jFdDu=$)@؍P'vTCTiE(d2HBIe)*L(= V<;p{F)Ku`؈lav"yF:E3]B_}rg2L&3)3HdU*Xf H&3ld2L&Sz`R Ӗ\BKu v$4_!ҺN}c3L&LIΛne^ET ڞXV3L&LIO T~