jerry-3.2.0/0000775000175000017500000000000013514421177011374 5ustar useruserjerry-3.2.0/jerry.desktop0000664000175000017500000000026113514421177014121 0ustar useruser[Desktop Entry] Type=Application Terminal=false Name=Jerry - Chess GUI Exec=/usr/games/jerry Comment=Chess Program Icon=jerry StartupNotify=false Encoding=UTF-8 Categories=Game jerry-3.2.0/COPYING0000664000175000017500000004323413514421177012435 0ustar useruser GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. jerry-3.2.0/README0000664000175000017500000000000013514421177012242 0ustar useruserjerry-3.2.0/src/0000775000175000017500000000000013514421177012163 5ustar useruserjerry-3.2.0/src/books/0000775000175000017500000000000013514421177013300 5ustar useruserjerry-3.2.0/src/books/varied.bin0000664000175000017500000550212013514421177015251 0ustar useruserh9HutuHu?_u+ 4,C^ .dNkM P#Z'fBK4֪S e XE(6( cJp Bzjަ <5R ΩP* 2  YFR3 ”vRbQ otV aX\xN X\xN m D$, O x<% !]!] n݋ ߜAû(P(Kym@W #(SR(Y( >C> l8 lj# lt l l (!;gݐ#"< "- b#S d #Ї a$|$&_H7&i懃 'eH{p6'tRn %'xZ(In?)⼏Q )⼏Q*m!*O#*JlN+c^3{Z,,|Y ,-& .nj) j .xJVR  1*~/ 1L:ªI 2@!!D 4+kP' 4U 5!L:r5PQ5[5黨G 6a76R 7}[U[9ہ|? 9_Frh9kCm'd :{ ;%uv ;%u;Tf`:zj;Tf`:zt;;/ xt8d ? Kf@cc. A]uJ6_Aw< +ABg]? jBGD)BGD$ D0'{O Dg0HK Dd)DE)E('r cE@a *FI8uv F鴠xFJw{ReJsgW LM,ڒ LAlLAlM*,vQM2d[ N[O*O*c}axdO O|rNPK?yJRv'RD1RD1LRǴ|UH$fR UJY\ VI t"WX](*) i XXMRX(r7j[6cP[IG? [ ]kC^4^L\{^ܔYrp i _0vuC&_]H5: b@Amb_(b'%cyϊ&jhc-<Z fP?!ag⎟g⎟Dg⎟jh>K a?hfjh!j*䤨j*䤨lssl˲.niVzYn;co" +!o(96_C pV $-p`'vpCqU ZK qeV3qeV? t}齫xp@~xj?y=Fyqiye5z}|W9zBh z& {0JZb {0JZ {h܏f{v3H s{#cS"{#cS {#cS|$]@|$]@||;bL a }f , ո$3tո$3 ςbՐ[MbO GuYs @*tY# iM!B/iM!B iM!B,cuEsA[$1L[$1S %,6 %,6O.!  :i7 ge'R!~7`v A cJ cJjcJq.U+z|RDB' ,H g0R(:p?U ?U 0&! sH} ^DK''% Z47 tO.2&S}|K)Y <RuH" Z?ӳH!#ӳH! iEiA]EiA* @tS\ \Vx;dz͟ M= KqS) Bg/$w?q}rϠ Y d?G -(? 0 ӕ+T DPsDP Q]tz?K, 1?E$Vb m Edz p|ϥ p|ϥ p|ϥi4 V@?KV@3V@ Lɯ@ $+zO1+zO1R$ + i(*A  NXn JKQ |]U( =Btc^S!D0M_N5u.c5sy5 Yw J.IJ.I|_q$/2\ ץH MBiizR <-׸7W[SW^ Rv.lkˀ|-&? .}mlO,DdR^^6dq\j Ϊ"]K a>C .* ~D8.* ~.* ~s}4Rs}4Иy\ ѯ1t,N1 N1 ,Twljwl wl4a at)ښJ|{ ,{K~DK!+sQEQ e]ke]kKo I ; e8[C $e8[Cs&e8[C e8[Ch}Y't }Y'kB"  Ok 3K?&Hޒ栍-*C aM*C LC*C Z ))՘ s(H! wz}' ,wz}'8b& SMG*|n. (!n. | IjqagD,lqQ HG3!sK\& ny- J W E&Ǻ7\~Rp+Y0p+U%_JXJ}K_JXJ}#_JXJ}Y_JXJ}gCV6p" c#͑d6c -SZ+jH|5p7Yp7Ydg@|2)Ӷ (g/Kl8s7zQF œoFx vvt 0a,5 `KP r:3;  q b g_?)`I ӓn+\ {Z&\ {Z9r\]U/a[m# 4FK 4F ? ʴK h  `'v_  vnO  R+O :m.,c  <7R  tiO ,Ẻ̛[q! iՐD$ՐD$-Aއ-Aއ-AއW9Q*z/LĆ̍j/LĆ̍ *ōt # (E](E@b5WαaϏ << 2 ֵr\h)mj  'T6f ެ2 Oo¡q iz#1 ^ W\ \!ab =!?>s!s1ݪ \!vh("D|!51 "ݻQ#Ah##S$ }|a &2&=&= ,(@8M(sU *l g*,m *~a B+$7b+ucݓ.$.L 0^-+e 0*o1%+t ,1R Y2=ˆ 2=ˆ3in 4';=>s5UQR6B: (79E"A" :27Gr;U3Q\r=X ˸=X ˸?Vv @}l A~ߜG> A}c{!%A|RFQf !A|RFQf B)ZJB^Nn3DPsp &DPsp DKp ; D[ `DBZGPHRGcm?[ H IPqw.m I k IBVZ IBVZjJaq;O? J0u K"$LjڜmbLps2 eM H"= MJķNWu[OL O P;2bwX PhV"EPXj4Rj>np% RJ"T?ВdT܃GUZ)! VEѤYn׏-hB ] H|s]mr. ^װ%)iR_؝`/ 4u&s a~0 l ab >Nb]u.b;vb;vb;vb;vc͞Nc6[T f_!كbiBVM -iH1iH1iH1j;D7ɔj]>gkl^1R(l^1` ms>!+m/蛡 rn}oK2 pU#Nmp&% q$GxDr!7b`(ir%$EFs 8kth_bwbr[/xAo5y,= zG JzG  }$q}1)}x*۠} M}Bљ )4Vc} e4d+Rt72%ؙl5{o$`t 7%7%7%R 7% ey؅ o:SO Q+?c1p Z_$ 2 f '$nq9xo%W/?I/?IRTFD6[lnຆA z/y -z/y "~70% (Ǚy_L ?݃YR{feV{feV #M SjS"? 2LQ O#>m V:p6^?grS H^.$?&/V&/ u[[Q V|dYKԛgcSIN! z=M Sya o$zAf; -lD@L -lD@d O) 2F  t \S" MSV aOR aOR"`)5D)5DˑS#ˑˑ.SdvC.1 0k4k4y*bMm؏ŊmYw;?n4|R'};nuvo!+j6> ,PR+O'ބ1S;9ɕ %S;9ɕ jG/b~: :h3b$0Q ǔP?Iwh i,WuE^ \>VPm s}Y c\QY RQ }> ci]·s l5g eEJ? ┶5jĢnIbRN%{9}C İk߉[th4 &iov*G] GPPٞ  GPPٞ  sʃ< vXe\$  'kRB+FC RPar⽏C 5 ϱ)R7R}<ٔr7ï[n#9AMLZ0%!- -8٭fFɛɛa<RWW1  >Ӯ?D6!h ?괪  @_?tsf BqR yL BuL8 -Bu[ C]Uot!CtLCtXCd CDbn3 Ew'Ew Eo'L Uloj Ulo Vҭ|,Vҭ|WRFf^# WRFf^#WRFf^#WV}zXE8| #X1  X'mEYa Z34FY.[N. [N. $[N. [N. \J'\< 2]8! #^? ^:z d{a@Gd{a@GejM/e=F3eOUf HS fVhq f:vNg4T2[hV=hVPi8dDi8dDi퟉%l/hb l/hm3]L mRU.Ymt! nmzC-Jsm@I;n4c$ nN.nOdih o !p54 pn=?pF#1X[s gn"s.w{&[sC4sC45tPjt[y t)X^YUu u&Tu5 g vGrjkvGrj $yvaz7~C!z7~Qz7~ z7~z0{_={_=N| \~A~A8ki -19G%  C| gŁ- Ł-؛oZg\yQ_\_\_\Q=_\ YgSt}Md!!Kf&\~ sRtnՍ <=<= E|%j > , jLжжжR R pZIs@-o   | VkX se{ j95#,? S . 'Og'Osv<:#_# Kgzj6 x4)|k1 HwDLh;_ =h;_s@/[^nFK _l*mս3I% 3;-H 5 np jt nѥ6o2fC ;OdcNd5ad OU !yD'[ @ڷ2D[JnXLlO$T= h2} #  DK;LB $ ##7#]ϰyX ( ҄zNɂw DaB_ S\[ ,Kn aȥzq  kj+|~R[.+|~R[ ƴ1& WDWD^W(^W(N7wOuʪCegX kK"Sn.[ ͠,o#/H~,'F l'F s ⪆/ \PLfQ:Ru hӛ|?%Hf]8 =Ր e: \JRA̋d!?խb,EHTqZ: qZ: T(kxDjkxD=H[{ H[{?ϥϥ \ ϥ ]z %UW/7S UOJoR @:SA  >xZx] $sR  k4 -g2C  fy I `?+ ` \ }^5S! }^5b@# [T.rpTN1Fτy #1[ňKN&Z`%6`%|tc[[Juz a1P m*ho~ X'Ys'Y w(v8  i  s#u $<*+$`OY$`O& &)ڮ#'isr[(;fR(;f)YgI)YgI2)YgI)k n i,73O (=,73Ot9-\/oʗ/ {L0s# 3b!# 3G;a3.]g4]5T˖C 5q@ 5 @S6!s]X?6Mn7TNv8h $8h 8h ,78h (8h 9^w` $9y= i:gl0Q:ɪr 7:ɪr? ;. <3 j<3 ? JNJNJNKJ/;eKD SLd9{L1)ZsRLЊyMIo.T M>YNq O+θŽO;[  O(- P+S[ Q<R Q2_R4̻eRiTKfWBRTmu=Y Vj`TjW:>/9X&:|)?"X&:|) iX&:|)sXNfL Zu_[@ZSb\}'$\`\`]I,_7]I,_^%;p_X_*m+`.,`Gv] #`9R `~Qc 1=+ czfY/ du|j du|j fW :j f3kMgtoYgto$hRk T m'ވvmuIot0muIo (muIo nn!d<0naOo|EN ioownpT}zPpl iplw3j t:ζ,ta ita tQ{l t)͜v8t?wez$wezLws]wswsQwgyΜYxBY~h xMXvxs;KZy>i y/z\1{ . v{jo{3< |9! }}o~Z ;;K?P`JOOАX;<^/>;<^/;<^/; n  ;{ Ij]DvaDu aDu aDu ,aDu aDu j/K MB޼ 2j& Sc1aipIfS0%LUޮ#6#6$|=ϸ=ϸp]ܜ  )T)T %SA%SA,P hm U0sAZ_ JxRZ< It. 3<RtXY1 ߝ 5u$% ?.! \ $˖/[M4gZ >˭A : <j31z_Q 3n\j8(:7NRVbEmiߔ:`s?<[4 ,ҷ hr P .E[bԼE[bԼ_TCTQų.A h 2QojQoj%si0Z^a. !a. a.Rl+;a $N΢$N΢# L֎<;? L4> r!glUK۝0C;) $;)s;) zr`Czr`=e_<Y _<|}/LtD? s:w ^$:w ,:w $:w (0{  fG!-k3z+ k3z+ >0  xRFF"ɅWh|tV?T0Y tmQqOA qOAqOA1< $ lWH@  /Hm=`5앩N K?9q%ZR 숕J ~gceYNėgS%(($z-\t I >).,W (únKUɾ ] QK{˩gt? ΄ yK X?/s.|NOVϪYIЩRNtRADѨwbd%S` #`\+g^xQԎQD :ŋ_%:ŋ_M1DM1DmZCdmZCf a f sZK5Ѳ"ӯsڄځvBS ڄځvB%ڟc#Y1L H2EL&_#FL[83Œߠ,!YiYĄ#h HՖDHՖDNHՖDQHՖDYHՖD*I aC ^QQyE+VNZ 55N~?S ɱs3ҏ'R=O?~|T?^Lu^L?^L ijC^aKv n $ϑ?&)FR”l (/:mY P>k-s0)ddwC@!axn(8Lz/1 #O#q>1E+:^f:^ XFsXFtp rR C1 ;_Xu "& M&1 kvFkvF $Y\N/C? Wcz$ -e{ /!_wY  qU)- qU] ͤ'-Z  ej  |…' //b -A | [P?qM# qFYD  uט FR?n $n +(T] #7jJ9h^ J9h^ _=/_=R(Q"<_B6?B6?Rn'2yrK m2Ec7 e  @!^C -"v"v"vs "v "aR"aR]"[n+ #) ;, \#ޚz9$ `{E a$P(v8Cc(4Ya)5w[ZL)5w[Z)e*WO+kɩˮ<+kɩˮ+KJ+|-'K%-3.jR0Rg h0fҰ2sWvP D 2*_m"3Vh /R4_pR 5 ̼~d 5GJ1? 5:3 .5bW j7Q*O7Q*Os7Q*O81~<8\.9 58\.9 8Z8?9%56v:AxdJ:s*e:s*e:s*e+:s*e:s*eD:s*e;>/);>/<:ZaY<aj ?hևP@@Qv"dC1wlbU ChdtChICh+DFOJPDFOJPsErK_hE,r $F#7GZFvGZF eGZFGn%O +Hmg "UIו eAIGIh KASYkMy1L" iMy1L" My1L"Nʽ OihOr,P!RQP$R/lPEI PŒi)Q*aT| aQ*aT|YQNׂ7eQNׂ7QXW QZF|R%ޥ&RpöT=CRT=CWm/YWhW<4nEToГ \ ph(/ּEpz{kr *: r,;|tBEtm7"ˋ ctnTL1 - tr~q^u6||JxPJ'yZhfypez$?E@>${A{5 |+;]|+;] \|+;] i|+;]|@=& }Xv΢}p9Z[O0s[O0pp m ~[LH"˭| SZּp.s ּp.I' R-5leq1 !/laLy2 (te' $mH i8\T` nJ4,#t0ȵ`N"*r取Et/Cf/Cf-Is J #LX? fW qO#@5zc{*hw "" lL@  0`3[KNO[I(NO[ISNO[I/NO[I{EM&7_y c7_y ^;m FB| :sS$1װ3;jCBD mNs:TR~DU8 % ]yj AՏލpY.ơQLơ38OdXZ&TMXA &TMXAB2K[r;6E?[r;6E $[r;6E cQ" ȩ'Է6f?/ X=\f/e::U;kѦ>h)oj&Ӛ ckX V }ɾ}ɾ}ɾ}ɾS1iȰu0r-j# iUxK6ѝN #: $\zt-#H0 _ Ɓ +؞@ ;L@ ;m;dƋ?m;dƋ s5?(vv_ZVˆ_ )(Ct- |/'G Ƶ4$?{cuŐ X<KKũf9v It+݈w 6J ))03AC T&HY[pgK)iќ's*\Ŭ + 4vbj ,V* c-n? g.W| ,.xA/6{Np0WM$S0WM$06tv2L/jP2fk4(A6^?x:#PF+:V'D<>W?<>W ;Sww}>Sww}>S w ,% x9 u0vy %8 y %8zȨ[{4} x|c/4|s _j}$| g2}$| ~nh4 1CD7<K [ n ,}pK"}p|{G?"+LdMZn;Uk< h[7NEgJq48CAh\Ah\ mZQSUS`c[|+ ۃ[;3 s\{&rSV rSVL$x{ųs $x{ų6x 7R.Y 5 M}:Njaz_ \9zE(>QX;mokf C"a^-r@hgsFlh Q̈t@h  bn`R hm MF`by".Oٳjd-0" ʰ ,6(syEu+،TD D  8\,a8 oZL 69B ÈeR@@ f`@ X ņIKA9? %L bzfu)YfC| E .xa0F!CÛ2zk ~^Ī adƯep . sE.0Ǟ@-# * S 8j8j GCE[dQ, g+Αz˰Ĺ_̨IF ϝϴAW ,|3vѰRkm"RWK-? r:v׊]ӑZ#Ε>=/pk x=1n@Kն a֠:Z hY)FV ?R5!wOڡ_gA,@ F ݉݉Q\Z(\Z cSh[Shl-}W|/:B}p~d湋L湋 O 0XpWRtpWND$}Aw C>L F7dPF7dPF7dP KLS)F%B V50b Z[(i Z[(i:^R RnТn  ut{ |)LhDKd Jsh JshoOt}\NcϕtcϕRcЖڀ ty <wV $#'@ #'@KpPx6Y Y+ \x#c ,| swں a*rS&z:#쬙J g \CI !A<  d\4 +`З Jg8KC'+ #Z Ie] jUQF 3jC|C jKX=J ̴jfj$R& -AI C# ( W:Em0?nX x y/ 3Q:Nx_H8MeT $."-@s "S@D"S@K #K`7 !#Y#J=, $i[sb$i[st%)f) %L]&N;R&\)'rv)E ;)ΉQ_* %.O0 0B+- 0צ;K0v0?#R#2 N_?3%3%40M–=a$4b~5n:{5n: 5n: 65>t 65> :5SxS};줡/;-]L;2k<: ,wumm l*1l;l*1l;l*1l;l*1l;Ql*1l;mB Y mB t mt*s8 mt*s mQYns n`1.oRor2or2pzwcq k@  q];r; d*4sTw>t"oi tD8=A u Fw7Dw7Dx^A{ Y<  xc4Y;;3Ao]i QrjT? .PWolo ܙRߦK 6~ J{6~ J{Dҗ2E%,>ȋ X^lG%THgH v  m +cz AFB%>R iT/)kُd1bU|HHCR Ӯ[6WCQx[ m=[]Άl V2 {u \릸6"9E. a0F"N*e" *e"t3h"8قkML# ML$ MLS[W^.fW^.fQ l=<(wY7sN ;&]d{G I-2fdn fdn ]T TT@-j9Hce@[Jr&PTF"3hkZ"3htECs; x >=Yf D>=gy]()/x/xKi/x4%$%  VXAj ײjs¿s¿>{+>{-U-N|ʇ n $Y7sY7 ,?k/EbtGGN>_Ն 3 nQ h/%]}r]ߏ0|$ |$ |$ƽ11Oz@|ǚ.ǚ.ǚ.j $j j: ɏvLP ķ(Y>r9ʆ ů#ˡO 2n!Y #HY cY^ (40_NQ^g Q^g  >tHat ؚdԢPVit՞}4 b*JlÌֹؘsz f a1f Lf׻&mv٧N ?$ 3-ڞ] sp+_8lI l?۩6$v"_rދU'J^f߉E~?,ߐ>\߲sT*fbi<Ei s` ~Lp=adu "sWcv5LG5LGa;[pmW? ;[pmWk r4JE] 蝀XXaR,_bؿOP$aU37]+AcRm+H9Rty7?D `k4T| s`k4T|``k4T|I`k4T|| `k4T|  W[Tr(P; z R z  z  Kx |-wDѴjF )x5@IC6Ypٸ0㥴FT=R FT=Cdy#ddy#d y gm -B2,o=,o$!ϳ ~7x]РTmObeM!CvF,u[\lMZMP~n ~nڴ7G@3DG@34G ^[Ւk|`k 4 `3Yiͥ &iͥ f0x^^ _gOD {G;h + q2h  ]U?{J-&]LJ-& 2y $Bo%\! Tqy a7>yj7>yt8-C& j91l :}e :Q %;|qk<'o L =3閗?Fak @4d #APwb3AxZ֖ tBUCѿ$ B,D Cα:DAn}& mDy EaZEaZ EzAE6D |FMbLF0;GZ9˅ VH"lH"l (ISԗJIW@ hJ_"L"B$Rs L4߾d/ )MX# No#v O S Or.7OLP L)PSäQ2[Di9Q2[DiRS+E)RTQɺS a T Q T QK Tq 0Tq U{j ,ViHQ~ViHQVDaRVDaVDa#ViqW_C^[W_C^Y Y[>;m/ j[zXCa^(4 ^(4 _2_Jn `ZHZR|``a]by6j a dl^i* f[wY jNJߵRkKlcU mf -ni@Y #oR)To\9Y?pj" pd2pbE q$A!H q\j] "r$n rEŔ8#r&i {s~=)s~= u{6b wi x6X x:P| rxg ?/zEFt{@ }(~ۉ! ,}BT d~h2Y'~h2U~l ?bmy/ \Nb$!w )o^^Q&$' Tގg  Pwx;Rh?2*b E#!E#!EUEZxR yT7YzyT7Yz4zt<+{Rf uWL b !b b t Nu/xpfSȖ ,6Ȗ FS9 N8ܯR9!xg[?Jͫ Cy /0{sm v4j)tj[ԫ|q (#JlK {{NyE #fD&7:xfW6`xfW6 xfW6GvA9 (lխ C&t eC&tC&tYC&t (C&t C&t Z_dZ_d ea0 Ev JcPߣ2 r_ \7x>Rao R!Ln_oC a oC RI 0Re0 Ai> 0XC w.6TH'NʬcZ]KAHI{k< ]G L] _G71 cpNYYzt Y(y[ Brհ$ լPwD;pJЌjS(rS(,S( Wԍ eN $':vN<N<PN<LpN<S5ƍ"X  Z 6#$XjRnj!zH dnƙ| pa (ʻ艀 m!Τ=0+ Qu9Qu $|<jҠ$  ϭ < < <D(R@`Cv{֤Hn kٟͯY V  =8  }n  I  [KNyD@z64_9߮i%5߯t8~ -1Kۆf*MHdQXZ^K{ 楪t[ 3+p8=c !@@Ev̯M [ [ 9 [[VSRA9cT + ǾH~ +y O&b !D!Zo\ǁu 'z~v+=+=Y"H8.: (U \L8`%s  5 ?ZGvЄQ}wK*M , XR@S%҆õ .jqr{  58ݣ \ǸScC&؇?}jI2-| ɭoV  u#u c^  \aN ~UoXAet.?_/A< /A< A< A< A<A< sBxlvm mHB m mHol q^2|rJY"sv3Zs+s >\ s*pF tSTU+:tSTU+ u0Jwh.x@DHy3[* XYyG m2z ud}z uK{\υt {۲ ! }Hioq ,}Hioq }#S }#S ~S#v`S~wxC3p ~wxC3pjJ L X-H${^=RN >Z$ I G u\v \ "B8 s 'v|'d(*M/vW94j" zspI "넅 P7w# [ .s\hGrcA9 r  >$(w/2䫭?gvӴ{OTU8=- Sk ОOdt(K a N+ EN+pGzk|pGzk Eh) ]>Rw # 45Nf FY aE}P  >{כValde 2F 5e 2F ];#cl?9T}R H4j; -H4j;8_ktq tqN Zմ- 23 h:ABPh^R[me /or ̦o ,̦o a'dϔ\Ttϔ\TE8>ܾhCQZ>$ sLM mLM LM¨a]VWk 1Ib? 1Ib $D}K1)%eM2 %eM2 90N K1 ]xgq ]xgq ȅbYS"Uh ɭXʜci`5k 䝆[#v ~K;!́ 鏽  ̵~fcͅ* < NwH9Wn  Kԭ@3W׌_Jҭ/pUQәP@̘L{%׮ 1 OqNK T׌]0ql8 eʨڊGO x+#! $, 3ܚҔX~ @0QnA B 0딛` 0t ߦ e br bYu 2K|r6ej(|r6e[cdQ{WeE81znV'c t k" 30E]0Ed6F?)r@2Ld0. #?)  颕g鸭zrh8:I? I: I:k/@7~N7~_ߺ? Mlzv NY 8 =REnE =HKj THXe6T" , T"T" $J@91I J@91I }1e2Ԥ0ԤԤ '>K 8U @J $ @J  Dv~Y {VR 3\a ʁ% Wb!s ~ j=F oLW,# TEh 0GL e 0GL |!x- ̐nQK - ? }I: 2 Qb  {F@9# n N ob| g U3r U3r ( b b -M ,. % pL $ +ט] c\fL @zmpR ߩN _. 5F] $ XHF $Qc#F 3 Q5D CRi h{M _/mR ha,N ns 2nϿxK ?bF   @Sv3 @Sv3 Ac]3IC 4 Aך* Ba}[ C$X7[j CMָ D#( D D E  E N F.d%vg FP FzM F K_s G%P) G%P) H/ 6 - H!n $ IsT/u~. J3  Kb  K& L7x LiP" a Lo> [ Lo> L Lo>  MvT' MR Nˢ_YyK NMQ< O=?h][ O͡b0 O͡b0 Pq pz;? Q.#s Q`d Q`Q Ru, S1L UZ"5e U{q"DN U{q"= U{q"QD WzқW WJnNv X-CHH XHz , [#BzNS [#BzNe ]lM  ]/?sg] ]/?sg ^m of=r ^m of=rR ^m of=r ^D $ ^n- _Jbz `Xz)a. `Xz) ` Pl cDСn) c߭\(0L fd3 f1B= f1B= f1B= f1B= f|y I g1 hI#r< i|~& i|~ k4[hr leU l"IN m {7P mq>GXj mq>GX \ mq>GX  n4eW o0DV pS"h pS"h p϶ q@/ߍ[ r 4Ē rO֫ rO֫ rO֫ i so soD t*΅  tUU  tG!P tҼR 6K u,' u, uzr.[U v) w@9o wc1Yy wξ6f x\p¶tR x'X yZ_AQD" yZ_AQ zۥR$ {2W? {yԗFR {} c {e‰$ {o[  |˝ }b ~\ ^ g'\ ԃ3 a  :DA : :K ;*Z $m $m 3O„j i:$Z " !s x G7>v e,H ""Rd P P , Cp%} p#'s w 1 s ٛ[v X1ps ( GIc &F6 c* Zw  gio m X:\ $|›< 'B jA `-  `-d 1#B^] 1#B^ o ,ƖL= m mt mi m ( &Z26 Ĉ*c Ĉ*Q +h{ %M %MLK %M@ %MUs %M] %M %M %M8 %M Ek'N 9h 2+ <7 r <7L 6Ⱥ> lTe: 9$By g #W ӻ  N> j !S 42߄  5@g5 dI lR lK  "eHt -uY? WD  mv AjDWT | DH#_ :# XB| xQ c L< R p1  mJO 矏 *av *av ,}pE  ғxt ғxs 4N j~ g~}  =ZW*S  e ) 4qs  + j QJ r {ur } k9G c @WU$? <ܖa WƨB o#8  )m  ~ea9* ~ea .) |z;H 6׷{w[j עoCR G[ ȈI  iZ }G0 ͓9L JѮw ΐGt  V  ']'.  v˽6" ~VH\[ һa|S; , # M~wt M_v 2+?N Ё Ё e ׹}FO fA c h Tv 7`,k - o atD o at GN5 a '> ¬qy . ¬qy :ov ݾ8D q "]# ׷?" ׷s @  : 8= j ڮ: v& v&  v&| (ש2 9%B pVw l{"  u =2 \8; o#" r ? ,s W i; OU RR? g #4 s C] C] $ XZK r r n - 귳֭$ Aw c љ<*t љ<*k p/@  ޖw)R  Ŏ8 (t ꝑ by~K: 1wS . xl;  xl; xl;  xl; $ WO;h hL~7 P6M s 7y  s :8Q #ՍC7 eֽ 4t )^/uD  k ~>N f`k hW % (a 2 dޢ 0Ds Ͷt@ Ͷ?5  U W  0i 9hrK ,J tt ! 2s #t _ $R z $'!Mó + $a|ds %ga. %ga. %(v $ '@ '^/  )^@ +3M%6 ,9mTh8 -Y[ -Y[ -Y[ -i|H/'@ " .Έf  0<R 0< 0<K 2[ 2aeha 2aeh 3;$i} 4/ 4+^A 4dk 5P=bE j 5{ 6^˶  7E '1O_ 7uU 9dQ  9|>L?$ 9|>L $ :ZG=$ :Tv :Tv :Tv$ :Tve :Tv :iM :iM= ;?a 4Ld <3s . <~b @2v AԚfZ- ,$ B&&L| Bn+  Bn+  E=IZ F? [ FpZ  F +  GJV}Z GJV} Hb0+v H i I xWs I xW JlJ4 J: 9& JI$s LI L3(| LBWȤ LG'| LA" MK V|y WxvpN& W˛} WȕB&: X2> \ ['ܦ [x  \ QC| \e&Sp \چ ]k̻L ] ^jђqs aFl;a b@\@  c5vb c@g5I  cmt dk RE7K de eD e/Ed eEu c eFvt&_ ffH& , f4 fh gn-[?, h( , h( h( iV:*Σj j] j[8 muGd  nVn(% n}ׅZ n}ׅS oXj oX  pl4B q տ>o. q տ>o. q]w=0e  t:Ah u ŢR u6s v 3 hA v 3 , vDl  x;mgq  y/ z j zC:vI zGI zGI zk " n za^S4 za^ z@~ zD))[ { a: {($O=[ }ya }}[s , ~d ~f6 `d8  mMKs Ya 6 Ϡ )CY z; 8 ~q<d J`Q% Kaus d1t Tӣݨ X E`.k "s] 3 ﷮j Z - h73  s 6(+ա*P OLE 2 Zm # f1Q f1 Im *Ԃ xe6&  /t틩| k4j M  _ߡ| 얺(m 3O5p ؾ/ >L ӽ߼P* ӽ߼S ӽ߼ WA+ RJ e RJ  /F+" /F+C /F+ {N 3Y * [ sX sX   5v , '6 en]y@ BIt 2 BIt  QrQY ntYa ntYa    # Bׅ$ 53 V *  *  * *| * 6P ~ K  ZC !l ]dNb7 ss #Q_ o s =lL ( ( :t :t ' ' zO? H9 af WT_ V"  V"  y$P f4N  Y +2 y{uj Po4  A}M[ O r !r1z "@)Br "@)BrD "@)Br "`$aŒ " } % Oh}  %j8E %*.L &xoP7%Y ( SJdU (1K{'2 (1K{'& )ED)Q )ED)Q )byy  )byy  )y{o  )(m  *P),S *m c +^)t +jw) ,' ,`j 1PN 1xgs 1xgsZ 1b- 3D SF2 3eJB # 3ru 5)u  5$I,7Z 8Dԝ+ , 8Dԝ+ ( 8Dԝ+s 9>Ծ8K 9>Ծ8 9XڵuN9 :޹Ӽt :޹Ӽ :޹Ӽ ( :{=]" :BxǕ ;p"?fl + ?HC* AݏY BB B aZ c C:} z E N c E&Pxj E&Pxs HޛX (A HޛX  HޛX JW |? KCfF?L% K Lp M3er/` M/T"_z N >  NNۏ0 NP'ځ_: NqfA Pׂ6$ Q D SlwBf SGOj g S쐪O TQu(^ 6 UJ,S  W*[CK W*[CK YhɆ@ i Yvb[y Zg܀g [+x [XANg [Ȍ|+  [s$ _58Y _58Y `r|(  `P  bN4 >2: b b , bj bW$ cc9 e×0c'j hKEW6:I hKEW6 # hKEW6  hɯhe+8 kF9;*s * m$ - nmB  ojp--  o,c: oj ߔ p`gO p߄*_ qN& rE smHxT} sw - y>  zV% |Oq ~N  ~NhvV Uك"k # k Zo k ZT sN Nt "{? XHK a"vC m #e i E} E E}R ާfN sV{@ ޯz oOaR `'Wv @-j , IӦ^  Q/7 i"rs *' Jڑs{ Jڑj b3 ,DF QvݠGt 7 #Jw| .™v  )t / [h]" / [h Q  :,%` %|r \$79 Qtg Fmuk Y JdO&C ;LkR G`$g I+D   ,  Úh eCTj M< d' AOoj %p Xzq  u׋2  h  J@  3&3R \su K wjY y  V [1 V~^ ʕ$= ' O 5  ½l8v ½l8 \ P/< + SxR 5J 7 ..9 VX;? k6  wT" XT%d y:ލ a ʓ:I  E5 ́#< ́#< ( ́#< ́#<  ́#<Y ͞RٛC% ͞RٛCq {c wEp  Ϙ 5 @] }~i аCTd0 Cj a R 8çs G n$ ׯQyJ ږq ,CB` ۶Dfhs) ܯRZW52v) CYv Nh[H xD'x !L ߞASv r} =- = ߠ g    S ] U  L  K|X 7(Ҥ X,#gY ji, ߂;R /SgG + oy c oy z qts Z3 i 躧lf & 躧lf  %n$J/ Hk& #9 [] + ɸ蜿  `u  {r 4s ! 2 b. , b. _dL* v { $- v { i v { c v { 펩:D YDAT tbP_ . f/B]N R  e HO{" \ z2  /ayJ ?> C!q| [\ K=: NjR 2 r (4 gi7&? , cY `u   Bx rLb  Y r C ҉ ai Br ] Zs ZsR n%SZ 1 ٩:K C T| @h X!_ } JS q7t 8쌯$ H `=` v Ep/S `]FOW{ b  e KK f/ g% h;wc  h8:" i\| iv)D j5KCC? kGT@@ $ k{c[ k2(0? kSO  mswC mswD n!IpK n!IpL n;ܸ73 ngOZ pueUk p+͝ pbQR4 q>(p  qFKB:  quK r e*? r4 ^N s8? s` t D\P? tg![ t= g tY; uk <3 uۿg v"}Q) vY YȦ w)k w)k wd')FR& wfMs54 xW--N x'ǀC xzdL ( yYKlY {A( # {A( $ }[.Gf  }q\1w ~I# ~]75[ ~b}: ~b}9 7↲ =dd 4Z"S PaY f'Q $ f'Q? 䄵" y 0 y ' vh  9mF  sڭf sڭ Zng , 1B  [? (1XL (1X o@G0 o@G 3P% $ G9  r J 늛Ha <}Y 7 Kwcj  Kwcj &2fY OL  ԫO <n~ WU8 ZnvN? z֜ VT  6B; c @P곪4 ȁ H$K6a- H$K6& H$K6Z 2 P#  v|E [%D  # ws7 j  Ӡ!Z" υ S^i S^i S^iP [M $ z,( ( 8G F  כ "S hTE  y}ҊQ `:_ ,* y WZS^ <}+L <}+ ~*5~ Gj#' pmY s M3?* +i]  .L %= ӵ6v ( Zx|8R _' u a o/pK s` kN[WUoj  - [ oKL !4 C.  wt {| { g { ( ^  8 ZZ peS 8` -c$ -c$ ^ I %@l5 %@lD/ %@l L|˒2z w>H   ‹mR j} * üZǐ,  i-C 3XTQt Pil\  C 7b  =F =F u:l+ eU !;G D.  玜!! 0 U0 &(y$ z>f  mLC щo# w ^ + ؃ӌxS rQ ܠ|?*qK l2'[4 ( l^U l^ l^L l^r l^]9 l^" l^S 2*  SY; ޣRt K7!Y HTg Iݻ] cٔ ۺ`U m~  !e@t !e@b V0s V  ; &n_a jQ MX Y Z[ N\`: m叽e 쮢Ca 1 |U9 -πj -πj zljA s 35 a ΋ t5k Q;t 'IS? b>f7 m  YA9/9 H  \zA8 ?IjJ *L I^j I^d HU `j ? E+gbA E+g , E+g 6 y5ߺK  N&?] g's  g's C z* z*  aSxR 2C s$ 2C , : ; Ň ck 䅶N '_ '_D `m:?j ViR էNh ̒ ),:D aeY u#R $ ? ^k ;  ryTjR ryTj "7J ,{ܻM C ~<  a FM QC xTW= xTW=b xTW=   s y-xv* G x ˑj 5y l XH&/j ׉n m `4I , wƘ]% wƘ #n , #n  #n U}! 1]I "^xK ,L  ,L ( ,L ,L ^ ۏ: gu~! 5sv !VTA~ #[떢s #ͥ*<1s %"0<?9 %"0<j2 %"0< %XCgnL  'sy (\aBd (\aBd +Ă1$ -j&mB . /U5 /f)ض  /|&Q /|&S /ò}ɨ  0s,Wz j 3>u@ 3>u@ 3k" 4sE 48,`  5vq5?- 5akJ^ 5H=L 5H= 6(E>` 6юz - 7ξs 7,Nw 7>v 7\AF c 8}ܗ 9|<  <ȡ < \ >7 n ?T+ ?ט˫#4 @ו AbMO  B2TG i Bvʠ Bvʠ \ CYFa\  C.(U CsPxj DEg E{;d b F;GX " FH.NN4Z H2Av J!}g J!}g KQ\@PN Kpʫ+y; L GE MsR O! O!  R} R} RUE0 Rʟ 2 Sj/*e SؗK S@QlQq S-t S]IK T@jj T ) T )~ T ) UUVD Y#U Zl][ e [ $CR \6*R  \E/  ^yNж j _A _ xY `[*$ `ӽu˿ expZ ehx ft}~  f?Rı! hl/+ hb+ݵv hb+ݵs knR k%Qw kC>ZQ kC>ZQ[ kC>ZQ - l=2(D mVe)I mVe)I  m,U  n rYg , nqcޑ= o Pp t6  t6 a vX w99M w99M% xʢs81#  zOizh z;, |Id |YVsn  | |NB|? }!M[q} }ghՆL }L 9#k }ҙh)N,s ~j^  9% > D % #R =" )? :f'= :f't7 k7X scċ Z. Z.K pV!z <68^C  ԻAg [^2v: $ z|[ VlAS P@8 * #LE #L1 #L g"WH =NWR  IWB?8  IWB?8 i F l7y?$ xdh0 xd ( Kda Kdat 1uj1B; 20 t{# k2 kR @t l9 QI  }9K l zA4  4 o puՖO  96 /" *rN :;‰/ .ߦ 0{ G@? zQ z sR k1M,y e' k1M,y  k1M,y fK@9 RUY RU k {O~B- V?[F,$ӻ}5'Hc4 }Re }Re: }Re _r _r1|1 찊S3}i c5k3 RH~  LQ\LQ\=$ fpdtX?&dpQ  T!N3c #ƈ#7p[#R~xH[#R~xH$-t(}yRS(V(ڡ#)Tt +*<`r*n΁+,q :0 RQ1h#e41֟p \ 3a883a8;3M3M 3R3R3R3R3R3w~13HLR3HL?3HLj3HL 3HL3ƻKH4?@e 4P]i! 4ω*Px 5;; 61|. c 6 7S 93 :G:N|M]<&rujD=>iǰ=  ?^$’+9@@Bj Ac ,AcnAc + Ac Ac \B+)G -B0Y^ B0Y^jEd%4F`HpΛ7H՞]Hٿ m IZbv I/pJ**KJ~JZ0 K7Gz aK]d! ,Kef*:SKx+GS+Kx+GS K3/)@K3H $MnlCRNW']#J $N NpDY(3 $N{)ZZ7O? O\a]ZPβ|R[Xs% R[Xs%YR[Xs% Rnj RܘCuRܘCNUK? Wb࿨Q W$ X'mX'mX8דZ^q:kZ^q: c[,&H[uܤN1\mC]:\?N^[?^ K-{f^ K-{^ K-{ ^ K-{^ K-{a p a-p$q*bhDbݵkF c5t{# d"dudeghDe&B~Q ,)e&B~QfѥM|Dg(xg-Y,XU3gj~z ahW:Zl jI']YE k&% lql #nQ[YNnXLM o'Z  o'Z  (+o'Z  $qcl/ qK,q9`_bas} cs؆K uDv[9M v[9M ,v9@5vU?E[?v2D>w1 (xu2"/9{>sBQ{Q{0g~R|y G;|y G; |d?V~| ~|~%5iLC~W‚@> f_ =A?O7# :y% x?ms ,/tDDxm jpΡC Os\S0˱Q8= ?VЭv sjs ٤Ȼ&sbJxs\?SJxs\sJxs\j ӈRa7o;, l qHY@* $_|a 4 +KN _3e$He1sEX˩F ħ uUR l[J@ \ #3ƀTt8s+^`>+^`bu),5 s?d*XhS c2ʖ2c2ʖ c2ʖ:c2ʖ|RcD9  fƍd>vw /WPpUZ tƭ 9LŇ_ rl v#|v#v#v#L*]̅jP]̅Y ]̅ St*St*dSt*St*j>.RN*~5q ElJ\ŅIJ$ #dEm ,IrTH^Ծe`^Ծe` 4wKuFւF|(h)8 RS#:x!b \X`KD#EXؒn 2E}I:_iذANJ e匞 (кt кs @XSݣj9ܬ*ic" [w GM[]  ZUgtNè]ĢY i;8 ( (T+[жE% ǒݕ =O 󳀃 sI3ӈFc %ۦ ͻi$ ? 5zZ ΍pzi :wN Dc$a7mGRςS c϶qo N{vs_?>SZ2k@{o #Sojfz2 Ӥ ڜ: M1B ױzR9 ZY[8 ~ j[{ظr? (j?C@/\U/C@/\`>7/`;LϩX ܕ^ph` S ܯ4?]_ܯ4?]?D!sxH.ϧ;݃iwEe7\ = !Gs4MFeZ~oڏ OE E`i^茍 }W}W霽'P i H@jH@j"rN%?) 2 >J_~>J_~R>J_~S!ݘU 'StS"=XBqi ( d@` (T,h T,h *דv#S-L#S- A d<θ r}"1F"0?lF>F>F>R5&qqW6VT, c9" )<ҸD)<Ҹ=  ^XHe ^XHe ,^XHe/H64`oCb^s US"=eNy}9=eNy} mr8;"ں}lۦj o{Uq +" ,i7] aï O%\ rt e f9 C% <=b0kIyWmX޴-$\:O +48DDJ>48DDJ?9HU l?+ X]A%h5YAsR$ aA* BBR DbAkrDfѕ EP;vB:EP;vBzEP"JFe: $F;ۮGJ$XL G!I#[*} JpחpSJ&vJ[9M{ϜBM)e? NT<צ7=OaKdP = P;  PvPۘAw jQg8}QkQCsRI6[ RI6[ Rf7}qTeS U7hRV3 $ V*]X*O@ܨsZ- ZIZIC ZX#[bBr[{NJ|\F, %\i`'S]m&s\%aJY( a֋|$qjdE ;fS1ɴD fS1ɴ fS1ɴ hr5 hBzxSi^Di^i˫iIk sjg oljh]^ ljh]^ (mV`/ #n{H 6nyi>o!>`o("soI1 q%X{Yrq9= $rҐUs\e t\IiUv 8` 5 x/Kz x8 xESqC{,NS{~ # |wxλ b|߆ϗ~ V }[ Zә' nhb s"@j &/=~ Yx[p $:#)$:#|I[[I[8kS 8kSUٺk/,b0o2' jvWGŞFsONc=Sc=sÁF p'hf ZpjpC\w$+svR >/۞ר8ŬUNe[Q^ Br?cA h? ;9RJ $tFtvZȿ!t˦I+4oj46m v˾9{h!{h 0B cd {&R 9)8= +9)8=9)8=89)8=P` ih („ ƴim i` ,@ (uN `k֯7un ߪ}*oz4x az4x 21 21rx {`D #Lw`L Ų5TŲ5Ų5RŲ5d l g  gd܁ɳ1~7ubH4aH4aa1ݞLvg 7" 3%e xZLDN *ARZTz>r* G'vG' ,/ zL,zL \ : > \ : > $9D ʂ FDS \ʥF^Cʳkg ̭2{ݔ酠)Q> )Q>a*Z +X;+Xt+X+3+v+o "-bb .M.r /lټlVI[08L (1Ơ @ 1Ơ @ 1 vV e1( 3ty3}Y&8#3ÖPG4/yPh 4Z) *4Z) 6 V{Gcc69e \7QvM7cVԟ H#7cVԟ H7cVԟ H7gM 8.pK8yQ[9?F2d :vY:vQ:vY:$=\V:5#`iv ;l,-;l,-Dood<BY=P./ =n^(o jB?8,D :t1Guc5$St"*St" ;00>YBkR{v ! X>A:#R#b'[D~NpqS  pHw:Rt;`)Ũ Њ0S. Vl1=Vl1Vl1 P)Иڨ ?m 4 /4 V sM>e+6g 4Ǯ7f t |mIJM ;R_Q.b.bVy"  Vy" y+Sb0 ']/0 '0 ' !AW}thnR SftD>[ ob t *: ɞg{VKHBTe/ be "*40% l_d $ _r0N7Uk WSMqDlI- ,{uu#{uu YJ;f}=a[ KH/%`w/%`wě47qT]&5A~Q!*Y2R * a0Yi #&'Pc'?  gA@gK=?s v[B[h&r [h&r \ P0bP0b 6JC b [2]Jr_{5 QKSę( *s@Y Y$# v|I^uRI^uTY TXQХuu 27'~MT hP9{[s_  Wy 3œgn8y G Y!Tk*e솑 $  L 2 C@kQ E! &3o6 [֥ 5 bb sq¡R sq¡C Fabs7@Ho BTBTBTRBTD RZ# ,$# ,UҊȮ \$! TT'BC hvL 8- cOV (P^b Sz  2HLz\ ocȖ   9\[ _e ";!| Qr• oD| 0 \ ,s%@WHPکә _f_XKs6A ^7k^7?D^1 Ks_` o @xN^ Yu;U2W޶Dy jcbjc{{d{{R D{ L{ L{ztsk pR$$$ p8 , p8 $!|r4S !|r4#x^r#¢ Y $ۈ|%YH &r[[&r[[ ' (ÿqL0 (ÿqL0(P )8}8 (9)#|Mj*YKP*H3 ,&ꧮ-Lhz-Lh-V?.r%aR0V'\ $ 0 2 D2DbQ(2`/d 3"b&T$4Mb2 4Mb25dA ]6@2 6@2 69=69= +7A&>9m"A :R9 :A`<'v q =zf-j@@7uAH(KAH(A$@վA$@վ (A$@վ BoqE BoqE C(á C#:Du?E E0ERftH;8 H;8 H;8_ H;8DHW鷟C#HW鷟HW鷟Q HW鷟IlALjsrIRA Io:QKFd L/7kNsP҅Qz{+RĹ!S5GsVMWm VMWmSWR01CWݩWݩRWݩQWݩDWuu\ Xl/Xl/YGf7_Z+W $ ['w d$_&_蟅 R R RQ"Ej f4b? (P5-v"q iSSd 3 , d 3qZ (cx̲U?LbeCiLbe9LbeTt^|`s! ">9 NXw?i e%s ! !6v*H{)v*H{) ZaݿN`8U)U)ИseC;Fµ<K6B׳ .BW]KR~W?KCK mK NfTNl{S 1ϔ?1ϔQ9;؅y. xm%3t; ,uPu lsƦX,ƦX,<Wz`? ruY  hDR D w"&'|Cm L]#^]bX?k)k) Q V\ jE"- *#S*#VOxQT  ¡瀏  挝 Wʮ Wʮ2Vw RcK(  ?  UQ#dpvp~L pvp~ ϚRwkSTD, fpvZhĀ6f -s9Y1(Y]5 ,Lc;d c>p Rfb'iDG+=ZUQ!х d4N d4  d4ϢvjOy`%Rty(;y(^3 52?ݲ GsEGsEB0ENP nyutF$sZ \XDgj̫꾩 Sd!JBםxeC!Ԑ /7,* M6L IhjjژdҊbQ,cbg"X ߲?t)hZkVf42Tm s wӛ2 zJUև5c/} QΟXy  / ([)ͦ6 dQI  ]y &~N:J  &~N: &~N: w7 *j9!j]2KVY5f%v$9)i &ЏPUzG; ]"#^_??a#'ީ 4 -g j]2by zA@NYK 7O\ >Y|gs叒?  W i "$޹ "$޹ "$޹ \#1] $ &m!W(FL \*>rW *Ybё+HO +VGNR .RH w/Y` j/W%0yvj,1ˎb3]3]3]R3]3  4#&PB *4 Y63 6΂{ 8]-!D":zP°;wm.;karf5 ,>Tia>Tia?TdHD1?TdH?,dP @r: @CA%NnLA/ ?? AWa B8!B8DB8 B')ERIwS H3b_/39Hh2TtHI<I~MGI)nG7 IS] J4U<v KDOobLS'2K LaKg: Lh};m M9*NgFYtO7_LPܢo cR!>)S~T?jTM 6i TΎ UJ9C ]UJ9C U=Pu U |V7/5 X$' |Y þ \\P1) ]l^J"8`8eŇZKaA[Q! sao:sSbѷ ( c7$ cף> cBzd5 Q ezACf/{]f>?. gd, hRj <j 2~=l$i) m3w>$mB$+mB$#nm nS$1t pz,˔Ep3-j g pI~p{y`pǶ9驽[p٭F -q{!NZ,s47s£W vs# u͉=X! v*Z $w稵2C {'\ |,`0?|Oi;~#U2 ~c)6!?iSt BM~ j6v4όU4όMlo r 2N޸&L}i 4 c>i#?Md OkC Ir%Q cISK t>?t>j٧ m?J 2 i(2jۿ@ۿ]ۿ%AQ ؞}N<` avҡDQ$'OPijA(]7MDȾWðS0sL<g"+N cfE DQvfM{f&Em f&Em f&Em f&Em $f&Emf&Emf&Em ,M} t"rɖ $/:) #Wȣun.Ov+ 9`k6ƬVNYƬVR ,3(KDaRr@sW ^)~a- 7"7P 7"7PؓŦ) t7ar-șH -șH ,ֽh;K3T+G" 5S qF#(*cLv.=<Ƞe 7p f s? N^}uVU'^*RVm" ES" -pNȈQC#S:~|DQH 7e ᧪sðEeptKa<bŀ5닙8p1f ǭ߷=S)%+ ^ ț#D1,G RIL xILs2PȊ#B LPȊ#B ހK UހK f mxt`?Ԩ="‘a VdDGQf4=,/ p^N׫ R.XD{e"܎FҖ ܨ2 5&1{ qG" _#a ⧣t ?Yn9Z4ƆFU -aN-V ! e (}(}Ng xs?J7 R;b c]=_7ghWLL"q h/H#* Q R] R] Q] ּh sv{X7O. ; Od~3Q,O $o4|"o4 \&O_1n * n3[tzUn9l 3 ,d\6 RZCU[P b h-3 (O b +jLL*v 7>r )7>r 9Zw -,88TT)l8 WDdރk^3eoHA{] s 6 6 , 6( Wņ `M$c  øw(  si A+*lV3P( {CXK FcnͩͲf gTD{G@ ?W{\|WMGS|WMG|WMG8ss @ /ozU~+u_i&]ڂ &Las M$+?X[!qDKV4hV4h&{FGOrC}PQYZg{  SG i SG iDS SG i SG i  SG i SG i!j "DK~@"rwB $H\T; $ɔd?" %L4N%L4NP'No{g 'No{g (g(10 (10t(Px>#?+0p|0?,sAr._g/ԡ.<h05?1Ff675Rr 5#& 8_98h 6R;_K 1;` <$ J=Q} e=!~G =h= >N:N> $>> g?$L fAyg@B nVBPy+BDQOEWW ,EKsbTtFY7 FH ? H#J޹C.H#J޹IYnT !Lփ!QL&>]MG| iM[ NP;MbN%zOuM?NS SS S SASΒ DS<0BH T$ }Mwo TkUfUBgU W V38Y"oY-)8Y} Y-)8Y}Y-)8Y}Y(0? ZDP\S\V ]&ک' (]m; a^:>ʥ'Pa.1!UI gaph .am3 \a״  b(ȫ 2b& bZscɀ]c(!|3 jcfd g dz# ld8ieJ!hBei4kei4 (f9j (h3No 3ig8 kDukeٰ (kkklve lmHLlmHl}r mIG nc#o{LGotprp^+kk p^+kkqDqNOp|rZQ_ tbC^?tbC^ (vΚ(YQ7vΚ(Y vΚ(YRwoB w"^ x2Ytz{YDQzm0 |nG'Lu \}u2~<،q~?n$ ~<\T~`x^$]NNu 0 QAm'RPMunD4U?wunD4U toh\{ ! ɾ\d|: ?s#: ?v R8($q D$On!J0R JPhY'WsGp&J ^+iXAxqew8d XL[i \ZI{5YPlv #aB l " F;Es1I cZ Z Z ZYs@8(o% , H?M Th&&Tq7]#򅌗C5򅌗RX{7mR L{" L{] d !-*ߪ*KV(NÛ Yq WRz~ GD @%rYiu6JªY3;yyh $d`sKaZCKaZ Y ( ̝…Q  ̝…Dޚ^ aޚ^ 4򊃟4򊃟SQZ^_S!%^”BNp! M7aQƅ ŌY Ō (_q4~Ț~ I C%vIZXmcSʳML%¿g]puR%<0# ()ABR ώ]ϼ@QrN{C PmTnz  az tѰ)T#Ѱ)TQQ#ksսϻ )`bdC+Iץ~ YfXQfXQ!+ٶx@7] L{H̨os  س+ D~`= ~1߃zrh#)Z ?nK/1G dzt$ޯBKnޯBKnCSr'<Sr'< X# %, 4L+T8} *Ŏ*Ŏ JN4J 0Y巫c^h.0^! eMc \CYC[|[|5LC (  {v>J%u_Hru|:YDoN" WVZ &}Ǧ]h:'j |A*C/*C/K ,(;},(;QzkQQzkQ?Q?/v}Ih#ss0Z -ѫ IoxfޜoHoq  XqN8LG  \v.Y;5 קKS קK K rKeee esCK)>Z )>ZF)>Z P"!l$ P"!lU}~SO ]RȰ? Fe  6 , |R  |L  :ƪ8+ -  㝊 -M*  -M*| -M*  Lu6w'dB2U8_@$L'v \k{ --RV% [1y譓3MKȝwa%?~ %=%=D%=UuRCZ?ف" 1 tL x. x. x.?!{=e-L !{=e-Y!*X1c :" s "Oe܂ $p1G/&/UcRz&Koa'0U )(6*|o).\=?y +\=qX`",}>-ԗ,}vj.G+`/:#80YQ1 WKv2n׻ 3b?S8=3P8ִ) :8 -;1<1.Y';1<1.j;͓V;4N*<^1! =c2c=iXE=Uy` M==>xWN>@,5<>wS_ >AV] ?# ?# i@|aB. &Byg|Cڲ? D](֬(q DnTF]w0GwH&AF_f?IDh%z IDh%z IDh%z eIrƘ sJ@p!kK*K:) cLʶ%uRLʶ%uM??YME~GMOmi P![P![R&-lVR}mS@+S@+S@+ BS@+ TTBWtT@ UqO1 # V$7 aVkS8 W(} W(}dX*Y\KY7UZ-28+[f L`D]SHXGJ]ƵCJ]ƵC]D+ ^j Bd^_bH` _R13D_R13D_@uM m_?_ (_\rL_rq `0-a?ocZ;70eau e(Md4jgitCsj?9k) lNrl%yl%yD mH6q$mH6qmH6q#n-<)Nb9; pM?:q; s.ò>'RsU i tlfKt$lNvLr x˘>d0zW+o}zY$0?z[Ӌ@8z[Ӌ@?{2{)f |V|V|׫H&~Y/!vR(!SorLuSŝ Nr'''\DhQL\ i1L\?\s!(  bS    Ѵ $  { Sſ)?s-s-˜ 9yH  SsaWRk Qs 5Ð $ :@ ;')b?;g!Q:M: :R\DBua%u|%u %u s%u9y1O;75h c C'T= #C'T= ^N J1 ,X bu.!  bˢHC0+!QC0+!BY6erX y8G1> ! {$j{"$nk[E}6 K0mB[Fun&_ 8fȿDd [dxK.w - Nܡ mWj}R}h}Q34Ѩ  |x*J7h|_%| *RZA aH(\R>m# F؟ ֠~' \Re`e (`ej`e / $8,̀o 8,̀oC\TKO 9h ~! +D 1G ,5_h 0UK ÜgUr   V{\4>d~{!~{!~{!Q~{!R~{!aċLkt۪3K ~ЄV7  8ogV SksA8F^DF^D ǷfsjLɅ6) arɅ6) ɡBIzņy> /'6/'!/'ʯ7 kJJq̩SޯA̰ qgs2͈Gk WdSҴP| ψ*KRnϔOdīO1ZkD KnG$ {hJ(g :{hJ(g \l~  y1Sӻ~J{y  w'ypk բMl@CvRqZG +pz1vm ۃo(TBsXok sXok ap'ˎGɹ? \3Z -> cGYcG cG  #ၠV KЋ$5D1S6 s%CH N4Y !B1 䅐 ) EGYs 9s 5+UoX $^&Z [׈'1*c!ӌU a^ 4 " 4 "j vx@cVVTZ"@Pq1z󑫨 ,+@˖˖˖NxMK^  )AYu4`N?Pf| \!?!j m!?N1X?J C"4C"4Rb pE0` R2R! m"G ]7Y ]7Y $}Kscڥ 9X"  xt= g`yyB%  KyT+8s`^h$kM R7O ea<5K;0yc ,% Ms%QM  ߡrs iUX +rb =.u@  N:haS9}I'# # BPnA3A_y<6 cxlJ $>S}  ?g "cZs#H$1#H$1#R/v$5] $YA[d.'$YA[d.P $3C%`'7# -'7# ((~` (s5|)?LOrP OǛJ P#r ?P+ꇲ' Sqd s Sp'TUaD TUaD|UrE  WdWdWdWdWdXt4 cY  s Yo3i|\WZ < \`Ե~ ]4Wn? ^gI a^ሸ(fR`ٝ aAk3%&aAk3%bo9lg2bldcޡZ>dl) (dv}Ud9x fK gb4K iii ,i (i;n id k% k% (kz;+ ilTZ[XQlӪz mbF no( ,pc A_ rU{ru60%rvӥFrj,s^~= ssI7.u$Q v[̜Kw8F]^ w{'yUDyOn4z~?23 |2O |{sw|6t} `͐j} `͐}]qٝ?}ml}m];}m!}m~"kDN ~X#/K=~Xldbk k!Rkk!Rk(UŽ#*~:+>d +> f Hw%Ck dbn ~r8sV;k v0N^.[;D}@l-? \B bZa$> Ad^Ad^ `+ yLkG| s骍:"`Wl;#%nÌh}  ,9}gbO?:, -|7 -|7{gQKgQKk+~ n|=syjBWۭ]O! O! stSGԂjCHv^ge@ h#pI Ň#1dz,K==B jvr @ɫCBCHR ʸ/!x _p|_p+_p ̷ݭ-ͽO q#)V Q-O- - ->xp[ z@z@b ЭZ:Kj yY7.bє3{ j'y"L96 sYO׷¾ ׸"'Z&t??C7U?C7URH$k̵VsS#'ޓ ->Sjܚh !"DRE ޠF%V6I|hN;D beVbX1QbX1QNd1V d [:*\`c9|?c9|c9|j=7$u&f? j<yu i 0fR 8ڝΙ|y#h "#rFc 'l-Z"8-Oq:vWNrs1 ꫾|2꫾|꫾|꫾|]o!Q!!S}o S}o U \. i6 lY'6 l  n/s [~CM8R(7Js_"!yz,I: Zj.NvUA WޠoJ  f3>} 3>}kiH&gqDؔ#*`p Ӓ ӒN KƃpN;KƃpNKƃpN|U~ o@E3 mYoҀ{( ԾDN%SBNT P*排Y 4 35&4 354 35]@0NWM8 + }  X ( X+ Xt ־y  i  4  Ru:  Ru g =[  V  WV!# \ `M , `M  Jm?fQN ԣY $8i`^jֺt h }ђDr Y '" qVLjRToU (Ե`'w i`'w{*xhco \Y k EZ;Z;Z;R Ox I>|?"/V $%+y[&g>?G1'3h)*mK*&|7q *XɊD*XɊ*XɊ*XɊ*lb!a*5CO e ,:7a (,j !,D兑|-mOG 6`.o֧.w-y[#].w-y[#/zA:P 0\<-1|cpf+Z1|cpf+ 1^%1pI3n2q 5 3] 6?j6žQg 6>P"7/=:H7be e%8k.9?8΀ 8ۅB9uf :|S[ ;_c3^Z *$= 8s >8؟ >Sd" -?ZvA6}J #B; B(m9B(m?D ED ED0?CEjqF*/wAF*/wAF|Wu HQ=JN2eJ Jjl9 -Jjl9Jbi=JbiK JbiDJIHƒfJ!GsK9p\ K<ԺI=jLl-?L 6L즆 a L ^]NNӋ ZO2<0 $P7~`PX[?PB7sQ.<?R'JdR'Jd TZ9lTw(,RTc{ Tc{m U;_ |V;6r 1U V< `V U_?X3 iX3 X7 o;Yһ%Ŏ Zkcx擼j[lR\M[lR\M[+́T\OXs]Ig^ ^A1w2Y`6'Ra!6#ݻb)C5 bG8CC5bSn<ˆ c" d k ԶD d k Զd d9e X[-df[8?gWX #g<Kh2v4h۱GObh۱GO aiLin5 je bj}F&sjq~,lPSlͭXĨ&l[3qV`orOr_1$ f2reth&D at 'tt ' (uؖn5d]6uؖn5d w@&][ xi߄\}x~VJ-{8x]Z {W3M/ |TilB|Til|Til f;"h \lZz JiKk̀L.̀L. zZ_5jzZ_5 hNZ#ns_*QW|*R qz e:l-Qw -] =:݉`u<R<R .p Mx( abWɫ31ʄѳ \Ӱ: $ ކYs Dȧ s) _9 eAɔIG&t&t p4 p4 i  !e l1+=Ҍ. LCR LC,\kRn 9)4d9ǚx? ǰ[_ *;fβȽ/ڮ )#S. 0t gEʢU͞G #[;*{ `Ȣ`Ȣ GqTZ ^ޕ ^ޕ +^ޕ ] j=uԢia}\ a/Cr0~~fZ Va/fO`uԡ^D$6.x]m Ɏ¤  Ɏ¤ &tFרoq L` sahO?%/t iЍܙٟLY< ڢ^ʕ?ʘ^=Íb ۰v=FF/ ^E)}p L 5^=[(߃hYk o g Ooj eh*cs 6cs Z&[囚yɸ:K  -t 68j68 ,68濄U G \ >Α|>Αk֏vG P SeUגt EM)+o9W"W" sꙊ7TꙊ7T\qehjҗY j6$s }dHL+޾N򧛻 ?AZ|ã0`3wkFX7` Zڥہ &x3äR1p] ^}e J} |V VHߟgTBOJ)ygd)ygK ?}EaV DC UDC e+DC  y֌=1% s_ug w^@  Y YQ58/٠t'2P`S?Ik `t ط$ A(jΨ s jΨ+ U wN6N  ٨vnOZ>0RXifvWu2 ƅ;/ƅ;8WB  ! -j  -?;'t;'s~TUY!ܙ9){wz̡! ,C'( K!9 M|%zN  tE@=t"^t "^t ("l:N<"\Q #gBЖf#~~Z F$,";$BQ$dS%9b^ %PBc &X62U&,*A5v +#o$ 5#+u b+7} ;-VBۮ-y] .F# /f/R6K$ /\,K 06vh 0tһUnA c0ԆMZ 0Dd2=n=2=n= )2=n=2ݽl3a  4^_?$ 4/5~ $5EM 5,̖56:%a \6u;K 7LL8w@E9Y8Mg9 :q&:jBj >,?6;D?6BE@;?u % ?R>":?3L@D"2^A-ۼd BRl/[Bv:Bv:BtGx:,Bº #fC 4XC5h"| CyoEoM EoM F QY4 FЈtHfRI?#BKL0ImެrLc1çLM4z  MΚzOKOo{$OFvB OFvBOi_T<QOr\ "Oq%^XP>z) R`̨DbR Sid RƁc NSvkyT}I U| .Ynvs Y$bY. ᷆ Y;p`̒QZ5kWU\8/rT\p + \~ `]\Cf ]t#l" _ǕUj`:")p| `:")p:`:")pzaVYSaVYSa>2a+a+Ra+a+a+c C":nYc犀-h9d?0< , eV=TIY eKHsip-k2^G] k|ٶdkK|5j#OmHğ *onI6 ,pҤRqAHA t[Œ&Ut2\tήu2w;έxZxrty4OZ%zOe@r zOe@[zn b{ A{&g }ۃ }Q_~eW~t r<jsC.?Yo |$ Vƒt =pf4 cf4 # i: QrAmd ̹:PilFPilF ;?} fԑ 3>(v!O? À3YSÀ3YR3sب>vbDi *bDi33GTS ~` -bU~ xڗ/zzN - "0?uwsf_v7<vuL - xU1Vs Vh7[?) %:dcAW  \vbWbW bWX_ !{ {wnAL% vWn5*4 "}h(* Wkj"LmM$ Z[ <^Wh<^W13MX3%$? rbh{i ZD(d/ov^# g /#y #kݬ ?_!=nPs /urU*K//urU*+/urU*MEU > ï ]# qS'ol[€@A[°ޞ ,¼7LՒZ6 + çL|8 Ź(5j F(KY0Hdjy7aY>cxaCDǾFɖǾFɖQǾFɖK k]՗Q q5/Yw_4J s"G!GxSɋ؃j.i i jԘ: 6䈣ʑ 2Df&!ݒAN\d/I92qTpŮӐjhԪ-"G  xT *]*]Í/܋-Í/܋-YÍ/܋- g GyG? N3LjSK'D4xE50LD?`W :YN.jD`D!`D!UT/%>T/%> vY ڤD(JkoSp܇'K+,ߘZ䍇 ߘZ䍇6Eɇju|ٲ7v XS{mOLQ&i5*r~#D *r~#z*? ;^( |jEU ,=޾I}ca xa< }I %|mf m -Oe?Ly Am) a%P$Jqj ,@#']/ -@iM&? 7?HRZi?7=PR;iC C] (4  h6F7G4Ds8Xj؞ e؞k1Y&Ld`wx0~ltCRr 2 Es`_}udz:1svR1sv {/dY  {/d 4G[  \̷=08 ;|;%Q|  u%N ZxyK 2KTF 4h* -"ؒoj $mptR/˹Kf?Qur`;f?C/cĴ ! 5A+ `#$莞$5&BBViL'<;L%(:\8(,ל(,ל*&nHC*26![Q+@J'-*1a .z$҈.%X-k .t $.dֵ(/eJ^/ŗ'Ԓ 0 s]#1826{D826{29D2c53۶B3#ʫ3#ʫh4jf 4F9?5XӇ5XӇ5XӇ5XӇ5XӇ64b 64b9Mڎ9͚= :g6i~Z$=>~Z=2R-=mCD=mCDR=mCD=mCD=mCD>d? i>$`F>^e ?>& AS= AjpsDFc Eaz sFvW4 H+6oRH+6oHB`8:HB`8 I I]v Jۺde KkE:MtRMtM`M?ui46 (O [j? O 9 P>n P?J PZySQh  RRePd SQݤTMvΞv 3UȫW (<VC~zNVM̛*XXXS YkAtRIYJ Z <Ó]\ \ ]pK \].^G3_@0Ұ_!3`{nnAaXS֍p|@fZ @f#F5> hwm \)%LMs>v.:zF _r {onQh (onQh#onQhonQh \ YWL] `ۻG! .T##K#2u 7'I1k4 ͭqY#q 3,K6Ƙ*Q cYbΛ<[B +Rk`LK OQ$ ? S6Ny FѝVӝ\S?,ӝ\S !V+9 !V+9  tR4!Bzດe #px" +I&IQohOC-I-IC80id$ m15=jE15=|15= 15= 15= 2 )L nL`. I(Qx!s緃M3a VNX]VNX]R"CS\ކOK a)YG Yj%kNEL0 DlEt] Et]:ʃ%Vfy ug^|V=| و ؙt.%*:I  JQ iX U mknxPO&-|j c%6= z2F+.#-PzL|[  $$0uR~50a?&d &G&G 8VS5SO] ǔboÜs#ڻ~Ӑ iH P9~Qb NC6 XFSC6 XF l2#Э&;<[t*11 11 ,11 8Zr Ok|E r5^:hi|; bbSPFbbS/bbSpnpLpnp"pnpS% ia3 *ia3 FF44]M%}Rt̬9`;?ΈSnNRn' ޝUtvo/n,?wk >v mY *Yu @k @k +ʃ $ çM* çM* m.çM* Y çM* ͋ B,Y $5LN5L悩l5 5  ~ ivZ O-.R!O-.R  M1~ e(c:( ecE~ xv̗*L T/2 Շ9q eG`j1ZHeʰ+ʰ+5Lo96QyXC6QyXLKT2/:)zX[ X.N{P{PՐ |؞Ԉwc!n` +Kβ NF! H HˏU w #ˏU w PL% PL% `uɣyf$7  y'| S{[[ y<q.m  m?@iK?@i ?@i ?@iW<{Q-Ðxr2=MD} M> $,Ka,v J , _VE* !^A"Ʋw"",V $$e֍F $ZJs$*UÜ$ $*UÜ%Ms%`6 &K1D'B`'J @R(ZݾY (Zݾ(i(i)"yoN )(/:k/:/Yb /"Lo 2y:92y: s3޳4O/c 5,) 5,) 5K 5.ћhn=600R6^$ :Z :Z<$LU=kw =}>]k>]t? ~k3? ~k @{@?@{@ A|LS lAVln jCm0LF D` Л?EFp]I+7yLI9XIMvs*IMvtIMvkKcլ]1Kcլ K-N:LKj] M#\j MEkHN?O.fOn>:_BYOnpMjP6ePQ*ptQ7Y3WsRX?dRhcRƂ"j_TeV.6&W(bZ\t *[Jw f\=-bd\~rT\~rK \~r^M IS_6e%H `@})6d "ao sc/.K6D c\&ߚ]je -t h+ rh+ Ch+ hww iu$K*k2|G l%bDl6Z, lqn2lt?s ,nJI-rn^rnX6? nX6 oډ36Zo_j p eCp*32I (}>2ItBy IiGϩҡA .- 4r +}`F:=f $Βd~#$Βd~:^;m`G bf(ոmEdhCZ$ͣa &^< a"q_aLY N_ԐsS iMsS a FC FC FC (p^ $)BsNdeheO,Z $1W) =N]ЉZ \s2GJF]նe:3@@bPԿ@$ ypEJa G@ gUVJIFK*R$1] Bz gU)ؼMZ9U)ؼMZk\\)\SBfƦVd '*C<)t!Sٹvk0&m jSm-Sm-?Sm-j7c4y a;V61|%}7[G !s4[ +: t"t" P&@&ߏf0eB> $rX ϶ iAZ9ng #b  b vnR  u%qH Ÿ ˬ¸yYL kLP?t&Ĩھm\j/TwJ?>WR ˣZ#lKd >w >w9͌,-ͽY#:2t󦄚..t.. i.. .... .&NЈ"z "Ռb eqL  չ7 չ7: !ȕQj$ S ׉H1zTU((قtDLgمMi] jj  ,1 گo+KUe0P}t0v[#WJ ^(r @]0(r @"(IC0|@a c (c =gv̼FIq |`t"ʜw,* ,v+   ,JUo a,JUo Ene) #~g:4B6 G||S||N  vO **cC9Bu#e{3d1Ӊ{ 1Ӊ{xnsxnhxn { #"\(H[ġ8T "1g 0"1gs|تs|ت"`  !r &i.dZ?G>Z|*vc rZ˹3F9N.so<?b ?VO`j B $BjBhB B $ [  ,zVV(`>ylU Į L  o o b-1 dOd7j  'v9e  W" cdk-( }GV=Snn -V\<8AP6_ Aï  {֕M] m[b ms ``H )DEMx A 7o! z & j!g܌"\SK"\S#Ors$Eْ}$zf, &li a ([9F0S(([9F0([9F0 (s|.K*!0z+(Q -@8xb -ӗ-{ i-{. p/8z_K1=?111ؠ) $1L8`R1:h_&s;QB 2;*l~` ;\Fv tj?ෆwAZ a%Beʋ C%vC[$n D3 P6L Dbcqu"$E%?j,9 EEʰI:E*R HAw H4?+ I:pKI?V \JıWsD|MV5 ,Mz?N^erX (Nq0Nq0] Pe j QW  Sb SßB L7SßB *SßB TM1 $Ti0"UAh?Vfե x W WBh5&Xb jYG])U YG])[jR"{bq \F)\V7k\V79 \V7] ^^9 ^LQ b X bd& adRCd3( bf}?hĚޔ%ik> i}$|kvb 2 mPma#mךX Qm#nyU ny ny9ntb"݂́Q * = }t| ,Z'" Ƈ8<X <X U64``k|a旎Ii jCP $hхZ)W e%$Y7H{6!ox ISq%Z4C2h0慠1wCQyc9\>@Sd \(@Sd 1#DZ*hh , *hh C01Ajsuz [ (|Ɣad}@0Qy }@0Qy #~&?8~&?8t~&?8bhgYl#) +ʤpȳ%( ȳ%( ,mQ(mUز Ǿ&?5iIþ{ e>[v_Z}R9W{t!J%~:D kDH~\ *iF-c C;)v׼ v׼dV*!c;Z!S$pSO1;Ǯ1;Ǯ$udI v8}pfଅv ۃABɏگ彻=Y't'tRJFX*SJFX*LJFX*]n $nsG  8L8;v! |] M,ԊH = {1}Wq -^?^?^U6>h:VQv;izf( ?{-rJt0'z= 0'z= (;xrn aTIFr ޟ~CS,n[ RyvwLd 9)o SJ +м+\ x] ;'LD]\-k   s43.D_RNX_duZ>inW !v ,&Cl  lK l#8L2(_- :QJ (uo[  G_g& g&L /@`#3j Ұ_ BȬ}pb* c]} 1/AE.%?r* O ׌n,, 6" \k"l #~$ Ѻj|Ѻj Ak< \ YILe YILet҈]I Ӻ1v_? 3 b#f\81 f\81{ +Ik+ vw\ޑ9ޫ)pߜ! Yh YjsHO:Åt"Åtps /܄5g >~b o5E Mٯd [''] d~_=V2}텾{6q ,[×HF/ :+}UPu8Z c |pXs x-FluykXgR+ 8ǭS \`ߨ yehyeh} *QG*U"Ա 8 3 mc~ [O/0?!f@q˴] s$ k .}qm 8q 认 &=O8tz&z&rex( E gէ gէ S땁 % ,8ʺj $# 5p =B+yNc cK p RL#q a gش'Za e+ؚ*d/yNc!;)TR p̠?u".' tf p mtf ptf p5$e`Q!?7`Q!?7t d6n.31c9Ot Z"Z"Z"M{lo :Y1B1g 4Ri ,|&ax#Gv:ĥ ̞  \ P dU C}c9!FR~z!FR~y"ŏs "KڌS# W޳:$ # %dB?' &k(n )b1)kF *ئ- ԌhΞ .ب/H0+f a0+fj 19D#1V`N!]2=? 3Л=4S/R4`r 6Y д 8N88R9smk?9%:|ƺrDY;f>PrN < }=~A(s&>ѭ7Y?Gf+U{L{CP^V8XD:PEIVNF"XFT9TKFgcfFgcf H@E"@H@E"@ "J8:ه4 Kn[hL.,[L_qP #Lz% Q~ZMe NMhzI;NfaԡQ+ $ODQK\DR5R~S:1<$T?]lyTTB"A;jTWDU~LIQ]U?TViXˤO { Y{X/NRYR4ZnuZnu Zq[ Zq[ %\KS\ڿM'R]a؝[^kj|`qLvaR aFɱ)b`6ߢ!b!jMc3- fVQCRfc}vfc}vi,jI2?Wkb" 4kjS4 ,m9޻ +mR:KmB]nP4:7nC,- nIR owh!fHRpӪ q;(`[+q? q{DCq֗2Ss;ܛus/2s/2tz`$t٧> wuJ <!w_E w_Ey` {mbxg{H!? {{|vQ}-~[Q ĩ+)c?  g U-kˤ{: ciq`Ep?A:o "xVQG&YišzQXpfyvYy4:|3- ]*iH#]*iHo;#4\ 3"3EB  àͰ6 j"iX6"iX6  n. $d9~`3R"Uicy"UiccF8qF8q{9qZ5]^PEء"SD-"SD-jPKF jDc #6[mL ,9p cNv(Jg f=1Lj"0V ,-"0V $;l>R'*F~v."  #5LBG  uk36 \kZf2ƌ m|},jxgC-1Z~)O L=Vžk  L> T+AjT+A?  2N ggJD@!` PϖKjC lj%őQ|fLi_HS9 uzAմkv&?[ŧg7 )ŧg7*#n/s) [8 c)Y0^կ]t <V [[D.kM @jX' KMd+=XÕy0'Y7C7CK +=KFC1vzfǀ~ FCvAt́Rt?t]`EREZZ SdmσGvCv B9e>Zџ=#ځGځG ?VR$i9ԿU=j_qK ƛO)ƛOLƛOhئ{E>٨8[r hm;/ ,+T ݶw(h X1IY)h,g0Ak?JYt7 ,6$ *D t ʈf^ʈfSʈf&gt1' 1'V>rJ#W >rJ#WKq5v-_`I( s`I( |mUdYmUdC2mUdQ$t Z}KϷ & @ʋ 8; EN Oof  $Oof  Oof jOof  (^Oof sROof  J8%  Ԩ=s'qXx^Q #@#Rn5F X3Y|RdX3Y|ZX3Y|\ȥV  \Иy 5GY5Gfz x|~3 #k5N ,k5N ak5N2 e 4 [7M(L rP5/9Gc 5K <{CG<{ ٹ MA @3 eX ;ZK a*K b?n=$sfѝ yLՐLsXm V*   V* :  V*  ʷ 4B-i ʴfUm0ͤA 2X<* 2X<*~ Zt ٜ  !Vk9? yaKj bWp&0RІMQ&;8? A;k7/fP&Zl oSk(y?՟:9. ,sD}gW{RBU JnkSJnk ޘe ޘe.|č"!k4w 5!3Ga!4tt "т- #2^ ##d/Ȥ $JWʆI$7I:%o6t%o6K&Ұ| ?( 3*(B1(B (B(HwF:C(eNj)yg!)5lt*" c١h+/ /@KG / ~DɛtR~)Zi$ ~)Zi~T612~)Z!\ a+\ W\tOXxu*\+ au*\+u*\+ju*\+ iR iRYF7CLU?WY(3\לRUlh=3 A <'ɩ_wFȶ wFȶ wFȶ wFȶY %%! $h|MQz ccjloP  C^Xn7?RVh[RV RV96U# (wU@b: B4[Pf0 Pf8^ËT{'  q7Bcs $1|n+t  (f Jj0g 0gkx ' , 2bb0rQ"} \Rzx{%5x{%N}} *j%ngL4ڇ^Rzk9Ӝ" d!)?=VvY\g) J@{[t]Ekua._R 9%?t͛ }f4j_:KY0x+ `Uu p(F~0e]1;NhG4ʨj+L >6[DZ @y6nIRel s_ )w:$)R|Q |N |hmKuTIuTri+ri+Y-c\$ xh m}[ zT zT I@ l $6x$VA x$VA  >D XR E.`=LO7R H8hT4t]6-qvg qvgտs, # Pj K   EK!YzQ !YzQ"&Ga"Ӈ|$A \% B'72 '72K(kr(kr(krS) k#)K)1Z# *')P,G;*ۄʹ c+$ -19&/S\0XM.1T  1Vy*%T1pٔ1n,4?20!%cm2H-NQ (2H-NQ2Y-VaP3|%VE 3|%VE (3+J4r + 5mY:n a:sc3# \;mpw;mpw ;@\R;@\RR?@ezQ A=oAP#[BQPB`X-CMg^1@ CLi@CLi@Cs !D,E G?zSH|-dHͺgj IXMvI3<vTJ?[ (J?[J?[jJ צ  J9[l?DJQLM];cNmbO`.1Q?ޱYH QVHH \V8  V;b@Wf+Q~W&GZXnp.sRXqZ\X%5'DrZ6][w\B&R\ j.(\FP]c2XS ]eũa]eũa]w- Y]w- ](g ]}KE __ e`UCF;b=󷚋n bx c q| c q|g4'xP;h3ziGkj#^Il[ nn+ neo 1?sq_#rjocksXD0yRt$ԋqL$t v9?y짓zH\ (zH\jzU܁|jn0}X2 }X2~%Y~`,qLlxZD)h P:%Yrhg Orhgv,Ga,Ga,Ga  ~'@L~'@~'@ dl_8^IMkjTg}Tg}!4(o {9 ,^j=6MiKN.twޱYY .uO B`R@aM?$ $(6'$(6d6COMLr  fb:n+[_I?7 oy:D D;D; C,:ʹa CR 1{s# 1{ a 1{=nQxD k (a6 lH}!OC a:Y5Z~ xsV J&<J&< S ^ 6j9$T;j9$T;9$T;Ƅa iSiSci-t%R2\lksA cK  rC ( I.:N?ն ?LTzt]a?~^dZF 9f bl}- bl}-NԠkI , v#B$ *# 4_/* ( t)|}ổ%E(P%E(U%E( |$4 sN+Rg?g?g?g?dnq(K q(K ,q(K \q(K q(K l2Y# l2Y$3Uou<'R<'N!I ҇Ei aZ{]Z Z{]L.qD x]3D$pGat g䥔Sdo!={vOCR 0OCRw>f/?ıh{\Hpq"ɎS(/ɮkCɮkC\ɮkC` =ISTV[VV[VN̷Հ< V V Qr=Qr=$QbC 8gLs;U1&ԒD Ե5& n(|JV?ՍբSրXVf # dzU;V|hؠa&9ا/"Gk@ "Gk@ av/5b )w՚)9GG$?0JHM(KfiՌRfiՌC;Z$Uy;Z$U?ޚ?};Lj$R+q]>AwNK;+XYh9Wz `,, #Jl Ε+Ε+D $%S"|PZw n#{8MDTR+'(R+'(j@Uz^ wda s`m[: ALS MsH N@hBq|$1 n>~~܇Щ93VCЩ93V/q  +G,H$X=j jQPKHˣ Xtů6jC S,w &AxLdva$vaSva $ʯzɒ  2c RN  P/N P/N  D"  Z ]"zs ]m#H5 .G=̴q|@e= lګ* }TBj CSe?ȳ vkWZ"v`"S #'Hy%"` ~ & Ͼ . &8C (>!b(19ټI *!R#+:S8- -34S.:q p 2 .!v/}# 'U0ȍ 3% _D3% K 3% 3 %31?31 31j7s4h"74o| 8@/K8_ 9"GR 9H0W=À=4_.D- >/\ʲ>t)ú$>t)ú ?w~y?JeZb ?`l@ũncdA.Ak?BoD[eDtgDVb<EʺT?EʺT EʺT (FD#sQFߒ3G a& k G H?UϽ H4DJܝ q7b cL GЗLu$Lu Lu Mg\l UOY P_ Vg VβYk XP Ƨ c X4RXd Ypo ZP4(| ZUP {$Ze˅ $[ &[ e[ 9[nBn\2hcG \L]2Bd ]2Bd]gFZ]Y߆_C]d;8^5-~nj ^: J_:_!MY `` s `7`7:byk)cg{k dEPd<< f #f $gș. ag.H ( i T1d 6i T1d$ iMjiݞL^ j/j/LkWM9K kk`# l,%l,% oM!杞 (qsdAȌ!uVAa uVAa&u3o?ud$v6 ~vG xf, ^y, -z_l`⩽ {6W [ }d$}\bh ~ɓ ~Pm1 r~;9q>- *bk Kr #.> ,yMjcp&x?߀i߀i2w2w 2wLVxoR{bœhs@hs@  1T|7nu|"qlhO$tRE=RE=RRE=P/ pS. \)еu]ndm VӸ-d [  Z NL; %ŽSG%fa '~H 9ƈ GJŶӳ*2Ŷӳ*ƀ 9 hƳ naB s}򷐍s}򷐍 |dKU aǃeGǃeG<ǃeGK5ׅR/|T *M#b [B tƾ +ӟ-W- sԥHDb@(0vb@(0v_׉8n ȯ:6S  +wN ؙj c6?R l&ڛLގ@ b%Q#$C?tN/a}%%~IO$ ᫝Du s M=ṔBgЋ1tBgЋ1YBgЋ1 [;0DՄ?Xs @Mb -B:v@o;:v@oK^RkxX\ _ 9G[?> \s: em[%NKD jJI5VP -+q r%ʪ. 'QN\ 'QN 'QNd mft,q [=2d \p (n>)tn>) in>)j u -u -3}_g ށ.?vϻ0R%Ͻ%[t<\`P y:,3 ib/!= \Њ1;@*|eh;d;w;w(:`?O T LV K A4/ ,޶# |- e oQ`d  i 8>i kf ~bi  M†X l  N  ?vw  lqwH4 13s 13g 13 ˋ= 5 5j 2刋 2刋 w_( ' ~8R 3Y# 4̪[ BJಔ[& !1.) !d "HʄA l #z( #tI4 ( #D^W % <  %G0 %iEJڇ %iEJڇ %iEJڇ  %JV ' TS 'WE&Q (JH c ) 2 )Xd]?D +\d ,k ,,{ ,,{V .jjC$ /Q  /Y z}D 0=< 0= 0= 1! 3 2oΧ 30ϯ  3q\] 4Lz65 s 4Lz65 4  5J> b 6Ebb3? 6ߘӗP 7 v 9dER 9 E± 9~[C9s ;]W7 g ;[+Ns ;[+N  ;|_j?S ;|_j F ;|_js Fk > F} > F  ?}j ?} ( @rI AՔ$? cR cTs2 eH( \ h+tk jcr $ jcr ` lZ m$`c3 m$`c m_sf nJLǤ3] nsx? pt%V ] q`j}v q&e r/tP rG |  s0$S5 # s܃QICN t͡39Q u }Y u }e uJ ~S upEbl l. v  wY+ $ xeg` y? y`C9: z 7@  { {x] |֜f0  }2rD }2r ~o  +2 L*'4 b3Y Фk1FL ;W [K# 015̳  3/c a 3/c  M @)<d 4P % ٖ0uv !L !S ! 3BL  baGN - a>ވY a>ވ m& Bc3X aq` , aq`  aq`  aq`  aq` $ aq` Lޱ  fn0Y esm c {˹. {˹. &N &N  &Nt rw< rw<  Xku ϯyv  _dā N-  Fl 3 ZeK Ze u \d  G}a 'ab` gl zTr9* s EK  ; hIˊ] ./ 5 5 X[{N 5s j 5s  $uc) ^c $ %nr  4K 7/\ RQQ RQQQ _$ >gS Hz1xm[ rj Z:  /4/ tY !vv = ,"U$ ,"U ,87L#, u  4L [ &QN ' tj  ;S ! ha \ hah* 38U ^h>R ' ͂ D ƧYZGK ̦ӕ+x?% k\F x5 }xud s?[ \!T a|n{ |?_q keo tB'8A ] M C  M C  ͚}_? γGʙ Ƙ  w(As  o>t ԭND> fp1  Nk6q  fD  {tw  ݼ$;tX }âv JGj$H ES +? #sº  ٪ ŊhR ŊhC __  __ ۛ {hcD {hc Q:f ݔ? =#m; H@J ጆo ^ }- 79 t]\> ]5t %˜0 +  [   穾'N 穾' $[ f+Zg< %? ȷ _ qZ] o L] ( ְL lf^ C?ݾAt g!? L ], ^([B ^([K oK? ƙ"FA !?o.!@ #k !AUoަ!B8x$/!D| !D| !D!;) !E\:Y |!F < !GCFgS!GSv!H#{P!IZt>z!KFWǑ?!LFZwE!LFZwE!NFc!N@& !NWdi!Q&!R;Aq !R  !S1j!S{k!T,!UQ%"ϓO f!UQ%"ϓO!UϏR !Vm,]!XQʿ.!XQʿ.!XQʿ.!Xc&/ ] !Z~?!ZT![[9C;kj!\}Y̸!\}Y̸!]#<~ !^MK!^5#K R !awI !hȎ !hJP e !hoxf?!hb2 !kv* !l YK !nmӤ49!nmӤ4 *+!nN H !p leK!pI>`yH!pA{W !q?PU !q?PUt!q=+/;:!qB>)!rz;s9!rz; a!st˔pt!s q" !tBc;!u"f8!ua7A!w "!w !wz~M!w.q!xvUR!x(%B !yl}7W !y|n a !y .uybQ!!y .uyb !y  !{ލ3y!|[̛Rs!|u F3t!|u F3 !|%YS n2!|/W64!|:‹!~g_!%`>!Ld_R!!U7J! !uf!0 qz !=w85!=w85s!hE|!hEs! >}s!XT \!9ŗ !\!B)!?!6Y!!G !um +!!6鋵 c!hff@? !I~ !Hpqͫs!Hpqͫt!8ek !fX[= S!vs8d !N9!֐4J!!֐4J !D5`!V}t耐j!̩WY!+K@!/Uyo!G?K!v)|!v)|B! Xw (<! Xw!ٲͩ ![n0!(]N? !vѼ!t!}:{-R!#IX!tWB0(c!X/[ \!X/[!ndQ,s!ndQ,!ju!k"a!#j!`!`!`!`R!oSr h !oSrs!3b!Mg_T !J!gz!ә!|!M)!;!'0!Vzj?-!u !nڅaQt!MfC \!-!.Ɩ !c-!c-R!O̘8!e8 T!0^_ ?$![ J!߼[7!ZR !ZP' !Ke!|<>!|<>L!|<>!av{#!av{#?!v!k:!$Bd!$B {"!$B !$Bk !GP$! fW! f ! f!0y޶N!Ê \ !1E'!ĵg*1!Ļ[=C!Ļ[=!#F5 !h*q !(J u!B!ȼҏt!tWt !e&#!e&#L!wAf]R!e, I !e, Y!!ˡHL !l!MY !R,c !/ ![0Bg/!ܠσhK!f:>v!.^,$!f^ !tw!$K]!< 4!MqR !Jui^$!6x !i3N!ۅK!Pm 6!0N!I%5|4"!' ]5!' ]5 !Ԣ` !C4 !!̧D+!nDj !z3 !8o7EY!x#!}P !}P !dbA.!/n!/n!/nR!'pJx!ps ! ‹C X! ‹Ct!*ލ4K !*ލ4"#s"<s"RYj"` "ۉ?"ۉ?D"JRUGR"HI0 Y "}6"}6R">xf">x"Z (" ǀ" ǀ" Ka" a#fY $*" ~` " ~`"/{ "/{ "|~yh5"|~yh5s"BXឬ"i&H"N4Zc"ŚgF" ] ") "6Izs"6Iz $"CxD"Cx"ȩn"fH]ҡ"fH]ҡB"nt "9 "9j"85?"!gru/ "!A "!zC"# z "# z[ "#lv"$wrO \ "%>_"%]2g9"9AJU ":d>0t";'m K ";HG`"&Aޕ "?Eʽ"@c?)Z0D"@տ "B<v"CBK!R U"CBK!R"En"rsE "r ~|"rw"` "sJNtN"sb ="t`>}"tm>7> "u< "uz\wD "uxa"u74!R"vkqR? "w^jt "w7K"xVʗR"zDA剌 -"|v p"|廰c"|廰c"}kubZ3 "~}=P"~DS"~DS"~DS|"~DS $">|r"S#: i"c|"T> "H! "Jop "w"'}V"I;Y"K9rR="x.56 "6W "1`  "u8 ";Jmb &"=| ";; |"^ "ͅ`o v "  "/0"Ϊ%?"hKL"ΰg1? "k"ɔW;?2"zmfm"n #" "/e"3 "U잾"εWQ "εWd "\"hft"I:G "Θ/"Θ"U"v "s "qbKڿ"2٨` +"N%+" \j"{"{ =":1 g":1 ":1R":1 a"$ rR"/p":٨k":٨ ":٨"-* \"X#"L/Z"hr"wyᗰ"'[G~O g"'[G~O"T״"T״"T״s "fH "8i_n""]!Y"xp i"xp"xp "xpj"U24 "€%X- $ "Cn2 "Y-"";aM "I* "R"R"R"RR"R"x%z"陮 xR" "'Tl "9"! "d""fM9h " )!}Tt"p"2 i"! (" &:R "=i"p!n"BT{ 5"t9"7"*?"7"* "c'4 "7u # ƢP# Q2|# nf#l1 ( # nf#l1s# nf#l1 i# RI{5$*# RI{5## 43; c #:] #X #RR#'#iNw #˕w #)[n#c\}>#O_u#O_u#O_u#ɲ\?v#A9 #, ##ԀLb#.@/mJ#.@/mt4#.@/m i&#.@/m #.@/ms #$]#$]F #lc=H#7Rt #7R #YMR%@#ѰX#@jH#7*Y7#!Ź## Y##HmؒK##Hmؒ ##Mul81##]##]#$V6?(#$~4#$&@#$uؐt #%gEQ#%m[D#',zLduS#'>r#(gzD#(gzQn#(gzY<#(gzK#(gz #+J% #+1O&|#+̔ #-s#-Q#-O_$#/\&&HN#0B #0Qn #0Qn#5mf#5StFC#6>#7 @Z #7lY#8, #8#49#:p#;՜|#;?;6 #<5!y(#=.x #>KL #?ԔjA#@&S#@JX #@7( #A9<#Bҫ C#Bҫ #C&ǿv#C ,*#Dϣp #Ez3f?#GJ' R#HDnLs#H& #J0<]~O#KTv#L$tj#L$t #Mf>PU#N7)9)#N7)9)$#N Chz[#OW?U #OP #R`R#S*X̿ #S<TJ #T!_̳]#TVZ #TBj#VA#Vo=#VSS#WWC#XpoR#XtTS#[@*ɡi[ #[E ) #[mꭌQ#\Y a#\Cxn (#\Cxn #]-}#6 #]M=~#]p=Ict#`O(+Y#`#R+t#`N #`R#aiHϢ#bPc #cgV<#cgV< #d nJ(#d %2Y#dL E#dnQ #e,c#f? "#fQ05+#fQ05#gWo 5#hݠ"2#hݠ"d#m }8] #m }8#m͗פ%W#nf #qASlC #sJ=#tsC#tsC #wh@ #w7tj #xs9#xs#x(U?#xFR #x>H#y\O #yxm>KOv#z;v#z97 #z9,:#}]ю:P#}vy #~U <,? #$r%&R #ACz#YM #!w#$H p#Mĸ #M #C j#LrA:# B#HmnQ : #n2Ǥ s#-ů# Э # =Ο e#6I{#pY_#;kõ #?Ww#?Ww#Zd1#Zd16#<#@t0K #%^ #v~e# ! #h|O#]@ #\X K#h#h#q /#r4R#N[ #]C[#);m|#IV#cJ #F |#ϰn\#7v #w_ׁ#v6l#CS#1U #1U#ՙdL# Y#t L#o9#o#8>jmo# q#|V#>uCҁ ( #APZf#'&z #(G b #[ p #4EsD c#f&i # -K# -KQ#"M|L #MmO] #p塓#Xv#Y|d#gz## / #(f#Zg.#Zg.#Zg.R#Zg.#Zg.#p2\t#wTk1#wTk1#L`^g#!Y#P\Ǣ|#W' h#X_=v#O#_Yo a#B8:ϣ<#v}U#&D6#X?##$N|%#} Z#k;H#0(`D#]޵B#옗Ē #%RP&v#\[}>a3#Pz #@(#ij Y #Yyt2 # #NJBO3S#t4Y4 #1#1 #Z $1![ $DI~Mq?$ 8 $&@c ,$Ot[ $0$0D$ވ1h" $ Ev $ z: $ B-A $ S $ AD3 $ ü\H: $o]D$w[ $]2'4($Qrb $?63 s$Dom $$$"Prt> \$wd$ʜ$ʜ$N@ $N?)| $4[$ $;Ó? $;Ó ,$f@[C $f@[C i$V .$؈$؈ $G=N $_-wW$ iBb$7M0w?$ b@n5 $!?bFY$!&_$"y$#$#:eD+$#:e)$#:eQ$#(k v$#(k  ($% c $%

,d $?\0 h$@9wg4$@9wg4 $@?tF2N$C7@2R$Cz. 9 $Di 3 $D}JF\Y$Ex>R$FW8A$FW8A $GD$Iu丼E$I! $JUCƚ$J&wq ,$J;HQ$Kr 9C$K}ɋ7 $L1$L|v$L| $MUsv&P$O?Q $Ow*~o s=$Roh֬ $SygTLÇ$SU]L  $Tfw \$To/ c$US$i$jdYnx$kjĈ$kƒ $lВJ #$lv{v"S$n fd %$nId2$nC,i *s$pt# !$p[0m a$p`NF$rUTI$uV}]KCb c$v,A՚$wRIy"$wRIy$x%: $x%:d $xR c $y ]$yY'b(K$z8$z^D$|)/|H?$}@[O $~< $+b c $j&#$lk $Xǭa $Xǭa?$TTR${.)$3<_) $=W $ x $aFa$ͪBZ $L h$\K$ΥR$#h$#h$DJ]?$a~$z $%[K$WS׉N$az $az$ўch. $D@ a"$D@ ($D@$/B#& $$ ^$IF0$4$E5$S4{E:d$IFn?$j* $̩Y $x$A!LM 3$خCf$-v}jN$Dcў$S;A$m/3[$m/3*0$MG[#$MG[$$n؆ $}R$x@JJtB$V=S&$V=S&$V=S&$V=S& $Ã'P$t$#]] aQ$.D $*sLq s$ƴXȗ $L(t$}÷L|$ۃm($]$3h$6&!NI $$l c$}505t$@m皾[$kҒ$}A \$}A $([[$c|$Dњ$KIS$efN$E Y$_V]$Jus0$ܷ s$#$5u*Z$@"1ML$v]=D$jF"$e  $!4]($yNs c$$$%} ,$%} $']$aVz +$ˤ~^ $7!< $7!<$7!<$7!<$_d$YA$$^ $5ێ|$](f #T$](f:$_t$$c$smk %)EC'%)EK%Dcr %b{%+au%3oR , %m[ %m[ *%[ %[ K%[ Q%.% `lR%Mu% ϕ݉t% F% % M(% R +% /Zm % 'SA4Y% X% ,%“~ e%yw %%D}%/b%/ %D % J %o28 %-Ys%GqT % f<ܣK% f<ܣQ%̋Q %v%Vv `%J;t %%6ABoR%UM6 %UM6%"p %"p ( %"pt%"_ %% %%zF|< %%zF|< %'.yW%'.yW %(^Il#%*s,9 %*wSyc%+>'Xj%+& %,$H"jO%,$H"j %,$H"j)%,Ad%-@7dR%-H;o ;%/4 >e%0s.?%N%0mȉ1%0mȉ1%0O Ũ !%0O Ũ ,%0O Ũ %1Ǘ%15s %15s%2: $%2%;%2S/c ,*%2S/c?%3&xd %3 %42ES%5 %6J{>6j%:H;%:Ϭ Q %;&HIt%;7CN%2H%c*Re1 %c~"$ (%da8pv%dS %eKœ%fҹ:%g~8$I%gĖK%gĖK%hq9m c %i/%iJ|%j7 %k^ \%k5d&/%lKPQQA %ldW%n:YoT- %n"T"%o֊dSY%o֊dS%pc vyL%prg(e%rICagPX %rod %tьL%t8H !%%uvIi ,%uvIi%vQ|pl %x$(AR%yIHFJ%yo +%yz/Mi %z& S%zQ*$%|x, ( %|x,h %|3 %|&b %|<&F%eg"2\n %9*%zHJR%I-%O[ %iKJ %٣%'&[\ߖ %`KkT \%z`P %mj% lD % L|%[ %{  %A +%A]%BNuj%BNuj%C7C!X %C7C!s%h{뇭v%jp%m}b%Jjʲ %nJ (% tj  %xRK%$S/%T㱸zQ %o6S Y%j8 %%Mu#%+&S%?2N%ͬ%HlwV[ %`v%n%%K{" %V{䶵%iӷ %R4U%`%0ݪm %Ld S %fDK %{Yw< %{Yw< %ڻ|%Ξz{%,堡 %у5%K 3 %I%op%Cax %0%y QQ%NS% E %ȬfljQ%#)"Ws%w > %w >%&"%e%"=d2 %, %ٿ r %ٿ (%M^]0$%M^]0%Ԗҟ@,6 %: %P w%֧6 (hG %]a2z!%vd %)o{l %,M$ %BZ[%ژ-;7%ګ28 %ٍX.v %/%6xv%X%[:V %~f.%߾x%߾x%U25?4%d%4LHk%Me|q , %4~P#% Zv]%S %S%S e%~k@%I{qԯL%I{qԯ%;7)je%F%F%F%0٨k%WZoN%4e  %C;*%2? %2? e%;E RA%;E ,%;E d%m %Dw8%ˁ /C%f %%raR%#V %}hD %Q!%Mԥ ,R%Mԥ&%U}dL %C=dU %> %qna%_.d& /j& -t:\ m&!nf5 g&!nf5 &KQ&c*V&ntN&|+ ( &|!-<&Ks &='.& N*\R& w & "5C m& ks& &;3&/7u + &qp̅k &e5 &J# c&O͎,N&M&WT&jWK&fM_eh3&fM_e&ӆA &>Y&Ct0?&oX٭&x ,&(HH&(H &(H&T& Ho a&!R4 F&"WNL (&"dH%&"q&#V' &$3!2S &&?B &'!dN&'rԌ-&'rԌ&(;fm2EK&($* &(ͯ=L$H&)(=cq&)(=cq&*s}' .&-C)j &-IYZ&-|&.\ub&.\u &/V%}E&/`9&/u&/ c&/ cS &0?n&1}& &1c6 , &1Aj&20dc$&2]4&3eׂ i &4nzO0(R&4-9&7W3?&95.H"0&9)]4@X&:_w &;Ƽ&< > &=}Y&>-p¿'&>F &>Z&Avn`&AIv&B'a &C5piAV &D] 6ge \&D6`k&Hh>6l8&H6&p #j&Hd{&KZG?&LXइ( , &L\&M8$?&Omw+ $ +&O>AOM &O>AOM&QYng &QttB&Qt &Qt (&Qw T&QxRS &Q|&#&RJUڜa&R%Ӄބ&Sŏds &Sŏd&Sŏdj&T E[# &V`{t  &VS&WTɃ^]&Wʦt &XI ba&Y q &Y9* &YC܅5?&Y^DAP&Z_~<' &Z_~<' ,&[c q&]F*#&]F*#L&_tJ[+&_L 9 &_L &_j4n`&`]aq&`]aq] &`*?&a?򽨸&bJAJLj&bl(X&c0g&da]% a&e_Q&f<|&huCկ  &hȘ * %&iT![G&i-֘ &jPX&jx"j&kQŵ@ &kQŵ@&k#兴*&l#&l,I &l,I S&n,U c&om#i &osv@&pĶn &p@ &pC_. &qC-t&qeK7/[&rχ &rǗ@&s?v &s?v s&t6.n&t9# &v,pV&w!&x+V_[&xkk ]?.&xkk ]s&yS &yK&y"J|&zAhk #&zAhk c &z5+&{-U &}m &l\Q/&mZ։ ,&I_:&} ? &~L0WQ9&JԸe[v&(&(&(U8&(&(&xe{mSD&&1D[&'e4&'e &'/&&'|m &c6Q&ұ &ĈR&{0Ry a&;5 &;5&;5 &l Q}&st&Z<&y% &[KJ&0|(F&0|(&Ǜ_C&g8ާV&TaX&TaY&N[&Fna] &cv| &0ٟ&LPk&Ry &Ɗr&3M N&<}{ӓ? &9$&o(N &e|hH&e|hH&{8&Du&Doy=&Gq&ePjBt&Rz&6a&6aU&6a] &U͉S&U͉&Nyi,&Nyi,&䬋o&!8}&-Q&nj &uN&&a, ?&t~ġQ&t~ġ]&N&S{Ҏ&S{Ҏ &Ѯa &=&&ކs&דYl&J= ' &"mW -&P F &zKC&3p<&DL&k &k&-4&6m &6[^κ s &aB)f &EAo&#2 &c &5' &6 &"V.S&"V.]&"V.&{niwC)&[6&ǩdXk_&ȄWIR&1'O& rl&0VvK &Dp_&3^_.d&ް\&ϐP4&| 1] ]&Ӟx\&Ӫr˅ &Ӫr˅K&ۡj# &ۡj# &ۡj#|&ۡj# \&3.`? P&X4&X4&vԇlx &g/ ,&(bSXM&د &6r &ٖQ&ٙbk c&d.*&d.* &Qzu? &ܼ;^E_?$&ܼ;^E_ &w).?&om$&T&ⷕ'u b (&JKPa&$HU#&]cc&A1+ &'Ļp&: .&>С$&>С&㤆_| &zH?N[& &]iZ&fcR i&`6(K&s&^GVR&u t&u &u&11&/v|q&Ƭs&b? &T{S&B&}&I~st&N&L% &N&L% &zqoɟ&$')? &|m\ &&L5{ &&L5{d&(9:D&(9:&(9:&& B! ,&d _ &wbs-&vY* l &Az, &j 'LP 'D-n 'G䆡'; 'DDr(?'|9pK' {(' 6Ź ' jTt' ]toR ' }'BL ' vq' iY'g ,'rH'4{'t '2-[R'z 'b< N 'aZ.O'aZ.O'aZ.O'aZ.O'aZ.O{'aZ.O '|g`Y'sj 'yS'YA{09 d'YA{09 ' K'0=eU'EV 'EV $'EV ,'EV 'EV 'EV'lQ~!']y']yU'kx'&v<9'?Y]'?i!tP'?i!t '?i!t '@qN'@vduk '@N 'DI`+? 'En}s{ 'Ez~7 c'E1 'E 6'E͍ 'Iz2 'I@'I@S'JۤG 'KR-s 'KR- a'M;3_,S c'M;3_,S'Mn#Bx 'N3j'OUDV 'O, "'Os[#Z'Q%r'Rag $'SL;! 'S*m4~'TEGŐ'TEGŐs'TEGŐt'TEGŐ'TEGŐ 'T̛3v'T̛3v $'UMƝ 'V1L 'V24'X\)# 'Y2(nL 'Y2(nL 'Y氯 \'Z644'[gGK'\TC'])sy!']_s& \']ߔK ']&q٢ '^rąjKe'^rąjKL'^rąjKS '^rąjK '_jj '_-?'`"`sf'`"`sf '`:(+'akFP'b*\gz'bG"j'b<'c\*G;'dB'd*i 'd*i] 'f5^'g^! "'kAy8'kAy8'kAy8'k('k 'kM/ T'l} 'l} 'ln  'm; 'm1: 'm1:'mU &5 'nZM.>"'nY'p3I a'pN\ %P 'qIVd?'r='rL颀 'rL颀'rL颀's @` 's#J=@ 'sç|j h'u#CNf'uk{N 'x@rS'x@r$'y!To''y4s-2p2'T۹'PԼ7 '˃&E'_}> c'̙>(s'Z0t'YV'YQ'-p19'iZC 'iZC9'k '51'PGk1R'"x '@a0?'>M + '@v 'L '|_ '҃腆 ' gk '+^R'N$p?t'"(7v'h%G'F6i ,*'.roU 'a䤏 $'ށ }E'޷`>'.i $'Gng$'؈'v `'9dye's\a-{'''|!U`Z'4Dt'K '?gjT'^N'c ?'ߕi< ('(i+h'챷VW j'7['.U ''\nW'x1L'Gqt '׆H '-$b e'Bb( ajg|( eN( |HR( %F( 7?( o|\l8 (r(!V (!V(,wnM (m%5&(XD N(AS6*(m>](^ (2" (c) (maas(K]: (Ί"D (8}'@ (DQ()Q(L$2RF ( kk( @0( W*c9( vOo? ( & (!sVMY(!sVM (!sVM 1(!sVM ("{t%(# (mz($#w:($q8 ((i#L((Dx,((D/C((s=N()9_,()3v()3v()` ,(*h+,_SC`(*Lw@(,C,*wN](.(/ 4(2":u(6wmP/(7`)(Y(7Xoj(8ې (8ϓEM +(9.(9.(< N((<=2(<=2 (=~AO(=~A (=kf_t (Atspk$ (BF)#(Cq$(C6ɀX = (DY"(DY" (DY" (DY"(E2(EA]b(Rnm(TѪV (T%Fa(UHzt $(Vi gz9(Vi gz(V= S? (VaQ(Y[Bq>}N(ZAtOC (\v (]u|(_ 07 (_ 07t(_ 07 (`7dg(`MϦ.2(`П(`Fr (aXTYR(a,H]_ (bv (o8cHt(o8cH (o7 x5(o<^R(p)QXo (p)QXo ((p VY (rW}B (r;E(rh:hR4(rw^(d{ (s, (s, a(taxD(tQ D4(tQ [ (tQ (u꺀e(u꺀e(uuAP(v:L7 j (v81V ((v|0 (v|0 k(wH (}״sL(}״sL(~ ba(~2L (~2S(~=y~J$(~Fz"D(~^ (bjs(m(чvny (Τ(PJ( d :'v(h(/D=" , (ݷ$t i"(Ɲo (qhe (qhe N(qheb((ӂ( (lkUd([N (%@ (aQS(I(Ϯ (GTn \ (`L2z (3׈((Gt j (iuK(iu(pQ(p (%0 | (%0 c(Y# c (M* \(l[x ("m (AGZ(AGS (AG (AG(iqP( ( (4`K( (Ơ1J: (v(M8W)Q (]8#  (kװX (kװX(<: (O`X (`HVl(#"9.(4Zs( XpB ( XpB("b(4{(c{(t*Jt"(ug ,(uz{(Y(;o(}\(48F%Y (Q?d(i(le (T.A(^^(^ ( '?(UtY(,i܃(/P_Z(1!S](K gD($L (I-lI c(Į]T(a~*R(4k(µP3K|(Ü0t()nI1*(0(yR ([П(3'Hw j(s $(Ƌ $(\L (Ǖ9R(?s5j(~# (S)vT(k=v(k=vR(qk47(˺dPY (˽==/& (˽==/&(@\ (Çf(hj(u6 (. X(. X^(w-ɵ(ԗzʝX (1 R (1 R(f| (fzq 5(rї(جLyW (}h\(DRp(ܤ2輽N(ܶqEZ |(*^*v(ކʂ(ކʂ(Fj?K(J7 (⚅iq (!rH 2_(.S(ެ׈9(ެ׈ (aPt(aPt(aPt(aPt( r(S2&̈ (qE (j(V j(yf(Tp5(mvQֽ (mvQֽj(mvQֽ ,(uM (wi (ﻸr (ﻸr (a (_}/(;: $( fm!D i(dY({6W (2/?(:L[U (P7K(PEp1L(}?(_;N(nU&"K(/zR(-, (lLeN (d s(1_/ m(=K(=(39J^(4 )(4((4( (x:k5j($6[(?)(پ ,(9 (*V )ʸdv)zγK )'E " )Gy)Gy i )us))\)y^")y^Y)) H3} \) )< 5)  h) 4. 5) F֚ ) GC )@.60) F ) F \)%=J9 )X i)r )ara7)Y#)uga)+W )+W )@\@[s)Mq )L p ){ ){)P)#B )E )Jv )+ a)+j)+)~1$)ڐ )M){7A;)UU4)'- $) MD ) 3{zX) ЂN) ЂN)"rs*)"r?")"þr4)"þr )"þrR)#v )#v)%`=zh)&Ci )+.ݥd)-d?ta).7 x)/S8)/ )/i s)/i )0>X2} )0˜,)2!]u)4ֺ)5.vQ)5[cv )5ލw )7BMxm.  )7CGJzk)8Z滚ڑ))8Z滚ڑ)8Z滚ڑ )8Z滚ڑ)87?9 ()8V8)8V8$):P?# ):P?#T):41y?):41y %):41y):41y ():Y%J):Y%Y):У, );6 );J )=: )>6K )@@)Y)@&m)? )Be%1j l=)B\<)C(OM %)Ć8 *)ExB)Glw65C)H;T5)H])I\,S)L:E!R)M8w )Ne)Pr T )Pl4[(R )PaaHv)PaaHv T)RBB)S?$ )Vl?)W.}R9)W.} )Xз@x+)Y $])YTI>W)YTI>S)Y v" )ZQ8$q<)ZQ8$q )ZQ8$q)[ i 3 m)^+f9$:)^׹A5 )_׍- )`B,wSS)`B,wQ)`|%(G)d# c)e Uh)e Uh h)e>-v )e  )f.9 )g3 ,)gE)*)hO}j )hO}t )jwY3L)j3r)km, )mZ݋ )mpK)m9N$ c)n%H)n6#U)n:$)o>,*)obuF)pC[ )p6~u})q )RS)q(h>)qcP )r\L)`)r&)s]B bO)sw)?9' )spA )t"ؕ)t%pʿT )tmcKL)uu]*Ky)uu]*KyR)ux9 )uu ^)x^Xn|j )xvu )xvu)xG~.[)yxP)yxP ()yz;^ g)zOl)|_gS+v)}@hYǸ?)}⛱As)]LD I);N)-^?)&7 $)>q;X)>q;)>q; )+z $)W?Mt)W?Mk)b#& )SShoB)/7 )})}R)2' )vs+h )WD$)G )[05_Y)WS48 $ )$(YwQ)$'Pk):*K")OKOy )A86 )/Xf )/Xf?);aD )Ɔs)O1( )+`)y )KC )x,ȅ)f >Ft)f >F ) }+) A1)=޶K])R5hB D)R5hB )g.\)ixAC)X:|s[)4Z80)4Z8 )D/b)&ñx)xe[ )Hl^ = )7M<.)JgU[)o6*d)FQH 3 )eep)L )-))-))Jw)h ) 4)GW)HWq!td)i<9x)nO`;NE)nO`;)Cdv)Z).). ))%n;U )@ќ){j)bZм -)g(% \)9j)-Xۺ)Csx )Csx)Csx)C 1pK)&hr $)w9m )XL-M5` )df) ($9) )–$)[qm)cUk)Z_lGIS) Z ) Z ) Z)q! )ks)8ب" ) )QMg)xd}c ) X)S^v+)?3K)6 m )7cR[)ͮKN2)OIX))! -):)%KUF8a)%KUF8)zͧR )ɄN)籅 )6OB )/#)/#)/#)6<)~??)$fL$ )YN $)C)CR)Zn ):% Q):% Q ):% Q)ӄ?k) ,[ -)َF)َF)َFK)sq˻ )4)< )} )7.}r)[Tt )'c& ). a)ܿl )O=M#)|:!)gݓ )!Y )6"A#| )Zv2 ^)-KL)–")–"D+)\QJD9)Zlm)g];)g] \)a )m)2qd )'Zf&u)QG?)BmЯ)-n8(L)5Rl*)?+KS)?+KL)6 i)̆?)8Y)52|d)52|)fJ ).va)pzS_)\E) )k )#o!C).j!)f)NCT)Wk)tW4)'?J)1(k) l*)AxR*~ pB ( *I` _S*S/$s8*) I*5., # *sY *Oz*j * nR/ * 8E 3* W* Dj* D ,* (ͨSB* (ͨ* LY* P0D*jXJ*jX*h&M $*#`rZ*ގi%*M&*M&*>܉*4qV*"R.v*q!* 6< *6M*{*6Uod *?d2*ɒ *!8; *™*i J:*xD%O*EGԉj*X'sL * 0L$f* sצji*#FQst*# euD*$G0İ*$^Z~xOB?*%L_ *%N(k $*%7 *%7*%7Y*&T.hB?*&\*(_rr*)/$b/*)EnC7NJ**7*,mCw&*-l3$*/(iա]*/-ʀ */-ʀ*/R$` */R$` *2IUZC*3֝w<*3 I4*6i]rq\*7oy 3*7գ2t*7Ȇ0K%*8#`\5*;Z2TV*=B:H*>I`*>(շ *>>zbVS*>4 *? |th *@ *FOt|*|*FpQ#AF*F*Ft1*G1)z $*H_Kn *I4*IҶ3ty *IIp5*IIp5*I:LR*I:LS *J}R*J*Kg%*M'RXKs*M'RXK|*M'RXK *M*Nf@ c (*Nf@ c? *P 67*PΌy *}J\' *}0zp =*aZ*g (*5,Y*5,*5, */UW2 $* {[G*TjG *dQ~ *dQ~*3~ *~{[!*R. a *pM +*lԲRE*f(Y*grިB*T9< *p6s*t|*Njέ% h *vΏ*vΏU *vΏ%*F坰t*4e*4e*H؋D*A *+*T6;*ܳ6* j6"*{ӇE*,y*6FZ$*Yjݔ *|2WQ*Tˊ3/0*Tˊ3/0*:`p'|*B*ob * V+t8G* V+t *Ҩ*4' *yIt؅gX*q , *t{To*t{To *N'L?*2NMI *E&1 -*\&L *qwc*}iaN s*jϻ2*>Q*&*,/ c*_7H D*G w*G =*Q #*^8DX8 ,*ɇt*Z!*Z*B+ $ *c;C*m}Q **z8SJ*^:} *ٓB*ЁRu"*du["M *N *L#*N *Nh*c *F;*L3۵q *`sr9*̪ק*qIP z*1^-*R]T?*o.*9AnP*9AnP*N!j *}Vj*;W,u*5X*Ht*Wy$'R*cX**Li*ĉ멳iD*zĭyT*!QL *6v *)?*r{(g *Qp`?*:}R*PS) *)_F*Dq's*'ð *$^v $*s *Χ?*ᤡ*b ;*DpB*hyS* /װ*@*:u .*+9*Ҝ'v[ *Adx  *Wp*A)j **'*7*DJCkn *1a *nKz *qjwg *vl^ݣ]*ڤ= S *s^ * zZ|*Nf-** *? *cø2* \ `*RBዯ*6R*qӕPQ*qӕPQ{*X=eIt'*X=eIj*E~S**!Cd *m`*E> L*$ **׬ !* *̱*DJ*Qq\ r*nq $*aZPu*aVD`*H`H6$ *rVg! *F* L*go&*go*@VRQ*@V*eF*koh> c*v * Y" !*Ph*Nv*s9gR *LSTZI/K**C *_ٯG*L+*%d*P ?+=u/eV +Z?! +"UtV! +"UtV!=+=+Ȅ2ii+: +suJE+nE|o ++|/Zoy+ćR+ !K+ {zej +CN +˃c>+Y3%+3 +Phbv+i+kӻva +҅Rg?C+R+@7 +5miq+/5+>7 +>7D+A#( ( +A8+BtC+BԷiSS+Cl3y+CxGkj+Cд~m# +Cд~m#+Cд~m#+D%!0+F<Z+GZSK+HYg+K钲*/+Lp|(K+MRcM/ s+O7+PI +PW+QBP +R ouyWr +S9gK+S6= c+,Ut+_^?-e+ڀE +`S&#F)+ +W+/j+&=(+KTnF +j's +FOe+@+@d +zXtt+rT +!( $-+H` +)NWq +N$+N$# +jp#|+1_1:+1_1t+rCo a+" +/AB+C;+C;+j5+~F (+xN=+&hNv +aos+ao+T +UD Y+UD Y%+Rե8T+S , +&@s +}^q +S:'R%+1Of\+ I_~+&il+ǔ0+uA - +y(ՙ +`l +4K +%y +y'+ DS +c?+ט`&S+u+҃ +(q +dnpX+o9+VfPK +kǩ+z8?+]+C_$+ÌgQ $+_o +$NgZ +wO s_+䌇 \+}f%+w|5w +w|5w +w? +A-#?+ s a + hN+TC( #+=X +@\}L+U3ݭU '+]  c+6S+s11?+ \mO+oj+HfK+bq+/+Es+{va +g.kv 1+ʮhS++f|R+' -+{ڙ +A + )jyЌ+۹7xx + W'< ,+` \+KƧAv+KƧA8+KƧA+KƧA+5Z +[K +z7 +z7+z7 +z7 ,+z7+z7 +6s˜c]+ Vk(+Tc쐅#+Dž@0:+~ f?+yݲĥ+ʃI؈ +˺[-+Wb+ڄ};ys!+ݺ9OH [+f+jcR++OT}6t+\y +ҍ,+Ӫ={+'t\+lu+ +ؼ9-+ڼ7p)+|CXdL+ێ  +a+ܯR^ +ޥ7{ +ߺh\4+'U+']+5CY+2(+EpsCR+EpsCS+=l5MWL+=l5MWY+t,}| +(E+X.z+ O\ o +-[++)@mnC+c2vN+c2vR+uـd+' 9 +$[a/?+zQ,+1H+ڜ2f+[X+~++Ubt+隹 f$ + `I + `I ,+]@uU+'G#+>(+k 3+=)+=+ti^ ވ \+Oi2 +EǍ,+M ;+M -+'N~%+ +~Ƿˠ+$r*x +ٲJ( ,-#h$,Hp9 ,z#|,[:,?Z,,ɓH$,t4 3V,CI*,w ,\v * , 89(?, 89( , ^D?, kY, ,fL ,ۜ8,-'X,} ) ,3 `D&,a|,rgw+,oE $,? q m,*HpS ,*HpL,od,],Z\,I{\.,I{\ ,t,kV l,#ɑ,o ,4u,WۛG K,0L,>2 a , BH@ 5,"&ϴA: ,#^).,#^),$ǪHlw ,,$Q!A ,%v8N,%"vNK,&U G,''#O ,(.Wf3,(.W,(;6 ,(C࣪ ,(EpY,(Mys,)* _,+fiTf,,kyv,-GbZ,.P> =,.í * ,. f j,/5qt,0nv+Ƶ,0w ,0w ,0?]" ,1S~<b,1T ,2,D,2,Q ,2,,3#  ,3 x,4&ѓ9s ,4&ѓ9j ,4./,,5;|2oT ,ekwZ,,fE~ ,g,,g} ?(,iؒ\,iؒ\R,iؒ\,je Av,jw@,k ׈ ,lV'$,ng,n*Z ,o?(5 a,oq2'<|w,oq2'<|,p+,q_ǥcC ,q_ǥc ,q_ǥc,q=R*,rvDk,rB#~,tQ<b,tQ<QA,tQ<.,tQ<K",uLR,u 1 ,v5̸@,v5̸@L,x EDN,yt|,z.=if,{/y!,|Zeݧ m,|\ƴY[,}@,~|\'jN,~|\'j ,qSfԱ,аJ,,vlgo \,vlgo g&,^t- dW#e- r%\,*K- r%\,*K- `C- ]-t$y> j -n7-.hQ[-.hQ-.hQ -.hQ -9WR -o " -S➸ -@߼c-+0F)"-f3 a-.IXK ^-if*' -wpT-%מB -n3--tUmt-c*v -)d-6-`O w-BoK-mcfX (-7U?- գ#xQ-!,`ODS-"c -"c -&+Ė/-(d4Ld-(w]XcpR-*]rx -*,S $-,P/$--=X^ x-/ Y-/bf-0UV(P?-0UV(P # -0\nR-1t!|j-2^i-3 I9:-5N-5N (-7o5^!-77e "-8aJ -8aJ?-8aJ -8*<@ c-9 UL[ -:|yY`u-:|yY`u]-:ԞC4 -:y|# l -:-;6#y -=E--=OG{-=l=W->=-a ->Ňm-?|DD-@eu]-@eu-@eu-Bfip'j-C=\ل]-C -Ej D-EW -F%fA9 -F-h-HiA[!}-HiA[! -HiA[!P-I3"cRm-Idq[9-L& =?-L;5]@-LD -LyK-L߾Q-M`XY-M-MR-N._ K0-N._ -N._ -NcA -Nd?)-O>!Kv-Q=׉=1-R, a-SvѷD-Svѷ$-Svѷ-Svѷ-Svѷ -T:6P -TuU -T{[-U; -UI|f-V}?Nʌ-WO -WO-X'Z/ a -X'Z/t-XOrI -Xn = -Xn -Xk}l (-Xk}l .-YYp -Y)tTO" .-Yk-ZQ2,q-[%F#-\QTg s-\S) -\)[#-] S 6-]! -]!-]GX -^k-^XWF -_"(D-aY &;pe -a~g-a/o-c?U{*-egN-eFt -eFk-fp=-f]% -f]%s-f܊v-g --hYːC -iB nt-iĬ -j5 -ju-j׺2a L%-j׺2a Y-j׺2a Q-j׺2a S-k :-kM}:"-kJeZ.-lpYL-n]՜-n]՜-oH. -p[l` -p6 -sc -t4%  -vk! -v) -wVZ"gY-w;-w;-xpl\sL-xpl\sLN-x ;-zѯ -zl?M>]d-zCQ -{f g-{OZ!t-{ꏏ` |-|E_@qO-}SN-~F: z -Ϫeɢi -`mtr3-L3B-L3B-Idc| -Idc -`rJj -Q D-1: -1:-"/2-̉`U-Bۯ 3 -uX -q|-Mz3d-{|qjE-A;k-u -u -<_SU-*ևQ-GJ = -3] -3]s- \-`#gYK-`#gY-`#gY -ሮ6 --e (-e -/-.^j -M1 -b ] -l' -L-\FX%\-Juf4-(֟ -2PR-( b-w9+ -ۋ0 -)3Y#-5JB| 2-5JB| s-<{Y-OM -V\w5}#Y-5c} -0ɘ-+pV - <-- Q -bʢD-^Ӝ+ e-ҥ-v9ws-*xZ n-xY $ --N --%7-%-[bx@-B/` l-qFhP -F7 -F7?-F7 -F7 -YK6-G_9 --[ Z -ca1Z->ik -:m]L-X( -M-2(*v7-œ\ -Bf^j-@-ƭl:K-(7v-@--~`09P-耚D/Q-ʂ0Y -M9Y-iϙ0K-'Υ-'Υ-O[ (- N-#z9-#z9K-Q _"-Q0-֤?W -6z-}l- ,- xqm-GcN-ؕi  .-vnKk%-vnKk?-ڒ F? -ڪ*OV-ۡV -ϊܻ7M -(-- -UX"@]-ާlA -޳y3 -޳y3-D$-˄tI -$2W[->1$W$ -N$?-N$ -d=x-.& Ev--z>06 - # - # -Lpq -کq-罴0M-$[H۵-}B[D -šR -\!4S-\!4SU-zHCG-]Y - UG- U;- UK-eՍ -'LS -[ r -"X~S-Jv -. I -]pS-owLt-6c-?b D -xs6*o -!OFr -[YQL-[YQLQ-ʾZQ-ʾZC-ʾZ -ʾZ.G@.G (.G?.ֳ \ .ɅK.#k .$c.$c.vGot.vGot =.Tt.K6L&.lTP>.oH)._.i!_W[. e܇. CN. ) . J((\.ƯI .f\L_ .f\L_.qɋ .q׳".S0.S0.S0.S0S .S0.\I {. R . s. >o .I #./憌Pv.:T/.";.v,? (. .I! . )|d.=bQ.uw .uw e.uw .uw .VΗj.=Rt.[K Y. ?.".os.#@-~.'/ԕ1@k $.(F,j.)q6t.) {=.) {=.*|,!w8.*`ﭿ1L./ȩj ".1pN .17sܞR .2mC^.3g p ,.7y%m.8;ngj .:BNc5?.;aL .& #.PVU .P.Q.Q#'wiR.Q`LhoK/.STʽ.TDO c.Uךv=:.VOZ/!.VcwR.V`j .W1\^?.W/ (.X+} _.ZAl V_ .Z8 *V $ .]/.^~%._I 8._S4 .`FB2.aNϲG% .aڽ.aڽ.a۪.b1۸ .b1N.ch%*7.c^^ .d^A30G.fg*x.fYX.fؾHEL .g; , .gEgY.g= .it .i7A}.it].j!38a.l}.l}.m#N.n!w3U .oH(4.o"O.o"O.o~&R .pD3F.pyMR.pոx?.pJ[ .qB-pH ,.q(Z;.r-.sKx .t{L᾽ .t\ .t\ .w¼$.w .y|C .y1-U$.yJPo.y,f>.z$ 2X 3.z}ϮR .{< v.{!T.{b @+.{b @+.{b @+.{ʋ.|8 ^.| .|O; .}/+.}/+.}/+ i .~zqh .~ }.J.'K.t \.FF .Mq j. i?.Hf.f"Y.f"Y$.di; .qj9R.qj9!.C@ |.DW T.f.bQd.(剷ͱR.(剷ͱ.2^#f-.}ypqC.AMҝ[.%?.d!Q.}}Vgr.}}Vgr.H .H.ĭC2mK.ĭC2mR.5]F ;.8^ c.2 .<:'d.EnJ. I m.HaI .|Ѹâ.a.@w].N!2.1, S.H.Kˀ.:X(.I#I:X.| ּ \.Ic R .§3f.x 3.l<| .QY.fe1./EoS.@콾iQ._RۄD.e4.K" .WD.یC^y.K<$+.t].t.t.tS.7 #.C Y2. .$_'. b*x . b*x.4_VU%.νq a.@.G,s.6U.C6U.v. .Ed.qG^! $.(.>#'.l5. s .z$&b0.--.bNk.VW9.4lL.`j:.`j.I .8I .~k.M H .c& Ė .ż2? .ȁh&N.c"k!K.0.u .xY.@t.o XS.͆c\]jA .͔hٗP.͔hٗd<.͔hٗ&.͔hٗK .o ^ .S>5l9 (.AQK?.ZQ .26Sygn.Ę .ՄtqS.;>W.חH w.lm݅) \.I[ 2.+ńˌ.xwq.ژ[ .ژ[ .68[P .DM .uS=` .Ϝ~.޽0xd.׸ML. .2Z.u%Q .J .hgxe .GENV.RbwZ .ʪjt.lbm.ģ?...Bc+.d\}`a .70 .MDR<.r .> .; . Q}.h >@ ."-q"w.0j{ .O{ #.b&Sa:.tg .xJid.,.~wĤ .~wĤD.Ё*l?.Dr.Kg}6s.u :WQ/sE//| ߒ/ we /(Q</e l/mMQ= /5s/I.ة(j / r<@j/ r<@?/ g/ 񻅢t / 7K/ /v]/ eOPSL/3NL/O֌ /+w /$LNR/1f _ / _Y/42~0/42~'/42~/42~S/?@ i/,c/-^6߯z#/-Ban/.<(H //հ /16"ws$/1"s/ /2 \V'/2 \V'!/2e޽.f /2]ʷ/2(ǻɑC/3C:Ze/4 ߸?/4>o0//5 /7b1/7e\ 1/<- />n,ȲS/?mCk/?5S"o?/@2b /@Jѝ\R@/C?Jg r2/C? d ,/Cctj/Det/DWg\ /ES2!JC/E 9 j /E ?/F.i| /F.i /F^3s/I(K/>+Z \/I8 /Kq &/L?՞X4 /L 0/L /NaR0/PPZ Q/PPZ /PPZ /Qlg10< /Q˔}=Uk/SJ/T/ULcRH #/ULcRHk/V/eɪ[ /V/eɪ /WX2px /X>5[/XWgL/^LnJ /_@OAZ/_Ee'c c/_+[</`dP R/`dP /` /a/bvN * /c-"9/f7_M|/gAq s /iT /jaS5/jkgosN/l1k/l/lDנm1-/mԉM×/nv~ /o|gW/p4ʔC/qX,/qr&[6/r=/r/r /r$s X/r':ye[/sC[  /s)ʼn. #/t~iϭ/uSաif /u%N/uj/vVa k/vVa/vVa . /w9٣ /w1W/x/IhTd/x3P/x3P/xK1k /yόN\/zKхb/{,# k/|E y/~0inn/ Q/01v/!j j/`Y3u /rN/x)-/EdsgZj/A# /A# 6/A#t/H}3/H}3/H}3k/H}3/ZtI|/!\:/!vu/hB,/~9/V.E[/QGt /QG (/QG//'/H`ju$ /3fq/O0/Cm`l/iAt/j  /#R/ /sN /Hc-/+]<? /1-v/nI4$ /R| /R|? /{mcAnS/u C^ [/  /;z^h/P]C \/Xֺ/{  (/}R˅( /Iy/ ozD # /oiv+/۰"/k/J:< /<yC/ U9 /*K /CI?/7;8Ť (/7;8Ť?/7;8Ť /xE}t/xE}/2mO/'ţ /'ţ/G I/X4j/܌9Wd/sz/͓d /Ei&O /W'k/,GI{ $ /z U /|My/u届v /zK(- /W?w /ٶ9*/ٶ9 /j/N٭v/Sϯ/Fl /r1* c/"7K?/%l /cυY/O!/eeS(C/ĬX/Z/2]/+L%\[ (/eAj/;=]? /]SvN/]SvNj/]SvN /˅BQh /˅BQ /4r/= /΂±f/΢եO?/lYe /7cK/= Y/'/'/'@sN /.[s|e/[xT/ҚtfS/Қtfe/Қtf/Һ{u< i /ҼA (/ҼA?/ҼA /+s0S/E"[/{E\ZR/Њtt %/2 % /שO^v /V/"%aG (/"%aG|/؎ a /W/̧?//ۥHA"/ۥHA" /|oD/UYv/#`S/#`L/#`V/TFkSx/TFkV/TFkI/TFk /TFk /TFkZ/ uv]/:5/:5 /:5 (/:5 /፮6,/\, /@m5 ///)'AG[/@b/uO/=s /x' /f/fN/T)/WxtwD /9L/`X1 />$/d/P?(/(hW /E/bi /zTu/71?/3k/ǎK /ϸke d/F /3 e/f4'/f4'/2% h/O /l 2/2j/2j? /QB0B0Bk0`S 0j0sF0gj03 ;?03 ; 0_m 0K9QD$0ǚ*+d0o0#s_yR0 PwoU0 >v(0 fYwB 0?bѻBm0?0@0:wR0A+4wm0Aky2J30Aky2J3 0Aky2J3P0Aky2J3D0Ci;R 0F7[!0FsbkfQ 0Gw}Z 0I}0Iv0JQ#0L0shhR0MZ"ku[0MZ"ku[0M32 $0N6t9ݸ ,!0Nf)o0Nf)oL0N{.{0N{.{<0N{.{0O>}X0O>@}S0O>@}L 0O>@}Q0O-L<C0PNkk^N0QET.S0RO 0RO 0RWКZ0T ;Bͱ 0TVb^U0TVb^50TVb^0Tq]A"Z0W@lV0W]?0XEƣf0ZÍ!Q0]TBG90^r740_ȕ0aC\ j0a 2z0a"We_0acP 0cAj90dZU|0dZU0dP`~0d&#v0d0e]fY0eêas0gq &0g쭳 $ 0gv"v0hozR[0hD"py0hD"py0j e 0j?! 0j(XK 0my&DN0pk%*A 0s gS0s g( 0s(^e 0t볃O 0tN]s 0uh;d(0um 0v+z ,0{+C0{+CL0{EiX0|Hv0})V0}%<=0~>M0~>M 0~>M0K߉Y0`/j0wx0~p0Bo@@fV 0Bo@@fVt0Q rT0\s 05% #_0+ SaI 0\#"0%b_S 0S 0,L0Q=Q 0=v0U[ 0U[^0U[0q& 0'kY80K&$0 0t՞R0t՞R i0,҂' 3 0\ 8qL0240eҞ0eҞR0eҞK0E] 0Sv g0hO_%L 0gD m0Y{|0W'- 0/Y> +0y0ʹcRU0sO 0Frc (0*^f04 [ 0:7~t0Vw_0'{aW0n^0Gf0s0l# 0iUC<0gǾ0gǾ0LȾ$ .0?Q0&@k0/mF4 0eS#0 ˇ?B 0 ˇ?B0~m40mbF0o׃05PQ0Yw 0tK('20tK(' 0!m 0!mt00;I= 00;I=s0<2j.0'0;b0Ty%0kr][+ 08_^0 (0; 0]0#i| 00֚{}d0t0>(0>0>0>C030n[0Bvj0Š[Ko0=v0HvM (05CS05C 0ĥe,X0ĥe, 0ĥe,0ݛpk0ݛpkR00ݛpk0K 0>Jl0[|0Y޿"0ȬmSy#0*QT;K 0ɛY1 0ʐ[?&w0ʖ12 0˚ozxRt0ȉR~0:BjV0̪Z[0͏Ql0͏Q?0B~ٞ0p0ϑ?=(d0ϱҘyRR0ϱҘyR 0| 80Ѽhx0iq0ҾGZs0G$0G0\O 0_b10_b10_b1D0~ \0UR-u^ a0T%0?F5 0v* i0ٔiy<^0589 00{#w 0:3S 0:3L 0}YZH0SLꁛ|05sia 0;*} (0n0cLY 0z8Kn|0(WR0ߌ5d0S0q&m0q&mk0@\ 0@\%05b kR 0N>ww9/0N>ww9/0ᬨ v0EB?0ۤ,!0 '0 0=0.Z0M#N0}^*k0i|0xQ;ͭS0Y2 0kZ00ac'0lsܾ 0侥`; 0\=3 0\=3 0yd0,܌Q 0,܌Q i0ϝh!0+V94t 0KU!ԭ0ZL 0340oۇ04ȡ096Q 096 0h1& 0J j0#o 0zN0$z0$0ɔ f 1]R1%F 1%F1# + 1{Es1zO1!1! 1M%8^1SI, $1 1R6> s1 ug_t1 &d1 ޽h 1 aE , 1 /i'#Is1 /i'#I1zt16j391B| 1B|1sK ,1Nqv 1J41ʰj1h %sO1vAd| S1s`S1B %1kYx! 1 ^. 1W 5z.1Ľ2nI 1$Z?1%O 1%E1%EL1&_~;G1'kib1(2G6L91(k81(OV$31*D;( s1+\|`81+\|`8L1.`XuR1/glk 123 13[e2N14" 14X0N14$R15hdG{16tT 18$W0)19#=E~P19#=E~R19iqL1:Q`.,C1:(-?v1H"gx0b1> n1?N }ǕZ1A%T ۃ $1BzbhQyK 1BzbhQyK1C7dW8 +1CvzIT1C[yON1Dz[1E~ ]1EKS1EKS1F@rN1F$U7[1GL@'f?1G{ 1G91HE1H"31KL3$1L&@~1LH41M֓1M\ 1N=mR.O1OA /~ 1P& ?y1P& ?;1P& ?1P0_[ 1Qqq>%1U.?y a1Uei1U_9#d1X oN1Zܣn1Zܣn1[md Z 1[0_(1\{f7 e 1]lĭ0 1^~{a 1^ca1^caU 1_w1_``Jch1`m-1`m- 1a=T #1a{h (1bz4 1bz4R 1b 2O1cv~ 1c$qdX1d܍"j1dk ]v1e} ʪ !1g1h7t1gޭ2C1hRzZ1ijE?1np;1oZL,'1q k1sɜA!j# 1tc:QO#1tK1wGV 1xuD1xԽm1}+! 1~"`-1~F 1~L1_2=?'1}1=t~1MME16X:$ &1r89ug8J1go;Z1bZ 1>r1nF 1eR16Œ3R 1I? 1@+1*> 1*>$ 1{↽R1k a11 Q1,C1IJc1B1B14, 1ǚU?1y6 11rܵ]1 u:19? 12f1 I/J]1 I/J|1 I/J 1U 1vm\$1F Vt;1F V 1 717v}1_r (1X<1R"40U 1y a1,K$1.c1"s 1Fu1( 1i;R1sXc1ט?1-?X % 1j]Q1lmn 1͞71,mIq 17E 1ew (1ew 1ew 1~]& 1*){1?~1?~1?~1lq1uS41KpT1WY[S 1at,sy1at,1!XWx< 1a½h161(2_ 1EyI j 1p*1p$\1qw(1_)H's1wJQ+MR1)z 3 1$Cն?1h&x j1,1C8ꎖ N#1C8ꎖ 1UnՌ 1!1Ĉ͚N 1B[RF1B[ 1: vw12>u2TK512>u2TK12>u2TK 1ɫ,1Vndm| a1ʠ ?L1ʠ 1˂ M1C 1̃55qt1fc?1^GQ1R鎜bZ1ЎVnQ1ЎVn1b 1fuS1҅zk1 1c?ER1H  11#c1JZԯs1j^$1)k>gD1Iyc 1٥"v -1KcR1KcS1-' 1ބHa !1,iVS?1OHo1Np1rr]U"s1/V[-1㫩ͅS1v Y( 1pN1 VI ~1Ayo 1+H{1as1'䅨' +1 j 1 1z->? 1&7 # 1Ru%% 1E`  16yC1Pl:7 n 1Pl:7:1&~4 1Wv5h 1#^)1o ,1l1ls1Cu-IL|1$C^ 1vY 1Y?1,ԉ b 1YSo+1Y2CndR2>3B2gmL2(G w 2LV[2з}^ $ 2Nh2 /llpY 2 /llpY2 v7k 2uGyDR 2s T2|/3ej2'rϱ s 2e^2k2m2_r 220{ 2Uс 2Uс2MizO2`j2f% 2"X 2hAc 2=zޑ (2=zޑ 2 E2 li2#$Df c2#ƈdx i2$&{JC 2$&{J 2$&{JQ2$&{J2'8 2'*5V2'*5T2'*562'*52(bSc 2('~L2)raT2*srv2*srva2+ " 2+ "2,_I 2,IY32- b 2-#2-#K,2-#2-#2-#Q20gdZ.;21&WNe 21F,zLe 22D(Τ24jRv24=e24!0I 25EDq 25Dm{26(\28H~29 =D29 =D295Kf 29jGa82;`,߼I2 2eP9> 2eVI 2fG 2i Z2j1|2j/R2j1eN)2kjPl2kqVE 2l}xt h2lU[2n22nlH~S2nД$2na ?2o2qQv2r89l52r0m(Y2t4; &2w 2x7:t2yl 2zǍ2zo2|a2N2|j2| .2ilDy2ilDy28+Zq2Ne 2uO 2w"& 2kz 2ѐ;2NNeR2S\42T}uL2j28 2 P22ZUt2ZU21LR0f2^fgw 2})X2}) 2}) 2})D2})J25w 2- 2@z2(`k 2%j~!2%j~K2l3C28s22,nj2iH 20G":2i_ \2'l2BY;}2@|w *2a /d2N7 2}%Ka2čok 2y3Ck2y3Ck?2š|lfN2żGg 2?Kq.?92Lp9]j2Lp9] (2Lp9] 2U#W"]2slD# 2I . 2(F 2<{"2HM$N2R$2XVf2ΧG_ "2sͮ 22ϯOp z2ϯOpX2ź2 2F[x2\/ĝ2ܹ @~$2L@v 2Bx{2.np 2ܯՓ($2Mpd2Mpd 2q 7\22N 2! 8dQ2#cU4 $2#cU4 2#cU4s2FQ#Z2Ps'2-s;}Vj2ᇧS2ᇧSZ:2ᇧS2ᇧSU2ᇧS2lc`L2lc`2^2S2l2oi2%+[t72Whst 2>N 2_L2_3Dc2_3D a'2_3D 2v7/2v22y="K/N 2^e[>2Bpd$2Bpd$D2ףV2ףV25Ijj'25Ijj%29b{ 2Z3!2Z3 2"6~2lm D27'2 )&( 2T$.!AL2T$.!A2WEA8m 2ZH'&n2|:|o&2?022ȔO=52+| H2V1u2D2a:ub212Li2UxnI2:4"2(M?2^V]2 2*"3UJ z 3υcЉs3uhxob3Yɷ3T=x3gzs  3Ww֒ 3`a"43QMK3_s|3'D$3'DC3ڠ˚K \3^*3e\ 3e\)3e\ 3e\U3e\3e\D3 gS+y i3 op3 xe!U3 kme 3ʰ`3욡/3"Hft3=˺;3=˺;3'H3b-@?3r .=3/!Y 3sVEoB3o~< 3w3w3 Jm23rPX 3m3!_R3!_}v3"Z$ 3>Z$ 3>8!t3?| 3@YZ3@YZj3AQ 3AQ3A\+ŦQ3A\+Ŧ3Aj׸R|3A3C0,(!3C=Su 3CtfL3ELG*ٵ3EvZ*$ 3G&?c 3GfKe3GD_3Hc\)Z 3I\5'i5 23I\5'i5 3ISҸP3J448Dh3Moj3PK=:?3PZ4+$3P>r3Q XR3Qm7h3T)Nw 3UUq3U"kz^ !3V c"fm3V,>3Vf'P*'# 3Vf'P*'# 3Vt% 3W*2&:\?3Y5R 3YJ:HU]3Y 3Z? ,3[, *$ *3[(Bs $3[* 3\~3\%vV]3\%vOM3]1ۯ g 3_/`2[.3`@? 3dՐpD 3e1@3e=3e\"3ey A 3e^x3eBmL 3eBm 3h \u _3j/!zj'3jΏ1` 3j 3j 3lI9@G 3pBZ 3pD3q 43q 43q4IN 3rN¥ 3rUMc3r4f 3ut3v@ +#3wY"! 3x  , 3x 3xm+v 3xm+j3xŒj2S3yO S3yh3y8l3z 3z3{f3{jX3|Q%3|Q 3|Fk?S3} 3~HE 3~iSmR3~ьyKB 3ת{30 (53f~63f~3B"B3fβR3 (3! 3!? 3! (3ĴUM3Ĵ 3Ĵ3Ĵ3rJN3rJN3̈́x?3Ip 3?3}wW3CE .3 4:e3"ҁ"Y 3"ҁ"C3> $3mn3v!)3v!3 Q903nd3L iY35V?3IG+3!EZ3h #3ibiR3I< UU3(]3(3#6j3k`ҷ3\ʯ3UƼ<3<* 30nק 3+*3! Bi 3Ie3IeR3w 3(9 .3!-+3CfL3CfS3Cv^366 4 3Q ̂ 3Q ̂S3}CVC3c_.Q3'Q 3δZ] $3A/=vL 3y e3yj3s&'2SH3Yo 3Yo3Yo3#|K3%ز 3XL3n3BY3 #30pAN3J(+T3J(+3h_w3:A"3S.3#3)dA 3)dA{ 3B63roc 3 3maou 3N3 l\6 3sr锳13xA}>3| 3G%j3H3K+?( 3K+?(3iGVR3u3S3{s R 3>a43*6!@3wFP03sJw 3B? 3B?3H9 3c05s 3$x\:3$x\t 3$x\3$x\ 3]7? 3jT)3x 3rƇtg9? 350S33|R3eL(3e$3e 3e3}WDb3dj 38 3\u 3ѫYȕH 3@1 3@1 3j W&3ҪF"e3ҪF"!3>} 3to+3z 3d/Y0$3iAR31 3X3ڣC4KM44KM44nݜ,4CI4Ol'4q?lF4&4Wqh 4ڮՔ4sz 4Fs 4DlC4>º4Y4h 5ea4~ 64Q%q? 4ZJ~4ZJ~]4ZJ~4~8t4N}46~\4[C -4[C 4S;I 74cǓ &4Չ 4e Y 4#Ì4#Ì4#Ì 4}~_ 4 >=ϼ!> n 4 G\ 4#w_ . 4$8b4&r=74&偨ɪ#4(;iI4(s{[ 4(ʙFqk$4(xRR*4)SR4*D+@4+ 4+ J 4,X{| 4,X{| m4.ÙB40d]; ^ 403$41x>. 42BĈ 42.,Yn46g2$47 LK_'47%m147%m147%m1a49+dl$493{L49 Ǖ !4:O:Lxs4:aGٻ 4;8E Y4;M_IT ,4;l~G4<)FR4<)F4>F 4>0wv'4>0wv 4@I`30 4@4 V4A-=v4B+f 4B7: .4BJ4B 4BE#O~4C9 4DVu 4EEAJC4Eya 4E@C]4F15s4F15 4F& 4F%% ^4Fhm#P 4G6! [4GJ)U 4H)4k 4I/7_ ; 4IX> 4J9G,*D4KFBC4L_ȑ#4O5&b@4P\!v#4Q94Qs 4RӫGz4Tcr%4TiÈf4T t@_4T t@_4Ucr4U]44 44 4u 4˂;/r43 4pG 4̕R (4Ο74k4;]~jL4Nĕ{s 4}BP c4Ѧ=J4ӎbٹNR$4ӎbٹN 4t 4t 4t 4t j4t 4t 4g8?4g+:4ؽQ4j *~J4ܲ GC4ܲ G4ݿ^n 4F8 + 4'liRD4'liS 4߉j)7s (4m. (4m.4m.j4m.4?4%~4%~L4NH| ^ 4NH| "4>)K4؝1N4zt_4n-14E퉨R4FadT a 4BJ}2a4Q񼱘d4:4-l[4}[J 4霭 4 S4 S4i]:4!8m$4˨՛x 4Wh s4 R46L)4M4ߟ;K48 48 4GUѱ4#,W 4LVW 45v< ,4\+}81R4mJS4mJ:45ȅ|4r']4Ѫ v c 4 40t e4+h6s442.r) 4w 4s 4] LTV4] LTVs4aO4aOR4ݲ',a 4ݲ',a4ݲ',a? 5<~pa-5<~pa5C h5"*5, VH 5, VH5GީP5Gީ>5Gީ5SA#5zR 5>"5@SS5V=5V=|5xu^5xu^ 5. Z@j5=h^,5=h^,S5=h^,#5=h^,5zxj5 Ds,5 ^Re3 $5 g0< 5 g0<?5 2>8m5 |z#D5 #44F35 U5 q;y 56 X 5q{wF 5|ڒܫv 5IGx5Iin;?5Yo$5fǥ[5'[5<%v 5<%vK5| l50<5r\5p^?5.ޤ5\e| 5ޠ] 52٤x 5oƒ 54Wzy 5~95<߽? 5 n{OL5!)CCe5"S&Xl (5"^9ڃ 5"P7ӎb5#p 5%Blx?5%#8|C5%#8 5&`aY+j 5'F#j5( @5)h  5)aN)5)aN)5)py:5)(c5)(cs5* a5+i?|5+I.\ 5+5,Z5ɋT5,Z5ɋe 5-1d?+e 5-s;h 5.A{9|o;v5.ex95.I,j5.s , 5.s51S: S 51S: Z51wܥ53Dzc 53siU54B[ 56^Zyt579%58,E?58ޒa590vz?59׮U; - 59伧 v5:G5=FPr L5>, 5>, $ 5>, 5>v;5?j 5BG5Cl|M t5DW=L5D.D<5D. 5D.5E^oj5E&5F!(y5Fh^X:5G]?5Gr5Gd5IPP|5Jcqd5J.b s5JtS5KCR"05L~T , 5NIW$C5NIW$Y5Oo:pT5Oo:pT5Oo:pT5PL0G5PՒ g5PՒ ^5R&d;5R&d;k5SR0s5T-p^5T-2fA5Tr}.%5Tr}.%5U7xd5U9ű/ 5Vd5\? h5]"%UOH5]"%UO$5]OUؠ 5] 5^{8B5^qK5_;ia:5` dE)5b< 5c7!uD5e,_vq m5h 5iXG5k S5|5k1s1 5kh9  5kh9 5lt?5lGz/ 5n0{C5p|} _ 5s+3q[h?5sp5uA"!5vnx J5wsso-%5wsso-5xDR 5xDR5y> 5y\A6X5{~÷|^ $5}@{n5}@{n5~&[}s55Ov59's59' 5V5V5E-: *57X -5( 5n58 5b.Ȭj5Aq5= 5c C5E5Lns 5Ln w5k2?5=5c5ZM 5zx&H 5~?L#5Ԩ+!5Ԩ+$5g $ 5@WM ib5@WMj@5@WM?5@WM!5@WMs59K5͆? 5ݔ1 a5a&8LK5ts* m5ts* 57 57565/ 5sNOK ,5sNOK5sNOK (5sNOK5zsj5Lh5X9ٻ 512εL5=~ 5|5 5pIWR5;9 5-𓴉 5/0i?5Sm.5!F5vjc3 5496j5Lx5L5ΞZ5a Z5tS o6X 5nպs5y5ޞVC 5s.5~?/5= a5M25 qF>5 qF 55  5b0]8 5iSvk5EvQK 5r w?5 5$ 5t;5V[d 5SX(L5vͯM5RC5aJ ( 5rf5"Sk5T/{]5uК  5HDg5ew'1U#5`'`85k5vњ? 5'b  5'bD5û?_& 5͗#5ŷ-_s 5ŷ-_5.W $ 5.W ,5.W5f| 5 +8j5 +85yU&5ȹ5]H8eN5k5Z 5c{EIh 5geZ 5ltho5Y!5Y!5[<+mv5̹ޑf5Q-Bc5Q-Bc5Q-Bc 5;ZL50׼S50׼5xZُ?55ׁ 5ٯ\ 5;Q@N)5;Q@N 5;Q@NS 5LQˡ 55!Xi 5ޕ򌈌5L7\:[5-qlq5-ql+5-ql5:-V5"PR55:5z"~5"ce75݋͜5ğHy 5b  5b 5ߦ5) - 5ߧC֐! 3$5ߧC֐!51Z 5_d^B85o 5$j!ޯ5$j!ޯe5Χ25" Te5fHD5 ykG5vvm h5¦ 5¦ 5¦Y 5%"d55 X~ : 5 X~5hG\P a5ԍ 6B&6{Qҳ) $6{Qҳ)966xrؕY 6$6n #) 60@8*6r6 6 6 61slZ6YM k6YM  6YM 6:$_?6IX6 S=K8 6 x)eX 6 K``#)6 Q6&(]s 6)$=c(] 6*RG6*ܖaλ c6*Ϯ?6,-76,-76-\K5z 6/wc, 6/7T#6/7T#K61 l5.v61GN62'#})f639Dw# 64%f / 64+O?ez 64(65{m:OV66>67"167J67Ӯv68e8e 6;vY#Mo6qsx # 6>6>H6?Q #6?Q c6@NB6AŘ w]6C;D6C;6D?o4 6D$y{W6E˜Y6F俤k 6G; '/ 6Gf| l6H.UO-6H.UO-% 6H̯mN@[ 6ITj6K`p6LR|6Lͫ~6M~5:  6Mj6Mgj $6M0- 6M0- 6M;<6M]iW6NV7 a56NV76Osf;B6Q^Ȋh6QpzM6QZse4tv6Q0pL 6QP/K 6T2=j6Tyz?6U5 ~ V 6U3 "e6WKGQ6Yk~l6]b6]bD6] CJ6^7s6_V*~)6`SvL 6`## 6`V $6b* 6c9(Z 6dru 6eP \Q6eP a6k>Xy>Q6n:$6n:$D6ohZ}< 6p0K 6qM#6rgI6wwsZK 6xIR"}h&6xIR"}h 6y n?6z9sa6{<Ȥ6| 6| o@6} &.J 6~\B5 6~d 6C 6Lb ^3N6&p,6&pd"61T?6_/7Z6_/7 6_/7 6_/7K6^ձu6@o{6R $06f  e6ԣ` 65x:?6O1f 6-`V ,6 j6WS@S{86d+of6_`06_`N6_`6B`_6<= 6Z YtQ6AYs6l@Q6>6;xVS6]196(Z6o2:) 6"3ar j6-?> 6q?69 69 S6/3 $6/3 6/3 e6 ``x' 60A3N $6:0P6:0D6!]h$6]$nv6( 6t<6+s 6C> 6Ys6 8Ԙ (626 6m9| 6m9s6~36~~\R6"u.6L;% ?6oTi6oTi6  6 e61z6wFt 6 P ]6i6" 6BQ`;Q6qHgj}6ЧWj #6ʭM"S6] 6HkY6pnHr 6 6 XIK 6Snj6Sn6Z76+=R6[6kj6t?:-[?6*_6 rcV 6g66 o86 o86j%# 67.I 6u6!o6km 6km 6P1U k6P1UP6P1U64[CX64[CX6bP6bP 6bP6l^?6 H@d6[ā K6x޵6÷(z6÷(zD6;]|6 KcJs6 KcJ6sM6ȕ8[6LoZR6̀ٺY{6̀ٺY+6͋k&6S>I) 6SOs6О>Nz`6ߞ͈32 6ߞ͈32686+R6˩&mM 6K"yP26;,O 6xW*6| ^6ks_k6ۚ gRS6ۚ gRJ6ۚ gR i6ݳRf 6KshՆY6n,Jv6^TN6co 68| 65Bhf6U|P66tT]U 60M' 6oD[" 6oD[" e6;QC c6B-^PQ6ꦏo6dț6@0K 6Z: 7 R 7 $] \7 jU7 }|7 L\(9 7I=2s79o7LUs( 7ᄼ5F7`"IC7VL?l]7?ü (7qQ + 7 7N a7 (yf7 (yf7% " 7tO' 7D$\57d}jN7ܚE 70pM]j7>:,{7A c707 _ qu7D IN'd 7Dx7E9m 7E9m7G u ,7G u 7HMB!7H%At7I&aN: 7I A7I A7I AR7I AK7IY[}7L7M:: Y 7Q(g>7Uu+%7U ҟ7V"#E/7VU.7W>-7X 7Yc-7[h:7^єIx 7cBG'ǵS7e2Ws 7e2Ws7fP-7f&UA 7h _ kS7h‹V6N7l)@#7n{7rx̯Am7s: 7tfys7ta6 ,7ta6j7ta6 7t-Wf? 7wHY 7wYE3 7x`<?7x&xZu7x&xZuT7x&xZu 7xʦYK7xʦ,7xʦ 7{ ]7F 7~]*7t7~]*7t7~]*7t7~]*7t7~]*7tU7~]*7t]7~]*7t7~]*7tL7~iS9h 7s,8+P j7?bDI7J[ 7GN 7J&? 7YZ.Q7,Ck7^87^7+tX70# l7{L][ gI7G6j 7Pu%+7 7bʾ& 7c7冚 7zui??K7y 79؎b 7,*7Hms7z:)7lCiML7(D/#7(D/#7#5R7udͯH:7R7cG7c 7Z8y7a.:k<7a.:7y,J 7BC7g}:7Qzjj7. 7Ֆ ,7 !t 7go7g,7g7gR 7gA?tR76 a7k9+/) 7z 7^Օ7O17m7:ok7$D/d 7)1?7d|1d c7opi)7tK;7t 7lF,7~S]uR7te-R7E,47fpX 7Wy%K 7Wy%7$秜 78D 7;ڰ ڜ 7ozT 7||t 7j 7j (7jj7jt7jY7p7p7\oh 7cs 7cs ^7XT K7줱; Z7C4oM 7DD-Mk7Tj746 &7ZK  l7}>? 7A0t7` 7` 77JyE iL7JyE (D7JyE e#7JyEs 7!^` Lv7ioƪ 7x7>Or 7>Or 7!B47Q>EGx 7p..wN7> 7kT&7kT&7kT&7kT&7h~w7_T ( 7_T;7Pz7ΕM0 7);֎ 7>j7ф[7ԆGs7ԽgӥL7%14 7-ǃ 7tD7[R87:aJ *7:aJ 7:aJ 7Dbl7إHUu#8>K'id8?N8A|# i 8DeA=#8Hm^T 8IGltU $8JIjR8LR1$ 8MʒFDt8Nkase8Nka 8O,3Gm8Oo4k8Qj8Q8cVa8 گL8nəS8o1 $8wg 8/ 8FrյR8FrյK8d! 8ڋt 8 ԒclD?8/' 8q Sa l88oK 88o88oQ8I! 8I!R8#o8T[b8$3 8$3 i88тz0b8тz0b8L8x: 8eG 8f٘8!;2:(P8Au':%8L,- 8*w S8c5]4H8}78͙W6 ,8ۄL 8D̓n:8/g s8g;;B8p9T8 6? t8{ZK 8pm\ 8P 8"؄R8fS#8yE $8#,;qR8>^;861Q8NY^8W(ox 8p 8IǬ[8tR8c828;u 8C88dă8&#!z8@ 8m m 8U]e 8JhH -8'3EHMR8)2 j8 W8EI8b?A c8Ɓ?Xɡ \8ƬH0c 82~$t8%HhI8%HhI8'? 8U?y%|9 8خI58gY 8h?(A 8ζ@88ζ@88ζ@8d8ζ@88VFr. 8v93 8q8/aS8ўj8x!8dgn8k"Z 8ڮ54̎8?} 8?} 8a׿kj8yo ,8bxa8ކI\h ,8i)~8stfZR 8x0͡n8x0͡8`2tc8NbR 8]U!/84<ϛ8X֪҆[I8n]8F-78SSR8篫eo: [ 8v8vj8v?8/_N 8{=8{= 8쎾tR8씲278[{9 b 9@ŀ9redc'?9 f]e9 [9 ð짃 9!fR , 9"4. 9#Z\XN9#YcJp9%cr[2r989%cr[2r99&C354 \9&"i?9(`F[MK9+ NY9+w 9+w9,?k +9,qw g9,qw _9,qw 9,fj 9-)?9-3 #9. yC9. yC 9. yC9/[lRf90r394'j" -94K95$QA $95$QA (96Os i97FWis98M986@ 98f99wG, ,9:? &9=P1'9=S{9>hZy 9?ЯH 9Ai.9AudR 9B05j9BwD c9B! x9B! x9CǐHR 9CǐHR 9C UD9Dȵg$ 9EH R 9EKS1 9b% 9cqME_ 9dR(9dF9g&[y 9g;ɾ8R9g;ɾ8 9h*et9i9xR9l`^(:9l`^(c 9l`^( 9m.X(9mꬴ 9mgD 9n[n 9nQKG29nQKG;9o9DV 9o:~99o?=^K 9oRJ9qa*? 9rPZ9sES?9smx 9t0>9t,mw o9t,mw o9t,mw o9tAKNx 9ux)9v$S9(9v_^/N9vԜ| 9wj^Oԅ 9w#v*9y0ԫY 9y0ԫYR9{3j$j9{K a9}k28 ,9~EQez.9~gPì<$9%  90Tn9 9dz(c49Y°I, 9"~ ]92HU39Pn9X񈙐' #9$ޣr9+w{95J9*9*9&V؁P9.l{?9#o79yN-j 9W=fN9_EG9 F z-9pp,' 9$B 9$BK 9\A@ 9L& 49L& 9Jx 9*poZ9*poU9*po 9*po]9+L&pQ9+L&p=9+L&p'9+L&pd9Th11.9^ρ.WL9KNB-9KNB-9KNB-9%qb: 9;[9|=Z!9Z 9Z ,99N|[9FP`:9hff 9$I 9ɽv 9/Վj93K9<~jc 9n.' i9H9b'T"9 IS91'91'9g÷9}] p9W  a 9^W>9^W>9]lW9]lDN9]l9]lQ9܏n 9R -)ڙj 9R -)ڙ95v 9 9qP> 9qP>94Q9 93=;2R 9}rml:j9 2(9[w[9Aj9At9Td9ӂ< 9{v9r)9Y!t9+4j 9+49+49A/~w 9A/~w? 9I89`j 9`j9Uq91aG\d 91aG\9`PH \s9`PH \9鲚H9鲚H9/Kj9/Kj9/Kj9灡0N9W[99%\v 9%\v 9:#Im +9A69A6B9s 9&#+ (9Ks}ʶ ,9D)F9-$} 92ێ92ێ9b 9+'"9"o:Q9´oO9´oO 9ä(J2k9Ċ\t9@' 9 +9b/qq 9fU%_9mQݴ 9ȵq[Fa9_b&5T t9ʟnpC9!hqAu9('9('N9tLU9&a|k #9 ^|9ͭ'_19ϝ>;19 18k9 DQlk9 DQl 9 DQlb9 D 9҆x޿6 $9҆x޿6j9Zv N9Ӌ`u s"9Ӌ`u? 9ԧev{ 9Ffaf9G 9G 19$ lT9X=_Z9X=_Z9b֌[ 9<8#9ڀՈ.-9ڀՈ.R*9ŇR9S P9ݸN/9gۗ7S 9Id$S 9Id$S b9_ 95|Ɇ9B 39LZ+9ozCN (9SJ9e6% 9 7az 9甃J$9p94T c9MG593hU90 )89ʺQ j 9ʺQ *9+s9\^Z99\^Z9roP0 9Id] 9C 9eEU97.rv9YG"9X 92F=?9KdtL9^@[z#x 9-چC9cSK`9t89 (/9 "9Y 9wp X9j 9t4d9B8q ,9'S"9/ 989?n!9Y| 9uL9Iӷ9sSփZ%9|k7j:Xi(D$:l e:̒dR:A98:Q; : j:_`:o3:o3:oj { j:2G:t%R: :8/L: I) :P ]:P l: A : 26Y.: 26: p;)R: p : XcP : ZD: Z: 0^: JX;t:} b.K:϶%::U(:ڇі ,:e/U :ƀ :;Ի:  -:X44@ :X44@:Ĝ :]tY :4^^> :jO?V:J":w0t:^Yh3:z~@( :sw l: M :S :#aS6\ :$T4:)q  :)q :+w噚?b :+HeD[:,!S:,;;)j:00%b^:1~! :1~!:1~! :3$:4`K:4` :4ՙ:5KcW\:5KcW \:5 f :5CJ|R:5:62h ,:9 g:9::)R c::ۄ8:;9apA]:;S? :;S:<˖#K :<J :=T>| e:=ms9:>N :><:><:><R:?fz ^:@T>8 :A}ʪE:A J $:A(84 :A=-:BUګR:C3. a:Dˏj:DpOi:EQ?VP0:E4?:Fk({G i:Fk({G \:Fk({Gs&:Fk({G :G[B :Gucmh:Gڱ} m:H?Rb :H:HDÖ,:J-Z*)Q[:OM g:OaIV=:Olމ}jI:PWߙ:PsI:Q_0 (>:Qa.3[ :Q=:h ^:RFlM $:So/:TJbf:TJbf:TJbf:V!Fp{ e :YJ :Y5}ԟ:Z8K}^:ZGG%:[SBӧ.:[Y:[zFz1 :[Zc @:^~:_q:FY#:_q:FY:`~^_9:h*k:-:h MH:h1iK:i]#XK :l 2 F:ll71":m#iR:mu`_T:pu, :tDnF:u3:f:u^ :uaZs:vo3yO (:w/̣iN:wQ&VL:y':ze5| P:ze5|L :ze5|] :ze5|U:z!j& :{Ln~PS :_g!I:_g!a*:Vjg :fhk:fh ib:fh ::,6i:.:l/ l:s:kŞD( \:$-AgK:ou (:Ca):Ca:ӟ5 ( :ӟ5:P :{Zt- \:\TD:w:C :Iw|:^Sr=:kowYb:Z(b`? :soGx:,[:: :ӢU-5b :: :c$0H:a# # \:R[ n :w1}: 454 \:&C :(Q:S]:ь8:p:j[:<2:t"$ :1C \:D7 :8%:ݜ=9::[:X=c :fDwv :9W^p c:}BK:D:p :ޭTT:ji :`.VDR:`.VD:?& :#$Q6?:i:T' :IL4j:L,A :TuF-:TuF :W63U: d%:Wlt:t:9c:0 ,9:0:0 :"Ԟ4 :_PYl:DVS:_{ӇR :O ,:T> C#?:U :u:‚W8 :K .R:O  :RmN:ēaa:1n:S-:z6%Fs :\q1!gQU:\q1!g:F :^^c :fG-K3c ,:fG-K3c :i8N:˅Wl $:ˠb :R^O:R^O$ :Τ?:3ಆ :Ѡ}_j:Ұ(#ct:4]'/:ԟ} :֦*^ :'yK# :~HZ :c:Ksa :j:,5ȢR :,5Ȣ :gN| :߰)\N :aT  :D:rk:?A:DӼ:EZ:®Z :息=9:8(:8:5큉/:誝M D :@hi :k?$:k $:k :yg2:w:43 : W :& X:'&?:'& :iR :>6$$:>6$#:# ,:x\Z1C :RxϢ b:RxϢ.:RxϢ:£kfR: <~:DXF a:- ^:"3:lb :ck\T:9# :H񣜌 :w)Ps :@| i:VoEq|:OӚUq:h)YS:ss':ss$ :b1p:d4K:G;9;;0Y ;m(*;m(*;D!;v2;5PeD;;L x^ ;;L x^ ;ހ^;@;LF;;~dh ;2 a;u0[Iw;]x ;m6sU ;JS7;J%-j; 1:; B5); B5D; 2u(PR;  ; ;Sىy;{-i;"c;sU;e g;ᝳq ;aPW - ; 6; ;DžI&;ʛ\ ;/~ ;dAy ;-Hcj;%-; #kZ;xR ; ¿MY; ¿MYL;!vJd;!~ ;!!+ ^;!9I;"(Of1 ;"(Of1;#Uݍc;#q ( ;%ŽR> ;&QՖV;&'^k ;&U!;'I\ ;'W@; ;'B~N;(zht;) ;-6~O;.ޕPJ;.Iq ;1N͘;2l*:s;2l*:;3 ;4Y7WR ;4cpL;5N;6g ;6Q˖;8q@ ;:C3;:p};:f ;;lXǔH ;;lXǔH ,;;lXǔH ;;vX ;;m;/:[ ;@@f;AqyP;A~;B ˬ 9 ;B ˬ v ;Bf@$;F3v#;GmZ ;GI  ;Hf{K: ;I= m;JЧVC;KknI@ ;Kň q;M;$)uF2;M)/iFt;M)/iF a;ObU4 ^;ObU4;P HQ;Qc\;R ,;R ,;R ,K;SoL;Sң;T`;UW ;V>nG[;V>nG[;WwbuH $;WJ;t $0;Xc+|;X< ;YeW* ;Z)ٻňK;[B͖\ ;\VyN;] 1*Ki;^ACe ;^r0 j;_*Z ;_a)>Z ;_4 C ;_G:TL;aG- ;aM(f;bM4#UilL<;bdQEn ;b $;cu؀F;c#%TM_;c#%TMSV;c#%TM ;c#%TML;eJTHY;g,S;k6V , ;m.[>s;n$ݯr;oe c ;oU { l;q -;q -;q -;rdQpN;rDE()(R ;r4< ;r6av ;sj?;tT^jp;v)| ;vp"zsm;wFn[;wރJ*;z_]? ;z 5 ;}#0 ;} ;} j; ;DUB]Y;\}ǰ ;9 ;djY$8 ;~RgK; 9t;*};Pq ;Pq;rH;d. \;|1j;+>P ;Mr5dZ;gfk;.QRRj;7 m;; R;" j ;*0r9;7;VN;Y] K 0;L8*;^7 ;%+`~;=hPQ;=hP;@Su ;u)X;S ;<T;1 ,* ;;R]/i;h^;Xx ;3 ;TB&;TB:;I0F#6?;e<| ,;Q]1 ;Q]1;Q]1 e;(6 5;\K]B i; ڄ ; ڄ;Y%~;{s;S ;[g#ت ;04>"~;u}"\;X9# ;N|;y;[` ;[KPY;oJ ;*C! l;-sb ;?.t;};43;Ri[;nm;vkӸ~{;AYZ;s_H;s_H ;>I|;>I|;Ƿ,?;xr@lY;ɨP%h ;锾4;'? ;\; ;\; ;;h;ch5 \;zG#^K;eW6;= 1V;D7 c ;oR );ђ(g;R ;iYf ; [w";u>*;`V^`;փ< ;ײ{d,8;NZ ;طKl-;لξ}j;لξ} ;M  ;M ;M e;>;*F#7F # ; )H; )H;K h_ 3;ޡ1"!f;ە@;#,w ;ߐֱ* ;3 e;J;J ;Jd ;JP;yF=V ;{w\y=;笗 v c; :Ѣ;E'& ;?L !;Ո;]|{B;o`S;_"%M #;dn ;OIt;`eϟ ;Ckv7K?; bt;¼?t ;Z* ; A;xP", ;ɠ7) ;-i[ i; C;yC ;k|Q0?;N`;į5;į5;=ҧXr);x8C;%a6<M]Ap <,<S0<S0 <Bra<Q<Q \<g <[ <D(P<cİ< yxL< FC-!K<DᓷCI<Dᓷ< <q3Gdd<CD<bN<N"r<L ?<j-$׿</;F<<D3<fU<6Km<6KmX<6KmZ<_* <8p <̦e <̦e $<Q#SI<Q#SI<Q#SI<Q#SI<HU-Y<Pk/< <Us<Uh<C{ <2^ ƿ<.JWr <0GxM?J<0GxMj1<0I ^a<0 ,<12_fD <1<ΖӾ<1kc/L<2bkgb<3LR{ <38f+ s<37I<$<4̚КQ<4̚К<6!`d( <7;| <8*ea<;7NyȐC <<0gG <=|Jn<> t({ <> t({] <>R& R83f <|?@ $<|?@jR<|?@ (<|?@ <}\| <}\ <}/<~&4?? X) #)<7uR !<$Wa= a!=#&=6]  =& 'm5=~ƒH =z@=&9S =G5=G5 =;w =^J),9 #=E=Es=eN/ =Ӭ<"wv4 = c_Kpk = )ږI "= 93`K= m_2 = $q'= ˘= 7 = ij = Ob%= %a=mLo5=mLo5K =@XG =D&i =ڠC( =d0t3 e =}| =}| =J^Z] =]![=>Hg(?=SÄ8*L =SÄ8* =SÄ8*_=Uv =e@k== a== =}:RC=ta=(NF =]O= =yTIJqN=9xI =1 =[L=#TA& =#l-C =$DbEn =%&=%) ?=%RA=&6ND='\0 UL='>Ѿ='Xss=(RYR =)N}`Z=+E  m =+,f=+(d n =,Z.d/s=>dŒ =>J>=?>`=?ƼqAf=?).G/=?).G/U=@f =@@,{oߺ=@gN?=@w$ s =D;ĵ=Eo =E?ޕg=FJ=GGLOuDZ =G =HVV9\j=H el;=I  N=Ic7=JvS] =KccQo*WK=KOHos=K v=Lo1ﮒ a=ML;NRO=MWk=NO<\ =O5J> =P;=QRR+h=Q?}=RY=R JS=SF =Sj? =U>fs=UqjI* =Vټ> =W^}!=XB4iv&=XgmCQ=X%}0=Xyz =YS`=[!(e֌?3=[!(e֌ =[<^ e=[Gvo]=\fl|m[=\fl|m=\i`k` =]%j`=]@29& =^׊p6=^׊p6]=^>p=_-W/RIR=_-W/RI=_JD=_g4yB=_AN 4=_AN =`.bK>3{=a??=bL=mΊJu =mѯe"=nA \=n@n=o1F =p*bc =p*bc t=q[LR=q^z9=qݬfs=r`ͧU=s U-`=s U-C=uN)R;[ =vbVRt=w6՛K=zP)=z={(ӟ"K={usL=|B$;d =|Fi a =~!cOg=M-@ =6eSA =.̢ \= !=C3  =V3j 6=V3js(=^fIb?=KDe=KDe=[8 =g =_^A,[=CށnA=cVY=~^|H=6(@){ =Cm+[=kSF=e3@(=e3@ =g =Ih{=PY=&^R =RU"E  =RU"E  =2acY =<&=پ=پ=پ=1GZ=|XqJ=t=;| .= U:v=~f=~f=͎I s=5g=ǥM8=A =ѨV2]Z=j8ٹ=G.V#=G.V=ڈk ,=H=Ծfj M=[(wknQ =[(wknD=[(wkn=֫Go^ =@3, ^=OY=؄JɄ =أb -=q  =<*θ?'=۬j`Ftk =FžC!=Fž=Fž= Լ=w =U$T_ = 6p = 6p a=z>"t=ߐ =ߐ =îUt=îUt =îUtD= -V=DK=Rжm \= G!C)= G!C= n =Clu=#~Q =cjdN ==x s=P:=P: =%V=,3 =,3 =뙻5v =~r?= E!@?= E!@ (=(-=;@j=@bj=C =tv/b= s=vbC=1C^X =zb^=>0 (=9j={]@ =X [+=Pk=s;%'t l=5n*S=b!F ,=h˞ =Y(=H; t=X~{R=u#o=X* >>  !>qN #>S v>X;>Q`[ >8>+ >d > d> 5j > 3k > \7l1 i > \7l1> Ōys8> 7  '>s>#>#>?9;Fd>?>G^e>G^e[>dn >c>ogF{>, q]>s>P >Η`d>"> >cv[ i>،]>q<>q<>>q<Y >^4>a#ZRMR$>oV>&>$w3 \>ͳ > )>!r|>!r|>" K>$ޫ >$ޫZ>$b9 >&Wo >&O=ߦE>&v >&ŝ >'`1gg->(A/: (*>(A/:*>(A/: i>(A/:>(A/: >(Qw ^ >(|@;>)+JR>)+Jd>)+J>){R >*r7 a>*l >*lU>-UA >-UA>-q#y >.]Ec >/ 䴩>/#xQ>/92 aE >0Z9N>0Z9N >1!=>2Jӓ >3^4r j>34GaV >45 6 >4Y>54|>6mW; >7i?g>7i?g >8/z2>:K19o>: ZN >< >=nn~^/ >=V.>>d5>?=>? !>? m>@Wy| >A =p>BUhI >C6d>C6>Cc~V>DI.x5L>D=\>E >F©4 >G{ӈY >H;76 >ITL >IzA + >JL.|?>JkLt>Jgv>B>J7@>Kp|^ .>L쩱Ͻ m>M$YD>Mc 3 >NQ>OB#>P^_}E >Spfɷj>T >TQz07 >U% >V0i~ŊL>XF Y)f >Xꖶ">Y?b\>\ R,κ>\+π ,>\08EIz >\T >_Qvj{ >_d  >` 6c$>` 6c>`B"&>`m/1@v >ah >aqxy@>av/ # >axEzt >c-&< ">eCIΫj >f$R&>f$K>gA{S>gO!i>h6EzY>iՑ~H>j $D{5 !>j;8N Z>jRas>j$Wg >k S >l>!{ L >l>!{ >mT-. a>mT-. >n%nZ Q>ra+ >ra+| >ra+ $>rIѦ~4>ro -M>s2֜>sCǒ7 >s{S",B>tD >x[/>x[] >x[ >x[D >x Oa>x}>xνeB >x#>yYDu2>{oCm?>{AQ}>{pg>{?>}Oп>}n">}C>2ԍ>j:& z% - >>J><Y>."s>x c>=h 4>w>Q$M>Q>Hz>u3A\>u3A\>(2K>~A>34+! :>@;UR> a˖Q >C >O0Þ9 >7R>: c> +-[> +->+2>3mz۴>ÞU/f>Rq}!f>~s:y~>·bD[%>oR >]]>]]>$0 >%q/d>F<L>o1 (> \ i>>h~ >08 ,>08 >08>f8! >#>{& *>ݣ>zX>0Eվz - >~>~S>"F`>]- >&Rd >&R>x89QX >I>( ;c_! i>?\j>=kjs >k4+j>/C=7>u >u>F79| >K5~S >ܖ%# >£S8y>z >[> o>Zzazt>ZzazY>Zzaz>c c>QM3 e>oou  >a~->O)"?>̩R$ds>̩R$d >T[R>ϕEulC>ϕEul>ϕEul>e5 >e5 >!6K[>ќSj>j2fSt>&B!(>pWD>pW>ԧs>ש%4; >ש%4;>ߢ^(.>Rm(> v">ĴTD>iō Y >V m >ܘb> ųbY>ރ7K7>ޛޛM4>ϲk|>H㉔[ >#ޢ >׏U >x+z9A >WY>9m >lO2 >UZ>#, >,iOZK>2[v >$ vZ>$ va>{ >N:Q >zѕ@s> O h>돐B>(D>ϝQ6>][F >][F ->k4f>HM> ="V>5QxW>N̿>[}$ #>2^y%>mq>/\Β5>>3.>lr>q>=Z>l%5>ȈL >CeM+> ]u*>p ">=)>Em B>^{Jf>! y; >vDkY>*nuzv?>^?aĠ ?{w>ݧdw?B?>?iu^?sc?sc?sc ? HiӻG? {K? {? 5kC ? @  g? qnU? PR,#? a`N? D2V?r?/ n ?1X?f-v ?VA`?&Q?|ut9s?Ks?Hn]? uFS?(yV ?"C?Q5~ ?.9C[?8??$`$?: < ?@!2c\?2#h9?J/D?[ϊR?b?b< ?8d36S ?Te?%c- ?E$ ?",JdL?"LKk?#QU, ?# @?# @]?# @R?&xem g ?&xem "?(nSB =?(P7?(PU'?(PL?(}4&% ?(a]  ?)<?*8 ]f[ ?+7?,8 "?-3$]??-eAS ?-7JWQ?-eI?1T?1*,z??1[aX?1jk?1N, ?3f8F -?4NZ0} g ?4V?8'F"?9yB , ?;??<_&g?<}Qi3?= v?>?b/?>?b/?@ ?A04?AM] n?A'L ;?CKK%?CKK?C:ɶ?DS3 ?E0 ?E0K?Gi}_ ?Hց t?Id\ #?JFAߥ ,?JFAߥ ?Jc;a?Jc;?KN2d?K0 x?K?M_{?<Q?MӋ3??NW@>S?N3l"?Nb\- s?Oe?Oe?O9?P R?P)YBNj ?Qڔ 3*?Q$a?R)^*"?R3evsy ?RtEZv ?SkhmCv?U;t9f (?U|ps?VR-I?Zx?[r]K?\IRi?] { ,?^GF ?^qϬ?`/j?av3C!?a/Aј5v?aq;o?bL@X?cRc  ?eplt?fd ?g/^ $ ?h$ҞU{?hh*N ?idY?idZ ?i!bV^j?i ?iQL)?jFJ8q ?kãx |?lu$~pr??lu$~pr?lm , ?l= ,?nCr'x4?n[{J[?nuO?nmY?q O ?sp (?spz?sp: ?sp ,?uhNq b?uhNq bP?uhNq b(?uhNq bL?uhNq b ?uhNq b ?uhNq b?wpCtGt?wuDM?xOz ?xUzI{b{?xjZ?zaR ?z+?z+?z+?z+?z+ ?|N?|R?|?|C a ?}W&?}) k?}e ?}a/(,?~71<?~%v dZ?~%v dZ?~/bN e?~/bN?~ ?L0 ?r|`?J`go ?Ethb' ?a5~g  ?j5?j??R ?gIY?v ? 9ɴ[?~ ?3.lنv?; j3?ԭ=U?B&YS?Ǭ" ?-NL?-NLS?|_|Y?\噿.?\噿?\噿? _?'TĎ a ?_/?c?(_I ?Q &?C?EK?m:pu?j? ?&O?=,ǧ 5 ?x$R(?x$#?#~L?KK ?6?n+?N X?>N?>?H?5wR? o? oZ?`QMz ? 0K?\G!U0?1k?fi?D̿:?D̿ N?D̿ a?D̿9 ?}gn ?2aK?6?Ws:R?R|?^+<?k7?c]4?[s.R?\!,s2?ݳK ?}g}?U SW ?U SW?b뒸b%?UV/~?70%3?70%3S?Ao, ?w 7b a?yh0$?Fxxi?Fxx ?3*{v ?w5|": ? V5 ?5ž)m|? +? &?]шj?_EaLt?9` ?c\[%? RqK?~Au?j?\oh{$?č36^s?ę?D?剶S?ƼFK:/?ݧ }?]R't?+gj?vdz ?ʎ? sK?Q?pjFv m ?pjFvt ?tc?tc ?y-t \?t?̲?[ z?[* ?O ?A1K?R`b ?:+ ?n >?ҥY]?Jt  ?+NR ?<8>?s,?5K?PV?E] ?`'3 ?`'3 ?RNd`?RNd`$?K(?DKj?ps?Q\ ?)jj?}?-?ԷGRC?{t? ?EN? K+?%iGC?-GmHU?-GmH]w?冠4?屸/qkZ ?1P ? ?謲o?g?\L?삷j ?GSpA?by?!l?-Is 9?)"?E4R?7* i ?Ȕ^b?a#?a#?a#?Ea[? ?t< v?*|G ?￯?&?&?+@R ?/zcp+?EV0]?s?*`_?Q`ԧ} ?Y?h?Y?h?i6?c08 ?̸K?̸K$?̸K?=t?pF?@c !@ I@Q4 %@=Q@׭H@4=$>Lk@6!M $ @I%G @6bW,@" fQ @LȜ @p @p@k@k @k@ bJN @ gXR@ gXK@ ?Q@ /HZ @ :JIgC (@ :C@ :C@ LO@5rUB@ءrxM@8}X*z s@no:@♸GY] @♸GY@♸GY@틊"@틊" @틊" $@f@&k@qH @$@7IS@YL@Iv>j@Iv>s@C1E e@4צ@߆ v@}!7@uJJY @T@T @T@bH+vK@29 i@'] @ ~nG@!98~#@!>@!l , @!T@$1nJa@%B4@&{:&[@'xOv@'} K7d@'p ;@'` @)Y@). m @,5AL@,n=e @0"dT@23M@2Řb @3"pt@41?@4KKf @8CM| @8:$N@94(8 @:. @:+w@; U" @=Qʵ 5@=|`\E@>r739@?.(DG@?.(DG@@] @@] @AW˂ "@A7 ( @AhsU?@F.f #@G9.ȗ @G9.ȗ@G9.ȗ'@H:t@Ho!v@IE@JppO@KJwybt @KT RR @LvdY@M0 @@N =@N+XH~ @O0Mʴ{@P  @RϽ&@Rݝ-L# @TJ @V1nѬZv@X l.@Y*h @Y*h (@[j @\Dڼ!f@`v{@`v{@`v{@`v{R@`pp@`"$P5@` 5 @aU~ @bF+ WD@eFx m@f.׺Pj@gUʻ@g   @gF%d @h/P| @id@j*w6@mhR|(@nPUmH@ou17Pt1 (@p ; $@pZ @qύ7@q՗m@qW0|}D @svS , @uQ)@uK]@w6e @wVCV`k@xq@yNN j@yt@{t V@|JZ"{@|~@~iE{{n=@v^ @3 @U_ @2 @~LHR ,@MPQ@1-@@|JO7o@|JO7oQ@|JO7o@5E]s@l T@l T {@ݒ$ ,@H溁PK@:ÌN9@NAJ@ź@ 4?@ 4@rv(@'Ӓ:@'Ӓ:f@'Ӓ:@1̕*V(@1̕* @1̕*d@"R@5(@5(j@Hu:I{@~D2 @8|4 @%pp@V@ֿ@qg @b,v@b,vR@U!@U!S@@{\ @,A@6@|G, @:[K@@ύ@v@@%f+R@ } N j@'̀Gs@5y@ @uSa @uSR@0ؑU s @b{@FTcV@mmd0U@o^Ed@|V@X=@03r @03rR@LC. @kú@0D8iZ @@ CK @`> P @@5@I]@5ƒa @񆋩S#@d ,@d \@ୡN@#|!% @#|!%t@t?~9@t?~d @''җq s@4s`@Tɨ:` ,@P [`R@_P #@\~]R@!7@hY# g@G茒@Bp< @Š+L< @Ĭq pU@p< -9 @A @GF}v@V)w @p^?@x(M5K@ j@ >m'@')r+d@R|k@ʸ[@]cR@5t@ˉg @iC@$tl @͕Hq@;j  i @;j  @·}M @Љh}s@t&`vL@"d@M0:k !@cfg:@cfg3@cfg@cfg@cfgQ@cfg@/J@Ծ_^\Y@Ծ_^\ @ ~( @6D?@å/@)Es@)E@)Et @e_#@q^`^-N*@,<7 @El R@жҙd@߭oӖ a@RӒ i@XV2vjR@XV2v #@XV2vs@eS@ea@F @bp @$@? @_o@ݓ~Iw @{R8+ @{R8+@=m@3{8+Y@I ATj;=x A?](AROXA4n]Ap AQPĦEAQPĦEZA>SA|WkA0SMd sAv:f AAMW(, A|mJeAEA 4kA p ? A p  (A H4A >ߺZA lh A O (AfP WAvr66j AB$K Am-z AK[*KbAK[*KjqAK[*K ,A'A~d AT=IRAYuA{A{A{YA{A{bA̘.V $AjVh AD"AAA_WjAsh Aܗ:4?A(Nj(Y A)2fvjA)2fvA+Pt A-]CgA.FeB A/LWѦA0݃pnYA0DA1$̵RA3@,$P A46ia3~ A40' A6GmRA6MvqwA7UQa A76zA76z A8;M ZA8;M iA92*W~$A9mkQS#A9a A9f\qA<[&YA=ܷ >] A=A>"?A?h(=>A@Ɣ.JYA@Ɣ.JAB_I a AB_IsAD aW ADC-fRAEGO}tAEASAF\b%m AGAq3D ? AJڎ{AJڎ{AK)[AK3G? AKZE_ ;ANz3 AN%6 AOYO APdAPAQKP"AQKPAQKPLAQq/OYAT~AV}/dm eAV?;>mY -AWUAX(fZAX,PJ8AYLR + AY|6?tAY|6? AY|6? AZ95{c AZlt ,A\jhNA],RQA^\A^\QA`UPAa^vvAa^vj AaajI)Ab_i2LAccR[]AdK+BQ AetAetAfS Ai=9Ai 7xZAk] & Ak4 Aldm*:Al>jAlXp3+W 9All ! AlKAmȽAn Ap ;o|&Ap% k Ap% k mAqmTAqet# As-2AtSx AuB+?Au,QAvD|#AvD|#RAvj[kU Aw5'`AyJ||AzYߞG4A{vpNYA}h0A}k:3A~3tA~JUA~ko.W ASH aA[7 VAc; cAc; kA*,:krAA oatA\B A Ǡf=|A Ǡf=A>%:A$Aiկ OAiկ 8AdԵ A/h KASN47 AǞA(A(A11? A= iAdqe9 aA Ak\zA+e A SAD A&DA&A6.uo AB;?CAq AOƇAOƇ ,A $A- lAb U AZa Ap Ⱦ AH^YA'B AM|cA7ad]A7adA?_A>Sa $AAJ[ AY&k8  AD# A@;HWDA4|گvAWHWRA"d?AaA{XAS&UAS&U$A9 $A9 vAF~[SAͺAC~G A.Ǭ AV> # Aь@ aAь@ A-#!.fA[ 9RAǹpA.Au*m Au*m A'[G i A,#8A[CsA.kM^m Ad횯{AvQAfl?Ah A1GAdNAَ]qLAwttAwttA$%g7 (A}8, #A®m~E A]\tATȠc]ATȠcAq2[S?AÅ'" A2%jfRA=LK8A=LK8+A=LK8f A6h.$.A6h.LA6h.eA6h.A6h.SAqT: A,L-A67НnA)Aa, #A9 aAWGNA͞ U(?AW#nGAW#nAb\&nI AЕê0GAЕê0A12kN AҸpj Axy AұZCjA慨A/2Fd %AWvSApwZA&5JYApYA?LADA:A9M%A(Xkj $Aهv%4. Ar~A_KA, = )A, = -AFKR $Ap{n|2Am>~T Af "A34 AgdxA~ڢ*+UAܰfAo߶6 AAxhvAm . AOJA汣ne? ATBA} iA.QA 47 SAy' LAy' AB@91B&Wd B&WRBWVɉBdcQB֖+B|IB Bk B BdhBfTBD^ BNAͩ`BpPKAB;sA B B'B ) ( B )BA@ Ba>M iB rlB!nϦ굓 B!iT B"m6 B">KB#SPZB$c6 cB$F= B%klϜB&LJa< B&OB( B'RB(MBr "B(ӹ/B)_ $%B)_ ,B+@PB+]"W3yB, P B, P B, P B0@nB0Z d]B0Z d B0Z dB1` B2tJP B21 B6ҳQB6,ye 3B7 eB9ẁ @B9ẁR8B9ẁ aB:0B:0$B;}x| B;:B=gB8o #LB=tL B=v+B?vˈ9B?vˈ B?3<j[ B?3<j[: BA,թ LBAymSBCZao \BCZaoBC֗ԩ 9BC֗ԩL,BC֗ԩSBDf kBER2 BHWIcGat BHA;_i BH嫰rSBK\Up+j.BK\Up+ BN2J aBN{>c BO4S=#BQI8 BRjLBSyd=BSyd=BTA)Z BTA) BU)d9sBU)d9BUV,UBW|& BXjD4BXy9}% BYpBZ ݙ BZeB[On sB[i B\t>Ȭc_SB]z|\TjB^)2BaDBb(?O BbM#߸BbIBcV: BctԍRBd/D BdñB_9jBemhBe&gv BfF} BffLBg5BhVDOBBhw%i BjH oFdBj\] aBj.OX rBkqr Bkqr Bm*dBnIBnIBnA] Bna@KBojqk,)BovBY {Bp*" BpPP? Bp׽ aBsܜD~R#Bu=6r*BuDGW]QBxH qBxH qRBxm^5)\BxM0V.ByVbcBzDbJ BzetbBzzsCtB| &o١ # B| ZG| lB|e  B|ۓպ B}wk*B}wkB~lRB~->BaU*vB) Bj@lB]XSBE-TsnBq$>,BfIB$ ,B$)B$)sBQtB9zlmB+B1t%B"k@BTo5^PBb绕nB,q^v Bނd $BtjBB BgfTBgfT (BM6[Bu% BBK BEG %B,ZBz# cB5K BLJCwB-*CBlB|Bӵ ? ,B[O-n BD諾]/B$\)FBe+ ,B4 Bn;s Bn;B6B6EB B90DCB_`L BhXsBt:%lBiM2<LBaERBjBْjYBW8BH|I֠ \BH|I֠BZ&QBuqK0B3M/ B]SR B:j, B^aB=jBɫB& P Bʕy+{ Be_e$KR Bˈ@2NBMhB2BY4*cB8 ^ BrwhBHBB\B*Hk8j B6;?P?Bk#B׾ , iBN" B5 :&QBNyY Bc+iGtjBہ  SBۡ.V8B.H Bz4?iB~J$ jBX35W4YB9R> Bmr)Bn4RBʳK B"uX&B㥛/u)s Bɮ BnQ"@<0BnQ"@<BYuQ Br B =0MRLBxx B Jw<B !%B< )&U Bu.H2Bu.HBLA.Pg Bb1x$Bb1xPB4h$B4B.fk rR B:AjhlBv jBM4'?ABVcoB ABŒDeRC?SSC?ۡJ2C?_R D,CAe~sKCAe~sCAe~sCAvCB3h[CC?9 CD:%5# CD:%5#CDPMqCDi CGϔi.{ CG@ .CH0/aCIЕIQ i CKIyCKW0B#CK+kCL)M CLQz1CL~$ CNjCO[DFCOޜ(˿ a%COޜ(˿?CO4Ư CQVuuCSXh<CT!Y CT!YjCTwC.. CUEOSCUV]D(|CU"SCU"CU @ #CU'ԶCW(m CXsCY$yZ CZ,n }CZ]2/jC]lyC^jlDCaI;SCb Cf,CfݱACkȚþ?Cl7 G Cm-Fe9t? CnE6j{ Co2{gCp%J~ aCp%J~ ,Cp6c?CtiYCuJ_*QCu_dI6+Cw"Ѵ Cw&[Cw޹[mCwD Cw|Cx.CxY`ͭCx_Z\ ,Cz&! c C|k7 OC|k7 1C|]e C|Oٵ3 e C|Oٵ3 C}N^ܗqC}APC' C' C' cCu CW^CaRC$K6C|  Cj^ C 8PDC?C<%{-6C {sCpAB CF,CiH:CΉKC;v CaWd,CaWCS\C-CS\CCS\CSC>m.*CC>m.*C5sEC` 4CKm s C\P aC[SC|K CuCm- C=6C=QCmZFC""œL$C""œC""œC1,=1C1,=1C[tC[sC2**C CE >9BdC)38Cr[ mCC.HC?fdC_ Cy C1 q?C)G'FC2鐟 C=UKLj>C=UKL (CCRCCRC|sCe7*sCe7*NCéOCéOC,d Cb zCutb4CG;CHCPCnCNCMw$N 2CXp/ t<CXp/ CXp/ Y CRRXjCt2 $CYC5¼CL=jj CL=j Cڭڔ2Cڭڔ2]TCڭڔ2Cڭڔ2 C$0C$0CK|>۞Gs CK|>۞GC ۴Cy8Cr `PCFCSCjC CjCCQjʰC^+ 6C^+ 6:Crn[vCu C兡K9C+GBC $ CfGC NC'MW$C|NC6`C6`RCBfCyC+Cݏ;%"CB_DCƘ۸:Cc -CcCc C1 IF +C1 IFn C1 IF \ CX{I Cș9հ>& CDd{ Ct1Rl?C;[t: C;?ߏD Cau?C,qA$C{n C 9CFէ7CΕ:DCANje7iCC?#CЛe3 C&rSCѼÁw0vCIH =CgǜUBCCFZ CԖ8ʓC:l CֈCַ@T! CZYC^`SC^`S C^`S Cۧ,عCۧ,عCۧ,عCۧ,عC }gC(qCۇ)+C֏$UC C@J!WC݋TGR C5pD~5CC¶XCEňC~MC@isCNc.qCU CUC浈 C ]9 C ]9CQgrCccC,N C a"1Ci-CV"RCV"KCV"SCp C9 C쾛:s C~ʻC|ātYCDkCRG CbI C^ g C :M% C$= C4{SC\ CIyV C$fW]C3b  CCaD#x<D#x<UD#x<KD$(jbRD&jD#hDY tDw|'DKdԉD DSYM D0[(tD0E$DaAd|D#S?MD_p}Q DH DB63DїBDї D-*,DyaZ4D^+D >QD >Q D >QD u[# D D (p |D 4㸉 D 9PVD>` DITj( 2DjaRD CE D+Ћ$X D5Hx &DΚ@N!K D : D9R D4J D4J \DsH &DsH  DlDkRZRD~gD D;+% Doq0aDmJ ED?U7D_I,DD0@d!DLzh#EDW1&M  D^GD Gƴ D"-l D$ 0[ D&?!q~[D'$‚@ ^D(T6FD*3˜W)D*yD, jdD-eΨ!D.n2D.̸<}QRD0@$j?D03^I\ND1}^D2:[D2 ΀D39yED39yE D39yE D4eJND5a pd D5 >?0D5 >?0D7a)pBD9rΏ% D91^D9o #D:@D:@-D;A@.B D;A@. D_8vDýz_D'Eɾ D^"Dɲ5K`װR DʒaD?b}YDT $D,Eh *D̸x,YDwMCD͟:|$Dkf6jWD D DϿqK D3ڰb DЀvc D7\] D04^RDVs? D?8s D/;KDٱ)o DgZ(jJ DڝTRYT DZ} D܆ugq D=>Dݥn cD[ $ D[ DC?c(Dߋ3\DI0 Do?DN#hSD3{-Z DF{,e ,%DF{,e DF{,e DxveRD意DDq)m DK D8qlDU!D虍Dz!,;DPTy DS+K>DYl DK| aD]o_D:@=Dxof)Dg7A( Don'!D(q;Do ێ Do ێD(/avSD(/ava D(/avLD[Np] D$C+[DSDH:DckV`DHwkE}>E}>|E}>tED^} (E ..E4E)՗Q%E)՗E)՗DE)՗E ,EfފE}gfCE}gfU2E}gfE AW.E z E D|E: )+ :EY.mEzG $ENs3EⰟ EW ErREfɚj|Ey9 Ey9 Ey9 EkޯE~ , E7èlREv*KE F vE{r E^M 4Ew UEU܏*E R iE oEATaE|i E—R'E_̡\b%E_̡\bOE_̡\bEܘf Ea*STEa*ST ESkE=TE 7Qav E!wi E#%{jUHE#jx E$!kE%jFRj E%?#E&~'Or E(N W aE(N W ( E(N Wk E(m[ME(~E4|E)>> ]E*Q&KvE++xI$ E+盧 E,(MJ2E-BE- &iR%E/ hE/(/6N E023E1wau. >7E1wau. "E1wau.E2}( |E3P뷳q E4McX[E56roE56robE6P(E7;F3?>E8RRw$ E9io E9 E9덈 +E: /]q #E:  ժj;E:V)E;O=3 $E;E<E< E=vIE?`E@Uc}jE@(v EAF EDeiZ] EFh/jEHQ* EHQ* \ EKzA $ELOƫ;ELL EL#"S_EML`(sEO /EO &EQZ aEQZ 2ESeSES'RESCM5ET!E璥ET $EW <"EWPtEX˱~ EXu-j iEXu-jj EXu-j aEYdY5v EYwRj E[.X/ E[Ũv ,'E[Ũv$E[ŨvE[ŨvE\1{E\PKX!E^]SE_R]DgE`u`_0 iE`u`_0 Eb,[&C Ec ٤?Ed8ˋn5&Ed(} Ed(} Ed(} EdzZ Ee&K EeϾEh" \_Eh" EjMVh? Ejr EjU Ej} JQx Ek&ş CEn){juEnoKnX Eoi^o"EpI,kEq#/NF$Eq#/NFEq#/NFEqM} ErdEEErO EsQEsǿ) )Etcfl`Ets BEts Ete*Ev5 Evm"?EvQB aExXtExʻsExʻE{eŦ7E{L E|IE|IE|3~i*E|2RE}1 (E}1jEX7E,8Eӟ];?E|R E%Jsj E ESiESiEgq  E:y  EKX|E/0 ; EXxgEXxgEv}K%%EM,m E.?EyE.?E1E.?E E}>Yv E}>YEpe$ E>e* CEk- Eos~E<(9cE| E[{RE̎ EEoCq dE~KKEMGEjKE4]qMEP; Et/EC2wb E}A tE]o E2 bEWfe?EGt;EIOEo&2z |Eo&2z E&V`dEfPZEf0Ef!EfEd&- E; E)EkEIF@E'/RE'/R8E'/RE'/RE[C?E[C?jE[C?E`ٕ9dEi0D.A Ei0D.A s Eǘ LE|I ?Eȭ+iEȭ+"E;lEfpư iE h EEQ EϝHoE?/dE} KE7ZGCE3E+|sE!EG_ZK$EG_ZEG_ZREԜ_eD: Etfϴ sEG%(<?EG%(<E֭Ӆ. E6DD >Ed;@G pE֓}-CEځn E^| E۞i睤E|bmE܄z nE\` E"yxE"yx JE"yx E"yxEEb{ E:EiL} ! E"i@EFMzV EFMzV sExisE칂:%- %E谳Ecvb %E$" eE@j>?E@j>REjEP &E~d# ETvEdWE-ໃ̻ E]h}7 E1jENR>RE}VEiʀfEX&O]Ehpxf EhpxfEb EbE +E*< EQO?EE;0 Ecm$ E"XEaeEa0 " &Ea0 " E]4 ]E Ǔ6EfcgEX-gE4m E4m iE4m (E4mjE4m ESrH{EۥiNEEOY|EOY ( EOYE7J7 r#E5VE7s;fk FZ8≸,FWjiF4ذ QFc,F"]r^F"]r^FrFnS+W FnS+WF n#S| F h0[F }SMj F }SM?F AR} =F ױQ$F 8zF<5R F("wBFQuFPF9FcPFcFcFK~em FN-×F]]7FEB(F!` F_-O F_-OVF_-OF_-O0F܎ǦFW FsH>f5 FJ' Fk} FW8ȓF>2 Ft4 oF!A>1F!A>1[F"MwF"c$?9 F"c$?9+F#!E+C F$Sj܈DIF$Sj܈F$Sj܈F'f:0 F(V! 3#YF(ց\SF(ց\LF(ց\F*B F*B F+/јغ \F+1F,KF,KF-HpxuvF.nF/xP1QF1:ZW F1CE2 F2K̓ F25F3{KF6s F7.*x F7MPF7]N @RF9FGBx# FH`FHGګ FIqW FIχK]FIiـaFIiـFKd4WFKj<D FK<FLhx5 tFPkőgFPymPdFP4> ~FR(FR FRKFS2D)FU7zB45FUK+FX_<XKFY,aa˖FYx?'3FZGJ F\QvF]B^: + F]xp= F^ɆF^m F`G\e5 Fa( -Fa۬i>FdaHFe#D3 Fgԯ Fg3Fg3Fg3Fj sFj B \Fk-8ޒ FkiFlGe"Fn/qFp_O e FqtlfxFr/DX Fr/DX Fr,y|Fs>mRFv50F FvOa FvRFv̨h] Fv̨h Fw=FxOj]rFx~;'EFz6V, F}Ay'RF~eS&SF~e0;6FK9F1K[s?FYP lFDU ,F [d F,IKZF1j'FJBs#FsxN|F. FlTJFoO=FoO=Fy锝 F8y4fIFhboF}.VFGŞ F5FH'F f@~F F/FSjFarVF6Y Fp<65r $FtZޛQF_B( FvןtFvןYF!L F!L FtLFl#YFl#OF ]F@f .F@f F@fF_BF2)FⓥF?F&flR"FiFQ5w@ FȴPF8:F8:FR (Ft- boF#nF ;)F园0 5FE}FlF.]>FƊsFM螻|F;+F;+ FS;dF2%=| \F1C iF2*ֽFU3QF=ɞ ,FS ,FV FKFr4>HTRMF]wR Frê "Fհ=lL"Fհ=l Fs'M nF2b:7PFGF33|*FIKF5F5$ F5$F5$ F/q&$FѧN{F,k8 F7B  F7B F7B FT/Au Fi:ĤfFg[oaF(NF۞dm Fy3eH1 Fy3eH1 F5sa!!FYP+ FYP+vFYP+ F!i FOqI cFt+| F@J` Fp \FXOO-FXOOLFA ]9 |FFF|7s#FH w] hFqTF; qF|Q]F R F]htF]h F]h \F jF@F@L F@F@SF}4qdFeuFAQFX F9F99bx #G. } G]p⺽~GHuNG0T`QG/4ˀGFN37GC+5~aGE^ G bX*ZSGKG^Z|/SGxJvGI+oO|GI+oO GI+oO a GI+oO sG[,:G 2E G =,E9 G  C;RG KK'pI?G $!D G =Y[Ws0G b։ZG !o #G$ c3( G$ c3(G_B^ ;Grp]#G/fSGeeaj2GeeaE.G!hGnFG]V ^GzkbKGzkbGnq G/?P-GY@}sDGmP%^RG<& $ GPʳ(GY@G3&-Z%GbS#n;GbS#n/GbS#nGbS#nGfGhkUGBl?Q?GpXvGŐn?GgM.jNGgM.jG߹S G Ch{G!H> WG"l G# s3"G# s3`G#IG$±0[7{G%֘߄ a0G%֘߄ G&.ZtG&}9ez G'D@ZN G(+R#' G(+R#' $G*nhz G+BBɻjv G+ӄv G,F0 G.7 7GV( iG.NQcG.q G.q -G/XksG2&iB G2~f>K G32OJG4x>J86 ]G6vG8·\G9$۫G9ݤG:)M'l -G;8ƊG;8ƊQ G;8ƊG<\YG< SP G<"jG=qXG=sѵiq G=0c G>0GARGBS>@FGC4h9GCgcGEIOGF}QGHpp?GHs3tsGHvxbGI-l GIGK=Sj GLZ ~ GLOfGLu(sNGMKGM r |GN/ݴ?FGNG+̞ GN{R}GOuCRGOuC%GOuCZGOuCdGP|`A# GQۛ}sGQۛ}kGQۛ} GQ0#( |>GR7%m# GR+\ GS> GS9%Y GUYc rGV D?GWc˴~GXe^\ /GXe^\ ( GXo}~ت GX߾FHGXiȟ GYPZ|GZk}OGZy (GZfTGZBMG^y G_> qѱG_> qѱKG_~W G_0Vk? G`bbg Ga憇GbR#rGcEI6m Gc~/<Gc|PGcl#Geki<-GgW'  Ggpm;DGhj iGhs\WGhs\WGizH 1QGP} cGxuiGm\OGEGyXK GG zG GM9ÆG. G<KGDFۈGar GFbz iG?)Gϗ凹GZ> iG KOQG KOGE"Sl{GI(UGI(U G[  G̑PGOG]Hj G5B> G (rK8G*oG"ԑm< G|5Ff;G|5FG/w cGy [2 GɆԺ #GZosS G<j GRk$G t_@aG t_@9G3RY~G+u@'G7MGÊJ 0QGmGKR9 G٣G"  GG)a |G)a s G)a GƝz GD_]GǦYGj\?GɤUZc G 7YGD tG-FRs , G̝`HYG̽!RG <^MG6ZG6Z G!VGzYG)>QGʸ(GʸsGMOq G{x GѕN GyJJVGb@ Gs G!?l ,G!?lG%jd3 G>O"vGEr ( GEr G3$b&ZGPMPQG ʾ|c G`FĆ$Gl0>Gߤ$j eQG߮07E GfBf@KGk -`Gk e%Gk?Gk GkG9p G`v 1 GyG'G nlGN#jzGGMag GHjG[U?%eG^?6l GڰGt aG.;G G gG! GΊKC G0`J _G0`JsG0`J?G0`JhGk1 Gd;<GamnG.P GE{ cGy^a G똋G K G똋G Gϡ=e9G%Gu jGxkHސr[vH22`pH22`pH22`pH|=PbH;JP9jH ?HGèHGèH65vrH fs H w{[2 H .D+] H .D+] H x sH yt H aTw=H b3v Hu}"."#HؔU HؔHK9 lHW#^?HŌ H_;WH9~DM HR6D dH *r HG=, sH4 a HY@( H%hFHE̖,HmzHHK@jYHM RHO~+ H$?H^hY H.A"jHN[ Hs "H 4Q HmFA H8 H#UHT< sHTw7HTwH!62C- H!>9 H! > !H$.JHH$u>lH%7~zH&7 /H'$ @o H'j  H' H(o ZH(ݲ sH*c\¿ H*c\¿ ( H+$# H,tk;vH,uiN H-2K4CFgH-igRH0kh)s H2 @yXH2[3ow H2uiItH2zpH2M wH37yąD H4Љ*H5z'zy H5P H6Rf (H74${k e0H8 8(H8`sH9?!qH9Q iH:gj:H;`0:[ H=U)#= ]H>UwVZ#H>d# H?1H@%K<HA蜜 HAM2Am%HC$) 6sHC$) 6jHCQݡ HCQݡsHD E HF*«iHFDEHFef% HF . HItjo{HJR4fHKqHOd) HOƨHOjzUMjHP,Y0HQ刐;HR٭L7HSO HSvHT%kv|o HT#/+ cHU:6`fVHXk_? HY` HZ80YH[fPC gH\nH\wFPH_l!H`$`Eb HatҞ#Ha&Ha'Ha&HZ Ha&HSHce1Q?HdMkh3D HejRRSsHejRRSHeU+:q a HeU+:qjHfy[UNHi@.T/۵{Hi~ˮŘ& Hm aHm! j{^KHn-uZܝ iHnn@8HnY HƝRHƝ HV5IHI{hu Hs HZ?Hs/DF[HMQck7f HڋYHǙHǙH H iH.2C]E,H.2C]E,QH& HH5mPDHzjJH߫H( a{H-$?H3fUkH%"? H<4H sʩH  H8/ H8/ Hq]g$4H8:u% H⁒ Hd~-j Hd~-j HDfZSHOBZ H^qpS@H^qpH#M YgH#M DH#M K;H#M 1H#M H#M H9?P@vHVRHVRDH†)8H9 tHiXyfHihwxHihwx mHr $$H|@-?H|@- HL zHܕAHܕAQHܕAHNIf`HiFHVSsğHLr H\ˇBHC$& Hd/oHɯ H2VHHm ,H"R Hx+K\H{NxQm a HµR H#J sH&8J0SH=kIfH,TH΢RH |uH |uH/J:v?Hc~"Hɔ9Hs3 H0Z H0ZS HX&? H_&5#Hل= \H<)TY HMxEDHИuDL H_SczHt%X H{Zߘ s HHCHzy mHԃ=Ѣ#HԚYSwHX5H5s H{g\\eH֤A9H\gH^NH* } HؽMH\r ,H\r Hٸ/H7oEHgIM H~?dQHzWAAHo$jRHHBR H,cl sRHKm gH^,H"p# H"p# $HGs+ HMSFHs8" HIH=fH/Б &Hڝ wHڝ aHL:DXHw-9H"|g jH>I=gHQNvHX<<?H,W';H + H (j H< =+?HAeHk.H1Ө $H󨤂  Hݴz_ HQ벩 sHvWQHcAQR H +HJ'nRH˴1bH|'H| H]aH]YH}h#H2t¡ jH2t¡ sH2t¡ tHFwxUHFwxU H#[&H,gѭ * HfB:Hב)H)gDHҿbHaDH1%֩ I Ii50 ,Ii50 $Ii50 Ii50 I)IIDIK II UI$}? ILCQ ILCIW IA7^I9ImAqGI Њ~!#I 5ÐI MVA;I t9 I t9I u}I u}I#*QIB'~ IɖYam# Iˏv8 EIˏv8 IdD #Iy)G*U6IÔ fIY!I z3aI( I6j6+ I/64] I]|@ I!;; , IWV  I;yK0NI7RI8n_I8<SI9U  I9du I:BI<(;CI= io8 I=Y5QI?@O IB^NIB+aaID nRID)IDsIG]Xz.IH@] II@TWII,ny II,nyUII,nyLIJxeIK{-2IMr } IM%s` IOOIQ1 xDIS.w?RIS7PxIS7PxRIS"BڇITdIT_"X7<?IT_"X7< ITeHF?IV1\IVEX3E IVQ匿IVJX?#IYNb $ IZ }لIZ }لIZ=#I[2| I[2| I\~GBIY-I\~GBIs'I]}]?I]44s I]44 aI_90OSI_PqOI_ I_ըp IaTcXm?IbM"Id!Ie`xIe`xRIen\If/.=IfWN?Igh) IgXRIgP IR7 LIеY $Iݫq(Iݫq( Ig+m=|IgI/Im#SI*p#I`CINvfWQ= I,ƃQ Iȫ.j}I碪9 $I4U dILAI͈;I) I͈4aAIij9IN &Iu?'IщL?O< IV#jB?IV#jB?IV#jB?IV#jB?I=/|Iq > IՊ/:IfS1ThI=3 I=3 $I+jIajINJuI25߈Iٳ-ԟU ;I!rӠIB/aIgXJPC IAۧ% IP?YI᪗)1!}N I& |IX{ (I.9:3kI LUI LUI LUI LUI LU I LUI I?I>cI:B=  IS $ICA< I02:I蛡)[Iꩽn) eI8IS 'U]I5I9@u`Iv\y ,Iv\yIv\y (I=I" _ IpFbI'i IDWIeԸLWI9uZUIS az]Iq IwI X eI4YI4Yt I4Y I1 RYI1 R I1 RIϗueLIPe\p &I͝OQ IoI`Ⱗ I-Jr&g~J-MJd Jm0 J0) (JۨmɘJ?p?JJ ;9  JsلU J\Fo J ,JJo1qzJ RK} J UQdlJ Rb 1 J Rb 1Y J S)yJ b p \ J \ /3 J 1@pJY=sW ,JN}J= J"-󏃬KJWq ,JWq JWq Ju[J.O Z J.O Z J.O Z J- JV)C JV)C J3~:kJs!J֪7eJ/G5I J5H $JhxJgz JRVzJ6|+J, !J@ՌJN=!J ބ?J!FsvJ!<1RJ!@ X|J!; J#jISJ#nNJ#kDJ$2J&?Dm?1J&?Dm J& ;J(W9hJ)|9 2J*/<5sJ+/ J+[@ |J+񞘯J,{J.A? J0m!7S J0twS? J1ݾPJ17n DJ2odHtJ2odH J2ZEJ35 J4'J4TM J6Ĭa J7!:J7 J8 X#vJ:;Pf@ J:;Pf@J:D[L iJ;! JRJ?d%őJ?d%őJ?]x@J?$r`J?KIM : J@nf2JA^W JA^WJBJj +JB|A4$ JE5/{@JF$>"JF-uJG JG9{B JH a=JI%ۖ-JIa3hN#JJ.A׬JLdλ]JM? cJMfyUJMŽrJN(ܜjJNXW JOkmIBJOkmIJP|\6'DJP* JQ+:lMjJQ{JR2؀BUJS=SCtjJUl)IJUzU]# JYA`JYH/ ,JY~zj J[? J[?J[*J\(.ĩjJ\+k쉆J]ޤ}jJ^_,4\, J_cFEJ_jt.VJ_ J`aPR JaabK Jb@qJb샜f_SJb샜f_Jb샜f_UJb샜f_Jexȝ[Y?JeHzn|Jfl Jf* UJgm|jJh# RJh}¨JjJn}SJk_ Jk_Jk$P#Jk[ aJk$k$PJm+`- $Jn?PIJomC/Jp0* ,JqC 3 $Jqoh<1zZJrɮ0]Js*À Jt5 Jt5JtCYJuh?B JuJХK JuJХLJv uPJvf| cJvvZYJvvZJwC(tJwW1t# JxDUʵ Jy5qvJy87 @J{J۾J{c!?J|p"J2 J|!ϰP&J|!ϰJ}:)"4vJ~f̓ jJቦdObJ}e\ Jɲ J%SK J'R͙ e J'R͙ Jg ^Jj/_?J[ U a Jsj JsjJH$e[JUuNJUu J<ف^]QJOpv JOp Jt]Jz/1 J?w0 J?w0 iJ?w0 ,J?w0 J?w0 J/ nGWsJ6|| JH* JȆcJE$ JqV@SJ5vc}b%JUJCc J J W+JB ^Jֈ1J(lJub J#5 Jh"JS0J2 J /KJ:JfoJfosJm-& a JFP $JPJVJ^J|x ,JXr^i'JjfoJݐ , JݐsJ"ȣ#'JKP7?JդnXyQJk JSYJSQJ55JJbb(% 3J-dSlJ}Ӎ #Jm$J Ss JĐ%!J/)08J^UJ=;qX JI`(sJJjW JJjW:JĢ~ =JCGZJƶg_tJƷтz {;J*]sHJ*]sHJ^Jˋq7Jˋq7UJu`sJͳg'XNML JΘDJЧrJZɥY ,JZɥYsJџxZNJ1>HJiI k Jm Jm j J-mgsћ Jӎ ( &J("=J*gdJ% Jنg_O Jݭwh@s JPD Jގ|FdzJn mJ߫[J߫["J߫[J6;cJ,KksJ,Kk ,Jဏ< JW ,J "v,WJ?B[حRJ4 !t!J< JL6 J'" JFJ@ JԖyWJԖy JԖyJ-]oMJ;q|JtMf| J &VNJO巎RJcvJFcEվ +J& !J@a)J@aJzHJO?bmJv0tuJtRJ{ t JC| #-J?< i#J?< ,J?< {J!  JqfE9JqfE9 JtK(Tƒ K*E:K+5"r  lK-%sVK-o K.NK i K06$CCPK06$CCS,K06$CCK5s~_WK6 % l dK7Cv?nK7JK9ZK9I K:gzY iK:gzY -K>s# # K?%$K?5"SK?5" K?5"K? t#K@ bKA]B?dKA `vt KBh#KBkr%KCDڏx7KEUqKE!KF,ģnvKF,ģn KF9 KGj^2KI<} KI<}KI逸L KI逸L KJ;KK$KKWrGtKKe1q|]KL{$KMq"+ lKMu hdaKM DL" KNE rLKO{VKO{T KP?9DKP 3+sKPѾ_#(UKQ[ތ<KQ#s!KRp KR jQmKSW%KS>]KTF- jKTJWYKU>-zKUYn=  KWZmT KY T-gKZ{0 K\Y sK\ʑ=[K]]9/"sK^eDK_r72K_r7jK_2? ,K`DK`DdKafjKafj:Kb^QKbPB KdEn'CJKdmмYKe q KedKfчx?Kfe Kg6Xڜ<{vKh>z:Kh>z: $KjHqUXA v Kj5`&C Kj5`&C Kk8DKm 'HE eKmgFKn0+{e Kns\vKn&z>S6Kn&z>Kn1 Kn1sKpIBV sKq(KKqQ1w_KrlA< aKr_E Ks*{5 Ks*{5 KtLZZKt :LKuxTDKwg~J3 rKy"g6a4SKyM Kz"xz KzyIKzE"\ Kz[ K{  q K{t K| aTK}w# K~RGDÍ K~RGDÍ $K~m0 K~ &c iK:G C9 + Kz,ΨLK?e?KzKG * K ~*UK ~*K ~*iK ~*hKKC8Ki dUKF^K&}(? K.8_GKL>KSfJp KoXl ^K3C\uK`Ѭ$Ka*p8sK`p iK`pK`p eKNBc{| KƧ? KƧ?Kp*K Kz?K,TtKOKCƕ]\SKo~ K{~ K$P6)Kju ?|Kw \ KV%&KiY$ K?*V?K)R)KPgi# K҉b KK|vKBL K*%@?K^ KMtK3m) $ K3m)vK $YCKe Ke iK]oV KK5 (KFUPKn3 iK;ұDC Ky[?*Kx/69 K?jK?2K?K?K UXXmK8N㻺KKjyKmk Kxq6؛K'jKgrX% K & K & Kٓ:Kƚ"+4KO?KLe, l KGQRKa7, KZSK42KHr.Kۈ|, KSA KV KդsKHsVZ $6KHsVZKHsVZ |KHsVZ KbPKzLjKe^ K&Qj K8$oKd*8 K?gvKƥKÁw:Kr GF, <KmW:K!] h| sKDAKdz}KGKKUtKɌ(Kɭh>RRKɭh>RjKɯbY K.TK7kEغKKhϩ6 K0FʢNK1iqۀ K̲FbK|ņ"KLr Kumn NKXhJ K$g%KKHK"{K8Z= )K?okKЍĨ KѦF0K7{ K$z,K6 S KR"iE. ,Kԙh K0:؈8 K_`n? Kמ*KeKLN Kid{K戕_tK. lK߅>K0yk K{OmK⨞7/KXaAK; KdhejKdhe ,KH +KgDGKgDG K0ŵ9K"#&/K杓_Q' e K%UH \K갉۶: K_3^ K_3^ K ۦkC K6 uTK`Ed Kb!:SK- cKJ. %KtLKFx KnUS KKa86K$BRK 1-PK 1-KbK??d K&$&. Kf|Ky.hZKdhm LS / v L%LiS] LL9 L]u aLG6fA sL$M'_L L \9KL e\ aL ŝ L ŝ  L  \L R֋/C L T-^.L T-^.L3 L3 L3 LȨQuOLkqm L으/xLs,!.v LáNODL3%.?LI/)W % L$/(L?) L[?I ,LOSLp9 O 2 Lpbedv?LfZ L# LL9B $L4 LIin L؅kaL^#D4Lpeo!L LZ, LYR LYR LYR LYR L *;|L TSuL TSuL!h aL"UelKL#Z^L%PMhC L*C3 L*H*>L*L?L*`  cL+ 㽎}@L,&Q)SL.s(`L.sa__L.sa_ L/YD 3L/YD NL/M1L0*,] L2N& L2utX? #L3ՠvL3#YL3FD]L3u|-gL3~V^^L3~V^D'L3~V^RL4 VM#L4Z|V-mL4Z|V L53+L66hXL7JK| eL8"=H8E L:o ZFL:o ZF L;΢L;[[L;[L8XL>58z0L>58 a!L?6gyL?_~YHL@L| LAp'_LAq?LB:LErID ;LFmyRLGV$ LG\LGn[]# LGn[]KLHtLHDsOlN LHͼ&LIg5" LIm眺;LIgƽ LIgƽ LJZ{d LJS%ZLJS%Z LMBfaZ+LOJH LP jLP (*LP LPHѣ LQ=H LRQI 06LRQI LS.?: iLS&LT'2v*?LWV@7"LWOM0^SLYkź$LZRusLZƹ;rd !L\9 +tL] sM L^ d0L_=EeL:LaT#: Lc6-vLc6-Ld`X LeD`.Lg {p8Lh0 Lh/ Ljsg[E eLkbzLlؐ^lMBLln>(w Lmgu]Lm*(LnڡR mLnڡR LnmSlTSLpe)wLqbv LqSBLsk҈ Lv>? mLvހ)RLvހ)Lvwv*+ LwjaLy)JAlNLy1 Lz8PŸLz@ L|Z-_CkL|Z-_CjL}:NNPL}OIGj. L}. Qb L}Ӣ-YL~:~HjL~i9 L~i9dL_DRCLzL(9LnVLw:WzK L}kL LN-nhKL%*L7$L<)jILdD L#t +L[5c?L[5cLDwoL#D$?LlA!L3N?6\ LOY1L&'\_ LH Y5X iL~PlQL?ے vL?ے L (  L ( (LUlPK L6䴂 LjLp`n[ L;LjxLLR䡀DLR䡀 LK LN}< i"LN}< ( L@OQ L&+?L`& L0aLq1 3L$ L$ eLɕ٤'L#?1; aL1&sL1& $LLqo7`Ls. %L LؓeLΛ?LΛ LZ8D?Lݢ L Oh LUZ j >LUZ j$L`Q!1 L`Q!18 L`Q!1 m Lo~$, * LL6D" e LO"LBÛBL#&x5M]L#&x5ML#&x5ML#&x5MULd|\ L{RLz?LpC iLv&fF0Lv&fF0L 1$L7@s e LܹIzLpoLn8 L#dw Lj}LjSLjLjLjLv5i1 Lv5i1]L'0L8c | sL8c |Lb~ Lc<9&Lc<9&L|mL=Lֹn)~DLo/L_a8_ LkvfyLA)L1~.LL7YiBLɪr縄L.%wL8L6]L:dLʹx3Q L@ERLsI L\{kcLL; B L1ufG? L τ: L τ L/q LӜ[4L}iKL! ^LϟDLSZL訟 ^LjS&%PLELLjٹ_+LڗV S Lڗt1]sL ^#L ^LCLCYwLu8x $Ln'{7 Ln'{7L*:#LðzX8L[dN LS$ Lgi.L{ q LSLWyp ,L0i1N Lό Lݭ7jLݭ7LT{YLwLUrg]dLUrgUL?L,U\ L3Ѻe LD 8@Rd LE RLgjg LblLk~LL[kLZ%e L@[$Z.oL9FmLd ߽{dsL] Lp2AYLad4LL1HP› L3!UL['LնfK L} [LtaLtLpuB L\pkjM0glMO0!A!MhI MhI M+! MњIe MњIe MV!R3MU6M m #M cfC+`s M \ vM pRM_D$M;sxMAY# MA7 M4+Q)M4+Q \ M_$BlM?Ch Mp}T7Mp}VM?"%M-n)4 M; ,M; (M5R95 sMRvКM39)OMN# $M ITh| *M.Mҡ,MҡM %i qM lDMPC4M lDMP"M |{H # M"]{M# oˉLM$ʁOA ,M'pW4f M(Bv M)W M,mWM,C$ M-B7M-'0M-'0]M-'0M/{bj M0l M3h+eM4o \MH AMIE<MIV MJ?H8+MK_ۧMK طdcMK طd ML*gSnZ$ML*gSnML*gSnLML*gSnKML*gSnSMLiMLiMLiMN"ZdMN\9MN cm MPYu MRWww cMR/ jMRBYQMSŽ`MSF( MSFMTQf> cMW0o ,MWts<MWt n;MWt \MXSt[MXwuF_sMXwuF_s= MXG<_MY[=B` MY5WA8MZ,ry` M\K`M]RڻsM]aD`VFM]m,8 M^$]wvRM^cM_z իI M`b ZM`b Z Ma`MafMbW߭Bn Mb $McJRS McJR Mc(1em Me;1eMedNGMedNMedNLMedN MedNMf]BlMh3dZ Mhv1EMh^dMiּMiּMiּMkೋ^[Mm-?MnE%4A  MnE%4A MnUsYMnUsYMp@w|  Mq"Gf (Mqm)Э9Mqnc Ms3d=-'# Mspya2MtQ!Muֽp&MuֽpRMv-/3UMy~Ye8Myc 9MyĉbjMyĉb M{lF@ M~gΓ5fM~gΓ5dM%!MQ<MQ<LMUOAMYSMmD MSnMQMQfL$M; $M;jM;YMÖM^MÖM^ M~PM֦TkFM,U-< , M/MvMMɤ% MJDžF MR//Z M帵AM|!bMd8>k Md8>tMO*c MAW2 M]OAMLu# M] M 3Y M\M@M NMe>@M/ѕ0 Md=>Md= Mۂ \M>**MF'Mn/8Mn/8M*M*MŎ M__I?Md~RMPJ M"MoO_uY%Mp Ic MÒ3`,M= M^f]> , M^f]>M{JeK M+nA1] MLYmCM \MD M)_р{M)_р|M)_р M)_р M4HtMl"%tEDM&ƾM+&=MiK MiMFWJd|b M7N M#- M'7KjM{@M$`MQVa MжG}jM )M )M}|xb?M,<zMMxfMdžu,Mj M|f[M|f[MHpM­L Mõ$kMõ$ktMõ$kYM{ιMǛ,*tMOѬvMl?'RMɖ/ L RMȦTAMQJnP?M˗m?M˞r+VSBMͻ%PMή~BMЛ&jM;MW#݊?MkB!M;~il$MDgMՓUv MɏdG Mjp Mֺ? "M]p MRy7Mۑ 5ӣdM̏ $M,oVM,oVCM܈!(F MK=ZM┪5 (MRЯN M޸H| MрӳD cMkE?MlϪW MlMM\XU Ml+Mꈷ Mꈷ MH n'TMȁxM)[ MdWO Mo9$M<p"M} _jRM1M $ M1M ^ M䃰.mCMV . MRT9s M 8MeCjMeC M ^V %M? xZvM? xZ MR' M&T"M]eu7Q M]eu7 +M[A%jNMlYJ Mz MifjM)Qދ{9MEp1ܐA M@ c M RMO7b Mse MseM4pXMU͍C m a M0MN:BM)gbMM4;"bM4.< #Md!I \M ~~ݲM ~~ݲ M ~~ݲ M@"ʬKM* u8KMMUe M;T?Nܞ'b NUP~ NC?N a> N <N  ɝ, N ͖5s NԗANNESNg'm7YNz)2NRڽN>NTN& ) N+Z Nj \h$Na N`1NB~SNv# 2NiXNPjJN2.ԠiG N>Hvð vN@ { N@2*_ N@~fONAnn!DNB#IKYNCs  NCÁ[OqvNE_ NEGp?NEcG sNG9;KYNH &Q NH]~6RNI溪`gNNJro mNLIaNMk/HhNO,E JNO,E J]NOw NP()r NP/2T9NP/2T NQ*͙NR Uڬ a NR Uڬ NRW: NS@NS-NThBOvNU $\]NU7ƿNNU`j&NU`jNU`j NVZ7 NV}ܦ &NXUNYD jNYD jYN]uX޲[N](dCRN^9N^N_ 5KR N_Z^+ &N`SCLNay9? ,NbPq (NdtGYe' NeuFLNe0n*Nf6zkfNiQX] i)Nkz[Nl@pk Nl_Nl_Nl_Nl_Nl|D L.Nl|D S(Nns1(Nny|kl` Nnj:NosP d No䭄 Np%`t Nqu_NrpdR_Nrpd Ns*o (Ns*ojNs*o $Ns*o ,NsvhI NsvhI NsvhINtxsR7 Nu#Nu݂tvNvaNwBB&$Nzv Nz]$?NzdLN{I06{d N{" N|5*UV N|Z&$k N|xK N|koʤ -N|koʤN}sN}G N~{0_lNn$N@#GN4 NpkNh @k N4[N87WNAOgNwzkQg NwzkQgNwzkQg?N^xNƧ9P! NNU GN% F* NC>/ NNio"&*Nio"&Nio"&NpEۜU"N)YN)YjlN)Yb N)YkN)<q Nn1@J N@Ǻ2m NT;NB2N7P|9:Nx^_( N?fNJqddY]No_9N.v:_ ND"A<XNwMslY5NwMslN'[VtN'[VN.;NcȋZNcȋN,G -N]GtNy3U(Ny3NKNDL?Nm&asNexdNOP`/pNF,fNqrP N_ N[u 0N({ N{[ N{hNZ< #N_,| NK7 NmՎC ( N94,: NOƑtNg| _NSG>kKNSG>kNSG>kNs` NeNeNf1GKNo) N?Ѥ5LN d&= N d&=N6jN6YNq\5Nq\5:Nq\5NBN j a N j NB Z NxV N.7NµژJ \Na~QNçjÈJN $$N>o8N>o8Nh^"9-RNh^"9NA N\N\N&' iNΏ ;RNK PdNK PNiyN$#{ =D'NЛ֊B}N^]ZNӘ &P NչNN׌HNI@IVN١>NܻNqDNހOaf N3!"N3k l N3k lQN\> NzrRNlQN⌔4 N?ivN8 N+=YN+=N御`[pNoQHd NfN?OvLN/E{?Nr,X Ne]NYde#N JNsb?NsbtNP `@N\|NtT#~DNB \N!1 N aNR cNo,Go| Ne|ta N.z NV?N1ȆRNnXߖQv NN 5 N[T>O'Ъ1 Oc/ OWѸIOWѸI OIF O5," O:,;O)(qO)(q O+N9O+NO+NDO Z@Nj1O hIO l(nbO zD O U1YO \$O ӤBvO >(  O0dOd# O0}2 Ouye_O?cOƳ~O  O^p O_OV O" (O(pO~a O~Ow_aOyrOFga$ONՌ] Ox& Owqa*OQ  Oo詣O0 %f O (N$ Oz^ڶbOz^ڶbfOfV0Ow{:AQOT@I O'H1 DO l .dO"@i O"@idO"֔;t O"㖿, #O#, + O#2R7uq O$2^ O$(O%+CRO&}9O'o O'o O'o (O'hFC sO'Q58O)l6;O)i \O)vh iO*,WO9iXO:ˬF O;eBuFO;Y #O=6nljO=m `0 O>. O>:( cO>ٿ sO>.R OD OEN"OOF: OFMpb? OF`o OGFB8h_?OGTl5v OJu, OLw]`vOLh$]J OM+x3=COM+x3=ONFA?OO; UOQ~OToB ,OUKRqQOVeٚ OX|KOX Dб OX DбOYdT,sO\ O](!jb O](!jO_~O_TGB}ZO`yh{O`R:O`m^Õ j O`8_OaL:OdOeCak_Ofm"Ofm OgxyVNOh?"&J?Oh kOh  OjD/$Oj/9OjOk%C!|Ol*N㉱Ol*N㉱ Ol*N㉱ $Ooy) ,Op-OpI{OqrrgOr8J2]2OsMF/Y Ot v OwKìǢ) Ow`r5V Ox`rs ZOz-~Oz-~Oz-~O{1gRO{c y8s |O|%/O|%/O~Y O8҃O8҃Oro OroO^u8w|O^u8w O_Q18>OQC OCO>wO|}0yYO|}0ytO|}0y O|}0yO?#O?KOqCX* ,OqCX*OqCX*O3B O?):Oj3O0I7 O99 7 Oɪl{ O"u\2HGO듑qRO1ZOA`"0O|q` OKb OKb Oq@Oj jOfs# O|'I᤯ObĻ2O@A`O5 " O,' UOR OזO 3JOurp|! jO~EvO~E O˃O˃O%o iO%o OhNv Os Os sO3Oo"<$O9 ]:O[q =OתOȐ OYLL=OYLO5dټ ^O-x OBn`"UOBn`"!Oa0Oa O++[RO"%#M Oث2] Oi I$O3nO :jO3a]4 O3F̉O ezށU OBP OduvOV0 @ OVUA]? OѿgV  OēO %`FHNOocO }q? O$j~?Olbe(jO6} O6} iO37sNd OG OBd AOS9R'RO'!>T:OC57x (OVxK}O&OI˹וROihO{X<ZO} O" Oȅk"OȹBe&O0тOLOe%` O }B  O }B O̸fW O(mD Oe{Oͣ( Ocir}lROg߭SOv7Or!?OeO?9OLw[-vOwR%O־ UO|g $OΣ^ OB٤Oڅ\O]fcpqNOܬѢOܬѢTO)eaO4= Ohܝ1cOߤs OsO^@%Oފ:sO]3nPjOdFz #OV/\OY] 5OW/SvO^[a P>a P3'P1P&˅Dy -6P] C #P{GcP'D P{I$P{IRP{I#P{IKP{IUPWP05!tP05!Y P05!0PlAP3I1PRG; P bLPNK^bP鞸$P+5)#P 7n"IWL!P"sM+NP# P#4ٍ1P$7WJ -P%~S( P%'P%GN RP&b秃 P&eh cP& ZP'Qf P'ЕekP(`A P(7L`sP*_A1UP,97PRP-:(،9P.C2Xv%P.;Z} P.&P. UN@P/Jie P1d P4;RbvkCP4[oڅ (JP4[oڅj!P5lOwP6Vq{DP6Vq{P6<vP7P7 P7 P:x5Rm P;:B:dP;d\ͼ P;ѼP=mn0W?P=mn0W P>xJP?XYP@)} PAB]O[ PB'TSDPB'T PCqE U PCqE UPD&ٸz ;PD=٬HPDmtLt PEE*wPEK_PF:PGR1bPG7$PHPVz*  PJ߱2?dPK#rRPKЋ|PL ޞPM/?s! !PN ]CPN ]PN9PQPN9PPN9P$PO#Zt 9PP:[,tPPQQŒd3PP' PP R^[0PQp %PQp PQE=~tPQE=~ aPTM^*RPU[#k PU6nUPU6nUPUmPV" PW[[$]@ PXk풀1ZPY?mY PZF P\zAKO P\zAKOP\j\>YP\j\>P]t P] P綂 UPGQ#PGQDPGQP@ArPZ՘GPZ՘G?P!lUdQPʷPUzP PQkwD8PQkw$0PQkw-PhcEP|Pdʗ*$Pdʗ*$P .Piz $Px%1 $P6օ bP@NtP3e P-oP-o9Pw?PB !HJPR)Oy PR)Oy UPiu(SPLny*T PD PIs\s"P;!ѽĝkP;!ѽĝP? PM<8VIPM<8VPA>jP7kPqqP(P=8e-[ Pd@:P߭7zM P;P.;|P_'P7{P(U%UP_#PɬaPG[ d Phr?P|%9PkϡP.CySPo#P!w!P>5O$P盤PPjjD& LP`8+ P + P8˴DP_ƺ,P_ƺPmݝaPxyO< cP&IL PKoܶP  P( I P( I ]P( I RPD< Px) PϻMdP" P(t$ , PҐ?P\6QkP*09K>P*09 P*09 P*09 P*09RP) GPĭk~-P/ 4 Pǂ/PO"PȎjt !PwwdV;Pɩ/ɓD Pɩ/ɓD $PɸP) wPj1JP̉g\P̙ P]Rc mPјhPјh|Pҁ:kP?GZcP< M$Pլe .P LP+{iP[ C%Pv:$/ ~ P۹FFJS P3X7 PߕO eP<:5 ^%P<:5 NP<:5s!P<:5 P/+R] P1?P3&tPj@ %tPu7Pu7P:^DPh앀Paߔ PH嵏 cPsz |P&6 aP +Ї +P9?<ZPJP?) P-u  PJ01YPìtuP:5ź?Pon PvP:I vPIP~ P݋u8 SP} Pw{߆2[PvК7P2aJ PkM W Pv PNE]PFh/dPFh/PN+"sPN+"]Pf;Pwj@Pwj@sPwj@ PgNQ-dž2 Qq`^Q4HYQ .tQK?Q+afTQVQ+ Q Jʊ=Q YQ .Z_n`Q r \Q skEsQ Q  Q(zJ Q(zJ ,Q;i QvD'QZt:.QQHKWt-QNGQ|9V Q.sQ Ի/ Q^RڥQ!A -QȎNf Q8 Q^S?Qh?Q?QhRɸ*QD Q, Qc*Qc +QYz Q5F{ծ Q!ul Q!} Q!ԃo?*Q;]; Q;xsP] Q>ta m Q@LvLQC\`B QC\`B|QD/:2QD/:2QD/:2 QD4ލ QEƤa/QF*QF*QG JB=QGr QGch''QI$S.8k QIW6} #QIźSYQIN QJlzUQK #QL YQL[RQNoי9QOp) QQ"]~k? QQD*T+DQQZn QQ|t&h8QQԋ QR33v:QRdQRQR1 QRߚ鴧QRߚ鴧QS*!c%QS*!c QT N'QTۖ QT@$~QVw S>4QVJ'QXf QYav$QZMaQ\Sɪ Q\Sɪ $Q\Sɪ iQ\Sɪ ,Q];9^=x Q]FÄJ5Q]JQ]gv? Q^4IQansQansQans]Qb$QcQ&r.&QcQ&r.YQc< W Qd=zQdɏA QfPX?QhgIuQk+Bd Qln QlnQlnQm& Qm]tQm]tjQm]tQm]tRQmqj QmvQrjJ i QsE1J sQt?#Wp#Qt?#WpK QtlW QvjRi]"QvjRi] QxlVy QxE9?Qz( Qz(SQz,oWAaQzV Q{lD` Q{#C"gS Q{#C"gS $Q{H0 sQ| @Q| @Q}⨧aT Q}⨧aTC Q}⨧aTQ~n?Q~"z QEm׻)Q']QRjQZXLQj&fQJ2JS QFjQHY1cQ/ QEhɦ/ QXQXHQXP. -QrQۊcsQIz0 tQf|5vQnp]QCaQQZm<QuQuQ*C !QhdQ8TQ Q8TR Q8TQQ񾔆 Q񾔆 Q ЂB&QQQPo0WvQHM3Q6T^+Q%I^4 Qbc Q|w8 l Qa} QTeJQȽAq Q:_]{Q| mQO&Q8ߐ Q}(Tvj%Q\MtQ\MtQQrM$Q?Qֻ MR Q(LQ(Q-{AKQJ\VK  QK6S&Q lr_?QsQX Q5 ֐Q(Q[|@ $ QP0ևK QՊtSQPFc \Q;jQj=RQ{8!Qc3 $Qj:l1m\QQ iQDI|QDI|jQbQyK&Q&g^QFR %ZQ vbQm&RQ³H1hQVN QXʰLQ|v&QYhQGk#QGk$QvaQYQyBft-Qy Ql](QΙo@Z  QΙo@Z QQ;ÕQrc oQ8ζ QAsfQ {CQ {CQҿ!|QQAm QNL QԲȚUQ۟[ܢ ,Q۟[ܢ QvJQՖ4aQߴg Qˡ"::QUQغGkڲ # Q>`Q V Qٔ<3t%Qٔ<3 rQHQHYQyzϵ Qڗr#TQڴ ksQ ^QJQQ ,Q"P1NQMb QMb] QZQQsH Q| QfuJbt cQmP3Ý`LQY {x  Qz~׍&YQr Q|_-?Q hsRLJl$Rq<9+ ZRq<9+:Rq<9+zR=7*0e6R0m R1RjD R(#BSRՓQP?R١?R١R 6kT R .m#Rt|R¥>vKR3ERɆLYRL0m R*+RyM R3TtRʏWR ~E|T^ R!߁ArD R"phup 5R#Ϗ?R$jJ R%"&~ R&s}TB[R&ŗHJDR&ŗHJR&j%VR' EY@8 R' EY@8?R'R*4eR't>XR(&s@R(bR R(XPsR(XP iR(q0 MER)][ R)][ $R*'R+w9 #R,G):#R,R,HCZbR,HCR-k@HR-`B5R0*K[ R1+ -R12h? R35C\w R3PtDR3x]nBR3֟"CPR4qLl cR48bR48R5"mcR5"mcR5bR8H R8Hǃ!i R8U {R8y*}R8USb R9 \R;-`OR R;-`OSR;@ ` R$vRt/);Ru! Rvlt;Rw E=G?Ry|[VR RzÏYR|V?R|VR|AA%R|AA!R}܄)+ \R~qp5KR~:pW?RR^9b |RA|! RA|(R\ R\]R&1Y,!RolhROj h4 Rmg  RNtS^R{ŕW R6UhRR6UhRg<\&Rg<\&sRľ Rp7?QdRp7?Q R R_i R^/7s R_ (R_9UR_RR_R R%~_Ru$Ob,RPOg \RPOg 'RPOgtRI"R3UjRfiR$ט R2|I]Rdx R  R  RZiRRx2*R>.\, R-- ( R2甖QR2甖NR2甖RXDINRQGZ<R2mo RN~NR.~.RRgT= ^ R7e;',RHI; R&`}RѥG!R4m R4m RavN:*tRyRRlj(=HSRLLOujRLLOuRRȫSKRȷ} EFVeRȷ} EFVRȷ} EFVRɇ % Rɳv<R,/iR_Rӛ RӛaRʸ?s R5.rRq3`qR˿s.¦RV2 R/xkOtR/xkOjR?iD :RjV RόhRϷSB#6RЬȒ%N> R ;vR nWR*Z@pR,R&O )RٮVDRRٮVD9RٮVD!RF‚HRیߵHVWR۪mz ssR۪mz "RFt iRް8n5R$R#.V R#.V R$F RS0*U R߁-yf R5Vy+R gR g R^'#B~Rwy< ^R'$RKH0 R{sR:jͱR?K~R?K~ZR?K~Ry R< DR<  R:&y| R誄61RuN] RuN]|!Rh j Rh  R]Re֋GR/L(R<8ATy?R*{Q?Rzv~ iR0.RGņRCRGņR] $ R?3 R':U]R;+` 1 ,R1v%Rn_ RZ!YuS RR@7 REp~ RUӠzRTfuK R[2D+Rq\R R3j sS}GQ\+S}GQ\QS=P;QSA@zrS ,V2 )qL S d,!#S d,!#S mDMS =jS QcF#S &guN aS yV7S S U(rTS:"Sd&] SiڛpY[SII^}SE];~m +Stc (SoS֊N S A d>S A d SY[xdSi+#`'Si+#kSc&E S5/> S5/> S5/> KS"?Zȫu?S1S. S0SѬSǡdS߬ Stl2KYSScbSss5S_* $SvQLSvQSvQ S"Qk SY `~:SY `~ S|^wYS}pS\¤hJS9 gS h.BS Xa: S"kV(vS"/'S%$S% v S%=6BS%Dy S%DysS'QFa S'l&+ aS(7fS(7fS) h oj S)3{S+ea S+ɘE+ S,"Iq?S,nz6 S,rKS-4e꽉zS-X*Y S-[C S.i?RS1#,?U S1KGa>S1KGaS1V.S2Ê?S2+oS3l NJS4#EmS5ڭ S7԰9&D S7԰9&DRS8þ S98S949nUNS9鵮U?S;DJG cS<V S|u<QS>|u<CS>On[RS@9*SAt_?SBSCnCSCIPzvDSDQvҮ SE SE.b @$SE.b @R SEz SG~+USG@0gbsSG@0gb SGn7OSJz4a?SJ"ESMq>sSMq> SMq>jSMV"TSMV"TR SMƁ); SN SNhq SOM%?SOM% ( SPt (SP8i3N SQc> #SQqU@rTSRi j(SRt[SRt SR{DSRTt ST?[SUУvSWnSXZ1 SX<_j%SY:-SZ+3 S[_ÁKS[g+b? S[.@ $S]+ʷr?S]DxRS]$YS]|v S^ƢdS_{Jھ aSac&SacSbkdSbHaQSbHa Sd2.KSdD ?a SgNx$Sh&Shjdt ShZ3Ϡ`Sib{kU Si|܉G@ SiA[ea]Si9P^QSj6A!Sj@ւJ Sk~WN Sl-#SninwS SoIXSp"Xk Sq.7[SrcFSrе ( St}&Su3T Su[Sv4VK<Sx( " Sx( "Sy@ Sz<ǗSz` S{+  S|aRS|5DjS|0sS} S aL#S(As?SCx\SCx\SXzbBDSSXzbBDZSXzbBDS|uB sSM;{SԁV79SԁV79SqQS>9 S>9SIl׎S S_6ISLOLSt \SeaΖr* S5S5 SfC8S+Ҩ^S  S&k| Sz.jS%\?S%\?KS|Ԟ S|Ԟ S4[}I lSM <SX5J˸ STdSS GFdSb9LSaKE $=Sk>KE? S|v{ S{KSE]7S&<'c| S&<'c cSq So$FS SɢtSYbSW13SuPS違 SU8 N So' KGSnN>fSt~yM SsV3::SN SS_́#S\ S;68 SjY SJajNS[,v S[,v -SuC SS]5 #=S,{ ? SyJaSbt[S? k SNTT .S% SSKT' SoH! SoH! S8:S;_G5]S;_G5S;_G5CSVG`S\b?S(':tS(' iS(' S(' SPkeSrX"SrX[SxKQS < SK?S ?Sڱ|SGJ6 ShS:j` S ԖR98 S?}L SFxa$S‚L[S‚L[ S,I" S,I" S7>5QS-]k׶RSmXN 2 SŴE %t)SŴE % s SŴE % S'^fnKS1 *uR Sn^ bS{AS.Xz8S}Y򏮭QSI` S$ԟGdS$q. s S k -Sc;gMLKlSc;gMLSc;gMLSBSə SтiׁSҝx SHb]ZS;U&2SSfJO9 Sln}oS֙l5tS֙l5tSiZcEN4Sڤ5y%L%Sڤ5y%LCS5,$(S5,KSKk* sSKk*9S۝S۳ ݹSJyS8&S8SoaQS8$!4)VSWS~Lo S(V bS-}8D[$SEв܌ S+U S skSjBC7SdOS\?S\ S\ S~  +Sq g S3꩑#ScAϸ mSh9S {!StG*StG S\nS.v SmsTS> SfAS<3SIɚbRS3fg)S^j SHP"SI0 S ( SH SxOtSQSu 5`S_&Sڄ#YSJhvSJhvKSq/,SE~3S|%SE SS?yZSkTq#0 =Tq#0 T($0T(T56 $Tg]v^ #T Tn"TnYTnjT"U2YT1^! ,Tj3]T , T *z5T *zT *z T <=7ATW nT[4eqT[4eqTn.p TyLT !YTnre$T6y>nre#T;"t \T<> T<@L T=M9T=%7 T>R T?}a(-+ , T?‘T?ݍs T@*m c TAf-qTAՆarTAՆarTB1o&\TC@ڸa1 TC\u ,TC\u \TC TD .#TD~?TEFTEF TEFtTEÉFuTFp/% TG, TG;C2 TGH aUTGh_ hTGP ,TJTKe´ iTL<\XPjR<TMQTN\= TPYTPtTS:TS_PNlTTƗTTTu1S TTu1LTTu1YTWU TW^Cry TW[(%HTW[(%HY T\zPKT\5N] T^ET^ BrRT_|pk7 +T_t .T_C0²?T`T`-9 HZT`YfvfbTbU|R Tbk2Tc~GyvRt Td{Td? TdA) \TdA)?OTfO BwTf ZTf͐Fb Tg@:Tg@ gTgxL5 Th/GsRThpڢ a Ti*d \Tj a9`TkW<t TkW< Tk@zTkB/TmgN TmO02>4Tm,  Tmڷ) U TnrTn<MTo~C24 s Tp̅OTqNK  TrlrjTr߲1zUTtgqTt 7Tt jTu_IpTu_Ip Tuy莂Tw+ E rTwCFTxW򸻰 TyM}$DB TyM}$DBTyXl*?TzHRTzU͸nTz]T|'-ڃ T|Pn{ T|؍TiTKTIh)?TT8XYT#T$ZcT1KQ/Tv%* T| T |TމjPTl4!Tl4!TtW'T95-~T[" TN1oGT~CeTT#K&Ts4!I Ts4!IDT2&gn:T(lT(lTx|l; \TF, 5 ThT;dydT˻V ToEfAT>\z T\?TdO T?l TL1_T8ƏTD'c aTͰ"T};YT};bTFT5#TH#OTN,TW TWTWT1:T9c~1Tj/KT4Ln, Tt cUT%~ TLOOQT@iLTR[P:Tc5ګ 6Tc<\~NT"vXtT,Ԗ-T:P T:sd T: T:T'\ T'\ T TToTTo9T  aT sTqSTqLTPCڕT{#lT]T]T]T?RgRTqk T8 |<dT ~'T>e"T>e"kT&FT&FE T%GI"THxTF0sTEP>TcRT*TlS.<RT+s!O8T n] T` i T`bT`jT` TSHTHM4 ( TsݘVQ3TB <2TBW@(RTktKqTg4TYg}DT!|Tq 1>TRTTedTž< T«NXt T$Y Tc;O ,Tc;OjTc;O Tc;O T3! ?eTþ gʇ TQƃ&TƸNTT& BjT& BT70 3 Tȱ~YT"R i!TnFq~jTɒ%KTɰoIT8/I!T”.ZTo )Trq-|TTQtT􋦝$ T􋦝$ T􋦝$TtvT ,?T;( iT;( Tϱ[ TѡuRus8 ^TҖ@+LTǕTǕTǕTY=̋DTnft+T٠F !T׈\L W T؃kJDYT~E<ԋt/Tڞ ݿ Tm9YT'=N]NT'=N]T}JTPT"IYT.܇TߌgT-@J "T=T,toi"T_ TS T`sT/ T/ iT8(4 Tq5 ^Tyv[ >Tyv[ T tжO T X3 TEwPj TYT: T)* j TPQ w T bT T'|# .T\KT , T5j3JTGTGTN5ѷT#}T#'TvM|OTvM|TvM| TvM|fTF[fR?T;uV\TtzryRTollQ Tu TSKT ;T4 UgpbU* s6Unv?U%= [UU{3 ,UU{3 +USؖpq "UrUQ̿U=6U )|W`iG=U V1vU ,U1GߗU_r@U*LUE ,U!aAL ,UY͉U8oE^U1jjU= E Usv|w1Usv|wULο U>U-U>UKU>UPUgVUS25Ւ?Ǔ3$PdUz:>Uz:>Uz:>U]i$vzU]i$v:Uq Uղ@KU R-8v gU ʘچnUU!XK UU"#p { U"#p U$!_8U$eUKK U'j?U'.X U'ɇqo U(Sf ZU)V.U*;&B%R U*AjeMU*A-U+ a<U+ a<U+ a<U+@u U+@}Gf U,fy&U,&X,\U. tt U.ML:يU.!UU.&YU0^ U0.v ,U16}z1 ]U1KϡtU1ThU3U4D.)?U5ji'vU5VŤm bU6VLu ^U64[Q.M U7 k#U8J_e U8ōbR>U9b{ U9U/U90tU;Ŷ"CU<~^g5 U%Uz]<Z U>%Uz]<YU@{>?UBfN sUCs0;$ UCzL UD83^2D UD83^2UDLUD~UD̫ ?UElcUF %-UF8ˏ UF^0UFͰpkUG K? ZUGDSKUIvnUIr?$UIUgUIUg"UIu iUJUR cUK !UKC bW iUKsUK7]UK4':.ULsUMrQ]UMGiwLUMKUN@C_9UOq6 sUPo9 UR>t; 4UT5 UUn(NUUn(N UUQ3Xs UVzogcIUVzogcIUV$YUV$ UXh`}d UXƸ= UZ ?UZZD)?U\uDU]18kZRU^h0(~$U_%, U_~;{kUaMBdOYUd[ºUe'8$ Uf3BUg-n` UhZlUiC; UissaUissaUjR iUjR UjW6MUkCfGUk@qNUlN 'LUlN 'KUl cUm&6Um]*S Um~K mUnk #Uo^&9Uo^& |Upf|EY Uq҇MRUsk~ջUtlX( UuML]UuMLLUwgD"jUwu M Uw+HcfUw+HcUzb~U|JgU|T U}ݙNU}ӷlUͅU9CXU. #U q6dU| U}U;_i Uib}Y U HHU(.U"-Dz c U4-U`'UZU6nU}%FU eU}o W ZU(yWwUD**% U.-tU>6RhAUk/RU UB+UzcUz#Uk^ Uk^QUY<ɩ$U ]!U'hŜ? UH҅YUgA Urᖍ&jU*Baz%U*Baz U1&Y7UfpY UԆ Uy U!9' U9ͪaUDfEpU4 & URU4h tU4h `U4h kU < 0U <L URykU5f U5fU5kG+DUt Uv-N/ Uv-NU6݅ U6݅ Uw-U/Dl U-'#U֖˩oUgC7: ( UkN$U6+UiW Uu;y 0U"@0[ U>nw U W $UC:s9 UC:s9N Utx'U3UͣxKUnjxUmx׊nQU?p̾= U?p̾=UE~9KAUE~9K+UE~9K U[U!&b8U!&t!Uans Ui4U䢜ЮU<;hUj?UaUKȟfOU˽~q U˽~q?U0ݿ UiKhR U)R#URU7cN" Uƅ SUHNDUHNU.B׮͟D UƉlVU˜ئUv,>Uɑu$>RUʨ Q)U\#UQD)ssUQD)s aU˚ÎZQUHbcUԻ ,UlÏ< i Uͅu U͓U;@|U+PU' dUHh?-U]9U` #U` cU`Q L U"z-RUԬ~xR UԬ~xRU& U֋^f~ iUֿ-sU 4UUi3"Uڬ,f#ß Uڷ>8 #Uj.Uݠx%U!+i U!+i US|9 U(\!2#UCL}Ϛa Up#P sUIZUKUW<n]8U… mIU4F U'&ARU'&AU'&A U'&AU'&ACUdC UWzU @UWzU  U67 U67;U1ao}U<1sU"(E: U&),sEU(v ,U%sY jUW)g½Ue-]Om8kUe-]Om8$5UDð # Urٱ|#U9xB! V߶jVAVfe^VA. 3VeCV0sViͽQ Vl%T "V _V V ҳM V LY{DV i V _ eb9? V|1{ V Ppq VGRV2FV-IV V͵hIdVq]/VSfT VV2c@Vd_@^[Vo Vo sVT jVg- V E)J4V E)d)V&:/BVվ V꿦i]V O6XV O6XV輾?V!3[6]ݠTV!nXb V"p~I8-V"jdDV"jdV"jd V"jdV$^EZV%WUV%Wxp V%H{ğ#8V%H{ğ#8RV%H{ğ#8V%H{ğ#8V%-x" T V&rnr V'T;ԷzV(@2 V)S.V)_[;" =V)* V*qKh3V*r)>E0 V+O:V+O:{V-OHV/%rX V/CM !V0 :MQtV10i~J V1JusN AV1|s V2t#V2'V2?IaV3^V6fSp V6@L.fV8{X 3V8`(/ V8ܠsV9پLJY+V:cΩV<H RV<7*sV<7*V$&~V>>eL s V>>eLjV>>eLsV@VW2V@Fƭ) )V@wm[~VAE>vVAԗNVBb5[ VCnm`υSVDmn sVDu+ا VDu+ا VD*b"VH{J= MVH{J=  \VH{J=  ^VH{J=  VH{J=  VH{J= hVHYe3vVIQ5 - VJ]Ɩ#VJC^~$?VJC^~#VKm/*VKm/VL嵥-!VLRyV?VL7tVN( ]VRcYVR FSVT ,M VTi7JVWF)[/VW+xza: m VW+xza:VWQ|h)VW`0LVX]` l $ V[BM V\gLRV\yʄ V\lH@V\É|V\\_ V] d{J e&V^:]νVV^?1 &V^1 jV_00W V`V^ V`V^ D V`V^ Q VaKe5o0JRVbYV{sVchd|VdW2VdW2VeKO.MVg<{VgHǹ Vhs| Vivz Vlw  Vl Vl VlxfVl+B iVmT7 Vné Vo8t& Vo=txcTVp+ג Vp~VqcrVr(2)Vt2Vu2MVu2MVuE VvW9yH5 mVw$Vw/VzԒI_V|acy V|ϲX aV|ϲXV}A=]V}Rd`XV}f/-ZV~W D jV~}t V GCVCD7NVw(]o/V*|T)Q = V\rcR HVߋ Vܒ޺$VU B$fWVU B$fWV?̏ V&8<QVs 2V-x}QNVpqsiVqwXVN`mV: 3, V? \VxBt V2O Vδ 3 #VxW_Vj& KV\r9<[Vrs:VrsV|> aNV[E*V@a \ V?V nV:V:! V|;z V mc VHF<1OVHF<1ORVmg iVIFwdsV<;E_Vܘ5ws VS?VS?VS?VS?RV9Vb]K V,oA(UV?嵽a=V?嵽L9V-3A VА4 VGz(?V' V$\,Q VNl# oV[+(3/ V㎪IV?P? VaV<SVn= V @?RVCxPVZ~ tV5:PV9 V9V՚< VTb c$Vd L\Vd L\ V9~5 VbiVyT[V V}V@u"Y V?CV&67V՜P V=nVRWHb tVv@U V7 V7-R [V: h aV: h?VL*Vъ9 V\EhV7UAx RhV7UAx Q Vu%* VŚ  rVŚ  hV£7X !Vv& {V,B? Vl謍Vřx:{VƗo VƪN2^;V+ mVV!(AV!(AV@ V9|b!_VOBVÏFc VaVx V9V iV752Vν}jq^V϶ j6V'#kbVrqVђYAw+V[AT jVվ#oˈVվ#oˈV̢j?VGk/V aȪ cVyh@j Vyh@ V<[V2r# V [P5KV [P5V=$ Vub} dVW̋Vj]Vj]LV||V"Du"?V-w Vߘ0۹QVjDcj`VjDc?/V̀ FV6w f .V>o[?VUVZr VZr#VV SUVqGijVqGi V@,V@,VSqV`} V.Hr VAj cV" V"Z V" VV}|n .VYYdVSͣ tVSͣ $ V tt V/eVEd =Vn fsV蝱qd VztVzkV%LVn_K]Vn_K VdA V짫Ր VRu5l?VZDٻVDŽ+h* V譿/z[V<5+VsR׋V,3b;VTwY\Vx5V) VOi~Voւ Vl=[W|рW[W3C=W W WRN WsjOj9W ^aCW WvW EP,5W eZd sW]BZvWLѐ- W?W?W\_;WC_v0Wݬ_@hWݬ_@KWh#[]Wi}\0W3h>@W* WR) WInW$mW:h:3W:h:W #W!c Wj>ֳpWwW܇ ,W. aWzc3 W4Gt W(G8 W^Ih|W^Ih WwA[!WwA[] W0k iW畳b# Ws6Ws6RWs6W"j+LfW"/( bW#:wa W$KPT$ W$L{W$δ W%YzyZW%̟LH $ W%;? q W(>nD W(O a W(,*rW)_&) W*VbW+Я[ W+ЯW,["9 W.AD W0̆ W2c~E W2|#W2qf=W38ޑ W3X'yE a W3gz\D i W4^$æS|W4AvW42 W6ŮQ@sW7%?C W8Ur>5RW9zڭx1W9zڭx1W9ۼ W:7̓W:^<~ W<:-p= W>>10W?6l -W@?#l W@(K3W@(WAUl -WAUl |WANg# WA?jWA g?WA WAk#$ ,WCg,WF~8d WIJFķ WI$C2 +WIݟ?S WJDF_WJ WKߦ+ʀWKy8WKy8 WLBPTWM!i?DWM}9SZ WNsv@ WP#2)WP1?WRHby?WT|j WU_3YbC WVH _/WVH _WVH _WWF7TWYI Yx WZEpik WZ>jUas WZ6x9q?WZ’ W[g!sW[ûcW[֭A.3wW]n$ W]_MW^3u?W_GGm W_B+̶ $W_@娠Waڡr?WbP:NQ WcWd Wd#:8B] We:tWf+HOWgNYW.Wh{<Wi0] G%WiWh[;P?WjBWj}с@h WlqxPWmT Y WmgU WqU Ws/ Ws/jWsi* Wt3' ,Wt3' iWt3'jWt3' WtWtNtWws<' /Ww(,Z WyŤ W|3"&F|W}Mƭ1 W~*U WXWҎfڰWrP0Wc׍W|] & Wj?W5Ie W5Ie WaW4V&g}W4'f WKWư W٫4WGzMWy"ax+W! sW! W! W! WG5`WR RW k3W6 iW*ɸQ%WTdWay\{L WngH? \WIW]!]W]!DWlaE.WlaE.WX\'+WdQ, W^ W^W^ WWjW= WȶWJjWiF>WiFW ZO "W ZO $WS?WThx,We $WO-KWm0SWm0gWm0[Wm0UWm0Wm0]W W*wSWkWŴ#a WC*#W$ W3FODWyISWEgkW#+ W7 XW_y {Wctg({ Wφ ?Wz*Wz* aWC uW8I^{W?jGNWixA WViu 8WM fO ( W4夃WE<#2 W"!+WaיWs iL W[:C eW{8/' ,WD{ c W uW uW}Q Wފi+-W  gW  WfWIgqWA}LWA}W26?!W26WbWbKWkp W`2 aWjҙSWjҙdmWjҙPWjҙW:wW:wWmZK W jyW9/Wnԁ *WZ1Q -WH.9?W_$1=GdWècWŇvض4WS~ĒWƃqiWǥ?rpWǬe4W߁-WaN iWaNjWaN Wɟk Wɪ\ W 3D*W 3WVvW n&?Wi߇ W\g Wdk~| W;)-WϱZ &W_rfW<`8GWԑg W#~XhL aW{W8d. 3Wr.Wچ|۶/Wچ|۶/WT *WۦjBHA Wۦ0_ W۩+| Wܦ?h:Wݤ>\W~ W(W^yķWkGWߑܗ5 W%c W(ĮT W(ĮTW6PFvWӯWER3iWyvW-) \Wf\W WN1ވ WݶW/{ aW |W)ǦFWHs.WVwWbt>SWP̳mjWUT T W`bWQ-Vk WQ-Vk Wg) WŘ!SW6#GgWpu< WQ> QWQ> WQ> YWQ> WJs$1ZW YCvWDo #WDo WW cW׸t}. W:ʽ/\W>WT XMRi~ XHmIS~6 tX /& X<6bX<6bXDwPvXE6B XLRXiJ;% Xn (X XtXZ" XZ" X /vXRws !XpȀz(XpȀzLX#qX_X#t XuDfX a X&VoF 3XB+ZTYX쟐LXs & X79*: iX>n SXQw( XJTw X" X41jX7xDXØ$ Xg-XP([X0?XD.Ƭ $XzkJX3:P:X[FfX xASX!hL&uI X" `R X"d}{'X"ݰ U?X#%LJX%"WۂsX%`.֤ sX%V‚X%6G]X&`X&X'>u X'dPICX(cX;suX)[T X)]\? X*UY}SBX*i}DX+0AX,B*8:X,B*8:$ X."QDžX./[xzNX/^ U (X0tt.= iX0z"kX4? X4!Ϥ X4!Ϥ X5+ !X6u?f%?YX6t04 cX6]XDX8ָ~X9Fe VvX;Kc QXEnRX>SZzX>SZzX>SZz]X>.[ X>X?> $X?̣hV XA'ex,XA=XA=XA=XAZb>9 XA10 XA10 XB.;ۦXCeMXCo XD 1Xg(> XhgB> &7XjG , tXэ X?4XEݡ XJcXJc XQR|3X~%] X.{Xˍc[ nXCRa X*+X|ntGL{XtX8mdX8mQXKXP`r:Q?Xk55* Xk4݉ X~ X~X~ XmDdXǿGOZXǿGO'XǿGO!XǿGOQ XǿGOK Xz+v'XXƼ Xcb( Xcb( $Xcb( ,XB/X XI7zX&s.jXɶ:?XЖX)gvX)g X:>N XX" X_,Xv%˂X9;߁ XI/X} XXXnXnPX #X5|yXr@Df .Xr@DfX ; XɛRw& XA Xʒ[ XʣDX0u>Xx*]Xx*]Xբ/Xբ/XͶ_pX&.XІ3XІXЯ+X X)0r3zX5&ZXR|"ZKX, X,|X ֺYXgL&XgX4o7XՎfXdXdX։m xX։m rX؉c5 X [?XENXي~ fXω_uX:%tXοӼXuaZ 0 XXɶ X NQX1vH bX-ԬdX- X貱XhA X2)u`XYLXK< iXl Xl XsG|9XwjLX]2X}XX&~ bX?X5ݕ X1ZSX}f4XF0QXꑏtJ<jX:~Xd_LXd_LXeX֋%N Xg4 X79} Xrz XZR%X[?tX=]$ X.X'KgX!G7 Xúl cX!$ܻ X,DEcjXET?Xt2C$XŌ1X) XINXid pX XR68 ,X-](|XDXB13YZR$z zYZY0SY $YtY" ,Y""Y"K Y߼HYKM ^YFY]aYQZZ wY &|y44Y &ݷOgY j?Y j?] Y j?Q Y ](USY%IYX[ (YIUYIUSYIU Y` pK$YL Y(: iY(: Y(: Y(: aYYT YbVQYH Y?GWYJވk YIR+&YqyaO# YjY [|p\&Y C aY!Y$>t ,Y$mjeY%^aw Y%t.Y%t. Y%t. Y%t.Y%lz 4Y%lz t%Y%lzt#Y%lz Y%lzY%S;4 Y%+_?Y&STY&STY'Y'c3Y(B(ZY(SV|Y(SV$Y(SVY(SVf Y(SV Y(Q Y)cC$ eY* kWS'vY* kWS' "Y*GY*GY*GY+ Y Y,"s3 Y-}H:Y.AZd YY.V٫Y/^`!8LY0 Y1J&SY1w?Ǖ Y1(C Y1;Y2q;PY3onY3on ^Y3!)wY3{ Y3{Y4 Y4͑FpRY4͑FpRY4͑FpRY57dsY Y6[| ]Y7M4Y7 {b: 0Y8RY9/r} Y8K Y>o~RYA&C YBwN"FsYCvc5˔YC#*<VYDpZ YD}c, YDUYE`##7YE"65.jYEš YEŤ@c YGgV $ YG_YHGiYH2KkYZ3YI2sy ( YI\\$]YJz` YJ 0YJEڛ YJ\ɽRYKbG (YMZ"j/YMZ" YMᛝE mYMB!/ sYMB!/YMbhYNIO*0YNrxoYN+ V YOtCR~jNYQ4F|YQ= ;^ YRvvYS{-ϟ ( YS{-ϟ YTq}P.- YT;WiYV>y9YV~54U ,YYCw%YYHXCEYZ,?1Y[RkLY[$Y]I'jY]I'Y]X,VHK Y]#cєY^qY^;Y_}m/Yae&BUYb<}mdYbCrC`YcXЪ #Yc2ڵk YcNYdT8,v Ye npsYeqh Yf)Ԃ3SYjF:N YnܴYn'?YoEYpm Yq`/*Yq`/*YqF.>p Yr2M.@o $Yrw;Yt|YtG2sYu/ YvWk$i3 -YvY/1f<vYwU)s YwU)s \YwU)sYy}xEYy􃨠RYzza(YYzza(YYzza(YYz5Y{&18Y{,&RY{S *x Y|G @J EY}C'/4Y}C'/Y}C'/9Y~ok^ Y~ok^YR8 YyNYyNKYd2> $YJաzaLYaiwY`B]] YvX)LYv'~ eY@1z YmtYo¦ ,Yy* \Yy* \Y# YkU#YH`= YD~ sYx#IY9)EsY9)EsYJёa%nYzyb YzyYҧ?Y=bQY{C Y/ Y<0[ YeflA1YY< ?Y< s YՕds8kY a Yh1RYz^YY zY zYIpr>R Y҉!Y(M{2Yu YT.WY u@Y$YmYOe Y$,Yw)YPL\?&YB/J> YviYYT?N YcYk&Y1/b"Yxۣ iYmYѨ+R}YATJ|YATJYT)ݾVYݬƮRY9 #Y>021Y>0YsZ- YU Y XkY XkQY XkY XkYlG"@UY B:} cY [*- Y [* Y [*YT] YO&45Yk"{ YQ \YZxpY}\s =Yx&n-!C YiN6YA 2.YA 2.Y 7KY,]9LYUҚ%YUҚ%YUҚ% YUҚ%YsN#Yo]Y U Y¸]i YB-`xOY@j Y%䐀bY uY%Y߀\Y} Y3tdQYyd?Y ( YW ,7Yϻ (Y,BdY,Bd eYt"äYxjr:Yxjr,Yxjr YxjrYpd- aYէk Yӗ %SYӞ맧RY<&H2RYԝUYԝUYO>-Ya&?Y$Tt Y.TW̊Y͛EY͛E mYF YpAYދD?Y^ 4&Y^ 4"Y{ YeGp Y. Y5 vLY&b{?Y&b{?S Y: RY:  Y:  = Y4 S?Yգ Y5#O. Y5#O.j Y5#O. Y~I s Y$YGk YkUƀ (Yh"zY}7rDnY"Q ?Y+1 Yj/ "YfxdKYˇAK3YˇAKYy^xEY ZSY^IleYH2)YH2)Ye2Y: Y:Y wVY wd2Y w_YXb YXbYΕR_% Y ` Y3c:yYp45 "YY\nYml!Y9E6Z0r۪ZJ y ZMԧd Z,T Z7 >ZZd ZSVtBZSV \ ZSV ZhZY 4MfZsτ{NZͿ Z كfV Z ,Z IKv Z F(aZ%\?\N Z\ dJ Z"ZO.QY ZO.QY $Z.ˍ^Z Q@ZEۥ4ZEۥZEۥSZEۥLZEۥZ ZEۥdZEۥZ>[ZZ-`l QZ\/ cZqOCZX8Z‹y+]Z yKZ: i ZG8"ZyDj Z7rRZNIiZݑ_Zݑ_?Zf (Z|FZ!]-SZ"ᆬ#Z#xZ>e`Z? էU vZ@<)(ZAMt .ZA{N~sZA(aPRKZCareZCUY5 #ZC選RZDC,{K ZF4^ ,ZG,0' ZG,0' $ZG,0' ZG,0'ZIx᪕ ZIR. ZJ  &ZJѫ#`̶ c ZKp:DNZL ;, ZL#_N?ZM`ZM(+GZO ; ZP+sZQYP}T-ZQ+*Y iZQ{ZS ȥkZV/ m nZVM>?ZW0; !ZXSZZ" ?Z^RaM0Z`FfZbbA,%Zbz ZcDZe-I5 Ze'{˫9 !Ze] ZeR ^ $ Zf[yZ.{Zf[yZ.QZf?a Zf?aZgYd.YZgZ " Zjrj #Zk.c ,ZkgZlMUaZlR ŒZl[wZm\k ,ZnU&$ZnU&$Zo (ZonȑPZo䲳:RLZofZp0 Zq?}aZrM6 Zr5JMZs9wvZtސ2. ,Zu_t Zz+ǥ Zz4YZ{,kZ|?) Z}U*jZ}U*jZ~ *ZB%OUy$ Z!.ZC8Ztj ZNi-Z9 :E (ZLZ5Z[w ~m +Zy;ZP1ZP1Z#k[2~tZiUR tZF[AvZ̙<ZiLvZiLvZiLvZU a iZ$bnwv aZGE9ZGE ,ZGE Za%BRzZa%BR:Z|ZLޙ ZJ' SZ<&KZֱZZ1(#Z]e ZxlZZ =ZifZifZH! {Z4RmZzpk)W ZjZ7,CZ7,C i ZA:qZJw`8 Zo(]ZqP #Z\#<Q Z{t|v.ZݺyJYZD_ ZD_ ZD_jZ"~"Z1tXZ1 (Z1qp +ZIZ! Z yiZERZڮew ZV . ZV .D Z1Yx]ZK_sZuS1PZy* sZ8Z?ZONZtjZZ#Z(\Z*sRZ9Z8ZRZQZڡ4F/oZU幷p9Z\agUSZRZ_r8Z^$$Z [.Z [ $Z ' ZW"!Zu >W"Zu >W"YZMQZZksZ>i3kbZ :Zj ZIZIeZJ_ժe ,Zo ZMrLZMrZO Z8pDZ>Xɰ ZeZƉPѶl ZsJ1Z;]C ZȔ "p4ZA8 ZN✦[ZXޅ8ZXޅ8DZu½,s |Zu½,s?+Zu½,s Zu½,s iZ2FZ}Z%[(y ZuKRA^Z W= Z' (*Zа ZW34 \Zo5S6 ZڙNZr|3HU Zr|3HUZr|3HUZּ]MWZg%<>ZQkXZ ]$ZĺS Z7XT0> ZTEZ6!扜 ZMhZLZ/ D. Zv6 ZTBr ZSR؀Z Rs<Z2FΠ Z?n Z=4 [<q[T*V6# [.0c [5t&[H|e$@[ֽw[[pvШ [[h a[z@0n[-FD[-FD?*[o ([n*O i[›$5 a [jp [޶0%9[2H [!gT[!aBw ["n5EfLC ["[ a[#,C [$ 2\C[&.tQ ['7w̃ [(,;\ [({y1 +[(u -[(u[*+H [* [,y&a[,y&D[,y&?[,y& t[,y&[-F@~ $ [-F@~{[0|=I~"[1PX}7Y[2{|[2{ "[2![4nK~q [6j8 [61 [7;;fC j[7;sE+6[7hLj4 3[8vO+d=[89۲R[9Q7*,[9m)8a [9t?Q[9`~Ik[<5%[=E~tv =[>ꣂb?[>ꣂb?S[>ꣂb?[>ꣂb?[>l A+a.[>l A+K[>0XH [>do1 [>do1 ,[>yJ S[>yJ `[>yJ *[?*&[?Ib{ٔ c[@3x/ #[@x? [B\#%_L [Br>`ؿ[BΤK[Cʆ5M $[Fe&X [FpW[FpW[GY+s[[GY+|[I[J5_I i[J) [JN= [KƓ:g[Ki [Ki -[N,E [N,EC[O`g [O98tW$[P31`V [Pv,H &[Pv,H[Pai _[Pai[QTls[QTls?[QmE$ [S C4Y [SlY[T˸S[T˸SL[UfU[ULf*[U\LbR[W &[Ye [Zrɭ R[[Lp[\hyZ[\s9?[^$d a[_~5#[`!{%#v[`Ov| [`-VU'[aW&HN[b\v#:s[b}Vӛ[bG! [cG[cB8w[dlFn[e%Zƨ[etHs*[fO& [grr[h<뷼UH[hxH[hdwC [j1B*ⰑR[kC~ [kC~ [kC~] [k(v. b[l Yp?[l8%[mlKYL[pO_:[pO_ [q&h?[rF?R-[r@!H [sKgrYF [t_{ i [u?~b ([v &+t [v0 ]j[v0 ] [xk-q[{Rr[|,7? [|@D[}GM: [}E|w`[}I [~e$[~`N?s"[~폵! ( [SV[¬óR [cl[[lKNZ[lKNL[t&[_a[H[Eq|[Eq[k.* [}80k [}80k[rJg9:[rJg9*[rJg9D [rJg9 [rJg9[rJg9[Chu)[B6v([Jڤ[hY[[_[H:(@j[H:(@[m:5R [m:5R[#hv[c [&GU[[gŀg [c j l[3 >k[=lx[M?I[[Q1 [#/u|jR[Lt [y)>[vHT[L5[o [pl? [?e * [(:[@$o[F!3K[ϴ [z%R [Cv? [i [T}37 [HM [xVֺY [@o,8[@o,[D=@+ ^ [~[Ac9OW[Ac9OWb[Ac9OWY[āSs [V:`P![[[c5`[a=xt[6[,s[&׶[XUG[XUGd[gR [} [%Ww][{[k]\2[ i [|4r[;d|[)2 n[W2 [O9|v{ [`F7j[ֺoj[d˯' e[d˯' [d˯' [L[")Y a [@l[T\\7 aI[T\\7 e[Í [Í [Þr)[R[~Qx [G [$[*S[J [Ǣ:B[ꕿ$<;Q([ꕿ$<;([ꕿ$<;[ePr& [䍐+[pE`KA[}. g[ [ƣc , [COJ[̦([̮Þ[>ÞR [\kY [BB[:r[=+#[_ *C[F̓ [0$Lke[室rBf[¢[I \ [ Ac [XXW[9[;3[Ňս[u[݁}$[딨@hH[drҶ \[S9 i[p#g F[T4D[zG \[FrL[ h [ᄍP*J[զ [\'[bk[aqG [1]t[(`[n7A[ [iS[i[3\R[Sݭ a [c^c$? [`[$ c[ȂwD [grb [gr[>b [r [r[rj:[r :[r (#[r ,[ta[JX $[Z"й \˅sqZ \Z㵎\Dvܼ i \C#Xmt\vqxoR\ں \e]<) \v7]\ݐ \ zX \9  +\ӛ\ jb\ pF\ $NEe\ c40 \ c40 ,\ $V,:Y \E\}<8 \}<8\!\Wc9Z\ILK\IL \}nb | \Ӱ(\^K\m s\q(c)\xѬ \xѬ\gݟ \9F &K+\פS \/R \MD4\f4/ \ x,\ x,\94\t\$?\XV\3\^\r8K\r8K\T(2%\0g +\#2?\!Mg\!Mg\!.Z\#n4?\$ۻv ( \%ӘG$&\%v \%j \&̑w@#\&̑w@\(zx,\)6n?\)Xg \*Q{)| \+cC\, =aK \,`mdnR\,j 4 z\,ۡd \-Jr \0ϭ]Q \0 ~(\1&"S\2dz l\2ϏkK\3bu \3bu\5Ό \6Ai \6\VvS\7P}0v\7E\7E\8s \8 B)j\8 B)k\9:\p\9al $ \9al "\:)g͆ l\:-&j \:ٗ8\:-< ^\;7ҥ\<>B\<>B\<@ W\ a\`?\^J2\^Tڠ9\^Tڠ a\^_[ e D\^_[ e ,\^_[ e\aM82~ ( \cL_ \cYDи\eJ,X\gg a\ggEX\h ** \k1"Y\kǎ\lM?b \m <G\pY3Y \pY3Y \qh_ΛA\r)p \rgs\rt J \s8³g 2\s8³g \s" \tfo\tfo\tfo\u$Q=\uBd\vt8\y55NGv \zSp/\{QdR\|H2 \|$jU6d\}eΚC\~d;jV\~{w[V\V>.Pf \ V*£]\s\1 \1?\s6~.\` ,\1SXH~[\+6Y?\9#Vk \'05!\'05d\{ɑ \Bc~ \O\ \@> ]\"k\#:^|\HUt \#K"\K֕{k\'VkN* \^> \ S\zCus\ z,\l;gX \hh\LMp\^R\{B t \v{ \v{Q\ b{4!\+2Y \™ %?\ >\IE'R[ \@ \M0v\׹*\׹*L\׹*\(L5;\(C\`JOJ!\v'$\|4s\dP>(\Xv\t|M \t|M , \t|Mj\S9l\S9\ͷrP \P< \ӃS.\|ZB< \E>yI\& DlN\s} . \s 0V\Ft \FtO\U2 \0\\>r $\v d\@1\7QK_\@^ k\B^Q&C\׭Q \_S= \v( \O!4 (\;E "\;E \\\ \`\9BwM2\z  t\z  \z  \%>&'\cyגN \r\ş\et0D\t"\- \-\6ɠ \E'\şg\zW\;+j|(\;+j #\;+j \;+j \;+j\cA.Q\cA.QQ\XuZ\4!I]1/d];{D];{[]z ]V-] Ϧ] W@ ] ?] [j] d:M} (] 5s] _ZS] IU`] }=vq c]|?R])KYbK]YBek]@ڈ]Rs 6]fo@/]fo@]fo@]eL%?!]ܛ]!ZG]zV1R]8J]m ,]8t§ s]MF]]2dm;]3.$i$]4"\q]44"]5l*C ]6sX ]6sX]7މ]8 IBǞS ]9JR@ ]9}I]9}K]9B ]9~} ]:V넌v ]:-<U ]\]>FV]? 3]@IUuu]A?S $]A?S ]BS b]Bth\R/]Bwj ]Gǔ&j k n]GPFC]H~ Y]H&aP ]HN]IESTu]I^%E]I]jDs]J9t]K?)b]L}z L]L}z $]L}z ]L m f]M5]YSI r]Z"aiR ]\:GhQ ]\:Gh]\[aY2]\[aY ]]rTQ ]_ %]_]_/G]_Խ ]]bE , ]cG[Pr -]ci{!]dL'qd ]dL'qd]ee*]eY]g˧s ]hzm]i/xv]i&vk !]j$A]jϐZ^6 ]l ]mNٺZ|]oATk<3?]scG\]soGl ]s r ]sOR ]wD.> l ]w_\v]xErt]y9mXS]y9mX]{p)S ]{U$]|!m ]|p:- ]~䊟]!Rؤ a]+TL]Jj]ϫm e]Qk,K]"K]j]q]{] rQM ]hlS1N] 'C]B wD]I4A d ]$pS]hgC?]efRC]5d]%ˈ]Kh;x:]m;C8`} ]m;C8`}Y] g]N ]2* u ,] ]iI]K:`aN] ]#GZ]OIY];HgQ]"p̀]x\1 ]! ]s!p8xK ]vUӳZ]$&S]Ҵ<=j]Cj]C 4]C g]C ]c (K]8k]]s]4J(^R]~]\ ]M(]zG2Q],n|Ѳ ]8@:Z#] ]145S]O ]3d|e ]>IVS]>IVS ]>IVS]]bc ]X=Q ]X=Q]X=Q]7 Tp=v]>1+ ]z7$\]JNT]Xiq)]IyZ+]U]UL]&b]&bS]DlGj7]K"+|- ]K"+|-]ZAt ]k?]$U0 ]$U0]$U0 ]$U0 ,]$U0 ]F:+N?]gL ]_y]^ŌBk]T{jj]7R*BK]cVs]>{ 3].]k A],0],0]ȠD1[ ]kW?3S] C ] C ] C] C]]L筍` ]{_y]m pP]ĐϿ7]:9s ]M_A "]|D^ ]Ҵ!SP]ӕ ]*V]jN ]t $]&+ ]ׯ AUZ]٪+qfC$%]#U]#U]5@a](Y; ]p;wv] L! (]o&[Fq ]er>uK]HJ],R],R]* `<:] HPHv]V< eB]V< eBw]nݾ ]nݾR]}}CshD]}}CshR]oj]׎f]n$ c]tN?J]tN?-]n8w]|@ (]6i]&К]w_0 i ]w_0]B]")e]>q ]hv+ ]hv+ ] "윸]Be@Hu]>e@H] `]䫻],tsY1]@0nj]O"'( R^ ]9 ^;7^;7M^R'K^ &$^' ^P~ ^P~ i^7Oec^f҇<@ ^ IR5I^ IR5^ IR5U^ IR5Q^ IR5Y^ @@"^ {'_^/JE ^"9 ^ ^ˉW^c9VP -^X51N^Wb^՞ya?v^cA=LD ^|DIl^ܪ5^DH^kaRz^L2^X/p^%ܶ ^ Sn^")ҍ s^"=r. "^"vtKo2 #^#} ^#L4^#$^#a^#S ^$z%"O^%*߂B|?^&mVdWƃr^'d^(&hXyxP^(鍓iy'k^(4C^(.C ^,@]u ^-s6 ^-\^2EYc ^2ǕZn r^2X_'^2A^2AY^3ư&2 ^57^80L) ,^8l%}j^:'ng ^:ܶCQ ^<PFFC ^<PFFC^>FFxW?^> t_ a^?4KfB ^@zI=^@m@p^Bj? ^C8[^F&Z-D^GzO; a^Gϸ= ^G4/s&^H͘^H͘d^I Ş^KʻM #,^KÎ0V>^KÎ0V^K}ٺV^L^M?ϔ ^N\$c e^N=q [ ^N=q ^N=q ^Pw3+_9^P˓=nR^P˓=n^Qן c^Q$, ^TCI  ^TrBm \^Tw ^Tw^UN@[^U^Um^Um^VD֋g^WM?-Q^YҮs^Y]aS ^Y]a^ZM^^[6wzY^\#PoD^\Q/a -^]dGe^^lxjS ^_>;^_Ɖ^_Ɖ ^` p=f^`iy^`iy^b[d^b" ^c!ըO# ^cG'Ȇ^d= Z ^e,jW^e,jW^e.bN^fƻS^gL ^i"b>^i>TfS^i>Tf^i(1^i(1 ^j҉ODG^j҉O^j҉O^j҉O ^j҉O^l3;gd{^m =P ^m =P !^m_s^oLtY| c^oWE: ^qGh * ^q> i ^q^ ^se ^vetB ^wozE^wozE^wozEQ^wozER^w ^y^zaKE #^zqJ0 s^{ \| ^{ \| ^{pB^{^{7|D?^|:}^|:}^}RTR^~]Ud^nߟ!c^n{ ^o7*^1m ^y(NL^Q?^)D^  c^h<2^{>tga^{>tga^ B$/i ^}[ ^yl~-[ ^5g' l ^2rD^4T ^N2s^\MNz^"^4{z^r:X[^@|M ^7Wrָ ^& ^@>4v^FU^q a"^0QK ( ^0QK ^F^ ^F^K^F^t^ا s1 ^zf^r~[^/[6J$ 2^Y},˵s^)^,k ^^ ^"O' ^GIF*^GIF^GIF^ѽ<|˗^ S ^)^sʜH ^ML& $ ^7M ^զ _^զY^ MB^[ d a^ j^ ^Ƅ* ^aK>t^aK>s^aK> ^ u6?X^.ΐ ^ R*g ^ 85 #^;m^pIZ^ w`=^!kСL%^!kС ^FFX^u^L8Y ^ost^z?˸ ^^X] ^ J^<j ^<?^c@} ^JLj^0iYkM ^À l^Tl ^'D^pGSR ^6f!*^)р ^v$ (^æ9F =^:#t^B<^+ ^y )' "^y )'W^ŶV`( ^ ?F5"[^ ?F5"^ . ^ȔK?sSR^ϨFzg^䪪'^ɶ?^ɷ^e+^e^'`L ^H i^-U1U^F%+^S*5, ^iLP %^f$ ^f$]^Ͽvw:^Nw{ P^Nw{:6^Nw{ ^ѵKF^Ӕ N^Ӕ  ^Ӕ ^ӹZR; ^՚'ѩ]^:nb^ءĆk c ^YCvz^٭^o5m ^^tER^㮉5 ^ ^t^&”4s^zwd ^:^Z`zoe ^;+ ^*R $^n.+s^M7 +^^c?^3B% ,^> bΦ^> bΦ]^Tw ^:t ^uCp^Hٜ:^Hٜ^}kv9 ^}/;5^Hnn ^w^ld^,5R^?G$^ [^rG< i^~~ j^LZ^ثϷU_b^ԤaY_\_-7 _-7Q _OR_o\,L_1u_s^h{ _؞Z4_Lt_ cF_ B= _s R_'l_  _m -_ ?_  f_  Q_ 9_L}㰛_~;l _ ðh_ Dtc $_ %~_ %~_ ci~i: _ |5P7_ |5P _ |5P 3_ |Ϗ_ jq,Y_ jq,_H%_m L _ !#_ Ѩ _=KltS_qNM _KYfĔ_KYfĔ_W*s`"_l_|h'm_|h'm"_|h'm _ 5?_ B>R8_[@S_[@S_A2} ~_)AM_y`6(S_y`6(a_%(@A__%(@A_|c_! Gw_"Y=}Bl9_$<_$vI I_%[|S_&qyYS_&g'_&g' \_'r&_'56_' Τ\"_)g+ _)g+ _+dD_+%1%_/!N[_/sH_/r _1aܨ~oS_1Sc_19 j_2zڲ_2zڲ_3I*[_3v*_3OU# s_4IsDSJ) _7;W5_8C_H_8Uf_8<_9_|m; _:'!_:'!]_=lxa_='|e_>CA!_>$^4!_>  1_?|u@ _?Q[_@5[S _@5[S?_@5[S _@f$Y_Af_AR$| _A _A}H&SQ_Bn1h_B6$_Dgj _Dg _D_Em#1 a _Ev?,QR_Eq_GhWC_J؅!D _K'BG m_K!d_LbRS_LU! _O/_ܲ _O{), _P0L b _PrӱQ _Ptdq?_RC._TR_U,p_U71_U71_VspH _WqR%_W<_X9/P0_X<j_YE_ZBd _ZA |_ZA _Z˭C_]vN _]^J__`+_`Qn@Y_`&MجF_`.ƋНJ_`.ƋНJ _`!Hu_a H;1, _b]Ϻc%#_c4_c4R_e-C9 _e\fdKd_f~ _h)_i_i_iЁ" &_iB\)E  _l9 _lѠk_lѠk_m?_n2YI _n^f0_o+8_q9tbs _q9tb _q9tbh_q÷D 8_q÷D|_q凓_sΙT_sA2_sA2_uM nԑ?_u.2 _w>lh_wAt _x ZbYZ _xL7"O$_xsV_xsV_yz _y̽Z_z|F3 N_z~Qz _{L?_| M_}unm0_ b _ bh_w7S _o'_ˣQAB _ͽ"$j_" _ݮ_љmZ<_B4u_+ۺ_ E $_k9ˤ_6B-1 _]Y\_e _DV_DV_ٱB`k_ٱB`k_ٱB`kK_ٱB`k_ki@N _yL$$_ڑ>-_8g _-6 ~_G _܄R_7 _g_qR_.̬x _2cy{a h_ _RnAP_`{UL_/J'?_a,Ś _}x _ bKV_ bKV_!%:Y _셥D6j _HSZ e_HSZ_ئ D _덦 vv_4 _[x _[x_{"d_H gU_|uc 3_! _\9/*_=4_g!_ #_g!_ _do#R_Cr r_nͣV _{= _OB _Ȟ !_Ů_L%lU a_L%lU ,_#" a_s9'_s9'`+_:a`z(g_ `h`Ͽ`? k` y)`Ҳ `G `Jô` 57^n c` g ` gD` 0C ` =@ \ ` ^;Ip` ? `F_`ˇh`F_`ˇ`F_`ˇ `(ڟs `(ڟsR`(&6 `(&6 `.1 `ݟ# `rn S `0u ?`bU2`ׄ A`s4 `"vBX `uh`PQ1`j!c `R5ǀd` ͻ `t ``کa; # `ڰha `ierW# `.7k[,` ]j`͑z`kN`!\ II|Y `"5X :.`"5X t`"5X a `"m%֏`#G -`#+[Y g`#tg %`%aQ `'^t7`'oiZS: `'WQ `'2P|`'2P|!`(6rq ^6`(6rq `(r $`)ۑ `+/ R`-"3`yU `. ˌ i t`.YY`./⠣?`0=\`0=\ `1`^R?`1o- `3t}`5?Sw]`5'`5'`5'`7Po-R `7) `84%)`:Rh!+`:Rh!:`;4`<+#`<1 `=\p5 `=uD `>Ԑ`>Ԑ `>KK`@劍?b`A>4Qe`BE`Bڅ21b`C ^L`CY=`D 1n 2`DP!;r`DP!;r`DP!;rS`DmfƤF:`FRhD9y a`FRhD9y ,`GD `GD `GD ,`GD`GDs`IS>#`J0VL&I8`JME$ `J١7' ,7`K Q`K K`K K`K_8 Y`L1`L1 `L1`M'{eT$`NRi | `NRi `O?zY)R`Q2e/P`Q?90`w`TZmoW`Uz u`V|p`W2{ c`XQ`YU/̸*`YU/̸ `[f~˼j `\ *Y>j `\&M`\ԄǓL =`]AB@`^CS`aQ&Y`cӇ8> J`dĔHjL`eM P `e j`fž`gCyls`hq+q-z#`h֔;`i$M `iPeN`iPe`iPe`l)wst`l= `lTЪG`nhZ`ow`ow`o?"-`oԓl c`qܱ j `q=W`t"xo`vE.`vޣA`w8NmY `yE]KC`yE]R`{nKQ%R`|V܊(t`}˗(uj `f9`5F;s`5F; e`5F; `Ʒ1`[e[#`[e[`=a `h#4? `9 Bv`]~y! `os74`?Wks `g|[`JvO`* -t`Se/1 `u =9`y@]dpd`4s`"`\DN `& (` F` `))M`]gXe \`8xI'[`~}&f ]`OQa`:C ^?`@8Dr`"$`(9Q"`d `qD `Jt `Oѹ&`lX͇{`lX͇{`?T`ˊ( `P]f`lk`wU|Ѵ `q<`+3<F |`@l:`@l `8[`i8`TE `ȟ5`ϬDD7Rk`vw0 `ؠ*R` G `FWac]=;`FWac]= `]b n `n`1}7q `g9`&D`kE# `:-|.`:- `fW`fW `y;{ \`OvC`XϑrV`} g`Tfi `g aQ`U`co\1[`j2 `l2 `Y ` Qý}v`eLҤܱ `m/n-C`վ7Q e `վ7Q9 `վ7Q{`,'g[ `"sn`Oe ` ( `šy=s`»s `?p:` }|8?` }|8j`T㕙 `Ñ(W~t`#9w Z`Z ` 1%p`Ɓ`ǂJ k`۬Y `۬Y t`ex[`m  `͍`Js`J`[cs`Ϧ75 `Q`ML `NW}MJ`hu `AQ `}Fe`ROw`Ŷ'[`Ŷ'[C`B>+`B>+``7 $ `s:ʒ `se)Dp`hQh)$`b `9Zk% `گk`S& `۝ vw c`Ac`?>b `Y$%`ݨ6` Ѵ`\iX`kBJ `hs`ht `h`hk`! \`KvFR `-"s `\8bv{`>2d `b[KY`攰t2V`攰t2``-r]`蝘/W `~ni`jH- `鿲 l`x˩`PP o] $`%`%`%``x~`i @ `i @Y`ﰨQ9_*[`eҫ{ `ռ (`ռt `o? `xE+Q `3h$?"`TZq `Ѩ1R `&'t` K`ѿZ`IդQ` E ` C`kFb`O2`Eugd `^ 2`Hv`v,.@`.X&?`.X&s `V7"`c5J`=G: `2&# `Fr`aZG#Ua?j3ͨ NaAXr'aA? aBH aEU5 aGi3!T -aH 3aHVwzJ aH^0C+ aH}ݓy=TaIPx aI7x aJ˙aJݸ Z j aK@ aL"F4?aM'T aM=*2aM=* aNWaNƋ aQ; oaQ$ ۥNaR w* ] aSE .rjSaU8M` aUיxaVүaY[=_caZŮl a[AEra[gUVa[  a\ݨuuMa\8 a\8 a\-a]tSBa]>bJ a]o)a^,䱢Ya^,䱢 .a^6 an5ȱan aqhO s aqhcIaqpK8as ڃas ڃ6at$7ߙat,Fat3 ^ at3 ^au3s.JdauabQ au;avb] ayAZFQ ayүazrI azp`ۯ a{ <#Ra{XIa|h夈 "a|1 a~.վj a~Ou$ a~g;"a61t)$av^^ av^^? a >Ra aZ,WjaZ,W|aD aiTo a/C0a/Qa/aaUYaWZ.aWZ.aWZ.a6Raf]9:dta~g/a~g/a8';OV] ar naMs> $a~৷jaQCH aV>^? aY6ga` }9]ar@? a' j!aJeaEUa|9YC 3 a{.?a4a&ۋa0  abھH0:a'v af`7ٓSa1{l caMtZa]a !Gza2ja6}X |aq8b aú'S#aú'La#va%^2b1aJA% a*W_pa*W_qaI]B- afGa"%S+?aH"W8aYNh aFUc gaFUc a8ajץaDRae6aƢaƢaƢVaYBV ajNaBX aP+X aP+XX aZX aEa)Zdka)Zdt a-~:a" aU82 a̾ +?arN1 "bHFO b:b;r7lb gbEfe!bEfebb\b]| b[_vb bO>!bO>? bo7bo7 b WHs!s@b b|]\qb 'K"b7ឍib^}4Wb♺o2 b)7babb"nf aPb"nftBb"nfjb-edSbXk ebly -bL,P]b_n4b_n4$cbAszObH)b4_@ba[M bg'v[bb ,bx' b _l $b.W;PbeWbeWb}5" +bҬdD bҬdKb?9=aCbrQSbrQS $bF be_bE/b!]l b%>Prvb%h #b&iQb'흸% ab(jڋ b)eam! sb,>nոb,A  b,/sb,/ (b-g-HL b.=* b/FC b/Lb/Lb/׏ b/Q+8b/ԁxehb/ԁxetb0!rtiXb1 (b1b2&b34mb41f!b5mxu;!b5'b7 hLb7<M b95e|b:Lrôb:6h bA ? bMCw@tbMCw@ bNV cnbNV cnbN<I bPN鱋q bPN鱋qbPdr6 bQH= ,bR7 kXS bRQ! bR%X\bS+~jj3bS+~j -bS+~j bS+~j ibT?kbUk~bUŇcbUŇcbWVbWe:+k bX \Qe bXVLbYU U b[mo!Bb^Dcb^Tu+ b^oQb`B+@Pba lVba]CbavL䗺Rbabb-_bbb u+j bbw:<b bcbcU be% zsbe48m ]begJ- ,\be=beϓbfsYbf7qja8bg|"ɢ[bjWB bk[ oZLjXbk[ oZL $+bk[ oZL ,*bk[ oZL bk>bkNtblt./ ablt./t.blt./ bl쯠bm J bn% bn~~jbp@ bqt brT[ٰb!QhP ^bmÚ{bmÚ{bD?bp_^? bp_^sb3mlzb3mlzbtIP ,btIP?be " bk<|6t(bl~ bcj,E #bmZbͺbO<Lb| bpka &b}7 b7kbN΀ɭ$bN΀ɭb8q6{b% bV:DbV:DDbr/= $bWM= abWM= bPo3~b˂ bƃZ jbCb`QJ bzNb ] bZQj ,b- ]b6bc \[bur gb?H@brK obrK obrK obӔ Zb;K? b;Ksb5 b5?b|5ib|5i bw+ b(ܗbL^b );@_~? c {ӫc z'c \cы Pc'[k 'c(FuBqc(Kc+oz(w ac,|=(c,|= c-8 ~c. bH c.\k D c.\k c1׾j'%c2,',Nc2- Y`t c2iL;c2iSc2iYc3W c7)j?(c7)j?(/c7)j?( c7zNc7 c7mK;@Ec9iϒwz]`c9\65 c:#-Jtc<L2c=Kuƺ'c=Kuƺ c=Kuƺc>Fܒ%c>Fܒ c?, c?, c?`sTZ cB=yPcBQE^ZcB/ cCS=s cC ۘcFBK? cGN(cGt cH9" 'cI}>C:cIꎴ)WacJ'aOtcLg&cMiߖ` cO @0[acO_W=~,cPO( cPZ=TcPs cS`g;; #cSiRNcSiRcTl{ cU3͞|cVTwfcV icW0w:CcW0w:CcWg*[cXcXStcXScYEyit) cZX-pcZX-p -cZX-p:c\Pߣc^N}|c`pxc ca-ܣcbnONccnڥ) cc\/zcd,҃/ cdwsD cdaq1cegE0V|cebp $cgU:vcgjSLcTnScTnSc!$נcݩ}~c&c^ cCc.IAcԨj2U7cԨj2cԨj2 caA<$cQ:c!:屃Uc!:屃 c!:屃 c!:屃 c!:屃 c4hc2H c|Qc|c'B caKc;YC c;YCS cDoKc±Ncic³XjiKcÂZopcע{vcĭ֑ cHL^ ;cƩyg`cȒ,(cc - c˵Ncťmfcj:1.vjĉN4PĉN4Pcͦ0 (cV!ndcLQVB cfT cfK(3cfK( cfK(ch5P$c㸿Yذ csvc찭-Jc찭-Jc"c #Nc"" -cWxq cĖ j,c+DIcsccgCtces;ro?cZ06kcp c S cz&<cV:D c_c?ǘ1@ ccZcZcZdc\Qe d) zls.d5%HU[dڧ ,d5ޥ ad5ޥKd5ޥsdMLds5 d âHtd âHkd Md ni$d ho+'d mSkL d mSkd ^5vd /gMչ d-ɏ |dsdp P de$R de$Rd@ N~d7ܰAr% dYnVj.dwYdI[dI dul3 dhd9P dPZSadPZSdz- d;zK,d;zK,dqQd#(32 $d,9dd"HS} d"HS}Ld"HS}dYC[dYCD dzLi d~>d7?? d-+ Z d'V_:d'V_d'V_dt; dt;9dG|d Od d Sd_9~d mCtd!=d"A{ 'd#R+=HRd&.0 uCd&P3 ,8d&45bld'榈[^Ld(8-d*/0 Nd*/td*Kwqd*Kwqd+uI?)s d++td,Lkmd1PZ_iQd1"d2tp (d2tp d3+*|| d5π^nN d5J|d5ORd6 -=d6Řd6Řd6 L@d d6 L@dd7,.3d8w m sd9Vٽ?d;|+_ l d<Is&d<$ d=T^ d>e  d>} Ǝ" d>-G}d>Ժ! d>Ooױd?63Mv5d?r)K9d@X!fQ;dA1B! dA{,dA}dBjNl Ć9dB}N-dB}N-`BdCJtLdCZ YdC/UdDm"hxdDoBdGddHxBdI~:dJ!BBʚDdJ8S~KdK5p$ s dKJXW dL@ dSKSx dSKSx +dSxu7$dSv1*dTQ(QdU@t.LOdU@t.d dU Wn#dV ?dWsK-D dWB|UdXQّ+ dX^X ,dXè?dXè qdZ|FdZI0J (%d\<NKd] , d]{g )d_ZH d_Em #d_(wPAd`B|c daO+lYI gdaIF dbu_ϝdbͷY) sdcQqq% dcD (-dd1Z  ddQS dePe`5& dePe`5&dfvdgaSps"dhĿ3O?Y diOfr dk2m3?dkd& g*dl ]dlu.;dnj~1dnj~1D!dnj~1dpD.B dpD.BdqP}(1 \drKo)Fdse.dtoS + dxy)zdxodz<{wX dzt i3 d}TS/ md~ EYd~tn \dj jdqA IdqAjdb^ْ*db^ْ*dPP Adpdpdxֲd;(d;Q d -3d.?)d.?)S d.?)Ud!! dUσ d݀3d ATZ d}$d#Udꤴ4d# cdM#dl sdtO d0f]g d0f]g $d0f]gd0f]g df$hdk} ed.(VYKdͨ d+ޢ-\d/ NjX1cd\Jd\JYd\Jd\J d@ 08"d d 5× ,d#6s sd#6s9dW2W:dY4r9dd^8 Dd[-!d&Y"d&Qd4?dd{n{]d{n dgz -He d>=3L-d>=3S dN4dN4td3>9 L dƿ}?Dd)n"dd)n"dQd)n"ddJ t d #Gd&uԿ j;d5g`xY dQ5T 2d/ v d+vmp? dkzm dkzmRd:w'D d ]KdkӎDdyEk  d h$ d p8dIdL edf$rd4B\ dc.d1jULd7z@dYzTdYzTdYzTd;r,d(#d~Z d< &d< edV tdV|dd7=  dQnWdd7h d7hd7hd*7l[d*2Gd"y"dkRd8Fd9VZ!tdq[dM@dM@ d]tdťF dgϲv dƼm3dǘΘ`X' d@sdo@9Bd k dEod_ d3E) d3E) d _!<d^&Wd >d-&; d6h}Kdս8-aLdս8-aSdg{?˽jd~@] \dS d dKx -dtTd;҆4R d> ^mT dޓ$z;3 d d'F.d߲* d߲*jd@W?d@W?d&EW$d&EWd&EWdzi4 #dH dqt! dir": dn- d|~A$d|~Ad 9AGd莅X\d2udrP'C=dUd :* d@kUSdQӸ` 3d\աsJdڏO # dP9dg:dw]Vdvo cdbP['dbPd%@t d6*pd6*pRdg d"KdB!d^ld Bl Nd[+dv}D e9dJ eZ4 6GeZ4 6 ,)e3 + eM)v e0?eU( e"oö e)Ӗe֭speo3IL9 $eIse &he +;= ve l{G !e f e fKe y;qe g` e DMw !erƂu erƂu aerƂute~wU6 eܤ+ee`e+Z e+ZLeϴ$T e›<eu>deu>deuz&e侇 edSece e6o9e$eaieAFeAF!e2Cl  e$W .ex/nei:SY4e+ e{8ekG e? ee e x' e $U|e!LKpe!G? e"HTBYe"HTB e"T\\1[7e"=e"(G$e$@o'& e$@o'&Ye$u:e%9e%2m5e&.e&Q߆d- -e&^De'*ͧe(DDe(3e(JI%e* e+n*&:Ze, OFe,d4L e-Ocfe.0*seide.0*seie/6#e/6#e/dd e0I.Re0K/A e0vM e0vM e0\Be2 \$ uqe2 \$se2N e33%Re3@?e4l e6mRue8 'DH e8 'DHe:Ą(] e:Ą( e;M+UVFfe>* YQe>^ՙVLe>M e>Me>7"tRe>7"teA4iheB'|s eCXbveDr'"LeDu ?.eEg eFEç eFOeFUyoeGL2I eIԴYeIw[_eI^~ eJg{ZwReJTK .eKub.NeKW eM eP42ajeP42a (eP42a?eP42a eP;CeP;eQ=z eQߧ,>eRuHQKeR ]eSPC seSTP- ,)eT\eT\ReT\eT\eT#: Z eTC8 eToW݌eWEqqeXn?ZeXF'SeY_kjoeZ3)eZ@(ӀeZ e[gΞS e]}_ie`(}،Ye`Pאe`n<x eanebكfeb7 ec  A iec<jec< ec<Sedkee8 efTU)eg^cjeg_I<?egegehߧeh0Z%B ehq u{keiRNjfeiRNjei蜏5~ej'ej9[ejt ek$@${ 8em}:eo6j` eqij8=5L erer qW\ <et;#E>y$evMd@] eyyez!qezM:2e|J,e|J,Oe|J)gPe}e~OOI me-C j e-C ehڣehڣehڣehڣed*ee˖R7N e\ IeK5eʈTe=~leGUx ae.euRe6a +eem.?eLtLyxeLtLyxeLtLyxe߈ % eJX2/e4}@5se|/*p e8Leiex`eػ elcpe9Z iMeȍphe/~eɣ嵁rYeɮa.e =N eNU/e͝Ȇ} eg$e2t/~ eϴJfeV|eV| ec/mVeb0MEwe*e?Re,# # e5JI eE8e8t[ezN}RqLeȼc e'+pe|aKt "eݺΤ< e VDN eyh@e e je'_Jf e .e㉎tF? e`CJe2ʛ e%Ce稯w||eqw ze+Otje]@V+?e-Be-Be-BeUi e *eϻMZ6EeϻMZ65e嗛ȷ|e2LDe2LLCe2LS e2L e] e,q e\3 eUW >e?Z9|eo \ehleɛ Rebfej3ej3{e>ew2 !egA e<e,]ӣ fq`f40f40 (fr!6fMJD fTc#Lz)\fTc#Lz ,fTc#Lz fywrK"fUwT $fz'-fPfZKf/Lf*o f W Yf A[[Yf Q/]Of]|Kc[fTw}f?O fCN fGv.Kf j!X f9vfյq1Rfcu f$9}Bfkf#~[dfS*j fSM,Qfco=t| fHWb#F fYR/9 f" f@Fϕ $ f~Y?fPa fPRf }J!f =ןnf =ןn f"|tnNf'Jatf(*;/f(*;/U f(*;/f(*;/f+G]!bf+R9Dtf+ZBf+[j f.Lav!U f.XuFf/Np(f0=cgf0=cgf0=cgf0u?f1zPf1j 7Qf2HĊu zf4uf4~hG[f4~hG[f5@ d f5@qf5c&^u f5c&^uf6*@Bj f:nmc_ f:q1Kif:Ǧ/Aef;%WL !f;)tf;) mf;Cա c f;yy[<fh eJf>h (f?=&Fwjf?G< JjTf?G< Jf@$N fHk 2f&3Oy f+]6y=Cf>rjft)Vx\ fWYRf$ afbʞ5af5C&; fL6 f O±L fхQfs: fSQeNfSQefPCa fūNYfcfIfžf:Ng gf䫻ݫdfKPs?fO>FfL3jfqqU fRcFSvf>ɀf>ɀ fSnDyXf_ZE" fVT5Rf /ڔf /ڔ $f1D fdRn1f ef#-@ f#-@ -f afz_pffȅR fhVx fd阨fVϕ[fVϕ f'L fsKf{;$OSf{;$Of{;$ORfG< if{m Bf+KfchkfόՏF  f6fǴhPRf+8N> f:,äjf#50 fXdk_fXdk_Lfݑ#?fAV?Wd (fC衲v*fd~1f͹3%)fζR fIR $fIR f]f`Z f_fUNЋ[fdO \:f"ߘ00 fAU f!mez?f!mez f!mez f50ϻ}f  f=j:f1Yz4|f=/ЇDfNi: -f.@xf98b'R6fBgh:f\"f)Mf9M f²^Jf*dn)Df*dn)$fò f-LfoY~[fɄWXfɉן = fɒYΘ fDd=fʊG (fjq)S if<ᴮfˮ='fLf|+Yf|+sf|+t fͱ&v| f6fΖvjf> 1 f)\w if(p =fUþxf5(f5(f4 f62 f62 $f>\?f%[nt[fԚO!f=HFa fGfbZx fٛLjfڃ{L$f:v% f V %fZufd\{uf(_f(f0볜Tf~)Rp?f_$֞& -5frdfDʐ&R)fᯈ+f*9gw:RfU \f ? f!oشNf`uf/@{  foUpSf m f efj fsfrh f눰Z e f\"]f\"Xf\"'f&,fҋԡ kf3) $f}8u f%fDƵ f"Lzg  fI< ( fzlf vf[cBfXuZf[Lkf#>f#>f$f&7;/BvfWjfm Yf%p֙ #f#*)]G $gd}gx۷gM8 sgpAy]gTh(gThg3G܌t ggȀ6gc g.gt gC\hg 0W % g %Z g %Zg %Z ig %Z g 2| g 'Bh g (gIR g %:UDj$grnI/ gC.b gLg:ihw gNX%gNX%NgP \gV ˂. Jg9 g9 g>6` $(g>6`Ng>6` ag>wѐ igP[K g g?gT:s gKD gݺY mg{Y N g9H! gZlNOgga@){gkgk g 6jtgYg^Kg $tg# }e{ g#? g#,+g$0ѐ g% {g&a:g- g'g'TN g(3g(8MSg*!vy`P (g* H7g+i)ng,g,z.w g,z.w g/'g0g0lLJ g2I]Z g2Ҁ !g3+z71 g3+z71 g3+^g g4-oZ5 g4iDg6](AbJ9g7f: Rg7mseg7d-g8f})g:$9ug;Bnt9g;G2"g; 3wvYg;;)8N8g;;)8Ng;;)8NQgHP?g>+g?T>XRg@έ $ gBfx?0gB:D gC?IZcgCF{WKgC_gFΣ ZgF%4gFv(#ƇgG2  .gG4 gV cgIMTW? gJqeEgJɠJ $gJI jgL X _V gN0H gO9IKr9 gO"jWDgP$t袸;gP;dngP"Vx gRhػjgRhػ gSb`3 tgUj%gXGgZe/gZ|4ɉg[ڎ?g\N< g]#K g^j/qg^,!!g`|1Xu%ga\6.gavxRqQ gavxRqPga9' #gctge !ge@vMYBge@vM?ge@vMs ge@vMjgf TDWgg1[8 ggE߇Jgg̢ ,gh:YghghCgi rgoh4gokbsgokbSgpeat gp6K\gqui> gsQ -$gsߋgtG'aJgtG'aJgt-h gul gw-r . gxZ|^s gz>PT[ gpu2 gGJNgE, gE, g;tuK'g;tuK'g9Kegc3g>Zg #gHR2rg\^{ g[@ g[@Rgֿ~c7 g0kagƭ7 eg Uj?g X g Xg7Rmg[1 ,gTKm, gTKm,sg&ODpvg[ g,'sgyr gyr gKds$gbe/ (gR9g~e?gt%i4 ,gu51,g m .gX /  gX / Tgu bg PQQ gYW} iMgPE; geg-g-g=g Ug{ٖ i gӍLG g0lPg*+9hj4g*+9ht4g*+9h ig*+9hg} g} g;cl g Ngl71hg:#ٖB!CghFg gKFgtN1*gY]0gQZ1gwgw[gwkg)iDgJ- gJ- ga9;Dgsw g|YP8 g YgM\ gz!gTghbCghbDg퀀- gp]gnL0gJl gEE# g4%6 V g}DAy gs`gs` gBYB (gXgc- igs^VDgs^VD mgj9iO{gsar gbD|9 gc]T!gc]T gKJF gKJF gY>w g]T볅g/~ӫ g*R&g$ܞ #g#?g_V[ $ gϥgwa gg)Pk1Rgdܫ*g0pL (gEQigчp3 gLoen vg½E?gK?QgK(gVjOpC gm̴gٳhg ag\q-gǟ-cg - gɒvntgp5x#gof}K g\'4h?g rg/4펮[g A+f_gBHUj0gBHUj g'=ghVd]ghVdgѶM;gѶM;d gq#\g*,lhgCjg՘w[I \ge^ 9gֺd8#&gq8NrkSgؙR glxS?gCN gݿ[RgsЪXg WJ g "A g "Atg+g ?gܓ gޥw: ^g#m dZ/g#m dgRJ ?gRJ g'qt $g\OHtgŗE{g^|g厒(Ng#| gPaf1.gPaf1. g+V+g>ZdgcXB2gw7[ g!lXgF_'Tjgm $ gmk +gmk $gmk [gJ/D g=7S.g~oS! g@ZUWL:g@ZUW4g@ZUW#g@ZUWZg@ZUW g@ZUWg': gЄY ge^gyJpNgZuKgw%d gw%g"WИjgbH\ g g4B[ g6Pjg6P ga2:{ga2: jg/UgDDK'gDDRgtմ J' ,goXgTg3u~x #g xM9g?fg8W-ej gTY hu h*@th|Ӓh] hahRh5"Hh F shfm?hfm h!'umh ) \h \Tj h @ARb=h R>H|h 8O4vh $\Y h y;h y;hzHŝh"+l h2hKah?UhQ s hsuChsuCdh&ju! h(I hh[:Yh ,+hZ]h}*=9hӇX6e 7h-< ; ihOh9)~hrG2 aXhrG2UhrG2jhI:zh!-Tvh!kz6H% h"%f)oh"yȋ.">h# =h#<h%th%vK h%wSKh&,[U h&n+Pݫh)n"_h)x h* ah+\Ve] ch,nx( h-vh/WHh1o h1¶"uh1¶"Ssh2.  h3&ild )Bh3Qф$Q? h3֖Rh3֖Nh4G[h4Iy5 h5e2h6tBGes h6|0h7FGi<]h7sh7e!h8\ h9Fx J 3h:)$hshO( hO9hP?ΦNhSQţO ivhSQţO i hSQţO i hS΄ hSsthSs hT`Up hU3H]hZ)Hζh[>h[PDh[ $h[th]Kbm5h]Kbm5Rh]լb h^Bȓb h^Bȓ c h^Bȓ}h^8 h_ g5-v h_ejh_0~ h`.|haP"haP"DhashbEbjhc*"#TUF hcǞhd=H!hgҢYhgҢYhlvD$hm 8) ahn6GF hoY hoR3ho0(z:ho r" hq,@ #hq{hq76 hsLHrh hsw/m ht, 7uht, 7ht, 7kht, 7$ht, 7ht, 7Jhtׂjht^ö huMhx8p #hx޼ #hxր 3hzAz '. hz[h{3Խ h{9m[^h~~Mh~Ն hFQhk hw.,eDh0cF:h5 haRܓNh)Mq,hshshshJqfR!h1g~=hǁ7h>[WheJSh.mbyhJ<aZhJ<aThJ<a$ hJ<ahJ<aah`Oɼ$hsHn9\h>.Rh92$h哮hm4 hm4 h\wӜhg-C hg-CYh4AvhZ hZ  h0hͶ dth<̚Bh͂k hSh=} hCsٰi>/ i?  i?:gi?Ci?:D^i?:(i?:i?:i?|Ri@E9|i@$-&_i@$-& i@ciAD+ޕiAD+ޕ[iAnqiBv]??iBv]iBv] iCj1[?iC{/AFiCebYK ciEMrx?iHhg]t iHwK>? iI'l iI'l (iIZLWliJeiK7@ iL-H n iM\KiMiMiMԷVriM% "iP}ZcKiP6~LiQ9eZ?iR1E-iTL'ti ,iTɷ;iTɷiW  # iXx/IiXzn9 \iYk1iYkjiY}a$iYCzi[E3i[qDSi\z"1Qi\`i]I  i^X[X3 i^Ci_A:%i_A:i_LgL $i`vO i`LŃi`[m i`Нl* ei`@w ib1TIibb#icZ<icZSie)Yݬ&ifwB*23ihO. iitQiR ij=<vij*9%ijZt[ijWu jikU <,9ikU <,9ikuvilzh4 im)GURim% iqޱKir: is Ͻis6"DisT'> 'iu &ivQwW iw ppPixmxrizyz i{CvOp1 i|e)L (i|e)Li}X3 i}B}: i~{NHGixC i˂Ct}it)5DiBiBF i86u ,i>S. i`Zm_i`Zm (i`Zm| i|AhgNi͡MT -i͡MT?i͡MThiϵiXiNi먔G*i먔G* iD ,5i i%xai%xivi:ASiVyY?i#Rȡ_ i!4 #Ni!4 c&iS?&i}&~(i  "if i(ٰ=S-i(ٰ=Li(ٰ=$ib\4r?ibdui貱ERR imj!imj ,imj irki^`iH$rdiK:iq/ iq/ iq/ !i5Zyb eiG"|G iİ u|Xi HUiԞiԞSiicZesi=ԵZ$iΣG7iO3 c i%{ iTAe:8iПn)i7FiDiDiDi@fC@b#i@fC@biԮ w i|ni/;~ Qi/;~ Q i/;~ Q ,iט  i׬|Eic֍ ii! iَg̺ih 33iW rɾ|iW~_yiۧ4d:N i(uÁ:.i}U#si3I2j iU3 ibiиfp i몕 viK„ +i: _isN*(R isN*( i?.I:D\i2t׋ iЖbjiA OiJܳGi( iF+i4@Kib igclf i+׳ im=vi&I"diX i\ i\i>bv ieO i i LiN#i[ (iΕih(@0 #ibp̖iv{iݡESiоO:i# ibNEi)]i+]i[Cf(S iofk ilPiHc2 iHc2?iHc2 j Hy j7kj jiGjVjLjmx%Ljmx%jWw0js^1 Zj<j/5>:Z jlE3d "jljj lГ j F2Wj ,%PKj A+K j ݛ޵j BxAj BxLj Bxj (۟jS3j,H㳣j'_kj \{vjO( $jn C' jpsYsj'eY$ ,Ej'eY$sj'eY$ j8ڋ| j j$`j$`j+++QjtMajo;rd joaA9j {jZ.kj^,h^j'ƌ QjkR # j8Qj20s8j1 jlྲྀ˨ji j!VO%j j"=/ j#X#'j'q̊/ j)w|OYj)/j\j)D^L%*j)*(e ^j*Br j*[;j,aZkvbj,mvij,mvj-1 z2Rj-1 z2Kj.ֽliZ"j/O'-j0k\j0>4T j110;j3Ԋ#sij4!½Uj40KEQvj40KEQ j4~bSj5zj5,> ij5,>j5,>bj7{.a5j703 j8w[o j:ϓgp  j;x?  j<ĨcpCj>tBp; j>}Vx5 j>R1R"j?YA\jwG<jwG<jwG<jx- # jxX-8 jxj$sjyTsLZjyy #jz?7*R3jzzA'<jzN&* jz :j{fsv@ j{z܋Sj{zxj|pEAw9j}Bj\ 'L-jW-j,s ? jnPIjPvjgMZ jaj]`j|bjWahje- jSjj0oQÉ ,j3%nj\ j|Cj|Cj|Cj|Cjo(& jU"KjpyqjCg jQeajV 5j s`jM}NjXe$hjXehj?/ *jš) V# Nj?5Y#j?5 ajҤoH j= j40TDjC\ hju/` jŅ(jƲh­dj5j. jr'zjٟN{ ej/XzjO LNj=!jA{:rjX, c jX, \jlJ¥jj W'f jMzVKd jj j)cW0 jЪvĐbR jfN cjfN JjҶԂ M jӰ iQg jl,)Q jl,)jl,)Kj}H-v j՝Mj#² jnqC jj.`Xj-YF$ ej-YF$ j-YF$ j-YF$ $j-YF$j-YF$ jC;d gj޸:A6 Vj4"j4?jW rj[-Jjᛂ=dSj[t j Ku jj4Abj?G kb"dkÂᶕT k;GkYˈ#L-k7>k k`4k >k"\ ko1Jko1Jk,4DF*NkcHQ>k ˘t8kk ϗS k ϗSk9(ƀ*kgkdkX+q $k s{S$k!І5/ \k!ɠ3IXXk"g2JiKk"k#.ݳ)Kk#̼Tk$BrF k% ltƗ k%7vk%j~Uk&Ks k&Kk(u#=[k)Kk)IDT~vk)r k)Fk*tVAt\Kk+Ƣ*K#k+47X?k+蝂.m k+;l^}-Z k0u#S>Ixk1< k1K [R k1΋:q|k3eMssk3bI)&k3bI)&s#k56m (k7h k9-\n?k:+k:`$?k;twYk@W!k@I{}TkAΨ/W.? kBo=hxkBE2 kBĕ- kC DaY bkC12w #kC4DoskCB |kC@5|8 kDlA1 kDd kE)z skE#/gkEkF9=10kHAj kHAjdkIo [kIo kJ6]RrQkL݆-kL7NW^ kLUy kL Z#kLˮ*kL&eskNk1 . kN}M'kNM6(kNM6 kNM6kP%Sav1kPϒ #kS60KkS60R`kS60kT,92 c kVbPkV3X{ !?kVUi iLkVUi $(kVUikVUi (kVUi|kW*zRkW! |_kXYSkXj+ ZkY|`bk]M/<vk]+k]Yvk^J~\#k^v#b fk_2ǛMy k_2ǛMy ik_U k_Ukaxka @ ikaФU9>*kb`V kb"R kc !kckcm}Ekcm}[kd$@Jke%,]kekf2Q$ kf^v`]R;kf^v`]kf;ǻ ikh ks>ksZpW)ktRC kujX͇ kw[vkw$gcz?@kxqt<tkxqt<jkxҲ kzKkz32 kzq3e)kk{*ڄ t k{ԙ#gk{ԙ#g;k|LOUk|LOUk|X20 k|X20?k}Zk}Zk}ؿk}ı,kk~q*~!oL&k~D|kX# ak RnƎwkAG/ k$<kk ekYk0 1ksk kT;_k1kH nk@Qk5VtkS03 k[O k}rkjl]Qkjlk8t$ k;J?'] kHd kHNkkR k(7 kuskMr@k4;= k T kKqvka e ka ejkE8(kyk:k:8*k:kk= k= r k>8 k>8 jk>8 kqr kqr k3) ckKk͌ѫ k`Okg &k(jYpk(2N?k3ksk*hx k 1qD k=p3Nk4/ (k4/j k5 k)L:k)L:SkX;gGkX;gGkF*R (k'bAkw m k/Ah} -Zk/Ah})k~ kj}Rk) xNk2[ i kd] kNfy kN sk!!k!kqa,okĮ'PDkڡG w kg#kċV| a kdCK k!75 k01f 2k4LvL ka2r:ka2rkuׂkʎ. k־]4k{skSyks03Ck ]k9W %k9W kmY kƩϏ0kҷQF kV*|?'ktd:#k, H#?kHJ kHJkף[d`k״)` k52Vkgk;UǖkY ks^$ ks^$ ck>@k kjY? k5gC ck>Î) $ske kXJ~ kGk` (k:N kμ}kTkQf=}j k `;  k `; 2klakp k Y kTXӔ> kxk-1kLk `@^sckU&"MkU&"jEkU&"hkmakﯹFÒ;kG| kG| $kl]m-akDL c kO5 ak1e kB \kkiڊY k k62R k1֧> k1֧>k'2Fojk'2FokQR詗k6jwkVO6SkCMokCMoYkNdDkw k Tj lэ lgF?lk.YwX !l-0O l={li^$ldNP8O^lx$ ^ lx$l?l> \l:v>7ޢ?l:v>7ޢlDJ,& l3RH a lPldlYs_FIjl PD0ͩl \l ha l ,>Vl )`o al l{Bujl[[Llg [loQlWڷ lWڷlWڷlZ)K|s l<Ya l1$ l?l;#plx( l36Dl'V=l'Vl'V l?lCp lW =l3Sð lߦ'lG_Nl{ )[l~ol i l2h(l; ,lt2l Pl"L_jjl\l=mdM҆ &l=}D,l> ̗R l> ̗l?#+!l?#El?#El@0}G8Z@l@7Տl@7ՏKlBhH| g lB'< mlEpB lF8{| lF)lF)lF"GJ& lF~/%A lG20 lGfq lGfqlH KlH9bFptlH}DV ilI7- lJ&rlKeCP WK lMlN_쒩 $lNJ%lR!ba?lTS[{1lWG>JlXD lY@=lY~ p[lZrmR l[ 0Zl[{Dyl]^, l^&K l`0543_ laK7NO lc z lc*ejlc*e lc*e?lc2ldi"?,ldi":ldyslexw lf͕vrlfZuzz;lfӸj[lgS@ v lgm alg#lEQlhF lhF lj ?,lkƨ ll#?8ll𫸥ll𫸥 ^ lncx,lloP ;lqIJ K lqyA lqOtlrH N alr S5lrز3Zls"] lsc? lt2lu/tlK lw* $lwiՄ ilx)5!h lx`xf6 lxx_έPlyfs&j lz"0k ;l{PSx .l{VO l{\5cl|9Rl}FRl~!x\ lutKl' l!) lr=f l@{Blz l#eW%Rl7&wl7&w l7&w l7&w l7&w el7&wjl52l&%Nw rll(o\$lRe lv)݆#lMe a%lC lK $lib5+vlib5+ lν c lTlSQ l}@ jlg'l1Q&dMl1Q& lNYlq el l lK l lQpR lT( al`o0 \l0Z?l0Z?sl1K ?lR \l;bb ilN6cp gl $K l{MWleF m lcJl b̾sll-`$ll-`Ll2M5k $ l2M5ktlU1BASl7 ,lY;pflY;p lY;pl? lY2# Zsl<6mh l<6mh\ l;l9 lEDpO?lzwSHR{l&  lf>V. l8lKNl[ψA[l^SBluPܷ* l_MA l_MAYl-Ql-Ql-Ql~. !lCU^h lT=5 lqCdu lqCduD l8l lRN ll?*lASXlaqUlaqlaqleKl+@l lw?ZlIƄl¥[ail0KlwFvlqŘ\ ^ lҽ:dlNkTr3slijlĨϑ5?lG$ly,GǚdIly,Gǚl˵>߹`l ]Gl%blzsYlȳ)6elS@(l* lNuelx}D lg lq xLElq xl"! l"!9lTA㝆 lTA㝆 l&c!l&cDl"7ǭl8ƀ ^lK@ Ոl͇ `l"Sl],l> RSlӚآ9l! 3 lwttE?lj pJNjlڠ=lۘݪ-QlL)]Bl=#klOZ"lOZlOZlpH(rGhl#gflSl.F9 Nln"lMLHV8l^$R l^$R ,la.Il㽭H&s l$YlaBlLellLel l׹%Uqlx0*l l76l76 lИ l؜l"V ld=rlՐhy ldTv l(", ilY"luۨXluۨXl)eN loc n lLU lLUlƚ\slsK lsl#  lpf{v lE{cl1xr'Y lި+Em?l4KrSl4Kr5l4Kr%l4KrlTZ l@B7%Rl@B7%l7_3dl(d?l(d:m!p]cnmǎNm sim6m): m6- sm> m>jm{"WX1 m EVMm36 m{C'#m^jİ m^jİm?uɐm}hyτ =mIh&vtmccG?msM mӳ1m^,zKm^,zKmΘ9uKm'q`gm3"Om[:ZDm$?m$?m m:mHv+! mF_'m;0m+͝mg*y m:@Mm l_Bfm yHm yHm!ʘrvm!ˍۼ m"G0Bm#&=R  m%f m%ړcm&vC+m&vC m&vChm&p9m&'i m'4*m'4R/m(}Udm)JhK Gm*xt m8;<lm95T m:MV{V# m;t],%m=ۨ*; m=lsc)m>/Gi&iL?m>l\2S m?*m.mAB.φhmAg*YfNmC+YmCNdmDۚmD͋zK mE~imFK] ?mG` D mHE  %mH-oVmI(VVmI=ު mI mIo- mR̺t&cmR̺tmR5jmR mk%cS ml5'PS, \mlG$=Xml]$Zmn-x{mnD*Mmp_6T mqe=ms]RELmwim/mwҳ4mwUqwmxYmx *mxemxhy$ my[pL*my[pL? my[pL my;r"my;r"Rmyysb?mz>.T|PYm|a | m|a *m}('ݩm}9JZm}9Jem@smArAmu Z cmu Zjm8/ m):/ mFZmk4 .m)ymRm "^K m "^ mwMH0mYj mYj msxҹ gm|2NAtm m~ڴ;mbmN ml_ $m~$m~$m>bv am37frm J mVu]'mhL%$m^ m  cmwcN mD}bN m(WC m*q%m[l? m xm0" 4 m; dm; Em(MV: mLI m2Bw e*me mNX$)//mXW9?mv+m6 CMZ mڈ.6 =mڈ.6 mv#-Qm" m3 "m%3Rm}ΝF im"c<mhzYS mpD_A$mq|m"†;mNm2A m ӷy $mWp amWp mӊ# m# m#m,ޞ=)g mM; bmzka m(Dޚvmwe \m?mN"mN" mM+mYfL m mpR mI2mɕIm'm'KmڏBd# cmj='Rmj='m3NmO. OmO.mЭuUm ?{C mū!5Km,|{ m7a`y& m!NMem9 #m8$)m8$m ܴm\eLNUmL5F myIՑ+mJmЗl9mcau$ , mcau$mn2 m_eVtmրomֻ: Rmy(em{b)m{b) m׺t4Dmη6 m` ,mU mUm]dz b mٙ6cOmS<-f m[C{ mNWm!CmW RmW mW miWs mt(|]mBr<1  mjmSX3mAkm&fmMk Lm{pډEm%~} m%~}jmLܿ m0jP m窃~m"@wbm+mfLv#vmmY=sma> buma> bma> bQmaermپ"m+J0 % lmWӘsmEXmm[Hlmծ_j mծ_s mLPD:mkam}UZm7 cmHEMC ms( m%qv m%qvjm-& ,m4m~7 }nEnpԧn1ts{nf] ncxncx ,n򦝽 tnܡRDnܡRniepUnMFY nMFY n1jvnEQ nm{n? n?n? \n UK34n WVA1n p#%+n jcP'~ n jcP'~n jcP'~n uS n c c n톸n톸n Iݭn in~)ejn$0>n$0>qnwLnKS\Vn~S4n~S;n7n2lN nF:,l nF:,lnY|,n憞 nCˑz n2A1n^j nP#n":ZŕCnijURnij)nij]n~yInzzs nzzRn$tUtn$tU#n]35n68k$| nRp$nRp0n p#j'n!xf[ Nn"> n#+Fjn$^ n$'5n&M_uNn&M_uYn&[çj , n'x ,n)"c/:n*hm n,>tYn,>t n,WFn,|Ջ{R6n-uLLn-uLLn.`oyn.W\n.~g}o n0s*H}!n0s*H} a n1Adr/ n1]dn2}9n2J;ˡ +n4-pZjn5MS}n6 \5(? n7Kch-sn8:Z8, n8GS{ $n8/n94n94n94n9RRnQn9RRnn9RRnn9RRnn9RRnn9RRnDn:?-Xn::wkn:\& ,n=GYfnn=0}8D , n>v'!Fjn>v'!Fn@A;? nBK( (nCu![nCu![nCu![DnCu![nCu![nD02nEޑnG>"n nG(tYnH+R?,nI.,bnKǃ nLto XECnLto XEo nLto XE nLto XE nLDǣnMAKM,\k nMƒyb{ cnNG4jnNj6jnNj6snNE"lnNE"lR nNE"lnPR!+/nPlH nQ}2SSnR6>nSfLܢR nS $6nS $6nTB]nUKAnV2inX`nX|ConYlWX+RnZ~MnZ 1dnZ`'1WcnZF anZFn[Č/, n\zn^Mncv nd $ne6﹐ neZTnfHۯob nfD #SngYt5jnh;ޜk$ nh;ޜkDni#)I ^nk)b#q nliՇTnlqnlq nlqnm~ $nnQc> S1nnQc> nnq[rPtnqD>_nqb{ͺ nr,DZ8nsl{ W jnt46xZ nt46xZnvz7nxF]]nxF]]nxKb nytU  i n{}An| *{ n|wD n}P\NĊ \n}P\NĊ? nc-k)D nVSndR nbnSryn)d8!n)d8!?nKunV cnJ!nPlUE nDXjn9`t \n9`t n?ӥnk_@s n"XU Q+n=kt np0?nU QzSVnyp: n ov|n`ARnt}/x ~nt}/x sn3P<nHIÓ??n뫶 *jnp;n4P P# mnW¯C[n^/I i nz:nŰH #n3Rnt*W 'nt*W|n~8n~8YnP>mn?҆nm&=, n^6n{]bR nnm nvg7hbnvg7ht n $n4?qn)%[Nn9 \n]auJ+ n'on<qn%L ,n%=UnWnޝ% n fCn#+"n#+" (n#+" \+n#+" ,n#+" gn#+"nN5BD nUc nUctnUcn{YimnȎ nȓEnӉSDnɹPnk" n{+Qhnd2C nEVp{n adncqrf nͽ@9?<nvn{@#fn  nV"#.nRi"nIȥ$nѼ~ nۃ/ cnu ns{W nՖ]Gnڣ*nEScnq&nI "LR$nI "LRn1Ό , n/%LKn5/?nXië`nXië`=nXië`Y5nXië`*nXië`L"n#7u n /Rn%!n)n;qvnب c n҃@ an~|fn rҎg n/!n/& nI Rn̫y9n}o Sn Jn k nB;n <sn jF/Kn~  n~ n1!Mn#Un#U nfXi1nxEtnCHخnX_/rng1M,n gr2 1n_; i n⽱kn.XlnCut nCunZ:Fu(n({hnXIQQn󠣷d2n7n^vsj:Sns@o= oR)KoR)oh齖 oI*o Opo 燓o ? o 8hT o ]m= o y, ^od,Sod,Ro=RA e!o=RAs o=RAom14Dov# oAJb$: okK|oPA, oe; $ oc5oo+4&o<[o<[ eowo^+XR oc[ o Bs.@o>s.@ o>s.@do?yfkY oFtՏ4oFȠPh oFϮMoGSH&=oGSH&oI P[oI58+oI58+oIv^SoJƂS>dDoKI~?C oKd9-$_ oKAuoL%uжoL%uж oLP"KoLP"QoL#/}oLҡkoMK,boMئE- @oMئE- oMئE-oNZ9 oo}UoL `ooi)F- o٥o=ד o,-i o8Ήoco/goL (oL]b o& = oB8oθ. o%)K[ o^l\to`9)=o?o]oRK?XoRKjo Eo(֪ZotS6op(9o*ڼGbo! ,o!oI= o  oR |o=W$o*=[l]oԷ5RoԷ5oԷ5oԷ5oԷ5SoԷ5oT-o؆2oO5oO5oK.( ( o[E o4#I oO"6 +o 7ՃoݰoZ2Gowg} o-"p!zoOVe oĻ&88 ox,9s'ox,9Rox,9joYe!o o.\Uo+?ЌoFK*on"D oJ8j oʌ/u o˛oZ! o̮wko̵/o0; so}g/o#  o1-ȟ oEF oVH _M|oVH _MkoX?&oӟ<' oTc oTc oy ho՞LT ;o8MݣQ oغ[S;oغ[S;YotHoܳ]o7hYo}w(To1N opy)?$ oeb %oeb  oeb o0]'Y o_^ oEE@ oEE@- o鉚/B o ۷>oro/d6{ oO'D?:o6odxXo]Ѯ^wTo񹉘m<`s o񹉘m<` o y"o yj o]C oO̬oxw ohi 1ooYoocA|WKocA|Wo o//Շo//Շsoet pry $p̒\p̒\pP _p. 9ꀊ p'Z  mpW3y@ pW3y@ $p 5p8pPr p Ssp \R \ p \R p ůZFp ůZp B\/ p _ xtp _ xkp _ xKpJPKapou-pr pn bp9~ap>/]p 9pq@_KpxO lpVDX ap;;s(Rprp"|F gp2 eNp3հcM jp/zp#x1 #+p;l[ZVE p#6r #p(}ڧp,s p4/ p<}|p ~ o[ p ~ o[Rp"%`Ҵp"%`Ҵp""VDp#> p$i$ƶp'xWF_p'!? p(`Ajĵ% p(0WLp*koh+4 p,ozp.mqSxڡ#p/( p00ڲv p1nwicp1nwic hp2lVp4b z'p4b zp4l7.&?p4p5|p7[{4N p83vXk . p8#p8*^<[p9 $p9H؂p:-W5bp:c p;nsJ  $p;#OKp;wN*p>;?#p?=.;p?=.<p?ɭQ =p@Ԏa$pBXRU/ RpBXRU/ pB9" %pB9" +pCci]GKpDO0G[^pF|@ pF!0zpGV,:^pGV,: pHmLyZpH ZZpHpOUapI2SpI&spKS> #pNb@v[j pNaСZ0pNaСpP̪ڦ\jpP̪ڦ\ $pQl9B\]pQl9B\pR4 @K pR3\xpRM=jpT1i[pVSzpWSpWSupXdq!/ pXdq!/U pY97pYdWpZ^OMp[mC}Rp[isp\PT p\Ӝ^usp^sVt p_uT p_x?*p`Eu۫8Y#pb)1pc0pd#)*a'peTNPpf apgvj,pg~˵?s ph'20ph'20pivNqrpj{5IKpkz^wJ (plE`plE`plN/RplN/dpmf Epmf Dpmf pmf  +pm}# pn4iqpnJ pnC po a -spo a -pokaUpokapokaLpůȌpwt}~ -pwdY/"px vpyq]pz kmZ pz kmZpz kmZp{(% gp|'q p}Q 8pTFp{eoiqp/fm=-;p jRpV yb]p.H4F p U (p1Kzpp%-vpst pIZK~pS pu6Yv pDmp銥$pi5W@ = pc%XWދp…w Lp“?, -p1]p|0pĊch \ tpĕspĴa ;pĴa pƕ=L pf pf Qp~Rp~D pƌd}NpƵS5pƵS pƵSpSw4ap%–p?p3ypɫ(pp13`\ mpuB>pQr4 pQr4Rpu~1pA-spDpϰ9 pKHxZpfGIjppM6|?ptM"pӰ۽s% p B(v pT]6 pg8ʾpxwq pJ.:SpJ.:Lp֜ҲOp[](p Ĩ,p)=TCL3K p;%hpJoM;pܬ4c p|Ō9 |p&tB #pj_. Z pww4Ͼ p[m_|p'3NRpצ ,pU#p5w apO{>pI6pIp32Tp;<pqT;pynvp~WLZp~WLp~WL,p~WLp 1$p 1$ p6 p1*}Gjp1*}G p1*}G ,p1*}Gpї_pї_p6ZKt pLC(BpKpo #p}Np$O|4 p$O|4 ,p  qU2 qq?d 2 q]/-$qB qBAL q"[qg:k"q0wLR q(5gq<:q<?qD,(?q N cq bN\!q O9 q 9fsLq 9fsq  $q  $q S q IK q}4 ^q& kq& q*YYf q7q{j(E qIVpڶ;qIVpڶ q67Sd;qzn2f )qzn2fqdNCql-) qE3 qZ6_qO q-]q ,7Sq /= #q!zQ] q!R0H} q!R0H} ]q!ysq!ys q!ys q!q"bZ+w?q$r1 #q$7~ q% z9&q%Xa]pq%Xa]Qq&|1I> q(q(5d?q*R8d ^q+,u-q+Y[f"Bq+_# q+p>oq-?&=:q-;l q-;lq-;l q-0@[18 q/@q1MqTq1[&6)H+q2qo q2e\0>U<q4Ow q6Bi5 q6v̧d4q6v̧ q6v̧q6v̧q7L [/ q8 (#q9YLq;~צ q;rq<Uq=0q>kY @q>ng-:q?`BϴI q@)8 *q@߿6 ^q@ KqA'j qBJfB qE)5b#qE ޷uc qF/eikqFj4qHQ6h9 qHWeA qHh"qK>Y]N qLζp?.qM؜ 5%qN!-yqNLY%qNLY%qNLY%qOIX3[qOn qOnqO}qO}qO}qO}KqO}QqO߶C qO!6 ^ qP< >S(qPEqQ x $ qR-X+qSAS ;qSCqSz?jqSz?qTHUi*[ qU/6t qX t qYeS.$jqZ"yq[@>u1Qq[t: q\̊iC2q\̊iCq\̊iC q\̊iCsq^3 q_GdYq`*=+q`s; 1jq`צq`צRqaB~Qv qaB~QqdA2NqeJ*- -qfGx qg:*[ ,qg:+Wqg/vxkqiqxgtqim qjQzȕR qk\ Xql֡Vql~`^)ǁU qm^A qnZЮqnF Ig]Tqn[# qn!y2Uqpi#m "qqhv]5qs* » (qtnQEڐqu#KOqwP 8 qws qx]K q{aSYq}۪{$ q} q}~dŪq~q}`qtHqqb[q\ %qa(]Rq.qWWCq3\q/Uq9`Tq}Fvv qtfq)Dh{B q`q] \qSA qSA iq)HTh#q)HThq×A9Iq×Aq qM:-qM:-YqM:- qi.oqi^9+ $Jqş3DqƒJ qqBۡqqBۡ (qqBۡqUzq@mqXq\G[qb6c qqe@qqeq'f% <q-< (qJbqehqKQWC=qKQWqԺ k q֌0U rq֟di#[qmqeX?;q؏‘_yqx \qވE qRq+VsqߙԐ q㛐KVFqrx qrx qL qwiHqlq qnמQ q/q4XalqʊxS>qʊxLqʊx$qʊx q\P q}9 $q$dC9q$dCtq#tSIq!Lrq;fq+3fRq5 # rϒ;!>5 c rݐTlOrSB 5r:ۜx( rg=/@F Drx.lgMrbVr r= mr?< $r?<r0rl7r&Rr /(ctr /(cPr /(cjr ,r!~R"1r#1^ O/vr#J2m?r%{Mj?r%rZgGr%rZgG]r%?ވz cr%G ( r&9r'T|t.r'e]kAr'/ r'/ ir'5^x r(Nz r) J }%r+!p+ + r+H%W4k ir+Z>r,s ?r-P՜r-iE0r.O< Y r.+$lt(r.+$l r.緗R r/Lr1jr1jr1K*tr2.\Zr3;NرRr3wşr43at^ r4hA]`Lr4UzPb r7-j c r8-&? r;}O er/.cr? &23 rA^uU!rAɽ 7?rA+rBg30;`rB( rB( rDU,rD'q [ rDku̓VrFh!C c rGU{vc . rHDZBJrI5SrI`pJ rI`pJ rL"rLP&9q?rLs rLK4rM'U_ rMr4LhrMYZwsrMYZwrMYZw ,XrN-\\L rNxYpFrO ( rQ-z 4rRr2rXU#bՏrXU#bՏ/rY~LDrZ'T r[9#zk r\z g Ur\z g U er]1r^r_%xdr_yr`aZ2"r`$@] rbB͉KrbB͉#rb]*<rcse[ rc#C ?rc#CKrd?Hrd}^X rd 3%rd"j!hdreϓ3 %\ rgxUri/1rl/ lrl&sjrl8ZzTdrnLK+|{ rn?ҩkroڍ3ro\qby rq+8 rq+8?rr.IWշlrr.IWշlrr.IWշlrrtĆ{ rs4 ru0Ѿ/*ruh2 [ruhbruhbrw[+w25jrw$ߛv rxm}rz.Z #r{fwVer{۩, #r|v'Yr|v' r~d)!r~ uCr~ uCKr.{(#rnxr/a r# r# r*/f()r#=Vrܐ(; crܐ(;jrV ,rrw:RrꁰFcrgo rxkt[rcTq r+P7ˏr>WF*r>WF rD7]V=r[m, rD5/RnrD5/Nr}s #rDs r9|rx~rxbrxDry}0Yry}0 ry}0 rEiT rs \ r4CWrBEpXz rՑ/vr .+drv*ySrv*yS rZ#]4@r}Br}B r' r' r]v # rAz erAz rAz rs%w$ r0` Srhm}rwE/mR rH?|rSLVr%XrЭNr D cr irrj sr (?ropru ar MK r]P{oo 6r rssr5;irQ L r׻T r/x&< r/x&<N rBSWÿS rCh=r%: rR2b rpOnVrpOnVrpOnVrpOnVr0rx j r@5Zj?rpb r:rن_}3i?ryDG rۀ,ANr rJle2jrܵ"M(Drܵ"M(Krxŷ brݸM܀rML1rMLQ rMLrd#AKrl#GKr٦ (rj@ruK{eCrhKB3? rir|?ycrFBr{ߗ rZ *B:>U s> sOWWZ s^is ^0s]#w s^y srǑSsE_:#c/ sJp)F[LSsOr#_J ns'ϵ@sٱ)б sSss̊-Ld %s0xN[s G/ۭv_ s u{s"+."Ls"Fs+Rs# s$V$s$V s$z yPs%g ʴ c s'%% s']/  s(G^B>]Rs(G^B>]s(G^B>]s)MV s)Q eP s-x s-x s-'ts-R`bs.-`Q5s.}* s/UTUj?s/Pgs s0LDss1Nls's1Nljs4;m; s4R&fs4R&s4}9Rs6"*Os9Zs9tuO (s9tuO s9vKs:.AeUs:;s:Ħ sġzs>ġzSs>ġzLs? |s?Af+$js@F s@sچsAfBtLRsABdsABS sCYР?AsD" rsEX$ό%/sF kP?sF kPssGveA#&?sHiqR sJ:קsLt (sMçsM!jsNH*tsNo) #sO>`RVsOf|vsOkYlvsPW{%.sPW{% sPY,, sPm #<sQ[hQsUY? sUYsV1ˉ]sVJsW椴!P%sW椴!sW椴!sYO^ sY1 ٯlsY1ksZsYSi  sYSi jsYSi YsYx>sZ+m sZDys^.递e cs^O-7 s_ ?8s_ h s_%#s_b݇Qus`ɀ" s`IR"saJpȌsb6 ˙:#sbv_7Ysbv_7K*sc%PTsc.r sc7]|sc7] sdCce߂RseseVpP" sh + sjSSsskslBi sn(esp5Q҅`Pss1N#7stITϰi stQqMKsto mstdT!svV>y sw!u; sx_ڈF8ssyuJm sz4)dr s|p|k{s}ans~bs~h?s~\-%sys"Ο(s yss ys4E| ( s4E| sg燀sɅ7 sgׇpRs] jsTJ ,s=m-tNsƐʐ2hsƐʐ2 isU s,  s,  s$]sQ6:z/ s|Lsks Snr ,s\gsTCsio<sa s4% sԁfsԁfs:fOsj|<s^DSsRs*E\:s*E\ s szh.szh.s1m>sۧyc $<sP$ZsgϽG,s s^e s^es$(k[ sJm+Zs qs ࣿ9 s ࣿ9s s5{ s`n usT4CuWTs+!SzzsI% s as.x7s^$K sUG-DxsUG-lsUG-s$sƾ͠js_iNs^ cEs^ sTԁs17{ *s_Is_Is*4s\zRs1S0Ks1S0KslsqJOuj4sqJOuss̮97s̮97sb='Z sf$ str>Dt`m/ tI at8qYLt [| t t ]t ^$?t +nt M?tGUTtꝯ (t2tzfthAЀthAЀ tz6,tz6,t{Wtq3:ftt t&- a tm $W t' t i}:N tW{tt<|;|$tt&aat-V=x#t-V=xt1, nt1,?/t1, ^-tftZ tKE]pst@ t:{]ot P|t!r>_Gt!b4t!b4t!/S]t!к!} $1t!к!}{t"$ycv t"sP0 t$ڍ t$дHvt%lԈD $t%dft'4 ; wNt'?`W' t'TaT95t'{x Kt( VݡYt()e# t(0tt)6\gt*018`wt- )Ct. ]2 t.͸-t.͸-t.r6vt/d t/d st03ct10Kt1$oG_)*t1%wC t1ebUD t1pVˆt2Fw t3KDm t4=fթKt4Ct5\z t5`"vt61c0 it6=Kt73}2kt73}Yt87Hat91YNt:=At:ۍ t:.=t<n/+t>v:v ! t?DCb]St?DCbt? HQt@`st@3s$t@3s t@3stAx$Aoe tAhY$RtAhY$tB1<tBR"tDf]tDۗ%?tEl@?*tF}|LtF@T?tFtj9tFtttFttIw/ \tL;mtM"9+  tMT}!tM&A{tM&A (tMvtN40i itQ;zf RtQn]=tSXOtTTVwf tTTVwfUtUXņy tV,!KtWByvD tZ_XMttZ6%$]t\$РF t\a^ c,t^qFWyCt^y>tc^0cjtd.05te7te7Sth9"Wbti7=x \ tib8oti'TftjWÜ}tjQ]% tkH9tk~ tkctlm.= tm toivCwntp./Ǔtp./Ǔ tq/ Q&tq/ tq/ tqmT%?tq%tuy~GetvDsx4tw]tw { ty^et{}$-Lt~=&tawL to1ZKt>zttctG*7̙ .twjVt8N8tHt_‰\ t#'C|ttSYjttSYtUrtJ tB?utgX tt?tz tP6tP]-tP tPLt,fmftҦVQtaK@2 tzt#Zڋ}%t~VtoA5et2Lt2LtA& t]8kSDZt~+Y*? tW ]YtW ] tg>Ihtg>ItQHkt󤲿zMht󤲿zM t󤲿zM , t󤲿zM t{-t+uStZF ct ?t" pt=Yt=Y tYGڮ~ 1tYGڮ~?,tYGڮ~ $ tB't+ʓ좆Rt=ak! itC & ItC & tC & t_("tA;ttEv ! tY gtʹ\" JtZ,[tl&vZ tFXϵ itVxhGd t{t{ tF6) tF6)td?dҫ9t;]ӚJht񫓧_tN4L?t\Ut Utl77W<taGtд({t }ktK] x,q2tznt ,t6Yt6Y tխ?t{iLt{iLLt 3S t 3S ?tp]EatԵgׇ  td tn9 ]t`L1[ tkn;t[޻JGqt]gktUqtUt~Ėt \t.x鼀 rtf tŨ+t$&]tU&tU&tU&Qt4 7 $tŐ G U tktotL[ㆢ['t1WbtlRڦ tǹtǹtǺuZ$ t;NtȏVT tݿ N'tʴ* tʴ* . tkFtˈ-ȯ i&tˈ-ȯ tTAf.tTAft{1Atۭ^t6tG˨ t>)~; ata²~ta² ^tP W tftM#yktԍ TJtz2 tۄ8,t)` $ t2Nt؊^ t]PFBbt7x tT28" et`p3t`p3t&Ij taRjt\]bt (t>kռtnSp t")M;t2u[9t2u[t]/}tp4=~t奻*E tRLtyϨ"ttStl t}A" t}A"Rt-wht鲿۝thz@ st^ |tC t)t)t)t(J_tBDt=9 \ tX\S tX\Stv^^otΰ> mtHgpz t tc ( t2+tsQt6 tMoNuɢ urU_ aVu9',uwI>2u 8Zsu=MS2u?S% : u}IPc uS u!W>|u )>&֟u %7͉[u !kMsu nhBu IO uHu[=] 3 e u*FP c.u' u$  \ut9VrZ u>} ("u^u(W su~nu{r. uȈ9^ u鐺 Ju鐺 Jut-hZ u/Z3g u^t uSփ uR "uR uizƯIuizƯ uizƯubsRu’uGy@> e uS,aU \ u LV;T4 u! au"u"bbY cu$u%'?ܸdu%AK u&^} ,u'.@)Cu'.@)Cu(%^DZu)*%N u+[7A $u.G,(u/Ȍ~[Zu0d†$u1'`xau2/3u2/3su2/3u3!ݹu3Z<sLu3e{Xu3^g̐ }u6d_>-u7u7r{4Nu7r{4u7&. u:`Wj[u:`Wj[u;7YRu;)hq +u;)hq =u;)hqu;)hq*u<Zu<Zu<Zu=(1:Au>XWGu>(bolR-u?5u"( u?5u"(Su?kJLu?JwuBR muB'MdT)S7uB'MdT)UuB'MdT) uB'MdT) uB%E # uCgN uEm" uF; nP=\ uGL,PuH+;0>uKy v uLfIe)Z/uL uL51 uM|Dh{uNoC]& uNW%uN" cuO}֢JuO}֢J/uOq* auUa&5iuUإuV)"2E uWyP%uWyP% uWyP%SuWyP%L uWyP%KuZ- iA%uZ- iA%uZ- iA%DWuZ- iA%R6uZL0; u[fcڗ\u[fcڗ\ u[fcڗ\u[YÜLu\ɞeRu\ɞeu\ɞeu]uWu^>@u^5дjSuad!ua ~iNua ~iubYW #ucnl*x4ucnl*x uc![N!juedVRbh cufeARufeARugc! uhs^r}uh_uiu8uj VQs&uj VQjuk+um$OCYRumȖN}umȖN} umȖN}]umBuquqlkK ur] ur2& ^ uri7 usg"NiutcuuGZE8?Guw. &Zux=wGLuzX&Ft^{uzkDRu{WvCu{WvDu|rqu(u})p %u})p um?^( um?^( u?tM Nu~g Ƥ{ucq|6Ru Yu.n3 up<uhfuF%u%_z{&$uf͒ bu2訓$u3{z2d uٸD~9 uٸD~ iuÌu5} + ugB>M uv=x8 u#9uw'uwu_tuƒ!@uTQ7u*V?ݓ u?VtjKuRW~7uBK u E auQVvu^;eu4] up,&uju~Qa iu~Qa (uHp u@|hER u?u:`dvu$yNup1x$up1xRup1xu@4 uֳ]  uu;u*Z ub؟ u8uָ&su-'u䐲u/i·unaun{J$8un{J$uxG u}V k7u}V %uj ?uj su ~ udruSnl; uD6su6fu|J-ufb u+&ZNu`` uAR uUuÙ+yue~ u~b,/ uX.)duE"UYUduE"UY]LuE"UYZ=uE"UY<uE"UYL-uE"UY uE"UYSu˃E u˵Gˇu&\ u̠} u8p|Qu@qu u uÒ [ uϮaP ugg)YuЃ. uA3* uуd: u҄Q?uҠ/huҤq Lu܅MI $usnSu}yuӊt u{qq u3 u{ uZ}G u֫Suקh u2KyZgufY=hur&)Q uCuCuym u"TauuCz9sDuSG uSHy~muoVub9d u Vka[u(; u(;ku䶂Gu5\4u5\uŰ uG6sO\fuY,Wukrukr (ukr ukr ,ukr u-fu]1!u =u|[uXD9d;uXD9duPv4rlSvn{<;v!e1ve^y6PKvSnvM cv9 vFi v/|`u6vͷvjv"r` o%v"r` ov"''Q#v$xvv%P~[v%j!iv%r9P(v&m6,;S v&m6,;v&irv(i{e v)3uPv+da~[k =v+|peC v+{> v+{>vv, ƒ  v,tIWv,gU v,L v/dD7d]v/]Ltv0SwA- \v0ژuL v0ژuSv0kzN0?:v2; Rv2t v2L[v3_zUcLv5>uu. v5ޣ av6DRiv9">av9E*{KU|v>*{KU ( v>*{KUv?5A!vv@ч v@xK vA 569vAo!b&SvBIAYXCvBIAYXvB3N UvBAtvBHrvC]vDz~ܥf-vD0vD0RvEm:PY vGEnjvGF vHU% vIq ҌvKN;u:vKe[vN9bvN&|Λ vOb vO|OQvP+# #vSMn A vUsЧvVgSvX~u4vX KRvX KR vX KvY`y$ vZգw& vZ!Kv[;Ej3Lkv[VmNv\v^}d\%v_Xisfv_j&1ѽv`djYvaIZBvaSl vdve5R vf:rڔuvhhvhOaZA vi/qvjD37K vj[pvj[pNvkf~? vlb{&vlvl~6k vmj0e vnU? pvowvo$jI$ voSltKvoSltYvr@ 1=s vt *0qvu-u8\vwyaW Yvxovy20v{Eev{mRgvNڽsvA_bEvA_bvkFe # v/RZv/Rd1v/R)v4v$ ?vfh vfh ,vfhvtDv2v)}O vȼKvFXYvGf[s v8Fe&v8Fev1tEY vܛ= vܛ=v vL?vNΨG1 vV#WkYve5Yvt'v,Ȃ:v׏7l - va@vava vFXuPv-_kvPG- vPl5D vRSvk^4vFIv2cv?I  v?I v4#V v9,j v2Vv2V vD{t vY̫r ev#vov G>v ?v v vvô)?jDvvô)? [vӇWtv&ھ= vy}s " vy}svy9hv[q< " v@z v@zQv=Mu? veV+  v`c vg|M lvw[vu(+ #4vU jvhg@p v|1vpT|; v Z v EO vaH0' v^v^?3]RvqVL vqVv} 5 v+zv:v: v: vZv/ugv֧J) g v֧J) sv\F ,v`?&v_DvB2! $vB2!vunx@] vunx@]vDvvΎ v~Nt=u vϖBF1ZvBkvȨ{"vȨ{"vȴ4DvI`b `vqF (vɆz v[+<KIv[+<v[+<[v[+<v[+<v+@ v˺UXvs A v̉ipnv̚g#v2;!UAvGmv"^% v5RcYvTI/zv7 Dvֺ0Lv׈v׈(v׈ v  vؼ>1^ vے~ iv ިv%p v?n2 vEtjl vkž vkžvkžv߮:Dvl,`? v~V+v vhQvjlzRvvFHLvƹ*vT_vX3 RvX3 vzR v|Cpe vۗ}v6^ ^vm~viY lvw. vĜ7bvo0Wv!M ) v[v[v[vG, v+ v҂jvy3chv z K(v z v`ӕvv,  #vZҪmv,lsvcKv .|v_ J(R v>|sv^UgyvR,NvşWRvoYve3:v8CP vWF?v4 c#wp{p wZw_.B we1T woAE2v wBt wJº awUH\Ywő`lY waaY)w!{hw!{Zw|w4ׅ%pw(,w Dq w epw 9WC_w e wA 1 sw;Kcwm T`wΈ bwA-gNw " wf+ Tw cwH2VwwMd-twMd- wCn<sw˓s|wjn Hxw?wbx{ w6w\ wS8 w6̐.wmw j|% w &? w bus w%SkSw%xb w% w&Ơ mw&Pw&L 0D)w&L 0w'h_^w'KGBw'KGw*eӨ:iw+8H aSw.{4Jw/AP(3qAjw?.:f_ +w?(!B(w?(!Bw@d}%8b <wAM p wAM pwC= Ѩ wC?1NwEys wExM wH!]ݹ wHϞM}RwHϞM}SwIdvl \wJZCF wKX(+ g wL/_ -wLD!DwLEU3wOR wOTFUwOսmwQz_&?wQ"٘owQ"٘owQ"٘o^wQ"٘owQ"٘owQ"٘owRh 6wSu<wSuwTQ] @UwTSg ZwTa05wU`akwU,j06?wVfFjwVK{g&+wVK{g&wV9Lc wV)0KwWA sw[4#w\=DAM ,w\onw]>5%i w]Ɓ^KZw] Lw^>׃bsw_pwZ jw_8DLvw_Hd?w_^<`w`aDw`i**~ wa?9wdFB`NwfһDtwgXDwg6!/ wj%L & \wjCtA wk+ 1 wlSxQ|wlyr wlIpwmcULwm wopd_ws;f?wtJM87Pwu+5?$wuSQ{Jwux \wvlp{ $ wvlp{ wv/D;k*wv/D;k wvй wwSbXs ,wxwy[ҰQ/wzXm]wzXm]Z w{awbw{vǙ0w{vǙw{*=F|w|9xK w|*:Xw|jV6w|oF[Cw~7p:w~7pw~7pRwQ$"w^lU+wd3Awkw m \w ^^?w  iw sHw_ wVwnKwjTL/w[у?wbwnobwy +wAgȆwͣ$?XSwT w f" \w f"woS.zwݠ| wυ w& wJFJ{ w% w%w% w% iw% (wu*ZNweuyNNwZ}wB ,wS$L wS$ZwS$Sw*C0w .w: w5K6wIVw1`3wR/sw?}wOfĉb wUSwU w= Fvwb^h ]w$lwQ %wQ iwQj w.ڢ wu.T rwN[cERwf/ ,w Kwq`Cw, Cj! iwP6KK wWj Ew)%_I4 w:N^62 rw/5 w^ [ (w?a wZ:wVBwke wt wj wo/ovweSDweSweSw[ Ģv wEp #wW wt w*B=xE1_?xF[D xF[DDxFzMZvxFzM$VxG܈sxGv/K #xH*z xI?T xIٻ~ xJ&d,&xJ&d,xJ"xKӅI xL<\3 3xL<\3xODuvVxPt2xQ]c3xR xTQ xU \"xV,5W mxWeCǭA xWg1zxXY0xX:xY>-DxYJca?xYI>-HR x[ Qx\r)@Ux\¤.x\j x^ct3tx``U bx`3wpexa|Z^?xa lxb"kZk +xcUxdMrԺxfl xfɁ+xgLuysxhExz O> x{Vw`x{0p|x| +'5x}7jx}f ix~ %x~ %xHנ xJ 3xMaп kxQE6N\xQE6Ox@ tSxG[ +SxIAYx*f 6xNx&d"GFxL$ xL$ RxM 0Tx5l t x@x,4{x,4{ x,4{Kx,4{x9S  lxuz[ xŮ|`x&?` \xp/zxl~} -ycu2 yH% y4Zc9 ywr%[ ;yh\?yJY a yJY9y {{`?yuHz yuHz y{r yhzy o]y%VKy$L[7N%y(÷ y86G:y^tȲmkyIZk y+eu' yLRNyYo^yYo^tyYo^ yȸm6 " yQ&syQ&y5}0y5} y5q%?yR y 2=6y!#jy#|WtUy#5k !11y#[[ $y$;Ry%s y&`{v"N'y*%d!<y*%d!y*%d![ y*JMj y+ f{$ y+ f{$y,@|`Zy- y.n}/By/R4) y/\>]y/Ly0t> y1Cp]y1DJ6S?my1DJ6S a*y1DJ6S y1Ea<y1Ea ( y1Ea y2 n * y2!E y24'y24' ay3ٮ)ay9YϟBy9`0vP y;v5|yyB %yB ]yB yC:xǞY*yCADeyCF=CyCF=CyD. 5ZZyDU6q+yDÂyEfyE며&B (yG7 8*yHH yH6e?yI}\ iyI-K0\yKNN2 6yL;4 ]yLx6ȵ:yM.a yMfU$G syQӴٯi2yQӴٯRyQӴٯyQӴٯhyQӴٯyS5?a?_ySŇJt!yS͗D? yTV yVLЉmt yV K"yWBDjyXM)A9 $ yXM)A9yXTxҵyXTxҵtyXTxҵ yXTxҵkyXܚ! yZC^_E yZԧ\uyZԧ\u yZԧ\u iyZԧ\uYyZԧ\u ey\} y\zEy\j} y]J (_y]py]x y^5#y^5 y_c y`<39jye} lyeD5ך KygIMOғ:ygy7KBNyhu]8:PjyhB'yk BymgQV/yoS=6yon cRypTQ5ypܡ#yqFG#3yqfJ" yr;8:yr% yrT G jytYD nyt%ebytC!E i ytj`>jyuK%N iyvo@jyv;ij67yyafyyrBT y|#y}FVa| y}v6yc<yL yd+}Sky0$yA͹y `'yx߳3 yਆ yƘyn XyHcjy`#$y`#$ys17{ yqB'y, - yqO5 yZ| eyj۳b? iyHS y"_,ĪR yu,?yE5<yLy R y R ydⅾ y}4yDy0a,t yJ"uvy)'R`syC ylS $y՞MD8 y{ l $yK y7 ѣy#y:@AWyXv{y!u* y!u*yG yG ysϦ%ty Soly ynynKy"שR=y߆! yNaZyNaZ zy(;6yce yݫ-"oy1#q Y y> *(yݹ{ y0JyJ ^y"t&YyP}~pmt yTsy%WJ y0:d?ycgyy ­UK $ y؃y| yy5y:| yf! y -ARyQ;2 yU-tyv,NyDK'@ \yd {yM  yM y`/>!yn, yoEYyBfyfRrj y- yP]V  y+r yPy y[y)hY yѻCx0yѻCx0 y2`%yWcgTS yWcgT_ yCe& y %#y nyG yGyK:S5yK:SQy9ŸBy9ŸBy9ŸBRyc1NvFjyqCgky@ݮ{yTa^v+ygbJyɏnhRyg䀅1y *o> *y[ ^ yM[y\nWytek yͱVIR-WRyͱVIR-W@ynK -y΋  y΋ y/|TB yPt?yT6`[yf%_4W yրƄyUGv yUGyؒ yEy:Dmy:Dmy:Dmy(=e`yqh2RyƦe[yϱnh!y" y:rٹy,ay~ yᡸi yYlL y*c]-y*cyCQlb5yCQlb5Uy&`\y@񜢳_ y<vy#Ad y`^SyB2 yB2 yB2Cy2CHyҔzyk)e yk)ytL0ytL0yZ j yQipy RyAV@Ty}B y>tyWL y?@ި ypd Bayn$yvj yvjQyvjy-B?Yy)nF yty2+YyݍCS y0yR !yP_3y{&)j y|ʮ$-4#y7yv,yS qsy= z cNzvxi =zz# z(;m[z=z̾ʪ[zS zlyhGzRVzORz< 8z< z;h/z& zlaJ0zº zº (z Mjcz!9yC z"(*Tz"L! $z"L! ,z"L! 6z"L!sz$j z$V4; z%S*:z&(!z&(!Q z'|9$"z?n7z?bwk4z@zaz@z"z@zzA[=zDA`Mf$zDJi DzD`qfOzEWС0 zEL| zEȤEwzEOn\ azFhb?zFbij zH#t1NCzH?]izI,zJSdTJzK*U zLo?_rL zMY zOn< zO. zQ ֻ;VzzQw6 zSJD7ZRzTI&RNzTYzTYRzT[IQ>c?zU  zVlzX6ٮ (zY5}=)YzYK᭧VN#zYҰ(bz[٧`cp?z]CE<z]lX!q{z_<) z_St4Kz_St4z_St4 z`% z`2{|z`4]ȹRzaw4zb\؉Szct*RzfÄD zg zg zh@%=t zht7SzlHUUW#zn*@Gznj՟czofbu?zoWzq@;: zr vpzs!I3  zsةןPzsةן zsةןzud8%2zum&U zwd^Mjzwfɍzwfɍ zwfɍDzwGmzxﳂzyc~w% zyozyR zy, zzC\ӎzzC\ӎDzzEr #z{[ߗLz{[ߗz}dq z}TAv z}TA z}}o%z~KCl $z~KCl z~0,9 z~~Gz9z):zgɆ oz3.bD zauz9 ]z=ePI 3z=ePIs%z-*Jz7Nz[i5 zAavzN0Lz׺jqr zVu8zKB z ! z !zzQM\$z4zYzY jz5#FZ|zIJ9 zZXzZw zBET ,zBETzZ%6kzZ%6tzYa2zYa2Q zHTvz>Wz2zܧ&rz): zƔ ,zƔ $zƔ ^zƔ szƔ zƔ zE zVEe]zzz?. Ҕbz[X [jz}=$z}=z}=zP+  zt4zEn Q z~v|tzai0gzai0 zu0gрz@@/ aJz$ P z7ozs3%zڲ " zI9[z\UtzU%uVbz 8N zjτ\ hzjτ\ szNxg $ z/zzosz_KrDUz_Kr*z_Krzz}>|zX \Sa zo@C zi / a zi / zu2zE rzzCz|N,zʅJO?zυXzHEVz7A- Q zx6kQzҮNVz|:ߝmz:$H z:$Hz5] z5z>C zl*?zl*zƎ C.zƎ "zƎ z-V Dzs*zȡx( z禚%V]zʸҷPz_Brz.2[Jz.2[3z}h =zm' zXzg zG}U7XztztDztRztK z/cv Uz/cv izv8 zӲjz,႞z,႞$z\D#zHZzO^CGIzO^CGI zO^CGIQz֦5`ev zֳeH] z*(R z9 hzwkB)szIZz=FW,zo/,zۿ#<6zۿ#<6z6/ Kz^G+tzޓ݈zf zܮYz)~e zމ*I{z;_q zd$/zLYz\T] z< z$S+; zL˿E Tzfzձ;jzZٞzC_ z )7Q'z/Pz$.2z38WJNz|?zְ Ͱ;zm1d zdIzETeGz z jz3}&:z'pszG9/ "zhpP m*zhpP +z6_zTkCK zv* XU z]@, z*kyiz>C;tz>C; izbkL,5zbkL,5{ %{vMa {* ʝ {{J{{J{(4hK{&fKH{&f'{xgS-xu r{V/o %{”͟X { g#v{ g# ({ 4; { >&0" { qWð[{gx W{gx {w,{'/t${H {eYӤv {rA)C{j{>?{]OaĘ{*e{FR{F{%Nm {haqN{7?Kk%{[._D{r.v{uB̫Y{h4S#| {Ņ&b2{Ņ&bK {Ņ&b{I)jLL{I)jLe{Qdv{7T {^x>={4eFh{b/ܖ{ lY{R/ {nY {} R?{ @{$iZ{xbn { k׮W3 ({!L7d{!L7dD{"\{SX{%mt{%L4F{%ʍX {(ҁi{)W) {)4#z{)vZ;^{*J ,{, hvt{,Ĵ ,{,Ĵ{,Ĵ ({-uZ8T{-"rv{-"r \{-ƏϰY{-%s{-^HV {.  {.@0{.@0{.@0{.@0Q{.@0{0ީh {2SY j{3""!{3ޭN{4$$,I{4̯dž; {6`w@ {7F:{7zp!@:{9YJ3{9 Q> g{:ҟ8K|{;yRM;{;yRM{<PUb{=t26|{>s6 {A j{A {AEL {BP0L8{eFqh& {el֠{e.*E{gP {gP a{gP {gP {h`_ {h.{iA @D 7{iA @D{j_N{k6_{k{lv{mcYK {n0BXz{oc(Y7{o  {pũU8 c{q. {rH153 {rH153 E{rH153 -{rH153 {rҀu{tp58b {tYґT {t^ /?{tf4} #){tf4} {u5"l:{vwV0|{v^:{wP)I  {wtv {w$J$ {w$J${x,X {y A{yOF.{yT ? {y^ cR{zlB{zy;-{}UT!Y{}UT!Y{~D%{~D{5V'Z {Kfˎ6]{Q) {Q)L{9t#{9ta{%܋7? {%܋7 {*cP$D{c7{{ s {l׽e{f?[{ S{ix˷ {ix˷R{Hp:{ {Tœ {nWX a {ʖj{^H { {Ag \V{Agt{!K {:-~{\ {\ {HZS {nɤ {TN9~{߹eS( ;{3%{ɜJ[? { {F&P{6[{o{Wߝ{F9S5 {o{^5:t{&P#` {&P#`v {{c {*uL{_t=3 {KIj{{ (M{Qmz#SY{Qmz#SLM{Qmz#S{D{D{݄3_6{݄3_ {:{f{i/,x{i/ e{i/ {]aY{6A5;{!.gk{l|Ed{]ɍC {wD: {C{D{d@Y {L}$D{"6 {^dzC{T,hFq {=R{* {b_吘s{>ߞ{E {E {a A ${YR{e4{aB {E ޺{n81;{e , {1?{ t?{HI ${^ zN{C^{C^v{ı|>t{8X {Ȁ04;{pN-{zʹVY{@} +{Rd{nI m {ˍ;{dT{ΐ.P@ {Ε1_ {|iim{Ѿꞩk{a {a i{a {NB(d{n{vDAR{vwO {P:{{ֵS-9  {kPJ{%^ {3;Z2j{n \{hNV {3k,D {^{?BQ{?BQ{'moQ:{`m9{5/2j{wmK{5(#@ a{Q3?{Q3 \{Q3 {Ui$!C{)kt{)kt e{)ktj{)kt {pY{C?!#9 ,9{ &M= i{hHl ({yv{2gu {dO?+{={=9F{[f {7N\{daAv{<{<{.3{>G{qi[^Rs{j) { -U{v#6{)Ǜa{ | Y {>פ{ J{enD -{P6\{f1>8 ${ z {Anj{l^${ ɱ_{8Y {?3{AKWZN |3>[|gb) |I.|j>"|=B>|۞"|2gv|a, z|a, w|a,X|}|t{g&|v{ ? |F'=|F'=d|ԡ| g | <"D d| bR_ S| yy! | pӻ| =D7tn| /=%6!| Bmrqt| h?|/V|NI[C|:l-^|:l- |л i|us% ,|]Kp |]Kp (|è' |y{<|y{<|y{<| }|WV $|Fl:|;eGsp|;eG7|;eG ,||Y|> |\]< |\]<Z||W;u|a6 |)P!|9|"t?, |$5$w |%Fk|'R'#u &|'-p|([|)K!|+ggˑ|,!(R|,;= |-1g|-D-1|-v* |-v* |/[lB h|/7a|0lCg|1,?|3  |5#r|5_o|5sR|5. s|6hH7it|8ۗ.B|9.W S||93B | |9M(p |9T_*(|9o,|:j|;C%s|<߽^0I |<߾,n_|>&}^2|> kL|?+x?|?v|Pz<>v?|Qd;lQf|RqI0|STn! |S"ψ9|TK FUI|TO|Trp?|UrD|Ufϯ|VxY c|W9fM}|W2 |W2 ,|W2 |Wb[ |W=d |WS/R |X:~?Y|Yndž7 |Y o" |Y99롬ws|[7vZk|[Q $|\%i~ |]y!6Q|^jkɈF|^jkɈ|^jkɈ|_(;^|_Q n. e|`l텽|a<&_\|a7"q|b\|tW|byj|byt|b d|cI!3|cy$|@cR|e>=pC|f,0|f  |gLy "|hv00?|i~|3 l|j#ʾXl \|kcۤX! |l $k|mWlW|mpX |p C||ptq #|ptq |qEH޳Z8|r#{lZq t|sSR :|uƱ |v)2k|v)2k|vLqj]j |v`ޖ/ |zOtb|zOt |zOt|z#-(|z#-|} |~p|[|)y|*@S c|Jk |[BV[|0et|0{t:|0{t: |y R*|y  |8`&OR|#K M |Jv |N ||V s|G ]|_EL|Q\Kd}|Q\Kd}|92j|uz}|4.8P |{B#|{B#`|~d^||F%sӜ|mj|hS|I|gNG%|z;g?|=z.<|ߴgK|ߴgd |x2# |e4kB|sT?|sTRw|Rixr|Q;CE |FS"L |ݻ*= |`IVJ | "Yu | "YuQ|w|6A_|4f]R|S^fr r|UNjv|.|.K|.|.|.R|_ժ |Yh~|f7S|f7S|f7S|f7SR|T|4A3\ |?il|@Oh |26|}Z ||fYׂTC|~%# 5 |aK*/ U|aK*/ e |ï`A~o|ï`A~o|LN|ĸa|Ū3Բ|A |2 (6|24|2 |2 i|2|@tͻ| |]|Y |ݜ}I?|,@FZ |C 8i \|̝d |RZfY@ |͇Q ?]|rS*|0N?|(%|<TI'|B'[|J&|P $|eپ֣ |[x |]%Ut|׊$/D |Nq |4nR|ډo- |ډo- |ܬb1 c|㖱i?-|ݏd1G ,P|ݏd1G |ݏd1G $|ߚ|>k |<N|㠝N a|㠝Nh |!5R|[3hS|F$O|F$?|F$ |b (uL|鼥 ʔ |ԘN$ #|!|?|62+|,6 Y (|xeC{ |*$* #|*$* ]|+`H|\i|\i|\i|  2|B0-|B0- |B0-e|rN1K |x.Rr[|Rj|Rs|ʮjL| |lo| S |O\R|O\j|O\$|= |ry`: |Aq,I|Aq,|3/DS|,\B |\(|'R`= |z/ȍD|*D j |V^LK $|V^LK ,|% | _ |-|t|-|k|-||f>?|osQ]|osW|os?|-f }fO@}HҴI8}.} \};Q3}D*};?}; }(z*b}(z*b (}(z*bj}4 7}4 7}J9]}}d> }mE}?Q}4X}f, } L} Ղ|0i } +*X} S?} 3d} l \} |}nBy$}~Rw-}e}DM[_L}| }> }Ѯv }S;)R }O;&l}AP}A}cZ3G}Z2J]}Tw a}(~S } Ƨ}2_}o^ \ }o}ZF }ZF#}Y1} nzs } nz }!die}" y}ֳ }#; }#;|}#;9}# <R)}$n̴?}$c!}$Vk}$V}&jڻ-}'1H?`u })oЫ})oЫQ })uUYs e})uUYs })F})g }+2TS}-$Qs}- "}-r;t}-\о K}-0#|}/e ^}/V i}/׸V}1z#W]}1|xөu}2?1}3v@ A}7; DB }8Z}#}9ʠ)}9qWt}:[3I  } }lt?}}m?_ -}mߖt}mߖt}nH15 }nH15 $}n&_ = }n* a}o[ڃ"ut m}q~SmS}qA*(S}riB9 }s)7Z}sR?ΐ}t,[߂x .}tE^ }wOjR}wOjs}xOں N/}yվG  }y[r= }{2aN`b}{h$ }{[}}!*"\ }~Yt }ޒ]$}ޒ]K }X҆;&S}X҆;&}2n'dj }7 {SJ9 }HobR} >8 } >8&} >8}S}L} W!R[})7z1O|}h } ?La }ꭖ }Dh10}z׺7 i}}HxF:6 }a)}>l}֙+ &}oL$-}+c }# }) K}8F~ob}ş.z:}};4n&"}" },֧w }7 Y}u- wK}u- w}W\ }a97?s}:@ek[}x }0-Q}0-}:{=V}hkxr}hkx }2$%a}Z'}tJ.}֌Q?}[PB }KV= }#HmM e }d=kA[}L}emH}h(U }?^8 }.^v};j};}L<iK}[.̬ } }P $(} ,bd}2}2 c}J-F 5}@^P+ }ET?}d=ٝ}M^xW }Oz# }LdD}1}qz}qz .}$qk }Ei^j }Ei^ (}Ң+a}E }!gt i}F>}㣧?}Pnl s }Pnl a}ñ;<}ü+z2d}ÿ;_}y(\)}ņa?}J] }v5c:y g}v5c:yY} p]}B͹#Q} }}Z}W:N}$s0}8ې }~ z& }"ig }gzR}k}3mIF}[tw})$kq}u{T }לw& };(! \ }c-ږ}c-ږ}7.}k*Wn>d}uPB}*^UлD}3}}Z1y }@ }c -} J-!}W8S}\y`i}&e~(~ 8Ga~I@ ~I@~8&/?~#2mS~#2mS~#2mS~A-. (~JoLbR4~do&Hj~r; >~]v~&ʼn~_se~pyHU ~ ҳ ~ K#~ K#~ y~ 2"T$ ~ wwT ~P/B ~XEa;~}'~a (~+5~Hfs=O ~mǗ )~yiT.]l~$~\m ~r~}HDD'~(*'~~j~ p~ p ,~!^7 ~!^7 ~!f9J ~"? ~"D`JU ~$?y0~$q@~_ ~%UN~5P~&k~'}H ~'fX K ~(?] \%~(TVNe m~)c ! ~)~. ~*f i~*f~* ~+i>_~-|b~-p!* $~.$6 ~.;rGǗ~/ޏ~/r;JfPQ~/z (~1$E ~1d4~1ݘ{@P~2ʽ~3` o$~5wX ~5ݼo` ~5+BY ~7TYa$~8Í)~8Í)N~8/pK~9#~9!J ~9=@K|t ~9=@K| (~;N86[| ~;S"~;m~;/;~;Xu\ ~=P D~=ɶ$~=-[ ~=-[ ~>-~>-~?^^>~BA'Z` ~DYB|Q~Ey()R a ~F>_ ~II~II ~JdƬIh ~JdƬI~J5%O~Jڦ/;K ~Mjt ~NZR+~N` ?~Ocv v~Ocv ~O`I b~OOT_~OOT_ ~PVėMe ~Q=ǚ-!~Q=ǚ-$~R6 ~S'Џ l ~T 6l-~T" ~UEg9~UEg ~U<;5h (~W4*j~XFx4ņ~Xدq ~Y{HX ~Z}R~Z: 7s~[~ BS~\ol#~\ol#R~]y'Nk~_۴~`;"~`;" ~`A,$~`\5;L~aq$Wa QP~c1dÅ i~c5Y(b~d: ~di~d?.^Q~ebF~e1A~ga% ~gɅ D~gɅ D ~hk R*~hx~hx~i qy| ~jGo' ~jU^|~j8mk~k B{8R~n+o:C-~n+o:C~q/u!Y?|~q/u!Y?w~q/u!Y?M~q/u!Y? ~q/u!Y? ~qMǮ'> ~rK24~s7>ggI # ~uM@9ٚ ~uM@9ٚ? ~uRA~w-7 :~w_8 ~x]W*~y#>xw̧N~yǵ,z~|=X, ~|Y_~}{~ $ ~LgS[~WlI~ ~ZC|~`~k\~#h7V'~ʑb4~S[OM~dF\~E;+6N~wu$~ҫFZ -~?pd ~E݊o~E݊1~E݊)~xfd ~<{~ # ~7"J j ~[BB ~ ~ ™H ~Cq ~tsՊY~QmK ~/? ~+CV~tm~*<]~? ~? ~n~?~'n ~! b $ ~z;",~ z\~+T "~WM| ~9j~DaS~RPj-~H1ҏF ~%iٗ~Hb ~Pa c"~)֙e~ ~ j~fsK~fs ~fs ~3%~">% ~hX~It -~[C~g@|~g@C~`|I7 #r~j0 ~QN(Ŝ ~1K~V~V ~~L~ ~ǧ6V~S  ~;U ~9+[~\udrR~\udr ~\udr?~ߌ ~ߌ~48Mt`~48M ~g[[~𥽇NR~: % ~"R ~)BRrV| ~h!~L~; ~XNՄ ~|c(h~Uߨ(~Uߨ(~i'T%~RC.~ŶrE ~< |~Ñ1 ~ŹW~ŹW a~L:={~{1~.w#t ~NAd>tB~c8h^ ~ˎs0~˚(I~˩>HQd~(~3aL~VOdF ~r6=R~r6=~͊^~͏G0X i~K( a~6RP#~ϙlQ^~yӳ~yӳ~Ѫ6' ~ѸIgl~wPj~wP ~wP ~wP?~Ԥn~3~3$~-ڊ_ ~ع\{~k&G#~ـ%|F6 ;~ـ%|F6D ~ ^<?-~ ^<s~ ^< (~~oh/Y~oh/ ~۬_)PuN ~͜/ ~RQ+~ޕψQn;~7\S ~$~1P~9V8~9VQ ~9V~%2~%2 ~6Fj6o ~RM ~r ~r D%~r ~hx ~ӭFlR ~֫ ~v=~s_j~~ʓ3He ~By?~p;@ / ~8YH(u 4q6q6%MN`}k؜ u m{L1S=mp 01S=mp 1.K^2U%rv3yFU$zY3 4&8L 4I/0h5/n86XST 6nNx7K@W 8fx | 8xk\ 8በK8t=1 :C JX;+h& =K) $=_ődU=]>7??kU_?kU_ @m~@B:AR4 Aĩܟ @ BS*FLDY?jDDY:!D EH E0sF{H $FguGlE 8 GlE 8 G-ӧ Ho7 LOY Okt9O O js O+Q ̕2 R4+R(tjVI_4V["VYW' ~Wu;uW.l} "X(OzZbZbZbZGpaj1r _ rǙA3 \sBH uzV_ w`)/xz5oAyE^yD ^yn]y? zgG0 . zk{d}Gk {j13{V| {TnI }n? ((?hx6=ߩ]O" YbBKi] Z+w+a~, |N"f^ (;ōU @$m :??U LzP^ R  l!J; ` + ; ` ,"U "Us"U (]B  "7CSK&ŀ<: }^jPφW+ PφW+jڒ!~ Y bX4Jax/L eQ[ 9P5PPPK=8x cnV Q YO (5n`_f  "8 LHfRa>8\㰈4 C C ^C \r4:U[Ft IPdqviDʞl&q10X{Wuٌ "c. ]pdl vTzvTzk43sgi.W f"^ S1(o*(o*+J +q?   8,Ad5Ä å ,c \d5Nƌ8CjT+ʃYOʚ$N:2r k˸<]X6X6KΘVs؛AZΘVs؛AΘVs؛Aad`D:d`D:Y к+a h.W(;kw^{ g0Ƽ o$C C 1K). ؝CUGBq<1N7 ip8=` p8=`Qp8=`g;T7C!@/KzP YՉs%CAx0ǦdDw>- H>6p͸hݪ퐱%M $Y .ްm+9Sްm+9߻l6 l-K I֮I֮ $=7#9.K [/TZFuʐ NxNjw) jPOvL POvPOvS!zꣻVꣻV#ꣻV$jy\[ ^}l:}l: " (qi ҕt:f,1j2{FQ':ELYv (򮩍|^j98^j9t -Ή]?[jL gvQ $&T˫9^0A5R|:PyZ#1N )7x $)##)##)##0,EyC7 Џu Џu iЏu ,ЏujЏu NG* )piR ?. h2] h2] k qc ȃ[ O j kb翽  V'r raM raM Zd}['NwNwE W]'S nL:PS-Z#W2 Q)|  6>L yI.s"V"ܦj e"ܦj"Dt##4b$% $[$Yh){R$Yh){$Yh){%˰ %b{? &"R֭ˤY&"R֭ˤ&|Yw'-Vz )! s)!t*i Aa+h*M0,[,YML,[,YML-,bf,bfD,bf02T 042UP? 1ӕ8 2 I3s4jY74jY74jY7Z5zX6'B  7l| 9U_N^9yv :${;m ;m ;2֤ʡ;x <_X U@ h A쎆A/N AE˘R CnHL l DMOE E(YE BF8, F*ؑ! IAz[ IJ Io .'KZ KZL-xLWE{݈ MAu'Qлcf S~S98BS98BS98BQS98BDBS98B&S98BS98BS98BTwTc{ h Tr("{1DU)cUȿ1P WoQ[W={*9WRC WLÖ YR&QUYQrw[Yc#YcYcYr4WdY?w?Z>3bZ޵p`9Z޵p`9Z޵p`9Zd?Zdj[T: #\ Dx #]m6[]p?^?_ڛv_ߔ1 _駲2e`0/\٦aDKa> % `4b|`Db|`DRbe"NbUbQZ"c-{ mcl.tdz'nG .e<e<e<]fLfgVgr sgmڗg$dqh.~]^"hEd h+m&1hĈ iWYjj_}9jekt}t%#k s=l\ 9nְnְnְnְknְnְ mo=6CHNp˱ $pcFtlqSlq]Uqqi?Qk q^nr }mWs&# s  s'&E%s'&E%>s݉YsC:RtG? vCLKvt iw96Py gz y gzy gzLyI;yI;z_ m%{G  |QЀ:}V[8F*~;+ۗT~;+ۗT~p ~ Rf /ʵ - GC %X%Y%X%tH{Yrx]Z8Zr"  | x U-p,:lwpC+Chal toBQ oBQ }v*Σ6rI loKs]eˁRd]eˁR N]5/?loLԛq sRSO i=# { -ך cֲ|e( e(j$RSߧ* ;kK?] 1 Ns "S "R ٳ*U ٳ*Uٳ*U m m (t c !f CGC 5M5R Z )1# 2y' S+FݩYpݣ`{?C;hI ~f|?OiphS]2j$ ' ./+u (J ☋ݔN,kC&ˌ=2kLH a 3 3DA 4O}4"C i>lrSi>lrsFǼgm gmCjC ,a ,aF&sl [ _r^D #NX j$/K%B (%PU%JٳNCHp7CxcEElY,=E֩si Gs G@L H3 IweHeJ ,LJ!YN )D P x"LP4L?Pl#,Qw 9R($sRO TS VO{2VO{2kVĨ/A V8W&0t`YQ ! Z Fm\bZ  ]%kv ^En7t`c ja_=U|!D a_=U|! a~ybID c/E #cǗ0eWGyf_rgc +ix jY_l$M jbі kdKl_ l? $ lV5ݥm "R!m_E oH pG`Gq6m+sUs-b* tvt .6tvt . tvt .ftvt .tvt . + t9ĩ u (lu (l w Xw_GD w_GDwצ'oswצ'o ,xuMQSxuMQxQ/} zh=]zURzUzўkoT|3}a'F}#d }^ {~SDρ~^8*tڍXˉbC$ F Ž 0KHJkY{Ke;q z9P3t'M e C[YG_ω -9 ajU ajU ajUc7 LRqp NA/jo=^ a? 5%0_8x 1IT O<O<R/ PKs42齜? c߾saO'gv|P.B (uFfIx,,%\ (_,W#I54N54_Z"N$ tQ eV2ձ V2ձںI$}K+$HV ǚkr[Y++5 R;]R;R;k;#+##үiA g qA}B,@@mc-eٮ R]K-* P%P%/Y0eER !ղRK-y3fRIUn w?ٙ3[ A A ,³V\CE'pSSxQ"Y5Vl[ЉGց:w -M9qֵ A)˫J9_Ýp+>!Q<ĝR)?4jĝR)?4tĝR)?4 ( NVc Z/ۄUܫ| a(`qQ:Cji%&1.aOɍ(U (ɏuD1bBH #<#N퐵079075Vm3?hd*MVΡJE ,wJA As Жm. - %T Q}:Ӡ¿ݡ,7 R+c1= ( i; i; qMvwaqL]BR?Rڭ@l ( 3 {  ݼkƴzI0=:cDH4g{L{ՙu) ,U3:Z5lRBjuye.qKCZ$RU G7ۊ aSK aw64 =ϳk[$s3f )ǂTfQv9+(`Gw Jʫ:(M Uh\aćZ&taćZ& a wX| 썤[dPg n8R VwYIӆ=?E T`n8o? !K,= !K,=D'= ( |"|"2 e +n  \ +n cs dVF jkO.ݥ*ѭ (s7 @"Gry(dtI?i 4\rpD  b HQD EY (> RRe  \S[5 х%0  s.+K s.+S s.+L ȽC i' ȽC  i L>`?B'v?Tmh7:) h7:) g ԝ him W1?b, YsrWXG ,qrW;A.G ,Bjd_D^|0bE^yU 8fn'l  i ŀ\ HY:0K =^A J\ i sETm # Y$@D W MRc W M W M |"GQ۱ "vI?{L"hU"gj-"gj #{Q$y.$ܪ%Q% %R %d ((Dx\"((Dx\ (_]Y (f|ld(c<9XS(RaR4f)q|*,Di!*H\p(s*kd+Yu, n,s-98S-WԢ([-~Ds-~Ds-q< Y2sV5*6?(Y 7$sR80Z{3k80Z{3b 80Z{39AP9CLF;O'9 >;O'9 ;w6<2uD <2uH߼ >H߼ >H߼j >H߼R > d>@m&?:,r??(0b @2 AdF@RAO% rBۧOCP0S}8#D]37pEDrG ENbF7yS GC*oK3 GC*oK3GC*oK3G87LGǁ=GǁIb,ᐔV IgoJ'' ;J[sDLKB \AKl…7vMdMdMhv a N"%o> N4,o -ON1zR P!gzoYPjR9&?RmS.N  U?N B,V s*;l VI ŎVxQ:Z􋰯vZ÷TNZ÷T\0G5R]d׆=2S]d׆=2]pң ^YR_="IK_="I_="I`f-QaKv@" b$o[bbf4gdqimoRiDH \.kA lSCtlSC: m'o]3 9ms\Bpib&p*#~ qJY q7RW"Nr~&#>~gVaa 8R' 52q g!s ;({Ӵ T[?5]\ $##Է!i% AA@!MN ""%)""S ^܀. k }@ǒ}=}@ǒ}[ ll۳2ƻz ƻzbƻzjƻz $\ѧj " z &)8Wa懚{kۥ Lϛؿϛؿv2&8RƸ2L M9[? QcΛh y:Tߠ ? /j dJNo`Z>o` F!ERTjM s17{ Ǡq # 6@*E_EywmSK!R*NcMNBs rP ; rP =_`Sm.5t,ߦ&p ˜ +R7#2,HZsv],SÐ݇dWê3LO"Yê3LO"YLCê3LO"YS@1X 1X " /L|nR?lDm^z N i \Lj9 I >̤0ȸߵXke{Vnm 10 tyӠu̦}[bSK6 eۻiBS\ nV" #onkgK lsyWayt,1 J|~3R|-R L| ҡ 2Kodۡ&u #lQ IHYՂ ?!]" ֺ}>ֺ}>R*vED ; ~ eQ/{->@ ږ蝵B s~[!Ti -M#T$| 1K ]&i cglRglȢ N"E?63 - u>c 0zP%R Tuu t e =NMζ ^ q k_W? ^'Y3C &n6)+S6 !+S6 +S6 $ GQ%;Q 4_SlR-K&q e(MF?1H7[C]8J-8J8JUtUDe SP5_ڏC[3x l @Os@Os}@Os0 |{bGKm&N"4=_%2y>j%J %J)g|Z%WB1xc \ r2a T a T U$ ຩC $ dre?XX X X ,X jX%#xD  cpj6aj6D#W?]>euR+h8hv hvby} aby} $AJK l3 t W=a_g FL3ZoEd eoEd vf R  $@ɸV?fޥ6-!}& a!Ț"w| #Ap$dn]%x=ޞ:%x=ޞ%x=ޞ g%n.%F[! %F[!%F[! ,%F[! (%F[! &J./ &Pe|C 7&Pe|C i&Pe|C ((4iR)x )Z i )x )Z *T6*i+;+;?+Fձ /)l\b/C}r s(0 0`GT028p! 1{ 2|^E 2B_># a2B_># ^2# 4~fA4~fAt5y/ Jt6o'7S 8Π:~oX;a^M} Qm?QÚS?^be*@XOJS BhPB}6ߐ%C5l2dC5l2C<֡E!t, mF^QGWX@GWX@ tbGWX@QGWX@ OGWX@Hp? HH\RJ;dB J vJfH/JfH/ KNy L 1?L䎫@RLr{M[ jN'n>ϯ \NXLNBY[ mS K S  TiGU8F}UK VK^O# VW^ [ eWW eW W XGUXGUXGUYXGU?Z9MmsZqQ<RZBޤ ZaG[s\t2z@-_ ]Mh `H amamab4LYab4b'Yb\b\ md0 $dpcei}.eZ fR6/K2fR6/KfW#kg6kqhkTi~ɶNj? jRf"I kTdo#k]Z?m J \m8{j nF *nQt" nT\gnDLo ;_o^3a.o^3a. pDfq pDfq p1/Jq{LA q Hron s|"&z^4t<۴'[tG)4t_? u 8dS  u 8dSuy/8 v!,vwC@,x.7i{x2_ݼ' ey*dy,yM) ( zMj zMj $z0+z0+j{P)Kk{J#g;||9cf |g[R} >~* 3`~* 35~< yh&N r<&N r e6[KA mbR0 JX| c&XJ'(mR54fk54fs_QH 0NbU Ml6خ , 7*9]1ߩ/3 is  < L<YsD1 Et-v?(M: j z$ xR7z$ x3A/H? To , , Bdjn .n4)َk|h#)O9 ;f? Zqt ]#" ZnZnf,f,-gf,. jίES#RL-KfYge j=V̵I !A S $g99R;R ?9Y kJ y)%0y)%0'9OV#Hxj%5 |\h.`|$]f@Ok ]|$2Hd{,dZRv9 # "D,MD' ' 7O x Qx 1=1=:;] HO 3)LB7Q#- |a> ݔ{ ݔ 3 ;v| Ÿա;?-v*S. Kv2Y 25+;-4?kP\åbq  ǃP >l t N?L`:>3ΡE#O ,Ϧ4-C tlMvf\-Ō1b~YyOp sv0A v0A v0A v0A M[ $w e|#>6#>6 #>6#>6|x& u (}L  S/M 祰?  ZFw໩{K =@>Br g ~D[KC Yc1?6* # T0> $ 噹91A噹91A JPEOP O1~R ʕ׮ ꏲ'O⃾sY O⃾s;w^ ;w^yZYUu;)Y Fs 娼ev娼ej娼e  ,s , -B *XvbisO6]1wubz~tlHf;su5|!˔<Z}U;t*LC; 7?y5 06w06wRC ""ؚʿ (v^;; 6g$ 6g$K 6g$ 6S  lz5  Qe E,R Xg} H =H) ׬ D  D'*GW S<#f_Y`oN 8\  8\ =CAY!(% r!tC!GNz!}!gj?"O7O3T ("O7O3T?#!2~S$ RS$pr &a '{02'}M(u*Bё$ *Cl - /YdX /΢/ΙCm /M| 1NR!1ZY 3)64lj\5 6{C =6~ 6|؝ 99EDSD:.,:,3;h K ;h K<՞^S<՞^<7T0=<7T0=?ԉ"x-?y@uDE#B2aE!c< ECf?GpPsdG|=# Gx@dGGx@<Gx@ JJԙBFJԙBFK fvM`ٰN7$NY_ Nv:~|@? QrN0_l~VS4#m !6T-hju3hju3D iWkZ j-r i j FDulNmamQ43o.oNKo.oN oxcX p}" +plWq*|t:qrϱ-ss&TtR)bu,du>?v`Hvw+4TayQRyl~UyS yS yEdSqz業*j|(z業*j |{.o |̨\MH~cf ~gd=~p|Ւ|򉢔A||򉢔A*o(W %eHkK,Trd 5#>K Z]ht]M%:c[QYѓs QYѓLa ="؟E`&?}& NNe] `n8rՍ[; #;s ; i; s\PME A.Y U s * F?%I&vbMx  h h ^i"[tS_1{ i]9T@$ Bo^d ҴMp O.D O. %PD%PQ%P%P%Pp̗ ml[JJpKm0Rg $ l_%t -PO' *Z1sq+>c=a?@]3O |$?"<7:"<72vK?o\a DRheXjSgp _W3K ayL6'k!/C >YU)bYU)b `j7qZ^=mBG:QK $:QK ;)x iĂ .ĐjIY@-6Oz0z0sp̪s+A s+A $ W} :esLQx˂} 303QR jjS{xs5S{xhϯUW"֖5K#֖5Q w8ZfL cхs*|ђ%w^ j xSJbh j%Ӵe&4Ӵe&4 $\G} n[DRm (Tn[DRm ȅ6:TK-TK-jݥ LC  ;  ;b RO  ܠ{QmAckT'f 'fTH_aOH_a 50 KS#UNyjNy921 oiۖ^$U  ,‡Fp O? RvI +_l f(1"183%rs}DDrs}D +InMYIp1 %?~? N9O|/iiRK I=S=S=SBΣb] 3 ^  ܤZc!2? Fd$]!SrOYkxO}+7`)v ]J58oT2s+T2 b_.` 6Ś+4IKq kV"kVk\W,,?vt!tB ]?%_ +kMN  rIa+a2&52&55q j THK m ZJC - I -  x_v $Q, ľrsw ٪ ٪ a]a~ Ӏ|˷ Ӏ|˷|1 pX5YSx `F  cD | ( 4 5UeXdY-zھ+IiELns+],wfTnNg*Rl1)L![/ (|:cւ|VB+z j\& םY ( 2p!+(R!f,b%; &? ( '^ \ (<ʣ._)+^A? ,e?-0 4:e-17.;yC*0.%1o#/ojuw /~ ehL /N 3Q /q/qd/qR0c( #2(#t2l]#N2l]#2흑=b3>S4 -4\omԜ 4P"]5b:5a(6I|76lpDxr 7쐾R83ǭ8RG i9zDj :>$ \:>$:?) $;Qo;Qo;eԋ <۶zR<S=h?R>:|?9 6[N ?^$ ?^$??Iv@hIgca AbYAVpdA= QDqt ErM: EmQXK ^LEmQXK|Ft7sGxtt$$GYv@N*IfQdRIq$eȗIq$eȗJ |J |Jr0kJq^&|KJq^&|jL<O9LINjMxO M_+ ,NH4_ Nڂ7ZR4Nڂ7ZQ NWǏX OUyzO4Ƞ<ߨP#UP%U-B9W4u9 XRvXǓZj U Zj U #]n|Q^W` ^TaH_IP3[ ]`^{} a앺bzU Hc8 ΅z5d1 e3: -eE~>b eE~>beR e|cYe|cf>߄gwx~uv h-|Li!Gyt i]I8 ) j .{nljag jj~R!U jMɳkxj- ,kxj- kY">kr6kJpĵ ,mP_|L nfnfQoNoS3L3[pa /N pa / pf4XrEsw c s+vin`s^vVujw#MwOE ,x%WC0RyHg0 2ygNGzOp z-Q{R2|C\iB~%0`tr?zs'sھdsھd $ھd t*ꑞD3jlB E7?Ƴ^_[QPı)[EY~w eQΧ  RL y3M ˿w #< \n .x.&w1v0=hL WW; :|T%(u Mu1]/VKE \hY7QZKkcOZe cOZe* c #qэ R#Qλh&R#Qλ |; 4ʫ# 2R/?yE|xPD FBCħgFVQJ^ٿu??j@2 @24QR|4QR|dk} k}Yj: j: ?j: 5_p)u fw?/ 6U?/ 6r7^rKf%=3M? #y |RD?(/B[[$&"#DӅ b ZzQHm ;QQ$ Q6y#° [ }3UۅRPۅRJkY! "G $ "GQ);ʼn کz" sprLJa$Ve)(Ve)jVe)se % <pO~  m Ci{~ )GgDSˆ-Sˆ- Sˆ-siSˆ- iSˆ-j.x&IWFŠCA>{ t=R 6%B` Ə2C<{Dž#e6:5 %̴0lpM  v7* @7y%89R; ; a;/#[Cy/#[QՇ%-ʉM( cʉM( U8b$$8& צ147}ꈞeK7}ꈞed 7}ꈞe}a+;].E \hbyj Z ܖX/W ^K/R~si  Q &6` E/6: yV\ ㈕IQ@79"Od+ ^z_ `7Y#V  \q>EBIK^uxfѶ L Z ,F?}F?|wVwM b iQH z%;jk?/%;jk %;jk ,8 qP=8f-ZL #ZL1 (f fVשn D]?{18 Rn:s!'Ys!'XF'x5Vje-] hunhunpb~0,*g,0$ -CRs .̠ )]/b2sLS2.}|4!beav456h&4O2[$4+(s4ƚj4ÓR5ăV5d[ 8"Uz 8ӈ 88ӈ s8MUj; ;߇`t( s4y;S?A i@?@ B3ܫC>M CI FA; +>GZOc]0Hצ{I0 LD'JI0 LD'I*?J UKzK`NLhTL7DŽ (L|.bM\ֲ=M#6tMB- gMB- g M`ox ,N hOZ2kQ QHB%/RsԁV71$RJ9]SH j?zTlIqTlIL1TlISTt,T8ycTc*YUFc\ U۰cX$y94YSޏ YSޏYSޏ [C/l S[PNae[PNa[ՁM \.ZAU\cU vc(]]((K$m 41Z%}qr]+؞S4Y{oF6AT+%iH-|ON 0ib0ibQ0ib0ib0ibaf~܀k f~܀^w j $ ^>9As 0§j0§0§ C^SC^SC^S&Bj&Bm  Td@ = , =h,  ?z_Uvq_UvbyS딧 8wL ]s0 BFc8 )G&ۃʿ4HsFTZQ.=R vbvkv yb - Ra* ^$ )⭅YiR| a$'$ Z' tc5) Z"  CAj p; E-P VFNfbU^G >d4|d a:9-f &dAN :5F)5 *?(C W *jf5@hn>5Mwjj&45?Cd7i \j7e8{Z9(k=9Zs 9`'d :yӿ;_9m# ~DK>h >h ?sujAGE%j AW!y( CϏ=fCϏ=fCɘ6FNqG F]FG Yם $ G Yם aGd!Q IGOt_IMpGCIIpX + JX4Qo: LD䉗PLD䉗M{}#PX Nh0OrTP,PdÏZ'PQI? R`#Q SL\tSuA>)KSuA>)T&N&<[Z؇ c1 - -? , , *IseHyD TQR3TQ =H-% '@ z'@? B poU_GsoU_G ?%9 3c./Cje* ƅ; 46 ˳yZX aMjaM aM?aM }Jj yY 8j14\T+] Ev;#=ִ-l e2mhyxo.hyxo L^\Uv `Dv!Y?[]QR?fKɤ~[~vo?GS $0 < U %[ kּڵ^v՝!%4[1$ St`p .`@MyH[tv5G2 \Ӏ.\Ӏ.RR>*]eu' 1|Z 28Jk WrILBwf ąiWN śv2 jtfꟹ̻q'6 ήή-C?PЇ5cM3Ї5cM ҆>=SVԋdk߅q E4!m E6NYO 8ٿoAss Ass ULĮ s f kP@6: )i ڭ&!9ڭ&!9k"z:.]k"z:. ے)g i$'ܢ`?%cjX( DP2'P2kP2 I]2I]2I]2?Q^f'N kv7%( 8 ;%Y i%~$HA $c.f܃?K~jR]tK=c|`CV3IN jv(z#g4^F{聆>fE}fb1qUofmsGjV 4I? jV 4I Ś/j*W[ea c < ' g+8C} c6? \<]4 +rV&= kƓ(X*21 ̑R R6z1[,r #(,r 2` /;y5kDXՠ aDXՠ $2t%'#$# =][-WL }QE *BbB+)_P )_P1T?1T #)Cl #\ogM m!Hӄ{ *"xS o 1 o 1 T ) }K7 } } }* } I  @&  DZb r wB CgwTJ\6[(N7\ kmz km 3(?_pns-Ptyp'WOj HPOK2M}й( TCZ :QzK \D*kWKdμeoD!,*vsMi6 WO!h (&#l.1 #l.1 i# @$N;>Y$N;>D$hۢtM $xy"($El? %&e%{R]A#&Vׅ4 '87/'(}-(:x (@TN)@[xڅ *sU=t *sU=k+Rvo6k+xum ,$,Yr -Ӻ /|ur?1/92sca3.]k 6"<"5s6"<"58upb857 - 8sXe :U؂f!;  f;  f;xzx;=B> >k݀՟; >{o0 ? 2jd?鈆:*B3h2 B3h2] DeaEu-G/کDHrMjO K/#U- gNP)N#tLNP)N#hP*5 Ph%5fSQk98{^ S}T DdZ TX4/4Uw KU~Lt% 0Xf]t!X2P X2P Yۻ5%t YA&2 YV8 YV8[ TD[cE\\fӯX \{Db\F~( \* \* ]ghY ]gh ^DMJWb_m$`_ZYQ`_ZY`|a,*bDcVKd]WkQ #d~Ikd~Ikd~IkeTCP2 e#eKI{fQ4tO g  g9PNj thg3 ,|hAP c jمPLjمPLDj+ѼmĮLn8O]oPQ[{$ pJٙKp[rr,՟)r21^Nt ™u nwG0w~w# L(xoey,Vx y=9Ts{w45nJ(|DT  |DT }$y\}> $~]ͬ7~ů¥ cSeq\ΏoR 7pY SoHh ԏ1E?ʖ= w?gޔTQu $i> \ϐQ lNP`vɞ;<񧴅NZ}m (- UcDsWD8D84smdXbDRcG Os_" jͽb A!>A!> ,S &] x5'x/j<a*zU`~8# oo o Ϟi/U -i x<#u5v4nSIy?!~a tm@q9m@q:غCw Yiw t6_'vK'v'v/\p!-C,fʩ>d9no9no 9no TŦ [9)@~yrޅK'SJU ieY3F3&sAR[sAR[ {Rc y %m%m%mDPj\\EQ??qE/ ?b.dD' e jjk0jjk :Z6$ BB"+j BB"+k { ''>ަ8M cz yoCjwlP wlP wlP wlP ,E& E& Hs~LJu> ˯h 8pHD[xyrK dK K aK K R· Є, m c8;d $%ѓg;SdSQ dSQ Fkb^ :m $ :m{$z ( ` EL#3^ . /| KmV ZYD *_ ]ӲI *1  mJ1zt%J1z a _*X3?'G<26fUtU}jY7 Ux`Ux` AjJI[bEޭ_EN)9 _ ,<!%j 5xCh  EC Pk Pt Vr'  Vr' R*  ^C,] h^9^D k}p ry,_ V/) V/QPB?)PB?|PB?4 4Aq">]|kb^: K2JAo g.z /"G /"G|/"G ]WҰ k!\}"ji&֕_:„X>:6m[ڹMWf  ͉4  ͉4 ! *R ! *R "pc %"+r]&dl'JU 'K5l10'Zu((r˹>(~w )])GVt)m]t_)m]j )m]s *v v +u*R+L[RGC++L[RGd#+L[RGR -?v .[.eg]K./[ D01sl|1HZ 1HZ13 (8Z Af ,8هa98S>5n>5n>5nK>1 ?WϙR ?;y:?R @9!e@)`Ac m C) C^;sC) C^; DV 4 E:6CGWG Kc Ib|T Is:DIs:Is:#JJn #KP-v N-oNNQvaDOtT5Ez OX% , PGuQf_SxW Qzl҉!Rz[Z)R"S"5~S`7S`C'S` S`S`S`y;VUTYY[Vd'Ф \V<VWrr' \ Wrr' YCOY~ѥu Y~ѥu ["6 k[=qhof\FlEk \FlEk\|sk hN]=]R%K],+ ^ "4j`RaebX$e  cèC} [cFv^e2,1$eF gն h,NL2h.:=$h'j1էjy6khĤzm] 5Oo=bD ozomj pU'pX>0r3䣾! sؐw ur?q vAF B xbH {PSdɲ |*΅(@m |~+ 3}ֱ) ~56y7ZD 4Y-Hi žE'0 ?oH}D g sI c <'kc <'k g- sANA ANA (52D:|X[|X[ M!IHatBSd#7JkF]F]ՍaՍaQ|R{Z#ž5fPT+ƈ |7й й?25 ~Xw  xs[Rί~A0S~#!F+V`> ar6@r6@ 2a + };Jj<>7/Qi+ `g*BY3}Rh͝j`@ٓcP) c;ce8m 5yR>yR> oEWnjz oEWnjz oEWnjzD&B(xٿd ϧo 6/KkJ&t%n 1!Һ҂$ Һ҂5{ q\GPܕ-Cz j\b!Su-~]g9# {yS='^L4 7 Aic I B}| , n@rn@rk%5V#KS5X auH;c ")SR7l' \f7>~p?3 irt pHF;XVLaȉC8c-e{ d0 d0 Q .[  Wb2tj~veQ T~ =3q1]XS/ |2%SS c$MoU1x ,ģ'{#ŋSWԙwIvȿ1rۂɅJ ˑJ[^ \UU7|2 aH[%^MMDR ѯTJ I{- eԃ=v Եz Լ㖕\RYk՟eh)՟e (c=B. ֮Q?q J׶N:|qʿە M;oA ٪d٪dک2 Y ,ےִ?cciCDiCiCܗQ ^" \lx`' , nX ށX[ ֆ&yWOU"kA sQ]QAo%Ch۬@d ෆC=bq ܐ V.bMn|\D SjptyGhf$vO[!vO[!ꛁ8 BIlUV *h4r eQ|@bYx. e!E  \[$Fgbl' nZ`#eOP/lҏ(kR2ҏ(kL$=oP";Mo ({N[DVw[u Q3>#(i Ti2cvcS7RscS7RspFV D?J4d6I - XsXj?("rBQ! l/ e 1y䂤v Q? jqD+, i :ov%@>% Ex  0cq  Wˋ7{ mK |>  H!gS _ ,$.2R@ REՎjEՎ (d |OQ /Fp>^ !xjQ !xj#f5P $䂢$=R %Y8|%l j^ %W: G%W:?%x i&) 'k|( 0*@V]s,`3Q, n - .܉Vj /~u0Rk4(0{@<0iHm3R2 2n=$*2p2S?2p2S 4O>,5j Oj 5|;K 6 6@ m6@ &7PE 8CU/V%8Яٕ: $=q,>[>%('Q@zUt@$ϲ@S<[AT=qRAT=q AT=q A֯BbHBv^O DINE.¸ EU{rEϹmmG؃4G؃4 G؃4 ,G(Q=8Hu@/ Im)JWJT[JJJ\7{K(5G;# L]RIM[fNx2`P} gR?[>tS}ʑjBtSO2NT( Tݰe@ ^U5X WWD(XkXB+YY*Yv ZN/^'RE$^] _nЗ `3a /(WaVaw a$ߺ'b,G?*bBi%bKj@ mcW7߸s#cY|tF?d3HЃ;didW.-]d|T drOQ eg>Zex"'ex"'D ex"'hzM*jCa?knkd&lv\S lǝnm@ e%o:UHfAù'-2߁#3Jf @q]X0Y(Ǧv* iȵo&ɬ.2 @!(oojw!׉Dw!׉ Je VJe VX mNW~6P 6P?!sƆ )U@S΃e1L=Urj nѮ61 c8|u.|3d*; ,<|3d*;; /\ / oS iԼgUb/?.ռ褠f^ g➳Rfik9 CQ"CQ;tf ؎j ؎j?؞al mgR~~d ޤG!Q 4 "g"D SMD}gR}g ߓ#o ߓ#oKЀ~s&tX)) f㻧^@ڞyGP9? F^/[D A{3(܆3[1vd,/~1vd,/u1vd,/$1vd,/K 똂aY *zv ,p# 7a BK4EBK4E(N $ 7+$ +N &L񽂆; =L!39?U5H3c7k|NxS xS|_Qd ^ ,6_# aW5R |k w`"X 'A3b GHX$j ZO Zv mZZ :ԯ:ԯC:ԯٯkٯk c5 Ii(X GQ, ڛ!xLR@jR@ G&ZZDl E\uf# iS|t c_=otO?3\ r ߬1 +FT ';MAxuaAxuaEUt@^fvqx jOĀ!MS!M"<#ڄ*f%]}X8& 8K'm4'v= )ͦ^g, +[Q#W), '&iN,T8n \,tsB -yuų  .a|?.{z ,1:*z 1[NCl1_ d 2ogq3mQ7: 3mQ7?3t&H4h/34pjS94pjS9s5 @ T50 5e[Hw5SS6+ K7 7ѥ 7z3Ĩ c7|ba7|ba ( 7AR8y=N8y=9ˆ c:+j (: !. =z]Fj=م% EI! $ ES{ Gб\IkfDA2 rIkfDA2LW2~ P5ӾPL)jQ9Ppǵ Qf[xB\ R|G]R cSvzX@CXJgYjY\j#Y\jY3k[$G \ 11)^Y ^5 ^5 _:P#_6)~ _6)~_%9<%qa .lo a;ea̪E bzb'.C bRveAƚ^Ydf;Rf{{mzg=&Tv g :gV jZIp@k@x=k '"zm{uJp+z.!pj{, $qr r"uRrR(su^ u^ u^u4vm^}SDwfCa x| gvx?1+:zD"zD {s{{+Z S|oH?(B3 (B3̔`#&"  JybWOYȈ1F#Ȉ1F$댋(i;U?3i;U? q5ALsq5ALs1ż$ , ]}DӻӻK C m'X (D5 w&:Jj lWR%[g1Rg $] |k =D Q=>I53Y2Fasj\s\(j [5vb?€.gKg fw(O fw(O (sޕzP$ P[,ÂX  G%aG%ae*{ 4n #;%6hCvH(ds$ T>uf ~jT~jm X7{k"=y<Pb̥ & bu jpy7YɪNM0?ImCZ if=?{.T Z$"TT4xXmiMuk ٱc^]'1 ^[ ", 轢jB=PMqM?y; \ [Lmx`*R֦k9 q!\a{|k7|yac菆E$|菆EK%4o)#bh Uz>hjL ng.dR<9 1fY)=5l͖nss\K".˚=d a׹[)׹[׹[3+ ˘ { >  \\ Vij (0P7!BGm_ #: c[1p]v+&r CTJ͝2@<SRkRkR |dR$e($ed " ưR #%1 3 $ M0@ M0@ : +iOq/iOq]iOq{i,-C <\ @egS{-)ax |  j]|}>tU\ɰ̷] w.e ,w.e ^ ksllT:^?YEq 8`!% 2:]  t l ߻l a}d)kG7c bIcZ  wK "oqqm?"r , "SW%"d3 %z$ ' t(({2 %(\+W` (z c(cZ])72g)Gj+JQ0-dX1J-dX1J-z_.Kߩz.Zb .Zbj1,mOaJ112і5x\s\5x\s57,TY #6 FѸ7#d:'$q; jɝ = :V*f=ɝGa?d`Ӳ ?d`Ӳ@ȖG BIR~ C$`PD 5D 5D 5DQCEqZG$:ieGR?I.$&IN>E?J9 J9J9J!RfKnz\/4I L1t M*[M*[ MԩΥJCMTCt: M^6 jYNA7?D eN͕K NHB O8x ( PremCvPf QEpgTQy\8 QD # R/?|Ss!Rj`O S]Ӯ^~]S]Ӯ^~TQ8_?T`:! T 84 UvpD[ eXƈNX> <9ZVEB [N \^4\^4]1{!f]5w_N_b _ `U]aLu[ awvUan%Ȩ?b2K b=:b ZIb c= .W c>8 # e=mef R]gU hWBhm*h3]zipz L jDC j\-ja j\-jaRkRm$)kRm$D&kRm$kRm$kRm$k'hLN lӁEPQSoC p'B soV0M s$=ssGs[7dx9me+Fx{\wYx';J xVԛVzGNh?zGNhzGNhzpg.z߱ہJ z  z {O4t<|gI}h |gI}hh|L # })#  (XIV 6bSY 6bS t |#@VsCۍi.޹P `~PkRȫw2ja^ _݅_݅dVNj R fl v3vD /`qK%7K%7 n@H*׸ IJLeY(JLeYUi+~$ %h^ uj|N SZ=6v\SI(} W?=+uVHM K ]h[gY}dJgY} ?ʡ ʡ -Y]nJBo_W a_.Z , {(rQtd $3=n3=n}8D0cp`xiCU I>7><$43s /NRYf ]wƫ jƫ  nrR vD vD:tM2B}9N *-F6CcU3ZҔ.h R}IC `O M^$Key   nm[ 0IY sL .*7-J?Hg-J?H:-J?H-J?H-J?H-J?HF 7m; Η̵)6)UUJS zJ9Żb\K^~#^~ ^~*q40d:x} %U#`C/Es/E , _Xϒm֪Bʰ0_ :YJiJiJiҹ̓ZӾr!Yլ T,5x\ ]P-=5- # d|Q ١0QY[ $_O &ףt&ףt3l ||5M]R ހ:˥(va3zW>a3v@%n %;q| Mk~z 5s  ]B4+B-XQc D D.}$s3D.}$ D.}$ D.}$ {GOQ Z.(YZ.(Y :/(0l xV a (d)9mVqHh| %0 _8aWRUrZVւ SX' ?f $) & -?'-?'Q aчj<R!j 7&:umwyuO'.  \F]ER ߘ ^ M ^ M Ms lV>  / Ⱥ / Ⱥ \0ov 2.}a $b, # $ >Du a ]ֹ9)]ֹ9j ³&³& Sdn Q}  i ? 0H\y#Y HT{  r?CK r?C "l"@rÔ#!} #_ /#_ #_ #_ : $Fk 'L ( a [('Z(;1H;*-?+.Yg c+Ԕ C+Ԕ,M-9 .F.'p8.'p $/X!81cR1pь $3׸7 4qAiD@ . 52_ 58AgN5Ngg $7kIuAe8e`98~!/n?9OK $:3dS:3d :ޅt&Y;;mD k?%͔U AyBAyB AyB eAyB B8"P ,E.^UՂvEgHvEr_@ZF+#wM?G:l&~ &GO2$HAЛ Hh Hέ+I I.g cJ8j LY{'O O mO]&U0OJ Qh\ S ~ǛaTpj<U΃VhZC,:XoKZE1c]ZYPRՃ [W?l [W?l \-B ^mH6W ^8p ^ G! ` CQbGOr` 2cq¶tcD e&"~gT gT gUe h݀!hz;"Zi,.|tyimj$j9jaߋ:jaߋ (jkZӠjkqǶ lsr+m a# ? nUeIRnqYJnJ(l^<o))'7o))' poT\ poT\ pnjX? r@&xu? rń s4L ~?u]4kurTJz urTJzwK]?x(۪Lv|аHm |аHmt|аHm a|аHmb~ٓt:A  6vjl6vjlNzUUDKaK [hd"y:e(@KP.LCc*& μC.0Nk! 6rti -9ٷjIpc Ip ȬV ȬV qȬV?1ȬV 10= ,#9= ,#MT̔< uʔ| k}k dK 9-L 9- 9-S n #e)¨ )RpRo+?9 eA- K K :M ) 9t*08ITH >_r >_r $; E ) 걭 =cWdLjWz? q $(q q ,qIN9  A V stEW l_Ky7(T5k6[3Z<R]0H a+zg+z +zi5 #{'[/|OxN /|OxKeG:D%9>p b=OV J  J RJ  (#L*N8ϩįk^tv įk^tv # 75 S%Ƣ#m|ǯ9ȮOR1| FHlk>T Jf[D[T#{EZ? jS /+όcN7 !] ] .W$ [͝)4?= agQ9َD,ڛoԠ gڧj uQ̖ 4b<Q}.qiQ607BRވGb0#ސ3ME ޾]޾e?)_޾e?)_޾e?)_ xo ߯ା`? ( J;f^;dXGP0 ̓`\u \8u ((x ᵗ2jbᵗ2jb?aq7vw kG' &FX" / +/ w+ dOD4:7 .!Q> G T }E м\ :м\  sL6܍ c L6܍ QlZ_Kk,_t!q] #yeo@z1 oxS1asD ~TE +񷺂}|j 񷺂}|s <, c:}[L 0f'C , 4S xqgjtW[N?-h Rm Q an   ;t w! ! /#/a /]⇼⇼Sn 4bj ,n tVkp.A _VeVb 9k+)n$ U"8L,U"8aU"8] i sprE \&j,{- g8j;C "!"N ֩qe$\|$=4L$Yc%jD%j{%j %j%j%jR&1⠜ 'J%Ύct\'J%Ύc a)4%0@:,>@|:.nr.nr/s4O7 w!0C0ˈ;k 8H c99\W*? \?0Or]?0Or?0Or @mֆ @mֆA=A=C)]C) DBF7 lF]w0Gs7 GhR HZH~R*IldvJiJO ʾ?M?دM;zN GxN$P%xNpXCNpXCO N5"DN5"QJ#S*j S*j jU zUnl YzXq`: ZYE*[ \6^0j\JMb, a]&J_HsX1_IlN: at cs cG# adTo> nQe;O/ e} eʰէSNfIL: g{h_T  iKYiKl &#mZ}+ nلY2 pSL{ ap\# s8UOs[i*tr8zt)vgbLKv :R$wБ ,swۚޞYxGxk7 )z:F||e w|iR}"# }"$}" iu< UWf-zz%5vF5 |g PɂAgµ+^X 2t ڿSڿ 'tz2#y -k -kR -k$g tڎI5 -?|n47Kq'. i4Ǜyi4ǛyUغZ*8?߽ʢ?߽ʢEzsm#sm (K6B\(K6 ęB LN`? x($ i h q m@-5px],ݳT !C@=09k7v謫N<FN GH k>R+ B6 s q%B̔=ƈ;_/#sƈ;_/SC !C o: ^>: ałNIt =r1ƏuHr ƾH-v= ; L2[tP rbj.˚SҾ |y .*ɠ̾\sUɴ l ,с=tѦhl'Nѩm*ѩm*jѩm*^5;@ub? ӱ@쎞t`̨*Kֶ!:g Cً:n^CL?_^ s)~)z , )~)ze-XSډ?}jܙMv/RݟS|ľC ݵ|- ߋ"vL ߋ"vS=՘=՘=՘eLOz=H: z=H ݔӑ c+%z :5mbsXt k=' l/r sRڌ*tJ|ܥɍꚚ*Ꞓ~aZ ܵt"'sl lLZR%W ]'*L6a&,v \l? uQ[8 80c"80cY H gH H s~@h~@s eD edѽѱҷLkeuw&d(~M dC;dCRQdCD=dCQ6dCl,9ky/oĘ9dq p] 2r&  ( O1ZSO1ZRwO2?"ܞ $"ܞ  "= dh  #  # je!je jejk' {R ~ = *>2 h r2Or  s0<jW45 #3bt*Z,&D& Y j>Lz# 3g" @41* \!?>* !-籂N" = S"Kr"K&&?,'ocJ a(~U),S)M\auq3*gE +WEy ,NQTg@.Y: t.fOq/Ʃv L0/`Q 1ltxH1#סкO1#סк1]IA -1{R 1dQ3ؠhPa 3A3H5D+,6IL 8>N9@HP'R9!\(<:E -*{{6aj R hAch?Ach i%_4c 1%(?tR$es83"3"Y 3"QT>]TE8>]TE8ߖP`?ߖP`ǿ4aj=k*7H =6w ih3k1 $D n$Oyf m!FVtD۠Y;> Ov aQiZ?j= 7!N}$f $[: [:D`]oXC < .>Sbt|\&.w{q ID9}UzXB 3 ڮz]FBڮz]Fڮz]Fڮz]F4*t w%3 \CRCQ gfsS0(f p|*HZZaeq6 # M2> ?Ov. C$+ -. C$+o|# c*Ή/?ϒTawt4P.I\fNI^R  !37 f YmF 0=s ]PQ,Z! 2/w? ЩD|Qv YD s km?!99)k !gpk #I j#KX$x-v-$x-v"$x-vS $x-v$x-v$0v,%LWB%/'͓(z9j( N%K( N%K) - *v)6,,*`c, GY-?^ . x?/xgh 0F ZC\0fxXt3SQ[4\x/R~5@3)27 2JHDG7 2JH9>+ 9u:` :<9L<=C5<=Px O@}!@}!@D AHCj"nfdCj"nfC;( YD&.lQEuQ}?EuQ}?FOd] F217G`}Hn~>mY@Hn~>m ( Hn~>mk H:? ImIAMyjJ56]+J56]J56] J56] JI sJI K!CKrlWSK+a (L $?L)fA  Nȉe:]O+CRP6FVP R sDSEpC? TI' , Vt , #VOb@VOb@?Wu܆X餥+ (X餥+ ,X<:Xj X.sX.sYV3' tY Dg\_;G]#md_&PRj`_3ha9 $aѕ|jbpj#Pcvb4dZ'd'Y\DfnQg(O# gu (hUf7 i(i(jBkB?vl<^ptn(Wev nR tpȥnrzΗEjrf $sm>[tX>- uCg!wWk< x?;RHxq Vx[3UjyYO&)Ny 2ݿ ,y 2ݿ z] ]5}Rfܵ $}ќU%}7y.~g醡C0~iZ{s~؇m;~gh j K JҗltD8#;z# [ )[ WqB[fT wPK쨖 ~~& Q !9} Τ }'sɅ= ^@Lk @LkF%* (F%* t`E]ovT_hh iU86:tlIZ55555Fq\P(FAY Lj2Tumqw4^4x*?;dj*j 1 9k a Jl|9Jl|R%Jl|Jl|Jl| 6   6  6 6 ! be.Vc}Ryc yc| _S_LIRHIQI@i v RA% S(:t,Z3#b2mˡ aq8qUQw k$ (TqSL-v׮ k  >' RQY O[!R框NZ框NS Fv SW=uo?W'|jbٵj5l ňҧ *Y*F  Ak_ì0-$eE D$eEY 5Ű^M ]@Z?Ǿb! jɋPYT&g]U $Aj0|D{ \Q uBhvt ,͕%+6 ιfߨKo Ў S Z!?{  + ` xadi@i@K*lJ t6Ba?ebhU bhU uq? ׂ޿(| }E  }E٣7S[CV9n2Y? \vk, p ێӪ۶ ܱ|.ܱ (ܱݛ*u *>[{o {oG ?C NV' 橘W'| L3@_)-9ZhNGR Ve}nd F: (s* %} *͑& ͑ ͑D B i nJޅZ XL B lT?]0}:}Ao~A6\>" G$""SI b? ؒ %ؒ Cx sSj* (j*s() aG0 !j? TM aW]pFfF- >%Yk!:L ;%R K4V 8q+ a*>(͛(- s@v;7jFpj"Fp rq?T 0i]0i][ӿ<7 -k-k~tGŊI H _ H 5ֳ~*YQp$@ Qp$@泿[ŌS"U@ߛ%&O%' 'u'egoS( tD([΃)6BU)&շy:)۪:J+g,h~U6Y,lػ,%aB\-.Uir -K5Lv0w 0w ,0zFxa c1pmkU1( 2o74 2iM3^뱋C3^뱋CS3^뱋C3^뱋C3vfE 4?;G?Bt.X CyȀӻD͸;EALf E>DF@ę\ dG'_ I9I $Ku_5Mכ Mƌ7QNbO)C=:QOUuP? Qk!R̦.kR̦.kUR̦.kS|2 SM]Tst{ $ T*] T-BntKUX%UUn27DRU.'NUr[ WǶASWǶArXOe54[XOe54Y;o YZ3uZ]^۶ [ \殕\殕R]<&\ ]_p9&]_p9&]_p9&*]y"1ʖY ]y"1ʖ_ s7_jF %`oUapÏ dc.f7;e& ` e& `g$N`$g$N`gJc( gKq2&  gkeAg@kH;i *B alOEQhm&ݸ~%ms}_jm͚ ^[n^pPI˵tq#^dq6ܸ qg r, are=&?>R rjkSs¹agsș]td tGմ |v.",] wnj#S wnj# ygO D{$~HR}RF   tjO.c "KU % %tU&| g9 M2 d29 S (] 3ej lM5% j T#KRJsYseY i DvnӲ %t?tAs<YF|? yrq< Tu?F.3>χ$ i<|i# #[SYUAOQ#i't~οsFY~οsFkƈxffG$ 3lR='TY=  U UsD]t ,?NΌݳ a{ 7[[7dpj旘dn bd鼴BTis꿎e_e ^g \:bD iNuKF.ԼU a T qqY qQ \ =d =d R=d =d } ֹrJS yM AoK/AoK// / ,95+ L #;B>`n uB>`n (B>`nj>~_s)^"`Oq4pKqԖ  9T $N^aOL[H/8B&rYp@?V`Ö  בD 6J  KR8 KU K ۃ sF m~k  9s1 wՏM8*,ʪ Ş")mJ/B^c{ HY"j-% TT ,V(V(?},*W%L $?!9qfU fU 4;es3>hsKn L XA  C6c3V"Ԍ )#+#Z # ,P$'$UvxF i$sPA;M %\@iR:%(3Z%ݙW_ &|Qo8 &|Qo8 &)6v'V_s':' ($rj*)S*|u @*|u*@'+Cw ,U$(-NpM-NpM.PbRt._dJ a/2&f /ހ /zc6?</zc6k0 450 3 4~]؟ 4Ĥ;0461Wj 51-US?) ?Mq@>ɥn7 @>ɥn7A<;K DZ+.E|/=F} GkֹGkֹHY|VI<JNvJ? K"qϲ N70N0ru:Qu8A.^Q?S 改&#S S Y\.[wj[3\[]4sڮ~&N ]g>t_4Ҝ.n` PQb6'] u# b;Cc#?&jR c#?&jRcEk d2:˅e#NP+ xfyj_t?ffjkO=Ykf l%lOI.sl'\lðXf:km^m|쑮0 p & rqw\ zz$ =g{#~|'{\F;q{\F;q {_^KU({_^K]"{_^K{_^K|hžO |Y6; }WuWrX pJ': (DO0^ jM uu?KAqվojF9$F9w"dp  R nz3 $d=R~ T %hzh8C8vZjOo%_|?_|  U:2*G&\ ]Q*w%‘Sf=ZM_m::: ax@ $Al էhfE5 ({$='K -#xK&ZR \ױΝ_C g5J.lVCг93L I+gOV z V | Q2 V*N"Z tV*N"Z 1kR`ܻhs DƋ35_ b9ԭ [ Vy j vjgBhI *C@C*2.W0B?? pS AŠAŠK@K%(hU}RhU}Ra3KKoQ}V[о  /rKJ %ͫ~CviAm viAmQ" #K?:{ؗeVF l Eg}Eg}Eg}Eg}REg}H% H%Y뒬wSQifQiN H-]#.vt l!L? $6Rw & xLL蠱M:^B d5 d5܍> jmSv0<ǝKǝɫpl}˺7*f˺7*f͑j- ,L:nWU 4/U 4/R5?ӽ,gO TVh>)T>)T *ѐAq%GCi 9ع$ IZ(2ըxX Sc-[}1!↎ B  z无&7,KzH@)+1 M Ճm?#NС tG Hܱz@F1j部R3J& _c5⋬wzbރSzbރB!ȱHhd[<1TK H?"ƐY7qPj 峬 zQܪ? (er uN > 䀫#ҽkɻ h1#zj+>| i Ɩ; J)O8#n>q 3nLAq ic>9d@e3 :{ǂmwg$ 3cM<4Q 70Ǒ*] [k_g GP1 GPS m  v $ tMkS >F:jC3k \ 0kt9?^`׮+8c8~) 5z aenXE enXE N? G9ed8?ϊ &Wns1B!l @# bM`Y ap.]tp]%ocȹ ocȹL 24:L=)Yr~d{!x P] Z.0͸IGU aOR"SK#ZL&%P[=/(uK1XS(uK1X(99` (ű- ("\,#*㰊D,7&y,7&yL-1x .9|L 9.o;X"[ /Hs /Hs i/Hs ,/1U/1UQ01XR`s 3{v4 %L6E.\hY6E.\h67"0 $7ȅ> 7. #8_;. s)8_;. \:~R :맯EG? <`(2=h?>q?S?8KcL#-+?8KcL#-?ѺJs@h+yW A*Y Aߘ?AỸ!יB- BC`  B_/1QG,Rd GOl GOl G-ywJBaJ'Jf,JNq" KB? L L (NǗǙjQAAC/ ,!QAAC/ ^Qb37RRA, TnFTP8H ,W sWvp$OXevY|B aYcwZ0Y [qvj]TNh ^`e \_q_Yb c`|;^aNzX.bV/;*bs+^% c QczV czV|dqӨ`OdqӨ` +ffn" ffn" fu!fuFfug}eiud kjm@Ījj jjk@̪8'  ldm/QU`n#|1]n|ԿBStn|ԿB n|ԿBo;a#o=f ~oe-]oe-]oe-] o@l p)yʾN qX%3YrjٽA/t)]e" u5RUu5"u5vUx}Hvq8-+ vCXtx :J| xx4vSWR{()pZL|1ғ@5}!WDZ}T,4$] }[RfI~NE3?n~mP}&m_wkJqq" Jqq" ~< \CG^װ; \#@ i $WMX( ЅАP酢Sk3s< lfr)'K_%˄a?E] 4,f12+ba,3 l%a,3 DŽ̕?Au* ,[9%7VWj7VWj7VWj ;?& TW vynZ끉 R '&屔 .Ow OwKڤ({ x9;~BϘ]"ֵnjj W$XA]S:Zf +_~d/>sYYvpuIۗ 5{R'Q^ 7p\T7p\]7p\1vc[ OYy Ūd!,[_Kf0fLQ(15 r SRL ڄT$៴l2Y-I  v 2= 8Njb)NՆpsS#[qFC9[>Vu" aJ1 3K,`-WbB9G{ FpûBBUA#&[,ȁ?E E :meg 3 ŻJȈ S a1ܪC nA #8#;'[,S2,S2| aXZͿ6re/-|pOr!Ѽ 4vN4vK&l M} )W*?,l_( ړI 60 }^:"ۥ5K)ܫ"XKs ݋406'XX#?{ = {*E NE NE NE NE NyM`f6*m ⎙Q<R֪<R֪ <R֪>Qa?v1:c4:c4RFށ f)Eaf)EL躉̡vSLZ>d V͏8# }\" ڔ8 "$ }#$ }4+ L/ -*I0 s y\Ǜp}LߚĞ]$=Q02h2ޥkCh2ޥth2ޥbh2ޥ 7OQI/8G)<SVde $~a vU# {?3~T5H:   Sn䖇 j d#th%M C# )wT]^ƸƸF8# ˪k n1> \ Y)ł dZ = *t(j\ }#h  k0 W %=fG̍ J#g ZU6vlIvlI ޡxޡx ,ޡx ޡx Zl 6SD6Sz0 ?Jt ?J   r  wm+*Uwm+* l *<5S ;'3:d 2 1on "Ovt?"7 $X%m) QW $&8{0. &=SS &wM a'c/$(Q ()y% C)y%j&*(l;k *^Yd+6t|r =+iF+DN ,UN^%,P2)K,~ɟY.|>0Vn:4>4]i^ b 4 ?6U?7w7et` 8]${78(w8(w19['y)9~O e9ؐ^[\:Q? a:Rʹe :ĂD :ĂU:5` ;KH;hU ? T$ (? T$?Z ?$0.oi@ h Ah&0jAo&1yeBBzZ BBzZ BUC  |E$xG#} ( G\iMH _h׎ d[HmԮI^LzL&I^LzJ=]PK͐KⰞfwyM#pMN M3 Nz =OM [k OM [tOZ^KQP^>/QP^>QP^>SR SXSYSyXTT~M TOhET{{̈' a UU,1V\NV\NVo{EoVo{E,Vo{EWy[',ZIܾ6f#\ a ]7"v_d*{{?bdj"ine8( eX~! fs-pfs-p fs-pfs-pka N ka N $kd^lѿg o'~joCs omCs2ol2Zoł<ołpX`pX`qbr' njqɱ qebtBn1?tcd;v^&?/Q vǠvRwP/E s x`Cyg*~ ynQN z`3Ez`3 z`3z2U6# i{"VV {_}`t}ٿ/?}v_ ~Of~Ofcɻ C . ƾ]QW3 c*_m Ⱥib߻ s)ዀrxDsyw Y~s̹5H \@ zOcRϺ6?s+uig1P?v>ٺhf/ҴW7ys`Q85~" c ԧL`hRg N Ռ+4WtղN[ x , s_C =`Yj#^/ (yU.sLW& ک&v ׳l~9| ܚh JC1_b  dP^eM "(t( ( cFs?0 &w $ZE)5p1f" ^; t M+ƣ+a'堟c;Z b>L{H/k-c銵6R z . p?b}` ep?b}`2$dRJ҄o.bYs XZN5t=T"=T"d=T"ph kn|+tum U@um UQum U um UY um UAuXbY[ { :a_ *Ǖ=Y6 Z㣪7:cN ^à|9xȟ6 (d%> RG *=R \w܆`vKұ;u\$̓?p:  Ė]nV㫶D{nV㫶t] Ex Ex Ex yWy_9ʵ<] F b Ɗ ! wU!;J>Tt"g3-#NR!#N#:f>T?#a3^v $K# $&A0}&ej< !&Wc(^ X)p_ *XԌ(R+ՏON+B\ n,t!jU -E+v2 -E+v2 -Ye?#b0:TL0b,Q 2UcLZ2UcL2UcL2UcLL2UcL2gFHs3(/DU !3D48l/5L7P|b7t:B8ȟ;R9먈:ޔc; ؒ,DQt=ON8>CI=ON8>K>=ON8>?Oym ?g,?g,e?myׅY Dv'֭9{D}7?FoG#IG[uh a G[uh ^GW`պIGW`պUG B $HY;.2 L {޽3SL {޽3Z-MHg *MHgMHg]MHgQN6?KOK (OaE,6Q6IV3?U/bk U$ 9U$ WPf'|W Y["aЖ - YqYBKdYBKdD [ ' ](Z _' _[_K_pO_`6t`6 ab Y J2#b Y J2 b Y J2cM(YcC[&QcC[&dcľz*?:d[d!s2d~;S0Odz  dr@K  fZ ifRgրVik-$(ik-$ ik-$si[q|Qi[q|i[q|Niܼ KkqqgƩkqqgƩogt pB4p"=tp"= p"=h q:70tqۿs$ sYQWsYQ s8tQ r t%ƪ? v Av׭PZ+w$58w9.rx ;Le $$x ;Le sy> zL6^s| `d| `}5R"~T s 3~돛Q߉ .#jۨ!h5zؗDE$\?T UDkdE5N&koRî " ?o;*$0R?Wr(^T>h9f0  -7s$L Hy`U l &s r&s |"&s P st˴ C}W C}W2TK* uD #yj#Qo}u?o}u ajW C䇱>M+Oh$) $BJNBJ0BJH&EPR  /RV='v JYC$ ;aȊ/ ] ~w2e:Xs:X,cK? VU|VU|'pɳ ޿1t̓~OIK eo~z o~zU>t?׎a]l*h -^ͷpo 2 $N[ e [?g:pfvc{$DB˃@p+_˃@p+_WOR ѪP&VA&VARoOA?H!]XPs>V^)~4x'qgGd1  $ÐkF+SWK@/ (@/ 9#b} :ev)q%$ )q%$ʖ:k ٯ펶|!B˚N̕[ɿ a"̕[ɿ̕[ɿ?Q6MV$?Z F: Bk~aB tjG:`SH$$H9d#I-di7 I-di7:IOYOrQ ,IOYOrQ aIOYOrQ IF:ѰI\nSJz` DIJz` K\)fRNx` R5@ RNwmGS M_= aS v'<$Ov'<$ acxwylSi{Zp.|yL |7Scre G pNk7 t[h#Fykk(\ k(\nHL7GW eKqqYTܤ? ?)j]@ G%32G%32!,[sNaZϭ aZϭ i"A *| jƽL jƽ jƽRe]? rz$ߍDt$?;Sd[;;Sdȕza 416 8ZbE#z)W7,(["!4? 4yjP4yjd4yj9ҟ'R< v&y.< v&yyDݛ $K(%CuM CuM[4ϗGRΖE $OWFDKXt q@ ngJ8Q J8Sȑ Tv p} *v o)q DBz ?YҬ 3YҬ YҬ YҬ YҬ S##4#D#>]O+Hnkf F/ f F/ auV Q TD 7TDK  c YZSYZZ*iM$D ? ,| os*.ɿ>~ e<|Ut<|U<|UE: n?iUR@n?iUn?iUQps+R 'J1[Xh /t \EHx CNʟD Fni e AA:e AA e AA h\] .)0?|pGx]RQJm,oj bFEbFbFTCuo:1v}Y+ $ )N)N _J:D΄]#&g::1&g:]z%RMv, Ă}GYĕtř$ B0ޅ $B0ޅ (| S%hΫYڍ9 5. ̰[ZU֬ sdвKM8N ў$)2[r{{#x-zp ֟~* T5T TRضUw  [( 0 ۃ>\HǗN l$ls6dK=dK=ACOA|Ӗ cKx7 $'tc#Q0c#QH!YY[v?#BH ,[ "Z_|%"rRuHN i`@o %5_)Q?W2U ~U ~ |#1 `z Nr f3Tخ% =#  I IM= w^"  d+G!Ԍz%tZ *sL *sS *s *s  *s  *s jW qE/RqE/ZqE/qE/qE/qE/;Ls5( ?o{v Rm*@j pMlH ( pMlH pMlH { (J8R (J8 (J8;;|#X "}(;tZN+ڨAgƗ (U.Aj PMs$?˶ {ɻ. ¥bZmCT mCT i}/yhG7p -GA +gZ; qKRW:.~u2.~u (_iPULj: Y yQ!28 "F|#,dД#,dД#,dДK#,dД #2cG #H<$zzS$uTV$ى u'2&ds )n? )rqZQ *~8+G|d+J\K ,2=UU-i2C -q.o$ ,/vmE|Y4pH2h4pH2h 5-7r5 9mh>5| : (E* h;ޒ< [= 4 =ae\ =ae\@6 #@6@cR!Kt@cR!Kj @\@\BFn \B;i BbjNHs-BbjNH cB]/BtY~? Eښ65FS-[tHHkHHIX`g[xa y*ea y* aTE` =a X9_5$ cɸ~Gp?d|21SeFd] $eδٺNf3q\BVLgoDQ>Zgq/bhbUhIDhbUhIQ h{3 ( i (Ksi4 cZ j٘A j^ jէ4?k/#k(k M*k M-k M k M m&݈nk{nXn H \o>oqi p0XH Zq|J{nqwpQvr)2x6m?rh;, sI1/ s ɬ s8Nt5y u< vn"xb]հxZ. yBqyO+:ysyO+:y zX?1Rz6 Uz6*z6 j$z6sz6 sz8gv{:{:{U?: ( |_ßD}`t(~,xRY9$Wa E E  9  fM| ͡RN\ȹ # Z  Z ؘh" ؘh"cU $/i|d| kK (bٲöK:ֽ_R2@w2@w$_C_@MF?t QXj((Z Lr<Lr Lr t[0 tH gWDx*?ޫ ]D) ^͓1 #MUv #FM , 5߇Y 5߇YYk'~rK k'~rSk'~raɑIɑI>dK "IY;к + iB _q NO?xUx02pSz|5"q"q"q Җr? tw@D (숤  qrN {Q:UI ‾m%^(9/! Xx`A6JsjΊ ajΊ PT w#9=~DKV&׺bS9pV ~~popoV]FB% x3)\ zcԟbsUOVA #A 7G{<N*3bVs((D M ?& %h~=B ,{Z] q Gf; 5F %d8JRD*ds?? v t' ,UN lȀ~Mghzaz ʵF/lOlO4̀vad̆n  ̆n &i}i}зw= sʢwu jV&).D-NTpKԔu * w{&]ؚƶ ڹ ` ڹ ` _JW h>z lH)+tBFXP AXP Aݟiv,ݱ+rdݱ+r[ݱ+r ݱ+rݱ+rݽrY$a߿g ~?(g-xK 6 $伬koB }N Q*.> iQ#Ѵ E-x^ sꢑG[o (|ܫ(|ܫ(|ܫ\[ ]PA]!3] ] 16Qe #Zi34 P"/" ]>{T{:q e l\Nr|XjrN K#N~6RVlq#Jt#J DکF:F|kWȾ$U%P U%U% !}8 ( f, m*9lbrL lbrS ݋ "݋ m E:S r =#a? 8o>  i  4#} >VX [?8Х  ?9L ?b\m ( i?wR? dA6:BA6:BB͢mB BSB sCP %D;5(EC,E]ql F+*=RGjH,m5 J! K  i KѠy ,L>#0`NNXbV4 |UOեPO9P PQ=7Q`Fo<Z Q WT^ T>25U<ӽUN8{#V րV" UDW{?W}'w W'-.XQ|F#Xo2\. XFͰXFͰ Y6S; Zu/? \#?m/PL \#?m/PS\p̈́Cn]o_ $_HgL;4`4kA aѬaV a`R (aNOD aг * aͥ b b $ceiUcemjdg%fz[" fllfO RiT2 j0@ jOA=kjF}OjʘkZ|B7#m=G nșt??o%_:r*DrOPA # tI> # v"2m vE-vQU |"vsv>.Q j7xhzqyC#! yp'ayj yR=u{Iߎ {Iߎ {Iߎ|__- $}$aM'P}XUJY~: . 0ܿC k$F>F> F>Q ʼwO*Ǚ 4P^+]c aͶͶͶ Ͷ;Lr?{NLhI] 7W  G5W \ B==-l˙ ΍.t qd"ߊ SӑcUn 6@j j RgrL% լU 7̓ c1| """" Εm ]b{ iH:BA gg-O]Z?Rw ;FS,g|g LNԛGFS f)]T  ,| c'^]eC>x†H_ #^qūsi'rrP r 3]t wUSY];!k B9FM \ b^ҥtwJYNBv0_U' |_} # `0ܐf E Y1nj_1nj_1nj_1nj_K1nj_1nj_R1nj_s?ˠ7 c5D X i"w5DL1 1P{lCVD qo 7/8^:yªh_?: u4u4u4oZtJŲ+=gr D*!~5՜-(0SY> ǦghlY?K$MdX H$b2! B3QB;?fڲPe& s ̮ Δtg δG0JϹ`3 >FZVTO sV>FZVTO >FZVTO +>Y]K?B:? AG cAT @~B V -FB6o C@pWpC{5EKR FRS<FKV Fh'U#U HSQmH@;EI @9I3(# I3n1I8}qKvfELYxZL{"@N{NQ b߂bL9 ߂bL X4" X{'z|C`c Zn (h80^aix (4 M K)8Y K)8Y VQt~Q'+ISt'+ISb '+ISkw#~"L7Z"L7$  ^ݢgfVE_g4dq ?zYD?zY*?zY?zYS?zY?zYRFhQ HҫHҫN{Tn&0ܵJs 2Kq a n Pn :蕏 Wt]չ6a9kϖE eaϋ \ x { %NiK `"/?\/ Y2b OA\ ȣn,]ɵM   s3|s3 ̩FgiN(pV ư׸l<ά?< f| \Uϭ TQϭ TQXuQ ҂7A} .n .n e%C4y㮻2I 0gA JA=Q,gH{׆ |[Ɠx4 c"kE|eM"+ eM"+ j 6$& 6$&h-6$&s߯XkGb^#:w  E̯T{;"!QVf!QV5[n'hhJMhR7jR7X˄_7 sU46\yK_:1ťC-b$mU' -BvE] 25lBmF>u8x yX!?ذ(5H #Kߊ #Kߊ #Kߊ jy;jiY iڬ = uB? QS w?%wa mPT"}U:!ӐV( ӐV(? ӐV( ( Lp5\D]DOE ]DOE?0\U:k 3*s3*3*t3* `XiZG?`t*r61ZεȆFU usXoM=eijtEٰA85O!Y]K pxe px!XkZ"0;#QpĒ_J #ƿ3 $!5FNlS`$!5FNlZ$X0Spe_$dү $ Iώ$$N$ Iώ$$f-@: %\KM( &:)my&WP&@s9&GE"'H )o"T)o")o")7D j)7D*fA>fA@@ @0꽆 AZE.PAZE.@A$ A$ B&S1ۯ.C%I[ C%I[ ,Dż /E3(UE3(FE3(LFnpo+F+HT$N F_ЅkNG;d΅G}x%!HY$HI_ Iڛ{ i J=\bJW) aM'xOM'xNM;NM;O0ԱOAPԦ (OQkq Q~k=RAPb1R=&L@ R=&L@QR}bSX T+wV%.oWCjWHR3WFX'? (YjR0[ۧK #[pc r. \TA;J\FFV5C\] ]Vcv^ E`!aapᤚfb$ͥb]MѦ;MѦ; ] 2M H" ^^V c^ [ |g qntS "\."\.1-. 1-.? S[^ v#uMY #><=K8y# j ]jI?]r #:8v[Wjv&-v&-T/R|4XQr |r z It$%gt/ $t/ht/ JU9lrw{N̓ w a(kE/ ,kE/sXh,4׫Q KK`g A{ $\:Ɯ -7 = .?G字R $wèY wè 88K; g!ր'cCØBoĦ0vsL ,iH[oRG߭bt|_ bXl[Ao?otWn μok Hky)j#h;섊i Яr]E Яr]EбGcp a 2&AcD+~Y.%Hb s o {ir9ւᆻ ֊^S?ط8` ن@_V ن@_ }J#}z]}z]bP|:cͽk\h&)=\h&)jY ݫ/! i) p^ $pN, &c&c )@; _Y \ a iAd겶臻9e"W9e"9e" 9e" S샮035샮03 r'Ƌ8Ydݗ"U $iCD*!Gy xx:$[U;} C\tH%\&DJi>ɔ i>ɔ k^B  g`[ BY($-BY(S!Ao?Ao z ( sg@q-`*hj =W@ (#N c{t퀮ΐ I# h?#&"kq )/ecH)/ecH W ,R >v3 >v3s >v3 s n킙c   $ -"0]ך "0]ך |Z~ cfl[;ݿ efl[;ݿ q 2N !dsA 0´<?;T} (T} Q4& d, ,fNv|7t7tK\MZw_'ۇ 8`m j1dle . v"iܖL=RdMSjCvDDR %WN R %WN+kRFs sVWU>s (V6] KZ/VvqWxWxY]J}\k^ p}^mtt ^ R^6|_f?`+ Lz a^y a[fˢ i bj,5bj,5b파މ? ckH?d)XYdCG]+mdmL dmL e6ьt fe%kf@b[ g g`h~|4{j*:$ $l+a/9#znS nSRp'֢ qc B r=Rzrp]Xrt}Ru#XD^Rju+? u\`0 w-#5w-#5Lwpɲb}H}}S,}.~w Yjb#!% !:- -/-%5? ̉.}# LOMo)jA;v!*A;v! -'mIyo+Fo+F8r E,I!7 (dj <2&֘T NL:#hLdP6| ElB .џx;犍i ٴaٴL`U Z\#J^ .L bDq]FIFIQ z/$:hRB B KW\' i,' H:vIz_oh1hY^*ۤIܿTjeYtvm @ɯ @ɯL90^L90^ mDOI ,9W WDY a)h AmJ,jZRT%/J# FI cɸqFi(R{< I ?(;yV 2(;yV?󕼩=>v^(U .} ]3 cƆth~T l?V -S/}IjΝ#Y>˓3 JW y)NE ay)NEÃ.%2ghf" &́tž9Hnž9Hnf;?Ƙ{ $R ԛ[3|Ȃ:zVE?EcA m ෽ lzOu<\n  PR[4#9`= 9Y= 9ku& iBSsiBS ":ђeKee і𪦻Ȑ{!2 *3(J7 *3(J7@ѕ+BBY%PZC8?Ad)YzWmKQ] ( #Q] ( eop 0kb AAYt+@+0ฒ-l ฒ-l ฒ-lhJGxt2\$_h 㶣X1$㶣X1#㶣X1rnDGQ{mDȯL!y? K4RB7a5bR5bw vg3 ĘB J'ClztlRg|mt 2T?a (Y ;OXNϭ? ͂  #`տ3 ItQ\;p 3M #7a ,Ә  *!2{?U!2{fk8=S] `IZuډm# Z ; [$pϜ HR  ( > ( 4 (R (| &yKkJ m }Iiϗ}IiϗK>d0T ˎH47 a 7}L D  dU l /  rUR IR) ` #3 ckWu? ǻ]  VkK:N ٨{3>v0 vFQ2_ $+w (`eS?,Ni 8-pmR$p>4? 1 (~k@%2@%2 e #Z"$ =! =! j q?i] 8 Cߧه\$? XlKV4K!oș6K!oșL7_-Cd*h FQ"j!Yg]# yU#];uԹ#&$ r &$'^O '{]C(wY (wY (wY )ki;)ki )1 j*>!޹*е*ǀf. , -w2 .@Z5?/ ~Ӣ6/ ~Ӣ6/пK00<|ߵ0QmV0dw{1wf,?1.Y2<[3Xnϗ?Qe M2۵f"/# %W %W)(Q%NE.D\i?E.D\ishL5tpjxQpjxQs4qp s4qpz"DY{;tltlG!*SD\Ѫ9 yyl}_Cl}_C\l}_CN2l}_C2l}_C,l}_C{wZtme 1fs 4ځ<]s/Y 'd&; $JЬh [$JЬh  ԯ ,ΎƬO,ΎƬO,ΎƬOS@' (hud XkLgE`o 1"}!,c]b4fX??ئ,zvRz~1id1id?ũ .:O[z:O[z:O[z:O[zv  ^yq/it^)u؇Eսa  sZPu9ơ" b4қ,\r zYǔe@ : s [L<jɛDdR ň Qňt ňk ʫk!r%)̠q[GJaxLlxLR%eU6 j ӯyy & 2s7!6 n4zF4zF4zF]q= ]%GXjs\Xjs\ֱ++Uګ ^w ܢ2U &ܢ2U u7^ilQ \["=$NoNg$No?˭ e.bnA ~ ᦺoLtDO ,X 7)-G*H͵?=,TrzF m9N '#'eWlK:-RUǏrilvzJU—u G{7Z( G{7Z! 3bQ n` tKn` tRn` tS޶0#ufj& "{bMX3{bMX,~=h ?O4T2/ a'2[u d[4R0d[4 }{  vd4R 2 |E^gt $Dȹq W\xRr䪮 g+bK\e. &<vf $ W])@@l  rD |}j|}m˳puv"z .w( ;?R HM~ WoФ u+? /x>A $żD?2``JW!)# 07 >8fpxKQtQtHQ ¹tru2L ,AJL8 Eh#8e l49&$ˍ8ȸ T?_ZSir} 5 }FoN!:!S3ed s=!S3ed s!S3ed s!|Sj #8Ӭ.# RŠ '>i'>iD)** ÆZ*{RH,t6]&ދ ,OQes,i ,i ,y -0 h-0 / ĝ] /1N0"ߒ'0kIU1c~Je 1m*2S30Y83`am< i3XY5ΒuH777K8b8qIf96$\ g:zc W%J> J> JNoZJEU|LH LU/pMVG,NH8UŵNS63NS63QO O OsnQ  Q6.8+?Rr%~?}Rr%~Sv&f&UL=Z UiVA7pW(:K+3 Wy3b X1N!%X1N!S:Y AY Y0N06Ycz;L YKGZu49\4&5y/]Ʒ# ]fU"Q]螻 _az5_uJo _z~w a_z~w ,_z~w _z~w _z~w_z~w _z~w _z~w i_z~w _z~w e`N!6`RQ`e`/@'vU*c1F dY^ dY^U e {:Cae09\ e8 BUf/֐RgNaT%hJY!iLs jmJ # j~l> 4 l٭N l@& NmD2plmD2p n,EnXTZp'. bqbIiz qiHw  s"'ftz:|D etMȥ tMȥStwA u\r?v/x wvyiM { /({!7 {!7{Ex'{Ex' |&pv|ܮ3"|ܮ3}0"V }lg[!~~W hfQ ~Dh~%3(nÁ?}ѦwdK?^c {02Mk^~6w} T /jj ]<UCq u P SwXsXm SL iiIEiiIEDiiIEiiIEd}2}# {R6 B1 WsB1 W42A nTs :; UUNUUN w\?1n?C63`)63`)é6#{  2A \< L?ŰX*S ИL=#Ȋ=? m \oZ mߐ?ʌeJ0:S #:uo#A F<2k|͛8@H@t֊#Y̥\_U΅ZU Ύ;q^s}жFd ufaG !C5˻ zb!RW+$<5$Ԛ#( Gv-s֍0<ק;N. # ؈ A bB \Ō֤+|Ō֤+ Ō֤+ i ąo?(4TJCjd|vuagT2d/OVq dV/ {ݩҐ?0yPzc0yPz@0yPz0yPz0yPz.J6[,9![,9JBBK)Td)Td c"|S i1Ì' Zi!hSv s{ h׸z] 8F^ZR@ > s ` ` .` (SϡNNRSlXlXQ<")dP7{; NN8 ss _V+!@H> \ f H(ZljA(2 ZljA() GE.Z " r'dMʎ 4NOC#G Ӽ·-  Ӽ·-K !zS j ȸϰ 9 2 9 0 r MqD Y#nS.Sx.U&6c-? ?RlU"gF  J$?8k씆ns8ډ K@(;L[>/#l \=6R 9Ŗ@On @On TU:$ %'Y{qRNi $l4q$u"em #=ρ{xV_S 13FS!F9'3!KmQ!Ts ,!Ts $!Ts!Ts9 ![w E!uIUR"6pd "^ȑ"^ȑ"I:NuQ"z;LR r]LS]LL]LD]LQك{b ܼN$x{Q x{Rx{FR:@ & ﲿa)5q7g$ej N0r4 %:RCO 1Om: ~K;QZ䏵y喋C2<^a8ź p:Xz5K& QI{޳P%{(N 0o o  7US, 2z~0WV+T*7&t𨩥@[Ko|: $Ko|:Ko|:j@O -sE/7 0wj3r]EZQ3r]EZNXCm{NXCm,NXCmqNXCmANXCmSe"I['رtl}>Q i8 H&x\TTEB'CVԞz*[ Ԟz* ƣRcs X_ c?X_ c aO * s (E{oHp #ce#ceR ̘'EFZBoKY h7  !9 !fR !fZ D-L D- D-R D- Lݾ g ~+-[p b  q!4IŮhdLDإON;0ډ_E!U~r?W) x `$@qQF w'*aw'*R / [0 HgGN{=~59؎s{eR4ML:# !1* -!Y "U#/A0 $>F-8%[͕\]'')%|'t]Z*/'䊋C c(f;? (Zt9)ܱOo?)Y?)Qx@)Qx@ *gMb*(3G \*wt*wtL+ 2+O(T t+O(T s,MIܯ  ,^p .LÜD."T!K/+ /j s0H 1;bh3W=j}\S<3W=j}\3Qxn{ s8C9 9붇w :XSnJ :a O6:|U; ǥZ?ٔY>ٔ->;Y宼N>;Y宼>sXPoA}s CYND [NE:wQEvde WFc G֖ mHzc0(J@/݅ JzK <LTGͬ[L1oY MM N!E ޿ (O>4e?P p Pu] R&ƧS $S3C\1((NSv3U6wc Sw*́5T"UU/@IOVu \W<p^XK^ XEޮZ,Wp> pݦ'q Pٙ^,rMggi gs?bbP tC_8uf&* #wOx Jxðx緕 yEUy޴w  yyGyyG~g&j5 BSeț -͒N @Y ]iϰ il_& l_& jXA8:ex *쑋7Rj ,ΜSZnR3S;ZnR3Y <@R$ސ/UMR/UMNײ?׿1ڏ3D9MC/*&( $78| (X78| ,Za?YlIYlI }]n͛o!'RfutJ#u ~# ? u ~# j'`rDj  A{{l/@f'{!%|cA?BEYi .$6= e ׯ~LvrHR ίAJίAkGίAt zh{  '?Z% rz#a )J ˌ+;NgW90 ~ymkL5o ,UCl T@ؤ aB% 8B88 ~&UunNBM?Nu] \ۄl pR Sh1 h1-erO=?WerO=kerO= a?ӰgL(xRvVb uG x*9/ 6͓Y Qwk ޒF#|sF($hLX;f:鏿?PWgw ň  (ưص ;{~s ȣeL wh ">fy&Y˞B\%  ̀<ԗEJvi n͙IA a -Ю2=5"^<,cOҷǙuN| 2uN| Mxn> !hG \&U7R6gk\ uAu?oMRg1OKj ֋ t֋ _ /qfUBNMR\2 R\2jR\2 R\2 ,R\2 (ڙߌT5??v c8 '<'<q8\Pɷ e"uV ߛdY hv aZH`豮/O?ߵ/Y eL: %Mg?G1H;CQCQP ˦ )~\60HTXg.zF ' y? ay? (  ͪ{/c O&Q ,Sj|S,Sj|-ߛ>A{ iWC\d cծPv Par ob%_ݐ ݐ Kr:TXKԠYs5's5'X5ک_ک_ Y P !SɅ^+Z n *@?D27>W $S WscRB #Qۜ? <ZdN H+ # ڝ3VY  BWS_S BWS_a D.% h D.% h D.% hP| A%|RA%|R A%|Rߪizy)R a$O ۚÐ?2?;1 \ ny+ w. iZ0%s$h l^>&Ws̨R @j YGN* YGR y *"!C)J#0!H% $m$m $&%zC&B8]R5'/z@۬?'fLQ?'k*( _ (!u?#(!u?)f1k+¯t+$n0!%0 8/1%֌O2A^ e2&3r;s3r; i4}Q1T 4Zu?5 J*6c c63R% 6,?6wMu%8;{+r08;{+r(8;{+r 8;{+r 9R> j9{- :۬WJ;<݊?$<:>xj >wZ >wZ>6 ?{ -??I`A~˫d/ Al̺C }@d]DĈEhE:qE|GH;' S (IgHx JP dJ|L_J=c0K c_PLIL<+bM1 M8$O$K P!Q#fU,7y Q^ R'Q ESgNlT6(viUTđ>XVݵGoWSXW| =Zb c\V_Hb \T\L\+C .!]B0l ]B0l$]c.'en ]]^U\aI<=aI<=aI<=aI<= aFc7#ʵ c7#ʵc^Y! da0 fZg !z g !z AgojC?|i1i>eRjxdsh}kM'LDckM'L#kM'Lk!>Nk&; g k&; mv]mvemv>mvS,mvUmvmvnsп [ nsп [n-@8OYo47@o47@o47@o" e o5Kko5Kkr$Z]eDs/OI@# -sG.a¨RueZX v0}(Bv*6vq.tvq.YyLP \zFvn Azh R}c@ +~BF ~ծ+ +eR2Vx<6$RxmSSd4L2|# Z䟖T9:P[!StEx .T0 -#@?ڝ3;~!v/KRsӯ?Wy!$a7'n&5Q'n&5Q jWHH l !t|RYjyLDdyLD JFo4JFo4QJFo4q]htOI5 CJ4K$ODS 3C`u3C`uqA|6m X9GtOtD𗍵G ,TA#^/1vh rl Si$A` 0x[YE  率P>s   2}ER#l r2i r2i%CD7o GjY{Wc s/xν鲷cUϸpT7 фd|фd| ѳ/2f:ѳ/2 ѳ/2 ѯPե *1h41h4 1h4 \1h4 Fj. Fj.rL{Y Jk֨@u $ծ > -$> -$> -$> -$?[J Er/& l/0t үjڳ@< ہ\y (C'C ܖ_~kܠ?pjܡZ-iL [Ts}7Jì6L BE]YOQj㒏[\/}[;dz{k d˚ (MQݕS'9B i'9Bs'9Bj6iz iT8(, n7 -ˇb aќ $f.s c4Yr2R6w: =i'})K=i'})Low irn _hz *>:•aӲSl6N9Kt]7odR ; j's_4= (_4=t>HdiXvZtfO%GjO%G ,O%G F2lsY76 @)  ΍T ΍Tj]ѷ kL{$ v-l4w WA?iK * TEdJU4z& ,n;sn; ,fyfy #K)TdSTnSfbO^ bO^ 1K- KK)qMk i &Nj j~ |n4@ j _io  D9 j " ;` I0 t I0   iY ty{=]tM  IJT:gjF=1ؐuY:+\s x􊕶Ci *L&(*LZ*LKNMoNTנi+ \vN*I Pr=z ]cbTn*Md֭W3SBCF 6;T] #G+RL (Lh~ッ X@ /Z:_8 !#&x' g!#&x'j "<,n#NEe!#NE #NE% x % x % %  s% Y@% ?% t&,')'43f$ (J2 J ( ({ $ s)r>])-J r*3bj*pD(*u?=d +ϭ +@p?M, v .0Rk.0Rk.0Rk .0Rk .c} :..D1yFA 2C 2?릢? 2?릢3. 3_ Z$3q:"3q4 Ib4RE5xBKR {5KhC 7]$i 7Ҳ Ts8$g o:co"چ :=xM~ =N~Ex ?p͟Y3)N ?U&]E:ZE:E:FiGhFyi7G4lH ]c\x 1H)׹ JT H%Ii=ljI9gHQJYsxjKX+\K + L"z2H MnD* P"NP3nTBI &TVvI~Y#U[$dUQj UQ Xvg0 (Y~686jYd׏ iZKPTZLCs \Wa%]NG7[]$Q._ %j_ %j_$DNr ,_$DNr`R16`R16ao>_b eG) 9 # f>v%*[f_6 gTke1Shbln8E@ hbln8Eh&x\ si0c jGY[ l(<̱slTsG lblN1mp tn4N=p4pm552 q@,q@,q@,QqKwq!< q ,@Rrۀ rۀ rVfuwKvW[s xY xeTgyy$X nya zFs?{ޖ[igS{ޖ[ig{jL݂?{jL݂ {jL݂ |:7bq ~jU sq5tq5j ]Ev]MA;_ ;_ O yo՚Cyo՚Myo՚wv>Q Tmn$ cxB ,2pNmkk#@q <l $zk]XS;Re/S/NWj. mDl r-b Y9/gf ?;}cⰀ 'PIm\r W[\K, EP EP s EP Q "1A G^^6׃ #Ԁ,j& DQR sDQR 1qغ yI {}'&3U (EaUΰA]TyY##{> ]1 ]1$72W{ Oikf5rYݝ"UuJ(O?n+nt޼Mqm/Ea$߁TK j&Nᇍm.ᇍm IT 0b {7'\ 撅3 fT Mg$'i8R7*s `_PGdj5Q{S[i ( )uTSvU}~3$n 2(-\2 jSYNd$hrSB[=)sjW!<vFpQ) ,>̭6 8 , `qN:pY?V0#jȝ絶mw&5䯾 !׵lթ=5? ʻDz6bR++=xO y$y sq-r >!F^Ղ F^Ղ $ |Q 깥qMit꺾\zNQ$_NX `Px Ao2к 2к  k  i k}$kQ9vΞLYS ,, *E#[LE#[UE#[E#[b:. !W~:"A =:#nQ %V &5 \ '(f'2'`}t'2>)BvU4)Bv')Bv +Gcgf ,j-@} + -*%-*%.4"<.^ /KW: /LO=]/^\0)q?L 0)q?P0X 1iz1~"XJ<,2>#d2v#G=3E}Y&9 52cs7!a~%7,}lbt 8kwkhK%8kwkh:7KSR; s=2=2 >? ?\0J8@B 1WAŞ< A_6Y+ A (A9P1 A9P1 A9P1DDMVFv녃G GlF!S HLGY H Js8H J +H JH JH JhHuj, \ I\ I = I]o+ # J JMG}?K@dL&͗f N7wgYN_do OKX Oc | PcآR)mn)STꢾ:UǓ@?} Xk)K XHXHZw] -\lq$]-26 ]9Ge^K9^`v枤||`H$`jlLZ ao }ao }S aR c, d|d:ezOexO \ebjf?Rfdo9gɀh="giם jkMZ kMZ)l~Ll~m{M<1؉n0uPhen5OLDn5OSo]y@%coo7?pai)5n8#q9Z0fWr?Nr?Lr? sxCtAz"vv/ג7? w=y_7 z[ö{fJ! ${ t|SQA[|SQA l|uP | T)|{.P|{.P|{.P}xMiWs~Fa@~b]~ VDCq2UAV}j AV}h mkv$){fC *pWT4p@ѼoAb2 !"\Ҏ#p|,Wj=t Ʀ ?ӾBD8fPhnAa $\Ͳ $3A?S0  c?d|YaquKaPJ!9S'8C9Z{thSc[jA sk-L gtњ)zEr:QAn!ow:k =ÌYLz< .j .?.X3yz?Z6`"~QRƨG% |V% |V% |V&=i' \W+BWTHf6Q=l 2r"w[ !'1 {ƦeJ8o׬"`?WۘzUT?)ڎٓ%n s+.dn$iנ{d9?{"$2(Yuh* oQY9/# iNQS } ] BAT`RSYx^ϭ iڃJ0'Q ,*WJKi%Di%D ܏Ϲ6 2<'݉cU <$qr3 ~i~~ƅrY<$"3akz ~:a> &^?WAV C:Xl.TꃴvK? ~  ~ hq1Z $XJ \XJ \ D} Dδkt$8)e <.X)C;)) T 򇂬&pR}G| iX' ^:7{S-n(jlOY: $9Qf#"ʳM ع eV`^~ .L_n@5 3Š"~ X]  o\b1s, 1s, a :<R :<j;qA/ #lk"5K}'< i 2LY  sRN) sRN) R   =}& PiE +( C,j :f!u*L `:k t<-BĹ{,l^l;=gTVH"=gTVH=gTVHOybC >bC>A}•CVJI84Jo>)MKtܽ OG;YdOHvOH$OwP xQ~V%S|ܞ Z TD#: TUbdU=)}7tUN$vVXdW\߹XRtNXS2 Xhp:+ cX/}5YDY5g ];YfysYfy YfyhYǔ +CYǔ ++Yǔ +^P M#^i/`4]D8`4]DR`4]Da&] a:6La>8-. ahUv #cNDaR%cNDacӝFP/d6Ydmte|:W1f v igq ELh^jSh^jS iddjŋ akEER_k ѯ m iZ 3oL np]Vɧ Wpj j p_J qTAƩ7] q52q7x \ t~"RtgYu*) R uO suA؁?v?YLt v! vR#Jva %vGG!x Mϻzs˒ q|fL*v. mL 99[z: TtO$[" N -܋ ) c.Xnb{ K( $-֤z$JOֱ \Ok&| Ok&{U<`SEc (SEc >ftqchGiUErR8 FGT FG:+ . O &FFҞ3? xe ¿ =!1PG AhJ~{?1hJ~{KGmH(R4s$ 8 K]=t}r%h%(VH ]e[w >e[w&4 ^K>5R ^ "U 1^ "U ^ "Ut%dmt  zJ?5*82MD,?tJMx( u lӡ2-ӡ2-ӡ2-Ppv f_ i ٜsT$㺸 XWava (XWavaXWava z؀tKz؀b,z؀k"/A@U1#!;-!~D ]AKZR  c[O%,q uP[d"R;1$;1_QV #s &PyR0iʎk m umoR aL(?Quo^ jJ $jJ mK YkuD D& h70p9 a<܃ Yn Et `S  `  j IO`z#S%w݌V %w݌NFɈfFɈf jĢ* '. t Ђt ΓΓ ]90)t N\ݸX N\ݸXVpe.b9$S?kDaM#r D_ 519D˦>K '_ R(  gaz P.cbz\ 0J2 <1xAz`  67 V 9jn qIR&k) ) A)sOs?.RM HZy ᝲf 'ᝲf  `S5HU֏9R"z](fa*O*͉Y s,Q.K'mOr0_^z 1 ]2S]Q 2S]Q8I,Z88C_*%9-ԕy9B; :pr \ :pr i # ^?.#nC?ES̘ (A AHv2LdBկ9B 'C^3GĔD|PUEjhF;DWFLt7vGCT7,rG\8nGI EI KJGI JhjJYZJsa K&£^ L;ӳEYLݾ!s MsRMsOH8bs P52PD*DP rl=QEDQ:CSAQAH5_FQAH5_FUSS n S&h S*$S//KS//K]U&#?< ^U|kVONV3H[ WYbjWYb? W5gW5gW5gW@СNY`A7 sZH  [ c[7s~[h\0^R]T~ j ]1h]0ɬ ( ^~|d^Pu_ӍB _QE _c`z`W^F`ňAjs#`ňAj aaCj'sbQK]bHbD !bD Kc dAǗud dS;e:.ڥ3 eY f(uf- f- g h5'h{vRh6ڲK Ziȣ i= jָ/% <k-Cީk-Cީmr+ mr+  mr+  m;4Qm;4 m;4 mo0 oz tzV9!t]dBuP!uwbޛCNy }yPիKYr= , 4z+?&vOmv\)]Z v=WAo $f%jh2LjH,s}&w*a&NDL+QtJ W8c^SkؔW+aRrZ[zT% eC(׎[BSVZl~ | c E"E $ -jitẁ #MNDR-s?K $[i$[i$[i$[iSq=?Oq^ЬyeS \aͫ'q G7 & 7 &{m X'U BXp]_@Si=b aC$#ɩ{Y!aO> 9I(&DWAΙ&259 W6. "LKaMi} oGje3 ÂĔy6UÂĔy63ÂĔy6-rϛ_ӣjDŪ`]acx[8cAFɫ(ʶ,4K_ѹ ?+ѹ ?ѹ ?Jqѹ ?c 8c|*kX}&F(s_X-RbaOw;Vd#O]/lEk 3>lE4(k4(k {- 2 R!H0 x"H:YzRI ypл\a 2/8]Ma- s ؿ%}E6[m # pJ> ۂ87 \ߛh1 )( t쓖  W!.Hi Y?lZ@y?"9,sr /1," "Ҥ"x$Ҥ"x( \* g \*? . n? 7 7Hœ8t2b<2 (& _ N^VL#H9`#,E?;G|S )hs4ZF | ԣ_LZWrNr !x^wgF] 5v͛"3 ZzQ%뵩7 q?o0!;(! U "pg i"pg #UJY;$qYߤ c$3 $%& %& \ &c (>&@Q &@Q +'(V (.W )a<t)zsG.*f *qSe4 +7(Z,0n6FW-/]=#.Q] ].?*hS .?*hS/S/&Y-8 / Z +0<ϛ1?2L~M >L~M>DPP?AHv) D~EؖÈ aG3 5`GY8b. H!?H*.R{2H*.R{ H*.R{ H*.R{ H*.R{ INYINkIдks3K ~? My3W2 NYN5W +OU@3DPa P(r3RJRVP]K S_[@\ Sn Sյ EYTd,| U7v]YRUSĴEVJbAVsWTLX¹9Xz[ eXz[ eX2\ Z!qʾZZ_Z([p"^I8#S=?_#_Oh,_Oh,a_R}~؇X_R}~؇s_HAm ` y?a~W'a~W'abC:ޥ`!d]ӸCe>_] )f.4T$f.4Thl?hbގQ (i)3cYcxKim߳iLAil.kqg[m@[ampn$oOofu et!C,vNH1 tvmyM"swr xږy+8CR yLRfY{)tv-{~v |SH; \.}W}?~z)  ~FVS~FV ]  ] kN% ,}s,}gurrKb#r9R* (CT"m_p +L ( G;fQS 4N c&ʲQ bvSK2zkANZr (NZr ,>UӮ>UӮ2.Xi  Ws(0 4OΠ+kl]J\w|Avt| Iȗ4j7jG-4I- 9 day Qm%S oy >qoUȍ0`2 f7_5ZYW 'os>?r jLC+  ӟ $L!$R L!$R L vvHv%!nDݚJkw3N H ߔ}*D F7sS X_:jZ n2y)xe lsQs Y.< '<SZ 2\r7FkWlW#gX a+K|ýns,ݑoql" ̷f  _ ;]] &/: (I-j6E?ȿԈ=Sg2N| Oi~ e @r; rt#rtDgEΥ5 (Χ ? ϱJ,mB?bQydbQy!Xь!чJօJօd+͏ {"pot"po i8"po ׎KBa8k ِMP/ِMP/| \cڱnn+ &xm !ݮK{O{Ohr ߰B&D ߲z {)w_ $E-_K۵/,ѽ_ D=}ݫ}ݫdX{3L髄חjD$ ^+ (nzj0ρR?b 텂>o\%8-;|9%8-; jXjXGfVY zk/ aLazQu-NN&N ~j kU`r i+գyV?:^F'M_4 3 3x y$v M K#ط J~eS÷N]T%?> cs$ s$ \ "<+Z)a׈= kaZ`B\BDCN '8 '8 '8ƾtd\9#ljv  TfCfthtftht6-A?a~@!#Z~ + aPIJ}vZ6& kz\|zmk7zm2\\_ " Tg* !g%[!&B+׫e !!"iS "l7hx .#Ҝ1f i7%&5k%?6M#u(psN(qOEcz({Oq([ޭ (.)ey )m*O{V +uͳ-*t -f :.*k .*k.*kL/>.rR/n}$s/ 0ć5F 072R)*? 2q i2٢U:( ,6ļ? [7 { 7 {8Ѽ $8tR`:/R :{xv;A (<.\`-L!Q>_d/ !P ?-KаK @WhRB'w0!|D1qnKD1qn E_uRFua $(Fua?F1y$G[v HLl7 eHg JЀ@K0K;NkvL1JjLzCME7yzM ѸN {Zqx P0}Q)8($ eR+fJT_pO ET_pORU7`PVE8f7XW&)XW&)eYd1\ Y[|Y[|ZGu0YZGu0Y Z5I|]/r7 ^Q7^Q7 $_ngz _0h' M`=́_`=́_]`=́_`' c,O0ۯ \ e JYeF)/XXf'{bT fp25 hϔ2K iijvjkF@kE5Gsm&f8‘ n}۹RQ qz\y qO qf+ rĤ |r5 rr4ds+!C!s+!Ks+!ds>osB^Y s"B+vDDINvDDI vDDIvDDIva vH ,x1{q cx~Myx{F>{&ui{t U |HF& }:fR ~/0=`} jq~~M|-rxC6= p;gSp;gD/ jSD/ aOF \m 2|f < ?p5y  vl]&%~D]&%~D| &%~D yƒhK?U ;;O ^LLYj% jq9 #Ɇ.YQɆ.YD: Я $L~=E iqݩ J k ,1@0r*N^NC+\U~ . P4=y8&u= h jUm!?Gz&? Gz&?? ҬUU'ҬU f[pMc^*`e)jw"e)jwC>  ,\[ dddIIJojsKTuQTuN6 PK .ʖDA H| A H| ip'ZmT -yF[I֘ڠ1so+mv 0/Lε 5: (=rv|s  GݷRpQ RpRpL%K[C# &6 hJM| $M| -R SE 38UXۯe >u ֯%C7 5< Ǡn5; R?tR?]^aYVvU b% "2HjQ?Zo6̎Xk? 53 \y %fy jۀ3O %HYB.J, c\u>Ժ8?.M ׉o ׉o 18c٠c@lp٠c@f9Ğ0dgAݩ p~OE|^ ,sC "Xl]  o2^ \Jy%敢g#--,kr1e]1M 븏&<L 첞U LC{(Q? gy `:s F> in7pB `w}vq_K,IV L:8Od5ھA*b<R/ $;wNSiX^9-5tEzGR ]NQxCW^Yۚ>j  h-5 h,?h, 7"x\-f+Ȩ?|:̢j_JnL (^9)sT m`QF]@J RO  Ȳ6"Qw Ȳ6" ά7AY  QD LjJcC -qQ /]bfL Y KxVފZZjO՛O՛ XaQ3 XaQRU!lI,7cq? s`aj6tAGnckSnR ckSnL~ uL+ l tִ c S%H?!\B̻V!j; !%[V! "z<~x "^\|#?l"j$]>A ' R_ ,(dx )0k-)0t&)0 )?*5v+"pa,qo -2v-w/*m/*Y/ %/x/#/$0B.KUD0=13*\ 3*\:4a| 4a| 4Sj9 jWz9T<: |Y # :F=*FD:ƍsM ,H>ZxH #H#_Q sH;WƗI#FZ\J "K<K<K<Y-L ? L콕؜N-R,5B 'N-R,5B g Nw͗F ,PF3X YPv YP YF| YF|YJlBY^ 6[Q\\+j i]R2E]fy_|i Fj%_=_ԕL`amS0aaB< aa,$icd9 cbqR/cO@dCS?dʡ"@\ seYG~Ke5q $g*^hR~ \iZlbiG2 iqJj0k4F kTwm> m>Ym>jm> m> mW V*mW VmYC8 =m!&|og,k oƩ- p+B̝jpߵ3iq$zT\ + r[7" sPMi8tbL $tdOju-8u ve}u,vl1 w[;>Lw$Lw$L $w$L yO5ړ ,XyO5ړjJyO5ړ9ypL0yÏ ~ zpFz}|Cf= }|Cf=a}# W&}# W&}# W&B}# W& }~D" YV V΋ f8! zy sXJtwJA4؏V^+ a,˘ RLkz-/-yu  ᇲ R&o *4V-Ŷ d<`恜 Giii?ij זD8k a |$5r4؎ }R_(|;Uf:Z$2ްT[ g_je"j_"j"j-&PĬF* ̽eH/ T+m>sNqSh.b.bZK$ FXDMW0DMWDMW Ɓ?y Ɓ?y ,)ss!8 ; {|L lS?zZ¾SzZ¾-Qt!nj.L#_ ('6e g /f  qESJſF[&ҹܣ i v vl[cs9f?+^ - ( (Px[z 3Q8^?Q g` 40ɻ@x4? 4LG<[W^(Kw-9 c) ~ Ӏj a-a4o c S%v $ Đmw[7O @,,% 1pӣB # 32vG)S y4{ UJ&̜ Y/hNˬ7T IyyR̉y'I; I; ҖGyr10ut6ډi&OgcWUՋtj2?֖8S ־ > ;_HR $ pXUbzQc|dU UWsUWVhx%N"M)`*¬Rs?ZHiQv 1fdw1fdwP`  s좥N ) mꏞ] W! ,J_ Aw) l #_ I1crLk {xO`t {+[ag >]csWXk ۥnRۥndv9yJ4 #6~Q!30 5Z?Z? NegAeg ceg # pJ%}06&Qt m :Y{>Uu: ~PF,J d{ \C+ [<T" JZJ jD L>D L> jk jkd q} Ő Ő M2ϑC shQc?Ȓ< 6_^5R Vv#x׃e&RKI Y7&Y7Y7^aOYve H%Y ,sa6!fGO : ātR;C׋&9= ()l )l }~$!X"!g& #!sSkr-#QHJH#BP#FN%#X %jH?~&%Im$j9 &=&&mS&Ha`K 'T(8 v(۾ › " - LR-0Ij.mVaY .ح 0#M0FQ*90MeP1VO =1VO "1hz#- 1051H t2Gc 4V%& \4}OqvR6mjb6 Ct 6瞷DjD:6瞷DjS6瞷Dj8@ʨo 87 9A)|K*:];zo$:o|;0bDkN-=N< OOt sP#Fg| P(1 R0d#R_lR_lR_lR_lT(;# U# #VSE!aYPZeaZuj,^aZuj,^]T˓_z^]֘S_K_dO`  aBm ?aQ4J+bd # bdy3&[b3D2b3D2b3D2btc0N?dZk B \ dZk Bd %e\7A leig iif:,i sSiʊid ijn|l#j l#j m6\bn?;`oRՄ oRՄ?o,JW| p}hwKPpp(. (r sm.)_N:ssNvusxU$jx%5kz [ zTB{TkLye{j`Q{nZ,P ! tQ"yÞ/?7Z cO7cO7RSMZ SMZ @!'!kĂ̹Y +?EР{*菗 (1XT~8 / ai-"hekկ^ e^Ӥ5T v %nhcj ΍ t b sw={NObN>3(%DbB$?O>ƻK E} 7ed4 ];my#0E; $σ+N +`Kig$B_jO#R#RcG2t 2txb: V_"c΋D᫥lZ} Z}*\YBLSFv= , DR We\ t޾I%t޾I?q ?q&`8IbP\' n!yNɿ/gszÑ<|Q[; n]<zڌYj_I ۶αIY t*5k.H% Xi7 i,|ʹbS )-1! )-1Q v-Q%m<}"f|م- aAoaAo r_K0 "~)v%-`?5oegb6ӺdcXgnW`L "L.&NxQYHX{3aǭ.VR8ihuN>?4i I 5J)O ܼ`W sX.$A- iN$&6Vj r@z? yN/UDAE@K!bbS ti.!ti.!x 0 x 0Gp.#WIJ BGG:ԒJf) 6v= He`q~yܬ~yܬR R QRQST1z Y^ ] ') `Gf| #D_f| #If/ 'K? 0@@H J`w6' s L3 ??mCR'Kj?;6g:] :] w ^w ( ӭc`v.T 3[5A YjGu*N#>HXTQ?c< l?h_<?R A5<-.AJVAi(ybAi(yb ,Ai(yb CvVvDDD< iE..NF$ FCUZ,? VR ,VR %VR V=T[ Vyn[^v8Vyn[^v WG:ۘx YqgxA! Y# 9R/Y:)fhNYY?Ziu[NNԚh[)>$\sdR \8 $_FĶ^ _w]_H - ` :bʄC e5N g"vMgE 0asjQ:WiL k0I-A[k½m ( kVHkVHXm0) #Jm0) cqFp (rv8͸ttn,+tq:TuFE uFEsvn3Xw\`!SswĮ]Ry֣{ zwYY z{[Cks S{[Cks |n|KA}a,#Fs }a,#F ~$T &xV-Z>  O! $k$>(9>q :jtiL :jti Pà ;"$(+]`VvAVvA('Ǚ hV@!UzUzޖq:P|$NY |K/ 'w oy5Fz U_xY zR%vW 7ҙ ( עC;@  TbLS ;3Dp?;3Dp:2P}H2P}#70HMenӶ'\Uw"Ii̾NMN r* ruexQQuexQ!7*/МAD /МAD{cguK {cgu||d TN( c@*WfB (HWfBj<< <<S<%mT1$%mT1#FȖi]K-`Rڭ6]Fc5mJY(5?`Nw ruyo}.e $}.eh}.esm}.e }.e }.euOd0 "Xٴ P]P]s#@NbD cRg95i75Gij /4_x-Lf羶8R Hn .I̲Ke I̲K O3f<$*.| ELRN  g\EG}PtzށSC'k5R`U:ģQM9+=N+=wGxI ( S,υ̌y [*bó K+^x"Ҝ$'kRK[ K[ ڔ+ڔ+i i - Ժv"I ɵ $$ɵ|B ך$Iw84ך$Iw8 ך$Iw8ך$Iw8כ k+oBq+oBq+oBqks?ځcZکV- X"LRLSV_ܶӂ#?秉n5"1jE,]ScqYF $ޔnq X/bk ZQA . Mh+Mh ڦJF`%Q N k {Udxzz?xzz (ɋ ,T!铡$Ts+ v s7RQQz.  +@$EA  V)2AwDGvL r(;Dc^Jib)Gb)"b)b)Qb)*Cbt *Cb l\fs!tWP"}dpYd}dpY 6o "6o js ֟Bs ֟ lf;8; p*<Ik  NB&珙 + Iŋ;P۶  ܍G!*&YYwlO Ggk Ggk Ggk /Y /" Mb Mb# ڀ OW+ H4 5U? 4O<d mM _@/ Q _@/ju-ݥ# tUntU unm$]GF# F#?f! T  <Gd~|g *|g G :5#8,?!*} #-9h#Z QR#Z Q#ԋ#%'_D#fj%'_D#fj] %}W'nO (>:/ (>:/(OaŔE* *xomu*r< *#cA 3+8=?0EV 0-R4Q۾*5h?WZd95XZ69W0 ](6eCw2 :Ȑ:4| :j T ;\Z= $ >MĎU>MĎU>Bq,@; Ayr ,AKԞ C AS*SB bGtB°W(B°W(KCf%sv+E> E8Ǚ$ aE$GX H) HkjW[Ile\ICAKd LߟMS` MS` ]MQ4~? MQ4~ M|2pM 04O6{.R aRѥR SR®vT);5(Y TC +TTw'MsT{Xq h #XD Y yb Yf ZZ]kE]L{6k^V3* _YN.m `Y~bP `)0]`)0]`)0]K `>BPʻ `A3t*a`9ԧD#d RD f Qg%kh^CFF k> N +m[_/nz+mpWcq5ҫr^7!?sm?YN?svR  tvuuڅ atիc=]u(Xv<l \v gNw} ax ?794xOZxOLziau {+"x| }N}IsF Q 9+> Ӻtt?Ӻtt  P rma]čd9dK ѐwo a_!c j xn}>N{kwtw 폴?0P@+z.>0R'}u٠ 6/G}0%; ] 7e@ # Z1u-:/ `0] MȲGGVwwoTOc4_c|9-\ c{k<~Ȥ<~Ȥ7YOs2:`&wNF-9S? sy㝛L y㝛L Yc Yc$:]3 :]3 $韎Lc* e* e ,G 6* YpQ8 ]/ob: ,ўV bh3D bh3[ bh3 Fڲ H7SdV s}.A7 \-}.A7 ,+}.A7j|Li s Oܱ|듅|6-k6-k;d(Qr5 bq - &A&A.+ S (cf?o-4 ڽ L0t=L0 L0aC+ԥ lfuWLm0 >Тw.,F|()v#, v ˳,aCz#^?2* (.kiE co׻]܇R9T!lv6}LS"޵Ydp)*))D [Kr|nwS@EF. # .Q-R^7#rӰ( d٪[Ms (?t S|sYq U͘H Z %ꟜSn i;jdd n[ + Zm" R̯o2IIo2IIo2II0Gf >sZi\ǝ z =q7QryȬ WP+ ^s `X i.+ \]|`.~1ӯEu Eubjz۴!hR$ `@vK0Q.)ikP ]- i ~zSZ ~zSG-kG-kG-kE{#nS=^x^xD# ? i4r ᗦL h] heL ]| vQui'Yr N(u l:<=!nO  SR SgV~;3tUmu^ HS|mu^ HL'mu^ H$mu^ H\XKCZY SJ ߈ [?׽~jD rn~sߜ_ NJj ۨՙM 2x!"rp a J`rY J`r8 J$"!- "=l3o7v#4;[$`h&J$]0x$`1g/N&.n" +D<,CB,CBa-0}` (-ۧXh -ۧXht/9@' \/Bc&"/LpCM (0 0$){ #2Kqt_4#zֶ ,5&@5&@7|3VT9?y s92F<U$;7e>t&;j$)] ; (HoU;  >Jd i?&ܔ i?&ܔ ?擵;AYDZ/Ah3# ,Ah3#AlO5 -C3y]b}F3Vd. G&˨'GGrr>HwmsIq.I\KI2~Ln MB `*Nh{S<Nh{SQ4) QZl.YQv  Qv  mQJw&R=5kYR 6?R ~-jSZdSg922muS̙dW^D2t -W{@Y|K`(sZ?P!eZPrgRZT2Q;ZM#ɂ!HZM#ɂ!Z8 [5 # \T[ ^SvE< a@jb~Eb1[!Ne S eR7Dv} eNe f=fXkhBLk9,dcl}+im)6nKs7x nnJNovs o pU>Zpsjq q q?KnJ}v r4K smYO[tj[At9fj8 u@R3u@`v,6BwaHnwaHnwaHnwaHnwaHnyCWS6 z"'Fz2d }HǞ|R~L7 I~i`؏~i`؏ >3M4L8T ɧ|L9[k/3]_m.Q%:#;: dm , Mb5Jb Mb5J`Mh $ /}!- #A3?A3 ORZ^v6m8 c.s c.s,KmU",Km406[`65\YXo}an`mqzJ? zJ zJb8M_kV\ Rg_RRg_u#Fv pS% T{ϲOIV@~RWFxSN/wVǹmX[ \6LA6 nA6 A6 )l;z Z;ztWY{+].gm| eSa  :Ypv`]xsB,LV@L<9&v&bw;X9K`;B!CN+NGގˎloxsg? ':B1R;{bY s`s1 $*:ch>:ch]p_Ũ#+etRT metRT s etRT Qߘ{ A# 66 eB|kKiX s);9&G oƕ²Ir4dDm8 dDm8ecSpB Ñg ê^ˋ hö͸þTr ~Q WsR fƨ` ƴ`@QM\Z$9ȷbӑ"%r7'"%r7'F<};#Lͭ z*;]ͭ z*;}xQ} $% ..Y? 5HYCϹܰظ АL АLx.>`}{5 \ZJ ҫֲ\4i\4i\4i8:i3}8֡U(wy׸ߗ ]=$ωueF @6cHӣ AJI|:߿*e: rn9 vk? SFNF.< *;q gk gk eG_%; +_%; cA'Y \Y )ۏy4녽MdY(ƣ棭 TWEYtWEYKnjR]Na!H -UHG/Y *f  m2΃M>'PAPoJ((LDE (GLDE!LDEEWv[^ RR LJD Yb%0@ @ Yp:õ q#B" MI J2R @PRw @PRw j? *c _Kӳ"  ( uEË? cOF=N! Ohͳ .a~ru .<&4;9N Z;ò? )I%NM,};Y1^ tH| #'ǕRڭK  ( mSmmL>" (E{þob*ja r r +C.$5ceR}ce b^S C !yi W"?"AL"Ot"e\7# Z$,.  $Tdâ:% <}t% <} m &%u-'۳5(;_(~ )B r~*_ƙb+@ɛp,+zZP,rp[Zvj,rp[Zvs ->X-> .2ܘiz . * ,/+/$-:q 4вe6`sL7:w 4k 7:w 4k7t|D$7\Opa8SA+:7_! `πIR>Rg'Ԯ>Rg'Ԯ?EQ?ܺLb?С?[ @Fsp! A2הLAKNBIP?DtE0ĤN F.`zPHCJ6҃wM mYMhMq.,N9f N9fN-w5?VN-w5jN@o|OZt s P8?]h$Q@SQQ@SQQhJQhJ|QjRen?Se -Seq0Tf z%aUYoW&*W2/# Z-h][-9v a\gzy]@a^]s@ c^]s@ #_xs_yIO ,` Zs`HQi `HQi ^a<}zb.K[bwYuEN bu,gd&j #d=-j dԵ/ (eu)ҟYfpJ -f1A ; g\iT:,viT:,v-iT:,viQhj(|j(| j(| j |w r j6 lRK -lO&#l(1x: lIKZ #m ʳC{NnrN  nrN oW, (o'קrD˚. u- v Q Zw&z(@w&z(@.w&z(@ wLǴVw~Dc$DwHdwHwwNWxZ% Mt,xZ% M (xQbm[y$ y5= ye!z3&|`R{ y{t_`"D}12! e}^ , $sGBH g$ va!: ea`E{ 5WH-BѤ >InUKZ ZaB{ r" !T|ׯz8 ;A$hY$hj1 =T#x fìj zBzB/(K cH74$ 17q >aR- cCQ-<n&aP "rxAAAtrjtr {uk+ 5 h!ohdM mX (%k~tb4t&tb4to#g,d&ЩȋxMa?Ma? mɵ:<W%f %f VYٞ VYٞQ]m9i# ̈`lr]0` 0`йHK<_ӈhTȱZӈhTȱZԔ.Т[AGAfDQx? O779N7>(wG`MQ ؚPRs]7sSH*DSH*9LOlDۡ1"?l<,*}u d8  V ߷V0m߷V0maEDM - @ F?(T@] p dz6Yo|MRo|Mo|MQo|M+\/b@sH["%H["%(a%)s& bv.vE 9eT! 発+hgqcGI]+O(SKq8Uɡl8K "Vp_s!L v JtK$& bxOVRM]RM] &ŌQU^K5QU^ : Z,K r+p`K Rj   3DD?[EQ ;0RK ;0Q ;0]}GG_s2r\W?aܽR>j >{!<2@aG @uyɻA =$uAr;o_l l AykA(u^B$? CKi|G l G]L]b^ G]L]b^ G]L]b^ IQaIQaIQaJDut K6g5AkNIL?`/ sjWS jWS i|Ħ #E# E#b b b+L %&y +ƯP2)uJBf lBfW` f.` ɽ$:X,NX, ʙN,Kˏ"oc ' Kh s̙LC[Ғ*1e: #41X^Ƨ9z@v>Rկ(H'Q~hח̾ʹ ƪ%v ƪ%vR.U5 ZAXILݧ 9jC95Y j }P]YG5mM(k D⹘-"m m&\M^%{$ yZ :G m~ "Nf(gZ 3uPWNC3uPWNRٍ%OtD9Q!c ︹+r%R2z5ýf2z5ý!^{y 8k-  QF ( RPjE A ` ጉ%.èaIՠJ: #r #rt#e|9Q+9<?t*'  ru!pj, L8` HV~ 5;e@q _M %Izz@D %]qR[&aTK[&aTj[&aT iiu: ўOAsdAsdAsdBǪ i /9FM  7Y K 7Y' @[ 7 @[  H]t  S2WR ?  hh\ \ %s fp,(v (vdHpR }? g89b|89bK489bT89bf")2]m%]m]m75/ 3j|? Qn?KffLss]&<Zړ_kxheb )%'* ei=Zѿ" , T' $oAmj {{{{Rm"'\vR"}Rhf#W$2 -$`Iz $t0 %zebQ%c%c%ފ!2p&mKmh /'((5&*\AVUK *huu^ , i_, i_R-f, /yaD/٠ c/٠k*1aշ:1aշ:D 2ڡ 2d@1R3(bE4yC ;5>2 7f I" 8mnf 9 ~8sL 9޸]:I;:T)$:uzҟ :uzҟ :kl[ U;!sS<&KgJ<&KgJZ<&KgJL <#xI<ēo*>*}k>Z( ?oڇq i A`X!BPlefBP!(!Bj D$-DBK:&F3ⅳGRG.Hb#ޙRJb{H\J"SdJ"SQKÜL) 0, M@:4M@:RM@: MGJm M9|Pa:&|RkSQ-Wb SzN0 SߘMa6? S| U&O"oPURby)|Wu Wu [XO'B X!{J e Yj:O [ aY[ 4 [8C@|]u2b^ ( ^? ^F+8_|v`Kf;a FI$?a FISaIaBbr lbkvH $d(aW e43e4Q e4[g\aN;j kosA l'vvHǢlo+$(n XnX f nX o3p?Vs)p l} a p܄E֔ q̅/ rA9gGtsM7sT *uuuQu v5Gs"w! oLw! o ww>UUwN^dwӷ0IZ wӷ0I wӷ0IdxXp;xZT69xRqXYy&Ɗ ,yJۥ {.SKO |{6k pDqpDq, {2? & K.ZK.Fw {&YE{&YEzH cni cni "KR |s'iX aСHh $ %:*Yx ]`I* &͵#z e7͵#z9 E&b=\ ޝFto]E5 @kĽ\ CS 9Ȗ[0>DR>DN0haVY5޷? cń@g o/t ,:> A)i $*6 $ d \ hnM Ea\ 'ggF{ n*IXh 3EvKC ޺  5f8bSw*wQYuCD uCD inCWKlx)L$} $ Y/]466!j466! )ws%05da[S "9 [[/K [[/3榒)) h/Gu $Y9%, O% \xyI` M&w. $t9`Ĵ F [|ɁS #Fl:S  @-t硗Wv硗W AHa,F P/q #“i]v–G5EyO EyEy1YrvrkKP;d({ ;d({ twȘdȘd|) ʮeui DPKfh $*R͎&L %E6Ѐ$i=, Ԭdɛhs վػJd ʸPj)qL=g׎١z iיKcb# [ \  >ӎ2| >ӎ2 -BR8ڃ6IrYڃa=vۈ@ 1sے]աmۮRԊ $X<|4 w'Ay1c"FnDo?ݕb= ݳ"6Et?~JX j~@ ߤKJ߈{!`t{6DR sx3}T ;wJ;wDf?/#f?/ euU佽 \垀N36S`e``w׳W4sBh#-kh?w%)Ew%)`{A  $[~J .. ~륩O ɬoUjEt{Y. P)3C2|LPu a >|pM{GQ@ (=`y X@% =ޫH+e  pe3ʵ  +E?Z ( HV ڥclJ?p<a p<o3gyjL_' cmSQ , ^ F  N$Qn j <8 u@ H  H }B hhVy r#c[=`<s~ - Q R >7  >7x9  x9 rjrt:=l2n>S!quEِEe<]pb]7/F<[~> .0 a Dt;$!}<[P!g:,"Kqs$"$]j$8s$8 ($8 %4'r1P'╭Ea(^?Q)L=)L=- fmc!.ʐ~ .> /$= 1E 3^=3qާv3qާ 4@P g"4 v#4ѻ4 o`s5r~]6~D7xkr7xkr7xkr 7{@9+؎tt: Oj: Oj]: Oj: OjR;w4݆s;1J ;1J ;eZ;eZc< T <>ίw<>ί?=ZE ->B, (>jE?uU">c+t>c+ ?<׆C irZG3{z #IҘ: $JZ#J-v,MRNhZZOOsZ_OTPA; ]PA; PA;uP*RG-&R>!R2I0 ,R\( ;R5  R5 Sbq (S݄ Tƺ9`$T2o b!TwcT!"WY%u +Z^_I1Z^_I1 [V,: X[[]đG^V(^V( ^8e _l+a`]b=Db=Dcаdwmke $ ff_(ff_ g7Qh$. (hט^ $hט^ hט^ (i6!= i<:jg[WGKj<OmsdQ^2oI \oDsVypV>Sej pV>Se q6o;dY q1^6 sS[uuv}u׀^?jv>sM챥 v>sM챥vɡD m w('!Nxx<+(LxlM zV'R}-* ~GVk`J? 5^Jed:V#||N ||N `WeR8;./π \9Z9N j`ܬZJ U]e U]e.싷xu>mzmz."ܝ ."ܝ \G$i GFEum6֋|V7Uoh 2z{505 1U??N jW??N; Gd Oewt; a Oewt;t Oewt;s(7FD @wl3#t Rv`L Ov`L ss=sA$ od1tLȫȫK ȫ$ t# lq5K-}".& b.&bWtd *ء O H|(u-̘}uЪ0Z*]ʒ%  !%$ZQv RlZnXU\s.0 .0 .0 .0 C: 4hsqsv%svsv  +'˥^n˥^˥^b b ?5U / |nƪ-C|L-C|R-C| I  ,;E,{ ?JιN݄ z .l3ExzZ ƲWl7 M!1Bvǁ !Jr#+Ox ,xBi s-l [j ^,X ?PSë#EIm=h Im=h aЧq {Kī ҈AsQbҝ"Kh'MS nF rtnF rRnF rnF rnF rZ nF r lI ak aY g;N(hHa" avjkL$avjkavjkߞHVcZ#<q(h}L<\DfҦ_o +hZ Fj>O@:O@ ;O@H YizdIQˊpO \JFAJF[>b ޗZ (j,ttC^) 8 8 r)~r)~R*V!AR (?ʨA? 2 G$uo_]w @$s %Y Pa̳kMlF(EaxA 2n;* eM (/N:/7OfŪ9i?Y-UtC@K {k_C OD |z \,8\ ,8\?6 >O֙ H q" ]!< 4eh 4e jJ8 :> . :>  4 g C@ *k, a6[$9X`_v N:O"`y bH i@]] q0q0~ nsNSsN:Z x@_Q  de! !7 =hb.Kp zR 9Qܭ mx;"K""Ri6 t % d0 $y!3{A7> !'K! ݌5?"Ea׺2d"?IM#[@B  $$48 $J:aj%'5YS(8N| T(Y] ,)ع_)>Pc)Vy_ g )K (+$,#kz J,#s-frF-frF-㗵Z . l0. l0/?R #0p*R04| $'1 x8`K 2cg 3]u%(3." s4kN &N # 4WD?8YZ{ 8y8 ]* i 8 ]*9|#2:Bݖ;ޢ> g a<-F: =8q i?= *@֞;u: BWAh DQB0%SCCZR- CqWcDDłn & iDoEIWM EIWM E%u'QFS1GO˜ Hӹ4I+T.Ib-|Ib-J>v J>vsJ~gLL@r3)NO?NGC e Qg(_4Ri*]Sж& Sж& iS܄qI9UTlV\Xm?%=6 Xm?%=6Ym{)\?z]% 8]#,P_^|FV _`&mruna7*ة[a|נH"bnk cK/, d׸ e)HT e6Be@O#e@Oe@ODeNi$] f^VdUrfh;}~+fj lbfxN9 $f* gZ,l4*Rl`syu|l̺86 mPA na)n{VAc n } o1 p97r|D`?u(^p& u(^p&R vRdvvcwxKU w'1@9 wzآ  xS&E9xZZ mx}D x\B|x S/yKN?y\@yӺ+URzpaղ|+eCsK|_ÉkS|8Zv D>tD>s,K, 5kRx|)Oo1. 8s˥@zD ˥@z -!W$ .ٲ?? 3c3cg>A&N RxRxU9>.7? K UtSUR!m%Ep;B<tmj [o1)[o1J iTlb wC싽_!T_!T${0:'R "I<1 ?$(eq #0ňolMf ^+2*jȥz Ϯ1 }<+< UQqUkaUkLf?|b[Ws 4p1Y (k%d2 '*ʹ i'Mxϲoc?$n0 ,zޟO \S ȱvȱv"O %=* j ܢ>*ܢ>&#A"`kb+ A !( A !( sU! F7[;9{Ze .ܸk" ?v?00qoǥN%5k8Z5k8Z 5k8Z 5k8Zu䩃 8[] %{K!%{ %{_D R_D;y]- kjJ[6 !c}].2 N \f*?$<%  +څ? p*ȗGl % ~d ©֙? sCpx'Cpx'cN҇b̤XRRcڝk} ls&ŒȬ+SwwPfC ;3QW QW ,B@k̭aeׁ. 9@_u , 9@_ujϿn j}M{wd>xTӈz7_QZsv ?O޲B< 2A/?B] \B mQr3՚~Qr3՚~ؼkxu}e,262]DX[k ۇ*T v۬Oj "A#U l`C/͆GG">PpHd c %N] m= # dw- .צ+Qצ+Q!8צ+QD1!WQ9M~5/oxr%(`ˉ$x $xv$x lL mj) K?t8R[7 f \a ̋ H4j1, {[V    "<>jR 99t" & iƧt V2y -Ձ $ & c :M*Y)dKUi[t]? ]j Hq ht`K} 2 i2 2? c _ 6L^-{ =G+ a_H[ͺ!L5nfd gTY?8@c OHyfsօQy    mPv[!5^d!C h !2b l"7S #I0!FP #z $'&$ߕ|%[Ԋ?%[Ԋ %; z%^N&Ϟ &&&&3L' &V{z c(( : (w#L6K%)n2ƵL*L8X Z+I'Z n .4 X .b~+DQ.b~+Df.b~+Dy.yM/Ob3 . 1~^R4BbH5+5& yQOL5& yQO5l?'Q5l?' 5Y5G j8; "9,O1;;NfA <\eQb <\eQb=`N R >? > ~] ?1K?@@[@¼BF BqKB SB sBO  C MA D|Yu F! G 2@G 2@3G 2@ G 2@ G 2@GX:1)H, ?HkxZ If6ӝ IB.~%8J#u >kJG$7 $Mf; NNn"#P۾-?P-I$ ,QAbkjQZ}2QZ}RQZ}QTz'7K TK V WaɀWaɀYMdX d? YL.?Zbs6U[ej[e]. _7F1_O4*:`pSb?snblNHM? bh $ c"5Z`[d£eD0<\:f&O fM ihCJ3y k_l!x3orb[[ p;|z qnt r n ryt͒ tΒ}  u 9wKzyzAp'{rzedze { i|4A kR|4A t|4A } 5 } ( ~KK\ݖ ;ݖ?-a5J ՐR >RVx^ = 'Al~@[ Jb^" m~⻳X_,k֘p\\[ H< (@y( у_<0M+?n-pn Ùnjv;4s x0*m{[k"c C9 m,Z?Y{b cg PDb$$]wnHvuRTZ2 >x_nԫm Oh 0Q ZMf^h$Yog 0 {q s]; s3] Kg7E\}K 6F +.? xNqmL@?{, a{KǡA.#ԘK e v#< س5r \U Ӂx\l""g"zSn0 =2n h.oOp@Mp@MPLih/PLi Ҟ$).U@ 1.U@| M xL]ZwYD{ ZwYD{ &( |XNis 7;Yd cBflRWN'!^qm ,(t , (_$jk8mOd 3k8mOdk8mOdµbrX 7$L0E[ĔBgňV i@ T E8u|)Z)3XNeZx: z \AṠޛ ̿0h?͆r P&]RtvSo εoεo F={b~l׷=) f% 9S& *>Y 7 .i" om6 JҸ&rJҸ&rCJҸ&r֫eVr St; ?O?O?Od?O?O?O?O?O&zۻ-2N"?1"v1"vcK ,UᚒUYE -:/ǃ2P o~zF~;jKSd@ mUPiUrKUPiUrQ\vD)"D) D)B9S?<B9S?<쌢 sBgt 퐗\h5qUR xI'dp: .hVs鏞eR {N N4!갉 ~~e9~~e s 2H 09y`^OHZݰؤĐ2(' Y Q8?h ѵevI5=RQ I,R dCy*,] ΄^ zdcCdc s>Dds>DJs>DDFs>D s>D ʢ s?ws7v K,:X<X< (eCJ IUZq4 P ]m^.oR T t1T &[lPuwql ٹdODB&7E j$oy-Tv  ` i * O na l8 ö +> +>: +> s V}t 4@}0! w=1 w=1 )ꐍڎ sЯ3 Я3K֡lU[>U F*oJklp*` ?nS&>=rEOQ:h[LHKsH&bԚ vdD }!6Ps 2(%$Hp7!]m ʾ7 P3z4dP3z4K "$Z) ,#sd #%F``%Dqz*jSR+f c,91M ,E7 ,Wj[,**$,**$-Baj0I1>e0OJi 2۾]2$R3e΀t3 3k 4hZ 6*١vs6*١vt6 " 7 r r7889Ōt=|:ta ?fIE {?C@h;@h;F@h;K @^p, l@&f@׋RW AT(`AAT(`AT(` AfaZC#JEmѮjE؏7ASFh(ק GD'b/D`GLh3I4{&I4{& I6CZ?I6CZ?J_+&m?J_KxYZ M9+QQyROk,z Q["QsĬjQifk ,Rl5RlR*&wRV9_2 R𝣩u Sv* Vz`k V<ZWڨJ$ X|˽ { Ygvw. (Zzv Z̻<6v Z̻<6vs [ e[g*|1T[g*|1\!VXL \!VX\U\KzeV; ] U ^=_"#%_0 _Y0_Y0`#u`#u`#u a^6d b8"z?b IcJJ8 cJJ8e6u=e@Cke((.p+fVh9ֶ hi9?k.Y?l͹:.Nl7 ='9o OZ oFvh'oAl p2> peҰRpQz cpDq˞o gr87jr87)t'2 u`mҎ u`mҎvb6 evx7!H xkۂ#xhdL3s!yr7ޠyr7ޠyr7ޠyr7ޠyr7ޠLyr7ޠyr7ޠKyr7ޠRyr7ޠzfЍq #z6s}lr{W|ᅦ "Oa2z?ȧej M#=M#=L TxteȽ[ -I/ LqQH 't\hi k9Ύ 7YzR;'B ;'BPTT; TT; upwSBqI BqI (BqIBqI WT +^: Y&߳;7{l%l%KAvS R?l ch?l #+pNP-Y 2`'2`'O&CHR8L@\ WW7WݫR%tAP .ǯ̨F3BsZ 16   a_xI_xKv 4$$  /x m` &aHC2m_ 's YmcT ct<  lt%Uk{sdk{s -^U/tU/`U/b*:7*. af6NJ&U$Rl aU$Rl Ĉ--RЁ}2)84 *f-kp \ ʮ TBb =QpNt[ ,c5JLbp$t\M~E i is5n3c0202cs (՛oK $Ao! IpdOH{H״{H״^t1:=6`"1# wt wj w.Δ4T f6#do kkŠ;|kp.[s :/:猡:2 % %{ ~ڜ ~ڜ ,ʲݼʲݼ $̋(GA';H4'Ò VS%o DW ҕ3 k"٧ S̢|eAt KkaӾiD٣3oSݟL xz .޳(m:,Ə aUIY^UIY^ڋ5b @_ESNnrݽ tΎzQtΎz`JĈZf7 : \ld "=: ~BX kO ,ZJ3ZJ%w $Wb'Ym(eREa pMD c I]y #Eɋnl[W+=f c]t]k!T H<7l|u_ r[`܊"F?01{wNsa#p~ .iu΅kl08UWr9$UB{DXB{$${3d5B % $^ւa`= ^v+ P>T1X1h X1h_u!`$hs zP m_ " Zx- =Fmsd_lL d_lYsFEQ7 +宱?3 `2F  0Qj Ӆ,^? K 2xMʮ#0 2xMʮ$ pn@_ Jh (O pы " ,5ʪn h X fs)#BKWj̪>W̪>Wbg+ԣM ~~]t#ΰK #ΰR _q>gjs{Y  kGz !󜉔!O`J!zh !zh "v@TiD "<ޤ^k:"<8U# 6k#gƁN\ #%^ $%ԎIX`i%gt&L&L'8K'e𤙨S&'e𤙨U'$SJ)EN)[Ϊ g*-  +]S~ (-93sb.nD s/3Ż[/.~[0ٕ 1v+92r|YR2r|Y4(~4A/ 51MF3 5Lqxv5YBD 6og6og6ʸ 78XQ* 88ՠ f @6A I  AL?BJkCqtVsCqtV & C[tg5 E; CFH3Z< Hw} YHTMv IrJ:yl5 (JI<ߊJmL*sM,¤1>yM,¤1>MdPN.(p \ N?PQT ( P?Q5P?Q P?QR'阸?R:̍ R:̍Re8VUԳLI(?UԳLI( Vj2eYWF'Wu OS pX X|X3~Y +[&j Yh}wrY}+ZpTh [.w; \-2fo\> m\> m^#6v^#6 ^*,H #^N` 4rn/+`gxޗ.`x!މ ` dT x0dT xv fpШ7?f/Kk h>& %i A(PSjowojtclQsNl:S͂Nm1 Qn(gX n҅oPHZ orhL oԹ5UK ,q)?'q)"r z͞ rPtd ,th?Dv4Nk0wN›n#ysdL{y ]y ]Zzo$EyQ|3 |o^v|aNS#  | iw )}o#D~ohZ = ~XCx%^. l ,.Q*~tt+ rCYQ,CYK g Upv kԇ l .ld i:TK~- (CO %d5'|`ȫ[ |a) |a)D ,~+j }ik }ik Qe)I ayys !qYHSR34DގK \AYk"\AYb\ /s ǿ Vel*K Dp :8)!<ჟL?åB TbZx $/Vo@j^8?) Ķj Ķj )9 Ԉbf% #;4 a &Gwi c ,0D&,0DsOQ =$ ciX(?Qw‡ r$ʬt{r$ʬ<Qi qq i|"^SADVla0[Y3^+vnY 2nY cpD q-g,Rwo]N=zY =zs8"L; 2o:o:)Gր *2uGyNoBy =®g i x; g=5R >5Rk@>5R 4>5R a/>5R 38x'C  Jl9RnJl9 SJl9 ˰ j1zj 1zj M1e`?`#ԣWYбu % lPa CD1CD1Hl8D@=C 6QM\| cU$ )Ve9FtQ { Ц6 #Er f[b^ d , hX !t' !ۅj:XR  h S 3  ?  l¡/L نھ TfN4U 1u5u?:1u5ut {#/RF2 (ӹϪKQCQgdaK"UK"UCϲdh.$dh.Rdh.Ko݆Y~rL ? $ !!I ˊ , Vt/y[Y֔^ !~sRD ~sRD|8~sRD ~sRDR hT e".?s.jC. (8A|8hR .s]8DaràβCv 75{ؿF K K!^'C s !^G_"CS%m #xH y#x2h#?l%[eƣsD&,7-'ʽ)LM)LM+lg*+,Q ^-$W/ Y 29웧GU2E. {P 2_(#3] 4Z( 6=ܙR6 7\N7e2%'8x:4:6]LY:"am$;vd =Z#OU~k>F%?Q@)%`@h CEK CEDHj R,a D4^!Dp~"Dp~"REɃ ߌ F{L cFFϼvH/Bs wH/Bs Hf'Hl?Hn I]Njg Lit֘ ]L7y (MEV?O@" PWRQ/RXNXw3IX{ r ZQoB[ts:[uo[ 7[wf\6],\N"-\hȓ+?^U?; (a)i , b5i cc (cMR52d#l? d(g`2kd(g`2 d2?W>;do4`Ef eױNf}-,f?Rhhpci]ZB*DicVILio&io& jC$Kjl jll2m⽥ )ptNpyW&pyFpE rh΃b s+BLt09V:tVqk=tr suq<ǗvK=7q ivAFBw)nATw)nAT]yZ{[%#{[%|&,17j" YivB Sd, k ?}LG ,L,P- r7>9 ԈԜtyN04 qWj|Yzm$<)n0UحAK*i9j%;OQ Q ? -< m-< e*c(P?Kq *HUaL6H@wNSz@-ߝwJ_>5j>p G8ÇiS jWg}lh}l I}ls-}l }l (a8< nw$vW ًTW~?|€Mh :R >s!Yd \ŎRl˲D -7^#cHlv PNmC ew8T  w" AHΥ@"s & g! & g!W &tZ7: #M W}Zb}juM 3 5"'5"R>]C4 m &F=GDtZ'C \PR :#[.&{2 19]R9MR9MasH 4 \brn;E $ dl xdl xE*WE*W9xS9x 9x9xb0* b0D ɲ6#={ {jai|UMO'MO'MO'MO'MO'΅63(΢RYt"̥ب̥ب[.UXilZ Ғ۳r  ]c0.ZJ?0.ZJ@=v`/?H_THH_TC՛wl נd (ؕC͉ `~Z`xn "H[#Br7K ͂LO ۄWQk%mD CwCQA[_ ! {'x ɖ1f ɖ1!}> "Y6 f"e^auǓ "e^auǓb"伭j##v%h§}s&٩D a'J$ +.j?,}aK-ꑺhqN.# .hWY .߇+K.߇+.߇+.߇+.߇+.߇+R.߇+/KY 0w1D0wXD r1wB] 1rs' 2C( , 2K{39~U24]~R4"Oga4"OgaO4ؗ 5fD6Vv \6Vvj7yɐ_9ǙYR;Z\mi;LmtN8<>N8< @4@h@~(B]y1 CD H:YCJae3 DbGx vEC8HER_/ER_SEܸ{ FZXwH|GzgH|Gzg eIh"d IK^SdJ ]m݆J"$n{6KL޲RLbM&M MhTM\8sM\8M\8jN0V=O\?Q!7LUQԛbR( RQ+LROR T'РUT'Р T'Р T'РTY5r:NbT|Zx- V:NjV6(^RW'= iWIxh eXp4PN Y!NZDCZoٱZѲ@{ \[h ]*Rf]:(_O, a`Ǡ& be\be\b=ʂG \e K e󑥏Kf!m$f!m$<f!m$f!m$f.JB fzG g`#zB/S hTeRwv i(8:?i(8:j&]j&k/hkM4<Nlu m% mPinƩ2y:ynZVvS; om FCj!om FCoThX. ioDel~+oVGp'rcp sf{z[F tc9I3 ct @}v > w'%wU]wzxjz*Xz*L z,:U{uTly ~^U ./*wl׸{ ,x ޼}a:x#L=K#L=( z]d{m|1]d{m9u [1VZm@_4: !j cLZ5< "$ YpJ -ϣt~Gkhfk,ϫ a3Q%`suj1TDzJ DzJ DzJ v=yjj| l{qF¿U!1Ū r3R!jx   g tKYP,%AȔ  Z%\۞}BÛQS3 j?Q$RS)]9ago FW K{cwoV %ؿM ` kWyכ~r j~r}2jJrJr iA;|~B{SP퍽Vi e;: c4!\hsv?df|==ܞ9VE  8zN#@ȫP @ȫP 9jEUQi g뼐?뼐!^Q@%S(@%SjRD2 l&d.ofs-fYs2yus2yuQs2yu\ .dL-@:Jv3r g3r 3r  7` 4]){Z0GY evw 1aZt 1aZsߠ?ߠ?%% 8j@s XZ;h ai56WKh eryH hAEf嚛e3 圥{Ȭ| cVj iFԸQm$4K .P .N%w\ w\ 5^x 5^x Xu t#LF\]m/] 9 MS (ywJ vN %N gm|sk > / &1a vcV. RRs s RRs ( E!wcM/ (Azw#MȂc $TeTeH]Zt4 |8N=vLW2KvҊs]Ҋs]Ҋs]->TS.$VZ{ (WI?C>,X .Y&K4HzvhS3!{ #$>n]d$˄ ;%3utK%3ut%3utD%3utQ&2 &]Oy&^&=X ' XMe'[D'[D'1aҶ(Ng~) *wߛ i+q`?K-DC (-DC (-D_-WC-vUJ8 -w[3K/3g|/GœC 0p-k30p-k e2+}  3^{ 3Bz4N&0 ,4N&0 5ODHJ5WJ6kV6/ZL6df\ (7#lU8E@U;V峕<(J"=~#)>56 >& &?Yb %?ɤ[, a@,κ \@p 26 AG\rA1-V CmCV@#O9F. (FȖ gFB GĦ ipGDzGD{GD9GdB'O3HP4~jdRIߪIߪRJukgsKCKe sK-Pw K-PwL DM3dNH[MNNjPPN  OQ԰? -OrW? Q@8R~ {Qkv h9 RЎ R_0 \ R_0 R\$9R@ SSWXShCShSkجrSش TqJGRTK Ul:JUx= V8Ve:BV\f WQWҪ|WX-*_hYW<ZG|:q{ #Zɍ|T[czR]+d ;]"끥]:8Ջ -^(+.~^(+.R ^ci e^>A^ [ ^څM_\^|`4hnsw # `k`EbacNcW}AcW}AcW}ARcpL]cpLc.'Kc.'Qc.'d͆5#Se[a@a fKĺK"fKĺ fX%Zf?/gglϱm 8h7[j.FNjNxulsOl,MvlH;Ͳ(L=lH;Ͳ(lH;Ͳ(lH;Ͳ(jlH;Ͳ(]mR= n<%xJ $n<%xJ :n<%xJ | n^b0 p %FbrXE`ˆ ru<T ru<tP̌.t|!t|vx*Y v]&" wC]p wK#;HxznT Ryixz@5zD٢t.N z_, {jwr$ {;1 |g&u}(FF}(FKD~^^~?KEǙ~)2EМ•< $Y&qY '_ :zBq RFRRFS .Vؽvy .CQ;mA jSRd=mW iZ{7{D:KRm  :W=%f|' 1Rf|'s/3hSd~( cV?dW# %^NmMĥ=N a&=/P5hRHPYH_)[SH_)[$Z :9҈l* a{6F{6F\ bu-h^DƔ >jO!_O h8LROh8L):a852QST24rw ---?̬sJøP w1OfRw1Ofc", -}dPl]$d++_,s?",s ! M e]VV\xR6ȖR6Ȗ kjͷFئ!g%c͘R,-Ӎ'APWƆ.|xT8W{Q a W{Q >v|R 8H H ?ݻ?hK!èPϐ # Oa OayQ Vή'C0 Mdgaͅ+{ͅ+ 9YD̲wRKש$΁1dΧp|ώ՝߁ILCRіq)s+" B ! a](iv}_R.}_}_L }_ԡ y6:uX bՓ{.ָ{fR׬ YMSޮk؈:$ ؊+桳(h{&gOw $ p0 RNڱ~V `{fx ܿ&={8|-ˉNŜ;k QS?pH B2zV Q vN?rwLRs '$ `S.$7ɘ+Lr,| ? !M-/U|Ksmw VF s X* X* *. ( p+S j1 ZO+ t?Lq%} aͽt,vN% !SbmbmnP3 c4E@|?O*@(8Dy] g:6_k  /o} i]%/o} iwGwG)̌V{g W?J @jZ %y89|%`s&P@ &d Y* &7Ӭ2'o (\2]*6#R*6#*oY~*"H] *D$;R]+*D?,lUѼC,_s-, /)m0;/ 0Pj2.Q30:9K+ƅ;< 7J,lR < 7J,lD < 7J,l< 7J,lK=\[L =>U =>=>=4&; @ȑ) %B12 BnbvBnbvDB;P2D:E*H"HF@,Fʽ65 GF. GF. GF. GF. G>ɡdI噵'!J( J7 ȹ OER!P7 P{TI"CQS;j{|Q>R Հ4SYq Syc/TҮzKU8+6H?RVl8XjaA e YA aYEhHL Z~J5:\Mov8 _NuT8 cam? s bi5>obRbgEcHtd.|jw d? (d?te,f ef!Y Y fj.7u g!g?='gb^h$`[kRa&l"G l&]F@vlrY}Sm/9mFD mFm0ox?`oS oz$ޣd p_ p lR wqDrciZArciZAStnx t`\Y \t`\Yv62=ZXox,zSx,zSxn93 x_  x_ Sx_ Lx_ x_ x_ y# i{w m`&{w0^~bn2~'ZZT*o# 'v]ڃ@x |.RˌNJۗ ON?1жgwP)iH/ ŎOx #u0Qﺐ4H^خPH^خ 4ܦd2tHWBX -U%=U%+qG?f qG?fK qG?f:Kbd = ?= ?t9s$Z=O`*~VBRJf j]VSp:es1?EKN!G"{o #9 W&# j2RnR-E  T^y6 Wߥ`zd U Q) ( <MA \鵆4)0fя$h04Q4e#" kj=q@r2U{={=E ,S nߎE. (N/ =+cc1_DV^ a k(c  D /]w ,˔"bbji,gjB="4Z- T[7͗ jG ,Yu2d_)j \ TzY q ^M󉜀>󉜀S>󉜀>󉜀c mfFGUT^ 9eW'9eW'* 03r[Kr[:  q2Zb@˩  ˹b9S 𓂌 PcPzmM *@{k@{Rq\_YfIʲ(j'ܟ#wmF awmFsA0N8fAxɞ,Upan80+? ErJ#)ErJ$ErJ8^a1 1 10%S\7 gä WiP wn# FBe FB # VY 0;C -]5  b+b# tO9lj ^ e{_͎ *6 =& б gẂS9 e ߥEJ Rjl RjlH$n (+;#C.]oq Sȑ  }Z =ǮI ,ǮI䜏䜏 bmm *fw8D #T!͸K" o#Z #a2  $nR &isRµ? (`2)!a$Z* YzD?+*wv- fOyS-40 (./ 9 .w 5.|#04̑ 1l+27?s27? ,2Ĉƭ\ 3!;4U}R5=*?J6Fc 6"|7;6-^ݎ{7zs #7ҙ=8hQx.+8hQx.&9]רBL 9vp9vpC :6y:lD :lD ?:y^z sB"UN Dl8L DzesD:[$ D:[$ D:[$ FP^՞+F|r~G*gZj>G*gZ +Gcmؕ0Gcmؕ - I>JFgW ^AK]/ LtLtMXOI PtcP,$zȅRqj"u?<Rqj"u iRqj"uRt S-٧ , S-٧ $T"VgʩmW~= m Wƒ\ 8!\h-h. ]qKf& >^n]^enB ^ltC_ _| _\wCa[jaƎN&_dIFAdpF\we6H gVn (g_No Ugl@mQh% ,? iP׳6N iP׳6kk@pܱ%efRpܱ%efp㩐p8 |sD o tJtJvtx&7 vHRRwn cZ I ] )U9N, (4 D2k=3&i8?oRp0Zjbl$ ȇ?lY }o?YZ<Y }gy;Gbg`1g 1 w5j +~lC(+0 3!XI3Iz iЬ[+R /?UauQ auQsvT=Ž7kke] /3{dr|u |4WPX;[Mzik] R> )ʡh%)ʡh A\`8c 7? *Ng e %J WmI ȎtX| ,ȎtX|s\/j U"eW8{m+l q| $ x( az9 !=l ⯼R !5_ 6usƽ#Nc`5ƮtǶ[ nɥ͟#s$:ʽ̲&T4ww/K%bZ>|rut@~|ͷ(1σ'  > %K@'|6æT@DsԻ S Տ_;6yW]Eyhn^ס-G¾U0؜G g P40&9ÕW ྦ@B1 ލxsޒ@sjÞ] aES6G/\Js7 X[^ &PK  2fg 2 iF8RxP %魨 d߬)=1:Q'Q' Q'Q'gC%!!A]: 󊝩hn?8I9'H=D»Zo0 eo05eD Ɂm: kQN {N!8 3rELj5RnU?ޣ vԇ DjW %B: N6I|H(nո!Pjz$VE :ȁR\8$su϶X5pe?J+Is^J+I SJ+I?=  i: hM{ TR T P%\ĭWSbJ ]tz K-sHQ̺{ 3 Q̺{DwM YB_U~\_~\~\ļ ^ ms^J?>x@WX mS`@  FFQ˙S-OĀb!t !sS"veCL#b@E#b@E$q&RD% t [? (L , (Lj)e9*1QX,=Q-=%Sf-hT' - >`|.˄!t00X 00X j00X 0b^{7 0Sv ,1-.3Ks{V4fV4{{I4{{4BW i4m4'8@u 5o)rK 5o)rK 5o)rK 15_"5= 6)d7 dR7ޔ7Dy)Gi?7:]8yN\#9^89+@ :Gv!D:mNdF|;[pK<^<^K> |:s @|}6@& @-8Ab + A ;Wd# A1OND'6 RE5FFkwBUYGd-\  H TEN JsXAK6P. ,LRٗ1L{ NZ2YO07P7O07PPʥk{Z)Q,/ QNjUnԬU5Hd V2v,W;#WC}鬔Y2hR Y2hQ Zx9v_ \ \!Gp ]^_^sS)^sD ^s ^s_ a _ m_ i`f" i`f" \u`f" ^`f" a,`f" bUúzsb+ NbX bFL eSW!eU/U[ed pfm7J (fm7J?f\ R igH'w *if?vYib i 5 /i 5i 5kk  l;W" m{$oѨmut mmzmmzn1J"« .oZf Ao~Br\ޏtP$?V9u%rbYutk?vO Yv:C#v:Cw.%և]w~Ù wk{y7{Ӹ {Ӹ|f=?|Y}ɸ= ~E?! ~fH , l+,j3wUCD Q-s  [0  [0 , 0  Im& : *N ꘒ2 f[L7dd$EHcW ,국 Va4?x EA?  vk,tS 9st'9sRI ~6@]T]7TTLT T TSs#4XR8Ծt=bs #O̥!;Pvb+{eRCަc9 ަc9ަc9 F`t3Ղ doCq[,v S1|ЖdPumñjR{r?, ⌧wK$yBG3 sؿ apY zSH} _dIW  KX<p{ 7T:ND$7T:N\ 5F@?2  ,5Oz ^1^qm,:[ЬkqHѫ N4oN4oK8Ku F- 3% LS. 4t @{ @{ ּt[ &xK"(xK"$xK"F iFPp  $ri * iDҬ5K ņ>ŷЄ] JU5B ֣OvV̑L ]zuS'm= 'm= ̱}&'͟H5e ΝAβ|Kj vl ҌY a ҌY i@vCZ9a MշWMշW j INj,Y _% ؏#ҶZ(pKqJ4|桗6۝' *Jh<T(8J"S ɸmLRD*NO6|ᓖ?̩jCK㎫e~ ( "jsez%i'(D0>JiYN>,d?3) 1(7t1@/9 TXy Elb q)N0sHN F~ |*SjWUhH$V $$6Gg11'liWt+^jB^jB)# HcG:VTh /4sîi ?@Fg?B'7CVsCL#9|D%Ӓ^@CG+,~b?kIr Jy# J`M9ʒsJ`M9ʒ ,K-KzAz]PLz9 LzhLiLe]Lem[ MU;$l"Mh疂NnMTNNOt/Pcњ P&fF& Q> i Q>R2C< Slj"Od}t&T#E\VUf v=V'.Xt#@{\ Yjs Yg|N Yg|N Yg|NYZkaEv ZkaE [x0\x?# i^3d _Og#b`$ a>`??5 a~@PCc a NpE bXhbXhc$F[c0? #da|H eE~;eE~BeE~Ugr bgU:i t j!~.jsrjN=jN=mP<ZmgtA0$ccH5[Q ccH5[ƟNQ&]ƟNQ&Ǔ}!稗~5l[]Pb M/UHdGgZ >۞ ͘Nͭ9ͷ >4YYiY{R?I`kq.I`kq.I`kq.ѦwïҼe׿w.?y>n? \> %(Zz: 'FՙwU՜{- 2A \SE~/$E~/jE~/Uw9"ׅ2k%ڑޭ۷ _t[6b  % S5φ # [B&c hs'j5<< +Ϟ j5 $ )* )*a_"y7_y7_sy7_ y7_ty7_Y!N5$6_ ZR ^*ւ9 #1Mj1Mj\EK  h +_;z+_;++_;dlfN9[Ut&,]Y6`"X9?Y\4PY\4P3?>m  >m ^m .B@Q\ ipRqHopRqHo ,#Qa pr< r<YR^FƎn9qn:yOqKUT˝L9  9 EibEibCJ+~? J+~? \w2u+z# mͼ۷SK%a9RR>c 8?'jl  Vw (8 Vwt) AC@GYt=&Bn} "P`{ jBD ?qPhw \\~- iU a S*?  ZX W.C i f'Rz| Ja 7p ^ 7^Rd7dA244NU] ,U] ! <?*;a amO:ڛ# {' $S7L .c9\Lj<N!|g!ș,";çR"k=}=#L3 ~$#L3 ~L%=R'_ұ? at?bn Bg(B|U B~<BApCejeDc _E MF&HFtH KX0C L #M2[MY1N Ove PS/_D,PoQ5 QʁnTvWdYT ct? T ct? gUKTXK Uhɡׯ (UhɡׯU@3?W#w~X8X"V~RjXoZ [v9PJ[!\\ >_' (\:E\ȅ+ ]z2|N]³i8ߺv^P]._R2ZC_] _]`O…[`NS` `lc\ [ $c`6tM.ScT lc\^Zc,>Dcό[=dhz dR]1e]f~#gSPMgՈh(!U3 ,hKOi !9 \iVǦAa jĞy;hjՁj,;j,;j,;j,;kȇ l`k3qe{? kɡ|?)kNpne Β>p9V \pqiyIyeqmBr`X/o st@.-Upuutve{-w$UNw29'w29x(yxV@ +xI[bKzW{r1{}@ m{?SǨ##{?SǨ# !|;rNiL}}tF+NC JLɜ9®?$- ΁>9;E @Lِk v/fC #&)n"iz!#j Mm c  U J 1/i 1/i] 1/iRIFjIFtIF+h|o Y X`@?hp\hp\CH6VCH6 By1&+^U0Ίi*3![Qx<%f? [h5,`9 u q[pA7+pA78 8Q s@ rU-̪ u[BUw2[p8N<&;/R+D+DwRDKN esѷݑ@KuZ\nY6\nt;_;LH;S;K !N~Mz" r򍶁t %h1Y/NzYt/NzYk瘔1 lT Lj c T~8P8_x^cs܊s܊s܊ N"x{Byx4{Byx., , \?Ix+͎P}e h*JJXT5@ʁov7\* bM Mvv}e # (9tiXpdB3o B3oL *t얍`f <9E .e#$. '@B>f $>f (Be}ߟ%4֫ i"DTS׻R  cs"0=Z-t-t -tj-tYBA N g"Z {4ab3 0+Fj'E4 O&XjsK^Lt2nIdI j("mŘf gDTEmN iX_d `o DQN \|N id2IMRg:\H= TX" TX" TX" TX"J״rYaTP*繙J: $ ji \FK=OyZ $:tܺ6G ${; \ &4 l-ڀt KK 0M k^֏ZY \4K6 r T.u;`$ i ]4 $ !AL61 !9 "KC@Ȱ#F+?#^''c !#.C$#o|$mG$;%VxF %'Heq 4'Heq ' (&Zt (&Zt+jѮ7Y+z,B -)cag!!-E .2à ._7 w .Fd /Pת/h<-?/h<-j/u 16/s24ET婋#4˯^ 4-k5-J1Z6=`:!687sVt\ 7x8 &8Sj8S i9 :NL;yn $;§ x =c0] =- $>H kj>2NrvA;Ơh A;ƠhAAOsށjB|ذ $PC e DQ2 j D՚3' E\q \E H3 E H3KED|d ID*C# ID*C#JNnKb aLSKN+|LSKN+| Mpә O6O6P!7R , P@l"0PIḺQ\ Qx nQ4U0QQ1Q Q Rf $Rf Rf R ]RSSLH )-?T$ ^ -Th,ETh,EUBvV #1?X7` X[ Y[)Z_hY?Z>2R e[O1N[*  [ؚ$OS[S g \7> \7> ^n b[ ^YЄΨ i^ )bb8= d!C'ee fdfEfgmWW8Yg`‚ g" gBeg hb hU]{3 mhB}jYjHNuGm&? n~op ݟCo Mo Mo Mo MRo MpO_O  qpYY r~>r~> ar˶kqtf\DVtJmR vH|7) vt|Uvt| vt0p vt0pYvt0pbvt0p vt0p vp8 ${Rirs|s7K |ϧ ô}6.L }mN }],}Cn5N.Vjŏh{6%8bd@/Lbd@/bd@/Ubd@/a~{ o| .:@n(ha= -]yGePj jQ,d@LI JxkYV ch6wh u+&vdY " vdY?-kH;yu%}YN㙱)w.ȩK>ɒ=v[.j` , i,$`PdYRi (tZBa$#V? EPzbJ pL!Kފ<{^am{^am!U] a`j]&_Dm"f$a(Oݦku OT%2,նC K* P$N#NL Ki? p:XQy iНY-! -!*) %*) *)ڧ QSB?Û j8.> a] gV] gVa`0XU*= i&7YvD'XMj  l1 V(j lBkx:dʡHIZ Ee{I j$ԝe>X$7 x sȖ QUZ>GUmݚ@Omݚ@{Jv t]Y(bd]<8p[pRBi5?ed w X;% Į$ 7[DUA| !rƣ Ǻy$p~E9Brq$',:˫X}޽4hrzkD͢=^h͢=^hK ԓ/b*ԓ/t%ԓ/ ԓ/>B1?҂5$v TL4 wϑ.Xtϑ.X]ƣo X7 =v F_xw k՗Z. 1 ׀A` ק0SCqV>4uJn?^ds .w?ڟw a 7M > u ۮ\|Uo2u_rԖ íoݮ^j޷Jm(T(Lү2lt lt P1J|qkRZWs ;u>lLxXH6 QD.m QD.m izQD.mjQD.m #8r!K#8r!Q ] ^Vˌ ˌ  II c )%38[)%38D  Kae s;4_r"Y_r"NFuPuZZ+3 =︽˂R︽˂︽˂j^5[*[* k\^ MH 1!z #FTJeDX-w~"&L6^gg UD>^gg E-m,v>E% $FF:;YG~H7?YHֹ3 IybDfJWaJWJWJՠ3t Kd I:K 3RLSgN a Mca>KMew#qNI OD\iB OD\iB OD\iB iOD\iB?P,4PA#}RӦ"SZM\O T45 Tw TQU*AUaiNEjV[VX=< Y-}a ^Z{"> \}^\" p7\sG2)\`~p [ ]iۇ5w]iۇ5C']iۇ5d]iۇ5^ \ a _\ &y`pJLnjL`iJ_ `݋ERaU ab#:})LbUv*X adV<'EdV<'E dV<'EeBCV~Ueӟieӟif] gֱd*?g(hͽǟQkf5kg0 l7a}{N}d|D}&ݬ~iC ~iC \~iC ~kfC , ~Ki#+/C n! ŹQŹC ŹwSz:wSz:P%PUj*Plj*Pl a04`ŭ,=b[ ,=bH^BO* O* i ;G9CԞ[kNk% 7I1 d_ ,l$I#R+J x瀷V ksM Z^ EnF"QdKYRnpJ uBSPbi ZR DjSDjaʔ& Zc ɨs~Es~E s~E fKkv gq gq_Y K\sp|rF{o`~vRmȷ/Cȷ/CU T =iqZ@.I Ab89Ab8/Ab8$X/) z:E ( 0RCɚ iw6U9U9U9U9KofظB `TNb`Mqsw$rw$r7ի~M Ba;'F|l[9 .k ( n  O7 ydɥ *GYhHmP A=< =< EEb3ȈƄGm "u/0 QFKѫ[L'"_.ʃͷ ˸y!n $g5` J\|. J\|.J\|.^Y=sc$t )+D0d]>&SiFkYLjL0bW"@ok OlFOl!Ti?%?=~tfWؖY9"ؘҍ ڀy[,8 ڮ{m1דmiׄ<ULP{ $ɇn8c)Xl4g,!GZ Ē*U$Edm ݍB $9GjcOW眖$' O7SsXQQ. ꤾ%3'9Nf_ u߃6ByeER-*pՑ $JP fn aK@]{3 JߣSJߣ3$7>R ]LBe(K> i z"ߦ%plS>%pl]U%pl 1j1:M3;2#_vվig{2[>E a X[ ^X[j/ʞtݳ<  `VX~(#!ϒc0!ϒc W}j ?r]L ?r (8؜ %O }  v 2 [Ʋ $ k!aZәә Vәj"Ie Isoo<>4 #~#} 8ہ* 8ہ*9|d9A 9A 9A :U^ :>8s:>8?=YaC5 => gv?>][)>Xm!D>Xm!>d' a@(6KA*<AI=l - AmQ4 jA,AP[6SBT $BoCx[Yr C+;IDSA c4EY{Efc EfcmE(JGF /© aF /© (<F /©,F /©| Go) ^G2u/=G2u/k$Hz.E= JMpi KIv L ;.ցLdhLd M-MQo0 mNO9rNt,txOJF PoN - PqFD Q2[;ncRV!bS: S,NT\߸- Toߌ:U mugn# Y}_ Y}_bZB7a [[v/  \ohUJv]t-^̊  _=Y_=_=`TաDd=C) fIVj1&Igiìj h#7 h䪆w$ipR{F?iJKiJjT5kԓ Vx ,l=B_i a1l=B_i|'lMdqmU/ڪ mذbmo0*h o8T^&Ko8T^&o;P͜VqǛ,trF 7Q r aGt8y v7=߲ ivYy]CxT=IRx*dI2y=K"|.& -|CZhܯ|CZhܯN|7 oK|IH؉}v8 }.@R + @H?KS?FL{' =,X .Q..| /WNGn GnGnL7 xS ՞Mn cτj@ τj@]|] \_&Kw?pO\tǠ^T * !E+auZlhN9R_Jk^1J w ;r3#ab Øx>&G †O. 2e rNh o'F+ afXw J2#YtQ.Y)nW#3 %I TNMwĚ ch)AZ wK Zu R-k~+ c8ؓyޚA #AdJq ]a ,]as?ܞDFZ;̚ ,X^: X^?&]M?dzGrm /_j G'ō #dK#dE&KU JR|o Ks??lKk;{) @X3]T@X3 @X3Z\QSe3CX$JjCX$J%4|.L %4|. %4|.ʦ TÛ[bS{J?}4xgm9fng9&,VKz)=RKh֨lKh֨lKh֨lJt*`]ۥ I9D-"UۨP"Uۨ H_G)J|R G 4{ @Lo_ E$# \ăNO/ĝ&ekA%=S a%Xb ~ eR2LͶiZ'ΰ=qB% B B&sĆ, E۸ǐBcC aҠ٪E ,/Ҡ٪E $(Ҡ٪EҠ٪E9ҷ|b<Cְ9 +U)v T3vŷ n 8p^t؜Nxs՗t$vdU$ڂIG |_AۣL|#ܓ :$)wʁ DUѹA(0Q 6 jA) ⶪoKⶪoiC)>F.6 g yj: ,PuY ,ei,"R >U/1F UtD#zDŽǪR#xB'C c[aLHL- LHL-մSXޮl3c%= $ y]tǎYsS &f-sw•Y{r}xb㘞v$#:\D\&pNMSM$#rv?ʬ)ʬ) %%t OF $\ v [ 8j \kU \kU  U e *c!k 5C,v)7,v),v)K,v)H,v),v)L(]U%!2(s' ҆XS elT*Sž7\ 4Ä6x4Ä6xAq~Q$81 \g&,9Asm2,(f!мY!) !Uڜ !Uڜ !=? $'/+D!({Ԁ,s(^_d)j+ )j+ ()j+ )j+ i)j+j)j+ ,* c i*km.$;LCs.2% #.2% { /rV /)[l 2pj3ΥwR5:3H t6 S7Țb*7זBb9sP9:h :#;ꉃ <2}ٽ =r@W' $A[CѽbCEU Ff"-FQwYjG2 SHIUH /}|H#܁ H5# I,D^I.& I.&?I.& I%yJ wpJiYKSK&MZA:RNe>RWNt@]PcPc Qsmd?S lI Sm~ T<T}!VЖVK9%ъU V^9S -X?&>{Z8LvZP5{[˗ s[Ũ,[Ũ,Z [Ũ,[Ũ,a\pPs\pPJ\pP i\pP ]8]yi6} ,]  ] S ^C|TZ^:#uU^Ui |_AYr`гt`EiR]O a1A (a1AaXI aYxL bAbMؼcbMؼcdobNe(m"?g1\4: +gTK?` hh p]jQ=ks; dkF6@ ,l[0xRl[0xlT[ lT[Ql2LD<mv00mv00 m}aTm}S n5 oh r2ih jr87؂`r87؂` r87؂`K rVr`e9vt}p9\dt}p9\uV۸vh< xdixaqC3yI%>0t'y7 ZyIN zYa zgiz }Ht|yP@?0j?>4 F? F?sF?hF?| ֶ dUځځK{b $Z jr.xeP1˰ i 4_ĺ3v4f)|Ygv2ϐ j }~DC3] I^դDC`ᖣvAA&,1 9Itן n40X4 7xxCsG $R Pbrvr:rYh# }̈ : ,#UQO! -TP"TPðGjo|&o>EBnXϹXϹv:Lh]! _O nz #3` h']RC m+o -D = rB}Td\ +d\ }IB 5iyS¡ۥ΀R;Z; r?4O|z.xpD ňxG dž?.]Z_GYǴgZnȬ 6h҉  ҉ ?h8Vs᱐,7 .@Qw[Qw[8Qw[ '{? '{j%a! %a! %a!?iiSЍ_~Q6T*Շ{6'сJ>ԙg|KctW4J-SJ-Z ! z: ;nfIU֒:nA) a){@?{@ a{@j e # \<)R ܱ;Aj5j ˑBl!R jS6y2SP^$a.S1> d.B ";#QUIhlxu~s : VDEi<R  c|^ [H,Ү<5h NA sҔ}H:2EE 7dhR[Hq#F-b$ *Db #wfg? 50 TjD\=zV&~gr~grɣdJ ɣdJ.)!{s {C0}~ [ܐ5BNgZvl?Q  c%ˏ!/CS Ta ۰ \ ۰ me2mTE}]W$oR *VdDTz)["Mᮘ ,"Mᮘ P7:!O]B0\ c 3D+  3D+R_4 ? _4 l_4 Eo ԳRōC[ m0j YY Y a 8NC>  T|# 5l =0 $ =0  yϠ(-4 a?! e>̐+D0 >̐+D0>̐+D0 >̐+D0 m>γn1a?; s?\6?Wڥ?WڥA/U斛 A?hm B0a Bֹ Cu\ ,C)LHwٗ5Hwٗ5Hwٗ5 I3yYIX#kK2J tK2J :L|"&l M=z3O2KM=z3O2MOy)oP3' )Q˗Q vQ ulRZRStO7DU4# axU4#dU4# U4# UYRV')^VVon[V ʛ 1WS?3W%D|YU'KZ-8S?[,TC^jG?^-@ s_,_,U`u!Q?aǙ=a}{. b b6\HjS 2b;x$_b_g fc(xDd0NdĶ iepZfUt\PQ f9L ,h1 މYh1 މhjuðdjYRRjYR:kQM ^kԥ1^ lq lsr slFmM mu!,o^W6Y #obl$q[oԝ $#q[oԝ aqq q5r|6ELsD4`<,sD4`<,?svs*svsvy,wC#ZwC#KxBnuy.Z .z=KFC{d:ߗ i<*%2UGxDž * r y . 6>'"SY͐( ͐( CMvȵQ %y ߊ N s թ3c,?fT2>[l2\+j+P c_/Dx? $/]"$/ U_ <Ҧ5 ^ ?m( E&TstW%RtW%tW%0T !0Tk0Tt2jj C \!C \=F% q=WV~dM f -. #x. #-?F/ܓCVj/G e@l.P&Z^? ^Pqk%N=~x1 / M/ Me*k K U%j7=׺Ba)7=׺BS6`?pz5:-ƞkʸƣ7 ak԰ 'b ː) wM \˱=nfttzK #5S L \CΌ͎+Ї`GFʤظp2A4 7z)oSM}4O AyJC \Dt"D|kk^ O ؖQy1.R84P=C\^2 w-?#wLΓϰ XFW?VDZfP뭅[Z6t$sV!#| "| %qu^7  ЇAEzq+={ L 餹I{ y úKL \졒:_;@f)xƧ #-~*Pj-~*P $ "x8's ?奵8 j aXYV MyNU׏ bOR@ #8#-c,, eT eT 1rqCH -[;Bjj$ CGh]Es L cWt[@1{f \fu S L m 0(w e5՝-, Mi K c5DX ~lh ?t n }Pۀj C! Cd >_uGT[/3Xh_݂h_݂ h_݂K h_݂ʻ.U<Ft4 F  ˠP/?5- Vi] lC2H C2H]  l; šš&pLlF8M'ws\K=)?-xkz|zʿK{D -~q^l,qm 2Fj3NIT atbR{UA8 y;> `YAL">eG #Ci $Qi1Q $⋃S$3t$3t$=w:%W%W&&F'k  '\ 6 *('ˌq)P)B.9*:m * 7 +Nl` +Nl`D-i ?.@Mk.fS5}Y.fS5}/[LTE /i}S /i}1ŧ`25jN2L4w  2ee5L2}fPNf 2SY3kL?3 :4S T7i~ 7&?=S 8-# g 8jF 8Hԝ:@@Z V4<\D? EH†f?@fRBDEkC]DY'7 EoEoDEjbgcFل9 Fb>/GZR.ONlH/tPHF 'Iz)jJ/G5MJR2JR2DJr K4 @t $OMϞ>NКceNКce Pf!ˮ` ST՛Ob ,TUFVT.] + U1vGD UE{ U׷ݤ5- V%RM V%RM e WWĝIWWĝILX>-*QDLX>-*QD-X>-*QDXaJ XEϤYPh[['SA^\'МM\Ć7\Y ]ň;]ň^]q_ 3I_] _]`Br.Fs `g=(a {` cN펏udcofߙK"hQd{i "?Cj.r j.r m*q?n-xKo^׳;$o^׳;$ooCpz527Y q5 . ,r rS1Sta\+kt܅pר<uT| v/ Rzb,b ] zr{bFbz@gM c|"yǝ9}U}v}U}vf $ f i f ad~J[9u|uk g,ܩF =]L IBzj;䞺=R ?I +1RhRhS։ushushushL L KbjH.H.H. H.@sF֤C f ~ 5n: c׺u)ϝ؝?H"j.1kB6 $lb%Լ@QT j\h3 .^#c+[QxUYX +@ƟdSyu^M~r: . ! wV 5IS3t ; |!_ Ό''j0<5%i0hn`hnRR?Y ނ  U:EoqjSwjajj>inz c SQW[>jm[!kw Zb? v;$4C6W jƭ;G6M̋I *#+i/1i/1i/1hMmz  ,[ #i0;I -`5B \jT)˓Bsg3@1,Q6@1,@1,Y@1,F/ ]dEmM%3?3zPUl ʉR<j-E ,15V K2L4 z ,# ,# ndV  wg$R,4 ,_? i.rZUk*2i 41,q; b eUisl|pݩY)@)@t'0D _A pI1#SN#xa𢡊$f| %G$V&xN&xK(mL(mL ()kd'a)% #*}|4*FA*)_ -$0-H-HQ.[g(b.[g(/zU~KI /م/j 2W3.j6n 5ѭfs 5ѭf 60, c7MEJ1W8oQ :3_?:9$ 9 :9$ 9 $=twR=Rs?~FdC ?~Fd AkN CZ$ - Ew0CG45wZt GX;. HocH>So cHP (H)g] I3 2J4_T$ J:JxWJ K v4A $K3\Y#Kr]->K aMX8֨L MuX۱MwJN?0M 3C aP٩QsK! RSL!Rke"T}Tu! Tu!U$<Vw) WNB aX"ޱ[%#Q[xI \t4\!]]d \]ʶx^Unݎ ,^Unݎj^b:1\ _{n `$a4Q)[b$ofcF♘tcF♘cF♘cp " ,cp "cO%VQkfuTB7f#PY? gHog%=Omh.vij Bc iޱB| m7ˍ1{ oj}Q\Zph>qps;|`# ts)"=u&HE=u&HE=u4ZxzvPuX vCM w)!%w)!$wRL@Lwz xy> x9)0(&xitxQdyR%& yS$Kz6|\ zg\w[zlj*zՌn S{Cv{Sv Z|56S||ڃ} ,|w/# }2 }){vJf‚qm' \‚qm'‚qm'‚qm' ‚n.:„CU„c …No:…No \…No†}.60 †k& †k&Q‡4MTh! ˆ,U1f‰ ](‰ ]‰ ]RŠ!N3ߤŠ_JbT Š_JbQ Š_Jb‹ 7T Œ%*RK|wK K|w6bŽ c -]ᜪw ‘h?z‘?0G’JDV ’n֟’ 6’ 6’NQ^ i’NQ^ \“ ”:| #•rcr4 – F–)k%—w6~1—p%˜R p ™SH š 4]?vš 4] išH613›N4›NZ›N›Nœ88S ,ež?  Ÿ jM+Ÿ jM FqE1 ¡}u |¢xH ¢A<,}?£aN5; £FzI#t¤v2d¥.k]¥F c§#Kf=§#Kf§#Kf§?*h #§ ©~ i«F~«/v S¬^t¬_  ®N®- ¯8B$°#P"²CA[²M4´E5:´SLµµp!\ $¶'G·T'? ·y=I ·?J ¸OܕW; ¸oz熡H¸ܪ؀.¸s_ # ¸i` ¹;N ¹p &zºRdºRd»1BM ¼^X½N½*½;c¾@s ¾@ ¾k6R¿ɠ#*BΩ To?.b7'~pt;¿6'¿6# d9{Ħ.t $=9@oIk go: j&u <.U T &=Ft-_TK;f p̅ObbY s 3SMx@SSSSnm`& ѣUT?0݃RDV! #=ԕXZ S=.  n+>PgrВs% ^>% k hR &yզ c`?1]#<5 l e8iK=agk C'ОY~qȵf m-EH  csװn Ф{ Ф{ 聸 *^= Cp^Qipv2a T IEd jVt 2V  6b/P4 ]'oRW ]'oR ]'oR MM j i ~Ht )̾'s :< >z :< >{ %F %,$3? ak 5*!M scH8dk/H8dbF=c gU?g=, t&k}Y 77Zvqm o8\ jC _EטlO hs!MtW!X'h"ok5#4'# %vN~ %J#Ÿ1&NV '.)'Nt )'Ns):zFq6 ,>[$3>9 >+M4HNB3Sr ,BRvmBbƻܨ&Bbƻܨ BbƻܨBbƻܨDآJ|u]DآJ|u]D Em9d6 (E}XV F*G;]Z Gw6w  I`ޱNI`ޱRJɮ˙JiL)M\== Pn PL.PL. QQ$S /L +S6(>K5STdT6 T^H T^HU]!:VBTQtX+] m X\AP-,Yǥy ,YǥyYǥyY jZ:cap a0Z:cap \%=/ \YeR ]%~If ^$wd_gФZ5h hY i6# 'i<7Bj%Q} j3%>ejn'kY7]^ k_knl9 l=m:Om:OLnaDnn~ߜ n쭙so:2t ,ozPSozPSp[vqcsvg e qcsvgq9qr:\Z6&ris~Pb0t?Du&+u 8 [ vB(RvJ8Hv wH xuLxuL Ry%# z%@[4+ z5c Vz5c{)ּS{)ּ {)ּLV{)ּ]{)ּ {ǖj|-aU~Է}8?À$(/ \ Â7HZ.ZÂ7HZ.SÂPF/PÅBޮ! ÅlOc;CÅd-R Ç}e%KXSÈX]sÈX] ÉAɭ|o Ê{eÊ{eÊ{eÊ{eÊ{eËEr$\ Ì;zh ÌwàhÎ~ӚÏ,yj Ï]Ðfh>V i ÒmÓ n Ó4} (Ó'װÓy Ô!YZÔ@" Ô)R ZÕ_Õ};i,dÕ};i,ÖB5&ÖIuRÖ5,\kRØ|,56 ØǷJÙW5z'|ÙW5z'|P ÙЫz?fÚ`ﶨ?Ú`ﶨ Ú`ﶨ ÛTr[. Ü@d_b ßȌàV\Gwà$sá ááâ? "â4 +a â9= âD?å)CI,]KåG|`'K åsҜ̠ åwj æ)ۑ ,æ)ۑ ç$.]ê{( #*ë|#ë=KZ ë=KZ ëfQp/ ì(1RíO`? íԮ~˨î b0Ґ[ï]2ïFڿ3ïFڿ \ïFڿ gïS\K$ïq{YðF8ez ñzڍñʶzómr` ó# ôq |#õ/Qp + õ/QpQõ'i .ö0iZsöF@%0öF@%0öfק-bY öfק-bö.E ö.E L÷$v&\ ø2<KýWLÿ| (ÿbOCt ÿk ÿrhɤ?8b@ U]f1-Sfڂ ¤"yf e* kp kptŵvA& (V}p hǻ3^!5G*_ɛ\:9t9:xj~+`9?˿^ϙ(\$] ' }l j@)J;`쌕 8̓6hB^iYvtLK 3k чaчa EK Ӆ?'暪 ~qGŐ|Յ<'  ۆN1D ۆN1 ۆN1KO%(>O%(>،18:|n ݻ>w"=W7R/ Ɏ GɎCx! ӡ&c3?&c3 .?]wN% 3q,tᕹ ?wPڀYa0W *K7Yn}UO# U?H# U 1Su# 띾'$Ovb& Tvk l AQo{.2Ξ;ߗq@RN׀ \HtVVeV]#VdT+o ,dT+o dT+o gX3,Ni,;?ε%ƞl/ (ƞl/s %⠡*?0 c7(YH{9= 9=lIZ $  !?Rt \ʬ4 ,jjD/ K=UUA1ϒ ~Mz FXg]edѓ.Ŧ͟H1t78] V-h.CD "%[` "%[a" f| K   &fDĔ  Uo&s 36) iY  yO.*yO.* I ?Mc2\c2\] 5Md.>+ 15.i\"ԍ ~Et⳹ $#>Fx#;t Ѽ +t +ٜaQ .;McCy1ϪBQakc4W)F] :s0.*5)_%*Z %*Z(z](zj,Zȴ,\8$.&Ⱥ &/(C/-eD 2J=ڤK2J=ڤ4jM5DR 5DR 6-60Xl? 60Xl? 8Jg a8 BT\ 8\eY *9Z9ZP; Y b=C =]a>1I0?gs?8XN?8Xk?&~?&~ @F&  @փi<^A[fenUA V  A+pD[D(ŅTI|5J3 ]K )m KnP<KnPL]F8MeA@LMgMU' MdsNdBH OdjVJPq-E=Pq-E= QBU#QKf 5ZQ<}G lRJyRJyT^8 $V}$ eWsTWlB6XnbX~0>YseYst8mh?Z62?[Q\_?t_c&b `G^ nĩG}A#Ī5tĬ9.\: ĭ" \įS+T3 įS+T3?įS+T3jįxKj įݦ짌 ıʡı-w/ IJ0 %Bp#IJ0 %Bp IJ0 %Bp IJ$ij"]}g ijyB(Q"ijyB( ijFv7> ij"Ĵ26tĵ^RkvĶ69XdķV _ķw{ķwķF ĸ̻PĹ~ؕ5N$ĺ4%BĺW2J4ĺ5 Ļ]C/Ļ$3 Ļo jĽ@Ş6Ľ-勾*c ľ_61 Ŀ-fJ 5at\:e m5/ nsKsKhĶ7} ciL3rfUƋ%j) aZ-*a %|6f M\O G ̫YG 0QSj"j)c %L ,tc %L '߅ &ϒ>*y [@o ѸݞNك[R%hS|!. /~%YyhU?Yԋ]eh ~H#7C Tl #أ3 kok.sTogHbۭ5sAx:4 mx*t8ތ5Mch/[-ZȏZS u *lA=#=#Q =#fKٿSKٿ ocǥ+j h[#5 j[0L,R15Pb\K6X}=G#$Pj :ʫTVK C. m:/PlY !/"@ a1[wb(1[wb1` 3xk4 ,5•wT6_AH 6_AH7:$cj8 $80׼bNa%86ɻk86ɻt9_T:u ;"" <I<s?>$ ? >; ?PY @R2Ax eSC+C+ D6KK\D6KK\D6KK\DyE}<j E&1ljFYwI'&D I'&JtU K,8AX K,8AXjK0鬠Mކ Mކ N8p NOOBP cO~~Y\OA栝dPΎrSQ*)#VY0 [5 #6[I3K[I3R[I3Q_7F _ѯt_ܺo `U-a彰5sc! ca݄d+d؏eoete6T e6T e[ܓCewy ei,f4 -g  \gƶjyt? l6N(m m⇴bk ne  ne nˊp1KppW9p̯2: #qת8Crh!i9%)ropP] ]ta t+oqu[iRvkKd vOF2O vm iwגGxXxwy/M =|[.D|gVVٓ }DFY}ewvsJ"}k1) ~] ˯~A//&]+~A//&~Щ]"˘jŁm Xe0Łm Xe%ł d=ń=!Ň KQŇA ň^&ň>SeqDň>Seq 'Ŋ>ӦKŊVlYK Ō3'ō 09ōr $ŏL> -Ő־v[Ő>T+Ő>[&Ŕr|"ŕlL3^?ŕRŖnk4ŗEQ (ŗ`Ex ŗѧwDŘhl3{E ř!+A < sŚe8V"Z ,śVE& śVE&ŜQ Ԍ aŝnaYŞ ,Š\h?š/6ŢD(Y Ţ0d<s Ţh! ţoF[ţoF[)Ť ]~|Ť }$ŤBtjDť,Oph Ŧsŧ)h ^ŧaGD4ŧUY Ũo9Ũ1< Ũg Ũ}( R*ũ¾ <ūu-Y3ūu-Y ūQJ cūBV ūBūěip ūěip {Ŭׁhlŭϲ)  ŭLd=ŭLd=Ů=^FŮ=^F ůϋ kŰF| ŰF|]Ųth  Ųz1!RųG~ќų\~sŴyHH Ŵ(ʔqŴěů_ Ŷ[DN?ŶbFż ŷG ŷv/Rŷ8Ÿw5:zŸhl?Ÿhl Ÿhl ŹLN3 ź=$-{_ *Ž 1P ž35,?jJ:›D;x2: x2:tÂ8QaJ삍 aJ삍 ŀU!w`Y) <?ʪ=ct  ̠Fwj̠Fw ;-<<4rSI&pj! Jҡ]8 0HQӮˁE"}~0( i tdgչ7R YE3dz׵A+ɛm[m [=Ǩj5 j&USv j&USv ^^FyI `H+nZnZnZdm8 !lJZt? I~G ^s.ѹŌ.ѹŌ.:.: 0S4 eS4 ^G"y# bkb R Q͆z Hb з0L v/6մ?b{:]()R n8Ky< -l¯R jح $bٕs L7YKSL7Y L7YQL7YwZU wZUj8l8lD=,h 85ʈ n$3w_| #LuQLuLuLuRf` eieq rTxL ˦9j5˿Z I=24~N aL=R ϐ j? j?Y_tdj;BIDn_ :ҕb ,ilD e.ilD$ilDXilDY OA -2 tRɪrS #fx ?d\$d\ 9KtTP{+[W aky?% RGt7wa\&^8$|.<HU Ꮻ Ꮻ"`C #굸 |$q% #%r3+ &E3=4Y' ^Ѯa'#'j'Q݊ )3*h lS-/e(-8o c.o0 /?|t.yj/ { ~2Q/@ s 0.N3zD2 3s 4+8 4T)??4 6bf6b8]DZ:8l'ф 8xqA J 9o;UCŹ;=iĐ Ov[^)v?v? ?; BaPBaPC[N,!;EplmEEoZFVq84 GLʑ)dGLʑ)G H_2 J ?OuJ ?O&J ?O K;7ް2 K5:KjN] (N,9?Qqы $ QL8 i&R{XHS~5+TCT/@n V \V sV+|O XlcЪ X  ]j ~,]ȑ _ϣ{6_5a!DbukOj b  b |c=pI Ɲ_oƟspoQ (Ɵ1R ƟGS Ɵ  ơdm Ƣ6; Ƣ;1e Ƥ*= Ƥx ƥ8ZDNƦ $Ʀ W<Ʀۉ?ƧԖi>ƨ{hR $ ƨ{hR ƨ{hR ƨ{hR (ƩGzYƩ٢Wƫ[֌ ƬLbƭr \ƭ?e ƭ?e Rƭ?e ƭ: ekƯ*F ƱNӍ7ƱNӍ7ƱNӍ7ƱNӍ7QƲ}NGƲs8B Ƴ[b&" $ Ƴy NwƳ(SƵɚm$(ƶ>wsƶ>w ƶ>w \ƶf$Ƹ:s ƹmƹmRƽ&`ǞZƽ*Z_w ,ƽ*Z_wjƿQ]qƿEpo5P \aZ5s k(A .\oK RR? /  |x k Ê<=\ îJ׿`a #ia c>ĻWxrGś G eũd, +'yZϛ.Կop iX#pp7zn c哗C#<wRxZ RO[jO[O[?` {y\[ˮr@ˮr@Q͓̿#' :[ HBDD 8+iG% vh lm W_W_ ӒEV ӘP{ׇpYAtB 6ͶԎ-;:fȲg -։Y ։Yv׈ 1 ׳ T (ئ4!ئ4; D [D [ڌk@P ڦ5=HLGeMk,T<SAV[C-|i` ˌyˌyZvu=Ie(p5= a6\ k X b9 RKSj|˼?!UV7l? HF xHF x4C# LP LP LPQ LP]ciciR?DHQled t?pLE ( 2a`J ?[J J 9 5a zK eQ(H i(JǙBP9  ^F:d (/s$+ 0{!t)2ZE&3AE&3UE&3LhfX* hfX*L|"2' |"2'S vֻھqYe[95-dWrH@CKD|kA#;JYd. {ϵkt 3̏3̏! C  !cGN+"yAd_J#b_^[#j? #k-J #ѡp. 3 $"$mz#L $mz#% -&ACB $ '8 e(D󨔿H)R7t)(g5S *}5, *3r3Z 3h\4έzC4s 6F<Uqg =?eޮ@XC @C % A NA NL A.1׀ZBUACLGmJ¶kGχ HG7jI+m4?JeZ'nj{=>a nj{=>dnj{=>Lnj{=>Snj{=>nj{=>nj{=>ǍvAƄǎQtLXǎQtS4ǎQtǏKytǐ7Hjǐϝ  ǐPkǑ{I2Zǔ ;IǕN Ǖ;" c Ǖ ǖz[UWǗo}Z n ǗG# eǗŹǘ)8ǙR(#ǝQ`![GDǞv{$TsǞv{$TsǞv{$TsSǞv{$TsǞv{$TsǞv{$TsQǟ_TXM$d&ǟ^:t ǡi gǢ45 ǣ$'j sǣ5>[Ǥ}NKǥBOǦ$lTSQgRǧ%gǨ &$ǨQ`5 nǨڧm"ǪԕJ_ǫuY d\Ǯ k'JǮ8L!AǶ?ln ǷG*<]S Ǹa i+ǸDҔvǹlqǺSih ǻ; YDǻ; YǼ8.L Ǽ8.L Ǽ8.L Ǽ8.LtǼ8.LǼ8.L Ǽ? Ǿi PwLB!8 1ֽR sTd/o} tQz ' ƢUR' ƢUq !F'H('[!',5Sg9'=$g9'=υLOja3~ a x4i f Z K(yH]/Rs6[*J4kF> yL6KQ`$9GɢlҽO eQj{5d%w "#1 ’>i.RrW:Y:y=& gb6; b6;VUSS ;j (XOK9v I .G: u Mf}  D9f# ]6[ ڴ n-Re8 n-Re8n-Re8V= q U< $4T?TI Sf/H, j{]Lk wUʵS^,I[2wDﵨibge( θ(%u Z H#/ 4:սJ4:սJj y 4-1R4;^X,w/͵  VcUGa !nL6S! u"(n #^9{B $BWI%xR &xWXoe *ٱ e +q.hŏ $,t%a .@L.:2n]2|H76Q13 7  8kP 9.=(&t =Pa@=Pa@>nW!>nW!>hzQ? ȁNz ?>u6M@/pB1UOB7.RCj|XC1F1F1VHe HΦ| !HΦ|vI lI; #J#j~ L:_M<2qp (M\jl O` XOf0b;6( PCmZ|Qva47R*@RRueVz Vz . XF*O.[YkRZ  Z`ٵZ`ٵZ`ٵZ4 ='Z [?6\{5"9\ '\78?^|v^/"k_jT-`.$s`;a< U a#k bj& Bbj& Bbu+ݲ d<(h #eyqvsi2zl i2zl9iyV+> lvۈ+lvۈ+lvۈ+mȡ2n-noieo]< o3jHs o3jH (p졐>qTEdus JjtKu=[4:s1v@nyvIwxX Q:w%nz xVە * yBZ9C8 ,yBZ9C8yN]RzHRzö3J{ r ${Pާ {{N4|4s ȁ ~3ȁ+ ݕȁ+ ݕȂ݅\ӝȂ݅\ӝȂѝTկȄBׇ5 ȄQ ȆVR#ȇpJJ ȇpJJ? ȈTȈȜ+T"Nȉ SGkȉ"ȋ@QȌs:pȎx#3ȏzBoC ȏzBoCRȏni Ȑ%D!sȐ(n$\ oȑgYZȒ]OBڴYȒE ȓ? ȓ? Ȕs"ȕJKȪJȖC[ȗfw; ȗ"# ȗ u ^ș-Ț^@} ț E9j + ț)mԂțW(a~ ȜF*aHȜ$vȜ6ȝ"M &ȞƚdsȠ ݰyȠIhȠIȡICx [ȡvN.i Ȣx(?ȢqȢ5Q4X sFȢ5Q4Xj Ȣ5Q4X2ȣ@ 9ȣ@jȤ2ljȤ2lȤ2lȥR@Ȧ)vȧle4} $ȧ¨yCDȨ w[ %ȨݩȨə7}tȩH6ȩtJ Ȫ s ȫY՝$ȫY՝$QȬQT^ ,ȬQT^ Ȯа} ȯ[80ȰjZ]ȲVxYȳ-ȳ-ȴ/2"(ȵ|.lsȵ|.lȵz}ȵMTȷ/  ȸ-gʟbȸ -ȸLȸLȸq:ȹ+ʆhȹ.\ȹmE] Ⱥl:Z4) ȺѬ45kȺۤ5ȻE Ȼv<Ȼe*XS Ȼe*XKȽ[U ȿe7 z:n– 9EǶe #@#ro= Da4Gڿ]ɟCoE+ $ߡɘ<4R˽3a ~o̰hN; Δ6-WΩ . C tдk#\N/S9$ 3L$ 3 ӓt s_qT wyԯ5 W7NC r&jc>aQY Zt k<V؈v0LnS $9{c+jۑ ͍[ۻۿz\^ܝq a ޅl{ .êB, bى bى1ޔjN s-OSKҭQP]u75HjO ߛa{=Dc [J(;M|y%K>[MZTMZT#MZTx GDL8 =!vvO ,!vvO;Ʉq[7c;&2kjٖU; Ӯ@pV&Sd# drӢ0[?s?).s|R \!-` {NdZ $,dZj+t ) bQ? xHaxHXUi짳2L !]R b awNb b  ߁/_t 7hb & > 5{|] 5{| q \ =L݀  )o WSC Q WSC|'' YNє>_)tZz-" " I;V?[~ 0b0b2 cW2jW2 Uh1 O򳠴BLwu?wunB?b!ȴP !ȴP ,!ȴP %se'% Y %*?O&d '2*'jfrR)l'XAd)l'XA*r'w*?F{j*X."8/*sFxL-a}w_ H-_. .;*; /}8 /]N0rgM0`,:0g 0g 1F#Η?2E2z:A>2z:A>3s)*5ub:d6,#SR6>Lр j6m `778Cց#|9?;*~AV;i|NE;wY< G  fa5IG (f z'g3xkhnAlobsIpl;rsso Xs\6Art9ړ$3Yt= Hvu#Su#Su#SS v7h yM z0;9 }asz 8z ${'):f {N.Z }@4` }ے>8Knh \ɁReN,ɁReN,ɁtBfuɁtBfuD]ɁtBfuRɁtBfu ɁtBfu ɂ{EɃ;o61Ƀ;o6 Ɇ1OL\Ɇ1O]Ɇ1OZɉ^ kQ ɉ^ kfɉ^ kCɋv3b1tɋv3b1jɌ5NO Ɏ2S_ 5ɐ|zɐA"_d ɑ? ɑIH=ɒ|+5|S ɒ|+5|LɔH'.HɔH'. ( ɖ,0RɖAjj|ɘ "ɘBrO$əS ɚu \YIZ,ɚu \YIZɛ ɛw+ vɜn u ɜu}'Aɞ2ojj5ɞ?n lɟ mĚtCɟQN ɠ7sB4%ɠ<—Uɠ<—ɡ5&  ɡWMɡH#{*ɡ5ɢ=}Aꑘɣ>@ɣ" ɣl0sɥiwi. $ɥY eɦ15iPɧ.ɨXnJɪw1I^ɪ9ZNs ,ɪ%`wSvɫŲɬ;1 -ɬë.LɮDIFɮ}"ɯvU4 ,ɯ mɰA`GɱZpRG,ɱj O0 (ɲ'j ɳ޴Qɸ O?k m ɺm56wbɺm56wɽϥV7ɽ˼ɽIs*ɽIs* ,ɽIs* ɾsτHɿE;9ɿɿmŰQ'ɿmŰ ɿ97k 3S_5R ƒgW?4 ݲƖYL!RWsYL!RWYL!RWǖ+5r Q@?$#RB%/UΜr *1k5C=R=Ҋ/Ҋ/jҊ/NҊ/_Ҋ/d'S'RTY3fRt*$@ ,{I bJwt֍z 1tfW فRJ#Hň[YLGzbG^RG^RTirȥBn? S EJ Rͩ=dUO2=dUO rD*@A #{ږj7V]d -l&]@ 䂜ʀRSmRo U 蠿]蠿U/ Bl ( BlsP ᝂ ,2z5%?RYe  (  3Džk^f (X (X 1^41^_?T"ERDF b[D$~E $$OY9ʒ6@<Bl0Bl03 z? d ;WP+|\ i K  t$$PsƬED,tp $)a9ioW u=.m6"ȗ cR&"cR&cR&QcR&R7&0 D ,/r\  ZqVr"K qtqsb!)N-b!)N aѥ9~cX k)> jJ%* ^Pe)o|   ;gt_q7j@! <  vWBD¡P E  k  J Y $ Fq 7JJat#p14 #p14Y_#p14b"[c#*G/$P/~%/Z $% KX%7 J%=uH=x%PL?&qpl& MN 'Qfl#'Ưe1 j'}t( ( (6Y*F +LN ð,, \.vD 0T8' 1mO2 a2q6Pj 2q6P{33;#48% 5< \9yFO =ǬW\=+T*`=뵣(=뵣P=뵣=KbpE 4=KbpE  > ?-A!>8SP>S8/v0?PS. ?^D ?yS'I!?Zn @];_$@];_@ҹ e@:tęzAA< AZHA,U*CuB/ڙ a D{ ! E*SDFc+,Xo F#| Gv&XHgh IMB[ J2nJ֓KT 3SKT 3 KT 3[KlI3,'LF|ٳ&tLl%VLl%L{ĩY*M>|*QIM>|*QINs\NS|?NH퀽k Oa>P/vPJrn?QL [R=ƏD(RCn2% RP V;dZV匚VS.[`VS.[W2Ʒ{kX0_CYs][[0s[[0s[C/ea S ^n%'vF^W(I _78 $a q@,, a.LL aOlcke ,c-qd d*5)|dˋj'dˋ dˋeJ^@jewCJ8eHNf y㙌 | f=05?fTaN EgX`W gF'gbO_h 3I4vi~nrZj OR j6[ Zlo[mfyn m؛% mY n 6nyp>]no>K (Eno>K (o〉TMo〉Tp6a9 p6a9pdڟ pgDrd4G rd4G tY\-D n t$̶bt /bYw~Rj\ xaqbys{Z"> ywٖbz* ({{o{'{kJy?}|qSp}|q}|qL }kb`= ~>ĵ> ~RsN/C ʀ ]MʂE/ʂE/Rʃ{5_ ʇOc* ʉ:] ʊNWYʊJ׀ʋK^2 ʎ? ʎt;Vʒ*9v;$ʗboNʗiq7~Qʘ#b0M ʘPh@&ʙZa sʙW޿;ʙX[ XʝN; ,ʝiQeISʝL $ʝL ʝLʝL ʝL ʞK lʟB%dʟjf8<sʟG[ ʟl(ʠ[ʠ[ʡ/}ʢo@8ʢmʢ ʣ"kvC aʣ"kvCʥ{W9 ʥʁ9ʨ"icʨHS5ʪFZ ʪkY!Q ʭgJQ ʭuϽ&R)ʮQ&V ʮɕWI"ʮɕWIʯ}Aʰ@ʱ.jʱw%ʱw% ( ʴF<& ʴF<& LʵbtO@uʷh ʸ>C5jʸ>C5jʸ>C5j&ʹyZVV?ʺR^ ʼ}k*~ Tʽ^A ʽ^A $ ʽ?)Q ʾnq4ʾnq/ʾ9n gʿ8(2aN'] ']|@s) ,>DBAd-rI[I| ƾπLyFEEiz$sEiz$ Qef ˫`_ 5@cˑu̡̹/lкN b RFO/ufY ѺJPY~f Y~fYY}QiN e*P0mM*P0mM *P0mM?հp[ճok;s b̚^5G[  |R۩"9NP:>]9̼_yR7 gyR7 yR7 9? A"]HSwiby z_z_K-DoPLoPoPEo(& +F? ,+F? +F?j0^(Ps ԚNr  R SfYuNfYu 1}!5IiM L {  h-D Պ&^߿#$Ns _s _Ds _d 0 N # qEJ$!>t4s, Evn[nӶbyCn{ _ +n? :.[&g %ǶS&7wv(t %$גQ:4 |&: ?yV# gPqjgPqh^>r 3}| }| i}| }|?  2euKQ*4TkŠ# )w@D vRP UGW "1sg( "1sg 4嵺 [N  z j '䱡 ^ؠ[ ^ؠ ^ؠa ^ؠ ё^Ȗ 9%VҏAR ߟ֊ 7>D }P arR rRrR/bt&bY"bbsqZAKqZALO 铩+ 䈛kQTM[K4[.Qko" _ Ԏ*x ho' ,gف31: -y -y ,5s? Ssm!i' f'͵ 4e9 XfP XfPYfvR Uj 4cnb"k "@"I7 "G, )R%ڕeOa %ڕeO '8Βa 'Jv~z 'bb\(%?)}"C)Q -N~Es.7#].ҟh;31fQ04@EtD c4R 涧b4qq[ 5Id s 5Id5;L| 6;C 66m!@ 6: D9R؄ԓ1:ůJ:ůJ8"n ?Y$^?ל@[g @[gCe[ CaM4sG0,dXkGm]GJ\[ Hbp H;i $IYt<&7I]X&I}AI-JH1%US JVJy>QKED1s L\ O<*7==O<*7 % O<*7O_*O3YpEO QP8PO1zNQ<8|R9n9"S$ UgR U(DV׮Q WdILQ Wsz+XPMMXpZ+ ZWb3=&'Ze c] P #]E* +](,xf |]0~H'S^e?Vmragwԕ bSfhR2d Le  fĿy gcQ}gX) gt^gNgt^ggdjhQjLjtcRk ,0sk ,0sk ,0sKk&-W k&-W kT doWl` %l|;s m{>n_$\nsvo0UtO$?pD }[p¥Qp¥R%pMĪ%BpMĪ%B psq'م.qHqÐjqÐbqla!qlarrr(vr}giĒ t$E:9t ZQu+$y uY2vaF wivS wkQ=&xй@!xQX ayk~?u?yNj yN z~!\zBf&zBf!{ cy{4#<{4#<|Qy8|F(}AɨO}[n_ ,~-}J~-}J e~-}J ~=#N*RL+0;ݬO?  eˀc1dHˀc1dˀoABˁgD ˃am˃ة)b =˄#Pn j˄ڧ?˅;A7'a˅B!Zˆ ˆJQ]ˆٝ\ ˆ;z"ˇ.*Cˈ_ cˉC5 )ˉC5ˉC5t ˉC5 ˉ)*nY #ˊ ^έ$ˊ ^έˊR R=!ˊR R=Kˊa , ˊ KNRˌl(m ˌ@jI 3ˌzZsˌzZtˌٺ}]ˌhRvˎ e)Ijˎv2FՌ$ˎy1~ˏ]fD6Rːu9=vːu9=vːFl/XtːFl/X ˑ+fRˑyG3] ˑ8jO˒bA, ˒{O˔ (7?k?˔16e ˔]% #˖d|`'a@˖m{7˖3o˙2!+#˚FiD] ˚!Rf ˚ S˛ `uIN ˛>1 ˛a( ˛\悧N ˜FoS˜z(b˜{~,|Tj˝+~ x˝XOs ˞] R:˟b˟bQ˟b˟bK˟(TQ[ˠ+_xbˠxN^o&ˡayb "ˡ˻ˡ3Enռsˢ-Vz( ˢkx ˢkxˢ f(ˣ`ت#0 YˣęA![z˦@˧:B۩Q ˩]I9˩%Ng'?˩ot˫Ľ͋[KˬX(DO˯OC˯{? &˰H{-˰Oj˰$v˰L˱{" (˱H ˲0˳&.J˴ţ*˵16<˵16<LL˵16<a˵16<S˵16<K ˵16< ˵VI=Hw˵'S`˸X>(f˹U?˻T ˼U ˼&KsR?.˼&KsR (˼!j˽PPJR˽PPJ˽[`J{ s˾h_R9gS·$ľ %Ar s T1N2FƎ)$ /V1? Ȱ? /X-:̐~Ʉk٘J'd  g L36= 36=36= ,^R?dޅ <o$V ;+[Ss QK A+I vX8 9.Z- K N eY $C*W $C*N tI %c&t $mB $mB s 6_ |usz0mgR ojúfHojú4EFZ!8]Z3(U eN+ N+ \' ^A0^A0 <`(f@U@} % G{j a3l[dbZ[O'SO'Scf8$RAVDо  *eM V%hp6-kDDIp.8M~ c t2=  ʽNY 2 !~J[?#gZn $4~ c$<ŷC$V>!f$j&R%?%% &+>S+`܏s[+QT %+$ ړ i,+@,cfEN-fp'Z.\ h.\ iP.\ .\ /(~: /_ט(0h 1򲐇H 2t w4WN2i!)= 3,E3,3<]4&|? 4Gn|?4Gn|+5#͵^B? 7&oO7dGX 77! 7Q1 8@֚X8HX9pX :EuH;F&g+ ;ish;N;g_L=MZ| ,>=MZ| ?a9g A$ɷA^B?1 -A^B?1SB7 Qo #B'n? Bc %?,CkCkC0Ea .EΙ3OF G' HO#?J K(C׹I|L֠h: NC"WNjV+OV'-S O އP S f4CS-Ű iGSa)).7vSyN R SZⲻFSZⲻS SZⲻL SZⲻT)] U&g햡BU&g햡U&g햡ZVLsWm DX^*/"YYX^*/"FX^*/"1X^*/" Yfav[v]zn \Gb89CR]j'hR"] R}d^"XR|[`T3,D `vFncb) I m bڈSbm[ N c(~Т mc>bAd dCoGNQ (ev5Jf|RgIhi ahb5qiIc Z']i .} |lF/ $liڟj2 n]UOc -oJouX%~zo^\0 \p=OvD }X>Ov}\Y [ ĉ azf ̂.{"̂.{̂.{̂cS=R̅ۋ; c̅&u; ̆pLj̇6CẄᾬ;P̉Q (̉Q9̉uM^C̊y(s̊7( ̍L ̍L ̍I|0̍M9MR̍M9M=̍M9Md̏1ݴ!8 ̏1ݴ!8?̓X%&# i̓X%&#s ̓' e ̓\u̓[, ?̔23*!̖ $̖F> ̖`̗ZJ;v̘2(( ̘]˭XR̘ s,̚d鏸̝Hp; c̝n ,#̝n̞%-̞%-̟W;1N̠IT1J>̡Q@ #̡bѪueeh̡rDn_̡ףlh̢iU: ̢iU:Q̢գ' u̢գ'̢գ'Ẉ,RI c̥t̥R~T ̦'R\̦R: ̩vZߖ̩E{a >̩E{a ̩V?R̪ 뎧̪T ̫6 fV= (̬4aqR ̬\]g̬)̬\_̰m^EQ3̲8$Qk ̳ ErY0 ,̳ ErY0̵kQ8j ̶`}̶`}[̷Ot&̷Ņt̸IR̸ZvD+ #̸x$ ̸a'4 ̼+q̽®HC̽khS̼̽/ ̽X^̽X^̾ҭ.a̾ҭ.a̿ɊO}̿ɊO}@Z/ čֱYčֱŹd' BĽR0a" a"j cv|PlLF%cF%c⋞ ɗs[fɗs[f %?&f7U&(5 ?ߍϲ?<ϲ?|ќZ8<ҁuv2Us( s(Q_G: >ҏ-shKC[C[ =) ) a)j(M_(M_ ,؏7q=̄jDKx  DKx DKx s|7$L>hB}t>]=Ki{B2d68b0H:@ ٞ~FF @.9RQ@.9@.9oܨtL&mZY$=ZYIE5aIE5RNYSNY #k٘Ck٘8tBm K (.`IY`I `I %ZwC0ԪV[ }Dy"LOmyUv 8۴K;ڢ[y 8  J  Jj ` A]q # rRUS ? (d.Cxp{R>-? 1$KCgZV*XjeQ , Q Qj Qd`XtuHK&PK&PLe9@ R8V  Hח  xIaE%|H4?:DMڣ^S "/; V$_E4s%C/o? '>LO 'T`d )E5}?*x L,jL),K* -j䪴q (-j䪴q $-uGQ -uG/Is&3 /Uj/U i6/U{0'B{T L0j6rgo ^2w3H ,47XC47l,D4C]N4٦*+5A_1M5賿ؼ6km 6ӟ 5 6⢚È7?+ u \8w2 l& $:\U :\UQ:\U<6YÀ,<-z.m=U?>}?}? AL$YCA1m%CA1m%C=RDW-QD +DDɊ_j EmXtEmXt ,EmXt F(F(Gk2 HO Hp>2JdF< J{JVJg9JgDJgJ cK T`N8ńad P xJP xS1P1wKQ.9d6QTC#S H>S?VS #OL S #OZTǙ#"RU j UMo U #8V@D,3Wtѣw iWtѣw Xk0BYg8FSZG_*ZBKEZC%Q.ZD> [6~^9 a\t%"$ +]S ,]S _)?s_2 `y%%`&NCaƖϹa*™bfTzb0[>d-c w^Zd]M=e=]J c'e)&8` eE~U-g go\\vh3+> biqjgx jB8z k$EBPk-YIlڌK liz1onp Wo7 (,qepr,$ qepr,q= qIHȲs (,s,ǨZO s2A>}uMLFcRy '2ݠ! yYXoyӬ6yO6 zNX9Nz8 |~3|#}?'I }?'I }(/Ƿ ~zL f ~udD C)*o?iC ̀ÓỲT̀q ͚Wl@(v ͛H|6 a͛u ͜YY # ͜W9 #͝?ˠ͞[|B?͞5:@͞Xh;`͞ ,͟y[͠ %͠͠}It ͠}ItY͠Cnq c͡BH0͢͡͡Yje͢Zhͣ=f(Kͣ=f(Rͣ5r ͣM7 +ͥ=}$ͦuB ͧvXUͪͽ{=#ͪs29lCͪwY޾ͫ7@XO̥ͫͫuOJ ͬ)+ͬ)+ͯRQɨtͯ,8cGCͯ,8cGCͯŒM2ͯA;QjͰӎd% ͱ-?$1s ͱQwoͱ ͲJI? ͲJIjͲй<ͳ=Ij$ ͳo.c?ͳ||J ʹsp͵+#8ͶKv/ 2 ͷPBiC'ͷPBiQ&ͷPBiK͸́}C͸́}RͺD+R ͺLC ͻ *[ͻ3"?ͻ3" ͻs3ͻs3ͻQ(K ( ͼg Nͼ^-% ;< Ϳen/tf$w[ r r: #: cӫ~U#<& <&[ PIFz NsCNsC , P%|?Y> \5= ;f5= ;f ((Mŗ Mŗ|hzUV }S_WmjGJDkL kLkL#͕dͨ΢7uR^a`WdCE%âfwR9-}IQ9-}IqM KvTFUҴ`2Į]tN3Į]t o$ -ԞK) ?աR1L~.֩ظ /ظ  -qi -qiVm~"݁T&݁Tac]ӢߕO񾒄L0H_ dl#qYY:ٙP 33o(bh a?Ѓuꉠ' H[| JJ☗;c_:TC ,=0 8>9> 2/V (+2/V $2/V i !υapIpd ?F܎%?F܎U ck\EMԧ3 Mԧ3kl: #kz _W ihC.? u"}1p&Ggg?]E jsr a5VQb1qG1qGꮖ>X a~ꮖ>X Aꮖ>Xt!4K ;tp e N^ cJS\1h ( +W"- >M >M c pMfY= N>) @j}3KEuC~ I|tV ,V  _udFS@ Ɋ |8?wfqvm֗ 1<} b ۬hzmd O_K :I:If ˕!! %4 "W/SS "½EǃS#_TG#{$ N󹤸 % Y,rs%v~~) )džO ? * 40+ 0#N .Ks.K.۞r.۞K0Pm m%08l2]uŴ3lkkUK49֕49֕8x==?f :XMj[;~ӻ; ed_ >@_վ?ԧ ?-A @qvbRASqrAnOA]RtR)A'+A'+Bk-?B] CuO|ACuOC&NEDEDFPs]rG"ŗ SJm!5;?KCxN K9wuK"#E ,$K3q #MH7ñMu!Mu! N=Na/9 O|: PʷUPݩ0NPݩ0Q\*G cVJVJWvj'Wvj WvjX\1X\D X\XRX$:N-XJGUcXT CsCNYA ZѠN Zݢ2E [j 9[{j]B6k_睮7b_`n!4| `n!4 (ab+m] bEAc=@FWKcfS .cv#3 c竊Vdd27ORe{u!{ f G f G ,fM, #fM,h#2j5''j5'Lk~dcL k \km4L oS )oe}=vp1ws/q "TtCUt@?t@uu~ewZktbjw wxDaR)y,͍zrŹe} z#ͯts{ջ,3s |vE:}H]a=}WN~~@C '+N[IxXxPT}txPT}t΀$R΀ZT i ΂6Q΂Ow -΂S" ΄?g@R ΄s$B. F΄E;" j ΅3ΆNZ= ·l(Ӹ\;·YY0·YY0 ·YY0·YY0 Έ1RSDΉ#owjΊ˺m%΋|SsΌrfkvΌOdI΍9jΎD ΎXGS ΏXE #ΐ aEΐ @ΐ 1bΐDx_ (ΑJ>mΑ嚽1t"Α嚽1 (Α嚽1j Β*G= sGΒRGΓ&4K ΖАΗSmzPΘ{8p a Κ"PΛ{ )Eh ΛW xΜRŵR\CΜ}PΝS0sΞ,rXΟ5z:X Σ@ Σ_C;Τd ΥB[YcRj>ΥaMΥ]c$ Ϊ0 %Ϊ__ iΫΫE6N ?,ήԈ VήfIJ ήfIJ ήe:ήe:ήe:jίF%5 ίF%5ίW]g ΰ2Qs ΰ2Qs:γhpvδߢlOnεY6 Uζ8Dq?ζjW|$Ktθ?R&ι\ 2 κ&n|NeλkZ]Kdμ'μ0, ν&߇ ν#$^bξ؇i ο2 L3ο2  3 $:lzo. HO5HO5Y çi feD =힌 ]=힌 =힌 U1# $4n 4 ŝ4fRes^tƒ֠ ,ƒ֠sƨ ri zZR|YR| C^y rZLBr ZLBr D~ jkK>}" ʰ/i )~{t\7tLɘ 9bJ^ г(~v%8N?_K'ѕ ѕѕ e %BJJ"r "ҩ{C (uKNjzL!\Z cRnLcRnRٸ = ` ?\Y&^T@@ .e U! - Wu i× PO_<[۶9GWK -eA9{~a?9{~a s0  4'IWcޭ% ޻z a*`S"ف;%B mkҏ mؚ;Aܓ ,?.S< !30 |ctV ,mv!$芷( $芷( r 3 r 3PȭVZ)T&vR 2j;w2%C+Lk4ĩxm5eo5^4v(5eo5^4vj5lu 8@n0qYY :v:ŪK ;`\;e)it;.Z<~+%~?.=jb=8<<=B>oY>;z >Y[ > [6?~vnl8 ?/v] A BTkCB \ CFs?ZD F$2?5 FqƜFsWkFsW KPo) KRj(hLxjJ MkZJ" X M$:e NvpsOc)OiFp O-Oʗ9] &O(<YP- PxoyJ*Q nW.7 SE* TQJDKT% aT &UQҩCDWV͘0W@ٻWjYhi Zɲr [[7}# w[8 &[<_[zY5 1\%P\⢐% ^!w*;^,uLQ _,6_,6_~TOS__s _k|`P`ZqB`韺 (arACearAQ!boR$h/4Vj9 ,j!kH~% (lK i nm=UKDDnm=UKQ&nm=UKoi :pH* \rP crPvtzZUD (u PRv%kͻv#RQw'Jtw;| xpY< xq4+f y;f1-f yU$=XZ|hgA|F˵ |4!ބg|/s9} [|}WfS]}WfS]~j$~΋: d1>d1>ρ4A ρpeF *ςfc?σ[c!kԘ τ0Q3ɻ υ +I υ +Iυ!3&φ )φTbφTb φTbB χۻ@ψ ω\fϋ~ ϋOό!go[ύvG+ϏM.Ep ϓW |ϓW ϔrQ H{r*QYmW}d CM$61{[j a78787878`,@t `,@t @ۉp?ۉp |+7 <*&*5N ^ ^vi U >gR ""% wz˶ - wz˶ C b0dqo y??7q +%[v̒Il?&v̒Il"`{ "`{RT 2ڞ ѤN„ uR„ u„ u-1o -1o ;Ζ e;Ζ c!t *];r E ar b-b>(Z -b>(W|oeim _ v֦|BN 0άST1YK?N][馆0^E 4S!Lu!}=!iû "HUF %/l%֢0R 'Ip [v(ؼ] (iy-9h)'.e)U0KR)+M[&S+.{+,g,FE~ =,ia.@)VAt0IwK1Z 1O2 D,WR2IډO2IډO2j~]6 ('6 (6 (8{*9M J $9a@ϣaK;-;3[ S >&]!>&] (>&]?$zJ?ZB9V;e)B!; D>`D>`d D>`D>` DQ:W EY"Eߥ3WN!FSp F # $F] \GuLAk G=SH s,I'% IN`W? JףCJ"p!K6QfLʧB| cL^} - M>ByJdM&miNZC)O2Gt O2Gt OA/PQwNA1QL.rRR Z Rw VS䳣 SMP  #JS~kR뫩TuLʐPUTڅfUsPU9h UݒDUݒV`|oHW?tV`|oHW (WV`|oHW WB,)[< e[Oj[ "\"́]n4!N ]F4c ^S 奴/ (bޅ} nQ />n"N&]O=`ݸ o5kBt_R "Zko_ ãt 7sZRX"$Ƿf #&-#$U d?$~%أ&_a')ʝ$'P< "'z);6?)Z_)Z_t)ѿ:G*,t*ko +VCw-6yrݭ-I[ -tnTe .S 1U\-5bU;@5h4m86p% 86p% a86p% e86X8er c:9@&];pY;pY$;N<y}t #; Z' ; Z' Z`]?@ l ?E}*+ s?M6y,?M6y#?Nj?N?@BAIl @Rn^A|XEYG9Y,ɞ iYP2[qj?\TpKs ]­ ]^o]YpWD^ƷDa _C b_jV;b\m'h cqJld:թjeg1=QgJLgtCv+hx}Uj/[Svjhqخ k k|lѹ  nqaSoX Np!w8 pfr w҈Rs1 Ncs^o7 ?s Lt{tH)sHtH)?u{g vr&Xs!x j  yYi yU3A(|~uK~y%+~jh~jhR~jhY~qWe|xq# ~WA!р"Rtр°р9a&1Sрb8SMhtс !Kjl#фvZE (х彫 cц]'ϐ цڥ?ц>sn чq7ъ)7 ыFd ь[X $ ю^?~Rюd. gя(vя.I nяh? -ѐٝ:2ѐٝ:2U ђNw ~ђNw #ђNw  ђNw ђNw SєBMdq єBMdqєT܊:єIlє ѕV$6Kї Fїl! їl! їl! tїl! iїl! (їl! sјr2Dњ/њOܱDњOܱњOܱњI3 њ}{i ћ 3BL ћ 3BLћ҇`V (ќ!DtўĜ^[ўĜ^џh*Wџ>i џA$~ѡQwEKѧ6 ѧ%(qѨ`Hѩ0wuyuiѩ0wuyuiѪv SѪr}3 ѫ[KѫEP>YK ѫ|R6ѬTz ѬTzfѬnU#Ѯ;ѯf: Ѱut ѱYov? Ѵjp gpRѴѶc?FuCRѷRkh:ѷܸdFѷܸdFѺ8$# Ѻt2|%Ѻqk!ѽhV-ѽhVQ#ѽhVDѽ ѽĥZѽܧ:hTѾ TzaGDѾ.r ]1`9.GR? e9J O Ks 4|JtЮqSAQ?Cm (SAQ?Cm|Jg Cjݬ$7)Oa3 ] qPJ kj#̉wM>̉wM>ag3~]H`" ~]H`"ϟ| Y|qo?еX7еX74+rJh?ёm\&7~a y:d~c zӢW^P 5S;ql l ׵ س#QyED ٌ #70t 7fbcv ^a3U Ԉ1LyQqjܹDq`tbݜ)ݖ|I! ݖ|I!Y %`z@;AtUAj"z e/: ʬIw[ i #D U Ty%L)Ty%YGM[ 4R~33IJ.lSuS?r s 0" 0" Tx`. `. (tALRBiv \mm%4\|;m%4\ iE隬 6 & ]wmZQ@j裗>|; 4R9P (6(n|P_f?N8sN8? J•N?!1s|^|^0[VLA=.?l9 ^ ]b9R u7ł!ǿ$ga%ER4AK">S6 ͼs0;1PP/< vVne vVne vVne 맂 - Vs9 \ "b/ $k "b/ Iw * ?>v NL NLXJyNZ .1[ L3ݗL& \", 3euu IC7آ2: ]9H~.I ,.I i 7#,2m [ c*V@X0PG@"E |A4 ї A;1A=g Dݤ a F[.bfL $ F[.bfL , F[.bfL G*f jG3b G3bDG4JN܁8KM*Kް= L4A V \ Mw]#[ My3 Ps!iLQΒ2YTӂX UܛSV{L"Y D'd'Y D'YV YwºU Y XT? Z!/eQZA ZzBbL[=Y]\O^f9+_Nm.4_kjr _kjr`D/,a)# a- dI Q eK #f]p)fcCc& i߹j' jξK9 k|KY]lU l>1  (mA_٦`  nKlKn_?i nI@zrp[lsp[lsq5TtH[Kr$S sr}2 l wE= xJ@Hi yL2 yL2 EyL2 z"y {B0~dE Ҁ}fL Ҁp.Rҁ]'  ҁ]' ҃WwPnY҄7/EDE҄7/E'҄7/E҄NcR҄Nc҅( b* ҅ک R҆A0|r҆A0|r҈9-NJ0 ҉( ҉$s \҉$s iҋ7b|ҋ{<!+ҍ0.&P$ Ҏ$Y? Ҏ- D!ҏ?Hҏ?Hҏ?HUҏ?HҐ/ qҐ=j ғ&;s ҔO~ Ҕp&Z ҕ}Pd>KҖT,Җ# җ$җ#sdҚ0!M ҝ-=W ҝhxҝXPlsҡpgsҡg#yKvҢ23Nң:ٶIҤ :)&ҥ+s MҦ(duҦL[1ҧ6!ҨILҪo Ҭ>&YRҬfKҬfKD ү{/g+tү{/g+hү{/g+ ү{/g+ ү%F YүEP1)Ҳʦ#v ҲW=rҵS]ҵ;#@ ҵa|C aeҶFQ!Ҷ߳bx ҷ?ω3Ҹ s$Ҹ "Ҹ]^pL -Ҹ9tiҹ7*: Һ4U9;ҺMһ һ һŖDҽ#b tҾ!` ҿ v thc`[x38%x3-V-ViR| , ?*(MJºYR$ +d<(:?Li*ǒ˓ǒ˓ ǝ? !ݐ. !ݐ.%N gB< Z gB< ;;R 2 @¦N @¦݊'͠|ꏌQ #ͱZǦ-1w0t#; xSɣ; }6t}6 ̗wd?1( $ZuV >k?ns<ٰ S&-4?-/ XP[o-~.r8q=3;_E3;_ I yq :"ٗEGٗEG ٗEG 65` Bi(ڽ.;5e^V  k[& ]-q]-bNƄ2 i@2 i@R mɠbmɠYmɠ ex*螖&J@w_@wnJ .da2 y!ztEy!z oR"cDv ^/fe GDVd7 c/Vd7(G# 5@ k."$jũDÍfa: _ =*'س c@נ9YB# (y DHN? L8ѿ ө\?\N5\N5 ^R6I lV'E=x!;c"W+姪 y( |ҭM"¤6s ¤6s *)j Bye  [  g: \ iJ%S }H~2 s    DRq[  q[ 7Q ?&-'_jC[S 9JOA{&䩪 0T&Ñ{~ $ ;>pϟ Dr1Y&c%:b (:b (9 l$' aOYM6( βIa `vBg 'VF RY" ؝ ؝j!'"`Q-?"bxCZ " ?#<}N#Ti $q8 %J8Ċf \&%MS}b %[+W&p&!ќK&_(l & 'SS| 'SS:({K^Y(}l)RƊؾ ()}g]:X)=( -&݈p9 0}?~ 1hP76# 1o%+ 2!a 6Pb6Pb 7e:tC90! 9ZTm :ڦVQc :rI;8ziˆD;=slQ ;nu]>*Q ?w9ӈ?w9ӈD?sh.?-8| @dܗALQA)W|Bb| Bvx CCICYCHDC:6 {E{ E:E݀r0*F\Vy Fd FO$hw]G\,vGpk #!I4O1 *I4O1 IGwI,ŻjK~LeMNA9XN= QR<'}[ S<S¹I #S2 T҅MV$kVd&EVy:r?W#-X%- Y$B| Y)jYܡ.&e GZ @ 1)[ J \ ]H.^Κ$_1(_1F _u,2= _ۑna\0ԁ[bQfnXc b|.cDɔ icDTrTcDTrTc2Ud"& [ e(ʖm #fcRPA \gQzZ| h_q3k?NLlH m/~mG oT*brzo/@ pKNQZqٓ?3Ls$&uy v ?Jtv ?JvFcHvَ wkCxg7ܢVxmb#w +yl y|zSR{4NUt{4NUR{uԓR3f3ӓ{pcsӔ4Zӕ$ˆd ӕ$ˆdӖt@.vDӖ@)V |Ӗ@)V ӗ11>ӗmJ1Uh ]ӗ61hӗ61hә +cӚÍWbӜ9fj}]Ӟ#T %ӢOO ӢeQFJӣXd ӣXS ӣXLӥO2K ӥ`t iӥ'uX ӥh7 Ӧ~9 ,ӧV #ӧ`[)M aӧ`[)Mӧ܇1{jӨ#mM),Өh'Өh' *ө.!: =ө.!:өY{ nKөY{?1өY{ ^ө-KӪQ ӫuӫ^씳 Ӭu (Ӭ׻#"ӭ$.ӭQ ӭg+ӭ] ӯDY ӯj%!ӯj% ӰZvӰ0ZӲba3r&ӳ0]"% + ӳDT ӳgr:Ӵ>L15x ӵTN?p'ӵ9d?Ӷ65KӶvO5 Ӹ$8 ӹ%iWN ӻ6` (ӼjI ӽ[ktRӾmJ,XӾrȓv ӿ|MRl8XmAC \ |e{S{|e{S{m8] #Î]O9>0<sAZ`S!PĪQ@2qK6Ŕ=2:sŬ`N>k Ŭ`N>sźL?C<s7;eJB+ Ƨ 2Fu 'ks6'k tՐ'μ]tπIPqr ϴػ:(C: .' _9./C6?"pj(<< tNiD ֓t 䚝K3 QSvˍW<j/jDc[ " SL+ MvۦM>۬}S%$i9"7tt| ܅WV?( ݞ LޮdU' Ąd~s]CͭtiIx!r e g/|r6"t=ć+ .+ſzUOI!iKKȺ: fo ƪc;"MbN R prSG5.wk i [f l^J AsqY ߠ |j '[RŢ j $c*dQ (,,,i 헕H{ʀfN GdXs \C ]! TBvu ڬ4 WF͏,=ȸ)  3/&a 04NQ5 %L^LuNZ42{9S($ , 4zk ]Zc \ :9,? G,o^J4tHgjS~ "? Z +tS5eьRFk ?Fk j<̡ ' {  >? +HmӞU+HmӞR+HmӞ e tQ 3#ա +7Yl$ 4z4zDY~#]#0Ybr#qФ2$_}v K'wWcsU'W'kG,'kG,d'kG, 'kG,f(6n(Zoks(jpl )0:?*~ =*~ +J +J +n5U+n5U ,V7OBR-.' ? /H3V :/P&J a1'N"13 3&Nl  3W vU3W v@5`T5`T6b776)>7n58N:?8 P*QOv8\ 8{cj28(ypY9`GF[9`GF[R9`GF[9]8 ;H ?<~62?`?@ɦ0?*@3MBԑ_X=Ci&f C~K0 D7 kCDnĞ7r D'-DmDEZ@lE%zC"sE%zC" EߨF =EĀQn F6ӟDG'zFvJʛRԧ+pyԨPb&*~: Ԫ4Mt [Ԫ4Mt ԪbH@Ԫ֜-9(DԪU jԫ% ԫu!K ԭl X(,Ԯ9T\ [{ԯHVM nԯM ԯT$^I԰7P0԰7P]԰Ί=u"԰Ί=uԱzQPRԱ wūԱ0h- Ա̡ ԱZnD Ա#4NtKԱνϫԲ pԲ  Գ!8xNԶX?ԷwLQԷwLԸ ])Ը+r$& n Թ\bI ԺC@ Ի#gSԻ#gSԻV6Ի9]Ի9]Լ(v}~I Լ%ԼԽ)/dcԾK{Կ; :9 k A %k A %ĄM ĘeOŏ mGD$J6?kMj:Mj:7Mj:.Mj:Mj: K9O) Pe.Rd.R\I2[ ̮i )?ЮΫjF 7 7tɨj?| H +z /٠: J"ڕ>[EhEh^C ڈ;Vu] El'Rկj\ .-I .-I!yjY``@ҩ/T'sZ} ֬NQ"w} 7VV i'ro7ˎ ҩfR &gun hh9{w긭a5 xW` 5 ryF6 uNH NHLfWJFaYE!OFaYE!AFaYE!v,v,|^RǕ۽ +s!tv ~gGsIJ&s&s $5 ! .7H% s0b f! iP7= /O|VhNQPdWf| iD RW 2_~^_~ L\Pk mJS '-Q^  av av | ̻ s `Uc(B (c$8C 2j1؟ ȭ! wSξ;dLL #+T aCu3 OPn e۲+~-`\5Z  瑗| !s"5*7C"3 ":6E)$f(?$= 9P i$Hq3 %؜s%$-(3 &%Pj e% W4:&,޻)&`?'@<)#  -ٿ*ܘQ/ u y I/@A@ /nn00 0KÕt 0:hBcR0:hBc1|xBK1=4J 2+2@J?2 kD 2 k3Hbrd>5~(6e 6e 6e| 6r ?6s  6䈮ۯ 8S,/9~*$;\iCs;\iC a;6Ȉ ;6Ȉ dSbP&> h>%?Fsi -?Fsim ?G4 A=b 6N@AG5 a AMB:Ϥ`Bk +9BA sBA \BA? DmWhݢ DZ6ZE;XE9AF[aH .H),PH),PNH| k IGt7 JK6_L2i՛x՜< %՝W՝/MR՝bǾ$՞s/4 xՠf5.ա#P}ȗ բUUx\&բ6tգR4 dգA ,դo եgզ9 զȕg^G8 էTlτ Zթ2+\ (ժʩQ& իRe լKlNլFgRխiHF a ծK?կMIկo8i$հ[ ?յ"o>i յM(յYھ;Hkյ%T#յ9 նU1SNոrwNBո悋5 չ\~ պ?jպ4Mջ]ջ] \ռ+lj< ռ2y սS ɢZվ{,տILg`տILg`LտpDt]տpDtտR;տR;S AIAIXv FtW8z u sVh;’q&¯U¿vHd8߄,p<X('- D@'k ^E/2dĴEb rj$ ?VK\Ws; ǯFXO[ǯFXO7m$ ʳx9nQhe+|D]0Qab"t Qab"bЈ%YmȸL(*?K+" S9'#>Slݵ_#T"Տi4֞`]֞`֡(J` %x;K| o ٕ|>Ek}?k} k} slf2g $vtyK(VV8Y4SGU ,AdANaRqEj-ⰾg iⰾg gаes=C j 2Rk1H輍HKՓK R&O[ AF ( [ AF (zYd3&(zYd3{_+?얧/݇ {#P a,bc}RYeN YewM;? ]oGr]oG &<b7 a 7t&\a;!3 }B }B 8ejQ޷4FNô Nôz nRo \-3W -3Wm%LG\ t(mC_ O|J25 $vzؠhLox ox^.s::N 6? gVֽ یBR >  Nx0 eȦ6h p< ͼ ͼ ͼ ͼU`@F m zo)|$*N8sX8;s Sj ~.yj< `ya`ya6c r)FE_ ٟz~t ٟz~ (xf?+-Uf1yϡ?#f}P^?#f}PT?#f}PL1?#f}PS ?#f}P@t6@q2ե A"vTBuxKDbbݼ0 (DeNEDDeNEKE:)2E:)GoR GE)IA607YIċ*J/ƣ^J0<J0<t JTNjKCM[L.ort * Lo1xsMk+gu]NV mOH/i RNmt RNmSF6jU;dU;d U7Mja^ VrVoK WSu7O[?W ,XR_YyJd ZwAS\-ER\os]l%IR `B!d a^>d a`8b%1cb,KVP bہ&Cc1Qvx8dW!gdSeSe.th&p- h}S $ idSJi "jۈ$Kk06{kRPЈl^ E m/8] mpm2@x/mpm2@xm^C0?o} ipczqs6< CsۈszzksIyru#Cgu x3u xwD2? xA x/ zy)* y)* zyD zs4?{*vG)~m{"~m{~%H`$sSOjsSO aM .sJ #e~.ր7ޙaց_u#bB ց\fxMց\fxMց=4փ9͠ 6wփ9͠ 6փ9͠ 6փzM $ք)- Bv օn1~Z\$օ* ֆE # ևRȣ ևֈ-ާ։jw|֊iyi ֊ B%֋GzK֋XOt|AR ֌nv-֌])M ֌mBf֍6}x5K֎Tݭ ֏ߡq ֒ 5@ ֒ÈRj֓~HR(֔Ǐb ֔= # I/u (SED c>,g6LE F:d sK{~C'[WX8 q vw^8,R>y`?I޼:@!p-{ aA-#1A-#1BЙwB`P셰DB`P셰J DH? uD_Ip -Eh|eFG呂,| G bQGaK2Hߡ Iq~INIܼ>TKsrc%KsrcLL1LtMQ'N(k]dNOF^PPbA Q9| R#kwDZR#kwDaUt]AXƘtX7p|Y~SyY9bq (YΤKZ[ Zby[HBu\5LE\^'eb? \/WS\(w 5]rUE ]4$K^ns^1\ ^ &_c;s_ە0` *`bW?5$ `bW?5aom&?a~aeWVhbk((RAbk((R bk((Rc-R dkfLD]n bf #/ɂ gg_fbN h=X h=XUh[(/p? hx@iSh~71ir –v iq5ONj6BCc jF6jP0 ik 9Rk 9|k[[;)#kiz<tk1t >Vl_v Nmn:l&m m/}qn4s c o7Z)p̮Nvr^Zd(O}ssoKbXsoKbCJsK1sqou=Gp\u]>4u]>4ugS0-B vg wh0? z1bzXL~{~6 s}5'd}Z}ZnL? )"׀ C ׁr_ߓCׁܒNA ׂĭBׅ!7FRׅ_F׆;9t׆;9t? ׆VVXT ׈ 6^ ׈" #׋b~:׍Zy׍Z׍Z׎R*0LN׎R*0X׎R*0׏Qwhs,ד/{sj ד/{ssד/{s ד: " דdg דn4 הbMJח5(חky חmחVqkj יxz ] י&R3ךB ך1>N ךQכ{ לatלaYלa םzcYמlzSןkEl< $ףs! ף 'tפPץ 'l צD ,צD ק"sר7HL -ת"]*׫Xan ׫Aw׬x[׭%Ü$SdׯZnfYZװ%a~)װӕ2M;״yV#4׵4W}D׶-{'Hh׷]6Ă ׷´"{ i ׷´"{׸m3mj׹̠R`T׹܉)׺^-2w׺F) ׻`B $׻T5U׾㍂׿Jy ׿V^uPR~ MU ^E( % bVVfCFmgLC mgLCtkmgLC mgLC Ś8|%}sR%}sXs(~N LP= !RE) u* a1$~S" ,"i"iua 0?? Б잧 `g9 6 ` e `  AgxhEԭ2#8 6BI Nh@0"$of-3 Q 2NT.c%a޵rg_R)qߖ=s m<(* %M jIUR|om vPk~·n 9 e˞ - e˞ {n.sd,t;5Q_-\f6w ). H?׿ 7ܤדC[7}b \[7}b s1s 4"`^Bz+ -r *'O0d&wdpk ⼫@ %BW- ,p }Q_ #R04G6t R04G6 a/To]p0h;?j0h;? 0h;?bU  #V s #VV u \ ; wn? Ny X QFcq ιjDM ιj +qD9 NԼިڗLjH $^g_yրlu d i9ds dh djd =P C-w,L$ $ 맯맯U+ϘRq S ú >机>机45R c< &!DZm ".K".$S75$ ,eH s%52\%_q+Af1uYAU6 "BijSUErvFFUMcFunI8h"_IZ_NSIQzCKl?_L= KZKT@RMbM|iR N,'.3 i%OT )v O|`R; P}PwQUKNRat!?RfD܋R5F_S"# SO S͐; T~cfG-T9i/ Uׄ ^ ViN.zVvTYe}1 ؏`mú ؒ$F cؓx×+ؔMEU[ؕ8e;ؗZؘKu} ؘt{@ !ؚL]> ؚ|1$ ؝ѝ"*Vs؞::DY؟ ؠE8iLؠ H ءpآ]ؤo ؤ˒ \إ[إn6Sئ5i ئW ةoƕn ة=Y تY`} تk{C% $تk{C% تk{C%|ث&c.8ثwBRخ{ ذgr3n رQ@رQ@ رwT(شYxشYxaشYxZشYxص9Yض; TطXG@$ #طuþ ع%S7UUعع غ=ػ&F ػ*hl> 𘌡>;S8A }r-~ \D?- *cCǗF0hei](Yr>? Pderec & v->o4tf}d) f}d)f}d)$D : lդ? Ec@EcU$EcEc P^s@N7bPd @/o7%v}v}J7$Jn7F`#>9p P)>< #k %fm: ς9U -$ Ԓ,9 zys ;Out}}ɊsN'2!݈a kDI_j aBu ^ kS)U,n@Z3U7  undtI b SN K2 SN K  SN K[s ma>c"Q8 ;> *m6 {TßdL4 $ !Y`@ !"EC"a{0 $#d5#3m)j#3m) #3m)Y#3m) $C2X]%,KUD%c O4&3' BY's[s>[h >[j>( @ -Aߝ[A@J@QM j A!B sA!BYAWz| AWz Ci8 C| F/ E/D?F.b0jFQ HJR`If ^?JaCL $ JaCLJ=kJKrK|~ LLe MNrjjN?{<^P^9ǻRyWaM vSfnq&S2Sfnq& Sfnq& ScBSy[ n TFN-GqQTWlU|VEރm<[Vw RpK W& gY h[==[== \&j \f9?6N\灳]mOt !^s_nzk_]`]`%x`)%p>aK7wЅ ar#|q"aTcéfĸa ds3d:f f(jBcf˙G fBFtfBF guSdEh88A3}hx6 'h{u?I kz>UR kblck \FmR=  mjVtoq= "oI rg+}R u6& v{JX;vjVDvav yI~u`8yI~u`?y F`Xy F`z;Rz#vCF7z*zT. szϪV |B|BK}ȮZ}RO! }ROC~Ҧ~C0 ? s;v9 فlBA # فlBA c فkWjف(pق ق\* ,ق\* مA@辬هzFw2هzFw وg8 r و[Ѷ< ى>Oz ى>OzSيRy&qً1Zٌªsٌ'YL ٍ^_ Tٍ2< ِBD* Hiِ`T cّV`/U ْGVْo`M- Xْ3:ٓ!Wy@ٔs=[ٔw ٖ7zkٖDPX ٖV<$ ٗQ{T٘ݖ!DٙQ/ lٜHc͙ ٝRyٝS0oV ٝS0oVh ٟ4&4 j3ٟ4&4 ٟٟ ٠:\5b٢]Rr}L\٢]Rr}٣>k i٣ E[C)٣ E[C]٤u`K a٥ ud*٥<3Z\i ٥Mv٦S8TY٦0 ^k٧Szd٧ncG #٨8Ct٨dN@C ٩Z ٩j2U ٪URLK٪>] ٫ V ٫ V?٬";?ٯPٯP ٯP eٯ5 1ٱAٱ>pٲ)ٳo)ٴ&Z.Dٵ~ ٵhٶ:rٷٷLuٺ}[ ټLAټlM fټB # ٽsh ٽs پZPپZPپZPپZPٿ/h0xUE<ٿ/h0xUE ٿ/h0xUE ٿ|A X*Itn .v6rQ/6; -IyV $ +}Ѷ i}Ѷ ƣ۸I ]WD-? !'va]18VcYmٹ~㴇>㴇>QF F F R .-9+`-9+`!kϝ"_uϵ'z  Qϵ'z  ϵ'z  ԹjүP$үPRӒ3 aRӒ3 aYEYE YEKظ%?ր{K Hl)g*JF?JF? ^ij IN (aMz :-DܯoY;Yzz;Yzz;Yzz|9w+ uQpCpC }> Cy9]໙ u .9ڗ,WԎ'RN8@w!$])]Tӽ 1gRK 1gR1gRd}T5V }T5^kT l0=k ;^U;^U;^Uʗ?-ACx<rPGNB1~m!t(2h|9:V-usb<^4D"T75%:Hkl5bdqI k>? 5GH" f[]{ j M$NYtNj=S &{ a] gY g  gt g  g  l]% l]%  G5&`V ӽW>s 1E  ܢ ]5/t $J~]y&4YQ Q aJ"M| v )j8^W$9 \Df piae9&0:T.ՆKt Iz4" * S (P&f ~DVRG0r5vnju`"h$ , 9GHTƛt g¿N v#!L>*!d)$qe6R$r2ERN %:%Ka &<7G'=, i"(HEH`r([?ak (\KX*K'H? +KtKV,>p,>p ,Q 5/,}W,TmAy8 -D/Lj-D/-D/5-D/ -D/.,\ω/. 0`- 1?^L3l1af33e[N 3װ 4n@K50N$5q6(va 8 *?9c-:늇;'X ;+@u'>@u'>@u'A~0Aw-h B6GkLCD fDAJRDAJDS`8 aF3GKA/Fs G}4 iHw[IH$&UHrɀ HrɀjJ$LKKx7:L{˗L{˗Mqmh^ O TsITUm) ,UGnzXPӎ)8XE0dKZeEZZ-, s[ \d^KmL+\d^Km(\d^Km"\d^KmP\Hb\Ht]5Sw] P;]A ]梗/^HaE`B|aWb[ +b[ ew5^j \gWf?gxZ\hEn$@W4i^A5jL jZ k"* lBr l7dOl7dO9mⓆMn xnBT o:w]toG3pK7ZKpdE,OsV6$sV6YsV6sc&>tn! vf}.w|ctkwú`wú`wú`wú`wú`yFj"ymzE׈z- U> z'| Vh>? |+"|8|OuLh |Ǖt}=J }B~Eܭ, /NoފA/NoފALAP<]>ڀg cڀՈ!ڂm] ڃU0ڄ # ڄ6!}]zڄ6!}]zRڅ = *. SڅpI )Gڅ~،څ\9Yڅd! sڈ*z4 ډ Px6#$ڊVڊV aڋ_wp ڋFڍD ڍDjڍD ,ڍ [2N ڎ; ڏ< \ڏolڑU T ڑ4=Rړx-acړD9` tړD9`ړD9`ړA'> ڔ Wڔ Wڕ);l+&ڕ);l+&|ږK3R ڗΨڗ~vژ&vڛ)AڛMg;aڝyBSڞ;g ڞʻZy ڞnڢ,J? ڣ1~ mڣGJ;ڣUS&jڣUS&sڣMʸn (ڤ9&=- \ڤhV/ "ڧ\ή#ڧ\ήd ڧRsR ڬl\Yڬ:\] ڬ?mڭ1{ARڮƍJگN7/گ4yRڰ7-_~ydڲT\Rڴ*} $ڴڶBڷ:;(4ںD@ںD@ ںձ;% ںmKP8O?ںmKP8O ںX$ ڻ2vڼ鋙"9ھ`b<ھjwR0jھjwR0vڿcS lڿy#Z) ,>6 mYQõ~ǻE`3Lxdƺ`t ÜǏ Ӡ \ % %d=1)VU-wᩋ Z/U+m:*^tw1f-3cP 3cP 3cP3cP ,3cP 3cP<}}5R*fu *fu NTЈ`#ЌNn гU? гU p0=[J}هv\0] Һ 7xNZ\n#Ԝ[wDn% c5R#L4u_H։,׸ T|cع:RHST FS8HST FZ [!α mv #ޗn`YfyUd ٚ 39ўR-9ў]l> xUsO>azHPĽZH "gD goC c6c6U) ꕀbIn ꕀbIn$ f4 f4 >I+">I+Xk %_N Gt( - y;v,jK3*JK EQ 4{t4{RGVvNs fl#fl#D^&9 A 5 SfY 1$  #& t c @CV ·ԙXg# }+d <FaFaLԀrp30x0dxɱs k{  /ZP_q39 HBy!jjn' ;q LDq Uba g$E~d s &] [C%H S VQG`a l%j Qi !jhEA"&n."[  #hgcQ #hgcK$ܰS $,R$2W(|%WTk?w@T "U@li 8 @+puAL>υAXMCRAXMCC SqC S/C S%C SEג7[E ,!EhE (FfP]>fQWAQWA_`QWA QWA Rv|S@T>Sf?T X>tTqaqSjoUw^ ,Uw^jUw^Uw^ Uw^ (V.=K Vd=" Vd="VIjW-\4@ W-\4@tWgIZdóB[܈J9=F"[܈J9=F \Td4 _# ,a谋C]a?b{01; }*Bf:}t4 (~G`U~G`U EfNVշ3;DۀPd< ۀM2ہe cۃ 55 ۅK-- ,!ۅfa}ۇ"( ( ۇ6$لۇjUu ۇ#2^ jۊ|;&O$ۋ_ 7 ۋİ <UیHyvۍ$_֕ێ1'@. ې%4jے$Ⱥ1ۓt 9ۓY.۔a6x =ەyyۖI3" ۖR\ ۗA*D, ۗ*??ۗOۙY0>EۚBpۛؑ+d۝_D !۟O۠w?۠Xr:۠Xr sۢJ,2KԴ ۢS ۢS $ۥeb a ۥkGoۦ_ۨmO7{۩~C ۩~C ۩7sۭLf ۭz,(Zۭz,(ۮ,z ۰X ۰Dަs۱61wv ۲unp= $۳K9Q a۴> ۵_-gĺ4۶;} \۶D~~?۶\-~:۶{۷1;۷1;ۺoۺoۺ4! ۽o.K_ ۾ivqd ۾?( ۿ?YۿŸ^t'IW< 1=J/$4hŜDב{CS_T \K X3} X3}9ɋ3\L; e0ŌyWJL$yWJLnz/tb tbtbGžJ -[+hu ѭ1rrf rfZ Ҋ  gӣC]? Ӥ{ u&<VV JPJPn1. ?ַ,|a+{;4葑 t٬4 .0'rwuK ۳ܻ7Kp>?IM>] j e?N'xA68B G@uRK phPU ?JE?Rw? \+Ù 襥N@$3W \ 젓sL젓s젓sD젓sZ L$^#c-ܪY1몑/ 5 @J ,dB (~ܝx ~ܝx 1Ui_#Ui_Ui_^V^k @yݡj Jv`[B ! N3q?TmtZE *IXZ`PPWUa]W?<ܕC<ܕC VBh1oR~[5“ %Lp] !oNgzKPF(  B  HA"Tv+/ݼ| $<S]N$ZMHBc  x kc8_ f uA? 2F>G *f Q*fCECbh CECb #ɯA:I8x(} $uK  *l)ի *l)ի $Z#{#U.p [  R7kjXrIk 9O j;*a. | )eC Fa,{7 b୧t? {2 -#!K?#Of7# c #F5U S $Zo1X[$Plތ& xO6 "&\J_ 'S1'Si,$(B TkV (Kzv# (]9)lhB)No *J4-+tr +&>+A# +A# ,T|,T|],T|,T|,T|,T|,ݲ8 3- *<Y. 5S. 5R.:[ /5pSC/8Fy: c/IB0[G'Ju0mc+% W (0;k1{=M`2 nBث20>n l20>n n20>n s2&߻Qv4= c7^k98OeUE8Ċ0~ (;#37 m=qw{=䳭O w >{;>8/ApGvBHdn BHdnBnP 3 (BEV4OK:} $Ef,bjJuy $K`o L^|EREL$ OVrROQnX TKy` U(#-VrΤ$"VBѓSaW"K W"R W"XݵX\˲Z7M[n\\^wC"K\_Y ]IwO]IwO_P~_ l܎}܎%>C m܎%>C ܎nPK ܏B s܏ A ܐs̷ܐ0zܑWܑWRܑRbaܑ]J4ܑXjs sܒM [7ܓ;w3N} \ܔ' ܕYYc4 sܕPV}@ܖU&^dܘƖӥܘ轫3ܚQa1 SܚQa1ܚQa1 ܚQa1 ܛ&4ܜөF ,#ܜcܝʼdܞ8) ܞܡwjܡ}6 ܡߟ{'ܡt|N ܡޙd0?ܢoRr 5 ܢ}# ܥHܦX)  ܧ9UfD ܨ=I 11Dܫ U;)ܭ:6vK#ܭ:6v \ܯd'=ܯܰC?ܳeز+ܳ~>'jܳ+Oц ܶb-8!ܶpu6U ܶ';[K ܺqȮ-ܻS7zQܻZ/ܼ"3(\Rܼ" l (ܼ" lYܼ" ljܽ][l ܽ26 ܾ>BܿЛGB ܿVa|Kʄ- W" ی`25n]R N"[ nY䱯nY䱯RnY䱯nY䱯nY䱯RK &J(oHzTȩ?}] c$)S;Zwme]  IQ?ʛjM;"G bΏ+6cdΏ+6cΏ+6cQΏ+6cΥ7' ϴbϴbώ`YNCJU ^ukFvҔB{9 ܁Z B\maw$:̮Kw$:̮7w$:̮"w$:̮ WaNQE E {`Tl,LQsLQq& ,Cq& (_&] /(bH -١A srϾn/Qy (8y*y3!A?ޢo" ٥[l][ IF^cIF^c 9S(|_9S(*59S( s9S( 9S(тt zdz!( zdz!Y zdz!Q 1I1 XΫ!u1udlv] LN*Wh'S 䳩&1a   +罒[t$罒[j罒[nW0v ڑ#(# ȵ`i9 V9)T fS S fS L2L >SWl (&Wls;Mmf gtU P7?SN& xN& x2bmO( X(ow'̢?P$%P$%:P$% yB( i ]& vlt NQ ` ` 2чf;чf; QJ  iSC B_ e4_ؘIwj5B0V^)5 Vlw?$]F -6nǡ#Z 7=D+}"t c}ѳ 4! 3xYQC4"fs6Q 6R6_wr7m=k 7m=kK :Mx9:tmc]<@9J=n1=n1Y>bc??jh ?b@3cIBMAIH <BMAIH mC-$#PC6h[CS$ץCS$ץCf?Dm'bRDވHxDވHR9DވH Gok H'U> Hk; HI:{? jJ/氨KL;~e Kub?MJϤM' Nu {- bO'hXpO!<TOKBP OTnZbP(> QCxQCxQ1@y cR%#uQR7L Szh KCSzh S׏gT.KiT.KisT_/OTtCI TtCI%Ud?sUrى jV[bLXB(/]?XnOX r Y ;dߔ|?eʣq_ 1f<>O&[fk;?gFS(XkgFS(X gyhQ<> &i>#x !ijrRkDgam lHչmmaB qNÅZԹ qNÅZԹ r[YlSs,#=t&r}k t7=ylStLuLЌtAS8 cu ƨg (v4( xIdx7A58 xrmnxe Wz.(Zz7wz7wz7w| }4t)~m@sZ A 1݁ !.t݂ѧ:݂ ۘ j݃51N ݃ʼnp6)݃ʼnp6 ݃ʼnp6݄,Y݄Pȵ݆^(݈'=3E݉$݊Hp݋0 ݋D+c7 ݋el݋Wz݋Wz ݋Wz ݋WzL ݋i1h<݋i1h<R݋#M݋y:"7 ݍ y]ݎ)=ܥ0OhݏVCXvݏ< S ݏ< Sݒ[Yos ݒ[Yos ݓEH $ݔzƻRݗiib? ݗuO)CKݘYjz!L ݙ>ݙP5ݙ?ݙXD ݛ}*ݝksF[ݝV9I ݝŤ^/ ݞsBR"Aݟ%&4ݟ% ݠjEݡiYC f ݡn%Ȼkݡn%Ȼݣ(N=Y ݣ C=ݥ8wx ݥ[Xݦl ݦt+dݦz9  ݧN-Nݨ?S ݩy ݺ@ٽi% ݺFJZ ݺ eݼ^DHKݼ^DH ݼ^DHݽT̾ ݽA銣'ݽA銣'R ݽÕ's|ݽ[ݽCZsvD¸Nd@yi?yi IJKg/=?P1KŬn|$SQKSQK Ӵ>ƕ#ȸ@ɂiďKɦsKC = i}bdj̯[ RT ;*vVt -28[h eB׽iNWRb>}K y]" r*'WF;JMtZҵs'? շ".7$8շ".7 v;;7 =#(FRe>$ jb4kD*?M a۸ҵ;)۸ҵ;);s =>^`n $ ݊\v;[= 0)C Doa|OKt!?DUߕْs[m2 ] 8d. Wԍ@+ pHqw PK`荵1 %~}BJ60_ JK>lI/{9 Z>7!  ?\.6/? ܐ Ath D>CBfDDR$F DR$F9E2gaPZE2gaPZsFiVb:B[FV^nG.u4 G\H,0?IEZ}Jz8+ JH7pJ8:ҰXJ8:ҰXL,TFvvM*1F MA+m8)O_OPd>f@ PK  Q܊% bTp2{CT‚ TV'jT3 YUx?Y , rZMX\a#AR\ة ] W]M s(J]m` r^ܖ1_#ZY aw bpDcb`RdZW%! Jd뙇1?Md뙇1 \f hhfdl $ hfdl ah˦TAh˦Tkܛ-n; eafs nI(ck[nI(c o) -pfn7Rr?s99!1LsNL]rI sW|p: s` R? s` R s'}9uNML ( uaҨu`!vVx$O1]xHַxhN@]{-币9|7is|; #|G;%J?}]@" }׾4 ހ5:rSހ8jrGL ނܧ'+ Nނܧ'+ dނ` ބFbc_Uބ^Ө`ކ\wR އWG އq-kވ`ںܪފ# #ތ32uKJތ32uލ~F ގ({0"ގ({0"ގ-bގk/МjޏN|ޏw(ZLޏ{d%{ޏ&Ϸސ)4A ސwcBYޑ? ޑ?tޒSܪ=ޔC7g[ޔCMrޔCMrtޔCMr ( ޔoo[dޔoo[ޖ~fU ޗb)b@|ޘZu.Uޙ{\ޚ~i ޛU\W ޜ2݆"7ޜuK]m; ޜ'}48 ޜ0RQ ,ޜ`{nޝɝ#ޞ8Q!\Hޟɥ >ޟɥkޟɥ|ޟR|ޠ1#ޢ4ۭtޢ4ۭ (ޢ4ۭj1ޢH%ޢH%ޣ~uޣ̪p\ޣI{ޤxY;#9ޤ߯Hޥ0Ĉiަ;sUU)%ަvE ަ~BhX sަّ?tާ s ާ;ީ8" (ީN<:ުwmxm` ^ު܁  ޫ!߷U ެAeĔSެ{2TެBE gެ݃}ެXE=ްݖdJ ޱ+6= ޲0Pӂj޲0Pӂ ,޳2R޳ o<t޳Ps޳Ps޴& ޵8i $޵vz<޵=޶=#޶P% ޶jOv޶W`@ -޶G8f8޶[ CK޹tk/ g ޺2o ޺Xz@޺bSX7 U޻)zHy޻fyoz?޽@޾H|N޾@maV{ jR{ j;9؎(;9؎tv\x%‰;T~ c©] wŰ'+űL ƇwKQ Qsʌwa 5̌8e!Q' vi) +2΍Omh άLάLdVzߡfdѡ^T Cd s'_ ((3j~ (3j~aJ :qUNoנ|lj i>ס٣Rס٣? 0ijjj L7 c(SOK jќ-MVw• CTF ,?DtlxW lxW.$ $dix ֵ Jم]@ #h2ssCu?~nWnd'PC-SrTF&8u (_T&Ũ dc`Wn+ Z.x xRSPSP e, 3{+=d4^[J<5 o/|nv`SM.?{~}} $ 7 "4@Bkxjˎj<?D=Gk_|ҵ| ݖU{ݖUYW< [h]kVvE)?i#0s3:9 ~g?s6Us6 \g< r;ݥfIP?W@ v\R~@Vnjl ^xa #|[& #R%]4?%]4 'Cx{ (!mS$)i- )OB{)OB{ ,i^ i -z: i-z: -b6<//2Fet4hšp 4hšps6Lj$0|s7C2k9*Ɩ;98Hh:w'=q =u%$L=u%3=u%j>rygt>)=aށt%?"l?"l?"lC?"l?"lDA,B GC^!w7KD-n+ \D7u Es1O] Es1OEti sF̻c5F`jFcžIaSaIX iJ־Y0tJa aKOp L9  N +LQKBN 2Ll zM5czhM5czKNsxm@@ aNZL8#O7ctPzS,w+F?UGYWHE.j=XfLXfYXfSY IRZ3$ 5Z3$ g\C:&\m$\mR\ ] Xs]pM[^&` f^`_:,@?bt`ԧa aMׅi b $0c5yD?cAB< c\;-c\; dA7z dA7z dZ~8 .esa"eC6g?h'ʤJhI Z]hI Z i~?"ILl na9=:?p!*?q<M\v re tn[t𤾑NupJZyu5vj vAN+ vAN+ \wΜ5^w+Oa9L ew+Oa9L w+Oa9LwQQ|eqwQQ|eqW x$Nx8h9EYxe4!Ssy+F.Nya$!KB$ya$!KPyQ yzgpQ{)a8{v_>{|x-{8|8̟|8̟R|v[(I߀xD1L߀mc ߂1uuH ߂1uuH߃)nȮ ߃DYQ߃ʢ*!b߅.J t ߅.J ߅=w$6K߅=w$6߆lR ߆%bPD ߆i!m/+߆i!m/N߇ 7%?߈7PDN߉8ˀS1RߋB7Uߍ)蔽OvߎWw ߏjEYߏ6qKjߏ6qK ߏ*Ni]ߒw?laߓ2 ߓPih aߓBa> ߓr} ߔr6sV<Q ߔxzV ;ߕJUEEߕJUE ߗ &ߗX\ߘTWm aߘKp7 ,ߘFQߘr7 ߚ+`ra?ߝE>?ߝYZߞr7N ]ߟ8Έ ߟt8QߠobeAߣ  ߣ10UߣVR| eߣVR|9ߣ_eߤ?'ߦҶ ߨX ~s ߩ ߩR{_@ ߪHV߫= ߫LFL߫LFP߫IhS QS ߫got߭.|ԙ !߭F߮Qw  ߮V߮V ߮V ߮WQ ߯"m=r߯%Iv` ߯0lC"S߯=/߯^ aJ߯^ q߯m|߰F_ e ߰F_ ߰[_߱ }'[߱2 bt߱2 b a߲.ň A߳ Q,߳ ߳ ߳ Kߵ ti`j ߵ{߶r, ߷5V߷ _1 ߷Kሀ߷I9o ߸9aH? ߸2tW߹HZ ߹2δ:  ߺdP&SߺdP&S߼*, q߼Ja߽x!߽SR ߾oq%=XgNQTu D! zu(v;z#n ڑ ^ # % i U&Dj w' Fov SF #   A6>Y =9oѧMn$ ?z86{m )ñ7 "-(K ,Jk.d2;Q2^~,yC -!cl-!cl-!cl-!clWT=D@ w}ϵ*N g f?lhD _a -ՃQF8XE^  Ld -J w !!F= "W#[ _Z$D t$N%N' &v&=Pp&ef Y(C]8)\d̺5) C*-Z]*-܅0%-*5 *t<+}0PNK+}0PN+\t+:qU+rB ,n@ \1;K 2R:v3()f  3()f 345}xR5 v15 v195Bڇ i5 5 6vs6fG7@E.s7}2l |27v87v8S7v87f ]'8GwDv 9@BXL;1ĸ=5> łKv>hWP>hWP>ݾ}8 ?W}@`bwb@?AJQZ Av -B41mTdBLEc9BVBL&DcϛjDlrdDoٓGFKwFW6.)FW6.GFy H8HUXJ0]Q KKx+'vKX LW"0.$NIeRH + NxS<hO0Q(KOGݞO8 P@,B - Pq QWJZ[ l Q+ |,R`l~ S5rÖY g WN@|? WN@|jW[k Wͮ3) ^[2[K趪\%OO ,\]P]!4t ^zڏ[ s` Cj)a۩ cQy ?c`5+sc̻/jd2 djDoVdjDoe{Revje{RevKe@pK. fta6t fv~Ig.t`hihxf ivŊj|NlBmYumAz3Kmh Wne nN tzS vXDwapb xGF2xım y)SzBՁ |IL}+z.?}pr i}pr ~ a~ibo~ ;aK,B;dB;dB;dB;dL?p0FF&%S` e} Z 1}x,QJ]jsX;Dm`Ӿ9 Cؑ s >-? F39o , 9o9L0 2PN|%/m!T m!T GJ2 9f׋ fl Y=7 rSh4 Sk bG r#[߰)qg% w *@cV *@cVR a]*aUaaG[ xO #nJ?nJ q):l \ b5 a;x9L^9O5sci1#% ɜtt#o;SH%zD ,S))RNAlLvQ n8>kro]9 ࠭J1 gjG&&P_v9#o? ?dt"c "QME/1K$=%0 %eܒ%eܒNVD ষ$TSਆs[ݚV਽ @ 5ਿB$S )\nN5ʛ6BSH଴߮3~ E D IBiD A(xOSyfC ௭UjW (௰a_ \௰a_AWLA)O] RG  ZcfZcfC#x l a "k(¯ ෣Yro'0 /cϿu /cϿusdzZ^!F#f]sL@$ uM^8=$:s@O  ӘgS ӘgL Әg.< =\ 瓷 瓷 瓷w.((x \ hdusÐ82Qğ|ZǶ "ź䱐 Ym=YmKYmc+JYk$g l } Tʅ` g(jEMY+9 +9 e8yXIήlS% 4m lSdkZ (SdkZh^ˠ ^ˠ Ϫl(={r#ӹZZS憲 Ԕ"jT6>IQ aօL& +֪G@ ֱQ bRm_$شi< j ٽЂ#LSȋ VS\=]#ezf;#ezf;`'Bp#P)YY c^spo tc ߊ ߖ%[Ʒ tƷ +& -6A \Y ^( hr dcܞ ,_ mGwZqe d?B"l?S辖?}f| r\S $!x VYѾz=˹ # EK5b T;S5Z:.)c{ !GפP'dYH98.> Ia) (R\7/t =  4a' H zw[ ?Z ?Z ?Z Nou v4KC4$RzslB  hx !5O¦Nd?g?:Im6:2AK"r> N" XN" U+ɸ3MSQoj ]ްS0R}Qp 9V\ !k dDp RDp S\reUҙ+Qj'3:)!6? "r@z$">i#@lN?#cZC #cZCK&3iT(6-U[a*xqg"S +A+[uc9.Y=M s/WI2$K~r2,VY2mӭD3ћKf3ћL 5x\!#5fx 6^70h?7C= 8OU96i~? :V8:W*KG ;2A;# ;P6 E]ftAA纳>jB-o2CJi48p F;I4  IHH IҰ hJhm9JڂwtKE LULULsٻvMÅhSO $yxO:)C3?PMC 8m jQ.=S1Q.=Q1ڲYQ_Fp ,.Q_Fp RUE{+TSD^T.фvUWǚ+?"UWǚ+V8eVW׮+ Wt>0 X`$aY~W\SS]Pgj]W{t^F= `}uow`}uo `}uo `]I.`]I.b=njcNS[f*efVE i lG>*iJFe j '^ka\/k,Yk,blisB lvO e0l>]=, !lI~lI~LlI~Vl8w`n "J?n`Ao o=& V= \ o\MiuJoOAf n p#kNs p< pⱯd q 6vrH ϢsN~#tNt7F t7F (tC|Z1w "e|. */w "e|. $w?_&yWh읇Zyv,XL yϝ sz}RZuz0z0 | zR)O |  ||d2U[ }1v~a9*iR~Rqb ,~ 9L  ݁32<Ԥ>dხ."/蹅 {0ᇡ%Kᇡ%ᇡ% ħdw9':HQH1懯y@1懯yRf csl>sl> ~ :* #݊-V 5n~SYEs}jᖂyLJ ;H^{៻ۗb ៻ۗt8(_d9xzvR?O@^ aᠾX{-\ϼk{-\ϼ8ᡙu+:| &NV Xű mE~?HD = j= sXAbzy᪘ #& ᫾ '|gDOdj ᬠ44/ ᭌCGﺈ3NaJ ᰄV=uGᰇGR tIgթs ?laᲀ_3X_MQ$+n/vᵁL'XS=n/LBu -|krJtr"V1~t_*e X67 `}Ui%@h& W8"8"Οx Οx , +a2R Dm?aկ vS"%r n ?a^gQ oZoTTN $ ] ^nj ]-Ѡ>XtAjij X'S] |/o  E ySXk* ySXt 2\ Bi : j7 P)$d % ;!g  J WD$ J W\"ơU:VChoN(!3 3Y$t  ^0Q!ҡoب!Ox[ mb/mb/_mb/#mb/*y/ *y/ ZIU^0B1qNdU4 !5vڟ uTd|4}c!N?b N!N?b !/b t!D˜(";CO#/&tL(9Z;!(Dyk (Dyk(Dyk(; /(;9*mvI,l+Ii{S+0r ,3$,dh /SfF 0@B  0R 1]b\ 2,h9X2,h (2kcajN233;33; 3¸~zt]3¸~z +3¸~z3¸~zs3)҈t 5S83|6q 6܍+7N`7( 8`&MW 8n,8n,s8 : D :/qN6 =G,%T<>09 r?3aee^ #?s @"`9T@PhD AcB!aCgD RܶD&HFG Eb'.EY_SF$7+GM"q GvjHRN ) (=HRN )I}_ IɟѻjIɟѻ?Jy?qz"] K#hBK_!K_!K#]LB,:{M.H$NMsbMDg MmKVwMrA aQIgQIg]QZy R}ig!$R-Ljku?R&}pS8 RbSp # TOgߦTd-fWU_o?UlFMW{0|W W Xȏt!( g Xȏt!( |&Xȏt!( Xȏt!(XTk \XTk (YhhZwJQjhZwJQD[LD uzD[|冉[\ [\7՗8];^ 69 a5﹎a5﹎a5﹎ah=a]6aV!rDa#q a`UybtXB b|8[cBd" >.Sfkd sfkd if_ gkgU:s ihhikJd i%u=mJjIrٹRj? cjq=zj$Jj$JkTU1j k @WlIga;lIgaRlIgaQm'_W YnF npS!fSn`bڱqoORqӽ?trQhrƩ/_Ys:~;t_JnRt۟qd~RtJuSE uSE w=t w1Qwr3T+;wr3T+;x?PcxJvi//xaqHT7y2ӡ#9 (iy2ӡ#9|by2ӡ#9h+y2ӡ#9s y2ӡ#9{i{ A0{i{ A 0{i{ A " {HKL{HKJ{HK ~~o `D a<R 2n RO`Nd⁌6kͦ U y@?⃀:  .# co;B i"tj$-&$-&D ∁ÄvN]9 bD ach $ach ,r⌎# ⌎#s H U; c8!$␮d ␵Nv␵NvKa~Zd xXHnR╋/*+&{s3m6T3m6 ◡4|`◡4|`T>$ mdO}Y蓵3E ⛐яߓs ,Z] \fPNSs,⟣E9 \⠑20`6⡉4 ⡊O;\⡍}⤦ǣ"St v3e ⫚W⬀{F ⬇ IT}n⮵e䆰QTC 5@]]NOrSPKۤ(KC ⹝L0?Q⹝L0 LJރ%dd~n 'Ƣ'Ƣ+zJP> Ya!YaYa YaSSI⿲d=⿻hj% (v+Z [Fu 29 dXQ PPO| aO| s `jl> l>l>HDRcƁ a>@nk ]Es 's_4L xZЊi/Rzgz їЧέT'd:TL ҿW _-08(i̸H> Rz9{_~_ֻfږtQs9+fU/m5TA fj`K9d  B? f3<)! HtS+6CsbD7B'ONDe͝DOc%et#DOc%e@qI #9@qI $tnG \Y˧ QB QB )+ )+K>^#69tQx& KϾGjs  SO$ 񑾒3ZDAGEE/hiGl#@_n# f e?YD !MN z >j8RI (q"NDî /gP ӧl )$־ g ~ eu: l P%Bj ,F(qVwm2iK v"@Q Ct?"P?"Psf,O Ѳ # I34Ypzt n{` u u nS-d}l/Gw@d EGt s\ك9ͬxR={ o E/t[:U ٧!Sy !e\~ #r|ye]#r|yH$uR!$51R %ie5P|% }&#źd(õuD(=GR(*}|; ',Y܀m \ ,C  /.z)/.z/k01'l2F14 Z=.S 57dR6RsjY6om #6WP7E4c35 E7E4c35 7W; 7%oV78j/* 8Sr(?9|aR9w;/)v ( ;M4jC;bD =[QP ?>3u+>Ho@ @3?gb@@q3 AFY?AFY Av5\Bqa5B<5dYPBnyo # E7(*6$F)]7NGȓL ,I?&/ IsIw ˉL1 n P[k QF  RpqSY]T(c?+T.HPUOzUUuX2 +W-pB Wk_FƾWȭy\DXXYW$MsY7R iY0XR Y0XRY[ ZWP9ZD:  ZͧObYZψ•?\-\C=]#P?]a []ʑ&dV^Oĺn [^I_mhxaaңR a2qN+ a2qN+ icV[%Zc;5c+?cz czmqtd D'?fWj l fh1Lhy+i[bjD1} kU:tk+~j l4(S N l[BG lcsA m&eɛC nA~;Q r'd tNa u yRvM0?G x$g|y~"}yfR{sr {sr m{Gf {) c }IY aS)EZ\ 》bU -“ $̶?;T:Y"+ヂ!~5#vFH0!ㆍL  BE4W@ R kBqX㇦[2, ;S2S=fB㉷8Z ㉷8ZSė(\~& 1 9G (KInJ jy6S㍩4* #㎯rp ㎻e n㎻e S㎻e ,L~Kr_: gQ'n5hFU~Jq0㓡EE 㔤{[tQ ͮiQRT.cv.㖊ҹ"|h%ի 0g-]-㘖I 㘖I 㘖I8[ʬ @fUoIfu 0s 0s $'12j'12t2M& 2\PzZ[㛷u!D %# v *?_@ 9?_@ V~8㟥 ੿ ~zd c Tor/5]*Tor/5 k@X AQ^c$ cI,?׀۟9Y)P d|gq‡/Y[[sLR:osme $me{n5-"z 㮻QD1. 㰮&;  ~Q# ʉRm XʉRm RKpu[{y^c*՞/xa)jxa) 㷲NR \ 㷲NRs㸌$LNXtыJ =az"=az" oj-4㹩 @G RMid`qKXSe|㾺G㿍QYV 㿍QYV㿍QYV㿍QYV㿍QYVQǛ,Ǜ,(Ǜ,02- /i ) - x{|sY ՕKtFh 6'R fjoW_h3L_h3RXCq S T'|W|HIf΄Y ?UTfߞ" c-[J[J[JL[J}C5㴣j_w_wXXQP1' q}+@e!o?Ї "tYYR !z ̩LC Cۡ2# ' 5]ZO87Y3{ ָoH?CUVsHKSw2 zAzڏk oG S?) \yݧdLEV`  Tm  :8 vyE 9DL$q "]"S[~M \ stJY+hz,|v$ct@(, XVÀ+3/ 5i*ʖSga=Rga=/>]a+  8)im، m ، mRd&ːZOfcƂ!_ 9Ƃ!_t Ƃ!_ ( ">&|M:NڭU t yDڈ"{ %D6t%lPe &s.8T{'E'`S~`'`S~'`S~'`S~'`S~(DkFuL +(c"7) 2J2*&xS *&xS- SE*R- SE*R-K -K R-p̕g -p̕g -p̕g -{-vTb.tG!.A.U k.. ..xs /W*Ms 0'/S 0LR1QS*Z42 4|p(94|p(4Nǵ4"&u> .4"&u> %4"&u>4"&u>:5$p' 65$p' 6ŨC6ŨC 8 ;}Բ $j=+W>PQ&>S- >eqӻ?D#`gS.??t@e|Q3 i@l飀C3]Dm}9pdDLS Fq`e[G^DO< $Gj I9J :9JƁxJ茄hy Lg] L@3(ZM  O2qF?y 2OUH#Os[sP;HRkwS,,"4Sb1@ aSD=TZ.OG \ U@( VTVVlK| VʌX%XpX sY9fTtY9fTY}P`Z ip [ Q \ps3+]ص*?%]ص*]:@yt]>hS ]>hY ]>h_7וaCCTC1buEcD+ ^ e/cY_r4 cY_r dlK&%~hnqhƤh;Q$^ h;Q$^ h:e?"$hp2=h̠7ki*YO iw߁,D jTl5n]] ~n]] ~n]zn]z$nǔKen` oݰZ1 pT1pStqU rcPrj sZ2 Rtv/ tzej u)Z nvD[%v*X6xUŜ3y;6ɛ ys  ymMyye0zTP~k {}f }S.䀑똃 [䀽g#<LѭZr,r,䃙T5٪"$;|D $;|D , :y | bS9KuE hXZ9YQ 䨣ɭϛPn.A #: : @Q{? GL # ҫ}[ @K7ePaER HΗkL$􃙫`? `rd:5U`j(,s9R?(,s9(,s9(,s9QUtΧMM i zVw#$䴬F{ 䵣ӱq[8PGM#Pb#%e ޼ +br a ;32ߙ W ?XL>DK F y)s;;KPG "P |LYMQ6vǒJj@RǒJj@$\_DkB\_Dt \_D*`{ -Ȗ췙Ȗ췙43Z $9luol9>*³OFqt 7{{+h}4M΄Cdοh[?οh[ ڊCK H- !ЙkZF?B%wbէ? - է??ў PHdEï&Ӣ)¬" @!Ez @!E9 \i %<R5 3x(w ;NYH 5H bg  $ڻ7BVCzx]Czx5=v6F}c ? 8xZ2&7 ,:  w  (1  (1 $IW l7J -ZU.[xJdN瞁Lb7=?}B52 }q T;vxRT;vxd8T;vxLQZmdApYdAp  2)ûB4)ûBR )ûB[i| \E  <ˁK<ˁC2_| ?V q1yb1ybQ>17| cD2OpQ ;_LU:r3jEOY  /vh nJG.e_Z ,3z }Z !~ʞ~ʞcwW: Jg aۄ ۄ%f J^jI0CW-c:>i Ŧ)S8,b0ޕFu+c<t G\& |/YȐ& > '[ ꭁ_ ꭁ_ 4$:=h CL E."  깹d|va0O8@?}b; nA$Ъ&RH Fҝ ]M/S? KD+` k \J44H}K 쟂|5dҩ [TVS Xc6 A A , Aj!ϐV"KT_"KTQ<"KT "KT#%2#%2#%2 #,aͨI#,aͨR #,aͨ #,aͨK#Ym!?9$*)mqC%:RD 4&ɋ R&c}#'FӘ j', i', (3;<t+ >hL,J.,SO$C,SO$,SO$,SO$,s0h.)KvKt.{R-Iv0K; 1-Hl 1-Hl2 5 2 53.zE 3.zE31 4t 4n 4n 4nh 4ns 5%o%k5%o%k7!/7!/ $8|F8OɓQ94 ; sƺ?B?#P_4?004U@ | @!\AA, B0{_]CO/ǁCO/ǁC࿾=RC࿾=FD) F"+J~H7e i KVy@KVyK<qK_P|HM 3N7fOA1IWOCʆ\ODžR Q8QXQح" jR @SQ6Q0SQ6%T' TcRT m9Urt sXQeXQeZMG[ ZMG[  [M%w[b1[b1[b1 \|5lK\|5lP\|5l]'u>M " ]~Mx ]~Mxd:^oSxDa > OSaYv?aCP aO1 b0@k b1BSd;RZsdM #f勇l< =gk[|&gk[|&Cgk[|&Qg,NFg,NFiG(lubNl{=E l{=ElRЛ ,\mh85\D n%ߠPqG<rRŖX? rBrrBrQ sW35 t ӯ?|tTHetY?tY u-szv v $w~] ix^F y6RRy6RRyN;2 zF{yu>{v }jL ~(~c ~3n?Z^~3n?Z3~3n?Z/ rL ʽ d@=r$償[兕gE iKg df~kRZ $/`5ws9 `5wsY? Vd xu4C.xu4 }O|=LJ劕pk?;ߖW&)GhDGhD匠b:M`. KK厚uy tZ%kZ%k呟gN kgFr 4h _zf,<Brb' r"]e"^ m~mI µ (µ µ 9ȋ;7O ]f  A~JIۨa3D A| "UeAP [)#s/@?5Qx?Y?埨 堩*C$q#D m[N _E1X? р̾ , $ 娧$c0N:1 yw-BQyw-BQ 宓id"ZA&C'ճcK m.? v W嵍2hYw2 #tIA帱7c"xEc 幯 LT$ALT$A 庇 x/ 0ka {Im^弑/4K = !Ef彖5彛`[KmM 忽(3 >x'kbV*vO‚SEK -8j%%˜۞wY mM  i =2ͫUڔ6SFc  bA#ݝKK ގ ޙ&/|ޙ&/ s~ÆtP}-tP}- tP}-|0[ t[CD pxkص. ۝7U ۝7U ]D @$9yNt 9yN bR?@~wj Zi % hHR0 [aT gK1eI 4cHdy 󺙱7Æ?! #===0ϩzM ,x,xQ bƮ0 ^ һPj0-% 2F@Y "K*>j"K*>j/xDU?? qRG%vN ZgBg'"ɋ@O.xs@O.xj@O.x  oS3D (!@ "=m[9#6K a#g,M%G(2 \'J'.u<'da(xY ϯ(D)0 )uj-*wXQ; -*l$[ +mqY++e\P7+e\P7-= ֐-d ڙ -P'.gu/n+h L/ؼ|y/ؼ|yY0Ch 1Y[ (1ewS2&a2|@6wQ.6Y7q') 9ޖSd:Ug:!W;*b=0kzZ =0kzE >.po >.po>V2@8B7q ?BOy?B:p B:p C? sDT4?Hsu a HІhѭMsl P~-QsEu] Q+aQW+YlR N RŋԿL SK7 S@_KT  U+:oRU/ZW^pDXɖD~XɖDOXɖD XɖDZS[) f [G\ 0!! \Dɢu ]Ɇ1w<^>8^Q_S4-V e_ _ ,``4 7Q `m8`m8`M arsb`pH- Hbc_Q~ UcVmZdYzs_ dqδB f, R g4ѳ8#h^Q- h^Q- dh^Q- h^Q- iarIiYaPk9Ph lGdY *lGdYjlI_(dm/`c` $mx#N|? m m mك^KS nLMG n-^CoT[/Zo[:V0p~)ݎkpUmR>p[1 q!D"$ s 7DYs~tO33gd. u)ߍ ux au2خkvGvȾz $vȾz y,q_~2$ \~HvE ~vit^-jF">djF">悞F&7B]Ҡ ]Ҡ H m$ Htdz慖] \慴I2| F>9 ,7_e a 7_ejEO^ \*r (XR$V5e $ wNwNKH55t)8C$掑Pb Ǟ'HQ.N <N <+|[ ]q }ݸt ( 摱v % ۪<t|ƻ/ n DZ%" kMa~I)ɦaS敵 ; ʆQ z\%.qR 1[M u?u?vz4}晱VGLH MJ_ 暡*H;hًL L[ 柃RKC8H$C8HC8H栉E$;桩P& 3桽lZ $ϋnȪ (KϋnȪ _ЩF o #棦D+椯H |i |R$ We/~P>: Ql ' i[U[[&=|CB'Õ} !# Mai殔Vԋ`qT氓,|" 氹[U[UjĈ汓lo?4bSCIv ղ=YI3%ƿs浵#湘pd{D湵nWF湶6>tsXK8 99:kzk {3m#Z?>3m#Ro};t&*!C y + Ot*OïL3 ^DPzD!E`хZ hŴ 0yD? F@sA\0fhe!Wg0ͽ.Aͽ.A'61 c '61 #rټ6+U=U[Ж' _iV<-0d} Oaչ 7Sõ aջ츕- %CM?p$ ע3 i^MQٷqAE"䶤*"䶤*%Yܕ,th=ZRkџNiqu'Hr HrU 7UvFoU!Qu 7v  <. <.G&8] \kY= j9^ #S~ w){lj[ BE i[.dBFG ,JN.,JN `Gv iWZsWZ i'1X'1R'1X'1]d#+C{ ae7 J~|CA/CAb]?7 { 8p  cV|~ cV|~ B;#-BL$0@hD)tri:pN|ɺXA6+L6+LX6+LKQ6+LtvkK͛e d a \| ա# \u qNP  J VE, m O& O& b:j b:jU b:j ־ , ?P ,cTVD0cTV+cTV Vb!F!r5Uj)OTs:XWo :XWo_PmLCLllETX QGs::u : l[2 t s9N3^ N3^ 9:pjGt^!tOK^!tOfsزzj!Y~u[~u[$ | ~&]0 wvtN!^l!^ !9!Q#+4C:#+4C#+4C #+4C$xJK$X"%|½ &'V6' g'UL'W7f#(Aɶ&Z(!p/r(!p/r+N j,X8L ,X8 ,Z/--J!--J--J--J --JK00W=΃0ilKj(0ilK0b38R3~A ( 3~A?4R4Z$ 7+P)H 7i_ 17ffmc8, FN80HcD :ycy a:ycy i:ڻaV ;x  lGR5GR5 aH@mMIsIOyNvINQJzWJv*Jv* Jv*J씅0L )6G#Lc M4 #O$1!;OWJ OklxO+H$ P+ZPl>?N QW|+n QϤKE $R.&R.& # R.& S-UN%N~ V[c? V*4_ WYWyWYWQWYWDWYWWYWKW~ϴF WД'jXc +:Xc +:D Yp\쎽\֟-t]!dF]4̸WDb]*^!j$]*^!s]*^! ^tWL 1^ ( _f _ǀq_ǀq`@10ۥQ`@10ۥaE.a"IJ bպCc6[>b e",e"gWͤ4gWͤ4gWͤ4Rgkf#?hnM $ h)#E ck|k=ʗkT $m]X(l mqпm/ m/ m/ Km/ Qm/ So_' p0JyqF"QqF"QQqGqW/r!+e \r.~||rVq irfNr{@s CDs+DRas ts+Rtf7u#tЍ Sv :y( ~GP ;&~9i.E*~YT3 -"mYǞ 災t-sDJ kDҟ7"Mލ 熞U.燧cI) e燧cI)爩Yn1Q$|ͣR牒oxQ 牒oxQ Ņ`&Ņ`Qs 狼~rM珃|sWj 瑂ϩ@N&CM~] h9瓫}) W1X ?ֵuֵu$ 疌~bpxz MIac瘌+nO|>s O|>j皃z/a? 皃z/a盝 UgHKv l瞘Ϝ`L ,~`A65p0Pwd:N (N \gjgjtxqiC 碤1 碤1@` z\ٜ]NNٜ]NaN 祋YR8(L EEҮnҮV ҮLҮ aFsGK]@ UHCOYbˋ?窭A;  7Nr 7NrLW/őx $W/őxv_H1q?˾ct@筿c|Y 箹f ^R 篽=D 簹ZU/簹Z#Hno3Njp1K "_ 紨rݬ//8O d"wv M`gC "綥T=(Kp "%? i%? %?V- d1Ed1Ez |pmz |pm z |pmwL9> B˵0s8E\6 aL^?L^ (2?*OŽG ǐsǾU; 랒VeQݵ ([Y, !2?il_Y̰Od̰Od`2R csMFOjL|Dacezњ}9YKӷ}\ բտlե# ն? | "1[ױ"H<  <0#Y~ڥڥ)j+EF;L/jdb&z ާ,fV0 aU?㕰4SA?澺9Ud'h 'h 1ɋU.! f'T ;>P;>5K,x0 i핣Ƚ $=:mfmQ/SH (SH żd T@k<P YPR۹3U?<xr;xr   (C@{ ץH? Q1VC yOB| g*. {!f™VFDll ]f-ޣ;d 3 ޣ;d tE k[`Qx> 2 ĝ b pҨ pҨ pҨ_2@  8 sBP VϿ+ ,VϿ+pY51R_;].Oo(@r] "SzfE cK^X [*  UvhJ0Y5v| F9m _Nxy@di9$$LtKtK "d~ t"d~ t "n #xX#xX$7ggN %“\ %|xa?%aY(R%Rtcd&=1?(\\A> )mѪj)؂/")ȳ_Y*eլ Q7*eլ D5*eլ _*eլ D+!9j,\1],:*B{,:*B{ ,['R:,ÔT? 05E߷d 0V" \06{ [06{?1'NU #1GCr a3iUs3rQi 5Zd47t\w 47t\wt 4{b4 pm #4 pm a4$2X[ 7j7A 8\@D R:Mt5Ab:T g;5 <;4k <*8<*8Y='-W@1ׂ S @ThL@ThL@ThL@ThL@ThLfCqrC DDVEBEBYFAo!| Gi02dGi0)HACP+HACP(HACPHګOHeYtJ4׻D JKz.L wJ!$ L27y MYicNB?~|Y O2yY O7Ri3} ! Sq3j Sq3jS1 T?U`Vyw*!Vw.KWQ,tX bxX~ XOY荟c Z> jS(Z V[\{/; -^2Ae_ZA, 2bGdqb"8 bSr× *c])L gd B d 7nfY[ f88yeZgfEgfEib|i i i iŖ j?ε kF l, t2 l=+oB l}(nnAYjoheo~LI]oI mo@v o@vSp6WTKqN qg4 D r nsrjn ru~.4er_ nr_ sz -tߗS4tߗS4wVfĔwQ#gJ! watQx xOzx.w y1U> \| u.|4E |o5 }l x">~K㶁H $ 6-)lt耿|esma 聐mKN聣B, b2T<'s肠`H-04(sP U^EJ{4xv腔B\ WЊ !io D+"膂$ 膠  膼38rFL9 |ʔBڐm  } /苉%r %LIfړ) \Fg (\Fgt\FgF\Fg \Fg 莆o h莆o 莆o 莵d f-r-菋GNM?S .oV萍B 萍B?萨g>HRZ [H5v}[H5v%tHx I薧]Ow{O $߼10=%"[i* $[i* ˓ctKg9"((蛎5'u|k 'V[7URGH 蠉SkxAT? }ΘMV[ {}rp4}rp4褢4bi褹9q?V!@UCV$豋L>$BWgP O&\nJ趯Jt 趯JtZ #(,k/KyJ*D軑@C0軑@C0軑@C0S軑@C0軑@C0輗QP2輥l+)bk_{8u c _{8u  l~ !R)u,դ |eAvuj x  Rr cNop48T-ȞZ 5q6q6R̘o -T?Y.˕C-{PlAe }mVE ` UO i ! ҒM{;tx| F.s $ w !ךx#؅z&k $؅z&knB m ZAƑ e ~_sߟr ?wz $(T8POswI_B3S9/li= n 8 6. j i9j i9 7 SJT 9T (h:@ *! i*!j*! W!]x  6 emYWҐ|j_=_= nm$} Y3qE w4C (8nR`\ob?-`\obs 䪁`S3jEr01Kq_f#9 \')- !_|{_|R _| _| rvx-+#o t +#o t <+#o t +#o t yɗ$yɗ#$KpF>$Pi7 %˨ Ehe%˨ Eb %f CqR&7| &w:hN& (t%] )wXg)phC*7*7,J#,J#b-A -aU'Z -aU'Z ,-aU'Z -aU'Z-4.x3rt.x3r..x3r/Yz aN2& c5.ҐQ5;Bv6P@#6P@ 6R&@"81Ƞ;8Á$ 8 \9Rtk 9'SC:^xII" :mחx2:r;01N< >8I]>7 ,@@.Iu @`:rRAT$ZA^-/ l)Bk7k]]_ Bk7k]]D: [DB(-UF̢-t GK{H~z?$J$]K/k7yL0LJZMWڨvMPp@NP鋉 jO&rϹP%w, P%w,9Pe*Ų#R\RXsR[W2 , Rxqh[ SKir (TI2D)U@ VfbaHVy8B eYYf \֚ یX ]Mf ]"o%]VU a]v^އ `sF[ a>. aR-`afs|b bkb bt cY,8 cύ!khd=ȏw dD=-dD=dD=ebmAo0f ʃ1Nf2p_ f!bh <( h))}!S3h^* i Z( kj'kjmczm^_nk( o/aaooÚ8p7nsrs_Ksrs_fsrs_Nsrs_sqPft}GQUuÍ u~Ev S+|/v4 xQPZxVJ r y HyvC>k yvC>k z̲fYz̲f#z̲fz̲f {1 b {r( {At]({(-X ${(-X {(-X{(-X {(-X{(-X{(-X ,}< ,~u"v #d#dV|)bL $U@ 郻[\p$ 2pz [pz (VD_] 釹 oMlh KfY# {UQ#@++K@++D `?$ET&l "bI{:Y׈K 6ݬA 6ݬAZe6ݬA6ݬAa闆iXg bCᵼs3b4t阜R ,qO[= Y\/h 陱r  iŻ!K Ż!Q y0 fĢ3GɱE3GɱR3Gɱ鞤[`c9h 4 M 4 ' 4 !z%"NNgK 7 D jc}b AtSHRM$' '@u `ěPBT 4pS4pX %knFN * 1 ? ? ɢ] PP CuY[N j(WU_eq d!GB} ]= a_g= .~TU.~T8ɾDPl,hD ГA )WRea o&>%pcՓ Ը t7Ը 8Ը *l 78 i k>Zd Q ۄ a QM> ,®d&ޅ֥LO}-rXBR2ˇᫎy4th\ qq_V;KsZAՏAf VN6 炓TS -:$}L3}}r#m(Kwu%dwu%j3|-DA i)xx!vn , N1+ "? |T0)Eѩ s7@o%\RԨČŰ9G3uFQ ֪Ʋ0F_jΒ yΈ$yΈyΈ8HM`8HM`xK)0UW`uތuތ ܅Bb83bA2A[U nUtU, 4d mR ZH Aoh?Ju [" ɄU} $e , | ,  "v| i "v|  "v|? "v|  "v|  k'-I|-I|!ľY8crt{9]70  }F  VDcxRn3(({ lL|R1 i}u֣]3 g/udt䚍>곯<;jvȄkML  Tg K+Tg b!  "~a "~a "~a FD;f+D i!ӷ( 4 !J0 !7sMq "'#jz "+10 "$}"t??*#t#'2ːjA#+MK#+M%H|%}yt}&V02c>02c>02c>Y0t~g0 m1lbWR2']1CR $2[ : 4_q x 4*= 5r\ ,6= 7 M 7 M e7j 7j9|o\K;kx<'x < >Y;0N?,)`?LW7?iMKK?~@Y @?~ҌJ?@YCC}qV C}qVE-۷* F!SʐdFk%e aIN IN J&]o J J3[ߙs Jȸ2nKB{WYK&۟K K&۟ Mz= MP aNqj; OɨOɨ' QNˇQPwQA Q U)rRw SFg/TKz#K " TKz#K U{hUpaN WZ3Z iWZ3Z WZ3Z WZ3Z WZ3Z WZ3Z aWZ3Z ,YSކ?YZ [/ c\T5иs^x!< _;Jj_1a `[`|` O\ e\e tИe辡O?f: %Zi9k[i]clRU lc :mG[o7p5#q7̤ş iq;S 0r~ 1t, ur~&Ov BwgR+)[ wuwwsxsZyd34HyRx/z^-. e{o+8w|i)E|i):|i)'|i) |C*L`|C*L`~۩ޞwt~kAڻ) sYꃱ(L?%ꃱ(L i:V t9x)fDx@ꈳA`! ꊺU>_! ljwgMr e@J- ipEd} pEd}Z pՌY-yS7)ca6z \ Ϡ(~>_uVx69ꑙ{[ꑙ{[ \M8 cꗒ:C<jjZ꜄'R3f 8 M=c9 iR R?}C ,d*!6ꥠe $;Nt/K (y+ FJZ#wꯥ)R p 3`LG $%`LG (h\nu AY 겂R= & Ƌhr(cm bC 9ZAR aU()U("ӓ++{H 귴(깗.66*2L8g껇  ' g7 !AE$?l{C9 __p (__p __p .F|cS ( Z vj ?aM]v{;G:ꄆsL R/ $ WyC aɊE|i $IvlY)]͕J~ 2=R - ‰Y*hO&ϒGt $Ӌ`j Ӌ`j Ӌ`j1 ? (Ԯ kwZa֓uRؐ! ,׌{+ @G(CIou ڍ&@ڍ&@ ,ڍ&@ ,` Gq It$d p*ޝ·$b⻌u 3  ( Kx< \߲*70{ %!x cT  sJ~f>N1s;>N1 ^>N1 n^ t #bcc kW mG\sXAt 䀝 井i a ȫq q բ;B :ԋ. =>h jkTc^Ҕ 3 CiSRCiS$CiSa  + TR  D ;#gUR\ g)"s { HX0 6e =.% 'hNoJtHp2KRНir%[ *; LXbL.% s43A3At et!!et!et! dP*SJn c Ͷ0vPg 5y*x)L)n4( 5gBnO= ~'j[A Cbs 'TN uLj d  PЖ | =Guve_ ULa &D DGjzczc(9(;Ԫ2t8 $ Ԫ2t8 Ԫ2t8 Ԫ2t8 Ԫ2t8 ir "f%宑! xwZx; mlڳ dnu-*ԥ` ιZ[+63%$s""4P?wIws(t` Wo"-`{?"Ο׹y"ػM"ػM"l "l]Y ##\m#c`ҧ #Wբ $QRJ 'S (fU (fU (fU )U4)&U? )Wj*0Uq*n$ *ڂQE-;E?V-RY.bܬ 0DRkF0d 20 s!1 " j2,os+2>>12&!)3J+ds3 5紙S 4h9b54ط8Djz!1 8b8J<TH8b8J<8z4f 9OLM;9e;nA<=^ ,>a|'> } ?cSS 6?Z_b!@iyʕaA$+ A5Fd AYT-Bd'o% BwmCf DD (DY\Dk-HIRwhI3ňJO{Jr-? J{=>9 Kx9ϧ;Kx9ϧY Kx9ϧLEb6 LEb6-LEb6&La,/La,M敱/O/ Osr ) Oy?OyP= PNdjPNd)RnҶ(_NR[)" ESq*hpSq*hW_5 YՂ S [u~s\X`2\X` ]X¥W i]G$ ^_f a gya R b֌5cN  cf 9cf 9 cw ( cw?c&dg{K g|7$[htZ ^hn9hw)jZ-RkjZ-R jZ-RYjZ-Rbj0  j0 jP lqNmFJ m"otJKoN RboS|W5 p$-; qvm1d4qvm13raX raX raX s֧#H[ sAOpY tE;;Nu).kuXs vȐ+ wn9 x' /[xF-yH .C?C{qY}v}1O \}1Oj6Y k9-k9- JW8 zݥrw$냳: b i9넘@ J0MY( UQcVf Z+/sէ"? _5hNzh\ ^sRr 6֓O|mey늟*?M닭5F \'c瑗o <f\d ; ;6Shj = a CQRWC3 `J?W"i k#7b \XAR |뙲xdߖi@UzN?#& #&Y띪o#tYrKJ[ s <RC=  Iԏl Iԏl 렏LJa?X9b)CQ`u"  (H RGUJ02D~C\릻M75SͲB맏7 먀F 먀FBNu +.5vz몴v묵5%n@(d=)L ,ˈktο )i 2}W}WW!#8gy? gy ++C볹Ec볻EvJ !TIC뵋X"} $붅7,I: 붅7,I:붖 q,4D{YvN7 HY+D HY+%g 븒r (븒rslvVMc(VMc(S@e^: &)뾤lK 뿐 kX 뿐 kX8뿖PەCfFS% lL N $ϋ|BMaŦ;&'un&H{VV \  \ m͵?@P.A M|J M_'~]N R̮9gaH -ywNQ"2stx}R/7p(n . cxcx nH3 bN# ԆuI k$H[5?Q?9h֨iފ2 ފ2K؏ '{k؟Oݎ л. ({q}y ڇ#X`ۓǜ,[ b܇K ܠle$ܠleٗ ^%|F ފ$5Qފ$5ފ$5ߡJ& XMl-XMl(w{_!H ,{_!H $p1y[gseY[gse 0VJ*& $uo yQ[ΘM a&URȸYX (aZ_RD9Ea| LD/ >F+m sx3E/ק  *bКMvD~+5yD1*?.\YPXaBv~jyS_f %Yh@_osngɄVH 6 ( G@+!Y5Y !/Y"EwR"EwX "gFR#QO z#R#khR#kh$UqC %6Y&\ '+1 a'}P$(40nrY*?** * s]2l?F. 2v!/Fs2v!/F3_<]G 3_<]G?63Y= 4]f؅ 4u{eN 5@{ y j5;) s 6]of#7'\ 8?W%28Hs*9$E{_ 9$E{_9'ϋ*9'ϋ (:7)<5e R=<;^ ,=<;^ ( =>> c> & J?n?:[@OEz eAMG A| (Bŭ' CjID/) DD} D9ܱDEU FrR{G}#GeIOHwMn@gNH0U NJg2sJϻΩ K겓U Ln=M/?N2`@#P-ah P~KOs)P~KO i R | $$R4JL Rj.n0Rp&{R[vR[v RH. S+pRS qo7$!T=}gT=}YU fRUU VJj4 WS#YX,2 Y]׉qbYVzZcQG\ \ ]N^7_%DaMAa]gUc/O eH ?*m-fI0 fI0 ( ffhNhvXLkl&%mE'mD;w mrYRncY~ n o78+ pPn qZ1qe3 LuƲs6w.C+Fw.C+Fw.C+FR{O|]=v}>:RM  nC&c#j m_sN-/q   &~G%{DU5 `3X#}^?LW$n iVtiVkr|bPr|b *DI1 /7|q[>1oe=Jt,]/#:vc i"z 5iP+u V}UO?Ja_@W`ԷԷԷw[25dz}DJ{s >S >옙ЄJl̟Ll̟ li@ >y}Z |] 윲GR/ \qj쟒JuN@}UR pes S/$ZY 쥇k(r gc Le*;d|oP_$I^bve= v:YJb Jb ^Fw {쭇O<# $ƞH &$|Y&15? gMZ4&? w%w쵥g<sY쵥g<sYi^[l]4ʔr}h(=5 "?C`د_ 컷 /) W>T x#CYx#.x#Q[^C;[^C?[^C ;™>gK󐣣ŕ1$ŕ1DƊd[OƮɦr# ɦrɦrdtI`tI`RFo ( w)\ 5Ag8 0CkS =b4T&Y , ͑mCcH_ cH_ 㴰'㴰' 㴰' $㴰' J(RxRxZRx ѹ~WiYһe @C OR7ԲxNABFĻռĘP ռĘPZQU2 h S $ ״5"2̛܋6.'"#?M)àޞ i%@-6?%@-6 ߰f߽~oDqD&q Y8NcNa @"8/MǍ)bI\ p@"9w|^7)lI $lI _:1a|ba!<7ke<7keA5 (fm$8氱I/ $>+TJ|;d4 K8M uWJp =\ $\ hL 횗}j) a DBd 6DBd83DBd DBd DBd mX:ۉ ( siOADOAӷD  | | *HWk^`7e[ h8t< C,DTю8lj{2~ lj{2~ \nJ+E mmjm eN_.t&$9yv#vAk, L([O.1=h .1=sj31/? k:%1 i K.v"{}~ N ۏ:OV c d@ QKA  I4S ndP 3 3O 3V J  4|V 30RqUkTmF! Lr:O[2m&5wU!vN)R$)g?o6C4OU, ( g:$s )Q9| ԂvT5 ԂvT5jKSfRA@S  Uz$E+ c OQXh  vm !U " DZ_#{c%Wz5(l̗U ) ͗,U 2)eW_v)u :)u :])p(&*rXzD+B_ $,x˘- -j-v.%c3xd.Drj;1w?,E S2n#ƊD2g5*bq i5>U5>UR5>U62j[6k 8} 8O5 95( 9hN3{ 9dګG 9ӎqyR <A hS<A ha<Ƚhi BĮaBĮTC' Cq݇x $TCq݇x DuWVD}t= EIKEJ$pEsP뤮HpB82I%usIG ALIG ALJZ,LJZ,JZ,J8Zy} Kx MC$' N dh NT8#NgB O,L^)lO,L^;O,L^%OsN P @ P%TkK2 Q]P:URhmR R힥DbR힥DbU |_WUAf< XGMX`J*X~t?'X~t iY!{o֪BY"kn ( Z;]* [!V[QT\#_ /nt:`ӄA}YaX bM_"bM_duf Gd?R'd?RtegveMs gwPg:hS h`Ai=ERi_>'is<jkw@% kt~Әtl93lŅ1lŅ1m^#vP o Π?pR/pBbq@uSJ(4ulvu vǪkrRvoPy voPyw$ x`)Z>` )Kg gc 956)p7! xtzTccm'[ux]s "VJH?퉌=J6B sCbs ^ s ^ ƃ\.?C퍉*Ay-~y-~KTy6 Ty6 e\~ i=퐙hH$? % %%? ?]u̿Dt| Ǽ#[Y 7( OT p1 <\O홚Zqs NFb6C 6`>:'6`>[ #훧џ# $흜~ \힅w l  ѳ4^?   c+:ʇqP:lR( K&}:K&}:sI:,I:,jn P]ZLI E4>.? [@# 5:}Z[ WF"Lмd}Jk_prn_prnH?>Vt/M1tt/M1k(߲z߲zK. `b&my (_( ( ~_ c_:*=K IhK I2O-YRX 5 ϯ_ 7%f+CþRþ VKrLo ?=;Yq) $fBfRƪ'A *(3*s?K :ǠM=a/?i jaq-"r;&~W cIkb ̺@8NM`<кϺzqmb6?a"[і6+85gi ^Y 31wX Si#Yk+ljW[A, W(jF+j B@قxB>+ٍ r; ٫?J |ڟi+ڶ٠"Pv mw^[0|~$w^[0|~@Zd )JO "Yi ^݅>69݅>69 K@xt9ޮ"qY ޶~klD޶~klҹE 8 2z(0q)RُV& ㈊}< ac㈊}<㎙Kzv{ۆ5Z:ot*~禘A r 禘A:P xPGTJY4Y% bH&uvs [ 썮fc #Ӳ" r[=*Q $: ($:: $: [215 ]av av ?r$vO|$,y8| ߄#iRɉkV ɉk!Bg|58 [ 9@;9@R|*i7p?7D7Ǽ$6C{ -@Sd ("G# 4L'23tY ٸv9^ ?'# o - az  az s az K] $PA . Q&8 Q&8  9N.d  9N.d R Mti|*Rz{S=ghS S n 8$S1d/-lOsh<*R,ΑE?w ,,ΑE?w a.'<sC 쏹u !Bj Pd]3~ n z( # _ϭ_ϭZL*L*;Y 2[n ^!aDls!ۺ7i<"ɶ "# /] "# /]j"# /] # 0c3^ # 0c3^#D܊ #ԥv|'%ujo%u%u&$K'o\P 'q ('q +1B7c"+R5<+R5<,N ,c"8Y9,c"8%,hs[-kV7;-|Yb  /&| /=d i/ӝZ0[0(~ѩʦ?1 ~y$ 2rD3#'ՋS4֪Qzt4֪Qzb4֪Qz 5^DD 5OT?634 6׿uP71',d7>+$8Rm9Rgh;YkӔ<#a̋R-> X䤈?>f U ?V@@ @d%s*M@d%s*@³9(B 2 8jBδ&CIXvDJ|D֟ELDRAelEJb [F/EcF2RמGa? H֐H|~[I:4I(3ZJZU&q K!(:K׊9@ vK׊9@ KqOA : Lg\)Mٙx!Mٙx OihrUPTz[RUѱ\?Sfl  UTZU?U[&V$W~`"[W<J X@ $ X_@ Z&[Wj[#s\D' b]J>lj^"_%UHs_?e _߭_B+&K_}? aDCDaװb)$6S?bKLdmC c n/}c(μ\? fR4fR4GfR44fR4%fR4ghs (hmc9hͷLsik o ik o ki/Ё iD*)j vk6ڐ k,ѪQ nb#%Sp>?*p>?*pk-r; ms۾? sM,?t5xm t8BuÔ u'Gux8lx&?Dyô%gy_ry4.]y(HTz2 l zh {}S@d|z!4|z!4L}|J3[D}JH Pvy@bt o{? 69Jt < lo(Sf`R l[{t l[{ )@3|BS29 ?kYzWE "9 !AjCRw`p5SA–zB y] ]`/ ]`/]`/e`?[ 8y]N REp5 gL mt[1 t[1jIg 38 ;5~>Oj }}`G4 ɻ YR}Y -( -( hhth )[X pЭK5NF֦jЮ;HaFS ʽ%D6 ((&I (&ILa  ]@   i0Qah85/Ush85/U al#vՇ"TӰ 3> i!+ # ~m )? ~m ) i &7 F iJV`R2V;Ll[Bs} #l[Bs} £y=si YR aܩH 8Rȃ**nȃ**nQȃ**nJiɅ Ʌ ɣfN =*z *z?'n_+d̡O 8UXuDBu%#Vg b#Vg h)}  NE&Ki|Ki,5R5 /[߸t߻; IdKB 9 {pj0SЏ6j 䩦s~$䩦s~ GY <#E-k7E-k n)崖'Kv)mM   `NY 诊7iXs  N% xCK?G#*|#* Uy% |% {/XG`R\(>Z wdo`s_o`s_.k1W>=hqO:*&.v*&.vS*&.vRXBWR } UPŕAU  G,@8K R 6  6s 6 ( . .Y س EbNNhVA, {*^$$l_g vt8*)0m/ ,8E~ k ߘpOKIo%#rm.? aR.%z z 5K %I 'p: yZprpr y  F',? 3L\cs!tʙ "#F.R $ "x]"y.?#]"|}1#翺d#X3;0?#+n#V%L$W0j_b c &F* '_|Pw -(~PW(~PW($D(ta g)J)m,i+m+{o M ,NNNaf, zhk,0/F4 /"Y 0 ye!b 0 ye!bs0#X, "1QX23j 2)4p?p^+ a 5[ ɣ9 5[ ɣ9t5ʳ6ҏQ 73fs8s7( b 8cj{9 Bkj7;7T; \y8L>%;v>*?nז>ߍR?&"p`?Pdގ?ƙ8IBEgBC ~K?tCJH@WDeUj5 yUj5 ykUj5 y U'M -U9K WaW;$XBH}qZYB ZݲC [ (\:& g \m}R, \m}R, ]Jn ] iU>I]YzW ]%^:l[K`^:l[_>Pǫ cCTUR d jf~d jf~Rd jf~e8u]eZ\>eZ\L eZ\ fx0gvhbtY^hJamh,U.h5ih5ii1]H?iR5s j,"jJ:?J: (3<a MİOa=+"L=+"$=+"n#=3N' 陵JE; فm fT  *K5 Q.=2j% ؚ #ﭗȎo  )Oa"wﯬ}P 4`?_ 2ﰭCIaﰺdEWT V WX o\0MjjNQHQH e&Ws&WY~9a.Qﻢ8ѫx[ fws 3Y)iÿcR ġ"-Cġ"-CŅsŋx[`Hz^RƯ\A ? BŠOt b='ɂ5- *s ˀ,vdp t˳T 6}R?.]. HAM|HAM VMS>|_f`d awD) awD)hջ>:؋:؋kNKkNKkNKKfBspͤ wr ڿQ ڿQ8iZ&稸?6Pws5RIcIܴbCh|44)rqݼwly{jtjt NNONN DFɚN eWd'a#sxrww6' Ѥ=~'Hta \UQ \Q Q y, d=1Njػ wKw AF1 C *TY `G<<ۮk"a>, LO 1dh[ (yU5H;L H;L?Fc!nh1 L(U jŗ^ Q5BHr.]NY̨ks gOKw^OKwOKwOKwPY-  .'K}bZ #ϰ2-ϰ2 bЌedKH`)')' \ ̟ o/[8 A  A # ْ- qa N Pys Y >D} >D} ,G CMZ2R"U.6  B;)sׅ$R?+&ވ%'Nh (+`))a[)^J[)~<),3SX)"Z*3G$!*D U +(RL ,0e ,0e,0e -s.M "/0{}" $?Uޏ]?' ?{vAv d&>ve+GߓL e+Gߓg7hg i7Yg ic|icic jL0j㍾ 1-k$8$kP(kRkZl l Ɍm{ o0o?}ʿoW%ZNo 03 p óhe ( p óhe?q9mԝq9mԝqf+rԒ sI|p sI|p $sG tbrv:?8ad1w*|x)byz:İ y> i}X5iD ~lŸ%  ~~d~~#!a$[ OYW##_ a _ _ \ Bn  Bn u/4E^64E^6OOk (;!Y=HZ)!Յ*'aH Պ?N ,1^b9vu'.6YNzXRvnC[3 <%3<%3O<%38`SH𛩖0Еt( Ɂ nvD=S?&1dv  a %I ()VK_q (K_q K_qt,vi;mh𪱽R =3} ,=3}ss#%" 4%YY4, Κ{ez\٥Z٥\H?\H 𮨨\v_b \v_b R\v_b \v_b Q0 z^7LW[  6 V[+K|Nl . S, 36 #u?wMZ4*X*0o t\ W f<#t7 # QIklSX ij".R 6~ ВTВTf*`wabmb ^9m!^mmB:dpmJL(-V؁M0\%VNʂ.PU$ ]&]&j˒pX> Yu\P ̒kt]~ ͧ2j* +3\R΋CT $9"I SŁyy{Բ 8sќrVҖ_#l:Җ_#l:y%,%\UoK; K; ΤGEn )mrS {6q ٣! ~?{( W9r=? @ hs?$:ߣtZ9/@R19/@K`c;`c ,No 49* Ǝ4 2@RƎ4 2@N♦ql" ㄚ)SAㄚ)X(a"X(a 'ܴ #)(#]!#)(#]YMJݏ2ȫb2ȫbLsS(W1,ɠK7,2m7,2mTmD BgnV ,_:;c_?ָ{?ָ{Q Md`e 1xDD!qY"qY""nf]|?w8])d])L1= 9*֞9Cdy!dD̍׹ a , Mx8七FVZNňu + + <'] \yC} W ꧇S15 !sl2slx*TZد iZի(p2Q-X: V{) pZ<= a'_,#Q !WX/vY }M4aU QhkwY lN߉9 D "RD$:?c-[Q .pFR z, 7%4R nzf nz eBeZ" #/S+?#/S+ a#{x[9#O@#O@ $ u $ u $\"B$d,li $pSs$pS ,$Ȅ ?,R $ul(U' (U' s)rW *kI + XM,)ԑ,)ԑ ,)ԑ-ܢqt .IAs0Ir Y 1knR 1U2L=;d3Yl LB3&b -4AÈ53s63a66bo$]9 E 9 E:9xuR 9xuRt9@k:g ;d\ $;d\j;d\;d\;d\ ;d\ ,;·Y#U}1>=5}K>31I>31I?<2A8(7fA` B 'N, B隳lSB隳lC)MjhtC)Mjh7C)MjhsD2 wDKҕ|?`Eb|Eכ.F ,HSP H=N6INy˶kKs KsKދf LMxkۥOĠ'@?OĠ'@ P @0<Q]R90^ Rq.1m%R^+fS'a4EXS T,^ TV!L'aU.51UeU.51U.51ZU.51W\vXW/! gXRB#YRLuYAAҔp ?YO@D0YO@# Y|+YϹ [tB [t9]6 \m ]2\B];Z@Z]|+PcY^Z-0 _9@e_9@e`~`cb,( arLCcg/29td\S= :dVF e[?2fg{rtfg{r sgVJ4?iZ2h(jM* ҒgvjB(%_jB(%djB(%kX.ijmUeys m׃*?n"4HpMqʧp/\q}qŎ~ sg1 sO +_tet+=u,wQut% $ v|mo$w4Oex+ ?x+ sQy-!> sy-!>zGW ez%U$ d|~GP ~E{{{r?񀬟ý  ̆R ̆C[s[[| [ [ bj" =|bL _.F_.!,O!,O [A>= eHU-KMO]f:j~L j~LhG<ahG< ([ uus uus] `W#e?w>ml$:w>ml$3Y g?-|ΩL x2dm/>XU Ċ L稆$7u ֊y%7E : 4 4#=  XY\JWSJWSJWSMQa >NR} ]%m $>X%S#ډ$HHu?uv09͉b9͉b? b/{ &e&^tZ qipj qipb" [$Nh݆_wf IDN1 I 񩩤?%Γs9 ΓsF|aL2P jcCj\ c9f"cd _XGX jX y Ex(pA:í?{22T]px2 y֞(t-{.tW6.#񵈌@Ὣ3[\N DEY 0dVd dVɻAqW =h= c1 a%G[ %G[ iFq}ħEHOQsį@ [cQyV Ə/buƏ/buǶN۬k0RN8q9 u$ Qu$ FdITFdITt t| u9 a-u9 ˃7 c$`< ͮ4| $;<'΅=Bhι~Ij$ZkZk '#уJbZM (bZMbZM:@DjVbm g Y?@B֣Y y@֣Y y@MٙV : آB']ت V-+ nت V-+ &VfŨ]S VfŨ] ڡǩIqICjqIC9+1dzwNC ȦR$' h $' 6z  v SDyB 夙b`?/s2fť: p0q?C@[\ڳI*Y3tY3 ֱ_kֱ_sC0s;a&ѧwF,+# 쀼,J쀼,J;*p #1 ?mz\sf sf sff ;aH=l=lz%?\e ִDp ִDpִDpVt RkY RkY|ӎ'k[3t[]Ggh,yh C\,o {r+ "kllu1fYsr?¤K@{(B4''u4oі{.u4oі{SΦ,Vf*s0S8ջ `d*@ =vX+F[4qr[.<@n +bR !2;-S r;: c \ +{&9 †Ws 4]k m%;&aIP9s/W *Db̶ީD +vx$ p|3B p`b\I?E )ʙ&Vay+ RÎ~A sv4_ ]$>t vm~bo #R,pL ݂ ,Ht =W I9VCI9VC?)"l?"l "?ckj""zQ "լEN d "]/ #qB$rP$rP'z:L'z:'z:'z:'0=j(N*[ E -M2-M2/huOa /VDS/VDS]0U`@0`hy0x+q0C_S0ȧ^1`NeX 4$6:r >6XU(A6W 9BG_2E (:#) &#:6H<5B<5B<: R= (3T=+Q>B>Lx >Lxs>Lx i >Lx \ >$k ?=&-J?򣨅?j6K9?j6ANc AIQ%$:Bdct BdcCIndDXD aEi kEoNl G|hq HnWHC?PJ/2v J7MKr;Lx5"?O.UOI,TOZ; OZ;O{ƁP #QTkr#Q.%,%HQmy7=tRb=pRPRP RPT$e:@zTfvTUdKU0&ug V`y $V`y V2 XQ: XQtX0tYZLZZB; s[vd= [C;]H8'`f] ^z~8 _HI _3LN}Y _P& Lb9 pbL57NcC uRd U]djځKe׿* U e;84MDe;84M$f*V*fudi݈Zism<x zxǏdx5(c z)?{?{nj6 {ཀȧm?{w# |WDL~eux~4t~\4㢨J㢨 Dfb n 'St7 Hg솹2r3zU @,SX  X  Hdt RAN$So=]T) I)%򊡶5rr%ZmgL.r X GRP? QVZQDY5;rvu (&C &C*9w̡ +=QK , 򙿳U K ,T't򝦼x N؂.'U pGpGZWY %SrQIX 74]JE K~[ $D@ DŽ DŅ\l'Co^ Wki3 5 c= e"Gg#8& S*g#8& L$g#8& wOw)11 sƔNt xC:; BOeW;/W;L>W;SO$ wt򰫡j 8&oN'XrK7$/=K2%;+þ s-8YhY? Df Df $Df 9`/\w#b 堆j* xM -$ ,$ $$*bcZUp*bcZ <*@j;Bh9pp |ztJQ͗8ūh ͗8ū ͗8ū|aɶ aɶ[x s3XV g>(OSYQTTymXYpiN nj u\6cvĻ' CoJS ,`t%Vjȫ[MX u ,MoF2ʯo q׍Ͳu{ JJT:m mЊ ]МMi:МMi Т{ނ=8 м5d >u^b ,D(6ZtXjf"]ѻ .4 `ٺG8 :nQa ܘ#Q;݂4?ފ)n E?[m^#m^⅍|̤k?Q }LcIF ]a`" ]a`" hj,RTGo7晴!1]S t1]S o.P [;q}oW aDTvsk Io eMJY D}sfIT#g \9 to e < JwYg&ȵ&ȵgR&LR&Kkv"  qRRT[P2LIRPJƗ4 MߔhnbջbջR~d}TwRdwRdK9nǃ!YfD eN 2X  nlY!b*sj z"4 j "4 jR##h z $1(C'`-dޜ*P;]s +ܳZ?,hя` ,JY/T͕|r/e붼R133F 3@-3bv5)㿁6\4&V7Kg8s7w QKc9Ҹy -: n͍y:|U';7OQA (?xq!?{Xc3?{X@Kf %Aj!¦ (D?M&uڭ;E%WsղEβ?DSEβ?DGuvGΐ| jHUK HUK ,I1交J& ,JER% JER% ,Jٛ}+ J#rrKxvq DKxvq DKLfu ("Lfu M/g|1 M7X?N MzO7lO?1 $PƂ a PCPcS QSJRT BU"tRV+L/V+L/$V+L/dVKdHWzާ -Y2R`v8 h`PbV (b&ժJG)>b&ժJG)b&ժJG)c rRdIQdqbҋ*e8ۓ/mZf<:,? a*g&0i. ##iKftbi]Hisjiy al`Relt7lv1 nQ)U{n3-f=hn@?s n@?sQn;iRo栜|pZs qѱ/;sl' sl' , s~ s܊," tNCtNvb vȅOy wuDwO7T{x9;|fvz Y {X {Lz cf!sSG8 sN%-{Քd7wJ0 tԮ4Ȃ Ԯ4Ȃj 1hȨNi# sNi#k 󇍦~/ \ 0}_MxL0 ):O{ eLO{ eEuCin1 BGKSs^ s^ 0? Fh?PhU[W$󕃙'G󕷧SL d{9%./[| 0-^mJ}r[$%\%WiYyhmqU dh$/pEQZK Jw!(t3nŘ!/̫EU A ӚN~i=ޠ\ iїS]Rj^BxY:"]󦍦d0 ~z5HO SD$jDIbK+Ib? .*5[@]\CkB&8P󬃲󬇉Pe?ߏ8o/Ao/ F'Y e ʾ"qY4%)wMh<󱗟TF|  if}Fv (pY״ ]f cHbnRHbnHbnI04Q*| v]$t';w:?~O;t󿠚\~ X=c5SN/  Z -7V þPq2þPqyD~.vt]If i[iS ˼*˼* ˼* "`Psa3rR *;;fEk, ΆC XC]IWC? Ѝ]Z3&QY~ cӋ;ybӋ;yjӋ;y>I\k o> t0Y$XS0Ջg # ՟/ƴլAg *N gJp mK$sK$X-%W3PR).9N %X jbZ.kNP=qD?1"R c~wC9b5?U8f1΅졑?t̕4 cB ")? |v=sd`y̹% o .VCd(iuj4C=By =\P -HѴLHѴHѴSg21,_w,.g l;[E`s:_{H (/X;g| =&HK{ }^ Vw/ QQ 6* Ǻ1; SQu rB; 6JuHp 6JuHp 6JuHp ,r:đ % ahw!'  /ͭhBBU \ S IC q  v4  y:R 5 $F. ">Tl  ,_˘ yk' yk'| ՗ -gU!! p3%A✄<A✄<A✄<* L z ؖsm XQ2A73. ? ntct@ )#6 e0. l@ 9ijh  %xdu`XY!O~V!.'"j_ZYp "!U)R "O['"~: .#Zd#JTR&%F nR%F n &o&#D .'%C $'hgI'7{S((|IJU(|IJp(|IJ`(E (Ti/  (^U(^ )ch^ j)­R*ﱴ ,*`) +Fd{,&7͕ $,*+b,.-Ε7?/ݏ-d/ݏ-0G  , 2y\rs 3 T *3yP55N$ 5a.bQ (6Au{b7 7 78̹D8$Z=-]8oP9J4< c94 :;uZ;uu : >;B @AH` BOEBUCn 8D1?l 1Daxx EcBWR F`Q F GVGLG JIWQu JIWQuJopKia3Kia3]Kia3Kia3M.e+ MčOCN5Pa5! P~HɗDR XXR0Lf R0LfbR0LfYS6ii;LSe PV!rSӣV-#0 1WA'# ZWMB*B&WMB*B W^J9:Wu7oXvXˀ8 iXG Ye~* ZL%c $ ]hI R_i( ea]m˸ c#2= c#2= d#:dYrN ldYrN d~S fZ9[g;M \i?ۂi@!Ri@!kZb kZnc$ hnc$otG qO2L@rpr=]ktrXC thvnDv@/:z xJq {rԌ{)x[{)x[|l[}mA a 갥u>2{f( ^ 􄮇+􅢦 \ yE̊D Ra8eR.?)`gu [aqQ % x>FmX'+h` =zXFRk2ɸ 7ݒ4 $ sO -S\ =YdB1MN A$ V {p]{~QK/ b O"Q!D \O"Q!D (ŗkDdbwM- 5 U'}& ˈ 2.wXSOzCt"A+/Q[ #Ϳ{ =1ˏ /R^a , O:"j8:e #$1| œL )Ȳi #'Y?϶q:ga+v@ýz ýz ,(fB,ǁZXTm $XTm ,XTm tXTm sMXTm XTm j-GEE8%^Lq)q)K4 el asq]9q] =q] 1Y eR8v+G}&+G}Y1YE Û/B*v  Û/B*v:ÛFLnVPwb2Ċ mj  O\=l9)f,S8<~&,@ 9= 1@F9{Yǁ.IS-? ڪ C # :2fwqNJ:wqNJ# PJUPJ*ѭEݏˬ<3kjix JeKY=BG1RUw)x  DںPDںP (2h^qR2h^qVVϣh !g !g ƵNЃ5>t=sM M ӳvUqo; Խ6f Wj Սn.xe Սn.xejզbl[UYeI $2vg>eNQעkܔx>k%\|bMY^JF7)$S,e<3[ _$.#:ějB m ' iwЮ v="Qsa) nYh8["j;6G곳_׬ N6]atR}PS}P];$tC*П>@>P %ސd %ސ$AN +*i WIѭ =Lt u)ǽNe} -$).QjujD 姍jv姍?!/Oy|} '̏J ,r5(a4@ 2Z:;NQF :;NQFYiE)κa֢z mz%N c,z k{{Po j2,Ens`cu \E$Le-\xL L- =Q/o[ u6· BBAJ;.8  !_Fa 'A4 Y-vvdBC~%]o$;\5#.hV1b1b,? o?}0 ao?}0qgnR%3 iJ b (8D ,TV  "8f̀]3f̀] (pufTt `r* f!p  k *")ozK"Jv"p S"3/B| "3/B #k#њv?$oL $DeOb%.}V)%.}V)-%P* *%W [&+ 5Fv95hW 5hU5XA654 7<@t 8pl/ 9ؽK:MSΐ ; qWs<::5=4 t=p;/=@sm >naQ{D > ? S@Qb. @Qb.t@f @⯟fQ AMJvY ASZ{P^TA -ACDbΧ4$CDbΧ4 Di@y $ENE-` E-`F3_WFaB}60vF 4j#GڛGڛGڛHϣlz%y H@,5 $)IA>PucIqJU"Kw(A K٩%6b K!/<LaxM%pn_$M9+\ Nj H]?NjdOq*O%z =O0U OܜW"Qo([P eR#wy+sRR#wy+sR#wy+sRwe) Rwe)jRwe)bS~B%4Sd;BS<8ST: RTp7k UE*_X\ UE*_X\ Unan=Unan=:UKe^tU־ V$b9A VpY\ aVH Xzc; %X7Y Y2]8v_ԗ_& c'_C}ܨ i_IFfLN_]e`AԖmv(`nȸ 5bHePd %be=q>E>U%es hUwjnD[ ,jS@b$j[zj伞 Tk{VqVk{VqkF:vFlR $lR ,lRlRlLlMm^`L n, nWqk nWqs nWq nѥubp;x rc<sʺb$ PsD&mDDzkIVpV!5lhAclhAc#t-2qY2â H2â: 2âY6G(F%@E [~R9t9 7 Og=LI@W Jո# %Y ZH چs؏o#Dhpb spb a Qc" +"S: $S:;ck1b!k9p k9p =R *d@ aIpt{8 b$Q.D b$Q. 8 D^tZsP![ $TJ. ] #3<h!H\ Ik$ T6q e T6qT6q|Zva NPR[5jw _āKfos Ơ, e=ɔrN 3[v˸u3 O 8}Jd =e?=e?GuVCy&\cӍ.+Yd @HKE $&u [ohhքx4(u #-x4(u d 1^89.`\[Q [1H1Tb 1H1Tb (QӒ[s;Q#Mَ ۢ-QN݈>e?eH< ᫠f<,0g FW (0$v +v:Y+-^D?U txN_ [ز1^jФ0휥qREQ휥qREL#휥qRE휥qRE$u=q{tۥQ tۥzR AE? #`+ԈX[JB:]z&竿aJj]έT}US S3^/R3 ;{nP/U)55:.`R ϽLuYj\2jrd6=UIKf sBĞTS#V<  #V<tjHQXe$Br.>R L\ L\R S P$)D|o%8Re&?0 Q][K;c ,\c Mij0ӛ\tk \B}ҡ B}ҡR f h3 h3Z 1s7 %7a %7a: >`< ޲vO! /g /g ?:Ch 3uj  e[+VSҀ= #lRR@ =4c"۵j @l Ʒpm:C=^?~tA { i= m_,*|5 P5e"9nh\#`mk$G` $AیH@ %}BXUvQ%s9_ \ &,s?(+Q(s WgZ(E1KQ(E1KQ (E1K(E1K*@&*E %*SwU+$I:*,`ꅴ?2/t 0#s|02C:a04 _ 04 _ 0!1  23eFH2+S3 Q3SEd 4c63*:63*:7 au7su 8'LV 8?Mt 8[|?9a矿:KLYbs:ގ;ں< TxЎ=2@IX ,A:p/AK]! A؃4C60CC60C60C60 Dp{-LEVd EVd ,Eb{ .Eb{EagED/U (HC[I: H,n~~ \ISTGKJet%J^ K!oLCR]1 )]T#2_A $k a{6c bH8 $c?^@9kc CN- d0~ ey_ "ey_ ^ ey_ ? f|?o]gty@K h/n<iL> smq'. mq'.mbXmQD%tnvÂLngr *nVVrI04'Nr2t3r2t]s}H` tl*"uUeYd !u}?Q#u}? vFXIJw $ x 9脙y^vyD 9 |0=J|l[uO*!t}d+f1D)jݳK 8 ccL? ٶ!XHs c(QfERh,2jh,2jKP?~U3n5 @q1>Y QBy־p `0  ^#  лYֳt #1 gi iC %.U!I-y2ްń_<L ?Px'}RDlRQDlR"DlR]Qb?iHiH\sRUtX!+~0T/nmTVnmTVuƃ"uƃ";f Η?y,!vS = m/WU$ g.@t SeЪE Ayh~H+@|t,8x]898x]8 iDjH(])Jd"_b44 +cx+sbtBUV!b !b mT 8}/!  +N25PQQPKZ + PKZ mcѫLrU }D%8MJLJEe텹 rG㋋ !"˂ sNgiY@ c. ai[20b 0b .>g)(ܕZ ^U30u2݁e e+PmS0!lgGPN'ES{Wbh~J%9[M 9C SOX 'p |ueq ueq? ?mOjg ut@g utR &5 t0<] 0<] fqK C Vč>I𙜬 sXZx<bSx-L[6f Qsp ^F|yBzɲR pg%}J-rv{-rv+55E Mq E Mq?nmq"C3 !/R tRu H%rE Ҿ]  Lb2  #* # "X9 4d?=j 4d?=  4d?= i 4d?=*a փ cR[1Q "I #R vBt  :1'L)>俶cAb/D+M5L imi . i i<i<K- Y( Y(])\􅺤 g 􅺤 | +ҨҨҨ Y|  LAQ :EŨ sJCsr adE $  V Jl&|ي[Zj!9\P#BG>l#9N #[V: $PL -%{O &Nz&mkR'U 'Ut(F (}T~[(?ka (Uq)SS2})x#q$* * * *Eu(,4(gD,4(gDb,Q `,y?-Gd1 ʶy 1# 1xh2&*u5D;fEZ5Eci6U֬Z9s>jw ;mJ ;lj?;ߕ 7 jAW(}tAFܜeaB'Xea DU_' DU_' ,D*e G9oPIK))RI_5YmQ;;[;bNR\!!'3\!!' \!!'\6m?~> ]ZBj]ͧK^uJ_Ha?hS a?hLbq# cO~ q<|cO~ q< cIH8e+ Re#fϽ.D =g*k=g*ZW|g9 hR"Lj./ke~l 56x^ mlN1ml5- mrf۠nFQp?n L o'ceAZ?oD2 ep2~#p _x jrOfrɨ6]tswSy?sD܇us*v"ȯYyL9 yCֵyCֵzV#h{HuZ[ |1t ,|+6t`7|+6t`7|+6t`7d |+6t`7| |yV }7LfI- eq':o$"o @3)V[ Ji{ ilCO l>xa>[z,G #'K$ \ $S8?Ƞ^[j[ 3|-XK3|-Xm1,n}!/b0rtk  Ҟys-OWpeo%R mY dsn`fPQڐ^GR7 tNk, 7.:7. g[-U 2M!_CR3e$a.)ym 2&rR;!i {=˅W V| "H$fsS s$sue< l-Gz](G eMf 0YǟeNL=pJHzMXy 1djR t䐍 ^c OZ V_S V_S~u4n _8A #4y%kJ* &v;+>V 41:>։y_2K)Lx F^: g $]')r ?MD' u Dcf&[qK 4cF W ]f,Ah q $;>rWӏ_0 au-9̱ Lyx iQk NіNі]m iyCUUW o ( >$ӪMv[ ӻa>Ifq4ɶ"JW rMSF'>qCshJ ? O7  ف 0{ʊDčrS v[&Pc }@ }@`Қ+jLkYt*l ݈1+D|Rū |Rū ( |Rūh|Rū|RūAJR̞t hE˝h6` vu^S bB\|5U/2ڎn cظԡ^Y T]? GJ n $~=SW ChS sRK-$![O ($![ODeGl YYFI;d᭗[߭Pzh|f xy|~: ) HNHHQ HH- giQ93_&CuV g/tOFN?JOFN  >SgH.` a*Mٸ   =]+9 ]+9K Sv z[ 2 l V  dTtAh D3:M>` (M>` šfšf>5 IxpL ({4tcKB  Gv ߗSL ߗS x3Z?tZ?Z? Fod:+  [x  kwC-Cl Yyx\~ 4* :?_q[` AS7R 8W hauMk/auM \k$ ]Vx!ȄMFGoKX;H 3Hl[Y?5Hl[Y^5 ;q+q+q+R+GGx t oe \ "~F7"~FS "O\Ԇ%'8D&&AuT&EL>F &]_&: 0D&: 0'`~s'oDs)xS?)[ Qc!*etQ,A5 ,Y |,iji,u4qU-uh0x a 14S=Zh18f1QVX2>ømu 2v;Uk5TiL5Ti6]j]66]j]66;7+6;76M75ʷ$ J 75ʷ$ 75ʷ$ 7=p9 8S8#E8k?;|:dp:dp:G) s;$ ;A$wj ;A$w KP< >Ւ?)-@]JQB aBdmjC5LJkDTs DLP:{dE?FBFBFEؾ g FjkG飼GL#2 Gm YGAsHH c =HWIr?NJm-K YLI8y LA"vL 3M({vjMUYdM[@ Nt&wsO#mKv[Qm7;IoQm7;I RNFRfl_ qRfl_RT*T*S T*LTS1 T6T$T6T UdFU@vޝ+VuX!`^/Xkd m X@mbUY:!qY峡{[vM \N] \N]K]#!e]:T_AZłv_O3a~$8#[b7@-R$bq9q gc˓$HB[? dPE \eP,fv-=)fRYRhS*a7MjMP3Okl6gEl ,mfʒTpmU. mU.nqKo6' io_Gfq&0q&0rj hht"\J[QuCפuoVwATb wYzQCwYzQw?E GxRP/* axq=pݤIxq=pݤ yb/l -zONO| }}~Kc~#:?4m9&4, izǧ a +ܿ$ c>v 4&ֿFY!û늣Z-L ]}hv*/qd'cD=8$^-=8$^)_ݪgV:93 93Ui ?;K s6D_ X+Ih?%J& jHO2l M }r_]et U=q {,\0) ˎ=j<ɻR :|6! G`kSء $rqE=By?Q5+`nK=a_Ue%U _C!‘[ t O)n䝙+ aK+s+t +jTYtDuËLX=k ( fc>)bnR>)bny$ ,y$iމ-iZAN˥$K/G EN aAKׂE ^sk-k-jf .(S5erSB"]SB" ~\Nej :9 TT T XVVX Fv鿨 V- %>N7 [ gq@F :|Bvck{f {({f JnGڋd a X "  FY2qj8FY2q?orUzfBBD³5?Sk( r-Rç/7oFjċ_L$Ś] Ɖ8r -ƭ |> #ǀ_ΌkXǠJY 8ǠJYtȰQd ȶFvʊM& o@ o@ o@ ,?5 $<1 j><1 j><1xR4 c'ne i[ g  i[? n< [ C%#? C%#?D ߓB gNv ZhH M  2 e X քN  (_m BW .9}s^tfDHNy2[KG =M>vb))Ò7 q(CZ[MҾx |0!@ L1Pa?YN ̱rtQ +go a sS%YgQ M^4$>47%˓aD%/S &7ͩL (Wrpn(~BmdM*?NS*]ݤ_ ,X> a,cXgs/?xЪY/?xЪ 0*ec0,$m,1]Ju2wJ2^M L>M R?JZ @$PM AM*"A^=/B*q(ߗ 6B\NshCG 7S)CG 7S) t CJS8s C:cUG嚾ĦGd H?AkI:P704JͲfucBK^D&kLb +MfQ[+5 tR>$j&SvK;d SvK;d 1 ZZ ?]WC9K]WC9]WC9]/Fr"]fb ^w+e0^"/ _ a _ `rKVwb#+z cWwfBEcWwfBX:cWwfBj1cë% d9ߵ!d\uFZh0]U"h0]Uh0]UPhoi!ڧdia$u?iz9j f|j$Ķjkmfk]6 $lnlEtmS xSm<? m-] n'X  n݃Ꝃro rRJ rs6/u@e v$vJw|ϻ0 %y:ez9Kajzܫ9z8|)c{Zv-#{Ht[|;;I_|RN \k|S9v}:}뱌8C~IeK~`J ~ơ Z^G"0^G" e @I 55 T$ Y  <>ʎ q6 #Q ?9L. -WL  7 o걓tl-:ŰU Zx" bR ϥM4è OG$ 9O+H} K ^f$-%Vz qXQoR 1( #ѪVEž-l5" svb:B?#ڷ(!J9*MD B #$G G * ´ rp);tL ]W?Tsǁϣ9V Y>9 Y>9 Wxv`:cAj~ Q|KIx/dML<24q?( ?+ZVR@غ]H+A # sA`ݫc)B<:i|C $)C]RWK C+F[3C+F D-4 D! aE9R - FuaCFI~UH_WL HQC ,H ,]RI+9T۫ I+9T۫?I+9T۫ IE#; c IDKi-8?+Ki-8 KKKL;^svM(>$R N"Z*Q5j+N"Z*Q5 iN"Z*Q5 Os#%rrOKOצ^|Oצ^|Oצ^|R$(Su,\Su,TT wQT%@vU\e/SU֩$ U3-p"VxUVEUمV)(WX>L6 [ Y Y?]Yܮ,Ů[9oLa9[SzP_|(ZR `PD`/N&a#/3oPaHF @7R!aZޗ|td^ dwB=jhaѽvlhiV> -ilHOj]n?l,\3YlC clȠ}x;|n cl+]o=o=Yoh<p6\]RtE %ui0| ,u32u]d\v#1}vgxB vrDw+ƫ?xB13 xXimRDxXimR xXimRx9xPjy:#=D ym7h] |:?|Ȓo~_R5` '5` oLe]j yyHvf#)qv =̛+!  U%+ U%+]yJC#^j(. QudjvcKs;Y" ^o} LXm(R|]Q oq05oq05e `ˠ ZļHvHk,fr YjK2V c/ 6R ̃Ũ"ѻP` ZZ_*½p)-:\T/7 1E2Uݽ?yj Uݽ?y?s$ i W/NW ԰0@ de9U3de9C|ߚ He}J.XRX!wG. 'o[} odU[ v3B,|eO ?u#RB4)8 4ex#®S6 Ķ!>%rZcn;zƟ"wR=6{xG ˣ  ϰѦ/x˥~г4kA2ܑ RJ\ J\ Ԣ<4 Ԣ<4ۓM FZ v2w"_{ 5 aSYnQ|HZ'i7#i7 9U>К] ,Is@eȋ iI1cNW 3S45S45: @y: r@'j %fsY ܆31{TT sܹR]J R]Hqq5 ;Z c s r d`|.fRܑ+LLܑ+L=4t b3Yk?l+ + >U >U R >U  6M ISE顊]ZI~rC֒68H> ,j!;T<3P4h #s WMS&s.AAMVkL¸k K붼 w X% ew=ܦ;Ͳ R@ bi 7yЦ7.=*7 tF tF}ƽ !@Y~#p@L44 [I d53t^I,- ^pB͖R͖LPk~|̬4x -k?y j# e~N $9at U^Y %[H( dG'4˖^-Hk; 0qTSG}t ƚ ȡ e7_v +6bw+*?ϙ +~" ,olUd,;!oq-Wl #-klV/&we/SA=H/ c # /)5BW/)5BWR/)5BW0-0T #2 ?3 Y #3 Y 5H+5V\)6"66ľ7x77FQ??? wYt?--@ a@52NDCfr[ iH SjH>Eڊ KiJM3=]N70/GOCٚ)OCٚRQ!LQ; :T W;T;9WIUɵĘ #W9 KXѿ@HvYWCtO]N_]dE{ ].Z ]ߵ~Ê!"^P0)S"^qN ^u"|^ J $_U7aAic7wT f2Y{v f?flm ~]8m@~*8l lmp2]oryMʥ pzNl ipo rIW% , r櫂qs^Oxs@R@ jt$BuUDEm cvH4V aw37j %w37j x^<PyA K"yA y/_yB {1C}SW ~wB ~wB , 1U VWf1A驽 A{,sA{,pDT7OWԃGv"xoCJ/^B7ic{ FGL \)͉Xcߤ(EɤuVA_?p{)Q #a&I [Nn0| #snn cp^Ҳv p^Ҳv2$_Nw~#/"k$} b/nQ H#.u6q qX.km?ǪFW_ *BK? *BK?  t Κ2.w* 4$ + 4$wLFwLwL wLyH.f^=R$ ,IxR6˱LDjURl c|h!J`?ƅn&GNFYfL ^jv8a0N as6] as6 as6 as6l!^ ށt~ lf!m lf!m lf!m?6V3b s3֌G]^.|$ cEwZ $HcEwZ cEwZ T U? 9 *r]?{Ȧ7dd +M=NPUq $>PUq , PUq /XR O?{G g1(_ s]6 8?2 2K;? a F(S |7q 3UD@?bMkS p ^*^{tDW<3 (N:O aC^K$Gp8YMq' oȤDoȤK,9 Jx~kÛy}ir>U2Z Ǣ,t3W (Էu=2(Էu=(Էu=R)(Էu=Kʎ'z+$Mˠz&zs"Rk]~JvS "X3 CwdwwWRwW0c0-&c0- m4VWΔϜ?N &ϰ~=P džޔ~b FC bz85hM/hM/Z#hM/hM/ hM/SеH*TQ׊qҐe= eҐe=v;Co"2sS`?  &ك",ك"ك"L۔=Pula``92la``9 ? ?nX}o ޥ \{ x ApU|꘥ # ..)s}j䰘yb f@Kf@ BUZ}d,މd,މq  $D%99S ?w= $KJgukKJgut єBsN6m"Q3  \ ytgPT +V3{oQRﴹ N4 a 2\< > l~ > l~ $> l~ > HݣvK7uޔLamH amHR>h f VVS 質:sA7p c`Yۮ \a, i(8bQLlK w׃h]"w׃h tf p R{aY_OY_OuѨ8uѨ8o T6L:K $S4 nFz j]C ok"QݾvF(*zh&Z viviޗ*u9>ʆ " uǹ % 9:V zV| R1 1 b  à_t+Yxű eqo ^مv م0BD2:?t O0j gr  E#nb.kz s.kz ` d޹Z d޹]6{ܾ ]VB_ zzY З}З} 9 V0d ($_)r6%%pv%pv%pvN'n`(n (nt':9 )mi);q%?+#"# , M '9 1,aLD,E~E,e7Ѓ-Oo -Oo |..wy/.q" /Ct*/CtQ0!K0000R2J}M& 2-,R2uuBS2`/3i g 4,ʂ 5MqNEs 6&&\ٶ a7J|ij^c8 sB "8 sB{8}ACM ( 8L]8L8;BI \;Xi{ 3<j.7DIR>7DI|?]ڬ?m^MM?m^MD?m^MAYUOQAy`AyLAyfYB$eE+BZ+Bc CI,ͣ?YD4DZ‘ Fqk FeO5]HvXaCKJH)6Jtx4Y Jl !J'Kt.KT'LBov8 LH*vM%L!L MW215RM%ÎY'M%Îk Mc_N gq&Q \QClR?>DR?> R?>KSN[Vi#TK3\D TK3\DTC䣐Ut38~ iV萱-V萱X₍g|\qVA!^`6 ^`6 ^qga_Ovj _o^rb_o^rL`H'hbD2cDDDd栶csea;}sea;} ifGvfGvfּ{ g6>6K gzQ is j?B/jݒ\Atjݒ\As lȑ an (oW<v p '[cYpgںs$q$҈ jqӺ?rL:T8rθtvm\{t4yubq%>ubq%> v#NKv9 *âwiPN"zx$H;xX DSyۄ+? yG2zx+4z_w?{#"E*%{:}F|1eڟ|Ty i}L  }L ~x ~7i5~7i5[[x (0 8~Y0 y9&[ET k/l_gk/l_ J%JZ ZmTjHMM . ; O'|;O'|ml Yne{L C6\gv+kO $>|OI8 W!lAssD''@ە ame|Aa&vm2@:?Ѽ[Ѽ[Ѽ[Ѽ[n>5:ByZ ҕ2 jy2~͜ 3 zDt[U v ~ 2(XŶS=J3v PZ ug?,yЅM+FiKj(Mmq| $pxF4^t T%}]:<.FN~g~t< m RI=B.:P8)dnJQ ;V?Ll KR g0mb ,ňxf9 (>2h4\f-K4bஓZ UEzjeȓ ll ,Opb4&]Y, ڎa, ڎ, ڎ, ڎa'S 'i'i ,'i 'iJ.p Iz.Z;ϻăX ăX JNh Ŝ-~N?&|ʹ ӱ:y -zvր$Ίyo4 ΂ $ g[} // =pn8f$E j{0 a4L ,Rӏ7ӗtu,RԱx=S (i]uJC iف%T $ AB {D]ݑJ< ӟ>ހh ހhZހhL}.2+E]QRߏC{ߠ֎eLߠ֎eZߠ֎eRߠ֎eߠ֎eߠ֎eS2 ɯI` $ 09 K09 S09 R4s ꠑ*E r6n)dr6n) Ao :Q sgV8e:D@|yMv yM +э ^ɩW[2&?jr%Yjr% jr%46 9Y{a N mӉ=k#&]Dx yM+ pK8![5w ёtkd=w b!$Yb!$Yb!$Y ,U/?~R%Q:4#_ #u j((-]FM/ojgk3\` KUj KU ( aN x R:  R:  E|& Ano. Qv _ƣM _ƣ% R'KNhè  6A ʎ ~؁ %{/?(UU 26Uj",}tKy\|d ] $̜M[+ i 3; ; e6/ zÄfd\$*E̸ DelhDȷ]<nЪrg&5x=U&5x={c2vENx  Řt CKm8 ur"R E !t "fdzc3 #D8 a$*xY%ML(%Ms%K~MK'%? (8}no )4BV*#GI*Hm"+w2 g+!8s+odu,Vڈ.(ɻ4  /ֆg 1N1aXZS 1&fRj2fxŗ$2 2o4 -aq4 ,5 k45 k45m,jb:8\ 8\ ?8 9儋 :k; 0x ;nh <4 = r2 >uK >7 Rs>7 C?"`?8Ei] AeEAeEB<|oD;eΛ7D( 2EL7\`EL7\!5F=rA $FdF D FdF D Fؕ؈G=3Tj߸Y H.Q!H.H|tm IplJ\SI*OL]' )M@"vM̱LvNc/NYd %Orԥ jOrԥ OD|j<?O]~ OϡA` iO,Qj POWQP=]NQF* f:QF*9|QQ6R ?8R ?8 R(B\mmR(B\mmRR@lSKK1bSl:_S/V-T:ΥT9I U]`"CVĊt c Wo?3X7Yb^ Yߌ=xYߌ=xZP: [ [ ]/Gy|]Ui6_rZ`^M`7fibmbvPNd &cdf_q i:x;&im+< ja)>Il<l* n.5 -pm`:q}?scĮtT0tT0 t\Ru-^ veH ! y$0Zy$0S|&eTIB|3R |u骻UvmP! im ;ڲ;ڲqh á9/á9/R sy2}5A k2}5A?gEnBv,sJҠ}nr=pbS =pbTfI3fs(I3fs tw+P٧N+ 8`O=(A[ F{'ziDGc8m8Rum! N!5 N!5$Sh= }KZKR ) %1>VqY $ dLiR)Pcq Pcq 3s0 3s0 ,N D,{( $ )zEQY, ;( (XD?XVB};C? o]pC8[a;V|1C&>v U=c;xKHMþ1djJCþ1djH $ѥJzt P; KZhJ?aH\K$on#Çe:DxH°\AYAYJjfA<NŹ2?q+q+N^KjǝCI[Ǽ ԰K ihY[ ihY[D 3^V #c'f~? p>y̸ 0> 4Lrivh#N x R Ϋ|"Ak Ϋ|"AkйHbvܻnO *sMLNPS6fE,U #"cl 2/j҅ ikخȮ*"1HC(ک1L "-r Npv' iܾVɩ:w (Sɩ:w ,ɩ:wzɩ:w{ާX'Q ާX'RF!WO1UO1U1.Keo mejjZyS匷% \x >ͦ 8E鉞#EYE 1E aE oTY^3 h+Ouk%fluk%ff=OR _"g$#lJ ^ ,I$]^G[`U ζA7s*E7 X -?,>UYn!Yn!:E Z.9jEY H;/xJܿBʘ (kޭU }:g3sR6 %j$h j$h ,  ь8a ܸfܸfU`~ XFriMaDz C`^BD!l 4W@QdN5¥?Ҟ3 I& i 8"k j 5?C C j$2 Qf e Qf `C?5Ѳk?5ѲjCˁfDtEĕmsG=_ _ܚ% $_ܚ%V= sV=?Dtc(vd)R ?ˍ SZL;jsdދrH AsB8gj UsQRC\C\RTmiʓfG߲=d L91R *R,y gb: \ Fy[  bj%  ` !1.~5!ں6G "υFU"#i& #i=F a$^'%l{9 '| ')\(q/(ҟm(ƻ(ƻ )|!.|*,1vJ? ,u5\,u5\,5fųZ,^ ,^ .q5R.+&j2 0\@2ZsQ 3VM1$4pIym4pIym 4ݨ52:5'T^??5'T^ 5'T^ 5'T^ 6"(PAe 6r= 6I "8YOPxs?t5F@8W(N3[A)r BstCa - C$QC$)C۱8?Emւ<?.Emւ< iHc tH H JaDy< }KƎqE Lq˪s MeX/ZCMhdNwN}#?N-|l'N_<O0D,OtGJP$0vQ6̈NNQmk QmkjQmk Qmk Qmk RIWRIWR꼽=LHL T̴4w| T SU" U<2Y P\? Y?о&֓Z]p%!U[|O[Ĉ,)Cs [Mu|L\^ 8'H$\^ 8'H$ \^ 8'H$ \^ 8'H$ ( ]dGm]+:j]Vͱ"^we ^we$ _L50d^S#`N a9D| a=tbH ,fzpiwcfzpiw-f#]tfKV%fL"!^ $fankog ydsg2RgE 0gPiB;vj[A= j[A= jeq6S l (l l mjn=ny֊=!ogQZogQZ q t?' tdb \tأeatHdu!t x##x#P x] y޽S zf2?zn;Gt{L~|.gh2 }"pa- ~ʁ; J6 fg8?53G*BS9E$  b5P5PiGS qy@pbzϠ iS08Ҕ?!#Ữ* @" )NHCbvxvx>rI( ,=ķb@ő@F 2ɍhAWͺ0 Q ӊdJ %6 SDd nVq|b)nUR))nUvƂJn]/F:2n]/F)弗;)弗; CK "M]jĊ+ xEjwIF1zj q98N  Ũf? B%[$ ({\o= #7RW? 8텉MsTբB3k"V:Ro8׽8 %o^ %o^ ]j]] 4Tvx[9Rx[9m i;O_M`xT& e*D e>j=$KH zN0Q_}N 3N z[ 1"qYq | 6S q e]rތ9ߡ ތ9ߡ ތ9ߡ%b+B sWarWarjWar v4IT?EGs l |HN8; 1T?2JԗKJ0KgS _ *< , g w/hWN)i[oIj &ſ ˨4tȦ9̄$ R{ͳ9CXM@{%.}~`~H%(dBP sЎp3ЎpZгyʲ ўqT '`;b'`;" fTv.? է CqBNrsT UGE e6 ݴn@޶D8  ޻fh߹"_ iMĭK~T !YZЍ #j* ꄍ ꄍ ꄍ ]ꄍ 渱N.cB Ar^b &7v] iM  2B \Yu z 3!V Hd \2 $ QDv) )k; c}Z)W c CS)] itCS)]]J?Q4m ?Q4mkXA R5KWQl.b-wۆ곾,Z곾,S cc%#<`In=+6N>V;# >T"N?b{ ?ݠ)Y @͝ii @͝iiA1%d}tC'_ Ebr F[p]Fw# F G.NA Gp-2N?I:mPFIHN I|| K L\ժkLP M_]ă M_]ă NY8O(4!PzƀYPjQ^r(RS> vR9XD?SS}v~T \QU=<"j8 Zj$8\!PZj$8\D5Zj$8\[Y0xx[Y0xx[j N\r{\rQ%\r\rD \r ]L ^w2" _s˂_ 3#_ј mb] "b? m+dX^ f]6ltf]6ls h /f#hhsKM_i5IZ i5IZicx/i$} "i^Ri0 j?&ӓ lʋdkNlʋdkQmK1]N- mb{mb{o0ycp}S!p}Sp#Ŏ9rmukKtrmukK ssDXb_? sǗ[t^Oz: u- ~uH auSsx(_ x6>}%y]LEU1y]LEU1 z)tvj| zyTmruzX,zX, $ {PC *~JP s( Z"0woF 9t vJ\ $ vJ\! |߯lA8!*; 6c] 9X^5 " !_B;UU KH3A $ډj G5<κ5 s- -sGh cBt  1D'Y'9Ix c͙ Kic͙ !c͙ Q {P OA[8/;*O1Q ,??,#qB2D9B2D B2D ww*Qze\"L<U|l|l ia| dR Wzz Q3<Q3< $qh?HοX/>@ԠDRT . 煇+$? 9 < O—ev@s°#N%H"?A%H"^rӘMd ǁʠ*SCi&),^Q̬RҠ|;3Z ;3 ͌ `aJʢA } | ,&} |j! ГH 9 C? aѮPڙ sH˖]4L5@a~)S c f #"[Y J@ֶb_(RԶ Ք . 0IU *rOk#KQ#KQ 1'a ֬R:=zY:z0 01 ܀ E \ew}[r$<hwORz1YH@䦃s H@䦃 f0> J衶ğqS5F/!F/i{C a0  PxDu% r>S,{Rj$b] ~ CEavګ۫RI9 (oBK xe[R L #ӝרy*,]K >K)<d )< [%1UY=+݀}|Mt}|Mk š_ š_ ˾_:#?˾_:#޵EA i M8R7WB%{$i[M +CD^W^W]jerry-3.2.0/src/src.pro0000664000175000017500000000762613514421177013507 0ustar useruserQT += core gui greaterThan(QT_MAJOR_VERSION, 5): QT += widgets QT += printsupport QT += svg TARGET = jerry TEMPLATE = app CONFIG += warn_on CONFIG += c++14 DESTDIR = ../bin MOC_DIR = ../build/moc RCC_DIR = ../build/roc UI_DIR = ../build/ui unix:OBJECTS_DIR = ../build/o/unix win32:OBJECTS_DIR = ../build/o/win32 macx:OBJECTS_DIR = ../build/o/mac SOURCES += main.cpp \ chess/board.cpp \ chess/move.cpp \ chess/game_node.cpp \ chess/game.cpp \ chess/pgn_reader.cpp \ chess/pgn_printer.cpp \ dialogs/tab_board_style.cpp \ dialogs/tab_font_style.cpp \ model/font_style.cpp \ uci/uci_controller.cpp \ uci/uci_worker.cpp \ uci/engine_info.cpp \ funct.cpp \ main_window.cpp \ viewController/boardviewcontroller.cpp \ model/game_model.cpp \ viewController/piece_images.cpp \ dialogs/dialog_promotion.cpp \ viewController/moveviewcontroller.cpp \ chess/gui_printer.cpp \ dialogs/dialog_nextmove.cpp \ dialogs/dialog_plaintext.cpp \ controller/mode_controller.cpp \ dialogs/dialog_guioptions.cpp \ dialogs/dialog_enterposition.cpp \ viewController/colorstyle.cpp \ viewController/engineview.cpp \ model/engine.cpp \ model/internalengine.cpp \ dialogs/dialog_engines.cpp \ dialogs/dialog_engineoptions.cpp \ model/engine_option.cpp \ dialogs/dialog_about.cpp \ various/messagebox.cpp \ controller/edit_controller.cpp \ controller/file_controller.cpp \ dialogs/dialog_newgame.cpp \ dialogs/dialog_browseheaders.cpp \ dialogs/dialog_editheaders.cpp \ dialogs/dialog_gameanalysis.cpp \ various/resource_finder.cpp \ viewController/on_off_button.cpp \ viewController/chessboard.cpp \ viewController/enterposboard.cpp \ viewController/pickcolorboard.cpp \ chess/ecocode.cpp \ chess/polyglot.cpp \ various/helper.cpp \ chess/database.cpp \ viewController/database_index_model.cpp \ chess/pgn_database.cpp \ dialogs/dialog_database.cpp \ dialogs/dialog_database_help.cpp \ model/search_pattern.cpp \ dialogs/dialog_search.cpp \ dialogs/tab_header_search.cpp HEADERS += \ chess/board.h \ chess/move.h \ chess/game_node.h \ chess/game.h \ chess/pgn_reader.h \ chess/pgn_printer.h \ dialogs/tab_board_style.h \ dialogs/tab_font_style.h \ model/font_style.h \ uci/uci_worker.h \ uci/uci_controller.h \ uci/engine_info.h \ funct.h \ main_window.h \ viewController/boardviewcontroller.h \ model/game_model.h \ viewController/piece_images.h \ dialogs/dialog_promotion.h \ viewController/moveviewcontroller.h \ chess/gui_printer.h \ dialogs/dialog_nextmove.h \ dialogs/dialog_plaintext.h \ controller/mode_controller.h \ dialogs/dialog_guioptions.h \ dialogs/dialog_enterposition.h \ viewController/colorstyle.h \ viewController/engineview.h \ model/engine.h \ model/internalengine.h \ dialogs/dialog_engines.h \ dialogs/dialog_engineoptions.h \ model/engine_option.h \ dialogs/dialog_about.h \ various/messagebox.h \ controller/edit_controller.h \ controller/file_controller.h \ dialogs/dialog_newgame.h \ dialogs/dialog_browseheaders.h \ dialogs/dialog_editheaders.h \ dialogs/dialog_gameanalysis.h \ various/resource_finder.h \ viewController/on_off_button.h \ viewController/chessboard.h \ viewController/enterposboard.h \ viewController/pickcolorboard.h \ chess/ecocode.h \ chess/polyglot.h \ various/helper.h \ chess/constants.h \ chess/arrow.h \ chess/colored_field.h \ chess/database.h \ viewController/database_index_model.h \ chess/pgn_database.h \ dialogs/dialog_database.h \ dialogs/dialog_database_help.h \ model/search_pattern.h \ dialogs/dialog_search.h \ dialogs/tab_header_search.h RESOURCES += \ resources.qrc jerry-3.2.0/src/funct.cpp0000664000175000017500000005734213514421177014021 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "chess/board.h" #include "chess/move.h" #include "funct.h" #include "chess/pgn_reader.h" #include "chess/pgn_printer.h" #include "uci/uci_controller.h" #include "chess/polyglot.h" #include "various/resource_finder.h" #include #include #include namespace chess { FuncT::FuncT(QObject *parent) : QObject(parent) { //std::cout << "starting up..." << std::endl; } void FuncT::printInfo(QString info) { std::cout << info.toStdString() << std::endl; /* std::cout << "id : " << info->id.toStdString() << std::endl; std::cout << "score : " << info->score << std::endl; std::cout << "strength : " << info->strength << std::endl; std::cout << "mate : " << info->mate << std::endl; std::cout << "depth : " << info->depth << std::endl; std::cout << "curr full move : " << info->current_fullmove_no << std::endl; std::cout << "halfmoves : " << info->halfmoves << std::endl; std::cout << "curr move : " << info->current_move.toStdString() << std::endl; std::cout << "nps : " << info->nps << std::endl; std::cout << "flip eval : " << info->flip_eval << std::endl; std::cout << "turn : " << info->turn << std::endl; std::cout << "fen : " << info->fen.toStdString() << std::endl; std::cout << "pv : " << info->pv_san.toStdString() << std::endl; */ } void FuncT::printBestmove(const QString &move) { std::cout << move.toStdString() << std::endl; } void FuncT::run_ucit() { UciController *u = new UciController(); connect(u,&UciController::updateInfo, this, &FuncT::printInfo); connect(u,&UciController::bestmove, this, &FuncT::printBestmove); u->startEngine("/usr/games/stockfish"); u->uciNewgame(); u->uciSendCommand("uci id"); u->uciSendFen("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"); u->uciSendPosition("position startpos moves e2e4 e7e5"); u->uciGoInfinite(); QMutex mut; mut.lock(); mut.tryLock(1000); mut.unlock(); //u->stopEngine(); } int FuncT::count_moves(Board b, int depth) { int count = 0; QVector mvs = b.legal_moves(); for(int i=0;ireadGameFromFile(fn_in,0); PgnPrinter* pgn_p = new PgnPrinter(); //QStringList* pgn = pgn_p->printGame(g); pgn_p->writeGame(*g, fn_out); } /* void FuncT::run_pgn_scant() { PgnReader* pgn_r = new PgnReader(); QString k1 = QString("/home/user/workspace/jerryv3/data/kasparov-deep-blue-1997.pgn"); QList* ho = pgn_r->scan_headers(k1); for(int i=0;icount();i++) { HeaderOffset *hoi = ho->at(i); std::cout << "Offset: " << +hoi->offset << std::endl; // first print the headers QMapIterator j(*(hoi->headers)); while (j.hasNext()) { j.next(); QString key = j.key(); QString value = j.value(); std::cout << "[" << key.toStdString() << " \"" << value.toStdString() << "\"]" << std::endl; } std::cout << std::endl; } PgnPrinter *pgn_p = new PgnPrinter(); for(int i=0;icount();i++) { HeaderOffset *hoi = ho->at(i); Game *g = pgn_r->readGameFromFile(k1,hoi->offset); QString out = k1 + QString::number(i); pgn_p->writeGame(g,out); } } */ void FuncT::run_pgn_speedtest() { chess::PgnReader reader; QFile file; QString filename = QString("/home/gast/temp/KingBaseLite2019-pgn/kingbase_all.pgn"); const char* encoding = reader.detect_encoding(filename); qDebug() << "start"; QVector offsets = reader.scan_headers_foo(filename, encoding); qDebug() << "stop"; qDebug() << offsets.size(); qDebug() << offsets.at(0).header.white; qDebug() << offsets.at(100).header.white; qDebug() << offsets.at(1000000).header.white; qDebug() << offsets.at(100000000).header.white; //QString complete_file = reader.readFileIntoString(filename, encoding); /* QVector offsets = reader.scanPgn(filename, false); //QVector foo = reader.scan_headers(filename, encoding); qDebug() << "offset" << offsets.at(1); qDebug() << "offset" << offsets.at(100); qDebug() << "offset" << offsets.at(100000); qDebug() << "offset" << offsets.at(1000000); qDebug() << "finished"; chess::PgnPrinter printer; PgnHeader game1 = reader.readHeaderFromPgnAt(filename, offsets.at(1), encoding); PgnHeader game2 = reader.readHeaderFromPgnAt(filename, offsets.at(100), encoding); PgnHeader game3 = reader.readHeaderFromPgnAt(filename, offsets.at(1000000), encoding); qDebug() << game1.event; qDebug() << game2.event; qDebug() << game3.event; */ } void FuncT::run_pgnt() { std::cout << "reading complex.pgn..." << std::endl; QString c1 = QString("/home/user/workspace/jerryv3/data/complex.pgn"); QString c2 = QString("/home/user/workspace/jerryv3/data/complex2.pgn"); QString c3 = QString("/home/user/workspace/jerryv3/data/complex3.pgn"); this->rwrw_pgn(c1,c2); this->rwrw_pgn(c2,c3); std::cout << "reading simple.pgn..." << std::endl; QString s1 = QString("/home/user/workspace/jerryv3/data/simple.pgn"); QString s2 = QString("/home/user/workspace/jerryv3/data/simple2.pgn"); QString s3 = QString("/home/user/workspace/jerryv3/data/simple3.pgn"); this->rwrw_pgn(s1,s2); this->rwrw_pgn(s2,s3); std::cout << "reading nakamura_rybka_ascii_linux.pgn..." << std::endl; QString nr1 = QString("/home/user/workspace/jerryv3/data/nakamura_rybka_ascii_linux.pgn"); QString nr2 = QString("/home/user/workspace/jerryv3/data/nakamura_rybka_ascii_linux1.pgn"); QString nr3 = QString("/home/user/workspace/jerryv3/data/nakamura_rybka_ascii_linux2.pgn"); this->rwrw_pgn(nr1,nr2); this->rwrw_pgn(nr2,nr3); std::cout << "reading nak. ryb ascii winline.pgn..." << std::endl; QString nr_a1 = QString("/home/user/workspace/jerryv3/data/nakamura_rybka_ascii_winline.pgn"); QString nr_a2 = QString("/home/user/workspace/jerryv3/data/nakamura_rybka_ascii_winline1.pgn"); QString nr_a3 = QString("/home/user/workspace/jerryv3/data/nakamura_rybka_ascii_winline2.pgn"); this->rwrw_pgn(nr_a1,nr_a2); this->rwrw_pgn(nr_a2,nr_a3); std::cout << "reading nakamura rybka.pgn..." << std::endl; QString nr_b1 = QString("/home/user/workspace/jerryv3/data/nakamura_rybka.pgn"); QString nr_b2 = QString("/home/user/workspace/jerryv3/data/nakamura_rybka1.pgn"); QString nr_b3 = QString("/home/user/workspace/jerryv3/data/nakamura_rybka2.pgn"); this->rwrw_pgn(nr_b1,nr_b2); this->rwrw_pgn(nr_b2,nr_b3); std::cout << "reading kasp deep blue.pgn..." << std::endl; QString k1 = QString("/home/user/workspace/jerryv3/data/kasparov-deep-blue-1997.pgn"); QString k2 = QString("/home/user/workspace/jerryv3/data/kasparov-deep-blue-19971.pgn"); QString k3 = QString("/home/user/workspace/jerryv3/data/kasparov-deep-blue-19972.pgn"); this->rwrw_pgn(k1,k2); this->rwrw_pgn(k2,k3); std::cout << "reading lichess_test.pgn..." << std::endl; QString l1 = QString("/home/user/workspace/jerryv3/data/lichess_test.pgn"); QString l2 = QString("/home/user/workspace/jerryv3/data/lichess_test1.pgn"); QString l3 = QString("/home/user/workspace/jerryv3/data/lichess_test2.pgn"); this->rwrw_pgn(l1,l2); this->rwrw_pgn(l2,l3); } void FuncT::run_sant() { // some san tests Board b0 = Board(QString("rnbqkbnr/pppppppp/8/2R5/5R2/2R5/PPPPPPP1/1NBQKBN1 w - - 0 1")); QVector lgl_b0 = b0.legal_moves(); for(int i=0;i lgl_b1 = b1.legal_moves(); for(int i=0;i lgl_b2 = b2.legal_moves(); for(int i=0;i mvs = p->findMoves(*b); for(int i=0;ifindMoves(*b); for(int i=0;ifindMoves(*b); for(int i=0;ifindMoves(*b); for(int i=0;ifindMoves(*b); for(int i=0;ifindMoves(*b); for(int i=0;ifindMoves(*b); for(int i=0;ifindMoves(*b); for(int i=0;ifindMoves(*b); for(int i=0;izobrist(); std::cout << "expected: 463b96181691fc9c" << std::endl; std::cout << "got : " << std::hex << key << std::dec << std::endl << std::endl; delete b; b = new Board(QString("rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1")); key = b->zobrist(); std::cout << "expected: 823c9b50fd114196" << std::endl; std::cout << "got : " << std::hex << key << std::dec << std::endl << std::endl; delete b; b = new Board(QString("rnbqkbnr/ppp1pppp/8/3p4/4P3/8/PPPP1PPP/RNBQKBNR w KQkq d6 0 2")); key = b->zobrist(); std::cout << "expected: 756b94461c50fb0" << std::endl; std::cout << "got : " << std::hex << key << std::dec << std::endl << std::endl; delete b; b = new Board(QString("rnbqkbnr/ppp1pppp/8/3pP3/8/8/PPPP1PPP/RNBQKBNR b KQkq - 0 2")); key = b->zobrist(); std::cout << "expected: 662fafb965db29d4" << std::endl; std::cout << "got : " << std::hex << key << std::dec << std::endl << std::endl; delete b; b = new Board(QString("rnbqkbnr/ppp1p1pp/8/3pPp2/8/8/PPPP1PPP/RNBQKBNR w KQkq f6 0 3")); key = b->zobrist(); std::cout << "expected: 22a48b5a8e47ff78" << std::endl; std::cout << "got : " << std::hex << key << std::dec << std::endl << std::endl; delete b; b = new Board(QString("rnbqkbnr/ppp1p1pp/8/3pPp2/8/8/PPPPKPPP/RNBQ1BNR b kq - 0 3")); key = b->zobrist(); std::cout << "expected: 652a607ca3f242c1" << std::endl; std::cout << "got : " << std::hex << key << std::dec << std::endl << std::endl; delete b; b = new Board(QString("rnbq1bnr/ppp1pkpp/8/3pPp2/8/8/PPPPKPPP/RNBQ1BNR w - - 0 4")); key = b->zobrist(); std::cout << "expected: fdd303c946bdd9" << std::endl; std::cout << "got : " << std::hex << key << std::dec << std::endl << std::endl; delete b; b = new Board(QString("rnbqkbnr/p1pppppp/8/8/PpP4P/8/1P1PPPP1/RNBQKBNR b KQkq c3 0 3")); key = b->zobrist(); std::cout << "expected: 3c8123ea7b067637" << std::endl; std::cout << "got : " << std::hex << key << std::dec << std::endl << std::endl; delete b; b = new Board(QString("rnbqkbnr/p1pppppp/8/8/P6P/R1p5/1P1PPPP1/1NBQKBNR b Kkq - 0 4")); key = b->zobrist(); std::cout << "expected: 5c3f9b829b279560" << std::endl; std::cout << "got : " << std::hex << key << std::dec << std::endl << std::endl; delete b; } } jerry-3.2.0/src/resources.qrc0000664000175000017500000000774613514421177014722 0ustar useruser res/icons/applications-graphics.svg res/icons/computer.svg res/icons/database.svg res/icons/dialog-information.svg res/icons/document-enter-position.svg res/icons/document-new.svg res/icons/document-open.svg res/icons/document-print-board.svg res/icons/document-print.svg res/icons/document-properties.svg res/icons/document-save.svg res/icons/edit-copy-fen.svg res/icons/edit-copy-pgn.svg res/icons/edit-copy.svg res/icons/edit-find-replace.svg res/icons/edit-find.svg res/icons/edit-paste.svg res/icons/edit-redo.svg res/icons/edit-undo.svg res/icons/emblem-system.svg res/icons/File_Edit-metadata.svg res/icons/File_Video-display.svg res/icons/go-first.svg res/icons/go-last.svg res/icons/go-next.svg res/icons/go-previous.svg res/icons/help-browser.svg res/icons/jerry_icon16.png res/icons/jerry_icon32.png res/icons/jerry_icon48.png res/icons/jerry_icon256.png res/icons/internet-web-browser.svg res/icons/mail-mark-junk.svg res/icons/mail-mark-not-junk.svg res/icons/osx_icon.icns res/icons/play-black.svg res/icons/play-white.svg res/icons/preferences-system-session.svg res/icons/system-log-out.svg res/icons/system-search.svg res/icons/text-pencil.svg res/icons/view-refresh.svg res/icons/win_icon.ico res/board/marble_blue_dark.jpg res/board/marble_blue_light.jpg res/board/marble_green_dark.jpg res/board/marble_green_light.jpg res/board/wood_dark.jpg res/board/wood_light.jpg res/pieces/merida/bb.svg res/pieces/merida/bk.svg res/pieces/merida/bn.svg res/pieces/merida/bp.svg res/pieces/merida/bq.svg res/pieces/merida/br.svg res/pieces/merida/wb.svg res/pieces/merida/wk.svg res/pieces/merida/wn.svg res/pieces/merida/wp.svg res/pieces/merida/wq.svg res/pieces/merida/wr.svg res/pieces/old/bb.svg res/pieces/old/bk.svg res/pieces/old/bn.svg res/pieces/old/bp.svg res/pieces/old/bq.svg res/pieces/old/br.svg res/pieces/old/wb.svg res/pieces/old/wk.svg res/pieces/old/wn.svg res/pieces/old/wp.svg res/pieces/old/wq.svg res/pieces/old/wr.svg res/pieces/uscf/bb.svg res/pieces/uscf/bk.svg res/pieces/uscf/bn.svg res/pieces/uscf/bp.svg res/pieces/uscf/bq.svg res/pieces/uscf/br.svg res/pieces/uscf/wb.svg res/pieces/uscf/wk.svg res/pieces/uscf/wn.svg res/pieces/uscf/wp.svg res/pieces/uscf/wq.svg res/pieces/uscf/wr.svg jerry-3.2.0/src/LICENSE.TXT0000664000175000017500000004325413514421177013656 0ustar useruser GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. jerry-3.2.0/src/funct.h0000664000175000017500000000300413514421177013450 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef FUNCT_H #define FUNCT_H #include #include "chess/board.h" #include "uci/engine_info.h" namespace chess { class FuncT : public QObject { Q_OBJECT public: explicit FuncT(QObject *parent = 0); void run_pgnt(); void run_sant(); void run_pertf(); void run_pgn_scant(); void run_ucit(); void run_zobrist_test(); void run_polyglot(); void run_rand(); void run_pgn_speedtest(); private: int count_moves(Board b, int depth); void rwrw_pgn(const QString &fn_in, const QString &fn_out); signals: public slots: void printInfo(QString info); void printBestmove(const QString &move); }; } #endif // PERFT_H jerry-3.2.0/src/chess/0000775000175000017500000000000013514421177013270 5ustar useruserjerry-3.2.0/src/chess/pgn_reader.cpp0000664000175000017500000010022113514421177016076 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "chess/pgn_reader.h" #include "chess/game.h" #include "chess/game_node.h" #include #include #include #include #include #include #include namespace chess { const char* PgnReader::detect_encoding(const QString &filename) { // very simple way to detecting majority of encodings: // first try ISO 8859-1 // open the file and read a max of 100 first bytes // if conversion to unicode works, try some more bytes (at most 40 * 100) // if conversion errors occur, we simply assume UTF-8 const char* iso = "ISO 8859-1"; const char* utf8 = "UTF-8"; QFile file(filename); if(!file.open(QFile::ReadOnly)) { return utf8; } QDataStream in(&file); // init some char array to read bytes char first100arr[100]; for(int i=0;i<100;i++) { first100arr[i] = 0x00; } char *first100 = first100arr; // prep conversion tools QTextCodec::ConverterState state; QTextCodec *codec = QTextCodec::codecForName("UTF-8"); int iterations = 40; int i=0; int l = 100; bool isUtf8 = true; while(i=100) { l = in.readRawData(first100, 100); const QString text = codec->toUnicode(first100, 100, &state); if (state.invalidChars > 0) { isUtf8 = false; break; } i++; } if(isUtf8) { return utf8; } else { return iso; } } bool PgnReader::detectUtf8(const QString &filename) { // very simple way to detecting majority of encodings: // first try ISO 8859-1 // open the file and read a max of 100 first bytes // if conversion to unicode works, try some more bytes (at most 40 * 100) // if conversion errors occur, we simply assume UTF-8 //const char* iso = "ISO 8859-1"; //const char* utf8 = "UTF-8"; QFile file(filename); if(!file.open(QFile::ReadOnly)) { return true; } QDataStream in(&file); // init some char array to read bytes char first100arr[100]; for(int i=0;i<100;i++) { first100arr[i] = 0x00; } char *first100 = first100arr; // prep conversion tools QTextCodec::ConverterState state; QTextCodec *codec = QTextCodec::codecForName("UTF-8"); int iterations = 40; int i=0; int l = 100; bool isUtf8 = true; while(i=100) { l = in.readRawData(first100, 100); const QString text = codec->toUnicode(first100, 100, &state); if (state.invalidChars > 0) { isUtf8 = false; break; } i++; } return isUtf8; } QVector PgnReader::scan_headers(const QString &filename, const char* encoding) { QVector header_offsets; QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return header_offsets; bool inComment = false; PgnHeader game_header; qint64 game_pos = -1; QByteArray line; //QString(""); qint64 last_pos = file.pos(); int i= 0; while(!file.atEnd()) { i++; line = file.readLine(); // skip comments if(line.startsWith("%")) { line = file.readLine(); continue; } if(!inComment && line.startsWith("[")) { QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { if(game_pos == -1) { /* game_header.insert("Event","?"); game_header.insert("Site","?"); game_header.insert("Date","????.??.??"); game_header.insert("Round","?"); game_header.insert("White","?"); game_header.insert("Black","?"); game_header.insert("Result","*"); */ game_pos = last_pos; } QString tag = match_t.captured(1); QString value = match_t.captured(2); if(tag == "Event") { game_header.event = value; } if(tag == "Site") { game_header.site = value; } if(tag == "Date") { game_header.date = value; } if(tag == "Round") { game_header.round = value; } if(tag == "White") { game_header.white = value; } if(tag == "Black") { game_header.black = value; } if(tag == "Result") { game_header.white = value; } last_pos = file.pos(); line = file.readLine(); continue; } } if((!inComment && line.contains("{")) || (inComment && line.contains("}"))) { inComment = line.lastIndexOf("{") > line.lastIndexOf("}"); } if(game_pos != -1) { PgnHeaderOffset ho; ho.header = game_header; ho.offset = game_pos; header_offsets.append(ho); game_pos = -1; PgnHeader temp; game_header = temp; //new QMap(); } last_pos = file.pos(); line = file.readLine(); } // for the last game if(game_pos != -1) { PgnHeaderOffset ho; ho.header = game_header; ho.offset = game_pos; header_offsets.append(ho); game_pos = -1; PgnHeader temp; game_header = temp; } return header_offsets; } QVector PgnReader::scan_headers_foo(const QString &filename, const char* encoding) { QVector header_offsets; QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return header_offsets; bool inComment = false; //QMap game_header; qint64 game_pos = -1; //QTextStream in(&file); //QTextCodec *codec = QTextCodec::codecForName(encoding); //in.setCodec(codec); QString line = QString(""); //qint64 last_pos = in.pos(); int i= 0; int gameCounter = 0; bool foundGame = false; PgnHeaderOffset ho; quint64 offset = 0; while(!file.atEnd()) { i++; QByteArray line = file.readLine(); offset += line.length(); // skip comments if(line.startsWith("%")) { line = file.readLine(); offset += line.length(); continue; } if(!inComment && line.startsWith("[")) { if(foundGame == false) { header_offsets.append(ho); PgnHeaderOffset temp; ho = temp; ho.offset = file.pos(); foundGame = true; } //QString text_line = QString::fromLatin1(line.data()); QString text_line = QString::fromUtf8(line.data()); QRegularExpressionMatch match_t = TAG_REGEX.match(text_line); if(match_t.hasMatch()) { QString tag = match_t.captured(1); QString value = match_t.captured(2); if(tag == "Event") { ho.header.event = value; } if(tag == "Site") { ho.header.site = value; } if(tag == "Date") { ho.header.date = value; } if(tag == "Round") { ho.header.round = value; } if(tag == "White") { ho.header.white = value; } if(tag == "Black") { ho.header.black = value; } if(tag == "Result") { ho.header.white = value; } //game_headerinsert(tag,value); gameCounter += 1; //if(gameCounter % 100000 == 0) { // std::cout << gameCounter << std::endl; //} // last_pos = in.pos(); line = file.readLine(); offset += line.length(); continue; } } else { foundGame = false; } if((!inComment && line.contains("{")) || (inComment && line.contains("}"))) { inComment = line.lastIndexOf("{") > line.lastIndexOf("}"); } if(game_pos != -1) { PgnHeader game_header; PgnHeaderOffset ho; ho.header = game_header; ho.offset = game_pos; header_offsets.append(ho); game_pos = -1; //game_header = QMap(); //new QMap(); } //last_pos = in.pos(); line = file.readLine(); offset += line.length(); } // for the last game if(game_pos != -1) { HeaderOffset ho; //ho.headers = game_header; //ho.offset = game_pos; //header_offsets.append(ho); //game_pos = -1; //game_header = QMap(); } return header_offsets; } int PgnReader::readNextHeader(const QString &filename, const char* encoding, quint64 offset, HeaderOffset &headerOffset) { QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return -1; file.seek(offset); bool inComment = false; QMap game_header; qint64 game_pos = -1; QTextCodec *codec = QTextCodec::codecForName(encoding); QString line = QString(""); qint64 last_pos = file.pos(); QByteArray raw_line; // first seek until we have new tags bool foundTag = false; while(!file.atEnd() && !foundTag) { last_pos = file.pos(); raw_line = file.readLine(); line = codec->toUnicode(raw_line); if(line.startsWith("%")) { raw_line = file.readLine(); line = codec->toUnicode(raw_line); continue; } if(!inComment && line.startsWith("[")) { QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { foundTag = true; game_pos = last_pos; continue; } } } // if foundTag is true, we need to scan all remaining headers // read until we encounter a comment line if(foundTag) { bool stop = false; game_header.insert("Event","?"); game_header.insert("Site","?"); game_header.insert("Date","????.??.??"); game_header.insert("Round","?"); game_header.insert("White","?"); game_header.insert("Black","?"); game_header.insert("Result","*"); while(!file.atEnd() && !stop) { if(line.startsWith("[")) { QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { QString tag = match_t.captured(1); QString value = match_t.captured(2); game_header.insert(tag,value); } } else { stop = true; continue; } raw_line = file.readLine(); line = codec->toUnicode(raw_line); } headerOffset.headers = game_header; headerOffset.offset = game_pos; } else { return -1; } // set offset to last encountered line offset = file.pos(); return 0; } QList PgnReader::scan_headers_fast(const QString &filename, const char* encoding) { QList header_offsets; QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return header_offsets; bool inComment = false; QMap game_header; qint64 game_pos = -1; QTextCodec *codec = QTextCodec::codecForName(encoding); QString line = QString(""); qint64 last_pos = file.pos(); int i= 0; QByteArray raw_line; while(!file.atEnd()) { i++; raw_line = file.readLine(); line = codec->toUnicode(raw_line); // skip comments if(line.startsWith("%")) { raw_line = file.readLine(); line = codec->toUnicode(raw_line); continue; } if(!inComment && line.startsWith("[")) { QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { if(game_pos == -1) { game_header.insert("Event","?"); game_header.insert("Site","?"); game_header.insert("Date","????.??.??"); game_header.insert("Round","?"); game_header.insert("White","?"); game_header.insert("Black","?"); game_header.insert("Result","*"); game_pos = last_pos; } QString tag = match_t.captured(1); QString value = match_t.captured(2); game_header.insert(tag,value); last_pos = file.pos(); // line = in.readLine(); raw_line = file.readLine(); line = codec->toUnicode(raw_line); continue; } } if((!inComment && line.contains("{")) || (inComment && line.contains("}"))) { inComment = line.lastIndexOf("{") > line.lastIndexOf("}"); } if(game_pos != -1) { HeaderOffset ho; ho.headers = game_header; ho.offset = game_pos; header_offsets.append(ho); game_pos = -1; game_header = QMap(); } last_pos = file.pos(); raw_line = file.readLine(); line = codec->toUnicode(raw_line); } // for the last game if(game_pos != -1) { HeaderOffset ho; ho.headers = game_header; ho.offset = game_pos; header_offsets.append(ho); game_pos = -1; game_header = QMap(); } return header_offsets; } QString PgnReader::readFileIntoString(const QString &filename, const char* encoding) { QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) throw std::invalid_argument("could readGameIntoString w/ supplied filename"); QTextStream in(&file); QTextCodec *codec = QTextCodec::codecForName(encoding); in.setCodec(codec); QString everything = in.readAll(); return everything; } QList PgnReader::scan_headersFromString(QString &contents) { QList header_offsets; bool inComment = false; QMap game_header; qint64 game_pos = -1; QTextStream in(&contents); QString line = QString(""); qint64 last_pos = in.pos(); int i= 0; while(!in.atEnd()) { i++; line = in.readLine(); // skip comments if(line.startsWith("%")) { line = in.readLine(); continue; } if(!inComment && line.startsWith("[")) { QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { if(game_pos == -1) { game_header.insert("Event","?"); game_header.insert("Site","?"); game_header.insert("Date","????.??.??"); game_header.insert("Round","?"); game_header.insert("White","?"); game_header.insert("Black","?"); game_header.insert("Result","*"); game_pos = last_pos; } QString tag = match_t.captured(1); QString value = match_t.captured(2); game_header.insert(tag,value); last_pos = in.pos(); continue; } } if((!inComment && line.contains("{")) || (inComment && line.contains("}"))) { inComment = line.lastIndexOf("{") > line.lastIndexOf("}"); } if(game_pos != -1) { HeaderOffset ho; ho.headers = game_header; ho.offset = game_pos; header_offsets.append(ho); game_pos = -1; game_header = QMap(); } last_pos = in.pos(); line = in.readLine(); } // for the last game if(game_pos != -1) { HeaderOffset ho; ho.headers = game_header; ho.offset = game_pos; header_offsets.append(ho); game_pos = -1; game_header = QMap(); } return header_offsets; } chess::Game* PgnReader::readGameFromFile(const QString &filename, const char* encoding) { return this->readGameFromFile(filename, encoding, 0); } chess::Game* PgnReader::readGameFromString(QString &pgn_string) { QTextStream in(&pgn_string); return this->readGame(in); } chess::Game* PgnReader::readGameFromString(QString &pgn_string, quint64 offset) { QString substring = QString(pgn_string.mid(offset, pgn_string.size())); QTextStream in(&substring); return this->readGame(in); } chess::Game* PgnReader::readGameFromFile(const QString &filename, const char* encoding, qint64 offset) { QFile file(filename); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { throw std::invalid_argument("unable to open file w/ supplied filename"); } QTextStream in(&file); QTextCodec *codec = QTextCodec::codecForName(encoding); in.setCodec(codec); if(offset != 0 && offset > 0) { in.seek(offset); } //qDebug() << "reading game at: " << offset; chess::Game* g = this->readGame(in); file.close(); return g; } chess::Game* PgnReader::readGame(QTextStream& in) { chess::Game* g = new Game(); QString starting_fen = QString(""); QStack *game_stack = new QStack(); game_stack->push(g->getRootNode()); GameNode* current = g->getRootNode(); QString line = in.readLine(); while (!in.atEnd()) { if(line.startsWith("%") || line.isEmpty()) { line = in.readLine(); continue; } QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { QString tag = match_t.captured(1); QString value = match_t.captured(2); // don't add FEN tag explicitly, // will be always automatically generated and added // when printing a game later... if(tag == QString("FEN")) { starting_fen = value; } else { //g->headers.insert(tag,value); g->setHeader(tag, value); } } else { break; } line = in.readLine(); } // try to set starting fen, if available if(!starting_fen.isEmpty()) { //chess::Board b_fen = 0; try { chess::Board b_fen(starting_fen); if(!b_fen.is_consistent()) { std::cerr << "starting fen position is not consistent" << std::endl; game_stack->clear(); delete game_stack; return g; } else { current->setBoard(b_fen); } } catch(std::invalid_argument a) { // just silently fail... but first clean up //if(b_fen != 0) { // delete b_fen; //} game_stack->clear(); delete game_stack; std::cerr << a.what() << std::endl; return g; } } // Get the next non-empty line. while(line.trimmed() == QString("") && !line.isEmpty()) { line = in.readLine(); } bool foundContent = false; bool last_line = false; while(!in.atEnd() || !last_line || !line.isEmpty()) { if(in.atEnd()) { last_line = true; } bool readNextLine = true; if(line.trimmed().isEmpty() && foundContent) { delete game_stack; return g; } QRegularExpressionMatchIterator i = MOVETEXT_REGEX.globalMatch(line); while (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString token = match.captured(0); if(token.startsWith("%")) { line = in.readLine(); continue; } if(token.startsWith("{")) { line = token.remove(0,1); QStringList *comment_lines = new QStringList(); // get comments - possibly over multiple lines if(line.isEmpty()) { line = in.readLine(); } while(!line.isEmpty() && !line.contains("}")) { comment_lines->append(line.trimmed()); line = in.readLine(); } int end_index = line.indexOf("}"); if(end_index != -1) { // create a copy, so that we don't // destroy original line... QString comment_line = QString(line); comment_line.remove(end_index,line.length()-end_index); comment_lines->append(comment_line); } if(line.contains("}")) { end_index = line.indexOf("}"); line = line.remove(0,end_index+1); } else { line = QString(""); } QString comment_joined = comment_lines->join(QString("\n")); current->setComment(comment_joined); // if the line didn't end with }, we don't want to read the next line yet if(!line.trimmed().isEmpty()) { readNextLine = false; } delete comment_lines; break; } else if(token.startsWith("$")) { // found a nag int nag = token.remove(0,1).toInt(); current->addNag(nag); } else if(token == QString("?")) { current->addNag(NAG_MISTAKE); } else if(token == QString("??")) { current->addNag(NAG_BLUNDER); } else if(token == QString("!")) { current->addNag(NAG_GOOD_MOVE); } else if(token == QString("!!")) { current->addNag(NAG_BRILLIANT_MOVE); } else if(token == QString("!?")) { current->addNag(NAG_SPECULATIVE_MOVE); } else if(token == QString("?!")) { current->addNag(NAG_DUBIOUS_MOVE); } else if(token == QString("(")) { // put current node on stack, so that we don't forget it. game_stack->push(current); current = current->getParent(); } else if(token == QString(")")) { // pop from stack. but always leave root if(game_stack->size() > 1) { current = game_stack->pop(); } } else if(token == QString("1-0")) { g->setResult(RES_WHITE_WINS); foundContent = true; } else if(token == QString("0-1")) { g->setResult(RES_BLACK_WINS); foundContent = true; } else if(token == QString("1/2-1/2")) { g->setResult(RES_DRAW); foundContent = true; } else if(token == QString("*")) { g->setResult(RES_UNDEF); foundContent = true; } else { // this should be a san token foundContent = true; // zeros in castling (common bug) if(token==QString("0-0")) { token = QString("O-O"); } else if(token ==QString("0-0-0")) { token = QString("O-O-O"); } //Move *m = 0; GameNode *next = new GameNode(); // Board *b_next = 0; try { Board b = current->getBoard(); Move m = Move(b.parse_san(token)); Board b_next = Board(b); b_next.apply(m); next->setMove(m); next->setBoard(b_next); next->setParent(current); current->addVariation(next); current = next; } catch(std::invalid_argument a) { // just silently fail... but first clean up //if(m!=0) { // delete m; //} //if(b_next!=0) { // delete b_next; //} delete next; current = g->getRootNode(); game_stack->clear(); delete game_stack; std::cerr << a.what() << std::endl; return g; } } } if(readNextLine) { line = in.readLine(); } } game_stack->clear(); delete game_stack; return g; } QVector PgnReader::scanPgn(QString &filename, bool isLatin1) { QVector offsets; QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return offsets; bool inComment = false; qint64 game_pos = -1; QByteArray byteLine; QString line(""); qint64 last_pos = file.pos(); int i= 0; while(!file.atEnd()) { //if(offsets.length() % 100000 == 0) { // std::cout << offsets.length() << std::endl; //} i++; byteLine = file.readLine(); if(isLatin1) { line = QString::fromLatin1(byteLine); } else { line = QString::fromUtf8(byteLine); } // skip comments if(line.startsWith("%")) { byteLine = file.readLine(); continue; } if(!inComment && line.startsWith("[")) { //QRegularExpressionMatch match_t = TAG_REGEX.match(line); //if(match_t.hasMatch()) { if(game_pos == -1) { game_pos = last_pos; } last_pos = file.pos(); byteLine = file.readLine(); continue; //} } if((!inComment && line.contains("{")) || (inComment && line.contains("}"))) { inComment = line.lastIndexOf("{") > line.lastIndexOf("}"); } if(game_pos != -1) { offsets.append(game_pos); game_pos = -1; } last_pos = file.pos(); byteLine = file.readLine(); } // for the last game if(game_pos != -1) { offsets.append(game_pos); game_pos = -1; } return offsets; } chess::Game* PgnReader::readGameFromPgnAt(QString &filename, qint64 offset, bool isUtf8) { return nullptr; } QVector PgnReader::readMultipleHeadersFromPgnAround(QString &filename, QVector &offsets, bool isUtf8) { QFile file(filename); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { throw std::invalid_argument("unable to open file w/ supplied filename"); } QTextStream in(&file); QTextCodec *codec; if(isUtf8) { codec = QTextCodec::codecForName("UTF-8"); } else { codec = QTextCodec::codecForName("ISO 8859-1"); } in.setCodec(codec); QVector HeaderOffsets; for(int i=0;i 0) { in.seek(offset); } PgnHeader header; bool foundHeader = false; bool continueSearch = true; QString line = in.readLine(); while(!in.atEnd() && continueSearch) { line = in.readLine(); if(line.startsWith("%") || line.isEmpty()) { line = in.readLine(); continue; } QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { foundHeader = true; QString tag = match_t.captured(1); QString value = match_t.captured(2); if(tag == "Event") { header.event = value; } if(tag == "Site") { header.site = value; } if(tag == "Date") { header.date = value; } if(tag == "Round") { header.round = value; } if(tag == "White") { header.white = value; } if(tag == "Black") { header.black = value; } if(tag == "Result") { header.result = value; } } else { if(foundHeader) { continueSearch = false; break; } } } PgnHeaderOffset ho; ho.offset = offset; ho.header = header; HeaderOffsets.append(ho); } file.close(); return HeaderOffsets; } PgnHeader PgnReader::readSingleHeaderFromPgnAt(QString &filename, qint64 offset, bool isUtf8) { QFile file(filename); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { throw std::invalid_argument("unable to open file w/ supplied filename"); } QTextStream in(&file); QTextCodec *codec; if(isUtf8) { codec = QTextCodec::codecForName("UTF-8"); } else { codec = QTextCodec::codecForName("ISO 8859-1"); } in.setCodec(codec); if(offset != 0 && offset > 0) { in.seek(offset); } PgnHeader header; bool foundHeader = false; bool continueSearch = true; QString line = in.readLine(); while(!in.atEnd() && continueSearch) { line = in.readLine(); if(line.startsWith("%") || line.isEmpty()) { line = in.readLine(); continue; } QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { foundHeader = true; QString tag = match_t.captured(1); QString value = match_t.captured(2); if(tag == "Event") { header.event = value; } if(tag == "Site") { header.site = value; } if(tag == "Date") { header.date = value; } if(tag == "Round") { header.round = value; } if(tag == "White") { header.white = value; } if(tag == "Black") { header.black = value; } if(tag == "Result") { header.result = value; } if(tag == "ECO") { header.eco = value; } } else { if(foundHeader) { continueSearch = false; break; } } } file.close(); return header; } } jerry-3.2.0/src/chess/database.cpp0000664000175000017500000000007713514421177015544 0ustar useruser#include "chess/database.h" chess::Database::~Database() { } jerry-3.2.0/src/chess/pgn_printer.cpp0000664000175000017500000001643413514421177016333 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "game.h" #include "pgn_printer.h" namespace chess { PgnPrinter::PgnPrinter() { this->pgn = QStringList(); this->currentLine = QString(""); this->variationDepth = 0; this->forceMoveNumber = true; } void PgnPrinter::reset() { this->pgn.clear(); this->currentLine = QString(""); this->variationDepth = 0; this->forceMoveNumber = true; } void PgnPrinter::flushCurrentLine() { if(!this->currentLine.isEmpty()) { QString line_copy = QString(this->currentLine); this->pgn.append(line_copy.trimmed()); } this->currentLine = QString(""); } void PgnPrinter::writeToken(const QString &token) { if(80 - this->currentLine.length() < token.length()) { this->flushCurrentLine(); } this->currentLine.append(token); } void PgnPrinter::writeLine(const QString &line) { this->flushCurrentLine(); this->pgn.append(line.trimmed()); } void PgnPrinter::writeGame(Game &g, const QString &filename) { QStringList pgn = this->printGame(g); QFile fOut(filename); bool success = false; if(fOut.open(QFile::WriteOnly | QFile::Text)) { QTextStream s(&fOut); for (int i = 0; i < pgn.size(); ++i) { s << pgn.at(i) << '\n'; } success = true; } else { std::cerr << "error opening output file\n"; } fOut.close(); if(!success) { throw std::invalid_argument("Error writing file"); } } void PgnPrinter::printHeaders(QStringList &pgn, Game &g) { QString tag = "[Event \"" + g.getHeader("Event") + "\"]"; pgn.append(tag); tag = "[Site \"" + g.getHeader("Site") + "\"]"; pgn.append(tag); tag = "[Date \"" + g.getHeader("Date") + "\"]"; pgn.append(tag); tag = "[Round \"" + g.getHeader("Round") + "\"]"; pgn.append(tag); tag = "[White \"" + g.getHeader("White") + "\"]"; pgn.append(tag); tag = "[Black \"" + g.getHeader("Black") + "\"]"; pgn.append(tag); tag = "[Result \"" + g.getHeader("Result") + "\"]"; pgn.append(tag); QStringList all_tags = g.getTags(); for(int i=0;igetBoard(); if(!root.is_initial_position()) { QString tag = "[FEN \"" + root.fen() + "\"]"; pgn.append(tag); } } QStringList PgnPrinter::printGame(Game &g) { this->reset(); //pgn = new QStringList(); // first print the headers this->printHeaders(pgn, g); this->writeLine(QString("")); GameNode *root = g.getRootNode(); // special case if the root node has // a comment before the actual game starts if(!root->getComment().isEmpty()) { this->printComment(root->getComment()); } this->printGameContent((*root)); this->printResult(g.getResult()); this->pgn.append(this->currentLine); return this->pgn; } void PgnPrinter::printMove(Board &b, Move &m) { if(b.turn == WHITE) { QString tkn = QString::number(b.fullmove_number); tkn.append(QString(". ")); this->writeToken(tkn); } else if(this->forceMoveNumber) { QString tkn = QString::number(b.fullmove_number); tkn.append(QString("... ")); this->writeToken(tkn); } this->writeToken((b.san(m)).append(QString(" "))); this->forceMoveNumber = false; } void PgnPrinter::printNag(int nag) { QString tkn = QString("$").append(QString::number(nag)).append(" "); this->writeToken(tkn); } void PgnPrinter::printResult(int result) { QString res = ""; if(result == RES_WHITE_WINS) { res = QString("1-0"); } else if(result == RES_BLACK_WINS) { res = QString("0-1"); } else if(result == RES_DRAW) { res = QString("1/2-1/2"); } else { res = QString("*"); } this->writeToken(res.append(" ")); } void PgnPrinter::beginVariation() { this->variationDepth++; QString tkn = QString("( "); this->writeToken(tkn); this->forceMoveNumber = true; } void PgnPrinter::endVariation() { this->variationDepth--; QString tkn = QString(") "); this->writeToken(tkn); this->forceMoveNumber = true; } void PgnPrinter::printComment(const QString &comment) { QString temp_c = QString(comment); QString write = QString("{ ").append(temp_c.replace("}","").trimmed()).append(" } "); this->writeToken(write); //this->forceMoveNumber = false; } void PgnPrinter::printGameContent(GameNode &g) { Board b = g.getBoard(); // first write mainline move, if there are variations int cntVar = g.getVariations().count(); if(cntVar > 0) { GameNode* main_variation = g.getVariation(0); Move m = main_variation->getMove(); this->printMove(b,m); // write nags QVector nags = main_variation->getNags(); for(int j=0;jprintNag(n); } // write comments if(!main_variation->getComment().isEmpty()) { this->printComment(main_variation->getComment()); } } // now handle all variations (sidelines) for(int i=1;ibeginVariation(); chess::Move m_temp = var_i->getMove(); this->printMove(b,m_temp); // next print nags QVector nags = var_i->getNags(); for(int j=0;jprintNag(n); } // finally print comments if(!var_i->getComment().isEmpty()) { this->printComment(var_i->getComment()); } // recursive call for all childs this->printGameContent(*var_i); // print variation end this->endVariation(); } // finally do the mainline if(cntVar > 0) { GameNode* main_variation = g.getVariation(0); this->printGameContent((*main_variation)); } } } jerry-3.2.0/src/chess/polyglot.h0000664000175000017500000000077413514421177015322 0ustar useruser#ifndef POLYGLOT_H #define POLYGLOT_H #include #include #include "move.h" #include "board.h" namespace chess { struct Entry { quint64 key; quint16 move; quint16 weight; quint32 learn; }; class Polyglot { public: Polyglot(QString &bookname); QVector findMoves(Board &board); bool inBook(Board &board); private: QByteArray book; Entry entryFromOffset(int offset); Move moveFromEntry(Entry e); bool readFile; }; } #endif // POLYGLOT_H jerry-3.2.0/src/chess/board.cpp0000664000175000017500000031641413514421177015074 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include "board.h" #include #include #include #include #include #include "move.h" using namespace std; namespace chess { quint64 POLYGLOT_RANDOM_64[781] = { Q_UINT64_C(0x9D39247E33776D41), Q_UINT64_C(0x2AF7398005AAA5C7), Q_UINT64_C(0x44DB015024623547), Q_UINT64_C(0x9C15F73E62A76AE2), Q_UINT64_C(0x75834465489C0C89), Q_UINT64_C(0x3290AC3A203001BF), Q_UINT64_C(0x0FBBAD1F61042279), Q_UINT64_C(0xE83A908FF2FB60CA), Q_UINT64_C(0x0D7E765D58755C10), Q_UINT64_C(0x1A083822CEAFE02D), Q_UINT64_C(0x9605D5F0E25EC3B0), Q_UINT64_C(0xD021FF5CD13A2ED5), Q_UINT64_C(0x40BDF15D4A672E32), Q_UINT64_C(0x011355146FD56395), Q_UINT64_C(0x5DB4832046F3D9E5), Q_UINT64_C(0x239F8B2D7FF719CC), Q_UINT64_C(0x05D1A1AE85B49AA1), Q_UINT64_C(0x679F848F6E8FC971), Q_UINT64_C(0x7449BBFF801FED0B), Q_UINT64_C(0x7D11CDB1C3B7ADF0), Q_UINT64_C(0x82C7709E781EB7CC), Q_UINT64_C(0xF3218F1C9510786C), Q_UINT64_C(0x331478F3AF51BBE6), Q_UINT64_C(0x4BB38DE5E7219443), Q_UINT64_C(0xAA649C6EBCFD50FC), Q_UINT64_C(0x8DBD98A352AFD40B), Q_UINT64_C(0x87D2074B81D79217), Q_UINT64_C(0x19F3C751D3E92AE1), Q_UINT64_C(0xB4AB30F062B19ABF), Q_UINT64_C(0x7B0500AC42047AC4), Q_UINT64_C(0xC9452CA81A09D85D), Q_UINT64_C(0x24AA6C514DA27500), Q_UINT64_C(0x4C9F34427501B447), Q_UINT64_C(0x14A68FD73C910841), Q_UINT64_C(0xA71B9B83461CBD93), Q_UINT64_C(0x03488B95B0F1850F), Q_UINT64_C(0x637B2B34FF93C040), Q_UINT64_C(0x09D1BC9A3DD90A94), Q_UINT64_C(0x3575668334A1DD3B), Q_UINT64_C(0x735E2B97A4C45A23), Q_UINT64_C(0x18727070F1BD400B), Q_UINT64_C(0x1FCBACD259BF02E7), Q_UINT64_C(0xD310A7C2CE9B6555), Q_UINT64_C(0xBF983FE0FE5D8244), Q_UINT64_C(0x9F74D14F7454A824), Q_UINT64_C(0x51EBDC4AB9BA3035), Q_UINT64_C(0x5C82C505DB9AB0FA), Q_UINT64_C(0xFCF7FE8A3430B241), Q_UINT64_C(0x3253A729B9BA3DDE), Q_UINT64_C(0x8C74C368081B3075), Q_UINT64_C(0xB9BC6C87167C33E7), Q_UINT64_C(0x7EF48F2B83024E20), Q_UINT64_C(0x11D505D4C351BD7F), Q_UINT64_C(0x6568FCA92C76A243), Q_UINT64_C(0x4DE0B0F40F32A7B8), Q_UINT64_C(0x96D693460CC37E5D), Q_UINT64_C(0x42E240CB63689F2F), Q_UINT64_C(0x6D2BDCDAE2919661), Q_UINT64_C(0x42880B0236E4D951), Q_UINT64_C(0x5F0F4A5898171BB6), Q_UINT64_C(0x39F890F579F92F88), Q_UINT64_C(0x93C5B5F47356388B), Q_UINT64_C(0x63DC359D8D231B78), Q_UINT64_C(0xEC16CA8AEA98AD76), Q_UINT64_C(0x5355F900C2A82DC7), Q_UINT64_C(0x07FB9F855A997142), Q_UINT64_C(0x5093417AA8A7ED5E), Q_UINT64_C(0x7BCBC38DA25A7F3C), Q_UINT64_C(0x19FC8A768CF4B6D4), Q_UINT64_C(0x637A7780DECFC0D9), Q_UINT64_C(0x8249A47AEE0E41F7), Q_UINT64_C(0x79AD695501E7D1E8), Q_UINT64_C(0x14ACBAF4777D5776), Q_UINT64_C(0xF145B6BECCDEA195), Q_UINT64_C(0xDABF2AC8201752FC), Q_UINT64_C(0x24C3C94DF9C8D3F6), Q_UINT64_C(0xBB6E2924F03912EA), Q_UINT64_C(0x0CE26C0B95C980D9), Q_UINT64_C(0xA49CD132BFBF7CC4), Q_UINT64_C(0xE99D662AF4243939), Q_UINT64_C(0x27E6AD7891165C3F), Q_UINT64_C(0x8535F040B9744FF1), Q_UINT64_C(0x54B3F4FA5F40D873), Q_UINT64_C(0x72B12C32127FED2B), Q_UINT64_C(0xEE954D3C7B411F47), Q_UINT64_C(0x9A85AC909A24EAA1), Q_UINT64_C(0x70AC4CD9F04F21F5), Q_UINT64_C(0xF9B89D3E99A075C2), Q_UINT64_C(0x87B3E2B2B5C907B1), Q_UINT64_C(0xA366E5B8C54F48B8), Q_UINT64_C(0xAE4A9346CC3F7CF2), Q_UINT64_C(0x1920C04D47267BBD), Q_UINT64_C(0x87BF02C6B49E2AE9), Q_UINT64_C(0x092237AC237F3859), Q_UINT64_C(0xFF07F64EF8ED14D0), Q_UINT64_C(0x8DE8DCA9F03CC54E), Q_UINT64_C(0x9C1633264DB49C89), Q_UINT64_C(0xB3F22C3D0B0B38ED), Q_UINT64_C(0x390E5FB44D01144B), Q_UINT64_C(0x5BFEA5B4712768E9), Q_UINT64_C(0x1E1032911FA78984), Q_UINT64_C(0x9A74ACB964E78CB3), Q_UINT64_C(0x4F80F7A035DAFB04), Q_UINT64_C(0x6304D09A0B3738C4), Q_UINT64_C(0x2171E64683023A08), Q_UINT64_C(0x5B9B63EB9CEFF80C), Q_UINT64_C(0x506AACF489889342), Q_UINT64_C(0x1881AFC9A3A701D6), Q_UINT64_C(0x6503080440750644), Q_UINT64_C(0xDFD395339CDBF4A7), Q_UINT64_C(0xEF927DBCF00C20F2), Q_UINT64_C(0x7B32F7D1E03680EC), Q_UINT64_C(0xB9FD7620E7316243), Q_UINT64_C(0x05A7E8A57DB91B77), Q_UINT64_C(0xB5889C6E15630A75), Q_UINT64_C(0x4A750A09CE9573F7), Q_UINT64_C(0xCF464CEC899A2F8A), Q_UINT64_C(0xF538639CE705B824), Q_UINT64_C(0x3C79A0FF5580EF7F), Q_UINT64_C(0xEDE6C87F8477609D), Q_UINT64_C(0x799E81F05BC93F31), Q_UINT64_C(0x86536B8CF3428A8C), Q_UINT64_C(0x97D7374C60087B73), Q_UINT64_C(0xA246637CFF328532), Q_UINT64_C(0x043FCAE60CC0EBA0), Q_UINT64_C(0x920E449535DD359E), Q_UINT64_C(0x70EB093B15B290CC), Q_UINT64_C(0x73A1921916591CBD), Q_UINT64_C(0x56436C9FE1A1AA8D), Q_UINT64_C(0xEFAC4B70633B8F81), Q_UINT64_C(0xBB215798D45DF7AF), Q_UINT64_C(0x45F20042F24F1768), Q_UINT64_C(0x930F80F4E8EB7462), Q_UINT64_C(0xFF6712FFCFD75EA1), Q_UINT64_C(0xAE623FD67468AA70), Q_UINT64_C(0xDD2C5BC84BC8D8FC), Q_UINT64_C(0x7EED120D54CF2DD9), Q_UINT64_C(0x22FE545401165F1C), Q_UINT64_C(0xC91800E98FB99929), Q_UINT64_C(0x808BD68E6AC10365), Q_UINT64_C(0xDEC468145B7605F6), Q_UINT64_C(0x1BEDE3A3AEF53302), Q_UINT64_C(0x43539603D6C55602), Q_UINT64_C(0xAA969B5C691CCB7A), Q_UINT64_C(0xA87832D392EFEE56), Q_UINT64_C(0x65942C7B3C7E11AE), Q_UINT64_C(0xDED2D633CAD004F6), Q_UINT64_C(0x21F08570F420E565), Q_UINT64_C(0xB415938D7DA94E3C), Q_UINT64_C(0x91B859E59ECB6350), Q_UINT64_C(0x10CFF333E0ED804A), Q_UINT64_C(0x28AED140BE0BB7DD), Q_UINT64_C(0xC5CC1D89724FA456), Q_UINT64_C(0x5648F680F11A2741), Q_UINT64_C(0x2D255069F0B7DAB3), Q_UINT64_C(0x9BC5A38EF729ABD4), Q_UINT64_C(0xEF2F054308F6A2BC), Q_UINT64_C(0xAF2042F5CC5C2858), Q_UINT64_C(0x480412BAB7F5BE2A), Q_UINT64_C(0xAEF3AF4A563DFE43), Q_UINT64_C(0x19AFE59AE451497F), Q_UINT64_C(0x52593803DFF1E840), Q_UINT64_C(0xF4F076E65F2CE6F0), Q_UINT64_C(0x11379625747D5AF3), Q_UINT64_C(0xBCE5D2248682C115), Q_UINT64_C(0x9DA4243DE836994F), Q_UINT64_C(0x066F70B33FE09017), Q_UINT64_C(0x4DC4DE189B671A1C), Q_UINT64_C(0x51039AB7712457C3), Q_UINT64_C(0xC07A3F80C31FB4B4), Q_UINT64_C(0xB46EE9C5E64A6E7C), Q_UINT64_C(0xB3819A42ABE61C87), Q_UINT64_C(0x21A007933A522A20), Q_UINT64_C(0x2DF16F761598AA4F), Q_UINT64_C(0x763C4A1371B368FD), Q_UINT64_C(0xF793C46702E086A0), Q_UINT64_C(0xD7288E012AEB8D31), Q_UINT64_C(0xDE336A2A4BC1C44B), Q_UINT64_C(0x0BF692B38D079F23), Q_UINT64_C(0x2C604A7A177326B3), Q_UINT64_C(0x4850E73E03EB6064), Q_UINT64_C(0xCFC447F1E53C8E1B), Q_UINT64_C(0xB05CA3F564268D99), Q_UINT64_C(0x9AE182C8BC9474E8), Q_UINT64_C(0xA4FC4BD4FC5558CA), Q_UINT64_C(0xE755178D58FC4E76), Q_UINT64_C(0x69B97DB1A4C03DFE), Q_UINT64_C(0xF9B5B7C4ACC67C96), Q_UINT64_C(0xFC6A82D64B8655FB), Q_UINT64_C(0x9C684CB6C4D24417), Q_UINT64_C(0x8EC97D2917456ED0), Q_UINT64_C(0x6703DF9D2924E97E), Q_UINT64_C(0xC547F57E42A7444E), Q_UINT64_C(0x78E37644E7CAD29E), Q_UINT64_C(0xFE9A44E9362F05FA), Q_UINT64_C(0x08BD35CC38336615), Q_UINT64_C(0x9315E5EB3A129ACE), Q_UINT64_C(0x94061B871E04DF75), Q_UINT64_C(0xDF1D9F9D784BA010), Q_UINT64_C(0x3BBA57B68871B59D), Q_UINT64_C(0xD2B7ADEEDED1F73F), Q_UINT64_C(0xF7A255D83BC373F8), Q_UINT64_C(0xD7F4F2448C0CEB81), Q_UINT64_C(0xD95BE88CD210FFA7), Q_UINT64_C(0x336F52F8FF4728E7), Q_UINT64_C(0xA74049DAC312AC71), Q_UINT64_C(0xA2F61BB6E437FDB5), Q_UINT64_C(0x4F2A5CB07F6A35B3), Q_UINT64_C(0x87D380BDA5BF7859), Q_UINT64_C(0x16B9F7E06C453A21), Q_UINT64_C(0x7BA2484C8A0FD54E), Q_UINT64_C(0xF3A678CAD9A2E38C), Q_UINT64_C(0x39B0BF7DDE437BA2), Q_UINT64_C(0xFCAF55C1BF8A4424), Q_UINT64_C(0x18FCF680573FA594), Q_UINT64_C(0x4C0563B89F495AC3), Q_UINT64_C(0x40E087931A00930D), Q_UINT64_C(0x8CFFA9412EB642C1), Q_UINT64_C(0x68CA39053261169F), Q_UINT64_C(0x7A1EE967D27579E2), Q_UINT64_C(0x9D1D60E5076F5B6F), Q_UINT64_C(0x3810E399B6F65BA2), Q_UINT64_C(0x32095B6D4AB5F9B1), Q_UINT64_C(0x35CAB62109DD038A), Q_UINT64_C(0xA90B24499FCFAFB1), Q_UINT64_C(0x77A225A07CC2C6BD), Q_UINT64_C(0x513E5E634C70E331), Q_UINT64_C(0x4361C0CA3F692F12), Q_UINT64_C(0xD941ACA44B20A45B), Q_UINT64_C(0x528F7C8602C5807B), Q_UINT64_C(0x52AB92BEB9613989), Q_UINT64_C(0x9D1DFA2EFC557F73), Q_UINT64_C(0x722FF175F572C348), Q_UINT64_C(0x1D1260A51107FE97), Q_UINT64_C(0x7A249A57EC0C9BA2), Q_UINT64_C(0x04208FE9E8F7F2D6), Q_UINT64_C(0x5A110C6058B920A0), Q_UINT64_C(0x0CD9A497658A5698), Q_UINT64_C(0x56FD23C8F9715A4C), Q_UINT64_C(0x284C847B9D887AAE), Q_UINT64_C(0x04FEABFBBDB619CB), Q_UINT64_C(0x742E1E651C60BA83), Q_UINT64_C(0x9A9632E65904AD3C), Q_UINT64_C(0x881B82A13B51B9E2), Q_UINT64_C(0x506E6744CD974924), Q_UINT64_C(0xB0183DB56FFC6A79), Q_UINT64_C(0x0ED9B915C66ED37E), Q_UINT64_C(0x5E11E86D5873D484), Q_UINT64_C(0xF678647E3519AC6E), Q_UINT64_C(0x1B85D488D0F20CC5), Q_UINT64_C(0xDAB9FE6525D89021), Q_UINT64_C(0x0D151D86ADB73615), Q_UINT64_C(0xA865A54EDCC0F019), Q_UINT64_C(0x93C42566AEF98FFB), Q_UINT64_C(0x99E7AFEABE000731), Q_UINT64_C(0x48CBFF086DDF285A), Q_UINT64_C(0x7F9B6AF1EBF78BAF), Q_UINT64_C(0x58627E1A149BBA21), Q_UINT64_C(0x2CD16E2ABD791E33), Q_UINT64_C(0xD363EFF5F0977996), Q_UINT64_C(0x0CE2A38C344A6EED), Q_UINT64_C(0x1A804AADB9CFA741), Q_UINT64_C(0x907F30421D78C5DE), Q_UINT64_C(0x501F65EDB3034D07), Q_UINT64_C(0x37624AE5A48FA6E9), Q_UINT64_C(0x957BAF61700CFF4E), Q_UINT64_C(0x3A6C27934E31188A), Q_UINT64_C(0xD49503536ABCA345), Q_UINT64_C(0x088E049589C432E0), Q_UINT64_C(0xF943AEE7FEBF21B8), Q_UINT64_C(0x6C3B8E3E336139D3), Q_UINT64_C(0x364F6FFA464EE52E), Q_UINT64_C(0xD60F6DCEDC314222), Q_UINT64_C(0x56963B0DCA418FC0), Q_UINT64_C(0x16F50EDF91E513AF), Q_UINT64_C(0xEF1955914B609F93), Q_UINT64_C(0x565601C0364E3228), Q_UINT64_C(0xECB53939887E8175), Q_UINT64_C(0xBAC7A9A18531294B), Q_UINT64_C(0xB344C470397BBA52), Q_UINT64_C(0x65D34954DAF3CEBD), Q_UINT64_C(0xB4B81B3FA97511E2), Q_UINT64_C(0xB422061193D6F6A7), Q_UINT64_C(0x071582401C38434D), Q_UINT64_C(0x7A13F18BBEDC4FF5), Q_UINT64_C(0xBC4097B116C524D2), Q_UINT64_C(0x59B97885E2F2EA28), Q_UINT64_C(0x99170A5DC3115544), Q_UINT64_C(0x6F423357E7C6A9F9), Q_UINT64_C(0x325928EE6E6F8794), Q_UINT64_C(0xD0E4366228B03343), Q_UINT64_C(0x565C31F7DE89EA27), Q_UINT64_C(0x30F5611484119414), Q_UINT64_C(0xD873DB391292ED4F), Q_UINT64_C(0x7BD94E1D8E17DEBC), Q_UINT64_C(0xC7D9F16864A76E94), Q_UINT64_C(0x947AE053EE56E63C), Q_UINT64_C(0xC8C93882F9475F5F), Q_UINT64_C(0x3A9BF55BA91F81CA), Q_UINT64_C(0xD9A11FBB3D9808E4), Q_UINT64_C(0x0FD22063EDC29FCA), Q_UINT64_C(0xB3F256D8ACA0B0B9), Q_UINT64_C(0xB03031A8B4516E84), Q_UINT64_C(0x35DD37D5871448AF), Q_UINT64_C(0xE9F6082B05542E4E), Q_UINT64_C(0xEBFAFA33D7254B59), Q_UINT64_C(0x9255ABB50D532280), Q_UINT64_C(0xB9AB4CE57F2D34F3), Q_UINT64_C(0x693501D628297551), Q_UINT64_C(0xC62C58F97DD949BF), Q_UINT64_C(0xCD454F8F19C5126A), Q_UINT64_C(0xBBE83F4ECC2BDECB), Q_UINT64_C(0xDC842B7E2819E230), Q_UINT64_C(0xBA89142E007503B8), Q_UINT64_C(0xA3BC941D0A5061CB), Q_UINT64_C(0xE9F6760E32CD8021), Q_UINT64_C(0x09C7E552BC76492F), Q_UINT64_C(0x852F54934DA55CC9), Q_UINT64_C(0x8107FCCF064FCF56), Q_UINT64_C(0x098954D51FFF6580), Q_UINT64_C(0x23B70EDB1955C4BF), Q_UINT64_C(0xC330DE426430F69D), Q_UINT64_C(0x4715ED43E8A45C0A), Q_UINT64_C(0xA8D7E4DAB780A08D), Q_UINT64_C(0x0572B974F03CE0BB), Q_UINT64_C(0xB57D2E985E1419C7), Q_UINT64_C(0xE8D9ECBE2CF3D73F), Q_UINT64_C(0x2FE4B17170E59750), Q_UINT64_C(0x11317BA87905E790), Q_UINT64_C(0x7FBF21EC8A1F45EC), Q_UINT64_C(0x1725CABFCB045B00), Q_UINT64_C(0x964E915CD5E2B207), Q_UINT64_C(0x3E2B8BCBF016D66D), Q_UINT64_C(0xBE7444E39328A0AC), Q_UINT64_C(0xF85B2B4FBCDE44B7), Q_UINT64_C(0x49353FEA39BA63B1), Q_UINT64_C(0x1DD01AAFCD53486A), Q_UINT64_C(0x1FCA8A92FD719F85), Q_UINT64_C(0xFC7C95D827357AFA), Q_UINT64_C(0x18A6A990C8B35EBD), Q_UINT64_C(0xCCCB7005C6B9C28D), Q_UINT64_C(0x3BDBB92C43B17F26), Q_UINT64_C(0xAA70B5B4F89695A2), Q_UINT64_C(0xE94C39A54A98307F), Q_UINT64_C(0xB7A0B174CFF6F36E), Q_UINT64_C(0xD4DBA84729AF48AD), Q_UINT64_C(0x2E18BC1AD9704A68), Q_UINT64_C(0x2DE0966DAF2F8B1C), Q_UINT64_C(0xB9C11D5B1E43A07E), Q_UINT64_C(0x64972D68DEE33360), Q_UINT64_C(0x94628D38D0C20584), Q_UINT64_C(0xDBC0D2B6AB90A559), Q_UINT64_C(0xD2733C4335C6A72F), Q_UINT64_C(0x7E75D99D94A70F4D), Q_UINT64_C(0x6CED1983376FA72B), Q_UINT64_C(0x97FCAACBF030BC24), Q_UINT64_C(0x7B77497B32503B12), Q_UINT64_C(0x8547EDDFB81CCB94), Q_UINT64_C(0x79999CDFF70902CB), Q_UINT64_C(0xCFFE1939438E9B24), Q_UINT64_C(0x829626E3892D95D7), Q_UINT64_C(0x92FAE24291F2B3F1), Q_UINT64_C(0x63E22C147B9C3403), Q_UINT64_C(0xC678B6D860284A1C), Q_UINT64_C(0x5873888850659AE7), Q_UINT64_C(0x0981DCD296A8736D), Q_UINT64_C(0x9F65789A6509A440), Q_UINT64_C(0x9FF38FED72E9052F), Q_UINT64_C(0xE479EE5B9930578C), Q_UINT64_C(0xE7F28ECD2D49EECD), Q_UINT64_C(0x56C074A581EA17FE), Q_UINT64_C(0x5544F7D774B14AEF), Q_UINT64_C(0x7B3F0195FC6F290F), Q_UINT64_C(0x12153635B2C0CF57), Q_UINT64_C(0x7F5126DBBA5E0CA7), Q_UINT64_C(0x7A76956C3EAFB413), Q_UINT64_C(0x3D5774A11D31AB39), Q_UINT64_C(0x8A1B083821F40CB4), Q_UINT64_C(0x7B4A38E32537DF62), Q_UINT64_C(0x950113646D1D6E03), Q_UINT64_C(0x4DA8979A0041E8A9), Q_UINT64_C(0x3BC36E078F7515D7), Q_UINT64_C(0x5D0A12F27AD310D1), Q_UINT64_C(0x7F9D1A2E1EBE1327), Q_UINT64_C(0xDA3A361B1C5157B1), Q_UINT64_C(0xDCDD7D20903D0C25), Q_UINT64_C(0x36833336D068F707), Q_UINT64_C(0xCE68341F79893389), Q_UINT64_C(0xAB9090168DD05F34), Q_UINT64_C(0x43954B3252DC25E5), Q_UINT64_C(0xB438C2B67F98E5E9), Q_UINT64_C(0x10DCD78E3851A492), Q_UINT64_C(0xDBC27AB5447822BF), Q_UINT64_C(0x9B3CDB65F82CA382), Q_UINT64_C(0xB67B7896167B4C84), Q_UINT64_C(0xBFCED1B0048EAC50), Q_UINT64_C(0xA9119B60369FFEBD), Q_UINT64_C(0x1FFF7AC80904BF45), Q_UINT64_C(0xAC12FB171817EEE7), Q_UINT64_C(0xAF08DA9177DDA93D), Q_UINT64_C(0x1B0CAB936E65C744), Q_UINT64_C(0xB559EB1D04E5E932), Q_UINT64_C(0xC37B45B3F8D6F2BA), Q_UINT64_C(0xC3A9DC228CAAC9E9), Q_UINT64_C(0xF3B8B6675A6507FF), Q_UINT64_C(0x9FC477DE4ED681DA), Q_UINT64_C(0x67378D8ECCEF96CB), Q_UINT64_C(0x6DD856D94D259236), Q_UINT64_C(0xA319CE15B0B4DB31), Q_UINT64_C(0x073973751F12DD5E), Q_UINT64_C(0x8A8E849EB32781A5), Q_UINT64_C(0xE1925C71285279F5), Q_UINT64_C(0x74C04BF1790C0EFE), Q_UINT64_C(0x4DDA48153C94938A), Q_UINT64_C(0x9D266D6A1CC0542C), Q_UINT64_C(0x7440FB816508C4FE), Q_UINT64_C(0x13328503DF48229F), Q_UINT64_C(0xD6BF7BAEE43CAC40), Q_UINT64_C(0x4838D65F6EF6748F), Q_UINT64_C(0x1E152328F3318DEA), Q_UINT64_C(0x8F8419A348F296BF), Q_UINT64_C(0x72C8834A5957B511), Q_UINT64_C(0xD7A023A73260B45C), Q_UINT64_C(0x94EBC8ABCFB56DAE), Q_UINT64_C(0x9FC10D0F989993E0), Q_UINT64_C(0xDE68A2355B93CAE6), Q_UINT64_C(0xA44CFE79AE538BBE), Q_UINT64_C(0x9D1D84FCCE371425), Q_UINT64_C(0x51D2B1AB2DDFB636), Q_UINT64_C(0x2FD7E4B9E72CD38C), Q_UINT64_C(0x65CA5B96B7552210), Q_UINT64_C(0xDD69A0D8AB3B546D), Q_UINT64_C(0x604D51B25FBF70E2), Q_UINT64_C(0x73AA8A564FB7AC9E), Q_UINT64_C(0x1A8C1E992B941148), Q_UINT64_C(0xAAC40A2703D9BEA0), Q_UINT64_C(0x764DBEAE7FA4F3A6), Q_UINT64_C(0x1E99B96E70A9BE8B), Q_UINT64_C(0x2C5E9DEB57EF4743), Q_UINT64_C(0x3A938FEE32D29981), Q_UINT64_C(0x26E6DB8FFDF5ADFE), Q_UINT64_C(0x469356C504EC9F9D), Q_UINT64_C(0xC8763C5B08D1908C), Q_UINT64_C(0x3F6C6AF859D80055), Q_UINT64_C(0x7F7CC39420A3A545), Q_UINT64_C(0x9BFB227EBDF4C5CE), Q_UINT64_C(0x89039D79D6FC5C5C), Q_UINT64_C(0x8FE88B57305E2AB6), Q_UINT64_C(0xA09E8C8C35AB96DE), Q_UINT64_C(0xFA7E393983325753), Q_UINT64_C(0xD6B6D0ECC617C699), Q_UINT64_C(0xDFEA21EA9E7557E3), Q_UINT64_C(0xB67C1FA481680AF8), Q_UINT64_C(0xCA1E3785A9E724E5), Q_UINT64_C(0x1CFC8BED0D681639), Q_UINT64_C(0xD18D8549D140CAEA), Q_UINT64_C(0x4ED0FE7E9DC91335), Q_UINT64_C(0xE4DBF0634473F5D2), Q_UINT64_C(0x1761F93A44D5AEFE), Q_UINT64_C(0x53898E4C3910DA55), Q_UINT64_C(0x734DE8181F6EC39A), Q_UINT64_C(0x2680B122BAA28D97), Q_UINT64_C(0x298AF231C85BAFAB), Q_UINT64_C(0x7983EED3740847D5), Q_UINT64_C(0x66C1A2A1A60CD889), Q_UINT64_C(0x9E17E49642A3E4C1), Q_UINT64_C(0xEDB454E7BADC0805), Q_UINT64_C(0x50B704CAB602C329), Q_UINT64_C(0x4CC317FB9CDDD023), Q_UINT64_C(0x66B4835D9EAFEA22), Q_UINT64_C(0x219B97E26FFC81BD), Q_UINT64_C(0x261E4E4C0A333A9D), Q_UINT64_C(0x1FE2CCA76517DB90), Q_UINT64_C(0xD7504DFA8816EDBB), Q_UINT64_C(0xB9571FA04DC089C8), Q_UINT64_C(0x1DDC0325259B27DE), Q_UINT64_C(0xCF3F4688801EB9AA), Q_UINT64_C(0xF4F5D05C10CAB243), Q_UINT64_C(0x38B6525C21A42B0E), Q_UINT64_C(0x36F60E2BA4FA6800), Q_UINT64_C(0xEB3593803173E0CE), Q_UINT64_C(0x9C4CD6257C5A3603), Q_UINT64_C(0xAF0C317D32ADAA8A), Q_UINT64_C(0x258E5A80C7204C4B), Q_UINT64_C(0x8B889D624D44885D), Q_UINT64_C(0xF4D14597E660F855), Q_UINT64_C(0xD4347F66EC8941C3), Q_UINT64_C(0xE699ED85B0DFB40D), Q_UINT64_C(0x2472F6207C2D0484), Q_UINT64_C(0xC2A1E7B5B459AEB5), Q_UINT64_C(0xAB4F6451CC1D45EC), Q_UINT64_C(0x63767572AE3D6174), Q_UINT64_C(0xA59E0BD101731A28), Q_UINT64_C(0x116D0016CB948F09), Q_UINT64_C(0x2CF9C8CA052F6E9F), Q_UINT64_C(0x0B090A7560A968E3), Q_UINT64_C(0xABEEDDB2DDE06FF1), Q_UINT64_C(0x58EFC10B06A2068D), Q_UINT64_C(0xC6E57A78FBD986E0), Q_UINT64_C(0x2EAB8CA63CE802D7), Q_UINT64_C(0x14A195640116F336), Q_UINT64_C(0x7C0828DD624EC390), Q_UINT64_C(0xD74BBE77E6116AC7), Q_UINT64_C(0x804456AF10F5FB53), Q_UINT64_C(0xEBE9EA2ADF4321C7), Q_UINT64_C(0x03219A39EE587A30), Q_UINT64_C(0x49787FEF17AF9924), Q_UINT64_C(0xA1E9300CD8520548), Q_UINT64_C(0x5B45E522E4B1B4EF), Q_UINT64_C(0xB49C3B3995091A36), Q_UINT64_C(0xD4490AD526F14431), Q_UINT64_C(0x12A8F216AF9418C2), Q_UINT64_C(0x001F837CC7350524), Q_UINT64_C(0x1877B51E57A764D5), Q_UINT64_C(0xA2853B80F17F58EE), Q_UINT64_C(0x993E1DE72D36D310), Q_UINT64_C(0xB3598080CE64A656), Q_UINT64_C(0x252F59CF0D9F04BB), Q_UINT64_C(0xD23C8E176D113600), Q_UINT64_C(0x1BDA0492E7E4586E), Q_UINT64_C(0x21E0BD5026C619BF), Q_UINT64_C(0x3B097ADAF088F94E), Q_UINT64_C(0x8D14DEDB30BE846E), Q_UINT64_C(0xF95CFFA23AF5F6F4), Q_UINT64_C(0x3871700761B3F743), Q_UINT64_C(0xCA672B91E9E4FA16), Q_UINT64_C(0x64C8E531BFF53B55), Q_UINT64_C(0x241260ED4AD1E87D), Q_UINT64_C(0x106C09B972D2E822), Q_UINT64_C(0x7FBA195410E5CA30), Q_UINT64_C(0x7884D9BC6CB569D8), Q_UINT64_C(0x0647DFEDCD894A29), Q_UINT64_C(0x63573FF03E224774), Q_UINT64_C(0x4FC8E9560F91B123), Q_UINT64_C(0x1DB956E450275779), Q_UINT64_C(0xB8D91274B9E9D4FB), Q_UINT64_C(0xA2EBEE47E2FBFCE1), Q_UINT64_C(0xD9F1F30CCD97FB09), Q_UINT64_C(0xEFED53D75FD64E6B), Q_UINT64_C(0x2E6D02C36017F67F), Q_UINT64_C(0xA9AA4D20DB084E9B), Q_UINT64_C(0xB64BE8D8B25396C1), Q_UINT64_C(0x70CB6AF7C2D5BCF0), Q_UINT64_C(0x98F076A4F7A2322E), Q_UINT64_C(0xBF84470805E69B5F), Q_UINT64_C(0x94C3251F06F90CF3), Q_UINT64_C(0x3E003E616A6591E9), Q_UINT64_C(0xB925A6CD0421AFF3), Q_UINT64_C(0x61BDD1307C66E300), Q_UINT64_C(0xBF8D5108E27E0D48), Q_UINT64_C(0x240AB57A8B888B20), Q_UINT64_C(0xFC87614BAF287E07), Q_UINT64_C(0xEF02CDD06FFDB432), Q_UINT64_C(0xA1082C0466DF6C0A), Q_UINT64_C(0x8215E577001332C8), Q_UINT64_C(0xD39BB9C3A48DB6CF), Q_UINT64_C(0x2738259634305C14), Q_UINT64_C(0x61CF4F94C97DF93D), Q_UINT64_C(0x1B6BACA2AE4E125B), Q_UINT64_C(0x758F450C88572E0B), Q_UINT64_C(0x959F587D507A8359), Q_UINT64_C(0xB063E962E045F54D), Q_UINT64_C(0x60E8ED72C0DFF5D1), Q_UINT64_C(0x7B64978555326F9F), Q_UINT64_C(0xFD080D236DA814BA), Q_UINT64_C(0x8C90FD9B083F4558), Q_UINT64_C(0x106F72FE81E2C590), Q_UINT64_C(0x7976033A39F7D952), Q_UINT64_C(0xA4EC0132764CA04B), Q_UINT64_C(0x733EA705FAE4FA77), Q_UINT64_C(0xB4D8F77BC3E56167), Q_UINT64_C(0x9E21F4F903B33FD9), Q_UINT64_C(0x9D765E419FB69F6D), Q_UINT64_C(0xD30C088BA61EA5EF), Q_UINT64_C(0x5D94337FBFAF7F5B), Q_UINT64_C(0x1A4E4822EB4D7A59), Q_UINT64_C(0x6FFE73E81B637FB3), Q_UINT64_C(0xDDF957BC36D8B9CA), Q_UINT64_C(0x64D0E29EEA8838B3), Q_UINT64_C(0x08DD9BDFD96B9F63), Q_UINT64_C(0x087E79E5A57D1D13), Q_UINT64_C(0xE328E230E3E2B3FB), Q_UINT64_C(0x1C2559E30F0946BE), Q_UINT64_C(0x720BF5F26F4D2EAA), Q_UINT64_C(0xB0774D261CC609DB), Q_UINT64_C(0x443F64EC5A371195), Q_UINT64_C(0x4112CF68649A260E), Q_UINT64_C(0xD813F2FAB7F5C5CA), Q_UINT64_C(0x660D3257380841EE), Q_UINT64_C(0x59AC2C7873F910A3), Q_UINT64_C(0xE846963877671A17), Q_UINT64_C(0x93B633ABFA3469F8), Q_UINT64_C(0xC0C0F5A60EF4CDCF), Q_UINT64_C(0xCAF21ECD4377B28C), Q_UINT64_C(0x57277707199B8175), Q_UINT64_C(0x506C11B9D90E8B1D), Q_UINT64_C(0xD83CC2687A19255F), Q_UINT64_C(0x4A29C6465A314CD1), Q_UINT64_C(0xED2DF21216235097), Q_UINT64_C(0xB5635C95FF7296E2), Q_UINT64_C(0x22AF003AB672E811), Q_UINT64_C(0x52E762596BF68235), Q_UINT64_C(0x9AEBA33AC6ECC6B0), Q_UINT64_C(0x944F6DE09134DFB6), Q_UINT64_C(0x6C47BEC883A7DE39), Q_UINT64_C(0x6AD047C430A12104), Q_UINT64_C(0xA5B1CFDBA0AB4067), Q_UINT64_C(0x7C45D833AFF07862), Q_UINT64_C(0x5092EF950A16DA0B), Q_UINT64_C(0x9338E69C052B8E7B), Q_UINT64_C(0x455A4B4CFE30E3F5), Q_UINT64_C(0x6B02E63195AD0CF8), Q_UINT64_C(0x6B17B224BAD6BF27), Q_UINT64_C(0xD1E0CCD25BB9C169), Q_UINT64_C(0xDE0C89A556B9AE70), Q_UINT64_C(0x50065E535A213CF6), Q_UINT64_C(0x9C1169FA2777B874), Q_UINT64_C(0x78EDEFD694AF1EED), Q_UINT64_C(0x6DC93D9526A50E68), Q_UINT64_C(0xEE97F453F06791ED), Q_UINT64_C(0x32AB0EDB696703D3), Q_UINT64_C(0x3A6853C7E70757A7), Q_UINT64_C(0x31865CED6120F37D), Q_UINT64_C(0x67FEF95D92607890), Q_UINT64_C(0x1F2B1D1F15F6DC9C), Q_UINT64_C(0xB69E38A8965C6B65), Q_UINT64_C(0xAA9119FF184CCCF4), Q_UINT64_C(0xF43C732873F24C13), Q_UINT64_C(0xFB4A3D794A9A80D2), Q_UINT64_C(0x3550C2321FD6109C), Q_UINT64_C(0x371F77E76BB8417E), Q_UINT64_C(0x6BFA9AAE5EC05779), Q_UINT64_C(0xCD04F3FF001A4778), Q_UINT64_C(0xE3273522064480CA), Q_UINT64_C(0x9F91508BFFCFC14A), Q_UINT64_C(0x049A7F41061A9E60), Q_UINT64_C(0xFCB6BE43A9F2FE9B), Q_UINT64_C(0x08DE8A1C7797DA9B), Q_UINT64_C(0x8F9887E6078735A1), Q_UINT64_C(0xB5B4071DBFC73A66), Q_UINT64_C(0x230E343DFBA08D33), Q_UINT64_C(0x43ED7F5A0FAE657D), Q_UINT64_C(0x3A88A0FBBCB05C63), Q_UINT64_C(0x21874B8B4D2DBC4F), Q_UINT64_C(0x1BDEA12E35F6A8C9), Q_UINT64_C(0x53C065C6C8E63528), Q_UINT64_C(0xE34A1D250E7A8D6B), Q_UINT64_C(0xD6B04D3B7651DD7E), Q_UINT64_C(0x5E90277E7CB39E2D), Q_UINT64_C(0x2C046F22062DC67D), Q_UINT64_C(0xB10BB459132D0A26), Q_UINT64_C(0x3FA9DDFB67E2F199), Q_UINT64_C(0x0E09B88E1914F7AF), Q_UINT64_C(0x10E8B35AF3EEAB37), Q_UINT64_C(0x9EEDECA8E272B933), Q_UINT64_C(0xD4C718BC4AE8AE5F), Q_UINT64_C(0x81536D601170FC20), Q_UINT64_C(0x91B534F885818A06), Q_UINT64_C(0xEC8177F83F900978), Q_UINT64_C(0x190E714FADA5156E), Q_UINT64_C(0xB592BF39B0364963), Q_UINT64_C(0x89C350C893AE7DC1), Q_UINT64_C(0xAC042E70F8B383F2), Q_UINT64_C(0xB49B52E587A1EE60), Q_UINT64_C(0xFB152FE3FF26DA89), Q_UINT64_C(0x3E666E6F69AE2C15), Q_UINT64_C(0x3B544EBE544C19F9), Q_UINT64_C(0xE805A1E290CF2456), Q_UINT64_C(0x24B33C9D7ED25117), Q_UINT64_C(0xE74733427B72F0C1), Q_UINT64_C(0x0A804D18B7097475), Q_UINT64_C(0x57E3306D881EDB4F), Q_UINT64_C(0x4AE7D6A36EB5DBCB), Q_UINT64_C(0x2D8D5432157064C8), Q_UINT64_C(0xD1E649DE1E7F268B), Q_UINT64_C(0x8A328A1CEDFE552C), Q_UINT64_C(0x07A3AEC79624C7DA), Q_UINT64_C(0x84547DDC3E203C94), Q_UINT64_C(0x990A98FD5071D263), Q_UINT64_C(0x1A4FF12616EEFC89), Q_UINT64_C(0xF6F7FD1431714200), Q_UINT64_C(0x30C05B1BA332F41C), Q_UINT64_C(0x8D2636B81555A786), Q_UINT64_C(0x46C9FEB55D120902), Q_UINT64_C(0xCCEC0A73B49C9921), Q_UINT64_C(0x4E9D2827355FC492), Q_UINT64_C(0x19EBB029435DCB0F), Q_UINT64_C(0x4659D2B743848A2C), Q_UINT64_C(0x963EF2C96B33BE31), Q_UINT64_C(0x74F85198B05A2E7D), Q_UINT64_C(0x5A0F544DD2B1FB18), Q_UINT64_C(0x03727073C2E134B1), Q_UINT64_C(0xC7F6AA2DE59AEA61), Q_UINT64_C(0x352787BAA0D7C22F), Q_UINT64_C(0x9853EAB63B5E0B35), Q_UINT64_C(0xABBDCDD7ED5C0860), Q_UINT64_C(0xCF05DAF5AC8D77B0), Q_UINT64_C(0x49CAD48CEBF4A71E), Q_UINT64_C(0x7A4C10EC2158C4A6), Q_UINT64_C(0xD9E92AA246BF719E), Q_UINT64_C(0x13AE978D09FE5557), Q_UINT64_C(0x730499AF921549FF), Q_UINT64_C(0x4E4B705B92903BA4), Q_UINT64_C(0xFF577222C14F0A3A), Q_UINT64_C(0x55B6344CF97AAFAE), Q_UINT64_C(0xB862225B055B6960), Q_UINT64_C(0xCAC09AFBDDD2CDB4), Q_UINT64_C(0xDAF8E9829FE96B5F), Q_UINT64_C(0xB5FDFC5D3132C498), Q_UINT64_C(0x310CB380DB6F7503), Q_UINT64_C(0xE87FBB46217A360E), Q_UINT64_C(0x2102AE466EBB1148), Q_UINT64_C(0xF8549E1A3AA5E00D), Q_UINT64_C(0x07A69AFDCC42261A), Q_UINT64_C(0xC4C118BFE78FEAAE), Q_UINT64_C(0xF9F4892ED96BD438), Q_UINT64_C(0x1AF3DBE25D8F45DA), Q_UINT64_C(0xF5B4B0B0D2DEEEB4), Q_UINT64_C(0x962ACEEFA82E1C84), Q_UINT64_C(0x046E3ECAAF453CE9), Q_UINT64_C(0xF05D129681949A4C), Q_UINT64_C(0x964781CE734B3C84), Q_UINT64_C(0x9C2ED44081CE5FBD), Q_UINT64_C(0x522E23F3925E319E), Q_UINT64_C(0x177E00F9FC32F791), Q_UINT64_C(0x2BC60A63A6F3B3F2), Q_UINT64_C(0x222BBFAE61725606), Q_UINT64_C(0x486289DDCC3D6780), Q_UINT64_C(0x7DC7785B8EFDFC80), Q_UINT64_C(0x8AF38731C02BA980), Q_UINT64_C(0x1FAB64EA29A2DDF7), Q_UINT64_C(0xE4D9429322CD065A), Q_UINT64_C(0x9DA058C67844F20C), Q_UINT64_C(0x24C0E332B70019B0), Q_UINT64_C(0x233003B5A6CFE6AD), Q_UINT64_C(0xD586BD01C5C217F6), Q_UINT64_C(0x5E5637885F29BC2B), Q_UINT64_C(0x7EBA726D8C94094B), Q_UINT64_C(0x0A56A5F0BFE39272), Q_UINT64_C(0xD79476A84EE20D06), Q_UINT64_C(0x9E4C1269BAA4BF37), Q_UINT64_C(0x17EFEE45B0DEE640), Q_UINT64_C(0x1D95B0A5FCF90BC6), Q_UINT64_C(0x93CBE0B699C2585D), Q_UINT64_C(0x65FA4F227A2B6D79), Q_UINT64_C(0xD5F9E858292504D5), Q_UINT64_C(0xC2B5A03F71471A6F), Q_UINT64_C(0x59300222B4561E00), Q_UINT64_C(0xCE2F8642CA0712DC), Q_UINT64_C(0x7CA9723FBB2E8988), Q_UINT64_C(0x2785338347F2BA08), Q_UINT64_C(0xC61BB3A141E50E8C), Q_UINT64_C(0x150F361DAB9DEC26), Q_UINT64_C(0x9F6A419D382595F4), Q_UINT64_C(0x64A53DC924FE7AC9), Q_UINT64_C(0x142DE49FFF7A7C3D), Q_UINT64_C(0x0C335248857FA9E7), Q_UINT64_C(0x0A9C32D5EAE45305), Q_UINT64_C(0xE6C42178C4BBB92E), Q_UINT64_C(0x71F1CE2490D20B07), Q_UINT64_C(0xF1BCC3D275AFE51A), Q_UINT64_C(0xE728E8C83C334074), Q_UINT64_C(0x96FBF83A12884624), Q_UINT64_C(0x81A1549FD6573DA5), Q_UINT64_C(0x5FA7867CAF35E149), Q_UINT64_C(0x56986E2EF3ED091B), Q_UINT64_C(0x917F1DD5F8886C61), Q_UINT64_C(0xD20D8C88C8FFE65F), Q_UINT64_C(0x31D71DCE64B2C310), Q_UINT64_C(0xF165B587DF898190), Q_UINT64_C(0xA57E6339DD2CF3A0), Q_UINT64_C(0x1EF6E6DBB1961EC9), Q_UINT64_C(0x70CC73D90BC26E24), Q_UINT64_C(0xE21A6B35DF0C3AD7), Q_UINT64_C(0x003A93D8B2806962), Q_UINT64_C(0x1C99DED33CB890A1), Q_UINT64_C(0xCF3145DE0ADD4289), Q_UINT64_C(0xD0E4427A5514FB72), Q_UINT64_C(0x77C621CC9FB3A483), Q_UINT64_C(0x67A34DAC4356550B), Q_UINT64_C(0xF8D626AAAF278509) }; //const int RANDOM_PIECE = 0xFE; const int RANDOM_CASTLE = 768; const int RANDOM_EN_PASSENT = 772; const int RANDOM_TURN = 780; typedef std::bitset IntBits; Board::Board() { this->turn = WHITE; for(int i=0;i<120;i++) { this->board[i] = EMPTY_POS[i]; this->old_board[i] = 0xFF; } this->castling_rights = 0; this->en_passent_target = 0; this->halfmove_clock = 0; this->fullmove_number = 1; this->undo_available = false; this->last_was_null = false; this->prev_halfmove_clock = 0; this->transpositionTable = QMap(); this->update_transposition_table(); } /* Board::Board(Board *b) { this->turn = b->turn; this->castling_rights = 0; this->en_passent_target = 0; this->halfmove_clock = 0; this->fullmove_number = 1; this->undo_available = false; for(int i=0;i<120;i++) { this->board[i] = b->board[i]; } this->last_was_null = false; this->prev_halfmove_clock = 0; this->transpositionTable = QMap(); this->update_transposition_table(); }*/ Board::Board(bool initial_position) { this->turn = WHITE; if(initial_position) { for(int i=0;i<120;i++) { this->board[i] = chess::INIT_POS[i]; this->old_board[i] = 0xFF; } this->castling_rights = 0x0F; } else { for(int i=0;i<120;i++) { this->board[i] = EMPTY_POS[i]; } this->castling_rights = 0; } this->en_passent_target = 0; this->halfmove_clock = 0; this->fullmove_number = 1; this->undo_available = false; this->last_was_null = false; this->prev_halfmove_clock = 0; this->transpositionTable = QMap(); this->update_transposition_table(); } bool Board::is_initial_position() { if(!this->turn == WHITE) { return false; } for(int i=0;i<120;i++) { if(this->board[i] != chess::INIT_POS[i]) { return false; } } if(this->castling_rights != 0x0F) { return false; } if(this->en_passent_target != 0) { return false; } if(this->halfmove_clock != 0) { return false; } if(this->fullmove_number != 1) { return false; } if(this->undo_available) { return false; } return true; } // returns 0 if no e.p. field in current position uint8_t Board::get_ep_target() { return this->en_passent_target; } // returns 'empty' if c is no valid piece symbol in // fen notation uint8_t Board::piece_from_symbol(QChar c) { if(c == QChar('K')) { return 0x06; } if(c == QChar('Q')) { return 0x05; } if(c == QChar('R')) { return 0x04; } if(c == QChar('B')) { return 0x03; } if(c == QChar('N')) { return 0x02; } if(c == QChar('P')) { return 0x01; } if(c == QChar('k')) { return 0x86; } if(c == QChar('q')) { return 0x85; } if(c == QChar('r')) { return 0x84; } if(c == QChar('b')) { return 0x83; } if(c == QChar('n')) { return 0x82; } if(c == QChar('p')) { return 0x81; } return 0x00; } void Board::set_piece_at(int x, int y, uint8_t piece) { // check wether x,y is a valid location on chess board // and wether piece is a valid piece if(x>=0 && x<8 && y>=0 && y <8 && ((piece >= 0x01 && piece <= 0x07) || // white piece (piece >= 0x81 && piece <= 0x87) || (piece == 0x00))) { // black piece or empty int idx = ((y+2)*10) + (x+1); this->board[idx] = piece; } else { throw std::invalid_argument("called set_piece_at with invalid paramters"); } } uint8_t Board::get_piece_at(int x, int y) { if(x>=0 && x<8 && y>=0 && y <8) { int idx = ((y+2)*10) + (x+1); return this->board[idx]; } else { throw std::invalid_argument("called get_piece_at with invalid paramters"); } } uint8_t Board::get_piece_type_at(int x, int y) { if(x>=0 && x<8 && y>=0 && y <8) { int idx = ((y+2)*10) + (x+1); uint8_t piece = this->board[idx]; if(piece >= 0x80) { return piece - 0x80; } else { return piece; } } else { throw std::invalid_argument("called get_piece_type_at with invalid paramters"); } } bool Board::get_piece_color_at(int x, int y) { if(x>=0 && x<8 && y>=0 && y <8) { int idx = ((y+2)*10) + (x+1); return this->piece_color(idx); } else { throw std::invalid_argument("called get_piece_color_at with invalid paramters"); } } // returns 'empty' if c is no valid piece symbol in // fen notation QChar Board::piece_to_symbol(uint8_t piece) { if(piece == 0x06) { return QChar('K'); } if(piece == 0x05) { return QChar('Q'); } if(piece == 0x04) { return QChar('R'); } if(piece == 0x03) { return QChar('B'); } if(piece == 0x02) { return QChar('N'); } if(piece == 0x01) { return QChar('P'); } if(piece == 0x86) { return QChar('k'); } if(piece == 0x85) { return QChar('q'); } if(piece == 0x84) { return QChar('r'); } if(piece == 0x83) { return QChar('b'); } if(piece == 0x82) { return QChar('n'); } if(piece == 0x81) { return QChar('p'); } throw std::invalid_argument("called piece to symbol, but square contains no piece!"); } Board::Board(const QString &fen_string) { for(int i=0;i<120;i++) { this->board[i] = EMPTY_POS[i]; this->old_board[i] = 0xFF; } // check that we have six parts in fen, each separated by space // if last two parts are missing (fullmove no. + halfmove clock) // try to still parse the game QStringList fen_parts = fen_string.split(QChar(' ')); if(fen_parts.size() < 4) { throw std::invalid_argument("fen: parts missing 6 fen parts"); } // check that the first part consists of 8 rows, each sep. by / QStringList rows = fen_parts.at(0).split(QChar('/')); if(rows.size() != 8) { throw std::invalid_argument("fen: not 8 rows in 0th part"); } // check that in each row, there are no two consecutive digits for(int i=0;i= 5) && fen_parts.at(4).toInt() < 0) { throw std::invalid_argument("negative half move clock or not a number"); } // full move number validity (if full move number is present) if((fen_parts.size() >= 6) && fen_parts.at(5).toInt() < 0) { throw std::invalid_argument("fullmove number not positive"); } // set pieces for(int i=0;ipiece_from_symbol(rj); this->board[square_index] = piece; square_index += 1; } } } // set turn if(fen_parts.at(1) == QString("w")) { this->turn = WHITE; } if(fen_parts.at(1) == QString("b")) { this->turn = BLACK; } this->castling_rights = 0x00; for(int i=0;iset_castle_wking(true); } if(ci == QChar('Q')) { this->set_castle_wqueen(true); } if(ci == QChar('k')) { this->set_castle_bking(true); } if(ci == QChar('q')) { this->set_castle_bqueen(true); } } // set en passent square if(fen_parts.at(3) == QString('-')) { this->en_passent_target = 0; } else { int row = 10 + (fen_parts.at(3).at(1).digitValue() * 10); int col = 0; QChar c = fen_parts.at(3).at(0).toLower(); if(c == 'a') { col = 1; } if(c == 'b') { col = 2; } if(c == 'c') { col = 3; } if(c == 'd') { col = 4; } if(c == 'e') { col = 5; } if(c == 'f') { col = 6; } if(c == 'g') { col = 7; } if(c == 'h') { col = 8; } this->en_passent_target = row + col; } if(fen_parts.size() >= 5) { this->halfmove_clock = fen_parts.at(4).toInt(); } else { this->halfmove_clock = 0; } if(fen_parts.size() >= 6) { this->fullmove_number = fen_parts.at(5).toInt(); } else { this->fullmove_number = 1; } this->undo_available = false; this->last_was_null = false; if(!this->is_consistent()) { throw std::invalid_argument("board position from supplied fen is inconsistent"); } this->transpositionTable = QMap(); this->update_transposition_table(); } QString Board::idx_to_str(int idx) { if(idx<21 || idx>98) { throw std::invalid_argument("called idx_to_str but idx is in fringe!"); } else { QChar row = QChar ((idx / 10) + 47); QChar col = QChar ((idx % 10) + 96); QString str = ""; str.append(col); str.append(row); return str; } } QString Board::fen() { // first build board QString fen_string = QString(""); for(int i=90;i>=20;i-=10) { int square_counter = 0; for(int j=1;j<9;j++) { if(this->board[i+j] != 0x00) { uint8_t piece = this->board[i+j]; fen_string.append(this->piece_to_symbol(piece)); square_counter = 0; } else { square_counter += 1; if(j==8) { fen_string.append(QChar((char) (48+square_counter))); } else { if(this->board[i+j+1] != 0x00) { fen_string.append(QChar((char) (48+square_counter))); } } } } if(i!=20) { fen_string.append(QChar('/')); } } // write turn if(this->turn == WHITE) { fen_string.append(" w"); } else { fen_string.append(" b"); } // write castling rights if(this->castling_rights == 0x00) { fen_string.append(" -"); } else { fen_string.append(' '); if(this->can_castle_wking()) { fen_string.append(('K')); } if(this->can_castle_wqueen()) { fen_string.append(('Q')); } if(this->can_castle_bking()) { fen_string.append(('k')); } if(this->can_castle_bqueen()) { fen_string.append(('q')); } } // write ep target if exists if(this->en_passent_target != 0x00) { fen_string.append(" "+this->idx_to_str(this->en_passent_target)); } else { fen_string.append(" -"); } // add halfmove clock and fullmove counter fen_string.append(" ").append(QString::number(this->halfmove_clock)); fen_string.append(" ").append(QString::number(this->fullmove_number)); return fen_string; } bool Board::can_castle_wking() { IntBits cstle = IntBits(this->castling_rights); if(cstle.test(CASTLE_WKING_POS)) { return true; } else { return false; } } bool Board::can_castle_bking() { IntBits cstle = IntBits(this->castling_rights); if(cstle.test(CASTLE_BKING_POS)) { return true; } else { return false; } } bool Board::can_castle_wqueen() { IntBits cstle = IntBits(this->castling_rights); if(cstle.test(CASTLE_WQUEEN_POS)) { return true; } else { return false; } } bool Board::can_castle_bqueen() { IntBits cstle = IntBits(this->castling_rights); if(cstle.test(CASTLE_BQUEEN_POS)) { return true; } else { return false; } } void Board::set_castle_wking(bool can_do) { IntBits cstle = IntBits(this->castling_rights); if(can_do) { cstle.set(CASTLE_WKING_POS); } else { cstle.reset(CASTLE_WKING_POS); } this->castling_rights = static_cast(cstle.to_ulong()); } void Board::set_castle_bking(bool can_do) { IntBits cstle = IntBits(this->castling_rights); if(can_do) { cstle.set(CASTLE_BKING_POS); } else { cstle.reset(CASTLE_BKING_POS); } this->castling_rights = static_cast(cstle.to_ulong()); } void Board::set_castle_wqueen(bool can_do) { IntBits cstle = IntBits(this->castling_rights); if(can_do) { cstle.set(CASTLE_WQUEEN_POS); } else { cstle.reset(CASTLE_WQUEEN_POS); } this->castling_rights = static_cast(cstle.to_ulong()); } void Board::set_castle_bqueen(bool can_do) { IntBits cstle = IntBits(this->castling_rights); if(can_do) { cstle.set(CASTLE_BQUEEN_POS); } else { cstle.reset(CASTLE_BQUEEN_POS); } this->castling_rights = static_cast(cstle.to_ulong()); } QVector Board::pseudo_legal_moves() { return this->pseudo_legal_moves_from(0,true,this->turn); } QVector Board::pseudo_legal_moves(uint8_t to_square, uint8_t piece_type) { if(piece_type == KING) { return this->pseudo_legal_moves_from_pt(0, to_square, piece_type, true,this->turn); } else { return this->pseudo_legal_moves_from_pt(0, to_square, piece_type, false,this->turn); } } bool Board::castles_wking(const Move &m) { if(this->piece_type(m.from) == KING && this->piece_color(m.from) == WHITE && m.from == E1 && m.to == G1) { return true; } else { return false; } } bool Board::castles_wqueen(const Move &m) { if(this->piece_type(m.from) == KING && this->piece_color(m.from) == WHITE && m.from == E1 && m.to == C1) { return true; } else { return false; } } bool Board::castles_bking(const Move &m) { if(this->piece_type(m.from) == KING && this->piece_color(m.from) == BLACK && m.from == E8 && m.to == G8) { return true; } else { return false; } } bool Board::castles_bqueen(const Move &m) { if(this->piece_type(m.from) == KING && this->piece_color(m.from) == BLACK && m.from == E8 && m.to == C8) { return true; } else { return false; } } // to get legal moves, just get list of pseudo // legals and then filter by checking each move's // legality QVector Board::legal_moves() { QVector pseudo_legals = this->pseudo_legal_moves(); QVector legals; // approx 40 legal moves in every pos?! for(int i=0;ipseudo_is_legal_move(m)) { legals.append(m); } } return legals; } // to speed up san parsing, check here // only moves where destination is hit. QVector Board::legal_moves(uint8_t to_square, uint8_t piece_type) { QVector pseudo_legals = this->pseudo_legal_moves(to_square, piece_type); QVector legals; for(int i=0;ipseudo_is_legal_move(m)) { legals.append(m); } } } return legals; } QVector Board::legal_moves_from(int from_square) { QVector pseudo_legals = this->pseudo_legal_moves_from(from_square, true,this->turn); QVector legals; for(int i=0;ipseudo_is_legal_move(m)) { legals.append(m); } } return legals; } bool Board::is_legal_and_promotes(const Move &m) { QVector legals = this->legal_moves_from(m.from); for(int i=0;i pseudo_legals = this->pseudo_legal_moves_from(m.from, true,this->turn); for(int i=0;ipseudo_is_legal_move(m)) { return true; } } return false; } bool Board::pseudo_is_legal_move(const Move &m) { // a pseudo legal move is a legal move if // a) doesn't put king in check // b) if castle, must ensure that 1) king is not currently in check // 2) castle over squares are not in check // 3) doesn't castle into check // first find color of mover bool color = this->piece_color(m.from); // find king with that color for(int i= 21;i<99;i++) { if(this->piece_type(i) == KING && this->piece_color(i) == color) { // if the move is not by the king if(i!=m.from) { // apply the move, check if king is attacked, and decide bool legal = false; this->apply(m); legal = !this->is_attacked(i,!color); this->undo(); return legal; } else { // means we move the king // first check castle cases if(this->castles_wking(m)) { if(!this->is_attacked(E1,BLACK) && !this->is_attacked(F1,BLACK) && !this->is_attacked(G1,BLACK)) { bool legal = false; this->apply(m); legal = !this->is_attacked(G1,BLACK); this->undo(); return legal; } else { return false; } } if(this->castles_bking(m)) { if(!this->is_attacked(E8,WHITE) && !this->is_attacked(F8,WHITE) && !this->is_attacked(G8,WHITE)) { bool legal = false; this->apply(m); legal = !this->is_attacked(G8,WHITE); this->undo(); return legal; } else { return false; } } if(this->castles_wqueen(m)) { if(!this->is_attacked(E1,BLACK) && !this->is_attacked(D1,BLACK) && !this->is_attacked(C1,BLACK) ) { bool legal = false; this->apply(m); legal = !this->is_attacked(C1,BLACK); this->undo(); return legal; } else { return false; } } if(this->castles_bqueen(m)) { if(!this->is_attacked(E8,WHITE) && !this->is_attacked(D8,WHITE) && !this->is_attacked(C8,WHITE) ) { bool legal = false; this->apply(m); legal = !this->is_attacked(C8,WHITE); this->undo(); return legal; } else { return false; } } // if none of the castles cases triggered, we have a standard king move // just check if king isn't attacked after applying the move bool legal = false; this->apply(m); legal = !this->is_attacked(m.to,!color); this->undo(); return legal; } } } return false; } // doesn't account for attacks via en-passent bool Board::is_attacked(int idx, bool attacker_color) { // first check for potential pawn attackers // attacker color white, pawn must be white. // lower left if(attacker_color == WHITE && (this->board[idx-9]!=0xFF) && (this->piece_color(idx-9)==WHITE) && (this->piece_type(idx-9)==PAWN)) { return true; } // lower right if(attacker_color == WHITE && (this->board[idx-11]!=0xFF) && (this->piece_color(idx-11)==WHITE) && (this->piece_type(idx-11)==PAWN)) { return true; } // check black, upper right if(attacker_color == BLACK && (this->board[idx+11]!=0xFF) && (this->piece_color(idx+11)==BLACK) && (this->piece_type(idx+11)==PAWN)) { return true; } // check black, upper left if(attacker_color == BLACK && (this->board[idx+9]!=0xFF) && (this->piece_color(idx+9)==BLACK) && (this->piece_type(idx+9)==PAWN)) { return true; } // check all squares (except idx itself) // for potential attackers for(int i=21;i<99;i++) { // skip empty squares if(i!=idx && this->board[i] != 0x00) { // can't attack yourself if(this->piece_color(i) == attacker_color) { uint8_t piece = this->piece_type(i); int distance = idx - i; if(distance < 0) { distance = -distance; } IntBits pot_attackers = IntBits(ATTACK_TABLE[distance]); if((piece == KNIGHT && pot_attackers.test(0)) || (piece == BISHOP && pot_attackers.test(1)) || (piece == ROOK && pot_attackers.test(2)) || (piece == QUEEN && pot_attackers.test(3)) || (piece == KING && pot_attackers.test(4))) { // the target could be a potential attacker // now just get all pseudo legal moves from i, // excluding castling. If a move contains // target idx, then we have an attacker QVector targets = this->pseudo_legal_moves_from(i,false,attacker_color); for(int j=0;j Board::pseudo_legal_moves_from(int from_square, bool with_castles, bool turn) { QVector moves; for(int i=21;i<99;i++) { if(from_square == 0 || from_square == i) { // skip offboard's left and right if(!(this->board[i] == 0xFF)) { // get piece type & color bool color = this->piece_color(i); if(color == turn) { uint8_t piece = this->piece_type(i); // handle case of PAWN if(piece == PAWN) { uint8_t piece_idx = IDX_WPAWN; if(color == BLACK) { piece_idx = IDX_BPAWN; } // take up right, or up left for(int j=3;j<=4;j++) { uint8_t idx = i + DIR_TABLE[piece_idx][j]; if(!this->is_offside(idx)) { if((!this->is_empty(idx) && color==BLACK && this->is_white_at(idx)) || (!this->is_empty(idx) && color==WHITE && !this->is_white_at(idx))) { // if it's a promotion square, add four moves if((color==WHITE && (idx / 10 == 9)) || (color==BLACK && (idx / 10 == 2))) { moves.append(Move(i,idx,QUEEN)); moves.append(Move(i,idx,ROOK)); moves.append(Move(i,idx,BISHOP)); moves.append(Move(i,idx,KNIGHT)); } else { moves.append(Move(i,idx)); } } } } // move one (j=1) or two (j=2) up (or down in the case of black) for(int j=1;j<=2;j++) { uint8_t idx = i + DIR_TABLE[piece_idx][j]; if(!this->is_offside(idx)) { if(j==2 && ((color == WHITE && (i/10==3)) || (color==BLACK && (i/10==8)))) { // means we have a white/black pawn in inital position, direct square // in front is empty => allow to move two forward if(this->is_empty(idx)) { moves.append(Move(i,idx)); } } else if(j==1) { // case of one-step move forward if(!this->is_empty(idx)) { break; } else { // if it's a promotion square, add four moves if((color==WHITE && (idx / 10 == 9)) || (color==BLACK && (idx / 10 == 2))) { moves.append(Move(i,idx,QUEEN)); moves.append(Move(i,idx,ROOK)); moves.append(Move(i,idx,BISHOP)); moves.append(Move(i,idx,KNIGHT)); } else { moves.append(Move(i,idx)); } } } } } // finally, potential en-passent capture is handled // left up if(color == WHITE && (this->en_passent_target - i)==9) { Move m = (Move(i,this->en_passent_target)); moves.append(m); } // right up if(color == WHITE && (this->en_passent_target - i)==11) { Move m = (Move(i,this->en_passent_target)); moves.append(m); } // left down if(color == BLACK && (this->en_passent_target - i)==-9) { Move m = (Move(i,this->en_passent_target)); moves.append(m); } if(color == BLACK && (this->en_passent_target - i)==-11) { Move m = (Move(i,this->en_passent_target)); moves.append(m); } } // handle case of knight if(piece == KNIGHT || piece == KING) { int lookup_idx; if(piece == KNIGHT) { lookup_idx = IDX_KNIGHT; } else { lookup_idx = IDX_KING; } for(int j=1;j<=DIR_TABLE[lookup_idx][0];j++) { uint8_t idx = i + DIR_TABLE[lookup_idx][j]; if(!this->is_offside(idx)) { if(this->is_empty(idx) || (this->piece_color(idx) != color)) { moves.append(Move(i,idx)); } } } } // handle case of bishop, rook, queen if(piece == ROOK || piece == BISHOP || piece == QUEEN) { int lookup_idx = IDX_ROOK; if(piece == QUEEN) { lookup_idx = IDX_QUEEN; } if(piece == BISHOP) { lookup_idx = IDX_BISHOP; } for(int j=1;j<=DIR_TABLE[lookup_idx][0] ;j++) { uint8_t idx = i + DIR_TABLE[lookup_idx][j]; bool stop = false; while(!stop) { if(!this->is_offside(idx)) { if(this->is_empty(idx)) { moves.append(Move(i,idx)); } else { stop = true; if(this->piece_color(idx) != color) { moves.append(Move(i,idx)); } } idx = idx + DIR_TABLE[lookup_idx][j]; } else { stop = true; } } } } } } if(with_castles) { if(this->turn == WHITE) { // check for castling // white kingside if(i==E1 && !this->is_empty(E1) && this->can_castle_wking() && this->piece_color(E1) == WHITE && this->piece_color(H1) == WHITE && this->piece_type(E1) == KING && this->piece_type(H1) == ROOK && this->is_empty(F1) && this->is_empty(G1)) { moves.append(Move(E1,G1)); } // white queenside if(i==E1 && !this->is_empty(E1) && this->can_castle_wqueen() && this->piece_color(E1) == WHITE && this->piece_color(A1) == WHITE && this->piece_type(E1) == KING && this->piece_type(A1) == ROOK && this->is_empty(D1) && this->is_empty(C1) && this->is_empty(B1)) { moves.append(Move(E1,C1)); } } if(this->turn == BLACK) { // black kingside if(i==E8 && !this->is_empty(E8) && this->can_castle_bking() && this->piece_color(E8) == BLACK && this->piece_color(H8) == BLACK && this->piece_type(E8) == KING && this->piece_type(H8) == ROOK && this->is_empty(F8) && this->is_empty(G8)) { moves.append(Move(E8,G8)); } // black queenside if(i==E8 && !this->is_empty(E8) && this->can_castle_bqueen() && this->piece_color(E8) == BLACK && this->piece_color(A8) == BLACK && this->piece_type(E8) == KING && this->piece_type(A8) == ROOK && this->is_empty(D8) && this->is_empty(C8) && this->is_empty(B8)) { moves.append(Move(E8,C8)); } } } } } return moves; } // calling with from_square = 0 means all possible moves // will find all pseudo legal move for supplied player (turn must be // either WHITE or BLACK) QVector Board::pseudo_legal_moves_from_pt(int from_square, uint8_t to_square, uint8_t piece_type, bool with_castles, bool turn) { QVector moves; for(int i=21;i<99;i++) { if(from_square == 0 || from_square == i) { // skip offboard's left and right if(!(this->board[i] == 0xFF)) { // get piece type & color bool color = this->piece_color(i); if(color == turn) { uint8_t piece = this->piece_type(i); // handle case of PAWN if(piece == PAWN && piece_type == PAWN) { uint8_t piece_idx = IDX_WPAWN; if(color == BLACK) { piece_idx = IDX_BPAWN; } // take up right, or up left for(int j=3;j<=4;j++) { uint8_t idx = i + DIR_TABLE[piece_idx][j]; if(idx == to_square && !this->is_offside(idx)) { if((!this->is_empty(idx) && color==BLACK && this->is_white_at(idx)) || (!this->is_empty(idx) && color==WHITE && !this->is_white_at(idx))) { // if it's a promotion square, add four moves if((color==WHITE && (idx / 10 == 9)) || (color==BLACK && (idx / 10 == 2))) { moves.append(Move(i,idx,QUEEN)); moves.append(Move(i,idx,ROOK)); moves.append(Move(i,idx,BISHOP)); moves.append(Move(i,idx,KNIGHT)); } else { moves.append(Move(i,idx)); } } } } // move one (j=1) or two (j=2) up (or down in the case of black) for(int j=1;j<=2;j++) { uint8_t idx = i + DIR_TABLE[piece_idx][j]; if(!this->is_offside(idx)) { if(j==2 && ((color == WHITE && (i/10==3)) || (color==BLACK && (i/10==8)))) { // means we have a white/black pawn in inital position, direct square // in front is empty => allow to move two forward if(this->is_empty(idx)) { moves.append(Move(i,idx)); } } else if(j==1) { // case of one-step move forward if(!this->is_empty(idx)) { break; } else { // if it's a promotion square, add four moves if((color==WHITE && (idx / 10 == 9)) || (color==BLACK && (idx / 10 == 2))) { moves.append(Move(i,idx,QUEEN)); moves.append(Move(i,idx,ROOK)); moves.append(Move(i,idx,BISHOP)); moves.append(Move(i,idx,KNIGHT)); } else { moves.append(Move(i,idx)); } } } } } // finally, potential en-passent capture is handled // left up if(color == WHITE && (this->en_passent_target - i)==9) { Move m = (Move(i,this->en_passent_target)); moves.append(m); } // right up if(color == WHITE && (this->en_passent_target - i)==11) { Move m = (Move(i,this->en_passent_target)); moves.append(m); } // left down if(color == BLACK && (this->en_passent_target - i)==-9) { Move m = (Move(i,this->en_passent_target)); moves.append(m); } if(color == BLACK && (this->en_passent_target - i)==-11) { Move m = (Move(i,this->en_passent_target)); moves.append(m); } } // handle case of knight if((piece == KNIGHT && piece_type == KNIGHT)|| (piece == KING && piece_type == KING)) { int lookup_idx; if(piece == KNIGHT) { lookup_idx = IDX_KNIGHT; } else { lookup_idx = IDX_KING; } for(int j=1;j<=DIR_TABLE[lookup_idx][0];j++) { uint8_t idx = i + DIR_TABLE[lookup_idx][j]; if(idx == to_square && !this->is_offside(idx)) { if(this->is_empty(idx) || (this->piece_color(idx) != color)) { moves.append(Move(i,idx)); } } } } // handle case of bishop, rook, queen if((piece == ROOK && piece_type == ROOK) || (piece == BISHOP && piece_type == BISHOP) || (piece == QUEEN && piece_type == QUEEN)) { int lookup_idx = IDX_ROOK; if(piece == QUEEN) { lookup_idx = IDX_QUEEN; } if(piece == BISHOP) { lookup_idx = IDX_BISHOP; } for(int j=1;j<=DIR_TABLE[lookup_idx][0] ;j++) { uint8_t idx = i + DIR_TABLE[lookup_idx][j]; bool stop = false; while(!stop) { if(!this->is_offside(idx)) { if(this->is_empty(idx)) { if(to_square == idx) { moves.append(Move(i,idx)); } } else { stop = true; if(this->piece_color(idx) != color) { if(to_square == idx) { moves.append(Move(i,idx)); } } } idx = idx + DIR_TABLE[lookup_idx][j]; } else { stop = true; } } } } } } if(with_castles) { if(this->turn == WHITE) { // check for castling // white kingside if(i==E1 && !this->is_empty(E1) && this->can_castle_wking() && this->piece_color(E1) == WHITE && this->piece_color(H1) == WHITE && this->piece_type(E1) == KING && this->piece_type(H1) == ROOK && this->is_empty(F1) && this->is_empty(G1)) { moves.append(Move(E1,G1)); } // white queenside if(i==E1 && !this->is_empty(E1) && this->can_castle_wqueen() && this->piece_color(E1) == WHITE && this->piece_color(A1) == WHITE && this->piece_type(E1) == KING && this->piece_type(A1) == ROOK && this->is_empty(D1) && this->is_empty(C1) && this->is_empty(B1)) { moves.append(Move(E1,C1)); } } if(this->turn == BLACK) { // black kingside if(i==E8 && !this->is_empty(E8) && this->can_castle_bking() && this->piece_color(E8) == BLACK && this->piece_color(H8) == BLACK && this->piece_type(E8) == KING && this->piece_type(H8) == ROOK && this->is_empty(F8) && this->is_empty(G8)) { moves.append(Move(E8,G8)); } // black queenside if(i==E8 && !this->is_empty(E8) && this->can_castle_bqueen() && this->piece_color(E8) == BLACK && this->piece_color(A8) == BLACK && this->piece_type(E8) == KING && this->piece_type(A8) == ROOK && this->is_empty(D8) && this->is_empty(C8) && this->is_empty(B8)) { moves.append(Move(E8,C8)); } } } } } return moves; } bool Board::movePromotes(const Move&m) { if(this->piece_type(m.from) == chess::PAWN) { if(this->piece_color(m.from) == chess::WHITE && ((m.to / 10)==9)) { return true; } if(this->piece_color(m.from) == chess::BLACK && ((m.to / 10)==2)) { return true; } } return false; } bool Board::piece_color(uint8_t idx) { IntBits piece = IntBits(this->board[idx]); if(piece.test(COLOR_FLAG) == WHITE) { return WHITE; } else { return BLACK; } } uint8_t Board::piece_type(uint8_t idx) { IntBits piece = IntBits(this->board[idx]); piece.set(7,0); return static_cast(piece.to_ulong()); } uint8_t Board::piece_at(uint8_t idx) { if(idx >= 21 && idx <= 98) { return this->board[idx]; } else { throw std::invalid_argument("called get_piece_at with invalid paramters"); } } // returns true if square is not empty bool Board::is_empty(uint8_t idx) { if(this->board[idx] == 0x00) { return true; } else { return false; } } // returns true if square is in fringe bool Board::is_offside(uint8_t idx) { if(this->board[idx] == 0xFF) { return true; } else { return false; } } bool Board::can_claim_fifty_moves() { return this->halfmove_clock >= 100; } // returns true (== Black) if not occupied! bool Board::is_white_at(uint8_t idx) { IntBits square = IntBits(this->board[idx]); if(square.test(COLOR_FLAG)) { return false; } else { return true; } } // doesn't check legality void Board::apply(const Move &m) { assert(m.promotion_piece <= 5); if(m.is_null) { //std::cout << "applying null move: " << m.uci_string.toStdString() << std::endl; //std::cout << (*this) << std::endl; this->turn = !this->turn; this->prev_en_passent_target = this->en_passent_target; this->en_passent_target = 0; this->last_was_null = true; this->undo_available = true; } else { this->last_was_null = false; this->turn = !this->turn; this->prev_en_passent_target = this->en_passent_target; this->prev_castling_rights = this->castling_rights; this->en_passent_target = 0; if(this->turn == WHITE) { this->fullmove_number++; } for(int i=0;i<120;i++) { this->old_board[i] = this->board[i]; } uint8_t old_piece_type = this->piece_type(m.from); bool color = this->piece_color(m.from); // increase halfmove clock only if no capture or pawn advance // happended this->prev_halfmove_clock = this->halfmove_clock; if(old_piece_type == PAWN || this->board[m.to] != EMPTY) { this->halfmove_clock = 0; } else { this->halfmove_clock++; } // if we move a pawn two steps up, set the en_passent field if(old_piece_type == PAWN) { // white pawn moved two steps up if((m.to - m.from) == 20) { this->en_passent_target = m.from + 10; } // black pawn moved two steps up (down) if((m.to - m.from == -20)) { this->en_passent_target = m.from - 10; } } // if the move is an en-passent capture, // remove the (non-target) corresponding pawn // move is an en passent move, if // a) color is white, piece type is pawn, target // is up left or upright and empty // b) color is black, piece type is pawn, target // is down right or down left and empty // also set last_move_was_ep to true if(old_piece_type == PAWN) { if(this->board[m.to] == EMPTY) { if(color == WHITE && ((m.to-m.from == 9) || (m.to-m.from)==11)) { // remove captured pawn this->board[m.to-10] = 0x00; } if(color == BLACK && ((m.from -m.to == 9) || (m.from - m.to)==11)) { // remove captured pawn this->board[m.to+10] = 0x00; } } } // if the move is a promotion, the target // field becomes the promotion choice if(m.promotion_piece != EMPTY) { // true means black if(color == BLACK) { // +128 sets 7th bit to true (means black) this->board[m.to] = m.promotion_piece +128; } else { this->board[m.to] = m.promotion_piece; } } else { // otherwise the target is the piece on the from field this->board[m.to] = this->board[m.from]; } this->board[m.from] = EMPTY; // check if the move is castles, i.e. 0-0 or 0-0-0 // then we also need to move the rook // white kingside if(old_piece_type == KING) { if(color==WHITE) { if(m.from == E1 && m.to == G1) { this->board[F1] = this->board[H1]; this->board[H1] = EMPTY; this->set_castle_wking(false); } // white queenside if(m.from == E1 && m.to == C1) { this->board[D1] = this->board[A1]; this->board[A1] = EMPTY; this->set_castle_wqueen(false); } } else if(color==BLACK) { // black kingside if(m.from == E8 && m.to == G8) { this->board[F8] = this->board[H8]; this->board[H8] = EMPTY; this->set_castle_bking(false); } // black queenside if(m.from == E8 && m.to == C8) { this->board[D8] = this->board[A8]; this->board[A8] = EMPTY; this->set_castle_bqueen(false); } } } // check if someone loses castling rights // by moving king or by moving rook // or if one of the rooks is captured by the // opposite side if(color == WHITE) { if(old_piece_type == KING) { if(m.from == E1 && m.to !=G1) { this->set_castle_wking(false); } if(m.from == E1 && m.to != C1) { this->set_castle_wqueen(false); } } if(old_piece_type == ROOK) { if(m.from == A1) { this->set_castle_wqueen(false); } if(m.from == H1) { this->set_castle_wking(false); } } // white moves a piece to H8 or A8 // means either white captures rook // or black has moved rook prev. // [even though: in the latter case, should be already // done by check above in prev. moves] if(m.to == H8) { this->set_castle_bking(false); } if(m.to == A8) { this->set_castle_bqueen(false); } } // same for black if(color == BLACK) { if(old_piece_type == KING) { if(m.from == E8 && m.to !=G8) { this->set_castle_bking(false); } if(m.from == E8 && m.to != C8) { this->set_castle_bqueen(false); } } if(old_piece_type == ROOK) { if(m.from == A8) { this->set_castle_bqueen(false); } if(m.from == H8) { this->set_castle_bking(false); } } // black moves piece to A1 or H1 if(m.to == H1) { this->set_castle_wking(false); } if(m.to == A1) { this->set_castle_wqueen(false); } } // after move is applied, can revert to the previous position this->undo_available = true; // also update transposition table for 3fold repition detection //this->update_transposition_table(); } } void Board::undo() { if(!this->undo_available) { throw std::logic_error("must call board.apply(move) each time before calling undo() "); } else { if(this->last_was_null) { this->turn = !this->turn; this->en_passent_target = this->prev_en_passent_target; this->prev_en_passent_target = 0; this->last_was_null = false; this->undo_available = true; } else { for(int i=0;i<120;i++) { this->board[i] = this->old_board[i]; } this->undo_available = false; this->en_passent_target = this->prev_en_passent_target; this->prev_en_passent_target = 0; this->castling_rights = this->prev_castling_rights; this->turn = !this->turn; this->halfmove_clock = this->prev_halfmove_clock; this->prev_halfmove_clock = 0; if(this->turn == BLACK) { this->fullmove_number--; } } } } // doesn't check legality /* Board* Board::copy_and_apply(const Move &m) { Board *b = new Board(); b->turn = this->turn; b->castling_rights = this->castling_rights; b->turn = this->turn; b->en_passent_target = this->en_passent_target; b->halfmove_clock = this->halfmove_clock; b->fullmove_number = this->fullmove_number; b->undo_available = this->undo_available; b->last_was_null = this->last_was_null; b->prev_halfmove_clock = this->prev_halfmove_clock; b->transpositionTable = QMap(this->transpositionTable); for(int i=0;i<120;i++) { b->board[i] = this->board[i]; b->old_board[i] = this->old_board[i]; } b->apply(m); return b; } */ Board::Board(const Board &other) { turn = other.turn; castling_rights = other.castling_rights; //turn = this->turn; ??? en_passent_target = other.en_passent_target; halfmove_clock = other.halfmove_clock; fullmove_number = other.fullmove_number; undo_available = other.undo_available; last_was_null = other.last_was_null; prev_halfmove_clock = other.prev_halfmove_clock; transpositionTable = QMap(other.transpositionTable); for(int i=0;i<120;i++) { board[i] = other.board[i]; old_board[i] = other.old_board[i]; } } bool Board::is_stalemate() { // search for king of player with current turn // check whether king is attacked for(int i=21;i<99;i++) { if((this->piece_type(i)==KING) && (this->piece_color(i)==this->turn)){ if(!this->is_attacked(i,!this->turn)) { QVector legals = this->legal_moves(); int c = legals.count(); if(c==0) { return true; } else { return false; } } else { return false; } } } return false; } bool Board::is_threefold_repetition() { quint64 current_zobrist = this->zobrist(); if(this->transpositionTable.contains(current_zobrist)) { int cnt = this->transpositionTable.value(current_zobrist); return cnt >= 3; } else { return false; } } bool Board::is_checkmate() { // search for king of player with current turn // check whether king is attacked for(int i=21;i<99;i++) { if((this->piece_type(i)==KING) && (this->piece_color(i)==this->turn)){ if(this->is_attacked(i,!this->turn)) { QVector legals = this->legal_moves(); int c = legals.count(); if(c==0) { return true; } else { return false; } } else { return false; } } } return false; } bool Board::is_check() { for(int i=21;i<99;i++) { if((this->piece_type(i)==KING) && (this->piece_color(i)==this->turn)){ if(this->is_attacked(i,!this->turn)) { return true; } else { return false; } } } return false; } uint8_t Board::alpha_to_pos(QChar alpha) { if(alpha == QChar('A')) { return 1; } else if(alpha == QChar('B')) { return 2; } else if(alpha == QChar('C')) { return 3; } else if(alpha == QChar('D')) { return 4; } else if(alpha == QChar('E')) { return 5; } else if(alpha == QChar('F')) { return 6; } else if(alpha == QChar('G')) { return 7; } else if(alpha == QChar('H')) { return 8; } return 0; } // assumes supplied move is correct // otherwise might mess up the whole // current board QString Board::san(const Move &m) { QString san = QString(""); // first check for null move if(m.is_null) { san = QString("--"); return san; } // first test for checkmate and check (to be appended later) // create temp board, since appyling move and // testing for checkmate (which again needs // application of a move) makes it impossible // to undo (undo can only be done once, not twice in a row) /* Board* b_temp = this->copy_and_apply(m); bool is_check = b_temp->is_check(); bool is_checkmate = b_temp->is_checkmate(); delete b_temp; */ Board b_temp = Board(this); bool is_check = b_temp.is_check(); bool is_checkmate = b_temp.is_checkmate(); if(this->castles_wking(m) || this->castles_bking(m)) { san.append("O-O"); if(is_checkmate) { san.append("#"); } if(is_check) { san.append("+"); } return san; } else if(this->castles_wqueen(m) || this->castles_bqueen(m)) { san.append("O-O-O"); if(is_checkmate) { san.append("#"); } else if(is_check) { san.append("+"); } return san; } else { uint8_t piece_type = this->piece_type(m.from); QVector legals = this->legal_moves(m.to, piece_type); if(piece_type == KNIGHT) { san.append("N"); } if(piece_type == BISHOP) { san.append("B"); } if(piece_type == ROOK) { san.append("R"); } if(piece_type == QUEEN) { san.append("Q"); } if(piece_type == KING) { san.append("K"); } QVector col_disambig; QVector row_disambig; int this_row = (m.from / 10) - 1; int this_col = m.from % 10; // find amibguous moves (except for pawns) if(piece_type != PAWN) { for(int i=0;ipiece_type(mi.from) == piece_type && mi.to == m.to && mi.from != m.from) { // found pontential amibg. move if((mi.from % 10) != this_col) { // can be resolved via row col_disambig.append(mi); } else { // otherwise resolve by col row_disambig.append(mi); } } } int cnt_col_disambig = col_disambig.count(); //cout << "ambig cols: " << +cnt_col_disambig << endl; int cnt_row_disambig = row_disambig.count(); //cout << "ambig rows: " << +cnt_row_disambig << endl; // if there is an ambiguity if(cnt_col_disambig != 0 || cnt_row_disambig != 0) { // preferred way: resolve via column if(cnt_col_disambig>0 && cnt_row_disambig==0) { san.append(QChar(this_col + 96)); // if not try to resolve via row } else if(cnt_row_disambig>0 && cnt_col_disambig==0) { san.append(QChar(this_row + 48)); } else { // if that also fails (think three queens) // resolve via full coordinate san.append(QChar(this_col + 96)); san.append(QChar(this_row + 48)); } } } // handle a capture, i.e. if destination field // is not empty // in case of an en-passent capture, the destiation field // is empty. But then the destination field is the e.p. square if(this->piece_type(m.to) != EMPTY || m.to == this->en_passent_target) { if(piece_type == PAWN) { san.append(QChar(this_col + 96)); } san.append(QString("x")); } san.append(this->idx_to_str(m.to)); if(m.promotion_piece == KNIGHT) { san.append(("=N")); } if(m.promotion_piece == BISHOP) { san.append(("=B")); } if(m.promotion_piece == ROOK) { san.append(("=R")); } if(m.promotion_piece == QUEEN) { san.append(("=Q")); } } if(is_checkmate) { san.append("#"); } else if(is_check) { san.append("+"); } return san; } Move Board::parse_san(QString san) { // first check if null move if(san==QString("--")) { Move m = Move(); return m; } Move m = Move(0,0); // check for castling moves if(san==QString("O-O") || san == QString("O-O+") || san==QString("O-O#")) { uint8_t to = G1; if(this->turn == BLACK) { to = G8; } QVector legals = this->legal_moves(to, KING); for(int i=0;icastles_wking(m)) { return Move(E1,G1); } else if(this->castles_bking(m)) { return Move(E8,G8); } } throw std::invalid_argument("invalid san / ambiguous: "+san.toStdString()); } else if(san==QString("O-O-O") || san == QString("O-O-O+") || san==QString("O-O-O#")) { uint8_t to = C1; if(this->turn == BLACK) { to = C8; } QVector legals = this->legal_moves(to, KING); for(int i=0;icastles_wqueen(m)) { return Move(E1,C1); } else if(this->castles_bqueen(m)) { return Move(E8,C8); } } throw std::invalid_argument("invalid san / ambiguous: "+san.toStdString()); } else { // we don't have a castles move QRegularExpressionMatch match = SAN_REGEX.match(san); if(!match.hasMatch()) { throw std::invalid_argument("invalid san: "+san.toStdString()); } // get target square QString str_target = match.captured(4).toUpper(); uint8_t target_col = this->alpha_to_pos(str_target.at(0)); // -49 for ascii(1) -> int 0 uint8_t target_row = (uint8_t) ((str_target.at(1).toLatin1()-49)+1); uint8_t target = ((target_row+1) * 10)+target_col; // get promotion piece QString str_prom = match.captured(5); if(!str_prom.isNull()) { //std::cout << match.captured(5).toStdString() << std::endl; if(match.captured(5)==QString("=N")) { m.promotion_piece = KNIGHT; } else if(match.captured(5)==QString("=B")) { m.promotion_piece = BISHOP; } else if(match.captured(5)==QString("=R")) { m.promotion_piece = ROOK; } else if(match.captured(5)==QString("=Q")) { m.promotion_piece = QUEEN; } else { throw std::invalid_argument("invalid san / promotion: "+match.captured(5).toStdString()); } //if(this->turn == BLACK) { // m.promotion_piece += 0x80; //} NO: promotion piece _only_ encodes piece, _not_ color } // get piece type uint8_t piece_type = 0; if(match.captured(1) == QString("B")) { piece_type = BISHOP; } else if(match.captured(1) == QString("N")) { piece_type = KNIGHT; } else if(match.captured(1) == QString("R")) { piece_type = ROOK; } else if(match.captured(1) == QString("Q")) { piece_type = QUEEN; } else if(match.captured(1) == QString("K")) { piece_type = KING; } else { piece_type = PAWN; } QVector legals = this->legal_moves(target, piece_type); // get target square uint8_t src_col = 0; uint8_t src_row = 0; QString str_amb_col = match.captured(2).toUpper(); if(!str_amb_col.isNull()) { src_col = this->alpha_to_pos(str_amb_col.at(0)); } QString str_amb_row = match.captured(3).toUpper(); if(!str_amb_row.isNull()) { src_row = (uint8_t) ((str_amb_row.at(0).toLatin1()-49) +1); } if(m.promotion_piece!=0) { //std::cout << "is WHITE: " << +(this->turn==WHITE) << std::endl; } // filter all moves QVector lgl_piece; for(int i=0;ipiece_type(mi.from) == piece_type && mi.promotion_piece == m.promotion_piece) { if(src_col == 0 && src_row == 0) { lgl_piece.append(mi); } else if(src_col !=0 && src_row ==0 && mi_col == src_col) { lgl_piece.append(mi); } else if(src_col ==0 && src_row !=0 && mi_row == src_row) { lgl_piece.append(mi); } else if(src_col !=0 && src_row !=0 && mi_row == src_row && mi_col == src_col) { lgl_piece.append(mi); } } } if(m.promotion_piece != 0 && lgl_piece.count() > 1) { //std::cout << "there are too many moves!" << std::endl; } // now lgl_piece should contain only one move, since // all ambigiuous have been filtered. otherwise san is wrong if(lgl_piece.count() > 1 || lgl_piece.count() == 0) { //std::cout << *this << std::endl; //std::cout << +this->fullmove_number << std::endl; throw std::invalid_argument("invalid san / ambiguous: "+san.toStdString() + " " + QString::number(piece_type).toStdString() + " "+QString::number(target).toStdString()); } else { Move mi = lgl_piece.at(0); m.from = mi.from; m.to = mi.to; m.promotion_piece = mi.promotion_piece; m.uci_string = mi.uci_string; } } return m; } /** * @brief Board::is_black_castle_right_lost * @return true if black king and kingside rook * are on initial position, false otherwise * i.e. checks the _possibility_ whether * castling could be possible (to check consistency when * entering a board position) * to call board status, use can_castle_* functions */ bool Board::is_black_king_castle_right_lost() { if(this->board[E8] == BLACK_KING && this->board[H8] == BLACK_ROOK) { return false; } else { return true; } } bool Board::is_black_queen_castle_right_lost() { if(this->board[E8] == BLACK_KING && this->board[A8] == BLACK_ROOK) { return false; } else { return true; } } bool Board::is_white_king_castle_right_lost() { if(this->board[E1] == WHITE_KING && this->board[H1] == WHITE_ROOK) { return false; } else { return true; } } bool Board::is_white_queen_castle_right_lost() { if(this->board[E1] == WHITE_KING && this->board[A1] == WHITE_ROOK) { return false; } else { return true; } } bool Board::is_consistent() { int white_king_pos = -1; int black_king_pos = -1; int cnt_white_king = 0; int cnt_black_king = 0; int cnt_white_queens = 0; int cnt_white_rooks = 0; int cnt_white_bishops = 0; int cnt_white_knights = 0; int cnt_white_pawns = 0; int cnt_black_queens = 0; int cnt_black_rooks = 0; int cnt_black_bishops = 0; int cnt_black_knights = 0; int cnt_black_pawns = 0; for(int i=21;i<99;i++) { uint8_t piece_type = this->piece_type(i); bool piece_color = this->piece_color(i); if(piece_type != EMPTY) { if(piece_type == KING) { if(piece_color == WHITE) { white_king_pos = i; cnt_white_king++; } else { black_king_pos = i; cnt_black_king++; } } else if(piece_type == QUEEN) { if(piece_color == WHITE) { cnt_white_queens++; } else { cnt_black_queens++; } } else if(piece_type == ROOK) { if(piece_color == WHITE) { cnt_white_rooks++; } else { cnt_black_rooks++; } } else if(piece_type == BISHOP) { if(piece_color == WHITE) { cnt_white_bishops++; } else { cnt_black_bishops++; } } else if(piece_type == KNIGHT) { if(piece_color == WHITE) { cnt_white_knights++; } else { cnt_black_knights++; } } else if(piece_type == PAWN) { if(piece_color == WHITE) { if((i / 10) == 2) { // white pawn in first rank return false; } else { cnt_white_pawns++; } } else { if((i / 10) == 9) { // black pawn in 8th rank return false; } else { cnt_black_pawns++; } } } } } // exactly one white and black king exist on board if(white_king_pos < 21 || white_king_pos >= 99 || black_king_pos < 21 || black_king_pos >= 99 || cnt_white_king != 1 || cnt_black_king != 1) { return false; } // white and black king at least on field apart int larger = white_king_pos; int smaller = black_king_pos; if(black_king_pos > white_king_pos) { larger = black_king_pos; smaller = white_king_pos; } int diff = larger - smaller; if(diff == 10 || diff == 1 || diff == 11 || diff == 9) { return false; } // side not to move must not be in check bool not_to_move = !this->turn; bool to_move = this->turn; int idx_king_not_to_move = white_king_pos; if(not_to_move == BLACK) { idx_king_not_to_move = black_king_pos; } if(this->is_attacked(idx_king_not_to_move, to_move)) { return false; } // each side has 8 pawns or less if(cnt_white_pawns > 8 || cnt_black_pawns > 8) { return false; } // check whether no. of promotions and pawn count fits for white int white_extra_pieces = std::max(0, cnt_white_queens-1) + std::max(0, cnt_white_rooks-2) + std::max(0, cnt_white_bishops - 2) + std::max(0, cnt_white_knights - 2); if(white_extra_pieces > (8-cnt_white_pawns)) { return false; } // ... for black int black_extra_pieces = std::max(0, cnt_black_queens-1) + std::max(0, cnt_black_rooks-2) + std::max(0, cnt_black_bishops - 2) + std::max(0, cnt_black_knights - 2); if(black_extra_pieces > (8-cnt_black_pawns)) { return false; } // compare encoded castling rights of this board w/ actual // position of king and rook if(this->can_castle_wking() && this->is_white_king_castle_right_lost()) { return false; } if(this->can_castle_wqueen() && this->is_white_queen_castle_right_lost()) { return false; } if(this->can_castle_bking() && this->is_black_king_castle_right_lost()) { return false; } if(this->can_castle_bqueen() && this->is_black_queen_castle_right_lost()) { return false; } return true; } /* * \brief operator << * \param strm * \param b * \return stream prints board representation into stream */ /** * @brief operator << * @param strm * @param b * @return * * prints board as ascii output. * * Example: * Board b(); * std::cout << b << std::endl; * */ std::ostream& operator<<(std::ostream &strm, const Board &b) { for(uint8_t i=90;i>=20;i-=10) { for(uint8_t j=1;j<=9;j++) { //uint8_t piece = b.piece_type(i+j); IntBits piece = IntBits(b.board[i+j]); bool color = WHITE; if(piece.test(COLOR_FLAG) == WHITE) { color = WHITE; } else { color = BLACK; } piece.set(3,0); piece.set(4,0); piece.set(7,0); if(piece == PAWN) { if(color == WHITE) { strm << "P "; } else { strm << "p "; } } if(piece == KNIGHT) { if(color == WHITE) { strm << "N "; } else { strm << "n "; } } if(piece == BISHOP) { if(color == WHITE) { strm << "B "; } else { strm << "b "; } } if(piece == ROOK) { if(color == WHITE) { strm << "R "; } else { strm << "r "; } } if(piece == QUEEN) { if(color == WHITE) { strm << "Q "; } else { strm << "q "; } } if(piece == KING) { if(color == WHITE) { strm << "K "; } else { strm << "k "; } } if(b.en_passent_target == (i+j)) { strm << ": "; } else if(piece == EMPTY) { strm << ". "; } } strm << std::endl; } return strm; } int Board::zobrist_piece_type(uint8_t piece) { switch (piece) { case BLACK_PAWN: return 0; case WHITE_PAWN: return 1; case BLACK_KNIGHT: return 2; case WHITE_KNIGHT: return 3; case BLACK_BISHOP: return 4; case WHITE_BISHOP: return 5; case BLACK_ROOK: return 6; case WHITE_ROOK: return 7; case BLACK_QUEEN: return 8; case WHITE_QUEEN: return 9; case BLACK_KING: return 10; case WHITE_KING: return 11; } throw std::invalid_argument("piece type out of range in ZobristHash:kind_of_piece"); } void Board::update_transposition_table() { quint64 current_zobrist = this->zobrist(); if(this->transpositionTable.contains(current_zobrist)) { int cnt = this->transpositionTable.value(current_zobrist); this->transpositionTable.insert(current_zobrist, cnt+1); } else { this->transpositionTable.insert(current_zobrist, 1); } } quint64 Board::zobrist() { Board *b = this; quint64 piece = Q_UINT64_C(0); for(int i=0;i<8;i++) { for(int j=0;j<8;j++) { uint8_t piece_at_ij = b->get_piece_at(i,j); if(piece_at_ij != EMPTY) { int kind_of_piece = this->zobrist_piece_type(piece_at_ij); int offset_piece = 64 * kind_of_piece + 8 * j + i; piece = piece^POLYGLOT_RANDOM_64[offset_piece]; } } } //std::cout << "pieces:" << std::endl; //std::cout << std::hex << piece << std::endl; quint64 en_passent = Q_UINT64_C(0); uint8_t ep_target = b->get_ep_target(); if(ep_target != 0) { int file = (ep_target % 10) - 1; // check if left or right is a pawn from player to move if(b->turn == WHITE) { uint8_t left = b->piece_at(ep_target-11); uint8_t right = b->piece_at(ep_target-9); if(left == WHITE_PAWN || right == WHITE_PAWN) { en_passent = POLYGLOT_RANDOM_64[RANDOM_EN_PASSENT + file]; } } else { uint8_t left = b->piece_at(ep_target+11); uint8_t right = b->piece_at(ep_target+9); if(left == BLACK_PAWN || right == BLACK_PAWN) { en_passent = POLYGLOT_RANDOM_64[RANDOM_EN_PASSENT + file]; } } } //std::cout << "ep:" << std::endl; //std::cout << std::hex << en_passent << std::endl; quint64 castle = Q_UINT64_C(0); if(b->can_castle_wking()) { castle = castle^POLYGLOT_RANDOM_64[RANDOM_CASTLE]; } if(b->can_castle_wqueen()) { castle = castle^POLYGLOT_RANDOM_64[RANDOM_CASTLE+1]; } if(b->can_castle_bking()) { castle = castle^POLYGLOT_RANDOM_64[RANDOM_CASTLE+2]; } if(b->can_castle_bqueen()) { castle = castle^POLYGLOT_RANDOM_64[RANDOM_CASTLE+3]; } //std::cout << "castle:" << std::endl; //std::cout << std::hex << castle << std::endl; quint64 turn = Q_UINT64_C(0); if(b->turn == WHITE) { turn = POLYGLOT_RANDOM_64[RANDOM_TURN]; } //std::cout << "turn:" << std::endl; //std::cout << std::hex << turn << std::endl; quint64 key = piece^castle^en_passent^turn; return key; } } jerry-3.2.0/src/chess/board.h0000664000175000017500000005475413514421177014547 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef BOARD_H #define BOARD_H #include #include #include #include "move.h" namespace chess { // empty board const uint8_t EMPTY_POS[120] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; // initial board position const uint8_t INIT_POS[120] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x02, 0x03, 0x05, 0x06, 0x03, 0x02, 0x04, 0xFF, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x84, 0x82, 0x83, 0x85, 0x86, 0x83, 0x82, 0x84, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; // attack table // the index of this array corresponds to the distance // between two squares of the board (note the board is // encoded as a one dim array of size 120, where A1 = 21, H1 = 28 // A8 = 91, A8 = 98. // the value denotes whether an enemy rook, biship knight, queen, king // on one square can attack the other square. The following encoding // is used: // Bitposition Piece // 0 Knight // 1 Bishop // 2 Rook // 3 Queen // 4 King // e.g. distance one, i.e. index 1 (=left, up, down, right square) has // value 0x1C = MSB 00011100 LSB, i.e. king, queen, rook can // potentially attack const uint8_t ATTACK_TABLE[78] = { 0x00, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x01, 0x1a, 0x1C, 0x1A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x0C, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0A, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0a, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A }; const uint8_t IDX_BPAWN = 0; const uint8_t IDX_WPAWN = 1; const uint8_t IDX_KNIGHT = 2; const uint8_t IDX_BISHOP = 3; const uint8_t IDX_ROOK = 4; const uint8_t IDX_QUEEN = 5; const uint8_t IDX_KING = 6; // first dim is for different piece types // [piece_type[0] is DCOUNT (as in Byte Magazine paper) // [piece_type[1] ... [piece_type][4] resp. // [piece_type[1] ... [piece_type][8] contain // DPOINT table const int8_t DIR_TABLE[7][9] = { { 4, -10, -20, -11, -9 , 0, 0, 0, 0 }, // max 4 black pawn directions, rest 0's { 4, +10, +20, +11, +9 , 0, 0, 0, 0 }, // max 4 white pawn directions, rest 0's { 8, -21, -12, +8 , +19, +21, +12, -8, -19 }, // 8 knight directions { 4, +9 , +11, -11, -9 , 0, 0, 0, 0 }, // 4 bishop directions { 4, +10, -10, +1 , -1 , 0, 0, 0, 0 }, // 4 rook directions { 8, +9 , +11, -11, -9 , +10, -10, +1, -1 }, // 8 queen directions { 8, +9 , +11, -11, -9 , +10, -10, +1, -1 } // 8 king directions (= queen dir's) }; // players const bool WHITE = false; const bool BLACK = true; // bit positions of flags const uint8_t COLOR_FLAG = 7; //const uint8_t CASTLE_FLAG = 4; //const uint8_t MOVED_FLAG = 4; // bit index positions for castling right uint8_t // bit is set means castling is possible const uint8_t CASTLE_WKING_POS = 0; const uint8_t CASTLE_WQUEEN_POS = 1; const uint8_t CASTLE_BKING_POS = 2; const uint8_t CASTLE_BQUEEN_POS = 3; const QString STARTING_FEN = QString("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"); // board positions const uint8_t A1 = 21; const uint8_t A2 = 31; const uint8_t A3 = 41; const uint8_t A4 = 51; const uint8_t A5 = 61; const uint8_t A6 = 71; const uint8_t A7 = 81; const uint8_t A8 = 91; const uint8_t B1 = 22; const uint8_t B2 = 32; const uint8_t B3 = 42; const uint8_t B4 = 52; const uint8_t B5 = 62; const uint8_t B6 = 72; const uint8_t B7 = 82; const uint8_t B8 = 92; const uint8_t C1 = 23; const uint8_t C2 = 33; const uint8_t C3 = 43; const uint8_t C4 = 53; const uint8_t C5 = 63; const uint8_t C6 = 73; const uint8_t C7 = 83; const uint8_t C8 = 93; const uint8_t D1 = 24; const uint8_t D2 = 34; const uint8_t D3 = 44; const uint8_t D4 = 54; const uint8_t D5 = 64; const uint8_t D6 = 74; const uint8_t D7 = 84; const uint8_t D8 = 94; const uint8_t E1 = 25; const uint8_t E2 = 35; const uint8_t E3 = 45; const uint8_t E4 = 55; const uint8_t E5 = 65; const uint8_t E6 = 75; const uint8_t E7 = 85; const uint8_t E8 = 95; const uint8_t F1 = 26; const uint8_t F2 = 36; const uint8_t F3 = 46; const uint8_t F4 = 56; const uint8_t F5 = 66; const uint8_t F6 = 76; const uint8_t F7 = 86; const uint8_t F8 = 96; const uint8_t G1 = 27; const uint8_t G2 = 37; const uint8_t G3 = 47; const uint8_t G4 = 57; const uint8_t G5 = 67; const uint8_t G6 = 77; const uint8_t G7 = 87; const uint8_t G8 = 97; const uint8_t H1 = 28; const uint8_t H2 = 38; const uint8_t H3 = 48; const uint8_t H4 = 58; const uint8_t H5 = 68; const uint8_t H6 = 78; const uint8_t H7 = 88; const uint8_t H8 = 98; const uint8_t WHITE_KING = 0x06; const uint8_t WHITE_QUEEN = 0x05; const uint8_t WHITE_ROOK = 0x04; const uint8_t WHITE_BISHOP = 0x03; const uint8_t WHITE_KNIGHT = 0x02; const uint8_t WHITE_PAWN = 0x01; const uint8_t WHITE_ANY_PIECE = 0x07; const uint8_t BLACK_KING = 0x86; const uint8_t BLACK_QUEEN = 0x85; const uint8_t BLACK_ROOK = 0x84; const uint8_t BLACK_BISHOP = 0x83; const uint8_t BLACK_KNIGHT = 0x82; const uint8_t BLACK_PAWN = 0x81; const uint8_t BLACK_ANY_PIECE = 0x87; const QRegularExpression FEN_CASTLES_REGEX = QRegularExpression("^-|[KQABCDEFGH]{0,2}[kqabcdefgh]{0,2}$"); const QRegularExpression SAN_REGEX = QRegularExpression("^([NBKRQ])?([a-h])?([1-8])?x?([a-h][1-8])(=?[nbrqNBRQ])?(\\+|#)?$"); class Board { public: /** * @brief turn is either == WHITE or == BLACK */ bool turn; /** * @brief halfmove_clock number of halfmoves from beginning. * automatically updated after applying a move */ int halfmove_clock; /** * @brief fullmove_number */ int fullmove_number; /** * @brief last_was_null set to true, if last the last move leading to * this board position was a null move */ bool last_was_null; /** * @brief Board creates empty board, no castling rights */ Board(); /** * @brief Board creates board w/ initial position, castling rights set if called with true * creates empty board board, no castling rights if called with false * @param initial_position triggers wether initial position or empty should be created */ Board(bool initial_position); /** * @brief Board * @param fen_string creates board from FEN string */ Board(const QString &fen_string); /** * @brief Board creates new Board copying position of the pieces of the supplied * board. Parameters (i.e. undo history, move numbers etc. are _not_ * copied, just the position of the pieces * @param board The board where the position of pieces is taken from */ //Board(Board *board); /** * @brief copy constructor to create deep copy of board * TODO: do we really need this?! default might suffice after refactoring * @param other */ Board(const Board &other); /** * @brief fen returns FEN string of current board * @return */ QString fen(); /** * @brief copy_and_apply applies move and returns a deep copy of current board * no check of legality. always call board.is_legal(m) before applying move * @param m move to apply * @return copy of board */ //Board* copy_and_apply(const Move &m); /** * @brief apply applies supplied move. doesn't check for legality * no check of legality. always call board.is_legal(m) before applying move * @param m move to apply */ void apply(const Move &m); /** * @brief undo undoes the very last move. undoing can only be done once for the very * last move that was applied before, i.e. apply undo apply undo is ok, * but apply apply undo undo is not. throws logic error if called * in wrong fashion. check with is_undo_available() when in doubt */ void undo(); /** * @brief pseudo_legal_moves returns move list with all pseudo-legal moves of * current position * @return */ QVector pseudo_legal_moves(); QVector pseudo_legal_moves(uint8_t to_square, uint8_t piece_type); /** * @brief pseudo_legal_moves_from returns move list with pseudo legal moves * from supplied square index * @param from_square_idx square from which move originates * must be in internal board representation, i.e. * in range 21 ... 98 * @param with_castles include castling in returned list * @param turn_color either WHITE or BLACK, i.e. the player to move * @return pseudo legal move list */ QVector pseudo_legal_moves_from(int from_square_idx, bool with_castles, bool turn_color); QVector pseudo_legal_moves_from_pt(int from_square, uint8_t to_square, uint8_t piece_type, bool with_castles, bool turn); /** * @brief legal_moves returns move list of all legal moves in position * @return move list */ QVector legal_moves(); QVector legal_moves(uint8_t to_square, uint8_t piece_type); /** * @brief legal_moves_from computes all legal moves originating in from square * @param from_square move originates from this square. must be in range 21...98 * @return move list of legal moves */ QVector legal_moves_from(int from_square); /** * @brief pseudo_is_legal_move checks whether supplied pseudo legal move is legal * in current position. Does NOT check whether supplied move is pseudo legal!!! * @return result of checking legality */ bool pseudo_is_legal_move(const Move &); /** * @brief is_legal_move checks whether the supplied move is legal in the board * position. Always call before applying a move on a board! * @return true, if the move is legal, otherwise false */ bool is_legal_move(const Move&); /** * @brief is_legal_and_promotes checks whether supplied move is legal and is * a pawn move promoting to another piece * @return true only if both move is legal and pawn move and promotes. false, otherwise. */ bool is_legal_and_promotes(const Move&); /** * @brief is_check checks if the player whose on the move in the current position * is in check * @return true, if player in check, false otherwise. */ bool is_check(); /** * @brief is_checkmate tests whether player who is on the move in current position * is in checkmate (i.e. is in check but has not legal move * escaping the check) * @return true, if player in checkmate, false otherwise. */ bool is_checkmate(); /** * @brief is_stalemate tests whether player who is on the move in current position * is in stalemate (i.e. is not in check but all legal moves * would result in check) * @return true, if position is stalemate, false otherwise. */ bool is_stalemate(); /** * @brief san computes the standard algebraic notation for the supplied move * given the current position. the supplied move MUST be legal on this * board * @param m Move to get the san for * @return string containing san representation of move (no move number!) */ QString san(const Move &m); /** * @brief parse_san Given board position and san string, parses the san string * and computes a move for it. Throws std::invalid_argument if the * supplied san string cannot be parsed successfully (i.e. illegal move, * illegal formatted string etc.) * @param s string containing a san representation of a move (no move number!) * @return move object (if parsed successfully) */ Move parse_san(QString s); /** * @brief movePromotes checks if the supplied move (ignoring the promotion value stored * in the move is a pawn move to the 8th / 1st rank, i.e. promoting) * @param m move of concern * @return true if move promotes, false otherwise */ bool movePromotes(const Move&m); /** * @brief is_initial_position checks whether the current placement of the pieces * corresponds to the inital chess position. * @return true if initial position, false otherwise. */ bool is_initial_position(); /** * @brief can_castle_wking checks whether the castling rights for the * position are such that the White king is allowed * to castle kingside in this position. * @return true if king may castle, false otherwise. */ bool can_castle_wking(); /** * @brief can_castle_bking see can_castle_wking * @return */ bool can_castle_bking(); /** * @brief can_castle_wqueen see can_castle_wking * @return */ bool can_castle_wqueen(); /** * @brief can_castle_bqueen see can_castle_wking * @return */ bool can_castle_bqueen(); /** * @brief is_undo_available checks whether the current board position * has enough information to apply the undo() * operation, i.e. take back the last move * and return to the previous board state. * @return true if info is available (i.e. undo() may be called), false otherwise */ bool is_undo_available(); /** * @brief set_castle_wking set/unset the right of the white king to castle * kingside. * @param can_do true to allow white to castle, false otherwise. */ void set_castle_wking(bool can_do); /** * @brief set_castle_bking see set_castle_wking * @param can_do */ void set_castle_bking(bool can_do); /** * @brief set_castle_wqueen see set_castle_wking * @param can_do */ void set_castle_wqueen(bool can_do); /** * @brief set_castle_bqueen see set_castle_wking * @param can_do */ void set_castle_bqueen(bool can_do); /** * @brief set_piece_at sets a piece a the supplied board position (x,y) * @param x int in the range (0,7) representing the column (i.e. a - h) * @param y int in the range (0,7) representing the row (i.e. 0 - 7) * @param piece the piece type (constants such as WHITE_KING, BLACK_QUEEN, EMPTY etc.) */ void set_piece_at(int x, int y, uint8_t piece); /** * @brief get_piece_at gets piece a the supplied board position (x,y) * @param x int in the range (0,7) representing the column (i.e. a - h) * @param y int in the range (0,7) representing the row (i.e. 0 - 7) * @return piece type encoded as uint8_t (i.e. BLACK_QUEEN or EMPTY) */ uint8_t get_piece_at(int x, int y); /** * @brief get_piece_type_at get the piece type as uint8_t at supplied * position. piece type is always the piece * encoded as if it were are white piece (see * KING, QUEEN, or empty). * @param x int in the range (0,7) representing the column (i.e. a - h) * @param y int in the range (0,7) representing the column (i.e. a - h) * @return piece encoding */ uint8_t get_piece_type_at(int x, int y); /** * @brief get_piece_color_at returns color (i.e. WHITE or BLACK) * at supplied position. Don't call if there is * is no piece at the position! (check with * piece_type first) * @param x column * @param y row * @return piece color */ bool get_piece_color_at(int x, int y); /** * @brief piece_color same as get_piece_color_at but uses here * the internal position encoding to specify the * field of the board. see this header file * @param idx internal board encoding specifying field position * @return piece color */ bool piece_color(uint8_t idx); /** * @brief piece_at returns the piece at idx in internal board format * i.e. WHITE_PAWN = 0x01, BLACK_PAWN etc. * @param idx internal board encoding specifying field position * @return piece in internal format (i.e. 0x00 ... 0x06 and 0x81 ... 0x86 */ uint8_t piece_at(uint8_t idx); /** * @brief piece_type see piece_color and get_piece_type_at() * @param idx * @return */ uint8_t piece_type(uint8_t idx); /** * @brief is_consistent rudimentary check of position consistency * @return true if the conditions below are true, false otherwise * * NOTE: this doesn't capture _all_ invalid positions, but * the most common reasons * there exists one white and one black king [ok] * kings are >= 1 field apart [ok] * side not to move is not in check [ok] * side to move has less than three attackers who give check * if side to move is in check w/ two attackers: * following must not hold: * pawn+(pawn, bishop, knight), bishop+bishop, knight+knight * each side has less than 8 pawns [ok] * no pawns in first or last row [ok] * extra pieces = Math.max(0, num_queens-1) + Math.max(0, num_rooks-2)... * and extra_pieces <= (8-num_pawns)) * no more than 5 pawns in a or h line * checks consistency of castling rights. if set, then verify w/ * is_black_castle_right_lost() and is_white_castle_lost() */ bool is_consistent(); /** * @brief is_black_king_castle_right_lost does not return castling * rights of current position (for that call can_castle_bking() etc. ) * instead checks whether black king and rook are in initial position * or have moved * @return false, if black king or rook have moved from inital pos, true otherwise. */ bool is_black_king_castle_right_lost(); /** * @brief is_black_queen_castle_right_lost see is_black_king_castle_right_lost() * @return */ bool is_black_queen_castle_right_lost(); /** * @brief is_white_king_castle_right_lost see is_black_king_castle_right_lost() * @return */ bool is_white_king_castle_right_lost(); /** * @brief is_white_queen_castle_right_lost see is_black_king_castle_right_lost() * @return */ bool is_white_queen_castle_right_lost(); uint8_t get_ep_target(); bool can_claim_fifty_moves(); bool is_threefold_repetition(); quint64 zobrist(); private: /** * @brief init_pos * is the inital board position * for encodings and the general approach * see "First Steps in Computer Chess Programming" * BYTE Magazine, October 1978 */ static const uint8_t init_pos [120]; /** * @brief board stores the current position * essentially linearized 10x12 array */ uint8_t board[120]; /** * @brief old_board stores the previous position for undo() */ uint8_t old_board[120]; /** * @brief turn is either WHITE or BLACK */ bool undo_available; /** * @brief castling_rights stores the castling rights * by using bit positions within byte. Bit positions are * CASTLE_WKING_POS, CASTLE_WQUEEN_POS, CASTLE_BKING_POS * and CASTLE_BQUEEN_POS */ uint8_t castling_rights; uint8_t prev_castling_rights; uint8_t en_passent_target; uint8_t prev_en_passent_target; int prev_halfmove_clock; bool is_empty(uint8_t idx); bool is_offside(uint8_t idx); bool is_white_at(uint8_t idx); bool is_attacked(int idx, bool attacker_color); bool castles_wking(const Move &m); bool castles_bking(const Move &m); bool castles_wqueen(const Move &m); bool castles_bqueen(const Move &m); uint8_t piece_from_symbol(QChar c); QChar piece_to_symbol(uint8_t idx); QString idx_to_str(int idx); uint8_t alpha_to_pos(QChar alpha); QMap transpositionTable; int zobrist_piece_type(uint8_t piece); void update_transposition_table(); friend std::ostream& operator<<(std::ostream& strm, const Board &b); }; } #endif // BOARD_H jerry-3.2.0/src/chess/game_node.h0000664000175000017500000001516313514421177015365 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef GAME_NODE_H #define GAME_NODE_H #include "board.h" #include "move.h" #include #include #include "arrow.h" #include "colored_field.h" #include namespace chess { class GameNode { public: GameNode(); /** * @brief The destructor does NOT delete child nodes. You * are responsible yourself for deleting child nodes. * In general, member functions from Game() to manage * the tree should be used. */ ~GameNode(); /** * @brief getId each game node is assigned a unique id * automatically during construction. * @return the unique id of this node */ int getId(); /** * @brief getBoard * @return Board of current node */ Board getBoard(); /** * @brief setBoard deletes the old board of this node, and sets * the supplied board as the new one. Does no * validity checks of the board position * @param b The board. Must not be null. */ void setBoard(Board &b); /** * @brief getSan returns san string of move that * lead to this node. * @return san string or null for move node. */ QString getSan(); /** * @brief root returns root node of the game * @return the root node */ GameNode* root(); /** * @brief getParent returns the parent of the node. null * if there is no parent (e.g. root node or * freshly created) * @return parent node or null */ GameNode* getParent(); /** * @brief getMove returns move leading to this node. Null * if there is no move (e.g. root node) * @return pointer to Move or null. */ Move getMove(); /** * @brief setMove set the move that leads to this * game node to m. There is no validity * or consistency check. * @param m Pointer to the move. */ void setMove(Move &m); /** * @brief setParent Set the parent to the supplied Game Node. * No validity / consistency checks. Old parent * is not deleted. * @param g Pointer to the (new) parent node. */ void setParent(GameNode *g); /** * @brief setComment Set comment for this node to supplied textstring. * @param c The comment. */ void setComment(QString &c); /** * @brief getComment returns the comment for this node. Empty text string * if there is no comment. * @return The comment. */ QString getComment(); /** * @brief getVariation get the variation (i.e. the child) at index i * @param i index position of variation. MUST be a legal index. * @return the game node at position i */ GameNode* getVariation(int i); void deleteVariation(int i); /** * @brief getVariations returns list of all child nodes, i.e. * all variations starting in this position. * @return list with all child nodes. */ QVector getVariations(); /** * @brief addVariation adds a new variation by putting the supplied * game node at the end of the list of all variations. * sets parent of g to this node. Does NOT check whether * the variation already exists. * @param g the (new) child node. */ void addVariation(GameNode *g); /** * @brief hasVariations checks whether the node as variations, i.e. more * than one (mainline) variations * @return true if there are at least two (mainline + x) childs, false otherwise. */ bool hasVariations(); /** * @brief isLeaf checks whether node is leaf. * @return true if node has no children, false otherwise. */ bool isLeaf(); /** * @brief addNag add numeric annotation glyph (see PGN standard) * @param n NAG code */ void addNag(int n); /** * @brief getNags returns all numeric annotation glyphs (see PGN standard) * @return list with all NAGs */ QVector getNags(); /** * @brief getArrows returns a list with all arrows for this node. * Arrows are just annotations done by the user for illustrations. * @return list of arrows */ QVector getArrows(); /** * @brief getColoredFields returns list of colored fields. Such fields * are juts highlighted fields done by the user for illustration. * @return list of color fields */ QVector getColoredFields(); /** * @brief addOrDelArrow adds (if the supplied arrow does not exist) or removes * (if the node has that arrow already) and arrow from the board * @param a the arrow that is supposed to be deleted or added */ void addOrDelArrow(Arrow &a); /** * @brief addOrDelColoredField deletes color (field is already highlighted) or * colorizes (field is plain) a board field. * @param c the colored field that is supposed to be deleted or added */ void addOrDelColoredField(ColoredField &c); int getDepth(); bool userWasInformedAboutResult; void removeNagsInRange(int min, int max); void appendNag(int nag); void sortNags(); protected: static int initId() { return id++; } private: static int id; int nodeId; int depthCache; Move m; Board board; QVector nags; QString comment; QString san_cache; QVector arrows; QVector coloredFields; GameNode* parent; QVector variations; QString getSan(Move &m); friend class Game; }; } #endif // GAME_NODE_H jerry-3.2.0/src/chess/pgn_database.h0000664000175000017500000000232413514421177016052 0ustar useruser#ifndef PGNDATABASE_H #define PGNDATABASE_H #include "chess/database.h" #include "model/search_pattern.h" #include namespace chess { class PgnDatabase : public Database { public: PgnDatabase(); ~PgnDatabase(); void setParentWidget(QWidget *parentWidget); void open(QString &filename); void close(); int createNew(QString &filename); int appendCurrentGame(chess::Game &game); int getRowCount(); Game* getGameAt(int idx); PgnHeader getRowInfo(int idx); int countGames(); bool isOpen(); void search(SearchPattern &pattern); void resetSearch(); void setLastSelectedIndex(int idx); int getLastSelectedIndex(); private: QVector allOffsets; QVector searchedOffsets; QWidget *parentWidget; PgnReader reader; QString filename; QHash headerCache; QVector scanPgn(QString &filename, bool isLatin1); int cacheSize; bool isUtf8; bool currentlyOpen; int lastSelectedIndex; bool pgnHeaderMatches(QFile &file, SearchPattern &pattern, qint64 offset); bool pgnHeaderMatches1(QTextStream &openStream, SearchPattern &pattern, qint64 offset); }; } #endif // PGNDATABASE_H jerry-3.2.0/src/chess/pgn_database.cpp0000664000175000017500000004140213514421177016405 0ustar useruser#include "pgn_reader.h" #include "pgn_database.h" #include #include #include #include #include "chess/pgn_printer.h" #include chess::PgnDatabase::PgnDatabase() { this->parentWidget = nullptr; this->filename = ""; //this->cacheSize = 50; this->isUtf8 = true; this->currentlyOpen = false; this->lastSelectedIndex = 0; } chess::PgnDatabase::~PgnDatabase() { } bool chess::PgnDatabase::isOpen() { return this->currentlyOpen; } int chess::PgnDatabase::createNew(QString &filename) { QFile file(filename); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { return -1; } else { QTextStream out(&file); out << "\n"; file.close(); this->filename = filename; this->allOffsets.clear(); this->searchedOffsets.clear(); this->currentlyOpen = true; return 0; } } void chess::PgnDatabase::setLastSelectedIndex(int idx) { if(idx > 0 && idx < this->searchedOffsets.size()) { this->lastSelectedIndex = idx; } } int chess::PgnDatabase::getLastSelectedIndex() { return this->lastSelectedIndex; } int chess::PgnDatabase::appendCurrentGame(chess::Game &game) { QFile file(this->filename); if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) { return -1; } else { QTextStream out(&file); out << "\n"; qint64 gamePos = out.pos(); chess::PgnPrinter printer; QStringList pgn = printer.printGame(game); for (int i = 0; i < pgn.size(); ++i) { out << pgn.at(i) << '\n'; } file.close(); this->allOffsets.append(gamePos); this->searchedOffsets.clear(); this->searchedOffsets = this->allOffsets; this->lastSelectedIndex = this->countGames() - 1; return 0; } } void chess::PgnDatabase::setParentWidget(QWidget *parentWidget) { this->parentWidget = parentWidget; } QVector chess::PgnDatabase::scanPgn(QString &filename, bool isLatin1) { QVector offsets; QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return offsets; bool inComment = false; qint64 game_pos = -1; QByteArray byteLine; QString line(""); qint64 last_pos = file.pos(); int size = file.size(); QProgressDialog progress(this->parentWidget->tr("scanning PGN file..."), this->parentWidget->tr("Cancel"), 0, size, this->parentWidget); progress.setMinimumDuration(400); progress.setWindowModality(Qt::WindowModal); //progress.setCancelButton(0); //progress.show(); quint64 stepCounter = 0; int i= 0; while(!file.atEnd()) { if(progress.wasCanceled()) { break; } if(stepCounter %50 == 0) { progress.setValue(last_pos); stepCounter = 0; } stepCounter += 1; i++; byteLine = file.readLine(); if(isLatin1) { line = QString::fromLatin1(byteLine); } else { line = QString::fromUtf8(byteLine); } // skip comments if(line.startsWith("%")) { byteLine = file.readLine(); continue; } if(!inComment && line.startsWith("[")) { //QRegularExpressionMatch match_t = TAG_REGEX.match(line); //if(match_t.hasMatch()) { if(game_pos == -1) { game_pos = last_pos; } last_pos = file.pos(); byteLine = file.readLine(); continue; //} } if((!inComment && line.contains("{")) || (inComment && line.contains("}"))) { inComment = line.lastIndexOf("{") > line.lastIndexOf("}"); } if(game_pos != -1) { offsets.append(game_pos); game_pos = -1; } last_pos = file.pos(); byteLine = file.readLine(); } // for the last game if(game_pos != -1) { offsets.append(game_pos); game_pos = -1; } return offsets; } void chess::PgnDatabase::open(QString &filename) { this->isUtf8 = reader.detectUtf8(filename); /* const char* utf8 = "UTF-8"; const char* encoding = reader.detect_encoding(filename); int cmp = strcmp(encoding, utf8); if(cmp != 0){ isLatin1 = true; }*/ this->allOffsets = this->scanPgn(filename, this->isUtf8); this->searchedOffsets = this->allOffsets; this->filename = filename; this->currentlyOpen = true; this->lastSelectedIndex = -1; } void chess::PgnDatabase::close() { this->allOffsets.clear(); this->searchedOffsets.clear(); this->filename = ""; this->currentlyOpen = false; this->lastSelectedIndex = -1; } int chess::PgnDatabase::getRowCount() { return this->searchedOffsets.size(); } chess::Game* chess::PgnDatabase::getGameAt(int idx) { const char* encoding = reader.detect_encoding(filename); chess::Game *g = this->reader.readGameFromFile(this->filename, encoding, this->searchedOffsets.at(idx)); this->lastSelectedIndex = idx; return g; } bool chess::PgnDatabase::pgnHeaderMatches(QFile &file, SearchPattern &pattern, qint64 offset) { bool foundHeader = false; bool continueSearch = true; QByteArray byteLine; QString line; file.seek(offset); QString pattern_year_min = QString::number(pattern.year_min); QString pattern_year_max = QString::number(pattern.year_max); QString elo_min = QString::number(pattern.elo_min); QString elo_max = QString::number(pattern.elo_max); int whiteElo = -1; int blackElo = -1; QString whiteName = ""; QString blackName = ""; while(!file.atEnd() && continueSearch) { byteLine = file.readLine(); line = QString::fromUtf8(byteLine); if(line.startsWith("%") || line.isEmpty()) { byteLine = file.readLine(); continue; } QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { foundHeader = true; QString tag = match_t.captured(1); QString value = match_t.captured(2); if(!pattern.event.isEmpty() && tag == "Event") { if(!value.contains(pattern.event, Qt::CaseInsensitive)) { return false; } } if(!pattern.site.isEmpty() && tag == "Site") { if(!value.contains(pattern.site, Qt::CaseInsensitive)) { return false; } } if(pattern.checkYear && tag == "Date") { QString year_i = value.left(4); if(year_i < pattern_year_min) { return false; } if(year_i > pattern_year_max) { return false; } } if(pattern.checkEco && tag == "ECO") { if(value < pattern.ecoStart || value > pattern.ecoStop) { return false; } } if(tag == "WhiteElo") { whiteElo = value.toInt(); } if(tag == "blackElo") { blackElo = value.toInt(); } if(tag == "White") { whiteName = value; } if(tag == "Black") { blackName = value; } if(pattern.result != RES_ANY) { if(pattern.result == RES_BLACK_WINS && !value.contains("0-1")) { return false; } else if(pattern.result == RES_DRAW && !value.contains("1/2-1/2")) { return false; } else if(pattern.result == RES_UNDEF && !value.contains("*")) { return false; } else if(pattern.result == RES_WHITE_WINS && !value.contains("1-0")) { return false; } } } else { if(foundHeader) { if(pattern.ignoreNameColor) { if(!pattern.whiteName.isEmpty()) { // must match either black or white if(!whiteName.contains(pattern.whiteName, Qt::CaseInsensitive) && !blackName.contains(pattern.whiteName, Qt::CaseInsensitive)) { return false; } } if(!pattern.blackName.isEmpty()) { // must match either black or white if(!whiteName.contains(pattern.blackName, Qt::CaseInsensitive) && !blackName.contains(pattern.blackName, Qt::CaseInsensitive)) { return false; } } } else { // if whiteName is not empty, then it must match if(!pattern.whiteName.isEmpty() && !whiteName.contains(pattern.whiteName, Qt::CaseInsensitive)) { return false; } if(!pattern.blackName.isEmpty() && !blackName.contains(pattern.blackName, Qt::CaseInsensitive)) { return false; } } if(pattern.checkElo != SEARCH_IGNORE_ELO) { // only if we could find elo information for both players if(whiteElo > 0 && blackElo > 0) { if(pattern.checkElo == SEARCH_AVERAGE_ELO) { int avg = (whiteElo + blackElo) / 2; if(pattern.elo_min > avg || pattern.elo_max < avg) { return false; } } else if(pattern.checkElo == SEARCH_ONE_ELO) { if((pattern.elo_min > whiteElo || pattern.elo_max < whiteElo) && (pattern.elo_min > blackElo || pattern.elo_max < blackElo)) { return false; } } else if(pattern.checkElo == SEARCH_BOTH_ELO) { if(pattern.elo_min > whiteElo || pattern.elo_max < whiteElo || pattern.elo_min > blackElo || pattern.elo_max < blackElo) { return false; } } } } return true; } } } return false; } bool chess::PgnDatabase::pgnHeaderMatches1(QTextStream &openStream, SearchPattern &pattern, qint64 offset) { bool foundHeader = false; bool continueSearch = true; openStream.seek(offset); QString line = openStream.readLine(); while(!openStream.atEnd() && continueSearch) { line = openStream.readLine(); if(line.startsWith("%") || line.isEmpty()) { line = openStream.readLine(); continue; } QRegularExpressionMatch match_t = TAG_REGEX.match(line); if(match_t.hasMatch()) { foundHeader = true; QString tag = match_t.captured(1); QString value = match_t.captured(2); /* if(tag == "Event") { if(!value.contains(pattern.event, Qt::CaseInsensitive)) { return false; } } if(tag == "Site") { if(!value.contains(pattern.site, Qt::CaseInsensitive)) { return false; } }*/ if(tag == "Date") { // todo: compare date } if(tag == "Round") { // todo } if(tag == "White") { if(!value.contains(pattern.whiteName, Qt::CaseInsensitive)) { return false; } else { return true; } } /* if(tag == "Black") { if(!value.contains(pattern.blackName, Qt::CaseInsensitive)) { return false; } }*/ if(tag == "Result") { // todo } if(tag == "ECO") { // todo } } else { if(foundHeader) { return true; //continueSearch = false; //break; } } } return false; } void chess::PgnDatabase::search(SearchPattern &pattern) { QFile file(filename); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { throw std::invalid_argument("unable to open file w/ supplied filename"); } this->searchedOffsets.clear(); QProgressDialog progress(this->parentWidget->tr("searching..."), this->parentWidget->tr("Cancel"), 0, this->countGames(), this->parentWidget); progress.setMinimumDuration(400); progress.setWindowModality(Qt::WindowModal); //progress.setCancelButton(0); //progress.show(); quint64 stepCounter = 0; //qDebug() << pattern.whiteName; for(int i=0;iallOffsets.size();i++) { if(progress.wasCanceled()) { break; } if(stepCounter %50 == 0) { progress.setValue(i); stepCounter = 0; } stepCounter += 1; qint64 offset_i = this->allOffsets.at(i); if(this->pgnHeaderMatches(file, pattern, offset_i)) { this->searchedOffsets.append(offset_i); } } file.close(); } /* void chess::PgnDatabase::search(SearchPattern &pattern) { QFile file(filename); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { throw std::invalid_argument("unable to open file w/ supplied filename"); } QTextStream in(&file); QTextCodec *codec; if(isUtf8) { codec = QTextCodec::codecForName("UTF-8"); } else { codec = QTextCodec::codecForName("ISO 8859-1"); } in.setCodec(codec); this->searchedOffsets.clear(); QProgressDialog progress(this->parentWidget->tr("searching..."), this->parentWidget->tr("Cancel"), 0, this->countGames(), this->parentWidget); progress.setMinimumDuration(400); progress.setWindowModality(Qt::WindowModal); progress.setCancelButton(0); progress.show(); quint64 stepCounter = 0; qDebug() << pattern.whiteName; for(int i=0;iallOffsets.size();i++) { if(stepCounter %50 == 0) { progress.setValue(i); stepCounter = 0; } stepCounter += 1; qint64 offset_i = this->allOffsets.at(i); if(this->pgnHeaderMatches(in, pattern, offset_i)) { this->searchedOffsets.append(offset_i); } } file.close(); }*/ /* chess::PgnHeader chess::PgnDatabase::getRowInfo(int idx) { if(this->headerCache.contains(idx)) { qDebug() << "in cache"; chess::PgnHeader header = headerCache.value(idx); return header; } else { int start = std::max(idx - 10, 0); int stop = std::min(this->offsets.size(), idx + 30); QVector cacheOffsets; for(int i=start; i<=stop;i++) { qint64 oi = this->offsets.at(i); cacheOffsets.append(oi); } const char* utf8 = "UTF-8"; chess::PgnHeader h; if(idx >= this->offsets.size()) { return h; } else { QVector cacheHeaderOffsets = this->reader.readMultipleHeadersFromPgnAround(this->filename, cacheOffsets, utf8); for(int i=0;iheaderCache.insert(ii, ci); if(ii == this->offsets.at(idx)) { h = cacheHeaderOffsets.at(i).header; } } return h; //qint64 offset = this->offsets.at(idx); //chess::PgnHeader h_idx = this->reader.readSingleHeaderFromPgnAt(this->filename, offset, utf8); //return h_idx; } } } */ chess::PgnHeader chess::PgnDatabase::getRowInfo(int idx) { chess::PgnHeader h; if(idx >= this->searchedOffsets.size()) { return h; } else { qint64 offset = this->searchedOffsets.at(idx); chess::PgnHeader h_idx = this->reader.readSingleHeaderFromPgnAt(this->filename, offset, this->isUtf8); return h_idx; } } void chess::PgnDatabase::resetSearch() { this->searchedOffsets.clear(); this->searchedOffsets = this->allOffsets; this->lastSelectedIndex = -1; } int chess::PgnDatabase::countGames() { //qDebug() << "pgn database: count games"; return this->allOffsets.size(); } jerry-3.2.0/src/chess/polyglot.cpp0000664000175000017500000001077113514421177015653 0ustar useruser#include "polyglot.h" #include #include #include #include namespace chess { char promote_pieces[6] = " nbrq"; Polyglot::Polyglot(QString &bookname) { this->readFile = false; QFile file(bookname); quint64 size = file.size(); if(size <= 15728640) { if(file.open(QIODevice::ReadOnly)) { this->book = QByteArray(file.readAll()); /* QByteArray foo = file.read(16ULL); QDataStream foobar(foo); quint64 key; foobar >> key; qDebug() << "bar: " << foo.toHex(); std::cout << "foobar key " << std::hex << key << std::endl; const Entry *entry = (const Entry*)foo.constData(); std::cout << std::hex << entry->key << std::endl; */ file.close(); this->readFile = true; } else { std::cerr << "couldn't open polyglot book: " << bookname.toStdString() << std::endl; } } else { std::cerr << "couldn't open polyglot book: files > 15 MB are not supported" << std::endl; } } Entry Polyglot::entryFromOffset(int offset) { if(offset > this->book.size()-16 || !this->readFile) { throw std::invalid_argument("called entryFromOffset with invalid offset"); } Entry e = {0,0,0,0}; QByteArray ba = this->book.mid(offset, 16); QDataStream da(ba); da >> e.key; da >> e.move; da >> e.weight; da >> e.learn; return e; } Move Polyglot::moveFromEntry(Entry e) { quint64 move = e.move; // literally taken from pgn_show.c // licensed under GPL2 - really // pure C code, so somehow little // bit odd here: todo: rewrite in nicer C++ char move_s[6]; int len = 4; int f,fr,ff,t,tr,tf,p; f=(move>>6)&077; fr=(f>>3)&0x7; ff=f&0x7; t=move&077; tr=(t>>3)&0x7; tf=t&0x7; p=(move>>12)&0x7; move_s[0]=ff+'a'; move_s[1]=fr+'1'; move_s[2]=tf+'a'; move_s[3]=tr+'1'; if(p){ move_s[4]=promote_pieces[p]; move_s[5]='\0'; len = 5; }else{ move_s[4]='\0'; } if(!strcmp(move_s,"e1h1")){ strcpy(move_s,"e1g1"); }else if(!strcmp(move_s,"e1a1")){ strcpy(move_s,"e1c1"); }else if(!strcmp(move_s,"e8h8")){ strcpy(move_s,"e8g8"); }else if(!strcmp(move_s,"e8a8")){ strcpy(move_s,"e8c8"); } QString uci = QString::fromLatin1(move_s, len); Move m = Move(uci); return m; } QVector Polyglot::findMoves(Board &board) { QVector bookMoves; if(this->readFile) { quint64 zh_board = board.zobrist(); quint64 low = 0; quint64 high = this->book.size() / 16; // find entry fast while(low < high) { quint64 middle = (low + high) / 2; Entry e = this->entryFromOffset(middle*16); quint64 middle_key = e.key; if(middle_key < zh_board) { low = middle + 1; } else { high = middle; } } quint64 offset = low; quint64 size = this->book.size() / 16; // now we have the lowest key pos // where a possible entry is. collect all while(offset < size) { Entry e = this->entryFromOffset(offset*16); if(e.key != zh_board) { break; } Move m = this->moveFromEntry(e); bookMoves.append(m); offset += 1; } } return bookMoves; } bool Polyglot::inBook(Board &board) { int cntBookMoves = 0; if(this->readFile) { quint64 zh_board = board.zobrist(); quint64 low = 0; quint64 high = this->book.size() / 16; // find entry fast while(low < high) { quint64 middle = (low + high) / 2; Entry e = this->entryFromOffset(middle*16); quint64 middle_key = e.key; if(middle_key < zh_board) { low = middle + 1; } else { high = middle; } } quint64 offset = low; quint64 size = this->book.size() / 16; // now we have the lowest key pos // where a possible entry is. collect all while(offset < size) { Entry e = this->entryFromOffset(offset*16); if(e.key != zh_board) { break; } cntBookMoves++; offset += 1; } } if(cntBookMoves > 0) { return true; } else { return false; } } } jerry-3.2.0/src/chess/ecocode.cpp0000664000175000017500000027101613514421177015404 0ustar useruser#include "ecocode.h" #include #include #include #include #include namespace chess { /* * the key of the qmap below is the * zobrist hash of the position reache after * playing moves according to the ECO classification * The zobrist hash is calculated here with * POLYGLOT RANDOM ARRAY values * The data structure below is autogenerated * using the geneco utility available @ * https://github.com/asdfjkl * geneco converts a source list of eco codes (a text * file taken from the arasan chess engine (licensed under MIT, here * re-licensed under GPL2 and converts it to the data structure below) */ static const QMap ECOINFOS { {Q_UINT64_C(0x8da7a73e5fdd72dc), {"A00", ""}}, {Q_UINT64_C(0xe89f55cd52014748), {"A00", ""}}, {Q_UINT64_C(0xeb16d4aa32ce7438), {"A00", "Van't Kruijs Opening"}}, {Q_UINT64_C(0xaec84ba6d432356e), {"A00", ""}}, {Q_UINT64_C(0x2df2e8f47b022952), {"A00", ""}}, {Q_UINT64_C(0x30e16e80c6e1f31a), {"A00", "Sargossa Opening"}}, {Q_UINT64_C(0xe57697cefee41181), {"A00", "Grob's Attack"}}, {Q_UINT64_C(0xeccee3b4b02790b8), {"A00", "Sokolsky Opening"}}, {Q_UINT64_C(0xbdac8ebad4737e45), {"A00", "Dunst Opening"}}, {Q_UINT64_C(0x41dd464bfbc3d352), {"A00", "Amar (Paris) Opening"}}, {Q_UINT64_C(0x6add2d59f64624a4), {"A00", "King's Fianchetto"}}, {Q_UINT64_C(0xca9df64ccc1c97f1), {"A01", "Nimzowitsch-Larsen Attack"}}, {Q_UINT64_C(0xbb2deb150f00c115), {"A02", "Bird's Opening"}}, {Q_UINT64_C(0x3e47c90193d48f33), {"A03", "Bird's Opening"}}, {Q_UINT64_C(0xc0614bf2a044a68b), {"A03", "Bird's Opening"}}, {Q_UINT64_C(0x297377a5293f3927), {"A03", "Bird's Opening"}}, {Q_UINT64_C(0x7ed3e7d37b3af638), {"A03", "Bird's Opening"}}, {Q_UINT64_C(0x2ade9a5d0f5d69ca), {"A03", "Bird's Opening"}}, {Q_UINT64_C(0xb7473ec9a1006415), {"A03", "Bird's Opening"}}, {Q_UINT64_C(0x7ed3e7d37b3af638), {"A03", "Bird's Opening"}}, {Q_UINT64_C(0xa4aab28596007f17), {"A03", "Bird's Opening"}}, {Q_UINT64_C(0x3155e35f9ce53923), {"A03", "Bird's Opening, From Gambit"}}, {Q_UINT64_C(0x9d5f7aee7e779da1), {"A04", "Reti Opening"}}, {Q_UINT64_C(0xcd37113f2b7f0d75), {"A04", "Lisitsin Gambit"}}, {Q_UINT64_C(0x468f9553d1ce19d6), {"A04", "Reti Opening"}}, {Q_UINT64_C(0xc6b14e1bd38ddc37), {"A05", "Reti Opening"}}, {Q_UINT64_C(0x183558fae2a3d387), {"A06", "Reti Opening"}}, {Q_UINT64_C(0xdc3255b209236e8d), {"A06", "Tennison Gambit"}}, {Q_UINT64_C(0x34d3e3bb02740bbf), {"A07", "Reti, King's Indian Attack"}}, {Q_UINT64_C(0x834216f668cadc10), {"A07", "Reti Opening"}}, {Q_UINT64_C(0xdacdf433e2639250), {"A07", "Reti, King's Indian Attack"}}, {Q_UINT64_C(0x48b719dc95a341eb), {"A07", "Reti Opening, Barcza System"}}, {Q_UINT64_C(0xe12d3bb897d3527), {"A07", "Reti, King's Indian Attack"}}, {Q_UINT64_C(0x2b899c7a5874afa1), {"A07", "Reti, King's Indian Attack"}}, {Q_UINT64_C(0x67521168b0ded8bb), {"A08", "Reti, King's Indian Attack"}}, {Q_UINT64_C(0x67fa97ec36020050), {"A08", "Reti, King's Indian Attack"}}, {Q_UINT64_C(0xbbfe0d9a302be646), {"A08", "Reti, King's Indian Attack"}}, {Q_UINT64_C(0xeefe3c72753e484), {"A08", "Reti, King's Indian Attack"}}, {Q_UINT64_C(0x3cf56e39c16d9b7d), {"A08", "Reti, King's Indian Attack"}}, {Q_UINT64_C(0x9416c7dea1ac7880), {"A09", "Reti Opening, Classical Variation"}}, {Q_UINT64_C(0xca18093c559e579b), {"A10", "English Opening"}}, {Q_UINT64_C(0x5862e4d3225e8420), {"A11", "English Opening"}}, {Q_UINT64_C(0x3ad7dbf263edfac6), {"A11", "English Opening"}}, {Q_UINT64_C(0x28872f441c3dd322), {"A11", "English Opening"}}, {Q_UINT64_C(0x1692bfca8492040f), {"A11", "English Opening"}}, {Q_UINT64_C(0x5b04bfa318c932d3), {"A11", "English Opening"}}, {Q_UINT64_C(0x7d4fb6e585097082), {"A11", "English Opening"}}, {Q_UINT64_C(0xd9cfb5277a0b180c), {"A11", "English Opening"}}, {Q_UINT64_C(0xc33ec22b4d34e148), {"A11", "English Opening"}}, {Q_UINT64_C(0x8aca4a650ce1c056), {"A12", "English Opening"}}, {Q_UINT64_C(0xbc6ffb0d4dbcc7c9), {"A13", "English Opening"}}, {Q_UINT64_C(0x20999926b94ea905), {"A13", "Reti Opening, Neo-Catalan"}}, {Q_UINT64_C(0x980423fceaa64a8d), {"A13", "English Opening"}}, {Q_UINT64_C(0x8cc85013200de61c), {"A13", "English Opening"}}, {Q_UINT64_C(0x4a2091fd0f16de84), {"A14", "English Opening"}}, {Q_UINT64_C(0x91f63dc9f864160d), {"A15", "English Opening"}}, {Q_UINT64_C(0x6a61256b3a8694d4), {"A16", "English Opening"}}, {Q_UINT64_C(0x1c16d75a22a40486), {"A17", "English Opening"}}, {Q_UINT64_C(0xe3352aa01b5ad99), {"A17", "English Opening"}}, {Q_UINT64_C(0x595bf119ec249a80), {"A17", "English Opening"}}, {Q_UINT64_C(0xb582cd00c63a7816), {"A17", "English Opening"}}, {Q_UINT64_C(0xb3c192b1c5c87844), {"A17", "English Opening"}}, {Q_UINT64_C(0x54bb18d66c532e3c), {"A17", "English Opening"}}, {Q_UINT64_C(0xd2bb20bccbc90e02), {"A17", "English Opening"}}, {Q_UINT64_C(0x49bca0fb1fe1c23a), {"A17", "English Opening"}}, {Q_UINT64_C(0xd811da12c924b98c), {"A18", "English, Flohr-Mikenas System"}}, {Q_UINT64_C(0x3e600bbc3663b2f1), {"A19", "English Opening"}}, {Q_UINT64_C(0x40600176c67bafad), {"A20", "English Opening"}}, {Q_UINT64_C(0xfefc57d8516ca42e), {"A20", "English Opening"}}, {Q_UINT64_C(0x8298adbfc6bbee7a), {"A20", "English Opening"}}, {Q_UINT64_C(0xbbf719d404992d74), {"A21", "English Opening"}}, {Q_UINT64_C(0x72b670d24f6ee556), {"A21", "English, Lukin Variation"}}, {Q_UINT64_C(0x824d8fb5d6e16419), {"A21", "English Opening"}}, {Q_UINT64_C(0x71a7f6cb8a8f22ea), {"A21", "English Opening"}}, {Q_UINT64_C(0xe0192d21a9636ce2), {"A22", "English Opening"}}, {Q_UINT64_C(0xccff966049b4b4da), {"A22", "English, Carls' Bremen System"}}, {Q_UINT64_C(0x5beff6602437cf8), {"A22", "English Bremen, Smyslov System"}}, {Q_UINT64_C(0x5e857b8f3e746761), {"A23", ""}}, {Q_UINT64_C(0x254bc53b323b2691), {"A24", ""}}, {Q_UINT64_C(0x101ac13615088877), {"A25", "English Opening"}}, {Q_UINT64_C(0x57b849026771e5a1), {"A25", "English Opening"}}, {Q_UINT64_C(0xea3720e18a4dabca), {"A25", "Engish Opening"}}, {Q_UINT64_C(0x472bdbd384c7efb3), {"A25", "English Opening"}}, {Q_UINT64_C(0x471a6253ae12236e), {"A26", "English Opening"}}, {Q_UINT64_C(0x831d6f1b45929e64), {"A26", "English Opening"}}, {Q_UINT64_C(0xa9f63869d6301827), {"A26", "English Opening"}}, {Q_UINT64_C(0x5838d6b87ecbffd2), {"A26", "English Opening"}}, {Q_UINT64_C(0xcb7e2dc07deee94a), {"A27", "English Opening"}}, {Q_UINT64_C(0x90901935d014a8dc), {"A28", "English, Four Knights"}}, {Q_UINT64_C(0x45e5409cad6ad43e), {"A28", "English, Four Knights"}}, {Q_UINT64_C(0xbc76a27430c370e4), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0x67ca235f5ac8c57), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0x34b3cd92e49484b4), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0x9a170e47a0043f60), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0x9596f46f1b807d75), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0xf0ae069c165c48e1), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0x9b1c43e2ad768db2), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0xd7feb1ede2354d7), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0x4db546c1574a647c), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0xc70d56287c9d651), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0xddb6c2130a8ac18c), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0x319ada0d8a492f4a), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0x4fefa139f6baf45a), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0xd13f4d3679a8c3d4), {"A29", "English, Four Knights"}}, {Q_UINT64_C(0x2c69d892aad95ce6), {"A30", "English, Symmetrical"}}, {Q_UINT64_C(0xeb6cf2c0719113ee), {"A30", "English, Hedgehog"}}, {Q_UINT64_C(0x668c1853ab510165), {"A30", "English, Hedgehog"}}, {Q_UINT64_C(0x9557b7122b60106), {"A30", "English, Hedgehog"}}, {Q_UINT64_C(0x4bdaf7e68895fe5f), {"A30", "English, Hedgehog"}}, {Q_UINT64_C(0x69d62f3b7e0c510f), {"A31", "English, Symmetrical"}}, {Q_UINT64_C(0xfab110b103580fe4), {"A31", "English, Symmetrical"}}, {Q_UINT64_C(0xef80db43405b3bda), {"A31", "English, Symmetrical"}}, {Q_UINT64_C(0x644ab25b61815fef), {"A31", "English, Symmetrical"}}, {Q_UINT64_C(0x272b3a620aeb3ab5), {"A32", "English, Symmetrical"}}, {Q_UINT64_C(0x18b7daad0a6d597c), {"A32", "English, Symmetrical"}}, {Q_UINT64_C(0x7751fa22d9981d6f), {"A33", "English, Symmetrical"}}, {Q_UINT64_C(0xd7fec030683bde3f), {"A34", "English, Symmetrical"}}, {Q_UINT64_C(0x43dadba72cd8b9f3), {"A34", "English, Symmetrical"}}, {Q_UINT64_C(0x9336b945c62e5c68), {"A34", "English, Rubinstein Variation"}}, {Q_UINT64_C(0xdd537a01a703680b), {"A34", "English, Rubinstein Variation"}}, {Q_UINT64_C(0x1426bae9e09a4b6f), {"A34", "English, Symmetrical"}}, {Q_UINT64_C(0x7aaca874ef87f5c0), {"A34", "English, Symmetrical"}}, {Q_UINT64_C(0xd18062eb38534d68), {"A34", "English, Symmetrical"}}, {Q_UINT64_C(0x7c1318d279aa7b3c), {"A35", "English, Symmetrical"}}, {Q_UINT64_C(0xdd27da778b57d204), {"A35", "English, Symmetrical"}}, {Q_UINT64_C(0xfc99c0d1bcb65b97), {"A35", "English, Symmetrical"}}, {Q_UINT64_C(0x27c3705280cb4361), {"A35", "English, Symmetrical"}}, {Q_UINT64_C(0x55155984c0b5cd89), {"A35", "English, Symmetrical"}}, {Q_UINT64_C(0x50f5a393997da304), {"A36", "English, Symmetrical"}}, {Q_UINT64_C(0xbc0dee035458229c), {"A36", "English, Symmetrical"}}, {Q_UINT64_C(0x676902f53cbe43a1), {"A37", "English, Symmetrical"}}, {Q_UINT64_C(0x5ed39494eec60acc), {"A37", "English, Symmetrical"}}, {Q_UINT64_C(0xed110abfaf5bbb97), {"A37", "English, Botvinnik System"}}, {Q_UINT64_C(0xad2bcd366821eb3a), {"A37", "English, Botvinnik System"}}, {Q_UINT64_C(0x7a0f5f0b39b3492e), {"A37", "English, Botvinnik System"}}, {Q_UINT64_C(0x3c87360091440237), {"A38", "English, Symmetrical"}}, {Q_UINT64_C(0x6436edc5989996d1), {"A38", "English, Symmetrical"}}, {Q_UINT64_C(0x74f7d28f52a7f2aa), {"A38", "English, Symmetrical"}}, {Q_UINT64_C(0x8d6f8f2929271d8e), {"A39", "English, Symmetrical"}}, {Q_UINT64_C(0xb5e5684145e2e666), {"A39", "English, Symmetrical"}}, {Q_UINT64_C(0x2b9496112ef27fa3), {"A39", "English, Symmetrical"}}, {Q_UINT64_C(0x9696169426829005), {"A39", "English, Symmetrical"}}, {Q_UINT64_C(0x93da085f902883d6), {"A39", "English, Symmetrical"}}, {Q_UINT64_C(0x830eb9b20758d1de), {"A40", "Queen Pawn"}}, {Q_UINT64_C(0x976b1f894bd29e8), {"A40", "Englund Gambit"}}, {Q_UINT64_C(0x2c60fdea125bdb4f), {"A40", "Owen's Defense"}}, {Q_UINT64_C(0xaf37786bb8bef472), {"A40", ""}}, {Q_UINT64_C(0x76b5e13adec0afdd), {"A40", ""}}, {Q_UINT64_C(0x33a979d902a48df2), {"A40", ""}}, {Q_UINT64_C(0xb01bbda1178222a9), {"A40", ""}}, {Q_UINT64_C(0xbab42fd3d52098b3), {"A41", ""}}, {Q_UINT64_C(0x6bdd3ec38e290a24), {"A41", "Modern Defense"}}, {Q_UINT64_C(0xa0f15a6a3eb4a890), {"A41", "Modern Defense"}}, {Q_UINT64_C(0x5e89b1ff3454baef), {"A41", "Modern Defense"}}, {Q_UINT64_C(0x500fcbf03f855586), {"A42", "Modern Defense"}}, {Q_UINT64_C(0xfdf9789311cc4ab6), {"A42", "Modern Defense"}}, {Q_UINT64_C(0x657f681cf81fdaa3), {"A43", "Old Benoni"}}, {Q_UINT64_C(0xf9a3ce6f8f020aa0), {"A43", "Indian Game: Pseudo-Benko"}}, {Q_UINT64_C(0x3965884b0d8f0a67), {"A43", "Old Benoni"}}, {Q_UINT64_C(0x9a3e66dbf801f641), {"A44", "Old Benoni"}}, {Q_UINT64_C(0xd8e08d47aaa29048), {"A45", ""}}, {Q_UINT64_C(0x7bad8c9142d77d55), {"A45", "Gibbins-Weidenhagen Gambit"}}, {Q_UINT64_C(0x1ebada711a284b80), {"A45", "Trompowsky Attack"}}, {Q_UINT64_C(0x38461b1c244f175), {"A46", "Queen Pawn"}}, {Q_UINT64_C(0xaea7750143068b44), {"A46", "Queen Pawn, London System"}}, {Q_UINT64_C(0xb3a9c4b66aecbaef), {"A46", "Torre Attack"}}, {Q_UINT64_C(0x68ed28a13cc746ee), {"A47", "Queen Pawn"}}, {Q_UINT64_C(0xea3032eab9cb633e), {"A48", "Queen Pawn"}}, {Q_UINT64_C(0x3164d46b20ab895d), {"A48", "Queen Pawn, London System"}}, {Q_UINT64_C(0x693d282128e26553), {"A48", "Queen Pawn, London System"}}, {Q_UINT64_C(0xf7140d073a31a327), {"A48", "Queen Pawn, London System"}}, {Q_UINT64_C(0x2c6a65dc0941b8f6), {"A48", "Torre Attack"}}, {Q_UINT64_C(0xc6d689ab591cbb06), {"A49", "Queen Pawn"}}, {Q_UINT64_C(0x54c31263e9ad3b4f), {"A50", ""}}, {Q_UINT64_C(0xdebb1a297a48c379), {"A51", "Budapest Defense"}}, {Q_UINT64_C(0x782ea9f4c034f9f3), {"A51", "Budapest, Fajarowicz Gambit"}}, {Q_UINT64_C(0xdf05be0d7f37e565), {"A52", "Budapest Defense"}}, {Q_UINT64_C(0x6d7984023bd57222), {"A53", "Old Indian Defense"}}, {Q_UINT64_C(0xc7f2781c023469f0), {"A54", "Old Indian Defense"}}, {Q_UINT64_C(0xf4110341e29c843c), {"A54", "Old Indian Defense"}}, {Q_UINT64_C(0xbe26a4a799fd4ea2), {"A54", "Old Indian Defense"}}, {Q_UINT64_C(0x30160e09091c3936), {"A55", "Old Indian Defense"}}, {Q_UINT64_C(0xb2b2c3cd16ea3032), {"A56", "Benoni"}}, {Q_UINT64_C(0x4df3cd0a16f41cd0), {"A56", "Czech Benoni"}}, {Q_UINT64_C(0x68beea8b14611b52), {"A57", "Benko Gambit"}}, {Q_UINT64_C(0xb3da067d7c877a6f), {"A57", "Benko Gambit"}}, {Q_UINT64_C(0x39a691df7150ed3e), {"A58", "Benko Gambit"}}, {Q_UINT64_C(0xc002f16f8edafdf3), {"A58", "Benko Gambit"}}, {Q_UINT64_C(0xd638410ff1c509cb), {"A59", "Benko Gambit"}}, {Q_UINT64_C(0x5d1ddcf2d8c23ddd), {"A59", "Benko Gambit"}}, {Q_UINT64_C(0x7f679fac4a904392), {"A59", "Benko Gambit"}}, {Q_UINT64_C(0x36c50db24b63974a), {"A59", "Benko Gambit"}}, {Q_UINT64_C(0x7ecd72af97ee363d), {"A60", "Benoni"}}, {Q_UINT64_C(0x311e1f254ff87ee), {"A60", "Benoni"}}, {Q_UINT64_C(0xbf0e01c82c76da29), {"A61", "Benoni"}}, {Q_UINT64_C(0x9c0c49f5af52f829), {"A62", "Benoni"}}, {Q_UINT64_C(0x96a4a4427a0b11c2), {"A62", "Benoni"}}, {Q_UINT64_C(0xd19a499c3309cef5), {"A63", "Benoni"}}, {Q_UINT64_C(0x308ec3323481dbe5), {"A63", "Benoni"}}, {Q_UINT64_C(0x68a4c683b9bae3e7), {"A63", "Benoni"}}, {Q_UINT64_C(0x280fff72e1e6a7ee), {"A63", "Benoni"}}, {Q_UINT64_C(0xa9d79a24497738ef), {"A64", "Benoni"}}, {Q_UINT64_C(0x49d9b32dd49f9455), {"A65", "Benoni"}}, {Q_UINT64_C(0x5d7b9d7bb6813b97), {"A66", "Benoni"}}, {Q_UINT64_C(0xde197162285263be), {"A67", "Benoni, Mikenas Variation"}}, {Q_UINT64_C(0x3c0ba18cf07978eb), {"A68", "Benoni"}}, {Q_UINT64_C(0x53dae535c32cd7ca), {"A69", "Benoni"}}, {Q_UINT64_C(0x7b090c80c7f66723), {"A70", "Benoni"}}, {Q_UINT64_C(0x29ee013f2b4b8c90), {"A70", "Benoni"}}, {Q_UINT64_C(0xb835b2cf3d94e62a), {"A71", "Benoni"}}, {Q_UINT64_C(0xb29d5f78e8cd0fc1), {"A72", "Benoni"}}, {Q_UINT64_C(0xcce8244c943ed4d1), {"A73", "Benoni"}}, {Q_UINT64_C(0x1e1fd5bf731e2c0d), {"A74", "Benoni"}}, {Q_UINT64_C(0x770561615908f729), {"A75", "Benoni"}}, {Q_UINT64_C(0xac5187e0c0681d4a), {"A75", "Benoni"}}, {Q_UINT64_C(0x201f32e5888bf2bf), {"A75", "Benoni"}}, {Q_UINT64_C(0xd0b9e30ca64e3153), {"A76", "Benoni"}}, {Q_UINT64_C(0xd9b78eb64f30fd9), {"A77", ""}}, {Q_UINT64_C(0x431bd37be20c9365), {"A78", ""}}, {Q_UINT64_C(0x8f891be411c231fd), {"A79", ""}}, {Q_UINT64_C(0x1761df2bb9d0fc00), {"A80", "Dutch Defense"}}, {Q_UINT64_C(0xb42cdefd51a5111d), {"A80", "Dutch Defense, Krejcik Gambit"}}, {Q_UINT64_C(0x3b87646a59072438), {"A81", "Dutch Defense"}}, {Q_UINT64_C(0xd366d2635250410a), {"A82", "Dutch Defense, Staunton Gambit"}}, {Q_UINT64_C(0x77560104c9136646), {"A83", ""}}, {Q_UINT64_C(0x9b42400ffadf5707), {"A84", "Dutch Defense"}}, {Q_UINT64_C(0xed35b23ee2fdc755), {"A84", "Dutch Defense"}}, {Q_UINT64_C(0x36515ec88a1ba668), {"A84", "Dutch Defense"}}, {Q_UINT64_C(0x6dbf6a3d27e1e7fe), {"A84", "Dutch Defense"}}, {Q_UINT64_C(0x5dcaebf509ce43e2), {"A84", "Dutch Defense"}}, {Q_UINT64_C(0xfd226030721bda8), {"A84", "Dutch Defense"}}, {Q_UINT64_C(0xd96172237cd07122), {"A84", "Dutch Defense"}}, {Q_UINT64_C(0x58a2506072c33a80), {"A84", "Dutch Defense"}}, {Q_UINT64_C(0x3b3b6c5895c79448), {"A85", "Dutch Defense"}}, {Q_UINT64_C(0x147aacf159b62430), {"A85", "Dutch Defense"}}, {Q_UINT64_C(0x2dc03a908bce6d5d), {"A85", "Dutch Defense"}}, {Q_UINT64_C(0xdd4033f6ccd26349), {"A85", "Dutch Defense"}}, {Q_UINT64_C(0xe6b2b9927cc6e707), {"A85", "Dutch Defense"}}, {Q_UINT64_C(0xec4acfbbb7f2cea9), {"A86", "Dutch Defense"}}, {Q_UINT64_C(0x5fe9ce0cc7d5ce2), {"A86", "Dutch Defense, Leningrad"}}, {Q_UINT64_C(0xdbd66edd12312e0c), {"A87", "Dutch Defense, Leningrad"}}, {Q_UINT64_C(0x96b16e3f69e3559a), {"A87", "Dutch Defense, Leningrad"}}, {Q_UINT64_C(0x1b5184acb3234711), {"A87", "Dutch Defense, Leningrad"}}, {Q_UINT64_C(0x96a7fa8f9823f2fe), {"A87", "Dutch Defense, Leningrad"}}, {Q_UINT64_C(0xff5c9b72dcc104f8), {"A88", "Dutch Defense, Leningrad"}}, {Q_UINT64_C(0xc6cbae7fba907240), {"A89", "Dutch Defense, Leningrad"}}, {Q_UINT64_C(0x2fcd1ef7e23d8682), {"A90", "Dutch Defense"}}, {Q_UINT64_C(0x71c3d015160fa999), {"A90", "Dutch Defense"}}, {Q_UINT64_C(0xd59bbd97c91578bd), {"A90", "Dutch Defense"}}, {Q_UINT64_C(0xabeec6a3b5e6a3ad), {"A90", "Dutch Defense"}}, {Q_UINT64_C(0x8f9a1ec29271eaf3), {"A90", "Dutch Defense"}}, {Q_UINT64_C(0x3b016d1828962a13), {"A91", "Dutch Defense"}}, {Q_UINT64_C(0xe06581ee40704b2e), {"A91", "Dutch Defense"}}, {Q_UINT64_C(0xeacd6c599529a2c5), {"A92", "Dutch Defense"}}, {Q_UINT64_C(0x11d23579750e37f3), {"A92", "Dutch Defense, Stonewall"}}, {Q_UINT64_C(0x9d74552daf835c9e), {"A93", "Dutch Defense, Stonewall"}}, {Q_UINT64_C(0x7780171855e84f98), {"A93", "Dutch Defense, Stonewall"}}, {Q_UINT64_C(0xad1d698452931e4c), {"A94", "Dutch Defense, Stonewall"}}, {Q_UINT64_C(0x783fc034c02c6691), {"A95", "Dutch Defense, Stonewall"}}, {Q_UINT64_C(0xa36b26b5594c8cf2), {"A95", "Dutch Defense, Stonewall"}}, {Q_UINT64_C(0xf499a0601aa10dfc), {"A95", "Dutch Defense, Stonewall"}}, {Q_UINT64_C(0xc926b229d2fa5af5), {"A95", "Dutch Defense, Stonewall"}}, {Q_UINT64_C(0xad02810c3ba230b8), {"A96", "Dutch Defense, Classical"}}, {Q_UINT64_C(0x569599aef940b261), {"A96", "Dutch Defense, Classical"}}, {Q_UINT64_C(0xad1415bcca6297dc), {"A97", "Dutch Defense, Classical"}}, {Q_UINT64_C(0x1c0d67a1d8b4abb8), {"A98", "Dutch Defense, Classical"}}, {Q_UINT64_C(0x21b275e810effcb1), {"A99", "Dutch Defense, Classical"}}, {Q_UINT64_C(0x823c9b50fd114196), {"B00", "King Pawn"}}, {Q_UINT64_C(0x29d143b2ec80e495), {"B00", "Nimzowitsch Defense"}}, {Q_UINT64_C(0x756b94461c50fb0), {"B01", "Scandinavian Defense"}}, {Q_UINT64_C(0xa145bdee0e3a0300), {"B01", "Scandinavian Defense"}}, {Q_UINT64_C(0xe4fa4a47daef0ee9), {"B01", "Scandinavian Defense"}}, {Q_UINT64_C(0xcd5a4325af512e90), {"B01", "Scandinavian, Pytel-Wade Variation"}}, {Q_UINT64_C(0x653ef537229f749c), {"B01", "Scandinavian Gambit"}}, {Q_UINT64_C(0x8133eae94d7d3775), {"B01", "Scandinavian, Islandic Gambit"}}, {Q_UINT64_C(0x21bcd21bb87c3c3e), {"B01", "Scandinavian, Marshall Variation"}}, {Q_UINT64_C(0xd9d2afa550eb0000), {"B02", "Alekhine's Defense"}}, {Q_UINT64_C(0xd89ab24c1b5dca3e), {"B03", "Alekhine's Defense, Four Pawns' Attack"}}, {Q_UINT64_C(0xb6919cd2ef647e28), {"B02", "Alekhine's Defense, Two Pawns' Attack"}}, {Q_UINT64_C(0x64534b53efb678a8), {"B03", "Alekhine's Defense, Exchange Variation"}}, {Q_UINT64_C(0xb98e490b8bfe7e93), {"B03", "Alekhine's Defense"}}, {Q_UINT64_C(0x5b50339c316056c3), {"B04", "Alekhine's Defense"}}, {Q_UINT64_C(0x175c70ec11a504c1), {"B04", "Alekhine's Defense"}}, {Q_UINT64_C(0x5983f9ae76e55829), {"B05", "Alekhine's Defense"}}, {Q_UINT64_C(0xfc3be9852daf9860), {"B05", "Alekhine's Defense"}}, {Q_UINT64_C(0x6b88c80b869ed3dd), {"B06", "Modern Defense"}}, {Q_UINT64_C(0x970771c0452fb7f2), {"B06", "Modern Defense"}}, {Q_UINT64_C(0xe596c2b5aef2b7ec), {"B06", "Modern Defense"}}, {Q_UINT64_C(0x748b822146c9fbc), {"B06", "Modern Defense"}}, {Q_UINT64_C(0x1132f4cc486cc8d), {"B06", "Modern Defense"}}, {Q_UINT64_C(0x5da8d28a308baf1a), {"B06", "Modern Defense"}}, {Q_UINT64_C(0x255d166e935a642f), {"B07", "Pirc Defense"}}, {Q_UINT64_C(0x4cb0e3232678354d), {"B07", "Pirc Defense, Czech Variation"}}, {Q_UINT64_C(0x178da9c380339759), {"B07", "Pirc Defense"}}, {Q_UINT64_C(0xc82ff9c4ca68a9b0), {"B07", "Pirc Defense"}}, {Q_UINT64_C(0xd1eb6cedab045375), {"B07", "Pirc Defense"}}, {Q_UINT64_C(0xd8fe6581385b43), {"B07", "Pirc Defense"}}, {Q_UINT64_C(0x5ca68cd7b996de2a), {"B08", "Pirc Defense, Classical Variation"}}, {Q_UINT64_C(0x258ee2996dea7d62), {"B08", "Pirc Defense, Classical Variation"}}, {Q_UINT64_C(0xc981744266d975c9), {"B08", "Pirc Defense, Classical Variation"}}, {Q_UINT64_C(0x5928539f569ca898), {"B08", "Pirc Defense, Classical Variation"}}, {Q_UINT64_C(0xe4bcf53e06931944), {"B08", "Pirc Defense, Classical Variation"}}, {Q_UINT64_C(0x890c685ef6395eae), {"B08", "Pirc Defense, Classical Variation"}}, {Q_UINT64_C(0xe2c516b29baa8b60), {"B08", "Pirc Defense, Classical Variation"}}, {Q_UINT64_C(0xca68209a33a64934), {"B09", "Pirc Defense, Austrian Attack"}}, {Q_UINT64_C(0x7ad41d2cc8e1829e), {"B09", "Pirc Defense, Austrian Attack"}}, {Q_UINT64_C(0x104676bf8ad1922d), {"B10", "Caro-Kann Defense"}}, {Q_UINT64_C(0x1864c1b3203b6d3b), {"B10", "Caro-Kann Defense"}}, {Q_UINT64_C(0x555a0aebecb1c617), {"B10", "Caro-Kann Defense"}}, {Q_UINT64_C(0xb70c6acdfb843105), {"B11", "Caro-Kann, Two Knights' Variation"}}, {Q_UINT64_C(0x8c7935f098f45fbe), {"B11", "Caro-Kann"}}, {Q_UINT64_C(0xd57359159b18bf6f), {"B12", "Caro-Kann Defense"}}, {Q_UINT64_C(0x31606dfc03d2d72d), {"B12", "Caro-Kann, Advance Variation"}}, {Q_UINT64_C(0x1f6a1ab5c4f32fcf), {"B12", "Caro-Kann, Advance Variation"}}, {Q_UINT64_C(0x69b0e22d14832049), {"B12", "Caro-Kann, Advance Variation"}}, {Q_UINT64_C(0x6cea994cc5d6656c), {"B12", "Caro-Kann, Advance Variation"}}, {Q_UINT64_C(0x3ea89d30a7061e38), {"B12", "Caro-Kann, Fantasy Variation"}}, {Q_UINT64_C(0x4b6de057dc9bef5), {"B13", "Caro-Kann, Exchange Variation"}}, {Q_UINT64_C(0xff21c6a7bf2b3c2c), {"B13", "Caro-Kann, Exchange Variation"}}, {Q_UINT64_C(0x889541213ec615f2), {"B13", "Caro-Kann, Panov-Botvinnik Attack"}}, {Q_UINT64_C(0x8301b594404f73be), {"B13", "Caro-Kann, Panov-Botvinnik Attack"}}, {Q_UINT64_C(0x5ab693506f2c1c69), {"B13", "Caro-Kann, Panov-Botvinnik Attack"}}, {Q_UINT64_C(0xcb7272d072071528), {"B13", "Caro-Kann, Panov-Botvinnik Attack"}}, {Q_UINT64_C(0x85ff73b1211a27d2), {"B14", "Caro-Kann, Panov-Botvinnik Attack"}}, {Q_UINT64_C(0x9133005eebb18b43), {"B14", "Caro-Kann, Panov-Botvinnik Attack"}}, {Q_UINT64_C(0x4cbe1ab76aedeff0), {"B14", "Caro-Kann, Panov-Botvinnik Attack"}}, {Q_UINT64_C(0xc78e51c874817fd6), {"B14", "Caro-Kann, Panov-Botvinnik Attack"}}, {Q_UINT64_C(0xab8e63a3c52e7390), {"B15", "Caro-Kann Defense"}}, {Q_UINT64_C(0x423a30f8bea1e1db), {"B15", "Caro-Kann, Gurgandize System"}}, {Q_UINT64_C(0x3ecf958145a4756c), {"B16", "Caro-Kann, Bronstein-Larsen Variation"}}, {Q_UINT64_C(0xfa25b904ac89bf9b), {"B17", "Caro-Kann Defense"}}, {Q_UINT64_C(0x4adfabd7fbc45bda), {"B18", "Caro-Kann, Classical Variation"}}, {Q_UINT64_C(0x41ae97c7b9f29a70), {"B19", "Caro-Kann, Classical Variation"}}, {Q_UINT64_C(0xa96792f6450d3061), {"B19", "Caro-Kann, Classical Variation"}}, {Q_UINT64_C(0x644d4afe02564aeb), {"B20", "Sicilian Defense"}}, {Q_UINT64_C(0x88bc27f9be1b01e9), {"B20", "Smith-Morra Gambit"}}, {Q_UINT64_C(0xfe456da2d682d73c), {"B20", "Sicilian Defense"}}, {Q_UINT64_C(0x91e102f4ddfa6b28), {"B20", "Sicilian Defense"}}, {Q_UINT64_C(0xe73bfa6c0d8a64ae), {"B20", "Sicilian Defense"}}, {Q_UINT64_C(0x7912df4a1f59a2da), {"B20", "Sicilian Defense"}}, {Q_UINT64_C(0x995b37f31bc77762), {"B21", "Sicilian Defense, Grand Prix Attack"}}, {Q_UINT64_C(0xceb83f52a4e026cf), {"B21", "Sicilian Defense, Flank Gambit"}}, {Q_UINT64_C(0x1297b266d226456d), {"B22", "Sicilian Defense, Alapin Variation"}}, {Q_UINT64_C(0x3c749e6087d33496), {"B22", "Sicilian Defense, Alapin Variation"}}, {Q_UINT64_C(0xe7107296ef3555ab), {"B22", "Sicilian Defense, Alapin Variation"}}, {Q_UINT64_C(0x779e1183cd51eee7), {"B22", "Sicilian Defense, Alapin Variation"}}, {Q_UINT64_C(0xaa043b50c4e2dbb6), {"B22", "Sicilian Defense, Alapin Variation"}}, {Q_UINT64_C(0x4c9ad53b904c6a78), {"B22", "Sicilian Defense, Alapin Variation"}}, {Q_UINT64_C(0xbfc07d49f4839d42), {"B22", "Sicilian Defense, Alapin Variation"}}, {Q_UINT64_C(0x867aeb2826fbd42f), {"B22", "Sicilian Defense, Alapin Variation"}}, {Q_UINT64_C(0xd9969616269c2f33), {"B22", "Sicilian Defense, Alapin Variation"}}, {Q_UINT64_C(0x9fda525cc0b4c832), {"B23", "Sicilian Defense, Closed"}}, {Q_UINT64_C(0x18d131ff31f2b509), {"B24", "Sicilan Defense, Closed"}}, {Q_UINT64_C(0x633729db6a3fc628), {"B25", "Sicilan Defense, Closed"}}, {Q_UINT64_C(0x73088d98c4105a63), {"B25", "Sicilan Defense, Closed"}}, {Q_UINT64_C(0x79a0602f1149b388), {"B25", "Sicilan Defense, Closed"}}, {Q_UINT64_C(0x6a761a561f18e9f1), {"B25", "Sicilian Defense"}}, {Q_UINT64_C(0x6a761a561f18e9f1), {"B25", "Sicilian Defense"}}, {Q_UINT64_C(0xe281adfd46169d3e), {"B25", "Sicilian Defense"}}, {Q_UINT64_C(0x1a266c088b859769), {"B25", "Sicilian Defense"}}, {Q_UINT64_C(0x103f9237eb05dda6), {"B26", "Sicilan Defense, Closed"}}, {Q_UINT64_C(0xbf29a6086ab02bd6), {"B27", "Sicilan Defense"}}, {Q_UINT64_C(0x6dde57fb8d90d30a), {"B28", "Sicilian Defense, O'Kelly Variation"}}, {Q_UINT64_C(0xe4c792fdc74a6a40), {"B29", "Sicilian Defense"}}, {Q_UINT64_C(0x14c47eea7b218ed5), {"B30", "Sicilian Defense"}}, {Q_UINT64_C(0x271aaf451eb51d56), {"B30", "Sicilian Defense, Rossolimo Variation"}}, {Q_UINT64_C(0x8763831271adde19), {"B30", "Sicilian Defense"}}, {Q_UINT64_C(0xbe310b46dd97e2f1), {"B30", "Sicilian, Portsmouth Gambit"}}, {Q_UINT64_C(0xceaefc1e653a8f1d), {"B31", "Sicilian Defense, Rossolimo Variation"}}, {Q_UINT64_C(0xd1f151406ae8a397), {"B32", "Sicilian Defense"}}, {Q_UINT64_C(0x6303be6295c8a049), {"B32", "Sicilian Defense, neo-Sveshinikov Variation"}}, {Q_UINT64_C(0xc37a9235fad06306), {"B33", "Sicilian Defense, Sveshnikov Variation"}}, {Q_UINT64_C(0x8efd6428a37e4dea), {"B33", "Sicilian Defense, Sveshnikov Variation"}}, {Q_UINT64_C(0x1b0748fc7e923329), {"B33", " Sicilian Defense, Sveshnikov Variation"}}, {Q_UINT64_C(0xcfe5737da2ca34), {"B34", "Sicilian Defense, Accelerated Dragon"}}, {Q_UINT64_C(0xb1fb5640840ff9), {"B35", "Sicilian, Accelerated Dragon"}}, {Q_UINT64_C(0xa7b715399505f566), {"B35", "Sicilian, Accelerated Dragon"}}, {Q_UINT64_C(0x8cec7a573ead6133), {"B36", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0xa8217fccd4fd6c53), {"B37", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0x696c7a6834b4bdf3), {"B37", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0xfa8f15fcdc928f17), {"B37", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0x4f58fc0d44d0b117), {"B38", "Sicilian Defense, Marcozy Bind"}}, {Q_UINT64_C(0xced463e9fe52dc6e), {"B38", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0x14b6c8f8e92af081), {"B38", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0xef21d05a2bc87258), {"B38", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0x9609be14ffb4d110), {"B38", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0x3307ad138b65935c), {"B38", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0xfe9db58b0c961d62), {"B38", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0x87f548365388c75c), {"B38", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0x72028b3c2682e334), {"B39", "Sicilian Defense, Maroczy Bind"}}, {Q_UINT64_C(0xc95e54397292bb84), {"B40", "Sicilian Defense"}}, {Q_UINT64_C(0xe6166d08e8be95f2), {"B41", "Sicilian Defense, Paulsen Variation"}}, {Q_UINT64_C(0xb31bccaad13e5781), {"B42", "Sicilian Defense, Paulsen Variation"}}, {Q_UINT64_C(0x1d8175aa2a5c172b), {"B43", "Sicilian Defense, Paulsen Variation"}}, {Q_UINT64_C(0x4e93eb297f979a59), {"B43", "Sicilian Defense, Paulsen Variation"}}, {Q_UINT64_C(0x9f0c44191e0fc82d), {"B44", "Sicilian Defense"}}, {Q_UINT64_C(0x6a66ae741f9ff27b), {"B44", "Sicilian Defense, Szen"}}, {Q_UINT64_C(0xfafac33779d0a6da), {"B44", "Sicilian Defense, Szen"}}, {Q_UINT64_C(0x649b5cbbdced4af4), {"B45", "Sicilian Defense"}}, {Q_UINT64_C(0x3f75684e71170b62), {"B45", "Sicilian Defense, Four Knights Variation"}}, {Q_UINT64_C(0xb66cad483bcdb228), {"B46", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0x9a8a1609db1a6a10), {"B46", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0x6284639ab0a605f5), {"B47", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0xc3f3119056a3b78a), {"B47", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0x118cd876319c1e7b), {"B48", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0xcd98bcd242c66542), {"B48", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0x89044ffd352e9a7c), {"B48", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0xb0fbaa7cd799ac04), {"B49", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0xeb159e897a63ed92), {"B49", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0x5c218cbb4d67fea0), {"B49", "Sicilian Defense, Taimanov Variation"}}, {Q_UINT64_C(0x86933069b8c862bb), {"B50", "Sicilian Defense"}}, {Q_UINT64_C(0xb54de1c6dd5cf138), {"B51", "Sicilian Defense, Rossolimo"}}, {Q_UINT64_C(0x2b947ea49046ba1e), {"B51", "Sicilian Defense, Rossolimo"}}, {Q_UINT64_C(0x578c1f9407062109), {"B52", "Sicilian Defense, Rossolimo"}}, {Q_UINT64_C(0xbcfb5540fbafd9cb), {"B52", "Sicilian Defense, Rossolimo"}}, {Q_UINT64_C(0x610fb232e064c902), {"B53", "Sicilian Defense, Chekhover Variation"}}, {Q_UINT64_C(0x1bfd452d4e3b2fb3), {"B53", "Sicilian Defense, Chekhover Variation"}}, {Q_UINT64_C(0x7b2cf8abc5c4b411), {"B54", "Sicilian Defense"}}, {Q_UINT64_C(0x4e732a6fc8f41af6), {"B55", "Sicilian Defense"}}, {Q_UINT64_C(0xf7d5f38a3e857143), {"B55", "Sicilian Defense"}}, {Q_UINT64_C(0xdb55d4fcaadc775e), {"B56", "Sicilian Defense"}}, {Q_UINT64_C(0x130bb836930e04fb), {"B57", ""}}, {Q_UINT64_C(0x3388fe7ba6898fe), {"B58", "Sicilian, Boleslavsky Variation"}}, {Q_UINT64_C(0x1d31bf80389aa602), {"B59", "Sicilian, Boleslavsky Variation"}}, {Q_UINT64_C(0xb6e25b280bc70995), {"B60", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0x7c3beaf510240604), {"B61", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0xc095a91913e599c7), {"B62", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0xe88de696d25c4667), {"B63", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0x72822a2fd9661b28), {"B63", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0xf0aeb597cb9816ca), {"B63", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0x5ab505c08f9bca4f), {"B63", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0x33d240e0871d310c), {"B64", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0xb1fedf5895e33cee), {"B65", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0x3a7a1765357cbebb), {"B66", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0xdd24d3506f1dbd79), {"B66", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0xe096ac14bc046112), {"B67", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0xd988ef25ea690d4e), {"B67", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0x1d80d119a5955c9b), {"B67", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0x94ca2f66f3ef00a), {"B68", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0xb2105b3eed55ab18), {"B69", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0xb696c31ab1685be9), {"B69", "Sicilian Defense, Richter-Rauzer Attack"}}, {Q_UINT64_C(0x32e187a7d153e515), {"B70", "Sicilian Defense, Dragon Variation"}}, {Q_UINT64_C(0xcff7faaac8c2d89c), {"B71", "Sicilian Defense, Levenfish Variation"}}, {Q_UINT64_C(0x41e93c4b5069fe9b), {"B72", "Sicilian Defense, Dragon Variation"}}, {Q_UINT64_C(0x574d21d2c7690181), {"B73", "Sicilian Defense, Dragon Variation"}}, {Q_UINT64_C(0xc994f44803272ea0), {"B74", "Sicilian Defense, Dragon Variation"}}, {Q_UINT64_C(0x603a1b9152036821), {"B74", "Sicilian Defense, Dragon Variation"}}, {Q_UINT64_C(0x9fe4e7cc0be4da40), {"B75", "Sicilian Defense, Dragon Variation"}}, {Q_UINT64_C(0x954c0a7bdebd33ab), {"B76", "Sicilian Defense, Dragon Variation"}}, {Q_UINT64_C(0x16b99d160e954908), {"B76", "Sicilian Defense, Dragon Variation"}}, {Q_UINT64_C(0x2e94d8355db74690), {"B76", "Sicilian Defense, Dragon Variation"}}, {Q_UINT64_C(0x750a293e26d69fae), {"B77", "Sicilian Dragon, Yugoslav Attack"}}, {Q_UINT64_C(0x97cbd76cfc8c4f9f), {"B77", "Sicilian Dragon, Yugoslav Attack"}}, {Q_UINT64_C(0x11904b91b1aefc49), {"B77", "Sicilian Dragon, Yugoslav Attack"}}, {Q_UINT64_C(0xafe6924fafae4007), {"B78", "Sicilian Dragon, Yugoslav Attack"}}, {Q_UINT64_C(0xc318132dcb7e1319), {"B78", "Sicilian Dragon, Yugoslav Attack"}}, {Q_UINT64_C(0xde468d56cc5eb26e), {"B78", "Sicilian Dragon, Soltis Variation"}}, {Q_UINT64_C(0x34185ad44aec7eb4), {"B78", "Sicilian Dragon, Soltis Variation"}}, {Q_UINT64_C(0x374539aff990f76d), {"B78", "Sicilian, Chinese Dragon"}}, {Q_UINT64_C(0x7695071406dc6188), {"B79", "Sicilian Dragon, Yugoslav Attack"}}, {Q_UINT64_C(0x14ca2fb997f8e127), {"B79", "Sicilian Dragon, Yugoslav Attack"}}, {Q_UINT64_C(0xad2226cdb2fee70c), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x81c49d8c52293f34), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x626c8ae3742eeb2f), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x2a70af792e3a89b2), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0xbaded5f226e78963), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x39ade62bb41dcb34), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x1993d424ce92647e), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x3263d85507972960), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0xa125e12007f6bb0f), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x1004dbb7e211cfee), {"B80", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0xe6f271b5a8b0a11), {"B81", "Sicilian Defense, Keres Attack"}}, {Q_UINT64_C(0xaf906d043c91e943), {"B81", "Sicilian Defense, Keres Attack"}}, {Q_UINT64_C(0x346b0b567f083b3f), {"B81", "Sicilian Defense, Keres Attack"}}, {Q_UINT64_C(0x50345bc0ab6fda85), {"B82", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x8c08e41f1f248965), {"B82", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x263f3012dd129e22), {"B82", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0xdea2a534b3dbadaf), {"B83", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x754f7dd6a24a08ac), {"B83", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0xc5554c754fb5573), {"B84", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x743f10d24443c162), {"B84", " Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x66ec5c1ce2a322f2), {"B84", " Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x9bfa2111fb321f7b), {"B84", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x9152cca62e6bf690), {"B84", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x3d6a392b176a7ae6), {"B84", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x1976d35f2736ad0a), {"B84", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x81863cb91461f766), {"B84", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0xe25a774aaf51ed1e), {"B85", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0xbd75b9aed4e3e98e), {"B85", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x74ab4e94e7344cb8), {"B85", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x227ed144d3539dd3), {"B85", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x2461ee65bf18d2d2), {"B85", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x15caddcf5ffe709d), {"B85", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0x99b1a8f6d8e951f), {"B85", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0xdc142af56c29d5ab), {"B85", "Sicilian Defense, Scheveningen Variation"}}, {Q_UINT64_C(0xce9192e59abd31aa), {"B86", "Sicilian Defense, Sozin"}}, {Q_UINT64_C(0x1c6663167d9dc976), {"B86", "Sicilian Defense, Sozin"}}, {Q_UINT64_C(0xb56619216d1624af), {"B87", "Sicilian Defense, Sozin"}}, {Q_UINT64_C(0xcb13621511e5ffbf), {"B87", "Sicilian Defense, Sozin"}}, {Q_UINT64_C(0x657c4a078b2c94a9), {"B88", "Sicilian Defense, Sozin"}}, {Q_UINT64_C(0xb982f1b0a5b681e), {"B88", "Sicilian Defense, Sozin"}}, {Q_UINT64_C(0xdc42c518019fb9bb), {"B88", "Sicilian Defense, Sozin"}}, {Q_UINT64_C(0x1674f1eb0a168f27), {"B89", "Sicilian Defense, Velimirovic Attack"}}, {Q_UINT64_C(0xc4830018ed3677fb), {"B89", "Sicilian Defense, Velimirovic Attack"}}, {Q_UINT64_C(0x9d9ea039441f339a), {"B89", "Sicilian Defense, Velimirovic Attack"}}, {Q_UINT64_C(0x9a2250f4dfc8f82), {"B90", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0xaf906d043c91e943), {"B90", "Sicilian Najdorf, Perenyi Attack"}}, {Q_UINT64_C(0x626c8ae3742eeb2f), {"B90", "Sicilian Najdorf, English Attack"}}, {Q_UINT64_C(0x28299e94b133c076), {"B90", "Sicilian Najdorf, English Attack"}}, {Q_UINT64_C(0xf5556e616ead3d1d), {"B90", "Sicilian Najdorf, English Attack"}}, {Q_UINT64_C(0xf0d296a95f236c3a), {"B90", "Sicilian Najdorf, English Attack"}}, {Q_UINT64_C(0x25449e4ead2b57ba), {"B91", "Sicilian Defense Najdorf, Zagreb Var."}}, {Q_UINT64_C(0x7a22a6f64cd9c521), {"B92", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0x439bbfa907a49b5b), {"B92", "Najdorf Variation"}}, {Q_UINT64_C(0xf4b45802546db20b), {"B93", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0xcff87239fd76544a), {"B94", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0xb98f8008e554c418), {"B95", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0x4499fd05fcc5f991), {"B96", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0x249d9710676844ac), {"B96", "Sicilian Defense, Polugaevsky Variation"}}, {Q_UINT64_C(0x777a86581c6d145d), {"B96", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0xe763365b3e6200d8), {"B96", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0xcb47c24a5c5b0de7), {"B96", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0x83660352368e2f4b), {"B97", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0x38ec8a1702994133), {"B97", "Sicilian Najdorf, Poisioned Pawn Variation"}}, {Q_UINT64_C(0x78619c1b10fd84a2), {"B97", "Sicilian Najdorf, Poisioned Pawn Variation"}}, {Q_UINT64_C(0x50558eea366e5500), {"B98", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0xea77f5d91a1303bb), {"B98", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0xe7a6f486c5d2aeee), {"B99", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0x700cc5dd428d5c2f), {"B99", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0x5c5e54daa09d8fc3), {"B99", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0x3fbe2c4c1616d730), {"B99", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0x44ebf5502da743f3), {"B99", "Sicilian Defense, Najdorf Variation"}}, {Q_UINT64_C(0xf44b6961e533d1c4), {"C00", "French Defense"}}, {Q_UINT64_C(0x5aefaab4a1a36a10), {"C00", "French, King's Indian Attack"}}, {Q_UINT64_C(0x624de643ab778a40), {"C00", "French, Chigorin Variation"}}, {Q_UINT64_C(0x51d2bf21d3e37c06), {"C00", "French Defense, Two Knights Variation"}}, {Q_UINT64_C(0x87b8157c4ceebfe2), {"C00", "French Defense, Wing Gambit"}}, {Q_UINT64_C(0xacdfb756a8e4306d), {"C01", "French Defense, Exchange Variation"}}, {Q_UINT64_C(0x77bb5ba0c0025150), {"C01", "French Defense, Exchange Variation"}}, {Q_UINT64_C(0xa11d1f363b54ba5d), {"C01", "French Defense, Winawer Exchange"}}, {Q_UINT64_C(0xd56d72226c3094c4), {"C02", "French Defense, Advance Variation"}}, {Q_UINT64_C(0x45c65b144307903f), {"C02", "French Defense, Advance Variation"}}, {Q_UINT64_C(0xa7bd30f5c9bb40a8), {"C02", "French Defense, Milner-Barry Gambit"}}, {Q_UINT64_C(0xed7adcbdf2d31a90), {"C03", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x304dfcc73332b015), {"C03", "French Tarrasch, Guimard Variation"}}, {Q_UINT64_C(0x29d436a205b4363), {"C03", "French Tarrasch, Guimard Variation"}}, {Q_UINT64_C(0xc61ddc5c265e9f38), {"C04", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0xb694e8485f295b06), {"C05", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0xa7ed29d3c0aa7f02), {"C06", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x8f49327c5390dab0), {"C06", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x9b854193993b7621), {"C06", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x544546aad9f61ae2), {"C06", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x80653c971ecf0584), {"C06", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0xb0b0d130d9411ed), {"C07", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x29810168252880c), {"C07", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x641ba3deed591343), {"C07", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x13c0de9acd5e9320), {"C08", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x1a53c39f42980ac1), {"C08", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x42552964b78cf039), {"C08", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0xb790fd47c47850b), {"C08", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x6349ea8eb429571e), {"C09", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0xf4cf56a30ea715b9), {"C09", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0xc52cd58876b246bc), {"C09", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0xa4983489a736e563), {"C09", "French Defense, Tarrasch Variation"}}, {Q_UINT64_C(0x4f837c7daacc3079), {"C10", "French Defense"}}, {Q_UINT64_C(0x2dcbdd8723c311be), {"C10", "French Defense, Rubinstein Variation"}}, {Q_UINT64_C(0x6f885037e86a9082), {"C10", "French, Fort Knox Variation"}}, {Q_UINT64_C(0xec80d7c915f45ff7), {"C10", "French Defense, Rubinstein"}}, {Q_UINT64_C(0x4ff17ebadb1fa49f), {"C10", "French Defense"}}, {Q_UINT64_C(0xe9850370a6e17acd), {"C10", "French Defense"}}, {Q_UINT64_C(0x146d4888073671ef), {"C11", "French Defense"}}, {Q_UINT64_C(0x75145e750328578b), {"C11", "French Defense, Steinitz Variation"}}, {Q_UINT64_C(0xb146608b3945343e), {"C11", "French Defense, Steinitz Variation"}}, {Q_UINT64_C(0x4b1041ba6564b189), {"C11", "French Defense, Classical, Burn Var."}}, {Q_UINT64_C(0x2ad1e51d4ebeeff9), {"C11", "French Defense, Classical, Burn Var."}}, {Q_UINT64_C(0x1b7676b8fc4b6205), {"C12", "French Defense, MacCutcheon Variation"}}, {Q_UINT64_C(0x1abd80b77e451a77), {"C13", "French Defense, Burn Variation"}}, {Q_UINT64_C(0xff4d2de59a671b0), {"C13", "French Defense"}}, {Q_UINT64_C(0xc608d90464a00d6f), {"C13", "French Defense"}}, {Q_UINT64_C(0xc6fb6c517d1706b6), {"C13", "French Defense, Classical Variation"}}, {Q_UINT64_C(0x9758f830e3a3c6ed), {"C13", "French Defense, Classical Variation"}}, {Q_UINT64_C(0xc266e5237ffa5059), {"C14", "French Defense, Alekhine-Chatard Attack"}}, {Q_UINT64_C(0x2d401dd965fe75de), {"C14", ""}}, {Q_UINT64_C(0x86c2157be13bf85b), {"C15", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0xaf4f4fce735a935f), {"C15", "French, Winawer, Fingerslip Variation"}}, {Q_UINT64_C(0x9266feb4c910f5a5), {"C15", "French, Winawer, Alekhine Gambit"}}, {Q_UINT64_C(0x4d5e245da877761b), {"C15", "French, Winkelmann-Reimer Gambit"}}, {Q_UINT64_C(0x81894c5271a09470), {"C15", "French, Winkelmann-Reimer Gambit"}}, {Q_UINT64_C(0xa4507984b302190b), {"C15", "French, Winkelmann-Reimer Gambit"}}, {Q_UINT64_C(0xe7bb0386e525de3f), {"C16", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0x1cad2281a62d542), {"C17", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0x10e69c2078695a4d), {"C17", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0xe97aedccb2ba6610), {"C18", "French, Winawer, Armenian Variation"}}, {Q_UINT64_C(0xa0baf239e3cae648), {"C18", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0xcb4f3c2a8ea437f8), {"C18", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0x6339af69cf92777a), {"C18", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0x4591a27230a50cc8), {"C19", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0x6f8c86ab03be56c3), {"C19", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0x543eeda27096a77d), {"C19", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0xeae667af080ac38d), {"C19", "French Defense, Winawer Variation"}}, {Q_UINT64_C(0x844931a6ef4b9a0), {"C20", ""}}, {Q_UINT64_C(0x560fb632bb4680f7), {"C21", "Center Game"}}, {Q_UINT64_C(0x20d54eaa6b368f71), {"C21", "Danish Gambit"}}, {Q_UINT64_C(0x805579149e46cac9), {"C22", ""}}, {Q_UINT64_C(0x6bf7273246b76f06), {"C23", "Bishop's Opening"}}, {Q_UINT64_C(0x301913c7eb4d2e90), {"C24", "Bishop's Opening"}}, {Q_UINT64_C(0xb536da19561976fa), {"C24", "Urusov Gambit"}}, {Q_UINT64_C(0x4f3ecf1bd616b32e), {"C24", "Urusov Gambit"}}, {Q_UINT64_C(0xf3d38bb8ac163b79), {"C25", "Vienna Game"}}, {Q_UINT64_C(0xd2b02748784217d2), {"C25", "Vienna Game, Pierce Gambit"}}, {Q_UINT64_C(0x8b2694cbc2b443ee), {"C25", "Vienna Game, Hamppe-Allgaier Gambit"}}, {Q_UINT64_C(0x89973b6384108965), {"C25", "Vienna Game, Steinitz Gambit"}}, {Q_UINT64_C(0xa83dbf4d01ec7aef), {"C26", "Vienna Game"}}, {Q_UINT64_C(0x7639453c2f780b5a), {"C27", "Vienna Game"}}, {Q_UINT64_C(0xad5da9ca479e6a67), {"C27", "Boden-Kieseritsky Gambit"}}, {Q_UINT64_C(0xc8378ceba70dfd1e), {"C27", "Vienna Game"}}, {Q_UINT64_C(0xf18d1a8a7575b473), {"C27", "Vienna Game"}}, {Q_UINT64_C(0x6063d387383e094a), {"C28", "Vienna Game"}}, {Q_UINT64_C(0x9d75ae8a21af34c3), {"C28", "Vienna Game"}}, {Q_UINT64_C(0xd041e05484a90940), {"C29", "Vienna Gambit"}}, {Q_UINT64_C(0xf552ee1777658429), {"C30", "King's Gambit"}}, {Q_UINT64_C(0x584faa4cbd576eaa), {"C30", "King's Gambit Declined"}}, {Q_UINT64_C(0xaebcdae2da9fc5bf), {"C30", "King's Gambit Declined"}}, {Q_UINT64_C(0x7038cc03ebb1ca0f), {"C31", "Falkbeer Counter Gambit"}}, {Q_UINT64_C(0x8dab0c00eab1adbd), {"C32", "Falkbeer Counter Gambit"}}, {Q_UINT64_C(0x1cd8d48946aa83fd), {"C33", "King's Gambit Accepted"}}, {Q_UINT64_C(0x7f6b60a16ee9555b), {"C33", "King's Gambit Accepted"}}, {Q_UINT64_C(0xc7bc387f2e4ce2c0), {"C34", "King's Gambit Accepted"}}, {Q_UINT64_C(0xd3704b90e4e74e51), {"C35", "King's Gambit, Cunningham Variation"}}, {Q_UINT64_C(0x42d61a6bb298ace6), {"C36", "King's Gambit, Abbazia Defense"}}, {Q_UINT64_C(0x47ffc8a2baf81d4a), {"C37", "King's Gambit"}}, {Q_UINT64_C(0x82cae708ab313008), {"C37", "King's Gambit, Rosentreter"}}, {Q_UINT64_C(0x5edf6b3f6fc79093), {"C37", "King's Gambit, Muzio"}}, {Q_UINT64_C(0x81194027fbd5e9f6), {"C37", "King's Gambit, Lolli"}}, {Q_UINT64_C(0xe59f3fa102fd66c1), {"C37", "Ghulam Kassim Gambit"}}, {Q_UINT64_C(0xdb3d08a9d1d6c95a), {"C37", "King's Gambit, MacDonnell"}}, {Q_UINT64_C(0x94f0413c69fc0046), {"C38", "King's Gambit, Hanstein"}}, {Q_UINT64_C(0xdb5c548b11c76434), {"C39", "King's Gambit"}}, {Q_UINT64_C(0x8968d9df39841cff), {"C39", "King's Gambit, Allgaier"}}, {Q_UINT64_C(0x282e7c5cbc5812d), {"C39", "King's Gambit, Kieseritsky"}}, {Q_UINT64_C(0x596cd330663fc0bb), {"C39", "KGA Kieseritsky, Berlin Defense"}}, {Q_UINT64_C(0xb23eda7330824a87), {"C39", "KGA Kieseritsky, Paulsen Variation"}}, {Q_UINT64_C(0x997d38b50af92f47), {"C39", "KGA Kieseritsky, Salvio Variation"}}, {Q_UINT64_C(0x424759f7ab2e1009), {"C39", "KGA Kieseritsky, Rice Gambit"}}, {Q_UINT64_C(0xd3207fec0612d89d), {"C40", "King Pawn"}}, {Q_UINT64_C(0x1f7579a53cf9cfe2), {"C40", "Damiano Defense"}}, {Q_UINT64_C(0x474f1975b89af543), {"C40", "Latvian Gambit"}}, {Q_UINT64_C(0x564a5df89ac696bb), {"C40", "Elephant Gambit"}}, {Q_UINT64_C(0x48dfa09cc72e76f7), {"C40", "Gunderam Defense"}}, {Q_UINT64_C(0xea9ae98dd46a91f0), {"C41", "Philidor's Defense"}}, {Q_UINT64_C(0x8fd6ea70aabb7ffd), {"C41", "Philidor's Defense"}}, {Q_UINT64_C(0x67f0ce40b55a5557), {"C41", "Philidor, Antoshin Variation"}}, {Q_UINT64_C(0xcb4a56eaa8fbe806), {"C41", "Philidor, Hanham Variation"}}, {Q_UINT64_C(0xbbc0a0be7b2b916c), {"C41", "Philidor Countergambit"}}, {Q_UINT64_C(0x88ce4b19abe8990b), {"C42", "Petroff Defense"}}, {Q_UINT64_C(0x735953bb690a1bd2), {"C42", "Petroff Defense"}}, {Q_UINT64_C(0x368dbfe20ff63c3d), {"C42", "Petroff Defense, Classical Variation"}}, {Q_UINT64_C(0xfbd062917a039c38), {"C42", "Petroff Defense, Cochrane Gambit"}}, {Q_UINT64_C(0x4dfb64b3ba21b449), {"C43", "Petroff Defense, Steinitz Variation"}}, {Q_UINT64_C(0x78cda70e17837d9e), {"C44", "King Pawn"}}, {Q_UINT64_C(0xe175f96c7f37218), {"C44", "Ponziani Opening"}}, {Q_UINT64_C(0xd66964db5313c64a), {"C44", "King Pawn"}}, {Q_UINT64_C(0xbdf888a4064a50dc), {"C44", "Scotch Opening"}}, {Q_UINT64_C(0x505c7abe12414b4f), {"C44", "Scotch Opening, Goering Gambit"}}, {Q_UINT64_C(0xbb24e4bbfbb0ad9), {"C44", "Scotch Opening, Goering Gambit"}}, {Q_UINT64_C(0x4112df7bd300d6e7), {"C45", "Scotch Opening"}}, {Q_UINT64_C(0x835abfacd561ff47), {"C46", "Three Knights' Game"}}, {Q_UINT64_C(0xd8b48b59789bbed1), {"C47", "Four Knights' Game"}}, {Q_UINT64_C(0x1328ba7f31d73091), {"C47", "Four Knights' Game"}}, {Q_UINT64_C(0x2a922c1ee3af79fc), {"C47", "Four Knights' Game"}}, {Q_UINT64_C(0x1d81a4f369529393), {"C47", "Scotch Four Knights' Game"}}, {Q_UINT64_C(0xe16bf32cbc1815a8), {"C47", "Scotch Four Knights' Game"}}, {Q_UINT64_C(0x46ea005db768f8d3), {"C47", "Belgrade Gambit"}}, {Q_UINT64_C(0xb39add5c411359b7), {"C47", "Four Knights' Game"}}, {Q_UINT64_C(0xeb6a5af61d0f2d52), {"C48", "Four Knights' Game"}}, {Q_UINT64_C(0x3c173617a34b6df3), {"C48", "Four Knights' Game, Rubinstein Variation"}}, {Q_UINT64_C(0x222b33f056f8e570), {"C49", "Four Knights' Game"}}, {Q_UINT64_C(0x1b7e13263fc0ab38), {"C50", ""}}, {Q_UINT64_C(0xfb260c9f56b07a9), {"C50", "Hungarian Defense"}}, {Q_UINT64_C(0xb663577df5f241bb), {"C50", "Giuoco Piano"}}, {Q_UINT64_C(0x1c9622d153442d9f), {"C51", "Evans Gambit"}}, {Q_UINT64_C(0x768c3ac4890df01b), {"C52", "Evans Gambit"}}, {Q_UINT64_C(0x976dca2683dd88cc), {"C52", "Evans Gambit, Compromised Defense"}}, {Q_UINT64_C(0xc0b9afe525824e3d), {"C53", "Giuoco Piano"}}, {Q_UINT64_C(0x9b579b1088780fab), {"C54", "Giuoco Piano"}}, {Q_UINT64_C(0x35f358c5cce8b47f), {"C54", "Giuoco Piano"}}, {Q_UINT64_C(0xc49cea41e90fd12), {"C54", "Giuoco Piano"}}, {Q_UINT64_C(0x78945827b73acfe9), {"C54", "Giuoco Piano"}}, {Q_UINT64_C(0x69aa6b7439623ada), {"C54", "Giuoco Piano, Moeller Attack"}}, {Q_UINT64_C(0x409027d3923aeaae), {"C55", "Two Knights' Defense"}}, {Q_UINT64_C(0x835212bee81e96ad), {"C55", "Boden Gambit"}}, {Q_UINT64_C(0xee34e406d6aa517a), {"C55", "Two Knights' Defense"}}, {Q_UINT64_C(0x1edb02fb4788d3f9), {"C55", "Two Knights' Defense"}}, {Q_UINT64_C(0xcdb33d94f149e26a), {"C55", "Two Knights' Defence"}}, {Q_UINT64_C(0x729c587ce06a28d6), {"C55", "Two Knights' Defense"}}, {Q_UINT64_C(0xdd1937963dacaffa), {"C56", "Two Knights' Defense"}}, {Q_UINT64_C(0x1642c6063bf6120a), {"C57", "Two Knights' Defense"}}, {Q_UINT64_C(0xbb5f825df1c4f889), {"C57", "Two Knights' Defense, Traxler Gambit"}}, {Q_UINT64_C(0xd4f3844ae6e0a317), {"C57", "Two Knights' Defense, Ulvestad Variation"}}, {Q_UINT64_C(0x638a82bec3095e8b), {"C57", "Two Knights' Defense, Fritz Variation"}}, {Q_UINT64_C(0x5414e11a976477cc), {"C57", "Two Knights' Defense, Fried Liver Attack"}}, {Q_UINT64_C(0x276dd2be9896e616), {"C57", "Two Knights' Defense, Pincus Variation"}}, {Q_UINT64_C(0xe1e0c4aad071bc20), {"C58", "Two Knights' Defense"}}, {Q_UINT64_C(0x30dc3abcf7a80833), {"C58", "Two Knights' Defense, Colman var."}}, {Q_UINT64_C(0x26d4332e603fe217), {"C59", ""}}, {Q_UINT64_C(0x4b1376a17217ee1d), {"C60", "Ruy Lopez"}}, {Q_UINT64_C(0xa2a725fa09987c56), {"C60", "Ruy Lopez, Smyslov Defense"}}, {Q_UINT64_C(0x755cca1cc99e65a0), {"C60", "Ruy Lopez, Cozio Defense"}}, {Q_UINT64_C(0x9c6e1a40cc53aebc), {"C61", "Ruy Lopez, Bird's Defense"}}, {Q_UINT64_C(0x72a9e0c0a06fa770), {"C62", "Ruy Lopez, Old Steinitz Defense"}}, {Q_UINT64_C(0xdf7c1038cc9fc3c3), {"C63", "Ruy Lopez, Schliemann Defense"}}, {Q_UINT64_C(0xe60e32fab825049e), {"C64", "Ruy Lopez, Classical Defense"}}, {Q_UINT64_C(0x4bbacfbd6dd26c6), {"C64", "Ruy Lopez, Classical, Cordel Gambit"}}, {Q_UINT64_C(0x10fd4254dfedaf8b), {"C65", "Ruy Lopez, Berlin Defense"}}, {Q_UINT64_C(0x5732af0171663df6), {"C66", "Ruy Lopez, Berlin Defense"}}, {Q_UINT64_C(0xd33f7739a5c9d388), {"C67", "Ruy Lopez, Berlin Defense"}}, {Q_UINT64_C(0xc8cbbdb43361c6fa), {"C68", "Ruy Lopez, Exchange Variation"}}, {Q_UINT64_C(0x35028f47dea98b8a), {"C68", "Ruy Lopez, Exchange Var., Bronstein"}}, {Q_UINT64_C(0x4c3be29eec5b90ea), {"C69", "Ruy Lopez, Exchange Variation"}}, {Q_UINT64_C(0xa8e7c91161416feb), {"C70", "Ruy Lopez"}}, {Q_UINT64_C(0x915d5f70b3392686), {"C71", "Ruy Lopez, Modern Steinitz Defense"}}, {Q_UINT64_C(0xef282444cfcafd96), {"C72", "Ruy Lopez, Modern Steinitz Defense"}}, {Q_UINT64_C(0x8c24cc14dccc3f6), {"C73", "Ruy Lopez, Modern Steinitz Defense"}}, {Q_UINT64_C(0xe787a7e863492900), {"C74", "Ruy Lopez, Modern Steinitz Defense"}}, {Q_UINT64_C(0x73e8c171ddc104de), {"C74", "Ruy Lopez, Siesta Variation"}}, {Q_UINT64_C(0x54659bab913f931), {"C75", "Ruy Lopez, Modern Steinitz Defense"}}, {Q_UINT64_C(0x29c7254bd3554638), {"C76", "Ruy Lopez, Modern Steinitz Defense"}}, {Q_UINT64_C(0xf309fde4ccbb2e7d), {"C77", "Ruy Lopez"}}, {Q_UINT64_C(0x5dad3e31882b95a9), {"C77", "Ruy Lopez"}}, {Q_UINT64_C(0xfc83b9681b1a6591), {"C77", "Ruy Lopez"}}, {Q_UINT64_C(0xfb790393f1ac4109), {"C77", "Ruy Lopez"}}, {Q_UINT64_C(0x8d7c86d0b048f56d), {"C78", "Ruy Lopez"}}, {Q_UINT64_C(0xed78ecc52be54850), {"C78", "Ruy Lopez"}}, {Q_UINT64_C(0xd54b90dc4170e29), {"C78", "Ruy Lopez, Archangelsk Variation"}}, {Q_UINT64_C(0x10d9b5d27c774b31), {"C78", "Ruy Lopez, Archangelsk Variation"}}, {Q_UINT64_C(0xb4c610b16230bc00), {"C79", "Ruy Lopez"}}, {Q_UINT64_C(0x30cbc889b69f527e), {"C80", "Ruy Lopez, Open"}}, {Q_UINT64_C(0xf85db8a83a0554ce), {"C80", "Ruy Lopez, Open"}}, {Q_UINT64_C(0x1e0f50da334bf239), {"C81", "Ruy Lopez, Open, Howell Attack"}}, {Q_UINT64_C(0xfed32760ad7fa63b), {"C82", "Ruy Lopez, Open"}}, {Q_UINT64_C(0x53ce633b674d4cb8), {"C82", "Ruy Lopez, Open"}}, {Q_UINT64_C(0xaa0db59fdb0e488), {"C82", "Ruy Lopez, Open"}}, {Q_UINT64_C(0x1a30d2c6f63a7e29), {"C82", "Ruy Lopez, Open"}}, {Q_UINT64_C(0xf0c7fc282d56d881), {"C82", "Ruy Lopez, Open, Dilworth Variation"}}, {Q_UINT64_C(0xefca1293c91d2b8), {"C82", "Ruy Lopez, Open"}}, {Q_UINT64_C(0xea09b4416f683fa5), {"C82", "Ruy Lopez, Open"}}, {Q_UINT64_C(0xea1f548f67d40aaa), {"C83", "Ruy Lopez, Open"}}, {Q_UINT64_C(0x9917ef63e6ee1124), {"C83", "Ruy Lopez, Open"}}, {Q_UINT64_C(0xb371ecedfd29a29a), {"C83", "Ruy Lopez, Open"}}, {Q_UINT64_C(0x30bb25677d90335d), {"C83", "Ruy Lopez, Open"}}, {Q_UINT64_C(0x422cb50b50b908b4), {"C83", "Ruy Lopez, Open"}}, {Q_UINT64_C(0x99b0f53f7ae359fc), {"C84", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0x5c85da956b2a74be), {"C84", "Ruy Lopez, Center Attack"}}, {Q_UINT64_C(0x363cd24edd72033f), {"C84", "Ruy Lopez, Center Attack"}}, {Q_UINT64_C(0xc4a741032d6086c6), {"C84", "Ruy Lopez, Center Attack"}}, {Q_UINT64_C(0xa682c6eaab4f46cf), {"C84", "Ruy Lopez, Center Attack"}}, {Q_UINT64_C(0x379a85671ec6ef9b), {"C85", "Ruy Lopez, Delayed Exchange"}}, {Q_UINT64_C(0xfb67a1d34a70278), {"C86", "Ruy Lopez, Worrall Attack"}}, {Q_UINT64_C(0x24be6dd52f33bb85), {"C87", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0x265611607b7408ab), {"C87", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0x2dbc8cedfb46a637), {"C88", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0x2714615a2e1f4fdc), {"C88", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0x1d89fa1e7746c8b6), {"C88", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0x4cdd1fb6438c9a12), {"C88", "Ruy Lopez, Anti-Marshall"}}, {Q_UINT64_C(0xd4a4bbd662bb0e7c), {"C89", "Ruy Lopez, Marshall Gambit"}}, {Q_UINT64_C(0x1191947c7372233e), {"C89", "Ruy Lopez, Marshall Gambit"}}, {Q_UINT64_C(0x68740fa32c170937), {"C90", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0xc6d0cc766887b2e3), {"C90", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0x93c7e683c5bb10e9), {"C90", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0xad4120093dde2475), {"C91", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0x8087d21deeb4c0c5), {"C92", "Ruy Lopez, Closed"}}, {Q_UINT64_C(0x30179a999ce66f5e), {"C92", "Ruy Lopez, Zaitsev Variation"}}, {Q_UINT64_C(0x1270997b796089d0), {"C93", "Ruy Lopez, Smyslov System"}}, {Q_UINT64_C(0x86b6ba1c0a8f45b1), {"C93", "Ruy Lopez, Smyslov System"}}, {Q_UINT64_C(0x2b6a0affff2565c6), {"C94", "Ruy Lopez, Breyer Variation"}}, {Q_UINT64_C(0xee5f2555eeec4884), {"C95", "Ruy Lopez, Breyer Variation"}}, {Q_UINT64_C(0xd590f8e8438862cf), {"C96", "Ruy Lopez, Chigorin Variation"}}, {Q_UINT64_C(0x25a99e6fdada2343), {"C96", "Ruy Lopez, Chigorin Variation"}}, {Q_UINT64_C(0x61af0cb03b51a101), {"C96", "Ruy Lopez, Chigorin Variation"}}, {Q_UINT64_C(0xf25f4a581f4a7d), {"C97", "Ruy Lopez, Chigorin Variation"}}, {Q_UINT64_C(0xc8bcddd6fde4047), {"C98", "Ruy Lopez, Chigorin Variation"}}, {Q_UINT64_C(0xaa348851dbbe87ad), {"C99", "Ruy Lopez, Chigorin Variation"}}, {Q_UINT64_C(0x6649ba69b8c9ff8), {"D00", "Queen Pawn"}}, {Q_UINT64_C(0xdd307d2702ec759b), {"D00", "Queen Pawn, Mason Variation"}}, {Q_UINT64_C(0x7d795b079c723d8a), {"D00", "Queen Pawn"}}, {Q_UINT64_C(0xc26396ee700c22f2), {"D00", "Blackmar-Diemer Gambit"}}, {Q_UINT64_C(0x621abab91f14e1bd), {"D00", "Blackmar-Diemer Gambit"}}, {Q_UINT64_C(0xaa9025b0d6ed51ed), {"D00", "Blackmar-Diemer Gambit"}}, {Q_UINT64_C(0xc9bd95bd49732ab6), {"D00", "Blackmar-Diemer Gambit"}}, {Q_UINT64_C(0xa8fb02780de81d30), {"D00", "BDG: Ryder Gambit"}}, {Q_UINT64_C(0x621abab91f14e1bd), {"D00", "BDG: Huebsch Gambit"}}, {Q_UINT64_C(0xe862b2f38cf1198b), {"D00", "BDG: Lemberger Counter-Gambit"}}, {Q_UINT64_C(0xbfca678c5151bae4), {"D00", "BDG: Euwe Defense"}}, {Q_UINT64_C(0x5bc778523eb3f90d), {"D00", "BDG: Ziegler Defense"}}, {Q_UINT64_C(0x2009c6e632fcb8fd), {"D00", "BDG: Bogoljubow Defense"}}, {Q_UINT64_C(0xcb6e5f8f0ef6245c), {"D00", "BDG: Teichmann Defense"}}, {Q_UINT64_C(0xff46a1c1162bc3ec), {"D00", "Morris Gambit"}}, {Q_UINT64_C(0xa61db7f1f4945cb7), {"D01", "Veresov Opening"}}, {Q_UINT64_C(0x6047e0c7441e877f), {"D01", "Veresov Opening"}}, {Q_UINT64_C(0x86363169bb598c02), {"D01", "Veresov Opening"}}, {Q_UINT64_C(0xdd007750f36afec5), {"D02", "Queen Pawn"}}, {Q_UINT64_C(0x5dbaa524c7f05530), {"D02", "Queen Pawn, London System"}}, {Q_UINT64_C(0x16e636381ce8d6e9), {"D02", "Queen Pawn, London System"}}, {Q_UINT64_C(0x599c656cdf0c60e0), {"D02", "Queen Pawn, London System"}}, {Q_UINT64_C(0x86e015a7fb8d4dc6), {"D02", "Queen Pawn, London System"}}, {Q_UINT64_C(0xd8e2cb360dea06b9), {"D02", "Queen Pawn"}}, {Q_UINT64_C(0x40b41493ee1a649b), {"D03", "Queen Pawn"}}, {Q_UINT64_C(0x36c3e6a2f638f4c9), {"D03", "Torre Attack"}}, {Q_UINT64_C(0x9beea410d2677c6d), {"D03", "Torre Attack"}}, {Q_UINT64_C(0x7d9f75be2d207710), {"D03", "Torre Attack"}}, {Q_UINT64_C(0x2bc301177acf37f7), {"D04", "Queen Pawn"}}, {Q_UINT64_C(0x5db4f32662eda7a5), {"D05", "Colle System"}}, {Q_UINT64_C(0x8b952845b6d65d6), {"D05", "Colle System"}}, {Q_UINT64_C(0x3b5020fcc94810b8), {"D05", "Colle System"}}, {Q_UINT64_C(0xa35e834338715877), {"D05", "Colle System"}}, {Q_UINT64_C(0x8a470482d88334ff), {"D06", "Queen's Gambit"}}, {Q_UINT64_C(0x95e6d0c6f663d72), {"D06", "QGD, Keres Defense"}}, {Q_UINT64_C(0x5fda6b69dd404ec4), {"D06", "QGD, Keres Defense"}}, {Q_UINT64_C(0x21aadc60c91291fc), {"D07", "QGD, Chigorin Defense"}}, {Q_UINT64_C(0x3f0cc84b66ccc9), {"D08", "Albin Counter Gambit"}}, {Q_UINT64_C(0x22a016b116cc4d58), {"D09", ""}}, {Q_UINT64_C(0x183de96daf43e744), {"D10", "Slav Defense"}}, {Q_UINT64_C(0xe3aaf1cf6da1659d), {"D10", "Slav Defense"}}, {Q_UINT64_C(0x69d2f985fe449dab), {"D10", "Slav Winawer Counter Gambit"}}, {Q_UINT64_C(0xeb2ada825145bc85), {"D10", "Slav Defense"}}, {Q_UINT64_C(0xc359059bc7a58679), {"D11", "Slav Defense"}}, {Q_UINT64_C(0x98b7316e6a5fc7ef), {"D11", "Slav Defense"}}, {Q_UINT64_C(0xb6831a52f9e546c6), {"D12", "Slav Defense"}}, {Q_UINT64_C(0xe5ed05ea68fbde48), {"D13", "Slav Defense, Exchange Variation"}}, {Q_UINT64_C(0x1e7a1d48aa195c91), {"D13", "Slav Defense, Exchange Variation"}}, {Q_UINT64_C(0xbda08ae5467e3da6), {"D14", "Slav Defense, Exchange Variation"}}, {Q_UINT64_C(0xa16a4759ec8f5b03), {"D14", "Slav Defense, Exchange Variation"}}, {Q_UINT64_C(0x632029cca8bd4536), {"D15", "Slav Defense"}}, {Q_UINT64_C(0x75211db6110316df), {"D15", "Slav Defense, Geller Gambit"}}, {Q_UINT64_C(0x9fe3f303dc273cc3), {"D15", "Slav Defense"}}, {Q_UINT64_C(0xdaef6e1297107e1b), {"D16", "Slav Defense"}}, {Q_UINT64_C(0x59f6079c20f57796), {"D17", "Slav Defense"}}, {Q_UINT64_C(0xf4db452e04aaff32), {"D18", "Slav Defense"}}, {Q_UINT64_C(0x4d5774db19058a8c), {"D19", "Slav Defense"}}, {Q_UINT64_C(0x7fddaaed90b1d125), {"D19", "Slav Defense"}}, {Q_UINT64_C(0x58413db08abdda1c), {"D20", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x8325d146e25bbb21), {"D21", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0xf5522377fa792b73), {"D21", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0xfcff62072124cb59), {"D22", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0xd8cbe5b34fa1fab7), {"D23", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0xa6f58fc8f9f08cc), {"D23", "QGA, Mannheim Variation"}}, {Q_UINT64_C(0x878fb26f555f1a47), {"D23", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x86dd170ce921a32f), {"D23", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x235cfd118d43786e), {"D24", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x552b0f209561e83c), {"D24", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x75e6a7016bfe7213), {"D25", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x47c5f4ae29eadf61), {"D25", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x391553073dce241), {"D26", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x458f93aef7f5486e), {"D26", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x4b726c94419b853c), {"D27", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0xad03bd3abedc8e41), {"D27", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x6407ad1835fadea5), {"D27", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0xc6cac3d6d34f5b8f), {"D27", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0xde75def661d2a8a9), {"D27", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x3b053218f098d5c5), {"D28", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x95696b2dd5d1f924), {"D28", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0xb7b984db8464f22), {"D28", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x3856ba3538da038c), {"D28", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0x229500ab92419787), {"D29", "Queen's Gambit Accepted"}}, {Q_UINT64_C(0xfc30f6b3c0a1a4ad), {"D30", "Queen's Gambit Declined"}}, {Q_UINT64_C(0xef7892f50e99a952), {"D30", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x8f7cf8e09534146f), {"D30", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x7a7ee1102432674), {"D31", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x51da0eb69e0348c5), {"D31", "Slav Defense, Marshall Gambit"}}, {Q_UINT64_C(0x9cbfd63a4f5b7a11), {"D31", "Semi-Slav Defense"}}, {Q_UINT64_C(0x15fa33eadf3e1d7d), {"D31", ""}}, {Q_UINT64_C(0xe1d63fbffd042d09), {"D32", "Tarrasch Defense"}}, {Q_UINT64_C(0xb0e21e47223e50d2), {"D32", "Tarrasch Defense, von Henning-Schara Gambit"}}, {Q_UINT64_C(0xd0e87db6456ff9df), {"D32", "Tarrasch Defense"}}, {Q_UINT64_C(0xb8c91402d8998e2), {"D32", "Tarrasch Defense"}}, {Q_UINT64_C(0xbf37f77066b64c89), {"D32", "Tarrasch Defense"}}, {Q_UINT64_C(0x8c87f2e3dccfe5d9), {"D33", "Tarrasch Defense"}}, {Q_UINT64_C(0x76559684f673d0a7), {"D34", "Tarrasch Defense, Prague Variation"}}, {Q_UINT64_C(0x6a78272fe06f3e6e), {"D34", "Tarrasch Defense, Prague Variation"}}, {Q_UINT64_C(0xc4d25731ef533994), {"D34", "Tarrasch Defense, Prague Variation"}}, {Q_UINT64_C(0x5c49dae4afb967e2), {"D35", "Queen's Gambit Declined"}}, {Q_UINT64_C(0xb613741b7f34d209), {"D35", "QGD, Exchange Variation"}}, {Q_UINT64_C(0xab2dcfdba75868fc), {"D35", "QGD, Exchange Variation"}}, {Q_UINT64_C(0x39572234d098bb47), {"D35", "QGD, Exchange Variation"}}, {Q_UINT64_C(0xd8a59aafa3936e36), {"D35", "QGD, Exchange Variation"}}, {Q_UINT64_C(0xccde0428713c061d), {"D35", "QGD, Exchange Variation"}}, {Q_UINT64_C(0x8cdb26bfd7a374ef), {"D35", "QGD, Exchange Variation"}}, {Q_UINT64_C(0x506703248c9f56fa), {"D35", "QGD, Exchange Variation"}}, {Q_UINT64_C(0x884e5029c24e8723), {"D36", "QGD, Exchange Variation"}}, {Q_UINT64_C(0xbbad2b7422e66aef), {"D36", "QGD, Exchange Variation"}}, {Q_UINT64_C(0x60c9c7824a000bd2), {"D36", "QGD, Exchange Variation"}}, {Q_UINT64_C(0xd928f6dfa4f42fe7), {"D36", "QGD, Exchange Variation"}}, {Q_UINT64_C(0x5741bb8bf5928ca9), {"D36", "QGD, Exchange Variation"}}, {Q_UINT64_C(0x868dbaca482d047f), {"D36", "QGD, Exchange Variation"}}, {Q_UINT64_C(0xac7726d87a28dd40), {"D36", "QGD, Exchange Variation"}}, {Q_UINT64_C(0x872d3612c75f06df), {"D37", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x421d4ecb41cda9c6), {"D37", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x387f9fde22befec9), {"D37", "QGD, Exchange Variation"}}, {Q_UINT64_C(0x73a11080fec097ec), {"D38", "QGD, Ragozin Variation"}}, {Q_UINT64_C(0x4e6c5f148ca8cefd), {"D38", "QGD, Ragozin Variation"}}, {Q_UINT64_C(0x883608223c221535), {"D38", "QGD, Ragozin Variation"}}, {Q_UINT64_C(0xbbd5737fdc8af8f9), {"D38", "QGD, Ragozin Variation"}}, {Q_UINT64_C(0x5a3031106e1cfbd6), {"D39", "QGD, Vienna Variation"}}, {Q_UINT64_C(0x9e373c58859c46dc), {"D39", "QGD, Vienna Variation"}}, {Q_UINT64_C(0x615ce7bc38180da2), {"D40", "QGD, Semi-Tarrasch Variation"}}, {Q_UINT64_C(0x2b5f3a26169696e3), {"D40", "QGD, Semi-Tarrasch Variation"}}, {Q_UINT64_C(0x3ff2f1aa61239319), {"D40", "QGD, Semi-Tarrasch Variation"}}, {Q_UINT64_C(0x6f767c719ad619bf), {"D41", "QGD, Semi-Tarrasch Variation"}}, {Q_UINT64_C(0xf098063c253304e3), {"D41", "QGD, Semi-Tarrasch Variation"}}, {Q_UINT64_C(0x956b1c717167c6a9), {"D41", "QGD, Semi-Tarrasch Variation"}}, {Q_UINT64_C(0x6675aec6111982c1), {"D41", "QGD, Semi-Tarrasch Variation"}}, {Q_UINT64_C(0xf6589c6c10fd2944), {"D42", "QGD, Semi-Tarrasch Variation"}}, {Q_UINT64_C(0xa3553dce297deb37), {"D42", "QGD, Semi-Tarrasch Variation"}}, {Q_UINT64_C(0x1557dbfdb09fd564), {"D43", "Semi-Slav Defense"}}, {Q_UINT64_C(0xd30d8ccb00150eac), {"D43", "Semi-Slav Defense"}}, {Q_UINT64_C(0xac818b61a660457b), {"D43", "Semi-Slav Defense"}}, {Q_UINT64_C(0x15f55f80229fc9fc), {"D43", "Semi-Slav Defense"}}, {Q_UINT64_C(0x10bb5f9522be04f), {"D44", "Semi-Slav Defense, Botvinnik Gambit"}}, {Q_UINT64_C(0x6ac2cb153fb83581), {"D44", "Semi-Slav Defense, Botvinnik Gambit"}}, {Q_UINT64_C(0x3556b4ea8d77b76f), {"D44", "Semi-Slav Defense, Botvinnik Gambit"}}, {Q_UINT64_C(0xc09e7fc4272ad92), {"D44", "Semi-Slav Defense, Botvinnik Gambit"}}, {Q_UINT64_C(0xb87a994f94c05dc0), {"D45", "Semi-Slav Defense"}}, {Q_UINT64_C(0x3a80900f66be8c68), {"D45", "Semi-Slav Defense, Anti-Meran"}}, {Q_UINT64_C(0xd055dd92d813beed), {"D45", "Semi-Slav Defense, Anti-Meran"}}, {Q_UINT64_C(0xdb941aa161369978), {"D45", "Semi-Slav Defense, Anti-Meran"}}, {Q_UINT64_C(0xd8aa9a6b7bec4325), {"D45", "Semi-Slav Defense, Anti-Meran"}}, {Q_UINT64_C(0x662accf5a6fd060), {"D45", "Semi-Slav Defense, Anti-Meran"}}, {Q_UINT64_C(0xde9443b04de8727f), {"D46", "Semi-Slav Defense"}}, {Q_UINT64_C(0xff2e4da42ce3fa92), {"D46", "Semi-Slav Defense"}}, {Q_UINT64_C(0xcbd55c2f80249f3f), {"D46", "Semi-Slav Defense"}}, {Q_UINT64_C(0xbf08caac298eadc4), {"D46", "Semi-Slav Defense"}}, {Q_UINT64_C(0x24b4c7f5448340ec), {"D46", "Semi-Slav Defense"}}, {Q_UINT64_C(0xa640f5c6b61e52a2), {"D46", "Semi-Slav Defense"}}, {Q_UINT64_C(0x45284ee920e59f57), {"D47", "Semi-Slav Defense"}}, {Q_UINT64_C(0x252c24fcbb48226a), {"D47", "Semi-Slav Defense, Meran Variation"}}, {Q_UINT64_C(0x5bd45f5877fe1c2d), {"D47", "Semi-Slav, Meran Variation"}}, {Q_UINT64_C(0x39b3e62fe28c4b6a), {"D48", "Semi-Slav Defense, Meran Variation"}}, {Q_UINT64_C(0x5660da565e180bd5), {"D48", "Semi-Slav Defense, Meran Variation"}}, {Q_UINT64_C(0xfa85fdcdb945771b), {"D49", "Semi-Slav Defense, Meran Variation"}}, {Q_UINT64_C(0x9a138dd21f33bc2a), {"D50", "Queen's Gambit Declined"}}, {Q_UINT64_C(0xa9f0f68fff9b51e6), {"D51", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x9db4c312e219fac7), {"D51", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x4dc3b524c4e26bc4), {"D52", "QGD, Cambridge Springs Variation"}}, {Q_UINT64_C(0x8edffe3dd59810bb), {"D53", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x55bb12cbbd7e7186), {"D53", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x56c19e75a78c252a), {"D54", "Queen's Gambit Declined"}}, {Q_UINT64_C(0xf23ebdce4c7810c9), {"D55", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x38770ad4966b3d5), {"D55", "Queen's Gambit Declined"}}, {Q_UINT64_C(0x60c9f6a8dbac59dc), {"D55", "QGD, Tartakover Variation"}}, {Q_UINT64_C(0x3a469e6b28127b47), {"D56", "QGD, Tartakover Variation"}}, {Q_UINT64_C(0x4ed2f49a5bf6bd), {"D56", "QGD, Lasker Defense"}}, {Q_UINT64_C(0xeec36cc8c45017df), {"D57", "QGD, Lasker Defense"}}, {Q_UINT64_C(0x512fd77bd691ccdc), {"D58", "QGD, Tartakover Variation"}}, {Q_UINT64_C(0xc0eb36fbcbbac59d), {"D59", "QGD, Tartakover Variation"}}, {Q_UINT64_C(0xc1ddc693acd0fd05), {"D60", "QGD, Orthodox Defense"}}, {Q_UINT64_C(0x70c4b48ebe06c161), {"D61", "QGD, Orthodox, Rubinstein Variation"}}, {Q_UINT64_C(0xb8bc972bda6caaef), {"D61", "QGD, Orthodox, Rubinstein Variation"}}, {Q_UINT64_C(0x9479672a12b6d77e), {"D61", "QGD, Orthodox, Rubinstein Variation"}}, {Q_UINT64_C(0xe95647f0a25d9d70), {"D62", "QGD, Orthodox"}}, {Q_UINT64_C(0xbe4609de2fc2a9db), {"D63", "QGD, Orthodox"}}, {Q_UINT64_C(0xd52f40ced1411e40), {"D63", "QGD, Orthodox"}}, {Q_UINT64_C(0x92ae51d9572290db), {"D63", "QGD, Orthodox"}}, {Q_UINT64_C(0x9d25962c4ad44604), {"D64", "QGD, Orthodox"}}, {Q_UINT64_C(0x41f8fc120f3aaac5), {"D65", "QGD, Orthodox"}}, {Q_UINT64_C(0x793145936182b813), {"D66", "QGD, Orthodox"}}, {Q_UINT64_C(0x269d9733c24d208e), {"D67", "QGD, Orthodox"}}, {Q_UINT64_C(0x4b71fde35131775f), {"D67", "QGD, Orthodox"}}, {Q_UINT64_C(0x8f46bbe076558abb), {"D68", "QGD, Orthodox"}}, {Q_UINT64_C(0xb967933177d7a46b), {"D69", "QGD, Orthodox"}}, {Q_UINT64_C(0xbd7741389222a904), {"D70", ""}}, {Q_UINT64_C(0x14fbd86dee213f1a), {"D71", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x337116ffd40c34d8), {"D71", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x8073272645a02588), {"D71", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x794b4eae9e4efe32), {"D72", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0xc07bc7e7e534a41f), {"D73", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x2fca5d5384ec764e), {"D74", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0xc9bb8cfd7bab7d33), {"D75", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x651d25c9ca91d00), {"D76", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x562b121c4fda3ada), {"D76", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0xe75797ee59f557fc), {"D76", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0xbe0ebcd399c77f0f), {"D77", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x2c74513cee07acb4), {"D78", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x168df284db3c0452), {"D78", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0xa0d23168348ac7d9), {"D78", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x9e3a1f80ef8ddcf2), {"D78", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x3cc3bf40b792f61b), {"D78", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0xed6d5db82b9dd9d7), {"D78", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x512e65b8eca3b513), {"D79", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0x1f650e46deec2ee), {"D79", "Gruenfeld Defense, Fianchetto Variation"}}, {Q_UINT64_C(0xc38a7b8ecc1465fb), {"D80", "Gruenfeld Defense"}}, {Q_UINT64_C(0x5d02cb87c9ebe33), {"D80", "Gruenfeld Defense"}}, {Q_UINT64_C(0xf973d836f92fcd1d), {"D81", "Gruenfeld Defense"}}, {Q_UINT64_C(0x18de9d0f55748f98), {"D82", "Gruenfeld Defense, 4. Bf4"}}, {Q_UINT64_C(0xfe70fbc5f35257d), {"D83", "Gruenfeld Gambit"}}, {Q_UINT64_C(0xa08f71815daca1db), {"D84", "Gruenfeld Gambit"}}, {Q_UINT64_C(0x524e9a0ed13f6cba), {"D85", "Gruenfeld, Exchange Variation"}}, {Q_UINT64_C(0x32f2da2bc4f28d7c), {"D85", "Gruenfeld, Exchange Variation"}}, {Q_UINT64_C(0x8a2582f584573ae7), {"D86", "Gruenfeld, Exchange Variation"}}, {Q_UINT64_C(0x725855238662d58f), {"D87", "Gruenfeld, Exchange Variation"}}, {Q_UINT64_C(0xaabd362d16c96b02), {"D87", "Gruenfeld, Exchange Variation"}}, {Q_UINT64_C(0x276022607366d5f2), {"D88", "Gruenfeld, Exchange Variation"}}, {Q_UINT64_C(0xd07d17b687f107bf), {"D89", "Gruenfeld, Exchange Variation"}}, {Q_UINT64_C(0x18ee9778a4f204c6), {"D90", "Gruenfeld Defense"}}, {Q_UINT64_C(0xa852aace5fb5cf6c), {"D90", "Gruenfeld Defense"}}, {Q_UINT64_C(0x7af617819f8b3d17), {"D90", "Gruenfeld Defense, Flohr Variation"}}, {Q_UINT64_C(0x6e08fdf8ef3f14a4), {"D91", "Gruenfeld Defense"}}, {Q_UINT64_C(0x73064c4fc6d5250f), {"D92", "Gruenfeld Defense"}}, {Q_UINT64_C(0xd483e34a37d34440), {"D93", "Gruenfeld Defense"}}, {Q_UINT64_C(0x35798d5c4136dd58), {"D93", "Gruenfeld Defense"}}, {Q_UINT64_C(0xf7e07cb852c5ab9f), {"D93", "Gruenfeld Defense"}}, {Q_UINT64_C(0x57fe87c7bea47c8), {"D94", "Gruenfeld Defense"}}, {Q_UINT64_C(0x970505930c2a9473), {"D94", "Slav Defense, Schlecter Variation"}}, {Q_UINT64_C(0x905810e9a4a5ec2b), {"D94", "Slav Defense, Schlecter Variation"}}, {Q_UINT64_C(0x352ea6739b8806c5), {"D95", "Gruenfeld Defense"}}, {Q_UINT64_C(0x92ab09766a8e678a), {"D96", "Gruenfeld Defense, Classical Variation"}}, {Q_UINT64_C(0xa11f4cadad02beaa), {"D97", "Gruenfeld Defense, Classical Variation"}}, {Q_UINT64_C(0x3365a142dac26d11), {"D97", "Gruenfeld Defense, Boleslavsky System"}}, {Q_UINT64_C(0xef9fe73d2bfd2216), {"D97", "Gruenfeld Defense, Prins System"}}, {Q_UINT64_C(0xa3cc869fea87b040), {"D98", "Gruenfeld Defense, Smyslov System"}}, {Q_UINT64_C(0x814ca588eccd530e), {"D99", "Gruenfeld Defense, Smyslov System"}}, {Q_UINT64_C(0xe525b1311587325), {"E00", "Catalan"}}, {Q_UINT64_C(0x3ec85a7ac061e57a), {"E01", "Catalan"}}, {Q_UINT64_C(0x255f846c07366317), {"E01", "Catalan, Closed"}}, {Q_UINT64_C(0x629744fc128bbabc), {"E01", "Catalan"}}, {Q_UINT64_C(0xb58f47b9f8e76bef), {"E01", "Catalan"}}, {Q_UINT64_C(0x9dbff602bf9a0423), {"E01", "Catalan"}}, {Q_UINT64_C(0xd7a35fea8d422688), {"E01", "Catalan"}}, {Q_UINT64_C(0xecce6348925f0b99), {"E02", "Catalan, Open Varation"}}, {Q_UINT64_C(0x3e6ade075261f9e2), {"E02", "Catalan, Open Variation"}}, {Q_UINT64_C(0xd6ed49acda2f7513), {"E02", "Catalan, Open Variation"}}, {Q_UINT64_C(0xcac927bbeca72d91), {"E03", "Catalan, Open Variation"}}, {Q_UINT64_C(0x37aa8fbefab96aa4), {"E04", "Catalan, Open Variation"}}, {Q_UINT64_C(0x13245421712b8d9a), {"E04", "Catalan, Open Variation"}}, {Q_UINT64_C(0x2366fc513012c635), {"E05", "Catalan, Open Variation"}}, {Q_UINT64_C(0x57bb6ad299b8f4ce), {"E05", "Catalan, Open Variation"}}, {Q_UINT64_C(0xe6a218cf8b6ec8aa), {"E05", "Catalan, Open Variation"}}, {Q_UINT64_C(0x2a0429950aca49eb), {"E06", "Catalan, Closed Variation"}}, {Q_UINT64_C(0x4ad15ac9a5a3fd59), {"E06", "Catalan, Closed Variation"}}, {Q_UINT64_C(0x5f3076759743e4), {"E06", "Catalan, Closed Variation"}}, {Q_UINT64_C(0xa2a690b62d88690d), {"E06", "Catalan, Closed Variation"}}, {Q_UINT64_C(0xb65e28bd2b2ef7e1), {"E07", "Catalan, Closed Variation"}}, {Q_UINT64_C(0x7475aa039f8cb85), {"E08", "Catalan, Closed Variation"}}, {Q_UINT64_C(0xf4c29d61f12db3fe), {"E08", "Catalan, Closed Variation"}}, {Q_UINT64_C(0xe25d03ad53fdbc8e), {"E08", "Catalan, Closed Variation"}}, {Q_UINT64_C(0xcc530f2dd4c5b00e), {"E09", "Catalan, Closed Variation"}}, {Q_UINT64_C(0x24f09e887676f2e9), {"E09", "Catalan, Closed Variation"}}, {Q_UINT64_C(0xcc530f2dd4c5b00e), {"E09", "Catalan, Closed Variation"}}, {Q_UINT64_C(0xf9d00ca49969ca20), {"E10", ""}}, {Q_UINT64_C(0x203bb97c5f6ac6db), {"E10", "Catalan, Closed"}}, {Q_UINT64_C(0xc5adf44c64a5ea3d), {"E10", "Blumenfeld Counter Gambit"}}, {Q_UINT64_C(0x309165a2d29e0202), {"E11", "Bogo-Indian Defense"}}, {Q_UINT64_C(0x9f068ad623636596), {"E11", "Bogo-Indian Defense"}}, {Q_UINT64_C(0xff6deeb9bfb8627b), {"E11", "Bogo-Indian Defense"}}, {Q_UINT64_C(0x991dfcf7ae9d941c), {"E11", " "}}, {Q_UINT64_C(0xb090a6423cfcff18), {"E11", " "}}, {Q_UINT64_C(0x203bb97c5f6ac6db), {"E11", " "}}, {Q_UINT64_C(0xa4adb691b44df6bf), {"E11", "Bogo-Indian Defense"}}, {Q_UINT64_C(0x115d95ecf9a02ec6), {"E11", " "}}, {Q_UINT64_C(0xb018a0b93d68622e), {"E11", " "}}, {Q_UINT64_C(0xfdf08bceb64137c6), {"E11", "Bogo-Indian Defense"}}, {Q_UINT64_C(0x1e9561bc7718cd16), {"E11", "Bogo-Indian Defense"}}, {Q_UINT64_C(0x994d6c847544672f), {"E11", "Bogo-Indian Defense"}}, {Q_UINT64_C(0x75a6e6f2b71768b0), {"E11", "Bogo-Indian Defense"}}, {Q_UINT64_C(0x92b945b467ea7dbb), {"E12", "Queen's Indian Defense, Petrosian"}}, {Q_UINT64_C(0xd9be1592d75a50f9), {"E12", "Queen's Indian Defense, Petrosian"}}, {Q_UINT64_C(0xf558aed3378d88c1), {"E12", "Queen's Indian Defense, Petrosian"}}, {Q_UINT64_C(0xd6a52ba22c274313), {"E13", "Queen's Indian Defense"}}, {Q_UINT64_C(0x1edd0807484d289d), {"E13", "Queen's Indian Defense"}}, {Q_UINT64_C(0x3f94070643b5f51f), {"E14", "Queen's Indian Defense"}}, {Q_UINT64_C(0x8f044f8231e75a84), {"E14", "Queen's Indian Defense"}}, {Q_UINT64_C(0xafbbd66292bf950d), {"E14", "Queen's Indian Defense"}}, {Q_UINT64_C(0x418f13eea9848444), {"E14", "Queen's Indian Defense"}}, {Q_UINT64_C(0x420d44ba8bd3489a), {"E14", "Queen's Indian Defense"}}, {Q_UINT64_C(0x56c137554178e40b), {"E14", "Queen's Indian Defense"}}, {Q_UINT64_C(0xe09232f5c9f993a2), {"E14", "Queen's Indian Defense"}}, {Q_UINT64_C(0xbe5ffef5873da583), {"E15", "Queen's Indian Defense"}}, {Q_UINT64_C(0x714fac11cc1ca77d), {"E15", "Queen's Indian, Classical Variation"}}, {Q_UINT64_C(0xbb3f950cb882d261), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0x5d4e44a247c5d91c), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0x3e55b71824569c47), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0x2b1044686988b273), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0xdaa7f0ff5cf6ceae), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0x5bf3a6bf61147147), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0xbd7e14a8d9699643), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0xdde9137e02887dd7), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0x853f825e8d8d1224), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0x17456fb1fa4dc19f), {"E16", "Queen's Indian Defense"}}, {Q_UINT64_C(0xaff3e6e372297ef0), {"E17", "Queen's Indian Defense"}}, {Q_UINT64_C(0x5464fe41b0cbfc29), {"E17", "Queen's Indian Defense"}}, {Q_UINT64_C(0xdb2e7060db834c0b), {"E17", "Queen's Indian Defense"}}, {Q_UINT64_C(0x20b968c21961ced2), {"E18", "Queen's Indian Defense"}}, {Q_UINT64_C(0x1903fea3cb1987bf), {"E18", "Queen's Indian Defense"}}, {Q_UINT64_C(0x67f58112d9c77725), {"E18", "Queen's Indian Defense"}}, {Q_UINT64_C(0x1ab1245dab284328), {"E18", "Queen's Indian Defense"}}, {Q_UINT64_C(0x112d0f4c12e768cd), {"E18", "Queen's Indian Defense"}}, {Q_UINT64_C(0xaba85640b9fe7f4c), {"E19", "Queen's Indian Defense"}}, {Q_UINT64_C(0x2910a3204606afc5), {"E19", "Queen's Indian Defense"}}, {Q_UINT64_C(0x106291f6789ae1e6), {"E20", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x3c842ab7984d39de), {"E20", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x19117ef0fec539e), {"E20", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x391bf0876329a876), {"E20", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xb39fa58dab5ba75), {"E20", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xaa7ccf0d1e7df69d), {"E20", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x6b6c6699c2d466a), {"E20", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xddd22a9ff4cb2757), {"E20", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xcb067d00107c80db), {"E21", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x3c19c7d57c7a40e3), {"E21", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x89e9e4a83197989a), {"E21", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x2a9b324e4da14900), {"E22", "Nimzo-Indian, Spielmann Variation"}}, {Q_UINT64_C(0x18e419d2406bb012), {"E23", ""}}, {Q_UINT64_C(0xb112b1e78132d2ec), {"E24", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x39d28678debf36e0), {"E24", "Nimzo-Indian, Saemisch Variation"}}, {Q_UINT64_C(0xb2923fa1e0a56cdb), {"E25", ""}}, {Q_UINT64_C(0xfa4e22fb5a2a5135), {"E26", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xbbba5c50546b3b07), {"E27", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xd50bba61f4a1d476), {"E27", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x16971ee27034b3a3), {"E28", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xe06b60ca762dfae), {"E29", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xd638c6c0c8103a2e), {"E30", "Nimzo-Indian, Leningrad Variation"}}, {Q_UINT64_C(0x7b83e1f9186385ed), {"E31", ""}}, {Q_UINT64_C(0xa17be3eb6a4cdd82), {"E32", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0x461df8532ee73266), {"E32", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0xa963b097bdd7881), {"E33", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0x5498f5eb8fef579a), {"E33", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0x2411c1fff69893a4), {"E34", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0x152f83f64ef34772), {"E35", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0xef8df0d9bfd41de4), {"E36", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0xe249c99f81c0d1bb), {"E37", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0x470a3245950bd6ff), {"E38", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0x3241fd22a34e6878), {"E39", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0xf9ddcc04ea02e638), {"E39", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0xe92511d4cba80945), {"E39", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0x873d74b1e10734e6), {"E39", "Nimzo-Indian, Classical Variation"}}, {Q_UINT64_C(0xbd4fd3445cc56942), {"E40", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x5b3e02eaa382623f), {"E41", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xa5de7baa8b93054f), {"E41", "Nimzo-Indian, Huebner Variation"}}, {Q_UINT64_C(0x4f9ae9258ba96fc1), {"E42", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xef6f91133c66561a), {"E42", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xd6269a54a246ded9), {"E43", "Nimzo-Indian Defense, Fischer Var."}}, {Q_UINT64_C(0x7a73d8a9d79feb8a), {"E43", "Nimzo-Indian Defense, Fischer Var."}}, {Q_UINT64_C(0x83e868cf2742efc), {"E43", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0x2218eeac298b86aa), {"E43", "Nimzo-Indian Defense"}}, {Q_UINT64_C(0xc282719b8a6dd327), {"E44", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0xd92237fc14cd1d9), {"E45", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0xb7e73ef3899c80a9), {"E46", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0xe2ea9f51b01c42da), {"E47", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0x6780bd452cc80cfc), {"E48", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0xdcdb519bc6f9a8ab), {"E48", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0xc6f09d54d5603ff6), {"E49", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0x6c83d205e17ae194), {"E50", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0xe9e9f0117daeafb2), {"E51", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0xd78d18a3baadda5a), {"E52", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0x19682b13b40caed1), {"E52", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0x5a95801dbb6966bc), {"E53", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0x24e0fb29c79abdac), {"E53", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0x1703807427325060), {"E53", "Nimzo-Indian, Averbakh Variation"}}, {Q_UINT64_C(0xbf5cf670aa975084), {"E54", "Nimzo-Indian, Gligoric System"}}, {Q_UINT64_C(0xc5315b9277621f9c), {"E54", "Nimzo-Indian, Gligoric System"}}, {Q_UINT64_C(0x7d77f94fe5d56a1c), {"E54", "Nimzo-Indian, Gligoric System"}}, {Q_UINT64_C(0x9dbb69df694945cb), {"E54", "Nimzo-Indian, Karpov Variation"}}, {Q_UINT64_C(0x8cbf8d2d4a3fbd48), {"E55", "Nimzo-Indian, Gligoric, Bronstein var."}}, {Q_UINT64_C(0xffc8f82a4259b77a), {"E55", "Nimzo-Indian, Gligoric, Bronstein var."}}, {Q_UINT64_C(0x8f0d23cbd60b18af), {"E56", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0xfc01117613de46d5), {"E56", "Nimzo-Indian, Rubinstein, Larsen Var."}}, {Q_UINT64_C(0x8033a5818fbe1201), {"E57", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0x2e7d03da2fa32ba5), {"E58", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0x28623cfb43e864a4), {"E58", "Nimzo-Indian, Rubinstein, Khasin Var."}}, {Q_UINT64_C(0xb5c10e8342aec68d), {"E59", "Nimzo-Indian, Rubinstein Variation"}}, {Q_UINT64_C(0xbd7741389222a904), {"E60", "King's Indian Defense"}}, {Q_UINT64_C(0x6613adcefac4c839), {"E60", "King's Indian Defense"}}, {Q_UINT64_C(0xd6af907801830393), {"E60", "King's Indian Defense"}}, {Q_UINT64_C(0xfa492b39e154dbab), {"E60", "King's Indian Defense"}}, {Q_UINT64_C(0x46e0599a50c02bdd), {"E61", "King's Indian Defense"}}, {Q_UINT64_C(0xbc0ab8d898485c3), {"E61", "King's Indian Defense"}}, {Q_UINT64_C(0xfcc483ec8f5882c2), {"E61", "King's Indian Defense"}}, {Q_UINT64_C(0xd2d8498da19313ef), {"E61", "King's Indian, Smyslov System"}}, {Q_UINT64_C(0xc0873247e13ae3cb), {"E61", "King's Indian Defense"}}, {Q_UINT64_C(0x8d11322e7d61d517), {"E61", "King's Indian Defense"}}, {Q_UINT64_C(0xbb7c963b72c34e69), {"E61", "King's Indian Defense"}}, {Q_UINT64_C(0xfb1f6e9f934ee906), {"E61", "King's Indian Defense"}}, {Q_UINT64_C(0xe7270b672755a11b), {"E61", "King's Indian Defense"}}, {Q_UINT64_C(0x3864a5faf1ce101f), {"E62", "King's Indian, Fianchetto Variation"}}, {Q_UINT64_C(0x154686df1ebaf236), {"E62", "King's Indian, Fianchetto Variation"}}, {Q_UINT64_C(0x6b33fdeb62492926), {"E62", "King's Indian, Fianchetto Variation"}}, {Q_UINT64_C(0xd39241a5b2bf41d6), {"E62", "King's Indian, Fianchetto Variation"}}, {Q_UINT64_C(0x8321ecc5c486eb3), {"E62", "King's Indian, Fianchetto Variation"}}, {Q_UINT64_C(0x80533915e338a742), {"E63", "King's Indian, Panno Variation"}}, {Q_UINT64_C(0x614dba9e963d2af0), {"E64", "King's Indian, Yugoslav Variation"}}, {Q_UINT64_C(0x1f38c1aaeacef1e0), {"E65", "King's Indian, Yugoslav Variation"}}, {Q_UINT64_C(0xedd5a1b6279c2be), {"E66", "King's Indian, Yugoslav Variation"}}, {Q_UINT64_C(0xb4df106d89d2cc41), {"E67", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0x185d9aaa1201ef8d), {"E67", "King's Indian, Hungarian System"}}, {Q_UINT64_C(0x40d2631366c4ef67), {"E67", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0xf1cb110e7412d303), {"E67", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0xedff21a1429b67c3), {"E67", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0xa821beada4672695), {"E67", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0x84d56e5b8d44526d), {"E68", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0x783f3984580ed456), {"E68", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0x56229fa86a64aab1), {"E68", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0x16af83b4fa8481d6), {"E68", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0xfe5c5e0a38274824), {"E69", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0x272fcb51915569ab), {"E69", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0xdbc59c8e441fef90), {"E69", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0xa8cd2762c525f41e), {"E69", "King's Indian, Fianchetto"}}, {Q_UINT64_C(0x325b696440075d7d), {"E70", "King's Indian Defense"}}, {Q_UINT64_C(0xbe1ff05927f1410), {"E70", "King's Indian Defense"}}, {Q_UINT64_C(0xe31222bb50dcdde2), {"E71", "King's Indian Defense"}}, {Q_UINT64_C(0x2707444472a8cc28), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0xc17695ea8defc755), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0x2dafa9f3a7f125c3), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0x985f8a8eea1cfdba), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0xa2567619ddc2e01), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0x1e818caeb5f723ff), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0x33b2526cfb8d58b9), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0x2716b9a3d3a65547), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0xf5e148503486ad9b), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0x7e2e5b20155bf6c7), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0x122782c479f9058c), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0x8f685105285c73e3), {"E72", "King's Indian Defense"}}, {Q_UINT64_C(0x78617cfc935a5eb3), {"E73", "King's Indian Defense"}}, {Q_UINT64_C(0xb493c67df6896c90), {"E73", "King's Indian, Averbach Variation"}}, {Q_UINT64_C(0x52e217d309ce67ed), {"E74", "King's Indian, Averbach Variation"}}, {Q_UINT64_C(0x9e9da6b188ca61e2), {"E75", "King's Indian, Averbach Variation"}}, {Q_UINT64_C(0xf6f782088bee2999), {"E76", "King's Indian, Four Pawns Attack"}}, {Q_UINT64_C(0x8fdfec465f928ad1), {"E77", "King's Indian, Four Pawns Attack"}}, {Q_UINT64_C(0xb2cad11ec833e091), {"E78", "King's Indian, Four Pawns Attack"}}, {Q_UINT64_C(0x52a55578345da5f4), {"E79", "King's Indian, Four Pawns Attack"}}, {Q_UINT64_C(0x6550193432b5fb61), {"E80", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0x6ff8f483e7ec128a), {"E81", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0x7799067f9855be9f), {"E82", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0xb71d978d7747ac07), {"E83", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0xc1f569de2fcb31ef), {"E84", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0x96884725f533f132), {"E85", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0x10564105aad82f77), {"E86", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0x2c8004766c15676f), {"E87", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0xbefae9991bd5b4d4), {"E88", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0xd92ead1f9394b490), {"E89", "King's Indian, Saemisch Variation"}}, {Q_UINT64_C(0xd08513f3fa99752d), {"E90", "King's Indian Defense"}}, {Q_UINT64_C(0xda2dfe442fc09cc6), {"E90", "King's Indian Defense"}}, {Q_UINT64_C(0xa52e3f2a680353c7), {"E90", "King's Indian Defense"}}, {Q_UINT64_C(0xa9ad7dbd2ee5d665), {"E91", "King's Indian Defense"}}, {Q_UINT64_C(0x23d575f7bd002e53), {"E92", "King's Indian Defense"}}, {Q_UINT64_C(0x50ddce1b3c3a35dd), {"E92", "King's Indian, Gligoric Variation"}}, {Q_UINT64_C(0x39767dbe2ea9ae50), {"E92", "King's Indian, Petrosian Variation"}}, {Q_UINT64_C(0x807a5f0dafe7e1fe), {"E92", "King's Indian, Petrosian Variation"}}, {Q_UINT64_C(0x99dd36a42426b80e), {"E92", "King's Indian, Petrosian Variation"}}, {Q_UINT64_C(0xaa3e4df9c48e55c2), {"E93", "King's Indian, Petrosian Variation"}}, {Q_UINT64_C(0x5da00ec3c1f3f543), {"E94", "King's Indian, Classical Variation"}}, {Q_UINT64_C(0xfd0b45d9cb7ce31d), {"E94", "King's Indian, Classical Variation"}}, {Q_UINT64_C(0x1320a553470c69ff), {"E94", "King's Indian, Classical Variation"}}, {Q_UINT64_C(0xeaf77b15a6f3b39b), {"E95", "King's Indian, Classical Variation"}}, {Q_UINT64_C(0x8d17a0c2b38a2613), {"E96", "King's Indian, Classical Variation"}}, {Q_UINT64_C(0xf64dd621d0625040), {"E97", "King's Indian, Classical Variation"}}, {Q_UINT64_C(0x48adbd2303c24d0c), {"E97", "King's Indian, Classical Variation"}}, {Q_UINT64_C(0xf68ce0a9d8446c52), {"E98", "King's Indian, Classical Variation"}}, {Q_UINT64_C(0xdc58a8ad9af3ddb5), {"E99", "King's Indian, Mar del Plata Variation"}}, {Q_UINT64_C(0x53c3142c49aa22d6), {"E99", "King's Indian, Mar del Plata Variation"}}, {Q_UINT64_C(0xaf5013411bc9c63b), {"E99", "King's Indian, Mar del Plata Variation"}}, {Q_UINT64_C(0x2a8cf51776aece8f), {"E99", "King's Indian, Mar del Plata Variation"}} }; EcoCode::EcoCode() { } EcoInfo EcoCode::classify(Board &b) { EcoInfo ret; quint64 b_zobrist = b.zobrist(); if(ECOINFOS.contains(b_zobrist)) { EcoInfo e = ECOINFOS[b_zobrist]; ret.code = e.code; ret.info = e.info; } return ret; } } jerry-3.2.0/src/chess/constants.h0000664000175000017500000000057513514421177015464 0ustar useruser#ifndef CONSTANTS_H #define CONSTANTS_H namespace chess { const quint8 GAME_DELETED = 0xFF; const quint8 GAME_NOT_DELETED = 0x00; const int ERROR_OPENING_DCI = 100; const int ERROR_BROKEN_INDEX = 101; const int ERROR_UNKNOWN_FILETYPE = 102; const int ERROR_UNKNOWN_VERSION = 103; const int ERROR_OPENING_FILE = 104; const int ERROR_BROKEN_FILE = 105; } #endif // CONSTANTS_H jerry-3.2.0/src/chess/pgn_printer.h0000664000175000017500000000443013514421177015771 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef PGN_PRINTER_H #define PGN_PRINTER_H #include "game.h" namespace chess { class PgnPrinter { public: /** * @brief PgnPrinter prints a game to PGN format */ PgnPrinter(); /** * @brief printGame prints the supplied game to PGN format and saves the * generated lines a string list * @param g game to print * @return string list of lines of the generated PGN */ QStringList printGame(Game &g); /** * @brief writeGame prints the supplied game to PGN format and saves * the game as filename on disk. Throws * std::invalid_argument if impossible to save * game with the supplied filename * @param g game to print/save * @param filename filename to save to */ void writeGame(Game &g, const QString &filename); private: int variationDepth; bool forceMoveNumber; QStringList pgn; QString currentLine; void reset(); void flushCurrentLine(); void writeToken(const QString &token); void writeLine(const QString &token); void printGameContent(GameNode &g); void printMove(Board &board, Move &m); void printComment(const QString &comment); void printNag(int nag); void printHeaders(QStringList &pgn, Game &g); void printResult(int result); void beginVariation(); void endVariation(); void flushLine(); }; } #endif // PGN_PRINTER_H jerry-3.2.0/src/chess/colored_field.h0000664000175000017500000000030313514421177016227 0ustar useruser#ifndef COLORED_FIELD_H #define COLORED_FIELD_H #include #include namespace chess { struct ColoredField { QPoint field; QColor color; }; } #endif // COLORED_FIELD_H jerry-3.2.0/src/chess/arrow.h0000664000175000017500000000026013514421177014571 0ustar useruser#ifndef ARROW_H #define ARROW_H #include #include namespace chess { struct Arrow { QPoint from; QPoint to; QColor color; }; } #endif // ARROW_H jerry-3.2.0/src/chess/game_node.cpp0000664000175000017500000001362713514421177015723 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "game_node.h" #include #include #include namespace chess { int GameNode::id = 0; GameNode::GameNode() { //this->variations = new QList(); this->board = Board(true); //this->comment = QString(""); //this->nags = new QList(); this->parent = nullptr; //this->m = 0; this->nodeId = this->initId(); //this->san_cache = QString(""); //this->arrows = new QList(); //this->coloredFields = new QList(); this->depthCache = 0; this->userWasInformedAboutResult = false; } GameNode::~GameNode() { //delete this->m; //for(int i=0;iarrows->size();i++) { // delete this->arrows->at(i); //} //delete this->arrows; //for(int i=0;icoloredFields->size();i++) { // delete this->coloredFields->at(i); //} //delete this->coloredFields; //delete this->nags; //delete this->board; for(int i=0;ivariations.size();i++) { delete this->variations.at(i); } this->variations.clear(); } void GameNode::setMove(Move &m) { this->m = m; } int GameNode::getDepth() { if(this->parent == nullptr) { return 0; } else { if(this->depthCache == 0) { return this->parent->getDepth() + 1; } else { return 0; } } } QString GameNode::getSan(Move &m) { return this->board.san(m); } QString GameNode::getSan() { if(this->san_cache.isEmpty() && this->parent != 0) { this->san_cache = this->parent->getSan(this->m); } return this->san_cache; } int GameNode::getId() { return this->nodeId; } Move GameNode::getMove() { return this->m; } void GameNode::setParent(GameNode *p) { this->parent = p; } GameNode* GameNode::getParent() { //assert(this->parent != 0); return this->parent; } void GameNode::addNag(int n) { this->nags.append(n); } QVector GameNode::getNags() { return this->nags; } void GameNode::setComment(QString &c) { this->comment = c; } QString GameNode::getComment() { return this->comment; } Board GameNode::getBoard() { return this->board; } void GameNode::setBoard(Board &b) { this->board = b; } /* void GameNode::moveVariationUp(GameNode *node) { int i = this->getVariations().indexOf(node); if(i > 0) { this->getVariations()->removeAt(i); this->getVariations()->insert(i-1,node); } } void GameNode::moveVariationDown(GameNode *node) { int i = this->getVariations()->indexOf(node); if(i < this->getVariations()->size() -1) { this->getVariations()->removeAt(i); this->getVariations()->insert(i+1,node); } } */ void GameNode::removeNagsInRange(int min, int max) { int i=0; while(inags.count()) { int nag_i = nags.at(i); if(nag_i > min && nag_i <= max) { nags.removeAt(i); } else { i++; } } } void GameNode::appendNag(int nag) { if(nag != 0) { this->nags.append(nag); } } void GameNode::sortNags() { std::sort(nags.begin(), nags.end()); } GameNode* GameNode::root() { GameNode* root = this; while(root->parent!=nullptr) { root = root->parent; } return root; } QVector GameNode::getVariations() { return this->variations; } GameNode* GameNode::getVariation(int i) { assert(this->variations.size() > i); return this->variations.at(i); } bool GameNode::hasVariations() { return this->getVariations().count() > 1; } void GameNode::addVariation(GameNode *g) { assert(g != nullptr); this->variations.append(g); g->parent = this; } QVector GameNode::getArrows() { return this->arrows; } QVector GameNode::getColoredFields() { return this->coloredFields; } bool GameNode::isLeaf() { if(this->variations.count() == 0) { return true; } else { return false; } } void GameNode::addOrDelArrow(Arrow &a) { bool addArrow = true; for(int i=0;iarrows.size();i++) { Arrow ai = this->arrows.at(i); if(ai.from.x() == a.from.x() && ai.from.y() == a.from.y() && ai.to.x() == a.to.x() && a.to.y() == ai.to.y()) { if(a.color == ai.color) { this->arrows.removeAt(i); addArrow = false; break; } else { this->arrows.removeAt(i); break; } } } if(addArrow) { this->arrows.append(a); } } void GameNode::addOrDelColoredField(ColoredField &c) { bool addField = true; for(int i=0;icoloredFields.size();i++) { ColoredField ci = this->coloredFields.at(i); if(ci.field.x() == c.field.x() && ci.field.y() == c.field.y()) { if(ci.color == c.color) { this->coloredFields.removeAt(i); addField = false; break; } else { this->coloredFields.removeAt(i); break; } } } if(addField) { this->coloredFields.append(c); } } } jerry-3.2.0/src/chess/move.cpp0000664000175000017500000001375513514421177014755 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "move.h" #include #include #include namespace chess { Move::Move(uint8_t from, uint8_t to) { // create ascii (latin1) code numbers from // uint8_t board pos numbers QChar col_from = QChar((from % 10) + 96); QChar row_from = QChar((from / 10) + 47); QChar col_to = QChar((to % 10) + 96); QChar row_to = QChar((to / 10) + 47); this->from = from; this->to = to; this->promotion_piece = 0; this->uci_string = QString(col_from) + row_from + col_to + row_to; this->is_null = false; } /* * creates a null move */ Move::Move() { this->from = 0x00; this->to = 0x00; this->promotion_piece = 0; this->uci_string = "0000"; this->is_null = true; } Move::Move(uint8_t from, uint8_t to, uint8_t promotion_piece) { QChar col_from = QChar((from % 10) + 96); QChar row_from = QChar((from / 10) + 47); QChar col_to = QChar((to % 10) + 96); QChar row_to = QChar((to / 10) + 47); QChar prom_piece; if(promotion_piece == KNIGHT) { prom_piece = QChar('N'); } else if (promotion_piece == BISHOP) { prom_piece = QChar('B'); } else if (promotion_piece == ROOK) { prom_piece = QChar('R'); } else if (promotion_piece == QUEEN) { prom_piece = QChar('Q'); } else { prom_piece = QChar(' '); } this->from = from; this->to = to; this->promotion_piece = promotion_piece; if(prom_piece == QChar(' ')) { this->uci_string = QString(col_from) + row_from + col_to + row_to; } else { this->uci_string = QString(col_from) + row_from + col_to + row_to + prom_piece; } this->is_null = false; } Move::Move(QString uci) { assert((uci.size()==4) || (uci.size()==5)); this->uci_string = uci; QString up = uci.toUpper(); uint8_t from_col = this->alpha_to_pos(up.at(0)); // -49 for ascii(1) -> int 0, *10 + 20 is to get board coord uint8_t from_row = (uint8_t) ((up.at(1).toLatin1()-49) * 10)+20; this->from = from_row + from_col; uint8_t to_col = this->alpha_to_pos(up.at(2)); uint8_t to_row = (uint8_t) ((up.at(3).toLatin1() -49) * 10) + 20; this->to = to_row + to_col; if(uci.size() == 5) { QChar piece = up.at(4); assert(piece == QChar('N') || piece == QChar('B') || piece == QChar('R') || piece == QChar('Q')); if(piece == QChar('N')) { this->promotion_piece = KNIGHT; } if(piece == QChar('B')) { this->promotion_piece = BISHOP; } if(piece == QChar('R')) { this->promotion_piece = ROOK; } if(piece == QChar('Q')) { this->promotion_piece = QUEEN; } } else { this->promotion_piece = 0; } this->is_null = false; } QString Move::uci() { if(this->is_null) { return "0000"; } else { //return this->uci_string; QChar col_from = QChar((this->from % 10) + 96); QChar row_from = QChar((this->from / 10) + 47); QChar col_to = QChar((this->to % 10) + 96); QChar row_to = QChar((this->to / 10) + 47); QString uci = QString(col_from) + row_from + col_to + row_to; if(this->promotion_piece==BISHOP) { uci.append("=B"); } else if(this->promotion_piece==KNIGHT) { uci.append("=K"); } else if(this->promotion_piece==ROOK) { uci.append("=R"); } else if(this->promotion_piece==QUEEN) { uci.append("=Q"); } else { return uci; } return uci; } } QPoint Move::fromAsXY() { int col_from = (this->from % 10) - 1; int row_from = (this->from / 10) - 2; return QPoint(col_from, row_from); } QPoint Move::toAsXY() { int col_to = (this->to % 10) - 1; int row_to = (this->to / 10) - 2; return QPoint(col_to, row_to); } // create deep copy Move::Move(const Move& m) { this->from = m.from; this->to = m.to; this->promotion_piece = m.promotion_piece; this->is_null = m.is_null; this->uci_string = this->uci(); // QString::fromUtf16(m.uci_string.utf16()); } uint8_t Move::alpha_to_pos(QChar alpha) { if(alpha == QChar('A')) { return 1; } else if(alpha == QChar('B')) { return 2; } else if(alpha == QChar('C')) { return 3; } else if(alpha == QChar('D')) { return 4; } else if(alpha == QChar('E')) { return 5; } else if(alpha == QChar('F')) { return 6; } else if(alpha == QChar('G')) { return 7; } else if(alpha == QChar('H')) { return 8; } return 0; } bool Move::operator==(const Move &other) const { return (this->from == other.from && this->to == other.to && this->promotion_piece == other.promotion_piece && this->is_null == other.is_null); } bool Move::operator!=(const Move &other) const { return !(*this == other); } /** * @brief operator << * @param strm * @param m * @return * * prints move as uci string * * Example: * Move m = Move("g1f3"); * std::cout << m << std::endl; */ std::ostream& operator<<(std::ostream &strm, const Move &m) { return strm << m.uci_string.toStdString(); } } jerry-3.2.0/src/chess/gui_printer.h0000664000175000017500000000412313514421177015770 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef GUI_PRINTER_H #define GUI_PRINTER_H #include "game.h" namespace chess { class GuiPrinter { public: /** * @brief GuiPrinter handles printing of a game in a formatted * way in order to display it a QTextBrowser. * Formatting includes colors and links to nodes * for navigation (using the integer ids from GameNode * objects) */ GuiPrinter(); /** * @brief printGame returns a formatted for displaying in QTextBrowser * of the supplied game * @param g pointer to a Game * @return text string of game using san notation. */ QString printGame(Game &g); private: bool newLine; int variationDepth; bool forceMoveNumber; QString pgn; QString currentLine; void reset(); void flushCurrentLine(); void writeToken(const QString &token); void writeLine(const QString &token); void printGameContent(GameNode *g, bool onMainLine); void printMove(GameNode *g); void printComment(const QString &comment); void printNag(int nag); void printResult(int result); void beginVariation(); void endVariation(); void flushLine(); }; } #endif // GUI_PRINTER_H jerry-3.2.0/src/chess/gui_printer.cpp0000664000175000017500000001724313514421177016332 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "gui_printer.h" #include #include #include #include #include #include #include #include "game.h" #include "pgn_printer.h" #include "pgn_reader.h" namespace chess { GuiPrinter::GuiPrinter() { this->pgn = QString(""); this->currentLine = QString(""); this->variationDepth = 0; this->forceMoveNumber = true; this->newLine = false; } void GuiPrinter::reset() { this->pgn = QString(""); this->currentLine = QString(""); this->variationDepth = 0; this->forceMoveNumber = true; this->newLine = false; } void GuiPrinter::writeToken(const QString &token) { this->pgn.append(token); } QString GuiPrinter::printGame(Game &g) { this->reset(); GameNode *root = g.getRootNode(); this->writeToken("

"); // special case if the root node has // a comment before the actual game starts if(!root->getComment().isEmpty()) { this->printComment(root->getComment()); } this->printGameContent(root, true); this->printResult(g.getResult()); this->pgn.append(this->currentLine); return pgn; } void GuiPrinter::printMove(GameNode *node) { //int nodeId, Board *b, Move *m) { int nodeId = node->getId(); Board b = node->getParent()->getBoard(); QString s_nodeId = QString::number(nodeId); this->writeToken("writeToken(s_nodeId); this->writeToken("\" href=\"#"); this->writeToken(s_nodeId); this->writeToken("\">"); if(b.turn == WHITE) { QString tkn = QString::number(b.fullmove_number); tkn.append(QString(". ")); this->writeToken(tkn); } else if(this->forceMoveNumber) { QString tkn = QString::number(b.fullmove_number); tkn.append(QString("... ")); this->writeToken(tkn); } this->writeToken(node->getSan()); this->writeToken(" "); this->forceMoveNumber = false; this->newLine = false; } void GuiPrinter::printNag(int nag) { switch(nag) { case NAG_GOOD_MOVE: this->writeToken("! "); break; case NAG_MISTAKE: this->writeToken("? "); break; case NAG_BRILLIANT_MOVE: this->writeToken("!! "); break; case NAG_BLUNDER: this->writeToken("?? "); break; case NAG_SPECULATIVE_MOVE: this->writeToken("!? "); break; case NAG_DUBIOUS_MOVE: this->writeToken("?! "); break; case NAG_FORCED_MOVE: this->writeToken("□ "); break; case NAG_DRAWISH_POSITION: this->writeToken("= "); break; case NAG_UNCLEAR_POSITION: this->writeToken("∞ "); break; case NAG_WHITE_MODERATE_ADVANTAGE: this->writeToken("+/= "); break; case NAG_BLACK_MODERATE_ADVANTAGE: this->writeToken("-/= "); break; case NAG_WHITE_DECISIVE_ADVANTAGE: this->writeToken("+- "); break; case NAG_BLACK_DECISIVE_ADVANTAGE: this->writeToken("-+ "); break; case NAG_WHITE_ZUGZWANG: this->writeToken("⨀ "); break; case NAG_BLACK_ZUGZWANG: this->writeToken("⨀ "); break; case NAG_WHITE_HAS_ATTACK: this->writeToken("↑ "); break; case NAG_BLACK_HAS_ATTACK: this->writeToken("↑ "); break; default: QString tkn = QString("$").append(QString::number(nag)).append(" "); this->writeToken(tkn); } } void GuiPrinter::printResult(int result) { QString res = ""; if(result == RES_WHITE_WINS) { res = QString("1-0"); } else if(result == RES_BLACK_WINS) { res = QString("0-1"); } else if(result == RES_DRAW) { res = QString("1/2-1/2"); } else { res = QString("*"); } this->writeToken(res.append(" ")); } void GuiPrinter::beginVariation() { this->variationDepth++; QString tkn = QString(""); if(this->variationDepth == 1) { // if we just started a new line due to // ending a previous variation directly below // mainline, we do not need to add another linebreak if(this->newLine) { tkn = QString(" [ "); } else { tkn = QString("
 [ "); } this->writeToken(tkn); this->forceMoveNumber = true; } else { QString tkn = QString("( "); this->writeToken(tkn); this->forceMoveNumber = true; } this->newLine = false; } void GuiPrinter::endVariation() { this->variationDepth--; if(this->variationDepth == 0) { QString tkn = QString("]
"); this->writeToken(tkn); this->forceMoveNumber = true; this->newLine = true; } else { QString tkn = QString(") "); this->writeToken(tkn); this->forceMoveNumber = true; } } void GuiPrinter::printComment(const QString &comment) { QString temp_c = QString(comment); QString write = QString("{ ").append(temp_c.replace("}","").trimmed()).append(" } "); this->writeToken(write); //this->forceMoveNumber = false; } void GuiPrinter::printGameContent(GameNode* g, bool onMainLine) { // first write mainline move, if there are variations int cntVar = g->getVariations().count(); if(cntVar > 0) { if(onMainLine) { this->writeToken(""); } GameNode* main_variation = g->getVariation(0); this->printMove(main_variation); // write nags QVector nags = main_variation->getNags(); for(int j=0;jprintNag(n); } if(onMainLine) { this->writeToken(""); } // write comments if(!main_variation->getComment().isEmpty()) { this->printComment(main_variation->getComment()); } } // now handle all variations (sidelines) for(int i=1;igetVariation(i); this->beginVariation(); this->printMove(var_i); // next print nags QVector nags = var_i->getNags(); for(int j=0;jprintNag(n); } // finally print comments if(!var_i->getComment().isEmpty()) { this->printComment(var_i->getComment()); } // recursive call for all childs this->printGameContent(var_i, false); // print variation end this->endVariation(); } // finally do the mainline if(cntVar > 0) { GameNode* main_variation = g->getVariation(0); this->printGameContent(main_variation, onMainLine && true); } } } jerry-3.2.0/src/chess/database.h0000664000175000017500000000123513514421177015206 0ustar useruser#ifndef DATABASE_H #define DATABASE_H #include #include #include "chess/game.h" #include "chess/pgn_reader.h" #include "model/search_pattern.h" namespace chess { class Database { public: virtual ~Database() = 0; virtual void setParentWidget(QWidget *parentWidget) = 0; virtual void open(QString &filename) = 0; virtual void close() = 0; virtual int createNew(QString &filename) = 0; virtual void search(SearchPattern &pattern) = 0; virtual int getRowCount() = 0; virtual Game* getGameAt(int idx) = 0; virtual PgnHeader getRowInfo(int idx) = 0; virtual int countGames() = 0; }; } #endif // DATABASE_H jerry-3.2.0/src/chess/game.cpp0000664000175000017500000002442213514421177014711 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "game.h" #include #include namespace chess { Game::Game() { this->root = new GameNode(); this->result = RES_UNDEF; this->current = root; this->treeWasChanged = false; this->wasEcoClassified = false; //this->ecoInfo("",""); } Game::~Game() { this->delBelow(this->root); delete this->root; } GameNode* Game::getRootNode() { return this->root; } GameNode* Game::getCurrentNode() { return this->current; } void Game::setCurrent(GameNode *new_current) { this->current = new_current; } void Game::setRoot(GameNode *new_root) { this->root = new_root; } int Game::getResult() { return this->result; } void Game::setResult(int r) { this->result = r; } void Game::setHeader(QString tag, QString value) { this->headers[tag] = value; } QString Game:: getHeader(QString tag) { return this->headers[tag]; } QStringList Game::getTags() { QStringList tags; QMapIterator i(this->headers); while (i.hasNext()) { i.next(); tags.append(i.key()); } return tags; } /* bool Game::hasCommentSubstring(QString &s, bool caseSensitive) { GameNode *root = this->getRootNode(); return this->hasCommentSubstringBelow(s, root, caseSensitive); } bool Game::hasCommentSubstringBelow(QString &s, GameNode* temp, bool caseSensitive) { if(caseSensitive) { if(temp->getComment().contains(s)) { return true; } } else { if(temp->getComment().contains(s, Qt::CaseInsensitive)) { return true; } } for(int i=0;i < temp->variations.size(); i++) { GameNode* child_i = temp->variations.at(i); if(hasCommentSubstringBelow(s, child_i, caseSensitive)) { return true; } } return false; } */ /* bool Game::hasCommentSubstringMainline(QString &s, bool caseSensitive) { GameNode* temp = this->getRootNode(); if(caseSensitive) { if(temp->getComment().contains(s)) { return true; } } else { if(temp->getComment().contains(s, Qt::CaseInsensitive)) { return true; } } while(temp->variations.count() > 0) { temp = temp->getVariation(0); if(caseSensitive) { if(temp->getComment().contains(s)) { return true; } } else { if(temp->getComment().contains(s, Qt::CaseInsensitive)) { return true; } } } return false; } */ GameNode* Game::findNodeByIdRec(int id, GameNode *node) { if(node->getId() == id) { return node; } else { for(int i=0;i < node->variations.size();i++) { GameNode *child_i = node->variations.at(i); GameNode *result = this->findNodeByIdRec(id, child_i); if(result != 0) { return result; } } } return 0; } GameNode* Game::findNodeById(int id) { GameNode *current = this->getRootNode(); GameNode *result = this->findNodeByIdRec(id, current); if(result == 0) { throw std::invalid_argument("node doesn't exist"); } else { return result; } } void Game::goToMainLineChild() { if(this->current->variations.count() > 0) { this->current = this->current->getVariation(0); } } int Game::countHalfmoves() { int halfmoves = 0; GameNode *temp = this->root; while(temp->variations.count() > 0) { temp = temp->getVariation(0); halfmoves += 1; } return halfmoves; } GameNode* Game::getEndNode() { GameNode *temp = this->getRootNode(); while(temp->variations.count() > 0) { temp = temp->getVariation(0); } return temp; } void Game::goToChild(int idx_child) { if(this->current->variations.count() > idx_child) { this->current = this->current->getVariation(idx_child); } } void Game::goToParent() { if(this->current->getParent() != 0) { this->current = this->current->getParent(); } } void Game::goToEnd() { GameNode *temp = this->root; while(temp->variations.count() > 0) { temp = temp->getVariation(0); } this->current = temp; } void Game::goToRoot() { this->current = this->root; } void Game::resetWithNewRootBoard(chess::Board new_root_board) { chess::GameNode* old_root = this->getRootNode(); this->delBelow(old_root); chess::GameNode* new_root = new chess::GameNode(); new_root->setBoard(new_root_board); this->setRoot(new_root); this->setCurrent(new_root); this->result = RES_UNDEF; this->clearHeaders(); this->treeWasChanged = true; delete old_root; } void Game::clearHeaders() { this->headers.clear(); this->headers.insert(("Event"), ""); this->headers.insert("Site",""); this->headers.insert("Date",""); this->headers.insert("Round",""); this->headers.insert("White",""); this->headers.insert("Black",""); this->headers.insert("Result","*"); } void Game::goToLeaf() { while(!current->isLeaf()) { this->goToChild(0); } } void Game::applyMove(Move &m) { bool exists_child = false; for(int i=0;icurrent->variations.size();i++) { Move mi = this->current->variations.at(i)->getMove(); if(m == mi) { exists_child = true; this->current = this->current->variations.at(i); break; } } if(!exists_child) { GameNode *current = this->getCurrentNode(); Board b_current = current->getBoard(); Board b_child = Board(b_current); //b_current.copy_and_apply(m); b_child.apply(m); GameNode *new_current = new GameNode(); new_current->setBoard(b_child); new_current->setMove(m); new_current->setParent(current); current->variations.append(new_current); this->current = new_current; this->treeWasChanged = true; } } void Game::moveUp(GameNode *node) { if(node->getParent() != 0) { GameNode *parent = node->getParent(); int i = parent->variations.indexOf(node); if(i > 0) { parent->variations.removeAt(i); parent->variations.insert(i-1,node); } this->treeWasChanged = true; } } void Game::moveDown(GameNode *node) { if(node->getParent() != 0) { GameNode *parent = node->getParent(); int i = parent->variations.indexOf(node); if(i < parent->variations.size() -1) { parent->variations.removeAt(i); parent->variations.insert(i+1,node); } this->treeWasChanged = true; } } void Game::delVariant(GameNode *node) { // go up the variation until we // find the root of the variation GameNode *child = node; GameNode *var_root = node; while(var_root->getParent() != 0 && var_root->getParent()->variations.size() == 1) { child = var_root; var_root = var_root->getParent(); } int idx = -1; // one more to get the actual root if(var_root->getParent() !=0) { child = var_root; var_root = var_root->getParent(); idx = var_root->variations.indexOf(child); } if(idx != -1) { var_root->variations.removeAt(idx); delete child; this->current = var_root; } } void Game::delBelow(GameNode *node) { for(int i=0;ivariations.size();i++) { GameNode *child_i = node->variations.at(i); node->variations.removeAt(i); delete child_i; } this->current = node; } void Game::removeCommentRec(GameNode *node) { QString empty = QString(""); node->setComment(empty); for(int i=0;ivariations.size();i++) { GameNode *var_i = node->variations.at(i); this->removeCommentRec(var_i); } } void Game::removeAllComments() { this->removeCommentRec(this->getRootNode()); } void Game::removeAllVariants() { GameNode *temp = this->getRootNode(); int size = temp->variations.size(); while(size > 0) { GameNode *main = temp->variations.at(0); // delete all variants for(int i=1;ivariations.at(i); delete ni; } temp->variations.clear(); temp->addVariation(main); temp = temp->variations.at(0); size = temp->variations.size(); } this->current = this->getRootNode(); } void Game::findEco() { EcoCode *ec = new EcoCode(); GameNode* temp = this->getRootNode(); int depth = 0; while(depth < 29 && temp->variations.count() > 0) { temp = temp->variations.at(0); depth++; } int maxdepth = depth; while(depth >= 2) { Board b_temp = temp->getBoard(); EcoInfo e_temp = ec->classify(b_temp); if(!e_temp.code.isEmpty()) { this->ecoInfo = EcoInfo(e_temp); this->wasEcoClassified = true; this->headers.insert("ECO", e_temp.code); delete ec; break; } else { temp = temp->getParent(); depth--; } } // we consider this a failed attempt // if we haven't found a code, and the game // is sufficiently long if(maxdepth > 4 && !this->wasEcoClassified) { this->wasEcoClassified = true; this->ecoInfo.code = "A00"; this->ecoInfo.info = "Unknown"; } } bool Game::isTreeChanged() { return this->treeWasChanged; } void Game::setTreeWasChanged(bool status) { this->treeWasChanged = status; } EcoInfo Game::getEcoInfo() { return this->ecoInfo; } } jerry-3.2.0/src/chess/game.h0000664000175000017500000002104213514421177014351 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef GAME_H #define GAME_H #include "game_node.h" #include "ecocode.h" namespace chess { const int RES_UNDEF = 0; const int RES_WHITE_WINS = 1; const int RES_BLACK_WINS = 2; const int RES_DRAW = 3; const int RES_ANY = 4; class Game { public: /** * @brief returns true if a tree operation was recently carried * out that changed the tree structure (i.e. then * a redraw is required) */ bool isTreeChanged(); /** * @brief call this function with true if an operation was carried * out that fundamentally changed the tree structure (i.e. * deleting nodes, adding comments etc.). Used to remember * if a GUI representation of the tree needs to be redrawn * call with false, after updating GUI representation */ void setTreeWasChanged(bool status); void setHeader(QString tag, QString value); QString getHeader(QString tag); void resetHeaders(); QStringList getTags(); /** * @brief Game essentially a tree of GameNode objects that * represents a game. Default root node has a * board position which is empty */ Game(); ~Game(); /** * @brief getRootNode returns the root node of the game * @return */ GameNode* getRootNode(); /** * @brief getEndNode returns end of mainline * @return */ GameNode* getEndNode(); /** * @brief getCurrentNode returns the current node. The current * node is a pointer to a node in the tree * and used e.g. for the node of the last move * @return */ GameNode* getCurrentNode(); /** * @brief getResult returns the result of the game * @return RES_BLACK_WINS or RES_DRAW or RES_WHITE_WINS or RES_UNDEF */ int getResult(); /** * @brief setResult sets the result of the game * @param r see getResult() */ void setResult(int r); /** * @brief applyMove apply a move to the current node, and change * the node to the resulting new node (or existing node) * if a child node for this move already exists. * There is no check if the supplied move is legal! * @param m the move to apply on the current board. */ void applyMove(Move &m); /** * @brief findNodeById each GameNode has a unique id (see class definition) * this searches for and find the node given the supplied id * throw std::invalid_argument if there exists no node * with the id * @param id the node id * @return gamenode with the supplied id */ GameNode* findNodeById(int id); /** * @brief setCurrent set the current pointer to the supplied node. There is * no validity check whether the node is actually a node * in the game tree. * @param new_current pointer to the node */ void setCurrent(GameNode *new_current); /** * @brief setRoot sets the root node pointer to the supplied node. Really just that. * Beware of memory leaks when using this function, as nodes below * the old root might become inaccessible * @param new_root */ void setRoot(GameNode *new_root); /** * @brief goToMainLineChild moves the current node pointer one down to the mainline (zeroth) * variation (if it exists), otherwise keeps the pointer * at the current node */ void goToMainLineChild(); /** * @brief goToChild moves the current node poiner to the child at index idx_child. * If the index is out of range, keeps the pointer at the current node. * @param idx_child the index of the variation of the child node */ void goToChild(int idx_child); /** * @brief goToParent moves current node pointer to the parent node (if exists). * keeps pointer at existing node if already at root */ void goToParent(); /** * @brief goToRoot moves current pointer to the root node of the game */ void goToRoot(); /** * @brief goToEnd starting at the current node, moves the current node pointer * down among all mainline until reaching a leaf */ void goToEnd(); /** * @brief moveUp Suppose the supplied node is a child referenced at parent with index i, * and there is another child of the parent with index i-1. Then this * function switches these indexes. In other word, moves the supplied node * variation one up. Has no effect, if node is root (i.e. has no parent) * or is already the mainline (i.e. the zeroth) child of parent. * @param node The node that should be moved up */ void moveUp(GameNode *node); /** * @brief moveDown Reverse of moveUp(). * @param node */ void moveDown(GameNode *node); /** * @brief delVariant deletes the whole variation on which the supplied node exists. I.e. * moves up the tree to the root of the variation, and deletes everything below. * sets current node pointer to the root of the variation. * @param node */ void delVariant(GameNode *node); /** * @brief delBelow delete the subtree below the supplied node. Afterwards sets current * node pointer to the supplied node. * @param node */ void delBelow(GameNode *node); /** * @brief removeCommentRec removes comment at supplied node and recursively removes * at all comments at nodes below the supplied node. * @param node the node to start with. */ void removeCommentRec(GameNode *node); /** * @brief goToLeaf from the current node pointer, go down the mainlines until * there are no more childs. */ void goToLeaf(); /** * @brief resetWithNewRootBoard delete the whole game tree, and set a new * root node constructed with the supplied move. Essentially call this, if * a new game has been requrested by the user, especially if the user * has set up a custom board position. The supplied board MUST be * a valid board position. * @param new_root_board The chess board to construct the root node. */ void resetWithNewRootBoard(Board new_root_board); /** * @brief removeAllComments iterates through the tree, and removes every * comment from each GameNode */ void removeAllComments(); /** * @brief removeAllVariants iterates through the tree and keeps only the * mainlines (i.e. zeroth) variations if there * are more than one child in a GameNode */ void removeAllVariants(); /* bool hasCommentSubstring(QString &s, bool caseSensitive); bool hasCommentSubstringMainline(QString &s, bool caseSensitive); */ /** * @brief clearHeaders deletes all headers entries. */ void clearHeaders(); void findEco(); EcoInfo getEcoInfo(); bool wasEcoClassified; /** * @brief countHalfmoves counts halfmoves of mainline * @return */ int countHalfmoves(); private: QMap headers; bool treeWasChanged; GameNode* root; GameNode* current; int result; GameNode* findNodeByIdRec(int id, GameNode* node); bool hasCommentSubstringBelow(QString &s, GameNode* node, bool caseSensitive); EcoInfo ecoInfo; }; } #endif // GAME_H jerry-3.2.0/src/chess/move.h0000664000175000017500000000762713514421177014423 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef MOVE_H #define MOVE_H #include #include #include namespace chess { // general piece encodings const uint8_t EMPTY = 0; const uint8_t PAWN = 1; const uint8_t KNIGHT = 2; const uint8_t BISHOP = 3; const uint8_t ROOK = 4; const uint8_t QUEEN = 5; const uint8_t KING = 6; const uint8_t ANY_PIECE = 8; class Move { public: uint8_t from; uint8_t to; uint8_t promotion_piece; QString uci_string; bool is_null; /** * @brief Move creates a null move */ Move(); /** * @brief Move creates move, supplied parameters in internal * board coordinate format, i.e. in range 21...98. * Does not check any validity * @param from index of source field * @param to index of target field */ Move(uint8_t from, uint8_t to); /** * @brief Move creates a move where the piece transforms * into promotion piece upon placement on target square. * Does not check any validity. * supplied parameters in internal * board coordinate format, i.e. in range 21...98. * @param from index of source field * @param to index of target field * @param promotion_piece piece type of promotion piece. doesn't encode color, i.e. * must be in range (>= 0, <= 5), cf. general piece encodings above */ Move(uint8_t from, uint8_t to, uint8_t promotion_piece); /** * @brief Move creates a move with en passent capture * Does not check any validity (i.e. whether * en passent is possible, source is a pawn, move is legal etc.) * supplied parameters in internal * board coordinate format, i.e. in range 21...98. * @param from * @param to * @param en_passent */ Move(uint8_t from, uint8_t to, bool en_passent); /** * @brief Move creates move from uci string (e.g. g1f3, d7d8Q etc.) * @param uci supplied uci string */ Move(QString uci); /** * @brief Move creates a deep copy of supplied move * @param m the move to copy */ Move(const Move& m); /** * @brief uci get uci string (e.g. g1f3, d7d8Q etc.) of current move * @return uci string */ QString uci(); /** * @brief operator == compares two moves by checking whether they * are semantically the same, i.e. same source square, * same target, same promotion, both (or both not) en passent. * @param other * @return true if moves are semantically same (does not care about memory) */ bool operator==(const Move &other) const; /** * @brief operator != see == * @param other * @return */ bool operator!=(const Move &other) const; QPoint fromAsXY(); QPoint toAsXY(); private: uint8_t alpha_to_pos(QChar alpha); std::tuple get_alphanum_coord(uint8_t internal_pos); friend std::ostream& operator<<(std::ostream& strm, const Move &m); }; } #endif // MOVE_H jerry-3.2.0/src/chess/pgn_reader.h0000664000175000017500000001577413514421177015565 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef PGN_READER_H #define PGN_READER_H #include #include #include "game.h" namespace chess { const QRegularExpression TAG_REGEX = QRegularExpression("\\[([A-Za-z0-9]+)\\s+\"(.*)\"\\]"); const QRegularExpression MOVETEXT_REGEX = QRegularExpression("(%.*?[\n\r])|(\{.*)|(\\$[0-9]+)|(\\()|(\\))|(\\*|1-0|0-1|1/2-1/2)|([NBKRQ]?[a-h]?[1-8]?[\\-x]?[a-h][1-8](?:=?[nbrqNBRQ])?|--|O-O(?:-O)?|0-0(?:-0)?)|([\?!]{1,2})"); const int NAG_NULL = 0; const int NAG_GOOD_MOVE = 1; //A good move. Can also be indicated by ``!`` in PGN notation.""" const int NAG_MISTAKE = 2; //A mistake. Can also be indicated by ``?`` in PGN notation.""" const int NAG_BRILLIANT_MOVE = 3; //A brilliant move. Can also be indicated by ``!!`` in PGN notation.""" const int NAG_BLUNDER = 4; //A blunder. Can also be indicated by ``??`` in PGN notation.""" const int NAG_SPECULATIVE_MOVE = 5; //A speculative move. Can also be indicated by ``!?`` in PGN notation.""" const int NAG_DUBIOUS_MOVE = 6; //A dubious move. Can also be indicated by ``?!`` in PGN notation.""" const int NAG_FORCED_MOVE = 7; const int NAG_DRAWISH_POSITION = 10; const int NAG_UNCLEAR_POSITION = 13; const int NAG_WHITE_MODERATE_ADVANTAGE = 16; const int NAG_BLACK_MODERATE_ADVANTAGE = 17; const int NAG_WHITE_DECISIVE_ADVANTAGE = 18; const int NAG_BLACK_DECISIVE_ADVANTAGE = 19; const int NAG_WHITE_ZUGZWANG = 22; const int NAG_BLACK_ZUGZWANG = 23; const int NAG_WHITE_HAS_ATTACK = 40; const int NAG_BLACK_HAS_ATTACK = 41; const int NAG_WHITE_MODERATE_COUNTERPLAY = 132; const int NAG_BLACK_MODERATE_COUNTERPLAY = 133; struct HeaderOffset { qint64 offset; QMap headers; }; struct PgnHeader { QString eco; QString event; QString site; QString date; QString round; QString white; QString black; QString result; }; struct PgnHeaderOffset { qint64 offset; PgnHeader header; }; class PgnReader { public: /** * @brief detect_encoding tries to heuristically detect the encoding of a text file * this function is only able to distinguish UTF8 (with or * without BOM from ISO 8859-1. However this should handle * most available PGN files - modern chess programs usually * store PGNs in UTF-8. * @param filename filename * @return const char* = "ISO 8859-1" or "UTF-8". Can be used to * set encoding for QTextStream */ const char* detect_encoding(const QString &filename); bool detectUtf8(const QString &filename); /** * @brief readGameFromFile read the (first) game from the PGN filename * throws std::invalid_argument if impossible to read from * that PGN a valid game * @param filename name of the file * @return pointer to the generated game */ chess::Game* readGameFromFile(const QString &filename, const char* encoding); /** * @brief readGameFromFile read the game at supplied offset from the PGN filename * throws std::invalid_argument if impossible to read from * that PGN or if the offset leads to an invalid position. * @param filename name of the file * @param offset integer denoting the offset position to seek to prior reading the file * @return pointer to generated game */ chess::Game* readGameFromFile(const QString &filename, const char* encoding, qint64 offset); QList scan_headers_fast(const QString &filename, const char* encoding); int readNextHeader(const QString &filename, const char* encoding, quint64 offset, HeaderOffset &headerOffset); QVector scan_headers_foo(const QString &filename, const char* encoding); /** * @brief readFileIntoString read the PGN file from disk into memory * as a string. throws std::invalid_argument if * something goes wrong * @param filename name of the file * @return pointer to string */ QString readFileIntoString(const QString &filename, const char* encoding); /** * @brief readGameFromString reads (first) PGN game from supplied pgn string * @param pgn_string string containing pgn file * @return pointer to generated game */ chess::Game* readGameFromString(QString &pgn_string); /** * @brief readGameFromString read game from string, but first * seeks to position in string, and starts reading * the first encountered game at that position * @param pgn_string string with one or more pgn games * @param offset denoting the offset in the string to start from * @return generated game */ chess::Game* readGameFromString(QString &pgn_string, quint64 offset); /** * @brief readGame reads a game from supplied textstream * @param in the textstream to read from * @return generated game */ chess::Game* readGame(QTextStream& in); /** * @brief scan_headers scans a PGN file, reads the headers and * remembers the offsets on which the games start. skips * parsing the actual games. * @param filename name of the PGN file * @return list of headers and offset pairs */ QVector scan_headers(const QString &filename, const char* encoding); /** * @brief scan_headersFromString scans a PGN string, reads the headers and * remembers the offsets on which the games start. skips * parsing the actual games. * @param content pointer the pgn string to read from * @return list of headers and offset pairs */ QList scan_headersFromString(QString &content); QVector readMultipleHeadersFromPgnAround(QString &filename, QVector &offsets, bool isUtf8); QVector scanPgn(QString &filename, bool isUtf8); chess::Game* readGameFromPgnAt(QString &filename, qint64 offset, bool isUtf8); PgnHeader readSingleHeaderFromPgnAt(QString &filename, qint64 offset, bool isUtf8); private: }; } #endif // PGN_READER_H jerry-3.2.0/src/chess/ecocode.h0000664000175000017500000000037313514421177015045 0ustar useruser#ifndef ECOCODE_H #define ECOCODE_H #include #include "board.h" namespace chess { struct EcoInfo { QString code; QString info; }; class EcoCode { public: EcoCode(); EcoInfo classify(Board &b); }; } #endif // ECOCODE_H jerry-3.2.0/src/controller/0000775000175000017500000000000013514421177014346 5ustar useruserjerry-3.2.0/src/controller/file_controller.cpp0000664000175000017500000002514613514421177020244 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "file_controller.h" #include #include #include #include #include #include #include #include "chess/pgn_printer.h" #include "chess/pgn_reader.h" #include "dialogs/dialog_newgame.h" #include "dialogs/dialog_browseheaders.h" #include "dialogs/dialog_database.h" #include "various/messagebox.h" FileController::FileController(GameModel *gameModel, QWidget *parent) : QObject(parent) { this->gameModel = gameModel; this->parentWidget = parent; } void FileController::printGame() { QPrinter printer; QPrintDialog *dlg = new QPrintDialog(&printer, this->parentWidget); dlg->setWindowTitle(tr("Print Game")); if(dlg->exec() == QDialog::Accepted) { chess::PgnPrinter *pgnPrinter = new chess::PgnPrinter(); QString pgn = pgnPrinter->printGame(*this->gameModel->getGame()).join("\n"); QPlainTextEdit *textEdit = new QPlainTextEdit(pgn); textEdit->print(&printer); delete textEdit; delete pgnPrinter; } delete dlg; } void FileController::printPosition() { QPrinter printer; QPrintDialog *dlg = new QPrintDialog(&printer, this->parentWidget); dlg->setWindowTitle(tr("Print FEN")); if(dlg->exec() == QDialog::Accepted) { QString fen = this->gameModel->getGame()->getCurrentNode()->getBoard().fen(); QPlainTextEdit *textEdit = new QPlainTextEdit(fen); textEdit->print(&printer); delete textEdit; } delete dlg; } /* * def print_position(self): q_widget = self.mainAppWindow dialog = QPrintDialog() if dialog.exec_() == QDialog.Accepted: p = QPixmap.grabWindow(q_widget.chessboard_view.winId()) painter = QPainter(dialog.printer()) dst = QRect(0,0,200,200) painter.drawPixmap(dst, p) del painter * */ void FileController::newGame() { // internal engine is always at 0, so otherwise we have a custom engine bool customEngine = this->gameModel->getActiveEngineIdx() != 0; DialogNewGame* dlg = new DialogNewGame(customEngine, this->gameModel->getEngineStrength(), this->gameModel->getEngineThinkTime(), this->parentWidget); if(dlg->exec() == QDialog::Accepted) { this->gameModel->wasSaved = false; this->gameModel->engineStrength = dlg->computerStrength; this->gameModel->engineThinkTimeMs = dlg->computerThinkTime*1000; //auto g = std::unique_ptr(new chess::Game()); chess::Game* g = new chess::Game(); this->gameModel->setGame(g); this->gameModel->getGame()->setTreeWasChanged(true); if(dlg->playsWhite) { this->gameModel->flipBoard = false; } else { this->gameModel->flipBoard = true; } if(dlg->playsComputer) { if(dlg->playsWhite) { emit(newGamePlayWhite()); } else { emit(newGamePlayBlack()); } } else { emit(newGameEnterMoves()); } } delete dlg; } void FileController::openGame() { QString filename = QFileDialog::getOpenFileName(this->parentWidget, tr("Open Game File"), this->gameModel->lastOpenDir, tr("PGN Files (*.pgn)")); if(!filename.isEmpty()) { QDir dir = QDir::root(); QString path = dir.absoluteFilePath(filename); this->openGameFrom(path, filename, false); } } void FileController::openGameFrom(QString &path, QString &absoluteFilename, bool reOpen) { chess::PgnReader reader; //qDebug() << "open Game From"; try { this->gameModel->database.open(absoluteFilename); if(this->gameModel->database.countGames() == 1) { //qDebug() << "count Games"; chess::Game* onlyGame = this->gameModel->database.getGameAt(0); //qDebug() << "only game loaded"; this->gameModel->lastOpenDir = path; this->gameModel->currentPgnFilename = absoluteFilename; this->gameModel->lastSaveFilename = absoluteFilename; // setup new game triggers statechange, so no need to call this->setupNewGame(onlyGame); } else if(this->gameModel->database.countGames() > 1) { //qDebug() << "count >= 1 for database load"; DialogDatabase dlg(this->gameModel, this->parentWidget); if(dlg.exec() == QDialog::Accepted && dlg.selectedIndex >= 0) { //qDebug() << "getting game at: " << dlg.selectedIndex; chess::Game* selected_game = this->gameModel->database.getGameAt(dlg.selectedIndex); this->gameModel->lastOpenDir = path; this->gameModel->currentPgnFilename = absoluteFilename; this->gameModel->lastSaveFilename = absoluteFilename; // setup new game triggers statechange, so no need to call this->setupNewGame(selected_game); } else { //qDebug() << "dlg selected index: " << dlg.selectedIndex; } } } catch(std::exception e) { std::cerr << e.what() << std::endl; } } void FileController::setupNewGame(chess::Game* g) { //delete this->gameModel->getGame(); this->gameModel->setGame(g); this->gameModel->getGame()->setTreeWasChanged(true); this->gameModel->triggerStateChange(); } void FileController::saveGame() { this->saveGameTo(this->gameModel->lastSaveFilename); } void FileController::saveGameTo(QString &filename) { chess::PgnPrinter *pgn = new chess::PgnPrinter(); try { pgn->writeGame(*this->gameModel->getGame(), filename); } catch (std::exception &e) { this->gameModel->wasSaved = false; MessageBox *msg = new MessageBox(this->parentWidget); msg->showMessage("Error", e.what()); delete msg; this->gameModel->triggerStateChange(); } } void FileController::toolbarSaveGame() { if(this->gameModel->wasSaved) { this->saveGame(); } else { this->saveAsNewGame(); } } void FileController::saveAsNewGame() { QString filename = QFileDialog::getSaveFileName(this->parentWidget, tr("Open Game File"), this->gameModel->lastSaveDir, tr("PGN Files (*.pgn)")); QDir dir = QDir::root(); QString path = dir.absoluteFilePath(filename); if(!filename.isEmpty()) { try { this->saveGameTo(filename); this->gameModel->wasSaved = true; this->gameModel->lastSaveDir = path; this->gameModel->lastSaveFilename = filename; this->gameModel->triggerStateChange(); } catch(std::exception e) { std::cerr << e.what() << std::endl; } } } void FileController::toolbarOpenCurrentPGN() { this->openGameFrom(this->gameModel->lastOpenDir, this->gameModel->currentPgnFilename, true); } void FileController::openInCurrentPgnAt(int idx) { QString absoluteFilename = this->gameModel->currentPgnFilename; QString path = this->gameModel->lastOpenDir; chess::PgnReader reader; try { QFile file; file.setFileName(absoluteFilename); file.open(QIODevice::ReadOnly); quint64 size = file.size(); file.close(); if(size > 1048576) { MessageBox *msg = new MessageBox(this->parentWidget); msg->showMessage("Error Opening File", ("PGN files larger than 1 MB are not supported.")); delete msg; } else { const char* encoding = reader.detect_encoding(absoluteFilename); QString complete_file = reader.readFileIntoString(absoluteFilename, encoding); QList header_offsets = reader.scan_headersFromString(complete_file); if(idx >= 0 && idx < header_offsets.size()) { qint64 gameOffset = header_offsets.at(idx).offset; chess::Game* g = reader.readGameFromString(complete_file, gameOffset); this->gameModel->wasSaved = false; this->gameModel->lastOpenDir = path; this->gameModel->database.setLastSelectedIndex(idx); this->gameModel->lastSaveFilename = QString(""); this->setupNewGame(g); } } } catch(std::exception e) { std::cerr << e.what() << std::endl; } } void FileController::openDatabase() { DialogDatabase *dlg = new DialogDatabase(this->gameModel, this->parentWidget); if(dlg->exec() == QDialog::Accepted && dlg->selectedIndex >= 0) { chess::Game* selected_game = this->gameModel->database.getGameAt(dlg->selectedIndex); this->gameModel->database.setLastSelectedIndex(dlg->selectedIndex); this->gameModel->setGame(selected_game); this->gameModel->getGame()->setTreeWasChanged(true); } delete dlg; this->gameModel->triggerStateChange(); } void FileController::toolbarNextGameInPGN() { int idx = this->gameModel->database.getLastSelectedIndex() + 1; if(idx < this->gameModel->database.countGames()) { chess::Game* selected_game = this->gameModel->database.getGameAt(idx); //this->gameModel->database.setLastSelectedIndex(idx); this->gameModel->setGame(selected_game); this->gameModel->getGame()->setTreeWasChanged(true); this->gameModel->triggerStateChange(); } } void FileController::toolbarPrevGameInPGN() { int idx = this->gameModel->database.getLastSelectedIndex() - 1; if(idx >= 0) { chess::Game* selected_game = this->gameModel->database.getGameAt(idx); //this->gameModel->database.setLastSelectedIndex(idx); this->gameModel->setGame(selected_game); this->gameModel->getGame()->setTreeWasChanged(true); this->gameModel->triggerStateChange(); } } jerry-3.2.0/src/controller/mode_controller.h0000664000175000017500000000371013514421177017707 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef MODE_CONTROLLER_H #define MODE_CONTROLLER_H #include #include "uci/uci_controller.h" #include "model/game_model.h" class ModeController : public QObject { Q_OBJECT public: ModeController(GameModel *gameModel, UciController *controller, QWidget *parent); private: UciController *uci_controller; GameModel *gameModel; QWidget *parentWidget; void onStateChangeEnterMoves(); void onStateChangeAnalysis(); void onStateChangePlayWhiteOrBlack(); void onStateChangePlayoutPosition(); void onStateChangeGameAnalysis(); protected: signals: public slots: void onActivateAnalysisMode(); void onActivateEnterMovesMode(); void onActivatePlayWhiteMode(); void onActivatePlayBlackMode(); void onActivatePlayoutPositionMode(); void onActivateGameAnalysisMode(); void onSetEnginesClicked(); void onOptionsClicked(); void onStateChange(); void onBestMove(QString uci_move); void onBestPv(QString pvs); void onMateDetected(int mateIn); void onEval(float eval); void onMultiPVChanged(int nrLines); }; #endif // MODE_CONTROLLER_H jerry-3.2.0/src/controller/file_controller.h0000664000175000017500000000341113514421177017700 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef FILE_CONTROLLER_H #define FILE_CONTROLLER_H #include #include "model/game_model.h" class FileController : public QObject { Q_OBJECT public: explicit FileController(GameModel *gameModel, QWidget *parent); private: GameModel *gameModel; QWidget *parentWidget; void saveGameTo(QString &filename); WId board; //? void setupNewGame(chess::Game* g); void openGameFrom(QString &path, QString &absoluteFilename, bool reOpen); void openInCurrentPgnAt(int idx); signals: void newGamePlayBlack(); void newGamePlayWhite(); void newGameEnterMoves(); public slots: void printGame(); void printPosition(); void newGame(); void openGame(); void saveGame(); void saveAsNewGame(); void toolbarSaveGame(); void toolbarOpenCurrentPGN(); void toolbarNextGameInPGN(); void toolbarPrevGameInPGN(); void openDatabase(); }; #endif // FILE_CONTROLLER_H jerry-3.2.0/src/controller/mode_controller.cpp0000664000175000017500000005502113514421177020244 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mode_controller.h" #include "dialogs/dialog_guioptions.h" #include "uci/uci_controller.h" #include #include "dialogs/dialog_engines.h" #include "dialogs/dialog_gameanalysis.h" #include "various/messagebox.h" #include "chess/game_node.h" #include "chess/game.h" #include #ifdef __APPLE__ #include #endif #ifdef __linux__ #include #endif ModeController::ModeController(GameModel *gameModel, UciController *controller, QWidget *parent) : QObject(parent) { this->uci_controller = controller; this->gameModel = gameModel; this->parentWidget = parent; } void ModeController::onBestPv(QString pvs) { if(this->gameModel->getMode() == MODE_GAME_ANALYSIS) { this->gameModel->currentBestPv = pvs; } } void ModeController::onMateDetected(int mateIn) { if(this->gameModel->getMode() == MODE_GAME_ANALYSIS) { this->gameModel->currentMateInMoves = mateIn; } } void ModeController::onEval(float eval) { if(this->gameModel->getMode() == MODE_GAME_ANALYSIS) { this->gameModel->currentEval = eval; } } void ModeController::onBestMove(QString uci_move) { if(this->gameModel->getMode() == MODE_PLAY_BLACK || this->gameModel->getMode() == MODE_PLAY_WHITE || this->gameModel->getMode() == MODE_PLAYOUT_POS) { chess::Move m = chess::Move(uci_move); chess::Board b = this->gameModel->getGame()->getCurrentNode()->getBoard(); if(b.is_legal_move(m)) { this->gameModel->getGame()->applyMove(m); this->gameModel->triggerStateChange(); } } if(this->gameModel->getMode() == MODE_GAME_ANALYSIS) { // completely skip that for black or white, if // that was chosen in the analysis chess::GameNode *current = this->gameModel->getGame()->getCurrentNode(); bool turn = current->getBoard().turn; int analyse = this->gameModel->gameAnalysisForPlayer; if( (analyse == ANALYSE_BOTH_PLAYERS) || (analyse==ANALYSE_WHITE_ONLY && turn == chess::WHITE) || (analyse==ANALYSE_BLACK_ONLY && turn == chess::BLACK)) { // check the result of the current analysis // first check if the first move in the bestpv // of this node is the same move as the first // child move //qDebug() << "at node: " << current->getMove()->uci(); //qDebug() << "best pv: " << this->gameModel->currentBestPv; //qDebug() << "current eval: " << this->gameModel->currentEval; //qDebug() << "current mate: " << this->gameModel->currentMateInMoves; //qDebug() << "prev best pv: " << this->gameModel->prevBestPv; //qDebug() << "prev eval: " << this->gameModel->prevEval; //qDebug() << "prev mate: " << this->gameModel->prevMateInMoves; QString first_move_current_pv = this->gameModel->currentBestPv.split(" ")[0]; if(!first_move_current_pv.isEmpty() && !current->isLeaf() && first_move_current_pv != current->getVariation(0)->getMove().uci()) { if( ((abs(this->gameModel->currentEval - this->gameModel->prevEval) > this->gameModel->analysisThreshold) && this->gameModel->prevMateInMoves < 0 && this->gameModel->currentMateInMoves < 0) || (this->gameModel->prevMateInMoves < 0 && this->gameModel->currentMateInMoves > 0) // player missed mate || (this->gameModel->prevMateInMoves > 0 && this->gameModel->currentMateInMoves < 0)) { // player allowed mate // add best pv variation QStringList pv_list = this->gameModel->currentBestPv.split(" "); for(int i=0;igetBoard(); // chess::Board *new_board = current_board.copy_and_apply(mi); //chess::Board new_board = chess::Board(current); //new_board.apply(mi); current_board.apply(mi); chess::GameNode *gn = new chess::GameNode(); gn->setBoard(current_board); gn->setMove(mi); current->addVariation(gn); //qDebug() << "current board nr: " << current_board.fullmove_number; //qDebug() << "new board: " << new_board.fullmove_number; //qDebug() << "gn board nr:" << new_board->fullmove_number; //qDebug() << "node san: " << gn->getSan(); current = gn; chess::Board current_board_temp = current->getBoard(); //qDebug() << "after setting: " << current_board_temp.fullmove_number; //qDebug() << " "; } } current = this->gameModel->getGame()->getCurrentNode(); // set the evals as a comment if(current->getVariations().count() >= 2) { if(this->gameModel->prevMateInMoves < 0 && this->gameModel->currentMateInMoves > 0) { // player missed a mate //qDebug() << "missed mate: " << this->gameModel->prevEval; QString c0 = QString::number(this->gameModel->prevEval, 'f', 2); current->getVariation(0)->setComment(c0); // skip variation comment, if we have mate in 0 if(this->gameModel->currentMateInMoves-1 > 0) { QString c1 = QString("#").append(QString::number(this->gameModel->currentMateInMoves-1)); current->getVariation(1)->setComment(c1); } } else if(this->gameModel->prevMateInMoves >= 0 && this->gameModel->currentMateInMoves < 0) { // player allowed a mate against him QString c0 = QString::number(this->gameModel->currentEval, 'f', 2); QString c1 = QString("#").append(QString::number(this->gameModel->prevMateInMoves)); current->getVariation(0)->setComment(c1); current->getVariation(1)->setComment(c0); } else if(this->gameModel->prevMateInMoves < 0 && this->gameModel->currentMateInMoves < 0){ QString c0 = QString::number(this->gameModel->prevEval, 'f', 2); QString c1 = QString::number(this->gameModel->currentEval, 'f', 2); current->getVariation(0)->setComment(c0); current->getVariation(1)->setComment(c1); } } this->gameModel->getGame()->setTreeWasChanged(true); } } } this->gameModel->prevBestPv = this->gameModel->currentBestPv; this->gameModel->prevEval = this->gameModel->currentEval; this->gameModel->prevMateInMoves = this->gameModel->currentMateInMoves; this->gameModel->currentBestPv = QString(""); this->gameModel->currentEval = -10000; this->gameModel->currentMateInMoves = -1; this->gameModel->triggerStateChange(); } } void ModeController::onSetEnginesClicked() { // temp. stop current mode, reset after // user finished selecting engines this->gameModel->setMode(MODE_ENTER_MOVES); this->onActivateEnterMovesMode(); this->gameModel->triggerStateChange(); DialogEngines *dlg = new DialogEngines(this->gameModel); int result = dlg->exec(); if(result == QDialog::Accepted) { // replace engine list with dialog list this->gameModel->setEngines(dlg->engines); this->gameModel->setActiveEngine(dlg->activeEngineIdx); // this->gameModel->triggerStateChange(); } this->gameModel->setLastAddedEnginePath(dlg->lastAddedEnginePath); delete dlg; // reset to prev. mode user was in before tampering // with engines /* if(currentMode == MODE_PLAY_WHITE) { this->onActivatePlayWhiteMode(); } else if(currentMode == MODE_PLAY_BLACK){ this->onActivatePlayBlackMode(); } else if(currentMode == MODE_ANALYSIS) { this->onActivateAnalysisMode(); } else if(currentMode == MODE_ANALYSIS) { this->onActivateGameAnalysisMode(); }*/ } void ModeController::onOptionsClicked() { ColorStyle *newColorStyle = new ColorStyle(*this->gameModel->colorStyle); FontStyle *newFontStyle = new FontStyle(*this->gameModel->fontStyle); DialogGuiOptions *dlg = new DialogGuiOptions(newColorStyle, newFontStyle, this->parentWidget); int result = dlg->exec(); if(result == QDialog::Accepted) { delete this->gameModel->colorStyle; delete this->gameModel->fontStyle; this->gameModel->colorStyle = newColorStyle; this->gameModel->fontStyle = newFontStyle; this->gameModel->getGame()->setTreeWasChanged(true); this->gameModel->triggerStateChange(); } else { delete newColorStyle; delete newFontStyle; } delete dlg; } void ModeController::onStateChangeEnterMoves() { // not much to do here... } void ModeController::onStateChangeAnalysis() { QString fen = this->gameModel->getGame()->getCurrentNode()->getBoard().fen(); this->uci_controller->uciSendCommand("stop"); this->uci_controller->uciSendFen(fen); QString position = QString("position fen ").append(fen); this->uci_controller->uciSendPosition(position); this->uci_controller->uciGoInfinite(); } void ModeController::onStateChangeGameAnalysis() { MessageBox *msg = new MessageBox(this->parentWidget); // go to the parent node, if there is any. if root, then abort chess::GameNode *parent = this->gameModel->getGame()->getCurrentNode()->getParent(); if(parent == 0) { this->gameModel->setMode(MODE_ENTER_MOVES); msg->showMessage(tr("Game Analysis"), tr("The analysis is finished.")); } else if(this->gameModel->isInBook(parent)) { QString cmt = QString("last book move"); parent->setComment(cmt); this->gameModel->getGame()->setTreeWasChanged(true); this->gameModel->setMode(MODE_ENTER_MOVES); this->gameModel->triggerStateChange(); msg->showMessage(tr("Game Analysis"), tr("The analysis is finished.")); } else { // if we just started game analysis, first get the // evaluation for the leaf node. Only afterwards go // to the parent node. if(!this->gameModel->gameAnalysisStarted) { this->gameModel->getGame()->setCurrent(parent); } else { this->gameModel->gameAnalysisStarted = false; } QString fen = parent->getBoard().fen(); this->uci_controller->uciSendCommand("stop"); this->uci_controller->uciSendFen(fen); QString position = QString("position fen ").append(fen); this->uci_controller->uciSendPosition(position); this->uci_controller->uciGoMovetime(this->gameModel->engineThinkTimeMs); } delete msg; } void ModeController::onMultiPVChanged(int nrLines) { this->gameModel->nrPvLines = nrLines; if(this->gameModel->getMode() == MODE_ANALYSIS) { this->onActivateEnterMovesMode(); this->onActivateAnalysisMode(); } } void ModeController::onActivateAnalysisMode() { // first change gamestate and reset engine this->uci_controller->uciSendCommand("quit"); QString engine_path = this->gameModel->getActiveEngine().getPath(); //qDebug() << "mode contr:" << engine_path; this->uci_controller->startEngine(engine_path); this->uci_controller->uciNewgame(); this->uci_controller->uciSendCommand("uci"); // set engine strength to MAX // since we use stockfish, this is 20 // will be just ignored by other engines // internal engine is always at idx 0. todo: Add global const // for 0, i.e. INTERNAL_ENGINE_IDX if(this->gameModel->getActiveEngineIdx() == 0) { this->uci_controller->uciStrength(20); } QVector en_opts = this->gameModel->getActiveEngine().getUciOptions(); this->uci_controller->sendEngineOptions(en_opts); // also send multi pv command according to current selection this->uci_controller->uciMultiPV(this->gameModel->nrPvLines); // then trigger state change this->gameModel->setMode(MODE_ANALYSIS); this->gameModel->triggerStateChange(); } void ModeController::onActivateEnterMovesMode() { // stop any running engine this->uci_controller->uciSendCommand("stop"); this->uci_controller->uciSendCommand("quit"); // trigger statechange this->gameModel->setMode(MODE_ENTER_MOVES); this->gameModel->triggerStateChange(); } void ModeController::onActivatePlayWhiteMode() { // first change gamestate and reset engine this->uci_controller->uciSendCommand("quit"); QString engine_path = this->gameModel->getActiveEngine().getPath(); this->uci_controller->startEngine(engine_path); this->uci_controller->uciNewgame(); this->uci_controller->uciSendCommand("uci"); if(this->gameModel->getActiveEngineIdx() == 0) { this->uci_controller->uciStrength(this->gameModel->getEngineStrength()); } QVector en_opts = this->gameModel->getActiveEngine().getUciOptions(); this->uci_controller->sendEngineOptions(en_opts); // trigger statechange this->gameModel->setMode(MODE_PLAY_WHITE); this->gameModel->flipBoard = false; this->gameModel->humanPlayerColor = chess::WHITE; this->gameModel->triggerStateChange(); } void ModeController::onActivatePlayBlackMode() { // first change gamestate and reset engine this->uci_controller->uciSendCommand("quit"); QString engine_path = this->gameModel->getActiveEngine().getPath(); this->uci_controller->startEngine(engine_path); this->uci_controller->uciNewgame(); this->uci_controller->uciSendCommand("uci"); if(this->gameModel->getActiveEngineIdx() == 0) { this->uci_controller->uciStrength(this->gameModel->getEngineStrength()); } QVector en_opts = this->gameModel->getActiveEngine().getUciOptions(); this->uci_controller->sendEngineOptions(en_opts); // trigger statechange this->gameModel->setMode(MODE_PLAY_BLACK); this->gameModel->humanPlayerColor = chess::BLACK; this->gameModel->flipBoard = true; this->gameModel->triggerStateChange(); } void ModeController::onActivateGameAnalysisMode() { bool run = false; DialogGameanalysis *dlg = new DialogGameanalysis(this->gameModel->engineThinkTimeMs, this->gameModel->analysisThreshold); if(dlg->exec() == QDialog::Accepted) { run = true; this->gameModel->engineThinkTimeMs = dlg->secsPerMove; this->gameModel->analysisThreshold = dlg->threshold; if(dlg->rbAnalyseBoth->isChecked()) { this->gameModel->gameAnalysisForPlayer = ANALYSE_BOTH_PLAYERS; } else if(dlg->rbAnalyseWhite->isChecked()) { this->gameModel->gameAnalysisForPlayer = ANALYSE_WHITE_ONLY; } else { this->gameModel->gameAnalysisForPlayer = ANALYSE_BLACK_ONLY; } } delete dlg; if(run) { // delete all comments and variants this->gameModel->getGame()->removeAllComments(); this->gameModel->getGame()->removeAllVariants(); this->gameModel->getGame()->setTreeWasChanged(true); // first change gamestate and reset engine this->uci_controller->uciSendCommand("quit"); QString engine_path = this->gameModel->getActiveEngine().getPath(); this->uci_controller->startEngine(engine_path); this->uci_controller->uciNewgame(); this->uci_controller->uciSendCommand("uci"); QVector en_opts = this->gameModel->getActiveEngine().getUciOptions(); this->uci_controller->sendEngineOptions(en_opts); // set engine strength to MAX // since we use stockfish, this is 20 if(this->gameModel->getActiveEngineIdx() == 0) { this->uci_controller->uciStrength(20); } // trigger statechange this->gameModel->setMode(MODE_GAME_ANALYSIS); this->gameModel->flipBoard = false; this->gameModel->getGame()->goToLeaf(); this->gameModel->gameAnalysisStarted = true; this->gameModel->triggerStateChange(); } } void ModeController::onStateChangePlayWhiteOrBlack() { // first check if we can apply a bookmove chess::GameNode *current = this->gameModel->getGame()->getCurrentNode(); bool usedBook = false; QString uci = QString(""); if(this->gameModel->canAndMayUseBook(current)) { QVector mvs = this->gameModel->getBookMoves(current); if(mvs.size() > 0) { int sel = (rand() % (int)(mvs.size())); chess::Move mi = mvs.at(sel); uci = mi.uci(); usedBook = true; } } if(!usedBook) { QString fen = this->gameModel->getGame()->getCurrentNode()->getBoard().fen(); this->uci_controller->uciSendFen(fen); QString position = QString("position fen ").append(fen); this->uci_controller->uciSendPosition(position); this->uci_controller->uciGoMovetime(this->gameModel->engineThinkTimeMs); } else { this->onBestMove(uci); } } void ModeController::onActivatePlayoutPositionMode() { // first change gamestate and reset engine this->uci_controller->uciSendCommand("quit"); QString engine_path = this->gameModel->getActiveEngine().getPath(); this->uci_controller->startEngine(engine_path); this->uci_controller->uciNewgame(); this->uci_controller->uciSendCommand("uci"); QVector en_opts = this->gameModel->getActiveEngine().getUciOptions(); this->uci_controller->sendEngineOptions(en_opts); // trigger statechange this->gameModel->setMode(MODE_PLAYOUT_POS); this->gameModel->flipBoard = false; this->gameModel->triggerStateChange(); } void ModeController::onStateChangePlayoutPosition() { QString fen = this->gameModel->getGame()->getCurrentNode()->getBoard().fen(); this->uci_controller->uciSendFen(fen); QString position = QString("position fen ").append(fen); this->uci_controller->uciSendPosition(position); this->uci_controller->uciGoMovetime(this->gameModel->engineThinkTimeMs); } void ModeController::onStateChange() { int mode = this->gameModel->getMode(); int turn = this->gameModel->getGame()->getCurrentNode()->getBoard().turn; MessageBox *msg = new MessageBox(this->parentWidget); chess::GameNode *current = this->gameModel->getGame()->getCurrentNode(); // check if the game has ended by checkmate or stalemate // only show message if // human plays: show info, change mode to enter moves // enter moves mode & analysis mode: show info but only // if the node was just created if(current->getBoard().is_checkmate()) { if(mode == MODE_PLAY_WHITE || mode == MODE_PLAY_BLACK) { current->userWasInformedAboutResult = true; msg->showMessage(tr("Checkmate"), tr("The game is over!")); if(mode == MODE_PLAY_WHITE) { this->gameModel->getGame()->setResult(chess::RES_WHITE_WINS); this->gameModel->getGame()->setTreeWasChanged(true); } else { this->gameModel->getGame()->setResult(chess::RES_BLACK_WINS); this->gameModel->getGame()->setTreeWasChanged(true); } this->onActivateEnterMovesMode(); } else if((mode == MODE_ANALYSIS || mode == MODE_ENTER_MOVES) && !current->userWasInformedAboutResult) { current->userWasInformedAboutResult = true; msg->showMessage(tr("Checkmate"), tr("The game is over!")); } } // same for stalemate if(current->getBoard().is_stalemate()) { if(mode == MODE_PLAY_WHITE || mode == MODE_PLAY_BLACK) { msg->showMessage(tr("Stalemate"), tr("The game is drawn!")); this->onActivateEnterMovesMode(); } else if((mode == MODE_ANALYSIS || mode == MODE_ENTER_MOVES) && !current->userWasInformedAboutResult) { msg->showMessage(tr("Stalemate"), tr("The game is drawn!")); } current->userWasInformedAboutResult = true; } // 50 moves rule if(current->getBoard().can_claim_fifty_moves()) { if(mode == MODE_PLAY_WHITE || mode == MODE_PLAY_BLACK) { this->gameModel->getGame()->setTreeWasChanged(true); msg->showMessage(tr("Draw"), tr("50 moves rule")); this->onActivateEnterMovesMode(); } else if((mode == MODE_ANALYSIS || mode == MODE_ENTER_MOVES) && !current->userWasInformedAboutResult) { msg->showMessage(tr("Draw"), tr("50 moves rule")); } current->userWasInformedAboutResult = true; } if(current->getBoard().is_threefold_repetition()) { if(mode == MODE_PLAY_WHITE || mode == MODE_PLAY_BLACK) { msg->showMessage(tr("Draw"), tr("Threefold repetition")); this->onActivateEnterMovesMode(); } else if((mode == MODE_ANALYSIS || mode == MODE_ENTER_MOVES) && !current->userWasInformedAboutResult) { msg->showMessage(tr("Draw"), tr("Threefold repetition")); } current->userWasInformedAboutResult = true; } if(mode == MODE_ANALYSIS) { this->onStateChangeAnalysis(); } else if(mode == MODE_ENTER_MOVES) { this->onStateChangeEnterMoves(); } else if((mode == MODE_PLAY_WHITE || mode == MODE_PLAY_BLACK) && turn != this->gameModel->humanPlayerColor) { this->onStateChangePlayWhiteOrBlack(); } else if(this->gameModel->getMode() == MODE_PLAYOUT_POS) { this->onStateChangePlayoutPosition(); } else if(mode == MODE_GAME_ANALYSIS) { this->onStateChangeGameAnalysis(); } delete msg; } jerry-3.2.0/src/controller/edit_controller.h0000664000175000017500000000250113514421177017705 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef EDIT_CONTROLLER_H #define EDIT_CONTROLLER_H #include #include "model/game_model.h" class EditController : public QObject { Q_OBJECT public: explicit EditController(GameModel *gameModel, QWidget *parent); private: GameModel *gameModel; QWidget *parentWidget; signals: public slots: void copyGameToClipBoard(); void copyPositionToClipBoard(); void enterPosition(); void editHeaders(); void paste(); }; #endif // EDIT_CONTROLLER_H jerry-3.2.0/src/controller/edit_controller.cpp0000664000175000017500000001214413514421177020244 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "edit_controller.h" #include "chess/pgn_printer.h" #include #include #include "dialogs/dialog_enterposition.h" #include "dialogs/dialog_editheaders.h" #include #include #include "chess/pgn_reader.h" EditController::EditController(GameModel *gameModel, QWidget *parent) : QObject(parent) { this->gameModel = gameModel; this->parentWidget = parent; } void EditController::copyGameToClipBoard() { chess::PgnPrinter *pgnPrinter = new chess::PgnPrinter(); QString pgn = pgnPrinter->printGame(*this->gameModel->getGame()).join("\n"); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(pgn); } void EditController::copyPositionToClipBoard() { QString fen = this->gameModel->getGame()->getCurrentNode()->getBoard().fen(); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(fen); } void EditController::paste() { QClipboard *clipboard = QApplication::clipboard(); QString text = clipboard->text(); // first check whether text is fen string, try to create a board try { chess::Board b(text); this->gameModel->getGame()->resetWithNewRootBoard(std::move(b)); this->gameModel->getGame()->setTreeWasChanged(true); this->gameModel->triggerStateChange(); } catch(std::invalid_argument e) { std::cerr << e.what() << std::endl; // not a fen string. let's try pgn try { chess::PgnReader *reader = new chess::PgnReader(); chess::Game* g = reader->readGameFromString(text); this->gameModel->setGame(g); this->gameModel->getGame()->setTreeWasChanged(true); this->gameModel->triggerStateChange(); } catch(std::invalid_argument e) { std::cerr << e.what() << std::endl; } } } void EditController::enterPosition() { chess::Board currentBoard = this->gameModel->getGame()->getCurrentNode()->getBoard(); DialogEnterPosition *dlg = new DialogEnterPosition(currentBoard, *this->gameModel->colorStyle, this->parentWidget); if(dlg->exec() == QDialog::Accepted) { chess::Board new_board = dlg->getCurrentBoard(); //std::cout << "GOT BOARD FROM DLG: " << std::endl; //std::cout << this->gameModel->getGame()->getCurrentNode()->getBoard() << "\n"; this->gameModel->getGame()->resetWithNewRootBoard(new_board); //std::cout << "CURRENT NODE BOARD: " << std::endl; //std::cout << this->gameModel->getGame()->getCurrentNode()->getBoard() << "\n"; this->gameModel->triggerStateChange(); } } void EditController::editHeaders() { DialogEditHeaders *dlg = new DialogEditHeaders(*this->gameModel->getGame(), this->parentWidget); if(dlg->exec() == QDialog::Accepted) { this->gameModel->getGame()->setHeader("Event", dlg->leEvent->text()); this->gameModel->getGame()->setHeader("Site", dlg->leSite->text()); this->gameModel->getGame()->setHeader("Date", dlg->leDate->text()); this->gameModel->getGame()->setHeader("Round", dlg->leRound->text()); this->gameModel->getGame()->setHeader("White", dlg->leWhite->text()); this->gameModel->getGame()->setHeader("Black", dlg->leBlack->text()); this->gameModel->getGame()->setHeader("ECO", dlg->leECO->text()); if(dlg->rbBlackWins->isChecked()) { this->gameModel->getGame()->setResult(chess::RES_BLACK_WINS); this->gameModel->getGame()->setHeader("Result", "0-1"); } else if(dlg->rbWhiteWins->isChecked()) { this->gameModel->getGame()->setResult(chess::RES_WHITE_WINS); this->gameModel->getGame()->setHeader("Result", "1-0"); } else if(dlg->rbDraw->isChecked()) { this->gameModel->getGame()->setResult(chess::RES_DRAW); this->gameModel->getGame()->setHeader("Result", "1/2-1/2"); } else if(dlg->rbUndefined->isChecked()) { this->gameModel->getGame()->setResult(chess::RES_UNDEF); this->gameModel->getGame()->setHeader("Result", "*"); } this->gameModel->getGame()->setTreeWasChanged(true); } delete dlg; this->gameModel->triggerStateChange(); } jerry-3.2.0/src/res/0000775000175000017500000000000013514421177012754 5ustar useruserjerry-3.2.0/src/res/pieces/0000775000175000017500000000000013514421177014224 5ustar useruserjerry-3.2.0/src/res/pieces/merida/0000775000175000017500000000000013514421177015465 5ustar useruserjerry-3.2.0/src/res/pieces/merida/author.txt0000664000175000017500000000005213514421177017525 0ustar useruserUnknown Modified for Raptor by Gorgonian. jerry-3.2.0/src/res/pieces/merida/wr.svg0000664000175000017500000001125513514421177016642 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/bn.svg0000664000175000017500000002132513514421177016610 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/wb.svg0000664000175000017500000002775213514421177016633 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/wq.svg0000664000175000017500000004306313514421177016643 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/bb.svg0000664000175000017500000002214613514421177016576 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/wp.svg0000664000175000017500000001325213514421177016637 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/bk.svg0000664000175000017500000002771113514421177016612 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/bq.svg0000664000175000017500000002041413514421177016611 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/bp.svg0000664000175000017500000000547413514421177016621 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/wn.svg0000664000175000017500000002433313514421177016637 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/br.svg0000664000175000017500000001203713514421177016614 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/merida/wk.svg0000664000175000017500000002435713514421177016642 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/wn.svg~0000664000175000017500000002433313514421177015574 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/wk.svg~0000664000175000017500000002435713514421177015577 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/wq.svg~0000664000175000017500000004306313514421177015600 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/0000775000175000017500000000000013514421177015002 5ustar useruserjerry-3.2.0/src/res/pieces/old/author.txt0000664000175000017500000000005213514421177017042 0ustar useruserUnknown Modified for Raptor by Gorgonian. jerry-3.2.0/src/res/pieces/old/wr.svg0000664000175000017500000002762513514421177016167 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/bn.svg0000664000175000017500000001652213514421177016130 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/wb.svg0000664000175000017500000001667213514421177016147 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/wq.svg0000664000175000017500000002626713514421177016167 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/bb.svg0000664000175000017500000001250513514421177016111 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/wp.svg0000664000175000017500000001536213514421177016160 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/bk.svg0000664000175000017500000002034413514421177016122 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/bq.svg0000664000175000017500000002612013514421177016126 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/bp.svg0000664000175000017500000001230613514421177016126 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/wn.svg0000664000175000017500000002246613514421177016161 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/br.svg0000664000175000017500000001613213514421177016131 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/old/wk.svg0000664000175000017500000002265213514421177016153 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/wp.svg~0000664000175000017500000001325213514421177015574 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/0000775000175000017500000000000013514421177015164 5ustar useruserjerry-3.2.0/src/res/pieces/uscf/author.txt0000664000175000017500000000005213514421177017224 0ustar useruserUnknown Modified for Raptor by Gorgonian. jerry-3.2.0/src/res/pieces/uscf/wr.svg0000664000175000017500000001050313514421177016334 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/bn.svg0000664000175000017500000002012113514421177016300 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/wb.svg0000664000175000017500000002771313514421177016327 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/wq.svg0000664000175000017500000003124713514421177016343 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/bb.svg0000664000175000017500000002210013514421177016263 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/wp.svg0000664000175000017500000001533613514421177016343 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/bk.svg0000664000175000017500000003260413514421177016306 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/bq.svg0000664000175000017500000002015713514421177016314 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/bp.svg0000664000175000017500000000607613514421177016317 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/wn.svg0000664000175000017500000002660413514421177016341 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/br.svg0000664000175000017500000000567613514421177016326 0ustar useruser image/svg+xml jerry-3.2.0/src/res/pieces/uscf/wk.svg0000664000175000017500000002760413514421177016337 0ustar useruser image/svg+xml jerry-3.2.0/src/res/stylesheets/0000775000175000017500000000000013514421177015330 5ustar useruserjerry-3.2.0/src/res/stylesheets/ribbon.css0000664000175000017500000000156313514421177017322 0ustar useruserQToolBar { padding: 0px; } QTabWidget:pane { border-radius: 0px; margin:0px; padding: 0px; background-color: qlineargradient(x1: 0, y1: 1, x2: 0, y2: 0, stop: 0 #efefef, stop: 0.5 #e5e5e5, stop: 1.0 #fdfdfd); border-bottom: 1px solid rgba(0,0,0,20%); border-top: 1px solid rgba(0,0,0,20%); top: -1; } QTabWidget{ } QTabWidget::tab-bar { left: 2px; } QTabBar::tab { padding-top: 4px; padding-bottom: 4px; padding-left: 12px; padding-right: 12px; border-top-left-radius: 3px; border-top-right-radius: 3px; margin-right:5px; color:#2A2A2A; } QTabBar::tab:hover { background: rgba(255, 119, 0, 20%); } QTabBar::tab:selected{ background: qlineargradient(x1: 0, y1: 1, x2: 0, y2: 0, stop: 0 #fdfdfd, stop: 1.0 #efefef); color: #2A2A2A; border: 1px solid rgba(0,0,0,20%); border-bottom-color: #f9f9f9; }jerry-3.2.0/src/res/stylesheets/ribbonButton.css0000664000175000017500000000132313514421177020510 0ustar useruserQToolButton { text-align: left; border: 1px solid transparent; padding: 0px; margin-left:2px; margin-right:2px; } QToolButton:hover { border: 1px solid rgba(120,160,255,60%); background-color: QLinearGradient(spread:pad, x1: 0, y1: 1, x2: 0, y2: 0, stop: 0 rgba(150,180,200,30%),stop: 0.5 rgba(225,235,245,60%), stop: 1 rgba(225,235,245,30%)); } QToolButton:pressed{ border: 1px solid rgba(120,160,255,80%); background-color: QLinearGradient(spread:pad, x1: 0, y1: 1, x2: 0, y2: 0, stop: 0 rgba(150,180,200,50%),stop: 0.5 rgba(225,235,245,80%), stop: 1 rgba(225,235,245,50%)); } QToolButton:checked{ border: 1px solid rgba(120,160,255,40%); background-color: rgba(0,0,0,10%) }jerry-3.2.0/src/res/stylesheets/ribbonPane.css0000664000175000017500000000011313514421177020114 0ustar useruserQWidget { border: 0px solid black; margin: 0px; padding: 0px; }jerry-3.2.0/src/res/stylesheets/ribbonSmallButton.css0000664000175000017500000000124713514421177021506 0ustar useruserQToolButton { text-align: left; border: 1px solid transparent; margin:2px; } QToolButton:hover { border: 1px solid rgba(120,160,255,60%); background-color: QLinearGradient(spread:pad, x1: 0, y1: 1, x2: 0, y2: 0, stop: 0 rgba(150,180,200,30%),stop: 0.5 rgba(225,235,245,60%), stop: 1 rgba(225,235,245,30%)); } QToolButton:pressed{ border: 1px solid rgba(120,160,255,80%); background-color: QLinearGradient(spread:pad, x1: 0, y1: 1, x2: 0, y2: 0, stop: 0 rgba(150,180,200,50%),stop: 0.5 rgba(225,235,245,80%), stop: 1 rgba(225,235,245,50%)); } QToolButton:checked{ border: 1px solid rgba(120,160,255,40%); background-color: rgba(0,0,0,10%) }jerry-3.2.0/src/res/stylesheets/main.css0000664000175000017500000000005113514421177016762 0ustar useruserQWidget{ background-color: #dfe9f5; }jerry-3.2.0/src/res/board/0000775000175000017500000000000013514421177014043 5ustar useruserjerry-3.2.0/src/res/board/marble_green_dark.jpg0000664000175000017500000002762113514421177020200 0ustar useruserJFIFHHC       C "D!"12AQBRaq#b3rC4S$c$!1A"Qa2qR ?]e89n{*Z6&t\HR4D+^ftTtY529^V] x 6Oy~Zh2tG,ƍ]am?*C@c-V>@&*%?C +FUoC1S#sЕ]~O3,߽l}b'?xfel;|HL /.-dQ8.@a{}4,PH"<(ڴbo.%J0d* ZSyj`1t},v+U[HlCP= XEHcZ~\xIS@5̈_TwuRnݙOYפYqRZ~. 8&Yeo}Kyqc9z]TJܟom7.uGdKt {xHH D_f)#cNKx(ui9&4J$ οWW\Ƞ-O|6DK*iCŕЧZ̨`Aǭ MկTF %KSIJCH͕ (! (VA 2vɷN* 3R"ek-@*9v+yc 崜$K[rDc1#L?ow8i}<_v)y9:I#s} ɃG(wdp҄}ɰΖJ#xŏWLNW/1}9OΎɗJyeЩ!x3$}?9PJH ֵ=oeJzhLambWYd6hcWuZT)ǁ$ F^ErY=lgSH̘.2*ɗs'͖yc ;: O9Olv!c%4:I"&J /p6ViQQ,#rg+#]PA[dNX^ i) HSp }]VK@Um#_!y|!}ڣ6qõ_j +[{u5,JNHqBO+XcY6Vb6FO`gi^Y67\-㾑>#N*ɋ2nݻ6G_AAUGY_LEQv6>!^Y:#~첪+kIYAN*:r)v骉RK3(S"7`öW)Q#C 8r1lПjl$\tlq=(ٛ&mR):)[Q~d#fCg+--v:kP!u"}cH"1ؿfXt1J1tVf_M= ΥZw _mSDԑ:Dg9]n7D4&Cnů92(32"G)K LgKXoݶ֪1hut[]|,;-&/cdcƑ;K_zS+Kx\:eU~-V9\r@vұԫDTk7hZKP0UHo֦1-<+roݿ=lc2r#_$[}tud̦+.8[o=WzRT}\O$ǰq#u^JM, 9 }OAˎ[0w/@#b1v=GoWq4 f3Eˊ1>[/_KˢGd98~;kaJeLrB΃4]DʵDFLQE ߲1n8+$%#F|Y U_F]bl1IT #jRƮ)VU iýe-: .".V8(ok{"d*Xf#nU}a8<#*㵿7YJJdWO]/Դ̴&+5ci*W- ό1b=jNy*1X<|>y1m8RGJY^b|=:IZB^F;EZ̐·fUFnڟ(bp!Nf+Կ˄uB\v. ĸq\kʵ5qX%I7DŽX^xf,~c_T/0Gf+)41'3Y{ozry#`8,>A::oZSpP3QE*<#gVK7kiq4?-8y ܜro_ٸ_4XԱgu=#!QM"KE)2%n 9ʌ3t?)ǝ<ݬ.צƙ戲%ZiFOP;!n$Yqv- w*tGHsǴ~?2@V DRuMI>xdҮ3JmQD LrUPYvU^h lkjouFe9ub |5X/E VL<8)\7-};?2z ISTƥj1S!L'YB[UշUUnBRwژ5TQ2HqU73YBI%& 7Xi'uu-oQ"oOO$7,?P .GU~x+ژ/*d>ܿVfJhj n2_C*ag $ ]cqH;LatF0,vkۧJ_}RմF8Z⪎?g%6:Y8M--#IUőx5Yaʀ60tO6 j+-DIIM%$"(bc/V`tt+K[D*C*Kwh>q\SV%lr)G=![멛Td0SL+l1;y^p"4+6"q^-_B#D>X/o ܭ8L:_{iNidh•e b*ҜGяc*J*/x 9 h*N.*|\DD(ϑ]&Jt,ԊuE@1}-f~V͖nkf;ZWEO$f&'?_>U\;Zin`8n dRgCILFd^ڧ3ĭd7Z.Ф@ .\_oIhuNilG҂G>_)2c8neϟNrf*T1fև[M 8~e<ҏ<Ҏ#Fh 7\Z'E s4*nǤ-}th%#eAE-&Y_o]Ot"S;*o,lAV#O^ڀvnr-/op7% I+[/ YH]{TXFq̍,nr6RZ/8.U[M%iZqeznhelGu>f67ISb4Uɋ SK"-O6[/k_iW$r$23|2X_g8y3[ TQX{"bTutR3#ӤjY/<+ɓԼI%Yd-&2SSC,!fhՙzS%t͞t) -k犦ucsjeFRϷFh8#0q՝+Z<󪧴$/SkCZIJJcc;~I<OJg/Ex'" 1ŝ Z%4| NO'IbVҤ9$trroyEM%=^w*vQK[i$E"GFBqf x'1nTwP 1j@RI 0=1Up%QRHjfi&H٬MuGN GpI室_pO<50IJ3>L![g㥎9eK"./0dQȒ-&{.,B>>ŅêQː^5>ir%y>KXޚ%}FI ;HF؜Q綣~K0I,kR*.-%/s厖L3 \2}=nT3_%u9*H ^Hui3s -:ד r}X^qIšU[wWe>Vh5)%Qou_>}4&Nle2"+dϩ6zZ4'ŕ|-:ZhӒc"FbqEҭ"-/Dcv1 қuUP 93GUwA+ԑ6)Y}.uCG5#%t+eR׿@7uOM΍\"@Op[F&SSY#cCӒ4~]}O>7n[$F) ,rfKQ% U@oc5_-ddIdFb2,2u( 7Gv_: C2b߇Ѩ~ZT&Cvzd7.Z*aPK4j5ϼЧTi)%n_'kݭS2Y5BN˅+xؐ-iTqFZi"ʧ! @AR$fUDw I%mX~~?PO4Y%=1j^@mɩlG}[Տi* Z-!y`߰ub}FߣP=],J(wdd=R`Zana,埪U>Hi$ܜqVO٭CRb,B%d PS h1TDdh?]vz< -E$ e @ǩRlUx Iͱf&Y[qӤdI"ݬ߶#sܴ!wܖxzኢfC[wl *Pv&LII)v)HoѓKXB+@Wr=5ݙrm~ë#̒F>w#N ѹ8^YZ4蹪Lz|֨򪑘FX+nu5EbC'CH|]ƽ"b]z۶!.)O{hX_*h8ui;*݆OKY\V%EZ~r֏gxY@ݱVhI0h(QQ;kF (5B>]?׮zSCQ#]K6i"w@Fs%x݉6 vBxrk8YM,%H>kW:iXl,` ոjּE^&Zjj)"dj2OЙ&8TУS5?xt]4Z4H1hbܦ`By[Vb}Yicp""!OH'a78ٮBSV!+2+^FVi~Up+,,eqqIֽp%d_Zz8{8ed` [ CLR 3Sl27O,TECuԺS$*s#[w.(YrTduK)-$3E/MHϖ/O6RVtou|bPG|YT؋hK45SEN_dvgGmѯDFM=[jl"u_5UZ?VT! xJX-v[>;VN%=L|y̸m;kGIQqx$|#IJe 9Y.+Y秩x*BI)hN<Ř6jJ94e{ol\>> ʵne9f߶դW PG,3dsᾐy2wu*U:OjTGU4YEJk\2 R5WI\Nl̖elOJi9,aN:wSp+Dv#d}qIqE{*'VJ3 i,7UE<@^{X|zF&N{)yUm$c:ƠM)>3{%@)hY*r %Ƴk+GdZ$,.q[ !=x7 $˙loݵpp%Q,tTQ-{4-gKƥKf\N*YI\m/nTU2ŚkwvkϥM?%buqjs#o쌘Q?EY('=(uEhoviaAXV&hicWfck_x],sAM#?V>}ij~pY\>\N$Z{x< STTSەH..>/k㢊%fLPK_?O-%+ƒ,W]UYt*HdoƘzy&UQYV?{z !I.G-U4KEI# Wɖ]0˥PƕQb/KdZX$bZ/i>}F 5_mߖh [0ko v(@֒Y)e۲rNVܵc:O ҲZ7;oE$h&+$t_.yi(e⥖Ccf7Z0f],=*q]{͵<>/* a*`cX'XE =_X܃?-Hc@~gf$qdʾ%__^'QO59$~]6֥H}wXclJM;k9!*>~訉S7 rѼ_&Ԡ$ DѴb+u/V߻}Q^b/O=:BTZT8O:I )٭m}%gpxECzN:m$W:AfTo/֚J'NIK7LZLq!_,<d9qhmq<^Nn/u-A7I0k_ÿs&aL̞:|:n:ZZB-habF$fU[oMZ*ڞ2 x~"AbXhU~&L;%3JeIqK)?^3;Lʌ /oMΦU*^HceP0fIGf 9&@5 n I <&+t_lH85=RUU2NZRˢ_.𿵏8\\;a<+gz{k+ ~+ٌNZ3EM"4<>i.R.nO{[LYV!c?[#0u}C4[X(#q:gxQ=L4}_ ONB#)k~gMVJvзȋyOC #XeD(v\WkRm"0 6 ג!TP]|JDG<|V bʥotJpS2 @ ,b3X;od%#\}MvpHU͞RR0FVԮeHbdBmmҸ]WhV8#+#d=P³::v؇"nIYTܳ3zUY;ݱZvQINjdGO(m 'y4Iq*[kʺEZ)+:%(U;YmғF~l?RHqLӧ2?׻DSJKic. ]ZvPR)r8Tow";b}?]Zv;4l*Jž lc5 7k}1% Q1^68BE߾G,.y| aa{]e. IC(q(e=D|V'TL%=v@10I-E T:W</v.Bɣjerry-3.2.0/src/res/board/marble_blue_light.jpg0000664000175000017500000000272313514421177020211 0ustar useruserJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"-!1AQaq"2#Bb!1a ?WsA-?AZd-MHuE*p D0L N $=˰GjAbj\S]h% $'G.ndj\<cPY!|IbrF(dSՒU(JB >)\J Ǥ T#AjpDe$@iHS))f[#T&vsVS՜$=>-:OUn{j`G0g0VTt RB͕EE)nS@@B;.v1J ՃZYceJ>Iʢu!2\&^qL%cUsAkAp,"kpЂǰNmh)|HD4H9Q0V( e0 !P6@a)$QB'iY#b=p%J‹@+:}IS+K; >4AW4Yͷ+cv\ԀH&[R̵ʪG >VA,, ʄJQ;.'':ᣀ.(^CӨF2~EKKtiuXq Wj<244H$~?eMG[Au,%Lܴ` VT\+-*UEdaO&U7EPJ%WU$9KͿBT;DŽ1L0@ ,& u> .W:z߲Ę-!TJC\JrC|$ͼ ^:|m=& h'Klo!uJm!Gm#mR%!o?0 TZ۠ -7JD,!A"FP4mL, zHޒ>d@xAڨ9.~OD p+!ACLy *E +5s+ PŁVlJhtd 4F8VQ>?h&΂m mGj0ʻ#CEAA o㉛N$L@iɃPضu/&sYP+x %A'@_%ʃ-C-nQ[`C]`d ɇ P *8[ajerry-3.2.0/src/res/board/wood_light.jpg0000664000175000017500000000770213514421177016712 0ustar useruserJFIFHHExifMM*C  !"$"$C"9!1AQ"2aqB#Rr3bCS!1AQaq ?,\U:MxL_h%C ?39>E$yN*r][ TDKnQTɤv7P}!gF^DUuFfTeN0t9؋(22957d[I\7GLGv"s+ĮA3D*2$`AcC^#/J=H{Cɇ:ޱRJ8hL?r7PWm#~FnE#+_Vb!Rll(H?p~J$wE"O;á~`A9%b5,X0W8&(v*k]ft~x ^9{KdzIݨi˫T]d^cqB cGezYAEF|wQru*zUCeOBqԖkˬZ^249>E~-*>]A"1m;9Ec+ģph#h&;zYo*AŽg"M5t)DӰ+Ҡ-H>FTV`}D6{~*-㌘؃LLzU/f`i556 .{=?co(WZwBZqGx% mWEYusZbP)^-Tք o&VbZ}fu>byب>r,gpBdJjb3.Xi?iQ4aIw&Kak+V+Yyu_lFj2МXSئjEzD|Hw𞣌#Hɣ6͌]_d(5ctXZdU] [6[A"t̹w9]81<1>E."VI$(4+xlL)ȣzoIeEF2u 2_e<@o{]eȇc s#",swQ° .2<G#)S#[x6E~k eFLz'p&eBE1b\(5B!ģ=DaU޻F߰n\Q߬w\#*.:0;>as c M] M\\/iǂ<̌u.Ckcg/A]>CNۥ U l:8ʜX ^շ]f{Tʪ{ ej;\E$Po,&Ad@j&7%'P qA8>د ovVe(K)NZ#-d4ʷMϕN> Z'E1Sm)K}tletD%k YP:BvqTяYC[~f_V~Pث<8bv| i"Iug49_3Lm\:얠%"%WGX_!5P9ʚ 2_}zD<*H;0FojW+m wփ7j@,OIsw*Ce`xc+nYQ2)d'mWL<Ё} {$Kfk*fh\& y͹FmE;U^${3t7;>#@{]GW1܅B91)ٔ=f_0GzȘFA"214195'`+ı6([z&^6t\ XDvp󙱞 X0vU23Aab7Aq1z!SP=ٻ}I7?QzV3] Uɓf2%O",ry5hBg8R4lw+}΋;`kqBccH77 IIݪ5'6Q:wB{&( mCj/YHzd{Z?0Q 98tᶭ+=nrLmqc+k{>w0숺o0ZGf̃x#%Oi08!1 #hmeۖ#" \ k|W~b鏘 m{!ϒ9.GI^M7_M\=?Q|^)9 ܏"ÑAoM7ժB7߀3R}9t>3`-k2QH7= B1#Ѻ~zfV4AuAғy`LB GݦTPA(kXOcD=mxʚz!4Eo&^fPXJ\@ ٓbSUK`(t6FRG"1d]O=(%ew~o^3.!]jĎ-CWsy^=6\[3+n1u| F$݅s@ @/S@YA1 .DmDPW`T{b4w+ExlbWQ'"G66O4t<8}I |O %jV[3V9NL{4>fWx/@3D {NGB׻\YQxX 2#w"b13.6'otpqIB65h +rكT/{ɍ—7% ݘ`CXǽmc#%"YF)zd}8tKP0NeikLr-V&ChG~`o-idQ^C-S4.OrOj??Wj?-}^Dkus?E0Wo!4І1`8>>Mk 8 ҍcAͷij8mD9'Ō/|Xt^~i!>x&ijerry-3.2.0/src/res/board/marble_blue_dark.jpg0000664000175000017500000002662613514421177020033 0ustar useruserJFIFddAdobed       !1A"Q2aBRbqr𑡲#3C!1AQaq2"R ?*Wq?v{r%gن87˅-ٕZ:dR&ɤ̯7=C9hb2-Oɕ~y:!`7!;#l5Y N}Y)7ʁ<d~EO5:Mg),:fRNtL|}\UۖX^}rMxzD7$C`x9ceHN%,]7'E cU'-(Mړ,z(rC6!%1`7cP5⹽4ukϜr8J}E GV!wNgKI7$1z밐[NٽZfTMuUFE=Ad@#N]>UP@G=@]ںᤁcgK~Kdbk4[_n42(Szirw}1F+%AB83Dk0whNX?>0(iR:뙹-˧N&r}^ (p^făD ,$OS(d]85(r~{ ĕ Dvya}"ukuOj)avâ!?6G~zKmLZ< ٔu{INlQd~yUk 6eѡu*hΙItZA3vK(K2awM[ 5 $qOSRo V10GPvyǹR}TVֲHkq;cSy ݭR$ 7d*=JA>9 WUm_AqNEv^@ׇJzc~d^ۚ5.Ulm8zWQc ]0QT-Je͑lV|[ٮ 3e-;Y %5P67EN]fF'4-,~HFcㅇ\]MlfƵ91L8ut:Hv `[gBCLQ›rt)Olh?ݓz[,u[}=;(lؠջ&=sty -Gt8Ip$V?6jfv<`kNdV`{}٩[6U S[qu6jvKm*% ]I[|k̈́jD95:~l3nTqŒG^f`=IQci\3'WaP<7ݛ[,T/ӏQeZCwp*Vd*HwL jE_b8+}WLfW嫩 8NÛsVpmɿM>7/Q8q[*eYh3~k_MuNs|WaqݕYWwk@1aSԛ6\tXB.ө璮'6WZYoݜٳ1^dsǷgWp~lkPTv1uIW3nH3g«l,GP]q&v'8/Խ:'Uuy(5G:pkIkP@<\^O2GȾw\eX/V5EnbX/'n{E5UY+f fyYBT8_WxJh?1+6R.*@YCB>FdYYI%k9V&Z&j6< \HW^D.WeZv'r*KkQ !٘rU5ΒO*>==[Gb{?~`.>#V{{g!1gmo"~%XHeS^u<#vV_PK:^\8Q*k~5uUhT~;%>B==@8z17P7un+,؉뜨ȵjX\y6|]woҏƣ W=9oi3RF T~mĐK96oKs5e؆z\t5HQ67r-]sA šxW*o[Jso5n o;ͧPv8>R:o§mԭeA\:nQfFOEմզMw)@; g*nŠ)flys wEV'*r# 9ˊWV*&Ϣ8sY/GV-kDt?ٕ=K;] '84>G4 Ia?9w~fm ڻ•W3LŪ4v uݫ@lf&d?.]x|ƞآM k/ &,+յ {؄ݠ?ryx4;H/V{h8s}a7O57U+0zlW,# A[1/忋W2}' Ky@?&b`#os2?&ͦ3VͱDANiLn;YLA4h}1 ˆ X?64$3)D汥 VTn$kj4c,|k|fokdz¥=3pl֨,yul!լςp;aF,JSmlM vאۂMpߥ~\ tSm@a$:"#,ZPDdAqrHx>鬕,'WClNZi2T$lyw+b{P q9u~g_q6ta9_<+ MM\:q݂yK2YD}0-DVzh'#$AH(a,b4$L|31[*!aL<Qѷam~9֣ _pn3\IBkt r'>F\ Gic/H;pfX׳ȱELI^;2vjZ -,Rv<7d5Tk*mJό7uv}F[ZEDB|VvEʓ̞g7RKՀ@AM@:h5e68$ RݡH0L^[T$AXImc|(Ĵp};Mܼ:HUt#Ngm+rjWv %F2Q{b̶klIR߹O=sz"eo  8amiE5nFUL>恎|ӣnfVmu5JuBLk166r K$=56(Lq5r޼#ӆ.axswzue2{MWUrX:ٳ,荤*+F1+xop)5;§z/1ޗY =?&:.eb*zj`Bcnn&5<xlDt'j=IƈҫCk~a^Qa $*5_mNB͚W6# ;pZ #jdɨ<a|{{NՄWVgML08.x=)\WTv,=8]c+ 'lmtҭφ`ѡ5{C|q`]'8`'L1o!F̎ƲU Wz*",#md zqkff1s8mWd|cisxjd7h@V pI+AXIX_!ԡӖ,Y" 8AX*&_vgύ(5 {ztY$-d3]2ڏudUŀ?Å34Gv:7AЦu38ND@t r7Wgĭmۍ]eS/UGهG㺖 1pY_dq]5l'p 0!zn?qUD>EUKUY?%l[Ў1f3!L1"'\U_N8 {nO *,ݽ ayvfbwaxul5vL*]6g%Ly8}=x:2߷&ݸɤfxy[Z!}ۮ2ir?vtO[0"Gڽ8ӔAǡyV,5Tw,=rgSj0w)9y|׽N9YumU' cjR@֞y$(uC4zIp֝C6h j1r-דni'MxI؁la!O~{Yjb:h"AoؼUvVR ޡw@zN{Jsi\cn`5k1X۷9Ո&í5J?xXLLb41T~ނ&!uOmV*3[ $o@iiwՂpq'o0ycP}=Q:y/sIGD}~!X(#UT܏Փ"-bNm/|uSڋgT&k+,@e+cjgUԘ>lߦ +E0Uh@Om5&_}4SynԖإYR`+$zqvS0^T#YaybKm~29c#Z'l]ݫIXl2 FVlkhE0ưcn+'6%ka$3~7w hĬ~8k-A@ O369*w>3iD xƣn雺8hOW'n/CuGͳ٢,ؒv \ɨ7,#G9srn} ;}EEzjMj {U  ǎ Dy}>RPN'ן|/֝v udVԒ &v5[aX"JyWpo8XLw@p^éű׃McVTy5M*rN ~lu2ͤ}tX+F0'P RWA76#kƵv]` ^Ini!3Wl_2@U$6;8wGzK7YM*;V,bGC&e \ߦ¬bUHE=5jB@ЍOͺ3 [XuT&ª̕Vb4: Z~+UG;ueHٿ-PC(e;==ޥVBUMvml*Y,oRԷw`x)a:}cD=ʛgsh c2Lcyg'l(v^-?|Z z:vs[ VI:~TMjC GݚJm]m8͘uYloROeW?r=cXPB7_1r&5$({OPm3}lc^y״ 2xrR 5:a4kڕ-""S_e`nXY]Z#ӑ:OP@uxm=nl`o61a)}d@6"$}_]/m}vS㿉9䮳^Gq\|.TSqZao< 7w ;GObri"@nr*%x Ad2gȻ1jdGpo%VIG6-}ڸflF&$u-f%Zo1"d9s3NMMb÷\<#qy6![ֽGc. wʤuNWdڒgur<.z̊-}.Q >H a|ťK)մ0ZSɅ;6DկֶUY4y C#LK xDrN7yNTծuNs&TXucc\*RӅESa[O^qDexr8M \$өoiê"f}HY0[Dp-/ձ8Щ1$5ʑb 1kU CKX=wrS7[20*qb'5b`$ݚ-#T̟lgubDėU`$ R(~o7Ml8j^Pr+j@'5';mc6ʬW[71T B݆ahaN#uSslܭw4B ujerry-3.2.0/src/res/board/marble_green_light.jpg0000664000175000017500000000272313514421177020362 0ustar useruserJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"-!1AQaq"2#Bb!1a ?WsA-?AZd-MHuE*p D0L N $=˰GjAbj\S]h% $'G.ndj\<cPY!|IbrF(dSՒU(JB >)\J Ǥ T#AjpDe$@iHS))f[#T&vsVS՜$=>-:OUn{j`G0g0VTt RB͕EE)nS@@B;.v1J ՃZYceJ>Iʢu!2\&^qL%cUsAkAp,"kpЂǰNmh)|HD4H9Q0V( e0 !P6@a)$QB'iY#b=p%J‹@+:}IS+K; >4AW4Yͷ+cv\ԀH&[R̵ʪG >VA,, ʄJQ;.'':ᣀ.(^CӨF2~EKKtiuXq Wj<244H$~?eMG[Au,%Lܴ` VT\+-*UEdaO&U7EPJ%WU$9KͿBT;DŽ1L0@ ,& u> .W:z߲Ę-!TJC\JrC|$ͼ ^:|m=& h'Klo!uJm!Gm#mR%!o?0 TZ۠ -7JD,!A"FP4mL, zHޒ>d@xAڨ9.~OD p+!ACLy *E +5s+ PŁVlJhtd 4F8VQ>?h&΂m mGj0ʻ#CEAA o㉛N$L@iɃPضu/&sYP+x %A'@_%ʃ-C-nQ[`C]`d ɇ P *8[ajerry-3.2.0/src/res/board/wood_dark.jpg0000664000175000017500000006135213514421177016525 0ustar useruserJFIFC     C   JJ" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Ϗ|gީǚnV#iiwMg7{?_MO3_ȕ~yeGp6">T[;wO1{V3B?28;?yn?+bISgK]aFj~/ KP#EI$i-?(7#;77U\\?o :Mb.ti7X&׮K&-Y,M>wXz\07u_S[{"SasiYy'o\ܒyZ?ߺGZ$gOw5NeX|&OK X帳OⒺ*O}#a/Z>O j^_7V49]?=V>'F<ȑ')LhS7O/[/\B? $$Oie56l&tHl+G.qO{oÿH%X_<Zp_=lnY2G,;XxGݽlY;y|Q'Q3b='z7Rl_-~:7OQd5͖]Ͽ+/GX#oOySTpǕ_[~:H^;uX}_ږϼظi3e-M?\5t?y=X,?mMZdb\{$Ijş/4tES~lr'JmK?-]*evW7$'@}TSyX[y>Ӭ^?6';}j5WW+f_Qowlr8͟?U V4+p&ʧ}M>MrD? | &j,GBMq ?z|osqq7/ B8K?W?Yۢ~/D rʳ!O-W?sT,wtDdVx͟M2eꟺ[tosqpg ]f'\\vIX'?OjK=Ingߞ_{5^7d|Th5 %}45iʲI$diڭˉT?jy>\j2ز|7qY~ITlO[4szP2B a,5O=<yi3O{o{mR4YO]%E7NDvmI?OdS?yȉ*ݚ[^[~[쮃O.8q\ݽǗ%M6knj ^*W?ڑsGksTʳX~ % XgAgox}>4Ɨ-O\OI2Gj`oң{S ʹƑiv?i]߃=YhGOO3:㫺>7P3yIG=ǛMOS}ll[.ovkbʳ'<ՏIiM`V44?>MRI'T|g4/jK;/Gw7MW-4ϒRzh?OP_.mlM'.'<Ƴ w;OZ[Boh?ѴA}+Gb\xK }͛o"yry??*x5*pZn>{5gM}c|zi#ޏ *L![[M4Տ?բ}?7S?[g%Ѕszlϝ/$L?V>#?"J5sr4?->?}Τ_.=s~u+?o#?I_怜=$Ͽ-t_DKNp:ƅϱD9<$tq8uOGwq*-arƹ'yoީ?wvj$wt7EI]J=nny_\'os6TCr\M(mps\9&OݼQ~A=cGq'_ʪ f'4Wb\?뛣=7eJԚo{o"$}B#HO"%qĞV&WQ$o'vy4/Zy:8ߕ/o?ط˳'=Y$OL%KYOݼIPz|Q?-Qo^hj$r[D_aV#7ĝ6~q"iϞ]Jdw{6~O{q=--_'+Yq4 "">Ƥr<:TrlH?GϞO?rƟͺSG 1"g+B6Gٟz;k.?Fƛ_ʃK?*Yf%D]oƉ%o؟%mFK=\}HS"|&&7;T}?jMBq?yMK'?wt?5_ OΈ&xd]I5I>g#O b"GygltkR|w'J-r~cI_ɳPI#cDoo<܏AW?/n,*D|lYw/=6/Z{x."uzس48ܨGo|$~ek/X&oШ{j?/ϝUsGKi#?էi"JԯGjOz/6Ƴ6A#H?&/g!(5-Z!.;{e6$͎M}SQ~?6MAJ[دGg Ԛ}oW|Asjy'ɿoƭ;Xuϫ-X?oVY}Q?Lթ'2BG=H;--}V,w$cg+BGrV}o-ig ,\?GZMYdOO+:I"be6=>=o W?\<^-]%[\[Woҹlaw ZG1sT4.GRk$6J?aEf.?oVzmZ|v?T)k/ON4xqK|gϿj`h\IǼɓi5P&$Km.7y<ϹPh2 ?rŒ?Z$#Pbl_ěyZQK\KG:+ZƟ6m|e^ }ϟmtq?+iIhd+n#-~Z/#~pڇ}tVĖ?y\ZOFi\ˎ"^tJ$I4<g>'Јn&M>޷-fI㵌7jiy[U{"Ը?V-v Ǽ6p'DI^L:X܎O+P$W?xcrW Ɵ#%V_/^; b9>ͥlV#G[lIֱӨY?W I[?Y7sy?rzi}?U0@t_a_+/G9?غ Y?Zɨ}??S#{k;h Wogs ʵyx1 <*!t̞{9Y44y>IIxHj?}d#cgWWiyZ}??L+S=7w8[Y?NjM>͓Oton:Ʃ/b%X$h"?Mlj$?띶 cg}ʊIfF?G߶Lqw\$%kOIK;=d렒OG#ވ*Kk'ɿz/#GЅkSWs(u0M:,..X#q"MzvUGnv왪ЯlX桾H'Vr=I&>M=RdŊrŻK~Tu~]f 4=wD++#'?Hpſ5GʏX/mNWW$O{>doP&'{JǛg~f;?y#[7բLGQo7[WoI˄7MBD:]"/YM]XԸ}*;{;4OWV$9/&8ǚubGTcf >D?v?-gB8SM 4G~wNI[~$Z'QrľI}άx2iǕ8r'?P;;d9Oj=S=JO?9?ZvC;+Yd<7+oT؍_ʣ9,˽' ˗M&a]z䷸$y"K;O'5fpI=3\S/ }yolixg*Z֥ Iw$~#;Ɔ'ۮ5I>Gt<ncr]lFj5 wO9>y7͠GqGq$YծP-Onk\ɽ??Ug?~<>DG]eźy6:?Gϝ]ĉ}խu26Kq"'kCGAGJ˓͊gx i"IaRVFB#>J%|/'?*7ujƇo.?i]lX#//!I>?y˿gq[p܁{R7M+:b"r$>=ji{l7Y,q|+Xh[MM**$H۝*r};zegĚiOejooyi۪O'Q=jlIN>'}.Gg{eLwqZ]}7Uj&xD;n57#W_oo3ZJ7W2,# lYƟv?=EW-Kgn'&mr{BaR[ƟhO\~j8OMN1t?6""fcU˼?儻_*5K7Mټg?{,ɲ..o#ΗV5jo]!\"GYI],_+=X,ݽ{?{Yc:"GqgWIg'q wOwk5 ɿ1s8wŬ{ǖ8g:M|և7o'Sy}/wjlx?G<'o"yqZ5XDkxTab-"+O#7tIy$/÷#|Lz"EqW/} I~Ơ}H#|s<}7cꑥˏ#Oɓk(=nh2k$O/TwV4I7yn֬jzIq&lƗ'dt4D_ U#|?|lxn?.9<~Zip*Vm 5KKoZ8K{x_j#yc!Xٿsgȴߙ63PwH[\vkP2Gl&$[o3M)mbwO7/C˒MߋA?4DJټRHqBX <7CseEď'$x$?[A{ylhա4Ok/r<؈hG!gՠp'onq7M߭tg qy/ܪSaoϾO~$_-4~OErI2i?N: ܑO3d7\hj+xnRO/P.fsT-?xyʭ;+EodhU;y<H #lOR{yb-|GmO֩?5cHܗBV@H>pZ5?cO髟sMN %Ǖ w.=?A]<?>b-]ru D>4}͞]V?bhYٮ$?vwWI7Kˋox?j}?WKW,kt%Ǚ*s@oyhGIyy}74xl_k.~UcNS?P"j$Ɵ3w}j\[KW? wBܶ msG;ts=N#{M]'HaV?cHctYgQ\ˮNu 4xdwro#Ui^d~Ŭ-.?1vVĿzqީϷOaXBOt^bC\ٵM>aHq?鐵m֗n{q'*Ƈof$gr+:Xؼ-U}BO*P<tORqx&x7k6KYw=yĞn~{MIGY\wz.w7z_S}.^F|0#O7#\Ż.#t8>Vu?M7UW?ҩ';ZG'XJ62?c|n[95E?T:3g;X~"gdkiju%wz ǏXO/%U*7typiwI`оZzP#'E]g/W#;>IOGn\{0yxdz|GW ?&zo8Q7?I'L/?wdӰOviOwjn:$/-o쪝m>wJ: hv}O%<͛?)Mqv?|aZټ$$uMU̖~M>ݿ*jo'=V5b=AR\FG>(}V68=s^$?ݭM:7(H<3wy$ֵܒ4PjƇqI'Twe}DSXkƽ.hG!I&|ŝ5`VǸ2:'NPݾ7<\ީyfܝ+b%ߛ?-eGk<L%n^~?On#O/DM߻&Z$OG=='?髦=NP!:lKy6U;;t; CdrG-7ĸqZw?^J[utǧ?.-O&g>瘟kf֑e>Ǫ%rMoB O4r'uX⹸f͋N6f??|Ԗpw/TފZ G?fxl$6]˓}ʽ6k峍?1t?UOKz|kBOɿok?C?OB#[GJ>viT7rK?24<'c+[?g榟T~ܟ֥Ğ]:?'['tV~flh#8}Wy8p\on ɛ.-Y=elTZl^l44\?gooL7],ljg*֥|IljDؿ:Te=B?3O?tKxQyXD^]c̖;~Zlٲ?K a:'Tv.?㢍.GMA_*U{IۻZ~)7Uo^kB?w;?ݶۼZ>ON9-ۋtX{ <tO*&q7q]'$H$>6i$e5b+Z7o}Y'ef㵩qn:]{ x/ifw#}me⸼V?ZZ?Q-5sXO'}bsKZ?uyf3Ս̒Oи?wȾuԯg2wܕw ƟM.?~~O6=܁?ꇪlR<9[hGqf?Z[ż/&*柾X?;Jw~o?g&}f.$Kk}}sz4wd2|'UpXlZ}jk#^yq [y͏Tky#ܵDJВGOl mGʱyoy\6KYZܥI+{tb=.+Z5 <#OƑ}-iILIy"',AO4 ;5b?eL:u\'BcF;-S}VeP<"ĉWsoU%c?zP2xV-?>GPcEi# ^KB|w?K4ソ*Z.?hlg ?ezC\~nqZ}ˬx}>v(V54l_ʏ3{WǍX<$w8we8L65rv%?1"OKy<-GzdDY+E''iYrk?{^?f}GHO?BG5m`$?wn"out?}}?~U+}R}Ǹ'?ZOI=rOA:f*KE?G[o.oe_X5Kԑ:"oTraK]\3=ߨ$>U}G˓Z|X-d %͟*G{Oݻ'=T.s{}|#y,?yֽ+ě?y٫Ǖq'gyϓLq?ﭴ$>ӥۢqҏ 9!sYgˮ^M4#}RKFhj -鶮x=M<+?K;{; <7rMoͫD 5Hӧ'͕{%/$G\߅xy]U{ܧ$i.&My#o,lwjϸeMbc؟}KC$? nG[r~+:$jG[S?kFJ5 ?#:ozz: ROf5a(؟:VƩ#oqm_cEif; SBwuMd7wƅ{vi{ J-bG;ohO'W?Hk&u-&{\Ѯ#T#O~|?&h /՗q'TBXJӰ?~e_Ē"#WIg<+iO'sZQ~M]X,?Yzϳ{7ğGwXH ?3U=sgh?lzI,顣njŜ?w4x;tOGŨ[ϹF]$eX&#C}?Z^"7 c?CSjEeXs"?˫^üw;Z'$)DoPcyqӎj\Hg?yenx~??eeXnnS܏sg<>GO?O/oMSAKI?|4Cy.OBOY: h]l|J;ͭ>f.I.>؈?)#gOxWAyK/#Vry?ck%4ODk]DT::K͞f=Yz]X#PwR'ѥRjԚ埙DT=qOd rI;_T~&BO+' #vhgYz2?ty\"-[}ʚKWrXK.Oo,_W''_T֗Lʇd0O/!O/V5H?%?_? }dv/PHH?瑩gq}BO\'͉kZ[sAx:#OH-~OyC&~\sg;Z-$㪱iv?ek.H=?,4z+Y-&k憟"Io<xgywlT}W|ގ ˼tieM?OM7qY~ }2-Jw.HКvƉT?:'I?q'rl*Ω[^\y|=և$HO3Pݤry:7$"V;^n2^'F:\4/-_1ռ;*o].{+ ?te}R7M>j*D]'%uosl\UCk eF\bUY?ˊǷK_֥NwzܯڗFy5Iq?7b-4?DisbK>D^?(|t6?ooj)!S;KKƏ\^o,C,+Oҹ-Ǔ: [ yW{qRIDGy'e`# Oʵ&W)Ovc<[qJKS?峍?UN?2萲GhjXfz5Uji{57ub '$t|~"I%iZ1 =?~Z/BTlW$x?t_ĖmI#rs=y}j񅿛YI"X܏U?cz5MhO5i4}TT>gΐU&qx%W#P"luI9^ >ʷ}\ԗdI#bZˡY"U=c}o;Rh/}OFIC?5)A.d-QZ??Ԗ-?W6[ꨮO2==r 7R=/OO5ܯc5|lA{_W#uM?z'o${GpzIvohګrG7jDU->Ju l\$4O+GDOHgOwٿH?yAɿլZCOYu DkKsyq1>?.PO2I7OOKkˍDuQf\{8_x'=Z6n_<v4N!FĖ{">O}l[3VnI+YOPˏ[;~.oZ5hs|[9#Z@s}A g~ wjsl/#I/-c֎$x<"iQ>*?2zofr&Z$?Of/=BMr+WЪ?KH~_?;Z)I=Buۤ"?*$Y4㵹y?D+ophHDf>??odj~tY\@ǒ?^Yq?._tG.n~kƹb4'.+SIxMo<*>'[(~4x>#}5fGGyĒ?,I$vsƮO24aUy?Qo\G7cV<n[?t?)*I6}onO6g|⤒7ǼHk5#sI7 Io.ȟh);M<w-Li_ I'e'6/ -qo jdblI3h\my|ީ5yǪyvGsgq,U؋V4h}異G\O@X-;}{8'ď' XçegE>D̛^\'|ִ,K-/?{o$z:62OY\f5\OX*MR?WgV5I<;5囻֦{s}l#G"tlܮ>?(OGzҞs~Y٬?Գ?Q GO o̷tVqX(z}e{ThY<+y|PݝyOxT*M.ʒ黿/Vؔmb=S~]]/POՇouU5gabG$Q;'{y$y?o[3=L6V.$7Y#xܵsT懱>YK㱰x_|W[<#Ԛgy\?*'%}W5͟&*f- Oگ[W#RxnH6'csP>#>o|-Za8N\wuh[ۼvGb.o4%Xy q/#؃Bjo6ۊ'^?6MRg_H>G߳֬>?.4xl[j'oiԕaz\mpP_O"#?T%:&Iy??ڗ+HOY?}5M"rǪǃHO`}.^HrloY }Ş{>5ۼW=DuMk?'QI-;V5H;9͵NInc?xCH [-sVơ?wΟ?-eisG?o5IwtuH #Y.7\7Iݿ殳?R?Ov7V7_`;hqx7m>_swyDЫrhwubj7>''>kU\?榗q-?P>ԈGyVwwZ5iwjOiӶ+;6Z[^${rվcR[i/R[BoW5?3&Y "$ϳejIqq2}DE?yVMT>$T㥍 O6;*/hw}̷?}B;7رt3lkY~$$?VKgֳAɣ"}=:;9$x]Eۼ5iyW<?*jecqxօxXhyo.6/#|VR-J^'?l [Xqqmyݟt?=nY'+RMqG؍?kch&mr) }=?znZ>xܓOCş͓;'K?V#/Xu wO|VL#O*?ƲPdb.6}"$_/"I-\36?[h[78b>n6UhL~ϱ5 9$O}5GT?w;MR^lP}i5ОisDo֩>O MyƬyo&O"VaOk`scG_=\nH'=]&yOvB7nu'.?}GdAV~n2[~oy+B?y1bqZo>wr qYG՛BZo]rrO/Xo~> szhi+Jzh{㵏 +OnkSG̎=!Yśh}7yb">0Ƈ}-v 7TvU}+ai'nvoS }Ao<Ƭ\o&HwaO5 ?[-;=7 Q[b7+W..>g'5#76'?R^F#|WbGQ-4w٫,uK}謻;M$I[I' )'yqA_~?UjG!MA:q"EcBeeoދfDKo>Oq]ؤOgMwby'yH1&.,OTG}RI?ly82=Hmv7tr'?{i.7ԷɿoO\S>kcT*oy?\#mV~Jб^MjiQޭ\?O7rGIm4u\oG?jܸYRG#4O[ hW_3?G:/RIj:u&Aڹ&HOIg.{V>OŸOrK&gJj:\55 ėT>꾡F_Al\v$փ2$Y{ И~mBoP峑kI͟M([\]lSo#\QHgX~o-+sT# B;=sz>wvI<{kXvo͛*JՋtbg\rg}Y~&Z}}֮I#x4/Zy6|ɭoEyHG~Z,IgMNrV9?[slR/h/<}[erW/y6{g̟rH~hO(5&.ZltJo"6k )ɼu*-D'kB|Q~-Sʸ}ksO?ys劺M/|wyoο{CYΟ> c6+zǭeD}I<-Iqn[+uvr˿oW9yz>M5jir?UˏqZ^q ?2emkc?~M-?և?y?kox ?/-M&P??/[TϞ?/6vr,+I#j[;t sv=n+WqZSZܨީPi]ecaFڗKT+r<*6L}B/2IOz>ңIdz̷Uۼ6V`>bH#G97v${֏[>?2;l\:ا%&?$Hw{򵟮FjnvfNKĖn"}B]˧Mz]{Ԛ_|iow*ŜoY!Rk%{x;TQ'xoxDno Iui,qc>l|jj)OE(f,=|-r??ϼ[3JǜQ-UZ?uqxg .DXU.9Gܸy$y,wIx?EK;ͪ(jcrMb7=?4<>Mkq]"?/pa[vƉQ%Ǜgp}Qq_*_G7mqߢc?qEqwZN;iN?=o=U;u_0*5 VI&@`M0U*kɭ2PXLn `r T$[e&*5 VI&@`M0U*kɭ2PXLn `r} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0}  L @0XĻO?a/>>pa܄,DWbD8.,Hƫxo`<.q^lD*_dN`#SN?.^ſf f?ч#;}|]>>EݻC%N3`]8W;k6"/7/|{-o3o.} F\گWk jET|X+8 9~%߮W~|+~%rϷ쾳F@@<p-G6O @x8Okh ő+~GC`3SoL$h#d.>:`3&m W66O m_D::h#+W#@''B }:}Nq(" Eo')PR" sOB`a.XǫX8# qZ &L&-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_&L=66)ρZ*lRTؤ <jIxRa0&`9PKM s @-6)ρZ*lRTؤ@ &L @0` &L @0` V>< &L @0` &L Ӂ&L @0` &L @nn!JIENDB`( 66666666666666666666(0` &&&&////VVVVQQQQ3333????????3333( @  (0  AAAAAAAAAAAAAAAAAAAAAAAA(  ;;;;EEEEOOOOOOOOJJJJAAAAAAAAAAAAAAAAjerry-3.2.0/src/res/icons/help-browser.svg0000664000175000017500000003224013514421177017222 0ustar useruser image/svg+xml Help Browser 2005-11-06 Tuomas Kuosmanen help browser documentation docs man info Jakub Steiner, Andreas Nilsson http://tigert.com jerry-3.2.0/src/res/icons/preferences-system-session.svg0000664000175000017500000005521213514421177022121 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz Preferences Session session restart jerry-3.2.0/src/res/icons/osx_icon.icns0000664000175000017500000004220313514421177016567 0ustar userusericnsDic07@PNG  IHDR>asRGBIDATxMNA @vd WsX6%kv9DC)1Lz.Ou7e{6lna;,,/B/H2V{F$kjD.` FlP3XKvVmu mΆ%khOu6@-Y[@[~9]"@: Sms):l#K`\ Nێro`F7Eύ\cuk3w {cḵ}s3+@IuMT2DPRc& T7 I%C ܕtIm/9vjXj070fsj@j07U' `*g@M0` zɟKt}!`xBo#`xN`_ʭa)ȯ&x jpqQż]//w5ڎdVd%pSbh ! ? QU>+_3怯 !E%+Zg' \>X` k'k ޟ7pmMkG s<+@k7|ծtZkO3T*X{Иt> Z{VUC֜25G`5'9̇(k9hQe>@)Xk7kN Ru#S*#JThTTT wɞ+nQ71'"EEܤƜ`ps]hIENDB`ic08 PNG  IHDR\rfsRGB IDATxarP0qt$U(a* beؙy0kS !@ B/ GTI D@@O$" BXMJ 'U!&%C@* V! rIB@I 9J! դr<=Q* X @@ɖH`M@ɸ  l @@ɖH`M@ɸ  l @@ɖH`M@ɸ  l @OOzBz#P@@h%r( 4 ^9h z@q MW8@&Z^+g@-@3@P@W@G[3m= s:hK*,^VhExY@V@c_XeoRQud kM`h Y@Ω0 S7`)dY;nDS* vN U@d휺 MA 9u  @V>s?{TY>'yvN U@d휺 MA 9u  @Vs&0@@ @4 kM`h Y@Ω0 0Pcs`Z`(@5;QXtw:G6Rϟ/_޿9il[x+/v x# B`'`p'ݰ2o [{ė8V?λL#Ir񷊽~|x~}+b]}B#?@fӉRC>u'k`#$ɰ?ڙ%믗癪V.^ Xٿ/}V8o/!nˁ3Ԝ31}=%gw S/kO /2@&w--fjZ D L &vwqӐǃIN&0uOh x8G`Xv[wcw.0u&]/-=[r S@u|#hw3z~tn[>'P%cEm__&p;gc C4oN?#Yfx @P7@ \ K6~ khHo=/uL c TH`i[/c!x_*jp&Y7(4;-\wQp%PA h4 a~g>+ggcxk&LD@@Xvx]`Xʷ%+Pv b3 3uZ x p[g8S@wE&폁ϯ ^@cq~s@'RTA\q{)̚_L%Q`|GXV@6^wm9۸'o@'R$1 x0Ҭ%*;Њ7G9ԄJWnn X_Z@L8{~W+g~_ ˣT@) dY:N Ք,R'jJY@N@@5%, KI @@@S(4Tvf'0=#+ b}N`j0u{G V@`(@5;QXkvS ۣ8 SGqb@ L- n X_Z@Lf'0=#+ b}N`j0u{G V`MK %5A%A@d   X 2tI@i dFA ִ2 ]R# kZ@.@5- ݟ̰85&)ۏOO]Kb3@ PVAK@tDG % "PC@U]l! j*t .65h@Aj} ] 58ίIENDB`ic04ARGBnjȅ؁ ففׁ׀ ԃȅnj JJOOOOEE;; JJOOOOEE;;ic09)ĉPNG  IHDR{CsRGB)vIDATxn$y搲b$1d& AY{^ [o0 #JAV~-l@ZgM}a\>U?UCbw~]] 誡Ϯ>-k  ( h\@h0|Pͽ и `+{#'@q hW@h7FN@ @' ЮnO'@]9 (O@ @7rP? vvso4.4~> ( h\Z5Z6#k .gbq!/Cx}hr&6SF;x$@;?P:=fO `Nj3m ĤSO|&] 7۸A |vuǝa"MԪ>jgP4AҭWcW, NH@.Pt1V6J @ $@@ @y%P' Pȓ(  008  PPFDII5H22$J . NA!'Q @`p`pR  @ < (je(eI\@T(C@(#O$@ $@@ @y%P' Pȓ(  008  PXf$ @H"殱 őLwx 1w]|vu5԰痗<ϡL<4>Sö5 %08T\|NckH9j9p/">Z55pv͈3mY 74̋fh- ZN6ڮ} 0Hs m72֋=BY (YC0N@ZOJ@*!@t tz"@@V @V PPJ` 00 U:CD!L'Lg'd%d @`:`:k= @ + t (YY (YC0N@ZOJ@*!@t tz"@@V @V PPJ` 00 U:C.JOn{0xgAP @;S!1ύg ib5Ŷo _@?G0En=o!"[1:(L@()aiE M-yؗ aٛ;4|}򔽻@}v<=xj\jPJʮvI+T 00( P[@H R݉(8w eǾ+aPv)+#)Ǿk-6]9}=W 7>'痗-z|jӧ_>{z9{ֲIcߕ/({p x*˜tu5^]]EH}C[f컢j$ϱʔ{l|ĺlXSQ;zPӌ}WH-9]}ҫyjW7zyӌ}WT-9]}SY@9F= O @f({pctlO'`凟]q8eS*%>ctlO'  PPjM @O@ @T̉='@@ @7z (=NRR3'nPz: (fN)t8JPJ͜  S@ p*9q @(U@(5s&@@O'  PPjM @O@ @T̉=3~r8tߒ@:ҹҸ+PvRV/H[: \|_*O~vu2l:|ӹWD&a0g\ ]_JryX,'몼4v:b7qνR" ,l\(䬖HW^-it^n4M9@F9({/V@Eٝa(ĸZt<إ0"MO˺}rԓx98i//w/3'Sdu|{Ag^(e܈\3껏lLo"Vm[o_W<#~nrt\co]5/h^Xif=uGXT. ἦ(m.>ϲYKڿ p+q{=j@Lqw%:pb@2oPMz}=ys0ƽ[gBScw?gܻə.4QpPd ,U'-%M5u$7C>4T׀+5Ȭ[v:^8V1w2Xߒ㣯WYHpXϬ<y\_䍠4˿Zz\ <_[s+Y~OR#4鞺:୷q4z @ZǬ}3M-Sazu^i> \_lOnC/75p5Q`[o{U!JضkO =j];~ŪB ݼW9w}j5d+ f? Tuʬ],X-~Q fXtx)JܝOgGt.x]$nHC.$za".{ u+a @ƃNq`BȪɊֆ1SM>/F'  PPlN~ JD;?q{|asT߬^!W{׫ =+|N'Oΐv ƻtu8f)gW}Zu~辝>c'|ɓu HzϞtѮ2-Tl@ {}߭A8|K@Y AHwj -k R=-kj] x'@@V&nOߞ~`i9 _:);[< @@# Xwn-mi$߆INҀI?y@d(< @e"1@Wǟ] Ïh=!|a4Mz!@`p @i.еMfLӝ^G[@tg|NkvƣX"㱩 lntM]`>9ǩNHQ>hJgulW bq)Qm~E)'Z^lǽ[WbS!9?H1(bR(rں[pZԭsMg=F.Jؿl9?hн+6r/Y+1u}#3 u<^7=c@+1M~{ gO .\Bv]gUvQnd"k)YuԑU^FQHs 4qw-QmXw%Ctㇶc(->wl>dm]D+L{3 4W6?woSRS Ƿ 0Zh[;ō]] ]@ @V^fxm?-[8_G @@[W1ǀtjz%X'Jؘgx샲ƒ3hlIv_7}n>t  0@[U1&PZt<3 r hk`}#ordSv#@-ֶ͟?1h׬"L hXֲ}Ld(h0B"@ #@@. 4{ sP$ `&x @`n @Zo|;'@J^k{'-xƻWl\lo ]'h8_gshz3L˥ t~?&r; @3o  5vk{{@s>il `5g<9 @4h D5q&R*IϤu?>_>sq*&٬I/ϫ"N 4 lݼUB8(f-c7;V~x}1Y֎xg~^\HC#x1 |"$ D1]n[ =vԍQR W*N_ @̛t??aTɺˑ6m9QZξ7*<3@I*9@y۳FUzk{)Ib՜>5-NgQM0Ap0F#pڪ9yu02 .SӃl+A `w(E iݭ]H`+2" byv[u&2 T@ {A[@H o`L]m(Y`VOԀ6}1c+s]nUDC 0@X:nZJ@JZ?HE(p{kgPp\Y[w0+ d,n p=+ t@FhB- PN @`3Z@:G nK`};[Py@5R` %GfWOROp)})3uG oE9 >n䜣bS&," yd# 0-G! l2jM@-#!@D Dк!@@n @nۯUloNPNs P O  pp PPxOSSG(|**8.@ @TT9 @p~]+痗qRΜq o](<~z4<@ʝߙ3ruЅ'pW-?XKIpW.NyW[댍J#|E2 "_>{'# ߘ#-Gl)9=8?_,7rtfRb4ǩb\vL3{Qo-nq@U#f`o[JA((YB%@,Vp IV*> w=ܥw ^긶tOyO.2du8f W$cF{=`=?[F& (}+9~6v5?˿?y睋o}t~bY\rwk_}˯~o\%ĵS@I/g b'?yk~X<g?K>[P *;bmڛoևIrT?}u@59'`\ƤAԀ_i{o?hc{{{v"O}wG1Esq\hٿLF{[oήkp`ҿ{HzI*M0Rq,kvzNkH$}ufh&0/> u)j 44DkfRkv4]h&ͤz@]iv@HCtpU{*է8~ weϿX67r{*{ڿ><Ut+=km[V!TzXWa:`XZSKq[^?NkR:\-m @950kS=u@WjK}|ӿ7~/π6HY ?_:W#wMݡFxj?d,zf:osP[SIO__^>n/^,noWma<ѣGg/~8KoR?FU|۲ZHUU].w{ܴM[]Pw?WO.LN>vwOkju5KԞa#@`]-33{ݷ-|HW cU|uld R3YLTqX^(?捲skH|ɓu}{Ϟs/xEw@@8^Ha?'޹?rUA9\](S9޵1jG ?Ϯ<"/OTb3u#@YH?YXsP {_~ЌQf5P7fPf5P7fPf5P7fPf5P7fPf5P7fPf5P7fPf5P7fPf5P7fP_"،Q_"،G?_u[رIgA@%\dT[!(S;Y|Nݷ*`&%3'g??_,7rɃ!kihs1LELewg݄nP< NFmб§lG[mбnX̤kh_w]&Wz$Z{Ò |N$tzfZC ۏ6JӋl.( @6I7{:%{A36#J 8( (jL2Q #5^'0z'&Hk/w0\)`FdjHP+RF!l##C#6aPo1%[xӇp+PϩR>?‹ӏ`}> `i7IENDB`jerry-3.2.0/src/res/icons/text-pencil.svg0000664000175000017500000004367113514421177017057 0ustar useruser jerry-3.2.0/src/res/icons/jerry_32x32.png0000664000175000017500000000044613514421177016575 0ustar useruserPNG  IHDR szzIDATxݖ_ ٓ(x _^4RׯUh=Z;j~&(Tu*.*( ǡq)muj(@Lm;-d{6ϰk[ @վ.`%`'i&`'qN WH cP@j>'qX:ZtM0`& IENDB`jerry-3.2.0/src/res/icons/jerry_icon16.png0000664000175000017500000000040613514421177017107 0ustar useruserPNG  IHDRaIDATxc< @@N YH `z`t  (?Eĉ #`xy1o݊bMoo۶X "gP۰ŀ[ 6nt. ` ~WWw$F:451<'kk/GbBmI\60_߳(AIENDB`jerry-3.2.0/src/res/icons/edit-find-replace.svg0000664000175000017500000013147013514421177020072 0ustar useruser image/svg+xml Edit Find Replace edit find locate search Garrett LeSage Jakub Steiner, Steven Garrity jerry-3.2.0/src/res/icons/system-log-out.svg0000664000175000017500000004526713514421177017536 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz System Log Out log out logout exit jerry-3.2.0/src/res/icons/jerry_icon256.png0000664000175000017500000000407013514421177017176 0ustar useruserPNG  IHDR\rfIDATx]nGaJIz0|?GIMVW}y@ײ,>N;iN?=o=U;u_0*5 VI&@`M0U*kɭ2PXLn `r T$[e&*5 VI&@`M0U*kɭ2PXLn `r} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0}  L @0XĻO?a/>>pa܄,DWbD8.,Hƫxo`<.q^lD*_dN`#SN?.^ſf f?ч#;}|]>>EݻC%N3`]8W;k6"/7/|{-o3o.} F\گWk jET|X+8 9~%߮W~|+~%rϷ쾳F@@<p-G6O @x8Okh ő+~GC`3SoL$h#d.>:`3&m W66O m_D::h#+W#@''B }:}Nq(" Eo')PR" sOB`a.XǫX8# qZ &L&-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_&L=66)ρZ*lRTؤ <jIxRa0&`9PKM s @-6)ρZ*lRTؤ@ &L @0` &L @0` V>< &L @0` &L Ӂ&L @0` &L @nn!JIENDB`jerry-3.2.0/src/res/icons/jerry_icon512.png0000664000175000017500000001345113514421177017174 0ustar useruserPNG  IHDR{CtIME,W/g pHYs  ~gAMA aIDATxݽ%M2ؕ $ MAnFO u Ƶ #n  HUZ9V"9h&KPK.\bF/9~3?\dqmGЈ@;@P (J%A @P (J%A @P (J%A mY<oe͋QdYeXeI7rkj|qcmJ}W]o~8Xe+Kӳq=hN^E/<?|x,Ȯz 73Rij;Oɛެ@A @P (J%A @P (J%A @P (Ԯj;DUAm`]GaSۚFIh秧~UHÇMm"ˎve;g8@;ҿhn[Ϫ2oe͋7ۧ.YrǗ8X;;4P@P (J%A @P (J%A @P (J%A @P(o@JT[A EUeJ*Us! M %ܢͬn\|Bi{lLtg]xQ!_h ց@@JT[APzl2Wc|z@_^$@O`?;>|7D>XH۸څ?xp7LFf_o]vIZ ؃iT;_y4Ɂ.yޓT^;elJC~^u"'ـH[ʷُz-D~OJ%A @P (J%A @P (J%A @P ~ "˞݌+]{Bn nUZ'tvwON_yPnO6!'$Gp)WxOܤn{Bgn#:C%A @P (J%A @P (J%A @ڊ7f=zFm7@-olvJz>?=}42INXyeIiӳv[E;1q^6Qy5'kTNX.ձv؊H\ ۑ>A tH5';X`稚[4-COawIMox08LYQd먎כh?_L-;Շ{{^k=t,;~[Ttق_~yg?m7(Gԗ_fEtG5W_=/~⣏F/y'/{o>ȭ̕c?ky,EtHɼSɓVp՟\ee-`UC>85%VuEqkKܮ>di8}fpzVU8'VHq'+^}8k $S0`?3vg{NqskH85F]`UkȕWs鞩e?i_t?K +I2~qx_ݣR`UIzqƯ}`p{Iv˾_o@ۙF, wegAXl~͍yQ7U)T;?.?s77ݬ+7ߔ'mf(Jds zJL7Vbӹ7]=r LߟW +[-t&Vs*t@Pó:p1w?ή̫zWs@ZCmTU՟Et׌uwONzd4jE_秧Oq>/ʱ/O/vmmRew8l-lpX$·96֐=7ze_톰z9\ٌX*IWs(#&pf #U>R1g 2: @p9 lP_2 F0LnƢL>I@]WsM6hHZ`fd; P̟{{&@m{Kfq, [+aPKY8p}-3@݇"Nmfi?Obɲ@F/ŸgsMe/c!pMO%72{B2o~67k n+^95+/Ghb@#5cc/X])btRhd KbM5(#y~0kZ/sU pϝ/jM+\d\mj~s?oa]Xy-S,o6`mV̕~ p"j\_~=+6S7 !YDd V  ` nаٕZ.TjZf Ptg}HQ@^XŲl;[hEXz; -ЊXkj@tDEW,{l[`E + W&h  @PAO-,1tot^)kAWK E 7}L'bDX[bNaF|.:,X]_0:R1dKFMfE:ڳIPG'IM4У*Ty u͋˯J@{<۱lV.guV,oI@B/V˃ '_hw+A^QtꞩuX6X8=Ŷ#e^Ym7Sn:ɕ;e[2V5vc!5;0,7?S\~x[ tn/< I(f,Wl[ -~K@P (J@pME0ezyM7?U}f B@ JŎYiUeqFA b8S@@rտiF==A @P (J%A Z m7 5s`Z+Ѩ톰z߹f7p9hU秧ò/) Rreq׊)dO Gӳv[~>֙(5zl2gDo.5j?-i5a\}HUO@*|f=4jxz9OlՓ/;;[pPspdU;[pPoGO~Nŋ^oUDT;?ϟ}MwāT.+BY Gݽwﵶg_?L>x՟\o?gܛ>(~/<Ɍ$›_߿{ʽ9˟0G+տ(<}qfWue߽ћof\!a @HapH,%8@pC?<38?s5@s 2Y8 8Q8 898 ,98 ,5Ǵe_~ ̀ݻk?W_svhشzwǪ?[(GqEtMϿ.+&tEf[UQMzb4z^S^W@|O' Ω֘V2=2;f,.S}JiE@P (S@ffՌ~v>zu*>ط#??}F.|''`2">OOكiTm( eLYN[Q=B V 'Va A @P (J%A @P (J%A @P (J%VTϽH}m7 d4j!Roy`{VzIv>-zuᨎ[V@O`ߎdTYJe`CŊBޙET}Wo=9q>;Ul{oM/am=(Fmo\YE`\湲P@P (J%A @P (J%A #sG }sG0`-r}U秧ò# >Bv`ӳv[PD]M&r[{V}2T}.nQ8`画קּy,%A @P (J%A @P (J%A @P (J%A @P (J%A m7`%"˞ 5WoyG50 mUj|;iݓ]kT]L=HŽj/qMX[Sk5 1FTi <`G@P (J%A @P (J%A @P (Jdso0hEj;K5y<v\$Amgܶʜ*[wONq$B)^YX>if̖z[OG/]dq.Ç7EM&8`R;YɏroP0[;͉06/ %A @P (J%A @P (J%A @P (| IENDB`jerry-3.2.0/src/res/icons/jerry_icon32.png0000664000175000017500000000044613514421177017111 0ustar useruserPNG  IHDR szzIDATxݖ_ ٓ(x _^4RׯUh=Z;j~&(Tu*.*( ǡq)muj(@Lm;-d{6ϰk[ @վ.`%`'i&`'qN WH cP@j>'qX:ZtM0`& IENDB`jerry-3.2.0/src/res/icons/jerry_icon1024.png0000664000175000017500000004057413514421177017261 0ustar useruserPNG  IHDRtIMEs pHYs  ~gAMA aA IDATx}'.3ήw&o@V|pg _ ;qt{x)0xƶf$r늤HMnv=tJ%Tק[SEQĢ+}糭vw?E1(~ӭKzM72"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@Fe-nqX(-lR S;Skg Q߫0*ƦvE-* 'tOO87ݨH-LL6~>h+}-yqoMFd_Um6-ַ~獎Q0^Bhpt *sڶ76ݨH-LLb>H~ӭ`_ wt.TҟƲL?~QFEjajgjmY-C셝"$=Njg?mtt.̦=;U58:J ZPLqzawvzi7ziٶ=&qco8L4ޖ+'_;;)6.Vo2L=8HѳgϟM;nTQCj|4ݪ]Lٓ'ϟ<={AJM `l8p ~7݆4N(5ݨy?=/"LgW(mn[pUz>y񤪾R S;GϞ|v;qp0^vLJR;'`I[96:{㬊`2vgF;;%@3h 5NԶpvwۿ$N֫6;Lhٺq5`sȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #nXyF19@9} 4NXۮqwox`3XP{\77IaWyKo y7u"Lj '7Gŕ`Pm=&Շv?|#%@F孕oµѿ M`-6~ ÿr&j\{"0 &$O4t@y(sxݡhH:zNjt0[[0Naz17ks?9Wcu+{ZN愉a0nIz;߸"ͯ]y6Or4$ٹb~zxtڭu}uy?8co8TDZ,nmBvv$=짭/Qhʶw}r?>C ЌY]o1;>xh bUUggq4j ]|t-=l~W';;~?}0Hy~to={ɓd7<7Om'^wh9kWgg?o]wb:j 3Uq:ߕɝt}uv1|ÇMRS'K~W'wҙZȅ8hcU|Vm/ha{\ZH:;+OOn=M*,wWߕl-Xcrl4j[PZ:ߕɝt}ur2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dDA ^,8UeQ-L75{1=cyK^Ӎ>6@U(Q]lUTN8|35ݨ >Y^`jr~w>v7-=cUɲ~'7v>bzf7,[NICHXzҳt6dy9O w?<|{Ϟ~p`rIi,4KXzҳt6dy9O w58zth2 ,V(=iid3>Y^`]";1{azҨ.3'}ltfr'-!1Y,c=%PF!Nݟd>6Lk2a5&eWN 4 qrfyVW'f }8Z]>YO ӕ@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD22h8ݒptV,lK\1ƹ ;;A XԳ-rM7xM!z3d]2^ И0ݒxY-XԳ-rEe4#Ԏ˧O?yw>eYΎ[7BFgK[IG'@c.&Q,FM7>&^8uniq4#Ԏ+Z@18emINBu~z4wZEfkaӴF+4$!*ŶX'I2`K^m ;;1Ƣ,$/ R?6 hH: Vlwq́Xu|fSdh͙ dȈ #d$`h0<_$Bk]htM/Mˋӭ̸YРY|-ߜubU%@; Jg6\Py|7NLZLIGٽrE-n#@,NO |x~za1)Y!NIǝBu~^I5fLJvY?:ǻ! EQUqu8 ӼY(z?fף__eӂu^__̓UNO{! !/ɉ0ٳbo-Fy]ֳ};>eZ%.k'JUf?Rmf!YKY5MT׿IJ,?|C'/^O%n$p;hzNj8=оKx\Nk M-Ձ張H|/<yӓdЪr?`h'Zi~M3@R|9{A/bpptCL}/~STGEa-'@NM揳sq?1]4}G \m6bV3g?g~hUau^a/ӱ?|Euq2@q|?]Rxm V]1ݘȐZ\:߉@sCbR$J|`CբW/NY RxsXb0oa>~V,Gٹl<sN>/̝Ȝ-2@oefE+`>pG|boV|`CVVo1Fc>p7|k w$F`>p/![+ޜ[&\G?p-76g~ q+x tjv.`nlu[ ѥ& uM`-ƽu>_U-;@؄KEAR&,7 ޞaKV ,W޳5 Yn>@9L2@Yb =~;Xz0=nEڍgg`o88عQ7uK_`Cn'GGM7XuMar?AdF[ƵWҿ-WR9N{]x 7XZ0?`z=+!q\Fx||`@,ß%${{?-Xˏ70o;ȴz pPX `-peNyֻ~3 hIɫL?V2b-_Vun?p8?'}opxtCkۿ+u2onŭp䘐eeYhW? uǻ+_}Mc?hԏ7,QlJH^]\!_'?yO4V,C;Ei]_r/_..z)LG!ؘIMUYV!TAY'4}NӧP,AK՟=l~?wO{Gl2aL:!^/ϟ>T57[guv/tP,CKcp:+s d hT19qһ ،Goث6 ksՉBQynM`s uXOm>@1)^JhՀ un~ ^uի(-b}W*r%t_2@zGB(ہ@MB:W6'|3064`Rn6/XUxł` ꟯٭fw*}7GxoWCG N׮VL?>z;(ٹb~hJnz9qn{t 0=ɬ8em ~)B˓Xnw't;N\00/fGmpt:;Qm ]|t-@ON`]UwI5L=~a,ɈBAGϞ=$}<9}"ܕտy// Kec+i7.ާ˧Oik<  ݇nd$}n2\;{1VYI-38Wggi LfڜYxGL&g"G#~a'.}fW, ܛIц\j",OxyJ #JEwXpY@lI !4Hf$ gJr|3@Kt oMm7|5:%[6 ]7^sKK.'tYlSiՖ'tJ;u$(hˀvPG񺹹kmnjh;%0@ӔmkO~)hW: K7VtmhoI3%tVXC蠰í @W u76 .6y7c,Xw2F`k?ZU_toٌk_?tuBFk(_p<`Zqm8~68mȐY:eXK2+D3\\ɭ/,3po٨M ] y \w? m@/_0ABtqM}/HuFM~y4*/@k|gzofcxjW޴ e6bT^@ taG{_Z *d2w%(! h %@tnZRdZ`3\wyV7޲fq;ZuI覭2"@Fu_}u?֜5:.޼lUW nϗH)XeCx7$l~+'z` 7ٺW+Ȗ@F\辛Φo,].'D踛pw77`}u6DZ2:`B;!PkŕKެ_GKiB@1 oJr4 hnwV"%@jI.[\i#o(ZkoI677x݅_pdDZ\b~;M-X>q h C&w\7_ mȁ UwmCr2"t3)V[R?߷ \Ŋ CK3%@tX FYJ[7_$f\sT<V@. (uIX2~2]67qXl@ 6LX߼v#Wp&j <(@VE X+%@9o`Ö_5q #Ȉ2Ȉ #dDȈ "/ ct#~l  xw6 Wg ]+.4N nۥ\iӟ@?u@rY"h?Bm'_?U#@BSZ@W ݧ">oȍlˀ2Ȉnz밮$ FzXw'D'WKd p-2[9O k]qt 62=]K]6:G)]tJJ0]bߜA!@7ml_nlP̟VfQ#qipo=Ph'e tӆIu2%(9yz;_m]='Æ s_2'wm joYtܺWWVov`lɓNl/ҳdφnƲ~Fa3@w,34l nlZ@Uh ѪFGn繢AƲ-@7w)At孵@.@`s 3P{\|'x3 WֹÆ)V)\wehWջ (C,*/1ka\ pO˜wFމ!>lXֵ,wU_rrp/gbU #pˬp>ʸ+2>`Yr/7PqXֻwZȈ #dD2"@FȈ;@wNx:ȈQݱLUȜk|oY `JnW@!&@VȈ pK?@!@ M%@w\Z޿tI2c?9W #dD2b jq}7_U\pa:O?m2"@FȈ9dOZ7C{+fO +6 #ʄ=JlYߝhs #!-?UC #dD2"@FȈ #dD2"@FȈ #dD nMtKBvw{a-O\ܥO_1$܃+}~@F'.}ҧM%D1O_ AnIu~~q|}ɓa,t6.V7BF>wWOu#,3w`IpPL(VUuvG]3mzKE-܃,++Z@18em!TFݻl,^s\m7M7 2ե+QVHBx\bS S|j[ى1eYN`q8RLw}`.}&n _j[e``iiQU@} Ϧt4Tr@b>pQšQ;iX.M"[xZs -F&s `Xh ga:az/YZ%\zxn,s/+7]!``ʷ8;C#f.+_s᭪& /-w1,U- kJH=, [2]lZ~҂~wp?{/zBaZf0]aSB.UU !zi|<>~* Z5 l Q=쳝>2{g_vvQ?ia`2 ]]\!_b؟?/,2`VXTd(_ߤ?Ov?q@.q<ٟuO:( p]W_Lz<{xO}5fɋO>~zo}EeQg>p2?8?h0Z_~5U믫S+u{`wCB;G{UeYoKk ɹu &AO~?1c:u?8xý26`'7&2Y?I;|aeȒI0N`>p2?yoM>}Quȃ{ !3 !'7 sMRy0:J?0e>p0xa>p'tț[ ![tftȞ[ 1[N?p/@uݙy`˩n`>p-.B2"RU02'Plylu&P9M?N@h1u@N1GS!+Jl{|go^{M7Xa7 ?$;;n_|EO~6-&)9'@{6O?G~G?zg>ؤIǃ{`i_|/@ jO?}:wÝdh7 ?UE]\0멌a+7Rw;xpG0Wؤٙ (H_M (jr@1u<,_~pz;?1ƪ+E}AnwKM׋!Ta<8({)Kw~8V8eB:Wk+1R~ߌ:Kw*L"@{gԕǓ3~;0"ŀYhn`=fKI/ǝɥ-ONb^R,VgԪQ:@;S[D^p<^\TUAgcY7`]7?I6dO[L}5|i/ =h鴹Qo=.kY h-6V3adD2b04gzs-|t@-jg54ȝ kvoŭ^O&lvװw0h&"X\ƥh qv87`Bf,Nx88lE+zԿMf7Ck-c*~I=[?͋quvV6h:;( hbȬ_{RϖN BK #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȠ@tKBvw{a-XԳ-rż 4/M7`Rϖ55Z ΐt gz&@ctKѳgM`RϖNh9ЌP;''/>}I}0eyz:;^lp?8~-o+'ehY\bGG85@jzԹ ЌP;ή'kXM>&u;;EyhQ-OO6曦F@KА~?(bl'ɀ-Uz-,[@hN| 7lKؤ3!(XUI2F3bUMmi4g~66Chr #dD0^;]ps64]Zh3?X44NKz7y;m@b ɱ: @.LԻ"@^|H&i1<pUnl@-Nx88}:';iǏw>e9ϛn ={ɓd79X]H>vаO?-OӳEdC^OGG6"Z!qa2+П̸E6bUe/3-Or<=m!d&ٙ@ɐ :nLhd/3鈐 +%+@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD22h^q% 鈐 P̏ WEn鸐M76M !^ov&W{tth!i[R_=kEB:"B::,ӧϟ :"B::2Ei(I`pt:;Q `s&A^8vQ . >}v`8Y (8DzllΤg:?OG4w tY<=Mon Y~?(bg'{R{-,[}]/}q+ Ɇ@޼f=:xZ$0&xFĤȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FM7#bYѨ:?/"map'T>U_QVӍz <=(UM `ӡTR*(F֍1V$_b}K#JFo8PXp88:NXa_; ]$bˆGw}E6 @⹶if@i}>)fq~v矮o{*iKTޞ?UUެ~z@pz}rq2|٤iV߯E鮤mO*Wy{7Ln1ݦOOb1\SM{w\cV|Ln1˵J)ƞ `J+˼Yz*Lh1ߠ'co6=P_w[z\vR4.{l' ӽk{ ?KY +D>Bg)e*_J@ @" D@ @" D@ @" D@ @" D@ @" D@ l[YjX0pJgi'Ny}zڬVcx*7@ێ=Ǔ image/svg+xml Graphics Category Jakub Steiner graphics category pixel vector editor draw paint http://tango-project.org jerry-3.2.0/src/res/icons/dialog-information.svg0000664000175000017500000013153413514421177020401 0ustar useruser image/svg+xml Info Jakub Steiner dialog info http://jimmac.musichall.cz Garrett LeSage jerry-3.2.0/src/res/icons/File_Video-display.svg0000664000175000017500000021124013514421177020260 0ustar useruser File:Video-display.svg - Wikimedia Commons

File:Video-display.svg

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search

Original file(SVG file, nominally 48 × 48 pixels, file size: 24 KB)

Structured data

Captions

Add a one-line explanation of what this file represents

Summary[edit]

Description

monitor icon

Date
Source The Tango! Desktop Project
Author The people from the Tango! project
Permission
(Reusing this file)
Public domain This work has been released into the public domain by its author, The Tango Desktop Project. This applies worldwide.
In some countries this may not be legally possible; if so:
The Tango Desktop Project grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.

SVG development
Inkscape-yes.svg
This icon was created with Inkscape.

File history

Click on a date/time to view the file as it appeared at that time.

Date/TimeThumbnailDimensionsUserComment
current15:44, 1 May 2018Thumbnail for version as of 15:44, 1 May 201848 × 48 (24 KB)Thomas Linard (talk | contribs)Version 0.8.90.
10:02, 12 September 2012Thumbnail for version as of 10:02, 12 September 201248 × 48 (11 KB)Palosirkka (talk | contribs)Scrubbed with http://codedread.com/scour/
14:34, 1 April 2006Thumbnail for version as of 14:34, 1 April 200648 × 48 (24 KB)Linuxerist~commonswiki (talk | contribs){{User:Linuxerist/Tango}}
  • You cannot overwrite this file.

More than 100 pages use this file. The following list shows the first 100 pages that use this file only. A full list is available.

File usage on other wikis

Metadata

jerry-3.2.0/src/res/icons/play-black.svg0000664000175000017500000003014213514421177016627 0ustar useruser image/svg+xml 2005-01-31 Jakub Steiner http://jimmac.musichall.cz Active state - when files are being dragged to. Novell, Inc. jerry-3.2.0/src/res/icons/jerry_512x512.png0000664000175000017500000001345113514421177016743 0ustar useruserPNG  IHDR{CtIME cL pHYs  ~gAMA aIDATxݽ%M2ؕ $ MAnFO u Ƶ #n  HUZ9V"9h&KPK.\bF/9~3?\dqmGЈ@;@P (J%A @P (J%A @P (J%A mY<oe͋QdYeXeI7rkj|qcmJ}W]o~8Xe+Kӳq=hN^E/<?|x,Ȯz 73Rij;Oɛެ@A @P (J%A @P (J%A @P (Ԯj;DUAm`]GaSۚFIh秧~UHÇMm"ˎve;g8@;ҿhn[Ϫ2oe͋7ۧ.YrǗ8X;;4P@P (J%A @P (J%A @P (J%A @P(o@JT[A EUeJ*Us! M %ܢͬn\|Bi{lLtg]xQ!_h ց@@JT[APzl2Wc|z@_^$@O`?;>|7D>XH۸څ?xp7LFf_o]vIZ ؃iT;_y4Ɂ.yޓT^;elJC~^u"'ـH[ʷُz-D~OJ%A @P (J%A @P (J%A @P ~ "˞݌+]{Bn nUZ'tvwON_yPnO6!'$Gp)WxOܤn{Bgn#:C%A @P (J%A @P (J%A @ڊ7f=zFm7@-olvJz>?=}42INXyeIiӳv[E;1q^6Qy5'kTNX.ձv؊H\ ۑ>A tH5';X`稚[4-COawIMox08LYQd먎כh?_L-;Շ{{^k=t,;~[Ttق_~yg?m7(Gԗ_fEtG5W_=/~⣏F/y'/{o>ȭ̕c?ky,EtHɼSɓVp՟\ee-`UC>85%VuEqkKܮ>di8}fpzVU8'VHq'+^}8k $S0`?3vg{NqskH85F]`UkȕWs鞩e?i_t?K +I2~qx_ݣR`UIzqƯ}`p{Iv˾_o@ۙF, wegAXl~͍yQ7U)T;?.?s77ݬ+7ߔ'mf(Jds zJL7Vbӹ7]=r LߟW +[-t&Vs*t@Pó:p1w?ή̫zWs@ZCmTU՟Et׌uwONzd4jE_秧Oq>/ʱ/O/vmmRew8l-lpX$·96֐=7ze_톰z9\ٌX*IWs(#&pf #U>R1g 2: @p9 lP_2 F0LnƢL>I@]WsM6hHZ`fd; P̟{{&@m{Kfq, [+aPKY8p}-3@݇"Nmfi?Obɲ@F/ŸgsMe/c!pMO%72{B2o~67k n+^95+/Ghb@#5cc/X])btRhd KbM5(#y~0kZ/sU pϝ/jM+\d\mj~s?oa]Xy-S,o6`mV̕~ p"j\_~=+6S7 !YDd V  ` nаٕZ.TjZf Ptg}HQ@^XŲl;[hEXz; -ЊXkj@tDEW,{l[`E + W&h  @PAO-,1tot^)kAWK E 7}L'bDX[bNaF|.:,X]_0:R1dKFMfE:ڳIPG'IM4У*Ty u͋˯J@{<۱lV.guV,oI@B/V˃ '_hw+A^QtꞩuX6X8=Ŷ#e^Ym7Sn:ɕ;e[2V5vc!5;0,7?S\~x[ tn/< I(f,Wl[ -~K@P (J@pME0ezyM7?U}f B@ JŎYiUeqFA b8S@@rտiF==A @P (J%A Z m7 5s`Z+Ѩ톰z߹f7p9hU秧ò/) Rreq׊)dO Gӳv[~>֙(5zl2gDo.5j?-i5a\}HUO@*|f=4jxz9OlՓ/;;[pPspdU;[pPoGO~Nŋ^oUDT;?ϟ}MwāT.+BY Gݽwﵶg_?L>x՟\o?gܛ>(~/<Ɍ$›_߿{ʽ9˟0G+տ(<}qfWue߽ћof\!a @HapH,%8@pC?<38?s5@s 2Y8 8Q8 898 ,98 ,5Ǵe_~ ̀ݻk?W_svhشzwǪ?[(GqEtMϿ.+&tEf[UQMzb4z^S^W@|O' Ω֘V2=2;f,.S}JiE@P (S@ffՌ~v>zu*>ط#??}F.|''`2">OOكiTm( eLYN[Q=B V 'Va A @P (J%A @P (J%A @P (J%VTϽH}m7 d4j!Roy`{VzIv>-zuᨎ[V@O`ߎdTYJe`CŊBޙET}Wo=9q>;Ul{oM/am=(Fmo\YE`\湲P@P (J%A @P (J%A #sG }sG0`-r}U秧ò# >Bv`ӳv[PD]M&r[{V}2T}.nQ8`画קּy,%A @P (J%A @P (J%A @P (J%A @P (J%A m7`%"˞ 5WoyG50 mUj|;iݓ]kT]L=HŽj/qMX[Sk5 1FTi <`G@P (J%A @P (J%A @P (Jdso0hEj;K5y<v\$Amgܶʜ*[wONq$B)^YX>if̖z[OG/]dq.Ç7EM&8`R;YɏroP0[;͉06/ %A @P (J%A @P (J%A @P (| IENDB`jerry-3.2.0/src/res/icons/mail-mark-not-junk.svg0000664000175000017500000004315213514421177020232 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz Mark as non-junk mail ham non-junk jerry-3.2.0/src/res/icons/document-print.svg0000664000175000017500000005544513514421177017575 0ustar useruser image/svg+xml Print Document Jakub Steiner http://jimmac.musichall.cz document lpr print local laser bubblejet inkjet print output cups lpd jerry-3.2.0/src/res/icons/mail-mark-junk.svg0000664000175000017500000005436713514421177017446 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz Mark mail as Junk mail spam junk jerry-3.2.0/src/res/icons/emblem-system.svg0000664000175000017500000002460513514421177017402 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz Emblem System emblem system library crucial base jerry-3.2.0/src/res/icons/system-search.svg0000664000175000017500000003660513514421177017411 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz jerry-3.2.0/src/res/icons/document-save.svg0000664000175000017500000007230613514421177017372 0ustar useruser image/svg+xml Save Jakub Steiner hdd hard drive save io store http://jimmac.musichall.cz jerry-3.2.0/src/res/icons/document-enter-position.svg0000664000175000017500000003671213514421177021414 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz jerry-3.2.0/src/res/icons/document-open.svg0000664000175000017500000007412513514421177017376 0ustar useruser image/svg+xml Folder Icon Accept 2005-01-31 Jakub Steiner http://jimmac.musichall.cz Active state - when files are being dragged to. Novell, Inc. jerry-3.2.0/src/res/icons/play-white.svg0000664000175000017500000003004413514421177016674 0ustar useruser image/svg+xml 2005-01-31 Jakub Steiner http://jimmac.musichall.cz Active state - when files are being dragged to. Novell, Inc. jerry-3.2.0/src/res/icons/database.svg0000664000175000017500000004375313514421177016370 0ustar useruser image/svg+xml Addess Book Jakub Steiner http://jimmac.musichall.cz address contact book office jerry-3.2.0/src/res/icons/jerry_64x64.png0000664000175000017500000000101213514421177016575 0ustar useruserPNG  IHDR@@iqIDATxۿj@_(BBqRGG} _@}| Q.Х @C$%׻BK~ܟ!h1 ~[ 01Ʋ7rP`< s@TM;R= /ucdP@pZjUtrE\ӡɄJ-cKө2/)|YNJEv2Bz@iB7Xږ Zt; xhɝϋv7 q3% K`{@s0H 30vލ3I!'*}Bjg2,r0P@ֶrR|}d!7ux1Wc@.F*@^OXxd&P? R587!ndIENDB`jerry-3.2.0/src/res/icons/jerry_16x16.png0000664000175000017500000000040613514421177016575 0ustar useruserPNG  IHDRaIDATxc< @@N YH `z`t  (?Eĉ #`xy1o݊bMoo۶X "gP۰ŀ[ 6nt. ` ~WWw$F:451<'kk/GbBmI\60_߳(AIENDB`jerry-3.2.0/src/res/icons/jerry_128x128.png0000664000175000017500000000170513514421177016750 0ustar useruserPNG  IHDR>aIDATxAR1@Q9` 39 L8@@HRj\XnIf y10vٷaK˭Y ;8<8o\N\eꢩpyp7 }{Ipyp m:"_@yyEwYrwYrm{~Jk@p`=TZ`-d1d1d1d1d1P<8KC?W^X\ǟ"ycYCPǺpr~~nŏq8^Ԏŏ4~]}K| @P>5z:O`󵵨15 $/VS P?53M(J"hR;@HQz;_"MXM x0H|Ď6<W@H<6GnJ/"6n};M8ohԋc}Z8p$|@$H*1TH~BJQ}Ҽ@#[y?P! iTH~t j6|nr] ?on? A,\T ]tSt OD-z_pmz3Hp @p @p @p @p @p SG(YFD1 d<8<8<8<8o٩}yp èްMwIENDB`jerry-3.2.0/src/res/icons/edit-undo.svg0000664000175000017500000002202313514421177016477 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Undo edit undo revert jerry-3.2.0/src/res/icons/edit-copy.svg0000664000175000017500000003635313514421177016517 0ustar useruser image/svg+xml Edit Copy 2005-10-15 Andreas Nilsson edit copy Jakub Steiner jerry-3.2.0/src/res/icons/jerry_icon48.png0000664000175000017500000000106713514421177017120 0ustar useruserPNG  IHDR00WIDATx혻kPϵ P*VB&gqu Nm} >BGG m& 171xO~񞓛 -B(< xǢi,\}$?V+ ~`Y|\B/I)o= @ˀ=QyX1Yʜ,=a 83[kaVBhej# z!\K&p9Q1Su0"T{$,|b-xLἮ)K 4"$VL2L+u@ВH  Iߞ0@SJ; o!HM³<0:OQۮ@Tde\E;:@RFP8l VR¢t'52 pTC4b|9kF pqp0TW2O,h8vB,tG#[?d2U,DILlOc:mnk{KH/nU/IENDB`jerry-3.2.0/src/res/icons/edit-paste.svg0000664000175000017500000005631313514421177016657 0ustar useruser image/svg+xml Edit Paste 2005-10-10 Andreas Nilsson edit paste Jakub Steiner jerry-3.2.0/src/res/icons/jerry_48x48.png0000664000175000017500000000106713514421177016613 0ustar useruserPNG  IHDR00WIDATx혻kPϵ P*VB&gqu Nm} >BGG m& 171xO~񞓛 -B(< xǢi,\}$?V+ ~`Y|\B/I)o= @ˀ=QyX1Yʜ,=a 83[kaVBhej# z!\K&p9Q1Su0"T{$,|b-xLἮ)K 4"$VL2L+u@ВH  Iߞ0@SJ; o!HM³<0:OQۮ@Tde\E;:@RFP8l VR¢t'52 pTC4b|9kF pqp0TW2O,h8vB,tG#[?d2U,DILlOc:mnk{KH/nU/IENDB`jerry-3.2.0/src/res/icons/computer.svg0000664000175000017500000011005113514421177016444 0ustar useruser image/svg+xml Computer 2005-03-08 Jakub Steiner workstation computer node client http://jimmac.musichall.cz/ jerry-3.2.0/src/res/icons/edit-redo.svg0000664000175000017500000002216313514421177016470 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Redo edit redo again reapply jerry-3.2.0/src/res/icons/jerry_icon64.png0000664000175000017500000000101213514421177017104 0ustar useruserPNG  IHDR@@iqIDATxۿj@_(BBqRGG} _@}| Q.Х @C$%׻BK~ܟ!h1 ~[ 01Ʋ7rP`< s@TM;R= /ucdP@pZjUtrE\ӡɄJ-cKө2/)|YNJEv2Bz@iB7Xږ Zt; xhɝϋv7 q3% K`{@s0H 30vލ3I!'*}Bjg2,r0P@ֶrR|}d!7ux1Wc@.F*@^OXxd&P? R587!ndIENDB`jerry-3.2.0/src/res/icons/jerry_256x256.png0000664000175000017500000000407013514421177016752 0ustar useruserPNG  IHDR\rfIDATx]nGaJIz0|?GIMVW}y@ײ,>N;iN?=o=U;u_0*5 VI&@`M0U*kɭ2PXLn `r T$[e&*5 VI&@`M0U*kɭ2PXLn `r} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0} 0}  L @0XĻO?a/>>pa܄,DWbD8.,Hƫxo`<.q^lD*_dN`#SN?.^ſf f?ч#;}|]>>EݻC%N3`]8W;k6"/7/|{-o3o.} F\گWk jET|X+8 9~%߮W~|+~%rϷ쾳F@@<p-G6O @x8Okh ő+~GC`3SoL$h#d.>:`3&m W66O m_D::h#+W#@''B }:}Nq(" Eo')PR" sOB`a.XǫX8# qZ &L&-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_0-u_&L=66)ρZ*lRTؤ <jIxRa0&`9PKM s @-6)ρZ*lRTؤ@ &L @0` &L @0` V>< &L @0` &L Ӂ&L @0` &L @nn!JIENDB`jerry-3.2.0/src/res/icons/document-new.svg0000664000175000017500000004177613514421177017234 0ustar useruser image/svg+xml New Document Jakub Steiner http://jimmac.musichall.cz jerry-3.2.0/src/res/icons/go-previous.svg0000664000175000017500000006742313514421177017103 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz Go Previous go previous left arrow pointer < jerry-3.2.0/src/res/icons/File_Edit-metadata.svg0000664000175000017500000012356313514421177020224 0ustar useruser File:Edit-metadata.svg - Wikimedia Commons

File:Edit-metadata.svg

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search

Original file(SVG file, nominally 48 × 48 pixels, file size: 33 KB)

Structured data

Captions

Add a one-line explanation of what this file represents

Summary[edit]

Description

Icon "Edit document description"

Date (original upload date)
Source No machine-readable source provided. Own work assumed (based on copyright claims).
Author No machine-readable author provided. Rainer Klute assumed (based on copyright claims).

Licensing[edit]

Public domain I, the copyright holder of this work, release this work into the public domain. This applies worldwide.
In some countries this may not be legally possible; if so:
I grant anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.

File history

Click on a date/time to view the file as it appeared at that time.

Date/TimeThumbnailDimensionsUserComment
current08:19, 8 May 2013Thumbnail for version as of 08:19, 8 May 201348 × 48 (33 KB)Rainer Klute (talk | contribs)Icon "Edit document description"
  • You cannot overwrite this file.

The following page uses this file:

File usage on other wikis

The following other wikis use this file:

Metadata

jerry-3.2.0/src/res/icons/document-properties.svg0000664000175000017500000006152013514421177020624 0ustar useruser image/svg+xml Document Properties document settings preferences properties tweak Jakub Steiner http://jimmac.musichall.cz jerry-3.2.0/src/res/icons/view-refresh.svg0000664000175000017500000004074413514421177017227 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz View Refresh reload refresh view jerry-3.2.0/src/res/icons/document-print-board.svg0000664000175000017500000004367713514421177020666 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz document lpr print local laser bubblejet inkjet print output cups lpd jerry-3.2.0/src/res/icons/edit-copy-pgn.svg0000664000175000017500000003475113514421177017301 0ustar useruser image/svg+xml 2005-10-15 Andreas Nilsson edit copy Jakub Steiner PGN jerry-3.2.0/src/res/icons/jerry_icon128.png0000664000175000017500000000170513514421177017176 0ustar useruserPNG  IHDR>aIDATxAR1@Q9` 39 L8@@HRj\XnIf y10vٷaK˭Y ;8<8o\N\eꢩpyp7 }{Ipyp m:"_@yyEwYrwYrm{~Jk@p`=TZ`-d1d1d1d1d1P<8KC?W^X\ǟ"ycYCPǺpr~~nŏq8^Ԏŏ4~]}K| @P>5z:O`󵵨15 $/VS P?53M(J"hR;@HQz;_"MXM x0H|Ď6<W@H<6GnJ/"6n};M8ohԋc}Z8p$|@$H*1TH~BJQ}Ҽ@#[y?P! iTH~t j6|nr] ?on? A,\T ]tSt OD-z_pmz3Hp @p @p @p @p @p SG(YFD1 d<8<8<8<8o٩}yp èްMwIENDB`jerry-3.2.0/src/res/icons/go-last.svg0000664000175000017500000002115013514421177016155 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz Go Next go next right arrow pointer > Andreas Nilsson jerry-3.2.0/src/res/icons/internet-web-browser.svg0000664000175000017500000014256013514421177020704 0ustar useruser image/svg+xml Globe Jakub Steiner Tuomas Kuosmanen http://jimmac.musichall.cz globe international web www internet network jerry-3.2.0/src/res/icons/jerry_24x24.png0000664000175000017500000000047213514421177016576 0ustar useruserPNG  IHDRw=IDATxU0@/Q4~'*TB@hwgvg)x`cpA7!)Z`M|b9%yT=jж~sy/Z%0U m"$ =qS$p|<&U6N"4 gOyr"kH-Q:N"D|B9xz}hP䂞L+ 7h=;Fh+}-yqoMFd_Um6-ַ~獎Q0^Bhpt *sڶ76ݨH-LLb>H~ӭ`_ wt.TҟƲL?~QFEjajgjmY-C셝"$=Njg?mtt.̦=;U58:J ZPLqzawvzi7ziٶ=&qco8L4ޖ+'_;;)6.Vo2L=8HѳgϟM;nTQCj|4ݪ]Lٓ'ϟ<={AJM `l8p ~7݆4N(5ݨy?=/"LgW(mn[pUz>y񤪾R S;GϞ|v;qp0^vLJR;'`I[96:{㬊`2vgF;;%@3h 5NԶpvwۿ$N֫6;Lhٺq5`sȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #nXyF19@9} 4NXۮqwox`3XP{\77IaWyKo y7u"Lj '7Gŕ`Pm=&Շv?|#%@F孕oµѿ M`-6~ ÿr&j\{"0 &$O4t@y(sxݡhH:zNjt0[[0Naz17ks?9Wcu+{ZN愉a0nIz;߸"ͯ]y6Or4$ٹb~zxtڭu}uy?8co8TDZ,nmBvv$=짭/Qhʶw}r?>C ЌY]o1;>xh bUUggq4j ]|t-=l~W';;~?}0Hy~to={ɓd7<7Om'^wh9kWgg?o]wb:j 3Uq:ߕɝt}uv1|ÇMRS'K~W'wҙZȅ8hcU|Vm/ha{\ZH:;+OOn=M*,wWߕl-Xcrl4j[PZ:ߕɝt}ur2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dDA ^,8UeQ-L75{1=cyK^Ӎ>6@U(Q]lUTN8|35ݨ >Y^`jr~w>v7-=cUɲ~'7v>bzf7,[NICHXzҳt6dy9O w?<|{Ϟ~p`rIi,4KXzҳt6dy9O w58zth2 ,V(=iid3>Y^`]";1{azҨ.3'}ltfr'-!1Y,c=%PF!Nݟd>6Lk2a5&eWN 4 qrfyVW'f }8Z]>YO ӕ@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD22h8ݒptV,lK\1ƹ ;;A XԳ-rM7xM!z3d]2^ И0ݒxY-XԳ-rEe4#Ԏ˧O?yw>eYΎ[7BFgK[IG'@c.&Q,FM7>&^8uniq4#Ԏ+Z@18emINBu~z4wZEfkaӴF+4$!*ŶX'I2`K^m ;;1Ƣ,$/ R?6 hH: Vlwq́Xu|fSdh͙ dȈ #d$`h0<_$Bk]htM/Mˋӭ̸YРY|-ߜubU%@; Jg6\Py|7NLZLIGٽrE-n#@,NO |x~za1)Y!NIǝBu~^I5fLJvY?:ǻ! EQUqu8 ӼY(z?fף__eӂu^__̓UNO{! !/ɉ0ٳbo-Fy]ֳ};>eZ%.k'JUf?Rmf!YKY5MT׿IJ,?|C'/^O%n$p;hzNj8=оKx\Nk M-Ձ張H|/<yӓdЪr?`h'Zi~M3@R|9{A/bpptCL}/~STGEa-'@NM揳sq?1]4}G \m6bV3g?g~hUau^a/ӱ?|Euq2@q|?]Rxm V]1ݘȐZ\:߉@sCbR$J|`CբW/NY RxsXb0oa>~V,Gٹl<sN>/̝Ȝ-2@oefE+`>pG|boV|`CVVo1Fc>p7|k w$F`>p/![+ޜ[&\G?p-76g~ q+x tjv.`nlu[ ѥ& uM`-ƽu>_U-;@؄KEAR&,7 ޞaKV ,W޳5 Yn>@9L2@Yb =~;Xz0=nEڍgg`o88عQ7uK_`Cn'GGM7XuMar?AdF[ƵWҿ-WR9N{]x 7XZ0?`z=+!q\Fx||`@,ß%${{?-Xˏ70o;ȴz pPX `-peNyֻ~3 hIɫL?V2b-_Vun?p8?'}opxtCkۿ+u2onŭp䘐eeYhW? uǻ+_}Mc?hԏ7,QlJH^]\!_'?yO4V,C;Ei]_r/_..z)LG!ؘIMUYV!TAY'4}NӧP,AK՟=l~?wO{Gl2aL:!^/ϟ>T57[guv/tP,CKcp:+s d hT19qһ ،Goث6 ksՉBQynM`s uXOm>@1)^JhՀ un~ ^uի(-b}W*r%t_2@zGB(ہ@MB:W6'|3064`Rn6/XUxł` ꟯٭fw*}7GxoWCG N׮VL?>z;(ٹb~hJnz9qn{t 0=ɬ8em ~)B˓Xnw't;N\00/fGmpt:;Qm ]|t-@ON`]UwI5L=~a,ɈBAGϞ=$}<9}"ܕտy// Kec+i7.ާ˧Oik<  ݇nd$}n2\;{1VYI-38Wggi LfڜYxGL&g"G#~a'.}fW, ܛIц\j",OxyJ #JEwXpY@lI !4Hf$ gJr|3@Kt oMm7|5:%[6 ]7^sKK.'tYlSiՖ'tJ;u$(hˀvPG񺹹kmnjh;%0@ӔmkO~)hW: K7VtmhoI3%tVXC蠰í @W u76 .6y7c,Xw2F`k?ZU_toٌk_?tuBFk(_p<`Zqm8~68mȐY:eXK2+D3\\ɭ/,3po٨M ] y \w? m@/_0ABtqM}/HuFM~y4*/@k|gzofcxjW޴ e6bT^@ taG{_Z *d2w%(! h %@tnZRdZ`3\wyV7޲fq;ZuI覭2"@Fu_}u?֜5:.޼lUW nϗH)XeCx7$l~+'z` 7ٺW+Ȗ@F\辛Φo,].'D踛pw77`}u6DZ2:`B;!PkŕKެ_GKiB@1 oJr4 hnwV"%@jI.[\i#o(ZkoI677x݅_pdDZ\b~;M-X>q h C&w\7_ mȁ UwmCr2"t3)V[R?߷ \Ŋ CK3%@tX FYJ[7_$f\sT<V@. (uIX2~2]67qXl@ 6LX߼v#Wp&j <(@VE X+%@9o`Ö_5q #Ȉ2Ȉ #dDȈ "/ ct#~l  xw6 Wg ]+.4N nۥ\iӟ@?u@rY"h?Bm'_?U#@BSZ@W ݧ">oȍlˀ2Ȉnz밮$ FzXw'D'WKd p-2[9O k]qt 62=]K]6:G)]tJJ0]bߜA!@7ml_nlP̟VfQ#qipo=Ph'e tӆIu2%(9yz;_m]='Æ s_2'wm joYtܺWWVov`lɓNl/ҳdφnƲ~Fa3@w,34l nlZ@Uh ѪFGn繢AƲ-@7w)At孵@.@`s 3P{\|'x3 WֹÆ)V)\wehWջ (C,*/1ka\ pO˜wFމ!>lXֵ,wU_rrp/gbU #pˬp>ʸ+2>`Yr/7PqXֻwZȈ #dD2"@FȈ;@wNx:ȈQݱLUȜk|oY `JnW@!&@VȈ pK?@!@ M%@w\Z޿tI2c?9W #dD2b jq}7_U\pa:O?m2"@FȈ9dOZ7C{+fO +6 #ʄ=JlYߝhs #!-?UC #dD2"@FȈ #dD2"@FȈ #dD nMtKBvw{a-O\ܥO_1$܃+}~@F'.}ҧM%D1O_ AnIu~~q|}ɓa,t6.V7BF>wWOu#,3w`IpPL(VUuvG]3mzKE-܃,++Z@18em!TFݻl,^s\m7M7 2ե+QVHBx\bS S|j[ى1eYN`q8RLw}`.}&n _j[e``iiQU@} Ϧt4Tr@b>pQšQ;iX.M"[xZs -F&s `Xh ga:az/YZ%\zxn,s/+7]!``ʷ8;C#f.+_s᭪& /-w1,U- kJH=, [2]lZ~҂~wp?{/zBaZf0]aSB.UU !zi|<>~* Z5 l Q=쳝>2{g_vvQ?ia`2 ]]\!_b؟?/,2`VXTd(_ߤ?Ov?q@.q<ٟuO:( p]W_Lz<{xO}5fɋO>~zo}EeQg>p2?8?h0Z_~5U믫S+u{`wCB;G{UeYoKk ɹu &AO~?1c:u?8xý26`'7&2Y?I;|aeȒI0N`>p2?yoM>}Quȃ{ !3 !'7 sMRy0:J?0e>p0xa>p'tț[ ![tftȞ[ 1[N?p/@uݙy`˩n`>p-.B2"RU02'Plylu&P9M?N@h1u@N1GS!+Jl{|go^{M7Xa7 ?$;;n_|EO~6-&)9'@{6O?G~G?zg>ؤIǃ{`i_|/@ jO?}:wÝdh7 ?UE]\0멌a+7Rw;xpG0Wؤٙ (H_M (jr@1u<,_~pz;?1ƪ+E}AnwKM׋!Ta<8({)Kw~8V8eB:Wk+1R~ߌ:Kw*L"@{gԕǓ3~;0"ŀYhn`=fKI/ǝɥ-ONb^R,VgԪQ:@;S[D^p<^\TUAgcY7`]7?I6dO[L}5|i/ =h鴹Qo=.kY h-6V3adD2b04gzs-|t@-jg54ȝ kvoŭ^O&lvװw0h&"X\ƥh qv87`Bf,Nx88lE+zԿMf7Ck-c*~I=[?͋quvV6h:;( hbȬ_{RϖN BK #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȠ@tKBvw{a-XԳ-rż 4/M7`Rϖ55Z ΐt gz&@ctKѳgM`RϖNh9ЌP;''/>}I}0eyz:;^lp?8~-o+'ehY\bGG85@jzԹ ЌP;ή'kXM>&u;;EyhQ-OO6曦F@KА~?(bl'ɀ-Uz-,[@hN| 7lKؤ3!(XUI2F3bUMmi4g~66Chr #dD0^;]ps64]Zh3?X44NKz7y;m@b ɱ: @.LԻ"@^|H&i1<pUnl@-Nx88}:';iǏw>e9ϛn ={ɓd79X]H>vаO?-OӳEdC^OGG6"Z!qa2+П̸E6bUe/3-Or<=m!d&ٙ@ɐ :nLhd/3鈐 +%+@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD22h^q% 鈐 P̏ WEn鸐M76M !^ov&W{tth!i[R_=kEB:"B::,ӧϟ :"B::2Ei(I`pt:;Q `s&A^8vQ . >}v`8Y (8DzllΤg:?OG4w tY<=Mon Y~?(bg'{R{-,[}]/}q+ Ɇ@޼f=:xZ$0&xFĤȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FȈ #dD2"@FM7#bYѨ:?/"map'T>U_QVӍz <=(UM `ӡTR*(F֍1V$_b}K#JFo8PXp88:NXa_; ]$bˆGw}E6 @⹶if@i}>)fq~v矮o{*iKTޞ?UUެ~z@pz}rq2|٤iV߯E鮤mO*Wy{7Ln1ݦOOb1\SM{w\cV|Ln1˵J)ƞ `J+˼Yz*Lh1ߠ'co6=P_w[z\vR4.{l' ӽk{ ?KY +D>Bg)e*_J@ @" D@ @" D@ @" D@ @" D@ @" D@ l[YjX0pJgi'Ny}zڬVcx*7@ێ=Ǔ image/svg+xml Jakub Steiner http://jimmac.musichall.cz Go Previous go previous left arrow pointer < Andreas Nilsson jerry-3.2.0/src/res/icons/edit-copy-fen.svg0000664000175000017500000003475113514421177017265 0ustar useruser image/svg+xml 2005-10-15 Andreas Nilsson edit copy Jakub Steiner FEN jerry-3.2.0/src/res/icons/go-next.svg0000664000175000017500000001734013514421177016176 0ustar useruser image/svg+xml Jakub Steiner http://jimmac.musichall.cz Go Next go next right arrow pointer > jerry-3.2.0/src/res/icons/edit-find.svg0000664000175000017500000010512413514421177016456 0ustar useruser image/svg+xml Edit Find edit find locate search Steven Garrity Jakub Steiner jerry-3.2.0/src/res/icons/jerry.png0000664000175000017500000000106713514421177015734 0ustar useruserPNG  IHDR00WIDATx혻kPϵ P*VB&gqu Nm} >BGG m& 171xO~񞓛 -B(< xǢi,\}$?V+ ~`Y|\B/I)o= @ˀ=QyX1Yʜ,=a 83[kaVBhej# z!\K&p9Q1Su0"T{$,|b-xLἮ)K 4"$VL2L+u@ВH  Iߞ0@SJ; o!HM³<0:OQۮ@Tde\E;:@RFP8l VR¢t'52 pTC4b|9kF pqp0TW2O,h8vB,tG#[?d2U,DILlOc:mnk{KH/nU/IENDB`jerry-3.2.0/src/main.cpp0000664000175000017500000000737713514421177013631 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include "chess/board.h" #include "chess/move.h" #include #include "funct.h" #include "main_window.h" #include #include #include #include "various/resource_finder.h" using namespace std; int main(int argc, char *argv[]) { srand(time(NULL)); //chess::FuncT *p = new chess::FuncT(); //p->run_pgn_speedtest(); //p->run_zobrist_test(); //p->run_pgnt(); //p.run_pgn_scant(); //p.run_sant(); // p->run_ucit(); //p->run_pertf(); //QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // DPI support QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); // from Qt 5.6 onwards QApplication app(argc, argv); app.setOrganizationName("dkl"); app.setApplicationName("Jerry"); // setting dark style // todo: fix bold colors in textedit // currently not activated //qApp->setStyle(QStyleFactory::create("Fusion")); /* QPalette darkPalette; darkPalette.setColor(QPalette::Window, QColor(53,53,53)); darkPalette.setColor(QPalette::WindowText, Qt::white); darkPalette.setColor(QPalette::Base, QColor(25,25,25)); darkPalette.setColor(QPalette::AlternateBase, QColor(53,53,53)); darkPalette.setColor(QPalette::ToolTipBase, Qt::white); darkPalette.setColor(QPalette::ToolTipText, Qt::white); darkPalette.setColor(QPalette::Text, Qt::white); darkPalette.setColor(QPalette::Button, QColor(53,53,53)); darkPalette.setColor(QPalette::ButtonText, Qt::white); darkPalette.setColor(QPalette::BrightText, Qt::red); darkPalette.setColor(QPalette::Link, QColor(42, 130, 218)); darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); darkPalette.setColor(QPalette::HighlightedText, Qt::black); qApp->setPalette(darkPalette); qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); */ // dark style end // set application icon QIcon *app_icon = new QIcon(); QString path = ResourceFinder::getPath(); #ifdef __APPLE__ path = path.append("/../Resources/"); #endif app_icon->addFile(":/res/icons/jerry_icon16.png", QSize(16,16)); app_icon->addFile(":/res/icons/jerry_icon32.png", QSize(32,32)); app_icon->addFile(":/res/icons/jerry_icon48.png", QSize(48,48)); app_icon->addFile(":/res/icons/jerry_icon256.png", QSize(256,256)); //app_icon->addFile(":/res/icons/icon1024.png", QSize(1024,1024)); app.setWindowIcon(*app_icon); //app.setStyle(QStyleFactory::create("Fusion")); //app.setStyle(QStyleFactory::create("Windows")); MainWindow mainWin; QObject::connect(&app, &QApplication::aboutToQuit, &mainWin, &MainWindow::aboutToQuit); //mainWin.centerAndResize(); mainWin.show(); mainWin.resetLayout(); return app.exec(); } jerry-3.2.0/src/uci/0000775000175000017500000000000013514421177012743 5ustar useruserjerry-3.2.0/src/uci/uci_worker.cpp0000664000175000017500000001323513514421177015624 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "uci_worker.h" #include #include #include #include UciWorker::UciWorker(QObject *parent) : QObject(parent) { //this->cmd_queue = new QQueue(); //this->engine_info = new EngineInfo(); // this->process = new QProcess(); //this->go_infinite = false; //this->current_fen = QString(""); } void UciWorker::processCommands() { if(this->process->state() == QProcess::NotRunning && !this->cmd_queue->isEmpty()) { QString msg = this->cmd_queue->dequeue(); if(msg.startsWith("start_engine?")) { QString path = msg.split("?")[1]; //qDebug() << "path: " << path; this->process->start(path.append("\n")); this->engine_info->strength = -1; } } else if(this->process->state() == QProcess::Running) { QString output = QString(this->process->readAllStandardOutput()); if(!output.isEmpty()) { //qDebug() << "RECEIVING: " << output; this->engine_info->update(output, this->current_fen); if(this->engine_info->seesMate[0]) { emit(mateDetected(this->engine_info->mate[0])); } if(!this->engine_info->pv.isEmpty()) { emit(bestPv(this->engine_info->pv)); } emit(eval(this->engine_info->score[0])); emit(info(this->engine_info->toString())); QStringList lines = output.split("\n"); for(int i=0;icmd_queue->isEmpty()) { // first check if we are in go infinite mode // if so, first send a stop command to the engine // before processing further commands from the queue if(this->go_infinite) { this->process->write("stop\n"); this->process->waitForBytesWritten(); } QString msg = this->cmd_queue->dequeue(); //qDebug() << "SENDING: " << msg; this->go_infinite = false; // if the command is "position fen moves", first count the // numbers of moves so far to generate move numbers in engine info if(msg.startsWith("position")) { QRegularExpressionMatch mv_match = REG_MOVES.match(msg); int cnt = mv_match.lastCapturedIndex(); if(cnt > 0) { this->engine_info->halfmoves = cnt; } } if(msg.startsWith("quit")) { this->process->write("quit\n"); this->process->waitForBytesWritten(); this->process->waitForFinished(); } else if(msg.startsWith("go infinite")) { //QThread::sleep(10); this->go_infinite = true; this->process->write("go infinite\n"); this->process->waitForBytesWritten(); //QThread::sleep(1); } else if(msg.startsWith("setoption name Skill Level")) { QRegularExpressionMatch strength_match = REG_STRENGTH.match(msg); if(strength_match.hasMatch()) { int val_i = strength_match.captured(0).remove(0,18).toInt(); this->engine_info->strength = val_i; } this->process->write(msg.append("\n").toLatin1()); this->process->waitForBytesWritten(); } else if(msg.startsWith("setoption name MultiPV value")) { int nrLines = msg.mid(29,30).toInt(); this->engine_info->nrPvLines = nrLines; this->process->write(msg.append("\n").toLatin1()); this->process->waitForBytesWritten(); } else { this->process->write(msg.append("\n").toLatin1()); this->process->waitForBytesWritten(); } } } } void UciWorker::addCommand(const QString cmd) { // if there are just too many unprocessed // commands in the queue, then we simply // drop the oldest ones... // this usually only happens if the user // is quickly browsing the game by forward/back // keys if(this->cmd_queue->size() > 15) { for(int i=0;i<8;i++) { this->cmd_queue->removeLast(); } } this->cmd_queue->enqueue(cmd); } void UciWorker::updateFen(const QString fen) { this->current_fen = fen; } void bestmove(QString uci_move); //void info(EngineInfo* engine_info); void error(QString error); jerry-3.2.0/src/uci/uci_controller.cpp0000664000175000017500000001051013514421177016467 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "uci_controller.h" #include "uci_worker.h" #include #include #include "model/engine_option.h" UciController::UciController(QObject *parent) : QObject(parent) { this->thread = new QThread(); this->worker = new UciWorker(); this->worker->process = new QProcess(); this->worker->cmd_queue = new QQueue(); this->worker->engine_info = new EngineInfo(); this->worker->process = new QProcess(); this->worker->go_infinite = false; this->worker->current_fen = QString(""); this->timer = new QTimer(); QObject::connect(this->timer, &QTimer::timeout, this->worker, &UciWorker::processCommands); this->timer->start(40); this->timer->moveToThread(this->thread); this->worker->moveToThread(this->thread); this->worker->process->moveToThread(this->thread); this->thread->start(QThread::LowestPriority); QObject::connect(this->worker,&UciWorker::bestmove,this,&UciController::onBestmove); QObject::connect(this->worker,&UciWorker::error,this,&UciController::onError); QObject::connect(this->worker,&UciWorker::info,this,&UciController::onInfo); QObject::connect(this->worker,&UciWorker::bestPv,this,&UciController::onBestPv); QObject::connect(this->worker,&UciWorker::mateDetected,this,&UciController::onMateDetected); QObject::connect(this->worker,&UciWorker::eval,this,&UciController::onEval); QObject::connect(this,&UciController::newCommand,this->worker,&UciWorker::addCommand); QObject::connect(this,&UciController::newFen,this->worker,&UciWorker::updateFen); } void UciController::onError(QString error) { std::cerr << error.toStdString() << std::endl; } void UciController::onBestmove(QString uci_move) { emit(bestmove(uci_move)); } void UciController::onInfo(QString engine_info) { emit(updateInfo(engine_info)); } void UciController::onBestPv(QString pvs) { emit(bestPv(pvs)); } void UciController::onMateDetected(int mateIn) { emit(mateDetected(mateIn)); } void UciController::onEval(float ev) { emit(eval(ev)); } void UciController::stopEngine() { emit(newCommand(QString("quit"))); } void UciController::startEngine(const QString &path) { emit(newCommand(QString("start_engine?").append(path))); } void UciController::uciNewgame() { emit(newCommand(QString("ucinewgame"))); } void UciController::uciSendCommand(const QString &command) { emit(newCommand(command)); } void UciController::uciSendPosition(const QString &position) { emit(newCommand(position)); } void UciController::uciOk() { emit(newCommand(QString("uci"))); } void UciController::uciMultiPV(int lines) { QString lns = QString::number(lines); emit(newCommand(QString("setoption name MultiPV value ").append(lns))); } void UciController::uciStrength(int level) { QString lvl = QString::number(level); emit(newCommand(QString("setoption name Skill Level value ").append(lvl))); } void UciController::sendEngineOptions(QVector &optList) { for(int i=0;i #include #include #include #include "uci_worker.h" #include "engine_info.h" #include "model/engine_option.h" class UciController : public QObject { Q_OBJECT public: explicit UciController(QObject *parent = 0); void stopEngine(); void startEngine(const QString &path); void uciNewgame(); void uciSendCommand(const QString &command); void uciSendPosition(const QString &position); void uciOk(); void uciStrength(int level); void uciGoMovetime(int milliseconds); void uciGoInfinite(); void uciSendFen(const QString &fen); void sendEngineOptions(QVector &optList); void uciMultiPV(int lines); // todo // void uciSendEngineOptions(); //void resetEngine() private: QThread* thread; UciWorker* worker; QTimer* timer; signals: void newCommand(QString cmd); void newFen(QString fen); void updateInfo(QString engine_info); void bestmove(QString uci_move); void bestPv(QString pvs); void mateDetected(int mateIn); void eval(float eval); public slots: void onBestmove(QString uci_move); void onInfo(QString engine_info); void onError(QString error); void onBestPv(QString pvs); void onMateDetected(int mateIn); void onEval(float eval); }; #endif // UCI_CONTROLLER_H jerry-3.2.0/src/uci/engine_info.cpp0000664000175000017500000001767713514421177015751 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "engine_info.h" #include "chess/board.h" #include "chess/move.h" #include #include EngineInfo::EngineInfo() { this->id = QString(""); this->strength = -1; this->current_fullmove_no = 0; // this stores currmovenumber from uci output, _NOT_ fullmovenr. from game this->fullmove_no = 1; this->halfmoves = 0; this->current_move = QString(""); this->nps = 0; this->seldepth = -1; this->depth = -1; this->pv = QString(""); this->flip_eval = false; this->pv_list = QStringList(); for(int i=0;ipv_san[i] = QString(""); this->score[i] = 0.0; this->mate[i] = 0; this->seesMate[i] = false; } this->turn = chess::WHITE; this->fen = QString(""); this->nrPvLines = 1; } void EngineInfo::update(QString engine_feedback, QString fen) { int multi_pv = 0; // update turn if(!fen.isEmpty()) { try{ chess::Board b = chess::Board(fen); this->turn = b.turn; this->fen = fen; this->halfmoves = b.halfmove_clock; this->fullmove_no = b.fullmove_number; } catch(std::logic_error e) { std::cerr << e.what() << std::endl; } } QStringList lines = engine_feedback.split("\n"); for(int i=0;iturn == chess::BLACK) { this->score[multi_pv] = -score; } else { this->score[multi_pv] = score; } this->seesMate[multi_pv] = false; } QRegularExpressionMatch m_nps = NPS.match(line); if(m_nps.hasMatch()) { int len = m_nps.capturedLength(0); this->nps = m_nps.captured(0).mid(4,len-1).toInt(); } QRegularExpressionMatch m_seldepth = SELDEPTH.match(line); if(m_seldepth.hasMatch()) { int len = m_seldepth.capturedLength(0); this->seldepth = m_seldepth.captured(0).mid(9,len-1).toInt(); } QRegularExpressionMatch m_depth = DEPTH.match(line); if(m_depth.hasMatch()) { int len = m_depth.capturedLength(0); this->depth = m_depth.captured(0).mid(6,len-1).toInt(); } QRegularExpressionMatch m_mate = MATE.match(line); if(m_mate.hasMatch()) { int len = m_mate.capturedLength(0); this->mate[multi_pv] = abs(m_mate.captured(0).mid(11,len-1).toInt()); this->seesMate[multi_pv] = true; } QRegularExpressionMatch m_currmove_no = CURRMOVENUMBER.match(line); if(m_currmove_no.hasMatch()) { int len = m_currmove_no.capturedLength(0); this->current_fullmove_no = m_currmove_no.captured(0).mid(15,len).toInt(); } QRegularExpressionMatch m_currmove = CURRMOVE.match(line); if(m_currmove.hasMatch()) { int len = m_currmove.capturedLength(0); this->current_move = m_currmove.captured(0).mid(9,len-1); } QRegularExpressionMatch m_pv = PV.match(line); if(m_pv.hasMatch()) { int len = m_pv.capturedLength(0); QString moves = m_pv.captured(0).mid(3,len-1); this->pv = moves; this->pv_list = moves.split(" "); this->updateSan(multi_pv); } QRegularExpressionMatch m_id = IDNAME.match(line); if(m_id.hasMatch()) { int len = m_id.capturedLength(0); this->id = m_id.captured(0).mid(8,len-1).split("\n").at(0); } } } // update san for current pv & fen string void EngineInfo::updateSan(int multiPvIndex) { //qDebug() << "update san start"; if(this->pv_list.count()!=0 && !this->fen.isEmpty()) { this->pv_san[multiPvIndex] = QString(""); chess::Board b = chess::Board(this->fen); bool whiteMoves = true; int moveNo = this->fullmove_no; if(this->turn == chess::BLACK) { whiteMoves = false; this->pv_san[multiPvIndex].append(QString::number(moveNo).append(". ...")); } for(int i=0;ipv_list.count();i++) { QString uci = this->pv_list.at(i); chess::Move mi = chess::Move(uci); QString san = b.san(mi); if(whiteMoves) { this->pv_san[multiPvIndex].append(" ").append(QString::number(moveNo)).append(". ").append(san); } else { this->pv_san[multiPvIndex].append(" ").append(san); moveNo++; } whiteMoves = !whiteMoves; b.apply(mi); } } } QString EngineInfo::toString() { QString outstr = QString(""); outstr.append(""); } else { outstr.append(" (Level ").append(QString::number(this->strength)); } } else { outstr.append(this->id); } } outstr.append(""); outstr.append(""); outstr.append(""); // newline outstr.append(""); for(int i=0;i<4;i++) { outstr.append(""); } outstr.append("
"); if(!this->id.isEmpty()) { if(this->strength >= 0) { outstr.append(this->id); if(this->id.contains("Stockfish") && this->strength == 20) { outstr.append(" (Level MAX)"); if(!this->current_move.isEmpty()) { outstr.append(this->current_move); outstr.append(" (depth ").append(QString::number(this->depth)).append(" / ").append(QString::number(this->seldepth)).append(" )"); } outstr.append(""); if(this->nps != 0) { outstr.append(QString::number(this->nps/1000)).append(" kn/s"); } outstr.append("
"); if(inrPvLines) { if(this->seesMate[i]) { outstr.append("(#").append(QString::number(this->mate[i])).append(") "); } else { //if(this->score != 0.0) { outstr.append("(").append(QString::number(this->score[i],'f',2)).append(") "); } if(!this->pv_san[i].isEmpty()) { //if(!this->seesMate) { outstr.append(this->pv_san[i]); //} } } outstr.append("
"); return outstr; } jerry-3.2.0/src/uci/engine_info.h0000664000175000017500000000560113514421177015376 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ENGINE_INFO_H #define ENGINE_INFO_H #include #include #include const QRegularExpression READYOK = QRegularExpression("readyok"); const QRegularExpression SCORECP = QRegularExpression("score\\scp\\s-{0,1}(\\d)+"); const QRegularExpression NPS = QRegularExpression("nps\\s(\\d)+"); const QRegularExpression SELDEPTH = QRegularExpression("seldepth\\s(\\d)+"); const QRegularExpression DEPTH = QRegularExpression("depth\\s(\\d)+"); const QRegularExpression MATE = QRegularExpression("score\\smate\\s-{0,1}(\\d)+"); const QRegularExpression CURRMOVENUMBER = QRegularExpression("currmovenumber\\s(\\d)+"); const QRegularExpression CURRMOVE = QRegularExpression("currmove\\s[a-z]\\d[a-z]\\d[a-z]{0,1}"); const QRegularExpression BESTMOVE = QRegularExpression("bestmove\\s[a-z]\\d[a-z]\\d[a-z]{0,1}"); const QRegularExpression PV = QRegularExpression("pv(\\s[a-z]\\d[a-z]\\d[a-z]{0,1})+"); const QRegularExpression POS = QRegularExpression("position\\s"); const QRegularExpression IDNAME = QRegularExpression("id\\sname ([^\n]+)"); const QRegularExpression MOVE = QRegularExpression("\\s[a-z]\\d[a-z]\\d([a-z]{0,1})\\s"); const QRegularExpression MOVES = QRegularExpression("\\s[a-z]\\d[a-z]\\d([a-z]{0,1})"); const QRegularExpression MULTIPV = QRegularExpression("multipv\\s(\\d)+"); const int MAX_MULTIPV = 4; class EngineInfo { public: QString id; float score[MAX_MULTIPV]; int strength; int mate[MAX_MULTIPV]; int seldepth; int depth; int current_fullmove_no; int fullmove_no; int halfmoves; int nrPvLines; bool seesMate[MAX_MULTIPV]; QString current_move; int nps; QString pv; bool flip_eval; QStringList pv_list; QString pv_san[MAX_MULTIPV]; bool turn; QString fen; EngineInfo(); void update(QString engine_feedback, QString fen); QString toString(); private: void updateSan(int multiPvIndex); }; #endif // ENGINE_INFO_H jerry-3.2.0/src/uci/uci_worker.h0000664000175000017500000000361613514421177015273 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef UCI_WORKER_H #define UCI_WORKER_H #include #include #include #include #include #include "uci_worker.h" #include "engine_info.h" const QRegularExpression REG_MOVES = QRegularExpression("\\s[a-z]\\d[a-z]\\d([a-z]{0,1})"); const QRegularExpression REG_BESTMOVE = QRegularExpression("bestmove\\s([a-z]\\d[a-z]\\d[a-z]{0,1})"); const QRegularExpression REG_STRENGTH = QRegularExpression("Skill Level value \\d+"); class UciWorker : public QObject { Q_OBJECT public: explicit UciWorker(QObject *parent = 0); QProcess* process; QQueue* cmd_queue; EngineInfo* engine_info; bool go_infinite; QString current_fen; private: signals: void bestmove(QString uci_move); void info(QString engine_info); void error(QString error); void bestPv(QString pvs); void mateDetected(int mateIn); void eval(float eval); public slots: void processCommands(); void addCommand(const QString cmd); void updateFen(const QString fen); }; #endif // UCI_WORKER_H jerry-3.2.0/src/dialogs/0000775000175000017500000000000013514421177013605 5ustar useruserjerry-3.2.0/src/dialogs/dialog_search.h0000664000175000017500000000122713514421177016544 0ustar useruser#ifndef DIALOG_SEARCH_H #define DIALOG_SEARCH_H #include #include #include "model/game_model.h" #include "model/search_pattern.h" #include "dialogs/tab_header_search.h" class DialogSearch : public QDialog { Q_OBJECT public: explicit DialogSearch(GameModel *gameModel, QWidget *parent = nullptr); SearchPattern getPattern(); void setPattern(SearchPattern &sp); private: TabHeaderSearch* ths; QCheckBox *optGameData; //QCheckBox *optComments; //QCheckBox *optPosition; //QCheckBox *optVariants; protected: void resizeEvent(QResizeEvent *re); signals: public slots: }; #endif // DIALOG_SEARCH_H jerry-3.2.0/src/dialogs/dialog_enterposition.cpp0000664000175000017500000001501413514421177020533 0ustar useruser#include "dialog_enterposition.h" #include #include #include #include #include #include #include #include #include DialogEnterPosition::DialogEnterPosition(const chess::Board &board, const ColorStyle &style, QWidget *parent) : QDialog(parent) { this->setWindowTitle(tr("Enter Position")); this->sbv = new EnterPosBoard(style, board, parent); this->cbWhiteShort = new QCheckBox(tr("White O-O")); this->cbWhiteLong = new QCheckBox(tr("White O-O-O")); this->cbBlackShort = new QCheckBox(tr("Black O-O")); this->cbBlackLong = new QCheckBox(tr("Black O-O-O")); QGroupBox *grpBox_castle = new QGroupBox(tr("Castling Rights")); QVBoxLayout *vbox_castle = new QVBoxLayout(); vbox_castle->addWidget(this->cbWhiteShort); vbox_castle->addWidget(this->cbWhiteLong); vbox_castle->addWidget(this->cbBlackShort); vbox_castle->addWidget(this->cbBlackLong); vbox_castle->addStretch(1); grpBox_castle->setLayout(vbox_castle); this->rbWhite = new QRadioButton(tr("White To Move")); this->rbBlack = new QRadioButton(tr("Black To Move")); QGroupBox *grpBox_turn = new QGroupBox(tr("Turn")); QVBoxLayout *vbox_radio = new QVBoxLayout(); vbox_radio->addWidget(this->rbWhite); vbox_radio->addWidget(this->rbBlack); vbox_radio->addStretch(1); grpBox_turn->setLayout(vbox_radio); this->buttonInit = new QPushButton(tr("Initial Position")); this->buttonClear = new QPushButton(tr("Clear Board")); this->buttonCurrent = new QPushButton(tr("Current Position")); QVBoxLayout *vbox_config = new QVBoxLayout(); vbox_config->addWidget(grpBox_castle); vbox_config->addWidget(grpBox_turn); vbox_config->addStretch(1); vbox_config->addWidget(this->buttonInit); vbox_config->addWidget(this->buttonClear); vbox_config->addWidget(this->buttonCurrent); QHBoxLayout *hbox = new QHBoxLayout(); hbox->addWidget(this->sbv); hbox->addLayout(vbox_config); QVBoxLayout *vbox = new QVBoxLayout(); vbox->addLayout(hbox); this->buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel); vbox->addWidget(this->buttonBox); this->setLayout(vbox); connect(this->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(this->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(this->buttonInit, &QPushButton::clicked, this, &DialogEnterPosition::setToInitialPosition); connect(this->buttonClear, &QPushButton::clicked, this, &DialogEnterPosition::clearBoard); connect(this->buttonCurrent, &QPushButton::clicked, this, &DialogEnterPosition::setToCurrentBoard); connect(this->sbv, &EnterPosBoard::squareChanged, this, &DialogEnterPosition::checkConsistency); connect(this->cbBlackLong, &QCheckBox::toggled, this, &DialogEnterPosition::setCastlingRights); connect(this->cbBlackShort, &QCheckBox::toggled, this, &DialogEnterPosition::setCastlingRights); connect(this->cbWhiteLong, &QCheckBox::toggled, this, &DialogEnterPosition::setCastlingRights); connect(this->cbWhiteShort, &QCheckBox::toggled, this, &DialogEnterPosition::setCastlingRights); connect(this->rbWhite, &QRadioButton::toggled, this, &DialogEnterPosition::setTurn); connect(this->rbBlack, &QRadioButton::toggled, this, &DialogEnterPosition::setTurn); this->rbWhite->toggle(); this->setTurn(); this->resizeTo(0.6); /* self.connect(self.buttonBox, SIGNAL("accepted()"), self, SLOT("accept()")) self.connect(self.buttonBox, SIGNAL("rejected()"), self, SLOT("reject()")) self.cbWhiteShort.toggled.connect(self.set_castling_rights) self.cbWhiteLong.toggled.connect(self.set_castling_rights) self.cbBlackShort.toggled.connect(self.set_castling_rights) self.cbBlackLong.toggled.connect(self.set_castling_rights) self.rbWhite.toggle() self.rbWhite.toggled.connect(self.set_turn) self.rbBlack.toggled.connect(self.set_turn) self.buttonInit.clicked.connect(self.initial_position) self.buttonClear.clicked.connect(self.clear_board) self.buttonCurrent.clicked.connect(self.set_current) # reset who's current turn it is and the current # castling rights of the position self.set_castling_rights() self.set_turn() */ } void DialogEnterPosition::resizeTo(float ratio) { int height = 0; int width = 0; if(this->parentWidget() != 0) { int w_height = this->parentWidget()->size().height(); height = w_height * ratio; width = height * 1.42; QSize newSize( width, height ); this->resize(newSize); QRect parentRect = parentWidget()->geometry(); this->move((parentRect.x() + ((parentRect.width()-width )/2.0) ), (parentRect.y() + ((parentRect.height()-width )/2.0))); } else { QDesktopWidget *desktop = qApp->desktop(); QSize availableSize = desktop->availableGeometry().size(); int w_height = availableSize.height(); height = w_height * (ratio*0.6); //width = w_width * (ratio*0.6); width = height * 1.1; QSize newSize( width, height ); this->resize(newSize); } } void DialogEnterPosition::checkConsistency() { if(this->sbv->getCurrentBoard().is_consistent()) { this->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); } else { this->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); } } void DialogEnterPosition::setToInitialPosition() { this->sbv->setToInitialPosition(); this->setCastlingRights(); this->checkConsistency(); } void DialogEnterPosition::clearBoard() { this->sbv->clearBoard(); this->setCastlingRights(); this->checkConsistency(); } void DialogEnterPosition::setToCurrentBoard() { this->sbv->setToCurrentBoard(); this->setCastlingRights(); this->checkConsistency(); } void DialogEnterPosition::setTurn() { this->sbv->setTurn(this->rbWhite->isChecked()); this->checkConsistency(); } void DialogEnterPosition::setCastlingRights() { this->sbv->setCastlingRights( this->cbWhiteShort->isChecked(), this->cbWhiteLong->isChecked(), this->cbBlackShort->isChecked(), this->cbBlackLong->isChecked() ); this->checkConsistency(); } chess::Board DialogEnterPosition::getCurrentBoard() { return std::move(sbv->getCurrentBoard()); } jerry-3.2.0/src/dialogs/tab_header_search.cpp0000664000175000017500000001514113514421177017716 0ustar useruser#include "tab_header_search.h" #include #include #include #include #include #include #include #include TabHeaderSearch::TabHeaderSearch(QWidget *parent) : QWidget(parent) { QFontMetrics f = this->fontMetrics(); int len_name = f.width(this->tr("abcdefghjlmnopqrstuvw")); int len_vertical_space = f.height(); int len_year = f.width("2222")*2; int len_eco = f.width("EEEE")*2; int len_space = f.width(" "); QLabel *lblWhiteName = new QLabel(tr("White:"), this); this->whiteName = new QLineEdit(this); lblWhiteName->setBuddy(whiteName); whiteName->setFixedWidth(len_name); QLabel *lblBlackName = new QLabel(tr("Black:"), this); this->blackName = new QLineEdit(this); lblBlackName->setBuddy(blackName); blackName->setFixedWidth(len_name); this->cbIgnoreColors = new QCheckBox(tr("Ignore Colors"), this); QFormLayout *layoutNames = new QFormLayout(); layoutNames->addRow(lblWhiteName, whiteName); layoutNames->addRow(lblBlackName, blackName); layoutNames->addRow(new QLabel(""), cbIgnoreColors); QFormLayout *layoutNameSite = new QFormLayout(); QLabel *lblEvent = new QLabel(tr("Event:"), this); this->event = new QLineEdit(this); lblEvent->setBuddy(event); event->setFixedWidth(len_name); QLabel *lblSite = new QLabel(tr("Site:")); this->site = new QLineEdit(this); lblSite->setBuddy(site); site->setFixedWidth(len_name); layoutNameSite->addRow(lblEvent, event); layoutNameSite->addRow(lblSite, site); this->cbYear = new QCheckBox(tr("Year:"), this); this->cbEco = new QCheckBox("ECO:", this); this->minYear = new QSpinBox(this); this->maxYear = new QSpinBox(this); this->startEco = new QLineEdit(this); this->stopEco = new QLineEdit(this); minYear->setFixedWidth(len_year); maxYear->setFixedWidth(len_year); minYear->setRange(0,2200); maxYear->setRange(0,2200); startEco->setFixedWidth(len_eco); stopEco->setFixedWidth(len_eco); QGridLayout *layoutYearEcoMoves = new QGridLayout(); layoutYearEcoMoves->addWidget(cbYear, 0, 0); layoutYearEcoMoves->addWidget(minYear, 0, 1); layoutYearEcoMoves->addWidget(new QLabel("-", this), 0, 2); layoutYearEcoMoves->addWidget(maxYear, 0, 3); layoutYearEcoMoves->setColumnStretch(4, 3); minYear->setAlignment(Qt::AlignLeft); maxYear->setAlignment(Qt::AlignLeft); layoutYearEcoMoves->addWidget(cbEco, 1, 0); layoutYearEcoMoves->addWidget(startEco, 1, 1); layoutYearEcoMoves->addWidget(new QLabel("-", this), 1, 2); layoutYearEcoMoves->addWidget(stopEco, 1, 3); QGroupBox *gbElo = new QGroupBox("Elo", this); this->minElo = new QSpinBox(this); this->maxElo = new QSpinBox(this); minElo->setFixedWidth(len_year); maxElo->setFixedWidth(len_year); minElo->setRange(1,3000); maxElo->setRange(1,3000); minElo->setAlignment(Qt::AlignLeft); maxElo->setAlignment(Qt::AlignLeft); QButtonGroup *eloButtons = new QButtonGroup(this); this->btnIgnoreElo = new QRadioButton(tr("Ignore"), this); this->btnBothElo = new QRadioButton(tr("Both"), this); this->btnOneElo = new QRadioButton(tr("One"), this); this->btnAverageElo = new QRadioButton("Average", this); this->btnIgnoreElo->setChecked(true); eloButtons->addButton(btnIgnoreElo); eloButtons->addButton(btnBothElo); eloButtons->addButton(btnOneElo); eloButtons->addButton(btnAverageElo); QGridLayout *layoutElo = new QGridLayout(); layoutElo->addWidget(minElo, 0, 0); layoutElo->addWidget(new QLabel("-", this), 0, 1); layoutElo->addWidget(maxElo, 0, 2); layoutElo->addWidget(btnIgnoreElo, 1, 0); layoutElo->addWidget(btnOneElo, 1, 2); layoutElo->addWidget(btnBothElo, 2, 0); layoutElo->addWidget(btnAverageElo, 2, 2); gbElo->setLayout(layoutElo); QGroupBox *gbResult = new QGroupBox(tr("Result"), this); QButtonGroup *resultButtons = new QButtonGroup(this); resultButtons->setExclusive(false); this->btnWhiteWins = new QCheckBox("1-0", this); this->btnBlackWins = new QCheckBox("0-1", this); this->btnUndecided = new QCheckBox("*", this); this->btnDraw = new QCheckBox("1/2-1/2", this); resultButtons->addButton(btnWhiteWins); resultButtons->addButton(btnBlackWins); resultButtons->addButton(btnDraw); resultButtons->addButton(btnUndecided); QGridLayout *layoutResult = new QGridLayout(this); layoutResult->addWidget(btnWhiteWins, 0, 0); layoutResult->addWidget(btnBlackWins, 0, 1); layoutResult->addWidget(btnDraw, 1, 1); layoutResult->addWidget(btnUndecided, 1, 0); gbResult->setLayout(layoutResult); this->btnReset = new QPushButton(tr("Reset"), this); QVBoxLayout *layoutLeft = new QVBoxLayout(); QVBoxLayout *layoutRight = new QVBoxLayout(); QHBoxLayout *layoutLeftRight = new QHBoxLayout(); layoutLeft->addLayout(layoutNames); layoutLeft->addSpacing(len_vertical_space); layoutLeft->addLayout(layoutNameSite); layoutLeft->addSpacing(len_vertical_space); layoutLeft->addLayout(layoutYearEcoMoves); layoutRight->addWidget(gbElo); layoutRight->addSpacing(len_vertical_space); layoutRight->addWidget(gbResult); layoutRight->addStretch(10); layoutLeftRight->addLayout(layoutLeft); layoutLeftRight->addSpacing(len_space); layoutLeftRight->addLayout(layoutRight); QHBoxLayout *layoutResetButton = new QHBoxLayout(); layoutResetButton->addStretch(10); layoutResetButton->addWidget(btnReset); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->addLayout(layoutLeftRight); mainLayout->addLayout(layoutResetButton); connect(this->btnReset, &QPushButton::pressed, this, &TabHeaderSearch::onReset); this->setLayout(mainLayout); } void TabHeaderSearch::onReset() { this->whiteName->setText(""); this->blackName->setText(""); this->cbIgnoreColors->setChecked(false); this->event->setText(""); this->site->setText(""); this->cbYear->setChecked(false); this->cbEco->setChecked(false); this->minYear->setValue(500); this->maxYear->setValue(2200); this->startEco->setText("A00"); this->stopEco->setText("E99"); this->minElo->setValue(1000); this->maxElo->setValue(3000); this->btnIgnoreElo->setChecked(true); this->btnAverageElo->setChecked(false); this->btnBothElo->setChecked(false); this->btnOneElo->setChecked(false); this->btnUndecided->setChecked(false); this->btnWhiteWins->setChecked(false); this->btnBlackWins->setChecked(false); this->btnDraw->setChecked(false); } jerry-3.2.0/src/dialogs/dialog_guioptions.cpp0000664000175000017500000000406313514421177020033 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "dialog_guioptions.h" #include "viewController/colorstyle.h" #include #include #include #include #include #include #include "various/resource_finder.h" DialogGuiOptions::DialogGuiOptions(ColorStyle *currentStyle, FontStyle *fontStyle, QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Set Options")); this->tbs = new TabBoardStyle(currentStyle, this); this->tfs = new TabFontStyle(fontStyle, this); //this->tcs = new TabCommentSearch(this); //this->tsp = new TabSearchPos(gameModel, this); QTabWidget *tabWidget = new QTabWidget; tabWidget->addTab(tbs, tr("Board Style")); tabWidget->addTab(tfs, tr("Font Size")); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel); connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogGuiOptions::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogGuiOptions::reject); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); mainLayout->addWidget(buttonBox); setLayout(mainLayout); int h = parent->height(); this->resize(h*0.7, 1); } jerry-3.2.0/src/dialogs/dialog_editheaders.cpp0000664000175000017500000000536513514421177020122 0ustar useruser#include "dialog_editheaders.h" #include #include #include #include DialogEditHeaders::DialogEditHeaders(chess::Game &g, QWidget *parent) : QDialog(parent) { leEvent = new QLineEdit(this); leSite = new QLineEdit(this); leDate = new QLineEdit(this); leRound = new QLineEdit(this); leWhite = new QLineEdit(this); leBlack = new QLineEdit(this); leECO = new QLineEdit(this); rbWhiteWins = new QRadioButton("1-0", this); rbBlackWins = new QRadioButton("0-1", this); rbDraw = new QRadioButton("1/2 - 1/2", this); rbUndefined = new QRadioButton("*", this); lblSite = new QLabel("Site", this); lblDate = new QLabel("Date", this); lblRound = new QLabel("Round", this); lblEvent = new QLabel("Event", this); lblWhite = new QLabel("White", this); lblBlack = new QLabel("Black", this); lblEco = new QLabel("Eco", this); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel, this); connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogEditHeaders::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogEditHeaders::reject); QFormLayout *formLayout = new QFormLayout; formLayout->addRow(lblSite, leSite); formLayout->addRow(lblDate, leDate); formLayout->addRow(lblRound, leRound); formLayout->addRow(lblEvent, leEvent); formLayout->addRow(lblWhite, leWhite); formLayout->addRow(lblBlack, leBlack); formLayout->addRow(lblEco, leECO); QGroupBox *grbData = new QGroupBox(tr("Game Data"), this); QGroupBox *grbRes = new QGroupBox(tr("Result"), this); grbData->setLayout(formLayout); QHBoxLayout *hbox = new QHBoxLayout(); hbox->addWidget(rbWhiteWins); hbox->addWidget(rbBlackWins); hbox->addWidget(rbDraw); hbox->addWidget(rbUndefined); grbRes->setLayout(hbox); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(grbData); layout->addWidget(grbRes); layout->addWidget(buttonBox); leDate->setText(g.getHeader("Date")); leSite->setText(g.getHeader("Site")); leRound->setText(g.getHeader("Round")); leEvent->setText(g.getHeader("Event")); leWhite->setText(g.getHeader("White")); leBlack->setText(g.getHeader("Black")); leECO->setText(g.getHeader("ECO")); rbWhiteWins->setChecked(true); QString res = g.getHeader("Result"); if(!res.isEmpty()) { if(res == QString("0-1")) { rbBlackWins->setChecked(true); } if(res == QString("1/2-1/2")) { rbDraw->setChecked(true); } if(res == QString("*")) { rbUndefined->setChecked(true); } } setLayout(layout); this->leSite->setFocus(); } jerry-3.2.0/src/dialogs/dialog_enterposition.h0000664000175000017500000000225513514421177020203 0ustar useruser#ifndef DIALOG_ENTERPOSITION_H #define DIALOG_ENTERPOSITION_H #include #include "chess/board.h" #include "viewController/colorstyle.h" #include "viewController/piece_images.h" #include "viewController/enterposboard.h" #include #include #include #include class DialogEnterPosition : public QDialog { Q_OBJECT public: explicit DialogEnterPosition(const chess::Board &board, const ColorStyle &style, QWidget *parent = 0); chess::Board getCurrentBoard(); private: void resizeTo(float ratio); //SimpleBoardView *sbv; EnterPosBoard *sbv; QCheckBox *cbWhiteShort; QCheckBox *cbWhiteLong; QCheckBox *cbBlackShort; QCheckBox *cbBlackLong; QRadioButton *rbWhite; QRadioButton *rbBlack; QPushButton *buttonInit; QPushButton *buttonClear; QPushButton *buttonCurrent; QDialogButtonBox *buttonBox; protected: signals: public slots: void setToInitialPosition(); void clearBoard(); void setToCurrentBoard(); void checkConsistency(); void setCastlingRights(); void setTurn(); }; #endif // DIALOG_ENTERPOSITION_H jerry-3.2.0/src/dialogs/dialog_newgame.cpp0000664000175000017500000002141613514421177017257 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "dialog_newgame.h" DialogNewGame::DialogNewGame(bool customEngine, int currentStrength, int currentThinkTime, QWidget *parent) : QDialog(parent) { this->customEngine = customEngine; this->setWindowTitle(this->tr("New Game")); this->rbEntersMoves = new QRadioButton(this->tr("Just Enter Moves")); this->rbPlaysComputer = new QRadioButton(this->tr("Computer")); this->rbEntersMoves->setChecked(true); QLabel* lblChooseEnemy = new QLabel(this->tr("Select Enemy:")); QButtonGroup *btnGroupEnemy = new QButtonGroup(this); btnGroupEnemy->addButton(this->rbEntersMoves); btnGroupEnemy->addButton(this->rbPlaysComputer); lblChooseEnemy->setAlignment(Qt::AlignBottom); QHBoxLayout *hboxEnemy = new QHBoxLayout(); hboxEnemy->addWidget(this->rbEntersMoves); hboxEnemy->addWidget(this->rbPlaysComputer); hboxEnemy->setAlignment(Qt::AlignLeft); this->rbPlaysWhite = new QRadioButton(this->tr("White")); this->rbPlaysBlack = new QRadioButton(this->tr("Black")); this->rbPlaysWhite->setChecked(true); QLabel* lblChooseSide = new QLabel(this->tr("Choose your side:")); QButtonGroup *btnGroupSide = new QButtonGroup(this); btnGroupSide->addButton(this->rbPlaysWhite); btnGroupSide->addButton(this->rbPlaysBlack); lblChooseSide->setAlignment(Qt::AlignBottom); QHBoxLayout *hboxSide = new QHBoxLayout(); hboxSide->addWidget(this->rbPlaysWhite); hboxSide->addWidget(this->rbPlaysBlack); hboxSide->setAlignment(Qt::AlignLeft); QLabel* lblStrength = new QLabel(this->tr("Computer Strength (internal engine only)")); lblStrength->setAlignment(Qt::AlignBottom); this->lblStrengthValue = new QLabel(tr("Level ").append(QString::number(currentStrength))); QHBoxLayout *hboxSliderStrength = new QHBoxLayout(); this->sliderStrength = new QSlider(Qt::Horizontal, this); this->sliderStrength->setRange(0,20); this->sliderStrength->setPageStep(1); this->sliderStrength->setValue(currentStrength); hboxSliderStrength->addWidget(this->sliderStrength); hboxSliderStrength->addWidget(this->lblStrengthValue); QLabel *lblThink = new QLabel(this->tr("Computer's Time per Move")); lblThink->setAlignment(Qt::AlignBottom); this->lblThinkTime = new QLabel(QString::number(currentThinkTime).append(" ").append(tr("sec(s)"))); QFontMetrics f = this->fontMetrics(); int l = f.width(this->tr("20 sec(s)")); this->lblThinkTime->setFixedWidth(l); QHBoxLayout* hboxSliderThink = new QHBoxLayout(); this->sliderThinkTime = new QSlider(Qt::Horizontal, this); this->sliderThinkTime->setRange(1,7); // 1, 2, 3, 5, 10, 15, 30 this->sliderThinkTime->setPageStep(1); this->sliderThinkTime->setValue(this->thinkTimeToIntervalVal(currentThinkTime)); hboxSliderThink->addWidget(this->sliderThinkTime); hboxSliderThink->addWidget(this->lblThinkTime); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(lblChooseEnemy); layout->addLayout(hboxEnemy); layout->addSpacing(20); layout->addWidget(lblChooseSide); layout->addLayout(hboxSide); layout->addSpacing(20); layout->addWidget(lblStrength); layout->addLayout(hboxSliderStrength); layout->addSpacing(20); layout->addWidget(lblThink); layout->addLayout(hboxSliderThink); layout->addSpacing(20); layout->addWidget(buttonBox); this->setLayout(layout); this->computerStrength = currentStrength; this->computerThinkTime = currentThinkTime; int widgetWidthEstimate = f.width(this->tr("Computer's Time per Move")) * 2; this->resize(widgetWidthEstimate, this->height()); if(customEngine) { this->sliderStrength->setValue(20); this->lblStrengthValue->setText(tr("Max")); } this->sliderStrength->setEnabled(false); this->sliderThinkTime->setEnabled(false); connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogNewGame::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogNewGame::reject); connect(rbPlaysComputer, &QRadioButton::toggled, this, &DialogNewGame::rbPlaysComputerToggled); connect(rbEntersMoves, &QRadioButton::toggled, this, &DialogNewGame::rbEntersMovesToggled); connect(rbPlaysWhite, &QRadioButton::toggled, this, &DialogNewGame::rbPlaysWhiteToggled); connect(rbPlaysBlack, &QRadioButton::toggled, this, &DialogNewGame::rbPlaysBlackToggled); connect(sliderStrength, &QSlider::valueChanged, this, &DialogNewGame::sliderStrengthChanged); connect(sliderThinkTime, &QSlider::valueChanged, this, &DialogNewGame::sliderThinkTimeChanged); this->playsWhite = true; this->playsComputer = false; /* if(gamestate): think_time = gamestate.computer_think_time // 1000 if(think_time == 30): think_time = 7 elif(think_time == 15): think_time = 6 elif(think_time == 10): think_time = 5 elif(think_time == 5): think_time = 4 strength = gamestate.strength_level self.slider_think.setValue(think_time) self.think_time = think_time self.slider_elo.setValue(strength) self.strength = strength self.set_lbl_elo_value(strength) self.set_lbl_think_value(think_time) # if a custom engine is used, we can't set the # strength level. set the slider to max an deactivate # slider if(user_settings != None and (not user_settings.active_engine == user_settings.engines[0])): self.slider_elo.setValue(20) self.set_lbl_elo_value(20) self.slider_elo.setEnabled(False) */ /* self.slider_elo.valueChanged.connect(self.set_lbl_elo_value) self.slider_think.valueChanged.connect(self.set_lbl_think_value) self.connect(buttonBox, SIGNAL("accepted()"),self, SLOT("accept()")) self.connect(buttonBox, SIGNAL("rejected()"),self, SLOT("reject()")) self.resize(370, 150) */ } int DialogNewGame::intervalValueToThinkTime(int intervalVal) { assert(intervalVal >= 1 && intervalVal <= 7); if(intervalVal <= 3) { return intervalVal; } else { if(intervalVal == 4) { return 5; } else if(intervalVal == 5) { return 10; } else if(intervalVal == 6) { return 15; } else { return 30; } } } int DialogNewGame::thinkTimeToIntervalVal(int thinkTime) { assert(thinkTime == 1 || thinkTime == 2 || thinkTime == 3 || thinkTime == 5 || thinkTime == 10 || thinkTime == 15 || thinkTime == 30); if(thinkTime <= 3) { return thinkTime; } else { if(thinkTime == 5) { return 4; } else if(thinkTime == 10) { return 5; } else if(thinkTime == 15) { return 6; } else { return 7; } } } void DialogNewGame::rbPlaysComputerToggled() { if(!this->customEngine) { this->sliderStrength->setEnabled(true); } this->sliderThinkTime->setEnabled(true); this->playsComputer = true; } void DialogNewGame::rbEntersMovesToggled() { this->sliderStrength->setEnabled(false); this->sliderThinkTime->setEnabled(false); this->playsComputer = false; } void DialogNewGame::rbPlaysWhiteToggled() { this->playsWhite = true; } void DialogNewGame::rbPlaysBlackToggled() { this->playsWhite = false; } void DialogNewGame::sliderStrengthChanged() { this->computerStrength = this->sliderStrength->value(); this->lblStrengthValue->setText(tr("Level ").append(QString::number(this->computerStrength))); } void DialogNewGame::sliderThinkTimeChanged() { this->computerThinkTime = this->intervalValueToThinkTime(this->sliderThinkTime->value()); this->lblThinkTime->setText(QString::number(this->computerThinkTime).append(" ").append(tr("sec(s)"))); } jerry-3.2.0/src/dialogs/dialog_database.cpp0000664000175000017500000002660213514421177017402 0ustar useruser#include "dialog_database.h" #include #include #include #include #include #include #include #include #include #include "various/resource_finder.h" #include "various/helper.h" #include "viewController/database_index_model.h" #include #include //#include #include #include "various/messagebox.h" #include "dialogs/dialog_database_help.h" #include "dialogs/dialog_search.h" DialogDatabase::DialogDatabase(GameModel *gameModel, QWidget* parent) : QDialog(parent) { this->gameModel = gameModel; this->selectedIndex = -1; this->currentOpenDBType = -1; this->resizeTo(0.9); QToolBar *toolbar = new QToolBar(this); //QSize iconSize = toolbar->iconSize() * this->devicePixelRatio(); //toolbar->setIconSize(iconSize); QAction *tbActionNew = toolbar->addAction(QIcon(":/res/icons/document-new.svg"), this->tr("New")); QAction *tbActionOpen = toolbar->addAction(QIcon(":/res/icons/document-open.svg"), this->tr("Open")); toolbar->addSeparator(); QAction *tbActionSearch = toolbar->addAction(QIcon(":/res/icons/system-search.svg"), this->tr("Search")); QAction *tbActionReset = toolbar->addAction(QIcon(":/res/icons/view-refresh.svg"), this->tr("Reset Search")); toolbar->addSeparator(); QAction *tbActionAddCurrent = toolbar->addAction(QIcon(":/res/icons/text-pencil.svg"), this->tr("Add Current Game")); QWidget* spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); toolbar->addWidget(spacer); QAction *tbActionHelp = toolbar->addAction(QIcon(":/res/icons/help-browser.svg"), this->tr("About")); toolbar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); int rows = 10; int columns = 7; this->gameTable = new QTableWidget(rows, columns); this->gameTable->setEditTriggers(QAbstractItemView::NoEditTriggers); this->gameTable->setSelectionBehavior(QAbstractItemView::SelectRows); this->gameTable->setSelectionMode(QAbstractItemView::SingleSelection); this->gameTableHeaders = new QStringList(); this->gameTableHeaders->append("No."); this->gameTableHeaders->append("White"); this->gameTableHeaders->append("Black"); this->gameTableHeaders->append("Result"); this->gameTableHeaders->append("Date"); this->gameTableHeaders->append("ECO"); this->gameTableHeaders->append("Site"); this->gameTable->verticalHeader()->hide(); this->gameTable->setShowGrid(false); //this->drawAllItems(); //this->gameTable->resizeColumnsToContents();; this->gameTable->horizontalHeader()->setStretchLastSection(true); this->gameTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); this->indexModel = new DatabaseIndexModel(this); this->indexModel->setDatabase(&this->gameModel->database); this->tableView = new QTableView(this); this->tableView->setModel(indexModel); this->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); this->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); this->tableView->setSelectionMode(QAbstractItemView::SingleSelection); this->tableView->verticalHeader()->hide(); //myTableWidget->verticalHeader()->setVisible(false); this->tableView->setShowGrid(false); this->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); this->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); // set index to currently open game // if a game is currently opened int idx = this->gameModel->database.getLastSelectedIndex(); if(idx > 0) { this->tableView->selectRow(idx); //this->selectedIndex = idx; } else { this->tableView->selectRow(0); //this->selectedIndex = 0; } this->onRowChanged(); tableView->setWindowTitle(QObject::tr("Games")); //tableView->resizeColumnsToContents(); //don't resize, instead set to stretch (see above) tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); tableView->show(); QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Horizontal, this); this->btnOpenGame = new QPushButton(this); this->btnCancel = new QPushButton(this); this->btnOpenGame->setText(this->tr("Open Game")); this->btnCancel->setText(this->tr("Cancel")); buttonBox->addButton(btnOpenGame, QDialogButtonBox::AcceptRole); buttonBox->addButton(btnCancel, QDialogButtonBox::RejectRole); // putting it all together QVBoxLayout *layoutAll = new QVBoxLayout(this); layoutAll->addWidget(toolbar); layoutAll->addWidget(this->tableView); //layoutAll->addStretch(); layoutAll->addWidget(buttonBox); this->setLayout(layoutAll); connect(tbActionOpen, &QAction::triggered, this, &DialogDatabase::onClickOpen); connect(tbActionNew, &QAction::triggered, this, &DialogDatabase::onClickNew); connect(tbActionAddCurrent, &QAction::triggered, this, &DialogDatabase::onClickAppend); connect(tbActionHelp, &QAction::triggered, this, &DialogDatabase::showHelp); connect(tbActionSearch, &QAction::triggered, this, &DialogDatabase::onClickSearch); connect(tbActionReset, &QAction::triggered, this, &DialogDatabase::onClickReset); connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); QItemSelectionModel *model = this->tableView->selectionModel(); connect(model, &QItemSelectionModel::selectionChanged, this, &DialogDatabase::onRowChanged); } void DialogDatabase::resizeTo(float ratio) { int height = 0; int width = 0; if(this->parentWidget() != 0) { int w_height = this->parentWidget()->size().height(); height = w_height * ratio; //width = (w_width * ratio); width = height * 1.8; } else { QDesktopWidget *desktop = qApp->desktop(); QSize availableSize = desktop->availableGeometry().size(); int w_height = availableSize.height(); height = w_height * (ratio*0.8); //width = w_width * (ratio*0.6); width = height * 1.8; } QSize newSize( width, height ); this->resize(newSize); } void DialogDatabase::onClickReset() { this->gameModel->database.resetSearch(); this->indexModel->layoutChanged(); } void DialogDatabase::onClickSearch() { DialogSearch dlg(this->gameModel, this); dlg.setPattern(this->gameModel->lastSeenSearchPattern); if(dlg.exec() == QDialog::Accepted) { SearchPattern pattern = dlg.getPattern(); this->gameModel->lastSeenSearchPattern = pattern; //QTime myTimer; //myTimer.start(); // do something.. try { this->gameModel->database.search(pattern); //int nMilliseconds = myTimer.elapsed(); this->gameModel->database.setLastSelectedIndex(0); if(this->gameModel->database.getRowCount() > 0) { this->tableView->selectRow(0); } this->indexModel->layoutChanged(); } catch(std::invalid_argument e) { std::cerr << e.what() << std::endl; } } } void DialogDatabase::showHelp() { DialogDatabaseHelp dlg(this, JERRY_VERSION); dlg.exec(); } void DialogDatabase::onClickNew() { QString filename = QFileDialog::getSaveFileName(this, tr("Create New Database..."), this->gameModel->lastSaveDir, tr("PGN Files (*.pgn)")); if(!filename.isNull()) { QDir dir = QDir::root(); QString path = dir.absoluteFilePath(filename); if(this->gameModel->database.createNew(filename) < 0) { MessageBox msg(this); msg.showMessage(tr("Operation Failed"), tr("Unable to create File: ")+filename); } else { this->setWindowTitle(filename); } } } void DialogDatabase::onClickAppend() { if(this->gameModel->database.isOpen()) { chess::Game *currentGame = this->gameModel->getGame(); if(this->gameModel->database.appendCurrentGame(*currentGame) < 0) { MessageBox msg(this); msg.showMessage(tr("Operation Failed"), tr("Unable append current Game")); } else { // simpley workaround. actually not layout changes // but dataChanged() should be emitted, however // dataChanged() requires to determine the precise index, // and layoutChanged suffices to ensure that the freshly // added game is displayed this->tableView->selectRow(this->gameModel->database.countGames()); this->indexModel->layoutChanged(); } } } void DialogDatabase::onClickOpen() { QString filename = QFileDialog::getOpenFileName(this, QApplication::tr("Open Database"), this->gameModel->lastOpenDir, QApplication::tr("*.pgn")); if(!filename.isNull()) { // todo: mor thoroughly check file type // i.e. look for magic bytes instead of // just relying on filename ending if(filename.endsWith(".pgn")) { //qDebug() << "dialog 1"; this->gameModel->database.setParentWidget(this); //this->gameModel->dciDatabase->reset(); //qDebug() << "dialog 2"; this->gameModel->database.open(filename); //qDebug() << "dialog 3"; this->indexModel->setDatabase(&this->gameModel->database); //qDebug() << "dialog 4"; this->indexModel->layoutChanged(); //qDebug() << "dialog 5"; //this->tableView->resizeColumnsToContents(); if(this->gameModel->database.countGames() > 0) { qDebug() << "database has > 0 games"; this->tableView->selectRow(0); //this->selectedIndex = 0; this->onRowChanged(); } this->gameTable->resizeColumnsToContents();; //this->setWindowTitle(this->gameModel->dciDatabase->getFilename()); //this->currentOpenDBType = DATABASE_TYPE_DCI; //this->tbActionDeleteGame->setDisabled(true); this->setWindowTitle(filename); } } //this->gameModel->database->open(this); this->gameTable->resizeColumnsToContents();; } void DialogDatabase::onClickExport() { /* DialogExportDatabase dlg; if(dlg.exec() == QDialog::Accepted) { qDebug() << "export to PGN " << dlg.radioFormatPgn->isChecked(); QFileDialog dialog; dialog.setFileMode(QFileDialog::AnyFile); QString strFile = dialog.getSaveFileName(this, tr("New Database Filename"),"",tr("PGN Files (*.pgn)")); qDebug() << "saving to: " << strFile; } */ } void DialogDatabase::onRowChanged() { //qDebug() << "row change"; //QTest::qWait(2000); QItemSelectionModel *select = this->tableView->selectionModel(); if(select->hasSelection()) { QModelIndexList selected_rows = select->selectedRows(); if(selected_rows.size() > 0) { int row_index = selected_rows.at(0).row(); this->selectedIndex = row_index; this->gameModel->database.setLastSelectedIndex(this->selectedIndex); } } this->gameTable->resizeColumnsToContents();; } jerry-3.2.0/src/dialogs/tab_font_style.cpp0000664000175000017500000001040513514421177017325 0ustar useruser#include #include #include #include #include #include #include #include "tab_font_style.h" TabFontStyle::TabFontStyle(FontStyle *fontStyle, QWidget *parent) : QWidget(parent) { this->fontStyle = fontStyle; // Game Notation Settings QGroupBox *groupBoxGameNotationFontSize = new QGroupBox(tr("Game Notation Font Size"),this); this->radioGameNotationDefaultSize = new QRadioButton(tr("&System Default Font Size")); this->radioGameNotationcustomSize = new QRadioButton(tr("&Custom Size")); this->sizeBoxGameNotation = new QComboBox(); QStringList fontSizeList = {"8", "10", "12", "14", "16", "20", "24", "36", "48"}; sizeBoxGameNotation->addItems(fontSizeList); QGridLayout *gridGameNotationFontSize = new QGridLayout(); gridGameNotationFontSize->addWidget(radioGameNotationDefaultSize, 0, 0); gridGameNotationFontSize->addWidget(radioGameNotationcustomSize, 1, 0); gridGameNotationFontSize->addWidget(sizeBoxGameNotation, 1, 1); groupBoxGameNotationFontSize->setLayout(gridGameNotationFontSize); groupBoxGameNotationFontSize->setTitle(("Game Notation Font Size")); // Engine Output Settings QGroupBox *groupBoxEngineOutFontSize = new QGroupBox(tr("Game Notation Font Size"),this); this->radioEngineOutDefaultSize = new QRadioButton(tr("&System Default Font Size")); this->radioEngineOutcustomSize = new QRadioButton(tr("&Custom Size")); this->sizeBoxEngineOut = new QComboBox(this); sizeBoxEngineOut->addItems(fontSizeList); QGridLayout *gridEngineOutFontSize = new QGridLayout(); gridEngineOutFontSize->addWidget(radioEngineOutDefaultSize, 0, 0); gridEngineOutFontSize->addWidget(radioEngineOutcustomSize, 1, 0); gridEngineOutFontSize->addWidget(sizeBoxEngineOut, 1, 1); groupBoxEngineOutFontSize->setLayout(gridEngineOutFontSize); groupBoxEngineOutFontSize->setTitle(("Engine Output Font Size")); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->addWidget(groupBoxGameNotationFontSize); mainLayout->addWidget(groupBoxEngineOutFontSize); mainLayout->addStretch(1); this->setLayout(mainLayout); if(fontStyle->moveWindowFontSize.isEmpty()) { radioGameNotationDefaultSize->setChecked(true); } else { radioGameNotationcustomSize->setChecked(true); sizeBoxGameNotation->setCurrentText(fontStyle->moveWindowFontSize); } if(fontStyle->engineOutFontSize.isEmpty()) { radioEngineOutDefaultSize->setChecked(true); } else { radioEngineOutcustomSize->setChecked(true); sizeBoxEngineOut->setCurrentText(fontStyle->engineOutFontSize); } connect(this->radioGameNotationcustomSize, &QRadioButton::toggled, this, &TabFontStyle::onSelectCustomGameNotationFontSize); connect(this->radioGameNotationDefaultSize, &QRadioButton::toggled, this, &TabFontStyle::onSelectDefaultGameNotationFontSize); connect(this->sizeBoxGameNotation, &QComboBox::currentTextChanged, this, &TabFontStyle::onSizeBoxGameNotationChange); connect(this->radioEngineOutcustomSize, &QRadioButton::toggled, this, &TabFontStyle::onSelectCustomEngineOutFontSize); connect(this->radioEngineOutDefaultSize, &QRadioButton::toggled, this, &TabFontStyle::onSelectDefaultEngineOutFontSize); connect(this->sizeBoxEngineOut, &QComboBox::currentTextChanged, this, &TabFontStyle::onSizeBoxEngineOutChange); } void TabFontStyle::onSelectDefaultGameNotationFontSize() { this->fontStyle->moveWindowFontSize = ""; } void TabFontStyle::onSelectCustomGameNotationFontSize() { this->fontStyle->moveWindowFontSize = this->sizeBoxGameNotation->currentText(); } void TabFontStyle::onSizeBoxGameNotationChange(const QString &text) { if(this->radioGameNotationcustomSize->isChecked()) { this->fontStyle->moveWindowFontSize = text; } } void TabFontStyle::onSelectDefaultEngineOutFontSize() { this->fontStyle->engineOutFontSize = ""; } void TabFontStyle::onSelectCustomEngineOutFontSize() { this->fontStyle->engineOutFontSize = this->sizeBoxEngineOut->currentText(); } void TabFontStyle::onSizeBoxEngineOutChange(const QString &text) { if(this->radioEngineOutcustomSize->isChecked()) { this->fontStyle->engineOutFontSize = text; } } jerry-3.2.0/src/dialogs/tab_header_search.h0000664000175000017500000000170413514421177017363 0ustar useruser#ifndef TAB_HEADER_SEARCH_H #define TAB_HEADER_SEARCH_H #include #include #include #include #include #include class TabHeaderSearch : public QWidget { Q_OBJECT public: explicit TabHeaderSearch(QWidget *parent = nullptr); QLineEdit* whiteName; QLineEdit* blackName; QCheckBox *cbIgnoreColors; QLineEdit *event; QLineEdit *site; QCheckBox *cbYear; QCheckBox *cbEco; QSpinBox *minYear; QSpinBox *maxYear; QLineEdit *startEco; QLineEdit *stopEco; QSpinBox *minElo; QSpinBox *maxElo; QRadioButton *btnIgnoreElo; QRadioButton *btnBothElo; QRadioButton *btnOneElo; QRadioButton *btnAverageElo; QCheckBox *btnWhiteWins; QCheckBox *btnBlackWins; QCheckBox *btnUndecided; QCheckBox *btnDraw; QPushButton *btnReset; signals: public slots: void onReset(); }; #endif // TAB_HEADER_SEARCH_H jerry-3.2.0/src/dialogs/dialog_engines.h0000664000175000017500000000312313514421177016724 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIALOG_ENGINES_H #define DIALOG_ENGINES_H #include #include #include #include "model/engine.h" #include "model/game_model.h" class DialogEngines : public QDialog { Q_OBJECT public: explicit DialogEngines(GameModel *gameModel, QWidget *parent = 0); QVector engines; int activeEngineIdx; QString lastAddedEnginePath; QListWidget *lstEngines; private: QPushButton *btnAdd; QPushButton *btnRemove; QPushButton *btnParameters; QPushButton *btnResetParameters; void delay(int ms); signals: public slots: void onAddEngine(); void onRemoveEngine(); void onEditParameters(); void onResetParameters(); void onSelectEngine(); }; #endif // DIALOG_ENGINES_H jerry-3.2.0/src/dialogs/dialog_about.h0000664000175000017500000000211113514421177016402 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIALOG_ABOUT_H #define DIALOG_ABOUT_H #include class DialogAbout : public QDialog { Q_OBJECT public: explicit DialogAbout(QWidget *parent, QString version); signals: public slots: }; #endif // DIALOG_ABOUT_H jerry-3.2.0/src/dialogs/dialog_browseheaders.cpp0000664000175000017500000001722713514421177020476 0ustar useruser#include "dialog_browseheaders.h" #include #include #include #include #include #include #include DialogBrowseHeaders::DialogBrowseHeaders(QList *header_offsets, QString &filename, QWidget *parent) : QDialog(parent), header_offsets(header_offsets) { this->resizeTo(0.95); this->header_offsets = header_offsets; this->setWindowTitle(filename); this->gameOffset = 0; this->gameIdx = 0; int rows = header_offsets->size(); int columns = 7; this->table = new QTableWidget(rows, columns, this); this->table->setEditTriggers(QAbstractItemView::NoEditTriggers); this->table->setSelectionBehavior(QAbstractItemView::SelectRows); this->table->setSelectionMode(QAbstractItemView::SingleSelection); this->tableHeaders = QStringList(); tableHeaders.append("No."); tableHeaders.append("White"); tableHeaders.append("Black"); tableHeaders.append("Result"); tableHeaders.append("Date"); tableHeaders.append("ECO"); tableHeaders.append("Site"); this->table->verticalHeader()->hide(); this->table->setShowGrid(false); this->drawAllItems(); this->table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); this->table->resizeColumnsToContents();; //this->table->horizontalHeader()->setStretchLastSection(true); this->table->selectRow(0); /* f = this->fontMetrics(); rec = QApplication.desktop().screenGeometry() self.resize(min(650,rec.width()-100),min(rows*20+130,rec.height()-200)) */ this->searchField = new QLineEdit(this); this->btnSearch = new QPushButton(tr("Search"), this); this->btnReset = new QPushButton(tr("Reset"), this); QHBoxLayout *hbox_lbl = new QHBoxLayout(); hbox_lbl->addWidget(this->searchField); hbox_lbl->addSpacing(20); //hbox_lbl->addSpacerItem(new QSpacerItem(20, 1)); hbox_lbl->addWidget(this->btnSearch); hbox_lbl->addWidget(this->btnReset); QVBoxLayout *vbox = new QVBoxLayout(); vbox->addLayout(hbox_lbl); vbox->addWidget(this->table); QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Horizontal, this); buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); vbox->addWidget(buttonBox); this->setLayout(vbox); this->searchField->setFocus(); connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogBrowseHeaders::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogBrowseHeaders::reject); //self.connect(buttonBox, SIGNAL("accepted()"),self, SLOT("accept()")) //self.connect(buttonBox, SIGNAL("rejected()"),self, SLOT("reject()")) //self.button_search.clicked.connect(self.on_search) //this->button_reset.clicked.connect(self.draw_all_items) //int dialogWidth = this->table->horizontalHeader()->length() * 1.1; //dialogHeight= tw.verticalHeader().length() + 24 // this->setFixedWidth(dialogWidth); //w.setFixedSize(dialogWidth, dialogHeight) connect(this->table, &QTableWidget::itemSelectionChanged, this, &DialogBrowseHeaders::onItemSelectionChanged); connect(this->btnSearch, &QPushButton::clicked, this, &DialogBrowseHeaders::onSearch); connect(this->btnReset, &QPushButton::clicked, this, &DialogBrowseHeaders::onResetSearch); } void DialogBrowseHeaders::resizeTo(float ratio) { int height = 0; int width = 0; if(this->parentWidget() != 0) { int w_height = this->parentWidget()->size().height(); height = w_height * ratio; //width = (w_width * ratio); width = height * 1.1; } else { QDesktopWidget *desktop = qApp->desktop(); QSize availableSize = desktop->availableGeometry().size(); int w_height = availableSize.height(); height = w_height * (ratio*0.6); //width = w_width * (ratio*0.6); width = height * 1.1; } QSize newSize( width, height ); this->resize(newSize); } void DialogBrowseHeaders::drawAllItems() { this->table->clear(); this->table->setHorizontalHeaderLabels(this->tableHeaders); this->table->setRowCount(this->header_offsets->size()); for(int i=0;iheader_offsets->size();i++) { QString white = this->header_offsets->at(i).headers.value("White"); QString black = this->header_offsets->at(i).headers.value("Black"); QString result = this->header_offsets->at(i).headers.value("Result"); QString date = this->header_offsets->at(i).headers.value("Date"); QString eco = this->header_offsets->at(i).headers.value("ECO"); QString site = this->header_offsets->at(i).headers.value("Site"); this->table->setItem(i,0,new QTableWidgetItem(QString::number(i+1))); this->table->setItem(i,1,new QTableWidgetItem(white)); this->table->setItem(i,2,new QTableWidgetItem(black)); this->table->setItem(i,3,new QTableWidgetItem(result)); this->table->setItem(i,4,new QTableWidgetItem(date)); this->table->setItem(i,5,new QTableWidgetItem(eco)); this->table->setItem(i,6,new QTableWidgetItem(site)); } this->table->resizeColumnsToContents(); } void DialogBrowseHeaders::onResetSearch() { this->drawAllItems(); this->table->selectRow(0); } void DialogBrowseHeaders::onSearch() { this->table->clear(); this->table->clearContents(); QString searchTerm = this->searchField->text().toLower(); QRegularExpression searchRegExp = QRegularExpression(searchTerm); int idx = 0; for(int i=0;iheader_offsets->size();i++) { QString white = this->header_offsets->at(i).headers.value("White"); QString black = this->header_offsets->at(i).headers.value("Black"); QString result = this->header_offsets->at(i).headers.value("Result"); QString date = this->header_offsets->at(i).headers.value("Date"); QString eco = this->header_offsets->at(i).headers.value("ECO"); QString site = this->header_offsets->at(i).headers.value("Site"); QRegularExpressionMatch m_white = searchRegExp.match(white.toLower()); QRegularExpressionMatch m_black = searchRegExp.match(black.toLower()); QRegularExpressionMatch m_result = searchRegExp.match(result); QRegularExpressionMatch m_date = searchRegExp.match(date); QRegularExpressionMatch m_eco = searchRegExp.match(eco.toLower()); QRegularExpressionMatch m_site = searchRegExp.match(site.toLower()); if(m_white.hasMatch() || m_black.hasMatch() || m_result.hasMatch() || m_date.hasMatch() || m_eco.hasMatch() || m_site.hasMatch()) { this->table->setItem(idx,0,new QTableWidgetItem(QString::number(i+1))); this->table->setItem(idx,1,new QTableWidgetItem(white)); this->table->setItem(idx,2,new QTableWidgetItem(black)); this->table->setItem(idx,3,new QTableWidgetItem(result)); this->table->setItem(idx,4,new QTableWidgetItem(date)); this->table->setItem(idx,5,new QTableWidgetItem(eco)); this->table->setItem(idx,6,new QTableWidgetItem(site)); idx++; } } // if nothing contained, then reset to first game if(this->table->rowCount() == 0) { this->gameOffset = 0; this->gameIdx = 0; } this->table->setRowCount(idx); } void DialogBrowseHeaders::onItemSelectionChanged() { QList selectedItems = this->table->selectedItems(); if(selectedItems.size() > 0) { int idx = (selectedItems.at(0)->text()).toInt() - 1; this->gameOffset = this->header_offsets->at(idx).offset; this->gameIdx = idx; } } jerry-3.2.0/src/dialogs/dialog_gameanalysis.h0000664000175000017500000000103213514421177017746 0ustar useruser#ifndef DIALOG_GAMEANALYSIS_H #define DIALOG_GAMEANALYSIS_H #include #include class DialogGameanalysis : public QDialog { Q_OBJECT public: explicit DialogGameanalysis(int secsPerMove, float threshold, QWidget *parent = 0); int secsPerMove; double threshold; QRadioButton* rbAnalyseBoth; QRadioButton* rbAnalyseWhite; QRadioButton* rbAnalyseBlack; signals: public slots: void onSecsChanged(int val); void onThresholdChanged(double val); }; #endif // DIALOG_GAMEANALYSIS_H jerry-3.2.0/src/dialogs/tab_font_style.h0000664000175000017500000000167313514421177017001 0ustar useruser#ifndef TAB_FONT_STYLE_H #define TAB_FONT_STYLE_H #include #include #include #include #include "model/font_style.h" class TabFontStyle : public QWidget { Q_OBJECT public: explicit TabFontStyle(FontStyle *fontStyle, QWidget *parent = nullptr); private: QRadioButton *radioGameNotationDefaultSize; QRadioButton *radioGameNotationcustomSize; QComboBox *sizeBoxGameNotation; QRadioButton *radioEngineOutDefaultSize; QRadioButton *radioEngineOutcustomSize; QComboBox *sizeBoxEngineOut; FontStyle *fontStyle; signals: public slots: void onSelectDefaultGameNotationFontSize(); void onSelectCustomGameNotationFontSize(); void onSizeBoxGameNotationChange(const QString &text); void onSelectDefaultEngineOutFontSize(); void onSelectCustomEngineOutFontSize(); void onSizeBoxEngineOutChange(const QString &text); }; #endif // TAB_FONT_STYLE_H jerry-3.2.0/src/dialogs/dialog_browseheaders.h0000664000175000017500000000150113514421177020127 0ustar useruser#ifndef DIALOG_BROWSERHEADERS_H #define DIALOG_BROWSERHEADERS_H #include #include #include #include #include "chess/pgn_reader.h" class DialogBrowseHeaders : public QDialog { Q_OBJECT public: explicit DialogBrowseHeaders(QList *header_offsets, QString &filename, QWidget *parent); int gameOffset; int gameIdx; QTableWidget *table; private: void resizeTo(float ratio); QList *header_offsets; QStringList tableHeaders; QLineEdit *searchField; QPushButton *btnSearch; QPushButton *btnReset; void drawAllItems(); signals: public slots: void onItemSelectionChanged(); void onSearch(); void onResetSearch(); }; #endif // DIALOG_BROWSERHEADERS_H jerry-3.2.0/src/dialogs/dialog_search.cpp0000664000175000017500000001316713514421177017105 0ustar useruser#include "dialog_search.h" #include "tab_header_search.h" #include #include #include #include #include DialogSearch::DialogSearch(GameModel *gameModel, QWidget *parent) : QDialog(parent) { this->ths = new TabHeaderSearch(this); //this->tcs = new TabCommentSearch(this); //this->tsp = new TabSearchPos(gameModel, this); QTabWidget *tabWidget = new QTabWidget; tabWidget->addTab(ths, tr("Game Data")); //tabWidget->addTab(tcs, tr("Comments")); //tabWidget->addTab(tsp, tr("Position")); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel); connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogSearch::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogSearch::reject); //this->optGameData = new QCheckBox(tr("Game Data")); //this->optComments = new QCheckBox(tr("Comments")); //this->optPosition = new QCheckBox(tr("Position")); //this->optVariants = new QCheckBox(tr("Search in Variations")); //this->optGameData->setChecked(true); //QHBoxLayout *layoutOptions = new QHBoxLayout(); //layoutOptions->addWidget(optGameData); //layoutOptions->addWidget(optComments); //layoutOptions->addWidget(optPosition); //layoutOptions->addWidget(optVariants); //layoutOptions->addStretch(1); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); //mainLayout->addLayout(layoutOptions); mainLayout->addWidget(buttonBox); setLayout(mainLayout); this->setMinimumWidth(this->height()*1.65); setWindowTitle(tr("Search for Games")); } void DialogSearch::resizeEvent(QResizeEvent *) { this->setMinimumWidth(this->height()*1.35); } SearchPattern DialogSearch::getPattern() { SearchPattern sp; // game data search sp.whiteName = this->ths->whiteName->text(); sp.blackName = this->ths->blackName->text(); sp.ignoreNameColor = this->ths->cbIgnoreColors->isChecked(); sp.event = this->ths->event->text(); sp.site = this->ths->site->text(); sp.checkYear = this->ths->cbYear->isChecked(); sp.checkEco = this->ths->cbEco->isChecked(); sp.checkMoves = this->ths->cbEco->isChecked(); sp.year_min = this->ths->minYear->value(); sp.year_max = this->ths->maxYear->value(); sp.ecoStart = this->ths->startEco->text(); sp.ecoStop = this->ths->stopEco->text(); sp.elo_min = this->ths->minElo->value(); sp.elo_max = this->ths->maxElo->value(); if(this->ths->btnAverageElo->isChecked()) { sp.checkElo = SEARCH_AVERAGE_ELO; } if(this->ths->btnIgnoreElo->isChecked()) { sp.checkElo = SEARCH_IGNORE_ELO; } if(this->ths->btnBothElo->isChecked()) { sp.checkElo = SEARCH_BOTH_ELO; } if(this->ths->btnOneElo->isChecked()) { sp.checkElo = SEARCH_ONE_ELO; } sp.result = chess::RES_ANY; if(this->ths->btnUndecided->isChecked()) { sp.result = chess::RES_UNDEF; } if(this->ths->btnWhiteWins->isChecked()) { sp.result = chess::RES_WHITE_WINS; } if(this->ths->btnBlackWins->isChecked()) { sp.result = chess::RES_BLACK_WINS; } if(this->ths->btnUndecided->isChecked()) { sp.result = chess::RES_UNDEF; } if(this->ths->btnDraw->isChecked()) { sp.result = chess::RES_DRAW; } // comment search //sp.comment_text1 = this->tcs->text1->text(); //sp.comment_text2 = this->tcs->text2->text(); //sp.wholeWord = this->tcs->wholeWord->isChecked(); //sp.mustNotStartInInitial = this->tcs->notInitialPos->isChecked(); //sp.caseSensitive = this->tcs->caseSensitive->isChecked(); // search options //sp.searchGameData = this->optGameData->isChecked(); sp.searchGameData = true; //sp.searchComments = this->optComments->isChecked(); //sp.searchPosition = this->optPosition->isChecked(); //sp.searchVariations = this->optVariants->isChecked(); //sp.search_board = this->tsp->getBoard(); return sp; } void DialogSearch::setPattern(SearchPattern &sp) { // game data search this->ths->whiteName->setText(sp.whiteName); this->ths->blackName->setText(sp.blackName); this->ths->cbIgnoreColors->setChecked(sp.ignoreNameColor); this->ths->event->setText(sp.event); this->ths->site->setText(sp.site); this->ths->cbYear->setChecked(sp.checkYear); this->ths->cbEco->setChecked(sp.checkEco); this->ths->cbEco->setChecked(sp.checkMoves); this->ths->minYear->setValue(sp.year_min); this->ths->maxYear->setValue(sp.year_max); this->ths->startEco->setText(sp.ecoStart); this->ths->stopEco->setText(sp.ecoStop); this->ths->minElo->setValue(sp.elo_min); this->ths->maxElo->setValue(sp.elo_max); switch(sp.checkElo) { case SEARCH_AVERAGE_ELO: this->ths->btnAverageElo->setChecked(true); break; case SEARCH_BOTH_ELO: this->ths->btnBothElo->setChecked(true); break; case SEARCH_IGNORE_ELO: this->ths->btnIgnoreElo->setChecked(true); break; case SEARCH_ONE_ELO: this->ths->btnOneElo->setChecked(true); break; } switch(sp.result) { case chess::RES_UNDEF: this->ths->btnUndecided->setChecked(true); break; case chess::RES_WHITE_WINS: this->ths->btnWhiteWins->setChecked(true); break; case chess::RES_BLACK_WINS: this->ths->btnBlackWins->setChecked(true); break; case chess::RES_DRAW: this->ths->btnDraw->setChecked(true); break; } } jerry-3.2.0/src/dialogs/dialog_about.cpp0000664000175000017500000000451513514421177016747 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "dialog_about.h" #include #include DialogAbout::DialogAbout(QWidget *parent, QString version) : QDialog(parent) { this->setWindowTitle(this->tr("About")); QVBoxLayout *vbox = new QVBoxLayout(); QHBoxLayout *hbox = new QHBoxLayout(); QString info = QString("
Jerry

" \ "Version "); info.append(version).append("
"); info.append("Copyright © 2014 - 2019
" \ "Dominik Klein
" \ "licensed under GNU GPL 2

" \ "Credits

" \ "with patches from
" \ "Atrament666, Spill-The-Tea

" \ "Stockfish Chess Engine
" \ "by the Stockfish-Team

" \ "'VARIED.BIN' opening book
" \ "by Marc Lacrosse/Jose-Chess Tool

" \ "Piece Images
" \ "from Raptor Chess Interface

" \ "all licensed under GNU GPL 2
"); QLabel *labelText = new QLabel(info); labelText->setAlignment(Qt::AlignCenter); QFontMetrics f = this->fontMetrics(); int m = f.width("m"); vbox->addWidget(labelText); hbox->addSpacing(m*5); hbox->addLayout(vbox); hbox->addSpacing(m*5); this->setLayout(hbox); } jerry-3.2.0/src/dialogs/dialog_engineoptions.h0000664000175000017500000000345413514421177020164 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIALOG_ENGINEOPTIONS_H #define DIALOG_ENGINEOPTIONS_H #include #include #include #include #include #include #include #include #include "model/engine_option.h" #include "model/engine.h" //const QRegularExpression REG_EXP_OPTION_NAME = QRegularExpression("option name (.*?) type"); class DialogEngineOptions : public QDialog { Q_OBJECT public: explicit DialogEngineOptions(Engine &e, QWidget *parent = 0); void updateEngineOptionsFromEntries(); private: QMap spin_widgets; QMap check_widgets; QMap combo_widgets; QMap line_widgets; QFrame* hLine(); Engine &engine; void getOptionsFromEngine(); int existsEngineOption(QVector &options, QString &name); void delay(int ms); signals: public slots: }; #endif // DIALOG_ENGINEOPTIONS_H jerry-3.2.0/src/dialogs/dialog_promotion.cpp0000664000175000017500000001103313514421177017654 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "dialog_promotion.h" #include "chess/board.h" #include "viewController/piece_images.h" #include #include #include #include "assert.h" #include "various/resource_finder.h" DialogPromotion::DialogPromotion(bool color, QWidget *parent) : QDialog(parent) { this->setWindowTitle(this->tr("Promotion")); this->resizeTo(0.15); this->dpr = this->devicePixelRatio(); int h = this->size().height() - (2*this->border); int w = (this->size().width()-(2*this->border))/4; // piece size this->pieceSize = h; if(w < h) { this->pieceSize = w; } this->color = color; this->promotesTo = chess::QUEEN; this->selectedIndex = 0; this->img = new PieceImages(ResourceFinder::getPath()); } void DialogPromotion::resizeTo(float ratio) { int height = 0; int width = 0; this->border = 0; if(this->parentWidget() != 0) { int w_height = this->parentWidget()->size().height(); this->border = w_height * 0.01; height = w_height * ratio + (2*this->border); width = (w_height * ratio) * 4 + (2* this->border); } else { QDesktopWidget *desktop = qApp->desktop(); QSize availableSize = desktop->availableGeometry().size(); int w_height = availableSize.height(); this->border = w_height * 0.01; height = w_height * (ratio*0.6) + (2*this->border); width = (w_height * (ratio*0.6) * 4) + (2* this->border); } QSize newSize( width, height ); this->resize(newSize); } void DialogPromotion::paintEvent(QPaintEvent *) { QPainter* painter = new QPainter(); painter->begin(this); // draw images int h = this->size().height() - (2*this->border); int w = (this->size().width()-(2*this->border))/4; // piece size this->pieceSize = h; if(w < h) { this->pieceSize = w; } int s = this->pieceSize; QColor lightBlue2 = QColor(166,188,231); painter->setBrush(lightBlue2); for(int i=0;i<4;i++) { if(this->selectedIndex == i) { painter->drawRect(this->border+i*s,this->border,s,s); } painter->drawImage(this->border+i*s, this->border, *this->img->getPieceImage(this->piecetype_by_idx(i),this->color,s,this->dpr)); } painter->end(); delete painter; } void DialogPromotion::mousePressEvent(QMouseEvent *m) { this->selectedIndex = (m->x() - this->border) / this->pieceSize; this->update(); } void DialogPromotion::mouseReleaseEvent(QMouseEvent *) { this->promotesTo = this->piecetype_by_idx(this->selectedIndex); this->done(QDialog::Accepted); } void DialogPromotion::keyPressEvent(QKeyEvent *e) { int key = e->key(); if(key == Qt::Key_Left) { this->selectedIndex--; if(this->selectedIndex < 0) { this->selectedIndex = 0; } this->update(); } else if(key == Qt::Key_Right) { this->selectedIndex++; if(this->selectedIndex > 3) { this->selectedIndex = 3; } this->update(); } else if(key == Qt::Key_Return) { this->promotesTo = this->piecetype_by_idx(this->selectedIndex); this->update(); this->done(QDialog::Accepted); } } uint8_t DialogPromotion::piecetype_by_idx(int idx) { assert(idx >= 0 && idx <= 3); uint8_t piece; switch(idx) { case 0: piece = chess::QUEEN; break; case 1: piece = chess::ROOK; break; case 2: piece = chess::BISHOP; break; case 3: piece = chess::KNIGHT; break; } return piece; } jerry-3.2.0/src/dialogs/dialog_guioptions.h0000664000175000017500000000271613514421177017503 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIALOG_GUIOPTIONS_H #define DIALOG_GUIOPTIONS_H #include //#include "viewController/simple_displayboard.h" #include "viewController/pickcolorboard.h" #include "model/font_style.h" #include "dialogs/tab_board_style.h" #include "dialogs/tab_font_style.h" class DialogGuiOptions : public QDialog { Q_OBJECT public: explicit DialogGuiOptions(ColorStyle *currentStyle, FontStyle *fontStyle, QWidget *parent = 0); //SimpleDisplayBoard* displayBoard; //PickColorBoard* displayBoard; private: TabBoardStyle *tbs; TabFontStyle *tfs; signals: public slots: }; #endif // DIALOG_GUIOPTIONS_H jerry-3.2.0/src/dialogs/dialog_engineoptions.cpp0000664000175000017500000003167013514421177020520 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include "dialog_engineoptions.h" DialogEngineOptions::DialogEngineOptions(Engine &e, QWidget *parent) : QDialog(parent), engine(e) { this->setWindowTitle(this->tr("UCI Engine Options: ").append(e.getName())); QVector uciOptions = this->engine.getUciOptions(); this->getOptionsFromEngine(); QGridLayout *grid = new QGridLayout(); int count = this->engine.getUciOptions().count(); int rowwidth = count / 4; int x = 0; int y = 0; uciOptions = this->engine.getUciOptions(); for(int i=0;i= rowwidth) { y = 0; x ++; } // crude way of adding spacing if(y!=0) { grid->addWidget(new QLabel(" ", this),x,y); y++; } y++; QLabel *lbl = new QLabel(ei.name, this); y++; grid->addWidget(lbl,x,y); y++; if(ei.type == EN_OPT_TYPE_SPIN) { QSpinBox *widget = new QSpinBox(this); widget->setMinimum(ei.min_spin); widget->setMaximum(ei.max_spin); widget->setValue(ei.spin_val); grid->addWidget(widget,x,y); this->spin_widgets.insert(ei.name, widget); } else if(ei.type == EN_OPT_TYPE_CHECK) { QCheckBox *widget = new QCheckBox(this); widget->setChecked(ei.check_val); grid->addWidget(widget,x,y); this->check_widgets.insert(ei.name,widget); } else if(ei.type == EN_OPT_TYPE_COMBO) { QComboBox *widget = new QComboBox(this); QString active_setting = ei.combo_val; for(int i=0;iaddItem(ei.combo_options.at(i)); if(ei.combo_options.at(i) == active_setting) { widget->setCurrentIndex(i); } } grid->addWidget(widget,x,y); this->combo_widgets.insert(ei.name,widget); } else if(ei.type == EN_OPT_TYPE_STRING) { QLineEdit *widget = new QLineEdit(this); widget->setText(ei.string_val); grid->addWidget(widget,x,y); this->line_widgets.insert(ei.name,widget); } y++; } } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel, this); QVBoxLayout *vbox = new QVBoxLayout(); vbox->addLayout(grid); vbox->addWidget(this->hLine()); vbox->addWidget(buttonBox); this->setLayout(vbox); connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogEngineOptions::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogEngineOptions::reject); } void DialogEngineOptions::updateEngineOptionsFromEntries() { // iterate through all widgets and update values from // current state of widgets // first start with spin widgets QMapIterator i1(this->spin_widgets); QVector en_opts = this->engine.getUciOptions(); while (i1.hasNext()) { i1.next(); QString name = i1.key(); int j = this->existsEngineOption(en_opts, name); if(j!=-1) { this->engine.setUciSpinOption(j,i1.value()->value()); //this->engine->getUciOptions()->at(j)->spin_val = i1.value()->value(); } } // same spiel for combo widgets QMapIterator i2(this->combo_widgets); while (i2.hasNext()) { i2.next(); QString name = i2.key(); int j = this->existsEngineOption(en_opts, name); if(j!=-1) { this->engine.setUciComboOption(j, i2.value()->currentText()); //this->engine->getUciOptions()->at(j)->combo_val = i2.value()->currentText(); } } // and check widgets // same spiel for combo widgets QMapIterator i3(this->check_widgets); while (i3.hasNext()) { i3.next(); QString name = i3.key(); int j = this->existsEngineOption(en_opts, name); if(j!=-1) { this->engine.setUciCheckOption(j, i3.value()->isChecked()); //this->engine->getUciOptions()->at(j)->check_val = i3.value()->isChecked(); } } // finally line edits QMapIterator i4(this->line_widgets); while (i4.hasNext()) { i4.next(); QString name = i4.key(); int j = this->existsEngineOption(en_opts, name); if(j!=-1) { this->engine.setUciStringOption(j, i4.value()->text()); //this->engine->getUciOptions()->at(j)->string_val = i4.value()->text(); } } } void DialogEngineOptions::delay(int ms) { QTime dieTime= QTime::currentTime().addMSecs(ms); while (QTime::currentTime() < dieTime) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); } QFrame* DialogEngineOptions::hLine() { QFrame *line = new QFrame(this); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); return line; } // return -1 if not found, otherwise index of list int DialogEngineOptions::existsEngineOption(QVector &options, QString &name) { for(int i=0;isetEnabled(false); QVector engine_options = this->engine.getUciOptions(); // execute engine, call uci, parse options QProcess process; process.start(this->engine.getPath(),QIODevice::ReadWrite); // Wait for process to start if(!process.waitForStarted(500)) { // if process doesn't start, just ignore } else { process.write("uci\n"); process.waitForBytesWritten(); // give the engine 700 ms to respond to // the uci command this->delay(700); // read generated output QString output = QString(""); // give another 50 ms until the engine outputs info process.waitForReadyRead(50) ; output.append(process.readAllStandardOutput()); // look for all possible options QStringList output_lines = output.split("\n"); for(int i=0; iexistsEngineOption(engine_options, opt_name); if(opt_idx >= 0) { EngineOption eo = engine_options.at(opt_idx); engine_options.removeAt(opt_idx); engine_options.append(eo); } else { // means engine was queried first time i.e. option doesn't exist yet // spin option QRegularExpression regExpTypeSpin = QRegularExpression(".*?type spin default (\\d+) min (\\d+) max (\\d+)"); QRegularExpressionMatch m_spin = regExpTypeSpin.match(output_i); if(m_spin.hasMatch()) { int def = m_spin.captured(1).toInt(); int min = m_spin.captured(2).toInt(); int max = m_spin.captured(3).toInt(); EngineOption new_spin; new_spin.default_spin = def; new_spin.min_spin = min; new_spin.max_spin = max; new_spin.type = EN_OPT_TYPE_SPIN; new_spin.name = opt_name; new_spin.spin_val = new_spin.default_spin; engine_options.append(new_spin); } // check option QRegularExpression regExpTypeCheck = QRegularExpression(".*?type check default (true|false)"); QRegularExpressionMatch m_check = regExpTypeCheck.match(output_i); if(m_check.hasMatch()) { bool default_check = false; QString default_check_s = m_check.captured(1); if(default_check_s == QString("true")) { default_check = true; } EngineOption new_check; new_check.default_check = default_check; new_check.type = EN_OPT_TYPE_CHECK; new_check.name = opt_name; new_check.check_val = new_check.default_check; engine_options.append(new_check); } QRegularExpression regExpTypeCombo = QRegularExpression(".*?type combo default ([a-zA-Z0-9_ ]*)"); QRegularExpressionMatch m_combo = regExpTypeCombo.match(output_i); if(m_combo.hasMatch() && !m_combo.captured(1).isNull()) { QStringList def_plus_vals = m_combo.captured(1).split(" "); EngineOption new_combo; QVector combo_options; new_combo.default_combo = def_plus_vals.at(0); int size = def_plus_vals.count(); for(int i=1;iengine.addEngineOption(new_combo); engine_options.append(new_combo); } QRegularExpression regExpTypeString = QRegularExpression(".*?type string default ([a-zA-Z0-9\\.]*)"); QRegularExpressionMatch m_string= regExpTypeString.match(output_i); if(m_string.hasMatch() && !m_string.captured(1).isNull()) { EngineOption new_string; new_string.type = EN_OPT_TYPE_STRING; new_string.default_string = m_string.captured(1); new_string.string_val = new_string.default_string; new_string.name = opt_name; engine_options.append(new_string); } } } } // attempt to quit the engine process.write("quit\n"); process.waitForBytesWritten(); process.waitForFinished(250); // if still running, kill it if(process.state() == QProcess::Running) { process.kill(); process.waitForFinished(); } else { // engine quit gracefully. } } this->engine.setEngineOptions(engine_options); this->setEnabled(true); } jerry-3.2.0/src/dialogs/dialog_promotion.h0000664000175000017500000000302713514421177017325 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIALOG_PROMOTION_H #define DIALOG_PROMOTION_H #include "viewController/piece_images.h" #include #include class DialogPromotion : public QDialog { Q_OBJECT public: explicit DialogPromotion(bool color, QWidget *parent = 0); int promotesTo; private: int border; int pieceSize; qreal dpr; bool color; int selectedIndex; PieceImages *img; void resizeTo(float ratio); void paintEvent(QPaintEvent *e); void mousePressEvent(QMouseEvent *m); void mouseReleaseEvent(QMouseEvent *m); void keyPressEvent(QKeyEvent *e); uint8_t piece_by_idx(int idx); uint8_t piecetype_by_idx(int idx); }; #endif // DIALOG_PROMOTION_H jerry-3.2.0/src/dialogs/tab_board_style.h0000664000175000017500000000107513514421177017116 0ustar useruser#ifndef TAB_BOARD_STYLE_H #define TAB_BOARD_STYLE_H #include #include "viewController/pickcolorboard.h" class TabBoardStyle : public QWidget { Q_OBJECT public: explicit TabBoardStyle(ColorStyle *currentStyle, QWidget *parent = nullptr); PickColorBoard* displayBoard; signals: public slots: void onMeridaPieces(); void onUSCFPieces(); void onOldPieces(); void onBlueColor(); void onGreenColor(); void onBrownColor(); void onWood(); void onBlueMarbles(); void onGreenMarbles(); }; #endif // TAB_BOARD_STYLE_H jerry-3.2.0/src/dialogs/dialog_editheaders.h0000664000175000017500000000147313514421177017563 0ustar useruser#ifndef DIALOG_EDITHEADERS_H #define DIALOG_EDITHEADERS_H #include #include #include #include #include "chess/game.h" class DialogEditHeaders : public QDialog { Q_OBJECT public: explicit DialogEditHeaders(chess::Game &g, QWidget *parent = 0); QLineEdit *leEvent; QLineEdit *leSite; QLineEdit *leDate; QLineEdit *leRound; QLineEdit *leWhite; QLineEdit *leBlack; QLineEdit *leECO; QRadioButton *rbWhiteWins; QRadioButton *rbBlackWins; QRadioButton *rbDraw; QRadioButton *rbUndefined; private: QLabel *lblEvent; QLabel *lblSite; QLabel *lblDate; QLabel *lblRound; QLabel *lblWhite; QLabel *lblBlack; QLabel *lblResult; QLabel *lblEco; signals: public slots: }; #endif // DIALOG_EDITHEADERS_H jerry-3.2.0/src/dialogs/dialog_database.h0000664000175000017500000000166613514421177017052 0ustar useruser#ifndef DIALOG_DATABASE_H #define DIALOG_DATABASE_H #include #include #include #include "model/game_model.h" #include "viewController/database_index_model.h" class DialogDatabase : public QDialog { Q_OBJECT public: explicit DialogDatabase(GameModel *gameModel, QWidget *parent); int selectedIndex; private: void resizeTo(float ratio); void drawAllItems(); QTableView *tableView; QTableWidget *gameTable; QStringList *gameTableHeaders; QPushButton *btnOpenGame; QPushButton *btnCancel; GameModel *gameModel; QAction *tbActionDeleteGame; DatabaseIndexModel *indexModel; int currentOpenDBType; signals: public slots: void onClickNew(); void onClickAppend(); void onClickSearch(); void onClickExport(); void onClickOpen(); void onClickReset(); void onRowChanged(); void showHelp(); }; #endif // DIALOG_DATABASE_H jerry-3.2.0/src/dialogs/dialog_database_help.cpp0000664000175000017500000000164013514421177020405 0ustar useruser#include "dialog_database_help.h" #include #include DialogDatabaseHelp::DialogDatabaseHelp(QWidget *parent, QString version) : QDialog(parent) { this->setWindowTitle(this->tr("About")); QVBoxLayout *vbox = new QVBoxLayout(); QHBoxLayout *hbox = new QHBoxLayout(); QString info = QString("
Jerry - PGN Database

" \ "Version "); info.append(version).append("
"); info.append("Copyright © 2014 - 2019
" \ "Dominik Klein
" \ "licensed under GNU GPL 2

"); QLabel *labelText = new QLabel(info); labelText->setAlignment(Qt::AlignCenter); QFontMetrics f = this->fontMetrics(); int m = f.width("m"); vbox->addWidget(labelText); hbox->addSpacing(m*5); hbox->addLayout(vbox); hbox->addSpacing(m*5); this->setLayout(hbox); } jerry-3.2.0/src/dialogs/dialog_plaintext.cpp0000664000175000017500000000354413514421177017646 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "dialog_plaintext.h" DialogPlainText::DialogPlainText(QWidget *parent) : QDialog(parent) { this->setWindowTitle(this->tr("Edit Comment")); this->plainTextEdit = new QPlainTextEdit(); this->savedText = QString(""); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); QGridLayout *layout = new QGridLayout(); layout->addWidget(this->plainTextEdit,0,1); layout->addWidget(buttonBox, 3, 0, 1, 3); this->setLayout(layout); connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogPlainText::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogPlainText::reject); connect(this->plainTextEdit, &QPlainTextEdit::textChanged, this, &DialogPlainText::updateText); } void DialogPlainText::updateText() { QString temp = this->plainTextEdit->toPlainText(); this->savedText = temp.replace("\n", " ").replace("{", " ").replace("} ", " ").replace("\r", " "); } jerry-3.2.0/src/dialogs/dialog_plaintext.h0000664000175000017500000000230513514421177017305 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIALOG_PLAINTEXT_H #define DIALOG_PLAINTEXT_H #include #include class DialogPlainText : public QDialog { Q_OBJECT public: explicit DialogPlainText(QWidget *parent = 0); QString savedText; QPlainTextEdit *plainTextEdit; private: signals: public slots: void updateText(); }; #endif // DIALOG_PLAINTEXT_H jerry-3.2.0/src/dialogs/dialog_database_help.h0000664000175000017500000000037513514421177020056 0ustar useruser#ifndef DIALOG_DATABASE_HELP_H #define DIALOG_DATABASE_HELP_H #include class DialogDatabaseHelp : public QDialog { Q_OBJECT public: explicit DialogDatabaseHelp(QWidget *parent, QString version); }; #endif // DIALOG_DATABASE_HELP_H jerry-3.2.0/src/dialogs/dialog_newgame.h0000664000175000017500000000201613514421177016717 0ustar useruser#ifndef DIALOG_NEWGAME_H #define DIALOG_NEWGAME_H #include #include #include #include class DialogNewGame : public QDialog { Q_OBJECT public: explicit DialogNewGame(bool customEngine, int currentStrength, int currentThinkTime, QWidget *parent = 0); bool customEngine; bool playsWhite; int computerStrength; int computerThinkTime; bool playsComputer; private: QRadioButton *rbPlaysComputer; QRadioButton *rbEntersMoves; QRadioButton *rbPlaysWhite; QRadioButton *rbPlaysBlack; QLabel *lblStrengthValue; QSlider *sliderStrength; QLabel *lblThinkTime; QSlider *sliderThinkTime; int intervalValueToThinkTime(int intervalVal); int thinkTimeToIntervalVal(int thinkTime); signals: public slots: void rbPlaysComputerToggled(); void rbEntersMovesToggled(); void rbPlaysWhiteToggled(); void rbPlaysBlackToggled(); void sliderStrengthChanged(); void sliderThinkTimeChanged(); }; #endif // DIALOG_NEWGAME_H jerry-3.2.0/src/dialogs/dialog_engines.cpp0000664000175000017500000002172013514421177017262 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include "dialog_engines.h" #include "dialog_engineoptions.h" #include "model/engine_option.h" DialogEngines::DialogEngines(GameModel *gameModel, QWidget *parent) : QDialog(parent) { this->setWindowTitle(this->trUtf8("Chess Engines")); // create copy of engines, so that if user // clicks cancel later on, nothing is changed this->engines = gameModel->getEngines(); this->activeEngineIdx = gameModel->getActiveEngineIdx(); this->lastAddedEnginePath = gameModel->getLastAddedEnginePath(); QVBoxLayout *vbox_right = new QVBoxLayout(); this->btnAdd = new QPushButton(this->tr("Add..."),this); this->btnRemove = new QPushButton(this->tr("Remove..."),this); this->btnParameters = new QPushButton(this->tr("Edit Parameters..."),this); this->btnResetParameters = new QPushButton(this->tr("Reset Parameters..."),this); vbox_right->addWidget(btnAdd); vbox_right->addWidget(btnRemove); vbox_right->addStretch(0); vbox_right->addWidget(btnParameters); vbox_right->addWidget(btnResetParameters); QHBoxLayout *hbox_up = new QHBoxLayout(); this->lstEngines = new QListWidget(this); hbox_up->addStretch(0); hbox_up->addWidget(lstEngines); hbox_up->addLayout(vbox_right); hbox_up->addStretch(0); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel, this); QVBoxLayout *vbox = new QVBoxLayout(); vbox->addLayout(hbox_up); vbox->addWidget(buttonBox); for(int i=0;iengines.size();i++) { QListWidgetItem *item; Engine engine_i = this->engines.at(i); QString engine_name_i = engine_i.getName(); if(i==0) { engine_name_i.append((" (internal)")); item = new QListWidgetItem(engine_name_i); } else { item = new QListWidgetItem(engine_name_i); } this->lstEngines->addItem(item); if(i == gameModel->getActiveEngineIdx()) { item->setSelected(true); if(i == 0) { this->btnRemove->setEnabled(false); } } } connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogEngines::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogEngines::reject); connect(this->btnAdd,&QPushButton::clicked, this, &DialogEngines::onAddEngine); connect(this->btnRemove,&QPushButton::clicked, this, &DialogEngines::onRemoveEngine); connect(this->btnParameters,&QPushButton::clicked, this, &DialogEngines::onEditParameters); connect(this->btnResetParameters,&QPushButton::clicked, this, &DialogEngines::onResetParameters); connect(this->lstEngines, &QListWidget::itemSelectionChanged, this, &DialogEngines::onSelectEngine); this->setLayout(vbox); } void DialogEngines::delay(int ms) { QTime dieTime= QTime::currentTime().addMSecs(ms); while (QTime::currentTime() < dieTime) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); } void DialogEngines::onAddEngine() { QString fileName = QFileDialog::getOpenFileName(this, tr("Add UCI Engine"), this->lastAddedEnginePath, tr("UCI Engines (*)")); fileName = QString('"').append(fileName).append('"'); QDir d = QFileInfo(fileName).absoluteDir(); this->lastAddedEnginePath = d.absolutePath(); this->setEnabled(false); QProcess process; process.start(fileName,QIODevice::ReadWrite); // Wait for process to start if(!process.waitForStarted(500)) { // if process doesn't start, just ignore } else { process.write("uci\n"); process.waitForBytesWritten(); // give the engine 700 ms to respond to // the uci command this->delay(700); // read generated output QString output = QString(""); // give another 50 ms until the engine outputs info process.waitForReadyRead(50) ; output.append(process.readAllStandardOutput()); // look for engine id QString engine_name = QString(""); QRegularExpression regExpEngineName = QRegularExpression("id\\sname\\s(\\w|\\s|\\S)+"); QRegularExpressionMatch m_id = regExpEngineName.match(output); if(m_id.hasMatch()) { int len = m_id.capturedLength(0); engine_name = m_id.captured(0).mid(8,len-1).split("\n").at(0); } // attempt to quit the engine process.write("quit\n"); process.waitForBytesWritten(); process.waitForFinished(250); // if still running, kill it if(process.state() == QProcess::Running) { // if engine doesn't response, it could mean that // this is no engine _or_ (as in the case of e.g arasanx-64 // takes an extremely long time to respond to "quit". // kill it ... process.kill(); process.waitForFinished(); } // ... however even if we had to kill the engine, as // long as the engine provided us with a proper name, we // assume that we found a real uci engine if(!engine_name.isEmpty()) { Engine new_engine = Engine(); new_engine.setName(engine_name); new_engine.setPath(fileName); this->engines.append(new_engine); QListWidgetItem *item = new QListWidgetItem(new_engine.getName()); this->lstEngines->addItem(item); item->setSelected(true); this->update(); } } this->setEnabled(true); } void DialogEngines::onRemoveEngine() { for(int i=0;ilstEngines->count();i++) { if(this->lstEngines->item(i)->isSelected()) { this->engines.removeAt(i); this->lstEngines->takeItem(i); this->activeEngineIdx = i-1; this->lstEngines->item(i-1)->setSelected(true); this->lstEngines->update(); } } } void DialogEngines::onEditParameters() { Engine active = this->engines.at(this->activeEngineIdx); DialogEngineOptions *dlg = new DialogEngineOptions(active, this); //Engine active = this->engines.at(this->activeEngineIdx); //DialogEngineOptions dlg(active, this); if(dlg->exec() == QDialog::Accepted) { dlg->updateEngineOptionsFromEntries(); this->engines[this->activeEngineIdx] = active; } //delete dlg; /* dlgEngOpt = DialogEngineOptions(self.active_engine) if dlgEngOpt.exec_() == QDialog.Accepted: # first delete all engine options from active # engine, then # pick up those engine options that are # different from default values, and store # them in engine.options self.active_engine.options = [] for opt,widget in dlgEngOpt.optionWidgets: if type(widget) == QSpinBox: if(not widget.value() == opt.default): self.active_engine.options.append((opt.name,opt.type,widget.value())) elif type(widget) == QCheckBox: if(not (widget.isChecked() == opt.default)): self.active_engine.options.append((opt.name,opt.type,widget.isChecked())) elif type(widget) == QComboBox: if(not widget.currentText == opt.default): self.active_engine.options.append((opt.name,opt.type,widget.currentText())) elif type(widget) == QLineEdit: if(not widget.text() == opt.default): self.active_engine.options.append((opt.name,opt.type,widget.text())) */ } void DialogEngines::onResetParameters() { this->engines[this->activeEngineIdx].clearAllEngineOptions(); } void DialogEngines::onSelectEngine() { for(int i=0;ilstEngines->count();i++) { if(this->lstEngines->item(i)->isSelected()) { //this->active_engine = this->engines.at(i); this->activeEngineIdx = i; if(i==0) { this->btnRemove->setEnabled(false); } else { this->btnRemove->setEnabled(true); } } } } jerry-3.2.0/src/dialogs/dialog_nextmove.cpp0000664000175000017500000000756213514421177017507 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include "dialog_nextmove.h" #include "chess/move.h" #include "chess/game_node.h" DialogNextMove::DialogNextMove(chess::GameNode *node, QWidget *parent) : QDialog(parent) { this->setWindowTitle(this->tr("Next Move")); this->moveList = new QListWidget(); this->selectedIndex = 0; int cnt_items = node->getVariations().count(); chess::Board b = node->getBoard(); for(int i=0;igetVariation(i)->getMove(); QString san_i = b.san(mi); this->moveList->addItem(san_i); } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); QGridLayout *layout = new QGridLayout(); layout->addWidget(this->moveList,0,1); layout->addWidget(buttonBox, 3, 0, 1, 3); this->setLayout(layout); this->moveList->item(0)->setSelected(true); /* adjusting the dialog size (resp. the listwidget size * to a reasonable minimum size seems to be not trivial * leave for now default size * #todo improve size adjustment */ //int optimal_height = this->moveList->sizeHintForRow(0) * // this->moveList->count() + 2 * this->moveList->frameWidth(); //int optimal_width = this->moveList->sizeHintForColumn(0) + 2 * this->moveList->frameWidth(); //this->moveList->setMinimumHeight(optimal_height); //this->moveList->setFixedSize(optimal_width, optimal_height); //this->moveList->setFixedHeight(optimal_height); //this->moveList->setSizePolicy(QSizePolicy::Minimum); //this->setMinimumWidth(this->moveList->size().width()); //this->setMaximumWidth(this->moveList->size().height()); connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogNextMove::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogNextMove::reject); connect(this->moveList, &QListWidget::itemDoubleClicked, this, &DialogNextMove::accept); connect(this->moveList, &QListWidget::currentItemChanged, this, &DialogNextMove::onItemChanged); connect(this, &DialogNextMove::okSelected, this, &DialogNextMove::accept); connect(this, &DialogNextMove::cancelSelected, this, &DialogNextMove::reject); /* self.connect(buttonBox, SIGNAL("accepted()"), self, SLOT("accept()")) self.connect(buttonBox, SIGNAL("rejected()"), self, SLOT("reject()")) self.connect(self,SIGNAL("rightclick()"), SLOT("accept()") ) self.connect(self,SIGNAL("leftclick()"), SLOT("reject()") ) self.listWidget.itemDoubleClicked.connect(self.accept) self.listWidget.currentItemChanged.connect(self.on_item_changed) */ } void DialogNextMove::onItemChanged() { this->selectedIndex = this->moveList->currentRow(); } void DialogNextMove::keyPressEvent(QKeyEvent *e) { int key = e->key(); if(key == Qt::Key_Left || key == Qt::Key_Escape) { emit(cancelSelected()); } else if(key == Qt::Key_Right || key == Qt::Key_Return) { emit(okSelected()); } } jerry-3.2.0/src/dialogs/dialog_nextmove.h0000664000175000017500000000253513514421177017147 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DIALOG_NEXTMOVE_H #define DIALOG_NEXTMOVE_H #include #include #include #include "chess/game_node.h" class DialogNextMove : public QDialog { Q_OBJECT public: QListWidget *moveList; int selectedIndex; explicit DialogNextMove(chess::GameNode *node, QWidget *parent = 0); protected: void keyPressEvent(QKeyEvent *e); signals: void okSelected(); void cancelSelected(); public slots: void onItemChanged(); }; #endif // DIALOG_NEXTMOVE_H jerry-3.2.0/src/dialogs/dialog_gameanalysis.cpp0000664000175000017500000000611413514421177020307 0ustar useruser#include "dialog_gameanalysis.h" #include #include #include #include #include #include #include DialogGameanalysis::DialogGameanalysis(int secsPerMove, float threshold, QWidget *parent) : QDialog(parent) { this->secsPerMove = secsPerMove; this->threshold = threshold; /* self.sb_secs = QSpinBox() self.sb_secs.setRange(1,30) self.sb_secs.setValue(3) self.sb_secs.setFixedWidth(l) self.sb_threshold = QDoubleSpinBox() self.sb_threshold.setRange(0.1,1.0) self.sb_threshold.setSingleStep(0.1) self.sb_threshold.setValue(0.5) self.sb_threshold.setFixedWidth(l) */ QSpinBox *spinSecs = new QSpinBox(this); int initval = this->secsPerMove / 1000; if(initval < 1) { initval = 1; } spinSecs->setValue(initval); spinSecs->setRange(1,30); QDoubleSpinBox *spinThreshold = new QDoubleSpinBox(this); spinThreshold->setValue(this->threshold); spinThreshold->setRange(0.1,1.0); spinThreshold->setSingleStep(0.1); this->rbAnalyseBoth = new QRadioButton(this->tr("Both")); this->rbAnalyseWhite = new QRadioButton(this->tr("White")); this->rbAnalyseBlack = new QRadioButton(this->tr("Black")); this->rbAnalyseBoth->setChecked(true); QLabel* lblChoosePlayers = new QLabel(this->tr("Analyse Players:")); QButtonGroup *btnGroupPlayers = new QButtonGroup(this); btnGroupPlayers->addButton(this->rbAnalyseBoth); btnGroupPlayers->addButton(this->rbAnalyseWhite); btnGroupPlayers->addButton(this->rbAnalyseBlack); lblChoosePlayers->setAlignment(Qt::AlignBottom); QHBoxLayout *hboxPlayers = new QHBoxLayout(); hboxPlayers->addWidget(this->rbAnalyseBoth); hboxPlayers->addWidget(this->rbAnalyseWhite); hboxPlayers->addWidget(this->rbAnalyseBlack); hboxPlayers->setAlignment(Qt::AlignLeft); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel); connect(buttonBox, &QDialogButtonBox::accepted, this, &DialogGameanalysis::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DialogGameanalysis::reject); QFormLayout *formLayout = new QFormLayout(); formLayout->addRow(tr("Sec(s) per Move"), spinSecs); formLayout->addRow(tr("Threshold (in pawns)"), spinThreshold); QVBoxLayout *layout = new QVBoxLayout(); layout->addLayout(formLayout); layout->addWidget(lblChoosePlayers); layout->addLayout(hboxPlayers); layout->addWidget(buttonBox); this->setWindowTitle(tr("Game Analysis")); connect(spinSecs, static_cast(&QSpinBox::valueChanged), this, &DialogGameanalysis::onSecsChanged); connect(spinThreshold, static_cast(&QDoubleSpinBox::valueChanged), this, &DialogGameanalysis::onThresholdChanged); this->setLayout(layout); } void DialogGameanalysis::onSecsChanged(int val) { this->secsPerMove = val * 1000; } void DialogGameanalysis::onThresholdChanged(double val) { this->threshold = val; } jerry-3.2.0/src/dialogs/tab_board_style.cpp0000664000175000017500000001551613514421177017456 0ustar useruser#include "tab_board_style.h" #include #include #include #include TabBoardStyle::TabBoardStyle(ColorStyle *currentStyle, QWidget *parent) : QWidget(parent) { //this->setWindowTitle(this->tr("Set Options")); //QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); this->displayBoard = new PickColorBoard; this->displayBoard->setColorStyle(currentStyle); QGroupBox *groupBoxPieces = new QGroupBox(this->tr("Piece Style")); QGroupBox *groupBoxBoard = new QGroupBox(this->tr("Board Style")); QRadioButton *pcs_merida = new QRadioButton(tr("Merida (Default)")); QRadioButton *pcs_old = new QRadioButton(tr("Old Style")); QRadioButton *pcs_uscf = new QRadioButton(tr("USCF")); QRadioButton *brd_blue = new QRadioButton(tr("Blue (Default)")); QRadioButton *brd_green = new QRadioButton(tr("Green")); QRadioButton *brd_brown = new QRadioButton(tr("Brown")); QRadioButton *brd_wood = new QRadioButton(tr("Wood")); QRadioButton *brd_blue_marbles = new QRadioButton(tr("Blue Marbles")); QRadioButton *brd_green_marbles = new QRadioButton(tr("Green Marbles")); switch(currentStyle->pieceType) { case PIECE_STYLE_OLD: pcs_old->setChecked(true); break; case PIECE_STYLE_USCF: pcs_uscf->setChecked(true); break; default: pcs_merida->setChecked(true); } if(currentStyle->boardStyle == BOARD_STYLE_TEXTURE) { if(currentStyle->borderColor == BORDER_WOOD) { brd_wood->setChecked(true); } if(currentStyle->borderColor == BORDER_MARBLE_GREEN) { brd_green_marbles->setChecked(true); } if(currentStyle->borderColor == BORDER_MARLBE_BLUE) { brd_blue_marbles->setChecked(true); } } else { if(currentStyle->borderColor == BORDER_BLUE) { brd_blue->setChecked(true); } if(currentStyle->borderColor == BORDER_GREEN) { brd_green->setChecked(true); } if(currentStyle->borderColor == BORDER_BROWN) { brd_brown->setChecked(true); } } /* QGroupBox *groupBox = new QGroupBox(tr("Exclusive Radio Buttons")); QRadioButton *radio1 = new QRadioButton(tr("&Radio button 1")); QRadioButton *radio2 = new QRadioButton(tr("R&adio button 2")); QRadioButton *radio3 = new QRadioButton(tr("Ra&dio button 3")); radio1->setChecked(true); QVBoxLayout *vboxRadioButtons = new QVBoxLayout; vboxRadioButtons->addWidget(radio1); vboxRadioButtons->addWidget(radio2); vboxRadioButtons->addWidget(radio3); vboxRadioButtons->addStretch(1); groupBox->setLayout(vboxRadioButtons); */ QVBoxLayout *vboxPcs = new QVBoxLayout(); vboxPcs->addWidget(pcs_merida); vboxPcs->addWidget(pcs_old); vboxPcs->addWidget(pcs_uscf); //vboxPcs->addStretch(1); groupBoxPieces->setLayout(vboxPcs); QVBoxLayout *vboxBrd = new QVBoxLayout(); vboxBrd->addWidget(brd_blue); vboxBrd->addWidget(brd_green); vboxBrd->addWidget(brd_brown); vboxBrd->addWidget(brd_wood); vboxBrd->addWidget(brd_blue_marbles); vboxBrd->addWidget(brd_green_marbles); vboxBrd->addStretch(1); groupBoxBoard->setLayout(vboxBrd); QVBoxLayout *right = new QVBoxLayout(); right->addWidget(groupBoxPieces); right->addWidget(groupBoxBoard); right->addStretch(); QHBoxLayout *main = new QHBoxLayout(); main->addWidget(this->displayBoard); main->addLayout(right); QVBoxLayout *layout = new QVBoxLayout(); layout->addLayout(main); //layout->addWidget(buttonBox); connect(pcs_uscf, &QRadioButton::toggled, this, &TabBoardStyle::onUSCFPieces); connect(pcs_old, &QRadioButton::toggled, this, &TabBoardStyle::onOldPieces); connect(pcs_merida, &QRadioButton::toggled, this, &TabBoardStyle::onMeridaPieces); connect(brd_blue, &QRadioButton::toggled, this, &TabBoardStyle::onBlueColor); connect(brd_green, &QRadioButton::toggled, this, &TabBoardStyle::onGreenColor); connect(brd_brown, &QRadioButton::toggled, this, &TabBoardStyle::onBrownColor); connect(brd_blue_marbles, &QRadioButton::toggled, this, &TabBoardStyle::onBlueMarbles); connect(brd_green_marbles, &QRadioButton::toggled, this, &TabBoardStyle::onGreenMarbles); connect(brd_wood, &QRadioButton::toggled, this, &TabBoardStyle::onWood); this->setLayout(layout); //this->update(); } void TabBoardStyle::TabBoardStyle::onMeridaPieces() { this->displayBoard->setPieceType(PIECE_STYLE_MERIDA); this->displayBoard->update(); } void TabBoardStyle::TabBoardStyle::onUSCFPieces() { this->displayBoard->setPieceType(PIECE_STYLE_USCF); this->displayBoard->update(); } void TabBoardStyle::TabBoardStyle::onOldPieces() { this->displayBoard->setPieceType(PIECE_STYLE_OLD); this->displayBoard->update(); } void TabBoardStyle::TabBoardStyle::onBlueColor() { this->displayBoard->setBoardColors(BORDER_BLUE, DARK_SQUARE_BLUE, LIGHT_SQUARE_BLUE, COORDINATE_COLOR_BLUE, STYLE_BLUE); this->displayBoard->setBoardStyle(BOARD_STYLE_COLOR); this->displayBoard->update(); } void TabBoardStyle::TabBoardStyle::onGreenColor() { this->displayBoard->setBoardColors(BORDER_GREEN, DARK_SQUARE_GREEN, LIGHT_SQUARE_GREEN, COORDINATE_COLOR_GREEN, STYLE_GREEN); this->displayBoard->setBoardStyle(BOARD_STYLE_COLOR); this->displayBoard->update(); } void TabBoardStyle::TabBoardStyle::onBrownColor() { this->displayBoard->setBoardColors(BORDER_BROWN, DARK_SQUARE_BROWN, LIGHT_SQUARE_BROWN, COORDINATE_COLOR_BROWN, STYLE_BROWN); this->displayBoard->setBoardStyle(BOARD_STYLE_COLOR); this->displayBoard->update(); } void TabBoardStyle::TabBoardStyle::onWood() { this->displayBoard->setBoardColors(BORDER_WOOD, QPixmap(DARK_SQUARE_WOOD), QPixmap(LIGHT_SQUARE_WOOD), COORDINATE_COLOR_WOOD, STYLE_WOOD); this->displayBoard->setBoardStyle(BOARD_STYLE_TEXTURE); this->displayBoard->update(); } void TabBoardStyle::TabBoardStyle::onBlueMarbles() { this->displayBoard->setBoardColors(BORDER_MARLBE_BLUE, QPixmap(DARK_SQUARE_MARBLE_BLUE), QPixmap(LIGHT_SQUARE_MARBLE_BLUE), COORDINATE_COLOR_MARBLE_BLUE, STYLE_MARBLE_BLUE); this->displayBoard->setBoardStyle(BOARD_STYLE_TEXTURE); this->displayBoard->update(); } void TabBoardStyle::TabBoardStyle::onGreenMarbles() { this->displayBoard->setBoardColors(BORDER_MARBLE_GREEN, QPixmap(DARK_SQUARE_MARBLE_GREEN), QPixmap(LIGHT_SQUARE_MARBLE_GREEN), COORDINATE_COLOR_MARBLE_GREEN, STYLE_MARBLE_GREEN); this->displayBoard->setBoardStyle(BOARD_STYLE_TEXTURE); this->displayBoard->update(); } jerry-3.2.0/src/main_window.cpp0000664000175000017500000007561013514421177015213 0ustar useruser/* Jerry - A Chess Graphical User Interface * Copyright (C) 2014-2016 Dominik Klein * Copyright (C) 2015-2016 Karl Josef Klein * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "main_window.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "viewController/boardviewcontroller.h" #include "viewController/moveviewcontroller.h" #include "controller/edit_controller.h" #include "controller/mode_controller.h" #include "uci/uci_controller.h" #include "model/game_model.h" #include "chess/game_node.h" #include "uci/uci_controller.h" #include #include "viewController/on_off_button.h" #include #include #include #include #include #include #include #include "chess/pgn_reader.h" #include "viewController/engineview.h" #include "dialogs/dialog_about.h" #include "various/resource_finder.h" #include "various/messagebox.h" #include "funct.h" #include "chess/ecocode.h" #ifdef __APPLE__ const bool SHOW_ICON_TEXT = false; #else const bool SHOW_ICON_TEXT = true; #endif MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // set working dir to executable work directory QDir::setCurrent(QCoreApplication::applicationDirPath()); //chess::FuncT *f = new chess::FuncT(); //f->run_pgn_speedtest(); //f->run_polyglot(); /* f->run_pgnt(); f->run_pgn_scant(); */ // reconstruct gameModel this->gameModel = new GameModel(); this->gameModel->restoreGameState(); this->gameModel->getGame()->setTreeWasChanged(true); // reconstruct screen geometry QSettings settings(this->gameModel->company, this->gameModel->appId); bool restoredGeometry = this->restoreGeometry(settings.value("geometry").toByteArray()); bool restoredState = this->restoreState(settings.value("windowState").toByteArray()); if(!restoredState || !restoredGeometry) { this->setWindowState(Qt::WindowMaximized); } this->boardViewController = new BoardViewController(gameModel, this); this->moveViewController = new MoveViewController(gameModel, this); this->moveViewController->setFocus(); this->engineViewController = new EngineView(gameModel, this); engineViewController->setFocusPolicy(Qt::NoFocus); moveViewController->setFocusPolicy(Qt::ClickFocus); this->name = new QLabel(); name->setText("Robert James Fisher - Reuben Fine
New York(USA) 1963.03.??"); name->setAlignment(Qt::AlignCenter); name->setBuddy(moveViewController); QHBoxLayout *hbox_name_editHeader = new QHBoxLayout(); QPushButton *editHeader = new QPushButton(); editHeader->setIcon(QIcon(":/res/icons/document-properties.svg")); hbox_name_editHeader->addStretch(1); hbox_name_editHeader->addWidget(this->name); hbox_name_editHeader->addStretch(1); hbox_name_editHeader->addWidget(editHeader); this->uciController = new UciController(); this->modeController = new ModeController(gameModel, uciController, this); this->editController = new EditController(gameModel, this); this->fileController = new FileController(gameModel, this); QSize btnSize = QSize(this->iconSize() * 1.1); QSize btnSizeLR = QSize(this->iconSize() * 1.2); QPushButton *left = new QPushButton(); QPushButton *right = new QPushButton(); QPushButton *beginning = new QPushButton(); QPushButton *end = new QPushButton(); left->setIconSize(btnSizeLR); right->setIconSize(btnSizeLR); beginning->setIconSize(btnSize); end->setIconSize(btnSize); right->setIcon(QIcon(":/res/icons/go-next.svg")); left->setIcon(QIcon(":/res/icons/go-previous.svg")); beginning->setIcon(QIcon(":/res/icons/go-first.svg")); end->setIcon(QIcon(":/res/icons/go-last.svg")); QWidget *mainWidget = new QWidget(); // setup the main window // consisting of: // // <-------menubar----------------------------> //