camlspotter-camlimages-e471b3c4470d/.hg_archival.txt0000644000000000000000000000017212405272062020460 0ustar 00000000000000repo: e37886d73a98029822983bee73a2d90ceb4b298b node: e471b3c4470d1515267d42047085f7d7b5630502 branch: for_4.02 tag: 4.2.0 camlspotter-camlimages-e471b3c4470d/.cvsignore0000644000000000000000000000025512405272062017374 0ustar 00000000000000config.log config.status config.cache config.h Makefile.config Makefile.build customtop Makefile Makefile.in aclocal.m4 autom4te.cache configure install-sh missing stamp-h1 camlspotter-camlimages-e471b3c4470d/.hgignore0000644000000000000000000000124312405272062017175 0ustar 00000000000000\.apt-installed .*\.cm[a-z]+$ .*~$ \.(sp[io]t|annot|o|cm[a-z]+|orig|omc|lock|a|so)$ \.(byt|opt|run)$ \.omakedb$ \.depend$ CVS/.* autom4te\.cache/.* \.\# ^missing$ stamp-h1$ config\.status$ config\.log$ config\.h$ src/camlimages\.ml$ src/META$ doc/eng\.html doc/sphinx/_build test/out\.image$ test/test$ test/jpgexif$ test/jpgmark$ test/test2$ examples/converter/converter$ examples/converter-external/converter$ examples/crop/crop$ examples/edgedetect/edge$ examples/gifanim/gifanim$ examples/imgstat/imgstat$ examples/liv/liv$ examples/monochrome/monochrome$ examples/normalize/normalize$ examples/resize/resize$ examples/tiffps/tiffps$ examples/ttfimg/ttfimg$ \.svn/ camlspotter-camlimages-e471b3c4470d/.hgtags0000644000000000000000000000066712405272062016661 0ustar 00000000000000ee82aa9b74ac04d5c8ee2e49825f96b4bc3f032c camlimages-4.0.0 ff3f1ccc87431ff26bf9dda1495c953505ecbd23 v4.0.1 ff3f1ccc87431ff26bf9dda1495c953505ecbd23 v4.0.1 0000000000000000000000000000000000000000 v4.0.1 0000000000000000000000000000000000000000 v4.0.1 c803efa9d5d33b908069f27f49b876e35853a708 v4.0.1 f650e32ed440423e2290e1ef819aecd8c99375bc 4.1.3 f650e32ed440423e2290e1ef819aecd8c99375bc 4.1.3 71025db891bd826fc1d608c2b52b8b9d3afdd218 4.1.3 camlspotter-camlimages-e471b3c4470d/Changes.txt0000644000000000000000000000631612405272062017511 0ustar 000000000000004.2.0 * OCaml 4.02.0 string/bytes fix 4.1.2 * GIF lib version 5 support * clang related compilation fixes 4.1.1 * omake --config clean up * pkg-config is now used if exists in order to seek external libraries 4.1.0 * bmp was not linked with examples. Since bmp is pure ML libarary, you may need to add -linkall to linker command to your build script, otherwise the module is silently ignored. * bmp 32bit RGBA is now supported * added jpeg marker load/saving (not tested well) * added exif support (you need libexif) ! refactored ocamlfind package names (probably introduce some incompatibility) * removed unused old configure and make scripts * Applied GODI's patches. Now omake takes the following variable definitions: - INCLUDES - LDFLAGS - NATIVE_ENABLED - ARG_WANT_XXX - ARG_PATH_GS - ARG_FREETYPE_CONFIG If they are not defined, some default values are deduced. 4.0.2 * ppm save was somehow disabled. 4.0.1 * Minor bug fixes, patch submitted by Damien Doligez 4.0.0 * Stop supporting the autoconf build. (It might works though.) * Instead of autoconf, using omake and ocamlfind * Subpackages: no need to link codes for uninterested format. * Stop supporting lablgtk1 - Ximage2 module is now Ximage, and the older Ximage is removed - OXimage2 module is now OXimage, and the older OXimage is removed 3.2.0 * Misnamed version. It should have been 3.0.3 or something. * Small bug fix for image load memory allocation vulnerability 3.0.2 * O'Caml 3.11 port. * Integer overflow vulnerability fix for pngread.c 3.0.1 * Alpha channel support for png images. 3.0.0 * new version numbering scheme * autoconf and makefiles cleanup * fix examples compilation 2.2.1 * Now compiling with -warn-error -A 2.2 * complete code review and rewriting * the main module, originally named "Image" is now "Images". * the whole set of compiled files are now installed in the library * a new export for the Ps module: get_bounding_box : string -> bounding_box returns the bounding box option of a postscript file image. 2.12 * O'Caml 3.07 port. Added support for lablgtk2. 2.11 * bug fix release 2.01 * bug fix at load_Glyph at freetype1/ftintf.c 2.00 * O'Caml 3.03 dll support. (This and later versions of camlimages will not work with the older O'Camls). * Better support for giflib library 1.03 * Image.save takes the image format now as an option. 1.02 * added CMYK (Cyan Magenta Yellow and blacK) color space (even though we have no trivial good color conversion between CMYK and RGB) * added RGBA (RGB with the Alpha channel) and CMYK images * Colorhist * Unit * Geometry * (Jpeg now supports CMYK image reading and writing) * Postscript 1.01 * fix for O'Caml 3.00 + lablgtk 1.00 * bitmap cache files finalization is now standard. * bug fixes 1.0 * Initial distribution revision camlspotter-camlimages-e471b3c4470d/INSTALL.rst0000644000000000000000000000515712405272062017242 0ustar 00000000000000========================================================= CamlImages - Objective Caml image processing library ========================================================= Requirements ================= To install CamlImages library, you need the following softwares: * OCaml 4.01.0 or higher * Findlib (aka ocamlfind, http://www.camlcity.org/archive/programming/findlib.html ) * OMake ( http://omake.metaprl.org/index.html ) Note that this is the minimum requirement: you can read/write BMP or PXM (PPM, PGM, PBM) image formats but no other formats. If you want to deal with other image formats, you need to install the corresponding external libraries: * libpng for PNG format * libjpeg for JPEG format * libexif for EXIF tags in JPEG files * libtiff for TIFF format * libxpm for XPM format (could be already by the X server installation) * freetype for drawing texts using truetype fonts * libungif/libgif for GIF format * ghostscript for PS format * lablgtk2, an OCaml interface to gtk+ Installation ===================================== :: % yes no | omake --install % omake --configure % omake install At omake --configure, you can specify CFLAGS and LDFLAGS to add extra header and library search paths respectively. For example,:: % omake --configure CFLAGS="-I /usr/include/libexif" LDFLAGS="-L/opt/blah" List of configurable variables --------------------------------- CFLASG, INCLUDES, LDFLAGS: as usual. ARG_WANT_=bool Without specifying ARG_WANT_, omake --configure automatically searches the availability of and enables it when found. If ARG_WANT_=0, the feature is not checked, and disabled. If ARG_WANT_=1, the feature must exist and is enabled. If omake fails to find the feature, the entire build fails. Currently the following features are available: GIF, PNG, JPEG, EXIF, TIFF, XPM, GS, LABLGTK2, GRAPHICS, FREETYPE ARG_PATH_PKG_CONFIG=string ARG_PATH_FREETYPE_CONFIG=string ARG_PATH_GS=string PATH of external commands like pkg-config, freetype-config and gs Without specifying, omake tries to find them in the PATH. Test ---- Before you actually install the library, you can check that it really works, by running examples in the test directory. For the test programs,:: % cd test % omake % ./test % ./test.run (./test.run is the bytecode executable and ./test the binary executable). Where to report building issues? ========================================================== https://bitbucket.org/camlspotter/camlimages/issues?status=new&status=open camlspotter-camlimages-e471b3c4470d/License.txt0000644000000000000000000006346412405272062017532 0ustar 00000000000000This CamlImages library (the Library) is distributed under the terms of the GNU Library General Public License version 2 (included below). As a special exception to the GNU Library General Public License, you may link, statically or dynamically, a "work that uses the Library" with a publicly distributed version of the Library to produce an executable file containing portions of the Library, and distribute that executable file under terms of your choice, without any of the additional requirements listed in clause 6 of the GNU Library General Public License. By "a publicly distributed version of the Library", we mean either the unmodified Library as distributed by INRIA, or a modified version of the Library that is distributed under the conditions defined in clause 3 of the GNU Library General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU Library General Public License. ---------------------------------------------------------------------- GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, 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 library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, 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 companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Library 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! camlspotter-camlimages-e471b3c4470d/OMakefile0000644000000000000000000002560712405272062017163 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# include OMyMakeroot ############################################################## Warnings # For release, -warn-error should not be put OCAMLFLAGS= -w A-4-9-40-42-44-45-37-41-48 # For the development, -warn-error A is turned on if $(file-exists DEV) OCAMLFLAGS += -warn-error A export ########################################## External arguments # Specify directories where X's rgb.txt can be found PATH_RGB_TXT[]= /etc/X11 /usr/share/X11 ######################################################################## VERSION=4.2.0 # for src/META PACKAGE_NAME=camlimages PACKAGE_VERSION=$(VERSION) OCAMLMKLIB=ocamlmklib ##################################################### Auto configuration with_default(def, varname) = if $(not $(defined $(varname))) return $(def) else getvar($(varname)) true_if_not_defined(var)= with_default(true, $(var)) failwith_if_defined(var, msg) = if $(defined $(var)): eprintln(Error: $(msg)) exit 1 get_have(varname) = with_default(false, this.HAVE_$(varname)) # this required get_support(varname) = with_default(false, this.SUPPORT_$(varname)) # this required # CFLAGS_xxx and LDFLAGS_xxx must exist get_flags(varname) = cflags = $(getvar this.CFLAGS_$(varname)) ldflags = $(getvar this.LDFLAGS_$(varname)) value $(string $(cflags) $(ldflags)) print_configured() = println(--- Configuring) println(wordsize $(WORD_SIZE)) println(--- C libraries) println(libgif: $(get_have GIF)) println(libpng: $(get_have PNG)) println(libjpeg: $(get_have JPEG)) println(libexif: $(get_have EXIF)) println(libtiff: $(get_have TIFF)) println(libxpm: $(get_have XPM)) println(libz: $(get_have Z)) println(--- Subpackages) println(gif: $(get_support GIF) \($(get_flags gif)\)) println(png: $(get_support PNG) \($(get_flags png)\)) println(jpeg: $(get_support JPEG) \($(get_flags jpeg)\)) println(exif: $(get_support EXIF) \($(get_flags exif)\)) println(tiff: $(get_support TIFF) \($(get_flags tiff)\)) println(xpm: $(get_support XPM) \($(get_flags xpm)\)) println(freetype: $(get_support FREETYPE) \($(PATH_FREETYPE_CONFIG)\) \($(get_flags freetype)\)) println(ps: $(get_support PS) \($(PATH_GS)\)) println(rgb.txt: $(get_support RGB_TXT) \($(string $(PATH_RGB_TXT))\)) println(lablgtk2: $(get_support LABLGTK2)) println(graphics: $(get_support GRAPHICS)) println(--- Summary) println(supported subpackages: $(string $(SUPPORTED_SUBPACKAGES))) println(supported formats: $(string $(SUPPORTED_FORMATS))) println(supported non-formats: $(string $(SUPPORTED_NON_FORMATS))) println(---) .STATIC: # Variables must be initialized inside .STATIC, if they should be # exported out. if $(not $(OCAMLFIND_EXISTS)) eprintln(This project requires ocamlfind\, but is was not found.) eprintln(You need to install ocamlfind and run "omake --configure".) exit 1 OCAMLMKLIB_EXISTS = $(CheckProg $(OCAMLMKLIB)) if $(not $(OCAMLMKLIB_EXISTS)) eprintln(This project requires ocamlmklib, but is was not found.) eprintln(You need to install ocamlmklib and run "omake --configure".) exit 1 BYTE_ENABLED=1 if $(not $(defined NATIVE_ENABLED)): setvar(public.NATIVE_ENABLED, 1) export WORD_SIZE = $(Word_size) # Image formats implemented using external libraries or binaries FORMATS= gif png jpeg exif tiff xpm ps # Image formats with necessary libraries supported SUPPORTED_FORMATS[]= # GUI/font rendering libraries supported SUPPORTED_NON_FORMATS[]= # SUPPORTED_FORMATS + SUPPORTED_NON_FORMATS SUPPORTED_SUBPACKAGES[]= # OCaml packages found likable OCAMLPACKS[]= # pkg-config if $(true_if_not_defined ARG_WANT_PKG_CONFIG) if $(defined ARG_PATH_PKG_CONFIG): PATH_PKG_CONFIG = $(ARG_PATH_PKG_CONFIG) export else PATH_PKG_CONFIG = $(Check_prog_in_path pkg-config) export export # Zlib HAVE_Z = $(Check_header_library z, zlib.h, zlibVersion) # GIF CFLAGS_gif= LDFLAGS_gif= SUPPORT_GIF=false if $(true_if_not_defined ARG_WANT_GIF) if $(not $(pkg_config_between_vers gif, libgif, 4.0.0, 5.0.0)) HAVE_GIF = $(Check_header_library gif, gif_lib.h, DGifOpenFileName) SUPPORT_GIF = $(HAVE_GIF) if $(SUPPORT_GIF) LDFLAGS_gif=-lgif export else failwith_if_defined(ARG_WANT_GIF, gif requested but not found) export if $(SUPPORT_GIF) SUPPORTED_FORMATS+=gif export export # PNG CFLAGS_png= LDFLAGS_png= SUPPORT_PNG=false if $(true_if_not_defined ARG_WANT_PNG) # we need a separate statement to get the vars defined in pkg_config reflected. res=$(pkg_config png, libpng) if $(not $(res)) HAVE_PNG = $(Check_header_library png, png.h, png_create_read_struct) SUPPORT_PNG = $(and $(HAVE_Z) $(HAVE_PNG)) if $(SUPPORT_PNG) LDFLAGS_png=-lpng -lz export else failwith_if_defined(ARG_WANT_PNG, png requested but not found) export if $(SUPPORT_PNG) SUPPORTED_FORMATS+=png export export # JPEG CFLAGS_jpeg= LDFLAGS_jpeg= SUPPORT_JPEG=false if $(true_if_not_defined ARG_WANT_JPEG) res=$(pkg_config jpeg, libjpeg) if $(not $(res)) HAVE_JPEG = $(Check_header_library jpeg, jpeglib.h, jpeg_read_header) SUPPORT_JPEG = $(HAVE_JPEG) if $(SUPPORT_JPEG) LDFLAGS_jpeg=-ljpeg export else failwith_if_defined(ARG_WANT_JPEG, jpeg requested but not found) export if $(SUPPORT_JPEG) SUPPORTED_FORMATS+=jpeg export export # EXIF CFLAGS_exif= LDFLAGS_exif= SUPPORT_EXIF=false if $(true_if_not_defined ARG_WANT_EXIF) res=$(pkg_config exif, libexif) if $(not $(res)) HAVE_EXIF = $(Check_header_library exif, exif-data.h, exif_data_load_data) SUPPORT_EXIF = $(HAVE_EXIF) if $(SUPPORT_EXIF) LDFLAGS_exif=-lexif export else failwith_if_defined(ARG_WANT_EXIF, exif requested but not found) export if $(SUPPORT_EXIF) SUPPORTED_FORMATS+=exif export export # TIFF CFLAGS_tiff= LDFLAGS_tiff= SUPPORT_TIFF=false if $(true_if_not_defined ARG_WANT_TIFF) res=$(pkg_config tiff, libtiff-4) if $(not $(res)) HAVE_TIFF = $(Check_header_library tiff, tiff.h, TIFFOpen) # CR jfuruse: libtiff depends on jpeg and z too, which are required for -static. # Impossible to resolve all the cases: # the current OCaml cma has no capability to have different lib flags for dyn and static SUPPORT_TIFF = $(HAVE_TIFF) if $(SUPPORT_TIFF) LDFLAGS_tiff=-ltiff export else failwith_if_defined(ARG_WANT_TIFF, tiff requested but not found) export if $(SUPPORT_TIFF) SUPPORTED_FORMATS+=tiff export export # XPM CFLAGS_xpm= LDFLAGS_xpm= SUPPORT_XPM=false if $(true_if_not_defined ARG_WANT_XPM) res=$(pkg_config xpm, xpm) if $(not $(res)) HAVE_XPM = $(Check_header_library Xpm, X11/xpm.h, XpmReadFileToXpmImage) SUPPORT_XPM = $(HAVE_XPM) if $(SUPPORT_XPM) LDFLAGS_xpm=-lXpm export else failwith_if_defined(ARG_WANT_XPM, xpm requested but not found) export if $(SUPPORT_XPM) SUPPORTED_FORMATS+=xpm export export # PS CFLAGS_ps= LDFLAGS_ps= SUPPORT_PS=false if $(true_if_not_defined ARG_WANT_GS) if $(defined ARG_PATH_GS): PATH_GS = $(ARG_PATH_GS) SUPPORT_PS=true export else PATH_GS=$(Check_prog_in_path gs) SUPPORT_PS=$(if $(PATH_GS), true, false) export if $(SUPPORT_PS) SUPPORTED_FORMATS+=ps export else failwith_if_defined(ARG_WANT_GS, ps requested but not found) export # LABLGTK2 CFLAGS_lablgtk2= LDFLAGS_lablgtk2= SUPPORT_LABLGTK2=false if $(true_if_not_defined ARG_WANT_LABLGTK2) SUPPORT_LABLGTK2 = $(Check_ocamlfind_package lablgtk2) if $(SUPPORT_LABLGTK2) SUPPORTED_NON_FORMATS+=lablgtk2 OCAMLPACKS+=lablgtk2 export else failwith_if_defined(ARG_WANT_LABLGTK2, lablgtk2 requested but not found) export # GRAPHICS CFLAGS_graphics= LDFLAGS_graphics= SUPPORT_GRAPHICS=false if $(true_if_not_defined ARG_WANT_GRAPHICS) # CR: ocamlfind registers graphics even if not available SUPPORT_GRAPHICS = $(Check_ocamlfind_package_compilation graphics, Graphics) if $(SUPPORT_GRAPHICS) SUPPORTED_NON_FORMATS+=graphics OCAMLPACKS+=graphics export else failwith_if_defined(ARG_WANT_GRAPHICS, graphics requested but not found) export # FREETYPE CFLAGS_freetype= LDFLAGS_freetype= SUPPORT_FREETYPE=false if $(true_if_not_defined ARG_WANT_FREETYPE) PATH_FREETYPE_CONFIG= if $(defined ARG_PATH_FREETYPE_CONFIG): PATH_FREETYPE_CONFIG = $(ARG_PATH_FREETYPE_CONFIG) SUPPORT_FREETYPE = true export else PATH_FREETYPE_CONFIG = $(Check_prog_in_path freetype-config) SUPPORT_FREETYPE=$(if $(PATH_FREETYPE_CONFIG), true, false) export if $(SUPPORT_FREETYPE) # println(SUPPORT_FREETYPE=$(SUPPORT_FREETYPE)!) CFLAGS_freetype= $(shell $(PATH_FREETYPE_CONFIG) --cflags) LDFLAGS_freetype= $(shell $(PATH_FREETYPE_CONFIG) --libs) export if $(SUPPORT_FREETYPE) SUPPORTED_NON_FORMATS+=freetype export else failwith_if_defined(ARG_WANT_FREETYPE, freetype requested but not found) export SUPPORTED_SUBPACKAGES= $(SUPPORTED_FORMATS) $(SUPPORTED_NON_FORMATS) SUPPORT_RGB_TXT = $(Check_file_in_path $(PATH_RGB_TXT), rgb.txt) PATH_RGB_TXT = $(WHERE) print_configured() # for config.h CGeneratedFiles(config.h) section: PACKAGE=\"camlimages\" PACKAGE_BUGREPORT=\"jun.furuse@gmail.com\" PACKAGE_NAME=$(PACKAGE) PACKAGE_STRING=\"camlimages $(VERSION)\" PACKAGE_TARNAME=$(PACKAGE) PACKAGE_VERSION=\"$(VERSION)\" SIZEOF_LONG=$(WORD_SIZE) VERSION=$(PACKAGE_VERSION) ConfReplaceConfigH(config.h) .PHONY: configure configure: .SUBDIRS: src test examples camlspotter-camlimages-e471b3c4470d/OMakeroot0000644000000000000000000000012112405272062017207 0ustar 00000000000000open build/C open build/OCaml open build/LaTeX DefineCommandVars() .SUBDIRS: . camlspotter-camlimages-e471b3c4470d/OMyMakeroot0000644000000000000000000001741012405272062017526 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# DefineCommandVars() ######################################################################## tools USE_OCAMLFIND = true OCAML_WHERE = $(shell ocamlc -where) ##################################################################### configure open configure/Configure public.CheckCLib(libs, funs) = # This is broken in omake: LDFLAGS += $(addprefix -l, $(libs)) program = $""" #ifdef __cplusplus extern "C" #endif #pragma warning( disable : 4100 ) /* Override any gcc2 internal prototype to avoid an error. */ $(add-wrapper $(nl)extern char , $'();', $(funs)) int main(int argc, char **argv) { /* Usage */ $(add-wrapper $(nl) , $'();', $(funs)) return 0; } """ #echo "program = $(program)" return $(TryLinkC $(program)) Check_header_library(xlib, xheader, xfunc) = return $(and $(VerboseCheckCHeader $(xheader)), $(VerboseCheckCLib $(xlib), $(xfunc))) Have_library(libname, lib, header, func) = setvar(this.HAVE_$(libname), $(Check_header_library $(lib), $(header), $(func))) export Check_ocamlfind_package(package) = ConfMsgChecking($(package)) ConfMsgFound($(shell-success ocamlfind query $(package))) where1(com) = WHERE = $(where $(prog)) if $(WHERE) value $(nth 0, $(WHERE)) else value # export $(WHERE) Check_prog_in_path(prog) = ConfMsgChecking(for $(prog)) WHERE = $(where1 $(prog)) if $(WHERE) ConfMsgResult(found $(WHERE)) return $(WHERE) else ConfMsgResult(FAILED - no $(prog) found) return false # export $(WHERE) Check_file_in_path(path, file) = ConfMsgChecking(for $(file)) WHERE = $(find-in-path-optional $(path), $(file)) export WHERE if $(WHERE) WHERE = $(nth 0, $(WHERE)) export WHERE ConfMsgResult(found $(WHERE)) return true else WHERE = export WHERE ConfMsgResult(FAILED - no $(file) found) return false export WHERE # Return the size of word in bytes. Uses omake's arithmetic which depends # on OCaml's int Word_size() = if $(lt $(add $(int 1073741823) $(int 1)), $(int 0)) value 4 else value 8 Check_ocamlfind_package_compilation(package, module) = ConfMsgChecking($(package) compilability: open $(module)) tmp_ml = $(file $(tmpfile omake, .ml)) ConfMsgChecking($(tmp_ml)) tmp = $(file $(replacesuffixes .ml, $"$(EMPTY)", $(tmp_ml))) command[] = $(OCamlC) -warn-error -a -c -package $(package) $(tmp_ml) println($(string $(command))) # The program program = $"""(* Configuration file; you can remove this. *) open $(module) """ # Compile it fprint($(tmp_ml), $(program)) protected.result = $(shell-success-null $(command)) rm -f $(tmp_ml) $(tmp).cmi $(tmp).cmo $(tmp)$(EXE) return $(ConfMsgYesNo $(result)) #################################################################### build rule # annot, spot, spit files %.annot %.spot: %.ml %.cmi $(OCamlC) -c $< %.spit: %.mli $(OCamlC) -c $< # of course it only works with unix OCamlMkLibC(name, files, ldflags) = protected.COBJS=$(addsuffix .o, $(files)) dll$(name).so lib$(name).a: $(COBJS) $(OCAMLMKLIB) -o $(name) $(LDFLAGS) $(ldflags) $(COBJS) return $(array dll$(name).so, lib$(name).a) # If ocamlmklib does not work for you, you can do: # 1. Put -verbose switch to the above call of $(OCAMLMKLIB) and see the command. # 2. Tweak the commands ocamlmklib invokes for you environment. # 3. Redefine OCamlMklibC with the tweaked commands. # For example, in Linux, # # OCamlMkLibC(name, files, ldflags) = # protected.COBJS=$(addsuffix .o, $(files)) # dll$(name).so lib$(name).a: $(COBJS) # # Change the following # $(CC) -shared -o dll$(name).so $(LDFLAGS) $(ldflags) $(COBJS) # ar rc lib$(name).a $(COBJS); ranlib lib$(name).a # # Upto here # return $(array dll$(name).so, lib$(name).a) ################################################################ config replace ConfReplaceAt(file)= $(file): $(file).in section: # I dunno but section is required stdout = $(fopen $(file), w) fsubst($(file).in) case $"@\([A-Z0-9_]+\)@" g if $(defined $1) getvar($1) else value false close($(stdout)) ConfReplaceConfigH(file)= $(file): $(file).in section: # I dunno but section is required stdout = $(fopen $(file), w) fsubst($(file).in) case $"#undef \([A-Z_0-9]+\)" g try v=$(getvar $1) value $"#define $1 $(v)" default value $"/* undef $1 */" close($(stdout)) ##################################################################### directory ROOT = $(dir .) SRCDIR = $(ROOT)/src ################################################################### local build Subpackages_available(packs) = sequence-forall($(fun elem, $(mem $(elem), core all_formats supported $(SUPPORTED_SUBPACKAGES))), $(packs)) BuildExample(namex, modules, packages) = .PHONY: clean if $(Subpackages_available $(packages)) subs=core $(packages) # the library is created with -dllib: no -custom required OCAML_BYTE_LINK_FLAGS= -linkall OCAML_NATIVE_LINK_FLAGS= -linkall OCAMLINCLUDES += $(SRCDIR) OCAML_LIBS+= $(addprefix $(SRCDIR)/camlimages_, $(subs)) OCAML_BYTE_LINK_FLAGS+=-dllpath $(SRCDIR) OCAMLPACKS[]+=unix # exif requires unix export .DEFAULT: $(OCamlProgram $(namex), $(modules)) # too verbose # else # println(Warning: $(namex) is not built: it requires $(string $(packages))) # println(Warning: Supported: $(string all_formats supported $(SUPPORTED_SUBPACKAGES))) clean: rm -f $(filter-proper-targets $(ls R, .)) *.cmt* *.sp*t export ############################################################################### pkg_config(name, libname) = ConfMsgChecking(for $(libname) by pkg-config) if $(and $(defined this.PATH_PKG_CONFIG), $(equal 0, $(shell-code $(PATH_PKG_CONFIG) $(libname)))) # this is required since it is called in .STATIC setvar(this.LDFLAGS_$(name), $(shell $(PATH_PKG_CONFIG) --libs $(libname))) setvar(this.CFLAGS_$(name), $(shell $(PATH_PKG_CONFIG) --cflags $(libname))) setvar(this.SUPPORT_$(uppercase $(name)), true) setvar(this.HAVE_$(uppercase $(name)), true) ConfMsgResult(found) export value true else ConfMsgResult(failed $(PATH_PKG_CONFIG) $(libname)) value false export # PATH_PKG_CONFIG must be well defined pkg_config_version(libname) = value $(shell $(PATH_PKG_CONFIG) $(libname) --modversion) pkg_config_between_vers(name, libname, min_ver, too_high_ver) = if $(pkg_config $(name), $(libname)) ConfMsgChecking($(libname): $(min_ver) <= version < $(too_high_ver)) ver=$(pkg_config_version $(libname)) if $(and $(le $(cmp-versions $(min_ver), $(ver)), 0), $(lt $(cmp-versions $(ver), $(too_high_ver)), 0)) ConfMsgResult($(ver) ... yes) value true export else ConfMsgResult($(ver) ... no) value false # do not export export else value false export camlspotter-camlimages-e471b3c4470d/README.md0000644000000000000000000001217412405272062016656 0ustar 00000000000000======================================================== CamlImages - Objective Caml image processing library ======================================================== The latest released version is 4.1.3. ======================================================== Note: This library is currently under development. ======================================================== What is CamlImages ? ======================================================== This is an image processing library, which provides some basic functions of image processing and loading/saving various image file formats. In addition the library can handle huge images that cannot be (or can hardly be) stored into the memory (the library automatically creates swap files and escapes them to reduce the memory usage). Installation ======================================================== Read the file INSTALL.txt Using CamlImages ======================================================== Color models -------------------------------------------------------- CamlImages supports the following color models: * Rgb24 -- 24bit depth full color image * Index8 -- 8bit depth indexed image with transparent information * Index16 -- 16bit depth indexed image with transparent information For each color models, the corresponding module is provided. Use the module Rgb24 if you want to access 24bit depth full color images, for example. Load/Save image files and other fancy features -------------------------------------------------------- CamlImages supports loading and saving of the following file formats: * Bitmap (.bmp) * Tiff (.tiff or .tif), color only * Jpeg (.jpeg or .jpg) * Png (.png) * Ppm (.pbm, .pgm, .ppm), portable pixmaps * PS (.ps, .eps), PostScript files * X Pixmap (.xpm), no saving * Gif (.gif) (not recommended) * EXIF tag For each image format, we provide a separate module. For instance, there is a Tiff module to load and save images stored in the tiff file format. If you do not want to specify the file format, you can use Image.load: this function automatically analyses the header of the image file at hand and loads the image into the memory, if the library supports this format. CamlImages also provides an interface to the internal image format of O'Caml's Graphics library (this way you can draw your image files into the Graphics window). You can also draw strings on images using the Freetype library, which is an external library to load and render TrueType fonts. Class interface -------------------------------------------------------- The modules begins the letter 'o' are the class interface for CamlImages. Image swap -------------------------------------------------------- When you create/load a huge image, the computer memory may not be sufficient to contain all the data. (For example, this may happen if you are working with a scanned image of A4, 720dpi, 24bit fullcolor, even if you have up to 128Mb of memory!) (Well, my son, the first version of this document was written around 1998, and computers had less memory at that time.) To work with such huge images, CamlImages provides image swaps, which can escape part of the images into files stored on the hard disk. A huge image is thus partitioned into several blocks and if there is not enough free memory, the blocks which have not been accessed recently are swapped to temporary files. If a program requests to access to such a swapped block, the library silently loads it back into memory. By default, image swapping is disabled, because it slows down the programs. To activate this function, you have to modify Bitmap.maximum_live and Bitmap.maximum_block_size. Bitmap.maximum_live is the maximum heap live data size of the program (in words) and Bitmap.maximum_block_size is the maximum size of swap blocks (in words). For example, if you do not want to use more than 10M words (that is 40Mb for a 32bit architecture or 80Mb for a 64bit architecture), set Bitmap.maximum_live to 10000000. You may (and you should) enable heap compaction, look at the GC interface file, gc.mli, in the standard library for more details (you should change the compaction configuration). Bitmap.maximum_block_size affects the speed and frequency of image block swapping. If it is larger, each swapping becomes slower. If it is smaller, more swappings will occur. Too large and too small maximum_block_size, both may make the program slower. I suggest to have maximum_block_size set to !Bitmap.maximum_live / 10. If you activated image swapping, cache files for unused swapped blocks will be removed automatically by Caml GC finalization, but you may free them explicitly by hand also. The functions and methods named "destroy" will free those blocks. The swap files are usually created in the /tmp directory. If you set the environment variable "CAMLIMAGESTMPDIR", then its value replaces the default "/tmp" directory. The temporary files are erased when the program exits successfully. In other situations, for instance in case of spurious exception, you may need to erase temporary files manually. Where to report issues? ========================================================== https://bitbucket.org/camlspotter/camlimages/issues?status=new&status=open camlspotter-camlimages-e471b3c4470d/README.rst0000644000000000000000000002013712405272062017064 0ustar 00000000000000======================================================== CamlImages - Objective Caml image processing library ======================================================== The latest released version is 4.1.2. ======================================================== Note: This library is currently under development. ======================================================== What is CamlImages ? ======================================================== This is an image processing library, which provides some basic functions of image processing and loading/saving various image file formats. In addition the library can handle huge images that cannot be (or can hardly be) stored into the memory (the library automatically creates swap files and escapes them to reduce the memory usage). Installation ======================================================== Read the file INSTALL.txt CamlImages concepts ======================================================== Color models -------------------------------------------------------- CamlImages supports the following color models: * Rgb24 -- 24bit depth full color image * Index8 -- 8bit depth indexed image with transparent information * Index16 -- 16bit depth indexed image with transparent information For each color models, the corresponding module is provided. Use the module Rgb24 if you want to access 24bit depth full color images, for example. Load/Save image files and other fancy features -------------------------------------------------------- CamlImages supports loading and saving of the following file formats: * Bitmap (.bmp) * Tiff (.tiff or .tif), color only * Jpeg (.jpeg or .jpg) * Png (.png) * Ppm (.pbm, .pgm, .ppm), portable pixmaps * PS (.ps, .eps), PostScript files * X Pixmap (.xpm), no saving * Gif (.gif) (not recommended) * EXIF tag For each image format, we provide a separate module. For instance, there is a Tiff module to load and save images stored in the tiff file format. If you do not want to specify the file format, you can use Image.load: this function automatically analyses the header of the image file at hand and loads the image into the memory, if the library supports this format. CamlImages also provides an interface to the internal image format of O'Caml's Graphics library (this way you can draw your image files into the Graphics window). You can also draw strings on images using the Freetype library, which is an external library to load and render TrueType fonts. Class interface -------------------------------------------------------- The modules begins the letter 'o' are the class interface for CamlImages. Image swap -------------------------------------------------------- When you create/load a huge image, the computer memory may not be sufficient to contain all the data. (For example, this may happen if you are working with a scanned image of A4, 720dpi, 24bit fullcolor, even if you have up to 128Mb of memory!) (Well, my son, the first version of this document was written around 1998, and computers had less memory at that time.) To work with such huge images, CamlImages provides image swaps, which can escape part of the images into files stored on the hard disk. A huge image is thus partitioned into several blocks and if there is not enough free memory, the blocks which have not been accessed recently are swapped to temporary files. If a program requests to access to such a swapped block, the library silently loads it back into memory. By default, image swapping is disabled, because it slows down the programs. To activate this function, you have to modify Bitmap.maximum_live and Bitmap.maximum_block_size. Bitmap.maximum_live is the maximum heap live data size of the program (in words) and Bitmap.maximum_block_size is the maximum size of swap blocks (in words). For example, if you do not want to use more than 10M words (that is 40Mb for a 32bit architecture or 80Mb for a 64bit architecture), set Bitmap.maximum_live to 10000000. You may (and you should) enable heap compaction, look at the GC interface file, gc.mli, in the standard library for more details (you should change the compaction configuration). Bitmap.maximum_block_size affects the speed and frequency of image block swapping. If it is larger, each swapping becomes slower. If it is smaller, more swappings will occur. Too large and too small maximum_block_size, both may make the program slower. I suggest to have maximum_block_size set to !Bitmap.maximum_live / 10. If you activated image swapping, cache files for unused swapped blocks will be removed automatically by Caml GC finalization, but you may free them explicitly by hand also. The functions and methods named "destroy" will free those blocks. The swap files are usually created in the /tmp directory. If you set the environment variable "CAMLIMAGESTMPDIR", then its value replaces the default "/tmp" directory. The temporary files are erased when the program exits successfully. In other situations, for instance in case of spurious exception, you may need to erase temporary files manually. Use of CamlImages ==================================== OCamlFind ------------------------------------ Due to the library complexity, we recommend using OCamlFind. You can get the list of related packages by:: $ ocamlfind list | grep camlimages camlimages (version: 4.1.2) camlimages.all (version: 4.1.2) camlimages.all_formats (version: 4.1.2) camlimages.core (version: 4.1.2) camlimages.exif (version: 4.1.2) camlimages.freetype (version: 4.1.2) camlimages.gif (version: 4.1.2) camlimages.graphics (version: 4.1.2) camlimages.jpeg (version: 4.1.2) camlimages.lablgtk2 (version: 4.1.2) camlimages.png (version: 4.1.2) camlimages.ps (version: 4.1.2) camlimages.tiff (version: 4.1.2) camlimages.xpm (version: 4.1.2) After successful installation of CamlImages, you should see something similar above. At compilation of your program, you should list the packages of image formats and GUI of you needs. But if you are not sure which one is required, just use 'camlimages.all': it contains everything. Normally your compilation command should look like:: $ ocamlfind ocamlc -c -package camlimages.all blah.ml to compile a module using CamlImages, or to build an executable,:: $ ocamlfind ocamlc -linkpkg -package camlimages.all blah.ml Basic image manipulation -------------------------------------- We have a basic image manipulation modules for each image pixel type: Index8, Index16, Rgb24, Rgba32 and Cmyk32. All they have the same interface documented in Image_intf.IMAGE. Image saving/loading -------------------------------------- To save or load an image to some image format, use the corresponding module for the image format. Jpeg, Gif, Png and so on. Here is a simple code to create a 1x1 RGB24 image and save it to a jpeg file:: (* save it to sample.ml *) let () = let img = Rgb24.create 1 1 in Rgb24.set img 0 0 { Color.r = 255; g = 0; b = 0 }; Jpeg.save "sample.jpg" [] (Images.Rgb24 img) You should be able to compile it by:: $ ocamlfind ocamlc -linkpkg -package camlimages.all -o sample sample.ml and "./sample" should create an image file "sample.jpg". (To run the code correctly, your CamlImages must be compiled with JPEG library.) Examples -------------------------------------- Some one-ML-file examples are found in CamlImages source directory. Here are some recommendations: * examples/edgedetect : Good to learn basic image loading/saving and pixel color manipulation * examples/imgstat : Image header check which is written in pure OCaml code. * tests/test.ml : Various image load/save tests displaying them on OCaml's Graphics window. * examples/gifanim : How to handle Gif animation frames and how to write LablGtk app * examples/resize : Resizing image You can normally compile them by:: $ ocamlfind ocamlc -linkpkg -package camlimages.all -o XXX XXX.ml Some may just fail because some of required libraries are not found in your system. Where to report issues? ========================================================== https://bitbucket.org/camlspotter/camlimages/issues?status=new&status=open camlspotter-camlimages-e471b3c4470d/config.h.in0000644000000000000000000000311712405272062017417 0ustar 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define if the bug in gif library has been fixed. */ #undef GIFLIB_BUG_FIXED /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING camlspotter-camlimages-e471b3c4470d/doc/.cvsignore0000644000000000000000000000002512405272062020134 0ustar 00000000000000Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/doc/old/crop-icon.jpg0000644000000000000000000002122212405272062021307 0ustar 00000000000000JFIFoCreated with The GIMP CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 95, Smoothing = 0 C     C  \" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?C| K⮁ჩƷm,{ wqx?b:QmqA]>#SW?f×mw n߽+I03mŹ;NDi?_ 830l7yʴrIYnQ{<=G<']~-ʿG?jw+M/FҬ/uw[iT̋#p8zx3gď ]i:Xѯa-8dR1HGK/Zy7}?'S~už|E_RS6ڳcEk뛥v5@7 ^S/k oqA!DͶ\ewFf}N \3M|Hڟ7O|E_>gYk";yd890 %Hf_7~._|A`kZi %cb>U'j\xo5unBoԯO?JdگATeQlH2ȯ:>%O5k{k)"i.p@O֜*nyk}bJ{/⇇'NW"*2I+.[5n]I(_f"GwᯥTf<d!r'>RaɣNJ+vwTWzK}~ZM _ıGXbZ϶! ;7Nk|'U2, _x>O[I .~_h8ӞՔq4$O`%iEy._=,_kJM$UwT[8?lo?/y5VAm$rHT1bm!pspk feJ&c}%K+S/>&i )O܈aylDQg" <~|`|?Z/^hȰ3 c$c?x~QUU87kM/*+˼9[+NMk߷K*͑<"DnGG)VY7{js; : ~ş2ɫQ ,txOOuq:󰯍~xJ4ۍ ?h;XHoyn hYOU!YTybLb gk3Fϸү.f'l%x_e5+*jh`Q$%s^]O\'Kgmc;̶SBϥy17π5~ mStw[I\pVXl#ri`-$IjWk_⾿; kᮝhMz5qhېQ@p|wxoWߋ;'f(cG'̑*Mv6Ʃl36mpݴܲ, Fp6 H>8C|BGTU4Ҥ .]J˕Pq8\AfjPZnYMQN.?sw~֝4~#f!y8rB͂F+|wBL#` qx[x?◈n-4&YBÇssק~zW|׭uH m1C?L3xPaj'u&vN3bT+7֟oiXM8i5U%]Zgh,vD$I$kjH*>gW%+ėp4+-V~],^/~ᨚZ# =}1}o_2Ug 5Kúg31T|)>WT76~ N~΢c$O;IDժXiW#f`eJ H?&4w9dfט///V>0krG=dӎ+[.Yce%mcr/G}ws,) |<#_1ըujI7g-/oKo0hAhǦτz_ctK[?R)&Upb.y 1n=o>2 5&6q9;SO ˺Ï^-j'<`sxτF]!K'(ַ;mFPkrYəexU+:z7쉢jt]{(.4ORt ԗ$893/xX/eyn'f>#%m^5]ZMKHg!gn1YxX; G>6cW]pL*8XX[ޛKObn TSI~֞. cmIќֿKA_?׈hhhQ8`,a؏`p:CJ#kSA_F#;?}O4= \":u讠Y\vag;?}ޛ|;HQ,.\W+e(љ 2Tc޾"~+f>__wMj#Kdde}.] A^O'W>Sy]&AjaҵBBΩB=^mk l2H$l*/do#"vQMI!YŠ`c;ǥkoyuox2-p;FfbT3׵~:_Va+6[S[("͖KS{5vW>XJ,GnF; wޭzS4X wPG,|GpWO`5UyLr#u?_r ;i[1D>(?G<^"2>-A+e}yb:ٮ!֚嶉v=ϐo/Z@%-%;m\Px<="kth GATJeRWb$Iq|z{AaWMgWtn,nxe +)V_kΰ߹~. G7G2*H2 t+ i |u~3.x.⅀$-4;$h|GvaW~)P|3g xgT<HhPNcpѺdte_JIvt_}qC3ܰi# ᙶO$5??j<+kud/cd"5>nPf( -ݨ|E7$7?Yv`2`QtҥN5%jq}cTN>^jͬ.WB*89W^!k /W@&2 Wp| [۟W?h JA^jߜeJ(gl'/~0u]#ZEetP ɴ\@q~C<>_T,ӿ[yЩ**x4?/_bӆosqéB}29wu} ?n^Fg+(l$;v4>56į!|0K ~Z6 dZ'|+.;(+,]G m`z^z/8Nntr{YhS8%tZvZ?N[#?XZ0Hm-$W!R3X@:Wg]\k_Gxs^cܔq@}ǽ~ׯzjn<t?.㯿wW04/3_& o׈{]lY]c?Z g#@)?{?SJxGOPXu~(44p]J99/gWMK;MIq) "Fff#25jlOY\[I4B;4 5n~~(x]s{irXj6N8ũFP͏r W3}^=˱…jpJծ_-a1 +KFu=;v}'mַ7=7B>,_Z#w/o zˌ+,u߲WS񦵠xInI&sn"Cn]hH5jT*I-Sqk__ׅ*~ĈJq8xֿcd?kT?2Ŭ/6+y0Y[`#߁e;ݹSխb eU`Bc9Ҽ=3~> 0"!*7xk 4-|&k=SU:aѿi=[Hv}m$L2` 9w.k$տ _qu)AmZc#y&f$YܪnR[ "˛ |Cր}.?*~ CPђKs uP_ž?c/5P݂qUY6e%~SϯPӟ,ܖ*l.'Y&M_ 4 YߩV)ˮ or1_sw 5۩0#{_mc'cc0'[>GNxXjkMJ~`\Xi"XDzyWi9XNzb-T7%%}FeMJ`=+<+Ӵ_C=ZikIxT=xS g1EP:WC:1$hgUIZ-,#Z.6~W|L5bJۚ9Q9Ly$h _p'-q\+_=[xbO@(\ 1Z:^y ʠ\Y+)Ii|+ \-?/.W/vD}~5_Wx?K[m|4LY9 +t~şsjWkw7݌3n k7]QX G4a:*1q ^T̽' Oi3{q4hw("U5 ACmw Фo,d3i!e ܐ8l;{Y|UBK[AYH0+d艥<3"yO?} 󪸬LsN.ʚIh+eB-TOyo>i'm_n(ֻT(hr 8AWc/࿁~*ͭ9K!ff eqָZfdP녭;{C8?/LWk8s;7{_K<Z}9i6g0%c 3㋫Yhq+>ǟʽҶϓa[V|9>~:>h72ϱy[ r琣q_g~7>7}cJݍ<;ssX_w-i|3UrJi-I[+pNjSn򥉍JI^R]mW)G'Ÿ@amOnkE蛏  xlL4R}*(_/8v k[js]oDZ,I<`vC~ٛp Z 8ѿ+ kO7[#͒WNRpRO<]g3xɉYKʨHL蠖9&{+GCjTǤ,Y]v vFO-ibx+ kO7WO^&KZdg!A}gW~!_hw6RGi"FVGvS3RZǬ_pfVE c<-i@WNG)Zs7& l'ᅌ2i֌mn_=ŬfzKiČGZW4?. )E٣@U p1Y{ ]oO~M6GG5;65QOR/o®?/GT~뚘<Ez5{}C<3?x[¾&E̱$e*W =k(1QZUVcamlspotter-camlimages-e471b3c4470d/doc/old/crop.jpg0000644000000000000000000007634312405272062020377 0ustar 00000000000000JFIFoCreated with The GIMP CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+wxJc {I6ܺt&RQ]*n:+^(qMȇr 97W/3Wq}=֊MUAɿ"MUAɿ" ^a{_v]\sO -|-0ӹs:۾P&-xsLSh͞Qߝ78Vٜy<sOOuxg5F~eoJf]܁}?ݪڤuNŋWwn%FoB^gmSg>!/ʺUO^iכxgĚm1lv6!9g?!ּ#ikP4ǸU4| ºo[~YR_&VٌQrnn iJ5HǜWY_-tU=:Y%i_?ҽ1W3|a{(A=P>fܽ*o: [2jpHD=HN%36}ST(%8ّ I+_&Ce3ܾӂKWi&,:aH\ϒO9=kJU3y.?mMѭVÌ*5ǚۑvd> Iϸ bDU'| |I /lg|#o^2:F{vn?5i&ri#?])dױO MGTh<[Wsg^|9,^yooBrlǜ.x?ʻOjm1F߹{%3\xJDfXҭ~y0=S-y?­?I`Sp[tzVrn9ݧ\+#cu8Q:4._xmq-ݻsҸBI?ک'"zUºP/\u ?K^#wjGєQE{EPEPEPEPW/l5s 7*xq׵u5#m.7܌MDKBmn'~,Id^fANI?O=SOeuL|Q襐n ?^{1bRWe$ԛT4 Lyk5}t'<c<rOҼNNw{Tⶖ)_8OnwN.^oC?ҹ߳}E_fG<"ŵnZ9%5mk]m"oY muY5Kc1q+MCa$H9RzDŽH6FCg$u*?7<-즸Cj[ng u v˕=o\nƐŭ<[(jG<` :mp1ְ.so `Q&R ȲڀXJٶxVF&F@ݟ\ޛfi@HPpzMe.Envy(O!۱m__j+ ֬h嵾_1ͤz+{a W!ك˰]áiT)HGmaej}F]\ jR$?^ҽJsceGOxF5t(3]g*os9x"G'۰ute3rtY$? }./G8!Psƾ_Jrn*(3j'yOD5%w|G]F /Ji-^j9X`aHH zD@UW$!Y6#7:+ľkʥޫ)xAIr Qom妓s%W1 Gs\؋S3aM1=Oڨ;'5+U+e')]=HjX⬹z!vIp8^]r0Jon.dDVFo$8gpDlTX&~mhO @j^\I4cb+q59[zG;fӧZ\z 11Q 9$j^жiɢ^rߏcfN9'jVEZwBW{1 ૞R C?ޗDr4/zT?S (Š((((-5 v猤*Fzxąc6ѠEcY")3j\ b'R Of\q?1 /+pihTcɼk/ "cZCLrf w$'+KyJ𦘖QmÖcC'EB/J qF(xElR\ o_\߼GS_Զ )Ѝs_^ۡk9p s57PQmu pwֻm_A7>kc( ";h*w9I 8E=+'clCo5#]4An#7oeJb$_rwcXIOs6'OӒk5sI܍y\ 1ⲌnC*c?۾LzTI>J=| d{6"b$aLӷs{5%:Fa=G{N.Tejb$$ ιtF 'y5jԋ8M5E+`'4Z^Ӥ1_@ݑORkZڌNyRTj$CLFu+:yU6Qث8RyoCj4AȯN6?  Jcj(‚((o"XbS\ou_1k*—:?4Ŀ3(Ŏk]qobO WnGdʍ([o,xq;txrWDMH5~%[R%ԀOÏ^\yr"'?|ld+ur_s/y<7mdnv6i EoA{RHZ:tǟmE 9 (Q8;@_`Z]j\`﫢H'HTaVlfKܖ,ֱl[GTv~@"&ZJ-'bs}>Y\YY䓓[[8$ ^.aUDԊC*&RjVp8&wS^|i܍ʒdӥYriv1]Q`s;עhLzDDIJ ?ڼ1VA^_.b;+EBMn3O6:nգ?跾<}O@?S׮%նyc+0ųVK xd T̕܏tn.{@"'szt遹7ߗZ%9l>z}e>j ^ॲ,?Zm -ܛ\ܰ9A=I$Td:ׂ+HW TvGw"|=6Ɓ~D;+8.Hٴr{ S\VtPG^bϏm]k;tQEw ((+".F-u5|FP)z3OK<"(?K2D3\[_v", cDP@ѓ| e]"dz8eJ>'~GP7dyLBk{̻'-mt3ds W' Վ6VG6 Q1EޤrET4Gٗv7dH:5co `ڛn|fMz$?}Y) xy"oW͚MU8e} ䷶ [ʯ3GSH,8G1~(XS8^_3\ב<tOJW7J&c+xBxB? P#, >*V݀5]NʚRvэ]CG5m.Tf(3KVJ*K.5H1P!,zVQ^;ߌ-zeGV> Qlo 7Ⲇd8bCS}ˆXyzڦ  zVp{ysOdeܙK$Q<)d`F{vi 0?lM>[^Nx5LNJU)Q1ڬҼK򜶰{]Y& 06!*uo?7P0x^=k))]J^Fl<9$NPמܘ$izC7'(5NB<`S/Ҡ:kkd(jS@Ȧ[Ҡ5wYC=xYFkt]tʽ(U 7͕=Gkx.wI 2:Wa:dRm?5ACEz( ( ( #ȋ}bы]MrE>Ŭ ^+Sn:ʟ O,vW6#WOhVb@ $dW3\!x`EzIr%/#\EzggvcqIY5(yekn-xV3Tm\{;alS&yrڡh'1{uo7>O-bi +nȜb>ψ  ?#^qvCu\_UzlTm8hwMэQuɢ"1Otp#Zt(woZ<'ؿsRwL7-k2OQ=!Nx[\HIkj -^ Ԅ)Erۀ8Mm"}PO6f c1kDd1Z%%ӞUs$aD$ɀWu̷XĨ$cGB~]N=ij[oY *Ƭ}yY9M̗I@N2s'ZO<'*9Xxky1IxmKeC?Nyu2="du)1'sX72 ty%p;Hϟްr^'3Zxu餾}nn%i>Ū(PY ^OS $\oo*Nn2{Vp#欤5tCΚu5A_JhMnG,Pi$6qY\>f}M%ѕ\ugЊoXF΁s1^]׈I!\-e5f} ?P=#K)]_O(zG藫H?֧_}EW~nQEQEQEQEƙ|X" ưF{LJv?Adyu%;\ 1*\&Цfw$bI5boXID}1^)x9+׮jNܺO`6ٽPWӵfhNH VlXRccǵkhu | Xk G.xHLq}Dѐd Ǹ &Rlz`1ic1])t*9BLO&Ve^]Yw ܊k|]^vۮz>^Wӥ`7l֥ͻjr2]I^\LJT5vZOEOeY+$Vcyx1z,Zi#)>- $n 3].mx]RW >a|bcқ]^wRiι'/J"n!cg ~WY0C%ʀ .3Z*HuǵyUp2maI t~kGs3,]O9xqYMLA9FFH#dE=BZvsj`yL6mNCqHkT,t#4Y">i^@cO2@W#o[K&^58,EM3Ga,̧ԎӚV-E9u;4hWhdbFW T3*źh;GJoX11'V.`6~t)]َkKIX W 9_L&u$[(QmsZIMXiFÊӎuj?7Jҵmn w 炋H^0ѓל.wms[2+HSq%|?e'qNkf2+?%ާ5ڲMϱx7v'Mx|A ߱eYC}kZtCƾh^FA_pbYČ`TYloX`%WXढ9C#~u5Z4JcER[rb4f/vh&.;/mƝ($gZo~UZ: k} ۉi#s6kہב] `RxDs/V"aAH5" _ƍ -BHeܗ1Tn Y+??J%3L]U EzmiZ#2of3<%"şCjt:)-]fo 1QK>Mz'ƍQ^Š((o"XbS\ou_1k*—:?4Ŀ3(}#ΙE{x7tϬ-k˿>#ޗB( (MNaR:TmOH@4 H}*"y㪲&Вg%&HqJ(^uLV7QNBLl.U@97̓dy ޽,:Nhq$3x=GC { 9~TZI!QPǗ$m Pܵ&yC~ePz0#d3DXgXr'])#{\ӻswU*RQ8H2Q)p {+v. '5$(jtTz[n ʃan%^1TtGW*A ]KgדS_ qr9`e’x`V0:h09`xGܹ0a  U $/w¸㬗]ML܍Qă=)ڃ?W){lY=bH$9BP/\u ?K^h>uFQEQ@Q@Q@Q@4u?Zu4}Z((ҚTvQ@m48Tc4ecUd_hjHѬZ1tF謣 9Z>fK^!63q a)\ 5ӅZWgܗn2= 'Z,Edk9 PsNQ>k!Z $ 取͎}+^P_P{sڳ_-##i$1=hHi@P#X+I`ch HLr9 w8C2%a#;{ l2Tg=et95e$`ҟm<`(}(bNH Y 2HQP$*NsbTV} O> ny-T,;Sd`G"5z=1s_:ْ6.vdG}ȪѰ KɡWJHezb-^2xzՏ$ЍyRzצ[E__q٢+QEQEW-D]CZk".F-e_RgVxEQ_4~ty>趯y#ΛE{{ywgq0+(((楦Ms^%i 2тp+ȵO. 篾+dEu* ka"A$a} Rϕt{ExG1^I&0T~~X6q$NfLH~dEvJD++9V#F{d+,cj:T+|}6XS =tXN ɨ _,>P;VCԚIJø=^@0T'9=Mg}Yfx}C,YªYBiek.FPAeGҷeRvF 3ÑuF6ċNztlz3VWE[G__ƙo ˑLr qK#m zVXFOHF'IDǪ^ cVl凙iG :鞵U@2w5wH|n+T[*Ŧ2AZX"F!GX}*0E\|8֨\L1^3SfYA^2:U0&d^*H󦑒qҥeްJ#{f"`nf/`ZF@N+nb,!9 7 &YGC?_Q^O6,'=+Լ"CjZ.*ݢ+QEQEW-D]CZk".F-e_RgVxEQ_4~t~;|iwm^%>:jɯg/vOϢ%zlNEx<\HQ4[iN}ޯGn^@Ā1zʴn#ٹ35m# ΦTN >; RGZtLvL}&^+L -XFV9_W gJ sƯS52xSN̴;Z+)FXzջ>]={͔C Щ1V]ʛy MYc|On"F3YpNsBM4G֜;qß+i%Hz_WWJ%ZďjGєQE{EPEP'Zx *4i{%LN 'z(9aɪ̖rOCC:N_‰=ncϧK+PY-r:(Z+|W&U7*uzU++{JY\RlҚ`NGzxKqɥi|H{wN:E*Ĕphh`ir(&IAu{ogTqz׊|p~ȫ:=Gv_/ֹ;Ol[P5jHRu(*=՝*{Wg q21%N+mBu`AG8,D6X`Zbs]QI-M bYS#(*I"#=YwP9v'=11Oeqg죐0Pa$TNco#e$W!U:vSbpIS$eȎIr{i!<ڴ>Z V$5e .+3JP͛=R[rd'[2\$Nq\%I2yq]`T{'< bF2*ڰ yT# tSWR_-%rUgWpnq>9u1E*^F訢QEQE|FP#ȋ}bыYWՁy%EWVh ^->5{0⽌ggz)jvu&( *s$֒]B+4m")T] &\>P_N.:D=CsH$D95P3;: VgQ.Xy:qDEWS[#'榆6z@0}jsHg = 9jRؚD=\^bw81X~۩ U ^_pq*X> ꐪ,Ĝv)!^U[0 Տ Jϕڸ3]Uq#?θh=kSLk3 {WpKvvZTkGSaj@%3S.͞I;Ϯk JJ-U]I)q1.LQ3GtF][x#o Kssu ?K^JC?ޗDmC=\O|h6r?zEؒ5~Қ[Ϋs۸'\/k7:ւb[,2J؞<5>!#o2%?9xB/__._UuV5_UfO5} :tB+yj]| ƿ+ G+Я3} :uF_|EizƧmX]\#5zO>f4Gqг1vǶXC޲N.+SdܟQL@i¡&$j0$ U+e+`j&ڥ`>`MtEIȠ-:#QgiH8+Psyx~FΓU䐙$?ҹ2Ià5-3wVl܈n!M$m$h%ۮW N2znX-FõPmO "~gaRjSf8QE 7 )';@k/UG6Ă)Z.dG@,TcYzۓ`BN }jVO'@Y\/ 5ach['=9QƯ* cbvk*szY{|y(qQ@Q@rE>Ůo"XbU/Fu`i~gQEGgA>5{& x߁|cw-{ϒ /5(AF-Rܩ:U .FUy ,\INZBҢ5TdM! ;rjn&`B1GwYG*Ic]FBsCd۱r٤H5 ƌGWम fKB`(6}ܞ]Jqrxj8 &=HX~V\h͕#i1>f,>sYST$>*t5PF:ԫlrwucڐ:Ơ)|y9,z"' O5)UnQS">Zz;d}+98n[jll2٪<j5 j:. םU]'4`5z7YP+1r <DZ>TD'?1$Eu~&0n,Kҩ|3]wr5ߎAdSG򝑇xFQA&'>Il:\S8h5?3o+PO9BP/\u ?K^#zZe gr2#F|zfYU+[f\.n> lmEEqJ*@H֨ꚼZl$ *ki:ۂU+2[t[oBKly O@վeUKWY6 q84f$I8%%Yv*Gˌ*F#c=+xFpȾrc$|j3+jt0hpj,[V9 l=ICÄD31X7*;I3E+;+Boz2HX`ؕsp% ;Lw`2ۖۍ1'2SCm*օSԀ)``0zY|Ao/z #>vyTg{-FB8;A5FEU[o&0*D}k:#ӵ1Xe[+.5ǟd'nqk#4#XY"n#QFR }&#s}θO~/-7N0ˁ}kzaúaWWJ%딮=#K$}OWS/>e X kHz5ȹTA4` +s|'ickZt}VUe%G֨i~Qӧ|C}[{ CH@8k<> [WR5+0fC+`0܁8#ܟFT^h(X (((OYWLE̟QLi+xuAZPRobpA/ .o3gF'𪌜u@⺆ZK71ge?:# PJ;y_+ aNMըt< ՘[6_º/Twؒn[$8 槙ʬx֡]3NEƑYGӵm?msh-ɭ F[wJE 곲arݫbw+j#'5V7Td=zԷbA,2 U;C~Wz%ə@'=)$FK1<$ 89 dg w-gIRFx*;zS͸OAU.%CD7FUZL U[IdaHrO'ҮDӚeV?AOd*U X nEf.Jzf\.HW<PZ4YhsGSx)~jʡ#+RG;+XBQ 5J88Iv t?Y35`+w4SuJFQjiF-dc264- w֪aAV\%Is4F3pkҼg՝O Ūn ]8o+GZZT VC$(((+".F-u5|FP)z3OK<"(?K7#}d<׍'G  ^ɶߩY(E?]NJ&)<)JcH{PwڌV8穮z2`ۢ#NqXzCaڱ " ;bJ}ktؼi{h,r~Z8d)\c+V\(`=$ea] I$H9hЃX 񍫎W7cwaW5Х̌z20a'9 +6iܧ5q&C,q*} WV v `x$H;CMf^$# ,:(d=HSs} &8>I@okV8B򽪞;j`i˧^(|sFvZʸ$uVmIp9ǥaN<n $M VX2qUPy$t֞u jA~<GUxp@#ӽRhݖZV ng5xq+@'ֽ_បD8ƼPh!X,#>da|tey1jQI:U@"c]161 oӑHFĦ?j#9~kk߾%-CZ> =#K)]_O(zG藮zďjGєQE{EPEPEPEPYgrGYc7rG2ڇ@A'4#;*N8#oZ@KsYwz彤&%܍};~827A}"&t^1$*#ǜTh.-=;A< ܲ3 f4Nx_κaJnD#_pr~闟fvneR:WN^\>n_\vnl(5nS6:wOp{D%Yub;UwvjFA'8<~i$[L\V=#\bW2Bۑ8ǽ%&eb=*%[krc_ZHHlO5V9hat #6r]fzolQ>b@5[nB7g"k[-G2dFH!dj03Q|p/%~ y +Jhc p3ۊZ@p<;ʴœe-rQ1F[}'eᴶIF< (zRd`Nz.MltF9&1t7V.>gosG,;jڪfIF'GsXɟt0Gz<\` ڳH-u~ 5ʒ6ƴ}EktxlGs$# =%Hoc& \˧(nJpTufa+5ds޳<).Ow2~lWW)vz=RE@P8yJC+ͯ5f/JF@Î@GcU E]u2:q֑dqP/_oZZq> w肺P/\u ?K^>uFQEQ@Q@Q@Q@e\OBk2>d*eS*N0,3S (xY [#X7RL`(k*u,rG޹k ;e==`+j\͘:21]_ӧz$)&*F6rR{ ހ" yaGcI2%o`PksÚt_>Xj_G)[c˒i#tm.N޿.Ǯm(B'`yZp7=*FIòF8SErν8|L'b4Q=qڕ%\8Ec2ޢʺ4+LT"*өa*M00:S r)\I1oݕ ~6یVrsV,TCfc*jF*9"oՎwl:Dbwu"$w\Ȯc;X|+. ̈3W?rͷ3pwR1kN=Ek ӊ| 4E 9tPHWLM96qSUI a4yϨsi &ȅ/Q>ů+kNwA]_O(zG藮RP/\?S (Š((((e]cRs!Z">*ez)IؚPČ犅sO9ߚ`bk-c$vebiL{~jq:+Gopk FMb7"N\ۚ[x"1[U+L}7K0^}sWRY#,iQo&]:NƏn={SCG~lrgI-:)su',nDkS4R7a֪Oruj.fxK\x5hԻ09zчw F+GIS=*x jxb(UJ­D)]1\7x c[jmҸLl7R COn]>^)t'xHsܯwIZJqӫ(l\fև1hIz *ATmv:oRZrBfL##בHi- Kn1#!?΂$($((+".F-u5|FP)z3OK<"(?K7#u`?Zaq^oVb}fxһVUm;Tu crg r[S)+j͢[S? =#K)]_O(zG藮zďjGєQE{EPEPEPEPޱ_B{5~KTKcjXMO}jI'dʚ03'5i7v=uF jۂi>KJٙNr,[>rUHddk%ӑ U94ѩT˘g[Xο":C+IٶMS^4kE9XO*v8wK9D7!d!b1jʼn'C&:xuOV\D.qVV\`Ò=U]H!O|;8vDGM:f1*KX%!8't]n}T,5< wBSVS;W)]\X*o'"Ef,I^MXU($wZLsTSXI0k5$3O`jrfNb9\tˆf6huQ@Q@Q@rE>Ůo"XbU/Fu`i~gQEGfo옯OW9c7|y 1Fi a$ inԆ!sM$uH!tEQpzVbQ`];jžF;U&%RB*%XWa{$Ǖ3 pU÷xCC'jKbeL6K&#ѤW v@{]=C*pT#wZ iH+HW [F;V(URL0)>zT\ B,vR.:Ց^*`SiP3JV(Xx8Lt<{u$uU`tRBhF/ĉwxP/>_1k+;zWP肺P/\u ?K^H?֧_}EW~nQEQEQEQEx3w'![v*eb3A!ށ JNzS;Ԍڡd"u\ d#ۚe5ZXIʩ; ϵ '9F=V{GWsybPA\֌s~^?5bUk6y3ZiChAVmt-_´Pq4˫]5KNmg#+ C?{cdOmkVr2: C:UҐsgŬ ^+aسa3`?>K<y^4ONZPE,Z 'zcsHG<1sQ 1kkk̋+i%Hz_WWJ%ďcjGєQE{EPEPEPEPXrGX2_B[PGzBܟZ*,iQR`(zCG4CAR=iq##c&EJF)(JXg%J)Qϥ^tvc9ڶ)~T/S6;|VB;Tv#;T{R< 1@X`Z\OfJ\RmRցf)9M"lSz@VB85!3\~k?5_EUEPEP\ou_1k[7/KѝX_QE|Y>5{WxRsO0}#Q7s^|QkO-*z>S;9b*k撲?'5J?%?ƻys5;J4 iG$ O5;O$ OA֟)4^!v5h9I iG$ O*N\sYh%?ƗkO|=NƘexZQ N^ʧcP 6_%>ޟ)4ӿ%?Ǝd/e>ƙµ|QM@֟)4q)4F+/mZMkO|ƧcL)+3mZh=?ShAjv51IB֟)4KkO9ƧcLI] ?%?ƛ .A?Shp5;Yh%?ƃM cO9=O4XTdT?#п3a)4-JƧ򲇎N|lb׎WY-{i4jG:?:זWw䑔h5%+i%Hz_WWJ)ďۏuFQEQ@Q@Q@Q@bހoe+j/ y~"}(3x1آxbRn_Q҆_Q@Yp.Gf&h.W~t N)w/5(F.+1qښV޸?:i+) ">rĤ~N2s`5jNueη[;e<U{}N/<`!g9pA1M+kU_qJD$B(bz+DxRK-le#^38ҍ(/&Y&[vv0935yZFa- S s8cߎ{RSܪhHnR7{lv(oSJ-u{PrrH rf9mu#JCoE{Γ@۵ |+=50е[w .t DH?B:[{Kmo,p\F<ǭt0hNM 6-q~jusmaçGm7C$gdMOor~=o.mg{{)0{?<]-ElnJjm_쫭[.B"AJgHF9ܣ9.,bD\[Q(W""rx:^R{cW_T9?“oT9?¾S{[oIJH&@m$FK`q43HYBUR,UN}N=ĸY3Idg}UgcI}zSuO+AFq5uGʟx:|9OsBMl18$c) +g[>VU+B((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((camlspotter-camlimages-e471b3c4470d/doc/old/edge-icon.jpg0000644000000000000000000003432312405272062021256 0ustar 00000000000000JFIFHHCreated with The GIMPC     C  q@"  H ! "1AQ 2aq#BRS$%3rCbTU A !1AQ"234RqBSaCD# ?j,$E+Ɯӏ5 MBIP?JMBA1-5!#Щ>X:ki({}u4P(Wt Iҡ:k܇XҨM5M4DM4DM5– @~kQE?s_ާPzO9hJQi|濽O隆(>k_'h'ҨPxO5P-5}8Z{^*@zn d'-~= AB[OcP#qhc5yjA R KYs.vQ5>Rht&JS4 wҾR%.))fj+ +7 c8\/<쵈dŹןɺ.V +@$1?.Bc1 U[s F1~F3iLZ1tkJT !PIyM6 NDjnG[ۯ (TX,Њb";YC-#s &|_R¶R hqŹUsہq!!\s9#1[]QK3R*[)J$p“}|W/[_ԾIxYoɊy-] #H!9^mw[|iVa@dB}wιְkjr |F;i#Mƶs)(TMֈ%>Q'Rz9QY$U/_־q ȟJ\1zYZm <ԎF\l_::@Y~d+ 了~-+.:ix lj)$X$ї97tn&eD!4짪H6KPքҭ\ؤkG Ě' A&me( o}x9K.} ,Ίr 'mL[Ckx8̤$́xxBm0B4϶-ҕLo48d^ͣv\Lߪ$ Ctx_}zVlxN+va-Z%2p<]:߉oɊM %9{wuIn:̹ !f4D7氘)D4$g ~Z8U*RcAe#VI:״ X2Ԋ R\k±i:uAvWeB2!tXYR܊ڔ% MjNO $c Nk˒`2ൃ4MVPM4DX㓿_@lj,fjuHZp-L?ջp)>HR`JE!mS2(К+p]4`?/HnC1),ھ#%,+00Wۿo5/( FB^/&SN8J h@XqX’{w󪥝euABr35STW,H13]Y|Ke vZ>WI*MHChRB Q$@ڢQ?.ץ`>c)jlrC;d'qqi᫭ךSC$QI|Z|[[֜ۍT3Q\[y!Ȏ : !LU[p:f>5]1'k-Oa!@,0gS9+p߈+l-z%Vi@%`x! P w$ /cŷ몬܆rI .`+`z>':VKWEGioM^6@t9 8!?M)V<cBX-ʽ̃ m-WZU6c5Ž.S'6`C)*qRP1|t{Z .%y)nD]Nr"_S:8%MPR!{UxQ]aЦ?+@P$#8]MF?]p?=;|#U*H>ΕUl[Q$*F_tN-6YQPO}Yw[S>>P":Ѫ? (sZ [)y8ySPOoo@@Oj3^i@EwmDWutթu8[!KkImȠ)'m3CTlݻ{E:f-"UX9<1J'99'Z%^!bUR\>X[.MKgLSjC;w9!flmlM jjSMbYvPKq W:4&J YGd4~vf`KVE/CT3AN#*c=xPI)VVVb:p&^ߡKxZ%i_%Nw=_kNiqy<Ґ G.QmiI=T*iu}eoNZARt$:;AQVwI5$N"Y>8#ĎV F :@O$:gY/.gh ݼ¸Ms[c bfߓWp96v+80Z P[ ip -R^܈1"٨UgTH5SA(PY1 I+wqym8wOo0nQ*m [$SR!Cm-n)kW/aםI3{4 E*lSЊj_[R0VuƴY1c Z*To}ekAd?HZD0b>2 /Q[Y 7vf):A,©<p=)#F@HJH~331z ȣHXI|@p"@ uiR[}4_,w=cwjEY3)5[(HCN!n,8gO)IM۸jWg%,F.55D?$$mM#Xl?w 9}|md6%]u fI 5~hWW|dJcϱ_PixB":j#Յq)Ifu4ȆI"Z a9oѥF=b2e B (@ JVzfi&+ߒJO JVsXEҎN/s5Bi p?qCH߷SAb4GoSRp2;M4eM4Eh=p7eŶ폟ןg(YC$+ˈT~=u'L@͸QSrEB ((@?sJM;mN)(lJ=7)Hi!wKN(\' Id =vԥ=נ2Yqˆ kREa;qe f6O:#+1؂l׺RFn\"JZ#6T^AHH>{J"y-l.aI]zz8<0yN6-Heiea' ']/ft8cĸ+ J M!eO:pyKlNvD u M Z"Kel! 9p'UyޝH[Kȗ%yIGXK2NxD'  m+z=xtZRp[i2S庐VZOm$q0ڵNūE*Z}]Z:#J8q*JJ˖:0/{֛~mn*@Hǫ:*-Ɔ[Sn:I J@z&BѽSݫ/܉n34k!s%%9qoL8rWja`Bޭ.<]f(t\ /8ŤNYQzJ?;Y>jz)m[%=*|ǔ3jSpqѸ&T.2@eFbԔ=qYb u_coH]>xɇ%.璔꽻ָY>V=\mkmj, sqRx&C!my=ʔTxTKlwy,ނZKaڣk CfKn)>) {U/svnZnƽ)/ȪEi䫂p$`T˃xoUJw۴" aPMa$ӄ$Gp=P[>4&P-:N^MOU-1y su>B ?raD_חOr$ћ~Zvч" 56et1]$^uE9/}kVnULj39S-eԕAdѢ n}rKX~:)ҘKpkZ%TIe *JT9IϤڇ,r,nՆd5ִZdIk(̕+$*­nK촾3n]=/-2SXP@@5 nV6Bכ *?)2I%% }F#T`1 ENF )qr;Huf\[JM5~Mb?[=mW U-ւPʜVr9eưv.);Qc-葈[jZNrOceF_޳V}~C)9eNۈ@`~_6QӠB䳞?Ld~ s"&!@UM&Rsϴiʎp/;5vfj@}+eT+tI}ĺuDAqUH[}BNu꟩ӣͯMשӦ3X3|8 T%$6'4y-*߅>AA17i Ҹf{N] -ajLYu[ˋNѤ?(CIfBrlJXZ{%5w@`&dD-Vg0eR3fZBO7gg,U0wZa 2%JVFS{jndr(z WZ0:S"5A{vuje]M:kQ!gRځ9 @rδt7ۆF+<]l-fQCj3/A'0{x5b WkĵVԥ %VT &ʋOKy|S,P Gs9=Xί:ӷ n떒:\+JRCo娒%99 *#S줽6dT+M HmRRJyKm@)*@2|kp[˘ݮ2)E!) @Rg)JP'FuM`E7&M;w^+X>)LqlFh; ͘@5u-~ iBNnZFh!AQ(ۏp1Zް ?up4 XZ~ `&~ |Em<@Φ#lK )Da4I?@ )~ ziiͦS7듪tOeJT'$w88^]rC8a*+# 6kɨ uJm%Db{gsmhVNJJv.r=* c6oҪܥnUߤm}P(79E+RG3۶{{gMrmMu&tqh.FvsJa*$((vBUtI*﨔8\Sӗq]ΞӐĆjpU:ԴA@ c)9}uJ <Փ`ݶqyˍֺzupl<ǺZReԲ}85FE49kVTBpJ% U-KW× M"iO@CpRY iJ{{bZURԫcbJYmkS 6`ik}J/u4[4v"6 Mә0eRFZPԮ|Vg-BܺZBv_iS N+_+*[1 tD_%VBIG;v<}:3=G}r!ߕ%D0OQҟꂀU>3ӟtޝ3 A_iW iZi4xe;rdrߌAbIoJ]wW~?mfΰﮄnSl)t%D?|˵gg uBXY[isWp\R  v 4*K)i!X)Dgs |D<+d`TNCAxNP()/ÈMxޯR;ֺzl.#˶]:=HGz48Zbp)I1\`[|˯dK܇5Wŷێ8  -X8Ra!,_޶-V}8E܆(jY^RG%7{rϬ/ՎLvlf)?u!_qc 5}׎ h0W9\ 8P-R6 =9{G>#buU5Y:E:&M>۱NF%rozK췯wG5涩>۴qE**")YSYm)L.mcx aQT`$V2qHUtu%0[ %8' +ԠsH~RXLV8sw:7*M8X 꾜9,^s-޽j=L)2&4e- C<91mhCK. t؏ZH?zZx.)dSQݗ*/Zc%!>^ r''+F}2 #HC4,YkwWrXTļG 樾7=nW&Qe"3J%3U~BB}YO2˪!'Ծ |n]:N:»q嗦-)As*Ь(;VS[$EIO܉I#ߟ+xR٬@A*ࠊrp:C?lORQODytyXĚBH4p֯BBmk}l\[ΉoQ]}N:R2d4|#.vGԽuUh m@$TRBQ}D:RoS8'AI vD` =-iXƄŎ^ر@<2 w7x4801"0/!ԥ84'uv݌ܺUvD#~OBBЇ@(g LN[Z򜚄B%IwB9鮥&5$)5.)KI O~ia22Yaw* ظN㳺YӘ1 -i$ ,H[?p>:ԅf}=D^f{˷M5]A4M`!XhWPB̧nZwsPoY7udRZj}4+H)Ln} sQ8ѧ ǛYo$y={kϔtHJQ j$:Us̥lDA)VJ J޿ӆ(ҫJZ XӐXA|%}Բg>Ŗ򙉰JBIV + y~H﨟ܽvF[4K炓 *N=YC%Rٹlо) ^<A ~%>bn4+=,瘄 ۢߙmHŠR%#Gyh\h,8R@qƼھGw؊ SK|PMA¿ a HtyYT턵C*qn\p#G"8QDf.eJؼ[#)bjiPJHH'V2{[pMa1c7ͨp$T1@ne&-MZM!d Zc 9A8!/ݺnWF˥GLUZR\TkB Ҷlvr ZYũM?xIn+iθA'=NлIGD6d7$3`RĤ`5f&ݛng)#c`0Z`r=ԌHԍKϹNlCcS/ȔGs}1U] >֗]簺׹&B7b8u4@QoleiuΚ/-~kopөLmz:*5xjr"Iu%] Kdl㮷!AiA{7Mv2QRx۱xcM jD|"܂Y7̸̋8I)Jd%[-O\J2JM*7c}iUE2ΥQ"BqYIuDu]_M{>B8Q[AM5TX֛>v%Q3aRNƎ} KK%MN9~۷}@ŭ;'){Gf=}E"R/>J}V I mc~zߢ b##(Դac:>4}KQM.sJSN?<SNP #{~qA'9/%JۍJ_ m[Ew E&O$$#VW4 qٶy7M}ޔWe:W˫aH!N9;Lgv KAڨx(2@ϷqC/'1eGmfLb-?rnM4]4fqgqۍUk~9l,a{]nօUKrε,j[TcO9[a+V1Ȅ$q'U`oU>jHiiiӍ.Z[RޮVkզSk]u.$PRVx Fv>M[plM>V[XJ+pJNMi,<.klzԗ&ѩ[h[*u*ˬ|$lׇuyWYBHbe&]*SXJIe8tn\D]/훇{Wk`\rA5ϜmKzI-%(%⑀;$g'$M4M4M4M4M4M4M4M4OcO"S֞\Q܄@MZs*xj̡?͆տO1Phpb *CiaVJx%d4E?|X$1KP8r݋&1v?"b+t rߺ"P/yGJ\Xjb7 $̶ _lDZ]ACmg=W9ƚ"')v|Un.t;fA2,D)R2J?<*)t7gV*˙ԃjr-2YmE-L]XTTIZQJFb,z.Vw|SCVgL6D8ɓS`Id.&@i.$zď ihŇKfݕVUQjdBD-*Oi=9$$Y}^Ԧ[oWORm'*9N3}TDM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4D_camlspotter-camlimages-e471b3c4470d/doc/old/edge.jpg0000644000000000000000000010755312405272062020336 0ustar 00000000000000JFIFHHCreated with The GIMPC      C  0"  ^ !1A "Qa 2q#$BR%&34CTbDE6Scfrtv I !1AQ"a#3Rq2BTbCSr%4Dc ?a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&SOs<5bU()BeQ^$J OAP\Xsl7f o15*VIi Q2 r T >KXbO^J%IͩXQMk&zҙ܌H<b#0m:_D/a=潶e,~ԣloL;\}.}I' C?AM_vM;?qzi}qˏ_xzV,1tȭi7sڰǢ?Xs%3,NRETm]tR{zo@%.4nGrcWU 'wܱ=r3ީիz X-u?^h-5Ԕt~1H/)Z|'{V1bԮIik|C|ODRCݤz{#0;Os mt}T#{Am")=!. Jn_)}=իz' X)",WRPICaծP\ )3ކW>Hb:=Yk69q>B,}%7$({?d 23MmE6q81PR{(q,\[6Lz⯢|߆cvL0L0L0L0L0kWwvA/0CQI$SMI[NGmŋN~^B@QIXc5/9E;l;t!8Mq*RVrq)!>y0f1M?HxXc hVB+(X9FG^1؏oIN4/bTZk ῧ b^#ezRqoOO?Ly)CU.()[$[޳)f6^޾\EV?Lt&8]HVy>?L7 l1@=#{Fx_& BVt?uo~L%fF×$Ǝӫg6ARI;ZE2l<7 \1)oLu'jU JV~H+05%{gT)91{WvXJO)xoIeP+ZxEt9 S:Cpە+f'!lP,o@X$sm&vjrFJח~6/JI Q7G>|c?K9Y5fڐx(n~1pjrS,:JcIBHOE`hH#uwHEѴ^Q_w[v[JU\憷"'|^f 2>K&CWuGwIuQO&P=O*n# mr/ſ.N9{F+˭59\-,).-o!JJUrEô0U.}IG;Py\RR@jQ6 afMeB @"LGYePv( %[3]I$ٲ8&XT**j1EP[&Đm~GZ2~L!+¢MԲ̪mfMM^3oB#[Ser :4iYr.jQ*dmeA[RH}/x){lVKZ)2d28jG տH\cS,3,xԩ [>~x8QziMBT5`6!lPG 'M|#}][bOIXOMv/Rle+;=_uÔsED+dԕŤT‚Z_aSxsՃp!]Npȇ2Fqe SR_0ۮ@$rR8>|wM9Ea!Ĥ$P\_ib}4;hq^YpvZ┭ .vX4+l{\IWeCoR7X\ͅOM*[FFs>dO ӽZ͠shĕӦe9:>q#X:$*2hfc(,(^>HZJKr5;!;\HUiȵ.r#U|J)ᔡ A#n" [wulYmdH8]<#ͷ^5X=h(/lTQqdqLyfum[4 Q>-Tڷ0SK;gGKFM||'{,- .779eC!ʵw`[ܓ>?^-;Ԃ8o3Ad-mv}7 ^ZAC`=fB@U)irnea{\JLf{4*J,_PrIyVdēɸ#SfzPSF/,ԚyQ*J7" T;`vEĻM|4{cYFMA,O[AD U:K ܀8{A5AZ~Vޞ(Uo.T Ϡ{⥙=1scI=bZXN܇յ*ږքI &ݍè?+-!᯻kA0i8d59Jg S0x0@\r : ~<˛*J\>~{gs[*U]9¬5K -/]8(~8TIuo-īwg3$d^7ޢI6)Uی%dmO$ǟ67Y/ Y W 0dzW.aaaaַڕ`t \ i5%iA)ƶQP3$X-(BԔ eP ChL{)o!B<{Qu*t4S#e%)')CPوGe*TrW)Tv e-sql eVHm}t6Y##81 "/uWGFҥij'{ {=Z[j 8 ?ȷx"dwY[*q\ .ݍ Wt\f )1{C+R<=YJ"EtDBYhXm}ľ<)j'cB2_ѕnʆA'͇,aN9ٽ,UM58bP\vz/9D閭NbZ[zZѐ /sW6'#qUn첀*z)TQ+3(CiM p*$ WruQCgN6?#G}ɼX:Җ̊!_@L_WoswLsN6KrT4?'2hT3s.ϽĘ!A !H#-)[7%46&re:(8=>ʟn|R  x0 e-<[U*sR}|ͻ <)èC%fA9J4`ԩJ1m c]۩LUPS':PIŰAlBTzpԂj3[F* MmRrΘ+Y&$Ҳۚkvniy'*c.5V&=@ZQ'%]A䋟R 54(Kj J !CP m?8}צHpn$RRl 1xU}T%q3*E]qMi2mŭK'm ֭1q-\}/oK1ⒿsX)d믥Y% oE.~t(OI_s$-H#o bA,kcP2 d)ܣ'H2CRV}}9mى*)8ꚧV3 2kYY DߞWBL漧RNUAPD]a-FSETTCa"2^Sex^Ft4=e'Ж9OEf#0UDT2ZkJ;q[U0M)sTi8nEućh=\<|fB^#6Z}a\Cdls 0Baa9]CXHkQFd ܛOfLf?~ˈH{ܓLIMAy+B/vhbÝFn@qЅ)wa=7|kpuo2?%2JR6nÞo{nq$!-6'sǛn}RxHR6ͬM"qyn >ъn`AG&-q WE_NM 3L*9]3v!A%jlF6+{[?鍸6l~EߟG25ci^B9%9}> >&9ho4#oNӊVs笧QL51VhT@HiŤ@%*M[J @̔N̚\i>>_FjB9 ʪ*:%e=Dja4N#/4œ\*1Q.'eN<< q6trÅEV*N-kfG=s:x:W-XiYrt84ܖj*:֖[ an%hJS}Ԇ؛FqdɆb}0AQSQ̺U"g;l 6誓)BTGpr4gM:Ky~5nOћ.KOǼyKtHe n[[WVI)U9Ԛ4M;.{j%' :1 :d)֔d8ےoTpIs0$rTš1 r;~te|Q9MG&h*{[ztR!A\HqҨPUCF_ fݥOnĔm .%lKI~Sz5ZʹZ%u]p~.#52[\ڧN$[͑h׭tífٵ͖r$R}Շ]rcR[-eL-m{e2TFTAIi2L $"+v7CɒXj9Nr;u9 Km8)K8wKA?^=Otz-fvLL|ʮl,y L|޻W*W~~_ 7)k(aǤ-ukp,-Ju*q-S)Sb uFFB;%U=bOdl|T&ӌ'I@aり5ljl]iZ@$6MF>F1iKqqG([/zqGHʚ*fT=I[찖۰ '7"&.Va&/4lKeWB C<;_RsD@S]=^;ϔjbhVne1kS6+};?B٧6 L皠LIeܼȧ%/ʖb\2ut-[KngdՒ\jӪ}% ENiiKMܤqW?qg-=Qe'3j 5 땘Z͎*})| B‘e6VBěƹsr 39N޿M?ulMU_RMCwqؒLᇿFUY;3dgWs|"[i=$hԥ\SϨ`%d ؙꓔ5>Fnb#8ævIu-De(!:]SR}MmOS"ex4Pir,Td̒ԅP6.ᖔZ n|*Kޚ;+e0˙g-gܥ`gjn;򝎨mT=ƚ@mBC*A^@Zݺ 㠓ֶ41ꘪ[GwL0pE hhI90RԵm[j'tP)68j>HU8?CknEdZ;`T.qEGŽ/njpj+2eqDVХ0yH8,US1ِ$BG<[Ynb:[Cݐ)2nqCHZKT􈲝rJc-7$f7"kJU>$XJTH%`c܍:d¦˂"PĨפ)'j I5̩ZԚUa,%ѹ֥^1pT{?񺻵  Bscqf,seSeic-ɲ"PINY+'qۉGW2%g%Ou4M."l8JJ@څBLrtXΎ֩%ԛU-Ę.1a*)Gj Rl,r匷C a*AMI2nAH* ݻ\EƨAȬWmv UjA+SPTJPPjg+ ZQh'?.=JcH S[!@uFPZ7L¬hOP3,=ݲ֠BJB RˬugP"?35^(OjMEɜl )7hoVҒ6Z$sUN2lɒ5jl E4WY]uwF:\H{zc9(a4[!DJR)>8J?zyE6 Iͽ ǚa!PRTEł+yӧ=EܖT.i&%.l Hv6beRTutۂԧXIz2.rzcmJWAWQY6M9buڟe3ĠY!VI؞@?0V^R0A]ʎ.Ln a=UnjoueJ͊[T6,YH?ġʅsTv:^F)! )ԁr,UIk.¨ S`V=vC ,&B$IcU%W>:~l?oVnYG3~H %++;vm$˫Z޼:UJm:^Z§3YY: ) ɛOy␍ .!Xq;߯ϯe̾#"DX0V*!w/wbwYViJn=,c+ Ɍ*ל:pRΙzjY72ۛy_kKT[iDZYW\nGzufELYTRJOL4 ӘR<Pl*@5f3T~eT*6Sܭ6ԍ̓fI.M.^$v+PcR:1q%KnPҥRZqt Ddiőꢊ<?1ScFYq(aSaeR[״5B2%l:^dEgV2U:Hjt֚& Cq!KKo7b>8ьWUiXdr9 ["]P~2JvB9V>p|"@~mk#PFcADA )_  rUznɒ^, !? ̀ z<|5i2]"tհhZ# mCuʒE x ,$0@`'qJAkSԘk_2RݦzfيkJCm ^M8ꔕ[~fTOPӵZe^B ̷>(% 4akP Rh}Ey[Χx6y3vNVXXIie4S/hkQ6G}'RfܧNTʻ&ҙ%eG[-JZn1wl`{Y@˸Lwϳ􇣋;+ vzT66T1k%#6nS.e-b3TUML2yMS#d܎2B wۀXًvgj.(4y~,yɑaMe] Bg]Lʇ22 FݬȼO(7sYAv?UYs<&$)1'2&Yqw P]J/wƫtְخ5[=Vo$>knJLˢiKaN|{yǧuC6Tyi%N)G}q@Pu8}q]K$ON*.KlB^n<$2A:~4#1fL-IoyB7D"bUY)2vOm`‰G厹-f#c][D:*ӦyL3!|IZM[pBq"t::O3n]y!.:w]h X>.uC(N 84i,1ex$*_{b+LjFm{69MM %fzp"+M ZmȜnnB~(iQEe4¡\]Bfb3&XK .!N\Wm͖Ʃt7^UeQ\a Jszl珉 ? I 4*>C:&W!jP dl(! V2IY,UkmIJ}qȨskADBIdfaXID NS4bƃ  łIX<2.RQbUjK,(/KI t Sdfit*FAKU۫lKkJZШ%]6ᰖS/p'p+X$r&꫄E43*nhys/gR2n>4ISZ[q6K @RHJbڤƑu 53Mb MBqSe*ٹ;PRv XFt&TS)T\~%~ ݩ6k Q򤓋33h%\ٚk:n .F˭7ک eK䬤͂rJjjJEBqOg֩^Tsp.Z7#rAzܑ&#$& kj A&ĭBS'~NN^v:CtKV`kQ=ͤۏ`EᜫXeB;i}ݘ AiJkUG'KÊuTRzpkN#'))? ZSgToEp0"tvəLz Q+JBpXBܨe$f QD/ˀCjG;,29%C]R/|)7>YThW]cEju A*-BsKO>>.x Sd( ZPz螿˰M eW)Vܮ7pTN|yKÛi‘KrSUWz8xH$/ڒEq)Uf-Ħ4w7qIsjʹJ n7ODJZťfT򄩴b%6;t{u J]`..GM`kL:IUtW) +,(cpA#yT|MqfήDa7'r72)"q/TFۭi⪭[:D6`QI@خލUJK rS0 WBbTѸʿe6-Wɕ]ONcMr+1./vak!DڠlNhV]l5 z͈ӼIRT5y?rU?-ܕrR3׳ee \ۦVlv%KnNm)*uIX n, QE# U"CkӜbR*'b-sKj"YlS껔Nq<|%D:m˔:\*=6j31 <.~ 7%'-)ڟNON~gF4h#֦ 4|Ɔڒ*,ܢBRP8>(£i^TMRyi Rm/I(J@!M(i⃩RE2B1=P)8>JHqIGͽ1WNSAׇMh 59An*r_ vm-KߧFXQ]َд)nTMɝ>2"uUeZS43Z#Ht2[e-ImMvXIsC>tN29:-*FW/Œشj*{ 1:0[MNfy~dKdMa.8= rSi6+])Hr^=JV52fuasP]c@꒞y+gz"țN%}i]VE )685g){& j\ +Ig!Ӥ.CeIqh! WuRt#fi7-e"H5ʒJf[P@qN(5'Y8žgAъʚzn\Z̿r]Qe#< !~LpԻBUIYuŴYI;Gg2'L[?XD;RZǷXSA_< ]SFrt Q> G.IiDV)*1 -U^hNfvjlˎdB >R1P 8o3t=3jlTC0?'庴 s§x.)Ն؂R%I~˽$u&Ϯ Oε+] ņw]\gRjRzm(ZPT/$@2 q9 nUe74 04Z22g2/-dYzdyu9E1ϼ K8wK.R^?U>l;%tרQiOܷ=IFmˊ͝h.[(֒JJϔXqh$2Pt ӘNn[NE6KLZq?Z*t'Tȅ .XfڋtNN%?XQOQѼMY buRS7KRSuK8-{Ֆ"UПwea$ۤܛE8(Cݶ,3rš4mEuHa~鱻Enchh1iDςo*qp_w5JȽK{Pb*]Jhl="92S-Xi=2,*{)Vg:DӸjZ|h2LwY8㎨(b,zuU=3y 44p\vTn[m !Jqemc'@ikZ[JrN3K4[o`u-HOhЩk}h=1&9Amٴ6EϤ=@h~~08'*'"ffHskh>&eO( i ^d`%ҦR3&~2ǩ1%ʐ,R}Шp\!W.զ5NtLZ]H}r(8Q\B tOdmj*5R`ꬦ# l BqT\Va[,4hŠp% QFo.ѻ6QpmJasi'akH.!E][n]1ImC Z*% Zף9Q:ڨAnIݵjR7)8XP 6%SE[PgM7ZbHZԜGb&j*fBPkua^guRW:ڳG92T䲈z*hLPBVQ.$˞Q3ݦPu1Bu]ukoDzi\03@{3GtZgl u|l=x Zn[e0yZ-2VJ&c e+2V Pwnz ߏ4%Z& $;%*R&=-_'Ò5EFK4p { s)````v}*4C"4nNuz (ڙ$bxקQRDY2D56U6-$jD?,C_͕suZUFV鼵o+{P"8Ziϓupf:kSaI>+GjEUO8uIFJw\pmn/|zS&Kp!l))P%D"ߕS#Q=זܷTؗlG^ߝH_YPR[A 㵼3_sUd8vnO{z}2fz݋J\PtRܹZ?>ګ2l1aqy~v̙W\\b yjI [ ;B'ʋ1୚ԣIB6ZzKIJAܟS}#EWQt6ԗ_G7WvcU5Ar`"+%K£Gq%` yÕ:s5i! ksK66|&IW6{{/sNDEAMuGq)cҀx>Sp~^eL&9NM= ^wnviD$>6K  EN-*ǯ1(yk)/iz-L\T)s"y@|aDN/mԢ|~鶤9U%M48$ѴIPdΩljƤERj!ƪՔc\) imbK`{+J#*cSښqc| VY[&$ R犄 ,LZ~\d!"Sۄܨ$}2f?U%JNBZ,BN˅p{86sTvMe);@$m qRcP.\AEf))V_kn)TUBe\cnޕ:S#)ft*(ۋ77%#"72m>~ҳmX-ێ%ƍ͝JA7$7g9R^ʳ+VQeԂƅSY{1 Plʻ9 5%-2Vn- P MXk_TiYkCaHөh:%ML2^BecÄ- <sF }8H閣RWTI\:#7bB MyfYBztfS|=Ɠ~{_ezz q6j,wy_~M$JF˜AQ)r`|k_5o4z,ϑy/LadEBK$8IJyc[ 1Pa&a,,zW1 'ݛ7UaM;"Zj T e]Y !I$_ԐH]_,fbTV@[ꀎғG7#Y Gi3gN<$_xnj_vdV+:3Ta .qի{1IaD+u m6~BELi$TRДم%p`lX[Leem6my+/ؘC!7C$sadܜcrH. !AE-leK-Ɠmqa ۭ q@JF> z|,}E~SkQ+}-> Ff2"<"hr.kV #Սe5G$uHSiTSJd mܺJmӲqBfITb;YƗo[ z}1~Υr5:$2pUUʔ-Sra8T ҆K*ov~߷C`d1pihԞt9NqMVs~QYF\c18iRorg/N#Y&6^)W&@C˲YReIBJ[Cm: Pm*~zJi^xTq* ΀PWn~ ,pƷ4*u)PՍLYRz3+46R3N:iо] )q :4ٖv:ƽ I< 2J騾v0D实g6Qzɕ**L&5P԰)f}v*)SO*< eo/3dϙL]RMrM H৛uurz'xScJ2Fi6U1稦GEfghyd@b@ Q?B^P܏][dKY>ji?\74ݲ#k[Ϩٯ@ǎUC),ψ[`r@RP:>be4f`L]HqIJeD,o' >4sN35_K/֍*ֆfޮ%.#dgN4rfD3R;h+lZ.4($6 &3^Tt\q_i#,1YMjAL#JOw缉jH ? yڶy#h*6;=2)-z2)1\pM@[71|A{ǹ|/56xp͚{#꽲aq1fb^9O*jlOw%`K+ D%VWL_bDJ{햢Qp'q.EHf)SX[+SEDVbo9m &6Jwhឳ߮Yfc 9, 15˦a&a&a&a&5K,Z%PI6߮67zw|ڗq 6UibQߦeT_@yH[TyOWoYrCNJTxssK4X#46%Oȏ#ԩ0UwU~S+gRY<&>XBҺDXIJEeM,˹jSgQJS%^>kw9erDNq+Nɵq6/1F*VRdK56a- mIĎE$H$/`Z ڲ^*k+,=\-ew?lMQ1YҼ.aʙ[*U[z6^*GA^鞠+޳K UopR\.@7_V hkZ%HH/j2 4<Ř+ԧTX)mX{7$]VL-ʫ1bJ;ۈj6H좐x6)$?39uYS+nH2 U)~۝@)*P7yrjFD,Й8U)TTB[D5 LkT74.N-m? O ܛn1ȟ\ZBe%@NRax/Ki R%QRYmE $X-JJFu>U̲ӕr,p>>1\+5OUc ͦĦGZ NO|_>j9j>.L`o}M8tsBԔ76yy*ɕg׼OÑUT -%,93$ǐN㔎IBͭ17W)4x>6HVE'+R~R'MZuiGmTgVm{9VS+SqfϫDQJPY f$@A:jt(2'<ݒrF.}qLLfX1Oؘ*R ^)#\یZxyW VKhUKxSnv^ sG>BL+Ǯ6m6Z$"fe{Zмu$Pl~8XXNpjٛK*M>Bղ򗷶B@qu Q7i!NFh$:v$%I< G:S="]*a)lG曤 q-CZ Lcɐԧ%lTArm8مxHC:.{1EJ7Rݔ˕S|h8fIU1i+~{6q/ ά.C2C74q#YLŲy [# 1Pa&a,RG1ԅ<́Vx8vKO3[OyA%Ge ה@MrD^ɰZ[ f%G F8}Vf$ܟ66`lX݊dF# !HH 76xji ?yܲӲ5Z۫fe@mi tq<":=UDaǭAڞm{H;?R 8a#u/c7|j)tW@sb@dөmOr=RoE_Nķ0RU'r.]$7#QsKe4yHBW7(ϧfwLtɷa4h Ssq{c]fp烾u=i䛄ZJ*ΰQk죥r*LVl2 N;A[R$ Rx3/=]6lL0w)qi4A3Qa:]B[r_.C-?P3 WCTuuRKLXϊDyhqÍ,\-c4uڍBwU̖=i2bf0eR!ԡxMoͿg\aCL@3f.`p]?c ՎV,NkCJi*Bof\zvslj_%KSNe!Ǹ9RQw$i$$)jڡuo&tz&eYdƑ":eOd%,U}%)Je) !^lU/5'/MJӹ5gu7TVTʂYqE{w)VYVeB]iY5Ek0H-) bmMȦ i^tOAoZ͙TSiVWY˵IBdObv!*JaQlYd" TvDieYٛ:;T͒z4Z!@+܂N3Q2VQ?ZLSYתcQomlei(h$҂z iVZ&qJF˲W>hZ#RUܔ#֞)/n꼴vQU쵮{q8pi['@ Yt&c Lሒ2g+L*F}#?%պ㤼չWPeϛ'JM`5Hi&cbKt(G/kUsUꪝA=VFң/rE'OzFɉI) ͒0Eڲx*JϪ8N6HSv1F,9L{9JLeFih7eCϯkZLk9jZxxȠ]KsH}@XG9F-e Pf*5GqƜ6ځRZh(AR/4=vn}'/>ʨj4ˌs-`=-^#wŧe1IPX[#ںl{X]9fsؼb3Afa^a0 0 0 0 1!Qzɋ uym{TeSn1Lk3r'[Ѩձg߈ml&hEmP ~%p ?,^3Lv)Uע4TDn X1`gLi£qb R8&ŲH~tWJ{m$p{qS)r"i"*T&y^)`x➎ٯ ;.$.;D)H+KX o>)NۛRBOȊZ4->0׌rt:;Cnd"vlItBmwFg+QDڵv-%%ɊJ6 <,i.oi& [ɨł Vh֦+pEX]cs~H(=QfLJtw K%$#rV7$R W7![\_\/@wK{y'\FiI3yn%*S6_N0 5K(K5%hMz AS~ 点}Z4[ki͹c(etUvO~+Sv4Ep` KxP:Y[n{MⅩn )!"XO0fٱ'"2ڙeݡb66W_Yzj! N^SB3@kq*=ZfH[L5!V%R A@[I<X‡?J3O܀>w\I Y[U>OF}K"ڃ̆!+Jm=Ԯ[zӮz-^HnDB\T]iI ۱ ϲ `澱)n#*M-j/p{@RŦTT=i.)T)eyWK$XmHı}7auJ%WYyaQ*%C^q@}9’O"AJ%#8 K,.Q2rort{8V$AiJb XAR4h]8*y~:Mx@r8ji799OiYMa=ؠڏ!)clt NRzZ'8H-iy$1;"6+z-BeFCitvRm@z7Z@ߔ>F>kiƉ%DTN-Q[Raqo7뀾.) O$p?]PԲ-.2>4=[+*x*E~lr]2q7KBL,/[$<yq54FdkDwZA>"G[-bÎ[q$$@%I>}y>O2S{;%;&,|X_~g~J6ݶc,4vC,t 'qW|dzD=g͢6aKvz@mCkv67$s|ZEհQ*PвܧozI*))Cl%ܸYlnQ+>n` BetTcA -ڇ!*p"䄪 zjQE~kuB[J J>4)sby.[ՠa?(G@d~*aU*eseuK[!J$ߑ䏕aņ.yED >lN+THSG|"ص;)}^Fwp&&#*Kmwxો ێ-uY:*kˁ 33@5P#YJ5g-> ?81u8+sN\]4 ܐq,EǟB=*aCxm{xY :R |93Q6f{5a)I)6ހz&|'4VvD-H\>XQnTqe%W6HǑϏR IkSzm5 g૮j~d}l:E6-{w8=-uyف,Z"+@7MOH?vH+~*55xJ쾡6$%vF狏OSꊉvlun!*P$ SsGk^g5!0gao.A0 0 0 0 1_0?al]gP$[ *~>V5DQko8ʹyH8^)= ܌wJ5VBy7> M )|l>ڒ6lA\*>r/!R ؒ>gcK efpzkxdieA O#Ϊ*-hS4J$,MW.A(n@E)װ\\,OZH\rۉn;Vd8lO$\0THo%"+L2[Rc8 "75u??SM 2J %nnnς/f qK &s6r2=# Hq(ZɩEFթp JB_hbwy^.MP;jf>$|6{1FTӪQ_4pGϦ<; S+ :(JrO?-j)R=}9‚xn9#:*>\ˉd ('k'0\URCd b;U}ݎSeE&'uLW}Q[)oQMK"`*\^׷ml2[eH o 4SDWqT)n?Aqg^SkLvY |~VYHmL2Y?2nGg?):δ|ITC` 3JrV_ҒQhRP*܃o r!X~|sW CImS$Aie*<'v#6FGN#bWcd0 #О-{bZ5QOI*"LcFO3!r@O KY?0ܨtdmHnak'VE05 a"a"^LktO%.~}ٮR<=OK1RH*T\[g&jlkԪt&lݵ!#Eit2[QR&ytS%q"aN}}F5aJ!{Dc<)[fnGK~^tl4+ͦH|sc((%&{ƥ ɫKްPnZV n9AnjsOmT|c6LyHQ%Lpk̈& ⿱{d*gގz•m |E@~ HP}=}/OMy%*$Pp?ontÑR{Ӵl<_4OߡYu{kQCJC`8{~F\iAIq#E- ܖY-5Я |[;|V;'yޱ ̽."C[;I6M$q{*(䴶KL] op|2ג ؛H&pɍ#jh'|H: 1jҏ?*|F2F4w HJ~`l|Lu'%Ȑ˻Jd)$m;x7OgOO91K"Cgྜ2c%t |bgyO^ްM [n$oϐE1_Z[D\JJ92jsFV~?ӎKqFԛ%>BocZЮޗ#{1V$2I!Kܢ,/‡#chBAJǭ\\O[c3UNIYT@-MtߒRh 珗cQwT.GDAPNҢM6mk'Rlm;TM2=;d{6>I(!@RGK|[Oǯl/~_r?b6i7rAa\[IoZR~2o/rVW2MN4)E'% Ď'*Э( k4j$iY ϒIljV&U.!_}}}C.9N@mW%^|J֊2_7# = J4?bmNƧ:\yB>Eϯ3 7)IIc(aᒩ4462^Lrs\EIU/gD7֦{ y<ǵ^a=i````oTUPan'ʘdNzYWS̴}EhEBT.ܔ4Is|wYpm*)kEZ\Ъ 63e%0ͭ_"-ǎQK %ſ&$EAMW"9}#.9IFf}%qkoJVếʪ c)1aOt5! %)Q BEEmi\Pu|x>F>:Iq(ZkqV>oSl:L,JWAQѶ_.T_8@v#]Ey;n뎰CϯHCUW[Ǿ}.o_:2KR n>zG\u4tt3HoIԋfןMc -"@t-ږE`1ʪ`2ԓkqkmqe{:LSRqk@7 Qd)pڪׯ3a1}s66MEf Fa ਍pA#!N'Y U3?# :)x[ݸǾ[a1.5RD;!Wɷm8BIq ,:6EFtҷ@O|dkJ <,ZV{3/S0ŏ6?m*eJsq$tQ˨Sh@S (lE'}F>= F%Tڅk0efTx 47qF?!4v ZߗqbCҬ6ChM@q9po_7˒u3҆;d8oV)T8I(!?!JVqioTaJrCXV{_3V=xa?JP'J$*'éLa|f(HLvzФd'Lok;ބ9!S”@pen>X%{O~bNj^N+}]d [LT*EuiT䥴Js|Xhm okL,ckR^aba"a"a"a"a"a"c4/ ڍS2*;''V)OU~tvIOjCIn"doa}JRrӇL9#eǔ3Vf 5*蒧&,<]uS 6ZWl*N{Y4ʷ|ӞR3 O%Tˋ&y2ی4͝qK6PCaDVtO53gpS`ޟ ^oj/ȧ=JRcfj RU֒7:m D"eVu,SuP5Z*ԙ1ڌv晴\qDd%JQYZixtɞT:sikRzݒrES̎^fLȫ2"FmX;_KRTE2u<˚=s^sTdl.E]?X4}LiىNvLڬrJ|ƳTfPRԢy$:q*AR/e  03TT˚_X(Qsw>Qb"H-:2#ꌩ.Bq)e)FTStT]+)9`2%//}}@"2[arVг2֓&EbLQ6 e64Жu )u6@qA&ugcjvDlǦ%s~B\%) R-ޒڅ6LQ@ۣSVPɫ>aiw8T/M.{rIM[(Be;ӗt(OgV-CƜOh[ĦsI kw8:+ 0 0 0 0 0 0 0 0 0 0 0 0 0 01ַTN2PSL3^od˵N1_jgot)܀*3_3-W^ee:M^M5Lf5liKaƐ>X4t8hJRsTҬݬz=̣z+Src@*u:l~k*BPJnLzGW+JrKL3%QZӄUUm"HuS-^qB \n@Zjcfv*8i[nFm{ nWmχHye>cc2UkicXf1J^Tơ+VK _Ì^H5EZ?W˙?Lt9I;R^:ܕ,4=C]搠BN@3K܋ْZIi^̇*bfL5U(3e4ͳIm/oqlhX-ӗ3+xRL,EA%]*|qn@Ӯt!ɇCs)jnW89!L`Z-Snbۡ 0] zY ())@T Viӕ:d i%˵*:ҒqLBR:Am-,mz6[M[ѤAԝIVB_l,9*~FYR{U2ަ6^ūzTNtC 2" ]EK(Գ|_ѭIuCt!t/cwCn#ZO1}PѮV?AɒR^MgͩS6S6MRPiB2[7}mt^8}3SD,ϔs5v64.Cš3%qy!nB@*HHuYD-peUU`BD`2^ݰ9!kαSYdѩf(!>]hO9%ad"JP|[V؉7 ".KuG3~nԳG4 4TTCq)pK]â/y;n3>cu,ClF$I9r> ;)Wn*, 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0Eѡ*D}B,i'2cHi.!hZRTAXADž?şJܪuD CamlImages

Contact the authors jun.furuse@gmail.com and Pierre.Weis@inria.fr.
Created the 7th of February 2000.
Last update on Fri Oct 26 2009.

CamlImages

Version 3.0.2

Objective Caml image processing library

Note: this library is currently(=always) under development.

0. What is CamlImages ?

CamlImages is an image processing library, which provides

  • Basic functions for image processing and loading/saving various image file formats (hence providing a translation facility from format to format),
  • An interface with the Caml graphics library allows to display images in the Graphics module screen and to mix them with Caml drawings,
  • A freetype interface, integrated into the library: you can draw texts into images using any truetype fonts.

In addition, the library can handle huge images that cannot be (or can hardly be) stored into the main memory (the library then automatically creates swap files and escapes them to reduce the memory usage).

Additional example programs are supplied in the examples directory of the library:

converter:
a convertion program, that converts image from formats to formats.
crop:
a ``cropping'' program, that cuts an image to its edges.
edgedetect:
a program to detect edges into an image.
gifanim:
an animation program for gif encoded series of images.
liv:
an extension of the Unix ls command to view a set of images. (Also considered as a light version of xv with nice slide show capabilities.)
monochrome:
converts a color image to monochrome.
normalize:
normalizes the colormap of an image. This program anlyzes the colormap information of the image to normalize its brightness over the full range available.
resize:
a program to resize an image.
tiffps:
a program to output a postscript version of a tiff image (for instance to print it).
ttfimg:
true type font dump program. It can be used to create fancy banners or buttons.
Try for instance ttfimg ../../test/micap.ttf -message Bonjour -fg red -bg black. Visualize with liv (of course). ttfimg also creates some sample images of true type fonts. Try ttfimg -o sample_micap.jpg ../../test/micap.ttf.

1. Installation

Get the source tarball, decompress it, and read the file INSTALL.
You can also access the read-only CVS repository which contains the latest developing (but not yet released) version.

2. Using CamlImages

2.1 Color models

CamlImages supports the following color models:

  • Rgb24: 24bit depth full color image.
  • Index8: 8bit depth indexed image with transparent information.
  • Index16: 16bit depth indexed image with transparent.
  • Rgba32: 32bit depth full color image, with the alpha channel.
  • Cmyk32: 32bit Cyan Magenta Yellow and blacK image. (Unfortunatelly, beautiful conversion between RGB and CMYK is not supported.)
For each color model, a corresponding module is provided. For example, use the module Rgb24 if you want to access 24bit depth full color images.

2.2 Load/Save image files and other fancy features

CamlImages supports loading and saving of the following file formats:

  • Bitmap, windows bitmap format (.bmp).
  • Gif, graphics interchange format (.gif) (not recommended).
  • Jpeg, joint photographic experts group (.jpeg or .jpg).
  • Png, portable network graphics (.png).
  • Tiff, tagged image file format (.tiff or .tif). (Color only.)
  • X pixmaps (.xpm). (Loading only.)
  • Encapsulated Postscript (using ghostscript)
  • xv thumbnail files (see xvthumb directory).

For each image format, we provide a separate module. For instance, use the Tiff module to load and save images stored in the tiff file format.
If you do not want to specify the file format, you can use Image.load: this function automatically analyses the header of the image file at hand and loads the image into the memory, if the library supports this format.

CamlImages also provides an interface to the internal image format of O'Caml's Graphics library (this way you can draw your image files into the Graphics window).

You can also draw strings on images using the Freetype library, which is an external library to load and render TrueType fonts.

2.3 Class interface

The modules with names beginning with the letter 'o' contains the object class interface for CamlImages.

2.4 Image swap

When you create/load a huge image, the computer memory may not be sufficient to contain all the data. (For example, this may happen if you are working with a scanned image of A4, 720dpi, 24bit fullcolor, even if you have up to 128Mb of memory!) To work with such huge images, CamlImages provides image swaps, which can escape part of the images into files stored on the hard disk. A huge image is thus partitioned into several blocks and if there is not enough free memory, the blocks which have not been accessed recently are swapped to temporary files. If a program requests to access to such a swapped block, the library silently loads it back into memory.
By default, image swapping is disabled, because it slows down the programs. To activate this function, you have to modify Bitmap.maximum_live and Bitmap.maximum_block_size:

  • Bitmap.maximum_live is the maximum heap live data size of the program (in words)
  • Bitmap.maximum_block_size is the maximum size of swap blocks (in words).

For example, if you do not want to use more than 10M words (that is 40Mb for a 32bit architecture or 80Mb for a 64bit architecture), set Bitmap.maximum_live to 10000000. You may (and you should) enable heap compaction, look at the GC interface file, gc.mli, in the standard library for more details (you should change the compaction configuration).
Bitmap.maximum_block_size affects the speed and frequency of image block swapping. If it is larger, each swapping becomes slower. If it is smaller, more swappings will occur. Too large and too small maximum_block_size, both may make the program slower. I suggest to have maximum_block_size set to !Bitmap.maximum_live / 10.
If you activated image swapping, cache files for unused swapped blocks will be removed automatically by Caml GC finalization, but you may free them explicitly by hand also. The functions and methods named "destroy" will free those blocks.
The swap files are usually created in the /tmp directory. If you set the environment variable "CAMLIMAGESTMPDIR", then its value replaces the default "/tmp" directory. The temporary files are erased when the program exits successfully. In other situations, for instance in case of spurious exception, you may need to erase temporary files manually.

3. Miscellaneous

3.1 Examples of use of the library ?

You can find some examples in the examples directory including image auto-cropping, resizing and an image viewer with the lablgtk library.

3.2 How do I organize my Makefile to use the library ?

Put the following line at the top of your Makefile:
	include /usr/local/lib/ocaml/camlimages/Makefile.config
The library directory can be different, if the library is installed somewhere else. The variables COMPFLAGS_CAMLIMAGES and LINKFLAGS_CAMLIMAGES are defined in Makefile.config; you should add them to the compiler and linker options. A sample Makefile is available as sample/Makefile.sample. camlspotter-camlimages-e471b3c4470d/doc/old/eng.html.in0000644000000000000000000002161012405272062020761 0ustar 00000000000000 CamlImages

Contact the authors jun.furuse@gmail.com and Pierre.Weis@inria.fr.
Created the 7th of February 2000.
Last update on Oct 26 2009.

CamlImages

Version @VERSION@

Objective Caml image processing library

Note: this library is currently(=always) under development.

0. What is CamlImages ?

CamlImages is an image processing library, which provides

  • Basic functions for image processing and loading/saving various image file formats (hence providing a translation facility from format to format),
  • An interface with the Caml graphics library allows to display images in the Graphics module screen and to mix them with Caml drawings,
  • A freetype interface, integrated into the library: you can draw texts into images using any truetype fonts.

In addition, the library can handle huge images that cannot be (or can hardly be) stored into the main memory (the library then automatically creates swap files and escapes them to reduce the memory usage).

Additional example programs are supplied in the examples directory of the library:

converter:
a convertion program, that converts image from formats to formats.
crop:
a ``cropping'' program, that cuts an image to its edges.
edgedetect:
a program to detect edges into an image.
gifanim:
an animation program for gif encoded series of images.
liv:
an extension of the Unix ls command to view a set of images. (Also considered as a light version of xv with nice slide show capabilities.)
monochrome:
converts a color image to monochrome.
normalize:
normalizes the colormap of an image. This program anlyzes the colormap information of the image to normalize its brightness over the full range available.
resize:
a program to resize an image.
tiffps:
a program to output a postscript version of a tiff image (for instance to print it).
ttfimg:
true type font dump program. It can be used to create fancy banners or buttons.
Try for instance ttfimg ../../test/micap.ttf -message Bonjour -fg red -bg black. Visualize with liv (of course). ttfimg also creates some sample images of true type fonts. Try ttfimg -o sample_micap.jpg ../../test/micap.ttf.

1. Installation

Get the source tar ball, decompress it, and read the file INSTALL.
You can also access the read-only CVS repository which contains the latest developing (but not yet released) version.

2. Using CamlImages

2.1 Color models

CamlImages supports the following color models:

  • Rgb24: 24bit depth full color image.
  • Index8: 8bit depth indexed image with transparent information.
  • Index16: 16bit depth indexed image with transparent.
  • Rgba32: 32bit depth full color image, with the alpha channel.
  • Cmyk32: 32bit Cyan Magenta Yellow and blacK image. (Unfortunatelly, beautiful conversion between RGB and CMYK is not supported.)
For each color model, a corresponding module is provided. For example, use the module Rgb24 if you want to access 24bit depth full color images.

2.2 Load/Save image files and other fancy features

CamlImages supports loading and saving of the following file formats:

  • Bitmap, windows bitmap format (.bmp).
  • Gif, graphics interchange format (.gif) (not recommended).
  • Jpeg, joint photographic experts group (.jpeg or .jpg).
  • Png, portable network graphics (.png).
  • Tiff, tagged image file format (.tiff or .tif). (Color only.)
  • X pixmaps (.xpm). (Loading only.)
  • Encapsulated Postscript (using ghostscript)
  • xv thumbnail files (see xvthumb directory).

For each image format, we provide a separate module. For instance, use the Tiff module to load and save images stored in the tiff file format.
If you do not want to specify the file format, you can use Image.load: this function automatically analyses the header of the image file at hand and loads the image into the memory, if the library supports this format.

CamlImages also provides an interface to the internal image format of O'Caml's Graphics library (this way you can draw your image files into the Graphics window).

You can also draw strings on images using the Freetype library, which is an external library to load and render TrueType fonts.

2.3 Class interface

The modules with names beginning with the letter 'o' contains the object class interface for CamlImages.

2.4 Image swap

When you create/load a huge image, the computer memory may not be sufficient to contain all the data. (For example, this may happen if you are working with a scanned image of A4, 720dpi, 24bit fullcolor, even if you have up to 128Mb of memory!) To work with such huge images, CamlImages provides image swaps, which can escape part of the images into files stored on the hard disk. A huge image is thus partitioned into several blocks and if there is not enough free memory, the blocks which have not been accessed recently are swapped to temporary files. If a program requests to access to such a swapped block, the library silently loads it back into memory.
By default, image swapping is disabled, because it slows down the programs. To activate this function, you have to modify Bitmap.maximum_live and Bitmap.maximum_block_size:

  • Bitmap.maximum_live is the maximum heap live data size of the program (in words)
  • Bitmap.maximum_block_size is the maximum size of swap blocks (in words).

For example, if you do not want to use more than 10M words (that is 40Mb for a 32bit architecture or 80Mb for a 64bit architecture), set Bitmap.maximum_live to 10000000. You may (and you should) enable heap compaction, look at the GC interface file, gc.mli, in the standard library for more details (you should change the compaction configuration).
Bitmap.maximum_block_size affects the speed and frequency of image block swapping. If it is larger, each swapping becomes slower. If it is smaller, more swappings will occur. Too large and too small maximum_block_size, both may make the program slower. I suggest to have maximum_block_size set to !Bitmap.maximum_live / 10.
If you activated image swapping, cache files for unused swapped blocks will be removed automatically by Caml GC finalization, but you may free them explicitly by hand also. The functions and methods named "destroy" will free those blocks.
The swap files are usually created in the /tmp directory. If you set the environment variable "CAMLIMAGESTMPDIR", then its value replaces the default "/tmp" directory. The temporary files are erased when the program exits successfully. In other situations, for instance in case of spurious exception, you may need to erase temporary files manually.

3. Miscellaneous

3.1 Examples of use of the library ?

You can find some examples in the examples directory including image auto-cropping, resizing and an image viewer with the lablgtk library.

3.2 How do I organize my Makefile to use the library ?

Put the following line at the top of your Makefile:
	include /usr/local/lib/ocaml/camlimages/Makefile.config
The library directory can be different, if the library is installed somewhere else. The variables COMPFLAGS_CAMLIMAGES and LINKFLAGS_CAMLIMAGES are defined in Makefile.config; you should add them to the compiler and linker options. A sample Makefile is available as sample/Makefile.sample. camlspotter-camlimages-e471b3c4470d/doc/old/fumicaml2-small.jpg0000644000000000000000000003505712405272062022416 0ustar 00000000000000JFIFXCREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 95, Smoothing = 0 C     C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((QE(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Wįi>,׾3kЯ/Ȭdd:adpwː4WKf"&'UvBpg,?yVo,qkc&F0A<ѐzg?osK7ͺU]KL{Q䄳6Ir_\Csm;$i# S@`CAp>r=j+;(bAY^L߳O"k;Ebש! yUa iv{||FtH"r||]ɧ7.lڔN Ċns=kZ5~T6٘ 5j? <9DX.4]|SX|Uv=7AiH#UPw+mA'>6v-՝r)$NXz:ԕǟ{வņG-u6\8IDr*BNRTA C[=f܃ݬsFG]C@?O{|6!kxL/|OF/l[z7qLV?:lk[ rO}skgC/E^BCh}ON9vg㟈~cH*?2Rֵ`3$FH| fڂ-Vr/ǡ:נKG1@ 0>C'_>|V4/l+Dk47Z,q6N%S[jc7>)E/)Khi׀f=1#Ы)(zQL((((((w=|0ӠK8m-mɑXg/ҽíkvMᤊE!`c|MujI$i |Nzpg |M>x'ŭxMMhݠyQfjVbඨ߳Oeo qH_ss*7:~\_o-|MjmtMxlz,zoݐ$6T 1#;|Y|ka7>o ϥ^I˸Hd7Pc@2^OVi;M!f5ko'hql .1ٲ `W/U͜:=VFTdhy/ &?~Upwqw泺Vijon UC:΢W$*{c&Ӛ|&~6GFN)>f+qn>Yn2rG!^[~񆳢i!.}AFgdR 2}Dej=V(3D |{WH xo_4-h4WjSv6~KkRq(I'vRjڛp=~ׄ⛥(RRj՟_H]oú yHF !`1c%S~Rj%xń#W·3`̈9OU#<!eVY Db==Gx_ΛO״SK<%m/%ķM E'$b@lAVQ6Bf~]sJ0x|x}E5OWѹhđ1DyL{"Emx᥏i-S m=ZìY.FP̡2hލ[ sVX[5.z(,@:s<x ]cvoKlm%̺?{ y|I|CyY6:NQ%W=A\׎?__Ÿ 犠 -^!8N͒*z~&O4axmH`K$2$ fkq6Ki$}}Mee|&?ׁ>4_uoúԶ>$"MޔvG<:M8\ظ' C&(!z>!Gv[v^fx́\:= @ߴOr_iht&A"n`FXP='wglt?|kv-'OSy5Ipb^޽ 5-ԗ0[}e3Bu'$ϴh ( ( ( ( ( ( 6XFm>ͬ1<vލ v#ի>BWʘe9կ6As~H~h|B4/H_u{bc#3mW HP9oJqwC_}jW_fd`uw#3b?-RM X_Sҿ | :B>8o/4 /f\-mavd<\D;}P!W{~+5 u[eaIS'%p͜)=zb͟0n83sέEd)n*N֖'k*[K"p+FWK{l? DVWMK;]_lł"DB> {<;KP|n%k܋*#v*e6:Ǎ|cqn]Ytۯ;?ȍYn6q{=08ɰ^3fuiZ_vqKe+ֺV8Q6*TS2ߖM cNۑ_=Ty ;JhFf$ȪmUDU ]OVƝXxM>bnۣ݅GS̲. eOok#g;vON<稨Io*TQۀ}+kyk<Ƶg*m;nos|m5N\Vm-EdҴki0h׷qxQON [ ^^tOoC>x& 5fyv,`2J]# >'x T\["GibckfC/#Ƹ_O~_QZtۘ핥P|o,G+U yn6G0Kgc M˫Qj2ؼY-YQ{5)&մ{f%^"R? nOFz=֣9Emޜ Ґdbp=_dw#\6MSXW+~߄>БY$B5?4,ǹ8y oj-oɮ3ՙ{KF{3+R=0H"hZ.ABxʏI;RTI߭-8fYIG%Dڎ.[Իk;⟈VG}N-(vǵP ڏ᥷|awiמ3Q,ݢƏd) Flx7OѴ}I Ơ*7YѴiZA{c{n^Z]D9pUA rHROE+\a0_Wkʿ(Oƿ;7{HjaV>%=%&K]:]r!]UiQb ~U'ƣ+ZD.dZR5U ݠ wou_/ǽ$³ <7o +;B}DI_xl gV$-xI3p kr;DA3*MzIdٔ)R˩;yZ9l^U_C#|YSAs/$: @CR%~< g K?z*E֍yI$"ͺ|,D1%$>|+ HUK߼mÙeEn[Bz$h:+ɯaϗ Qbڻuv^woT)֍E;[y&| ssi%LJ|J-X\"Ua"¬$"4XW+u s4w>ВdѭΣ[п~0xogë~%G-ge -˝™y=C9©# fMOK=}.|~kT1~kY.th|ڶiime8 fb:^[pvP۝h:}֥AeR!>?ڋׂ߳< k~ b#{(h\yQ#bDʨGFW>%ygS2?"2u1X?24yn>.Y#G"6U+ci ]&όØKW?54q;'|4btM^P19f$*$&٨[Ag}"%rww:HQm\Gwψ_lt;i Q8@yUǜWq7fs92PvM4_տB~ʫT8ʢRJ$4kWz׋~>-GWTWZC%]\Yݠ<ԕ[˖՚2/$lV~π|7WpMp-%s)=l J]CYZjq˽)#Hg}c\NDPkHQW Z+{)m[q7a~?* /Tu6YẴ&#^0:朮 E;ά&;#I1DOݙ2D*#}+|,qfEKnujJVmwtnH ]Im',{fXFn%R8<\&|›Pc,Obwp:J&E%HD,>`Μ-$Jo eX}w7UVSB1O5E"-ᕶƣg2( J=?Jm2py}D۱03:MoFo-4$T ,WwcN-E?S.~-xgXrjM>5y-IڿC dVa돈xg¿ZNQ{GlѠRamg5-thW|ch}3,u/FtiKahqGJyBF!#%YUÊtKk{O(Լ-Cw^ UC?c]H^+o[$8UY*?/AqD|a>u;^ݼ#7`CE{/ծόw._ۻ \6{'S[jH^vُΆ6 cK~<;]tMeq طK[B*HHRCaB5A^Z[DNT㸯)Xwgm'k۵9+]}]mrPxH\ )[y$ɘ!JmbtAxu7?d߆ZӴtpa(d p_ 4Moztou1 kIR c0U~\_b᜞ŻEυn;[ݥx.W,wwY"2Ȩ_|]e#8[oKun|_,^w*p{vf1xsx^%%mV񾶞\1%mNs-ϖÈ_R+d8_ΟuJ׵o]>{i[;~A`ʯ*.1tѾA[B^h *]\r9hx_wQYN&dqI\Zv4PU|)ڶoFAm٣ w$O3t4`8S1(Wnܭ{[? gMZ--WQEG o>$h|#JP']s9Ÿ*4v6@2jބ}GҀ6ou 2B>ׯ63=gkv6u3weiǪEvPТ:KP %K$f})`.$FKqyT6r>kg[9"[9@=#,x5 o\H,5ndx.~fTǜǝzNjvMixM,- Cz9{\H6/w@MOq\9ǵxg_>3O/7_א< mv-fSor۞GvBIrO,M|_n.",$ѩYNr`敚>VqS^Ƅv4Dż%`QK`F`~^D0;)9%ek|'T䜑֠I-2Ėp9l I]AF2;"p%/*z## T/&њ+=/ LS+:Go"I HuY]]IV¾xOE-;w{_vPYYkztDWn}bFJO( RaN>L^$~jr/t-` n۲eA㿹/c^#j^$\Ll5坉` 1 IL#ibU[O5]thc+%z}z0'[D׼Ku-`vDZW8h$9SZ) ^l-~tpj6/ {e+뮩;eq I߼OoMWLHwVDkFH r%I_3r_˿ymWNH4d_8#-S?AkOpi[g/2%O"GfNRW~,G5KVS}#ԧ6Y01\ĭSR|>Vl$Nd 22}krG=MaF4*;{h4B2,3%D,#qaPX~\ޗW &˽O|'}|OE6V'ˆ$ W_L 6X7Ze܋ˏ6s a>=&S޺4 |%g9WFA nG2)[dp+K CVhmr ©TEWcָ]<,bfPbc򥢟4f}V|?kRHxdV=̭koSg- 񕷍t]Ku[O>ngly6#:3)Q5p%լ$R h䍁VR2#",n AI{sI_ kQ}EW臊ZEVȢx?O{xt> *ظzmq: W#Jp rXʦpC*MZ'-^9G/UM°#׾=BeO>M{: 쒏ҭZ~߳~sa>"|)fz)&dK5pZGU7˒Rᔬqz^uU{)2[H< t>Socf̠,aY9e/#V0x>E'M%ĩ m!HbHI! Eb@htn@42B8hqJm *Vx"}Ak>ҠӴlvpEī y! UU^U>(x cM_z$2ZC CjD7$G_qTF.O}nym}UҡMUb3`qU|)Gz۶ky!ץ>g*j5HlPwݿ:iBJj4Hd?GITujI8A^mjB{iy #_dWQͽR[i 6r_X:|D4TaKQjvhS.fpѻбX.8 $M[?v_>"}7d ԪÃ+^QblҎ֤}.%'O Ym|8|'7;A>){N\ӤU_{C!4G*!tab~‰K| $! yKXD|qż8E}(P+(dK?)#޻n;5wϯMTHṃ[}4@k4)eM9zJwW470żGF`z{ix@i:to]^+/G*Ag8ZVyed٬q;y!{ (U}Z~늒Ěi-.S9Viٮ}EEފ(#((_ᯂ^xQYZy /ӼeW22㟶vkCZ%珬eY ŬW`v96V჉g[mj~$Dޞfx!~g'I[kY }GO|i gU|X3 wT29߿U|j5Hd0RÓګ9`D6I>ծjQ#ml&f+ʩ77qWpo=1J*Jk?u9r ~4çJ.O] Ga_hǜDhƖz&iLz!fi_Қ<3R CWF,cdR][Z}sDy('F쐾sI#Vwu x@>3-t>owy0DUQB$ T5 D\,2Oco=2)gsX?yψ"b=SVdF)Kx;#JIv_oNںWiZ߯2gioק_[  2G51@{u,=5D^ xBP2nt]R7*fK{I@ U#z|0K exf?4 -JIc$t;X[&E |U&_y4ݯ`1]x` RTO'gwEXЕ.UO 4fc8#)? 4xt_ T?`Q92["f',G,Hfs_xyХ,Z)zm~3 VV=X0'-s*0ɮ|/x 3蚤WK ѹUA[x*+]+?uqf<M~J=w׀>xZ[/iog+" yb5xB~/P77=󼖻"٠\cy̾!<{nn|'Ц.wINC-4!g pcO[[[iiEH8Ppϡ|N5NMwHٽ:\[}Q^QEQEQEW>:懥I}}Okۡi>qĐ&I"Hw2x&z0P)$j̨NT椷Z^|8jsn$xa]>c9YVlFA-}۵[;{o>'mj{/ҿ,! fU` [WU ^i/~kkwy ~Q3eJW㙯FN.[ץ7Rh+vyz|-UfOz+SC0j3 a9. "%l$Z|=m{@]ZQɇε>M1$~tUpluBX+VnVwin[_Riy9uۄtyfd+&0F)*\h l.5sd7IkEw~3]7%IIcbż̥cSJ RXz1qPv]t˧Q*w5^7*yN4{fm=-qM.{dbY%^#J3w< .%nnzf_#1q3cOʁ!oݱ$ӡUYqxRӾx^źDpq#Hy$eEY$u_kul>. k&D2IB v)W0Işm [:q؄ yY1f pJ0xŷ8~xY4=N[N'h$C]d$Drci+'mﬥ -mm-4^GʧNv˫⯍z XYxIFh&.`;8dWnzpk>iXBYqisbx[6ׅKt;[]Vy+A{"6ƖQF\&owO m>imP5cO&Р*#TT% S'ui)Ymrqbsoo E.߯˹^j~`&k(u#\q]w8J iP$?Nھ eؖM7Ms%" t y $#S]z /AP=J8"F2nQ_׭:q^1gOxෆ/P#谋*Qn+߱GZ=z0֬'6w24`)Oև?Zx'V:tҫ O[dTM0@ж~նk,/Ν pyc,{LӤmK޵^4&J+NبIeB.yM(z rf b H:r' N+UpBYsҵZUfDq#5&c0đd}jv;Bnt*\]ȝnw}m%1YֺDm .#AXRT*J+6w1{ұSTlb^J.mF(’x5hG=$FnEH݃ڽ wHZԪp’zlH( ( k@=R`:(EPEPEPEP?4(4MR{QE-(`QE Q@Q@*E(?camlspotter-camlimages-e471b3c4470d/doc/old/lvdemo-icon.jpg0000644000000000000000000003413212405272062021636 0ustar 00000000000000JFIFoCreated with The GIMP CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 95, Smoothing = 0 C     C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? I'?/k#n'AbgD "&>aUJ,?~M|M|  𷈭ge\GZޘCO'v/dP8?w'Ꮗ_Qo _kw /[=:(bKu[ۆc4,I[%[m}k߄f /CKf{sc!3_,#(fS, yo#Ihˮx ,̊5r(%|eTÞuvۮ^ε(ә]~8_~&~ZRI|r8eixVxC;O5ǁ߷wh0U0ӻZ4Hv"8̋ퟴ___ |Z .-(i? |W XʔgܨXEr ]w /S^=͢XiQYcIՙcG*q"PpHgnYR-;;-6zywSdYN8$]-Wk3s/=ja.Sp8]L?u O֡ gZ[+ "sʓp>p~ oc|iB]6[/B BUc8]mhco/ "ʉVH3 r{FgMJRJ6ն^/Ĺr-$:sQWltkoK Up5-?w}J3[> :1 #zBoSMg o6:ز`y[h1=y|. UJJQ[Ui&#ObU}`poQ WMֹZ~6n4Dq\Yw uVP䪆eGB.b.+6]U]ݽ[jHdQY#. ē{ K῎ρ< ?fy4BCXk[9oBH 9ko~/bľ-y<֚<@ʩ)y S0B1J7'&*Ԥ.ۻ}Z`Y& yb .: ~w|M?i_*58~,[EJX+CE.FrF}}_ s)_ƏmcXBI9u?hf uM$ f 0X\f&u-W{%/SOAB滾~'W*Wž$u8Źګfp@pO$V+߆e CyYooR=NI4wF`pܜOSXisqog> qFʏWXyc4{fS25vQۥO*h1^je)&f'E4l7HwB9ۊ [-paH&9u >Vn9oe/ٛÑ,sn5I $9<#y~d)bmFݴ;.7uT5W5뿝|To\wPojU-pu-| QAAEPEP9gAOQ kI,3ʽ/d[yxZA_OƓm׌m>χKwr~G|P%F[;Jf]c} _3JЯ߉T1IR{Ms'?koz^Z(p\ g^qC㷋/ou ھne^8N7U+e&~|,oGGPBYdu{}c XNzM|EIBhyvګZ1~bWw\eɯ֝/ě~./u SGMG°Cp[!icHF ]յOEuSHᵳyfkmE,q6p&hF|ʓ.YE+Q/SU5_G`%ĚMh'RHHW#><%ǽ 5G iڋ۬WSPs0}?Jη%c4\:y >jztOFt[:i#0:V3|9qKNHVRnjΟ %.[+OM0fVA$Wg?ۻ ~#@ Fž.MGHHB_ڵ*25*?aK=Ho wdNqm[Α~ŖF,yEsgU ~R#e/Et?|s&ku  Ja$m5?O)wA'|(?6=qy"=ǾF`z7#}6%/<DE,8A8ArOٴl:_s_xyX/>klɹеfap!,ps5dž~6QJuJ_I_%#=_#:MY˲yr ]랙R*G|V}qW#4rH@F˨Jly':OONZQj2ߴ'4|y񧋼3-֛xPU*&Ktl0eH8 Q\WJ|!uX3,7`[߻r RLv;5q7e_ľZ-2ꚧd =0:]:AgG< '?I;tХX،%n9?-9f?}̏͏ek\ 2H u }n}ŋ?VΘf\@QR䴒ƒ3pI>ʥC;sr$IU]zmeMi)AJ?xI;:ĺĺ6dҥL#6#θ>PP$Z&ۋ·iv6־?+;((TE(8=+,'i*N׳i# JSE+Vu8v3Bѫ_їrx*Y"&G}޿#?t 1mVAO G-]%Yo|C5~)9EN3sJ:?ʖ> ]ߋ~0xō|+Kgw \% MrZD >|_kzj"K/!]A($N9W2}|"]OQ-wڶ-z|gsz>Be`<9_0|Xo~&p\7Ëp&hQq#*(bHk0iҫ*=,F&Z0G4~-x??<5>.jVEDJB!bC9g$=ߎmWS^{3SǾ=MSڮ3g* J1BI>5|\u?K_\y8n%eU ؀w!pq]dIO,mnu oicJvnfKHɋF'qn|Q|/$x,fž1u4HdK8[Mؒsm/$׺xM8,oaዏX_ͪ]W~qo,e`29O$XZŦSCN/=5#48>a֕F~? i,|U_㮯3G>t K{xKyR$rLZOE;/^|=s6-@'DW\6['~߲OO_ml#Dt/ace "8lѝ|<go籞tN{k}gz%LԧmR b$%Z0XhvG~,I"6lpJb |JCii_4x46VkWvC V\& [n/߆>纽ufEW}Z @)`!s8E=bj*ϕs U<|GH0\U/x~ bKCjYE%E%c'uZ=O`>|!쵭kÚ>0Y[Cw{5Ιy-Y%` ~yWU:qoWv;qѥvU8in՞CZXv6< Y3EXg8`zGP?;|GJ&ʠ'8nH¿ी(/|IJO"_Pt/ [կ:χjG˲Z4R;_ѫ_?W|Y/˟\X}JvT؏5tVm*ff HbԎ+l(jg/xX͞e q,0wr8>O<5|Do gwnۢ)#cVVz?ώgoi5O^XSnI$ eq6C$?/x7:tpѪh(7c8FD#8wǏs i_j,u-]fK!ykcDR ~Ehfso69D"B'jKxk7uZx~[u-6='MOqsy\ʪ3V_G ں!o1gO@6}&V{$@kĬNӍu~_f8Q]\h|.ҎuEшSs+mmR~~1sg?ZS}ki7:cq- VՇȪo~Ɵ5?_hi\àYA5p2DrKX h|DBvڶX1J^>c n$|}{cիķ?t9-nrܬU">v~8RoS-ǃݬ!b|tFP@8vߔ+RWgf j˕># 9sRSWM ?/˸qWCt{M]Fn   S?oVw,H8$18ztjQwVmS{v.7Ǖ|7կ?W~OΑky%8D ,0/2X? ?3kV10=ca}+LN l|/[__ᮉ:@j>!i$B<5Հ,)%zg,\| iV ARR~eVKbgٺe=jK֭{;3#̋VVq<"Grucu$inyc݇$eY2(aí|5 m]kͻZ#mo[Y_o?.e2)cZp7l~zmI|s}e)SSF0s7O+/[-S|1ȵ+ť+n FpIE| !H:o MkOƥ]^9V+{M>O xSU~СҬtgCoa y 6u(+xJ⧈uZ¯zd5Ȁ>vL$:+5}>[Q@:H{ֵM +$+wp2r?^wGw]K[ΖwiGj0\:)wh=;kIdNSlim HE玠~# [sgiRMc}ipFm֮ S,(CWg DRGUbU2zuǽ; PXw+m 4=Vڿ|yFbZx9'WF&22ÔxRy:Wp^Q}o?<#Scq7>$5kkOCu%ލ4q4NѽsG.HgT 5}9fԾ=~-^hi3kPM$]ϙDѣt8^o/jˬu]Ħv\A#8:6𥧊-Rt,gMNSIyf@cMvǟ<}|&>4 .n`xO$6qٛyK^ĺLwwpxOԾr%Ť)wFQBOzikOѵ].MFiWʖ(L඘&@ޡ܊~<) 7A{=V}fkdycB.%?5GbJԳ*W~MXh zuq"XHS<'a@M3el5\ 韘hJA i.p4$psWoM)l5O _k?x4kk[ Ie#9`)tqfU,͂U`|Wg;>N+Y]K Bd\D7 QqTdk/W8@bNɿe-WP6om@S+x\E^-xlgYJdg|دZ[P5eo Cݑt|1~ ^]:_ ӎZ&mH-:0)~r6~?xBM7Ծ 쮷A&r$duU OHdusz1I{>a ʧc xeӣdֺdBNHdFnXH@Ǘ }-᫋Mo>$K'[FO89~u> 3Nћ ԰iFBe% rɻpʹNt>6n$/m%{;};ւEuP*[o$cWG&MQ9֏Kۿ]:Yy'5XݾN]MZed~+9~n__RH_(I__i߉4{ 5 JĖVi~Yc}cr5~?J\O jv!UQ3p+J+K%YuVJ(Ԁyw_WQ43q`?W/'D}U<$#yq[s15aNyP560SCcR dpW7N+c ؊.fH&c_ 50<ԒUMR+̲L 3jDኮT~Q?tQa EV YUWByT*8 sC 㭻y+xaPrj8$bANq-E8O?=+wv|r[V|hl, S's Cdh~3QGNk#fO/7'~'\V~ hVE8O?=t~04z XN ?s,+?px{YI$h  kvD?oy994Q>c N^'>,9aEXO?{YzpʒnÜ~=5x2'>.4'HfD6d#=yG '(u&Srcamlspotter-camlimages-e471b3c4470d/doc/old/lvdemo.jpg0000644000000000000000000044527012405272062020721 0ustar 00000000000000JFIFHHCreated with The GIMPC      C  "    ! 1"AQa#2q$Bv &3468RTWbrs%5CDFSUVcf'9EHeuw7Xdg(Gtֳ E !1AQaq"2R#Bb$3r46C ?0c0 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` uݕ)i.'֮ԹSTrV[_.m6PfKg5 gib=񻻺czdÍשӤP=*\8!(K@A.@$c9ns%^ 3P} hm)R\HPSRl n\qLsV19Kf 1Ke\Tbc+g xz2"=f\Z?lE5۬y Htع5.DG\SxAr:`]Xܔ#fMh5D%Tn궇fѲdLEVP܎R)m\I vq}SmJyt#>\FSNx&W!KCz$$8NS˖HDJ{hsc7 u+knMQKO$2DT0&&BqKh, 7# VfW"h(ØB;r].xn@B^ ߥyeҩmuR*/46.Y;ӷ 6q;ߨPC2m@4:ɐ0\R (+7BM?65ahr\u= CҔۍ[mj)$x)W@E7BW_TSz7slT\O?65c^_E?ף~8Qh؟.~lk')FpZ>g.~lk'ꋟ1Fpzѿk5ꋟ0zƿb~ aѿko Efzƿb~ ؟~o)Qh؟.~lk')FpZ>g.~lk'ꋟ1Fpzѿk5ꋟ0zƿb~ aѿko Efzƿb~ ؟~o)Qh؟.~lk')FpZ>g.~lk'ꋟ1Fpzѿk5ꋟ1jut8Km'rIo32b\lܾ!tM3YR)mfLU) } I1HaH%67Plz1) Ö! {=S_OH™ ieHR]ZIPGS݌J5$f_8%uc71i_66`XGw@8Ww7#q ]_iU1aU)/v?2.ߵJA -JF_5ʕ3ޗ7%~obOwRJVDSQ3GƤ1.(7IB1jyP3M&*<7)A尟:{a\i\fqKv! Q"9bL7Q i2u.NMSLa+h\5zJ :JCRF[%$.hn_Z!3<32QqFAT6RTHQ÷YTZNU}JMe6+Y6y8nU'V;&>ǣR.=H,0` 0` 0` 0` 0` 0` 0` 0` 0`/c;E^$ڔnS=ؐh%r)* xaM ٽ!V׷/Mn\ZJJl:teU Ƈw^I?!ʜc y3SY<-JEӥӸG~s*̌,jO00a~2 Fի'Cjhy(N~Hm y7ŵOZqݍLjAlӹ$) ;T`. Lp3"XRs_L40Z Rl@QWp|"thyO'(UjuRXyKMi*ؤ(Y:ml"4%>2d2iR&B֒mEDY'qI&eMWUXdӳ'SLaTڦd)S#1!ZIOӊ6`vQBjKW .**֝l{"T|EUI YFt%Lr$۶KkTg42"]a64']NHĥVvwm6uST8n׈S%iFg6YN{r]~#l%XMT<_m 4y63 ,qyHW! 7% T;8V\]"8ҚD} )GmHI7釯3>Wz-DYPYq%6e XT|b7jsqRlIzʉ3fGG26Op_Å l ÂF+/9[K(y!WM8,$צ`˱4;SsuC.#rzL,s {ˍkb4ʣFM)A dHl:]Umw_+GV|ۇmk{ v il+p8DEQBvZDo'=VdԕScTʺkLd!مI W*1NMҥ _fIySS)^3$'La%_%hftyP'ӧSuuMzR5l E{FCisd[Ɍ7SfO5&tҚ zazaJEyΔ]ߴt)ڢ6]N22)4WGbAIZE9([č%b>-߄O$jUF/a֢5! %-8m7Khylw*55ƣwCrKLR!w'n*GS{[NI[ȭs^M>b2^m*\7^$X[VázD$q5 Cn2i-@=R C|,y;T԰qR"9?U,}o9S\͜PfF /OO:J42 ҂I$(ߊYȰڼE. #R$ͤV(hGS}'Nё*ԥ+y lS-sRvb=rSd=U^XO&$d$}B Gy"t8(*BRgH^-t$@%ViE2D3ּ4))(t!p뜽* ;LTeI\He $>w|ԙo/ qcى,0Vs>TzyL}I*ImW8!&r_muNi12TJq1>R}*Ǹ/T#UAN- (.}wi>DZ; +)M$GuO%oZ>!F#͍Wyh5*:!)ބx8X#Y*v?W[OSvHo>\"ߩ L.UmY F6Et6Ò:jotڨ˥׃J ƽ,xzhA9/;?2j#Ӑ6SɌɋ  X nHZIJZ>DZKKy7ӤE9 ;Ki6|T e{^lFW2U )_ xdICEǒ͊ J7 Rl.I/K>3D~ *ljN#TOPR/ ^r7IBSיku .1fURCb$>C\t( ;p >+mn*n"OeUO`&g7-|[YH$512Q`Rrc[5Reӑ$C!eߔ\+(P)B5"ڡ[1H1PnSo]HRPFl%y1YdYOs6JkwaOyC'' 0@;n]`%\jPJA7Ʈ;t促m=%E6myj[SύܶPS!bsŢ;y{Wp;yi:`@խGyzar 4 >CƟK5,i>ZT,&$HKeUKj:/hqPԾ&2Fp-k*x[婊txܸ > !e]lH#5]6ﷂ5>2 SW!,Z#nm`ocȺA]*)M^Rum0i$TW"ylq/-]Ҡ-H$<鳆j\݊XvE)]R$04pw"5RO@˔(qTWk⊷)A{St[Yne4W֖Mm喒43h`VebW\n Pwd7~('ntJgjgmDFF2qaR[$]GwSf5.6Dma=HRi`nl/ y0_UmYf6'o3*'d..M6w@l^zc}=~=Gl!٤=4^˶-g^B¨cv0+/z7_4 gd>26kuȻVSITM>ky3Pe skg1]` Y]5]/㰴JwB`P`0` 0 `0` 0 `0` 0 `0` 0 `0`ݪ_11w\4&) [bڋQغuHw]&KKzU9AQU.(}8h*9lKŹ";C1jsm\ L1!T-K{9}6 \f+g0J:t15RlASFqj[M3ܣk\k>\Ykil#X'PyZbGAA]C"J𠛎*]C'q&u^Tz{%F\Z\aţpBIS)KaC8)t,.:FU H4X!%HIIܸʖlrl3dDBˤ6B[RVJԞZ.Cj>H uY4}eT MZ:Ƿi|0#dzfZejdUeF&lZ(N0KE$װmNsփL*LVį ȰJ[OLrev-M~`JK++}ĿmP)IJM)X7%T+11"xHiJ4ߐ)+H*;kXa`H 3i}oF-TU7eN@*+bx-l0Zϯ 7&F%SWn\Fy‚x"T E5E[VkԺ]2^l*Kw J2Umԥ*js록QTP֙)S`UrTxa+r#t^Q\Gҍ7 :KPjEJJ{Dxua\n>8L4[ߪzninmz&vR ʄWT tt7Z aQMvۑy I4ae80qnY!VwZ§]T.RrjdAnBm*ڧNŝo,*w*e^So>*t$!]=ocISaUT&BSΓ ܐ;6lF^KBmDVu7.ę*C+2E[o%넷_OR(R&'vX *)QXώ[j4'P"C s,][~ѿC^l7BrA>KѹZ]-OKyT1ŻGsk\[Qj+c%S2ֺ*VRCIE@ww\r E^YJ턇51~`rSemD*TR=HCo>4_RGCܒ\{$,;|N,7=*$dl{Q'ʽ*cӺsS*%![E _==6⚗fE;40`0` 0`IQXDm YmPWo̓ڟ71x0`0` 0` 0` 0` 0` 0` 0` 0` 0` 0`صTILS12:a*Hp L@AUbj)Jf&3M\<_䣮(;SSK]^/*(\R Z7$:;ƙ*r2i,)<!IiPi'bʢN )zZPkS0DSa> \6ޯt{KT]fSǐ㈥`>% t*7Ĵf. 3ƥeu+0L"Cjz&_G1[_u:P; FΊkQ3X{r4;Cpou%[1ת̜.UZz ٱ .*M"M{dԶOm[n Is)9ΙބTcd!al8Vpq+CFAT=X1TDǍ@).Mpq]s/4G&[K>9T7,:ujKU; 3M:Ԉ%>1ќ ޒ%@0p4 ROQ+ Ʀ!Sǝ PjP{rllHêx3!3.`qrJur!jCiBJ$\\^ɭ+i"G;R򑒮\X6ӡ\ƜH )JÇp6[XHXTZ5>[W.! l%a*7Hznc}T4N"3/VPo_G\HTN|1R^+\Ib )yR}77Z/YPΙ;2&֕In;vwwn8Xt"6j޽iUw:W%7PZcSV#If:e;7$$9Ñ74K)TtBCtt -rIi"qI årpݓJMZ]uncҫ4w\mKN)Ox6o0#qfM&Dȱۗi9Ғx\02"Fy·qkvo K*L!kjx$%;[0ZG5rFaE*DLKijq`]7nP)Uɹ>\/>4r)nyJURˀ|TVq>΍%Xq5`DU?3T$$aCV7w15¢ywĘƴCڭfI9ʼtS"-^*V|}@^s|9dzMhTInJ)՞o㼍ul<TAˈPu+M1Z+O#^v,K|Pm>Op[Ɋ,mbcAOnp.#_$֡܆Q)vQ]<#`5ZrFrd^TԤiJY:(;*V먓ԧw'dirxs Km u*)>Le&`U4dc6/]H/1Ł8(27X;ța^Mؙuar<{*L1JtEեf`Ab3أr^HèzCkcRO0זT(O2ELkhM)J6Ӆ(aiHvCVKnĔY(QO5!EGp=I=qHDEkyRgHDVZu6H눑⟵R*Y;O̽Op>j6oRV HE8g\&ԪSIr[SQ$$qvҍ6F]nWӍFOّ0sɣY0̪t. iP.({F“퉱=0DZƆqY G~C,H5\l+d!6zYE'ӳ4[[nHiiݵ1Y?wW4lQqR@ (jZv.IVxavp0'.w[ՒH$&Lv݊ƲNfj5%lƁ=C2)O% QwTigW0OɰdSbS傧#3H;\Jwn "\Y̌MC7gIuwvL DezQq[ź$^^;EHyI$Hz}RmD%L%u=vn _g,Oi&U_%ڨx%KXo&/zQvzZnZk ȒSe{TiI#wLcNv4ǀickmd;I>.gþa#ĝ.^3K Dt!]=;/0hJDq]}$C+oxop64y/jyr $ZN$yWq/L1L:c-xG@n. v-.){{$Zp`  `0`"Rz m^ko̓ڟw1X0`0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ظm Tϥ3iZZTM(9.!/Jn&#L)B?̨G)Ŭc853I'֩PǝkOE̔RV9){\ q}2ۄi;Uo秛ξ D>3X O/l~̝NO$AùV3w%zfh8*jX˜Ӌ7|mHl O 4U0t$6*%֔ܮXC{\2iםTAyr.:O Z\`3#)(vvl9 G)2B@l[\|`@E";bA`0HRrv,b;ozZi¥HMψ  &bȗ[J! .ďn]&s뉌6Z5.ޕ~!h\R*z!rS{ꊒZ\/'q&'Z! `8XTPv 1:.odCj2&eLT9ʴ LE(~X+`qs}.<^ȃ:l*(@}RVHFN&{!SrnӷVm m[floEԕl變RyZ NU2cFR؆ CQR`JG_O R=e-3A^sTl GEIɴ"KYgrKJ%(/iEeDi).!^I >nEJW<6V^nڟQ\yvK4eKX4=B}7ǞCfV-Q_u\V|N%~hXRKJ?N&шNsmDIlXݸcAb'I4W'Ә%4@N3 >~%I$\fpSӎ4u;Sӣ"m퀦pB?C߶:0ԓzWba!S#6,s,T)H 6>PqgвceB"ir2Se{h-mQ@JEUٿdoqR_=.7|LVQy-ĝ>8-i9/7Q)])KC l6z|`A¿2fd^yژ! \߯U/YMV^3ɣH,Ș $8ԛs/z!9IQSh >wTzUUo?3g>"F޶69n5 ~j")-Ċn2Yܔ!&y}.;}u2).(L/JJSI0Aqے\A5`)2V앐!)|en.ꎦ)(9M.2u#6jizGl D 5ٙrHQ AqV*Z{gwK3kNzP—Q˙\~MA$[Q_Qewt-3)AlD2bD%ԩT뛈*QRϣ )Sμk2vm~Dԣe|*à鍣-aPRB^lS.f,JUr |(MTȫm$%)IVXRO\%rnGԹ5ɛ5ydTԶBۺ_a,<\/yFt[99RԕVzS^[cm6]Z>{-'iRO~E#.'y26x:.X⋇E::SҶCVNHeGp=t̥>gt8,6S=(m*]9U]eWrZ0[A/1[[)\JdtEڟ@m|ϙ jА\t +aueKEUHjsXUVTYd"Ǫ *5i};e|.%6,hͭۡJI6_2gMj)zLh}Kim,-VO]'dfbj"#,L(<[)TPGdU0ΒAuĝmxǺ;; &XLidDӣ(K%N;xurDtZC{kW,a/`̠1ftEq疖h-j6J@bmQ1ҳNz!w~LSq!.$ޣe = hlÁ*+6۸_ˌ\ŵJ'lZ㮺[i!QqX5o@/1_tVJv,DE#9=6TzlDse(Hq"e-Tʒ[(>).Z\V An:<%GZW, &e*o/haHfz9Lv.Ŵo@ ڕMGNzڜl՛HKȃt)n)=.&["IvHuo!crSJqDܩDI$ܛ;txWD}#QifYk M%~KّiT2V6"bCgp 2"O䓎M5P4YqM~wG*E*ν:IӵGۘܟ01a:PVJ^$v^s*]+Q)% (c14]+d^I)*v84 n,H\f\i+[m+4z9Ƀ>$Øû^[U-*ļA4)T2!%RS=Pe.$"䠜{ ,A]Z}~s. Q}< ֩eUlτPm8 Tbq.'IMghzRTsd=Ε[^̭J ZYm*!VB*[[AF+eQXxSKZ.;-ԫ"OKPsNYIġ  B[ ZuooG %'蓲7/#2(ESL8T,XoJm{ Zo c֮׫ʴ\MuYЂZJS~Ί$f˴}u-fM+RAs:y:⼸tf.'z0/5 & zµS~VL"5iI!.P.ܞҦ~ڍ5ś%Ki{R񐢒 uML+f8~_ƕ-m/\nChR@}}ϻ ˅)_=ab)R|Jpv"TݎW%q\Fƶ6pߍ~_TXD84RS{͌\%o5&+!RTPU[uO!*%-ݎ}*nQ7sc.2Mq-OFtʬZ4X\k)r(oҢ,<8EˍfrUߤ)rB m)"c.7Jkm22]Rd2+ n=KH5 Xzy<)cpC ZnEȄh5)sYg'_Zѧ&­PBz`AC7$J-쏦3(m}G# z{jRڽ8\|% .a*8gYd:)u`kO8vPvkkiB|:(Yřmm諑g#%er\y4,JS~_>Ă66e.)asd%<R pf[ޢ=o{Og,j9_[S7% %A nA pACYӔ%5g.))+` V2C:`ɗИX̧ƨC'XWRU!G /-S`9$8PqBS|kfIq~tw&JJdK:%n,%.F(H*Rlo0y&4o'cxK?1)VFoT8yi TJ, mz%tvZKwZLLZSMUFYԔĞ MIص8{%D}IQ|Ggʆg2>1GE5&Uۮ<)kIhJ ZCЛw'of~5]hN<@+ƒJBy# 6Nj2G88 >N6>c)Ih{햔^>cMN9^xRԔ lǖU)m_GT6=,I&bө$bDh_2ѥ$գΊ-- uk3{̕F!j+S|҆T]RIa5CrJZlnp-rqP)Y}gӬaՌObmR̄$t0fD~9Q!\6rJTl}yق,JvЈ|W}-ߙDxjWuR@h)* Oc݋1&DY+vE.7@<£}B|`)Ϗ;+q!kXm) JU { %--"^wtjɝ>\}%)cncj2qɍ C#n4u&YeE”`avTUI\Qiҗ'l#uzYV{l::Ԕ\RHIIsD6$)l86ScyQuXIa52#{H-JA'4TaG?to}caX(fⶪO2[+a-H#CNzSeS*tPR7ItkyJUJc[BwgHꛃ͎NY?$줬#qJm'm'85vDW>Gܥ+MgT;=_߁Lq@wdE8OԊu]ܺ,,Mǵ>A|(\~SFoO,8qviN:Uj'*S0`xk 0` 0` 0` 0` 0` 0` 0` 0` }=uK:gқ2m}{[9* %FIJ†wv0.!/Jn,k&ԳDB"UcT@eSP_̧J/5ч&tcVt-3Ps0))5F=Ğ"숰<%3 R-]: RFղE"_z\ff:6M;\_=8d?Ql8g /HllM;z㘯7)ch_u%eqXd3ܩrDO+K BYnl[*nU vIHQ@^}9O_Vh2^O ರVq(/hRuEgMlU\ Ŕ6 y>fja324t`gO(6JSr|^!,HP"lj{-f?|\Ȣt4T1Ɍ"[LTa3)u 1WVbR1k jٖC-U())l%%A!AV }iCbN1 ˆe6]!vYq)RnAWTH;_Bk q9_=V>U׌Sy &KyƛmSٟ5HrDԦ0$En6JMu괺|-?s,Tj @LD1.mylܥN():VJr+Uʟ.n1b$t(6D)JR|Q`:X2Wݛ`Sԏ{ɍmřڛJ.K4U(֜|?1jʵCe2%9J,ɉNRJ 9nsJBioī]#Jrp)q)m;!|.T\X2ԥI.l酝Tx쾴:VzR ;=b3OyqRI[jB3otS% IQ_$ZAe*1a,8ӭ:+m!B$\^iwrfUYj.(. X0rR]Ш; O’O+UzydZd.\r;_¼h\ZWeRq 84#jκ]@3hQ%,ƒhaik;}EZuQiE)R8wm~9>Zw<|{:wahE&3S.u*߅1fLxG#I%^ȕ<7)Hp {_&e04Kn{-lz\-,7N^env7McD4b+ S.Oi9qIpPYQ %AP9^EiojJU+1ȩNnJc9e6\K(CiX B@myD5zm )5;QrK)eK/duS.ҽuMD"&#I6f*: Mʮ@p;y05hdR|0J1^o}Yfغ3Ӆ:pr6WWEoxv9|H1ʮe zQTXt-~kCR)3s弇T̕TԀHT@'`vfI91əAuT3&y$\ap{ˉSUR$ϨF ȱ'pH7WpR2j1y+F:ǁ)]ؽ޲:uGaxň.-,cCyMm-ezߪtݔ9%\ tÉ"6-e<[iͪRZmvdM6ɑPStَSiM@G HJ_C̈́0IrPr Vo?uPlFݦ㭾=ڎtP"L;%[-:P$aRP(7Фĥ6$p8#65jL*pF[Y]]yδYeUjaҔBY/cۺ6t$uǤ;*FUz=s07I꼴S%O^5t{kcڵ|DE<mKaby_Nr|r1]La;Cn3q\]FV Sc&K`mnTJ M"M(TcvJ[XBU :6ڮIi +=EG]A\BD a AB1 *ܓIƝ&ax_.7騕-mVɵ<3#-eu^}l--ڎBB}Ҥy#,gXKj\UfӂQޝ\kx٫}p5pQeGblh!nDmSiH$li$\ DtP_J sTTTAk[_ mRwOcaeU$:_i\+k;o.d:{*X+4W׹k&8>C97KyG=;T\#uapsT!kv6U@PL;Nt-9oL(z\\Nip]cMk9nU%՛#b-Km臷Rbtldu~UjlE;Q\_“+qZLHFHhnJጼ eIAdZhea{M%S[]I8In{ ;loY#pRSuf2Y#X P>>8,eP l!֔z)PtqEKΕ! )HG@G)ђۙ~[L*U丰4}^Y$%%(\ fJ ,OQ~^fRʒk{ljXYX5eD%=ztO"g=$nϢQ7 k0mGyHpx%V]hw.o5 ٨pԩ#YJn)H`0` 0 `0` 0 `0` 0 `0` 0 `0`{~|+N`A/̒Iҹ /{~|[|FgQ%-fKk|%nu~baBP9&U1/RED*^%j7}D@Rwd1';%@n]CЏ&>Z f5ʫE C+Kbu \u"`.뻅?.]9fVK T|^$=;Ggk,G<>iUx y>'bfsg 3Lp`fqJVZgn$ T OQ`:bN˘*@i>,+`IP~N/[ AᛴQ\2BpzèDj`.:w:񮠗Hb;2WQRmxSo,Ww]C3M1CKTDvk1#;:4\ {k}\[iQ"$sSDi'qqWdJP6( P~X>%vbB| ukڳ )}ٙ^mƜJa[iѸ< ;HH*XS>>m8ƧkfHN8ZSM/"ZWS-Ri;L!.@ wu{MRjE/mw[iRJm}#$| T*tw*R0ǩR|&PICH*[hC I %*9Z:.I}T*9)D%=oKAeґԡuOj$kN^ڣgOgNti7 7tVi"*djVWi2BWVB TZ4/A6_0 '9NGB@ &iN;:i 9#:E)g]*O-d"8nE6.01}qx٪Zu; Nxw9yMR/~f=&'p"Mc֝NFiNvӠ3ڌVay-I%;|T mbť؋ K…pNnS*[0_QF-תu#丧89PBo)OǮ+ߋDN01I!dcS֤l٩W1X}=bRWa=ldv#kT\RAe52W<JԞO.ldM~={еڲgHLv91`R㶽QJwܟq 'iγGVqŲT(iŸp~{&ߡŞ ?z&yI-ET]w]'@`2:xٍ,%;7?-aOq4#%6$g!.TeX|rI)$=$:uImTJ:Opu4P:d,b V՜BorJ\B’A#=[)b*k{ N8jvVf9ZEYJpUXe)S!t2^ %+ ؀Ayj8\˅jsN"c| $$z*RWފx~Gi>Hj¢Kj_:P\JԳIb]h(tcdxM";I;PC3gq 'أ[.b<[īΜTuaK!qI@{HWC;š"}R7_Oq~׻ (!gy}hGbԴc8z:RҕJunP+ڹ+4fMRcRJX R|*ABVqZJVqul:x=RRV,p(Ӏ :cF/Ge T!BSᬭl)^A@UeUGNb6UvZ)O? ̎7-$K}wB@HN2w\? >daK2jFJ6=RI1AL%՚^HuUBJcб<#ڎAhҫf3۩%qbo!Dkzi" IXuz㛧b`}>\md9S|;ֻTz @YHH@k3 )ԶU$)BsZp鋨[I+&6oR쒽9ʖR |HR/W }?1d)saĥd[^Sixl0cxV0` 0 `0` 0 `0` 0 `0` 0 `0` 0^C_0еy7^f#qûbwjtv+wRD,~f5j-1s 6c]R[l4)C$ }vv|p[Iz-YF<5I-$R 7:[8u^CNH 4Tw!= X{쐭y cAJ%aʒ]oK؋aTrћf'@sˍrVMżM5IgD"fEZ2k=TYIawSn'M|EٮƤ}ihRtUӧO6)*ҟhQR[q|@\1Px4T"2Zq J-dTzpCےDƖZfJH;w :Zj Q[+ +HWU{Ƨ;ZiL j:_ JjL϶u(m 4 JDYTu?%?? qg6˕_F.M?s60z (JyjMʻLaʈ*ևӡĸ)H~11HpUcԎnUc`Amm^w͏Ttex٢CIpغ.mqC91a7F맸\w1IT7+ ņq6\D) XcӿM~$-;-ҴY$_&-NeUne&:ǯɨS*4fGtmH=<|sY7TFexٻ]V MGCaz+bogyaG-CuZJܵnYZ471/ܳdžDCq~bnd6D$x:-C$d.ꮤp=N2i b#E!m(hm6Ć'qօ7*+a]M66- SS_u՗#[n)^U-F&R\̽chTE$Gc0ݖp>/R>.oy/*՝G̏<}'z*Z}RdJc/ԓ%d)1v(.4[=\iAJRTRR/htsCtZ4&/*1TyB8WJn' 圚~$2Qܒ\H/'qwyL5Ke=lh˴:q*Hz֣L_iٖT[ tۻ,*=ZPR^-,%R87 Cl.JiԢՙB]SKnDw7Ai!B2MTCˋAi}Wt fw&gTECLN֘Z ;e Nƪ}ymƔ t ,GGC㈫M7?#8Jۍc}2g[]jqss;NۤYӎ1V/[.:һš KTU &Xnl'T'! me"C%+J6MUKH*Q BEʉ8O4B7OϯI~(IaEoK'DؐZa~umO*%+@P[Rwج ^ɎH5Vfօ-\U-",T q2B>eNjvdS}}~!h-_LwlR.$d/ciCiDi,2}i% y1Ӧ_ZKyK݊oTbڍ5fBGWLp#J`QNFrT%")U)VHĐ1<zԜFo e]8tª"mI_Bm$_n +9iE l=1Gf[qXʬ~ej^Nϙ1V:CeD{y;#} RK{19d,t:A(LHboQi~*4GDUʒLpxS>3EJ|u\i5#?UY< r~B gɰZ":[,A.M+%鐔^Ne։a܍qBڐnR .e8|ŷ)N:黒Zy-u)j>U(m@/hOW\TԧjVރ} 2rVD+rDOqRWb|J}՟*\G,Ti˅OG/Fa"-l#\}GH M[=qFNd[Tǻȑ.ͻ6BYJBWPԤoZOq YiTEzqҶ+TwI7'(GKK&#'%Lis"*&z:VhZ{q`tI+HδMI1t8C(7Ixog1kTŚ2ĹCUI[s9I\,lTBRqK(5BV ^*V\¢QVd;m]LDZ's9a'ªPZnp3׈J!)rCscFqnޗz#ҕDjbERM-iv :nzA)}FPJpٰպfUT[(.+!KRm6(][9[X][$dy;)x,/ƍu+&hjƓ9lXVK#nPR.t;V\1i2L82L<Ϥ亲H=.)VDy0l=&)V_Î:]RiZ۾:bf9n6̍ٙ~_~TƥU%IcԹRC,Xq7NĄ^!=|Ѫ>RڅZl05<+i[JIJRT.)$bA*/'>>mhe)Gk8.wu&ERb Y 1ey2eAJl;`~56)SyĶ7R\-< >^cRBȵ*Atv[[K T9!lM,.цYکddlט&%(&`Bbى:\ +RZHR^o=n3کƶxtѫr5ػӋ3g)<'3S1Pcpl_ZHwu5SOiK66VQ57-V%6v 8 j)J.09!]LyD(#ccR!eHW QeD['8q-.Ƥ9K -5 _q'L,95T;($tCVD3-8N[ħqB%Z,t]^G~F5:p`0` 0` 0` 0` 0` 0` 0` 0` 0`?cTS1gO.~,P2%EaKi (jG*Zsj%B˅X]*T)VYAG9͋sd̉2B%K)mKj'TQho*DG%u[DG$>NjlBЁ l^.ȒQ"z> wQeBNT+pU茡%joJ:Aq8sDU Nz|ҕ-`El {=9vשOI[e.6=9Nv;,6YS*! sɧɢ:U!BV%o-Sj4zuJAtgm֕*BЦPmQ>15;(N; շϣ+6\QS76bs䖒-raw+=\mf7WYLZVg3Y] "6 Dԕ6ಒ|~b~+~g],BN'~;4C:~bdH)ƁCIܫm3 Brr9iKJl7x-ק"Pm!;l;ͺrr k! J'u7Mφ W՚i2ӫym;웺,% $MԒqrמ]mqU6Ƈ( Pwo)&uj)Ca<^'ϔAșjϢNgJVeIZLQM܊!iR< ٱkXqss;1dD֫T7Nc!qVtp=S݈(91b^1d$ L((ZPPW~^\&pmK蹹qi V"8 M&-PK3ps.ُ6:{̣U:ˏoe(K!%n!NSG٪9_ l7*Jmhf/x^};? y*dCje.]TnꙠ*i )JBQy︰XeQ6)츃e2)P oӘڜuso>pivkitچLu~Y6 "X\5wnº\w0hFetSLjd%:SKue]YH *RO@:)"fΝNiչrMIxhu08ʹm!!)JG@uǪQ=\jN$xqiŜTŕ9BS[Pl|׫q sgKƄ %ͫc)p!9qyپJL=dETwc|-6!W)j3=ztR&VHWp)83Aa.0%dmWO6$=3E zi!{|DMucUJL9tԁ~S:[{l_\$L;7]Nm&=3`/@GGcERKv^rRKHG.`*M6mުJoůhqqty\GNQhSCu> -<TmA@lFO,7(z@AHvCJ+q\>2q)kQ7ROyG{iNCh lW*]%EUjBQR[F݊T)W;.wظa },<`Q1G%hzYIA0bx7<1LxbGv*x-x`:v*\R̊E_3ſTI(W*LDJa ̎9y'[cl;+fuUCVR|.dyt%MYz[9[yq|>$)k'TsiZ /e+mùhJ\4 LhM2: #m^J7x9Ak*Rti.!/Jnnh܆qLk:{;ut0Zً߇8|͘h"-)ϥP ~ .L']̓h88;}ц˧FID8g!ҳkuf &tQ\L!Rlnn[`AZ6οx Ġ#F3z! pR/}uřOQe xm`%!vԓ{|a9R3a1I~#VUl\4.%j%EnǎtDiJJu;փ*0 sl)T,mJRlSq ={a*U9m/툷u/"<܈n%*ۭǗɊ8TDPIUwǾF)$+ZZNF^O9`ЎG[bnOnZ$iPM%*[gpьd|؊$ /o.*Kle>˄ؒ#A銁}pgI+ x8 {忽|xC1Ɠpny:bGIQh2BCxxyt~MTåvMMl T%$! /`/`|քgj?"%Awo7)W<1̫VxO j߹Ջ+U*qX[y̵&(Z1>\ZqW8ÜJZqxb78Ĝ1TD3YnDI;,].R pn8|?tduS*C26%女y) JQ&)KR}uz=1;EW,\Q{[4QC>sN4KS2&ɪ0O6/8@;\"B* 1#2xPi`qwP ǓŢ t} ٔ+Elw,ʩ`OJŵzءJ9Zm\WŵǫUeŜ@y8IRPj.Uu*:AH < X "lR1韆dc'_#V"pGe.ԊlGjOnA lkT RLG'0¼e´_o8AM- LխaBj"|"tS, T';@Jgܢ!JmԄ$=Jne䘋rZnT!iqGR? /jǐœ[6JIz!ԛyN;PY,UmΝ3p`A6 `0` 0 `0` 0 `0` 0 `0` 0 `>:3MV ߘkjvuUJ{t%A!nmXY%"͍bRNB(U1,$f@/%u}YgMOQ?،l޼>SUZЖڰ4p83&medfG֦z2#% Z,$XA]D8ܦ[cp/ߎqDMV#CaE"[1FnWvGtFGgECӎ"M*rzazɠ,$4 mr1^; [C:&PaP2PIHEθlB  %JO, >_?,k-J 2Z= *y-1ArЇTM,\&6kۇFf;P2CqHQRoǟ3.f\ KBt$cpGfSJz~8س)>DG4*pLQ^ 8"JOp?zi_RZ:zqCYIt{%yݕtZju6 D $ Miu2qYmǘ俗s1"Ɯ߯ϼHq-S^\u7%;##LB}GxtǞ} Ci*JL\Cs^MfV؏! [K>DEwGW{w8^V$:Z:ҝdSj*رO"dݼ\0jB3ƻN|JRWNഥ-o&lA37F쒞b" 1 FBRĪvWVܞ6;w`C2Xv8ytŔAN#v&F>S5[>^O7RSb~.|CT Z.Z$35o |V[~2xHZ?+ԤTI/ 6W66۽[2);8k19Q2Rh8Ui$a*$RH7Me+$Ct<qbsyj"aUu-H)nZgup~MO^|Uv]*J~I1Nn8)mRT(ZJJI$qvl1*Rr;(ZإjbӋKUYRq)O.-ժ19Wť*=R1'2[RJcR*)Z[^\⥯hŅ*N1'2l1Basn ˯$\cq+(t N(Sn}u+q1R} +\hRF*+:3M4(_ >Υ2a6))m~(A<0?5Tf ңNj@V׸w^k&\|po/wˏN5IEhoFTN/" ̀`0` 0 `0` 0 `0` 0 `0` 0 `0`w~LSpjiZˆظ/ Tϥ3M%TMt%h/nIH1&F[$u/~jBt׻eOZCw Ml{q.D&){u8h$:VcΚė`EU{RÄzpAM%+q{mk ¨kO2,VRBI'3y2gSԞƾf 'zueڠFޜkF )HYkc.**5Mfts`o>9ڕT*BKʞ|n!d ocM&kPJov<10*ݛODT4f)P'[3.ŀƎpr; WN3aAj}I#*zn=nL6eQ{ 䂭RGKy؅m/ǩ՚R>˭ f =GK$<6R m&cݏz\&eqZ V=Ze㈜H\XcuŲs+HJŕqǮ/Q~1%.EijPo IP6{cEQC Q%qmYI[Z znq\r&DJYa݊ N%*ڑW Eg'\rGu`CN-*zB?2>EfՙÐiLpc:|ħ 6 V7^=CVjMv#u3zˌ7*V#n9S2Rt:o[ȑPq$IEvS S_JJISV6' k JѻS!qTlnZl ~f7~oZ#E8 B`D2qRTXEH4T m'ɋVDXxtoT |jQXf@R eD<$4  'N7Z]FjJzDڢ m J zzMf`!*ws P H6Ɍ| x<stDcyU 4#J)zǜNܥ]]"*3SuR˗(WOތ*=dܿ^ mh$uV*̙O>Lwmj1W#X@=BKiVVS1m݋xYO$ό$ z-<5q +2v,yԗ.ϥ (XyF{^B^WP<iIQt${ve웣Q35jogYJtӣKG5N8kYC5)Sk9%\f1+/$xNx.MBܕ(O-@[qRm!H`6|amK)nv@e%YYxbWo4)Σ?Jyۃ t0` 0` 0` 0` 0` 0` 0` 0` 0`WbMQ%3L!y.:ФV\xZ-~$S>pejN|J4ŕzT`+bj|?D$ZCqЅ%A'pHd= 8΍(O&Aԙp 7HM}ra¬miԺ1KS_R;=jzNkb󇅣j$0d0SI}XԹ&˕ ٤ϋr'RmIY4vvz>{_}Kmimw{ooֹ1u=l @cS*,,IChAJ:Ch~LDEn&*cHJ6x2+lSXAj[Z[^Y\!O-pT ϭiFӧ13=%-KW%*H%-LUlJIڑsE)3`QpmmO6i\mA(D zakjd0SҠUmI6b>q%U5͕$ `9[YVգw3A-6Lng& r,{ d1vG&54i%I.plb|s'fIvBZmעRXtU;]=N}iݗ+򠶁o.WmBS XBI66vsg[{~^&kŕzn Wcgs*-8z,}EMNiWBqeՀ;_Oz~f*u_o9|L +~CkRLH $!-2H Ŵ;.О"EYApVrw5ړO#CRQb(\x̬o-R<wy-݊(f€#emCHBBR 1k*eRⱭUZ?F=?F/!Wt'͍eRbNeåon{|yUʓ'64Z2Iȶ-G+E}җ#?}\xYJ^*{yߎ*Tn]BЄ>R;%)I 4OWs>`Qa.- e+/;Дظ@lb"ykn\~eV1YܤRMx\^΄[mRCqčD@":6E@y\:PՊFWa1 DJi% ;SrmEJ=)OO)u^*%V/MxGKL=sI 93f'`"3kg*rUS qB)P=xZ4*Tu[tzSf].q tE0` 0` 0` 0` 0` 0` 0` 0` 0`WbMQ%3L6iT3fcLT: nůĚJgҙ1PhKT"vH(k Tv |2E~$H#ĩf*N`f/ q.kZ[#E˓ȌӉ68nt9M6Ѱb5cdJYl<r,3`QbTjFRzAiua}p8hK)EP)Oٷtlo-SZ zO.:UT0!i<{8Fk+gj\!Ͷ*D;D͒ZR!$ř;ҡ%F?-ǐMB o'֍5₎c%DU܈H݊x˗0DhlGOm,+3DPb1== {qKZdZ[$Ykn>dOTM~EZf2ImW F[Kjee ьD2Yl.mKY]wuOFNOr}HI*Aq1d>r/'QxE<=\'.PRRYD =&ymY1I,-rf8;:X $z19I>㐢$tn5L/T9;Ћ5رeV".7t2R H 䴒p)@x_8M˹EmO-2G!)6Psk{\ee0E>JUc~O(?#rbCΣIRMG jZTOcj~L%":@@/ƎFé]-ARzSq{mԧtEJµztQCRXn 9b;wR1L"eܼUR帐L쫤@ g gZJ9lup} N4+6晵jRzu`Vd7%NO1.6HC^ㄨ)wH9`q9=GJS.oo7WG$U-ZtVʮWTҌjDRP$u^+wSżZmj V^`G8[xi*QTCq+pΓ`7>BNTKh#JTjdVM0Km_TK{ۋi+ҷ"{HoSG)ӚSVR {qI ̰!!-+pBMC^bc6WevwnYۛcpZ; H=/}&٨YZ3 YUu[Rt$qᦓ"-&{SF̩a.E;p%`Xa{wXx2hzO$]|6⒣c;PH. swgh WQe:lZֵA)RE ;:s ,-/ oKG^:p䩡5Y?͒ҭtp+{RyKE`I.Xy{Ic'nOi<$G&%\i1'mx8eF!cM+Ck@Xÿш07#P٦I55>łM—{3z>˺"24ޙ"RDuS2"Ƴu}۸=chMG:Ҳ?!̀cn]85*>\зU=&Nl6!L%%?(|^i5ɧm>^bei) WAX87oʜ)WFE*B=M/)K+H#ap&> g[.b:R7$@v3NTUElS9u%+tap95PR :J`Z$hؿW'(7-YI _*dw2-FD8ZZ-6=7 Na<+R۲Rw/&"רٖa/\ؔO 0ۜJA^\9RJTF< 6qM4#Y:*2LeKKy `P 1z (i=ޞ罉 ˯R8SΥcMf\do޲<þL&BU- j 7(Z CMIA~eB܎mؐ x ujojʼn qt穘cfݔ|O*㢍Ov1YK˱ہmRg=&lĈ @ڑ:0Tm˃͖(N#·SX;lbDxg)hM \'*CSQiӿF 1їC 0` 0` 0` 0` 0` 0` 0` 0` }=uK:gқ>ɰ{#QR i`.!/Jn$&Լ& Xiº5oo0H5&%PZHamG^j.T{_t4Ƈ6);\aEu1Y +h+X t ֠ܢQ벙nZk`Ke-/aG`FC ׬UWD.lB u(JA+zo1f.Xv+oXO蹳yQZ-lar6W1=G^ba&`zj9QLZqK'h RUŽ2˪̙5nGʵoE5٢\^J}SaT,)Zɣ9橳0Re)[(*qf9LʪU^OQh1-n{m&L❹QO}|+2eW3 ۬ej@mj ! JF:})-lyn Vp[tŚڶQCj4)I+OAw ?S"JRm(uF0eU}cG}*#ȯGLu Nʑ.;J<u>Ny]GM!ꂍ:Z?[!ƟcU|JyMt~N1pRnWR6ʓ aV uJ<|ў] EHV[ua,UJGp)5MncWd< #RrJy\ws<Ԑu˷rO͇Tġ'N#{$tGh,;N$3:,^s{l**P b{8f+QR)+)V} sIS虜:[dW1/NfQT6qAцdX=(˵Ei2js;9`6alդS)|y)6 ֺ39N i鎧B˥MRJkvSQ숑ޑ;![$kw!e3UuT.M[$b9;Y\z0[C$+JH=IrMN4e`ezɳĉ"QHCk u#H.dȭf:\ymQf4 -nI8jbԦ:gKL6АqFŪ&۔a WK[C;f6DrҒzFS`S R 1Hf&VV#d7EeCH,9M+lo*%%Uui(C<>b7ڏw3eBcRk#BvܷvyER:t\#}:.g5)G VO gqQ$u:cm4hFAHTUAz{HD,[BSUR\OMc=.G2TBvm  qr ?Zn+*TbJejRԦ4n6Lt='4MUJ;D*@)A1(aݎ~*.vYwTu=Kj!th(Hn?GI)S#}O%Kd$ GYUI*HOD O>S5t2aN:Dz[c/ B2h(qQYKeImnlz_OM_ņ9JV"zm|^mbTM]JӶ N$ĪkIrJkh! ؟P/ns 1+أ/VŞꚡ"KH @'n\yq4s?Mw+tRʚ!(%7O`V.0V@lQ*PO^b(*ɹxC\M)lȒNJ%Հ#o('_ E˴z|T\KAɿ[6>DAt*;tJ]]YiK $t/'Kf9rd%M+Bvό`K<|jy -mɄ9KfuĈ4 .Hrۺ[1i܌Ѫ3#(uIa QsKM3. 5$şZ hoPV$%nK`Ü9%i❚HHYv2Q!ڶ@鴑tHe%Er9r,tG@_MIk0FcS܃K\tCK2vzEB }t8*z5#4}η-fn[kqK l $J$wWD1 ZR;j{u_Ɉ4FqL-r~,J̞b,R 6%'e(cs iiaG{gv+c|m2}L wSSAm Ǫusa(=t˷BqPW3(=F0ظ:̰mS7Qlȹ릕G]Z:YeTˢvosAO6SK u;$P9s&RYP8uK(jEQ,h;iq |q[Meď/QKr;;+bu% l=1 Pr `-}\:|>jMJ*͑U%Kmw #i%zyҹiKGwo?NqxJoؚuK Si*qc%n\EHZЋ|,#BY>S{ + _j<*ţep9iw|j+/Qll*TEZOQ=C[reE!JAaԟ6wNcJT/{A{O64ȯSG|*c6aH݅w/)-V61"B} ʌoGLuTJ4sY.gN0"-0`0` 0 `0` 0 `0` 0 `0` 0 `0` 0s%p=7M5D+sy^̹m nb;{3ڛQЄ5>6&4a1x1r5ZV0`iԓJRef-:i'H42қW! *KiK Xb,b{G$Ϋ б908嗜<50:[{#)M$\G R_"Am'$m%JT]˙¿lU m;.by%.2Tq  Oj`I-Abd4xfäT+za*ֹJcMb\_)QKrW?ϗψ⏺A` /$SN3&$2C=kH#ƶ+Xp(<0Bo֊8n bJGޗ̒x\pJ)$&Cdܡ`Fp Ke[5/ b>\fg(1FXu.F@nFn T_"y?'qÃłBY_d8joCGQӝL-% BsЂ =U[)yu7̕KI1⢺#DHC ,6) z1KH5%~U'$|"'Dz2WMAѺҩ9rd)VR<㓮qgamTjNZ$g^JTcu[u/%e,gG[-ʹkBr+HGuOF7~эZ8pTf=SEd `^æ"!M-TWȟG̕W{Na uy{֪\£aaדc- vFT |n뫑sS]_̓7xs$-+qYiK768m̭AEF>Z"Г',|G;Am[pZAkde5lɕ'QT*+yyet*tiŎ-U6.s[BhPGCrM-p`_"_;Qt~}z;fs^5xjΏ>Xyn7MI0sOG .K^YAae'Gp{㻋ڱc49[,,h9)ly X{؉+hy|2Si8IQLdۥw$*{uiY@IsS<}K9wFdGSHRͲZR︢_gMև&YV̰m[?n:J<+.%'ԆiL(#֣gmS|np]B[?s,$™Ƨ II-D&Yo߸>:?jfAeRK@,ⶊ{_2[[|vI(Մb?Wzu`ֿi!qu||=%X-9#h#*#ax!{KuW?h;ϋ/?V<ʏP?xq=yb{oJ ݜf/,']qiYn"53-=ܡ{D:mݙfGu zBTܧ2x5&vDde\oj**Ю?_aK,M+s}r JtV(&|uKLK%˭[ P%JH݆BӚަvDk6N*9_5NyڋvR􀥩)N h~MVZ_Zj&e'$:اbLjk2Ժ*4Qy%*bcMu> P?^R[{›39\ dٳƽM+9gNtLFԺ6j=7KO2V"󐥷N%4%*si[6Cj ƿ jLk5.#4?jQRn=#7oRjR^mYj|T,)@g8Yq泔iQ2? b՚[KZPm hץYHz?[tCJTndaHHIt)e)aJTH,UN0{wtLXUw28uL }N6\î-,IqJ ٵqhάS5s ;64RˎG5TqiKn%I} Z$nRrEӇZ|JʉXsQ/ӝQ j"qN Hu+1`'3cE?~n'3`'3cE~n'3`'3cE~n'3`+1?4^pzHG8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GWb~ ht}?Г:p ڏ ڏ~np ڏ ڏ~np ڏ ڏ~npqOi=t}?ҟs7HZGǦ?hWoSpUDQve5%>PY=GƗJ7s])G8x*!䞟CUhUX1ҟsJ7sޫ0'Z~ xkQ1ҟsJ7sߌ &ު¿~ R(^>~Q1ҟsJ7s#0JIW1_)X_])G8=t}? OD.܏%&h6NQ1ҟsJ7s߯1>jp?܏quMN䟃?])G8=t}? R@U*1nU*y'?4~SpzO?ј$aUc\2k?4>SpzO?\2k?\2k?4>SpzO?\2k?\2k?4>SpzO?Әd=6Ӣ{nH昺z*tc,[ڑ^ʜE;ԜÐ|ܤť朩M#s~\i1^vBt <)y1Hm5 rKG^qSY)xӺUS涳>ʎ(%*qܶ!GߑZaFlXBe ƚ_"+( 9#6J$ ڊJo$iGNZPӳSlST.-)D+jnhSdTn. NsC9Jt$8. U1EGfխ))aZsSF~$i6ha96\OcnZRP-vjNlgXB0ҕOSɩ) $Q% MI :Nvʓ K?cd9;%.>YHRA /guC?VM{,]S[mؔn^|5ag҅[#ݑʳ|5J2QV٭߇aXӾT&U!z`-Eօ] \ Z>B)mŪ/Լŗ|'}@ɧxG/亦}ͯq6=(5:s3})p\t <1 \OImDf;ϳU5kќh0T0l4 4.g  t0` 0` (EHIp:[ (?"VCFuiKg4sc: DTh%,Gx% I[i ̿z?3ҮbIySb{9w]*ϓTY~JSi]O8} R X%i)c2OC[m(YhmJBG.6'**}ÏNlo=3rOٱqR)߳kY{CJu ŕ>cc¶Ǖ>afv"eO׹C )Q>K{qMv!(4I QwF6vf,(K[;VOXOuǕ>a3zOٱfd* oe> --nw^o%R7?\X|˕>c,6Sg96t *}M\ynˀoîg˔qnO)OE9Od} MGiMl!$ܐmMl뭿"}/x񻮀XϷfl΄C??#Aa]+<87=+.Sg,tWPO,>AЇ:Oi?q#47SP|YW񿮊U%m@&T/|'4OBlknRks~j k]?"~2,RxQMBOXr̬NOٰ+3mz%5>Gms]¦u,{lkz}Ǖ%DB_mQC Zokwx3L}I"_ٰq01 #t' l/sG lG iW2>v^?z`Qɪwx__ny6(gMrWL\u*KQ97xS?llT3# h)^>̀J8G Ue޻+]AOXx X@r&$T<*03I/U%d+ c9* )Z\U'/ResSֵ㮤ZGD<+}wO ʟlJd𧨟Sx?LT Q#ԈY`|xAMCe_X񿮣ʚʿlq}-[FG^UEr@t+rH:ZrԄ)_j!aLJYHQE6nBR@ݹp']AOXǮcځʟlKrnSa;e-=O,)6T kEɹKӚEą{(7Buع`~. tUTe0lxW̙PX׫feîcmd]lvH* ׹Hc|ͼV[$sWAf8g><{p˔e 4H=LR-o՞&$ |O+u_>~<;I$?&QIf|„Jqy9Ga1 nm(* 1|%JQ quO l7# ɔ։H\pHq3M#ŭzΤ̙ȇmR{K[RXpf,,{pkʺʟlWjVi=)'jZjTGcְV;}јjJvY2EңZ[l*. ]A[Pʃ_λZ~2Nӵ+#HT|kXXhsiy['j_jVGRZiV. ű*j*} \GeσlX%aʩq{T1sU.d~ZvQ0Jk mG-k:z5Zc* Mnb*qM$־;\4& Q3G,OvBUq<ۍK {]T?"~,8Vc_O6%~L׭)smC8ʖŏ겒{Ag7 ^*RLnF̜HWSU\u02̹Unڥb|8S8i}Iʅ's>Kg sZ1`J rgmPmB`\{ߘckG: 9:{"}8\ ӊ.?keO2U6ܚdl Vf; uK &k3X_خVۑ>CNj:CTBn>T68\k/I]sOiMu!n!\ǫrۈB@*R$1ve |C'BLh딊d6T ĥ0CsϸDކ2)LWG{> 4;V-A ɟ}!`Ȏ=)N(L9wé6 ?W]Liޝ 4BSZcsURuCڒxH#unlnq U~2!esVm[ܠXv='kCWɷ?qvw;C1f<&4WE溗e6[ ڐMj[R%j Pvs]BU]q)ZJQZBNJD Vd8*2TRad*U][Bvw)Mc j,_N2³lQCSm2$ 8 IX Vdua⽛jWz.z]]qԭu'Zb)vz=+!TT)̡&'B[%L Rj&nbS8>14!+zz7N۹ KM#p^i9s4ȦIst1&4-A29lb@,Ҥel3֢;oίǐ>Ym)[I((**@HdQ6mmZ\T䢭{it޺[g}_^6xJNR+ȫgBrMΓ% VǖҒ`]}{`lQ)ܪ+zwX}m+yn5*Lf5>R/){T7&JB|:Ww cr4jx/ٹw˽]b:tW6 cG9)[<7f1q}Q>_ƙP ?I8f$HH1!aƨwo0ۤD6adre!6LyDC2mbwo;>#xps”^H-E祧'/ʣ1![M(JTe"4M)So@+1XYƫHS9UjmF̨RYZдwI <6E1]( >=Kk9ޗء0ymOKx?4} H6Z:'s/Y#;~ޜhAcRy\>KM勏&5iRl$~80KzN.J ZۛLe4NL\@uopw`|K'6EEIܥ}.TLe)ұRU}R@™3:a5jh')!67J? eszR c`*0ps"'LF„ܹԔOm*h%[R$Raz3M.86uJZ'&jAjIav ws|3.TQƇ *Q ȧ6b[+awګFw ?WԒzmLT?dݯhz< mԅ6M}uXr>4z(Ձӂ!qhnBĕW-d! AtbWMO*jujB-I^$US.ףcS*QnVw#I_ဥ;֪Nֶ.R*RM٭U}/k5KtYcSPlAigJW )?/,32:3h¤^v@}"ږԴ\p%=ZVDx>ZJk9) 7. [(ui%AJx_o#ب87*ɭ/)\mm?jM?&9Z,"tjYh?5!!J@ZRzmZ-7eZ.?mw%d;n7P<{]^Uo$#Oco(=gM;TRr!b:a( sR9ImJksS0\է}ԖHif@B,B'mm%96mm{sVtAYէk_k[k$ݩ 082˟|p_= P=+Jp|JNop:[0{#zs㊷ k_,z S7 NҊ* cWPJA{nkn50Mc$ RmT00{x%1*$tZn1 UOzdGxhm1dAnZ'v}3aR cR7* ?:ꔥ%]Dat#SOY4Ȯf6i^esblZ6ꔍ zمM} c*BڽZBJlP iCHqcm>>ދU緟sˡ u)Οewh뫲ݽ-}7]D F[5%'ra6:ꂜ񔰐Bw8" mA(\7h.YU5,s"huuC\$)ė{\Ups9[Dh]/1a/åة (w!Zn~ZuVѴLz+NGe/i!c yRR)Rr18zQu8ͽ9zɴ_((b*9c;b+lZ=C0gz*T א-: u*ZK$^J0NCєPoh)Gkъn}ȓ3XNr$*$7b)#VRc)uu:)AIAIJ;nJcSd!S%B:ԯb]YwMfyYNuN1nz/r`)BrɭT-5~rt m%ZK!)\q 6ۥ [ʦ`eAP,"Spz,JT ~DU 5/j!tErۻ E͏$%:J%!ª_j.TLo)Xֳ9}_ %&n]_avO&rXT?jZXJ}&x:%qbdGBrUZ؀8:n|_693‘ҏ c: 8;<J6o,Nby'-~}|ZG./A,t m4[3Όiu<˅-+MF2&vwVj\a,xu[qiqHq$X qcC[$?|}tO/z0.*BoNN;3ݢʿ-*EYJ㈋.+)@Ja-6a[ި&{J5KMdo>1>8o~jrF^ho@W'.%՝ !+uHX@Rwȸ#"<%m.Qgy\dKˋ|*jlW!ٜHE Tlo 65Ίi ;yF |vDR\% Ft_G-Quuڱ6T8(OrNңqs/JȎ }5xJYRӽ@KbR=AbڡKʑܙRq!jtWx[ ܤdK˕m2Ffmn&9euhљ.:NPʜ_).Tu|;wQ\#k[7|tÙ.F]f_DFה cjnz:d׮#)ڳ2& NT)m Xm,!NTl)臐M3)=S4XS*ƸSLtO$zbD*3k-^2E'0f*,I-8IvPqOTBp7$.:;;Bkm+~T)kk:}vbQZEH-FC?E}LR`,2P_D  jzfLCZ**II&}킵 T}N>R)~78]Go u :~T}S%J͌}v M:eW234P8-mJY'B GQ{( ᐭ0Ԑq zM~n_'7}Q@my6 mSW.+jnؽ糌-F&:2gNM]~_iގy+t,P|)zC*bÄ%jo KFt {z)ˣO(4 %&=Yn@$A7V ;DVZŢCH\UpM +J~>Z5%+鲮iQUj4r=uv3owF;%j]yS*$huźQ-і7],JbbyB'1eJlU cjKx@ir6︒\QUꓳ7AYGiHyyS)@T߰JEJƒXRm9'[d̥)ZUxH,5@\mII#+'!!~$fܭ[Y+rVw1s,=+[%rWv!]i\7ޤ!̺?R38y+Хƒ&Ʈ|PQ_l9l52}WOT9xLPޒvAV9tl$*IY/;W\ %Nvg-~eZ3_phCcŷV뉲ml>19f=mEϥn fS"G j?_ƵTѥRͯ)h[Zπqw15%=: 8c?zUmOMw3D6ψl1J $ mCM'5%m+ZWf:y{R%Ct7ot@,B~mNX[0XqF¥pI $7Xn` ݚcAf,Nepېڼ!M@r2qZe%+!"g MO,)RȄr9aheQ 9⤛䅪%/W&FrlfiÕ-HJ]r8$,+V-%F{sחK/ta⇆;qo$\͕2U:2OT @2Z $]>+m cwev[fhjP̵u kXC qJyRvE)C u:#3; dUۄ\EEì­DŽSGp(0܉hn1y!eOp|ǛnSN\C8֊Y""B1pvL: !e`ڤVHHQ&U{^|J\M5Kѵ6F"K*S|R8/ݭ))SUРo *;J$ex@ۤªڌi7Smcnz(GQt 8ߞ//=~J[yƢ>Z)2P_DJkxoy{`A/U_30UMP'؝VRiH=ow?9=qKՉ#7覬KGSf>x u :~T}SLm>:8mvni 5> -),)RBMԞtz8]Vm@QcY72k\x-+QmQʔYuhRAl4HpC1uIRG?t#'e#ZVT%;P*i |ր\m(;Bsa08ڱn[i{Y]궲ݣAjTaF*0s++G7vS.Beˬʤ_6&+&қ58W=J"PSf,t&Q)*\e]Ms3`iҩcJS( *))` $p^YRXiSK@ ZXB q]8I4xUifu"]H ̔@J^ ’n<[ܙGOJU[7%7#*k"U2[p|"ͫRʙeg=v< 6[YeT |D)$Hj Qo7N;4&jrSJPV֤tukڭN?bOi6N ~\Ͳf SD/Gl6!z/|?9_/e锊3򒂥\bT(\Li PPRM8-❪hhM\4鹫]ikG[r+X8ů=:}ܪZSmǞy1]Rnj /iIl.GȏG4~%6ӟk|U;X=/}Xi^]98~LO:ÆHðtJ7e`+q( n׻mݹp u:${o}<ߚk̨t>HwZ^ۚ0PKHqq+BSVo dtC[UP*$ԋ*I_f%co%w*)ST5NN5|i4m%Ji+l/bQiuP[J0ݥpEf_v]F{ދ lr-eЂ%Vږ+}48 boMӭV42ՠoe\8%]a+zܹ_"D2+.Ij1ZX eeA)+([ /jtc]u 䊌^5Յc%ٵRZ8 zyNŠEK9j]*Cѡàa!D:Z@[TCϗ ڋ5KM1sѡSL 1h8rov!?A"]l6T•V{ukjaՕJ|wm#g'h7kF&鋴y/ę:ԧgm4d)l*[D7,#v#α?E]$KSimt,kO$!RPlFʹIj[vu[osi,R%JV͔ڒ-($~ .f6mϙ݂+Y0^3D;Hz'$|TΝvA~^3A[Q>Y_Nsr,p0`0` 0o/ݢ//0a[_}1*ȕ/q,7sWp%:U`>JRAmuLWy.{@;wT-m?:ח0}O]n~o˿/(5DMޠy8--=6RSI>I}\{NuX)]f[ GEs*-$ۼbx8̑r?P)ZU89)ėYBB' Z$q.9j2>V"OHqP@!lru T \[\$i\Nݗ2HqkUꔵ9\q]jiH w6OlI ,n+Ӱ&h0jy$7`@@@.x&"[n,5izti酎|ztG54{K˴7Tm*V"IT~+R %.|۳OIf0&;1IJ؅$iA)B d܋G|.JI0;lMԭHnM6klYwceGNxiE%i+׫Z|udK;{(`.: |_X{W뿓OTqtbGP%CtKBM2pƞujڔ]tP +ۛW~ gb=W|2kyp Tv.\YTb$B1BԢ m@>B0_zXV{Db$,6]d2L@CVl좄%R: s]%/GjQN0Y;o|!_ oNr.6̀Q͓2Ip@ ͦűOE\ֳSuWΝL: eIœ*I%O* %J\#9Njp[&/TT,V;Ki%jANw$ uN 5)5 q)EJJkQsnh }d BWM=ee^m&. YIO]xV'z_KJ$UOʕf&Sn ÁMnp)Ĕ($S,4k44(WW.ē&ߑZqua(! $#۸: С-.YேhNZ̯ʤS(oh "m[I!C@)[= G,U2W)sԧ'y^qcrSĀ@;7H7D1n)kgף:\$]q\w}m(I.1mCcP<~ب6p)~`Bρ/ZDÌTe!Ej׆I>I}\, R܃o/0o7p}U̚X٨%+D2@ ښV+ϥȒ^q)[jp(ʅdFV!t,NVk&>6\+u'vq15 Y:*C&ZXA+tJ HS[*HV~&X9v)0ht! v) -X,e.&MTʴM-(҈wugS){d)[RքVBJQ7z!h,K5\1*m$TtIUTrF@ 7n0He՚(4:H]i)Z-A*;ւThF2V*ӹuNKSNkB=I ʕ (((K'delYԩDVfL1ZBз Y %JYV4=)ytk8=M=/-Wf-\[[nh(;psk:On4(5.*=MJB@ ٜt_$wDs|\t@?*(>zߛw6{eԪ~gqiQXBSq)B<_e\gqZAvMH8F)QMT#'B0_z-e(,NE|<ìEiC;НdX7W)Ԛl=.Rga~l#UmJknfj-1Z.1Hح[T Mmqqĩi=GJE37K͐٫Ea7jq)%Gڍ(UqpJ5'nv.G~;Aѕuכ[ip ijvb]鞐NЛ1!{O(Yh!EG׽_x ǥd)59-N(*q֛(wrڱ;B *o4| xLN`eLݗԈaJ)CRBssE+J԰Y.齟AˍG7Mors|u棸J 7Yh@JT7#r,dPJ=rm_^iݾَkT3N _V4$Mqij8>]t:.^B:Af3SC@:3\*m[;>^Uaè1K 'u.ƐMq RrVP#q=4U9 SZQRhY夶 HJ > 6vKq蒽Pbo*B8Z!EJk!Ioq Jŀ*ԥʪ*Bq%QZI]ljڢh*t)Ԍd>z{n8'%/Хbj3hmX)*? g*?j !YZ]kGw Ӌ%Q)F*3fcAnBs@U JJnJ *N^OgsUU LUcR6Ж#(em3e]~LHS"H;+lm+r]y`Og-%T#e\S[KAr- _ݕ+rrAQ>51O=2֦ĩUR6Uʖ#Ԅ%WM߱GX|<3ٹ;4fy7!'} qQe IJ$>QZE[jH$$iޜӨ&uIE-ĠUn%.)%!d !cJ OK<16bӒZko;;|f˴݉cT]ZN-v׭C㘧T?ޣtnJ}=nzmzT#=HȔ[l_.=Qu,B/p>-4G?h+RsI8UGө啱t9`w+ʇ8jBV.L#4cdsPaHIX;K ]\ ^Vc7k[ֶӢ9 LU5;>M[CbtII6Rro~g u#]'V7;0yB_u6XsyT7BTVma+mVy$h !_s+ w7 9kmR[^HQo1}$zD7^-;RoʷZ*mCcp !2OD*Kz|TJdeGUsDWXP$Ҏ.w~@t"vQ F6L +eI9ot_ ૛C5{_˽mK#"=ff_=?wOjӸN$ٗMxW7ډR:wۗf#70` +D__,a"»mlQc֎riPZBP-BTQJSfcEvA\ӹ[JQ⌡YJV^*;sWeSSMG5}'FGO_lp^Ʌ>9p4j*BI IB{84:-ZD4/.B̧i*]6 $mMs_Thaj_lpʍP S)f JZpiTHKHH&THnM6kKD5NXBfFVcJb"Y8 }DiCiqmiY#*y]=+zkK-c3l,|o|IZ߯+lp<vNԇ33Y*)1Z}ʿ-\1*GK{DX oN4wF|k(jYUd(̙p>e=;ԗTIJ|\pP8Wn(Ѝ*j/e}cT-{LT1R0ݏe.gԟ{U3O(=pxcvry>j\+gH{bۻ}+u)PPw%K+ د 6p'BfsC.bҔZУō5샴rN)WRm9nY;TDg&ϝ7V3!C2 NUԏ^LέzEJJz*4D4#deRa#Zq.RHԍQ쩩P8iwT,U)g[yoI5k@P͋yK+]z'W}ǖo[& R/Q)(Wӡ<p&GoGRsG#| 7;~9>gx?>Ʉ%io 9;g2FQ*j.wCyuIu7NeRRqp_DCloPs}, 9(;n| R?9}F7)IQs;r%.NJy11[+C2\եiՎ8b\E˙^1WIQnnǖp"I,4Vۡ QiͰ=LysJɈΈ3Y#!ѲW빶Wҩ)G\R-[׍̚NLRmJ 'ca?pH)}| R F]vY y5jmjBTdJRh w$*TI]0?C5}Đ8\Q7m8R,Xg9nGFGtjjqJ)e?Z3WUR~i>d{)ruQqׂE[(] Y";*tcuS(h6PTiH[OjLҳ&vVVM"O y"a Ny,-Zu]^ꯧ?=yz1NKPNڢ(E`Uv-VI 6i!RHZJÃ?dؕ_!rHqކҒUqu%E!+d%!C6?t"Y"3LՄ_G4b{Jn.%TʁH)X +R*.Ҫyv#T5 >ӡʏZ t)p)"k6J/We1էǺ$N}[RN-iF΍8)E+٫+;_54=dtFQ<.szK$PwS +2&mH|avUe48 (QY'6{᪜'h/}bo&-4S+濶8[i*;J8ۚnU8Txka9~8~LjeƒGk毶8RrO G hJTL]?5UԹ&91܁3syPqhUТw/i 3mgEhc%N%ŷ{NuW5gQ%dլgZ:LӷUajӽD)i]ה쵽~$)9w)qZ&9c ĕ. ,)s`WdjBuJMk^Q2/$jꔡ&9,Sl6i%(p9pxpOt_=Q2aҠey; yn7 $NJSHumڗ4CL7Uk[D~TMFG4xi.)Z[׍̚Yej`3I8,L9q74[}lp81+}ǽӓLi@uRyɎtԑ@CaQXI-96x 0dn%dL-15&FCJ kӋ,Y^I< .:HѲ8Le_>O5}I d5k{{u5Znѣ;ZMo&w: ~S ۋKg ~Pjǟ]ϩ>f8gi.P&eMvvb:g-ĹTY}\6L.4:oq?6!u)M9NES,eg B|ȟD/mԁ˾S:rżo;[% hv߂LÂLPÜU~c5|~(?$|TΝv?]A[Q>Y_Nsr,p0`0` 0wy E$XW;?#/1E_a%뎅l@؛g AZÓB|"E_%?%$^?:Îss >ȶϛ qFYpfN6<{s׺.O [N--41Bd$䬋Fp$6?X> qcU5y?zOlDbWddl;hi.O2Ė]W5Ԣ;l>[}J^`sTCO ee E m.)Y-b3q>ZlR׾P' xr~*m=bv^1;"˺{{Vq=J}-@58!} },RJ,R yTroP ό?C@fJ)i~?},p\Vp:T3.(L nssXzl/4.3oEZB$,C=Ҕ[7 [%txy@t&fj蹚^z3Pʜugcxf_L J)׏6lu8nS.c͙hHf4T\djr Il1ʃ E"z\eMI>%kr>췦{(GzЫRm睾uݾgN͏^2QFu1azޢ]\9\۷3m)䬋FqH܅{U'vZ^ӹ2DLDڦq!)f;%L;ĩ~4{)Eϔjf$2 c/Gz6.X*e5M%I%6%f+={HR{6?V h.eɮ2H[<aE0蔉qdmA{9YJcscSOååsKl'/S,Q:2"Aqb4$ /b=6?[k+8Ѯ}Qo\ 7ɘbֽyé"_ckbR@Pz[_BT,,H1ubCqO^ oq_ZA'UeR{ÊV# w q1>"v%Wċs 5W{HSsJ'f\Wq5 -mԼ0!e0Ci[f䂒7J,RQ\>=Rv徦.Gyߣت2bTF&uǙDc8w5 $+IpfN6<{s׺.O [ND>|tL 5eVZ(Qa2OD*|xDI-4ڔۉږMI>+SYP Hڟ0j=O! ]X_0DZi~x B'Ks\fLۚO.^zO+i)u l4'͞*lrr[8ݜBnuBc-#ڧj|.k5T&+'ue .D'ޏ]d"DKθZWn<=p|*m=bev]~w.ٿn[u_$u)g=\؄MAeDۡI?ǭ6Tq N* l6=> $_lTmڛzSo+椀B۸ Kl.Ć.Imԧ/ zLR1>kZ8ѵqÞo_9n?Gr~f{Zb$Xx][rAIg"8VFg\ϔJk:%/&Q#"+LϨ>G[?0$7 kSi\Х3,Hh*~1})Po)I^`oT$>|Wo*IQ@aZ|ANJCܷ(ԗX}`hA &6y!hG[>[cX?oB6+3 %R bib{mCۿd˾:{IOa{EFp?wȬ8t7!y(ā~c5|~(?$|TΝv@4y9Kj'5Knrn^E ߖC 0p*I_H>AR TH VtP';Co-VS{.ʵGQe8NJq uv@Ohbފ_.=GG(]5!]?+*>1 o Ih>*߹ڂ7O͎LZ9FiHd<ZChfEԟly7( R1J&|bR6RTTlIq*Odcu?6QS(Dzhudu|bv;$O⴩$ %?3M{J/~e1>a)'bR{'qM GW)#PB,uv/ ouc?zM8?#@} DӝsKI A GorrF^{8dNJ] gC&Ck+b.h7o@_ 4ʑɌyт Ji?`n/Ӂ'6GVSޮjEأzA1F^J +o5S{-@#ɊqލzN$06wWdZt|c}=L*>1IVoq?66ڏ/ewSGO *2, 0| Uw<Cuy+?cܨr]ebvBs̴p|cH!N/+JJyFJ3J 5$O_DuQk} f(I;L=~)9BW~UX2PSJuDžĨ\s?ݒq]",ʌ1!Jq lTB@͌["A 1IZOsMn6^A>HSH(_ *I|OMmpI?KS%D?_b*Dur/&2^?[<{gٮR_Nmo#-N=x& j>*KӝsKIwi?J ?}?UA9ʟPJOPR:-M>["XNhT&ȸ `'Nq:d%zv|So쫛JuOLVo'9?[Ҥ,dzٕhET e#3 J+ ~)e'~Uz|EW.9IzO'XU{>u!GCp|۝o)?<}~eքeG&9}_,BMG*kQeTI*j%+`^O%*tNӈJINNi:E'1tƝ' z i-GI( b'poo()CD+&]aŠ7zỸֺ YFޢm$˸p;hB~_13O˾z;Kj'5KN'd/=OA%嚥t79?/"^G  o! `W8:'Bc '~пX}Jܗn9|>l=xT:*eU HR@U eF7J(BI'JE\mte:0UnR ⌳pqʺ6֦6 \xOPw$m#I*ȊxSpdW \ZwV#Oֶ #=SAAns*R#&]^k)$) qA$.7flGli PeRca68#KmH HZ<[$n46#.D0IfXJ\*y8VCd2 c**9RIx!ŗAH&|BAWB[u֝TӌmfI[N]nkK 5:ҩ9^J4]Ln>2Z9dH~b\ RBAQE?ϿuAq#}ԚVm٦լC3JQյ$3L5?/kFAf>v]hȅ20 nC[o@B$ T=7iX,$B Mv?H)3jfw!V˯G!d貉 RTBR īqF*PRJ[t*|k  Գ:)˖ᵵjnֻh泜[W媵[ۂ9HZBJRG"Θr)BoI۵"Mx y1%iJil(@7Rn.}>Cp1uܿ#G#үmc]nb`sߥ{ة'6@T|$$Bq~G:cz0m*~Z<wOOc6>A}PV~g1v w]6 7Je5HkuYV_}?6>o05-Jn(TIN2$oI$A[BslUtz1?zf\9dB:k1Tsbl cHmƠGK :H/)AK ,VIk9Sރu% FJ=6]w.!LW1H3Z n;Cŷ<!j$|/Z4٪(dUݡL%|6zȡ]/E a+4M}L5u%p*qːy-3:Z.nIާbsj$O4K1em 36jtðm>6 M)+z(۬6i}չkpm8}ҳ /BF"Ng0cCxVt$@*mCB]E'2@r| =6o8GN|Ǻ5|JrX˹ŽRcns-)j-TDwJR*z|0g*FKv:Y)R$q{nsm&&.WOo6X x ׷jo?0[8eu,ZT'^ZV`]* ;6\ *yg-$tPV6t!8KR K ޖ A wej,{#mCcyX &D KV-u9\WwE?W`$%^0Ob[Z \=ATWԒ}cI6'h#xkR꺛UҐA#mSo[{tI֖ZmnJd-ԞGw9;5srVN\W)d!ڀ ]RIZ;JC)#8JM7Vܚ]iu_<?gdFKfjS3Zi6rԖ?(BAn1Z\6WZoMmO`cK2Z=G/ S+=Iy< > }jI[Gg\«ɕP P鏉0lOBA TO, 5L( ;yQ ( a}o)*11Uh0̟n_j+~3r z0JRER;rWHtYB!anҒnwtRz&3*sU6DI 4:Xۺ*UE8B֕KH;Blܨ) 7#mn1izm}My]4JO]/Ps ΩOu[m{\= DG}h" $HRc 6 i;EATݬլQ-IK0@ &  *OB;ĉ3֜.7Oq(JyH#)ܢ `ks Os S}}N*;?O<7 Qaי.ˈ} [RnEOBnFJ2A0y[a2Z.%xõD-~E85cmå!+(uܥa)  4R_$. 7. ӪX´RwշM>- F%}4~D#qY?^L7LHAj)BPI )=%yuPZqRM(ۢ >Q[ 7̙UĪ[HZenX@"SjHZO$a2Ĉe@U t  VSik]կWәSoE%`<|0–w nu=[(\tK%!8ej|2ʃTd&ɿq k jZYZI]e[RZ(ԗTZQ+VС+A$(H#Q^ۥ}Un,qtl'ﰂOPWRR9i_I*/c|HfoL?h.]z`o;=czR$3K8+^+E-)&L\ӈ>t*S*ԯ֑"nna&Li.dyʮ-0np2RSFَ渵"v%@bH7t20{E[W[Ij2)tG)miM^ O4X]!>!ͳ /Mk%ݶh|ޚ&|ieeyM%96I?44R9Vo̒\RĖjkfJRyd- r#h =ncJZp.C1 b_B~KrU*[o]e)=_7,$8+RoKN\ Bei1[ >"$>Ӟ(ҔJ$(BPmܔk{$I!I$S7s{58k~%fc.M2t$6ӈޣ=1?wvBQs^^\Ne)S7d3!h HVԐPĮ<2s<4tc+"\-a+y%ey+]mG 7"5]K]JZwz[*Wc{ ˅]](hRr!^ڕ`垌Ks(&}/3fc%I=էxn\\(zוnZKU-H_{L&L7./q3M!*9ʹbߗ-WcP!vQ>CݎÍKG.9"s?'͌5>2'>) 7$bq?C JMPe/9,BXy"O D m)@t &]a)X $yw"bf|=?wOjӸ^.9=OqA%嚥t79?/"^G  o! `V'Bc &'~пX}Jܗ9S=%"9nXtU/F0Ukm57 Oj%=>[RU:zZπj[⌳Qh6'ȥ&oh=Z!D#+ NkjRaqIm j(=8EX6c6+!1<0ҥ:I%)#$Dȕh,"&q4IؐEHBc`ZN* TVŧn䍍:upj;ӳNOڙ/%g"T3=NbLEyn([m{|V@R7%d=3&iiY+e:(z|$f%d=Ϟa P-($.Moi^B9oDY;O.Xg&8.WM@jrBd14TB0C1Q$ǔCiݸxlw8M+[Y_\ ؁Ew<1ʓwq?mZjՒ\:  1wVN"7`.n~2\(v9䷟0JiB7+)~Ƕ|lt6FMFg1R7D&]οKzWÊKp_̵_uI%֫SB#B2vy}F0TayCuN}V ˟LazWÁ%SDw:,E޶VOgJ~LUĢ࿙j"Z`vrX?~DOORq!w1iz.8OuUHKSѺlDtQJRT`k;7&xu!eJ٭̖iqNb }E!qB^n+Z`@!Eo12X}o} Dr< A>(GK3\UefTJ}Y\](ޮZ•A5dBvr˯^^|kmT*A Q"::ܝrP\G9;pUO@._H2ZrN7C:b2+ 9|%i]@xIozᜳ3RZuƌؓCaINۦ;ZT}mɺ8N{y~6fUsIzNRl PIRlwZ׷6?N,f7sB9k-JDA[T[,Q"- e75ҲEٞhQU9tm#brt;Hj3M.BĔ{YJEr%; 8>#nѾeHةk._~Qb[WkI8˨LXT$,t~<A?87N1m1O r/ZU=;DXO/<5.qzvsHkUW1M$Ҭ??~ >h;tjkFe/Q֤AJS@ V%AVQf<K Y6޻%rÔӒ{^5֍Q uI[SM Ӵ(m)PCK9uŠnJ7K@LF!H*RR7҂xT"ۏ՜”eo]~ލ,c)߉=_[%UMtKnH2G u m+*I*$H (~0RܭY![P<)K/Z}Q2,b`Pʒ*@7O[Ō2E{P뒊3R`lQh"wP}oa*NJ3f],ݼ=k4!VQݯ|,JXye$nmV)$؟h`7 ݎf\6+ۺ.$ڎ)H\JIOE{lH~8kXϋM&Z|II}SQzw} T4M |sem?2-WE%iq@XG`z ؃N_ܛE&2ZB!2;:\e8+p)qJݸ[z1W)wPui8(%N#fТnSrN_Y[]v&| >;/km'gGO.Lѣ=P},! )im <Ʒ79KQ\jEB\-ӒEM>R⋛V b#蝗f?5S:1j-)Zۤzd{K[:~jh^Zڴ TN4(Q6cbHu U*oC=@p=.iP(.NnɌ? q'F3Ǝ#z9#i_k]&'DkI|0<ځ0$<N`Yre(C/?9̯d9=OqA%嚥t'ډR:wۗf#70` + `ys E$xW{?'|PX}Jܗ8PiAI NO1S"B!XM8O soO{?u>%u1bS{r2I>EU0@k:uvJOܦJ]MVڒMI$@\rOv}<$Ys%<~785)gaH?N'2TR& aH -CsAIe)xv16LWe! S *,!;7cwhsjuW0NDQ ==XIYm R- (WkJIKJv) ]BVjv) \nJ@)i/CVNq6ME꣫_,L.]IP^YrMooo3Gݙ_Zӧy£NL-CfVozTjk%j]],LQ6Qx9R2u6%*24zi-aWA!CrT"jgk˳DwGjaneZRPO*?9PUP~ ) GLe tv׸]@n&U#R zVګF6~q,MS'p*Qf;w-TN1p鞲}vXzHE;,9Q +cۥkC$jPs l XX 4۝g$hK+>Pr1`/8>1'cLiHq)-^IQ/ŵc6T7:1 Zd:~ɞݬT} ~ R?)^IhȮmhusK: X&K_]CF->_~tŅdT%(BbIP$2,B~Q얶̀T<_uUpH#k6U*ٍ~ڗ.1HQNFYsb:6eVO6!ݢ?zҎU3)i=(o.SE{gǪBCW-bk t¦2Ƌͬ.m*f EKn(KHu(HW7v,3m)'8cMRE)*K;hypN'6ZBԦԧ tXJJrRͦiZ-֚6k6+Ծ9u^/2Us6k!MR#Ԙ`(H+gglsGW%LKZ3Ғn<얎Yh$$(m -13$-Ru [;aKZx$/ڒ8BH.0a™ZNࠢ؅$-hNuJvmzY7J+2>^ TrKΙv0e i0'P3d + H ;l@rnyT;VF:f㎷Hr[[wewY}$Ei qG"Or$% YR=4U_ȑbJT._[fjb݇GK'`!q1CgH꣦79@f%wWlj)$m#xRw|ѽYs5%^5Rt |L]^L|vvr!M jq!T\$OUh_8Ux-"j&Os+=.FVDfIJԷzmVŐvi'VѺco"fӖg/MKD) )e Jq-j|TshIb ) VB\ #V; _}Va\I$!nmp"B*-xP q;Yo? ]%gm8ҧ >O?ˏ 4U_qp?_ Z[[-W[MC(@/!JCcwL&@)ZZ{RiN]VJȧɀ T$5)JNIy؅Facc>fvXqv%&\} A_u7~ն>j:ǃHRG-ށ'vp;;y]vkJ9Fؕj-(_%$(esbLy=BZ/(ūi*)J Vk6;ZT=Oۣ/:5JDuSܻ(%7Y*zנP;_5 ~Jf8䥤)Pߴ%V7 $wڟjޢR[K ߊR P@kf+3-.s_YDc:JVJJyY=7N'57,p3SW;-VtTMJڢJIN vY\JqGV3%i-@v$RxEnB>.!)uM=6>V.jB,)v)n *F4fovs޼x)1&vMւTlH$X9RXĹF띶-7NՍ ]H?vVzSob.p./@(Nچeq.NR: Dm7Q[WBB@ 4bݴJ {ЙsPZJ]O{:Z:ݤ㶜\WZrйՔb.&)j岒H'h*II=O(N*2ֵ (h%"ŽŐ/pU oӵRAYLH16se黥p-uX#!wrt-A(W[[s:Pw<ߞދ]zo Ү2RmW/}<W>5'݆'K*Zۿy_lwg*>tkXV0&T7:1 Zd:~ɞݬT} ~ R?)^HDX9%6q}C3rJY)TVr{K׽_љBJ|Pvh -n)FHH'$cB(ӍJъI.h(SJ4i+F)$%GJ$lApCۋ5!4lԬRȨH&RRQ N$\x@B nu3j))ugs;THSZϩ0]WgUA̷.J<"A[J%$+c%$aMSb{≵zblGq9&QG+"ׂ'/sitSeฬ)?+>H)?Zǖ OU7^-Z\^3P=A\KR|mMm\|CFT-^Ƿ7ưI]1/s J9:"}? (Cw lɗpiD' #t|w`~;DC$dfs<OA%嚥t'#L ډR:wۗf#70` +D__,a"»g3y}Jyy$.9YrV[%IܧSSlZ7xꔮl83P2mҲG4Z5`#Goj[hSl)HRQr9da#ҮLِ K֪4KlEs)T 6ˏ8i!j[Q! B]-=3gfV&+)! S bm P hHʫVyuS"VG*f)ZI{U~olǴL,p(85-vMl4gIJo(Y>Ww^O=ac:fUj1[T`-)j}8w)  kuIRʚS1dv.Þ)!Ĩ $} E]+TJbVj:VxVjY`3$vD}ְk~iE/-O;He#= 46G)UH)B 7!)H%R4*ڭ][+sx&o[+imSYĐzqn2Bp>+]cOw ڒ?^Ve3ܝ8ʓA2F.*c |T+nmJsp>u\_ٯ1/&GvGa_/R \2,T-'$j1>ݕkӊ  Tc5QKaQ`BPBSԫozr5 ]зi@"+m,q<3V;B.gpݩfZ5gk0eIJ[i;WUHHW:[Xp+݇Z^u 7Ԧ9Yx`@U t{TV[,ߐ#K6\u'8CeRpڔG^L{ ˳DӸAH%I>p:K7WSDdi֨K\SʤPWJA^u*q@GvF2d1S!)9i |6'k[m4^Jw MJ׶)( &w+uXd!tUiq% [ q,%)m.Ի{bwH<> Z3ԗ * .Yq]v(I!W)&iW3jMiY"B2]Ԁj56;zt(?fjut0"'Qb:&Rߙ/o:F%j 1DEJK}c$diPmQ/%W\Tg_<ەP-DŽG$}WoW竽Drd=Ϻzh#g@pllyTVۤٓL<UiSS߳d7m5;oeZ@4Px w6/:s-(vGӉJFZPs:d`+z)%J. dP +~3j۹$()XZA,Ta}{pc_r$qLs . K6Qmu)=MПq]-N\x";u_u;sskꄑ_o h7hp MN/\4eW[R,, )(ڐ7ܺve &pqe;WfK+) pZ|Y/SJK~,L %'0Nԥ)I au+?:f_Hl%X*NԄ*۳@$_*]ʒ n:Zq$TWVieۛ8Ty$ؖ*B15Vjc9]Su[IS}'v妣_s=s>:Ф ̶JKP bjp28,\ڏ5#Բ2ЉjQKڂIڢrȸFVY MVDy?4MvN PIIRo<ԟJn:pg6NqaʯHIVapQ}V/ZJ[9VDaY@϶ DH8;0Z8xu_Qs]YDV25u%Y~Id<{:_d3z~ePQnqXV/&9W*rH'a_/R \2,H/&Gv#Kfe/1RשSJIzC7Umj%[D8/XR"F[jk/iT<܂&dg0o+T⚋.8k[ndn kj~ dͼ/e<פgYG6ҹѢæƍ.#y>u!d)a+mFIZpRxiߥM1[ ]M,$nNxx%qٓ_'ۆQs>]ujl*be9է)EjP+=Ht(!T}k:E)=Nn؝,~$ W$j/a{_t=4KYqRcSi)JE*J nJw%Bܛвj~PW ̍Qy."  ,$D8io:*jxqMAh%HRFQ*);}Ī*>=F|%j"\-5e@#%""|7A7굪_ooFTm0hԌ͗cM~~?ݲl:ۊ: $$N3_Z hwru/,'1eM.^Fm k;$`d:2?^DRKLה R TBo~&V+GkmSح*?;- RII;/wvӒ_-9= >pUŶX*ǟqnٳ+}ȗ[ Q@ڬK,Rr[ z5>]MYJ36+ VJ%3m{*؜@q'rkI\?~L]^-w.$EaL!<…som[w$$%}֗]gj^NION*PQ9})UԖ@eA-8mIB w);1(|~vC'|`gVFfTFp\"Z]U1ljwR%a\Sb.T5]jjrn +)v(ԂHVb77 ߾H"%~N]\U_cUVEqo,*2, iXe%Ξ1Nی5c2B7q*IGk+݇K J{.R\m>U!ima$GU^WR JJȚԒnV'6>.Qb#h7?z]>^G٩^?^5HILu!lx';J*HU>(UYĤ!x̑Mj%="Bvseog[YVjn`Bd ^U^RlEk\؎7\3wZӵiKqUXE(ʰEf+[^]UE)LB)qJ+J7MAp6{v%M* |bE!i)9R\IKE$OP9 &ր=*}ZZvkizjU)c(MʔRlbD%78ŸW1V[ZVIAb*/JE/d267E@W;BE6UKYFIԴBYʪ$HkY$ V|¬ys׾+^*8U޲G;UW V'zaBzy_"Qɟz_ㆵ^$7&e=/W Uİj|ɹkg6N/`KΜ/^_Ӝ34z֧Ϥ˩V9LD-f[n/Tf HcJI/oo ȗ_.[*O“5NnlQO.n`I3eO5,x;<RHU7)UHnc5^s7{ )ro_mJRTaYYHnS⚶ބ%7L:)q}{=x7gc3O(w}ۋ(ni qx:3e*dȒ*4T()H$QeX+ @q+Kq|^zc#"e\CrZi(lB=I MƥԲj88 4IZy e,\UI+y܍Qmg?ƥ~ʿc]ggRp_16ÈǛj_V{[퉯)-s=nvN}MH޿MeZ_xo7WvŶX*2l ׋qyg*r:5nY7&?2,r:OzWhFo>:NBiJk2 eHH=n%3"g1. f']weW&<%CB}`3#G[wX8SZ%w>e#02O:XUgҪ^t)*bD7ۧ>mYHZVA8n3]JzN$5VnG5JK8Ve[R`E.1cRp{ƓQٔhSsV&'cXʈO 'rIITA1m>/J>:^\9|B )9mK1jyDv-) }ȨBT}\BPnH2rʕj=bJk3NO5Οد74v? CQug-SV[Q蔚E&3p Fim@ B g;oNGxX}2`*O;&+4;/pue<Z %?sH TB*>\建TMTF^v~Ԅ7 Qnߩ0 -Ѵ_/0X8/ zR~ P Ue x/) #I_61kzn,;{I<ʔ` mbGBP醁>g%{yRq %V8?xhz!e̲'Mun *⧝²=nZf7vukpl=j(SgGg>wWY:uJc#dSyH3s_3Ƣ%KN.G 7#x>.\d H ._&M<爙v$B:#:ђbs:##?TԎ0O{*jPi=-e.PzLZ8$Tғ5܅Kq؉_Soר9 O[(LtߊgjqΡI~_5ڌs<8;K0+`AŶx#^U -AR+'r'hE'DFq%eoM9~Y຅i3Z]yo!\2Qquґ b!Gރ&R SZ%w>eVxZy6g;r$|˙jzo 5?`υ1 S%NCKGHt4SW5VTr-ӑsV_^v[n#>|,9Rde9%bWLҔҒS([9߾(~e5++4TRhrnޘ[?1L``A]R'NJi'?bqJe x/[qddw l4_~ ^sow> bHx8R lm^T 9[>ZQ2fLYf#6)QXS\HSUe2R)6|8\qӚ5i*X21Tv\%sU-1^>KqLIl(gZtZFѩHٺT?s;Q).TiL$R*: :sGrfLYGj Sn:)VXdmZʻ+Ûc]t8UByԈ(ZZL?e= TΕ1PaK>Nrh|l/#TU5'>ȨL͗K7_ӫ5JSaETibRup8;K0+c4e3V[Ҧ9)8E}pd= J Z}YpvڒFs U93ǯSY.PaR38E2S &NBZ4CMG^,iƤmգt|Eu2)^%~S黹7ƍ3/핹eJVNt҃YB w Yq^qũ^u78ΩN:ZԥJ;Rzs#`I-ARu*7BRP&-!ҏhVߙdqR%!*BDp~gL./i>3 uLyJfGIꎶqJ0J|?nݩ8CULf .\;;d^ȘҶfJ&JyaoXt^:=D5Hɼej[ eK1?j HI tuCJzb*j)qDBP?)  a#g# Z7XRbKd94PhPak -LKПD{SBJImcm$.!LE43GS i6\RѺ$&SM0Zb3㺅~*\wޜrgz.Fz:Ob=5&-;(Q;)13HQnB Xv]Qj2Vgq|emYu]sseey`mPjJԖWژȲ撗+`gʋvLQn}ғbO5)Ž&M$NV$ { 鸲VH;HrΓ>+ͽl[0q}41Wtlř}KOEJDt 9Kj~Da! \9R[zW'*|pUo=_w>q.R6OQ( |z_!Ri75ls*JVqO4FW&X\SILZL&͹_f ;^r%"-qVoa.AD*]?=>4s4M(ɱ(9~S`RPd-^qũןy}Vy)\qkZ)DH~,S4C+7s<7Oo{1twϭz‰Kκw KѢt:P@4M>} uU#,Cц$2^RtՕHwk''~tv8)KV!I;ZeYl!Bwa“?Fƅq)5O>՟]L-3ӓ2Zf@oGi.z3'?3qj3P,yjFt]%BӪ;jBNrބe :F,!Ynu T3ȏ.סIBIJO'k+I@#Nҕy2/DD*\JT8}\*qun:ΩN:qjRԥju}-.F5HyLڕ+/=fhTTeBTI T)9Y:{/#9m *յ:BȍZa:mҧ52 歩1[2RH(;wF_WtS/\bc˝HjJe=bFQЙqV.EalLiJ/ ` עbqHhnvy cRzs#`.OO@ `ߩf&-B6@S+GciJ=xR,xs?TBkUaY|uwq6r}LC! wU[&]Å+@c03b9<A%嚥t'3? ډR:wۗf#70` +C_?1a_A*ȕ.x”R=xzRÏj:(KIW+ ÏvE5qԭzFreT|>8⌳gGqᎡ܉ ?WHҫŸȵ/P7՞=n>+1 ]=OÊ+FFP'RA1?|k"{۱Imtlхc$}.1ZlCDJU:&86-KK:= Hp H6Jf #I8R|I!]-x+*60bYIJ8n?j?)1Pʏֺz/wY,qf__."+yY?)!|.";J6% kumo h}ّY1L~G#-O1oWHcͪbizlzXOUb,AiAV\YbfP>KnH-ym $P(pZO^lyz$I 6:OQ0$87{&:MqⶢIO[!kcw"AgVz4Pt懟 _SLgHm}`i \zEBG|b +Fac xy'Āo1b%z1t;xH80GH$y$RcbԻzQ|z6)Lci8|t?D9JV0Cm)B GcFq$~~xRv%he t>(eG˗nE1ZmW?@xXJ>Ey ]z+'+umo h{a~ ȹ>b[2?k?<ٽ]#﵌4‡K+1Im^#`Acj{+sAV\Yb|\Bд<%rY=1PerL_d2Hb胩}cIqF%Imͧ!Wc6L˥}F/IRh@ &:MqC~/**/Ώ|Űk>ϼgVz4Ptv?=T^֭y,w>A1?|k e# iǠ F?T 4> VkȂ/԰W>Ih@~ބ zҋ)0pcm3?dmb>FoO5GEqIL[kc=J'jyL.HO0$QI7C(eGzzs)nv/PYrȿ:\DWw~Rݼg׸lPǠ2W^ .2շMnl{ d{_ڟ _̽y*A9O_IP/o:4!%a ܄%[Mv>)}eX-_^ߗ??gOjӸ CD p6aʴbzb2?1L}k4Br [OjӸܼ5y6 1, 0 a]z%Bc _//1E_a%Fj@q[ԕk͇ITz&_诽*2qo#q<--dɆ3ڃ7!;C~^b>`T" ^3vPRQb秫L?elVgaFIƽP ?I8IpKl?ByL!-J?w|A[NdL8=#$]_tO_lnm0TYZK%|Zzf0-uCnkgLҗ4cPjq+9S|J)y,*Z^_qM))bA()3I2`d{.ʩ|+]zے]v39;4f,J! p?.m՝OH_ _}3I'ˌ5Ɛ{O>)LWG{>F5ylփH2TQ%䛀!7) QӚ-q]UBR~O2. UG?\8?laǠ=? =\#Ўp6#gS1WZruBR̕LYdW'3_&V{\My7tnHTTS3]-R['kiE]ll{%{-5!4 yn-A B5"Tw1=F79\.et6@JVM:2.IQjMM<4jkdDa%[oӚ@PJpdW%"Mnyqj$wJʀ@ؔN++r翐LNn,%\uYE 6M#?zԖRsR sQj I7R;1d(`P"q _7B 8MStNT q]LI[Hm|H6Y)ZUС u8coKkp!]Ut,dZ,C̲}ۙMvvxfh}$}'P{Vkn}nE&C}=;>+@fd3fřՔԹiDpowzyeB7.ywRYSM2 :]/}2)Q}OnQ8k$y13M<2>ˌ}-D*ꔎ?8*^B' sE<%+6*9$_c\$z%W+YZ &V͵uң=|fvA1K[a{HHHlܨuH; 9iğ?|6Mh޿Mq'&8NNҠ>\LJ&UŲ~s~`IsSH=yŅf?H?d}r2 t\=4}*N*9S[3~Ӿh@?ğØ"wzO#a7/ Y$̨Qs;j3X/ۊJJ >08W4?SuMnuWY{4cV)s9.Qd4sbnBv!B lѦ= o~͊da'JIVGٱ}JWoK72$n4%!7BtR\l2)K$Aq';|iAcRsE=]Za|bJp;GI65ɀ=\#Ўqu4BSZbA35955V<:iwgjLtTz)ԳT])SiRaJ8:ܜ'ұg9jqQa`#[y0hG9ɺWKES~b5ƾγg27́y2^_8e}ple2ߵJ4CJ~񭩜=-rwzW6GSC R֢5^o%6T &%S8q6,ɍzZuJ*J Rll3+N*F [80ⷊ|3w;)2%4M/Ii9AS}{AWFa:%H HqMe%O@ #B{wa(~ s“ !A7 l{=o>QS9!eYoiS"%@A>*ZAR|]ܦky$H ! rXd7,m6lq{v!Ԓw6Oq",lINfjaT^k]Aťiu-*HRDn))R4&l9k`f1x6\!ITw*I>z|Jk禶7 •K:/W JUd8z;}STeSjZ3\գmFOxk-28Mr=E`ku;s&Vm Ckqn36B!!+XܠTwy-wOTR*TSr$nJz,"y/A:ٳR!bCJBp I7hCOnDg Wz`Y^:|Um'I!D R[P!$T=;{]^km<޿[,J> %-heOhZ=uAP %(+**Y w 6MۿSu+deg}J@l\ָؔ7[#0Ou|) ZT4 &Bms%Y[^()K,u\Q[ KI꡵#ԋVioӣ\q8VpvyK4f4œ!ɜf8hUxl{A!#7DJQTNhv.Ƕ#Wrgߑ+^\R@p9'c۹I;4e itBg; @;ԑsǠ=? -R6YJ3P+^6y1v7`(R| ɧz[30Tq6F'CТ6r.rɁ FqaC%77QHF̓`/sBd+X;`<,mX ].)Ũ* @ ۨWK_/Ѽoc/?z1t.rAlĕ74n8>tnf wHXNzu&EVYQe)Ό*JI)wogSdEImJ) >6ԅ\tOo4/F(\Rxk)vk_i:{,fX3H_).ΈE Y[X-IS!= %IKv H%$*]Y$ٯi2ʪ'RQM-ȭ;_apyn#ZkWןI4[zPP(+A=Mm=VvѪJVft))*Qx~~KoRTH,--R M3]8V8₊[ J6RJScW>c𾜹甲lW}>?jBtꝗX1.UV~Wçr vT/~׉]w {K =fʄ:Í(dďCQ܍ )ZkUtA!cu^I7W.Zu|g[Z՜ܵ[W6ǭg[bwdi4^3:08+%oHpk۷1 l:@K^AkdN1e 3[/7 3Mu؞L_]o٣yrcm-YQ"?k6DKtnځ?Ϛ7N 1z*i!<0栕^5c -,/q{V^а9vOjӸܼ5y6 1, 0 a]z%Bc y EQW~Du[;Ox6cPENKUfDM-[k2NK<>Y l;u:j 6!%0O$Q`5@},Vd"XU1Didy~vfj 1 Қmnuw&3%II!HSjQsy*ܔ`s:ԸoVedZX:uE{t{~!'+׬yjuLߖr,jhnRva J[wڗP@M.DF}4#"Osjɵ`;Ym*J]Tt:╠hj-,:*p8rz(m aSCOMq-M9uKs1g*ғRkxmKm-NdF35uJ}켰.);yC)(S@t hZͧ;j,H ЕKz=珎(f-A9XB4}Jz4drKbڿ0w-6\&&>e̍PSMnCjkf#ΥKm PꅛmsUNZ+{6ml~񵮚68yt'k_G߇M-biAv[ɴxVmƁ׻`1I"ϤZ4F:OC, cg?ӻfC6 c7,J2RG3wy0$&IldcL^OŵST 'A8qHK P=v!ˀTj br'ب%d%Dt IB&Qٱ!ⷈJ:948%jeWuqw <0>;O'~Kr6nL>R%%]Aqo6 VԬ,3Rɕ j|#K{02A\ڥ(s}ŕ42Y͞9BiHp$ KK#zaBd|:i$ -H}jѝܽ n%D,U {;kMZˣ 󥽙<&Q&>K[m.M;JVXY KOI6q)¥*ΩCݿqIv*(ÊϙV;l03łn q( .B,ۄ_-8(uX %$( pVG'o!v"eb77{!Qe [TpTOrR0JwyRbCSj j1[ BEJ{&_+-1 鿒 K?Oظ8b!`@,}a]HZ;'Ѷ*²$OќO*/iP$2=KFE*|kLQ=Ye(/;c}+[roogɎPVT|>N⥛^0;yzjBgfif4Sm4$6oUJd1ϔ|#W9vDN3 =ڭY..tL4ځN2-~ .Jmm ?BNjj ϙHӒIv*ѩ[uШEviN$(Ik NΕG$jjCH2nmܑo2̵x\)NˍDj+-=!.*(h8\U~,QUK".V4 ޽cD<Bd5IdYiu/3k%&rbZ"Pո@]u,6mJ@tg,FnWMiFe׭^%1L<$5SPxƇ sNrd-j;ͷ⡦ qt{M 1Nj}>r-+ml]HH=H}r[qۅ%d8.:އuvdL=o}XU6c s=nrnvj@'@ ]. 2uc?OjfQ>TRO2@rmnBRv+]7l=ˍ a[P~h5Y1IM: |d#Շπ:|l_IRl$~8*Q?tw;6sla*O:Á%ƙ {b bj_ (Tu6l`o̹zuG,.je}rYG~AGt1Js`BԆZP d4XmGx|ٳT+YKG-[}j[!r[qk˔zBHS*B(qKd6rYo/\@\N2^Y9SQ]8&SN–J$ -'"NoFi:yZ z2 ߘL%mlm`- *u> bh&{S[fRJTlU^r:GN! Ie [[,2uj!^sG5 쬕 5592aByq$F[%kԘr< [i PZ JAZÅ2P_D 6)&}pV8$é6 ?WAg0!LS*AbQ͕4u%8 =QT}N>|Ssj xd'Ʊ cyoʘJVi:^J19KPԝvM q'v(a2:=tih:fm-ܝ!+]lNlr: biQ*cJ-Յ< ki{}QNJU>aq n28:=;G&6\J8|Mٴ=zQvyק=hP2R)SaʎI RH)P$u:PƦR)ő[T$ߨ *IrMKP^KSGqVӒѲPF˅uM{'2>25pK/Η1rJH? /ow:w ,JX~fiwy7W'nM[D.oӛ##fplMo-M˚HUIK느[TT'[z:"!PN-$qn@sL2o#vaDJVZt~${qYM Z2On~ Ds9Ҋ[H+3P^ٵ)uI RV@%$w(j}"]Kn2k$m>5#V]![MVP ($ Ҡ IH=.WcxRS 8[YR>0=5qt2TtT*Q濧Ha PiZFuobUpA7lom]8x?Il\__ ۰ dN! Ke!7ׯÇ%Ş2xO.[rZ^Ç$#X٥!Ț¿*6B<%S{'$pxډR:wۗf#70` +ߓD__,a#¹(kymEjؕecǠjJzu|x-O&oP<P~ܗ!cMiSn!/!p*񁽷yJ 󵷊p5٠g93D \*kL8J%~:h)J͖ehJ5O6;Vwlҟ%ԐG_%dRa6q7MS--e]LSm>ȠӨ*)YH) 'i8u3L -FI'* kk{6:tqXMūY߇N;M{M~6!_#o)5!IJuMn@)7oeE0Q3U2L#L+o:͓jwE_gfDҜĊjmVS2mҠHwxN)h v!r9_̓6ONՌ_ie)f3kmVRivd)>mKbE *|JOXݹFl3ui.kzҌmK:RVv~ T8|5WgjDjAS-َ \JeAJټ;o*^dLO5/WÎVC~Jol)+66AQHzQ5UKUnl6LWG= xB%t[;RyBw-VUxzYځtPU[/Qj4Wu 6Td/amJN^]<ޜgԷ +;>N.Rzl5✪7 ]vvӻКS!LJ)S[WS0 [ދoCp9@"E^5,AYGY)Ƨ?*mUT{Fe3.V$pv@ t*@t*RdF"䔙 7Ie܋nNʦSRUtӚI rRIt [}sph#]5^mE%ڵru m Kip*=~R*]?Vl̺Y"5MYcL!8\ )jPEڬ.JAP*IˁZ5's%&%'aRBԂ)WC&CjjKh[]̸o#P[,$+;#ڗZB֨ YocKiG)mKmJ fJA$ T)/󶫗-7DJ? 2#/RRL`o]+)nJzFB{9nxAU],q:%sY[VzN6쥡D ,2RNೳfE*b`:4u:${ªN ao,]!)I0cd2Oʏq鐭0ԐqR&I[}"Q4r|.ѓ@G[˚P SnWBd24ڊ[y<!,*ΤnBјԴb(P ryr\TiIH|ԔG{cINsr1ycQ3$Q*4jXI4B6剳 Qxc$ѨҴy{*Ü--&KY5)=*21.&$T׮ פu4J~j, rRiU'He4jv¦-<ˍsj!e|¦jȠ543&-KKࢁDEe*ǝZi3EЕ*P[#58xSM\+dz>(TM'!EueK2:`I,E,@RŔV :fʥwFiuZ6BPҪBJpw|T〩R6R$p`ey(AeExm՝qnE#fL[%ݹ\9z"֧$ o̙guOƬTD\OVRˬ&ScslɸU촪lrIwww{ڄ(ki%ZvDZ}rުg< Em{9Qo_))9)GfngJCd*}ז w $ ݴ?jIN OݴTYn)rC& eed^TJg RRvY:Qcqe%R-Q7XZmo}}gfmSrl"$ښZw,s7 +r&Jb)ja6e}RJ' mQꔇ]C;s]6 rUK2JnTKKVJPRBBĥwQSjؑtJ $ݺs{jK.,8y[ q >6VMGNEĎK)9_LLXWڗ_NIƕ2DX/%[l 66oJp3ْ]K+ PK7*Y;Vu>U MڵlUWӓD9Xs_cH&s&}Co k݅ǚ?* zsbS[.}8+^^T@%@đK ~wRcP3-m2һu*RJJH'Vʎ@t҅KOh#cV-rEJOC@?1}OPq&ciU=%1/-%( AQ @Y$'tޭHf]\e((xOyGA{͎(d镕2˔y)uV.zځMקsԁ{XڲpqY7-'rGu$']zcmN}]﯐jD-v*!6O~W)qHW<_pRV3|`cm>6%¬Gu$\N65vK$0'T^twJ-gZ Fp8 *IVg Vs\ݬ|qA%嚥t>aE|1fRFΗXKj'5Knrn^E ߖC 0v~O-~ gؿ"?PX}Jܗn:R @''ZVi` B7 H?/aqB n£mu-á -}/2tA7޻[}LqFY$ '-q 8}bT,"-Q%ސr VHmrJoepH[n Sg݂ҟP O-ֈ<^HAKXf1fDFj{LT)TRWPnB JOQƚ~$K×m mi-6-:/cfJ摖3 k8؟S\q*oPmAM t-*_'ʼnl  h%V^v,ߘ2a.2 ѸN !;9T1iYJҒ I) oF lX%#}CfsIujlLcx_ޗM-Evj c"[zUV8`XEa>[ .TUWpVIz?+ח4n-j]E+Oi[J6񱤸D-p #z@v8:|f[o\YLgixsUyQ%!]Tn=*KPuFj&@wQ_V<|T]be+!r[Jۜb|mq* eaJ}! 'MTVsvUHJ4rP;Fi͈8ޔ&ݛePL.9-63v4Tm ElGE8xtm^|;O~ ::E9"1ÙrLX’,r(6H@6Dvi@Ďp_((J=.OTqo|.Ёǜ;Ԡ?]n΄_\&p{l`-J &ߤm;}x !aS < #Q["R o0pX_(sp{knyfꆍkj}nEV>@t**nT7$LAZWsP@TUܴ oE=vp^O-[M庽OǝcPwfM-ˏu( ~ܙt-Fe.J NthܲlmJRR{4/}_)'4/QQTvĥd y91+}jiAޢ 'hx4p|dE`8k} W">g[ݛii'̦VR\LФ-JRH>)$7ދWrl 7-7oVe7KN:wYYJIQ z7Ų)>*`  ]*6ܱ|?(T-{LB eHKBOc >ոGp4Pe(=z 7F*mU' L?Ē7Q.RҨm W񻮠==hdC.xIv W,K@Owr@ܧC09a PlX>`M"-26ؠvҒU: Dn&}/: )JGK߿ku:!XRޕ.%"(*)J&<+9%q@Pl! {" |U%B Bq䀰Ey-wnTT lOm7[D5Ts 3[u\q2!)IФ׹;R MQMɑ 5=qn܏#/~'cpRFSe\dp ywZ@ 7*BJ<-ONiJS6(Tz l>)O1WU{JM_}<:41Y%)mKn͏2+EX' G[r*y+P +m-[J)6"8pg`Tڶ 6BNҠ.(hH.B\we_C-Iaj!lRJp 4Zmzl94QDf_m16%[B@!*~|k%$kG\_hI6 8jy(fP5ʇ!% q* B NNе#8%-թ B'Q"8$}G9 B2mkF yڿ-a{~$96ɟ|~pְRwa {]޹spV/ R.ɷG+ݢrJDҟq|D:>AL6˷hF9ƠL̶-I@ :$zΪB1xmt7 s^CJZ>]Rl}2q*qe 7IzH{{+q0˭R'P pߋU;KڢwrK|5o-jj$w^ !E(I$ u'uZ\<*;wпUIa᫓_iVplG"RT>}:TxZ\3&<Vy*B[v*![A>r=."2َ8CA$oc{AF:vC,#sA w&:ܞ*'I|SxU[|o}mߓcD$%e !#>*GN@-AtXuEŬ>WkpP*0xn=AKDX[Sf+尫k-CE>'k[Smhe۔TA mſueCLvunh-ow #GGQ-K2> A2AI]Rn?>(?$|TΝ&i)VeZKj'5Knrn^E ߖC 0v}~Om g[#E^VNpx5쁯jsQdNRR3P>`٘g7w(Jx~; >IQP N$ku"$+ԏ((4e?Қm9)=2?<~jc'pfN66e0 OL*XԼ8iiquhi[Ju%KRRR=>s~ayJ-b_ƍ+PljIȧRђ`E@i$=) 5 mI)*zEhL"hNR)Q!'SǨD/4iq-ƔC@R*C+Ӧə9ki&&F5_Tj)B[-1QIm5(!QC0rUqɲskǏ喢Ru<ժ9KR|1%N Lv򖝯!<4ۍSdf 5qؓ[\&1jSb0) -]6ë$:bB6xOy:g\&OD\T焍gJFa$ȉn$IS4V3(̭k1F{m귃x?'w;l hWCK3WP{(q ҞjRBZ.m{)ts6L wȱu'&KTeaA$!hչy X]*Hl(!IRUtI;n͏S >Sq7evOhMS -zͪ9Ñmؐ~E->5]5>um\'3&N_Bc:c#o7o^f$SskY2 #jfv&QrYqe8x23ŎdUaiOP&ym"<1ԙIToܐˉSy v|[^6sDj‡ g#ÓyʽH-gU8IRy-BYxF+#–5i)^Er{tk[fɛmPƋȎ^O%0*ue$F;cNyYS 1NOD"0<%-ĄHnRٔD fN#4Nh5 f߾'+eFzMjT6%ETDzad$DNP'yKkٶvz&ɐQS5 Vj "@&S,ǐd=\5d8fC\Q\jVq?^4:.̴͡jJgco?~zr3&n>ҝC٣2J:_~_Қi 5Fߪ}O{m>j;Zsl#<c:hԍU*LU˭ҵ ?ȓ<3#ӗ%ZdHyJ3R}5l4 Fթȅ$#4Ii%6y\ڮY.Wtj,t ȅ r#UʛiŖԴJS6HY *Z~pu=7R}T?lp¦NyYU]V~W3f+ߗwSe!%F =H&׷$@#7^Oj$%)C0 1SF JQfbƚvA\ӹEJUԥ(gjuAp^4%0BD74<__e>1'VBꪳwM=IK*e!nR[θJ1/BrtM.*ٓՌAYYB"-Z>ÒdTmYWYꦟW+]*GXd婺.@NrM7%{MQYf:[K*O+U{<)H,ڕ COoƚ7x()Ib[R-u8P^U=4\+4i"RG7ShS ݈m!D O'ν'8djmP;L?QJ[Z309*DJFu5mT/\Yn" -=)M6C(](J^Ez;XfVfZN͙U(qlʤ$\!-d) sTGy+k{⟨)kܺnbnTjSi!%0#>zѕ!rXt7]DѮip"ԉU9/P3z4i\N̽Ϻ/(.\B Qڕ53O &|רZy5JO9';dhܬ6NDa&G"Rg! D[qI-ԑ/y;Z&P2+pO.FͣHJ¬PiN%WJ Ia񡚾‹lK`'-ר{(dIwO6殿GFS%?5}ÕKn?68Gh;*tcuS(!pnKNfZJ5Z!\dWPQ-ezf^E`YYCϱIU"#<\̧2#aL}m5m'9=Õ_`#UCs(F6.~fT [':̷&= yrY/<ըh̓:fByQ)Z%I$AFG3W.:qo%oQi=4)K{cE烰6 sNUvXQ/`{(tr[y)=7R}T?lpWX. z?7, Ue#~|+|Tl~w_jm֎2ٹj{PNZR3PQJSfcEvA mrJQU!'oyI J7W7EvPh54ۿtsW%^kS:aT^3Y_"-62ܧLІ<%p[MBː3KqGhpg.i 8@ڱTs<&"_'ʏ.2Z e'w5C/"8Xu딹s_o-Ln\3+Xa z37|#8/<'/||xG?/옷#Ez+[t ndͰ3ʹ FGT ՚jd~# &+4RZB/6ױuf33|PP:2O].Z9@(\W+h[K̰%p#Uidy-ĪCInhKK)-FC ui)ָ4AHΔfR+e LL.1L:ؔ)0M>iGieӨs} 32jeN}"VtIFk'sy~wp@Ȋ!9Sً ͐DKZaeL~ClNUX0ܘQnBfqR>KART>́)Nm$0 nф.<d B:j3.Y Ͽ#8$Kz+i KU;[ݔZP>߃l.Ć.(85q::jO߅>CׁL6s"uU,MA$l:S9RbJ܈-өKq )IVW^5T֪̭@B܆e. kv+ە ԭoɌUirC4hOfJ#2e47[g4O#t"& ߉ פ-yS\.2RUܻ*,^ι&L'j[HH\n464XZCCc%evHrxlhϮnnW ù\#=P7\[ϩ2eDRQ͑ˊ % O+9r^ aV[-nMvntbreӼ\qp2 SZbNqL8zBqDVC:~MZE6#0d#S)I~KKkm:]@JuG4;5f3K6e&Tgͨռ<z|e?yA/ ԰iqt s=UٞW&Q%f ~Vri'|`T@&& dFK6d2>;f:wPήԲ(Hg"slXC.3@WƼoSEw@SutfOC\bύ#r/нޢ,YtG[iU2eXz\O0F;ۋV~;JS/8ҕBݜU@4fn]/="Wo n i>57k7P~ImDf;~ 5R78R΋H̍ȨS-(Cb8jbFԭ[RE*!ĥą!?=P~ImDf;OȳW``0`ϯ/0_Z[.Qx|ܐm^\8 JSI=. c$-be?wRҫXBy{L!'P ߄`e/q}㻄-`)^V Z17Cd/a<_jq=xC񁔿c񁔿bŇ-@58!} }, -aR9Q[zo1 ^roQgyyw(->?q =xE%z9Lf`H>6t2R\GwaaqQ/m@ b Susaeru]~*Lۤ aDjR9~+RBo e#| JȺgW{L! k_)(WUׄ bR9-#ڧ<,|bpxA^T9oȃ~eO8o}Hn--]J?G/S9䂒7yQ:{aRx B$Me>kG,!k !ER\Gwbz\e aj-`/&ځ`2SnOVE?8A,=O!_015BXOGq׹ olj(8A, OY:s`jx7z?) $u)g=\؄Mu1]>$=aK=`jjE$=^K N* l6=>oSFo!}ǩTA.ѨYK]WIAym$3P!!'T FO8\q)=xA?S9^Lpw2q[FI:Ќ :Vb52z@]]J,OސtqU?-qV QX6)kǨP ?z=sW9;<z;oUN; -@58!} },Gw5qjM;}KݧU񳓿A! Cܷŵ蟥zEih{}K:$oEGP9֎@G_n*o_}CL)U8jH^ҒRA)zQDuөS2]q\NlZ+Te$=@o/2GXOGh6^Behm5FV{γLܕf 3Jm%)Xuj|#,BT2c2%1%9jZF`"!#pjv~tºb2O߽:4W$ns$e!) S.-һo8|P~ImDf; 5nWs:(TU!n RMZ;ZqT"DgjT[B j_wߒWPY_Nsr,p0`0` 0}h`Pc ¿>?0(?1EU?"Vqޢ^HXl?>:48sTqraҠ&<]H֕n6&9hJàhx!=>£+~lm/-VMxf:8[Uke٬i+aCe .1lʂRRN(:SƦ5BW)Jz5>MV|\z[3k#|[KBiirLF!ㅛA4s HtΨe.NC̬JzPRT :bu4Sk[* .鳇yֿ2jMRsYF}=XˎGrrJ2J.%͸y^KQiLBr`J! ƥGGϪ3L`!sqndsMXysG%R%O.\( l%{YZF+ծ Esv2SQ3L0i̎K[oyRd 3zơ~zM[x"vpǎOaQ:iy,jU!JuF9 rJ}#s9Ln;vDww<"M,3]8fSʹT('S!n0vCm3CM:)BReũ PN㍇8O-J9jk-[F ..M%JhmM0gKim+a[O5uϙ(2֭TsvW"Ԍr1?ɐHTj;ѝp}>Oͯɨ,* Lt\dMiP$)x:arIC5*:[v#^$>1Ҙzm8ZB.eВl%@tYlʴeYr\}"mFE,4Xk"Bt9](W4k/WbG#| ¶x?x/>~_+0giڱu=b.U "=2 $+嶨T$4 ҹOa.:pG?.q! rs`rs~J\JhɦmJqYp&mpsq?~ʟK"U xQ R-_*Zjl_ K{Ft\Ө$F1Re̥cCc4k(}sKMҫ*۵:8;2>&<}ꛒa.%7t)~F̨49yW,e,*EBSB$Yn*9̭i BBH 6^Θj\>$I~P2Dv+VRil7iMJ!'6^StŊ<[o/̹Nu.P5\FbmZ%bU۪"IqEA 5KrҞL@߉QeQ*'Ь\35?8hC&e&s=:11Jt+~$WT.z_y2VjmnFBoEg"t[O&<&3lh̗$Euim4*o YTk6M6GOQO#}ķZ<[^ʊ˸nDYu;nhrMq>N{-8xcSsL(TLLC 0[9w_U1Ԡ*%: vT۪ "Jb#PwBH\IQ*ӲmRޥTلʝr2EBZ}f+jXi+ۅCGNKf8L2 e0n7-=͉gKaӭH[JqZSuksX=yc]).-.ai, ݥW&%rZcǖh¥H8:׸rXzi̅2JAڄH;d:ɋ\J ( δ/*z+8zYSR&+Px;\Ȱpa=5uFx[Dxŀ6Վ,M\raWL7- b;9^KEmqIvv-u&EMM)Sen5IFaRWLKRĩk:CZxӚ]EIiheWiT>CqqC/Q.zlkަiTzr=CGnuxTa)dynGÊ<: e)1@/nT~᠏ xA8 L]JD}+4ob(A[hj=AH?;ӯK|Y[Wbˈ^ =zL[-:O!nBRO Ad )1,?[|H(iF~ \J>I?1?<gbӐ@R۪bw~|ȍX_1@e@Am6򞘱W`8w{KuҒyP[*EZ[% B LO hR?QǨ'}\et_Ês RKSq_zDĽ*#óf1!JqW_Iy[\ӂM>Ο00` 0` 0` 0`V_3o>>aR:wO!1?jӸܼ5y6 1d0` 0bP ,x? ZQh#CX8kz.Z*n1dJ|)l3}{ְ5.G-HW6- 1/??}=y+ ?y}+r@o19=kH[{R<k>)K_dOj_燞~J&zA"1[Ldt]~8Y{R<* K3_dQVD_4܈Ҿ>x15/_?}A&z+z~>D,_GY%_1z<5c{Կ=|Lxaiw_4l\sYE' 2g1?Pj_牞J&R#!$3:N f>g* K3_dPj_牞J&z Dп?ɑSy b&>4_x`5/_?}COCG٧dߙ?Y܂ȱ5/_?}A&z+z~>S!$(,S?cԿ=|Lxaiwc3R#|Ǟzf&tsS4?x`5/_?}COCG2? cfh* K3_dPj_牞J&zKަ_폻c0TcԿ=|Lxaiw^/%__͟ǂJ64_x`5/_?}COCGSߘj,f=U (u̇cԿ=|Lxaiw]=?=}f=M?cc1CPj_牞J&R* K3_dQĚ&)79>g1;Pj_牞J&R* K3_dQƚ.4g0.w?csԿ=|Lxaiw_T 5(M}n<̀qM~4?x`5/_?}COCGdT~9Ry35/_?}A&z+z~>< mG?YM3Oߚ|TgҾɃԿ=|L= ?yt>+OfLHz f>h~* K3_dPj_牞J&z"~c1dB?lA&z+>* K3_dWCT솮ēyfBYRÃ,Rj|TgҾɃԿ=|L= ?yNd킕TK$lڠ}1x`5/_?}COCGӧY#`~8=R+a_A&z+>* K3_dQH)_@*nnHZo놖??85/_?}?g)K_dQYa~8<+#l4 0xy`/??}COCGDžd톙D?h|Sڗ矟ҾɃԿ& ixx9IJ1ciQ%㇏Iqo@?iat_|iЕ?FOܧ~'!U|GOx܁zυsaΗezϚi#1f,OiWHncf3kho_$)pqπ5aUd~H+8: .̺aLG>^?w㏌P4iKY|t]?HU <jl὿|auB_ Sae?yha(H'U5ҟXcDvf_ "v8#jMo <sR.Η<.~>W?@x݊0ihfOoS@ -h3([ PWmx# .Y?gB?H?<XX?gB|_e?y?h㗌s*4 o CWȺ!S_B3g*9?l^?y?h~_%uܫrS(?i8GHXn ןV2d?0? mzGgw0'˃@U_G=8OPWeh4$>?oK A ~>__ =| `*R'1I'G[ʕ[-D~?h~RC?h/3y[zyD?A~g_('_Soh$[=~<| WJQ<#_Hh5b|zR`z{~q ˳g 7_)?"{OOtɷU3,e &I/a|^R?\xqj&25#Ήr=~BfED(]|Ma>kttm3L[fWqw' ¾?Bg;O}/j0jX BXHOGId5^}JyJ-{_K(v??_oo5cxJ+ue-Dp wpkUۍ'w_uc;l~[rpD[]m;5gQEwQEQEQEWd?`Hmh>'|f+;&yͫZ nzûzWW|?|dY]$:W^A' o?*'ѿf_ڷ?n|V_[ YS/qM팏;?pW<ًA|ZuXdpsN\pK?8'?4Cnc *F+ҿ2ZZR 6m_5 u=t?x_ MJw)9=Cg<v3@|A:EӜvUQoƩtU-{`b`[T7a] 7?Y[%ŀ_MNܸ`}$RQؑ*HAN^FNs躏Z1eHΥs d>ժ%8?٥G8*flSEzS #w{y;s6)t(K; V} #xWI&?%FjHL]>!7V5#)͚ʬt mgrNʾci! U@3֙-+g1\o*IKt,[XWI$V3Wi_ͪZYZAmqq^k0˅ G,P/0lt$-uzrjVaIuiY73HdƙDRa=x+l5I*[_=wKOV3קz.ǓP:|VY-/̂e!cECʞXuFD58F}AC&Xڻ%I|Eg’.-K2FrA<8#XIbd*N:jxn8c K[^oU㉙7%>ʂ<3Ogt}go|e{,l+ytx# ŊŇG9}gy}>D"o}G 9O6I_O?rx<>"k;xwךs%yLQ9=Hg_cپ"o9JKd&GZsn +\si[Oy:|W3/(r2y8!}KEo't{&k{M!g J[h0A~bgz)2!} (7lOU#/j?bӦhQ}C4&躆m1$QS>qEJp3 xs&k̗(ކ1I+;ss/TC7V6[|3Ětk1etds@ʱ,F:~E]ieKiO/p۷0%ìȲJ0_G__T:: ֶ76UI$-n/YMUn7,˞AO1Gs >/YSӕFM5tp8ƒ%ʔҔ~g/T_䢗wߴ¨$35 ~ |n<7J5X/19'Ji2k> tρTϺ]C}Xt,.8澩UGxOL}KQ2tjm'׷.6NfS|f+V\?qG xB?AΚY5 PN]`fr_U!n?i_07p1ӔZm?>s$- L AaN'Gb#iHZoݳ,f-ko}_U}&0$g ~9'c6߱=bo7RxIpM+pI#i?xVƚIw#~xudXZYy++ev2bW7gV>;qg>6k fF|I🅵iO?M%/QW S 0)9:Ic#-g 4 0HCy6~]Qh/oLn!GNolb##pXUe`@exK>>:5Km7Qm5F'6-bgkc85 ~Lx'ú\ot**L3k<. |& ;~˿UkZRT#evWbdJ:xvJ)mt:cE?/EL~2b3N˞n?ko=˩E 9eIVeBgԁ޽w ^~Er,|17Z֍}x}sIbmGlĠ%}=F~3,5'Y72׋ƄU1"xWO<%_uw$G.dʞTvFQ.#]N ]iU6FĻeӌqP 1_ xc#8/̥ʩbLywbU; =*tr~rzlHXhLA,9cJmq ?w9#$X<eu/xIR'Jm.]hr]QOG[HZK%xÖ@\q ^1fo 6sa_=xĿį}>xgC]#+d~lfj)/_j-q{;ª c^Ri j_"x#:bl5J8$v|̒gDV?hoڏ츗:45vzE T[ dQcl9G!~|<U|L?!m^I%SiLJTKc#Nvoi RE2p:O5\m7~t>VJ͛э8EǖMtC+D#Im >WY\?|?)^=Q{]x(OaG*hv#~1x 1n  3Se W\G4l+9`(bGc 崦"̊ WgxZ*tbvn;3ʡTbiWNRMwG KTQCxKR,ŪHAD`\9H f#c%k)OOyl%vGӤ\c<d׵ZIk%ŖoPLqI<1'+o2oOn.8ͬo3Ⱦd"Թ7~5ٶeQ}>]jJGGze٠}NR+ ~NEiGktOg o$(&ž.>ĿK_\^5o-eot5+94FXqGq@HWVTjJ]e!R1[JJŞsxcKLo.Z݁bI\=Q`CgKе|4X`>HX<^I ,0 _? {WoXc:Q̶72N<#]xn _v u \u՘72kzw^}Hfi (;|+6-)3N k 1[G0U exS0B'{.qo_%kTYӴ FՄ3[q_tx:h9;~о/-xk-,ܪ]5_ աN />K1%i꓿)|K|,K]Zxfy.`}+/o~-ߥjz J!pr":GC_wN_w7k͢>1s+K us2- lQFzkhTFry~zyt+QWyZ3v: Ʃ'^蟙i%h-{guo{J.e۲(Ќ,Na_ |WjӨκxzm];D/+/6exv]k::j'Q[]:8p$HNѿ|Æ0xڏ4NtQMש{ja)Re4e_a% ޻I$9O)ⲘZiw{'<%<³-hX|;}χMӄHw|FύsĚeܥm.$Oo¾:w5Pã<ƆKd?T)SKgtڥb{cEQqA q_WГS<^kiז1+x[B-glH =R+մkF8X'|?@%$Wz{4rr=}kK)qqӤGپ1OxgMӓE|Gu+O-/Oȇ|~a;Y-Qbk7Ǩ-ď(P ('ֿ%3nGЏx;£w셤3 )zࢥU'Uߪ?_wL˯_XPp)-H#|һϊq'ů j-j!Ԥۮ"(nd CXVa!"`~:ʊ dI["VFy"(K2BHU5㵊x{پN1?UU/nBOgs[3XFfI?wfvƽkyoΫqsk>1|rwO^&OhjL\ro-d\st_ǟ/T{Heup\z^Z<"%;Oj5yn=Fw̤;95 h:i4AÆc$gpGןdCr9x]?5;VV7Ҽ[0$wy80򠒗2aa#j*.M^|84{/M[~1$YȖ#<6M7ʌݵ'>F9yZ&^Ul24eQ;v<')wx;R9Ŭ#odaW1ȌotPNWwp?h?g?*Ѭ]ZO4vHyvs8p/b_RTa[UO fRIIt߰ˏR5{k|H+ms۸ŜھZQ?犴mCQ[I纊ћAZs&G8#?^l?aխ/&MGdm1 CD24:Ɵ-.MGW1"KWUNCȾJyr(+n3.#0=zV65~ϯj7__IBkl.F(Y'4~1]Kχ?:o7٤"H6>`z_N.Smt_3|;^N6]duL}7JG$+0zW|fc4/|?Bm, ֳ[4y :/]Q1ms bI2@9A&fZxd!Q 2ȫ7"vnpGQbZ|D73Fcuڵ/br1Nzp\^˛}"YZiiv_*A9p8r6#/(,ywEET~h|+[5u5 we||I-Tmcr^vg5ŭ^K)-5 /\`[q*IgJgӵh-( *8Q)\4kGO$}ın[ʅ c<`U ➩?u5"*^0RyZO”LGr>y]id~;XZ$*; ҳTN+^(]ĿG{# 3A#y6 vpHb_ko_n|7qiZǨfVᐕ8#  [i(Migq\/ZRAlki61.RB6w v8_?xlRN3X Ơ.8T}q_ |X)mxᖵX<ilSi[s{w( Ѩ}hQ$'|] 5 <5RBUǏ I:]^#_-i97V*rj/MpN#QB|+>;uY4S]65b Iʒ3&>~%O55֜Ay7|FT'h/탩O4>(Ot>5[(ּN.{uv<\!ɍb{_E֝9@ ZEӵMB Q_qmfxV mk*yeXyS^ *^G.|#~Ҟ.}g6;r{^tcr,fPK)Hè 8?l>(k>t>t -/OҠinou{!` Xyg7>j'974-)Zm7OI5+>cȫI8fʇY. ýo\G;MY yD7S&QY;˹xrt,~ſhm>x_[^W4^N[+D$aتX~{xNLh+ť߀4M fK-b(f $^9 @U`?f?gU$M+~=/R{.>ƪĨSs\!C?a/olx7y}Z,n$kwb\@Ŀ8wH1Wތl~9趐xVa@n 3}Oh VGV Pb>*qV>!jd:Q䩎v<9dN];so'Ư^&deG6`sGwG9cxXuMMd]uu2R&u^1\=[̒%pCHz/] %.Uѻe*]5v;QO:|Sk$xTm3h,xwhKG 4Af~7i_-+x#EOԅDmܺgmΠrbIUx^kK5E#J1oL|Ѫo@2i:vxM1jz^,Fim6s ug+>8,CKia:7ZS ҵeg2Na]N2'o"2슨GYx^4^º^ua2Tj&*) `? 4xw ^̲ϦEg"ob>{!!x~7<Lw!%O<'bG<Һ`6q<'֌8l} )KL7Zm?Ė7xGrAS7e:,q.X"Xu=:f i:xSgi{gg;ZŬIk>\~;]sPWWE *p3\:4o?jiR[Gj`sNokvovvğ|YxKHr^L9& nYj.tKY-]vL:fg)ots+k$Y7 c*pk}oz?}K$_4%ƌo/9g-0uW!0*N??sAin\~;J>㎘_b_ּ}x⷏KX/U*_{6Nױ9<Ʒ5Tk1`5$e`ʫr꼙)ù-\5%BOyxw2q`4Of#>5Oq$cR8W+xnf5f6sgyGL;)݆98ٯjCnzJ)l{!>1ӵ b16Dmt1ׁ_aɪ2 ~Оn޿2!藞T٥Ӧd<^s⬾ PrEų=yx^ Gfyc\۫oͼsc'IC75"1@^Jߏ|/Ydou_1|:߅en: 3?{ؿ Qּ@Qhwa%1?HJheJ\dϡ E$TX0)6Wo,f\_֟$/9֭&muM]:6[`~`Gq_Gk;/wNO7p%VMgPjB|Gy~=[buÒ|a'{߇Z=kA]7$0}8|WŃ~wM'oeaw65 -ԥcٝu9w5soo__OWa~iڻZ'i }ڥɶg1*8/p-OK:Xd,EҳPϸ8kO3| |Soqn&R%B,H1s񷂚=I7oe4ش6oy4+MO rHJNz~o}?Hm|-m niSOo~Skxf[¯;8Q࿇] mk}vpen[旕.Gܿ>mqW,NAg ,T}׊xƿuoivIcuY#tt \yev!q_3̥;I#֞:q.IƧЬ.-Z;Ŧ?6%˹up+ٵ?;FX>%ռ9%9PWz'߲ߏx{U_wj%6zY0r˴>W>3|^samIImtGNB^_,!@ÛTl2*BU%>w{51>ʷgS|2]kz֛k:.]6S(c|1iz֭W^PQiڶb5;Ѭ2 s!8\io[_~:~|W28/oaI\U "JLY|5SD2"5NqcqG4*Ї o$# )'JiUcߴ/^(<%j{k 5rIYIcb_tQi x]k&oykzi#V6ѩk@ 7~kO :/Z!kK^]–74݁G?*7zߏ|\מ[.临[c,^SymL]2Cx<>[RMZ~?g;3S'WG |9\^F9Tc¬2nR܀WazI,>T HLy6сE2~-xWoxx{w$;X7K=/$p3/Ļ/Kgn} pFʷav"BbBֳpن?_E5F(dN~m!kgX<3ny`gWr:Ԛd@AX3eIP0i8YҗHuۛiF׀*|n0yghV77[#ܙ8] Q `9U54)Gm9isOC:oD{&4Y0,X3tTj཯7#|3UƵdRXCH0,} +\C*:UOTny<^%ՠl洏ʑb rXđ=:(↷ vuhc.bDol|],XPb/gY=6t]2ğx~Fŵi,R6(c$*ʊ0sqUƓ5i4&ʑyQH FYK߂za? # OtK:sVUYR8Eki,NXHA)mGXᤗؖZYHCro67q CQљjW;h|Om,?cTZ4(ᗄvT_Q׆t5_A{W?6)ͺ[kC&eG\{bvldnNڥ=mHԼgxgEKM#E͞vڑwO[ RW> ZcWB劒3=k?o x ޣ+mVᗞ>Z(%^xn/?u{`dجT*:j<c1W3ז/^F>?n?5{G7ֵr*0{Zv\{ҿAkS䎊ǽqWgYFnZ&gSe.3A]!4,Afn\Gd e32'2v&[;k&6v3޾;B0͌uM&Ě 2Yy<;]hL,n:_z[mʬ *8jGU61yTU0O_xэ/mϏ'-u&kW:ܘF]:HoQ_'#ğf|}[['tyioe#$f*]TC l|' &;ZtTnsq_#Œ6咾.rʽwG۴C ެApo~_S%xo@Wc>qU?N+ukw| E#|?ߴw |~$OXnX͖N8𑣏`oNq^'8ףdIwZ}>%b*8x9IFRitQNR~&ߡx.C/%GiUҏv*bç0$CRyn c098X#/NngP,%~p"]̋ =n9z]X4"(w#~U X'du"soo n?,7㌑WqL̈dGy`|6s2O1{<wgķz^XRB:LmTGN3@N|7M c*0 `\p\[i[fR1j_68;Ő4BJt=yO "*c;\bE-4gZDS;;5Rcr Jֲ.jIFBҮ 0n"J#M#̳MXh3Y'"wV[}F8W ;"(ĜWc|A\)%hR)!FZC|7 $ׅMI};^-oSC qas|2' hͼ[@OVc>I*O/^Oxg: 3S1cVPZE2># dſ EVxLҴ+u;MN;;ayn"mD~0BV?fOk?O@>|FC:m{w;c2$GkTb.ZRIt?A ܟߌy ɪˮFR yEn ? ?l5 @xJK$IX*j7ƏhpٸU|#1qφ׷vvz&Sp"H&丹hآiG_Z?h_>1tϤD~42}s,l>گS*Ŕ1YRsB弝92<<DO[|Ō.8= PFh Fk̲yj`U';|D__'ai-nh\e\m؆Gc#8S^hь]OJ\2WH d9WGCzʰmR!EC.ݥц; {'V<|  nPFGtrzh~#WmGӣRg Ny澢X.^ t_[[Xc+faFn1&0Ac'at&;2'6&\c`˷f2]J}za㴴lm`J^)b𷄴˗ٕ,}.q(-Z2 ?Df/,+SD1?|W1ZˮDt쮖hd/߳F+^<8# V+NYݬgʲ\\Beb@%c^|}|[wjz' ,mgq (-) |de [)|=%ΣF+HG˟3"$ݛ`jQO&oƝ7eiz=qE4Q618^:2{l ~37T$ߊm|EO?x]9B Bxu>0SjO^gEJU 5;)x_{MuhZ P(]2&ګⷃcmZ迾dXfH0s_)4vcb'I׮ |:+k [KQ;arH d~yoC0YvW_Cb!;F1rkvUq#>Oj8lFpyѩxFJYZ^H@8[=VHnyit_g#FV!H%Qu6!{I|d}[x77%~T$0vĽ9޷|=ѣxɬB)ʬRq:&V8ĪZOM[QW0z"qe5V=HOF\.Kѵ"H"Nq#>`KN{̂fᇷ?JfxySeuXE֠=>m7m[5|!m&[jRM5I<(w@~|;.>ݤzD|0Hr}(G?X'i.r1D,1h(Trwgn΄ׯ.LNX9ž~^_X,]J5]xίe.>{Wo2O׿n'?,񑎞-}OWS*Bbatw`N4W-;=K_+=dZ>tk'ΔE^ Ru,N5O ;jzeDzXKbNp{d~5ωtc?QҾ.&'uFp w*? _+?g1 [o#me?k;mG^Ŀ\5K~n3yǥ|bvW_ 7'?V_d湩xk7H#R9k`Ȏ4O?fZ߂7riyzk - %t[veB ' E)*өe;,#e#Zf",Dۃ:+mro 411Ko8*!^L`='?ÿ4?jV-|}ߋ]]^,m(uhC$cǟi}>?fh Wρ,mbaJU YOB)<4yYӬnL5;8mWoseBn {f2 ^jY#!w|cC[F<}_:_+hZ>Zb$^!fHᑈ%.! ďDxM񎣮W^]Ip=2Fkl[Dy-#$kũ m{?M{Wҭ$ J"L55_ƺ,ui-X&.2$ 23c +5~YGڌot"N%-o%\)\,Rȧ`FWq~~? |O'jvT3صGw4챬΍J+~ µ<m=O2Y]5!}u[׵& 7fۈ(C/` sK9cҿab>%<W/u-3Bad8ku!9b@HiYrwӍ[52s_n A$>XJ5Љ-vA=u<$ Oڏ|s[A/Cѧ{IɬCwYj+ r UHIXR<|C/Z d&կu1ZC=ϞAo$*~U+%_^ \vMͪ_~ ab]a`ch4N+^G43Zu%8χsHYgy%x-?y^jbm`f=~PL~т-Þ 񞗢iq / 5!} Hg ~z.?W:Mwqp&)$Kq.nl ,c}Rֿ/.-7Y>QѠMDi%5J]-3)l6vy޻6gS\6j_ڴyFmHQJLnd )FE}6_Ӻ>R\ӎ/_W$/kKJ}-/`P ]OR3e|fʶ<g}_S`GFmn,%Fxb+$)SɰdT;a>ISo(|-Ff̗ӽ̋#\Dw-E:_?6+`ǿ |G\о&k7~"mhi3y\5pX4,hnP;jgT)s6waxKUsRhB]/EIcLsֵKI܂7ҿ*xFk6߇t/y_kH-d9slȀnn .dF095&{şX<*r]"܎ŚŪAtm6F0xk-Y<'eV-NFc36C+eܐOUp? x|6񆛠%V]@!\|PK挚>ǂygSg\9tcYW"zzWZεЍ `8a}'V*Y*UFqg'z_6xOώj:{VWh18B5q[p3\G/zF#(58%g;#Gr1cӚγwb`B>[_qpյ[6"n%E,@Mmk\M 9zKOf2Rԕ%}ޓᯊ6$ʷX}cֿ$w| = #Rҵ12q`Gn-261W~ Wߊ:=>"U[[魔£Q)qIǵ~Ii[,h=Z}^:4*O|o{]^+iep`N=+\E-!+FQ+hMbUU`@p>Q_(F#pN8{qbeZK\sUjûHxy'Y^/oUm|~ljFum_N9ԃp_[KkMJ$Gz5RX?l{XN4> ˬ0ffrȖ񒡄kS_9ŏbyA}Z{}^ǙYʫJrg m$j ws|YǢG;}Bi $&IL .r@X㌏pg>-R[AmS)_ UOi'|Og]ijqA3\dDݚ9"}V*UHn|;,-uxOGGxc:%<^ɤRroX#oƻO'> ~h~^cw⻭* "=7T{'^K#5gf'mJɺ*r3;hQ:jvI/gOV}_|u=_VMѯ-4Oi>}1cu4vA$phvϊ-n· kC Ե&kix)WFDgm??*|8ִY|NcAwwZ>{i\Ey[j7:жҷBObmd[y.hSfoᇏßJjw6>.,il2FvZM娹3Oar$fw(S;o<>$Ůx3{z.N(bf)[8-x| o hyc'' i>hZ~$xm*kM.kre~3{o2k{'oi=5#v[vpm..bmuc/r-yW*0Qs4|bsѿ,] cI]G=si6ڽhëta"۹=Z> AjH<-?º7qhE/ ene RTb /xMa!~_ n>)&/-59f5Ԭ,t=$٤1FLqA|BR3o: \ZDžf*Kiڏ;he\>%Bՠun/ounn<)hu4_ >j !~x]qtC]J)>8~dGۿǿ>;h|4񗄯4 ؼ!ogⲅ%1PdMsCe\_ø<%h Mmmvu^m-Tn^-% kӿo_昛m[B8c&9VRaZYZ~7mꣽz<3OZMC̯)r}|Ek~x,'bC8j4ˏ |)_"n,{Y9Rأώ"# 40 ؊VwxkMR#)E' ϭ|'stE=>O**ŵ&%ΕxIoI?y_^ Pլ5[jv#OTJx-|߅~hͭ5ncQ+G€J{'j?76(G€]H8C\-U–;c!ZqOYez%o?Ư> 4}Otf˨j7\Meewq"y,*( ~ ,)ySzg??Hi2:7 2ZEwc{ڴ$Z2{6H1_dω?_π~4C/מ itNYk+#WH3*^] !=ݫY^zBgcN3qǵ|Be:j[3PIxX7Zns60{_AkZcQp~C@9HuWd4XA8@sq^- nVrHq[KBC 5x}C[NdgX;_-]<wYtg+.['ycYߍRg #:^徱ޤq*M(EE;E'~"N|>W3^@D8u 78\?eε}ut$|Fc;sxcI>1#<L`sy5gp5Gtc.vMmcӏ2RSjqWWYٲe 2G rN+bX2HrOk6&N"ߕs*[濥xLjeZ+&wR\By~8#<+,%HSbyv_㈤B ~l4k]eF&+#ąKw>ecܳ|>gr<q=+Į[ж#+iV ?yjv[#o(ƤLJl.(qcz`c)k;/ x<;V\C_~4uíXGok(x&Ai8*]oxwEM?_ kVG^+.Vqշur~ٽ74>ٟ i8Ѵx"yyz\و-L@ӚIuUd yO5)G 37z>u5HeN8|WQ>+DŽ𿂵h&IJŒ.p@<ҵܮOe~KmWfizr9Vȏio\_>6Kc:kWo5Se原y4;7 >I(R 8c}oND?~|6}IQtw*̥dOL^:49*]ZtC%9/xa %[m7Nί]\$u+}؏Q#2+nb$q~ۿxwX5C7PoscnF[W_D`˟7 Sþ>8~׳kڥzea~t[hƥ*,$L/PMZf5M~9t +O?e;{?h gfbzO?>ÿ5¾Xlt3S iz֓A0+VK. my~mq0fQ#ҵ:?oڕ%nlLu7N4uߛ$VDbmO64ͬL+,m>.޶JRM)Gܷz qܱr͏uTa?hߋ3u֯7ύ>.gii674mrK E$xPؖ~տo|Oe=GW_!Ӵ&c #.4FgCҟeJ)_59~\Oc34`ڄK+D~tyωo xSj j.Qbp ?䲒z_ 9{3/x1W?-5Y丆GlKqoncijKH7d?tG-Q|Sk Ox Efi:-}4<[]h W;ʩ>:/OωoƟ6kdqk̑2bY&;U~#|}7IY.xB;$c(Rvi@e e>O,k? >/>!mz<WQ\]Io-)R;F'3:NTOB9u_ &5NJ5_\[fkkn.!h$F$Xg8l)`uJ%5jڄqf-M5IJHc3,P<0ƛ]#49cC: AH15IY|#҂yh~QZ aJ-F]ܢ2rieyC*p n\͜qMР`7ܣ x=zSi]͌ݫnc|hڶǶ [+}Idd+hY}B!&9Sv0J\|ƎZKզomCN*$m\ڸz,@k(Hpۦ?}k{U`+(`bkl|,4 ddUVRP,s{X@Ӵ2+[M"XVb$}qk:Vsf&76?]ai%'R+qJq}ۛEZctKaׅj:~/xw]nZGe-T è>Ǹ൵5-&EoYUx!ȯH)xz:nm$1]Bc |_AЄvdyWr} b7P68#ۨZ K]焵φ>=<)i;=Y=1^ep@޲tq۹hmWX*9Lg=O.^{uFlmPJ t =zks^[HA|cq^( oo6(~}ey8gWfET(H*8l֜=Y[=N^&Ζ +^ƿco/ gHIJ|͊H%Nq_ ~'x[SR-*[ O $F f\u`>g6ѡoɉ\|5׵~2෉_oxXu?MG}>K=:+}W# PuT|CO `?'.xQ&xQfoVdѮ)ӤIi%s/85f_?{>3~OѴ?ʬ;'|[fӦUV J>|+̬m 1X5 P7[]MK[׵ d~xfHD~#ɇc= 9l?{9b-E6n~-xĿxC ΝaS~g]Z 繌'egPx%rCL#6///YEFzeޗEl*vZdYDIkY .qpx׊KoWN.MV}CPۭ*}QBcZf 2i}Z JZ=Nۋaeo?j?ٗE5mkm2]xO8`9v2sԐ;ׯjֶF]}mNِȳ[27x8+k%)j1Spy'Tg?]><=i/[-3J:֗(HV#2r ^1S椯vn7 WB14|C,g< =v.,k=.y;&x'$sE,NUu "0R~?T.< ]cG}* +Z޳4-s;6&wɾ6'0G$4*7?>0t]?1Y$DocV+9.Jť Q~qC1_?{?/.eM)4^^4i|_ yOO\mv1Fn\8=kh|e2SQbфcJj0|?rjhشϦN夐*< `VM莿u@G}~a2 x>hxM䜁1<׽~M'~ /.l6ä65杪j6g6y[=Ŵ˨i"E.5яDqT1ֳ =ׄ.GuvIXEzjm1 @%_}Ш#rn:rżA) ;#cKi [;e]sJM~֟ ~ |m=~i>u}:ZI1jrBlQUjߴOɫxx;zV >k5~*' jzY/~0jwoRV0a[-ҕhy㉡PNn:lO?DwOeխյ9./mvK "l$pppos=9;./I5M-u[u G 3?x L.tW4e+Цњkˇ[;dRC7wog_ZUj_ zuO R[U!+CI ־RcmU͵ʻDss$v|d-?⭷kwFk$ 6QivOyh7YHf..e#pW;J)Z.u[o|S/cÁiGi(^);y #_\l⟏a5Snv:9°v3)<瑑_O1oxnsYZ|0ײϩi35ꖩ R@4q U'S@|4xןVNou_Nwjv}.á *m/JX`dn[Kvm3~͎[> 0<φz4_MIQ [RT8(ڭAⵟXޅx\tM* K{}=%u"JGw!@$K<~ |SK+ſxPtxS/E~4洽K2ȗ. id*hX5_ ӿh? ZvFhM-};g1.et?iτ>k6 )toxLIs.lOԤf.ak"8_ֆwori4}d0XEN{ߍ?6h.>iWxP  M6[)P$#knn [uy­}3 Z^L.blbK,bG#7~v~_$-=}a_ǥW~%M΋XdȱyQd[b|v: b)>ZfOI{?hyӪx3W\hbfL7̡$/@~We_+G_ F'u3#[g/ /?2Of_4WG˔>wu]> mvΉw.&Q}_wm9 ;KccwA^񷊬QVk /Nf9d;!o䕸CqHo/'ebx cxE-KŸm䳜.z E(u lOzRћW{q_xZi/VY^ !uTK[p2/> :|e2]涱tuY-9'-,\@U]3 Rh(;4/j-]*{j7n&.e?LL}\3/doU4jNSDE,qPc냸+ٟɿ J5{2ks}w%\#,L- R2w۟w? LIu [C4 C@<5]G7bQz%VVş!$!O٢~ Z(-]*[Y-ֳL!s+$lXj@mk jz ,p6 .u+LMsn&{}:)V<[w|NZ? 3^uKKˡxZcP;TN-/C۵pHTx6Ix LxHҏ xRUwz= m-X;\~YAm*wǟx7~#P5綵 K88W|NvF%@"@{3^a7Oxo>9ijwﴘ/žm<9$ )Y@m\qe%<u;=/Ÿ %7~/o=slw?kS{ w1Q烇>?S˯O{0 Fl1~j ?Zwno~|% И(Y;T[$poo$܃s|Kcػῌo|I/5[;{ixkշC+%d\N,qcf?ί),|eotpZk'ieɠkm^3k`13(x7 k_;þwCxF[o7TdkbF/?s1xgT?- wÿ s~i0[/.5(ItiTZۋiiܔcoG̞8;%WN#~SZ- ž#M5i/UK$I yu5a"Wߣjk\>{mݳ/e$FAkҿt_szj)ݜ:UgEb٥iX  ^-m wž4M22.4FUX|_<>wff9$I+Z\der6X('$bWqpÿ t;KC#1ԑ_?wo'?.??=#U຿zG#NowurFKxk?2//?Ćp;LfaGv<`z_̈~;?Ww^_ q^xk6_F $Kl&p@{3camlspotter-camlimages-e471b3c4470d/doc/old/test.jpg0000644000000000000000000016422512405272062020410 0ustar 00000000000000JFIFZ CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222`" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?s]KfI 2l(\ߍo!Y>k6g2WէF}V .3"8'nG\~1֬9- q3#Pc4].[<ܥأi\8bA@9g 6w0h#=q@&??o7K 6>sk 7J%:Em?(? o7Yi]tKϼ_n֊>$?? 7I &>o?#7(C]c}n 6<"uC>c?' o7T{/KǮ(%:X85ʀ.QϤE'%AUBퟥӟ[([H +RW@UW szVoi%ʌ v{{K(gգ>\) 껳zW5]9-]߱#ڸ+MBMB{kp>ؼ,gbNs>cŒ?mfm}u\`jP=l2g*åMe`S ԖW_V(cϼ??&{/(ERQDFD܋s#fe.`zwEGM^b>)k]?NϮ~{`zoUGU^e C[]?AutT>?_?OO3g=t]t]/UOO&_4=t]'- o}t]TYVWO&\cˏ?!?\?߷Go}t]TX6?GMO^i ?[]?@Ϯ~=+"~chȵߘoY?gk]TY?OGESכOo ?Z[UTY?OGEךOo?OoJj?M/Eך]?I C[]?G*`zgEi<155tOoPLȴqߘOO4Ϯ~>.UYz_Eg<155tOoJ0=/yG~chȴQߘC?\]?I C\]?G*{?yG~ck̿h1V H^80 㩞Q ;#?&&y~ck–{GNo҆sWB"vgd8M/M^[ S]]?M?uӿuSO֠zM@m??&O AյZi6K 4hc,{ƥ9Sv*)ĥi<Id8M^,i<14?W ??Ik<(EOKi<15zk14dZq?M_(dZq?MOW OG=(=k15~k14cu?M_(cq?MOW HONm6&?<7l`~vğZ=̫,։$љT3V,ی}>?nXz@mקZU-7c`Aj ( ( ( (9$j?F-xoǂ5gDd~'1JM(kv@5&(@4iE.)v)qN+n9b1.7m10iHNwx(M`R=GŞ15_ ݙ'ھSG3TMYΫ$c)x/%R/PmKiY rx~to_Ϋ怔 et_Ϋrx~t} LD.A.):9 UI]:.瑖'v(.]n,oOΓzx~u_hn)d2ҜOU<i0})J2Ɯz+&_U:0}*yg;ñw+&B4l4rϺشYG/(ܿ_U]Z9g}B[}?FTbSqG,C}sFʡj8JRP˷9GQ>6 oEe+,cF8~u^JrJ_/&qn9@d*ƤHα[ԺF'nYo_褜ǚT9%4%8w-'hZT% 7^du5k(3a=Wk$4_'-t1[LT2*G0F?Sź|;eg1Xԯnyʉ8"}IhZX]*#* >zz~#,t/jMz^q$g,Y/Z5skmoLv ,X.1HA?* -@%Pp=?SQuA`sJ6gQT)RӋ<-d~öp%wuztE}֦ 6bCg{.OAޤO$$B AI%#p? ssՔcNt֊N,;MG,g)q{UƱrץ|j9⾽ZMm_**ssў\:Z+ x˭UEs:4\O=UK\,nV2` ѷlԓؖ:B?Jj<~5T (}W&gVGTɿ3Yn v팁ޫxO/b!ZTy Z}ЫTz$24Nw1?z.)nn)=7aVi&?2 {w5<{Q8#It\8U}εFMN[#@M}*adSAU;ZzVV9u5CۭJһw k2_??n?zٮczgoa,d>kgߧ[a-ExQOPFCbms_7 Xw'ZZ6Mu1nՑ+Ey8C+-LaU3Sd3~OK)Z߉`6 2?tW+_ Oԥ]F;5^}s$3$] c'ts؎bO#><~UÌ'ҿ Ww wSkX3O>W_kBM5]W>2=#VzGݧal 9\ҽro_C5@){W^aLBs9SܧʒN▬N`I@ƁK.(` 0)qI&RcB3h(<(\~8X3Wig)rY>_;խރ ֗h-UhP11F90)͙F)S0(=p( \ Z4P? 8qt$a1jյw6,GGBx#!Sίaٓ~FsH9[ ԚKeom ݌Q H%@FspEnZB%eU;ְaPD%]B_,p݇kI4FQ,aq݀n,Vy@fFR `ZCk5O.c~Vup<+siWFU&$#ekB%F7Ú;樬YWB SN?3Iyd9M{&s{e>G)RX+TxѰr3n4Sp=IŮen6£?(<4(D+doNQأq p=M:DxX.Xe܀?^u]5.#X&m?އ#r+W`>Nr^XȇR'& =ԿמkMv ?qY5VoC'a Ɂ+㋛5q1?vm߭}}N.tK9ѩ+j:zg\?}*B˨ۃ PiO5ho纗 Gʀv]9Ҩ\c'iiROLc\cd\ͺ[QQHɷbN!H]=}I$8}OCS|=,| WJw1'y5JBNI8Tpju|Zɪsc'ڭHpNjwqeִ4CyC{Ujp,ghw])Eju' $Qvs3 w+ml}j_=j1?@;W3dIbWC+5UN=jwaEr3^l5$ҟn*hQҥQ] Aejֲu`3%֨CHU#إwÑM(Ci7Zt8`E~54K $ӰYoSy&:YԆ:y_ $+kd$$d@#w>z R;lKI.T"zx XD`dxuYYtЃi3e#co,2҆  CgĞ?U#f;%^PJ;!ά+:OKQ{)vҚv܎vZ]S,P͔lԔS hqHF*lR4`ԛGAHTSvQp2nxPnT,q>d>cXptЛbZٝ_vkz!WIwy`.z{g{؞F&̕N\u%g5VfucRv$(N6u#iCޯ="co$+  ;jmIu9$S)tZRȝ7MĖ6h`2K#Ȑ.ܐ2sr g$v:~ >l1 wN C9ݴQyMQԗv6īG$%w|,x{כҡEp?h2ڱ"TSrƶO!zSfdW5A|Yn9[$ۭC稧}Mi&4BU7z/ě,M'ԅ; 59gf'fུ0s2N7(繯lpI9=gj'qO){=j9#ֹ~8$O#[I=*f,zXŸ< V6(iR4,BM{~i=ғ&‘"k1]N܆aڻokы$&Aʞ݅w tqZgj@<XҜTHKz$޼MԛӚeboV8# CCNL T б͂>kLXRפuVrKs&dZ][9OE Wi?y?Z4(/j}/x8ρ/yz5hdv֛ }i}G X{E2by ~d}+mw}Oig*,at2+m> J^R5c;o^߭C]mFU 9Er{0 b'<ƹ(۪.E'([g2mQ2fLomQ{׺&J/41!6RN;BSQKEMnh?(.(4n)3#^vNJLjŐng`?*f8+Y2aiC a>b,?giĿUIsܤmwo2ʤ"~CJ'RpiDXj ()ЌD vz. \ 1E{M(_ZQ0IRbU\,K'1F)h#IIgķY_ʸO=k~@>Q5=p`on3&NėK4K%!yxNtJkKo]N\r>Q\,M[KEbOaƣJl tE}3B;*~}k4?2H W|l)w~x}mǩÊ; *rlB @Ojx5tG$+>V1=_ҩƛ\Uw?c-VZ;Y 5%K $xt.%W= W[_2x$V;dvIl|@xtpEYzޥeYYMgTE_) VZYHXnw\W?+jo=*[.QW5߇ƊP4Ww2?8ϥmh);% A:Uˑ]N왢"ibw"t+l\ Z-q ώJ66dDoy'c^NeܜkJy0\~kϵJAEa,pxH Ev~\4չA6~֧+!}M"-L݆>AӋbڐFMH:fL Bzյ7s_- <%Tt}xMOȈBz[)'dtҬ.T諾0 auW3_K'tѕm⺏ ~^]gkk!]C^f H'&[Py5y2` z$-R*l;O@2&~$\̒)zWi674mi RBi_%zt$t|/$98b9I˘/g&坮sisB6AA?(GG`P)@&"bN{UJ\{юi)`QNTSZ6{pT7WMeiup㵸u !r1Vv\n**e DgJ4Cg(_4d) eo=p-|ڷnG'wR+pĹ= `~x]@UZYۻj;wjOC v z1KڗoJ@0(ZQmf3b7w|sʡQ([sZƢdWGQQ6-5ΒBD.m#wݳ8{)kZvOh/SFy:q߹Jմ1M"D12z88? \ZHI 7R1Z>u:aָ]y/v5Q2Z,qHmL9{?y}GQ\ZNɹ^2p8r?8m.ť(eV|o=A;kLMa,A)~x rF2C؎Ƿ]v45݄H0n U?x͏ЏFPR fo;̓!H#ڹOB_/Î b5fyU?#1-S{U8DRchwBF#泧>FZ֋X[ZdR&H bIۓҢ]z>k)f9$WZ/l,^`W4[ f+,8x)V-wSuO hD}>ugw'?GOٜtP@tZ 4?nqvu* S\ќzWU9]lΘv/I&2kNc%:vd;U:W)lT~~F"zX69\\Sj\Kng\ɻ敤{Ae5"`隥8χѷ+{ߨ Vkv'G:=wV aF+]9'쌭."Hkd A\]MkW!1S}AsF{O$>@&ҵswKv+DX]Ưp %[fД$`8|DL0f<=ĤRkxH_g{jn o0qN[E|-cPqoXPXS4MYgV+, `wu={MY%+:G^M5q xV ğjVa+tQH>3ֹ{Kxn2{V,d-I=1)9;Q\<*XU.J9YMtbPюzc[;>H85>ʣKcίYչ>a5LN8Ly1YhaXݕ'޶EAiPteT].Gj_r6Cul]dd8[T-ⷼh[NFAcfecp%P-.!̲,qN d[/u#49]eXʸR:>>&z?w1;|h?\Bk>2щr?GMz5y̗Zhd"Usc+ccWY u_kՎQ\B3QJM.zD-(\.4;ĭ10\";8LaIC\^kҭy|ofAs+h~(#D1[°r Zt.I+9EV,4DZΗ 3N31pO5M/E.,YTU= jȌK]Bw(qVkN[8S=VI8dϥgc9=]z9*ӳ }ŒQb{MqE%PIKEayNXYJOsZ5k-;xǟJn#sDzGEb]_Kb8m0+6{B4]`HoE;0RvY[RFTqF<}+v$(`'ekau4d.OI>yiYOTaJ~s=oõD>zxb2`>ZHk1Zx:d\]i""ĩ\qW F{y<⾏sRTIVPA^f4a}!#5zXލ>X#V< JG6qXJ;y95+mXm4x?nG7ddtRb19\u5;.fRW"5"uhyy }AnV蟛UyR-; +IW= \I{Cfd)^.raJ ;DUfPc=jغVO1 |zJjH5SN'wURn'>:{n]s>k+ظt%}f-Z$2Wpj%F49#>j0qïATxpCWEw9`T:لqXQ{Vk_;M:9128`tW%:S֤Cאs"h ;RPP-L?q0ݞ3T⵰E'J$# kU+"1Q;bjUπ5 5s֬!2s*NGc,{9\ ggls_ tTm+?WHW;EP䒜ڸ{y9<\|EߐuKsPuI9+7MD:W9^)ڛNp?CS*eP3;Wit*~?*E(\ U{Ӷ"qFjR@M8.ޗnGbh]-mc?zRQ S`n9mG-Lh/ ={kUϻ)w8¨ZuxtG+ߴy2m|$s^n'4c5ݍf'mr9ҪA&Mc$ַ L 6ӱӊLfL * :,3Tk WSҭ;.d]ɷ?^q6$4Vse:M QLJ1ָ0Q?lu[F=֗1IQ kmcwzJ^\Jw0y?ʛeiˋX3ݺr}&O*{eF:qv\q Hd%]ܒ414tU ^KUη1ANP~1DϭsbvVқkS;L0* c`Ҥc#r^7(T |`e , 6"%bL(HW2ȁry=t]:n~ ʊ(,Dg$c8Y2\M{pȲ˼d9ڣu1J G}I֖|.SE/aU|k(Ir 13_Nj[48p$1Oq}bVMy̌=]{υFw {xd2.O-{,>хQ] ( ( ҤFHUVPÚq*Z:)SlJ$C?)A*L`kԡU1myY3zC6As9T7mk9_Iw6P]~MFBna VI;ZxfY%. ^qҴ`R6pOMoObePfP q)pjܱd-׳1> 'E:l&( czӏ5_=;* *ܒܘޅoZeO$K 2eG^.=47q"G]2ӯIBm*~#Tn ["JYm7J6v(hEI"VD}"c[vksȒ#E:7zo(%B=?VQ]{V$psUn;K?űyh1u]Q]Eg{h61hϧ^W&kW\"PVP>Ys4]61 :Z$:i{5-k5n%CXpskYe47}2q}=p}n0ɻ1Fv~u׏}C#lWo{SŻ'kQhNl.Ü|v8=OfT7/4‡%܀16[Ey7cߠ+ˡ_Mctĸ 0 8T{N_ؽ%JDB\V=M2B ,8?6d(mNlD1LvIm1HR¨(\g>yioeQ1F@XRlIc'!-q5Մ.h:"^~Mk6-P =jA2C CK@(AEPMqNMc恭7vA$N53'u@p +5OifDa)ϥpv{Lɜy;isD?"1O;j*pJ߿+Wu(O.|Cm:d2aЊ`!TR qp,b 8#5E1W7*c9Zw knb9}Ď Zm}57\R68jԔ:iBc8 ձ>׌ӆ9,GՐY+ +kh ?AYX浴b|>PBjLn?x1'IVj8aW2=Ӑk"Pmd9ǸTnZW61<zwВZ2ۺHn~֊< R>=T<9Mj1Zaۏ^/O}ٔc\aZWNJOuil]6s}39ۃokQjی3Lc̸>$C^LʨssP[\lALݏOU)#ه\R}kʹnliHbH$~ZdTP\+&өʾ"cV eEneܰQ<?fC?|Qu,VtĒx鎫eNqԜA6 1V(>Ē~_CY9FȒSˬ]ku>>~o }Cm=D2Fw6G,1tAg-ŨY8d9'q L 5jZ;yeXԕC2̙Sq6 xYqdr)ƻ3qungƣ$e9u?vvsB 6Ǵq8 !ۍJH);K2\Wo.$bʗ:FYF=h^Z yT@<褬AU15x^ܹK&Y B+.hi ["6FWx;>V6n6Ѿˀ<5=?Gҵ`ªdC**R_w'd X~X.7ɽAܼcrMP~b٢n|[*ȿzKtOp~ F!H[>9`Zů7Pd;q|Q&>Y.T~F dgP>>)E}N<G͊_n@Hss~NH_&9h"@ +'N~ns60EOhiywZo$o#Seܯ^Њ-nt`VAtFȘ,$1/t9`]bMFmW{y+gvDN^aHy1Jǯj~o mF?k 'l0v/8qB~+܄ּÚTVp;as^=JT' 9eaޡ'Z]ir§K}H#)SLYi@{hcR1#Dzq*I&}_ǐ[nqUٟ JLi$ڃ?J?kٳ[$Z_s3O+I#g;W3uvwJQ=km:a՗.dHıy?ZVwk=#LQ5ߛq{Q*@S[$ڝWԊ:.cUud8,xW==[eR,H%=$ytqWdVDZaױkS*5*{{sCuFW9AצkZh*3m [>R9RwErwnSkYP$f{w*R \5)vݿ0*ekUu9NWȜ2w&9AdՋwXuJ * Rp8KYd {`J '.{m^t[!:)6^xef@?C]BJ]xE ~kҾ1|$sg;;Pz~_&ځjwp,cV nLֽ2mN=mUGZq3CA!Vp1~dGѻ VkU7{0rd U/\*'aT0Q|:acjnkw%q YIZ9,=^f!<P;>"i`v*b߀[iV\ߖ}jxrM*9%71JD£rIUy89=4qS٣-n&E\ GjeiKid~i'끌gq>iCmPy&6 Jw{Ts5=VV%(I tve?zb.$H՟Ysߠz~>hV#3U`r99;V5%W@;=qQz2,(ݗco\_ZXh./nV^))~0!r:#y- v; ,59eu2DxXDXqGN-6L˅T\2;z>U7nu9-3,ezl%Ӵ4x# N35dET6`OjͲ}& _jZL /9*ji5bK*?>)59߆Vj>"x2=?GĶ7TZ\WX;4s|.>M HmÑiygȑÁ>|V@ʱyb9d}X ,xz V锬ߙ WiGNQ.7B5Y2ycϹ}PQc4x+>BzUWԤ]bU=#ȥvFUV@2 ~r3QC$#ns*yaF-A@Yvj@w.T 5C,[E$ ц@Wr0޵-s۩C7B6b1zk ;kXE [>g7kA?}}j;KY-F(GhR*Ҿ𞙤컚nV;yO'\FuTf3\3 ,;B^d>ߕx2z0\j+ىqqb ĩp #bY ?6z {Z qc[*0J$ SYM"UNy{Q_FX$t$ 6DILOJKA <:Țҵo!Y.0*9D>)P ]/wvNŭz<^+S ijIqNRxmkĐiQZ|tJEfѻqyo@\ƫxْsuq7ܮ9s`]߻)z n5N⛻89\캓 'PsY$`ZrTK-rۋnz /u@,k/NC=Dq5t6`nX9sxێAUDx(NVmVE"kC{U)N TH@ِU^qSzS)M˽* R#CX"qKasڤ2zb$p*Ld@*H p9'T61:[LO Ƥ.iJ69{=hq83I=~G WaR%|U`roW|`S'9%zrY,mA=U+lip?^!^ltm6sяA?zMy4 Y~B8ogi=,dSϛGj꛾[by6 E ͔9xM+HS}1k1c2?璻;"˴HȲ@Mz'$"=XVѸ: $LI{6qYAoqფagr~aG4QP*:5,þ6Xeޢ.H>,j\PƑxKv)8?=xXG[PfF$H ۰ZīU={.->6;n88t٧1U|ǵYds:&Lq)ˎM٬m]YuYCc bc b4 ϖ) WB4{Pwp~rH 2ֆxqo%W Bs>cVWӬ H;L:WkWzueH@w}k붚k37ŋFGln 0#}*⻐ nՏ+r[c]Zdhz (R_o<\vҰ (3ʸv둆vIÞr8yZ?tM=ta}k$qD3\a%dV>P=i%^2aG(0sq%7HD:NBP銽VQ{["UeIʏ98#9pFʬzdž,܉$6(f##ݷz ]z#R%]H@`o sʯ\Mm-2,gX 'Mk;[t6+:! Gӡ)k;~ 2qAqE=2A">$ϥuZ>sm}a dWWSjtj!sH}]:94 GMWDM{Ӈ$gU7{߇A Fr dmO 3 ;sMV4֚Dt]N:t#[X##[{.I IgO_Z=J5 :}küA\iZ %T~\BpԸ{͖Nj2)nɰ :0P 5sC6dS]VU}UO9ŻsW,}GSZY31~}*DŽu+IBq\Ѯ#) 08eftuK0p+Bf?pi}=qZχ'Yp1]q汜bc 3j?0Hjd #W!Hٵ.7`wTe#+Ɂf\kX7HUpIh S`: <5 8x>4BJ <07~w>2(#٤:b@k, WE"jȸם^<;㊞"wc5 R$:,sҾ_K, dwqԭ DpG#-ٴn\s1ϥzj=+z\"Αx!/gu`W;-F~ac^{ig%=y74?zJIpGֹk`5c/ñI^|WSW07Hd6'~|@..^vKs1O$nu'cLoGʮU_ <^ј_I <~_j& IVs߷[Qpc~F(uU lgxNJF=?yƂbO2X E` v}BSçΡT}ܼ@Syzc40 ;\&2_ _.7@-F)8=1^etc@~woPO#{6Cg;=1mÀ<}zC֜ĭceۏ}F+]<8#0{gVCFonoCGT1^N98ׁm?/IFd@ݟ27U&,?|D4',%Ir}` sz+˔/1lw'893Eްj'wYlnU+,k9~VnٞWlnV(/dg]Iqk [lVX,HNG *y6WBvZF.LFV+X!XJDH$n@*սF$L9$0;<`)R-bʧ <֮R|h!e1ʿ IJTn\?1PIpO2k iC )0?UGkY5dܢnU!UF}~t X:2鑏~[?2ϽUw$^QO"prY,QI,mϾh-mIzFglw8?B8]NwjE%e匜{ڈDrA#j񜓁*I$Wze8 >rj[TE,A S3.9Nr>jgg!eamvDw]DRDGxh ;Z6+[~(!eU *"RMl~! .#i;wvmkl/@w#$ϰ]6ŭ&Y$0ťDH^=LHI(. |*a>xsem E=yҶbfWݴ>bPqNUɎ]bw.dYZ-(U2S'ڪjܝҲ(ې8>{dS R1([wO˦~Y#;ɣpG֞ #xB`g5V^H'6wp9xWo'.z]){pj n}sP0:yOg ;SRJij uMRg,IZ*p1)j,$F(b̎Qi}1M6yj_Q]RsiTbs)c''T {Sj NZ-&ۊ~epC }czqWs 2,e',sܟ(ݜvI`}jU;AV椸ܹ$up deT2R qYV+SZ@g#Abzs޺_ڞ*I/޿s^"onұ_K *Wbη&PJ1UֻUVeT=2Y6Az)w4SdzTdU܉G>(HvɥI&<^%Mq r3ByF>* Iyl?g}jRNyya^l$ >^WrxO^^\"9'ۑ[R[nS/ctgt5dNj5 ه?r4z'h92 xd/\Q5v( >w)b'-$NxCZd"Gz#Ur7)Tm9UEc>qOY5Խ ԍ"v 5Mo@FERےya6 VAnXVmJ扢~dȘUiB43+F ?AުEzc VppA5 DaW9>t]~{u)Ue=GiN.,?МgOg^jnTqb J>AY jX2Ϲ|y{J3gIfeĞEXj@<EwPq劗%&5ǘX\ u sZdb/;O!H'zsJt莥]NKO@:N6D 1 IywY4P\U=knP*`#7?REE_1ы(`P#J2d? UF9!lrЍ͓:$;'Zķ4:ETei #ާ6!wzg8)=Ȕ<i$UHaOM~ ^JliRy+)=@"%dC??{h82j̉,-pc|͞xTS:~<${=ͻU y5I Z<Y0V n¯ עmqa՞8Ssާe3A\ k{g"(MN%,Gk4w?wyW/4 ʤJq>A1ڴTZQϩB'+sd$2-){UEN~SkeRSѷIYd0jcT=%ffg$ͫR|PFP"VE jD8x'u>FH9]%ZM3e)?im %aҾy5rcJny^O!hA^^dZɕ7A?c~5.57c:ꭜy)zw/*Bcof=7qs? /Oҁ' Cʅ<=˹H۞ϧ\qM!XHVۀ|=n^r@ >Ԝn4kyNsۼ0#ӥ@ٲ'4 @Gq泱W#h`S%$ 32HqV##6L)pQy\tݮ> @Kftcqb`Avڛɡl,(\a\tֻxњ%0VL$Ҧ#r53}F8|,PFUc ?z ֗:nޙ}!r9}+ϭV+*vHһL1V3#5NIŞKKZEcJ[TF؛r8>ԚW^'mÃ_[m}Lm\s["Cъዪ6v6?_Amdn\dt}jՉ2E$`0d.-25ݛƽDXI@~,Fd\RqP\^p\ ^I ZN|Uuoq%r]󟘒sg#\hF6FqBn.69 jGVoCƳ;`nkp)xc1zC$qqJa`)78k"it5ݍs,A@+RZ;e*t%=?xN n & EvXN}%u/4LJQ-:?ɚ;c2.u*{ wё \Tڞwŵj pR@TfU`g'{כ]%̨#1~`}>ilo-vUxC>{7-yu={GjҴM/upHk^**qXyO9푚kt&33nVTsdtVKzL>םWsСnB|EXe(`l&'Փ9++۸ Fe^nOG3yJ$s^WEUl9QW뛱\S\ѴNFu+UWqa W՘v*ęq󜚼8L J[''9#ӭmȑF%mn2W?JK6X k.X;OLs7wj !k)P+ ҹ#'̅ [C@erЊSoUѮt6't^'UU/=ҥV2F: 0mw{E 01I* sZk+CtM7Z-!itVSK+܂hj:Vqܴ5x 3^uj}!>ju,r aAڄי}6/PwVbqy{HhvN΄}t= }Uj[5Hـ:uy^yg|hz9C4i#v۷ojJ8kǃx%>5m;Y] ;yci}s5$~04M+)M'tq۴d999b=E5N+6sq P+t>kS? >Sţe}k%iG˰?Ee +Q4Kj-vrOoq6uM RFAop yJ!$r77lbnuY4"IwP;A EK}B̷^,"𾰑krǹ?/ATX gi5z?- P/t崹yc[-6i%Ajh؛;f#;7$Hs1=UH,+3Xx'PuKJ k>$6Ij)&㐶v} Z|;;l$$|{mle..)8e$32ʥym @Z^FxC躔J['b}O Οse!| I9z{6_kt{kvdD ouxՂdg#=*+j]h4K]:*h0]-X^B1_V]i2G֑uIH慔'>Sjh:$P˶8T˔fa]G{oi;Fn!}gnyzf-b68Fncul`j6Vѣ 1oJя]sЊa<;kFD9N!^^F*ZI8OOQ`<'Q];V<!E`}ݽ?*V~yZs?ϐ=ӵX/BEu9h#޾k.eܦ 0jW0$h%l! 2 /AמkP->t>Kʽu8p*]:!˩>+xA\+ 4`?Zy^F[$k")2 b2dB+ :T@0#3f0St{}9cp*1Iw j#МP)QGn=Ev#;p@03+[Vt0Hn #928HȮ1`9uXl/8}BiV[=BB:59 \?JѮj5I=ʚlIkƙwW h6L#iG5Gy$$e&4-lҽ.{8c%NxU54{n-/G! 7;@ݱ>Z< 3dsQ}N軡{Ls9jn((U'}^t&̘Tx>tGqӨ$0cW^FR8#SJܱ@J5ψ#j9](^t^p7rG8(4DTzNfVIĶf7N/ /(9`f Qhl4|`uhZJaOv8c Ezuy׌o4'-M<[H +5=VZ&kEjbcbxcC͠k0ۭ$^YĊkJ #ϸ|'zw6%܋g=0ᰃqd 1'p@2 _O{$2S b7fw/G N@d񞖶vwCYybHuF)݅ IkhEym_")9 f\P2Ķ9 ԯuMvEmy<$?'XZ6Xx6?X6wt8Y'ss]CkoQH8PpVbQÒŲwmOqtW[ ]ۙlnZ@0/u->>= Lٖ[[/-NDW, e)q'i=_Fʸ"[xId}AbrI8WT7s{(3z#1_mc ƛvTF_u#÷ZU$p$g̜,LܞxlkY|Zԫr?ҔS/am\n{%CٞI5,^Tz+ɓ^qtŕlp}+YE&s6.~GĶr]Mh)x/žzZXC <$ P2pN_"oJ>iLx[iaepX\n*PR]BI'dyƛ2 ly%yٹ={ OIqmL(9]HAkCHf} ON<]E0[d,RRyBpeI %|Uv˽[}zT[\LyǪm"a$l:\iY&-aIsƳ, z#mz`zy'ʴ|\G PlqJRbș2xd1Z"P32k0x0LgMd& w;i-ճYKł>kѤ@{UIbN2g`w$d^#H,}\ψl|rǗO1V9%QOd| 488"=yi'}OY4йdg^+>8<5`9U95i`z8O\TcbMk$ 2;UKz9L( OQ05E0 $r֭.E a &U*A## UGYSe6T#a~KJ7d8$˜ߦ!~k%ii%\:RuraMLfΥz?\:1jjpy  ZEuy]cʸu!nd|F;uA.b X'DCJTyx 1lS<%]E ٬^[.S4k|G=G[W4;Uee%62I"|`mRČA[N՛Qv0B#[>"[Yխ`M-BpFOIqcϵ484 ܒZ,fIPȌKݷyqcs!t[Ne[hg ]5ơ ۘЬ[Eh _]x[ř  ȱ9Zӭ#TԛSеKrŌsG4利v `h\Ю;!7ζH$41ɹX Үx_Z6 el3dM븀ҝhRj XZx'%"'q I|+$wP%nkZ^%"ɘF.[il gV_M.|4VFLlA$ *9Kk^vfْ{Yl[IJ.>[Kjw6ɮJTIFs팓[6>GK{ p`<4&si{Z4mi,JactGT滯gsj\\+^YY^m! ,0Jj'4oS,%fИN@I' @ cQyfeL5M͗2,s gP<9)z*i2vkoo4vbm (IA1ۇެ="|E&?3r'8[h[HkZ\^* FCgllJ *姅hZu%4ftvm~Q~hv-n1Nڑ9&2OAS`c_I߄5bFԷBg?r‘N>i13cB;@r|-mDCQ_i+! QtҖh䭆-=GPՏo:Sx2H}SνszpkmWu[+z?31 > >aE@}47N+@z`cRd1֥}>YFWҺܗPQr,@muTTt^[$qa}k//:tWLyrݻҢKZꎼ@#5MRzVT$}*bnםA\3b # Oʹy[RWdȫwu43O|WI=R sVP(*n6]8k ^ck;'Ğ ע^N$\JbP#Wʐm? /n9%t·O{ ^ f2giV8a3Cwgh_׭.a "gydAS׸Zy([|BO de')ȯH2x&nj`mu!9ӱN>0<VYX*Aha L SyHScjz3fD@qR^W1U`p8"zK8q\NoNs<+سDMlSwBU I1FNiP4 i ÊP2Ђ8{l]H+8t UgZ/aXKHb*Oj{yQt';Llh3iزVu&.HفpcClQr-2a oTgҫ\dVKMى)5x(45#)3ڞb<`\(*gQP2=NuN=i/zz;]992rެ8r4)zIlsD,s t4oVduuԑIMeZJUMqhIyY9Kth%rt{E'Uzy|jQWP'|<(((7U_nOZ:.#*߈{bo8XͻE6{W*)9Hfd)Ƭ`yrfs3dرooُlb(u;!H`u(""F`UZCҧ]ñ{bq¹[|j}u忔Ȫx*GBkW8'-έljS2Ԛ݊ izڴA"c$|Ls]^E J+oϾ28usRv<-t:[٧P `kKCëJmǫsx]\}GjjHطG/jctW W Ds0-,^W8VeBTp+z?2/.U@5C[kqn880 w}QDWU sqȀ^W ->M˶X|<K}mTWOkHXu5.:l1j9N}E\5M jڼ\ޟLs\&nm ~7kgs[|Zӕkv1/zk3"I'L !}$WMmOa`s᫓6?ڼVR]24Iӂ@cӦ7.ٲd a.;z+]wv5/ESa?o ŶWp$l\fwdjw4?On3 cV:WkHm#;f=ȮUxLӏeF֮cI.,qrF|v2qq{xkZɖ[`j7I'tŻ*J½t>էqRZn?]KMk.(Ӏ у# 棇TFiswaL𭦥m+˹[ KD~G, u5Նs$&dw[F$B.#8=~5jWWj5Uhccٗ3#?uiWz`n^[]ѫ)UWMT7͒11? 5"M͓׈r_dulҭM< ۼ;B ҴtFY5 )[#}JBX㑓ZDIs+ KHfI\ hw`CxP=NSvs-:cr FJFe|GmZx-4X<#@Ϝ[lwF W")Wv/ W~"7Wp Xbe۾F29cMK?Hu]&wڋ;A0$nO$/ۮ~4V3/x8R`]~A^%lίs-`d8!r/,AEux]g.K[hՒdX S̤n^!G9x'#fYxz[ĢMrLꄃ* ydtfo[`:Ul}kYỶ%PH3yDYX粉d ѴQ e5]FXQTVB+FӒx aR*/CvFzk 1HysbGn*W h6dxEaN*#s5`#R*c\1 c %xFRсBͣEHh @SFʟ48LROy) 4~=i' )x𖳏Et~_u_JxoTwE rzIWe8WN?U2w~[s<;|hsgy!EPEPEPF~y}+'(<曟C8r*6LN !`bz5+; YCfGlJ +Z%M6FDEy#N]C zt=(ąQ{_Ы_&4Ox_ӧ޳ ]DJ2%xs_خ.֢xUتx玵sK]JKJ5Gme0 p;0Fr<䁐 uIy78V>CzO* 5Ciqn?5rI(tShc[x;B9J޲ߡa+xpđ訠ҡKB %UWhҺDc;T#&&Cpsa!YUC0% 03׮+iVڽ‹}:}e vnwqeg!|\u4xl9'Nyhq)^X᭽<ڛAoh'J+/)OQ\P>ݭ~{iv1r?(\8"xVǯ4_M@|^5:6Pl5;: ޝc Յbd#aG$,2(0 k]z{G$&-9{oMlŔo Ȥ@q_ ulvx>rO,u?5uG&wvgf+j}oH@"R Ƞۀ0jM.\<\:Oi|TqոxD/fUmNGuH4g14Dy`ݷ=Ŀ mY#{A W)!acjd7C2?? w.tii]}Ż_"{^1 8Gnr2 銳!hw˨h̷ד$*?>9_kP/QզE[|3}t[1M\ףik3MBk_ kH-ns*Z<zy ]VԾ_QEQEQEax/X$.skXOsҡ49zJ~)Ha9QR\E徟Ws,0i6sl$N*y6eI۞3➰i=M[WH]h2Č0w3 v2GB5Kp<6DGx5qUulO]m\#ҶՏ?TǛ[pB*X~뜎H?:[BܜRUy?՟ =W(ɡ;ҫJ- aN}[[hbx_|7{z?2>JɓVͩlH#k]/Ó=)l4M.X槚(#u(KET緐V+3Ro2hiDyUv @j#瞴Np~qr=|%#YO:A'cwڰ&ǨGReў϶+k^&}O4d#?J!k.{zb@rc`DU7sMIOު+<2%Zm(/SgT$U #O'"ڶ1OҒ(g. 9\X'y!Qu30|k+G$luy#}88=Pfo dlZ$s߭4RN?CI.AB@(j7D4ON+4@m9s+*ϐdpq{Z%3f-N8TL%UBF QJ,e.<-Zhk(G!lkT uGZgI$NcLed}H'Vڧm;K]aegEwBwS?HojRy{wmͿv1zunt]>}f;w,'Mr,75pGmq0ӆ,{Lcn_nk jCpa[ XV{Eas1 -m i ;`1YͯEcuKMfO$,~[,͸݂F*9f%o+mKLl66`w:#TnQ|KMMq%{c~\=nőB$%HXtIQeVaw/Ȁr| {ⳏnVm"7$ai3 81 gQm=5=nĶ^ RhzpxZR4XJ+[ =kaOx}倹bFsWji7:[@̓A$2,~/?3Xҍ_~1ԣlYZdn$|}e.8SxW-x~M4%keX :Bw,[ڇ+X02>%O)hʆcI>[Ɩ~ht$~DktK,WmS nTӬtGqz sHpA'?)*(OO}:mvgY6@<X=mjSygqIlc9EX 'Mw5DYĜ뱦_j3IRh[Xz(xw9f-{hI ae:8g$Ȓvx*p0I5moL^wm.A, za&Tar )>$ ؠi9EDehj'Yn^ s_k4B&$W*,b zMå]CHM4iKI.F9V9-<44۟ a` Hq] Y:ɩ-Vkp֑NeaQ<Ѱ Ќ %KqicTb+Ur=hzsjִHt}>M)mF̎7prHw⽌o|D.9b^X 8$(b@ldn9GJ躎G^Ց,[2آG|dOүvɡAj>ԯ|7)Qxl 'Ǧ6qLKD94&3Cx$xIvVfF;{Nzp}+#[7>o" (lF_U2A9|85Ubm-e@; $N>gdU_#L[C "$cDp!3/9N]%XYX%'E`]q'8⥊zjUǟuzֲ a2yl,kz ug|?l5|ۙItN$<pHzWKEqU9gMOȚ5K-߷0''s<=gA$羽d\[J>@h^EyBRFa,ګVwBqITߒ/ oU-j3KU?s\ xj>Y}S ¶AVHH5Bh^{yDqs~oi6g;mBhFbW.ÌUx'[ ݃[;RyC >2wM5x$_xmt=Zut$c.qFn+WğxJFmow]GQ1+F 1pGCi7P:?v3hq-֪ '$ ŊQu?Oz6o2KUY[dFkK[6)l2aG)٨H֪<ƜS8^rlwe{kg%\!Ez%Bۏ{,yaœ%tYtn}($.e:^'[O_VrV"uoͳ"9PҦdV![ڵ$k)Vt@T?=&)VMJccii?7X #_)r Fqڹ,ͼdF sJ,QI3Vl_9!dGCc%8ۛ4H#RҮ:*Ϣ,ׇ#J)b0s&:556["bFH We]A>nFAF["Uϸ俼8̠GV5bA֪dJRgjާor+@SZW}9G]C\Q&㸩tnzG'ڝa]ܪ=H:Qڳ[Jcp3`׍Sky,pjQ_h&/okg@#|+%;8iCѹP2KCǾ&hmOMT|Ejvw[Crc#irgsJ:o 0ۻtIR? `5G7ױ~YEgm VB,Ț[ˋng2sc;ډ["* #5 N2M&:֊Brz嶇.v21H$!3c$IEsui\Hڣڮ*1*ĶYh?HwBF xH#_ۭsL҇}#{ RO}S)$g4{ۍ.k`nr6\J]7YM/RHkYPЕ'KRnoڄ/q=v)N`ˌ;L}Z| 6v*Y#Z`#pT-v=--&^>)Ү|;EB3 j3ɭem;ۋdžs+\LC0%ע 'pn_Xml!tk}L U n]$d-æY|˱RY 8qW ( >0ȉ{65!#h:VꝡO?r ( ( ( ( ( ( (<[3|:ڞ/@֭a-v hg9$r‚Vw/ܴ_hm8\24 1*Pvp6\toKu+hld?FpA^|CmZ\ImtP硍Je^Sq^峎恝*=6^[q4RH&4{.IG LJy_l{My9یs+Q<%ֳ$Z5ca56| 5/cm݁g3@rAFmVmA#Y|ތ$3kL,5f;We[CEVnU"7 R\)#W!A*7[X6?Qey(mmŴ,@9<_gi͵=!೷w>RJd*9#i&&U_%}ɟV#L_&Ae}A1fY ?)ı:8Ěgi1ZYK*Q%Z6,рpHDpO,~WG,no<8qLvV\Qyosg5".ye럽ݯקo$ JEnF`#q5/EkIַ,..mi`Te o5!GfopymcڛTxЈdRHPHyd~]b|!מ侺..7ݖHؔ}=UwP:z M€4V̲̥eNd 9ICm_\^D?i[i~d6d珽׊Ai:vpŝLGʮƲO<'ˋmGEՍ0@eUwA# V"hnd7#ydI< GuMwL}ZM(]9 g#$};Xi/;t`&pCBvQWn㻋 ,Dsq xBX7SItAi4 2^$B9G(~kpڵQLm2[`*44xMW"Is% ?YaXZM.6TV)KK$+[;:Q/t y^ ׷X'ʍ< Y*0xRVҵ'N71\Z>ƑTȡX6C`2 hkil8ʱ~Q`7݌Ӯ+q[jmfG E`fǹ%ݽ\̦MS2H$(n/u:4Xy@ܣ }O84SOH͸bE0ylV5.}\ц$Ӯ c?\ \z{$g}<";.Oa{f,ցnea%8i8UIzul5m\Ӯfʊ0ɹ |wp9W_-4PӔ%&A3IdϔB1$8zZXG\<MRBo]޷uki,dClf &?zp'SŦK-VtA퍪Or Wp'㾴I!,6 ;p{D:$.A[9sc™N{GC^{ꃷ&ٯGp .A#!J0mKgso/4 ׄw?F?(o&#fIٳ~ݹ$tP[vJ|DOdWOa0!(JH%&@sgҠ%xY%Z4y$E+Nb2:=kf-}/15x?UѴ?Gy>ŵO2`)-0L}K@IcY]#Vfą`9}I'5-`xZ$XGDuy\u{Y^6Ec;7\>iOlݮ̓s 56|3nk;و7<I!([=o-ZCrneؗjE)M~R}:0A"&_ba<[gϷzK[&m(O/wѩg8IP~Kh.5k`Oa(I4- KMӣ;Hؑy6@\A(Q@Q@pPW=c#ן|cw_C(-Np\vVR9QEQEQEQEQEQEQEe׍ec {7P#A@n1FW# jS%;^I"J::VR0Av&n4cwr"]a]"i,ֵ};f[ǣ1@r9@Ϳt 9%@ZF$'O[iŢ>#,Ou1 fv Y JE{uh/kٍP%vɓ q֜zDodm=d7P ]ix3@xc46k?car>8[wB1l!+-b[SAY;Y[-l.V:u22F$t-zquqq^ʖCEb8 t ]:ze,CKo$;^X %rE'Gӵ?:K{e:\lA''$T< 'u4Fcgͫx^XDm+w1_M lEB}Rol`yhO1PnV{|/ h#6ȣF~PqE{}cH܃=Pw|`kIi H:$Jy]J2$V+Ǽ7,>u<#<@ Y.$1LI41 t~͞ڦʲB#OIJ 3 Ďq@5m/Im Hm7PI^D] )  I$5jcRج1"!7lN2!:^o ]W֯% 嘞gLm@Al' `ҟ^ΆH2t%$Yrw| pHH^mղDXWz 9\_OxھΛ$GeexLּAmX^\A: ˦kf8ǖ0W<և֔5=kW 5_Z^AsI9<~X_#\̿^G,o ,o |JxPן3?G, Y;S(, G, _!@ϯ?dxcJOY>_"Q@^, ;T?oeUeT[q}+NKlun]J2׫qPr[ۦx#Fi>v}K 9|A@Ϥ?=O{M_\-lmDv}\`0V,4Nw$$m"Y8ߐIRY /M%2d9F.Qd|dAPh-f?/V Bkg 0.s|E}M-$̓[HmB T t{ tmf| `K$|ۙv۞oP9<vO̴Pw^!ZjO<;\^M!1.Xlz}6luB%,d-ጂH~t_{M(7\&̜+cVOi>f)e^hVP9=FP# ?>Ė֦ +l@9@.1xJ8 $N]\ۻsN@u&VJWZF{y}Z4puSsu;29l|emwV}N~aH9hGӚo4k ifstwY\qc#8jΥ ĚEjo`;GP 'x>Z>|W^I6Mj].0~}n1ץdVK[%[O2<[dY72 :p5M(.#K5ŨNKiFvUZM Z^m YOys%NM: `GJi@DoQ4tIb mUv8rM6nj:iCHʱ]U|E}J&ҭ֋NT97m'> -NFMw͸kbg89_2Q@KG%.||Il^]E "y|.Œ}G@:/u#ˆ8Ebrר_uM:+x5XbV8Nm1c{i[o^tMixJx8*@>cP#/|+m4^#!}0K[d|0ی?4Y[o |F^\ T*xtPjH'no4+?EXK ˰p3=Aj$v:AIm8ۛB mE4 2ɕ|S}D(رHT#8>m5 ͤKkXn\}f\ 28$ K@ϯbՆ16odM[ 8?SN|vzJG+r}a~z?dxgO|E1G~_z?dxgO|M?cY<3?ߠ3?h4R _~h? 5@X?~Tʾ;>ʗ?? ?*|GG, A*~4', @5|Q񆇬2^OS`@camlspotter-camlimages-e471b3c4470d/doc/old/ttfimg-icon.jpg0000644000000000000000000001067112405272062021644 0ustar 00000000000000JFIFXCREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 95, Smoothing = 0 C     PP }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?ᄒ,Ե෷iX*Ɗ2I^9 ~޿3EX5t/a{sF 9e<ʽ g}'].5q40! bH D~GZq5g{7@rK׌ @ŗ"߇>h~x^߈]cN|7v(du>9+iO3߲û|=^7IЬRGkέuXòeaWɟXgC 0i? X?toӯέs <4Zdw<,>~|*'xIҾ;-ojZ5B3Ij^².5:GO,KmvI[Y bf~:S- |U/[I~i_c5MjB)Cyh\aC6F%ҿc x>^i4]vZ-cC{7+C2^4Ƅ-=|׎>Y?lh/:v~5<77]yknn.g;bETQ-?i~O |lwνC[Y8QnLEP<S{-\R']b-}D9S6+:cQ ~$~?jO_|"%o|A⫉)|))ohUg YSi%O ̶m[l,7UeڛmmKi,Gĭ#Z7q[uXFZfYya/+ 6xi? _?b|5G||Jooi60KRt=3o.~x_W&x3Ὴ1+xs6EYxtnRFpF?FEeă[׼IW^2Vɨ:]K!Ʉ3s4 ǿğd-5_ xV7%O0ǖh>J$'n)!~Om[OgoWmuCTԣ$cJ 8$&Y$~(칯~?f G>|Mil4 /g\uVnkJa ?[TeF],yF]2u-F6+#L)8(*UF(%K~0?j3]WZԅF+ P$~:).)faya-fMXCPC!b, wtQ\Qy<[O[}!j2RC(mICϿ|}~_fKĺ&x7zfyn v¨7vɀQj?a?8l/pm\#?hF&Ѽ!~4jZWk?6}MJYu iNtN^,d+/UE^~>>(^>2u:}>#"? $#($?a |H:.~ũ}jMm HDBE8M\.Ҽ gSu7 q{swp*= ch:W[nHԵyG-˕@?3NzVbB#$iWa; ?7> Ԥ -OnmF^"&ԮaoI Fa/Ɵu h'ǎZV֖z&I,-0cxz4o.ZUk'`tf[~7z~=&t8 hu"2yEM{y5 9h5;94tj?hD[{vGinHR524+a_<17ߌ߳W|;(dKM rw[^2[YjUU{Ds \LG"D`U+ƿi'W/_5;?4$ntW/#ᾑSfV1 .x5?_Ÿ/~񎙪ڮi YjEu Ll*YC$du8s_G _>&񭿄</6lX⹹,[LX3Il\k?n~Oͩ>k u;JeY*pF~u2$a .dFNF}*Gsq4{Ohg\\_ZE-۽83Uf`sig௉~ oxDAu1qiW4W2,}-v@/kE_xpӴ2 ;$Ɋ5DڣQwxHW!|*>h\c| */߲]rN?`gm?M?3_{O˿Sԗ qaRYx{gmoMg/2KxڀA72䷜3r x_ï5/ߌZuiԬ$Iex]"H+$11|Y?ko?Ɲ~-_Kj:,#JI-i/&F(7/$N$oZ[oxGMЭ=ZZIyN3_꿱_¿h_٣ᎇ'PƏxTӵ{ZͮxKKhc2DBA#}:Ÿ ][{ U8]*id$eA8+?ǿ/p? /VVW[jkmq"9k#da[~ux?O1ѭ~3LѾRݞ-Rkq+]څNS Yĝv_ÍkZ$[G{[i^Oww40نv|= '~ bgx;[{Lt,l5YEnv6r3~ &v-XxvR.*KƳU[4XD$0hl ?K'4Q k. -洔s2nDe?NW]|Ey_xǟO| (gSűx/훉Oxa˘X>~Ҿ| .5W›-/-h/d\[ ẃ$d˩C8ϦE~qȟjg9+ƿPsPZ|u/+dz!п,E`V ckYcR^8eKj2Lԟ.&yO?V_^ cp[fhIJZʊa%T_dҥxu{xa21v 9mC#cO-'[[77TxHJnO ]Ū}U| *$Ӓ2< P95 p"0e# :ο|g CVq xo~!ҭf`:wٮhE{vG qg?iO_|;P> vm.I1π$Ep^6Sȯhcamlspotter-camlimages-e471b3c4470d/doc/old/ttfimg.jpg0000644000000000000000000005023712405272062020720 0ustar 00000000000000JFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((("C3qgcu$i|ɣYx[E ,v{a^efxIoHsc}}v_T r:+fDo51'8$?+WPEPEPETWTol$x} e+ ƾw[Mskr,WOeX PtWmWku5޹q KC#'׆"Eto6yq{"A-IPO=(DxO}^B>h@ۜ~jV FHcДW컭XUXFlBF\B|C\M?S[jL.Iqڀ>碸4z#k]hA%<`W}@Q@Q@Q@Q@Q@Q@Q@Q@|oFMjOf]z @<¾5iͽVE^6=MFXd&Y~5z)C]G&s<:T%EPEPEPEPEPEPEPE|C,>V\m"ݝ<_Ŋƀ>\d?i|5i3 [9Of#s{g_jJRY,`O\p߱-~$񖣙.&$rnD̟n>(钁H?Q4bs"x)-.t@EiEW1g+w))0M-o.>W_p1OE~x/|L31eu`Qc냆+:7-&xtzoC@Q@Q@MKΑ>_CeaIIEM]jZ_ 56u#[fiœ,=诞,hb蛆EX~Qɏ|{W?XҔc=->h#Kÿ.#ӥF5-&>(((+KQ:acMnvɯk\|dd2j aZ_ׄŜ$kme" sV B8냌gm^6;bi ǪkHbS="=T?h\[xw? ЫQ|4ȕ8,&9ހ>DŹcԍDױ}FG5PEPEPEPEP_,ڞ0I9saOM}Es7<_M+{x|KEUZMi P0m?xg#CF5xz7SGQkN:,Wk,E` ! <{_?KEG$;e8)E<ÿ{u)XSo*ܨ{JݎFtA(`yP-o|jPn[HM$9!zOr|;֭btQ45Q@Q@Q@~l_FⷌCu:~f#5~w~6g}3*XSoJ_MIn幜sꠌ:+5P@ c!D+|ŋWO@svVЬv/_ZOZm&O>Yç弨v=((((|X|7M0yOh Kyh千V 'ğڟ4X0i2礲>~ZF9]CWc7`y o뜁dP7Q3/"E 6JG)RAR}uaK\>8H@'`+ج4M+OG6nZ{Kw{xz>*D^3.4M:M<&N)IEx=~^ަ=|8K7c(!?-LT[w?u<';c[ =TMٮΏbB.wؼGxVLCG`OASg_`PEPEP_O'"5{/[ |9uO5{0hirIlj/Z$~sIbx3@F=> (2` מck*hwʭp0 k#ּc xD'u`OĖR?B5=&-ؘ!5ë~@PEQEQu[MF5)DVVp?ǩN<;GIU yW'y7?LVQX6UXǘG8砯eO쭤c1no,#wYmvz!O }BRa63ɴ~<I|gn~vITSK}+o?tṐܲM 1_ҽKeackkf©=6i'̒K#gbrI'5HG@_6<[zNZgX!P%p2x=btmfOjο1} EPEPEP_ |PMSр)q۰S_v*T廑x"OIQ@Q@CW[,udm*2's^s Lg KG݄"K_,@7w ??a&@U$P@#}5EPEPEPP\eg=Ԃ;x#idv誣$Tbös]i|U.7[|:hm?(QEMOVWH#ol¶̯ jמ 񵆤yx~*~]awcmyi 5'Xk|TwH0joL~9dxvuXF?4zu((O6Mf0iP~I[f r݇+.kqZrF ,k_־%M+X[yxQoƀ=&(*is7qZXۮ&I|oq/p3Ks-^QBjUl|k!QܤQgp?5䚰hNd2B%ij{orqd}YYBĽSOR{hF(G!bY1On6|q_ڕQeuwLGR{@h0^]֦@9u-cac_bŸm< 㫛=rAmꨶeRJ3zYO2 E-V?IxKךηpY!bI"OP߶]& t6L Q+ѿbT4!y5ws0kž+5./iJ!U}O]w÷W1}q*\Fp U8Oc@V9$g/ĺDZy턬ʓFn@x|/gi;Z346[j[Zᦸ Ҷ@EPEP__/^.6+,z+Z>pHLr=ĠH=@}7\5b wρ$~~_?NGvp4إ-ou_dPED? \kQq&8Dװ߶ϊI/ [ EBAH)?B+f ?\!v2 ۟}?Go/bl/$4Urr( 'K8D+g– ^i?h]J)b̈́٤bA+j(yg#;I+%OW> iy jv}>w}7i"L.fزE[ܑ+(5 .""f&}GR݁8_6|@)<;k2v澚>_aD>]u~e65Aki#%m?GQ؊.xi96Kմn(ȗk'HM 'tO[zWӬ]ũS֮k|t+,e8-C$U I(h{ׇ, 0j {Śzſ>*'hv }{GYiJIit_}~oK{KӖ$VgIPylz{f>?Bҭ;u1.G''y5z(((((~8V[g$Mj,Ojx4s,;RNI8f= }''ˤX0DI1q>0~Gul45h7 &EFB%8\[~.+VӵkL4o((xgǨ$h(((+_NJn_@dYIQ] *򞧜 ω|/ kw[][a`z2v#52~о>|$D/w"ňڋƀ->C׎O0}R3 7':TznYG(W>crk/iyKcv,v`ſܢxDn3{bu O@bQ^5."hz*CrᢕdgـlײEPEPEPE~q|o MW@[_|\)^w^%xeE~U@Vw]/VQEQEQEQEQEQEQEQEQEQEO[akJ .$?좖?W ,"|^k2 4#/bDW$e&:57eC2áNھ~X]n.$+ncL.=I/rdu==E}LYAecE }OrOry='ᧄ|3B M` f<'86vCb ?R8 BJOۋ@+c+`$h(((((((((((+㿌J̚n:8SAr+l~(5鶖U<#|k5^K;}cLӱgj@b",h`(zWО|"~e1 @;!Cƽh?+QěbՠB d}P+|'4Jq]b:>C_zhXjϿ4~((BgÛ-&vX1ׂ: 7æ%tC;+oOxn C$O7?f/ޑCk ;b>((?m?-~$uHyJ;W5]y`;->=l῱ɪx91 _ĽS?澴dզĤumq 2 ((((/ۋ@+c+`$D ?R8 BJ((((((((((():<f'ހ>U|_4݀{=F!Deh^31%|3xǚֻ!%.>XkCk#NX{oyo"[sX<ؠ+|i[|9%y.,L? CDrˏF8N&[i.6˳*|qֽ;7w;s&ntywD !$}p|xJz^m=Ök\XN1k|[]*i6X7.p6H@R}?@h"((mu#v0>t+X |hV̏UoۃMd|-J} oM>8״` ՀAc ~Rʀ>Ǣ((K?UxwO{lW[^wB TqZ{c٨^2<8Ec_}ĿJ.N̨[򯶨((Jo T?*语n/xO.?;??gВ<2T37"^h ( ( (gZ&.isK]$%jQLX&D'у+Ђ:}QEQEQEQEQE??G\.n 8 Y z/HP-o&E͕}@~(i9=>NmX|嶆Q$XE @+?eo /J[D#潊 ()kZU]iwV7(cC}Py^<9_̶ r5K_-۾CiFH|2F? Io& 4]ZI7w>r|O+?byy\Rx޸Y*P }o@Q@;UaE2ZD~J(+'k俁>%_ U5)eOkN@P71\k$2GF `=1_q7aG:ta1{o|s4[k'p_}s>4QEW߶Rº?!\}Uc0#_Djw^sNvѴJ I5nqyWOI#Pm,Gvl=1Ե˫Ő8h:MZl~U+I03}OsW(((/ۋ@+c+`$8)g $}eF>};s/+ 'm1ހ=Š((((\;Eo,AՈ+]zWnBzz(`+2~$͢2n-'$ܥry#bjs˯x~ydK. r re_@=T澩'W}ᶇ%M<ly0Ӏ'tI5PEPEPEPEPE;=JIEJ~ eb~PFN>]>\ydώө:e/<3^ӹP O ٔwk|I-CPѯ-%ƿ@7oɨ>4X'heҡ۸gDg'p3?>i 4n >=~giI架:k.0SZtQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE0̐A<((o5=j]躍u y֓/nR8WW~HP/@.h~&ɠ~5 ewu1@zN3ֵIwC>,{ j/Ts?t_bLHnnGP2:W|qqt u[Jh %ʾZĐ2zWW'WєQEQEQE>3 еWMM?{gy$*0 @'y|_lH{Y%8 285z׳ɿDѭ@0ūx>zz<_ax)Jȯ~]-7Si*ɤc͘WWV6sM!YdmI$WvbyEcA>U'<>]seJ%'xLEt.lmCeQW( '^μ3DAzwC>,{ j'ϋ?Bzڀ 7AJvb ?R4bOu $+?ؓD]_I+(((@oz7H_5?mWg_qZ=(k/-{襯!akOKf^)k뿂H|!`袊(((+ſk6|_?ҽ+}_p9!+սMM|&4}C@Q@Q@Q@Q@Q@h[R K>W>..z!˼Sj$ _|kO.uT/ץ>}Dc^ Ll? |YlE-}wCI?@Q@Q@Q@Q@x/ OdGABOK;#+Bր9O}1#Fbm)7_IPEPEPEPEP\/oo 6x;+0pfd~WƟ e\#vE*9sa@O(骷umbظisx'&O x&G"La3#e8diӢ-(%I1Aֲ/~&>,\਼F}xh֚wZuvrA ÃV(摻f/YV5讦K;DniN8>I#yj]Zùg) OuW鶽 ( IJ?l$Ia(<3Оa 'n/xO.?k/ۋ@(G$_J2s?E%(((mWg_qZc@oz7H_5h7٪׽Z6Djo!$ Aފ((((?ûK&8kBzx!|EXXJWxYGW \W{/ZM;s !@@#{2;e#ّ }3__>%Iŭ},u^@+\Nx=A#}1Y3s1QEQEQEQED $MoLu 1ʿ2+UT,.6PYJNjx_o*Ncր=oĚ lƝ'q{?zO >X5'O.F8K@wr;dQ;\}>aƾ9Bv7tocz=z1xDIwvRdṋXzst=<7.>a>z6MzV&7 r(Nx|I[z6ٚ6JGl:~#? B Y.o4g!;GS1O؋MeIMw~}G\¯x $.fl˷Ӱ(+?l$Ia(s '^<ϋ?Bzڿ>|V[y\cj8oڼ/acn?$[U o K?iY0ae}Iw<3xQ~ퟱ'WѕI".a/eQEQEQE|om7j{?$OJzgom|?$[lmϭ}E| sROUM?$[_[5_K_]C|k ^!>yv(\ڹ=+ςH|!`袊(((E>$ԧ5AvgWl ð'9>AJ*(ʿ>г_ri.eYfpv@+(((((FXS(,i,o2=A(k'%lž z?hSޢ ( ( OK-lD78`{EyW3~Q P>|0g'ϟ ?Y9^EsOaqg}?6Ht|1Һ:((((7 #{in/&7LmL#<ֹgφ,U< ??u(|aBOZ(ʿ>г_r#CҬ="K,m#m8,I?PEPEPEPEPEPEq"o-ʱ6QG\}SEyG,ڴ?bFgm*txA-QEQEQEQE6x:yo@ 99 z|J|֧-<)fo.-դgUrO?i"ҡԴ;/f$жG>wZ5._V#56ۻ IPGG?||= AsnYaoH:~u(((((wXѝ*(bp5k>UD'l&}q׋|un/-%YL쵇tr޼/%W? uoi_Ue0J6N8O4xb\kt~l8da؃֭(((((((((((>@x: ]+NhBEbp2N9 `q'ޛ+eo5vO_wpv `||ѭq?Gn9J zIsK񖃩6DDZHD[f7l qw~̐[et0no>۫Ճ(e w(((43q"wsrI=p:oL]ߊlazwK_A}c&B nA#ZTGsMoJEa{l|Շ+>ڍ ;c5U3rq5$@oDߊu8"u?jK jFdٕd'e`s(~((*i-^kvX,@]0[=ȓb y+oWP[3/9ɷ`Mz2$$eu9 Bq@/o˨m&P{\5˒NX rz](u*2"<η>}pF tɶPLz; ꦫXjVqdA.NX9 WwᵭǓ/m/G@ETu+-cM4n|SBDZn ( ( ( ( ( ( ( ( (#n.eH` HE$_4ğ0"}/?go^󜈳d3g_nn<=ڝKq8S P} c8.:UNWQʝH?j_=~tܺ闀ÓRQhܮU-QEQE# ſ?‹OoD!5 S(m q؎8 j+#F^:B&@|W`]H' O u${W=`DVfVo_NPEP|4ËJxuaHآ[Œf})EXMS7kOIȡ̓?U࿰岶ᶌ@!?((+?_ѴhZVkՅ'<9dV9Gʂfo\g߲]ݻ96cdmWv*7>r.`sdl[9$g٨袊i:yj-ōf)oS>8|4i⵲Εvk+fPpQ\ ܲGW >bX[1O;1-VdHۋ55GG@k܉(((((((((w>3xFbRagB?A_ix_|];M^+LΩ,/Jz?1WNtXЊk5ԍٯf\p='~)x#p%CSyO2J~;CQ}~VJ쟩̩'Ekie L~5|I}"݌/ĚX3ŷO٥mm~nj IƏ%SFĞ:}B{+~sZt>EXԈh¢O'A^EQEQEW~*ϋYa2jZ!iJInqr0ָK彌x+ķ+Eė X$$z Ɗ(< O"Gj]T I)qKbmRXA`߀oߧKa78dp ( ( (>f#c JʷS)> zg٩.WN/OlФ~@ư?kMc,p!i4' ߀ v2 &>${UjƊ(>_t`~i%Á`wpXYOwy*Cmm,¢$+w⧊?5Cs6 V갨ڀ]gܚ@9 gU٫+O؟Tokz_Q3I#@=2_EEPEPEPEPEPEPEPEPEP@#_*j.5 kDVbdJfcO?$cEs7Q,iP_$r6a @F,uw$Au?P~1}?ᧂ5HaF"0{<>{U߳ҵ4Ե}rY#I lPtQEQEQEQE|}sOy". lx {NN{Wo?[GxZn6ėqStkˉ"MЍ82'mWiiNxvEpEmd|OE_ZWߌ9~h.gޠ o=syN.xM;*L?/=Ec!t-54]}n"WPrB=_jtuj)w$3DY07'3QEX(((((((((camlspotter-camlimages-e471b3c4470d/doc/sphinx/0RELEASE.sh0000755000000000000000000000014412405272062021146 0ustar 00000000000000make html scp -r _build/html/* furuse@yquem.inria.fr:/net/yquem/infosystems/www/gallium/camlimages/ camlspotter-camlimages-e471b3c4470d/doc/sphinx/Makefile0000644000000000000000000000751712405272062021122 0ustar 00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest text blogger hatena confluence help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " text to make text files" @echo " blogger to make blogger draft texts" @echo " hatena to make hatena draft texts" @echo " confluence to make confluence draft texts" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/draft.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/draft.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text pages are in $(BUILDDIR)/text." hatena: $(SPHINXBUILD) -b hatena $(ALLSPHINXOPTS) $(BUILDDIR)/hatena @echo "Build finished. The draft pages are in $(BUILDDIR)/hatena." confluence: $(SPHINXBUILD) -b confluence $(ALLSPHINXOPTS) $(BUILDDIR)/confluence @echo "Build finished. The draft pages are in $(BUILDDIR)/confluence." blogger: $(SPHINXBUILD) -b blogger $(ALLSPHINXOPTS) $(BUILDDIR)/blogger @echo "Build finished. The draft pages are in $(BUILDDIR)/blogger." camlspotter-camlimages-e471b3c4470d/doc/sphinx/conf.py0000644000000000000000000001430212405272062020747 0ustar 00000000000000# -*- coding: utf-8 -*- # # CamlImages documentation build configuration file, created by # sphinx-quickstart on Tue Jan 25 22:34:37 2011. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.append(os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8' # The master toctree document. master_doc = 'index' # General information about the project. project = u'CamlImages' copyright = u'2011, Jun FURUSE and Pierre WEIS' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '4.0.0' # The full version, including alpha/beta/rc tags. release = '4.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_use_modindex = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'CamlImagesdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'CamlImages.tex', u'CamlImages Documentation', u'Jun FURUSE and Pierre WEIS', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_use_modindex = True camlspotter-camlimages-e471b3c4470d/doc/sphinx/index.rst0000644000000000000000000001660412405272062021320 0ustar 00000000000000.. CamlImages documentation master file, created by sphinx-quickstart on Tue Jan 25 22:34:37 2011. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. ====================================== CamlImages v4.0.1 ====================================== *Objective Caml image processing library* .. toctree:: :numbered: What is CamlImages ? ====================================== CamlImages is an image processing library, which provides * Basic functions for image processing and loading/saving various image file formats (hence providing a translation facility from format to format), * Interfaces with the Caml graphics library and LablGtk2 allows to display images in GUI environments * A freetype interface, integrated into the library: you can draw texts into images using any truetype fonts. In addition, the library can handle huge images that cannot be (or can hardly be) stored into the main memory (the library then automatically creates swap files and escapes them to reduce the memory usage). Additional example programs are supplied in the examples directory of the library: converter Conversion program, that converts image from formats to formats. crop `Cropping' program, that cuts an image to its edges. edgedetect Program to detect edges into an image. gifanim Animation program for gif encoded series of images. liv Image viewer using LablGtk. monochrome Converts a color image to monochrome. normalize Normalizes the colormap of an image. This program analyzes the colormap information of the image to normalize its brightness over the full range available. resize Program to resize an image. tiffps Program to output a postscript version of a tiff image (for instance to print it). ttfimg True-type font dump program. It can be used to create fancy banners or buttons. Try for instance ``ttfimg ../../test/micap.ttf -message Bonjour -fg red -bg black``. Visualize with liv (of course). ttfimg also creates some sample images of true type fonts. Try ``ttfimg -o sample_micap.jpg ../../test/micap.ttf``. Download and Installation -------------------------- Get the source tar ball, decompress it, and read the file INSTALL. You can also access the read-only repository which contains the latest developing (but not yet released) version. Source download https://bitbucket.org/camlspotter/camlimages/get/v4.0.1.tar.gz Repository hg clone https://bitbucket.org/camlspotter/camlimages Using CamlImages ------------------- Color models ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CamlImages supports the following color models: * Rgb24: 24bit depth full color image. * Index8: 8bit depth indexed image with transparent information. * Index16: 16bit depth indexed image with transparent. * Rgba32: 32bit depth full color image, with the alpha channel. * Cmyk32: 32bit Cyan Magenta Yellow and black image. (Unfortunately, beautiful conversion between RGB and CMYK is not supported.) For each color model, a corresponding module is provided. For example, use the module Rgb24 if you want to access 24bit depth full color images. Load/Save image files and other fancy features ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CamlImages supports loading and saving of the following file formats: * Bitmap, windows bitmap format (.bmp). * Gif, graphics interchange format (.gif) (not recommended). * Jpeg, joint photographic experts group (.jpeg or .jpg). * Png, portable network graphics (.png). * Tiff, tagged image file format (.tiff or .tif). (Color only.) * X pixmaps (.xpm). (Loading only.) * Encapsulated Postscript (using ghostscript) * xv thumbnail files (see xvthumb directory). For each image format, we provide a separate module. For instance, use the Tiff module to load and save images stored in the tiff file format. If you do not want to specify the file format, you can use Image.load: this function automatically analyzes the header of the image file at hand and loads the image into the memory, if the library supports this format. CamlImages also provides an interface to the internal image format of O'Caml's Graphics library (this way you can draw your image files into the Graphics window). You can also draw strings on images using the Freetype library, which is an external library to load and render TrueType fonts. Class interface ^^^^^^^^^^^^^^^^^^^^^^^^^^ The modules with names beginning with the letter 'o' contains the object class interface for CamlImages. Image swap ^^^^^^^^^^^^^^^^^^^^^^^^^^ When you create/load a huge image, the computer memory may not be sufficient to contain all the data. (For example, this may happen if you are working with a scanned image of A4, 720dpi, 24bit fullcolor, even if you have up to 128Mb of memory!) To work with such huge images, CamlImages provides image swaps, which can escape part of the images into files stored on the hard disk. A huge image is thus partitioned into several blocks and if there is not enough free memory, the blocks which have not been accessed recently are swapped to temporary files. If a program requests to access to such a swapped block, the library silently loads it back into memory. By default, image swapping is disabled, because it slows down the programs. To activate this function, you have to modify Bitmap.maximum_live and Bitmap.maximum_block_size: * Bitmap.maximum_live is the maximum heap live data size of the program (in words) * Bitmap.maximum_block_size is the maximum size of swap blocks (in words). For example, if you do not want to use more than 10M words (that is 40Mb for a 32bit architecture or 80Mb for a 64bit architecture), set Bitmap.maximum_live to 10000000. You may (and you should) enable heap compaction, look at the GC interface file, gc.mli, in the standard library for more details (you should change the compaction configuration). Bitmap.maximum_block_size affects the speed and frequency of image block swapping. If it is larger, each swapping becomes slower. If it is smaller, more swappings will occur. Too large and too small maximum_block_size, both may make the program slower. I suggest to have maximum_block_size set to !Bitmap.maximum_live / 10. If you activated image swapping, cache files for unused swapped blocks will be removed automatically by Caml GC finalization, but you may free them explicitly by hand also. The functions and methods named "destroy" will free those blocks. The swap files are usually created in the /tmp directory. If you set the environment variable "CAMLIMAGESTMPDIR", then its value replaces the default "/tmp" directory. The temporary files are erased when the program exits successfully. In other situations, for instance in case of spurious exception, you may need to erase temporary files manually. Miscellaneous ----------------- Examples of use of the library ? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can find some examples in the examples directory including image auto-cropping, resizing and an image viewer with the lablgtk library. How do I organize my Makefile to use the library ? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From v4.0.0, CamlImages use the `OMake build system `_ and you need to write OMakefile instead of Makefile. You can see such an example of OMakefile at: examples/converter-external/OMakefile Issue tracker ---------------------- http://modulogic.inria.fr/bugtracker/view_all_bug_page.php camlspotter-camlimages-e471b3c4470d/doc/sphinx/make.bat0000644000000000000000000000600712405272062021060 0ustar 00000000000000@ECHO OFF REM Command file for Sphinx documentation set SPHINXBUILD=sphinx-build set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\CamlImages.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\CamlImages.ghc goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end camlspotter-camlimages-e471b3c4470d/examples/.cvsignore0000644000000000000000000000002512405272062021205 0ustar 00000000000000Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/OMakefile0000644000000000000000000000014212405272062020764 0ustar 00000000000000.SUBDIRS: edgedetect liv normalize ttfimg converter gifanim resize crop imgstat monochrome tiffps camlspotter-camlimages-e471b3c4470d/examples/README.txt0000644000000000000000000000046412405272062020712 0ustar 00000000000000All the examples except converter-external can be built without installing camlimages. Therefore, Makefiles and OMakefiles in these directories are bit ad-hoc and not quite useful as examples to use camlimages. converter-external serves an example of actual use of camlimages, installed in `ocamlc -where`. camlspotter-camlimages-e471b3c4470d/examples/converter-external/OMakefile0000644000000000000000000000322212405272062024615 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.3 2010/05/16 01:45:54 furuse Exp $ *) .PHONY: all clean BYTE_ENABLED = true NATIVE_ENABLED = true USE_OCAMLFIND = true if $(not $(OCAMLFIND_EXISTS)) eprintln(This project requires ocamlfind, but is was not found.) eprintln(You need to install ocamlfind and run "omake --configure".) exit 1 FILES[]= converter # If you are only interested in some parts of image formats, # for example, gif and jpeg, say camlimages.gif camlimages.jpeg # instead of camlimages.all_formats. OCAMLPACKS[]= camlimages.all_formats # the library is created with -dllib: no -custom required public.OCAML_BYTE_LINK_FLAGS = .DEFAULT: $(OCamlProgram converter, $(FILES)) clean: rm -f $(filter-proper-targets $(ls R, .)) camlspotter-camlimages-e471b3c4470d/examples/converter-external/OMakeroot0000644000000000000000000000315612405272062024667 0ustar 00000000000000######################################################################## # Permission is hereby granted, free of charge, to any person # obtaining a copy of this file, to deal in the File without # restriction, including without limitation the rights to use, # copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the File, and to permit persons to whom the # File is furnished to do so, subject to the following condition: # # THE FILE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE FILE OR # THE USE OR OTHER DEALINGS IN THE FILE. ######################################################################## # The standard OMakeroot file. # You will not normally need to modify this file. # By default, your changes should be placed in the # OMakefile in this directory. # # If you decide to modify this file, note that it uses exactly # the same syntax as the OMakefile. # # # Include the standard installed configuration files. # Any of these can be deleted if you are not using them, # but you probably want to keep the Common file. # open build/C open build/OCaml open build/LaTeX # # The command-line variables are defined *after* the # standard configuration has been loaded. # DefineCommandVars() # # Include the OMakefile in this directory. # .SUBDIRS: . camlspotter-camlimages-e471b3c4470d/examples/converter-external/converter.ml0000644000000000000000000000301012405272062025372 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: converter.ml,v 1.1.2.1 2010/05/13 13:14:47 furuse Exp $ *) open Images;; open OImages;; open Info;; let files = ref [] in Arg.parse [] (fun s -> files := s :: !files) "converter src dst"; let src, dst = match List.rev !files with | [src; dst] -> src, dst | _ -> invalid_arg "you need two arguments" in let src = OImages.load src [] in let saver src = src#save dst None [] in try saver src with | Wrong_image_type -> (* try to use another color model *) let src' = match OImages.tag src with | Rgb24 img -> invalid_arg "Sorry! No color reduction is implemented" | Index8 img -> img#to_rgb24#coerce | Index16 img -> img#to_rgb24#coerce | _ -> invalid_arg "not supported" in saver src';; camlspotter-camlimages-e471b3c4470d/examples/converter/.cvsignore0000644000000000000000000000005512405272062023217 0ustar 00000000000000converter converter.byt Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/converter/OMakefile0000644000000000000000000000203412405272062022775 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) BuildExample(converter, converter, all_formats) camlspotter-camlimages-e471b3c4470d/examples/converter/converter.ml0000644000000000000000000000277012405272062023566 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: converter.ml,v 1.11 2004/09/21 18:15:41 weis Exp $ *) open Images;; open OImages;; let files = ref [] in Arg.parse [] (fun s -> files := s :: !files) "converter src dst"; let src, dst = match List.rev !files with | [src; dst] -> src, dst | _ -> invalid_arg "you need two arguments" in let src = OImages.load src [] in let saver src = src#save dst None [] in try saver src with | Wrong_image_type -> (* try to use another color model *) let src' = match OImages.tag src with | Rgb24 _img -> invalid_arg "Sorry! No color reduction is implemented" | Index8 img -> img#to_rgb24#coerce | Index16 img -> img#to_rgb24#coerce | _ -> invalid_arg "not supported" in saver src';; camlspotter-camlimages-e471b3c4470d/examples/crop/.cvsignore0000644000000000000000000000004312405272062022150 0ustar 00000000000000crop.byt crop Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/crop/OMakefile0000644000000000000000000000204612405272062021734 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) OCAMLPACKS[]= unix BuildExample(crop, crop, all_formats) camlspotter-camlimages-e471b3c4470d/examples/crop/README0000644000000000000000000000065312405272062021037 0ustar 00000000000000crop images Utility for autocropping images. [crop body.ext] crops the border of the image [body.ext] and save the result in [body.crop.ext]. For example, +------------------+ | | | /\ An image | | / \----+ | | / \ | | | | +------------------+ becomes +-------------+ | /\ An image| | / \----+ | |/ \ | | +-------------+ camlspotter-camlimages-e471b3c4470d/examples/crop/crop.ml0000644000000000000000000002422212405272062021452 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: crop.ml,v 1.14 2004/09/12 21:39:52 weis Exp $ *) open Images;; open OImages;; (* split a string according to char_sep predicate *) let split_str char_sep str = let len = String.length str in if len = 0 then [] else let rec skip_sep cur = if cur >= len then cur else if char_sep str.[cur] then skip_sep (succ cur) else cur in let rec split beg cur = if cur >= len then if beg = cur then [] else [String.sub str beg (len - beg)] else if char_sep str.[cur] then let nextw = skip_sep cur in (String.sub str beg (cur - beg)) ::(split nextw nextw) else split beg (succ cur) in let wstart = skip_sep 0 in split wstart wstart;; let get_extension s = let dotpos = String.rindex s '.' in String.sub s (dotpos + 1) (String.length s - dotpos - 1);; let edge edgename img24 = (* its not a true edge detection it is "directed" *) let edgeimg = match edgename with | Some _ -> Some (new rgb24_with img24#width img24#height [] (Bytes.copy img24#dump)) | None -> None in let edge = Array.init img24#width (fun _ -> Array.make img24#height 0) in (* inner kills outer *) let s = if img24#width < img24#height then img24#width else img24#height in let s = s / 2 in let diff x1 y1 x2 y2 = Color.rgb_square_distance (img24#get x1 y1) (img24#get x2 y2) > 5000 in (* directed edge *) for i = 0 to s - 1 do for x = i to img24#width - 1 - i do let y = i in let y' = y + 1 in if diff x y x y' then edge.(x).(y') <- 1; let y = img24#height - 1 - i in let y' = y - 1 in if diff x y x y' then edge.(x).(y') <- 1; done; for y = i to img24#height - 1 - i do let x = i in let x' = x + 1 in if diff x y x' y then edge.(x').(y) <- 1; let x = img24#width - 1 - i in let x' = x - 1 in if diff x y x' y then edge.(x').(y) <- 1; done; done; (* inner kills outer *) for i = 0 to s - 1 do for x = i to img24#width - 1 - i do let y = i in let y' = y + 1 in if edge.(x).(y') = 1 then edge.(x).(y) <- 0; let y = img24#height - 1 - i in let y' = y - 1 in if edge.(x).(y') = 1 then edge.(x).(y) <- 0; done; for y = i to img24#height - 1 - i do let x = i in let x' = x + 1 in if edge.(x').(y) = 1 then edge.(x).(y) <- 0; let x = img24#width - 1 - i in let x' = x - 1 in if edge.(x').(y) = 1 then edge.(x).(y) <- 0; done; done; let edge2 = Array.init img24#width (fun _ -> Array.make img24#height 0) in (* sole points are dead *) for x = 0 to img24#width -1 do for y =0 to img24#height -1 do let sole = ref true in if edge.(x).(y) > 0 then begin for sx = -1 to 1 do for sy = -1 to 1 do if sx * sy <> 0 || (sx = 0 && sy = 0) then () else begin try if edge.(x+sx).(y+sy) > 0 then sole := false with _ -> () end done done; end; if not !sole then edge2.(x).(y) <- 1 done done; begin match edgename, edgeimg with | Some _name, Some img -> for x = 0 to img24#width - 1 do for y = 0 to img24#height - 1 do if edge2.(x).(y) > 0 then begin let rgb = img#get x y in rgb.r <- (rgb.r + 255 * 9) / 10; rgb.g <- rgb.g / 10; rgb.b <- rgb.b / 10; img#set x y rgb end done done; | _ -> () end; edge2, edgeimg;; let save def name img format = if format = Jpeg then begin let rec saver quality = let defsize = (Unix.stat def).Unix.st_size in img#save name (Some Jpeg) [Save_Quality quality]; let newsize = (Unix.stat name).Unix.st_size in if newsize > defsize * 3 / 2 && quality > 50 then saver (quality - 5) else prerr_endline (Printf.sprintf "quality= %d" quality) in saver 95 end else begin img#save name (Some format) [Save_Quality 95]; prerr_endline "done." end;; type crop = | WHXY of int * int * int * int | XXYY of int * int * int * int | PROP of int * int;; let files = ref [] in let force_write = ref false in let test = ref false in let conf = ref None in let delim = ref 4 in Arg.parse [ "-force", Arg.Unit (fun () -> force_write := true), ": force to create a cropped file everytime"; "-test", Arg.Unit (fun () -> test := true), ": test"; "-delim", Arg.Int (fun x -> delim := x), ": delimit 1/x (1/4)"; "-crop", Arg.String (fun s -> let whxy = ref false in let prop = ref false in let xxyy = ref false in match List.map int_of_string (split_str (function '+' -> whxy := true; true | 'x' -> whxy := true; true | '-' -> xxyy := true; true | '/' -> prop := true; true | _ -> false) s) with | [w;h] when !prop -> conf := Some (PROP (w,h)) | [w;h;x;y] when !whxy -> conf := Some (WHXY (w,h,x,y)) | [x1;x2;y1;y2] when !xxyy -> conf := Some (XXYY (x1,x2,y1,y2)) | _ -> assert false), "?x?+?+? : explicit cropping"; ] (fun s -> files := s :: !files) "crop files"; let files = List.rev !files in List.iter (fun file -> try let format,_ = Images.file_format file in let orgimg = OImages.load file [] in let ext = get_extension file in let body = String.sub file 0 (String.length file - String.length ext - 1) in let outfile = body ^ ".crop." ^ ext in let edgefile = body ^ ".edge." ^ ext in let edgeimg = ref None in let x1, x2, y1, y2 = match !conf with | None -> let img = match OImages.tag orgimg with | Rgb24 i -> i | Index8 i -> i#to_rgb24 | _ -> raise Wrong_image_class in let edge, eimg = edge (if !test then Some edgefile else None) img in edgeimg := eimg; let borderdetect w h q = let max = w / !delim in let found = ref 0 in for x = 0 to max do let rec chunk y = if q x y = 1 then try chunk (y+1) + 1 with _ -> 1 else 0 in let rec chunks y = try let c = chunk y in c :: chunks (y + c + 1) with | _ -> [] in let chunks = chunks 0 in let power = List.fold_left (fun s x -> s + x) 0 (List.map (fun x -> x * x) chunks) in if power > h * h / 128 then found := x; done; !found in let x1 = borderdetect img#width img#height (fun x y -> edge.(x).(y)) in let x2 = borderdetect img#width img#height (fun x y -> edge.(img#width-x-1).(y)) in let y1 = borderdetect img#height img#width (fun x y -> edge.(y).(x)) in let y2 = borderdetect img#height img#width (fun x y -> edge.(y).(img#height-x-1)) in begin match !edgeimg with | Some img -> for x = x1 to img#width - 1 - x2 do let f y = if edge.(x).(y) > 0 then img#set x y {r=0;g=255;b=0} in f y1; f (img#height - 1 - y2) done; for y = y1 to img#height - 1 - y2 do let f x = if edge.(x).(y) > 0 then img#set x y {r=0;g=255;b=0} in f x1; f (img#width - 1 - x2) done; img#save edgefile (Some Jpeg) [Save_Quality 75]; img#destroy | None -> () end; x1, x2, y1, y2 | Some (WHXY (w, h, x, y)) -> prerr_endline "WHXY"; x, orgimg#width - x - w, y, orgimg#height - y - h | Some (XXYY (x1, x2, y1, y2)) -> x1, x2, y1, y2 | Some (PROP (w, h)) -> let r = float w /. float h in let dx = truncate (((float orgimg#width) -. (float orgimg#height) *. r) /. 2.0) in let dy = truncate (((float orgimg#height) -. (float orgimg#width) /. r) /. 2.0) in if dx > 0 then dx, dx, 0, 0 else if dy > 0 then 0, 0, dy, dy else 0, 0, 0, 0 in let w = orgimg#width - x1 - x2 and h = orgimg#height - y1 - y2 in prerr_string (Printf.sprintf "%s: %dx%d+%d+%d (x:%d %d, y:%d %d)" file w h x1 y1 x1 x2 y1 y2); flush stderr; if w <> orgimg#width || h <> orgimg#height then begin let img' = OImages.sub orgimg x1 y1 w h in prerr_string " saving... "; flush stderr; save file outfile img' format end else begin (* no need to create the file *) if !force_write then begin prerr_string " saving... "; flush stderr; save file outfile orgimg format end else prerr_endline " no need to save"; end with | Wrong_image_class -> prerr_endline (Printf.sprintf "%s not supported" file)) files;; camlspotter-camlimages-e471b3c4470d/examples/edgedetect/.cvsignore0000644000000000000000000000004312405272062023302 0ustar 00000000000000edge edge.byt Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/edgedetect/OMakefile0000644000000000000000000000202212405272062023060 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) BuildExample(edge, edge, all_formats) camlspotter-camlimages-e471b3c4470d/examples/edgedetect/README0000644000000000000000000000014412405272062022164 0ustar 00000000000000edge detection [edge body.ext] creates the edge-detected image of [body.ext] in [body.edge.jpg]. camlspotter-camlimages-e471b3c4470d/examples/edgedetect/edge.ml0000644000000000000000000000631112405272062022544 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: edge.ml,v 1.12 2004/09/12 21:47:43 weis Exp $ *) open Images;; open OImages;; let edge (bmp : rgb24) = let width = bmp#width in let height = bmp#height in let rgb24 = new rgb24 width height in let f x y = let center = bmp#get x y in let points = Array.init 3 (fun dx -> Array.init 3 (fun dy -> try bmp#get (x+dx-1) (y+dy-1) with Out_of_image -> center)) in let r = ref 0 and g = ref 0 and b = ref 0 in let diff = ref 0 in let add dx dy weight = let rgb = points.(dx+1).(dy+1) in r := !r + rgb.r * weight; g := !g + rgb.g * weight; b := !b + rgb.b * weight; let dr = center.r - rgb.r and dg = center.g - rgb.g and db = center.b - rgb.b in diff := !diff + truncate (sqrt ( float (dr * dr + dg * dg + db * db) )) in add (-1) 0 1; add 1 0 1; add 0 (-1) 1; add 0 1 1; add (-1) (-1) 1; add 1 (-1) 1; add (-1) 1 1; add 1 1 1; (* 0 <= diff <= 3544 *) let cw = let cw = float !diff /. 3544.0 in if cw < 0.0 then 0.0 else if cw > 1.0 then 1.0 else cw in (* we need to emphasize the difference *) let cw = truncate (sqrt cw *. 256.0) in let newcolor org = let c = org / 8 + cw in if c > 255 then 255 else c in { r= newcolor center.r; g= newcolor center.g; b= newcolor center.b } in for x = 0 to width -1 do for y = 0 to height -1 do rgb24#unsafe_set x y (f x y) done done; rgb24;; let files = ref [] in Arg.parse [] (fun s -> files := s :: !files) "edge files"; let files = List.rev !files in List.iter (fun file -> try let rgb = let oimage = OImages.load file [] in match OImages.tag oimage with | Index8 img -> let rgb = img#to_rgb24 in img#destroy; rgb | Index16 img -> let rgb = img#to_rgb24 in img#destroy; rgb | Rgb24 img -> img | _ -> raise (Invalid_argument "not supported") in let rgb' = edge rgb in let get_extension s = let dotpos = String.rindex s '.' in String.sub s (dotpos + 1) (String.length s - dotpos - 1) in let ext = get_extension file in let body = String.sub file 0 (String.length file - String.length ext - 1) in let outfile = body ^ ".edge.jpg" in rgb'#save outfile (Some Jpeg) []; with _ -> ()) files;; camlspotter-camlimages-e471b3c4470d/examples/gifanim/.cvsignore0000644000000000000000000000006112405272062022617 0ustar 00000000000000.depend gifanim gifanim.byt Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/gifanim/.depend0000644000000000000000000000014612405272062022063 0ustar 00000000000000guienv.cmo: guienv.cmx: usleep.cmo: usleep.cmx: gifanim.cmo: guienv.cmo gifanim.cmx: guienv.cmx camlspotter-camlimages-e471b3c4470d/examples/gifanim/OMakefile0000644000000000000000000000210512405272062022377 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) OCAMLPACKS[] = lablgtk2 unix BuildExample(gifanim, gifanim guienv usleep, gif lablgtk2) camlspotter-camlimages-e471b3c4470d/examples/gifanim/README0000644000000000000000000000022112405272062021475 0ustar 00000000000000Gifanim animate gif animation files. This is an LablGtk application. You need to install the library with the configure option --with-lablgtk. camlspotter-camlimages-e471b3c4470d/examples/gifanim/gifanim.ml0000644000000000000000000000541512405272062022573 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: gifanim.ml,v 1.12.2.1 2010/05/13 13:36:09 furuse Exp $ *) open Images;; open Ximage;; open Guienv;; open Gdk;; open GMain;; open Gif;; let file = ref "" in Arg.parse [] (fun s -> file := s) "gifanim file"; let gifseq = Gif.load !file [] in let darea = (* new GMisc.drawing_area :width :height show: true packing: window#add *) GMisc.drawing_area ~show: true ~packing: window#add ~width: gifseq.screen_width ~height: gifseq.screen_height () in window#show (); let drawing = darea#misc#window in prerr_endline "GUI done"; let frames = Array.of_list (List.map (fun frame -> frame, Ximage.of_image visual None (Index8 frame.frame_bitmap), Ximage.mask_of_image window#misc#window (Index8 frame.frame_bitmap) ) gifseq.frames) in prerr_endline "Image load done"; let len = Array.length frames in let gc = GC.create drawing in let rect = Rectangle.create ~x:0 ~y:0 ~width: gifseq.screen_width ~height: gifseq.screen_height in let pos = ref 0 in let rec disp_frame () = let frame, image, mask = frames.(!pos) in begin match mask with | Some bmp -> Gdk.GC.set_clip_origin gc ~x: frame.frame_left ~y: frame.frame_top; Gdk.GC.set_clip_mask gc bmp | None -> Gdk.GC.set_clip_origin gc ~x: 0 ~y: 0; Gdk.GC.set_clip_rectangle gc rect end; Gdk.Draw.image drawing gc image.data ~xsrc: 0 ~ysrc:0 ~xdest: frame.frame_left ~ydest: frame.frame_top ~width: frame.frame_bitmap.Index8.width ~height: frame.frame_bitmap.Index8.height; Gdk.X.flush (); if len = 1 then false else begin incr pos; if !pos = len then pos := 0; ignore (Timeout.add ~ms:(frame.frame_delay*10) ~callback: disp_frame); false end in prerr_endline "first call"; let id = ref None in id := Some (window#event#connect#configure ~callback: (fun _ev -> begin match !id with | Some id -> window#misc#disconnect id | None -> () end; disp_frame ())); prerr_endline "Entered main loop"; Main.main ();; camlspotter-camlimages-e471b3c4470d/examples/gifanim/guienv.ml0000644000000000000000000000243012405272062022450 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: guienv.ml,v 1.6.2.1 2010/05/13 13:36:09 furuse Exp $ *) open Gdk;; open GMain;; GtkMain.Main.init ();; let window = GWindow.window ~title: "gifanim" (* ~auto_shrink: true *) ~allow_shrink: true ~allow_grow: true ();; window#connect#destroy ~callback:Main.quit;; let visual = window#misc#visual;; let quick_color_create = Truecolor.color_creator visual;; let quick_color_parser = Truecolor.color_parser visual;; let colormap = Gdk.Color.get_system_colormap ();; camlspotter-camlimages-e471b3c4470d/examples/gifanim/usleep.ml0000644000000000000000000000164012405272062022452 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: usleep.ml,v 1.4 2004/09/23 06:56:23 weis Exp $ *) let usleep sec = ignore (Unix.select [] [] [] sec);; camlspotter-camlimages-e471b3c4470d/examples/imgstat/.cvsignore0000644000000000000000000000005112405272062022654 0ustar 00000000000000imgstat imgstat.byt Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/imgstat/OMakefile0000644000000000000000000000203012405272062022432 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) BuildExample(imgstat, imgstat, all_formats) camlspotter-camlimages-e471b3c4470d/examples/imgstat/README0000644000000000000000000000023212405272062021535 0ustar 00000000000000Resize images % resize -scaie creates an image file "out.", scaled image of by . Just works with Rgb24 image classes.camlspotter-camlimages-e471b3c4470d/examples/imgstat/imgstat.ml0000644000000000000000000000213212405272062022660 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: imgstat.ml,v 1.2 2004/09/21 18:15:42 weis Exp $ *) open Images;; Arg.parse [] (fun s -> try let f, h = file_format s in Printf.printf "%s %s %dx%d\n" s (extension f) h.header_width h.header_height with | _ -> Printf.printf "%s ???\n" s) "imgstat files";; camlspotter-camlimages-e471b3c4470d/examples/liv/.cvsignore0000644000000000000000000000005212405272062021777 0ustar 00000000000000liv liv.byt .xvpics Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/liv/BulletHole.xpm0000644000000000000000000000743612405272062022601 0ustar 00000000000000/* XPM */ static char * BulletHole_xpm[] = { "48 48 63 1", " c None", ". c #CF3CCB2BCF3C", "X c #EFBEEBADEFBE", "o c #D75CD34CD75C", "O c #514451445144", "+ c #9E799A699E79", "@ c #FFFFFBEEFFFF", "# c #E79DE38DE79D", "$ c #082008200820", "% c #965892489658", "& c #A699A289A699", "* c #BEFBBAEABEFB", "= c #410341034103", "- c #861782078617", "; c #8E388A288E38", ": c #DF7DDB6CDF7D", "> c #F7DEF3CEF7DE", ", c #208120812081", "< c #000000000000", "1 c #28A228A228A2", "2 c #B6DAB2CAB6DA", "3 c #30C230C230C2", "4 c #596559655965", "5 c #96589A699E79", "6 c #71C671C671C6", "7 c #69A669A669A6", "8 c #618561856185", "9 c #30C228A228A2", "0 c #DF7DD34CDF7D", "q c #BEFBB2CABEFB", "w c #492449244924", "e c #104010401040", "r c #104010400820", "t c #8E3892489658", "y c #AEBAB2CAAEBA", "u c #9E7992489E79", "i c #186118611861", "p c #86178A288617", "a c #79E779E779E7", "s c #596559655144", "d c #C71BC30BC71B", "f c #F7DEFBEEFFFF", "g c #AEBAA289A699", "h c #208128A22081", "j c #E79DEBADE79D", "k c #28A230C230C2", "l c #38E338E338E3", "z c #FFFFF3CEF7DE", "x c #9E7992489658", "c c #79E771C671C6", "v c #EFBEE38DE79D", "b c #BEFBC30BC71B", "n c #A699A2899E79", "m c #C71BCB2BCF3C", "M c #492451445144", "N c #861779E78617", "B c #CF3CD34CCF3C", "V c #AEBAAAAAB6DA", "C c #A699A289AEBA", "Z c #D75CCB2BCF3C", "A c #F7DEF3CEEFBE", "S c #79E782078617", "D c #596551445144", " ", " .X ", " XoO+ ", " @#O$% &X % ", " *@#%=$- o@o$; ", " :>:o%,>&= ", " >:;-67-88=9,11 @@@#.0-= ", " @qO4w1,13er$$,7ty u&.O3 ", " &@4e,,ie<<<<<<<+ws-21<<<<<<<<<<<<<<<<<<:oo@* +8$<<<<<<<<<<<<<<<<<<<<<<>f>Xg= ", " o@@@@@2&6e<<<<<<<<<<<<<<<<<<<<<<<#.:%<% ", " @..2&-l$<<<<<<<<<<<<<<<<<<<<<<<<<X*x$6 ", " .@+;63r<<<<<<<<<<<<<<<<<<<<<<<<<<<<6>Xd6i ", " X*uck$<<<<<<<<<<<<<<<<<<<<<<<<<<<<3v#:lO ", " b>n6l$<<<<<<<<<<<<<<<<<<<<<<<<<<<<,0:%< ", " X*al$<<<<<<<<<<<<<<<<<<<<<<<<<<<<aM$<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*;$% ", " 2@26<<<<<<<<<<<<<<<<<<<<<<<<<<<<&4$<<<<<<<<<<<<<<<<<<<<<<<<<<<*uaw,<<<<<<<<<<<<<<<<<<<<<<<<<<2awl,,<<<<<<<<<<<<<<<<<<<<<<<<<<8:Ba1 ", " .XV3e$ekw$<<<<<<<<<<<<<<<<<<<<<<<<1+>b11 ", " #d1eO; 6-r<<<<<<<<<<<<<<<<<<<<<<$7X>&l1 ", " X4,tC ;>2$<<<<<<<<<<<<<<<<<<<<<=#@#&3= ", " d,+ d@7h<<<<<<<<<<<<<<<<<<$wd@zoq41 ", " 6- o@&81e$<<<<<<<<<<<<<145:@>#.Zae6 ", " d>#x=1e<<<<<<<<<<#:ZZ2,= ", " *XA*-==,i$<<<<<$l6*X@X0X#o.m..4<+ ", " X>d%784886M8-a% C.@@XX@>voZ:2ae8 ", " &#@dt;-SNux-&&6=3O2X@ --dXvZ %Oi= ", " &d@0&+%;NDi<<<11$$6o*<<3 &x=$1 ", " q@v* &g8Bd8i% ; ", " yXz.8i ", " gb@nr ", " ;a8<% ", " &7- "}; camlspotter-camlimages-e471b3c4470d/examples/liv/File.xpm0000644000000000000000000000562112405272062021413 0ustar 00000000000000/* XPM */ static char * File_xpm[] = { "48 48 20 1", " c None", ". c #514451445144", "X c #EFBEEFBEEFBE", "o c #000000000000", "O c #5144104071C6", "+ c #861710409E79", "@ c #71C610408617", "# c #514410406185", "$ c #5144000071C6", "% c #410310406185", "& c #514400006185", "* c #410310405144", "= c #410300006185", "- c #514400005144", "; c #30C210404103", ": c #30C2104030C2", "> c #30C200004103", ", c #2081000030C2", "< c #208100002081", "1 c #104000001040", " ", " ", " .......................................... ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOXOOOOXXOOOOOXOOOOOXOOOOOXOOOOXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOOOOOOXOOXOOOOOOOOOOXXXXXXXXXXXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOOOOXOOOOOOOOOOOXOOOOOOOOOOOOOOOOOXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXXXXOOOOOOOOOOXOOOOOOOOOXOOOOXXOXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOOOOOOOOOOOOOOOXOOOOOOOOOOOXOOOOXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOXOOOXOOOOOOOOOO+XOOOOXXXXXXXXXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOOOOO@XOXXXOOXXOOOOOOOOOOOXOOOOOXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOXOOOOOXOOOOOXOOOOOOOOOOOOOOOXXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOOOOOOOOOOOOOOOOOOXOOOOOXOOOXOOOOOXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXX#$%&#$%&#$XX#$XXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXXXXXXX*=X-*=*-*=*-X=*-*=XXXXXXXXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOOOOOOOOOXOOOOOOOOOOOOOOO;XXOOOXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXX:>:>X>:>:>:>XXXOOOXXXXXXXXXXXXXXXXXXXooo ", " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", " .XXXOOOXOOOOOXOOOOOOX, c #208120812081", ", c #86178A288E38", "< c #28A22CB228A2", "1 c #DF7D618538E3", "2 c #79E779E78617", "3 c #965896589658", "4 c #FFFFFBEEEFBE", "5 c #8E388A289658", "6 c #08200C300820", "7 c #F7DE49241040", "8 c #965892488E38", "9 c #8E3892489658", "0 c #492449244924", "q c #49244D344924", "w c #861782078617", "e c #8E3886178617", "r c #8E3882078617", "t c #861775D671C6", "y c #410345144924", "u c #861779E78617", " ", " ", " ", " .........................X ", " .........................X ", " .........................X ", " .o.XXOOXXO+OOXX++XO......X@..............X ", " .........................X@..............XO ", " ...X+XOXXOXOOXXOXXXOO....X#. ..XO ", " .........................X$..........X...XO ", " ...XOOXXXOXXOX+XOOXXO....X$..........X%..XO ", " .........................X$..........X%..XO ", " ...XXXX+XOOXXOX+XOXO+....XX++XO......X&..XO ", " .........................X$..........X%..XO ", " ...XXOXXXXOXXX+XXOXOX....XXOXXXOO....X&..XO ", " .........................X%..........X*..XO ", " ...XXXOOXO==X+XXXXOO+....X=XOOXXO....X&..XO ", " ............=$...........X-..........X;..XO ", " ...X+XOX=::::>X+XOXXX....XX+XOXO+....X,..X= ", " .........:::::<*.........X&..........X;..X= ", " ...XOX=::::::11XXXOX+....X=XXOXOX....X,..XO ", " ......2::::::111X>.......X%..........X,..XO ", " ...XOX+>:::11:111XX3.OX.4XXXXXOO+....X5..XO ", " .......$>:::111111X>56X..X%..........X,..XO ", " ...XXXOXX<1111111776X7X..XX+XOXXX....X5..X= ", " ........5X1177777777X..XXOXXOX+....X#..XO ", " ..........$>X777777777X..X-..........X#..XO ", " ...XXOOX+X+X#$%t%XXXX c #EFBEEFBECF3C", ", c #5144451430C2", "< c #9E7975D65144", "1 c #9E798A288E38", "2 c #30C230C230C2", "3 c #514455555144", "4 c #CF3CCF3CBEFB", "5 c #8E3865955144", "6 c #6185451430C2", "7 c #AEBA9A696185", "8 c #71C6659571C6", "9 c #CF3CBAEAAEBA", "0 c #514445144103", "q c #618565956185", "w c #9E798A289E79", "e c #9E7965955144", "r c #AEBABAEAAEBA", "t c #514455554103", "y c #EFBEDF7DDF7D", "u c #AEBAAAAA9E79", "i c #000000000000", "p c #410330C22081", "a c #71C675D671C6", "s c #410320812081", "d c #208120812081", "f c #104010400000", "g c #104010401040", "h c #104010402081", "j c #208110401040", "k c #8E3845144103", "l c #4103451430C2", "z c #9E79659571C6", "x c #30C220811040", "c c #30C210401040", "v c #71C6451430C2", "b c #410345144103", "n c #9E799A698E38", "m c #8E388A288E38", "M c #DF7DBAEABEFB", "N c #30C230C21040", "B c #104000001040", " .XoO+ ", " @#X.$%&O ", " .Xo$O*%O=- ", " @oX.$%*%%$%; ", " .Xo$.*%*%%%$$: ", " @#X.$%*=*%%O$.$: ", " >#$&,=$O*%<=*%%OOO$$: ", " >=1o>.23*=&=*O%O$O$OO: ", " 4Xo$.>5655**%O%OOO%7O: ", " @#X.$%*=$:&<<%%%%%%%*%O: ", " .Xo$O*%555.:<*%*%*%***%*%;8 ", " @oX.$%*=&=5<9:*%*%*******%70q ", " .Xo$.*%55555=*9:*<*<*<******O50 ", " @#X9$%*=&5&5&<=<4:<<<<<<****7O$12w ", " .Xo9O*%55---5555=<9:e<=<*<****%OO$-& ", " roX9$%*=&&t&t5&5&5<54:#$*<5&----5&5&5555o:e,iis>0t-t-t-t&-&&5&5>:%<<<***%*6f0d#606-6-t----555,#i#<*<***5-ps6: ", "y,g&h>0,000t-t&-&&55:i0f5j#,0606-t--5&55e,#:=<<5-:s6-55*s ", ">,j&j>0,0,0t-t&&5&5<<#:<5,s20t5&***: ", ">6j=j#;;,6606--5&55e5o:0::,-&k<****s ", "y,h=j>;l;,0,0t--5&5&&4::;t-&<<*<*<*: ", ">0dzj#;;;;,6606----0:9d6--,h1j9-,;l;,0,0t&2:d24:te<=<<<<<***: ", ">6x1dO<;,;;;,6,;xcp669:e5eee0:O:5%;;;p;xhp;60&55.:e5e,:us2O,;2:dsl0t5&5&5$:5e<=<5,iidbbbqqm ", ">6s+xs50j:p;,6-k-k-55O:e5e-0iidbbbqqqmm ", "y,:@sdhds2;,----&&5&5$:<52iidbbbqqqmm ", ">0x.;;p;;;6------5&55%:6iidbbbqqqmm ", ">,:40,;l0t0t-t--&&5&&7iidbbbqqqmm ", ">6dM60606-6-6-----6sNkibbbqqqmm ", "y,h40,0,000t---t0:ii2i2bqqqmm ", ">0j466,06-6---6siidbbbqqqmm ", ">,g#;,060t-60:iidbbbqqqmm ", ">6f#,66-606siidbbbqqqmm ", "y,B>000,0:iidbbbqqqmm ", "+0i#6-,siidbbbqqqmm ", ";diu;:iidbbbqqqmm ", " ;;iiidbbbqqqmm ", " qbbbqbqqqqmm ", " qqqmqmmm "}; camlspotter-camlimages-e471b3c4470d/examples/liv/FolderLink.xpm0000644000000000000000000000660712405272062022572 0ustar 00000000000000/* XPM */ static char * FolderLink_xpm[] = { "40 47 64 1", " c None", ". c #BEFBAAAAAEBA", "X c #EFBEDB6C9E79", "o c #FFFFCB2BAEBA", "O c #BEFB9A698E38", "+ c #AEBA9A699E79", "@ c #BEFBBAEAAEBA", "# c #DF7DDB6CCF3C", "$ c #BEFBAAAA8E38", "% c #AEBA8A2871C6", "& c #71C661855144", "* c #AEBA8A286185", "= c #8E3861856185", "- c #71C641034103", "; c #514430C230C2", ": c #30C220812081", "> c #EFBEEBADCF3C", ", c #5144410330C2", "< c #9E7971C65144", "1 c #9E798A288E38", "2 c #30C230C230C2", "3 c #514451445144", "4 c #CF3CCB2BBEFB", "5 c #8E3861855144", "6 c #6185410330C2", "7 c #AEBA9A696185", "8 c #71C6618571C6", "9 c #CF3CBAEAAEBA", "0 c #514441034103", "q c #618561856185", "w c #96588A289658", "e c #9E7961855144", "r c #AEBABAEAAEBA", "t c #514451444103", "y c #CF3C82075144", "u c #208120812081", "i c #000000000000", "p c #EFBEDB6CDF7D", "a c #AEBAAAAA9E79", "s c #28A228A228A2", "d c #DF7D618538E3", "f c #410330C22081", "g c #69A66DB669A6", "h c #410320812081", "j c #104010400000", "k c #104010401040", "l c #104010402081", "z c #082008200820", "x c #208110401040", "c c #F7DE49241040", "v c #4103410330C2", "b c #9E79618571C6", "n c #618559655144", "m c #30C220811040", "M c #30C210401040", "N c #71C6410330C2", "B c #410341034103", "V c #9E799A698E38", "C c #8E388A288E38", "Z c #492449244924", "A c #8E3841034103", "S c #DF7DBAEABEFB", "D c #30C230C21040", "F c #104000001040", " .XoO+ ", " @#X.$%&O ", " .Xo$O*%O=- ", " @oX.$%*%%$%; ", " .Xo$.*%*%%%$$: ", " @#X.$%*=*%%O$.$: ", " >#$&,=$O*%<=*%%OOO$$: ", " >=1o>.23*=&=*O%O$O$OO: ", " 4Xo$.>5655**%O%OOO%7O: ", " @#X.$%*=$:&<<%%%%%%%*%O: ", " .Xo$O*%555.:<*%*%*%***%*%;8 ", " @oX.$%*=&=5<9:*%*%*******%70q ", " .Xo$.*%55555=*9:*<*<*<******O50 ", " @#X9$%*=&5&5&<=<4:<<<<<<****7O$12w ", " .Xo9O*%55---5555=<9:e<=<*<****%OO$-& ", " roX9$%*=&&t&t5&5&5<54:#$*<5&----5&5&yyyui:e,iih>0t-t-t-tyyyyyydddi<<<***%*6j0u#606-6-t-uyyyddydddii<***5-fh6: ", "p,k&l>0,000t-t&uyyyddddddiuwz-;20&5u ", ">0j5x#,0606-t--isdddddddcczici6-55*h ", ">,x&x>0,0,0t-t&&sidddcccccccci5&***: ", ">6x=x#;;,6606--5&uiddcccccccci<****h ", "p,l=x>;v;,0,0t--5&uiccccccccci*<*<*: ", ">0ubx#;;;;,6606----siccccccccz,l1x9-,;v;,0,0t&2:ngiccccccci<<***: ", ">6m1uO<;,;;;,6,;mMf6iiccccccci<***NhBq ", "p,:V:*%,;v;,;2:u2,06icccccccci*<50iuBqq ", ">0:O:5%;;;f;mlf;60&5ziiiiiiiiz50iiuBBqCC", ">,:ah2O,;2:uhv0t5&5&5$:5e6h+mh50x:f;,6-A-A-55O:e5e-0iiuBBBqqqCC ", "p,:@huluh2;,----&&5&5$:<52iiuBBBqqqCC ", ">0m.;;f;;;6------5&55%:6iiuBBBqqqCC ", ">,:40,;v0t0t-t--&&5&&7iiuBBBqqqCC ", ">6uS60606-6-6-----6hDAiBBBqqqCC ", "p,l40,0,000t---t0:ii2i2BqqqCC ", ">0x466,06-6---6hiiuBBBqqqCC ", ">,k#;,060t-60:iiuBBBqqqCC ", ">6j#,66-606hiiuBBBqqqCC ", "p,F>000,0:iiuBBBqqqCC ", "+0i#6-,hiiuBBBqqqCC ", ";uia;:iiuBBBqqqCC ", " ;;iiiuBBBqqqCC ", " qBBBqBqqqqCC ", " qqqCqCCC "}; camlspotter-camlimages-e471b3c4470d/examples/liv/Monalisa.xpm0000644000000000000000000002123012405272062022271 0ustar 00000000000000/* XPM */ static char *Monalisa[] = { /* width height num_colors chars_per_pixel */ " 48 48 27 1", /* colors */ ". c #000000", "# c #281808", "a c #38240c", "b c #492c10", "c c #553414", "d c #593818", "e c #5a5a5a", "f c #65411c", "g c #794d24", "h c #7d5124", "i c #86592c", "j c #966534", "k c #9a6938", "l c #aa7545", "m c #ae7949", "n c #b68251", "o c #be8a59", "p c #c79665", "q c #cf9e6d", "r c #d3a275", "s c #d7aa7d", "t c #dfb28a", "u c #e3ba92", "v c #ebc7a6", "w c #ebcbae", "x c #ffffff", "y c None", /* pixels */ "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "e..............................................x", "e.oppqnnoononoonnoonpppooqpooonopppqppoonnpoopox", "e.oloonpnoonpooooopnpolljjllnpnqoopooopnnnnpoopx", "e.looooopnoonpoppoplifbbbbccdgloppppoqpoooopoqqx", "e.ooopqppqpoopopppibbdcababbddcdloppqoolpnppppqx", "e.pporpppppqppqoogbcdgabbbbbaccdckppqqpoopoqrrrx", "e.rpqqqooppoprrrgbccgdbcbbaababccbjppqqppopoqrrx", "e.pqppqsqpppqrrkbbdilkigcbabbabbdcclpqpqopppqqqx", "e.oqqqppqpqqrtpcgnrstrrnmifbbbbccccdnpqrqqqoqqqx", "e.qpqpqpqpqstrjdnruwwwusrnigcbabccdchrrsrqrqqprx", "e.oqqpqqpqrttoajrvwwwwwwrrlhdbbaacdcborqrrrrqrrx", "e.qqqrrtrstwtfdntwvvwvwwuqmjgcbbbacbbirqpqrrrrsx", "e.qrrrrrrrtvofdntwvwwvwutpmkidcbaaababpnopppprrx", "e.srprrrprspidhouwwvvwvtsrpnkjfbbaaaabjknnmnpprx", "e.rrsrrssssoddiruvvvvwvwttrrokgccbbabagjkkkmpnpx", "e.stwrwrwrvkddipuuvvvvtssrrpnkfdcbbaaafiijkllmnx", "e.lnrsrwrvpjddfppoqutslllmmkjifcddbbbbffhiklknmx", "e.kjjrsrwrmfddffkkjpslfilifdbhgcccbbbbcfgghjkkkx", "e.ijjrwrrrofdddblafmtiimmahfklhbccbabacfffgjjjhx", "e.hjjppklonddakoonlrtilrrnkornicccbbaacgfggfihfx", "e.fhfkiidjkdbakttrsrtmosstttrmhddddcbcbdffhkfghx", "e.dffafhfffhaairuutusqmwuwurplhdfddcdccggggghffx", "e.dddddfdddaddhruututnrswutrlkfcdfdfdcchjjkkmmkx", "e.daffdadaddaadrstrutomustsokffddddcdccddfhihjkx", "e.fgddddabadddalrsotpiktutpmkidcddfddcdddddghfgx", "e.fcddddbabbdbainrsnfairspnkigdcdfccdcccdddddfdx", "e.ddddbbddbbbadfmlsrkmmmmomkjgddfdfgdccdfffffffx", "e.ddcdadbbabddahlnlnmiiioonlffdbfdccddddfffffffx", "e.cdbbdbdcbcdbdakorrmmkmopniifdcddddcddddffgfgfx", "e.cddcbdddcabddadkrqmlmmnlkfhdbccccddcccdfdfgfgx", "e.dgffffhhcfadbddalsvtonkjffddcdccddcdccdggfgggx", "e.dcdddffgdadddbadaoqomkffffdbbbcbdddcbccfffgfgx", "e.cdddgilkfbcdbdaaaaiffffdfdbddbccddccbbcffdfgfx", "e.fhggghkkhddbdbaaaaadfafddbfbddccccbcbbcfddfgdx", "e.hkhmllkkidabdbbaaaafdfadbddffdcbabbbbabdffdfgx", "e.imlllhliifddbbb#baakjffddfhhhfcbdbbbbbbfdfiffx", "e.hljhllhjhfbdbbaaadafmlkihhhiihdbbbbabbbdfgghgx", "e.dhlggiiigdccdbaa#abgmlmkkjkklkhdbdbbdaabbccccx", "e.hbadfdcbcbaabaaabdfimnnmllmnmkiddbdddbbbabddcx", "e.gbbabbbabbbcbbbbbinrppoonppppojfdffddcbbabcbcx", "e.dba#abcbabcbcbdhknrtrtrrrrrrroliffidccccbdcghx", "e.fbab#acbbcbbccinsrtttssttwssrpkfigifcbbcbbbcfx", "e.daacbbdcbbbbdborpwttwwttwswsrpmigfgdbbdbbbbcdx", "e.dcccbcddcbddfirtuwwwswswswrwprlfigfdcddccbacdx", "e.fdcdcddbbcddgmrswwwuwtswwtwsrpjiiffccbcfddcbcx", "e.fdfhccbbbbfhiowwswwwtwutwttwrpjfiggbcdhgdfcbbx", "exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }; SIMPLE = T BITPIX = 8 NAXIS = 2 NAXIS1 = 48 NAXIS2 = 48 HISTORY Written by XV 3.10 COMMENT the GIMP was here END ZZG>GY::1111GYaѲѻѻѫ nGaUU1:>YU>G:11ZG>:>:>>11:>>UѻѻѲnaaGG::1:G>>:1:Z>:::1:>>:1>>Ga ѲѲѲѫџGaUG>:>>::1':>Z>'':11>:1111>1ѻѻѲѲaUGU>11>1111:> ZG1'1':11:11::aѲrGaUaG:11:111:GZ>1''1:1'1:1:1>Yr aGGa>::::1>:UYZU11'111'111:11111anG>GG>>:11'1:1:ZY1'>G>:1:1''1' ''1>Gara>>1>>>111'1>>:Z>YUUaaaU>::>1'''1UrrnrrrY>1>11>''11:::: ZYnYYnYG1>11'''>'GraYYYaaY>1111'111>GUUYUZaYaaG>>1111''rnGG>>GYYYG :1>111111G>GaGGZYrYrra>'1>11''''G>G'>1>>GG>:1'1111'1>GG>GUZGYUUUYrrY>>1>1 '''''>G'G>>1G1>>::::1:11:G>>GU>Z:>>>UarG1:>1>''''aGGGG>G>1>>1::>>::11:GG>GUG Z>:>>>GGU>'>>>1'>'rGGGG>111:1>>>:1::GGGUGUZ>UGGGGYY:G'>1>>'λrnGG>>:> ::>>:>::>UUGUUUZ:>>:1>>>:'1>>'>rrGY>1::::>>:::>G>GUGUZ:>11>1>:1:>1>' rraaG>:>>>>:>>>>GGUGUGZ>>:>'>11'1>>'YaaaGG>1G>::>>>>GGGGGGGZ>>>>11>>111'>GrrnU>>G>GU>::>GGGGGGGZG:>>>>1'11>1'aG'araU>:>G::>:::>>>>>G>ZGU>>>>'1'>>>'arra>:>>G>>:>>>>>UYGUZ>'GG>'>'>>''>rGG>>>>:>::>>GYaYnrZ>>>>>G>>>'>>YrG:>G>G>::YnnrrrZ>GG'GYGGGY''aY>G>>:>::UUUUUYGGZGYGraa>nr>1'rY>>>>:1:1>GGYrGUYZYnnr>>'rara:::11'':UGUUGaYGZannѫG>>>1'Gaa'YGrY1::1'1':GGGUnnnYZrnnѫG>>GGrrnGaaG>1YU:::1111:GUUYnrrrZѫΟn>>GrnaG:>>1111GGYarrZѫѫѫr>>aλrG>:11'''GaanrZ>>aѻrU::11'1'UnrrrZa>YλrnG11''''1nrZΔG>ra>:1'''1'1ZѻG>nU:111':11aZ'nѫY>11'':>:1Zn>aU:1'1::>:YZ:UaG1111::::>Zr11>araU:1'11'11>::ZU1::U>1:11''1'1::1nZU1:>U'11111'::>:rZa11>:'1'11>>:>ZaG1111::>UZnnZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ camlspotter-camlimages-e471b3c4470d/examples/liv/OMakefile0000644000000000000000000000237112405272062021564 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) OCAMLPACKS[] = lablgtk2 unix MODULES[] = cache deficon display edge enhance gui icon iconcap jWidget jpf liv livmisc # livsh livshtype mylazy pathfind scandir seq tout viewer BuildExample(liv, $(MODULES), all_formats lablgtk2) camlspotter-camlimages-e471b3c4470d/examples/liv/README0000644000000000000000000000177712405272062020676 0ustar 00000000000000This is an LablGtk2 application. You need to install the library with lablgtk2 support. LV -- Labl image Viewer This is camlimages+lablgtk2 image viewer, like `xv', but much limited. It works just with True or Direct colormodels. No PseudoColor support. And more, it is UNDER CONSTRUCTION. Usage: lv imagefiles Options: -random Images are displayed randomly. Use with -wait. -wait sec Automatically display next image after waiting [sec] seconds. Useful for image slideshow. -root [center|random] Display images on root. [center] puts the images in the center of the screen. [random] puts them at random position. -transition [myst|transparent] Use with -root. You can see some funny transition animations. -size [w]x[h] Set the maximum size of images upto [w]x[h]. LV shell (like Visual schnauzer of xv) Copy iconcap and the xpm files in this directory in $HOME/.lv and type 'v' key in the image window of lv... You will have something fancy, but still under development. camlspotter-camlimages-e471b3c4470d/examples/liv/cache.ml0000644000000000000000000000465612405272062021412 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: cache.ml,v 1.5 2008/06/16 22:35:42 furuse Exp $ *) type ('a, 'b) elt = { key : 'a; data : 'b; at_remove : 'b -> unit; time : float; };; type ('a, 'b) t = ('a, 'b) elt option array;; let create size = Array.make size None;; let find_pos t key = let found = ref 0 in try for i = 0 to (Array.length t - 1) do match t.(i) with | None -> () | Some {key = key'} when key = key' -> found := i; raise Exit | _ -> () done; raise Not_found with | Exit -> !found;; let find t key = match t.(find_pos t key) with | Some elt -> elt.data | _ -> assert false;; let rename t key newkey = try let pos = find_pos t key in let data = match t.(pos) with Some d -> d | _ -> assert false in t.(pos) <- Some {data with key = newkey} with | Not_found -> ();; let find_empty_or_eldest t = let found = ref None in begin try for i = 0 to (Array.length t - 1) do match t.(i) with | None -> found := Some (i, None); raise Exit | Some elt -> match !found with | None -> found := Some (i, Some elt) | Some (_j, Some elt') when elt.time < elt'.time -> found := Some (i, Some elt) | _ -> () done with Exit -> () end; match !found with | Some (i, _) -> i | None -> raise Not_found;; let add t key data at_remove = let slot = try find_pos t key with Not_found -> try find_empty_or_eldest t with Not_found -> 0 in begin match t.(slot) with | Some elt -> elt.at_remove elt.data | None -> () end; t.(slot) <- Some {key = key; data = data; at_remove= at_remove; time = Unix.time ()};; camlspotter-camlimages-e471b3c4470d/examples/liv/cache.mli0000644000000000000000000000236512405272062021556 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: cache.mli,v 1.4 2008/06/16 22:35:42 furuse Exp $ *) type ('a, 'b) elt = { key : 'a; data : 'b; at_remove: 'b -> unit; time : float; };; type ('a, 'b) t = ('a, 'b) elt option array;; val create : int -> ('a, 'b) t;; val find_pos : ('a, 'b) t -> 'a -> int;; val find : ('a, 'b) t -> 'a -> 'b;; val rename : ('a, 'b) t -> 'a -> 'a -> unit;; val find_empty_or_eldest : ('a, 'b) t -> int;; val add : ('a, 'b) t -> 'a -> 'b -> ('b -> unit) -> unit;; camlspotter-camlimages-e471b3c4470d/examples/liv/deficon.ml0000644000000000000000000000702712405272062021751 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: deficon.ml,v 1.2 2004/09/21 18:15:43 weis Exp $ *) let data = [| "48 48 5 1"; " c None"; ". c #514451445144"; "X c #EFBEEFBEEFBE"; "o c #000000000000"; "O c #9E79A2899E79"; " "; " "; " .......................................... "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXX.oXo...XX.XXXOooooo.XXXX..X....XXXXXXooo "; " .XXXXXXXXXXXXXXOoo.OO.oooOXXXXXXXXXXXXXXXooo "; " .XXX....o..XXXOo.XXXXXOoooOXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXX.oXXXXXXX.oooXXXXXXXXXXXXXXooo "; " .XXX.....X..XXoo.XX..XXOooo.XX..o......XXooo "; " .XXXXXXXXXXXXXoooXXXXXXXooooXXXXXXXXXXXXXooo "; " .XXXXXX..o..XXoooXX...XXooooXX..XX.XXXXXXooo "; " .XXXXXXXXXXXXX.o.XXXXXXXooooXXXXXXXXXXXXXooo "; " .XXX.o..o...oXXXXXX.X.XXooo.XX..X....XXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXOoooXXXXXXXXXXXXXXooo "; " .XXX..X...X......o...XX.oo.XXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXoooXXXXXXXXXXXXXXXooo "; " .XXXo......X.XXX..XXXXOooOXX...X.....XXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXoo.XXXXXXXXXXXXXXXXooo "; " .XXXo.X...o.Xo.....XXOooXX........XXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXooOXXXXXXXXXXXXXXXXXooo "; " .XXX...o..........XXXooXX.o..X..oX..o..XXooo "; " .XXXXXXXXXXXXXXXXXXXOoOXXXXXXXXXXXXXXXXXXooo "; " .XXX...o......XX..XXooXXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXoOXXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXX..X..o..XXoXXX..o.XXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXX..o....o..X..XXXXXXX..o....XX...XXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXXoo..X......oXXOoooOXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXoooooXXXXXXXXXXXXXXXXXXooo "; " .XXX...X.o...X..XXoooooXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXoooooXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXX..o.X.XXOoooOXX...X.o.....XXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXXoX..o...o....XXXXXXX..X...X...o...XXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo "; " .ooooooooooooooooooooooooooooooooooooooooooo "; " ooooooooooooooooooooooooooooooooooooooooooo "; " oooooooooooooooooooooooooooooooooooooooooo "; " "; " "; |];; camlspotter-camlimages-e471b3c4470d/examples/liv/display.ml0000644000000000000000000002302312405272062022001 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: display.ml,v 1.36.2.1 2010/05/13 13:36:09 furuse Exp $ *) open Livmisc;; open Gui;; open Tout;; open Gdk;; type filter = [ `SIZE of int * int * [ `ATMOST | `ATLEAST | `NOASPECT ] ];; let current_filters = (ref [] : filter list ref);; let add_size w h = List.fold_right (fun x st -> match x with | `SIZE _ -> st (* | _ -> x :: st *)) !current_filters [`SIZE (w,h,`NOASPECT)];; let forward_redisplay = ref (fun _ -> ());; module WINDOW = struct let prev = ref (-1,-1) let pixmap = ref None let set_pixmap pix = begin match !pixmap with | None -> () | Some pix -> Gdk.Pixmap.destroy pix end; pixmap := Some pix let display pixbuf = let width = GdkPixbuf.get_width pixbuf in let height = GdkPixbuf.get_height pixbuf in let pixmap = Gdk.Pixmap.create ~window:window#misc#window ~width ~height () in GdkPixbuf.render_to_drawable pixmap pixbuf; prev := (width, height); prog#set_format_string "done"; sync (); prog#unmap (); (* Resizing window *) (* Changes from gtk1.2 to 2.0: It is no longer permissable to draw directly on an arbitrary widget, or to set an arbitrary widget's background pixmap. If you need to do that, use a GtkDrawingArea or (for a toplevel) a GtkWindow where gtk_widget_set_app_paintable() has been called. *) (* Format.eprintf "resizing %d %d@." ximage#width ximage#height; *) drawing#resize ~width ~height; Gdk.Window.set_back_pixmap drawing#misc#window (`PIXMAP pixmap); set_pixmap pixmap; Gdk.Window.clear drawing#misc#window; set_pixmap pixmap; sync (); set_timeout () let init () = ignore (drawing#event#connect#configure ~callback: (fun ev -> let w = GdkEvent.Configure.width ev and h = GdkEvent.Configure.height ev in let rec f w h = if (w, h) <> !prev then begin !forward_redisplay (add_size w h); end; let w', h' = Drawable.get_size drawing#misc#window in if (w', h') <> (w, h) then f w' h' in f w h; false)) end module ROOT = struct type root_geom = { width : int; height : int; xdest : int; xsrc : int; ydest : int; ysrc : int; put_width : int; put_height : int; };; let root_geom width height x y = let width0 = width in let height0 = height in let xdest0 = if x < 0 then 0 else x in let xsrc0 = if x < 0 then -x else 0 in let put_width0 = if x + width0 > screen_width then screen_width - xdest0 else x + width0 - xdest0 in let ydest0 = if y < 0 then 0 else y in let ysrc0 = if y < 0 then -y else 0 in let put_height0 = if y + height0 > screen_height then screen_height - ydest0 else y + height0 - ydest0 in { width= width0; height= height0; xdest= xdest0; ydest= ydest0; xsrc= xsrc0; ysrc= ysrc0; put_width= put_width0; put_height= put_height0; } let root_pixmap = lazy ( let pix = GDraw.pixmap ~window ~width: screen_width ~height: screen_height () in pix#set_foreground `BLACK; pix#rectangle ~x:0 ~y:0 ~width: screen_width ~height: screen_height ~filled: true (); pix#pixmap ) let display_at pixbuf x y = let geom = root_geom (GdkPixbuf.get_width pixbuf) (GdkPixbuf.get_height pixbuf) x y in GdkPixbuf.render_to_drawable !!root_pixmap ~dest_x: geom.xdest ~dest_y: geom.ydest pixbuf; Window.set_back_pixmap root_win (`PIXMAP(!!root_pixmap)); Window.clear root_win; set_timeout () end;; let working = ref (None : (int * OImages.rgb24 * filter list) option);; let waiting = ref None;; let check_waiting () = if !waiting <> None then raise Exit;; type root_mode = [ `NONE | `CENTER | `RANDOM ];; type transition = [ `NONE | `MYST | `TRANSPARENT ];; let root_mode = ref (`NONE : root_mode);; let transition = ref (`NONE : transition);; let root_prev_pos = ref None;; let display_pixbuf pixbuf = match !root_mode with | `CENTER | `RANDOM -> let width = GdkPixbuf.get_width pixbuf and height = GdkPixbuf.get_height pixbuf in let x, y = let w = screen_width - width and h = screen_height - height in match !root_mode with | `RANDOM -> let w = screen_width - width and h = screen_height - height in let overwrap x y = match !root_prev_pos with | None -> 0 | Some (pw, ph, px, py) -> let w = min (x + w - 1) (px + pw - 1) - max x px in let h = min (y + h - 1) (py + ph - 1) - max y py in if w < 0 || h < 0 then 0 else w * h in let random_x_y () = let x = if w <= 0 then w / 2 else Random.int w and y = if h <= 0 then h / 2 else Random.int h in (x, y), overwrap x y in let min = ref (random_x_y ()) in for _i = 0 to 5 do let (x, y), over = random_x_y () in if snd !min > over then min := (x, y), over done; let x, y = fst !min in root_prev_pos := Some (w, h, x, y); x, y | _ -> w/2, h/2 in ROOT.display_at pixbuf x y | _ -> WINDOW.display pixbuf;; let sort_filters (filters : filter list) = let rec get_size = function | [] -> [] | `SIZE x :: _ -> [`SIZE x] | _ :: xs -> get_size xs in (* let rec get_normalize = function | [] -> [] | `NORMALIZE :: _ -> [`NORMALIZE] | _ :: xs -> get_normalize xs in let rec get_enhance = function | [] -> [] | `ENHANCE :: _ -> [`ENHANCE] | _ :: xs -> get_enhance xs in *) List.flatten [(*get_enhance filters; get_normalize filters; *)get_size filters];; let resize w h cond old = let old_width = GdkPixbuf.get_width old in let old_height = GdkPixbuf.get_height old in let xmag,ymag = let xmag = float w /. float old_width and ymag = float h /. float old_height in let xmag,ymag = match cond with | `ATMOST -> let mag = if xmag > ymag then ymag else xmag in if mag > 1.0 then 1.0, 1.0 else mag, mag | `ATLEAST -> let mag = if xmag > ymag then xmag else ymag in if mag < 1.0 then 1.0, 1.0 else mag, mag | `NOASPECT -> xmag, ymag in let nw = truncate (float old_width *. xmag) and nh = truncate (float old_height *. ymag) in if nw > fst root_size || nh > snd root_size then let xmag = float (fst root_size) /. float old_width and ymag = float (snd root_size) /. float old_height in match cond with | `NOASPECT -> xmag, ymag | _ -> if xmag > ymag then ymag, ymag else xmag, xmag else xmag, ymag in if xmag = 1.0 && ymag = 1.0 then old else let nw = truncate (float old_width *. xmag) and nh = truncate (float old_height *. ymag) in prog#map (); let fmts = if xmag > 1.0 && ymag > 1.0 then Printf.sprintf "enlarging to %dx%d" nw nh else if xmag < 1.0 && ymag < 1.0 then Printf.sprintf "reducing to %dx%d" nw nh else Printf.sprintf "resizing to %dx%d" nw nh in prog#set_format_string fmts; if nw <> old_width || nh <> old_height then begin (* original pixbuf will be GC'ed automatically *) let pixbuf' = GdkPixbuf.create ~width: nw ~height: nh () in GdkPixbuf.scale ~dest: pixbuf' ~dest_x: 0 ~dest_y: 0 ~width: nw ~height: nh ~ofs_x: 0. ~ofs_y: 0. ~scale_x: (float nw /. float old_width) ~scale_y: (float nh /. float old_height) ~interp: `HYPER old; pixbuf' end else old let create_pixbuf (_id : int) image filters = let pixbuf = Imagegdk.to_pixbuf image in let filters = sort_filters filters in let filter_pixbuf pixbuf = function | [] -> pixbuf | `SIZE (w, h, cond) :: _fs -> (* original pixbuf will be GC'ed automatically *) resize w h cond pixbuf in filter_pixbuf pixbuf filters ;; let current = ref None;; let rec display id image filters = let start_waiting () = match !waiting with | Some (id, image, filters) -> prerr_endline "aborted!"; waiting := None; display id image filters | None -> () in if !working <> None then begin (* we store it at waiting *) (* hoping working process may find it and move to it *) prerr_endline "try to abort"; waiting := Some (id, image, filters); end else begin try working := Some (id, image, filters); (* XIMAGE let ximage = ximage_of_image id image filters in *) let pixbuf = create_pixbuf id image#coerce filters in current := Some (id, image); current_filters := filters; display_pixbuf pixbuf; working := None; start_waiting () with | Exit -> (* abort! *) working := None; start_waiting () end;; let redisplay new_filters = match !current with | Some (id, image) -> display id image new_filters | None -> ();; forward_redisplay := redisplay;; camlspotter-camlimages-e471b3c4470d/examples/liv/edge.ml0000644000000000000000000000423612405272062021245 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: edge.ml,v 1.12 2006/01/13 14:18:16 rousse Exp $ *) open Images;; open OImages;; let edge (bmp : index8) = let width = bmp#width in let height = bmp#height in let rgb24 = new rgb24 width height in let cmap = bmp#colormap.map in let cc x y = let center = cmap.(bmp#get x y) in let points = Array.init 3 (fun dx -> Array.init 3 (fun dy -> try cmap.(bmp#get (x + dx - 1) (y + dy - 1)) with | Out_of_image -> center)) in let r = ref 0 and g = ref 0 and b = ref 0 in let diff = ref 0 in let add dx dy w = let rgb = points.(dx + 1).(dy + 1) in r := !r + rgb.r * w; g := !g + rgb.g * w; b := !b + rgb.b * w; let dr = center.r - rgb.r and dg = center.g - rgb.g and db = center.b - rgb.b in diff := !diff + truncate (sqrt (float (dr * dr + dg * dg + db * db))) in add (-1) 0 1; add 1 0 1; add 0 (-1) 1; add 0 1 1; add (-1) (-1) 1; add 1 (-1) 1; add (-1) 1 1; add 1 1 1; let cw = (* diff = 0 ----- 3 diff = 3528 ----- 10 *) !diff / 300 + 3 in add 0 0 cw; let sw = cw + 8 in {r = !r / sw; g = !g / sw; b = !b / sw} in for x = 0 to width -1 do for y = 0 to height -1 do rgb24#unsafe_set x y (cc x y) done done; rgb24;; camlspotter-camlimages-e471b3c4470d/examples/liv/enhance.ml0000644000000000000000000000543712405272062021746 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: enhance.ml,v 1.5 2004/09/24 10:55:06 weis Exp $ *) open Images;; open Colorhist;; let make_id_rgb rgb = rgb;; let enhance keep t = let total = total_samples t in if total = 0 then raise (Failure "histgram is empty"); let cut_samples = truncate ((float total) *. (1.0 -. keep) /. 2.0) in let rec find_limit update sum b = let sum = sum + t.(b) in if sum > cut_samples then b else find_limit update sum (update b) in let min = find_limit ((+) 1) 0 0 and max = find_limit ((+) (-1)) 0 255 in if max <= min then 1.0, make_id_rgb else begin let average = let samples = ref 0 in let sum = ref 0 in for i = min to max do sum := !sum + t.(i) * (i - min); samples := !samples + t.(i) done; float !sum /. float !samples /. (float (max - min)) in let logmax = 1.0 /. 0.5 in let logmin = 1.0 /. 2.0 in (* average will go near 0.65 *) let log = log 0.65 /. log average in let log = if logmax < log then logmax else if logmin > log then logmin else log in prerr_endline (Printf.sprintf "average=%f gamma=%f min=%d max=%d" (average *. 255.0) (1.0 /. log) min max); let div = 2 in let make_elem x = if x < min then x / div else if x > max then 255 - (255 - x) / div else let x' = if x - min < (max - min) / 2 then x / div else 255 - (255 - x) / div in let pow = float (abs (x - min - (max - min) / 2)) /. float ((max - min) / 2) in let pow = pow *. pow in let len = float (max - min) in let newlen = float (255 - min / div - (255 - max) / div) in let x'' = truncate (((float (x - min) /. len) ** log) *. newlen) + min / div in int_of_float (float x' *. pow +. float x'' *. (1.0 -. pow) ) in let table = Array.init 256 make_elem in let make_table_rgb rgb = { r = table.(rgb.r); g = table.(rgb.g); b = table.(rgb.b); } in log, make_table_rgb end;; camlspotter-camlimages-e471b3c4470d/examples/liv/faceanm.gif0000644000000000000000000000377212405272062022074 0ustar 00000000000000GIF89a$$*&ZVF||v¢ª::0ƪqooήª FFFgZSҲ¶Ʀ...ֶҶҦ~vںRJ> ªnfUNB:rԖ~nbbaB>:B60޾vbvj\jjjz~~ή*"22.VNF޾&r^R^VJxvvv~zʶZJFfffJJJ:6.zk{ƺfbZʮWVNƮzƦԾFBB"" .*ZRBjbbZNIֲڶvn^bZMJFDFB4z>::ZZY²jbSRRPrfTʫ663zj~raʺVB>̾.*%~"Ʋ &&&XN@¶ھ&"rf\~nZRG²^^VڸҺF>2:66ʪNNNhfbҲֶҮtbV2222.'rjVVVVNF>޾®ƲRNNzj^ڶֺZVTʲºr>>=F>8znZnbW6.(JB6 ,**κ>:2º::6t62*VRRVNJꦒ~njj*&"zob|vjnjfnVJ;ζ>6.²ή! NETSCAPE2.0!,$$H*\ȰÇ#JHELłh:Bn"@3feĬRG*@<pmTC2 @` TObO%maF ȹܨl| @Eb= Qk1w!tb#d.( uwV#V\mlL% R$N!"DzD6BÆ׺7`\y {PE Ȫ[dQs )'dwsBL'FdE`{/Td *:,L t0׌.`缡 PVcI(c҉gcLr (`L(!*`J.&(R~@%U ϙRmeQC l' Ɉ"Cy!Krd'"۰0d',iP!-"XyP1@hBF# U$!,  B Hna1 ^BnP1Jā򼠐=1@`qI䡚!,  U H?-&0ڣCҾT0 yޔk \.R"@i]IhJF !, AG =~ P͘S @bAqa&b _ZAC:',9!, ?P!`W@u9(Q*HA1ŋPQ v9qC'Fm!,  ?1TߨJV ;camlspotter-camlimages-e471b3c4470d/examples/liv/gui.ml0000644000000000000000000001051712405272062021124 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: gui.ml,v 1.27 2008/02/19 12:44:04 furuse Exp $ *) open Gdk;; open GDraw;; open GMain;; GMain.Main.init ();; let active = ref true;; let sync () = while Glib.Main.iteration false do () done;; (* let window = GWindow.window ~title: "liv" ~allow_shrink: true ~allow_grow: true ();; *) let window = GWindow.window ~title: "liv" ();; (* We should not set allow_shrink and allow_grow here. *) window#connect#destroy ~callback:Main.quit;; window#misc#set_size_request ~width: 1 ~height: 1 ();; window#resize ~width: 1 ~height: 1;; window#misc#set_app_paintable true;; let drawing = window let fixed = GPack.fixed ~packing: window#add ~show: true ();; (* let drawing = GMisc.drawing_area ~width:150 ~height:150 ~packing: window#add ~show:true ();; *) (* let fixed = GPack.fixed ~packing: box#add ();; *) (* window#event#connect#configure (fun ev -> prerr_endline (Printf.sprintf "Configure %dx%d+%d+%d" (GdkEvent.Configure.width ev) (GdkEvent.Configure.height ev) (GdkEvent.Configure.x ev) (GdkEvent.Configure.y ev)); false (* continue configure event handling *)) *) class new_progress_bar obj = object inherit GRange.progress_bar obj as super val mutable previous = 0.0 method! set_fraction x = let x = floor (x *. 10.0) /. 10.0 in if x <> previous then begin super#set_fraction x; sync (); previous <- x end end;; let new_progress_bar = GtkRange.ProgressBar.make_params [] ~cont:(fun pl ?packing ?show () -> GObj.pack_return (new new_progress_bar (GtkRange.ProgressBar.create pl)) ~packing ~show);; let prog_on_image = true class prog_nop = object method map () = () method unmap () = () method set_text (_s : string) = () method set_fraction (_s : float) = () end class prog (p : GRange.progress_bar) = object method map () = fixed#misc#map () method unmap () = fixed#misc#unmap () method set_text = p#set_text method set_fraction = p#set_fraction end let prog1 = if prog_on_image then let p = new_progress_bar ~packing: (fixed#put ~x:0 ~y:0) () in new prog p else (new prog_nop :> prog) ;; let visual = window#misc#visual;; let screen_width = Screen.width ();; let screen_height = Screen.height ();; let colormap = Gdk.Color.get_system_colormap ();; let quick_color_create = Truecolor.color_creator visual;; let quick_color_parser = Truecolor.color_parser visual;; let root_win = Window.root_parent ();; let root_size = Drawable.get_size root_win;; let drawing_root = new drawable root_win;; let infowindow = GWindow.window ~title:"liv info" ~width:300 ~height:150 ();; infowindow#misc#set_size_request ~width: 300 ~height: 150;; infowindow#resize ~width: 300 ~height: 150;; infowindow#connect#destroy ~callback:Main.quit;; let imglbox0 = GPack.vbox ~packing:infowindow#add ();; let imglbox = GPack.hbox ~packing:imglbox0#add ();; let sb = GRange.scrollbar `VERTICAL ~packing:(imglbox#pack ~from:`END ~expand:false) ();; let imglist = ((GList.clist ~shadow_type:`OUT ~columns: 1 ~packing: imglbox#add ~vadjustment:sb#adjustment ()) : string GList.clist);; imglist#misc#set_size_request ~width:300 ~height: 150;; let prog2 = GRange.progress_bar ~packing: (imglbox0#pack ~expand: false) ();; class progs = object method map = prog1#map method unmap = prog1#unmap method set_format_string s = prog1#set_text s; prog2#set_text s method set_fraction s = prog1#set_fraction s; prog2#set_fraction s end;; let prog = new progs;; sync();; camlspotter-camlimages-e471b3c4470d/examples/liv/icon.ml0000644000000000000000000001125312405272062021266 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: icon.ml,v 1.22 2004/09/24 10:55:07 weis Exp $ *) open Images;; open OImages;; open Geometry;; open OXimage;; let xvmode = ref false;; let mime_icons = Hashtbl.create 107;; let string_of_format = function | Gif -> "GIF8x" | Bmp -> "BMP" | Tiff -> "TIFF" | Jpeg -> "JPEG" | Png -> "PNG" | Xpm -> "XPM" | Ppm -> "PPM" | _ -> "???";; let thumb_path name = Filename.concat (Filename.concat (Filename.dirname name) (if !xvmode then ".xvpics" else ".livpics")) (Filename.basename name);; let create_xvthumb name = let thumbpath = thumb_path name in let thumbdir = Filename.dirname thumbpath in (* prerr_endline ("thumbdir: " ^ thumbdir); *) if not (Sys.file_exists thumbdir) then Unix.mkdir thumbdir 0o755; let format, _hdrs = Images.file_format name in let w, h, img = match format with | Jpeg -> OJpeg.load_thumbnail name [] { spec_width = Pixel 80; spec_height = Pixel 60; spec_aspect = Keep_at_most; spec_switch = Smaller_only; spec_x = 0; spec_y = 0 } | _ -> let img = OImages.load name [] in let w, h = img#width, img#height in w, h, img in let thumb = OXvthumb.create img in OXvthumb.save thumbpath (Printf.sprintf "%dx%d %s file (%d bytes)" w h (string_of_format format) (Unix.lstat name).Unix.st_size) thumb; img#destroy; thumb#destroy;; let create_livthumb name = let thumbpath = thumb_path name in let thumbdir = Filename.dirname thumbpath in (* prerr_endline ("thumbdir: " ^ thumbdir); *) if not (Sys.file_exists thumbdir) then Unix.mkdir thumbdir 0o755; let format, _hdrs = Images.file_format name in let w, h, img = match format with | Jpeg -> OJpeg.load_thumbnail name [] { spec_width = Pixel 80; spec_height = Pixel 60; spec_aspect = Keep_at_most; spec_switch = Smaller_only; spec_x = 0; spec_y = 0 } | _ -> let img = OImages.load name [] in let w, h = img#width, img#height in w, h, img in let ratiow = 80.0 /. float w in let ratioh = 60.0 /. float h in let ratio = if ratiow < ratioh then ratiow else ratioh in let img = let img = match OImages.tag img with | Index8 i -> i#to_rgb24 | Index16 i -> i#to_rgb24 | Rgb24 i -> i | _ -> assert false in img#resize None (Pervasives.truncate (float w *. ratio)) (Pervasives.truncate (float h *. ratio)) in img#save thumbpath (Some Jpeg) [Save_Quality 75]; img#destroy;; let load_icon name typ = let thumb = thumb_path name in let inf, pixmap = (* XVTHUMB *) try let inf, img = if !xvmode then let inf, img = OXvthumb.load thumb in inf, img#coerce else "", OImages.load thumb [] in inf, pixmap_of_image Gui.root_win None img with | _ -> let mj, mn = typ in try if mj <> "image" then raise Exit; let inf, img = if !xvmode then begin create_xvthumb name; let inf, img = OXvthumb.load thumb in inf, img#coerce end else begin create_livthumb name; "", OImages.load thumb [] end in inf, pixmap_of_image Gui.root_win None img with | _ -> let iconpath = try Hashtbl.find Iconcap.table (mj, mn) with | Not_found -> Hashtbl.find Iconcap.table (mj,"*") in let iconpath = Pathfind.find [ "."; "~/.liv"; "/usr/share/icons/"; "/usr/share/pixmaps"; ] iconpath in (* prerr_endline ("loading "^iconpath); *) (mj ^ "/" ^ mn), begin try Hashtbl.find mime_icons iconpath with | Not_found -> let pixmap = pixmap_of_image Gui.root_win None (OImages.load iconpath []) in Hashtbl.add mime_icons iconpath pixmap; pixmap end in inf, pixmap;; camlspotter-camlimages-e471b3c4470d/examples/liv/iconcap0000644000000000000000000000112212405272062021335 0ustar 00000000000000# This is a sample "iconcap" file for lv. # place this file in your $HOME/.lv directory #audio/mod; /usr/bin/mikmod %s # audio/*; /usr/bin/play %s text/*; File.xpm audio/*; sound.xpm image/*; Monalisa.xpm video/*; special/dir; Folder.xpm special/lnkdir; FolderLink.xpm special/lnk; FilesLink.xpm special/*; BulletHole.xpm application/postscript; /usr/share/WindowMaker/Icons/ps.tiff application/pdf; /usr/share/WindowMaker/Icons/pdf.tiff application/x-dvi; /usr/share/WindowMaker/Icons/xdvi.xpm encoding/gzip; /usr/share/icons/filez.tif encoding/compress; /usr/share/icons/filez.tif camlspotter-camlimages-e471b3c4470d/examples/liv/iconcap.ml0000644000000000000000000000353412405272062021755 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: iconcap.ml,v 1.16 2005/02/27 05:48:26 furuse Exp $ *) open Livmisc;; (* iconcap file parser *) let table = Hashtbl.create 107;; let load f = let ic = open_in f in try while true do let str = input_line ic in if str <> "" && str.[0] <> '#' then try let pos = String.index str ';' in let typ = remove_space (String.sub str 0 pos) in let icon = remove_space (String.sub str (pos + 1) (String.length str - pos - 1)) in let tokens = Mstring.split_str (function '/' -> true | _ -> false) typ in match tokens with | [maj; min] -> (* prerr_endline (Printf.sprintf "%s/%s => (%s)" maj min icon); *) Hashtbl.add table (maj, min) icon | _ -> assert false with | _ -> failwith (str ^ ": parse error") done; raise Exit with | End_of_file -> close_in ic;; try load (Pathfind.find [ "."; "~/.liv"; "/usr/lib/liv"; "/usr/local/lib/liv"; ] "iconcap") with | _ -> prerr_endline "no iconcap...";; camlspotter-camlimages-e471b3c4470d/examples/liv/jWidget.ml0000644000000000000000000000727412405272062021743 0ustar 00000000000000open GMain class status_bar ?packing ?show () = let hbox = GPack.hbox ?packing ?show () in let label = let f = GBin.frame ~shadow_type: `IN ~packing: (hbox#pack ~expand: true ~fill: true) () in let hbox = GPack.hbox ~packing: f#add () in (* add some space on the left side of the frame... *) let _ = GMisc.label ~text: " " ~packing: (hbox#pack ~expand: false) () in let l = GMisc.label ~packing: (hbox#pack ~expand: false ~fill: true) () in l in let progress = (* let f = GBin.frame ~width: 120 ~border_width: 0 ~shadow_type: `IN ~packing: (hbox#pack ~expand: false ~fill: false) () in *) let f = GBin.event_box ~width: 120 ~packing: (hbox#pack ~expand: false ~fill: false) () in let p = GRange.progress_bar ~packing: f#add () in (* p#set_show_text true; p#set_format_string ""; *) p in object inherit GObj.widget hbox#as_widget method set_text = label#set_text method text = label#text method set_justify = label#set_justify method set_pattern = label#set_pattern method set_line_wrap = label#set_line_wrap (* method adjustment = progress#adjustment method configure = progress#configure method percentage = progress#percentage method set_adjustment = progress#set_adjustment *) method get_fraction = progress#fraction method event = progress#event (* method set_activity_blocks = progress#set_activity_blocks method set_activity_step = progress#set_activity_step method set_bar_style = progress#set_bar_style method set_discrete_blocks = progress#set_discrete_blocks *) method set_orientation = progress#set_orientation (* val mutable activity_mode = false *) method set_fraction p = (* if activity_mode then begin progress#set_activity_mode false; activity_mode <- false end; *) progress#set_fraction p method activate () = (* if not activity_mode then begin progress#set_activity_mode true; activity_mode <- true end; *) let p = let p = progress#fraction +. 0.01 in if p > 1.0 then 0.0 else p in progress#set_fraction p end let status_bar ?packing ?show () = new status_bar ?packing ?show () class img_button ?label ?frames ?packing ?show () = let button = GButton.button (*?border_width ?width ?height*) ?packing ?show () in let vbox = GPack.vbox ~packing: button#add () in let pix = match frames with | Some [] | None -> None | Some frames -> Some (GMisc.pixmap (fst (List.hd frames)) ~packing: (vbox#pack ~expand: true ~fill: true) ()) in let _ = match label with | Some label -> Some (GMisc.label ~text: label ~packing: (vbox#pack ~expand: false ~fill: true) ()) | None -> None in object (self) inherit GButton.button (Obj.magic button#as_widget : Gtk.button Gtk.obj) val mutable current_frames = match frames with Some fs -> fs | None -> [] val mutable timeout = None method start_rotate = match pix, timeout, frames with | Some pix, None, Some frames when List.length frames > 1 -> let img, wait = match current_frames with | [img, wait] -> current_frames <- frames; img, wait | (img, wait)::fs -> current_frames <- fs; img, wait | _ -> assert false in let wait = if wait <= 0 then 100 else wait in pix#set_pixmap img; timeout <- Some (Timeout.add ~ms:wait ~callback: (fun () -> timeout <- None; self#start_rotate; false)); Gui.sync () | _ -> () method stop_rotate = match timeout with | Some id -> Timeout.remove id; timeout <- None; begin match pix, frames with | Some pix, Some ((img,_wait)::_) -> pix#set_pixmap img; Gui.sync () | _ -> () end | None -> () end let img_button = new img_button camlspotter-camlimages-e471b3c4470d/examples/liv/jpf.ml0000644000000000000000000000407212405272062021116 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: jpf.ml,v 1.4 2004/09/24 10:55:07 weis Exp $ *) type quality = int;; type enhance = bool;; type flags = quality * enhance;; let string_of_flags (q, e, c) = let qs = match q with | 2 -> "XX" | 1 -> "X" | 0 -> "" | _ when q >= 3 -> "XXX" | _ -> "_" in let es = if e then "e" else "" in let cs = if c then "c" else "" in qs ^ es ^ cs;; let parse_flags str = let enhanced = String.contains str 'e' in let checked = String.contains str 'c' in let prefix s = try String.sub str 0 (String.length s) = s with _ -> false in let q = if prefix "XXX" then 3 else if prefix "XX" then 2 else if prefix "X" then 1 else if prefix "_" then -1 else 0 in q, enhanced, checked;; let get_flags file = let body, _ext = Images.get_extension file in try let pos = String.rindex body '~' in let flag_str = String.sub body (pos+1) (String.length body - (pos+1)) in parse_flags flag_str with | _ -> 0, false, false;; let set_flags file flags = let body, ext = Images.get_extension file in let realbody = try let pos = String.rindex body '~' in String.sub body 0 pos with | _ -> body in let flags = string_of_flags flags in realbody ^ (if flags = "" then "" else "~" ^ flags) ^ "." ^ ext;; camlspotter-camlimages-e471b3c4470d/examples/liv/liv.ml0000644000000000000000000003211012405272062021123 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999,2000,2001,2002,2001,2002 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) open Images open OImages (* let _ = Bitmap.maximum_live := 15000000; (* 60MB *) Bitmap.maximum_block_size := !Bitmap.maximum_live / 16; ;; *) let _ = prerr_endline "init done";; module D = Display open D (* open Gc *) open Unix open LargeFile open GMain open Livmisc open Gui open Tout exception Skipped let cwd = Unix.getcwd () let home = Sys.getenv "HOME" let convert_file file = let b = Buffer.create (String.length file) in let rec loop file = let dir = Filename.dirname file in let base = Filename.basename file in begin match dir with | "." -> Buffer.add_string b dir | "/" -> () | _ -> loop dir end; Buffer.add_char b '/'; Buffer.add_string b (try Glib.Convert.locale_to_utf8 base with _ -> base) in loop file; Buffer.contents b ;; let base_filters = ref ([] : D.filter list);; let _ = let files = ref [] in let random = ref false in let dirrandom = ref false in let dirsample = ref false in let size = ref false in Random.init (Pervasives.truncate (Unix.time ())); Arg.parse [ "-random", Arg.Unit (fun () -> random := true), ": random mode"; "-dirrandom", Arg.Unit (fun () -> dirrandom := true), ": random per directory mode"; "-dirsample", Arg.Unit (fun () -> dirsample := true), ": random per directory sample mode"; "-wait", Arg.Float (fun sec -> Tout.wait := sec), "sec : wait sec"; "-root", Arg.String (function "center" -> D.root_mode := `CENTER | "random" -> D.root_mode := `RANDOM | _ -> raise (Failure "root mode")), ": on root [center|random]"; (* "-transition", Arg.String (function "myst" -> D.transition := `MYST | "transparent" -> D.transition := `TRANSPARENT | _ -> raise (Failure "transition")), ": transition [myst|transparent]"; "-transparentborder", Arg.Unit (fun () -> base_filters := `TRANSPARENT_BORDER :: !base_filters), ": transparent border filter"; *) "-size", Arg.String (fun s -> match Mstring.split_str (function 'x' -> true | _ -> false) s with [w;h] -> size := true; base_filters := `SIZE (int_of_string w, int_of_string h,`NOASPECT) :: !base_filters | _ -> raise (Failure "size")), ": size [w]x[h]"; "-atleast", Arg.String (fun s -> match Mstring.split_str (function 'x' -> true | _ -> false) s with [w;h] -> size := true; base_filters := `SIZE (int_of_string w, int_of_string h,`ATLEAST) :: !base_filters | _ -> raise (Failure "zoom")), ": zoom [w]x[h]"; "-atmost", Arg.String (fun s -> match Mstring.split_str (function 'x' -> true | _ -> false) s with [w;h] -> size := true; base_filters := `SIZE (int_of_string w, int_of_string h,`ATMOST) :: !base_filters | _ -> raise (Failure "zoom")), ": zoom [w]x[h]"; ] (fun s -> files := s :: !files) "liv files"; let files = let fs = ref [] in List.iter (fun f -> try let st = stat f in match st.st_kind with | S_DIR -> Scandir.scan_dir (fun f -> try ignore (guess_extension (snd (Livmisc.get_extension f))); fs := f :: !fs; with _e -> (* prerr_endline ((f^": "^ Printexc.to_string e)) *) ()) f | _ -> fs := f :: !fs with | _ -> prerr_endline ("ERROR: " ^ f)) !files; Array.of_list !fs in if not !size then base_filters := `SIZE (fst root_size, snd root_size, `ATMOST) :: !base_filters; base_filters := List.rev !base_filters; let cur = ref (-1) in let curpath = ref "" in let disp_cur = ref (-1) in let random_array ary = let num = Array.length ary in for i = 0 to num - 1 do let tmp = ary.(i) in let pos = Random.int num in ary.(i) <- ary.(pos); ary.(pos) <- tmp done in if !dirsample then begin let tbl = Hashtbl.create 17 in let dirs = ref [] in let num_files = Array.length files in for i = 0 to num_files - 1 do let dirname = Filename.dirname files.(i) in Hashtbl.add tbl dirname files.(i); if not (List.mem dirname !dirs) then dirs := dirname :: !dirs done; let dirsarray = Array.of_list !dirs in random_array dirsarray; let pos = ref 0 in let subpos = ref 0 in let subfiles = Array.init (Array.length dirsarray) (fun a -> let ary = Array.of_list (Hashtbl.find_all tbl dirsarray.(a)) in random_array ary; ary) in while !pos < Array.length files do for i = 0 to Array.length dirsarray - 1 do if !subpos < Array.length subfiles.(i) then begin files.(!pos) <- subfiles.(i).(!subpos); incr pos end done; incr subpos done end else if !dirrandom then begin let tbl = Hashtbl.create 17 in let dirs = ref [] in let num_files = Array.length files in for i = 0 to num_files - 1 do let dirname = Filename.dirname files.(i) in Hashtbl.add tbl dirname files.(i); if not (List.mem dirname !dirs) then dirs := dirname :: !dirs done; let dirsarray = Array.of_list !dirs in random_array dirsarray; let pos = ref 0 in for i = 0 to Array.length dirsarray - 1 do let dirfiles = Array.of_list (List.sort compare (Hashtbl.find_all tbl dirsarray.(i))) in if !random then begin random_array dirfiles end; for j = 0 to Array.length dirfiles - 1 do files.(!pos) <- dirfiles.(j); incr pos done done end else if !random then random_array files; infowindow#show (); imglist#freeze (); Array.iter (fun file -> ignore (imglist#append [convert_file file])) files; imglist#thaw (); let cache = Cache.create 5 in let _rename pos newname = let oldname = files.(pos) in let xvname s = Filename.dirname s ^ "/.xvpics/" ^ Filename.basename s in let oldxvname = xvname oldname in let newxvname = xvname newname in let gthumbname s = let abs = if s = "" then "" else if s.[0] = '/' then s else Filename.concat cwd s in (Filename.concat (Filename.concat home ".gnome2/gthumb/comments") abs) ^ ".xml" in let oldgthumbname = gthumbname oldname in let newgthumbname = gthumbname newname in imglist#set_cell ~text: (convert_file newname) pos 0; let command s = Sys.command s in if Filename.dirname newname <> Filename.dirname oldname then begin ignore (command (Printf.sprintf "mkdir -p %s" (Filename.dirname newname))); end; prerr_endline (Printf.sprintf "%s => %s" oldname newname); ignore (command (Printf.sprintf "yes no | mv -i \"%s\" \"%s\"" oldname newname)); if Sys.file_exists oldxvname then begin ignore (command (Printf.sprintf "mkdir -p %s" (Filename.dirname newxvname))); ignore (command (Printf.sprintf "yes no | mv -i \"%s\" \"%s\"" oldxvname newxvname)) end; if Sys.file_exists oldgthumbname then begin ignore (command (Printf.sprintf "mkdir -p %s" (Filename.dirname newgthumbname))); ignore (command (Printf.sprintf "yes no | mv -i \"%s\" \"%s\"" oldgthumbname newgthumbname)) end; files.(pos) <- newname; Cache.rename cache oldname newname in let image_id = ref 0 in let display_image reload file = (* prerr_endline file; *) remove_timeout (); let load_image () = prog#map (); prog#set_fraction 0.01; prog#set_format_string ("loading..."); let image = try match tag (OImages.load file [Load_Progress prog#set_fraction]) with | Rgb24 i -> i | Rgba32 i -> i#to_rgb24 | Index8 i -> i#to_rgb24 | Index16 i -> i#to_rgb24 | _ -> raise (Failure "not supported") with | e -> prerr_endline (Printexc.to_string e); raise e in prog#set_fraction 1.0; sync (); image in let id, image = try if not reload then begin Cache.find cache file end else raise Not_found with Not_found -> let im = load_image () in incr image_id; !image_id, im in Cache.add cache file (id, image) (fun _ -> ()); prog#set_fraction 0.01; display id image !base_filters; (* this cause lots of gc *) window#set_title (convert_file file); disp_cur := !cur; curpath := file; in let display_image reload file = try display_image reload file with Wrong_file_type | Wrong_image_type -> try prerr_endline "guess type"; let typ = let typ = Livshtype.guess file in match typ with | Livshtype.ContentType x -> begin match Mstring.split_str (function '/' -> true | _ -> false) x with | [mj;mn] -> mj,mn | _ -> assert false end | Livshtype.ContentEncoding x -> "encoding", x | Livshtype.Special m -> "special",m in prerr_endline (fst typ ^ "/" ^ snd typ); match typ with | _ -> raise Wrong_file_type with | _ -> () in let _filter_toggle opt = if List.mem opt !base_filters then base_filters := List.fold_right (fun x st -> if x = opt then st else x :: st) !base_filters [] else base_filters := !base_filters @ [opt] in let display_current reload = let f = if !cur >= 0 && !cur < Array.length files then begin imglist#unselect_all (); imglist#select !cur 0; if imglist#row_is_visible !cur <> `FULL then begin imglist#moveto ~row_align: 0.5 ~col_align: 0.0 !cur 0 end; files.(!cur) end else !curpath in display_image reload f; () in let rec next mode = if !cur >= 0 then begin let cur' = if !cur >= Array.length files - 1 then 0 else !cur + 1 in if !cur = cur' then () else begin cur := cur'; try display_current false; with | Sys_error s -> prerr_endline s; next mode | Wrong_file_type | Wrong_image_type -> next mode end end in let rec prev mode = if !cur >= 0 then begin let cur' = if !cur = 0 then Array.length files - 1 else !cur - 1 in if !cur = cur' then () else begin cur := cur'; try display_current false with | Sys_error s -> prerr_endline s; prev mode | Skipped -> prev mode | Wrong_file_type | Wrong_image_type -> prev mode end end in let bind () = let callback = fun ev -> begin match GdkEvent.Key.string ev with (* | "E" -> filter_toggle `ENHANCE; display_current true *) (* | "N" -> filter_toggle `NORMALIZE; display_current true *) | "l" -> display_current true | " " | "n" | "f" -> next None | "p" | "b" -> prev None | "q" -> Main.quit () (* | "v" -> (* liv visual shell *) let rec func = fun file typ -> match typ with | "image", _ -> display_image false file (* | "special", "dir" -> new Livsh.livsh file func; () *) | _ -> Gdk.X.beep () in (* where we should display ? *) let dirname = if Array.length files = 0 then Unix.getcwd () else Filename.dirname files.(!cur) in let dirname = if Filename.is_relative dirname then begin let cwd = Unix.getcwd () in Filename.concat cwd dirname end else dirname in ignore (new Livsh.livsh dirname func) *) | _ -> () end; false in ignore (window#event#connect#key_press ~callback: callback); ignore (infowindow#event#connect#key_press ~callback: callback); ignore (imglist#connect#select_row ~callback: (fun ~row ~column:_ ~event:_ -> if !cur <> row then begin cur := row; display_image false files.(!cur) end)) in bind (); Tout.hook_next := next; window#show (); let starter = ref None in starter := Some (window#event#connect#configure ~callback: (fun _ev -> may window#misc#disconnect !starter; if Array.length files <> 0 then begin cur := 0; prog#unmap (); display_current false end else begin try display_image false (Pathfind.find [ "~/.liv"; "/usr/lib/liv"; "/usr/local/lib/liv"; "." ] "liv.jpg") with | _ -> () end; false)); (* let release _ = prerr_endline "freed string!" in let test () = let f () = let string = String.create 3000 in Gc.finalise release string; let buf = Gpointer.region_of_string string in ignore (GdkPixbuf.from_data ~width: 100 ~height: 10 ~bits: 8 ~rowstride:300 ~has_alpha: false buf); () in for i = 0 to 100 do f () done in test (); *) Main.main () camlspotter-camlimages-e471b3c4470d/examples/liv/livdemo.jpg0000644000000000000000000044527012405272062022157 0ustar 00000000000000JFIFHHCreated with The GIMPC      C  "    ! 1"AQa#2q$Bv &3468RTWbrs%5CDFSUVcf'9EHeuw7Xdg(Gtֳ E !1AQaq"2R#Bb$3r46C ?0c0 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` uݕ)i.'֮ԹSTrV[_.m6PfKg5 gib=񻻺czdÍשӤP=*\8!(K@A.@$c9ns%^ 3P} hm)R\HPSRl n\qLsV19Kf 1Ke\Tbc+g xz2"=f\Z?lE5۬y Htع5.DG\SxAr:`]Xܔ#fMh5D%Tn궇fѲdLEVP܎R)m\I vq}SmJyt#>\FSNx&W!KCz$$8NS˖HDJ{hsc7 u+knMQKO$2DT0&&BqKh, 7# VfW"h(ØB;r].xn@B^ ߥyeҩmuR*/46.Y;ӷ 6q;ߨPC2m@4:ɐ0\R (+7BM?65ahr\u= CҔۍ[mj)$x)W@E7BW_TSz7slT\O?65c^_E?ף~8Qh؟.~lk')FpZ>g.~lk'ꋟ1Fpzѿk5ꋟ0zƿb~ aѿko Efzƿb~ ؟~o)Qh؟.~lk')FpZ>g.~lk'ꋟ1Fpzѿk5ꋟ0zƿb~ aѿko Efzƿb~ ؟~o)Qh؟.~lk')FpZ>g.~lk'ꋟ1Fpzѿk5ꋟ1jut8Km'rIo32b\lܾ!tM3YR)mfLU) } I1HaH%67Plz1) Ö! {=S_OH™ ieHR]ZIPGS݌J5$f_8%uc71i_66`XGw@8Ww7#q ]_iU1aU)/v?2.ߵJA -JF_5ʕ3ޗ7%~obOwRJVDSQ3GƤ1.(7IB1jyP3M&*<7)A尟:{a\i\fqKv! Q"9bL7Q i2u.NMSLa+h\5zJ :JCRF[%$.hn_Z!3<32QqFAT6RTHQ÷YTZNU}JMe6+Y6y8nU'V;&>ǣR.=H,0` 0` 0` 0` 0` 0` 0` 0` 0`/c;E^$ڔnS=ؐh%r)* xaM ٽ!V׷/Mn\ZJJl:teU Ƈw^I?!ʜc y3SY<-JEӥӸG~s*̌,jO00a~2 Fի'Cjhy(N~Hm y7ŵOZqݍLjAlӹ$) ;T`. Lp3"XRs_L40Z Rl@QWp|"thyO'(UjuRXyKMi*ؤ(Y:ml"4%>2d2iR&B֒mEDY'qI&eMWUXdӳ'SLaTڦd)S#1!ZIOӊ6`vQBjKW .**֝l{"T|EUI YFt%Lr$۶KkTg42"]a64']NHĥVvwm6uST8n׈S%iFg6YN{r]~#l%XMT<_m 4y63 ,qyHW! 7% T;8V\]"8ҚD} )GmHI7釯3>Wz-DYPYq%6e XT|b7jsqRlIzʉ3fGG26Op_Å l ÂF+/9[K(y!WM8,$צ`˱4;SsuC.#rzL,s {ˍkb4ʣFM)A dHl:]Umw_+GV|ۇmk{ v il+p8DEQBvZDo'=VdԕScTʺkLd!مI W*1NMҥ _fIySS)^3$'La%_%hftyP'ӧSuuMzR5l E{FCisd[Ɍ7SfO5&tҚ zazaJEyΔ]ߴt)ڢ6]N22)4WGbAIZE9([č%b>-߄O$jUF/a֢5! %-8m7Khylw*55ƣwCrKLR!w'n*GS{[NI[ȭs^M>b2^m*\7^$X[VázD$q5 Cn2i-@=R C|,y;T԰qR"9?U,}o9S\͜PfF /OO:J42 ҂I$(ߊYȰڼE. #R$ͤV(hGS}'Nё*ԥ+y lS-sRvb=rSd=U^XO&$d$}B Gy"t8(*BRgH^-t$@%ViE2D3ּ4))(t!p뜽* ;LTeI\He $>w|ԙo/ qcى,0Vs>TzyL}I*ImW8!&r_muNi12TJq1>R}*Ǹ/T#UAN- (.}wi>DZ; +)M$GuO%oZ>!F#͍Wyh5*:!)ބx8X#Y*v?W[OSvHo>\"ߩ L.UmY F6Et6Ò:jotڨ˥׃J ƽ,xzhA9/;?2j#Ӑ6SɌɋ  X nHZIJZ>DZKKy7ӤE9 ;Ki6|T e{^lFW2U )_ xdICEǒ͊ J7 Rl.I/K>3D~ *ljN#TOPR/ ^r7IBSיku .1fURCb$>C\t( ;p >+mn*n"OeUO`&g7-|[YH$512Q`Rrc[5Reӑ$C!eߔ\+(P)B5"ڡ[1H1PnSo]HRPFl%y1YdYOs6JkwaOyC'' 0@;n]`%\jPJA7Ʈ;t促m=%E6myj[SύܶPS!bsŢ;y{Wp;yi:`@խGyzar 4 >CƟK5,i>ZT,&$HKeUKj:/hqPԾ&2Fp-k*x[婊txܸ > !e]lH#5]6ﷂ5>2 SW!,Z#nm`ocȺA]*)M^Rum0i$TW"ylq/-]Ҡ-H$<鳆j\݊XvE)]R$04pw"5RO@˔(qTWk⊷)A{St[Yne4W֖Mm喒43h`VebW\n Pwd7~('ntJgjgmDFF2qaR[$]GwSf5.6Dma=HRi`nl/ y0_UmYf6'o3*'d..M6w@l^zc}=~=Gl!٤=4^˶-g^B¨cv0+/z7_4 gd>26kuȻVSITM>ky3Pe skg1]` Y]5]/㰴JwB`P`0` 0 `0` 0 `0` 0 `0` 0 `0`ݪ_11w\4&) [bڋQغuHw]&KKzU9AQU.(}8h*9lKŹ";C1jsm\ L1!T-K{9}6 \f+g0J:t15RlASFqj[M3ܣk\k>\Ykil#X'PyZbGAA]C"J𠛎*]C'q&u^Tz{%F\Z\aţpBIS)KaC8)t,.:FU H4X!%HIIܸʖlrl3dDBˤ6B[RVJԞZ.Cj>H uY4}eT MZ:Ƿi|0#dzfZejdUeF&lZ(N0KE$װmNsփL*LVį ȰJ[OLrev-M~`JK++}ĿmP)IJM)X7%T+11"xHiJ4ߐ)+H*;kXa`H 3i}oF-TU7eN@*+bx-l0Zϯ 7&F%SWn\Fy‚x"T E5E[VkԺ]2^l*Kw J2Umԥ*js록QTP֙)S`UrTxa+r#t^Q\Gҍ7 :KPjEJJ{Dxua\n>8L4[ߪzninmz&vR ʄWT tt7Z aQMvۑy I4ae80qnY!VwZ§]T.RrjdAnBm*ڧNŝo,*w*e^So>*t$!]=ocISaUT&BSΓ ܐ;6lF^KBmDVu7.ę*C+2E[o%넷_OR(R&'vX *)QXώ[j4'P"C s,][~ѿC^l7BrA>KѹZ]-OKyT1ŻGsk\[Qj+c%S2ֺ*VRCIE@ww\r E^YJ턇51~`rSemD*TR=HCo>4_RGCܒ\{$,;|N,7=*$dl{Q'ʽ*cӺsS*%![E _==6⚗fE;40`0` 0`IQXDm YmPWo̓ڟ71x0`0` 0` 0` 0` 0` 0` 0` 0` 0` 0`صTILS12:a*Hp L@AUbj)Jf&3M\<_䣮(;SSK]^/*(\R Z7$:;ƙ*r2i,)<!IiPi'bʢN )zZPkS0DSa> \6ޯt{KT]fSǐ㈥`>% t*7Ĵf. 3ƥeu+0L"Cjz&_G1[_u:P; FΊkQ3X{r4;Cpou%[1ת̜.UZz ٱ .*M"M{dԶOm[n Is)9ΙބTcd!al8Vpq+CFAT=X1TDǍ@).Mpq]s/4G&[K>9T7,:ujKU; 3M:Ԉ%>1ќ ޒ%@0p4 ROQ+ Ʀ!Sǝ PjP{rllHêx3!3.`qrJur!jCiBJ$\\^ɭ+i"G;R򑒮\X6ӡ\ƜH )JÇp6[XHXTZ5>[W.! l%a*7Hznc}T4N"3/VPo_G\HTN|1R^+\Ib )yR}77Z/YPΙ;2&֕In;vwwn8Xt"6j޽iUw:W%7PZcSV#If:e;7$$9Ñ74K)TtBCtt -rIi"qI årpݓJMZ]uncҫ4w\mKN)Ox6o0#qfM&Dȱۗi9Ғx\02"Fy·qkvo K*L!kjx$%;[0ZG5rFaE*DLKijq`]7nP)Uɹ>\/>4r)nyJURˀ|TVq>΍%Xq5`DU?3T$$aCV7w15¢ywĘƴCڭfI9ʼtS"-^*V|}@^s|9dzMhTInJ)՞o㼍ul<TAˈPu+M1Z+O#^v,K|Pm>Op[Ɋ,mbcAOnp.#_$֡܆Q)vQ]<#`5ZrFrd^TԤiJY:(;*V먓ԧw'dirxs Km u*)>Le&`U4dc6/]H/1Ł8(27X;ța^Mؙuar<{*L1JtEեf`Ab3أr^HèzCkcRO0זT(O2ELkhM)J6Ӆ(aiHvCVKnĔY(QO5!EGp=I=qHDEkyRgHDVZu6H눑⟵R*Y;O̽Op>j6oRV HE8g\&ԪSIr[SQ$$qvҍ6F]nWӍFOّ0sɣY0̪t. iP.({F“퉱=0DZƆqY G~C,H5\l+d!6zYE'ӳ4[[nHiiݵ1Y?wW4lQqR@ (jZv.IVxavp0'.w[ՒH$&Lv݊ƲNfj5%lƁ=C2)O% QwTigW0OɰdSbS傧#3H;\Jwn "\Y̌MC7gIuwvL DezQq[ź$^^;EHyI$Hz}RmD%L%u=vn _g,Oi&U_%ڨx%KXo&/zQvzZnZk ȒSe{TiI#wLcNv4ǀickmd;I>.gþa#ĝ.^3K Dt!]=;/0hJDq]}$C+oxop64y/jyr $ZN$yWq/L1L:c-xG@n. v-.){{$Zp`  `0`"Rz m^ko̓ڟw1X0`0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ظm Tϥ3iZZTM(9.!/Jn&#L)B?̨G)Ŭc853I'֩PǝkOE̔RV9){\ q}2ۄi;Uo秛ξ D>3X O/l~̝NO$AùV3w%zfh8*jX˜Ӌ7|mHl O 4U0t$6*%֔ܮXC{\2iםTAyr.:O Z\`3#)(vvl9 G)2B@l[\|`@E";bA`0HRrv,b;ozZi¥HMψ  &bȗ[J! .ďn]&s뉌6Z5.ޕ~!h\R*z!rS{ꊒZ\/'q&'Z! `8XTPv 1:.odCj2&eLT9ʴ LE(~X+`qs}.<^ȃ:l*(@}RVHFN&{!SrnӷVm m[floEԕl變RyZ NU2cFR؆ CQR`JG_O R=e-3A^sTl GEIɴ"KYgrKJ%(/iEeDi).!^I >nEJW<6V^nڟQ\yvK4eKX4=B}7ǞCfV-Q_u\V|N%~hXRKJ?N&шNsmDIlXݸcAb'I4W'Ә%4@N3 >~%I$\fpSӎ4u;Sӣ"m퀦pB?C߶:0ԓzWba!S#6,s,T)H 6>PqgвceB"ir2Se{h-mQ@JEUٿdoqR_=.7|LVQy-ĝ>8-i9/7Q)])KC l6z|`A¿2fd^yژ! \߯U/YMV^3ɣH,Ș $8ԛs/z!9IQSh >wTzUUo?3g>"F޶69n5 ~j")-Ċn2Yܔ!&y}.;}u2).(L/JJSI0Aqے\A5`)2V앐!)|en.ꎦ)(9M.2u#6jizGl D 5ٙrHQ AqV*Z{gwK3kNzP—Q˙\~MA$[Q_Qewt-3)AlD2bD%ԩT뛈*QRϣ )Sμk2vm~Dԣe|*à鍣-aPRB^lS.f,JUr |(MTȫm$%)IVXRO\%rnGԹ5ɛ5ydTԶBۺ_a,<\/yFt[99RԕVzS^[cm6]Z>{-'iRO~E#.'y26x:.X⋇E::SҶCVNHeGp=t̥>gt8,6S=(m*]9U]eWrZ0[A/1[[)\JdtEڟ@m|ϙ jА\t +aueKEUHjsXUVTYd"Ǫ *5i};e|.%6,hͭۡJI6_2gMj)zLh}Kim,-VO]'dfbj"#,L(<[)TPGdU0ΒAuĝmxǺ;; &XLidDӣ(K%N;xurDtZC{kW,a/`̠1ftEq疖h-j6J@bmQ1ҳNz!w~LSq!.$ޣe = hlÁ*+6۸_ˌ\ŵJ'lZ㮺[i!QqX5o@/1_tVJv,DE#9=6TzlDse(Hq"e-Tʒ[(>).Z\V An:<%GZW, &e*o/haHfz9Lv.Ŵo@ ڕMGNzڜl՛HKȃt)n)=.&["IvHuo!crSJqDܩDI$ܛ;txWD}#QifYk M%~KّiT2V6"bCgp 2"O䓎M5P4YqM~wG*E*ν:IӵGۘܟ01a:PVJ^$v^s*]+Q)% (c14]+d^I)*v84 n,H\f\i+[m+4z9Ƀ>$Øû^[U-*ļA4)T2!%RS=Pe.$"䠜{ ,A]Z}~s. Q}< ֩eUlτPm8 Tbq.'IMghzRTsd=Ε[^̭J ZYm*!VB*[[AF+eQXxSKZ.;-ԫ"OKPsNYIġ  B[ ZuooG %'蓲7/#2(ESL8T,XoJm{ Zo c֮׫ʴ\MuYЂZJS~Ί$f˴}u-fM+RAs:y:⼸tf.'z0/5 & zµS~VL"5iI!.P.ܞҦ~ڍ5ś%Ki{R񐢒 uML+f8~_ƕ-m/\nChR@}}ϻ ˅)_=ab)R|Jpv"TݎW%q\Fƶ6pߍ~_TXD84RS{͌\%o5&+!RTPU[uO!*%-ݎ}*nQ7sc.2Mq-OFtʬZ4X\k)r(oҢ,<8EˍfrUߤ)rB m)"c.7Jkm22]Rd2+ n=KH5 Xzy<)cpC ZnEȄh5)sYg'_Zѧ&­PBz`AC7$J-쏦3(m}G# z{jRڽ8\|% .a*8gYd:)u`kO8vPvkkiB|:(Yřmm諑g#%er\y4,JS~_>Ă66e.)asd%<R pf[ޢ=o{Og,j9_[S7% %A nA pACYӔ%5g.))+` V2C:`ɗИX̧ƨC'XWRU!G /-S`9$8PqBS|kfIq~tw&JJdK:%n,%.F(H*Rlo0y&4o'cxK?1)VFoT8yi TJ, mz%tvZKwZLLZSMUFYԔĞ MIص8{%D}IQ|Ggʆg2>1GE5&Uۮ<)kIhJ ZCЛw'of~5]hN<@+ƒJBy# 6Nj2G88 >N6>c)Ih{햔^>cMN9^xRԔ lǖU)m_GT6=,I&bө$bDh_2ѥ$գΊ-- uk3{̕F!j+S|҆T]RIa5CrJZlnp-rqP)Y}gӬaՌObmR̄$t0fD~9Q!\6rJTl}yق,JvЈ|W}-ߙDxjWuR@h)* Oc݋1&DY+vE.7@<£}B|`)Ϗ;+q!kXm) JU { %--"^wtjɝ>\}%)cncj2qɍ C#n4u&YeE”`avTUI\Qiҗ'l#uzYV{l::Ԕ\RHIIsD6$)l86ScyQuXIa52#{H-JA'4TaG?to}caX(fⶪO2[+a-H#CNzSeS*tPR7ItkyJUJc[BwgHꛃ͎NY?$줬#qJm'm'85vDW>Gܥ+MgT;=_߁Lq@wdE8OԊu]ܺ,,Mǵ>A|(\~SFoO,8qviN:Uj'*S0`xk 0` 0` 0` 0` 0` 0` 0` 0` }=uK:gқ2m}{[9* %FIJ†wv0.!/Jn,k&ԳDB"UcT@eSP_̧J/5ч&tcVt-3Ps0))5F=Ğ"숰<%3 R-]: RFղE"_z\ff:6M;\_=8d?Ql8g /HllM;z㘯7)ch_u%eqXd3ܩrDO+K BYnl[*nU vIHQ@^}9O_Vh2^O ರVq(/hRuEgMlU\ Ŕ6 y>fja324t`gO(6JSr|^!,HP"lj{-f?|\Ȣt4T1Ɍ"[LTa3)u 1WVbR1k jٖC-U())l%%A!AV }iCbN1 ˆe6]!vYq)RnAWTH;_Bk q9_=V>U׌Sy &KyƛmSٟ5HrDԦ0$En6JMu괺|-?s,Tj @LD1.mylܥN():VJr+Uʟ.n1b$t(6D)JR|Q`:X2Wݛ`Sԏ{ɍmřڛJ.K4U(֜|?1jʵCe2%9J,ɉNRJ 9nsJBioī]#Jrp)q)m;!|.T\X2ԥI.l酝Tx쾴:VzR ;=b3OyqRI[jB3otS% IQ_$ZAe*1a,8ӭ:+m!B$\^iwrfUYj.(. X0rR]Ш; O’O+UzydZd.\r;_¼h\ZWeRq 84#jκ]@3hQ%,ƒhaik;}EZuQiE)R8wm~9>Zw<|{:wahE&3S.u*߅1fLxG#I%^ȕ<7)Hp {_&e04Kn{-lz\-,7N^env7McD4b+ S.Oi9qIpPYQ %AP9^EiojJU+1ȩNnJc9e6\K(CiX B@myD5zm )5;QrK)eK/duS.ҽuMD"&#I6f*: Mʮ@p;y05hdR|0J1^o}Yfغ3Ӆ:pr6WWEoxv9|H1ʮe zQTXt-~kCR)3s弇T̕TԀHT@'`vfI91əAuT3&y$\ap{ˉSUR$ϨF ȱ'pH7WpR2j1y+F:ǁ)]ؽ޲:uGaxň.-,cCyMm-ezߪtݔ9%\ tÉ"6-e<[iͪRZmvdM6ɑPStَSiM@G HJ_C̈́0IrPr Vo?uPlFݦ㭾=ڎtP"L;%[-:P$aRP(7Фĥ6$p8#65jL*pF[Y]]yδYeUjaҔBY/cۺ6t$uǤ;*FUz=s07I꼴S%O^5t{kcڵ|DE<mKaby_Nr|r1]La;Cn3q\]FV Sc&K`mnTJ M"M(TcvJ[XBU :6ڮIi +=EG]A\BD a AB1 *ܓIƝ&ax_.7騕-mVɵ<3#-eu^}l--ڎBB}Ҥy#,gXKj\UfӂQޝ\kx٫}p5pQeGblh!nDmSiH$li$\ DtP_J sTTTAk[_ mRwOcaeU$:_i\+k;o.d:{*X+4W׹k&8>C97KyG=;T\#uapsT!kv6U@PL;Nt-9oL(z\\Nip]cMk9nU%՛#b-Km臷Rbtldu~UjlE;Q\_“+qZLHFHhnJጼ eIAdZhea{M%S[]I8In{ ;loY#pRSuf2Y#X P>>8,eP l!֔z)PtqEKΕ! )HG@G)ђۙ~[L*U丰4}^Y$%%(\ fJ ,OQ~^fRʒk{ljXYX5eD%=ztO"g=$nϢQ7 k0mGyHpx%V]hw.o5 ٨pԩ#YJn)H`0` 0 `0` 0 `0` 0 `0` 0 `0`{~|+N`A/̒Iҹ /{~|[|FgQ%-fKk|%nu~baBP9&U1/RED*^%j7}D@Rwd1';%@n]CЏ&>Z f5ʫE C+Kbu \u"`.뻅?.]9fVK T|^$=;Ggk,G<>iUx y>'bfsg 3Lp`fqJVZgn$ T OQ`:bN˘*@i>,+`IP~N/[ AᛴQ\2BpzèDj`.:w:񮠗Hb;2WQRmxSo,Ww]C3M1CKTDvk1#;:4\ {k}\[iQ"$sSDi'qqWdJP6( P~X>%vbB| ukڳ )}ٙ^mƜJa[iѸ< ;HH*XS>>m8ƧkfHN8ZSM/"ZWS-Ri;L!.@ wu{MRjE/mw[iRJm}#$| T*tw*R0ǩR|&PICH*[hC I %*9Z:.I}T*9)D%=oKAeґԡuOj$kN^ڣgOgNti7 7tVi"*djVWi2BWVB TZ4/A6_0 '9NGB@ &iN;:i 9#:E)g]*O-d"8nE6.01}qx٪Zu; Nxw9yMR/~f=&'p"Mc֝NFiNvӠ3ڌVay-I%;|T mbť؋ K…pNnS*[0_QF-תu#丧89PBo)OǮ+ߋDN01I!dcS֤l٩W1X}=bRWa=ldv#kT\RAe52W<JԞO.ldM~={еڲgHLv91`R㶽QJwܟq 'iγGVqŲT(iŸp~{&ߡŞ ?z&yI-ET]w]'@`2:xٍ,%;7?-aOq4#%6$g!.TeX|rI)$=$:uImTJ:Opu4P:d,b V՜BorJ\B’A#=[)b*k{ N8jvVf9ZEYJpUXe)S!t2^ %+ ؀Ayj8\˅jsN"c| $$z*RWފx~Gi>Hj¢Kj_:P\JԳIb]h(tcdxM";I;PC3gq 'أ[.b<[īΜTuaK!qI@{HWC;š"}R7_Oq~׻ (!gy}hGbԴc8z:RҕJunP+ڹ+4fMRcRJX R|*ABVqZJVqul:x=RRV,p(Ӏ :cF/Ge T!BSᬭl)^A@UeUGNb6UvZ)O? ̎7-$K}wB@HN2w\? >daK2jFJ6=RI1AL%՚^HuUBJcб<#ڎAhҫf3۩%qbo!Dkzi" IXuz㛧b`}>\md9S|;ֻTz @YHH@k3 )ԶU$)BsZp鋨[I+&6oR쒽9ʖR |HR/W }?1d)saĥd[^Sixl0cxV0` 0 `0` 0 `0` 0 `0` 0 `0` 0^C_0еy7^f#qûbwjtv+wRD,~f5j-1s 6c]R[l4)C$ }vv|p[Iz-YF<5I-$R 7:[8u^CNH 4Tw!= X{쐭y cAJ%aʒ]oK؋aTrћf'@sˍrVMżM5IgD"fEZ2k=TYIawSn'M|EٮƤ}ihRtUӧO6)*ҟhQR[q|@\1Px4T"2Zq J-dTzpCےDƖZfJH;w :Zj Q[+ +HWU{Ƨ;ZiL j:_ JjL϶u(m 4 JDYTu?%?? qg6˕_F.M?s60z (JyjMʻLaʈ*ևӡĸ)H~11HpUcԎnUc`Amm^w͏Ttex٢CIpغ.mqC91a7F맸\w1IT7+ ņq6\D) XcӿM~$-;-ҴY$_&-NeUne&:ǯɨS*4fGtmH=<|sY7TFexٻ]V MGCaz+bogyaG-CuZJܵnYZ471/ܳdžDCq~bnd6D$x:-C$d.ꮤp=N2i b#E!m(hm6Ć'qօ7*+a]M66- SS_u՗#[n)^U-F&R\̽chTE$Gc0ݖp>/R>.oy/*՝G̏<}'z*Z}RdJc/ԓ%d)1v(.4[=\iAJRTRR/htsCtZ4&/*1TyB8WJn' 圚~$2Qܒ\H/'qwyL5Ke=lh˴:q*Hz֣L_iٖT[ tۻ,*=ZPR^-,%R87 Cl.JiԢՙB]SKnDw7Ai!B2MTCˋAi}Wt fw&gTECLN֘Z ;e Nƪ}ymƔ t ,GGC㈫M7?#8Jۍc}2g[]jqss;NۤYӎ1V/[.:һš KTU &Xnl'T'! me"C%+J6MUKH*Q BEʉ8O4B7OϯI~(IaEoK'DؐZa~umO*%+@P[Rwج ^ɎH5Vfօ-\U-",T q2B>eNjvdS}}~!h-_LwlR.$d/ciCiDi,2}i% y1Ӧ_ZKyK݊oTbڍ5fBGWLp#J`QNFrT%")U)VHĐ1<zԜFo e]8tª"mI_Bm$_n +9iE l=1Gf[qXʬ~ej^Nϙ1V:CeD{y;#} RK{19d,t:A(LHboQi~*4GDUʒLpxS>3EJ|u\i5#?UY< r~B gɰZ":[,A.M+%鐔^Ne։a܍qBڐnR .e8|ŷ)N:黒Zy-u)j>U(m@/hOW\TԧjVރ} 2rVD+rDOqRWb|J}՟*\G,Ti˅OG/Fa"-l#\}GH M[=qFNd[Tǻȑ.ͻ6BYJBWPԤoZOq YiTEzqҶ+TwI7'(GKK&#'%Lis"*&z:VhZ{q`tI+HδMI1t8C(7Ixog1kTŚ2ĹCUI[s9I\,lTBRqK(5BV ^*V\¢QVd;m]LDZ's9a'ªPZnp3׈J!)rCscFqnޗz#ҕDjbERM-iv :nzA)}FPJpٰպfUT[(.+!KRm6(][9[X][$dy;)x,/ƍu+&hjƓ9lXVK#nPR.t;V\1i2L82L<Ϥ亲H=.)VDy0l=&)V_Î:]RiZ۾:bf9n6̍ٙ~_~TƥU%IcԹRC,Xq7NĄ^!=|Ѫ>RڅZl05<+i[JIJRT.)$bA*/'>>mhe)Gk8.wu&ERb Y 1ey2eAJl;`~56)SyĶ7R\-< >^cRBȵ*Atv[[K T9!lM,.цYکddlט&%(&`Bbى:\ +RZHR^o=n3کƶxtѫr5ػӋ3g)<'3S1Pcpl_ZHwu5SOiK66VQ57-V%6v 8 j)J.09!]LyD(#ccR!eHW QeD['8q-.Ƥ9K -5 _q'L,95T;($tCVD3-8N[ħqB%Z,t]^G~F5:p`0` 0` 0` 0` 0` 0` 0` 0` 0`?cTS1gO.~,P2%EaKi (jG*Zsj%B˅X]*T)VYAG9͋sd̉2B%K)mKj'TQho*DG%u[DG$>NjlBЁ l^.ȒQ"z> wQeBNT+pU茡%joJ:Aq8sDU Nz|ҕ-`El {=9vשOI[e.6=9Nv;,6YS*! sɧɢ:U!BV%o-Sj4zuJAtgm֕*BЦPmQ>15;(N; շϣ+6\QS76bs䖒-raw+=\mf7WYLZVg3Y] "6 Dԕ6ಒ|~b~+~g],BN'~;4C:~bdH)ƁCIܫm3 Brr9iKJl7x-ק"Pm!;l;ͺrr k! J'u7Mφ W՚i2ӫym;웺,% $MԒqrמ]mqU6Ƈ( Pwo)&uj)Ca<^'ϔAșjϢNgJVeIZLQM܊!iR< ٱkXqss;1dD֫T7Nc!qVtp=S݈(91b^1d$ L((ZPPW~^\&pmK蹹qi V"8 M&-PK3ps.ُ6:{̣U:ˏoe(K!%n!NSG٪9_ l7*Jmhf/x^};? y*dCje.]TnꙠ*i )JBQy︰XeQ6)츃e2)P oӘڜuso>pivkitچLu~Y6 "X\5wnº\w0hFetSLjd%:SKue]YH *RO@:)"fΝNiչrMIxhu08ʹm!!)JG@uǪQ=\jN$xqiŜTŕ9BS[Pl|׫q sgKƄ %ͫc)p!9qyپJL=dETwc|-6!W)j3=ztR&VHWp)83Aa.0%dmWO6$=3E zi!{|DMucUJL9tԁ~S:[{l_\$L;7]Nm&=3`/@GGcERKv^rRKHG.`*M6mުJoůhqqty\GNQhSCu> -<TmA@lFO,7(z@AHvCJ+q\>2q)kQ7ROyG{iNCh lW*]%EUjBQR[F݊T)W;.wظa },<`Q1G%hzYIA0bx7<1LxbGv*x-x`:v*\R̊E_3ſTI(W*LDJa ̎9y'[cl;+fuUCVR|.dyt%MYz[9[yq|>$)k'TsiZ /e+mùhJ\4 LhM2: #m^J7x9Ak*Rti.!/Jnnh܆qLk:{;ut0Zً߇8|͘h"-)ϥP ~ .L']̓h88;}ц˧FID8g!ҳkuf &tQ\L!Rlnn[`AZ6οx Ġ#F3z! pR/}uřOQe xm`%!vԓ{|a9R3a1I~#VUl\4.%j%EnǎtDiJJu;փ*0 sl)T,mJRlSq ={a*U9m/툷u/"<܈n%*ۭǗɊ8TDPIUwǾF)$+ZZNF^O9`ЎG[bnOnZ$iPM%*[gpьd|؊$ /o.*Kle>˄ؒ#A銁}pgI+ x8 {忽|xC1Ɠpny:bGIQh2BCxxyt~MTåvMMl T%$! /`/`|քgj?"%Awo7)W<1̫VxO j߹Ջ+U*qX[y̵&(Z1>\ZqW8ÜJZqxb78Ĝ1TD3YnDI;,].R pn8|?tduS*C26%女y) JQ&)KR}uz=1;EW,\Q{[4QC>sN4KS2&ɪ0O6/8@;\"B* 1#2xPi`qwP ǓŢ t} ٔ+Elw,ʩ`OJŵzءJ9Zm\WŵǫUeŜ@y8IRPj.Uu*:AH < X "lR1韆dc'_#V"pGe.ԊlGjOnA lkT RLG'0¼e´_o8AM- LխaBj"|"tS, T';@Jgܢ!JmԄ$=Jne䘋rZnT!iqGR? /jǐœ[6JIz!ԛyN;PY,UmΝ3p`A6 `0` 0 `0` 0 `0` 0 `0` 0 `>:3MV ߘkjvuUJ{t%A!nmXY%"͍bRNB(U1,$f@/%u}YgMOQ?،l޼>SUZЖڰ4p83&medfG֦z2#% Z,$XA]D8ܦ[cp/ߎqDMV#CaE"[1FnWvGtFGgECӎ"M*rzazɠ,$4 mr1^; [C:&PaP2PIHEθlB  %JO, >_?,k-J 2Z= *y-1ArЇTM,\&6kۇFf;P2CqHQRoǟ3.f\ KBt$cpGfSJz~8س)>DG4*pLQ^ 8"JOp?zi_RZ:zqCYIt{%yݕtZju6 D $ Miu2qYmǘ俗s1"Ɯ߯ϼHq-S^\u7%;##LB}GxtǞ} Ci*JL\Cs^MfV؏! [K>DEwGW{w8^V$:Z:ҝdSj*رO"dݼ\0jB3ƻN|JRWNഥ-o&lA37F쒞b" 1 FBRĪvWVܞ6;w`C2Xv8ytŔAN#v&F>S5[>^O7RSb~.|CT Z.Z$35o |V[~2xHZ?+ԤTI/ 6W66۽[2);8k19Q2Rh8Ui$a*$RH7Me+$Ct<qbsyj"aUu-H)nZgup~MO^|Uv]*J~I1Nn8)mRT(ZJJI$qvl1*Rr;(ZإjbӋKUYRq)O.-ժ19Wť*=R1'2[RJcR*)Z[^\⥯hŅ*N1'2l1Basn ˯$\cq+(t N(Sn}u+q1R} +\hRF*+:3M4(_ >Υ2a6))m~(A<0?5Tf ңNj@V׸w^k&\|po/wˏN5IEhoFTN/" ̀`0` 0 `0` 0 `0` 0 `0` 0 `0`w~LSpjiZˆظ/ Tϥ3M%TMt%h/nIH1&F[$u/~jBt׻eOZCw Ml{q.D&){u8h$:VcΚė`EU{RÄzpAM%+q{mk ¨kO2,VRBI'3y2gSԞƾf 'zueڠFޜkF )HYkc.**5Mfts`o>9ڕT*BKʞ|n!d ocM&kPJov<10*ݛODT4f)P'[3.ŀƎpr; WN3aAj}I#*zn=nL6eQ{ 䂭RGKy؅m/ǩ՚R>˭ f =GK$<6R m&cݏz\&eqZ V=Ze㈜H\XcuŲs+HJŕqǮ/Q~1%.EijPo IP6{cEQC Q%qmYI[Z znq\r&DJYa݊ N%*ڑW Eg'\rGu`CN-*zB?2>EfՙÐiLpc:|ħ 6 V7^=CVjMv#u3zˌ7*V#n9S2Rt:o[ȑPq$IEvS S_JJISV6' k JѻS!qTlnZl ~f7~oZ#E8 B`D2qRTXEH4T m'ɋVDXxtoT |jQXf@R eD<$4  'N7Z]FjJzDڢ m J zzMf`!*ws P H6Ɍ| x<stDcyU 4#J)zǜNܥ]]"*3SuR˗(WOތ*=dܿ^ mh$uV*̙O>Lwmj1W#X@=BKiVVS1m݋xYO$ό$ z-<5q +2v,yԗ.ϥ (XyF{^B^WP<iIQt${ve웣Q35jogYJtӣKG5N8kYC5)Sk9%\f1+/$xNx.MBܕ(O-@[qRm!H`6|amK)nv@e%YYxbWo4)Σ?Jyۃ t0` 0` 0` 0` 0` 0` 0` 0` 0`WbMQ%3L!y.:ФV\xZ-~$S>pejN|J4ŕzT`+bj|?D$ZCqЅ%A'pHd= 8΍(O&Aԙp 7HM}ra¬miԺ1KS_R;=jzNkb󇅣j$0d0SI}XԹ&˕ ٤ϋr'RmIY4vvz>{_}Kmimw{ooֹ1u=l @cS*,,IChAJ:Ch~LDEn&*cHJ6x2+lSXAj[Z[^Y\!O-pT ϭiFӧ13=%-KW%*H%-LUlJIڑsE)3`QpmmO6i\mA(D zakjd0SҠUmI6b>q%U5͕$ `9[YVգw3A-6Lng& r,{ d1vG&54i%I.plb|s'fIvBZmעRXtU;]=N}iݗ+򠶁o.WmBS XBI66vsg[{~^&kŕzn Wcgs*-8z,}EMNiWBqeՀ;_Oz~f*u_o9|L +~CkRLH $!-2H Ŵ;.О"EYApVrw5ړO#CRQb(\x̬o-R<wy-݊(f€#emCHBBR 1k*eRⱭUZ?F=?F/!Wt'͍eRbNeåon{|yUʓ'64Z2Iȶ-G+E}җ#?}\xYJ^*{yߎ*Tn]BЄ>R;%)I 4OWs>`Qa.- e+/;Дظ@lb"ykn\~eV1YܤRMx\^΄[mRCqčD@":6E@y\:PՊFWa1 DJi% ;SrmEJ=)OO)u^*%V/MxGKL=sI 93f'`"3kg*rUS qB)P=xZ4*Tu[tzSf].q tE0` 0` 0` 0` 0` 0` 0` 0` 0`WbMQ%3L6iT3fcLT: nůĚJgҙ1PhKT"vH(k Tv |2E~$H#ĩf*N`f/ q.kZ[#E˓ȌӉ68nt9M6Ѱb5cdJYl<r,3`QbTjFRzAiua}p8hK)EP)Oٷtlo-SZ zO.:UT0!i<{8Fk+gj\!Ͷ*D;D͒ZR!$ř;ҡ%F?-ǐMB o'֍5₎c%DU܈H݊x˗0DhlGOm,+3DPb1== {qKZdZ[$Ykn>dOTM~EZf2ImW F[Kjee ьD2Yl.mKY]wuOFNOr}HI*Aq1d>r/'QxE<=\'.PRRYD =&ymY1I,-rf8;:X $z19I>㐢$tn5L/T9;Ћ5رeV".7t2R H 䴒p)@x_8M˹EmO-2G!)6Psk{\ee0E>JUc~O(?#rbCΣIRMG jZTOcj~L%":@@/ƎFé]-ARzSq{mԧtEJµztQCRXn 9b;wR1L"eܼUR帐L쫤@ g gZJ9lup} N4+6晵jRzu`Vd7%NO1.6HC^ㄨ)wH9`q9=GJS.oo7WG$U-ZtVʮWTҌjDRP$u^+wSżZmj V^`G8[xi*QTCq+pΓ`7>BNTKh#JTjdVM0Km_TK{ۋi+ҷ"{HoSG)ӚSVR {qI ̰!!-+pBMC^bc6WevwnYۛcpZ; H=/}&٨YZ3 YUu[Rt$qᦓ"-&{SF̩a.E;p%`Xa{wXx2hzO$]|6⒣c;PH. swgh WQe:lZֵA)RE ;:s ,-/ oKG^:p䩡5Y?͒ҭtp+{RyKE`I.Xy{Ic'nOi<$G&%\i1'mx8eF!cM+Ck@Xÿш07#P٦I55>łM—{3z>˺"24ޙ"RDuS2"Ƴu}۸=chMG:Ҳ?!̀cn]85*>\зU=&Nl6!L%%?(|^i5ɧm>^bei) WAX87oʜ)WFE*B=M/)K+H#ap&> g[.b:R7$@v3NTUElS9u%+tap95PR :J`Z$hؿW'(7-YI _*dw2-FD8ZZ-6=7 Na<+R۲Rw/&"רٖa/\ؔO 0ۜJA^\9RJTF< 6qM4#Y:*2LeKKy `P 1z (i=ޞ罉 ˯R8SΥcMf\do޲<þL&BU- j 7(Z CMIA~eB܎mؐ x ujojʼn qt穘cfݔ|O*㢍Ov1YK˱ہmRg=&lĈ @ڑ:0Tm˃͖(N#·SX;lbDxg)hM \'*CSQiӿF 1їC 0` 0` 0` 0` 0` 0` 0` 0` }=uK:gқ>ɰ{#QR i`.!/Jn$&Լ& Xiº5oo0H5&%PZHamG^j.T{_t4Ƈ6);\aEu1Y +h+X t ֠ܢQ벙nZk`Ke-/aG`FC ׬UWD.lB u(JA+zo1f.Xv+oXO蹳yQZ-lar6W1=G^ba&`zj9QLZqK'h RUŽ2˪̙5nGʵoE5٢\^J}SaT,)Zɣ9橳0Re)[(*qf9LʪU^OQh1-n{m&L❹QO}|+2eW3 ۬ej@mj ! JF:})-lyn Vp[tŚڶQCj4)I+OAw ?S"JRm(uF0eU}cG}*#ȯGLu Nʑ.;J<u>Ny]GM!ꂍ:Z?[!ƟcU|JyMt~N1pRnWR6ʓ aV uJ<|ў] EHV[ua,UJGp)5MncWd< #RrJy\ws<Ԑu˷rO͇Tġ'N#{$tGh,;N$3:,^s{l**P b{8f+QR)+)V} sIS虜:[dW1/NfQT6qAцdX=(˵Ei2js;9`6alդS)|y)6 ֺ39N i鎧B˥MRJkvSQ숑ޑ;![$kw!e3UuT.M[$b9;Y\z0[C$+JH=IrMN4e`ezɳĉ"QHCk u#H.dȭf:\ymQf4 -nI8jbԦ:gKL6АqFŪ&۔a WK[C;f6DrҒzFS`S R 1Hf&VV#d7EeCH,9M+lo*%%Uui(C<>b7ڏw3eBcRk#BvܷvyER:t\#}:.g5)G VO gqQ$u:cm4hFAHTUAz{HD,[BSUR\OMc=.G2TBvm  qr ?Zn+*TbJejRԦ4n6Lt='4MUJ;D*@)A1(aݎ~*.vYwTu=Kj!th(Hn?GI)S#}O%Kd$ GYUI*HOD O>S5t2aN:Dz[c/ B2h(qQYKeImnlz_OM_ņ9JV"zm|^mbTM]JӶ N$ĪkIrJkh! ؟P/ns 1+أ/VŞꚡ"KH @'n\yq4s?Mw+tRʚ!(%7O`V.0V@lQ*PO^b(*ɹxC\M)lȒNJ%Հ#o('_ E˴z|T\KAɿ[6>DAt*;tJ]]YiK $t/'Kf9rd%M+Bvό`K<|jy -mɄ9KfuĈ4 .Hrۺ[1i܌Ѫ3#(uIa QsKM3. 5$şZ hoPV$%nK`Ü9%i❚HHYv2Q!ڶ@鴑tHe%Er9r,tG@_MIk0FcS܃K\tCK2vzEB }t8*z5#4}η-fn[kqK l $J$wWD1 ZR;j{u_Ɉ4FqL-r~,J̞b,R 6%'e(cs iiaG{gv+c|m2}L wSSAm Ǫusa(=t˷BqPW3(=F0ظ:̰mS7Qlȹ릕G]Z:YeTˢvosAO6SK u;$P9s&RYP8uK(jEQ,h;iq |q[Meď/QKr;;+bu% l=1 Pr `-}\:|>jMJ*͑U%Kmw #i%zyҹiKGwo?NqxJoؚuK Si*qc%n\EHZЋ|,#BY>S{ + _j<*ţep9iw|j+/Qll*TEZOQ=C[reE!JAaԟ6wNcJT/{A{O64ȯSG|*c6aH݅w/)-V61"B} ʌoGLuTJ4sY.gN0"-0`0` 0 `0` 0 `0` 0 `0` 0 `0` 0s%p=7M5D+sy^̹m nb;{3ڛQЄ5>6&4a1x1r5ZV0`iԓJRef-:i'H42қW! *KiK Xb,b{G$Ϋ б908嗜<50:[{#)M$\G R_"Am'$m%JT]˙¿lU m;.by%.2Tq  Oj`I-Abd4xfäT+za*ֹJcMb\_)QKrW?ϗψ⏺A` /$SN3&$2C=kH#ƶ+Xp(<0Bo֊8n bJGޗ̒x\pJ)$&Cdܡ`Fp Ke[5/ b>\fg(1FXu.F@nFn T_"y?'qÃłBY_d8joCGQӝL-% BsЂ =U[)yu7̕KI1⢺#DHC ,6) z1KH5%~U'$|"'Dz2WMAѺҩ9rd)VR<㓮qgamTjNZ$g^JTcu[u/%e,gG[-ʹkBr+HGuOF7~эZ8pTf=SEd `^æ"!M-TWȟG̕W{Na uy{֪\£aaדc- vFT |n뫑sS]_̓7xs$-+qYiK768m̭AEF>Z"Г',|G;Am[pZAkde5lɕ'QT*+yyet*tiŎ-U6.s[BhPGCrM-p`_"_;Qt~}z;fs^5xjΏ>Xyn7MI0sOG .K^YAae'Gp{㻋ڱc49[,,h9)ly X{؉+hy|2Si8IQLdۥw$*{uiY@IsS<}K9wFdGSHRͲZR︢_gMև&YV̰m[?n:J<+.%'ԆiL(#֣gmS|np]B[?s,$™Ƨ II-D&Yo߸>:?jfAeRK@,ⶊ{_2[[|vI(Մb?Wzu`ֿi!qu||=%X-9#h#*#ax!{KuW?h;ϋ/?V<ʏP?xq=yb{oJ ݜf/,']qiYn"53-=ܡ{D:mݙfGu zBTܧ2x5&vDde\oj**Ю?_aK,M+s}r JtV(&|uKLK%˭[ P%JH݆BӚަvDk6N*9_5NyڋvR􀥩)N h~MVZ_Zj&e'$:اbLjk2Ժ*4Qy%*bcMu> P?^R[{›39\ dٳƽM+9gNtLFԺ6j=7KO2V"󐥷N%4%*si[6Cj ƿ jLk5.#4?jQRn=#7oRjR^mYj|T,)@g8Yq泔iQ2? b՚[KZPm hץYHz?[tCJTndaHHIt)e)aJTH,UN0{wtLXUw28uL }N6\î-,IqJ ٵqhάS5s ;64RˎG5TqiKn%I} Z$nRrEӇZ|JʉXsQ/ӝQ j"qN Hu+1`'3cE?~n'3`'3cE~n'3`'3cE~n'3`+1?4^pzHG8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GW^GƋJ7s])G8{W^GWb~ ht}?Г:p ڏ ڏ~np ڏ ڏ~np ڏ ڏ~npqOi=t}?ҟs7HZGǦ?hWoSpUDQve5%>PY=GƗJ7s])G8x*!䞟CUhUX1ҟsJ7sޫ0'Z~ xkQ1ҟsJ7sߌ &ު¿~ R(^>~Q1ҟsJ7s#0JIW1_)X_])G8=t}? OD.܏%&h6NQ1ҟsJ7s߯1>jp?܏quMN䟃?])G8=t}? R@U*1nU*y'?4~SpzO?ј$aUc\2k?4>SpzO?\2k?\2k?4>SpzO?\2k?\2k?4>SpzO?Әd=6Ӣ{nH昺z*tc,[ڑ^ʜE;ԜÐ|ܤť朩M#s~\i1^vBt <)y1Hm5 rKG^qSY)xӺUS涳>ʎ(%*qܶ!GߑZaFlXBe ƚ_"+( 9#6J$ ڊJo$iGNZPӳSlST.-)D+jnhSdTn. NsC9Jt$8. U1EGfխ))aZsSF~$i6ha96\OcnZRP-vjNlgXB0ҕOSɩ) $Q% MI :Nvʓ K?cd9;%.>YHRA /guC?VM{,]S[mؔn^|5ag҅[#ݑʳ|5J2QV٭߇aXӾT&U!z`-Eօ] \ Z>B)mŪ/Լŗ|'}@ɧxG/亦}ͯq6=(5:s3})p\t <1 \OImDf;ϳU5kќh0T0l4 4.g  t0` 0` (EHIp:[ (?"VCFuiKg4sc: DTh%,Gx% I[i ̿z?3ҮbIySb{9w]*ϓTY~JSi]O8} R X%i)c2OC[m(YhmJBG.6'**}ÏNlo=3rOٱqR)߳kY{CJu ŕ>cc¶Ǖ>afv"eO׹C )Q>K{qMv!(4I QwF6vf,(K[;VOXOuǕ>a3zOٱfd* oe> --nw^o%R7?\X|˕>c,6Sg96t *}M\ynˀoîg˔qnO)OE9Od} MGiMl!$ܐmMl뭿"}/x񻮀XϷfl΄C??#Aa]+<87=+.Sg,tWPO,>AЇ:Oi?q#47SP|YW񿮊U%m@&T/|'4OBlknRks~j k]?"~2,RxQMBOXr̬NOٰ+3mz%5>Gms]¦u,{lkz}Ǖ%DB_mQC Zokwx3L}I"_ٰq01 #t' l/sG lG iW2>v^?z`Qɪwx__ny6(gMrWL\u*KQ97xS?llT3# h)^>̀J8G Ue޻+]AOXx X@r&$T<*03I/U%d+ c9* )Z\U'/ResSֵ㮤ZGD<+}wO ʟlJd𧨟Sx?LT Q#ԈY`|xAMCe_X񿮣ʚʿlq}-[FG^UEr@t+rH:ZrԄ)_j!aLJYHQE6nBR@ݹp']AOXǮcځʟlKrnSa;e-=O,)6T kEɹKӚEą{(7Buع`~. tUTe0lxW̙PX׫feîcmd]lvH* ׹Hc|ͼV[$sWAf8g><{p˔e 4H=LR-o՞&$ |O+u_>~<;I$?&QIf|„Jqy9Ga1 nm(* 1|%JQ quO l7# ɔ։H\pHq3M#ŭzΤ̙ȇmR{K[RXpf,,{pkʺʟlWjVi=)'jZjTGcְV;}јjJvY2EңZ[l*. ]A[Pʃ_λZ~2Nӵ+#HT|kXXhsiy['j_jVGRZiV. ű*j*} \GeσlX%aʩq{T1sU.d~ZvQ0Jk mG-k:z5Zc* Mnb*qM$־;\4& Q3G,OvBUq<ۍK {]T?"~,8Vc_O6%~L׭)smC8ʖŏ겒{Ag7 ^*RLnF̜HWSU\u02̹Unڥb|8S8i}Iʅ's>Kg sZ1`J rgmPmB`\{ߘckG: 9:{"}8\ ӊ.?keO2U6ܚdl Vf; uK &k3X_خVۑ>CNj:CTBn>T68\k/I]sOiMu!n!\ǫrۈB@*R$1ve |C'BLh딊d6T ĥ0CsϸDކ2)LWG{> 4;V-A ɟ}!`Ȏ=)N(L9wé6 ?W]Liޝ 4BSZcsURuCڒxH#unlnq U~2!esVm[ܠXv='kCWɷ?qvw;C1f<&4WE溗e6[ ڐMj[R%j Pvs]BU]q)ZJQZBNJD Vd8*2TRad*U][Bvw)Mc j,_N2³lQCSm2$ 8 IX Vdua⽛jWz.z]]qԭu'Zb)vz=+!TT)̡&'B[%L Rj&nbS8>14!+zz7N۹ KM#p^i9s4ȦIst1&4-A29lb@,Ҥel3֢;oίǐ>Ym)[I((**@HdQ6mmZ\T䢭{it޺[g}_^6xJNR+ȫgBrMΓ% VǖҒ`]}{`lQ)ܪ+zwX}m+yn5*Lf5>R/){T7&JB|:Ww cr4jx/ٹw˽]b:tW6 cG9)[<7f1q}Q>_ƙP ?I8f$HH1!aƨwo0ۤD6adre!6LyDC2mbwo;>#xps”^H-E祧'/ʣ1![M(JTe"4M)So@+1XYƫHS9UjmF̨RYZдwI <6E1]( >=Kk9ޗء0ymOKx?4} H6Z:'s/Y#;~ޜhAcRy\>KM勏&5iRl$~80KzN.J ZۛLe4NL\@uopw`|K'6EEIܥ}.TLe)ұRU}R@™3:a5jh')!67J? eszR c`*0ps"'LF„ܹԔOm*h%[R$Raz3M.86uJZ'&jAjIav ws|3.TQƇ *Q ȧ6b[+awګFw ?WԒzmLT?dݯhz< mԅ6M}uXr>4z(Ձӂ!qhnBĕW-d! AtbWMO*jujB-I^$US.ףcS*QnVw#I_ဥ;֪Nֶ.R*RM٭U}/k5KtYcSPlAigJW )?/,32:3h¤^v@}"ږԴ\p%=ZVDx>ZJk9) 7. [(ui%AJx_o#ب87*ɭ/)\mm?jM?&9Z,"tjYh?5!!J@ZRzmZ-7eZ.?mw%d;n7P<{]^Uo$#Oco(=gM;TRr!b:a( sR9ImJksS0\է}ԖHif@B,B'mm%96mm{sVtAYէk_k[k$ݩ 082˟|p_= P=+Jp|JNop:[0{#zs㊷ k_,z S7 NҊ* cWPJA{nkn50Mc$ RmT00{x%1*$tZn1 UOzdGxhm1dAnZ'v}3aR cR7* ?:ꔥ%]Dat#SOY4Ȯf6i^esblZ6ꔍ zمM} c*BڽZBJlP iCHqcm>>ދU緟sˡ u)Οewh뫲ݽ-}7]D F[5%'ra6:ꂜ񔰐Bw8" mA(\7h.YU5,s"huuC\$)ė{\Ups9[Dh]/1a/åة (w!Zn~ZuVѴLz+NGe/i!c yRR)Rr18zQu8ͽ9zɴ_((b*9c;b+lZ=C0gz*T א-: u*ZK$^J0NCєPoh)Gkъn}ȓ3XNr$*$7b)#VRc)uu:)AIAIJ;nJcSd!S%B:ԯb]YwMfyYNuN1nz/r`)BrɭT-5~rt m%ZK!)\q 6ۥ [ʦ`eAP,"Spz,JT ~DU 5/j!tErۻ E͏$%:J%!ª_j.TLo)Xֳ9}_ %&n]_avO&rXT?jZXJ}&x:%qbdGBrUZ؀8:n|_693‘ҏ c: 8;<J6o,Nby'-~}|ZG./A,t m4[3Όiu<˅-+MF2&vwVj\a,xu[qiqHq$X qcC[$?|}tO/z0.*BoNN;3ݢʿ-*EYJ㈋.+)@Ja-6a[ި&{J5KMdo>1>8o~jrF^ho@W'.%՝ !+uHX@Rwȸ#"<%m.Qgy\dKˋ|*jlW!ٜHE Tlo 65Ίi ;yF |vDR\% Ft_G-Quuڱ6T8(OrNңqs/JȎ }5xJYRӽ@KbR=AbڡKʑܙRq!jtWx[ ܤdK˕m2Ffmn&9euhљ.:NPʜ_).Tu|;wQ\#k[7|tÙ.F]f_DFה cjnz:d׮#)ڳ2& NT)m Xm,!NTl)臐M3)=S4XS*ƸSLtO$zbD*3k-^2E'0f*,I-8IvPqOTBp7$.:;;Bkm+~T)kk:}vbQZEH-FC?E}LR`,2P_D  jzfLCZ**II&}킵 T}N>R)~78]Go u :~T}S%J͌}v M:eW234P8-mJY'B GQ{( ᐭ0Ԑq zM~n_'7}Q@my6 mSW.+jnؽ糌-F&:2gNM]~_iގy+t,P|)zC*bÄ%jo KFt {z)ˣO(4 %&=Yn@$A7V ;DVZŢCH\UpM +J~>Z5%+鲮iQUj4r=uv3owF;%j]yS*$huźQ-і7],JbbyB'1eJlU cjKx@ir6︒\QUꓳ7AYGiHyyS)@T߰JEJƒXRm9'[d̥)ZUxH,5@\mII#+'!!~$fܭ[Y+rVw1s,=+[%rWv!]i\7ޤ!̺?R38y+Хƒ&Ʈ|PQ_l9l52}WOT9xLPޒvAV9tl$*IY/;W\ %Nvg-~eZ3_phCcŷV뉲ml>19f=mEϥn fS"G j?_ƵTѥRͯ)h[Zπqw15%=: 8c?zUmOMw3D6ψl1J $ mCM'5%m+ZWf:y{R%Ct7ot@,B~mNX[0XqF¥pI $7Xn` ݚcAf,Nepېڼ!M@r2qZe%+!"g MO,)RȄr9aheQ 9⤛䅪%/W&FrlfiÕ-HJ]r8$,+V-%F{sחK/ta⇆;qo$\͕2U:2OT @2Z $]>+m cwev[fhjP̵u kXC qJyRvE)C u:#3; dUۄ\EEì­DŽSGp(0܉hn1y!eOp|ǛnSN\C8֊Y""B1pvL: !e`ڤVHHQ&U{^|J\M5Kѵ6F"K*S|R8/ݭ))SUРo *;J$ex@ۤªڌi7Smcnz(GQt 8ߞ//=~J[yƢ>Z)2P_DJkxoy{`A/U_30UMP'؝VRiH=ow?9=qKՉ#7覬KGSf>x u :~T}SLm>:8mvni 5> -),)RBMԞtz8]Vm@QcY72k\x-+QmQʔYuhRAl4HpC1uIRG?t#'e#ZVT%;P*i |ր\m(;Bsa08ڱn[i{Y]궲ݣAjTaF*0s++G7vS.Beˬʤ_6&+&қ58W=J"PSf,t&Q)*\e]Ms3`iҩcJS( *))` $p^YRXiSK@ ZXB q]8I4xUifu"]H ̔@J^ ’n<[ܙGOJU[7%7#*k"U2[p|"ͫRʙeg=v< 6[YeT |D)$Hj Qo7N;4&jrSJPV֤tukڭN?bOi6N ~\Ͳf SD/Gl6!z/|?9_/e锊3򒂥\bT(\Li PPRM8-❪hhM\4鹫]ikG[r+X8ů=:}ܪZSmǞy1]Rnj /iIl.GȏG4~%6ӟk|U;X=/}Xi^]98~LO:ÆHðtJ7e`+q( n׻mݹp u:${o}<ߚk̨t>HwZ^ۚ0PKHqq+BSVo dtC[UP*$ԋ*I_f%co%w*)ST5NN5|i4m%Ji+l/bQiuP[J0ݥpEf_v]F{ދ lr-eЂ%Vږ+}48 boMӭV42ՠoe\8%]a+zܹ_"D2+.Ij1ZX eeA)+([ /jtc]u 䊌^5Յc%ٵRZ8 zyNŠEK9j]*Cѡàa!D:Z@[TCϗ ڋ5KM1sѡSL 1h8rov!?A"]l6T•V{ukjaՕJ|wm#g'h7kF&鋴y/ę:ԧgm4d)l*[D7,#v#α?E]$KSimt,kO$!RPlFʹIj[vu[osi,R%JV͔ڒ-($~ .f6mϙ݂+Y0^3D;Hz'$|TΝvA~^3A[Q>Y_Nsr,p0`0` 0o/ݢ//0a[_}1*ȕ/q,7sWp%:U`>JRAmuLWy.{@;wT-m?:ח0}O]n~o˿/(5DMޠy8--=6RSI>I}\{NuX)]f[ GEs*-$ۼbx8̑r?P)ZU89)ėYBB' Z$q.9j2>V"OHqP@!lru T \[\$i\Nݗ2HqkUꔵ9\q]jiH w6OlI ,n+Ӱ&h0jy$7`@@@.x&"[n,5izti酎|ztG54{K˴7Tm*V"IT~+R %.|۳OIf0&;1IJ؅$iA)B d܋G|.JI0;lMԭHnM6klYwceGNxiE%i+׫Z|udK;{(`.: |_X{W뿓OTqtbGP%CtKBM2pƞujڔ]tP +ۛW~ gb=W|2kyp Tv.\YTb$B1BԢ m@>B0_zXV{Db$,6]d2L@CVl좄%R: s]%/GjQN0Y;o|!_ oNr.6̀Q͓2Ip@ ͦűOE\ֳSuWΝL: eIœ*I%O* %J\#9Njp[&/TT,V;Ki%jANw$ uN 5)5 q)EJJkQsnh }d BWM=ee^m&. YIO]xV'z_KJ$UOʕf&Sn ÁMnp)Ĕ($S,4k44(WW.ē&ߑZqua(! $#۸: С-.YேhNZ̯ʤS(oh "m[I!C@)[= G,U2W)sԧ'y^qcrSĀ@;7H7D1n)kgף:\$]q\w}m(I.1mCcP<~ب6p)~`Bρ/ZDÌTe!Ej׆I>I}\, R܃o/0o7p}U̚X٨%+D2@ ښV+ϥȒ^q)[jp(ʅdFV!t,NVk&>6\+u'vq15 Y:*C&ZXA+tJ HS[*HV~&X9v)0ht! v) -X,e.&MTʴM-(҈wugS){d)[RքVBJQ7z!h,K5\1*m$TtIUTrF@ 7n0He՚(4:H]i)Z-A*;ւThF2V*ӹuNKSNkB=I ʕ (((K'delYԩDVfL1ZBз Y %JYV4=)ytk8=M=/-Wf-\[[nh(;psk:On4(5.*=MJB@ ٜt_$wDs|\t@?*(>zߛw6{eԪ~gqiQXBSq)B<_e\gqZAvMH8F)QMT#'B0_z-e(,NE|<ìEiC;НdX7W)Ԛl=.Rga~l#UmJknfj-1Z.1Hح[T Mmqqĩi=GJE37K͐٫Ea7jq)%Gڍ(UqpJ5'nv.G~;Aѕuכ[ip ijvb]鞐NЛ1!{O(Yh!EG׽_x ǥd)59-N(*q֛(wrڱ;B *o4| xLN`eLݗԈaJ)CRBssE+J԰Y.齟AˍG7Mors|u棸J 7Yh@JT7#r,dPJ=rm_^iݾَkT3N _V4$Mqij8>]t:.^B:Af3SC@:3\*m[;>^Uaè1K 'u.ƐMq RrVP#q=4U9 SZQRhY夶 HJ > 6vKq蒽Pbo*B8Z!EJk!Ioq Jŀ*ԥʪ*Bq%QZI]ljڢh*t)Ԍd>z{n8'%/Хbj3hmX)*? g*?j !YZ]kGw Ӌ%Q)F*3fcAnBs@U JJnJ *N^OgsUU LUcR6Ж#(em3e]~LHS"H;+lm+r]y`Og-%T#e\S[KAr- _ݕ+rrAQ>51O=2֦ĩUR6Uʖ#Ԅ%WM߱GX|<3ٹ;4fy7!'} qQe IJ$>QZE[jH$$iޜӨ&uIE-ĠUn%.)%!d !cJ OK<16bӒZko;;|f˴݉cT]ZN-v׭C㘧T?ޣtnJ}=nzmzT#=HȔ[l_.=Qu,B/p>-4G?h+RsI8UGө啱t9`w+ʇ8jBV.L#4cdsPaHIX;K ]\ ^Vc7k[ֶӢ9 LU5;>M[CbtII6Rro~g u#]'V7;0yB_u6XsyT7BTVma+mVy$h !_s+ w7 9kmR[^HQo1}$zD7^-;RoʷZ*mCcp !2OD*Kz|TJdeGUsDWXP$Ҏ.w~@t"vQ F6L +eI9ot_ ૛C5{_˽mK#"=ff_=?wOjӸN$ٗMxW7ډR:wۗf#70` +D__,a"»mlQc֎riPZBP-BTQJSfcEvA\ӹ[JQ⌡YJV^*;sWeSSMG5}'FGO_lp^Ʌ>9p4j*BI IB{84:-ZD4/.B̧i*]6 $mMs_Thaj_lpʍP S)f JZpiTHKHH&THnM6kKD5NXBfFVcJb"Y8 }DiCiqmiY#*y]=+zkK-c3l,|o|IZ߯+lp<vNԇ33Y*)1Z}ʿ-\1*GK{DX oN4wF|k(jYUd(̙p>e=;ԗTIJ|\pP8Wn(Ѝ*j/e}cT-{LT1R0ݏe.gԟ{U3O(=pxcvry>j\+gH{bۻ}+u)PPw%K+ د 6p'BfsC.bҔZУō5샴rN)WRm9nY;TDg&ϝ7V3!C2 NUԏ^LέzEJJz*4D4#deRa#Zq.RHԍQ쩩P8iwT,U)g[yoI5k@P͋yK+]z'W}ǖo[& R/Q)(Wӡ<p&GoGRsG#| 7;~9>gx?>Ʉ%io 9;g2FQ*j.wCyuIu7NeRRqp_DCloPs}, 9(;n| R?9}F7)IQs;r%.NJy11[+C2\եiՎ8b\E˙^1WIQnnǖp"I,4Vۡ QiͰ=LysJɈΈ3Y#!ѲW빶Wҩ)G\R-[׍̚NLRmJ 'ca?pH)}| R F]vY y5jmjBTdJRh w$*TI]0?C5}Đ8\Q7m8R,Xg9nGFGtjjqJ)e?Z3WUR~i>d{)ruQqׂE[(] Y";*tcuS(h6PTiH[OjLҳ&vVVM"O y"a Ny,-Zu]^ꯧ?=yz1NKPNڢ(E`Uv-VI 6i!RHZJÃ?dؕ_!rHqކҒUqu%E!+d%!C6?t"Y"3LՄ_G4b{Jn.%TʁH)X +R*.Ҫyv#T5 >ӡʏZ t)p)"k6J/We1էǺ$N}[RN-iF΍8)E+٫+;_54=dtFQ<.szK$PwS +2&mH|avUe48 (QY'6{᪜'h/}bo&-4S+濶8[i*;J8ۚnU8Txka9~8~LjeƒGk毶8RrO G hJTL]?5UԹ&91܁3syPqhUТw/i 3mgEhc%N%ŷ{NuW5gQ%dլgZ:LӷUajӽD)i]ה쵽~$)9w)qZ&9c ĕ. ,)s`WdjBuJMk^Q2/$jꔡ&9,Sl6i%(p9pxpOt_=Q2aҠey; yn7 $NJSHumڗ4CL7Uk[D~TMFG4xi.)Z[׍̚Yej`3I8,L9q74[}lp81+}ǽӓLi@uRyɎtԑ@CaQXI-96x 0dn%dL-15&FCJ kӋ,Y^I< .:HѲ8Le_>O5}I d5k{{u5Znѣ;ZMo&w: ~S ۋKg ~Pjǟ]ϩ>f8gi.P&eMvvb:g-ĹTY}\6L.4:oq?6!u)M9NES,eg B|ȟD/mԁ˾S:rżo;[% hv߂LÂLPÜU~c5|~(?$|TΝv?]A[Q>Y_Nsr,p0`0` 0wy E$XW;?#/1E_a%뎅l@؛g AZÓB|"E_%?%$^?:Îss >ȶϛ qFYpfN6<{s׺.O [N--41Bd$䬋Fp$6?X> qcU5y?zOlDbWddl;hi.O2Ė]W5Ԣ;l>[}J^`sTCO ee E m.)Y-b3q>ZlR׾P' xr~*m=bv^1;"˺{{Vq=J}-@58!} },RJ,R yTroP ό?C@fJ)i~?},p\Vp:T3.(L nssXzl/4.3oEZB$,C=Ҕ[7 [%txy@t&fj蹚^z3Pʜugcxf_L J)׏6lu8nS.c͙hHf4T\djr Il1ʃ E"z\eMI>%kr>췦{(GzЫRm睾uݾgN͏^2QFu1azޢ]\9\۷3m)䬋FqH܅{U'vZ^ӹ2DLDڦq!)f;%L;ĩ~4{)Eϔjf$2 c/Gz6.X*e5M%I%6%f+={HR{6?V h.eɮ2H[<aE0蔉qdmA{9YJcscSOååsKl'/S,Q:2"Aqb4$ /b=6?[k+8Ѯ}Qo\ 7ɘbֽyé"_ckbR@Pz[_BT,,H1ubCqO^ oq_ZA'UeR{ÊV# w q1>"v%Wċs 5W{HSsJ'f\Wq5 -mԼ0!e0Ci[f䂒7J,RQ\>=Rv徦.Gyߣت2bTF&uǙDc8w5 $+IpfN6<{s׺.O [ND>|tL 5eVZ(Qa2OD*|xDI-4ڔۉږMI>+SYP Hڟ0j=O! ]X_0DZi~x B'Ks\fLۚO.^zO+i)u l4'͞*lrr[8ݜBnuBc-#ڧj|.k5T&+'ue .D'ޏ]d"DKθZWn<=p|*m=bev]~w.ٿn[u_$u)g=\؄MAeDۡI?ǭ6Tq N* l6=> $_lTmڛzSo+椀B۸ Kl.Ć.Imԧ/ zLR1>kZ8ѵqÞo_9n?Gr~f{Zb$Xx][rAIg"8VFg\ϔJk:%/&Q#"+LϨ>G[?0$7 kSi\Х3,Hh*~1})Po)I^`oT$>|Wo*IQ@aZ|ANJCܷ(ԗX}`hA &6y!hG[>[cX?oB6+3 %R bib{mCۿd˾:{IOa{EFp?wȬ8t7!y(ā~c5|~(?$|TΝv@4y9Kj'5Knrn^E ߖC 0p*I_H>AR TH VtP';Co-VS{.ʵGQe8NJq uv@Ohbފ_.=GG(]5!]?+*>1 o Ih>*߹ڂ7O͎LZ9FiHd<ZChfEԟly7( R1J&|bR6RTTlIq*Odcu?6QS(Dzhudu|bv;$O⴩$ %?3M{J/~e1>a)'bR{'qM GW)#PB,uv/ ouc?zM8?#@} DӝsKI A GorrF^{8dNJ] gC&Ck+b.h7o@_ 4ʑɌyт Ji?`n/Ӂ'6GVSޮjEأzA1F^J +o5S{-@#ɊqލzN$06wWdZt|c}=L*>1IVoq?66ڏ/ewSGO *2, 0| Uw<Cuy+?cܨr]ebvBs̴p|cH!N/+JJyFJ3J 5$O_DuQk} f(I;L=~)9BW~UX2PSJuDžĨ\s?ݒq]",ʌ1!Jq lTB@͌["A 1IZOsMn6^A>HSH(_ *I|OMmpI?KS%D?_b*Dur/&2^?[<{gٮR_Nmo#-N=x& j>*KӝsKIwi?J ?}?UA9ʟPJOPR:-M>["XNhT&ȸ `'Nq:d%zv|So쫛JuOLVo'9?[Ҥ,dzٕhET e#3 J+ ~)e'~Uz|EW.9IzO'XU{>u!GCp|۝o)?<}~eքeG&9}_,BMG*kQeTI*j%+`^O%*tNӈJINNi:E'1tƝ' z i-GI( b'poo()CD+&]aŠ7zỸֺ YFޢm$˸p;hB~_13O˾z;Kj'5KN'd/=OA%嚥t79?/"^G  o! `W8:'Bc '~пX}Jܗn9|>l=xT:*eU HR@U eF7J(BI'JE\mte:0UnR ⌳pqʺ6֦6 \xOPw$m#I*ȊxSpdW \ZwV#Oֶ #=SAAns*R#&]^k)$) qA$.7flGli PeRca68#KmH HZ<[$n46#.D0IfXJ\*y8VCd2 c**9RIx!ŗAH&|BAWB[u֝TӌmfI[N]nkK 5:ҩ9^J4]Ln>2Z9dH~b\ RBAQE?ϿuAq#}ԚVm٦լC3JQյ$3L5?/kFAf>v]hȅ20 nC[o@B$ T=7iX,$B Mv?H)3jfw!V˯G!d貉 RTBR īqF*PRJ[t*|k  Գ:)˖ᵵjnֻh泜[W媵[ۂ9HZBJRG"Θr)BoI۵"Mx y1%iJil(@7Rn.}>Cp1uܿ#G#үmc]nb`sߥ{ة'6@T|$$Bq~G:cz0m*~Z<wOOc6>A}PV~g1v w]6 7Je5HkuYV_}?6>o05-Jn(TIN2$oI$A[BslUtz1?zf\9dB:k1Tsbl cHmƠGK :H/)AK ,VIk9Sރu% FJ=6]w.!LW1H3Z n;Cŷ<!j$|/Z4٪(dUݡL%|6zȡ]/E a+4M}L5u%p*qːy-3:Z.nIާbsj$O4K1em 36jtðm>6 M)+z(۬6i}չkpm8}ҳ /BF"Ng0cCxVt$@*mCB]E'2@r| =6o8GN|Ǻ5|JrX˹ŽRcns-)j-TDwJR*z|0g*FKv:Y)R$q{nsm&&.WOo6X x ׷jo?0[8eu,ZT'^ZV`]* ;6\ *yg-$tPV6t!8KR K ޖ A wej,{#mCcyX &D KV-u9\WwE?W`$%^0Ob[Z \=ATWԒ}cI6'h#xkR꺛UҐA#mSo[{tI֖ZmnJd-ԞGw9;5srVN\W)d!ڀ ]RIZ;JC)#8JM7Vܚ]iu_<?gdFKfjS3Zi6rԖ?(BAn1Z\6WZoMmO`cK2Z=G/ S+=Iy< > }jI[Gg\«ɕP P鏉0lOBA TO, 5L( ;yQ ( a}o)*11Uh0̟n_j+~3r z0JRER;rWHtYB!anҒnwtRz&3*sU6DI 4:Xۺ*UE8B֕KH;Blܨ) 7#mn1izm}My]4JO]/Ps ΩOu[m{\= DG}h" $HRc 6 i;EATݬլQ-IK0@ &  *OB;ĉ3֜.7Oq(JyH#)ܢ `ks Os S}}N*;?O<7 Qaי.ˈ} [RnEOBnFJ2A0y[a2Z.%xõD-~E85cmå!+(uܥa)  4R_$. 7. ӪX´RwշM>- F%}4~D#qY?^L7LHAj)BPI )=%yuPZqRM(ۢ >Q[ 7̙UĪ[HZenX@"SjHZO$a2Ĉe@U t  VSik]կWәSoE%`<|0–w nu=[(\tK%!8ej|2ʃTd&ɿq k jZYZI]e[RZ(ԗTZQ+VС+A$(H#Q^ۥ}Un,qtl'ﰂOPWRR9i_I*/c|HfoL?h.]z`o;=czR$3K8+^+E-)&L\ӈ>t*S*ԯ֑"nna&Li.dyʮ-0np2RSFَ渵"v%@bH7t20{E[W[Ij2)tG)miM^ O4X]!>!ͳ /Mk%ݶh|ޚ&|ieeyM%96I?44R9Vo̒\RĖjkfJRyd- r#h =ncJZp.C1 b_B~KrU*[o]e)=_7,$8+RoKN\ Bei1[ >"$>Ӟ(ҔJ$(BPmܔk{$I!I$S7s{58k~%fc.M2t$6ӈޣ=1?wvBQs^^\Ne)S7d3!h HVԐPĮ<2s<4tc+"\-a+y%ey+]mG 7"5]K]JZwz[*Wc{ ˅]](hRr!^ڕ`垌Ks(&}/3fc%I=էxn\\(zוnZKU-H_{L&L7./q3M!*9ʹbߗ-WcP!vQ>CݎÍKG.9"s?'͌5>2'>) 7$bq?C JMPe/9,BXy"O D m)@t &]a)X $yw"bf|=?wOjӸ^.9=OqA%嚥t79?/"^G  o! `V'Bc &'~пX}Jܗ9S=%"9nXtU/F0Ukm57 Oj%=>[RU:zZπj[⌳Qh6'ȥ&oh=Z!D#+ NkjRaqIm j(=8EX6c6+!1<0ҥ:I%)#$Dȕh,"&q4IؐEHBc`ZN* TVŧn䍍:upj;ӳNOڙ/%g"T3=NbLEyn([m{|V@R7%d=3&iiY+e:(z|$f%d=Ϟa P-($.Moi^B9oDY;O.Xg&8.WM@jrBd14TB0C1Q$ǔCiݸxlw8M+[Y_\ ؁Ew<1ʓwq?mZjՒ\:  1wVN"7`.n~2\(v9䷟0JiB7+)~Ƕ|lt6FMFg1R7D&]οKzWÊKp_̵_uI%֫SB#B2vy}F0TayCuN}V ˟LazWÁ%SDw:,E޶VOgJ~LUĢ࿙j"Z`vrX?~DOORq!w1iz.8OuUHKSѺlDtQJRT`k;7&xu!eJ٭̖iqNb }E!qB^n+Z`@!Eo12X}o} Dr< A>(GK3\UefTJ}Y\](ޮZ•A5dBvr˯^^|kmT*A Q"::ܝrP\G9;pUO@._H2ZrN7C:b2+ 9|%i]@xIozᜳ3RZuƌؓCaINۦ;ZT}mɺ8N{y~6fUsIzNRl PIRlwZ׷6?N,f7sB9k-JDA[T[,Q"- e75ҲEٞhQU9tm#brt;Hj3M.BĔ{YJEr%; 8>#nѾeHةk._~Qb[WkI8˨LXT$,t~<A?87N1m1O r/ZU=;DXO/<5.qzvsHkUW1M$Ҭ??~ >h;tjkFe/Q֤AJS@ V%AVQf<K Y6޻%rÔӒ{^5֍Q uI[SM Ӵ(m)PCK9uŠnJ7K@LF!H*RR7҂xT"ۏ՜”eo]~ލ,c)߉=_[%UMtKnH2G u m+*I*$H (~0RܭY![P<)K/Z}Q2,b`Pʒ*@7O[Ō2E{P뒊3R`lQh"wP}oa*NJ3f],ݼ=k4!VQݯ|,JXye$nmV)$؟h`7 ݎf\6+ۺ.$ڎ)H\JIOE{lH~8kXϋM&Z|II}SQzw} T4M |sem?2-WE%iq@XG`z ؃N_ܛE&2ZB!2;:\e8+p)qJݸ[z1W)wPui8(%N#fТnSrN_Y[]v&| >;/km'gGO.Lѣ=P},! )im <Ʒ79KQ\jEB\-ӒEM>R⋛V b#蝗f?5S:1j-)Zۤzd{K[:~jh^Zڴ TN4(Q6cbHu U*oC=@p=.iP(.NnɌ? q'F3Ǝ#z9#i_k]&'DkI|0<ځ0$<N`Yre(C/?9̯d9=OqA%嚥t'ډR:wۗf#70` + `ys E$xW{?'|PX}Jܗ8PiAI NO1S"B!XM8O soO{?u>%u1bS{r2I>EU0@k:uvJOܦJ]MVڒMI$@\rOv}<$Ys%<~785)gaH?N'2TR& aH -CsAIe)xv16LWe! S *,!;7cwhsjuW0NDQ ==XIYm R- (WkJIKJv) ]BVjv) \nJ@)i/CVNq6ME꣫_,L.]IP^YrMooo3Gݙ_Zӧy£NL-CfVozTjk%j]],LQ6Qx9R2u6%*24zi-aWA!CrT"jgk˳DwGjaneZRPO*?9PUP~ ) GLe tv׸]@n&U#R zVګF6~q,MS'p*Qf;w-TN1p鞲}vXzHE;,9Q +cۥkC$jPs l XX 4۝g$hK+>Pr1`/8>1'cLiHq)-^IQ/ŵc6T7:1 Zd:~ɞݬT} ~ R?)^IhȮmhusK: X&K_]CF->_~tŅdT%(BbIP$2,B~Q얶̀T<_uUpH#k6U*ٍ~ڗ.1HQNFYsb:6eVO6!ݢ?zҎU3)i=(o.SE{gǪBCW-bk t¦2Ƌͬ.m*f EKn(KHu(HW7v,3m)'8cMRE)*K;hypN'6ZBԦԧ tXJJrRͦiZ-֚6k6+Ծ9u^/2Us6k!MR#Ԙ`(H+gglsGW%LKZ3Ғn<얎Yh$$(m -13$-Ru [;aKZx$/ڒ8BH.0a™ZNࠢ؅$-hNuJvmzY7J+2>^ TrKΙv0e i0'P3d + H ;l@rnyT;VF:f㎷Hr[[wewY}$Ei qG"Or$% YR=4U_ȑbJT._[fjb݇GK'`!q1CgH꣦79@f%wWlj)$m#xRw|ѽYs5%^5Rt |L]^L|vvr!M jq!T\$OUh_8Ux-"j&Os+=.FVDfIJԷzmVŐvi'VѺco"fӖg/MKD) )e Jq-j|TshIb ) VB\ #V; _}Va\I$!nmp"B*-xP q;Yo? ]%gm8ҧ >O?ˏ 4U_qp?_ Z[[-W[MC(@/!JCcwL&@)ZZ{RiN]VJȧɀ T$5)JNIy؅Facc>fvXqv%&\} A_u7~ն>j:ǃHRG-ށ'vp;;y]vkJ9Fؕj-(_%$(esbLy=BZ/(ūi*)J Vk6;ZT=Oۣ/:5JDuSܻ(%7Y*zנP;_5 ~Jf8䥤)Pߴ%V7 $wڟjޢR[K ߊR P@kf+3-.s_YDc:JVJJyY=7N'57,p3SW;-VtTMJڢJIN vY\JqGV3%i-@v$RxEnB>.!)uM=6>V.jB,)v)n *F4fovs޼x)1&vMւTlH$X9RXĹF띶-7NՍ ]H?vVzSob.p./@(Nچeq.NR: Dm7Q[WBB@ 4bݴJ {ЙsPZJ]O{:Z:ݤ㶜\WZrйՔb.&)j岒H'h*II=O(N*2ֵ (h%"ŽŐ/pU oӵRAYLH16se黥p-uX#!wrt-A(W[[s:Pw<ߞދ]zo Ү2RmW/}<W>5'݆'K*Zۿy_lwg*>tkXV0&T7:1 Zd:~ɞݬT} ~ R?)^HDX9%6q}C3rJY)TVr{K׽_љBJ|Pvh -n)FHH'$cB(ӍJъI.h(SJ4i+F)$%GJ$lApCۋ5!4lԬRȨH&RRQ N$\x@B nu3j))ugs;THSZϩ0]WgUA̷.J<"A[J%$+c%$aMSb{≵zblGq9&QG+"ׂ'/sitSeฬ)?+>H)?Zǖ OU7^-Z\^3P=A\KR|mMm\|CFT-^Ƿ7ưI]1/s J9:"}? (Cw lɗpiD' #t|w`~;DC$dfs<OA%嚥t'#L ډR:wۗf#70` +D__,a"»g3y}Jyy$.9YrV[%IܧSSlZ7xꔮl83P2mҲG4Z5`#Goj[hSl)HRQr9da#ҮLِ K֪4KlEs)T 6ˏ8i!j[Q! B]-=3gfV&+)! S bm P hHʫVyuS"VG*f)ZI{U~olǴL,p(85-vMl4gIJo(Y>Ww^O=ac:fUj1[T`-)j}8w)  kuIRʚS1dv.Þ)!Ĩ $} E]+TJbVj:VxVjY`3$vD}ְk~iE/-O;He#= 46G)UH)B 7!)H%R4*ڭ][+sx&o[+imSYĐzqn2Bp>+]cOw ڒ?^Ve3ܝ8ʓA2F.*c |T+nmJsp>u\_ٯ1/&GvGa_/R \2,T-'$j1>ݕkӊ  Tc5QKaQ`BPBSԫozr5 ]зi@"+m,q<3V;B.gpݩfZ5gk0eIJ[i;WUHHW:[Xp+݇Z^u 7Ԧ9Yx`@U t{TV[,ߐ#K6\u'8CeRpڔG^L{ ˳DӸAH%I>p:K7WSDdi֨K\SʤPWJA^u*q@GvF2d1S!)9i |6'k[m4^Jw MJ׶)( &w+uXd!tUiq% [ q,%)m.Ի{bwH<> Z3ԗ * .Yq]v(I!W)&iW3jMiY"B2]Ԁj56;zt(?fjut0"'Qb:&Rߙ/o:F%j 1DEJK}c$diPmQ/%W\Tg_<ەP-DŽG$}WoW竽Drd=Ϻzh#g@pllyTVۤٓL<UiSS߳d7m5;oeZ@4Px w6/:s-(vGӉJFZPs:d`+z)%J. dP +~3j۹$()XZA,Ta}{pc_r$qLs . K6Qmu)=MПq]-N\x";u_u;sskꄑ_o h7hp MN/\4eW[R,, )(ڐ7ܺve &pqe;WfK+) pZ|Y/SJK~,L %'0Nԥ)I au+?:f_Hl%X*NԄ*۳@$_*]ʒ n:Zq$TWVieۛ8Ty$ؖ*B15Vjc9]Su[IS}'v妣_s=s>:Ф ̶JKP bjp28,\ڏ5#Բ2ЉjQKڂIڢrȸFVY MVDy?4MvN PIIRo<ԟJn:pg6NqaʯHIVapQ}V/ZJ[9VDaY@϶ DH8;0Z8xu_Qs]YDV25u%Y~Id<{:_d3z~ePQnqXV/&9W*rH'a_/R \2,H/&Gv#Kfe/1RשSJIzC7Umj%[D8/XR"F[jk/iT<܂&dg0o+T⚋.8k[ndn kj~ dͼ/e<פgYG6ҹѢæƍ.#y>u!d)a+mFIZpRxiߥM1[ ]M,$nNxx%qٓ_'ۆQs>]ujl*be9է)EjP+=Ht(!T}k:E)=Nn؝,~$ W$j/a{_t=4KYqRcSi)JE*J nJw%Bܛвj~PW ̍Qy."  ,$D8io:*jxqMAh%HRFQ*);}Ī*>=F|%j"\-5e@#%""|7A7굪_ooFTm0hԌ͗cM~~?ݲl:ۊ: $$N3_Z hwru/,'1eM.^Fm k;$`d:2?^DRKLה R TBo~&V+GkmSح*?;- RII;/wvӒ_-9= >pUŶX*ǟqnٳ+}ȗ[ Q@ڬK,Rr[ z5>]MYJ36+ VJ%3m{*؜@q'rkI\?~L]^-w.$EaL!<…som[w$$%}֗]gj^NION*PQ9})UԖ@eA-8mIB w);1(|~vC'|`gVFfTFp\"Z]U1ljwR%a\Sb.T5]jjrn +)v(ԂHVb77 ߾H"%~N]\U_cUVEqo,*2, iXe%Ξ1Nی5c2B7q*IGk+݇K J{.R\m>U!ima$GU^WR JJȚԒnV'6>.Qb#h7?z]>^G٩^?^5HILu!lx';J*HU>(UYĤ!x̑Mj%="Bvseog[YVjn`Bd ^U^RlEk\؎7\3wZӵiKqUXE(ʰEf+[^]UE)LB)qJ+J7MAp6{v%M* |bE!i)9R\IKE$OP9 &ր=*}ZZvkizjU)c(MʔRlbD%78ŸW1V[ZVIAb*/JE/d267E@W;BE6UKYFIԴBYʪ$HkY$ V|¬ys׾+^*8U޲G;UW V'zaBzy_"Qɟz_ㆵ^$7&e=/W Uİj|ɹkg6N/`KΜ/^_Ӝ34z֧Ϥ˩V9LD-f[n/Tf HcJI/oo ȗ_.[*O“5NnlQO.n`I3eO5,x;<RHU7)UHnc5^s7{ )ro_mJRTaYYHnS⚶ބ%7L:)q}{=x7gc3O(w}ۋ(ni qx:3e*dȒ*4T()H$QeX+ @q+Kq|^zc#"e\CrZi(lB=I MƥԲj88 4IZy e,\UI+y܍Qmg?ƥ~ʿc]ggRp_16ÈǛj_V{[퉯)-s=nvN}MH޿MeZ_xo7WvŶX*2l ׋qyg*r:5nY7&?2,r:OzWhFo>:NBiJk2 eHH=n%3"g1. f']weW&<%CB}`3#G[wX8SZ%w>e#02O:XUgҪ^t)*bD7ۧ>mYHZVA8n3]JzN$5VnG5JK8Ve[R`E.1cRp{ƓQٔhSsV&'cXʈO 'rIITA1m>/J>:^\9|B )9mK1jyDv-) }ȨBT}\BPnH2rʕj=bJk3NO5Οد74v? CQug-SV[Q蔚E&3p Fim@ B g;oNGxX}2`*O;&+4;/pue<Z %?sH TB*>\建TMTF^v~Ԅ7 Qnߩ0 -Ѵ_/0X8/ zR~ P Ue x/) #I_61kzn,;{I<ʔ` mbGBP醁>g%{yRq %V8?xhz!e̲'Mun *⧝²=nZf7vukpl=j(SgGg>wWY:uJc#dSyH3s_3Ƣ%KN.G 7#x>.\d H ._&M<爙v$B:#:ђbs:##?TԎ0O{*jPi=-e.PzLZ8$Tғ5܅Kq؉_Soר9 O[(LtߊgjqΡI~_5ڌs<8;K0+`AŶx#^U -AR+'r'hE'DFq%eoM9~Y຅i3Z]yo!\2Qquґ b!Gރ&R SZ%w>eVxZy6g;r$|˙jzo 5?`υ1 S%NCKGHt4SW5VTr-ӑsV_^v[n#>|,9Rde9%bWLҔҒS([9߾(~e5++4TRhrnޘ[?1L``A]R'NJi'?bqJe x/[qddw l4_~ ^sow> bHx8R lm^T 9[>ZQ2fLYf#6)QXS\HSUe2R)6|8\qӚ5i*X21Tv\%sU-1^>KqLIl(gZtZFѩHٺT?s;Q).TiL$R*: :sGrfLYGj Sn:)VXdmZʻ+Ûc]t8UByԈ(ZZL?e= TΕ1PaK>Nrh|l/#TU5'>ȨL͗K7_ӫ5JSaETibRup8;K0+c4e3V[Ҧ9)8E}pd= J Z}YpvڒFs U93ǯSY.PaR38E2S &NBZ4CMG^,iƤmգt|Eu2)^%~S黹7ƍ3/핹eJVNt҃YB w Yq^qũ^u78ΩN:ZԥJ;Rzs#`I-ARu*7BRP&-!ҏhVߙdqR%!*BDp~gL./i>3 uLyJfGIꎶqJ0J|?nݩ8CULf .\;;d^ȘҶfJ&JyaoXt^:=D5Hɼej[ eK1?j HI tuCJzb*j)qDBP?)  a#g# Z7XRbKd94PhPak -LKПD{SBJImcm$.!LE43GS i6\RѺ$&SM0Zb3㺅~*\wޜrgz.Fz:Ob=5&-;(Q;)13HQnB Xv]Qj2Vgq|emYu]sseey`mPjJԖWژȲ撗+`gʋvLQn}ғbO5)Ž&M$NV$ { 鸲VH;HrΓ>+ͽl[0q}41Wtlř}KOEJDt 9Kj~Da! \9R[zW'*|pUo=_w>q.R6OQ( |z_!Ri75ls*JVqO4FW&X\SILZL&͹_f ;^r%"-qVoa.AD*]?=>4s4M(ɱ(9~S`RPd-^qũןy}Vy)\qkZ)DH~,S4C+7s<7Oo{1twϭz‰Kκw KѢt:P@4M>} uU#,Cц$2^RtՕHwk''~tv8)KV!I;ZeYl!Bwa“?Fƅq)5O>՟]L-3ӓ2Zf@oGi.z3'?3qj3P,yjFt]%BӪ;jBNrބe :F,!Ynu T3ȏ.סIBIJO'k+I@#Nҕy2/DD*\JT8}\*qun:ΩN:qjRԥju}-.F5HyLڕ+/=fhTTeBTI T)9Y:{/#9m *յ:BȍZa:mҧ52 歩1[2RH(;wF_WtS/\bc˝HjJe=bFQЙqV.EalLiJ/ ` עbqHhnvy cRzs#`.OO@ `ߩf&-B6@S+GciJ=xR,xs?TBkUaY|uwq6r}LC! wU[&]Å+@c03b9<A%嚥t'3? ډR:wۗf#70` +C_?1a_A*ȕ.x”R=xzRÏj:(KIW+ ÏvE5qԭzFreT|>8⌳gGqᎡ܉ ?WHҫŸȵ/P7՞=n>+1 ]=OÊ+FFP'RA1?|k"{۱Imtlхc$}.1ZlCDJU:&86-KK:= Hp H6Jf #I8R|I!]-x+*60bYIJ8n?j?)1Pʏֺz/wY,qf__."+yY?)!|.";J6% kumo h}ّY1L~G#-O1oWHcͪbizlzXOUb,AiAV\YbfP>KnH-ym $P(pZO^lyz$I 6:OQ0$87{&:MqⶢIO[!kcw"AgVz4Pt懟 _SLgHm}`i \zEBG|b +Fac xy'Āo1b%z1t;xH80GH$y$RcbԻzQ|z6)Lci8|t?D9JV0Cm)B GcFq$~~xRv%he t>(eG˗nE1ZmW?@xXJ>Ey ]z+'+umo h{a~ ȹ>b[2?k?<ٽ]#﵌4‡K+1Im^#`Acj{+sAV\Yb|\Bд<%rY=1PerL_d2Hb胩}cIqF%Imͧ!Wc6L˥}F/IRh@ &:MqC~/**/Ώ|Űk>ϼgVz4Ptv?=T^֭y,w>A1?|k e# iǠ F?T 4> VkȂ/԰W>Ih@~ބ zҋ)0pcm3?dmb>FoO5GEqIL[kc=J'jyL.HO0$QI7C(eGzzs)nv/PYrȿ:\DWw~Rݼg׸lPǠ2W^ .2շMnl{ d{_ڟ _̽y*A9O_IP/o:4!%a ܄%[Mv>)}eX-_^ߗ??gOjӸ CD p6aʴbzb2?1L}k4Br [OjӸܼ5y6 1, 0 a]z%Bc _//1E_a%Fj@q[ԕk͇ITz&_诽*2qo#q<--dɆ3ڃ7!;C~^b>`T" ^3vPRQb秫L?elVgaFIƽP ?I8IpKl?ByL!-J?w|A[NdL8=#$]_tO_lnm0TYZK%|Zzf0-uCnkgLҗ4cPjq+9S|J)y,*Z^_qM))bA()3I2`d{.ʩ|+]zے]v39;4f,J! p?.m՝OH_ _}3I'ˌ5Ɛ{O>)LWG{>F5ylփH2TQ%䛀!7) QӚ-q]UBR~O2. UG?\8?laǠ=? =\#Ўp6#gS1WZruBR̕LYdW'3_&V{\My7tnHTTS3]-R['kiE]ll{%{-5!4 yn-A B5"Tw1=F79\.et6@JVM:2.IQjMM<4jkdDa%[oӚ@PJpdW%"Mnyqj$wJʀ@ؔN++r翐LNn,%\uYE 6M#?zԖRsR sQj I7R;1d(`P"q _7B 8MStNT q]LI[Hm|H6Y)ZUС u8coKkp!]Ut,dZ,C̲}ۙMvvxfh}$}'P{Vkn}nE&C}=;>+@fd3fřՔԹiDpowzyeB7.ywRYSM2 :]/}2)Q}OnQ8k$y13M<2>ˌ}-D*ꔎ?8*^B' sE<%+6*9$_c\$z%W+YZ &V͵uң=|fvA1K[a{HHHlܨuH; 9iğ?|6Mh޿Mq'&8NNҠ>\LJ&UŲ~s~`IsSH=yŅf?H?d}r2 t\=4}*N*9S[3~Ӿh@?ğØ"wzO#a7/ Y$̨Qs;j3X/ۊJJ >08W4?SuMnuWY{4cV)s9.Qd4sbnBv!B lѦ= o~͊da'JIVGٱ}JWoK72$n4%!7BtR\l2)K$Aq';|iAcRsE=]Za|bJp;GI65ɀ=\#Ўqu4BSZbA35955V<:iwgjLtTz)ԳT])SiRaJ8:ܜ'ұg9jqQa`#[y0hG9ɺWKES~b5ƾγg27́y2^_8e}ple2ߵJ4CJ~񭩜=-rwzW6GSC R֢5^o%6T &%S8q6,ɍzZuJ*J Rll3+N*F [80ⷊ|3w;)2%4M/Ii9AS}{AWFa:%H HqMe%O@ #B{wa(~ s“ !A7 l{=o>QS9!eYoiS"%@A>*ZAR|]ܦky$H ! rXd7,m6lq{v!Ԓw6Oq",lINfjaT^k]Aťiu-*HRDn))R4&l9k`f1x6\!ITw*I>z|Jk禶7 •K:/W JUd8z;}STeSjZ3\գmFOxk-28Mr=E`ku;s&Vm Ckqn36B!!+XܠTwy-wOTR*TSr$nJz,"y/A:ٳR!bCJBp I7hCOnDg Wz`Y^:|Um'I!D R[P!$T=;{]^km<޿[,J> %-heOhZ=uAP %(+**Y w 6MۿSu+deg}J@l\ָؔ7[#0Ou|) ZT4 &Bms%Y[^()K,u\Q[ KI꡵#ԋVioӣ\q8VpvyK4f4œ!ɜf8hUxl{A!#7DJQTNhv.Ƕ#Wrgߑ+^\R@p9'c۹I;4e itBg; @;ԑsǠ=? -R6YJ3P+^6y1v7`(R| ɧz[30Tq6F'CТ6r.rɁ FqaC%77QHF̓`/sBd+X;`<,mX ].)Ũ* @ ۨWK_/Ѽoc/?z1t.rAlĕ74n8>tnf wHXNzu&EVYQe)Ό*JI)wogSdEImJ) >6ԅ\tOo4/F(\Rxk)vk_i:{,fX3H_).ΈE Y[X-IS!= %IKv H%$*]Y$ٯi2ʪ'RQM-ȭ;_apyn#ZkWןI4[zPP(+A=Mm=VvѪJVft))*Qx~~KoRTH,--R M3]8V8₊[ J6RJScW>c𾜹甲lW}>?jBtꝗX1.UV~Wçr vT/~׉]w {K =fʄ:Í(dďCQ܍ )ZkUtA!cu^I7W.Zu|g[Z՜ܵ[W6ǭg[bwdi4^3:08+%oHpk۷1 l:@K^AkdN1e 3[/7 3Mu؞L_]o٣yrcm-YQ"?k6DKtnځ?Ϛ7N 1z*i!<0栕^5c -,/q{V^а9vOjӸܼ5y6 1, 0 a]z%Bc y EQW~Du[;Ox6cPENKUfDM-[k2NK<>Y l;u:j 6!%0O$Q`5@},Vd"XU1Didy~vfj 1 Қmnuw&3%II!HSjQsy*ܔ`s:ԸoVedZX:uE{t{~!'+׬yjuLߖr,jhnRva J[wڗP@M.DF}4#"Osjɵ`;Ym*J]Tt:╠hj-,:*p8rz(m aSCOMq-M9uKs1g*ғRkxmKm-NdF35uJ}켰.);yC)(S@t hZͧ;j,H ЕKz=珎(f-A9XB4}Jz4drKbڿ0w-6\&&>e̍PSMnCjkf#ΥKm PꅛmsUNZ+{6ml~񵮚68yt'k_G߇M-biAv[ɴxVmƁ׻`1I"ϤZ4F:OC, cg?ӻfC6 c7,J2RG3wy0$&IldcL^OŵST 'A8qHK P=v!ˀTj br'ب%d%Dt IB&Qٱ!ⷈJ:948%jeWuqw <0>;O'~Kr6nL>R%%]Aqo6 VԬ,3Rɕ j|#K{02A\ڥ(s}ŕ42Y͞9BiHp$ KK#zaBd|:i$ -H}jѝܽ n%D,U {;kMZˣ 󥽙<&Q&>K[m.M;JVXY KOI6q)¥*ΩCݿqIv*(ÊϙV;l03łn q( .B,ۄ_-8(uX %$( pVG'o!v"eb77{!Qe [TpTOrR0JwyRbCSj j1[ BEJ{&_+-1 鿒 K?Oظ8b!`@,}a]HZ;'Ѷ*²$OќO*/iP$2=KFE*|kLQ=Ye(/;c}+[roogɎPVT|>N⥛^0;yzjBgfif4Sm4$6oUJd1ϔ|#W9vDN3 =ڭY..tL4ځN2-~ .Jmm ?BNjj ϙHӒIv*ѩ[uШEviN$(Ik NΕG$jjCH2nmܑo2̵x\)NˍDj+-=!.*(h8\U~,QUK".V4 ޽cD<Bd5IdYiu/3k%&rbZ"Pո@]u,6mJ@tg,FnWMiFe׭^%1L<$5SPxƇ sNrd-j;ͷ⡦ qt{M 1Nj}>r-+ml]HH=H}r[qۅ%d8.:އuvdL=o}XU6c s=nrnvj@'@ ]. 2uc?OjfQ>TRO2@rmnBRv+]7l=ˍ a[P~h5Y1IM: |d#Շπ:|l_IRl$~8*Q?tw;6sla*O:Á%ƙ {b bj_ (Tu6l`o̹zuG,.je}rYG~AGt1Js`BԆZP d4XmGx|ٳT+YKG-[}j[!r[qk˔zBHS*B(qKd6rYo/\@\N2^Y9SQ]8&SN–J$ -'"NoFi:yZ z2 ߘL%mlm`- *u> bh&{S[fRJTlU^r:GN! Ie [[,2uj!^sG5 쬕 5592aByq$F[%kԘr< [i PZ JAZÅ2P_D 6)&}pV8$é6 ?WAg0!LS*AbQ͕4u%8 =QT}N>|Ssj xd'Ʊ cyoʘJVi:^J19KPԝvM q'v(a2:=tih:fm-ܝ!+]lNlr: biQ*cJ-Յ< ki{}QNJU>aq n28:=;G&6\J8|Mٴ=zQvyק=hP2R)SaʎI RH)P$u:PƦR)ő[T$ߨ *IrMKP^KSGqVӒѲPF˅uM{'2>25pK/Η1rJH? /ow:w ,JX~fiwy7W'nM[D.oӛ##fplMo-M˚HUIK느[TT'[z:"!PN-$qn@sL2o#vaDJVZt~${qYM Z2On~ Ds9Ҋ[H+3P^ٵ)uI RV@%$w(j}"]Kn2k$m>5#V]![MVP ($ Ҡ IH=.WcxRS 8[YR>0=5qt2TtT*Q濧Ha PiZFuobUpA7lom]8x?Il\__ ۰ dN! Ke!7ׯÇ%Ş2xO.[rZ^Ç$#X٥!Ț¿*6B<%S{'$pxډR:wۗf#70` +ߓD__,a#¹(kymEjؕecǠjJzu|x-O&oP<P~ܗ!cMiSn!/!p*񁽷yJ 󵷊p5٠g93D \*kL8J%~:h)J͖ehJ5O6;Vwlҟ%ԐG_%dRa6q7MS--e]LSm>ȠӨ*)YH) 'i8u3L -FI'* kk{6:tqXMūY߇N;M{M~6!_#o)5!IJuMn@)7oeE0Q3U2L#L+o:͓jwE_gfDҜĊjmVS2mҠHwxN)h v!r9_̓6ONՌ_ie)f3kmVRivd)>mKbE *|JOXݹFl3ui.kzҌmK:RVv~ T8|5WgjDjAS-َ \JeAJټ;o*^dLO5/WÎVC~Jol)+66AQHzQ5UKUnl6LWG= xB%t[;RyBw-VUxzYځtPU[/Qj4Wu 6Td/amJN^]<ޜgԷ +;>N.Rzl5✪7 ]vvӻКS!LJ)S[WS0 [ދoCp9@"E^5,AYGY)Ƨ?*mUT{Fe3.V$pv@ t*@t*RdF"䔙 7Ie܋nNʦSRUtӚI rRIt [}sph#]5^mE%ڵru m Kip*=~R*]?Vl̺Y"5MYcL!8\ )jPEڬ.JAP*IˁZ5's%&%'aRBԂ)WC&CjjKh[]̸o#P[,$+;#ڗZB֨ YocKiG)mKmJ fJA$ T)/󶫗-7DJ? 2#/RRL`o]+)nJzFB{9nxAU],q:%sY[VzN6쥡D ,2RNೳfE*b`:4u:${ªN ao,]!)I0cd2Oʏq鐭0ԐqR&I[}"Q4r|.ѓ@G[˚P SnWBd24ڊ[y<!,*ΤnBјԴb(P ryr\TiIH|ԔG{cINsr1ycQ3$Q*4jXI4B6剳 Qxc$ѨҴy{*Ü--&KY5)=*21.&$T׮ פu4J~j, rRiU'He4jv¦-<ˍsj!e|¦jȠ543&-KKࢁDEe*ǝZi3EЕ*P[#58xSM\+dz>(TM'!EueK2:`I,E,@RŔV :fʥwFiuZ6BPҪBJpw|T〩R6R$p`ey(AeExm՝qnE#fL[%ݹ\9z"֧$ o̙guOƬTD\OVRˬ&ScslɸU촪lrIwww{ڄ(ki%ZvDZ}rުg< Em{9Qo_))9)GfngJCd*}ז w $ ݴ?jIN OݴTYn)rC& eed^TJg RRvY:Qcqe%R-Q7XZmo}}gfmSrl"$ښZw,s7 +r&Jb)ja6e}RJ' mQꔇ]C;s]6 rUK2JnTKKVJPRBBĥwQSjؑtJ $ݺs{jK.,8y[ q >6VMGNEĎK)9_LLXWڗ_NIƕ2DX/%[l 66oJp3ْ]K+ PK7*Y;Vu>U MڵlUWӓD9Xs_cH&s&}Co k݅ǚ?* zsbS[.}8+^^T@%@đK ~wRcP3-m2һu*RJJH'Vʎ@t҅KOh#cV-rEJOC@?1}OPq&ciU=%1/-%( AQ @Y$'tޭHf]\e((xOyGA{͎(d镕2˔y)uV.zځMקsԁ{XڲpqY7-'rGu$']zcmN}]﯐jD-v*!6O~W)qHW<_pRV3|`cm>6%¬Gu$\N65vK$0'T^twJ-gZ Fp8 *IVg Vs\ݬ|qA%嚥t>aE|1fRFΗXKj'5Knrn^E ߖC 0v~O-~ gؿ"?PX}Jܗn:R @''ZVi` B7 H?/aqB n£mu-á -}/2tA7޻[}LqFY$ '-q 8}bT,"-Q%ސr VHmrJoepH[n Sg݂ҟP O-ֈ<^HAKXf1fDFj{LT)TRWPnB JOQƚ~$K×m mi-6-:/cfJ摖3 k8؟S\q*oPmAM t-*_'ʼnl  h%V^v,ߘ2a.2 ѸN !;9T1iYJҒ I) oF lX%#}CfsIujlLcx_ޗM-Evj c"[zUV8`XEa>[ .TUWpVIz?+ח4n-j]E+Oi[J6񱤸D-p #z@v8:|f[o\YLgixsUyQ%!]Tn=*KPuFj&@wQ_V<|T]be+!r[Jۜb|mq* eaJ}! 'MTVsvUHJ4rP;Fi͈8ޔ&ݛePL.9-63v4Tm ElGE8xtm^|;O~ ::E9"1ÙrLX’,r(6H@6Dvi@Ďp_((J=.OTqo|.Ёǜ;Ԡ?]n΄_\&p{l`-J &ߤm;}x !aS < #Q["R o0pX_(sp{knyfꆍkj}nEV>@t**nT7$LAZWsP@TUܴ oE=vp^O-[M庽OǝcPwfM-ˏu( ~ܙt-Fe.J NthܲlmJRR{4/}_)'4/QQTvĥd y91+}jiAޢ 'hx4p|dE`8k} W">g[ݛii'̦VR\LФ-JRH>)$7ދWrl 7-7oVe7KN:wYYJIQ z7Ų)>*`  ]*6ܱ|?(T-{LB eHKBOc >ոGp4Pe(=z 7F*mU' L?Ē7Q.RҨm W񻮠==hdC.xIv W,K@Owr@ܧC09a PlX>`M"-26ؠvҒU: Dn&}/: )JGK߿ku:!XRޕ.%"(*)J&<+9%q@Pl! {" |U%B Bq䀰Ey-wnTT lOm7[D5Ts 3[u\q2!)IФ׹;R MQMɑ 5=qn܏#/~'cpRFSe\dp ywZ@ 7*BJ<-ONiJS6(Tz l>)O1WU{JM_}<:41Y%)mKn͏2+EX' G[r*y+P +m-[J)6"8pg`Tڶ 6BNҠ.(hH.B\we_C-Iaj!lRJp 4Zmzl94QDf_m16%[B@!*~|k%$kG\_hI6 8jy(fP5ʇ!% q* B NNе#8%-թ B'Q"8$}G9 B2mkF yڿ-a{~$96ɟ|~pְRwa {]޹spV/ R.ɷG+ݢrJDҟq|D:>AL6˷hF9ƠL̶-I@ :$zΪB1xmt7 s^CJZ>]Rl}2q*qe 7IzH{{+q0˭R'P pߋU;KڢwrK|5o-jj$w^ !E(I$ u'uZ\<*;wпUIa᫓_iVplG"RT>}:TxZ\3&<Vy*B[v*![A>r=."2َ8CA$oc{AF:vC,#sA w&:ܞ*'I|SxU[|o}mߓcD$%e !#>*GN@-AtXuEŬ>WkpP*0xn=AKDX[Sf+尫k-CE>'k[Smhe۔TA mſueCLvunh-ow #GGQ-K2> A2AI]Rn?>(?$|TΝ&i)VeZKj'5Knrn^E ߖC 0v}~Om g[#E^VNpx5쁯jsQdNRR3P>`٘g7w(Jx~; >IQP N$ku"$+ԏ((4e?Қm9)=2?<~jc'pfN66e0 OL*XԼ8iiquhi[Ju%KRRR=>s~ayJ-b_ƍ+PljIȧRђ`E@i$=) 5 mI)*zEhL"hNR)Q!'SǨD/4iq-ƔC@R*C+Ӧə9ki&&F5_Tj)B[-1QIm5(!QC0rUqɲskǏ喢Ru<ժ9KR|1%N Lv򖝯!<4ۍSdf 5qؓ[\&1jSb0) -]6ë$:bB6xOy:g\&OD\T焍gJFa$ȉn$IS4V3(̭k1F{m귃x?'w;l hWCK3WP{(q ҞjRBZ.m{)ts6L wȱu'&KTeaA$!hչy X]*Hl(!IRUtI;n͏S >Sq7evOhMS -zͪ9Ñmؐ~E->5]5>um\'3&N_Bc:c#o7o^f$SskY2 #jfv&QrYqe8x23ŎdUaiOP&ym"<1ԙIToܐˉSy v|[^6sDj‡ g#ÓyʽH-gU8IRy-BYxF+#–5i)^Er{tk[fɛmPƋȎ^O%0*ue$F;cNyYS 1NOD"0<%-ĄHnRٔD fN#4Nh5 f߾'+eFzMjT6%ETDzad$DNP'yKkٶvz&ɐQS5 Vj "@&S,ǐd=\5d8fC\Q\jVq?^4:.̴͡jJgco?~zr3&n>ҝC٣2J:_~_Қi 5Fߪ}O{m>j;Zsl#<c:hԍU*LU˭ҵ ?ȓ<3#ӗ%ZdHyJ3R}5l4 Fթȅ$#4Ii%6y\ڮY.Wtj,t ȅ r#UʛiŖԴJS6HY *Z~pu=7R}T?lp¦NyYU]V~W3f+ߗwSe!%F =H&׷$@#7^Oj$%)C0 1SF JQfbƚvA\ӹEJUԥ(gjuAp^4%0BD74<__e>1'VBꪳwM=IK*e!nR[θJ1/BrtM.*ٓՌAYYB"-Z>ÒdTmYWYꦟW+]*GXd婺.@NrM7%{MQYf:[K*O+U{<)H,ڕ COoƚ7x()Ib[R-u8P^U=4\+4i"RG7ShS ݈m!D O'ν'8djmP;L?QJ[Z309*DJFu5mT/\Yn" -=)M6C(](J^Ez;XfVfZN͙U(qlʤ$\!-d) sTGy+k{⟨)kܺnbnTjSi!%0#>zѕ!rXt7]DѮip"ԉU9/P3z4i\N̽Ϻ/(.\B Qڕ53O &|רZy5JO9';dhܬ6NDa&G"Rg! D[qI-ԑ/y;Z&P2+pO.FͣHJ¬PiN%WJ Ia񡚾‹lK`'-ר{(dIwO6殿GFS%?5}ÕKn?68Gh;*tcuS(!pnKNfZJ5Z!\dWPQ-ezf^E`YYCϱIU"#<\̧2#aL}m5m'9=Õ_`#UCs(F6.~fT [':̷&= yrY/<ըh̓:fByQ)Z%I$AFG3W.:qo%oQi=4)K{cE烰6 sNUvXQ/`{(tr[y)=7R}T?lpWX. z?7, Ue#~|+|Tl~w_jm֎2ٹj{PNZR3PQJSfcEvA mrJQU!'oyI J7W7EvPh54ۿtsW%^kS:aT^3Y_"-62ܧLІ<%p[MBː3KqGhpg.i 8@ڱTs<&"_'ʏ.2Z e'w5C/"8Xu딹s_o-Ln\3+Xa z37|#8/<'/||xG?/옷#Ez+[t ndͰ3ʹ FGT ՚jd~# &+4RZB/6ױuf33|PP:2O].Z9@(\W+h[K̰%p#Uidy-ĪCInhKK)-FC ui)ָ4AHΔfR+e LL.1L:ؔ)0M>iGieӨs} 32jeN}"VtIFk'sy~wp@Ȋ!9Sً ͐DKZaeL~ClNUX0ܘQnBfqR>KART>́)Nm$0 nф.<d B:j3.Y Ͽ#8$Kz+i KU;[ݔZP>߃l.Ć.(85q::jO߅>CׁL6s"uU,MA$l:S9RbJ܈-өKq )IVW^5T֪̭@B܆e. kv+ە ԭoɌUirC4hOfJ#2e47[g4O#t"& ߉ פ-yS\.2RUܻ*,^ι&L'j[HH\n464XZCCc%evHrxlhϮnnW ù\#=P7\[ϩ2eDRQ͑ˊ % O+9r^ aV[-nMvntbreӼ\qp2 SZbNqL8zBqDVC:~MZE6#0d#S)I~KKkm:]@JuG4;5f3K6e&Tgͨռ<z|e?yA/ ԰iqt s=UٞW&Q%f ~Vri'|`T@&& dFK6d2>;f:wPήԲ(Hg"slXC.3@WƼoSEw@SutfOC\bύ#r/нޢ,YtG[iU2eXz\O0F;ۋV~;JS/8ҕBݜU@4fn]/="Wo n i>57k7P~ImDf;~ 5R78R΋H̍ȨS-(Cb8jbFԭ[RE*!ĥą!?=P~ImDf;OȳW``0`ϯ/0_Z[.Qx|ܐm^\8 JSI=. c$-be?wRҫXBy{L!'P ߄`e/q}㻄-`)^V Z17Cd/a<_jq=xC񁔿c񁔿bŇ-@58!} }, -aR9Q[zo1 ^roQgyyw(->?q =xE%z9Lf`H>6t2R\GwaaqQ/m@ b Susaeru]~*Lۤ aDjR9~+RBo e#| JȺgW{L! k_)(WUׄ bR9-#ڧ<,|bpxA^T9oȃ~eO8o}Hn--]J?G/S9䂒7yQ:{aRx B$Me>kG,!k !ER\Gwbz\e aj-`/&ځ`2SnOVE?8A,=O!_015BXOGq׹ olj(8A, OY:s`jx7z?) $u)g=\؄Mu1]>$=aK=`jjE$=^K N* l6=>oSFo!}ǩTA.ѨYK]WIAym$3P!!'T FO8\q)=xA?S9^Lpw2q[FI:Ќ :Vb52z@]]J,OސtqU?-qV QX6)kǨP ?z=sW9;<z;oUN; -@58!} },Gw5qjM;}KݧU񳓿A! Cܷŵ蟥zEih{}K:$oEGP9֎@G_n*o_}CL)U8jH^ҒRA)zQDuөS2]q\NlZ+Te$=@o/2GXOGh6^Behm5FV{γLܕf 3Jm%)Xuj|#,BT2c2%1%9jZF`"!#pjv~tºb2O߽:4W$ns$e!) S.-һo8|P~ImDf; 5nWs:(TU!n RMZ;ZqT"DgjT[B j_wߒWPY_Nsr,p0`0` 0}h`Pc ¿>?0(?1EU?"Vqޢ^HXl?>:48sTqraҠ&<]H֕n6&9hJàhx!=>£+~lm/-VMxf:8[Uke٬i+aCe .1lʂRRN(:SƦ5BW)Jz5>MV|\z[3k#|[KBiirLF!ㅛA4s HtΨe.NC̬JzPRT :bu4Sk[* .鳇yֿ2jMRsYF}=XˎGrrJ2J.%͸y^KQiLBr`J! ƥGGϪ3L`!sqndsMXysG%R%O.\( l%{YZF+ծ Esv2SQ3L0i̎K[oyRd 3zơ~zM[x"vpǎOaQ:iy,jU!JuF9 rJ}#s9Ln;vDww<"M,3]8fSʹT('S!n0vCm3CM:)BReũ PN㍇8O-J9jk-[F ..M%JhmM0gKim+a[O5uϙ(2֭TsvW"Ԍr1?ɐHTj;ѝp}>Oͯɨ,* Lt\dMiP$)x:arIC5*:[v#^$>1Ҙzm8ZB.eВl%@tYlʴeYr\}"mFE,4Xk"Bt9](W4k/WbG#| ¶x?x/>~_+0giڱu=b.U "=2 $+嶨T$4 ҹOa.:pG?.q! rs`rs~J\JhɦmJqYp&mpsq?~ʟK"U xQ R-_*Zjl_ K{Ft\Ө$F1Re̥cCc4k(}sKMҫ*۵:8;2>&<}ꛒa.%7t)~F̨49yW,e,*EBSB$Yn*9̭i BBH 6^Θj\>$I~P2Dv+VRil7iMJ!'6^StŊ<[o/̹Nu.P5\FbmZ%bU۪"IqEA 5KrҞL@߉QeQ*'Ь\35?8hC&e&s=:11Jt+~$WT.z_y2VjmnFBoEg"t[O&<&3lh̗$Euim4*o YTk6M6GOQO#}ķZ<[^ʊ˸nDYu;nhrMq>N{-8xcSsL(TLLC 0[9w_U1Ԡ*%: vT۪ "Jb#PwBH\IQ*ӲmRޥTلʝr2EBZ}f+jXi+ۅCGNKf8L2 e0n7-=͉gKaӭH[JqZSuksX=yc]).-.ai, ݥW&%rZcǖh¥H8:׸rXzi̅2JAڄH;d:ɋ\J ( δ/*z+8zYSR&+Px;\Ȱpa=5uFx[Dxŀ6Վ,M\raWL7- b;9^KEmqIvv-u&EMM)Sen5IFaRWLKRĩk:CZxӚ]EIiheWiT>CqqC/Q.zlkަiTzr=CGnuxTa)dynGÊ<: e)1@/nT~᠏ xA8 L]JD}+4ob(A[hj=AH?;ӯK|Y[Wbˈ^ =zL[-:O!nBRO Ad )1,?[|H(iF~ \J>I?1?<gbӐ@R۪bw~|ȍX_1@e@Am6򞘱W`8w{KuҒyP[*EZ[% B LO hR?QǨ'}\et_Ês RKSq_zDĽ*#óf1!JqW_Iy[\ӂM>Ο00` 0` 0` 0`V_3o>>aR:wO!1?jӸܼ5y6 1d0` 0bP ,x? ZQh#CX8kz.Z*n1dJ|)l3}{ְ5.G-HW6- 1/??}=y+ ?y}+r@o19=kH[{R<k>)K_dOj_燞~J&zA"1[Ldt]~8Y{R<* K3_dQVD_4܈Ҿ>x15/_?}A&z+z~>D,_GY%_1z<5c{Կ=|Lxaiw_4l\sYE' 2g1?Pj_牞J&R#!$3:N f>g* K3_dPj_牞J&z Dп?ɑSy b&>4_x`5/_?}COCG٧dߙ?Y܂ȱ5/_?}A&z+z~>S!$(,S?cԿ=|Lxaiwc3R#|Ǟzf&tsS4?x`5/_?}COCG2? cfh* K3_dPj_牞J&zKަ_폻c0TcԿ=|Lxaiw^/%__͟ǂJ64_x`5/_?}COCGSߘj,f=U (u̇cԿ=|Lxaiw]=?=}f=M?cc1CPj_牞J&R* K3_dQĚ&)79>g1;Pj_牞J&R* K3_dQƚ.4g0.w?csԿ=|Lxaiw_T 5(M}n<̀qM~4?x`5/_?}COCGdT~9Ry35/_?}A&z+z~>< mG?YM3Oߚ|TgҾɃԿ=|L= ?yt>+OfLHz f>h~* K3_dPj_牞J&z"~c1dB?lA&z+>* K3_dWCT솮ēyfBYRÃ,Rj|TgҾɃԿ=|L= ?yNd킕TK$lڠ}1x`5/_?}COCGӧY#`~8=R+a_A&z+>* K3_dQH)_@*nnHZo놖??85/_?}?g)K_dQYa~8<+#l4 0xy`/??}COCGDžd톙D?h|Sڗ矟ҾɃԿ f v | None -> ();; let color_merge (r1, g1, b1) (r2, g2, b2) max cntr = (r1 * (max - cntr) + r2 * cntr) / max, (g1 * (max - cntr) + g2 * cntr) / max, (b1 * (max - cntr) + b2 * cntr) / max;; let remove_space s = let s = let pos = ref 0 in while !pos < String.length s && List.mem s.[!pos] [' '; '\t'] do incr pos done; if !pos = 0 then s else String.sub s !pos (String.length s - !pos) in let l = String.length s in let pos = ref (l - 1) in while !pos >= 0 && List.mem s.[!pos] [' '; '\t'] do decr pos done; if !pos = l - 1 then s else String.sub s 0 (succ !pos);; let get_extension s = try let dotpos = String.rindex s '.' in String.sub s 0 dotpos, String.sub s (dotpos + 1) (String.length s - dotpos - 1) with | _ -> s, "";; let normalize_filename file = let is_absolute = not (Filename.is_relative file) in let tkns = Mstring.split_str (function '/' -> true | _ -> false) file in let tkns = List.fold_left (fun acc -> function | "." -> acc | ".." -> begin try List.tl acc with | _ -> if is_absolute then acc else ".." :: acc end | tkn -> tkn :: acc) [] tkns in (if is_absolute then "/" else "") ^ Mstring.catenate_sep "/" (List.rev tkns);; type 'a result = | Ok of 'a | Exn of exn;; let after f g = match let r = try Ok (f ()) with | e -> Exn e in g (); r with | Ok r -> r | Exn e -> raise e;; let (!!) = Lazy.force;; let string_tail str len = String.sub str (String.length str - len) len;; camlspotter-camlimages-e471b3c4470d/examples/liv/livsh.ml0000644000000000000000000003006712405272062021467 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: livsh.ml,v 1.10 2008/02/19 12:44:04 furuse Exp $ *) open GPack;; open Gui;; open Livshtype;; open Livmisc;; let font = Gdk.Font.load "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-iso8859-1";; let dummy_pixmap = try GDraw.pixmap_from_xpm_d (* ~window: window (may hang...) *) ~colormap: colormap ~data: Deficon.data () with | _ -> failwith "default icon does not exist...";; let joe_anim = lazy (try Some (Seq.load_sequence_as_pixmaps ~window: window#misc#window (Pathfind.find ["~/.liv"; "/usr/lib/liv"; "/usr/local/lib/liv"; "."] "faceanm.gif")) with | _ -> prerr_endline "There is no Joe's face!"; None);; let icon_width = 80;; let icon_height = 60;; let button_width = 100;; let button_height = 80;; let label_height = 16;; let max_text = button_width * 9 / 10;; class virtual icon_creator = object (self) val mutable icons = [] method virtual activate : unit -> unit method virtual deactivate : unit -> unit method virtual set_text : string -> unit method add f = let was_empty = icons = [] in icons <- f :: icons; if was_empty then ignore (GMain.Timeout.add ~ms: 1 ~callback: self#make_icon) method make_icon () = begin match icons with | [] -> self#deactivate (); sync () | f :: fs -> icons <- fs; f (); self#activate (); sync (); ignore (GMain.Timeout.add ~ms: 1 ~callback: self#make_icon) end; false method clear () = icons <- [] end and icon ~dir ~name (req : icon_creator) = let ebox = GBin.event_box ~border_width: 0 ~width: button_width ~height: (button_height + label_height) () in let vbox = lazy (GPack.vbox ~packing: ebox#add ()) in let pressed = ref (fun () -> ()) and enter = ref (fun () -> ()) and leave = ref (fun () -> ()) in let button = lazy ( let b = GButton.button (* ~width:button_width ~height:button_height ~border_width:0 *) ~packing: !!vbox#pack () in ignore (b#connect#pressed ~callback: !pressed); ignore (b#connect#enter ~callback: !enter); ignore (b#connect#leave ~callback: !leave); b) in let pix = lazy ( GMisc.pixmap dummy_pixmap ~width:icon_width ~height:icon_height ~packing: !!button#add ()) in let label = lazy ( let shorten_name name = let rec aux name = let name_dots = name ^ "..." in if Gdk.Font.string_width font name_dots > max_text then if name = "" then name_dots else aux (String.sub name 0 (String.length name - 1)) else name_dots in if Gdk.Font.string_width font name > max_text then aux name else name in GMisc.label ~text: (shorten_name name) ~width:button_width ~packing: !!vbox#pack ~justify: `LEFT ()) in let typ = lazy ( try let typ = Livshtype.guess (Filename.concat dir name) in match typ with | ContentType x -> begin match Mstring.split_str (fun c -> c = '/') x with | [mj; mn] -> mj, mn | _ -> assert false end | ContentEncoding x -> "encoding", x | Special m -> "special", m with | _ -> "?","?") in object (self) inherit GObj.widget_full ebox#as_widget method connect_pressed f = pressed := f method connect_enter f = enter := f method connect_leave f = leave := f method typ = !!typ val info_icon = Mylazy.make (fun () -> (* prerr_endline (Printf.sprintf "Icon(%s)" name); *) let info, pixmap = Icon.load_icon (Filename.concat dir name) !!typ in prog#unmap (); !!pix#set_pixmap pixmap; sync (); (* prerr_endline "done"; *) info, pixmap) method info = fst (Mylazy.force info_icon) method icon = snd (Mylazy.force info_icon) val mutable x = -1 val mutable y = -1 method position = x, y method set_position nx ny = x <- nx; y <- ny method name = name initializer let callback v = (fun _ -> (* we create vbox button pix and label if they are not available *) ignore !!vbox; ignore !!button; ignore !!pix; ignore !!label; begin match !info_icon with | Mylazy.Delayed _ -> req#add (fun () -> if !!button#misc#visible then (try ignore (self#icon) with _ -> ())) | _ -> () end; v) in (* (* for the widget visible from the first *) ignore (ebox#misc#connect#draw ~callback: (fun _ -> (* prerr_endline (Printf.sprintf "draw(%s)" name); *) callback () ())); *) (* for newly appearing widgets *) ignore (ebox#event#connect#expose ~callback: (fun _ -> if ebox#misc#visible then begin (* prerr_endline (Printf.sprintf "expose(%s)" name); *) callback true () end else true)) end;; class livsh init_dir func = (* widgets *) let win = GWindow.window ~allow_shrink: true ~allow_grow: true ~width: 100 ~height: 100 ~title: "liv shell" () in let style = win#misc#style in let _ = style#set_font font; win#misc#set_style style; in let vbox = vbox ~packing: win#add () in let vhbox = hbox ~packing: (vbox#pack ~expand: false ~fill: true) () in let toolbar = GButton.toolbar ~packing: (vhbox#pack ~expand: false ~fill: true) () in let _ = toolbar#insert_button ~text: "Back" ~tooltip: "Go back" () in let _ = toolbar#insert_button ~text: "Forward" ~tooltip: "Go forward" () in let _ = toolbar#insert_button ~text: "Reload" ~tooltip: "Reload" () in let _ = toolbar#insert_button ~text: "Home" ~tooltip: "Go to Home" () in let _ = GEdit.entry ~editable: true ~max_length: 256 ~packing: (vhbox#pack ~expand: true ~fill: true) () in let joe = JWidget.img_button ?frames: !!joe_anim ~packing: (vhbox#pack ~expand: false ~fill: false) () in let viewport = GBin.scrolled_window ~hpolicy: `AUTOMATIC ~vpolicy: `ALWAYS ~packing: (vbox#pack ~expand: true ~fill: true) () in let fixed = GPack.fixed ~border_width: 2 ~width: 1 ~height: 1 () in (* let fixed = GPack.layout ~border_width: 2 ~layout_width: 1000 ~layout_height: 1000 () in *) let _ = viewport#add_with_viewport fixed#coerce in let reconf_tout = ref None in object (self) inherit icon_creator inherit JWidget.status_bar ~packing: (vbox#pack ~expand: false ~fill: false) ~show: true () as status_bar method! activate () = joe#start_rotate; status_bar#activate () method deactivate () = joe#stop_rotate; status_bar#set_fraction 0.0 val mutable dir = init_dir val mutable items = [] val mutable prevw = -1 val mutable prevh = -1 method reconfigure () = let content_window = Gdk.Window.get_parent (Gdk.Window.get_parent fixed#misc#window) in let vw,vh = Gdk.Drawable.get_size content_window in if vw <> prevw || vh <> prevh then begin joe#start_rotate; prevw <- vw; prevh <- vh; (* prerr_endline "RECONFIG"; prerr_endline (Printf.sprintf "get size done (%d,%d)" vw vh); *) fixed#misc#unmap (); let mx = ref 0 and my = ref 0 in let x = ref 0 and y = ref 0 in let positions = List.map (fun _item -> let px = !x and py = !y in if !mx < !x + button_width then mx := !x + button_width; if !my < !y + button_height + label_height then my := !y + button_height + label_height; x := !x + button_width; if !x + button_width > vw then begin x := 0; y := !y + button_height + label_height end; px, py) items in let adj = viewport#vadjustment in adj#set_value 0.0; viewport#set_vadjustment adj; List.iter2 (fun item (x,y) -> let ix, _iy = item#position in if ix < 0 then fixed#put item#coerce ~x ~y else fixed#move item#coerce ~x ~y; item#set_position x y) items positions; (* prerr_endline (Printf.sprintf "change %dx%d" !mx !my); *) fixed#misc#set_size_request ~width: !mx ~height: !my (); fixed#misc#map (); end method force_reconfigure () = prevw <- -1; prevh <- -1; self#reconfigure () method open_dir d = joe#start_rotate; self#clear (); let num_files = ref 0 in List.iter (fun item -> item#destroy ()) items; items <- []; self#set_text ("Opening "^d^" ..."); let dh = Unix.opendir d in let files = let files = ref [] in begin try while true do files := Unix.readdir dh :: !files; self#activate (); sync (); incr num_files; done with | End_of_file -> () end; Unix.closedir dh; !files in self#set_text ""; self#set_fraction 0.0; (* successfully loaded *) dir <- d; self#set_text ("Scanning " ^ d); let items_unsort = let cntr = ref 0 in List.fold_right (fun f acc -> incr cntr; self#set_fraction (float !cntr /. float !num_files); sync (); if f = "." || f = ".xvpics" then acc else begin let box = new icon ~dir: dir ~name: f (self :> icon_creator) in ignore ( box#connect_pressed (fun () -> Livmisc.after (fun () -> if !active then begin active := false; let file = Livmisc.normalize_filename (Filename.concat dir f) in let typ = box#typ in prerr_endline ("Pressed " ^ file ^ " (" ^ fst typ ^ "/" ^ snd typ ^ ")"); match typ with | "special", "dir" | "special", "lnkdir" -> self#open_dir file; self#force_reconfigure () | t -> func file t end) (fun () -> active := true))); box#connect_enter (fun () -> self#set_text (Filename.concat dir f)); box#connect_leave (fun () -> self#set_text ""); box :: acc end) files [] in let sortf a b = let typval i = match i#typ with | "special", "dir" -> 0 | "special", "lnkdir" -> 0 | "special", _ -> 10 | _ -> 100 in if typval a = typval b then a#name < b#name else typval a < typval b in items <- Sort.list sortf items_unsort; self#set_text ""; self#deactivate () initializer ignore (win#connect#destroy ~callback: (fun () -> self#clear (); match !reconf_tout with | Some id -> GMain.Timeout.remove id | None -> ())); self#open_dir dir; (* This does not work well... ignore (win#connect#after#event#configure ~callback: (fun _ -> self#reconfigure (); true)); *) reconf_tout := Some (GMain.Timeout.add ~ms: 500 ~callback: (fun _ -> self#reconfigure (); true)); win#set_default_size ~width: (button_width * 13 / 2) ~height: ((button_height + label_height) * 9 / 2); win#show (); end;; camlspotter-camlimages-e471b3c4470d/examples/liv/livshtype.ml0000644000000000000000000001012612405272062022363 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: livshtype.ml,v 1.5 2004/09/24 10:55:08 weis Exp $ *) open Mstring;; open Unix;; open Images;; (* open Info;; *) type typ = | ContentType of string | ContentEncoding of string | Special of string;; let default_mime_types = "/etc/mime.types";; let suffixes = Hashtbl.create 107;; let add_suffix (s, t) = Hashtbl.add suffixes s t;; (* Even if we don't have a suffix file... *) (* If the suffix file says otherwise, it will have priority *) let default_mime_suffixes = [ "html", ContentType "text/html"; "htm", ContentType "text/html"; "txt", ContentType "text/plain"; "ps", ContentType "application/postscript"; "dvi", ContentType "application/x-dvi"; "advi", ContentType "application/advi"; "gif", ContentType "image/gif"; "jpeg", ContentType "image/jpeg"; "jpg", ContentType "image/jpeg"; "bmp", ContentType "image/bmp"; "png", ContentType "image/png"; "tiff", ContentType "image/tiff"; "tif", ContentType "image/tiff"; "au", ContentType "audio/basic"; "snd", ContentType "audio/basic"; "wav", ContentType "audio/x-wav"; "mid", ContentType "audio/midi"; "mpeg", ContentType "video/mpeg"; "mpg", ContentType "video/mpeg"; "avi", ContentType "video/avi"; "wmv", ContentType "video/wmv"; "fli", ContentType "video/fli"; "flc", ContentType "video/fli"; "gz", ContentEncoding "gzip"; "Z", ContentEncoding "compress"; "asc", ContentEncoding "pgp"; "pgp", ContentEncoding "pgp"; "cmo", ContentType "application/x-caml-applet"; ];; List.iter add_suffix default_mime_suffixes;; (* mime_types *) let read_suffix_file f = try let ic = open_in f in try while true do let l = input_line ic in if l <> "" && l.[0] <> '#' then let tokens = split_str (function ' ' | '\t' -> true | _ -> false) l in match tokens with | [] -> () | x :: l -> try ignore (String.index x '/'); List.iter (function sufx -> add_suffix (sufx, ContentType x)) l with | Not_found -> List.iter (function sufx -> add_suffix (sufx, ContentEncoding x)) l done with End_of_file -> close_in ic with Sys_error _ -> ();; let guess link_as_link f = let from_header f = match Images.guess_format f with | Gif -> ContentType "image/gif" | Tiff -> ContentType "image/tiff" | Jpeg -> ContentType "image/jpeg" | Png -> ContentType "image/png" | Xpm -> ContentType "image/x-xpixmap" | Bmp -> ContentType "image/bmp" | Ppm -> ContentType "image/x-portable-pixmap" | Ps -> ContentType "application/postscript" in let st = if link_as_link then Unix.lstat f else Unix.stat f in match st.st_kind with | S_DIR -> Special "dir" | S_CHR -> Special "chr" | S_BLK -> Special "blk" | S_LNK -> begin try let st = Unix.stat f in match st.st_kind with | S_DIR -> Special "lnkdir" | _ -> begin try from_header f with _ -> Special "lnk" end with | _ -> Special "lnk" end | S_FIFO -> Special "fifo" | S_SOCK -> Special "sock" | _ -> begin try from_header f with | _ -> Hashtbl.find suffixes (String.lowercase (snd (Livmisc.get_extension f))) end;; let guess = guess false (* prerr_endline "reading suffix"; *) let () = read_suffix_file default_mime_types camlspotter-camlimages-e471b3c4470d/examples/liv/livshtype.mli0000644000000000000000000000027112405272062022534 0ustar 00000000000000type typ = ContentType of string | ContentEncoding of string | Special of string val default_mime_types : string val read_suffix_file : string -> unit val guess : string -> typ camlspotter-camlimages-e471b3c4470d/examples/liv/mylazy.ml0000644000000000000000000000257512405272062021672 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Damien Doligez, projet Para, INRIA Rocquencourt *) (* *) (* Copyright 1997 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the GNU Library General Public License, with *) (* the special exception on linking described in file ../LICENSE. *) (* *) (***********************************************************************) (* $Id: mylazy.ml,v 1.2 2004/09/23 07:20:20 weis Exp $ *) (* Module [Lazy]: deferred computations *) type 'a status = | Delayed of (unit -> 'a) | Value of 'a | Exception of exn ;; type 'a t = 'a status ref;; exception Undefined;; let make f = ref (Delayed f);; let make_val v = ref (Value v);; let force l = match !l with | Value v -> v | Exception e -> raise e | Delayed f -> l := Exception Undefined; try let v = f () in l := Value v; v with e -> l := Exception e; raise e ;; camlspotter-camlimages-e471b3c4470d/examples/liv/mylazy.mli0000644000000000000000000000327212405272062022036 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Damien Doligez, projet Para, INRIA Rocquencourt *) (* *) (* Copyright 1997 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the GNU Library General Public License, with *) (* the special exception on linking described in file ../LICENSE. *) (* *) (***********************************************************************) (* $Id: mylazy.mli,v 1.1 2002/04/09 11:00:09 furuse Exp $ *) (** Deferred computations. *) type 'a status = Delayed of (unit -> 'a) | Value of 'a | Exception of exn type 'a t = 'a status ref (** A value of type ['a Lazy.t] is a deferred computation (also called a suspension) that computes a result of type ['a]. The expression [lazy (expr)] returns a suspension that computes [expr]. **) exception Undefined val make : (unit -> 'a) -> 'a t val make_val : 'a -> 'a t val force : 'a t -> 'a (** [Lazy.force x] computes the suspension [x] and returns its result. If the suspension was already computed, [Lazy.force x] returns the same value again. If it raised an exception, the same exception is raised again. Raise [Undefined] if the evaluation of the suspension requires its own result. *) camlspotter-camlimages-e471b3c4470d/examples/liv/pathfind.ml0000644000000000000000000000401612405272062022132 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: pathfind.ml,v 1.11 2004/09/23 07:20:20 weis Exp $ *) open Unix;; (* Tilde substitution *) (* skip to next / *) let rec next_slash s n = if n >= String.length s || s.[n] = '/' then n else next_slash s (succ n);; let tilde_subst s = try if s = "" || s.[0] <> '~' then s else let len = String.length s in if len = 1 then Sys.getenv "HOME" else match s.[1] with | '/' -> Filename.concat (Sys.getenv "HOME") (String.sub s 2 (len - 2)) | _ -> let final = next_slash s 1 in let user = String.sub s 1 (pred final) in let pwnam = getpwnam user in if succ final >= len then pwnam.pw_dir else Filename.concat pwnam.pw_dir (String.sub s (succ final) (len - succ final)) with | Unix_error (_, _, _) -> s | Sys_error _ -> s | Not_found -> s;; let find pathlist s = if s.[0] = '/' then if Sys.file_exists s then s else raise Not_found else begin let f = ref "" in try List.iter (fun path -> f := Filename.concat (tilde_subst path) s; (* prerr_endline ("tring "^ !f); *) if Sys.file_exists !f then raise Exit) pathlist; raise Not_found with | Exit -> !f end;; camlspotter-camlimages-e471b3c4470d/examples/liv/scandir.ml0000644000000000000000000000440012405272062021755 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: scandir.ml,v 1.10 2008/06/16 22:35:42 furuse Exp $ *) open Unix;; let ignore_dirs = ref [".xvpics"; ".livpics"; "0000HEADER"; "0000HEADERS"];; let scan_dir f fn = let scanned = ref [] in let rec sub fn = let st = stat fn in match st.st_kind with | S_DIR when not (List.mem st.st_ino !scanned) -> scanned := st.st_ino :: !scanned; let dh = opendir fn in let files = ref [] in begin try while true do files := readdir dh :: !files done with | End_of_file -> () | e -> prerr_endline ("readdir: " ^ Printexc.to_string e) end; closedir dh; let files = List.sort (fun x y -> compare y x) !files in let subdirs = ref [] in let treat fn' = if not (fn' = ".." || fn' = ".") then begin let fn'' = Filename.concat (if fn = "." then "" else fn) fn' in try let st = Unix.stat fn'' in match st.st_kind with | S_DIR -> (* sub-dir check is delayed *) if not (List.mem fn' !ignore_dirs) then subdirs := fn'' :: !subdirs | _ -> f fn'' (* or sub fn', but it's more efficient *) with | Unix.Unix_error(_,"stat",_) -> prerr_endline (fn'' ^ ": stat failed") | e -> prerr_endline (fn'' ^ ": " ^ Printexc.to_string e) end in List.iter treat files; List.iter sub (List.rev !subdirs) | S_DIR -> () | _ -> f fn in sub fn;; camlspotter-camlimages-e471b3c4470d/examples/liv/seq.ml0000644000000000000000000000217112405272062021125 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: seq.ml,v 1.3 2004/09/21 18:15:46 weis Exp $ *) open Images;; let load_sequence_as_pixmaps ~window file = let seq = load_sequence file [] in let seq = unoptimize_sequence seq in List.map (fun frame -> Ximage.pixmap_of_image window None frame.frame_image, frame.frame_delay) seq.seq_frames;; camlspotter-camlimages-e471b3c4470d/examples/liv/sound.xpm0000644000000000000000000002246112405272062021665 0ustar 00000000000000/* XPM */ static char * image_name[] = { "48 48 212 2", " c #618561856185", ". c #FFFFFFFFFFFF", "X c #D75CD34CDF7D", "o c #CF3CCF3CDF7D", "O c #CF3CCB2BDF7D", "+ c #C71BC30BDF7D", "@ c #BEFBBEFBDF7D", "# c #BEFBBAEADF7D", "$ c #B6DAB6DADF7D", "% c #B6DAB2CADF7D", "& c #AEBAAEBADF7D", "* c #AEBAAAAADF7D", "= c #A699A699DF7D", "- c #A699A289DF7D", "; c #9E799E79DF7D", ": c #9E799A69DF7D", "> c #96589658DF7D", ", c #96589248DF7D", "< c #8E388E38DF7D", "1 c #8E388A28DF7D", "2 c #86178617DF7D", "3 c #C71BC30BCF3C", "4 c #596555555965", "5 c #492449244924", "6 c #492445144103", "7 c #410341034103", "8 c #41033CF34103", "9 c #41033CF338E3", "0 c #38E338E338E3", "q c #410338E34103", "w c #38E334D338E3", "e c #30C230C230C2", "r c #61855D7579E7", "t c #A699A289D75C", "y c #69A669A669A6", "u c #20811C711861", "i c #208118611861", "p c #208114511861", "a c #30C22CB228A2", "s c #86178617AEBA", "d c #28A21C712081", "f c #5965596571C6", "g c #86178207DF7D", "h c #BEFBBAEAC71B", "j c #38E334D330C2", "k c #410338E338E3", "l c #38E330C230C2", "z c #28A228A228A2", "x c #410334D328A2", "c c #79E771C64103", "v c #C71BC30B9658", "b c #E79DDB6C6185", "n c #F7DEEBAD5144", "m c #186114511040", "M c #28A220812081", "N c #186118611861", "B c #186114511861", "V c #28A224921040", "C c #861779E728A2", "Z c #AEBAA69938E3", "A c #E79DDB6C4103", "S c #FFFFF3CE4924", "D c #79E77DF7DF7D", "F c #B6DAB2CAC71B", "G c #6185596528A2", "H c #EFBEE79D4924", "J c #C71BBEFB79E7", "K c #B6DAAAAAAEBA", "L c #CF3CC71B4103", "P c #8E38861738E3", "I c #61854D342081", "U c #96589658CF3C", "Y c #79E779E7DF7D", "T c #104014511040", "R c #596555552081", "E c #20811C712081", "W c #30C22CB238E3", "Q c #C71BBEFB9658", "! c #186110401040", "~ c #28A2249228A2", "^ c #514449244924", "/ c #51444D345144", "( c #8E388617C71B", ") c #BEFBB6DA9E79", "_ c #AEBAAAAAC71B", "` c #618559655965", "' c #596555551861", "] c #861775D62081", "[ c #AEBAA289AEBA", "{ c #71C675D6DF7D", "} c #18610C301040", "| c #492445144924", " . c #10400C301040", ".. c #28A2249230C2", "X. c #BEFBB2CA9658", "o. c #71C669A669A6", "O. c #8E3886178E38", "+. c #D75CCF3C79E7", "@. c #EFBEE38D5965", "#. c #E79DDF7D6185", "$. c #71C671C6DF7D", "%. c #104008201040", "&. c #861782078617", "*. c #965879E779E7", "=. c #30C22CB230C2", "-. c #38E330C20820", ";. c #D75CBEFB30C2", ":. c #71C675D6D75C", ">. c #A699A289AEBA", ",. c #104010401040", "<. c #38E32CB21040", "1. c #D75CCF3C4924", "2. c #F7DEEFBE4924", "3. c #8E386DB628A2", "4. c #EFBECB2B38E3", "5. c #8E387DF7AEBA", "6. c #B6DAAEBA9658", "7. c #69A66DB6DF7D", "8. c #FFFFD75C2081", "9. c #79E771C65144", "0. c #86178617D75C", "q. c #A6999E79AEBA", "w. c #A699A699C71B", "e. c #71C6659538E3", "r. c #69A669A6DF7D", "t. c #104008200820", "y. c #514451445144", "u. c #596559655965", "i. c #28A2249238E3", "p. c #9E79861779E7", "a. c #61856595DF7D", "s. c #61855D7569A6", "d. c #71C671C679E7", "f. c #79E775D679E7", "g. c #79E779E7AEBA", "h. c #71C66DB671C6", "j. c #28A2208128A2", "k. c #861782078E38", "l. c #DF7DCF3C5144", "z. c #79E775D69658", "x. c #61856185DF7D", "c. c #A699A289CF3C", "v. c #79E779E78617", "b. c #10400C300820", "n. c #69A66DB6CF3C", "m. c #9E799248AEBA", "M. c #D75CCF3C71C6", "N. c #86177DF78617", "B. c #71C671C6C71B", "V. c #AEBAAAAA9658", "C. c #E79DDB6C5965", "Z. c #59655D75DF7D", "A. c #208120812081", "S. c #9E799A69A699", "D. c #86177DF78E38", "F. c #6185596569A6", "G. c #38E330C228A2", "H. c #9E7996584103", "J. c #69A66595D75C", "K. c #A699A2899658", "L. c #59655965DF7D", "P. c #9E799E79CF3C", "I. c #69A6618530C2", "U. c #AEBAA2899658", "Y. c #DF7DD34C4924", "T. c #6185618569A6", "R. c #96589248AEBA", "E. c #51445555DF7D", "W. c #596555556185", "Q. c #965896589E79", "!. c #8E388A289658", "~. c #69A669A671C6", "^. c #B6DAAAAA5965", "/. c #96588E38AEBA", "(. c #A6999E799E79", "). c #49244D345144", "_. c #861786179658", "`. c #492445145965", "'. c #69A6659569A6", "]. c #79E771C638E3", "[. c #51445144DF7D", "{. c #AEBAA28971C6", "}. c #96588A2838E3", "|. c #AEBA9E799658", " X c #861771C69E79", ".X c #61856595D75C", "XX c #71C66595AEBA", "oX c #BEFB8E381861", "OX c #49244D34DF7D", "+X c #A699A699AEBA", "@X c #79E775D628A2", "#X c #DF7DD34C69A6", "$X c #61855D75BEFB", "%X c #61855D75AEBA", "&X c #71C6659528A2", "*X c #61856595AEBA", "=X c #59655965D75C", "-X c #59655144C71B", ";X c #61854D3430C2", ":X c #69A64D340820", ">X c #30C22CB24103", ",X c #69A665959658", " > , , , < < 1 1 . ", " X X X o o O O O + + + + @ @ @ # # $ $ % % % & & * * * = = - - - ; ; : : > > , , , < < 1 1 2 . ", " X X o 3 4 5 5 6 7 8 8 9 0 9 0 0 0 q 0 0 0 0 0 0 w e r t - - ; ; ; : : > > > , , < < 1 1 2 2 . ", " X o X y u i i i i i p i i i i i i i i i i i i i i i a s - - ; ; : : > > , , , < < 1 1 2 2 2 . ", " o o 3 u u i i i i i p u i i u i u u u u i u i i u u d f - ; ; : : > > , , , < < 1 1 2 2 2 g . ", " o O h j 0 0 9 6 9 7 9 0 k j a l j e a a a e e a a z x c v b n : : > , , , < < 1 1 2 2 2 g g . ", " O O h m d M N B p B B N i i i i p i i i i d V C Z A S S S S S > > , , , < < 1 1 2 2 2 g g D . ", " O O F m 8 7 N p B N N N i i i i i i i i i i G S S S H J v K v > , , , < < 1 1 2 2 2 g g D D . ", " O + F m j l m N N N N B B N i N i i i N i i G L P I i a U > v > , , < < 1 1 2 2 2 g g D D Y . ", " + + F T m T m B i N p N m p M u i B N N N N R C i E i W > > Q , , < < 1 1 2 2 2 g g D D Y Y . ", " + + F m m m m m ! m B m ~ 6 ^ / 5 ~ B B N B R C N N i W > , Q , < < ( ) 2 2 2 g g D D Y Y Y . ", " + + _ T ! m ! m m m m d 9 ^ 4 ` ^ 8 ~ m m m ' ] N N i W , , Q < < < [ S 2 2 g g D D Y Y Y { . ", " + @ _ } m ! m m m ! T 9 6 ^ 9 e ^ 5 | T ! m ' ] ! N N W , , Q < 1 1 [ b 2 g g D D Y Y Y { { . ", " @ @ _ T ! .! ! ! ! T 6 6 ^ 0 j j / 5 ! ! m ' ] m m N .., < Q 1 1 1 [ X.g g D D Y Y Y { { { . ", " @ @ _ .! ! ! m .m } 6 6 o.K O./ | | m m m ' ] T m m I +.@.#.1 2 2 [ X.g D D Y Y Y { { $.$.. ", " @ # _ T m .! .! m %.z ^ 4 &.*.^ ^ =.m B m G ] i m -.S S S ;.:.1 g >.X.D D Y Y Y { { { $.$.. ", " # # _ .m .m m .m } T a ^ ^ ^ 6 a ,.<.1.2.S 3.9 } V 2.S 4.5.2 2 g >.6.D Y Y Y { { $.$.$.7.. ", " # $ _ . . . . .,.} } } ,.u l l d m m L S S 8.9.6 T m a ( 0.g g g g q.6.Y Y Y { { { $.$.7.7.. ", " $ $ w. .} %. .} ,. . .} } } } .%.m m ] A 4.e.` e m m ..2 2 2 g g D q.6.Y Y { { $.$.$.7.7.r.. ", " $ % w. .t. . .,.,.} t.} z y. / w N .T . .T T ! m ..2 2 g g D D [ 6.Y { { { $.$.7.7.r.r.. ", " % % w.t. .t.} T . .z 4 ^ y.u.u.` / u.y.u } m m .! m i.2 g g 5.b 2.S p.{ { $.$.$.7.7.r.r.a.. ", " % % w.t. .%. . .} w 5 s.&.&.d.y d.&.f.4 4 z .m m .m ..g g D b S S 8.g.{ { $.$.7.7.r.r.a.a.. ", " % & w.t.%. .t.} e ^ &.h.l ~ M j.d j.7 k.y 7 i T ,. .m ..g D D X.@.l.z.{ $.$.$.7.7.r.r.r.a.a.. ", " & & w.t.} %.t.z 8 k.^ a z z z ~ ~ j.~ u y y 0 B } ! ,...D D Y Y Y Y { $.$.$.7.7.r.r.a.a.a.x.. ", " & * c.t. .t.N j v./ =.a a ~ M M M j.j.~ M d.5 =.b.m m ..D Y Y Y { { { $.$.7.n.m.6.M.n a.x.x.. ", " * * c.} .t.z 5 h.l =.a ~ M l 9 ~ M j.~ ~ j.N.9 N m ...Y Y Y { { { B.V.v C.S S S S S x.x.Z.. ", " * * c.} .T w d.8 l =.a A.=.k.S.v.M j.~ z u h.7 A.} ,...Y Y { { { $.m.S S S n M.V.5.V.x.Z.Z.. ", " * = c.} .i 8 N.a =.e e i =.s.D.F.~ d j.~ G.H. a } ,...Y { { { $.$.m.b V.5.J.a.a.x.K.x.Z.L.. ", " = = P.} .u 6 v.=.=.W =.B u e 8 =.i M ~ ~ I.S y l } m ..{ { $.$.$.7.m.U.r.a.a.a.x.x.K.Z.Z.L.. ", " = - c.} } E 6 k.W e 0 q ~ B M j.i E ~ ~ ~ I.Y.T.l ,.T ..{ { $.$.7.7.m.U.r.a.a.x.x.x.K.L.L.L.. ", " - - P.T %.i | D.e q 8 | 4 8 m ,.~ 0 =.a z I.H.u.a T ! ..$.$.$.7.7.r.R.U.a.a.x.x.Z.Z.K.L.L.E.. ", " - - P.T m B 8 d.4 8 | / W.v.Q.!.~.7 q e a G ^.8 M m m ..$.$.7.7.r.r./.U.a.x.x.Z.Z.L.(.L.E.E.. ", " - ; P.T ! } =.)._.`./ 4 '.~.~.~.W.| 8 w j ].^.l N m m ..$.7.7.r.r.a./.U.x.x.Z.Z.Z.L.(.E.E.[.. ", " ; ; P.T m } d 5 v.d.W.F.y ~.'.'.s./ 6 8 q {.}.a ! B m i.7.7.r.r.a.a./.|.x.Z.Z. XJ C.b E.[.[.. ", " ; : P.m m m } =.0 !.!.d.~.'.'.s.F.W.).).z.H.}.i N N B i.7.r.r.r.a..XR.|.Z.Z.XXS S S oX[.[.OX. ", " : : P.m ! m } ! e 9 f.+X!.v.v.h.h.~.v._.4 e.@Xm m m m i.r.r.a.XX#X2.S *.Z.L.$X2.S 4.%X[.OXOX. ", " : > U . .t.} ,.p j j 6 N.S.S.R.S._.'.6 0 &X] m m m m i.r.r.a.b S S 8.*XL.L.L.=X-X[.[.OXOXOX. ", " > > U ,.%.t.t. .%.m z k a j 6 ^ 7 7 ;XL 2.S :XT ! ! T >Xa.a.a.|.@.l.,XL.L.L.E.E.[.[.OXOXOX , P. .%.%.%.t.} .} B u a l l a A.1XS S 8.V ! m ! ! `.a.a.x.x.Z.Z.Z.L.L.E.E.[.[.OXOXOX () : [ `FORCE | `DIR ] option -> unit);; let nexttimeout = ref None;; let set_timeout () = (* prerr_endline "set timeout"; *) if !wait <> 0.0 then nexttimeout := Some (Timeout.add ~ms: (truncate (!wait *. 1000.0)) ~callback: (fun () -> !hook_next None; false));; let remove_timeout () = (* prerr_endline "remove timeout"; *) may Timeout.remove !nexttimeout;; camlspotter-camlimages-e471b3c4470d/examples/liv/viewer.ml0000644000000000000000000000502712405272062021641 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: viewer.ml,v 1.5 2004/09/23 07:20:20 weis Exp $ *) open Gdk;; open Gtk;; (* image viewer widget *) let sync () = while Glib.Main.iteration false do () done;; (* screen *) let screen_width = Gdk.Screen.width ();; let screen_height = Gdk.Screen.height ();; (* the viewer *) class viewer ?border_width ?width ?height ?packing ?show () = let fixed = GPack.fixed ?border_width ?width ?height ?packing ?show () in (* let prog = new_progress_bar ~packing: (fixed#put ~x:0 ~y:0) ~text: "" () in *) let prog = GRange.progress_bar ~packing: (fixed#put ~x:0 ~y:0) () in let visual = prog#misc#visual in object inherit GPack.fixed (Obj.magic fixed#as_widget : Gtk.fixed obj) val colormap = Gdk.Color.get_system_colormap () val color_create = Truecolor.color_creator visual val color_parser = Truecolor.color_parser visual val mutable previous_size = (-1,-1) method progress = prog method display (ximage : OXimage.ximage) = let pixmap = let win = fixed#misc#window in let pix = Gdk.Pixmap.create ~window: win ~depth: (Gdk.Visual.depth visual) ~width: ximage#width ~height: ximage#height () in let pixmap = new GDraw.drawable pix in pixmap#put_image ~x:0 ~y:0 ~width: ximage#width ~height: ximage#height ~xsrc:0 ~ysrc:0 ximage#data; pix in previous_size <- (ximage#width,ximage#height); fixed#misc#set_size_request ~width: ximage#width ~height: ximage#height (); Gdk.Window.set_back_pixmap fixed#misc#window (`PIXMAP pixmap); sync () end;; let viewer ?border_width ?width ?height ?packing ?show () = new viewer ?border_width ?width ?height ?packing ?show ();; camlspotter-camlimages-e471b3c4470d/examples/monochrome/.cvsignore0000644000000000000000000000002512405272062023353 0ustar 00000000000000Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/monochrome/OMakefile0000644000000000000000000000203612405272062023136 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) BuildExample(monochrome, monochrome, all_formats) camlspotter-camlimages-e471b3c4470d/examples/monochrome/monochrome.ml0000644000000000000000000000263212405272062024061 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: monochrome.ml,v 1.7 2009/02/08 15:25:37 weis Exp $ *) open Images;; let _ = let files = ref [] in Arg.parse [] (fun s -> files := s :: !files) "monochrome src dst"; let src, dst = match List.rev !files with | [src; dst] -> src, dst | _ -> invalid_arg "you need two arguments" in let src = OImages.rgb24 (OImages.load src []) in (* Make monochrome *) for x = 0 to src#width - 1 do for y = 0 to src#height - 1 do let rgb = src#get x y in let mono = Color.brightness rgb in src#set x y { r = mono; g = mono; b = mono; } done done; src#save dst None [] ;; camlspotter-camlimages-e471b3c4470d/examples/normalize/.cvsignore0000644000000000000000000000002512405272062023205 0ustar 00000000000000Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/normalize/OMakefile0000644000000000000000000000203412405272062022766 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) BuildExample(normalize, normalize, all_formats) camlspotter-camlimages-e471b3c4470d/examples/normalize/normalize.ml0000644000000000000000000000315612405272062023547 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: normalize.ml,v 1.7 2004/09/24 10:55:10 weis Exp $ *) let files = ref [] ;; Arg.parse [] (fun s -> files := s :: !files) "normalize src dst" ;; let src, dst = match List.rev !files with | [src; dst] -> src, dst | _ -> assert false ;; let src = OImages.rgb24 (OImages.load src []) ;; let _ = (* Make monochrome *) let hist = Colorhist.create () in for x = 0 to src#width - 1 do for y = 0 to src#height - 1 do Colorhist.store_sample hist (src#get x y) done done; prerr_endline "histogram done"; let normalizer = Colorhist.normalize 0.9 hist in prerr_endline "normalizer done"; for x = 0 to src#width - 1 do for y = 0 to src#height - 1 do let rgb = src#get x y in let new_rgb = normalizer rgb in src#set x y new_rgb; done done ;; src#save dst None [];; camlspotter-camlimages-e471b3c4470d/examples/resize/.cvsignore0000644000000000000000000000002512405272062022506 0ustar 00000000000000Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/resize/OMakefile0000644000000000000000000000202612405272062022270 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) BuildExample(resize, resize, all_formats) camlspotter-camlimages-e471b3c4470d/examples/resize/README0000644000000000000000000000023212405272062021366 0ustar 00000000000000Resize images % resize -scaie creates an image file "out.", scaled image of by . Just works with Rgb24 image classes.camlspotter-camlimages-e471b3c4470d/examples/resize/resize.ml0000644000000000000000000000306512405272062022350 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: resize.ml,v 1.11 2004/09/21 18:15:48 weis Exp $ *) open Images;; let file = ref "";; let scale = ref 1.0;; Arg.parse [ "-scale", Arg.Float (fun sc -> scale := sc), "scale"; ] (fun s -> file := s) "resize -scale ? file";; let file = !file;; let scale = !scale;; let outfile = "out" ^ file;; Bitmap.maximum_live := 15000000; (* 60MB *) Bitmap.maximum_block_size := !Bitmap.maximum_live / 16; let r = Gc.get () in r.Gc.max_overhead <- 30; Gc.set r;; let fmt, _ = Images.file_format file in let img = OImages.load file [] in let img = OImages.rgb24 img in let nw = truncate (float img#width *. scale) and nh = truncate (float img#height *. scale) in let newimage = img#resize None nw nh in img#destroy; newimage#save outfile (Some fmt) [Save_Quality 95];; camlspotter-camlimages-e471b3c4470d/examples/tiffps/.cvsignore0000644000000000000000000000002512405272062022500 0ustar 00000000000000Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/tiffps/OMakefile0000644000000000000000000000202712405272062022263 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) BuildExample(tiffps, tiffps, tiff jpeg ps) camlspotter-camlimages-e471b3c4470d/examples/tiffps/README0000644000000000000000000000111012405272062021354 0ustar 00000000000000Tiffps is a filter from a tiff (and jpeg) file to postscript. Usage: tiffps infile infile must be a tiff (or jpeg), and the program outputs a postscript file to the standard output. Command line options: There are many options. Try tiffps -help to print help message. I hope it explains enough. Note: Do not try tiffps for jpeg files. It works, but the result is in Postscript level 1 (without compression). For jpeg files you should use jpeg2ps, a wrapper for Postscript level 2 found at: http://www.pdflib.com/jpeg2ps/index.html This is much smaller and faster. camlspotter-camlimages-e471b3c4470d/examples/tiffps/tiffps.ml0000644000000000000000000003360312405272062022335 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: tiffps.ml,v 1.11 2008/05/17 19:55:50 furuse Exp $ *) open Images;; open Printf;; (* String utilities *) (* split a string according to char_sep predicate *) let split_str char_sep str = let len = String.length str in if len = 0 then [] else let rec skip_sep cur = if cur >= len then cur else if char_sep str.[cur] then skip_sep (succ cur) else cur in let rec split beg cur = if cur >= len then if beg = cur then [] else [String.sub str beg (len - beg)] else if char_sep str.[cur] then let nextw = skip_sep cur in String.sub str beg (cur - beg) :: split nextw nextw else split beg (succ cur) in let wstart = skip_sep 0 in split wstart wstart;; let inch_cm = 2.53012048193;; let inch_pt = 72.0;; let units = [ "mm", 0.1 /. inch_cm *. inch_pt; "cm", 1.0 /. inch_cm *. inch_pt; "pt", 1.0; "in", inch_pt ];; let parse_length s = (* return in pt *) let v = let l = String.length s in let digit, unit = if l > 2 then String.sub s 0 2, String.sub s (l-2) 2 else "", "" in try List.assoc (String.lowercase unit) units *. float_of_string digit with | Not_found -> (* think it is in "pt" *) float_of_string s in prerr_endline (Printf.sprintf "%s -> %fpt" s v); v;; (* Scanlined loader *) type scanlined_loader = { read_next_line: (string -> unit); close: (unit -> unit) };; let scanline_open name = match Images.file_format name with | Jpeg, _ -> let w,h,ic,_rev_markers = Jpeg.open_in name in let y = ref 0 in w, h, 200.0, { read_next_line = (fun buf -> Jpeg.read_scanline ic buf !y; incr y); close = (fun () -> Jpeg.close_in ic) } | Tiff, _ -> let w, h, dpi, _, ic = Tiff.open_in name in let y = ref 0 in w, h, dpi, { read_next_line = (fun buf -> Tiff.read_scanline ic buf !y; incr y); close = (fun () -> Tiff.close_in ic) } | _ -> assert false;; type rot = Rot0 | Rot90 | Rot180 | Rot270 | RotMax;; type at = | TopLeft of float * float | TopRight of float * float | BottomLeft of float * float | BottomRight of float * float | Center of float * float | A4Center;; type crop = { mutable cx : int; mutable cy : int; mutable cw : int; mutable ch : int; };; type size = | A4MaxSize | DPI of float | MaxBox of float * float | MinBox of float * float;; type conf = { mutable name : string; mutable crop : crop option; mutable rot : rot; mutable size : size; mutable pos : at; mutable mirror : bool; mutable mono : bool; };; let main () = (* global options *) let files = ref [] and justdpi = ref false and comments = ref true and showpage = ref true in let default_conf = { name = "noname"; crop = None; rot = Rot0; size = A4MaxSize; pos = A4Center; mirror = false; mono = false; } in let conf = { name = "noname"; crop = None; rot = Rot0; size = A4MaxSize; pos = A4Center; mirror = false; mono = false; } in let set_default () = conf.name <- default_conf.name; conf.crop <- default_conf.crop; conf.rot <- default_conf.rot; conf.size <- default_conf.size; conf.pos <- default_conf.pos; conf.mirror <- default_conf.mirror; conf.mono <- default_conf.mono in Arg.parse [ "-justdpi", Arg.Unit (fun () -> justdpi := true), ": print dpi information and quit"; "-nocomments", Arg.Unit (fun () -> comments := false), ": no comment lines"; "-noshowpage", Arg.Unit (fun () -> showpage := false), ": no showpage command"; "-crop", Arg.String (fun s -> match List.map int_of_string (split_str (function '+' | 'x' -> true | _ -> false) s) with | [w; h; x; y] -> conf.crop <- Some {cx = x; cy = y; cw = w; ch = h} | _ -> assert false), "?x?+?+? : cropping"; "-a4max", Arg.Unit (fun () -> conf.size <- A4MaxSize; conf.pos <- A4Center), ": expand image to a4 paper"; "-maxbox", Arg.String (fun s -> match List.map parse_length (split_str (function 'x' -> true | _ -> false ) s) with | [w; h] -> conf.size <- MaxBox (w, h) | _ -> assert false), "?x? : upper bound printing size"; "-minbox", Arg.String (fun s -> match List.map parse_length (split_str (function 'x' -> true | _ -> false ) s) with | [w; h] -> conf.size <- MinBox(w, h) | _ -> assert false), "?x? : lower bound printing size"; "-dpi", Arg.Float (fun x -> conf.size <- DPI x), "dpi : dpi setting"; "-at", Arg.String (fun s -> match List.map parse_length (split_str (function 'x' -> true | _ -> false ) s) with | [x; y] -> conf.pos <- BottomLeft (x, y) | _ -> assert false), "?x? : at bottom-left"; "-topleft", Arg.String (fun s -> match List.map parse_length (split_str (function 'x' -> true | _ -> false ) s) with | [x; y] -> conf.pos <- TopLeft (x, y) | _ -> assert false), "?x? : at top-left"; "-bottomleft", Arg.String (fun s -> match List.map parse_length (split_str (function 'x' -> true | _ -> false ) s) with | [x; y] -> conf.pos <- BottomLeft (x, y) | _ -> assert false), "?x? : at bottom-left"; "-topright", Arg.String (fun s -> match List.map parse_length (split_str (function 'x' -> true | _ -> false ) s) with | [x; y] -> conf.pos <- TopRight (x, y) | _ -> assert false), "?x? : at top-right"; "-bottomright", Arg.String (fun s -> match List.map parse_length (split_str (function 'x' -> true | _ -> false ) s) with | [x; y] -> conf.pos <- BottomRight (x, y) | _ -> assert false), "?x? : at bottom-right"; "-center", Arg.String (fun s -> match List.map parse_length (split_str (function 'x' -> true | _ -> false ) s) with | [x; y] -> conf.pos <- Center (x, y) | _ -> assert false), "?x? : at center"; "-rot", Arg.Int (fun x -> let rot = match x with | 0 -> Rot0 | 90 -> Rot90 | 180 -> Rot180 | 270 -> Rot270 | _ -> invalid_arg "rotation must be 90*x" in conf.rot <- rot), "r : rotation (x90 only)"; "-autorot", Arg.Unit (fun () -> conf.rot <- RotMax), ": auto rotate (to have larger image)"; "-mono", Arg.Unit (fun () -> conf.mono <- true), ": monochrome"; "-mirror", Arg.Unit (fun () -> conf.mirror <- true), ": mirror image" ] (fun x -> files := {conf with name = x} :: !files; set_default ()) "tiffps"; let files = List.rev !files in (* paper properties *) let paper_width = 595.0 and paper_height = 842.0 and border = 15.0 in let bbx1 = ref 0.0 and bby1 = ref 0.0 and bbx2 = ref 0.0 and bby2 = ref 0.0 in let first_image = ref true in let set_bbox x1 y1 x2 y2 = if !first_image then begin bbx1 := x1; bby1 := y1; bbx2 := x2; bby2 := y2; first_image := false end else begin if !bbx1 > x1 then bbx1 := x1; if !bby1 > y1 then bby1 := y1; if !bbx2 < x2 then bbx2 := x2; if !bby2 < y2 then bby2 := y2; end in (* printer *) let p = print_endline in let output_image_func conf = (* maximum printing area *) let limitw, limith = match conf.size with | MaxBox (w, h) -> w, h | MinBox (w, h) -> w, h | _ -> paper_width -. border *. 2.0, paper_height -. border *. 2.0 in (* open the file just to get the image size info. *) let imgw, imgh, _orgdpi, th = scanline_open conf.name in th.close (); (* cropping area *) let w, h, x1, y1 = match conf.crop with | Some crop -> (* check cropping area *) if crop.cx + crop.cw > imgw then crop.cw <- imgw - crop.cx; if crop.cy + crop.ch > imgh then crop.ch <- imgh - crop.cy; crop.cw, crop.ch, crop.cx, crop.cy | None -> imgw, imgh, 0, 0 in (* auto rotation *) if conf.rot = RotMax then begin let ratio0 = let rw = limitw /. (float w) and rh = limith /. (float h) in match conf.size with | MinBox _ -> if rw < rh then rh else rw | _ -> if rw > rh then rh else rw in let ratio90 = let rw = limith /. (float w) and rh = limitw /. (float h) in match conf.size with | MinBox _ -> if rw < rh then rh else rw | _ -> if rw > rh then rh else rw in match conf.size with | MinBox _ -> (* smaller is better *) conf.rot <- if ratio0 < ratio90 then Rot0 else Rot90 | _ -> (* larger is better *) conf.rot <- if ratio0 > ratio90 then Rot0 else Rot90 end; (* from the point of view of the image *) let limitw, limith = match conf.rot with | Rot0 | Rot180 -> limitw, limith | Rot90 | Rot270 -> limith, limitw | _ -> assert false in (* dpi *) let ratio = match conf.size with | DPI dpi -> prerr_endline (sprintf "%s : %f dpi" conf.name dpi); paper_width /. 8.26 /. dpi | _ -> let ratio = if limitw /. float w *. float h < limith then limitw /. float w else limith /. float h in let dpi = paper_width /. 8.26 /. ratio in prerr_endline (sprintf "%s : %f dpi" conf.name dpi); ratio in (* if just for printing dpi, quit. *) if !justdpi then raise Exit; let rw = float w *. ratio and rh = float h *. ratio in (* now on the paper ... *) let prw, prh = match conf.rot with | Rot0 | Rot180 -> rw, rh | Rot90 | Rot270 -> rh, rw | _ -> assert false in let paper_x1, paper_y1 = let x, y = match conf.pos with | BottomLeft (x, y) -> x, y | TopLeft (x, y) -> x, y -. prh | BottomRight (x, y) -> x +. prw, y | TopRight (x, y) -> x +. prw, y -. prh | Center (x, y) -> x -. prw /. 2.0 , y -. prh /. 2.0 | A4Center -> (paper_width -. prw) /. 2.0, (paper_height -. prh) /. 2.0 in match conf.rot with | Rot0 -> x, y | Rot180 -> prw +. x, prh +. y | Rot90 -> x, prh +. y | Rot270 -> prw +. x, y | _ -> assert false in set_bbox paper_x1 paper_y1 (paper_x1 +. prw) (paper_y1 +. prh); (fun () -> (* reopen file *) let _, _, _, th = scanline_open conf.name in if !comments then p "% Translate for offset"; p "gsave"; p (sprintf "%f %f translate" paper_x1 paper_y1); p (sprintf "%d rotate" begin match conf.rot with | Rot0 -> 0 | Rot90 -> -90 | Rot180 -> -180 | Rot270 -> -270 | _ -> assert false end); p (sprintf "%f -%f scale" rw rh); if !comments then p "% Variable to keep one line of raster data"; p (sprintf "/scanline %d 3 mul string def" w); if !comments then p "% Image geometry"; p (sprintf "%d %d 8" w h); if !comments then p "% Transformation matrix"; p (sprintf "[ %d 0 0 %d 0 %d ]" w h h); p "{ currentfile scanline readhexstring pop } false 3"; p "colorimage"; let buf = Bytes.create (imgw * 3) in for _y = 0 to y1 - 1 do th.read_next_line buf done; let prevperdec = ref (-1) in for y = y1 to y1 + h - 1 do let perdec = (y - y1) * 10 / h in if !prevperdec <> perdec then begin prerr_endline (sprintf "%d0 %% done" perdec); prevperdec := perdec end; th.read_next_line buf; let print_pixel = if not conf.mono then function x -> let adrs = x * 3 in for i = 0 to 2 do print_string (sprintf "%02x" (Char.code buf.[adrs+i])) done else let mono r g b = (r * 256 / 3 + g * 256 / 2 + b * 256 / 6) / 256 in function x -> let adrs = x * 3 in let m = mono (Char.code buf.[adrs]) (Char.code buf.[adrs + 1]) (Char.code buf.[adrs + 2]) in for _i = 0 to 2 do print_string (sprintf "%02x" m) done in if not conf.mirror then for x = x1 to x1 + w - 1 do print_pixel x done else for x = x1 + w - 1 downto x1 do print_pixel x done; print_newline () done; prerr_endline "100 % done"; th.close (); p "grestore") in let funcs = List.map output_image_func files in (* Header *) if !comments then begin p "%!PS-Adobe-3.0"; p "%%Creator: Tiffps by Jun FURUSE"; p ("%%Title: "^ (Mstring.catenate_sep "+" (List.map (fun f -> f.name) files))); p "%%DocumentData: Clean7Bit"; p "%%Pages: 1"; p (sprintf "%%%%BoundingBox: %f %f %f %f" !bbx1 !bby1 !bbx2 !bby2); p "%%EndComments"; p "%%BeginProlog"; p "% Use own dictionary to avoid conflicts"; p "5 dict begin"; p "%%EndProlog"; if !showpage then p "%%Page: 1 1"; end; List.iter (fun f -> f ()) funcs; if !showpage then p "showpage"; if !comments then p "%%Trailer"; p "end"; if !comments then p "%%EOF";; main ();; camlspotter-camlimages-e471b3c4470d/examples/ttfimg/.cvsignore0000644000000000000000000000010012405272062022471 0ustar 00000000000000ttfimg ttfimg.byt sample_micap.jpg out.png Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/examples/ttfimg/OMakefile0000644000000000000000000000203712405272062022263 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:36:09 furuse Exp $ *) BuildExample(ttfimg, ttfimg, all_formats freetype) camlspotter-camlimages-e471b3c4470d/examples/ttfimg/ttfimg.ml0000644000000000000000000001752012405272062022333 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: ttfimg.ml,v 1.11 2004/09/21 18:15:50 weis Exp $ *) open Images;; open OImages;; open Freetype;; open Fttext;; let fonts = ref [];; let message = ref None;; let csize = ref 100.0;; let outfile = ref None;; let fg = ref {r = 0; g = 0; b = 0};; let bg = ref {r = 255; g = 255; b = 255};; let kanjimode = ref false;; let dumpmode = ref false;; let verbosemode = ref false;; Arg.parse [ "-o", Arg.String (fun s -> outfile := Some s), ": outputfile" ; "-message", Arg.String (fun s -> message := Some s), ": message" ; "-charsize", Arg.Float (fun f -> csize := f), ": charsize (in 72dpi)" ; "-bg", Arg.String (fun s -> bg := Color.color_parse s), ": color"; "-fg", Arg.String (fun s -> fg := Color.color_parse s), ": color"; "-k", Arg.Unit (fun () -> kanjimode := true), "(japanese mode)" ; "-dump", Arg.Unit (fun () -> dumpmode := true), "(dump mode)"; "-verbose", Arg.Unit (fun () -> verbosemode := true), "(verbose mode)"; ] (fun s -> fonts := s :: !fonts) "ttfimg font";; let fonts = match !fonts with | [] -> failwith "specify font file!" | l -> List.rev l ;; match !outfile, fonts with | None, _ -> () | Some _x, [ _ ] -> () | Some _x, _ -> failwith "just one font if you specify -o !" ;; let treat_font font = if !verbosemode then prerr_endline (Printf.sprintf "Processing %s" font); try let out = match !outfile with | None -> let out = font ^ ".jpg" in prerr_endline (Printf.sprintf "%s: will be written in %s" font out); out | Some s -> s in let format = guess_format out in if !verbosemode then prerr_endline "opening font..."; let face = new OFreetype.face font 0 in face#set_char_size !csize !csize 72 72; if !verbosemode then List.iter (fun cmap -> prerr_endline (Printf.sprintf "charmap: { platform_id = %d; encoding_id = %d}" cmap.platform_id cmap.encoding_id) ) face#charmaps; begin try face#set_charmap { platform_id = 3; encoding_id = 1 } with | _ -> try face#set_charmap { platform_id = 3; encoding_id = 0 } with | _ -> face#set_charmap (List.hd face#charmaps) end; (* let mbbox = get_maximum_bbox inst#face in *) let smetrics = face#size_metrics in if !dumpmode then begin let plus = 2 in let num_glyphs = face#num_glyphs in let rec digit x = if x < 10 then 1 else digit (x / 10) + 1 in let digit_num = digit num_glyphs in let numid n = let s = string_of_int n in String.make (digit_num - String.length s) '0' ^ s in for i = 0 to num_glyphs do if !verbosemode then prerr_endline (Printf.sprintf "glyph #%d..." i); let x1,y1,x2,y2 = face#size_of_glyphs [|char_index_of_int i|] in let w = truncate x2 - truncate x1 + plus * 2 in let h = truncate y2 - truncate y1 + plus * 2 in let rgb = new rgb24_filled w h {r = 255; g = 255; b = 255} in OFreetype.draw_glyphs face Fttext.func_darken_only (rgb :> rgb map) (plus-(truncate x1)) (truncate y2 + plus) [|char_index_of_int i|]; rgb#save (out ^ "-" ^ numid i) (Some format) [Save_Quality 95] done end else begin match !message with | None -> let plus = 2 in let w = smetrics.x_ppem + plus in let h = smetrics.y_ppem + plus in let encode s = match Array.map face#char_index s with | [|glyph|] -> glyph | _ -> assert false in let num_glyphs = face#num_glyphs in let chars = if not !kanjimode then [ 0, 0, encode (unicode_of_latin "A"); 1, 0, encode (unicode_of_latin "B"); 2, 0, encode (unicode_of_latin "a"); 3, 0, encode (unicode_of_latin "b"); 0, 1, encode (unicode_of_latin "\224"); 1, 1, encode (unicode_of_latin "\225"); 2, 1, encode (unicode_of_latin "\231"); 3, 1, encode (unicode_of_latin "\238"); 0, 2, encode (unicode_of_latin "1"); 1, 2, encode (unicode_of_latin "2"); 2, 2, encode (unicode_of_euc_japan ""); 3, 2, encode (unicode_of_euc_japan ""); 0, 3, char_index_of_int (num_glyphs-4); 1, 3, char_index_of_int (num_glyphs-3); 2, 3, char_index_of_int (num_glyphs-2); 3, 3, char_index_of_int (num_glyphs-1); ] else [ 0, 0, encode (unicode_of_latin "A"); 1, 0, encode (unicode_of_latin "B"); 2, 0, encode (unicode_of_latin "a"); 3, 0, encode (unicode_of_latin "b"); 0, 1, encode (unicode_of_latin "\224"); 1, 1, encode (unicode_of_latin "\225"); 2, 1, encode (unicode_of_latin "\231"); 3, 1, encode (unicode_of_latin "\238"); 0, 2, encode (unicode_of_latin "1"); 1, 2, encode (unicode_of_latin "2"); 2, 2, encode (unicode_of_euc_japan ""); 3, 2, encode (unicode_of_euc_japan ""); 0, 3, encode (unicode_of_euc_japan ""); 1, 3, encode (unicode_of_euc_japan ""); 2, 3, encode (unicode_of_euc_japan ""); 3, 3, encode (unicode_of_euc_japan ""); ] in let rgb = new rgb24_filled (w*4) (h*4) {r = 255; g = 255; b = 255} in List.iter (fun (x, y, encoded) -> if !verbosemode then prerr_endline (Printf.sprintf "drawing glyph #%d..." (int_of_char_index encoded)); let x1, y1, _x2, _y2 = face#size_of_glyphs [|encoded|] in (*prerr_endline ".";*) OFreetype.draw_glyphs face Fttext.func_darken_only (rgb :> rgb map) (w * x + 1 - truncate x1) (h * (y + 1) - 1 + truncate y1) [|encoded|]) chars; rgb#save out (Some format) [] | Some s -> if !verbosemode then prerr_endline (Printf.sprintf "drawing %s..." s); let plus = 8 in let encoded = if !kanjimode then unicode_of_euc_japan s else unicode_of_latin s in let x1, y1, x2, y2 = face#size encoded in let h = truncate (ceil y2) - truncate y1 + 1 + plus in prerr_endline (Printf.sprintf "height = %d" h); let rgb = new rgb24_filled (truncate (x2 -. x1) + plus) h !bg in OFreetype.draw_text face (fun org level -> let level' = 255 - level in { r = (org.r * level' + !fg.r * level) / 255; g = (org.g * level' + !fg.g * level) / 255; b = (org.b * level' + !fg.b * level) / 255 }) (rgb :> rgb map) (plus / 2 - truncate x1) (truncate y2 + plus / 2) encoded; let outfile = match !outfile with | Some f -> f | None -> prerr_endline "Output to out.png"; "out.png" in rgb#save outfile None [] end with | Failure e -> prerr_endline (font ^ ": Failure " ^ e) ;; List.iter treat_font fonts;; camlspotter-camlimages-e471b3c4470d/opam/template/descr0000644000000000000000000000036612405272062021171 0ustar 00000000000000Image processing library An image processing library, which provides loading and saving various image formats with an interface for the Caml graphics library. It has also an interface with the freetype library to draw texts using truetype fonts. camlspotter-camlimages-e471b3c4470d/opam/template/opam0000644000000000000000000000065112405272062021022 0ustar 00000000000000opam-version: "1" maintainer: "jun.furuse@gmail.com" build: [ ["omake" "--configure"] ["omake" "install"] ] remove: [ ["ocamlfind" "remove" "camlimages"] ] depends: ["ocamlfind" "base-unix" "omake"] depopts: ["lablgtk"] ocaml-version: [>= "4.02.0"] homepage: "https://bitbucket.org/camlspotter/camlimages" license: "LGPL-2 with OCaml linking exception" authors: [ "Jun Furuse" "François Pessaux" "Pierre Weis" ] camlspotter-camlimages-e471b3c4470d/src/.cvsignore0000644000000000000000000000006612405272062020163 0ustar 00000000000000Makefile Makefile.in *.spot *.spit camlimages.ml META camlspotter-camlimages-e471b3c4470d/src/META.in0000644000000000000000000000522312405272062017241 0ustar 00000000000000name = "CamlImages" version = "@PACKAGE_VERSION@" description = "Objective Caml image processing library" requires = "camlimages.core" package "core" ( archive(byte) = "camlimages_core.cma" archive(native) = "camlimages_core.cmxa" version = "@PACKAGE_VERSION@" ) package "gif" ( requires = "camlimages.core" exists_if = "camlimages_gif.cma" archive(byte) = "camlimages_gif.cma" archive(native) = "camlimages_gif.cmxa" version = "@PACKAGE_VERSION@" ) package "jpeg" ( requires = "camlimages.core" exists_if = "camlimages_jpeg.cma" archive(byte) = "camlimages_jpeg.cma" archive(native) = "camlimages_jpeg.cmxa" version = "@PACKAGE_VERSION@" ) package "exif" ( requires = "camlimages.core, unix" exists_if = "camlimages_exif.cma" archive(byte) = "camlimages_exif.cma" archive(native) = "camlimages_exif.cmxa" version = "@PACKAGE_VERSION@" ) package "png" ( requires = "camlimages.core" exists_if = "camlimages_png.cma" archive(byte) = "camlimages_png.cma" archive(native) = "camlimages_png.cmxa" version = "@PACKAGE_VERSION@" ) package "tiff" ( requires = "camlimages.core" exists_if = "camlimages_tiff.cma" archive(byte) = "camlimages_tiff.cma" archive(native) = "camlimages_tiff.cmxa" version = "@PACKAGE_VERSION@" ) package "freetype" ( requires = "camlimages.core" exists_if = "camlimages_freetype.cma" archive(byte) = "camlimages_freetype.cma" archive(native) = "camlimages_freetype.cmxa" version = "@PACKAGE_VERSION@" ) package "xpm" ( requires = "camlimages.core" exists_if = "camlimages_xpm.cma" archive(byte) = "camlimages_xpm.cma" archive(native) = "camlimages_xpm.cmxa" version = "@PACKAGE_VERSION@" ) package "ps" ( requires = "camlimages.core" exists_if = "camlimages_ps.cma" archive(byte) = "camlimages_ps.cma" archive(native) = "camlimages_ps.cmxa" version = "@PACKAGE_VERSION@" ) package "graphics" ( requires = "camlimages.core, graphics" exists_if = "camlimages_graphics.cma" archive(byte) = "camlimages_graphics.cma" archive(native) = "camlimages_graphics.cmxa" version = "@PACKAGE_VERSION@" ) package "lablgtk2" ( requires = "camlimages.core, lablgtk2" exists_if = "camlimages_lablgtk2.cma" archive(byte) = "camlimages_lablgtk2.cma" archive(native) = "camlimages_lablgtk2.cmxa" version = "@PACKAGE_VERSION@" ) package "all_formats" ( requires = "camlimages.core, unix" archive(byte) = "camlimages_all_formats.cma" archive(native) = "camlimages_all_formats.cmxa" version = "@PACKAGE_VERSION@" ) package "all" ( requires = "camlimages.core, camlimages.all_formats, camlimages.freetype, camlimages.graphics, camlimages.lablgtk2" version = "@PACKAGE_VERSION@" ) camlspotter-camlimages-e471b3c4470d/src/OMakefile0000644000000000000000000001365612405272062017753 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# .PHONY: all clean libraries install .DEFAULT: all LIBRARY_PREFIX=camlimages ####################################################################### C FILES CFILES_freetype[]= ftintf CFILES_freetype_na[]= ftintf_na CFILES_gif[]= gifread gifwrite CFILES_gif_na[]= gif_na CFILES_jpeg[]= jpegread jpegwrite CFILES_jpeg_na[]= jpeg_na CFILES_exif[]= exif_c CFILES_exif_na[]= exif_na CFILES_png[]= pngread pngwrite CFILES_png_na[]= png_na CFILES_tiff[]= tiffread tiffwrite CFILES_tiff_na[]= tiff_na CFILES_xpm[]= xpmread xpmwrite CFILES_xpm_na[]= xpm_na CFILES_ps[]= CFILES_ps_na[]= CFILES_lib(name) = CFILES_VAR = $(if $(mem $(name), all all_formats supported $(SUPPORTED_SUBPACKAGES)), CFILES_$(name), CFILES_$(name)_na) value $(getvar $(CFILES_VAR)) CFILES_supported= foreach(p, $(SUPPORTED_FORMATS)) value $(CFILES_lib $(p)) CFILES_all_formats= foreach(p, $(FORMATS)) value $(CFILES_lib $(p)) ###################################################################### ML FILES FILES_core[]= util bitmap blend camlimages cmyk32 color colorhist genimage geometry images index16 index8 jis_table jis_unicode mstring oColor oImages reduce region rgb24 rgba32 tmpfile units bmp oBmp ppm oPpm xvthumb oXvthumb FILES_gif[]= gif oGif FILES_jpeg[]= jpeg oJpeg FILES_exif[]= exifutil exif exifanalyze exifanalyze.auto.mli: exifanalyze.ml $(OCamlC) -c -i exifanalyze.ml > $@ FILES_png[]= png oPng FILES_tiff[]= tiff oTiff FILES_freetype[]= freetype ftlow fttext oFreetype FILES_xpm[]= xpm oXpm FILES_ps[]= ps oPs FILES_supported= foreach(p, $(SUPPORTED_FORMATS)) value $(getvar FILES_$(p)) FILES_all_formats= foreach(p, $(FORMATS)) value $(getvar FILES_$(p)) FILES_graphics[]= graphic_image oGraphic FILES_lablgtk2[]= imagegdk oXimage oXimage2 ximage ximage2 ####################################################################### LDFLAGS LDFLAGS_core[]= LDFLAGS_supported= x= foreach(p, $(SUPPORTED_FORMATS)) x+= $(getvar LDFLAGS_$(p)) export value $(x) LDFLAGS_all_formats= x= foreach(p, $(FORMATS)) x+= $(getvar LDFLAGS_$(p)) export value $(x) ###################################################################### PACKAGES PACKS_graphics[]= graphics PACKS_lablgtk2[]= lablgtk2 ################################################################## C BUILD RULE CFLAGS_supported= x= foreach(p, $(SUPPORTED_SUBPACKAGES)) x+= $(getvar CFLAGS_$(p)) export value $(x) CFLAGS+= -fPIC -I $(OCAML_WHERE) $(CFLAGS_supported) MakeLibC(name) = OCamlMkLibC($(LIBRARY_PREFIX)_$(name), \ $(CFILES_lib $(name)), \ $(getvar LDFLAGS_$(name))) ################################################################# ML BUILD RULE MakeLibOCaml(name) = OCAMLPACKS= try getvar(PACKS_$(name)) default array() # default is empty pure= try $(equal 0, $(length $(getvar CFILES_$(name)))) default value true if $(pure) # pure ocaml library OCAML_LIB_FLAGS= try -linkall $(mapprefix -cclib, $(LDFLAGS) $(getvar LDFLAGS_$(name))) default array() OCamlLibrary($(LIBRARY_PREFIX)_$(name), $(getvar FILES_$(name))) else # inpure $(LIBRARY_PREFIX)_$(name).cma $(LIBRARY_PREFIX)_$(name).cmxa: $(MakeLibC $(name)) # OCAML_{BYTE,NATIVE}_LINK_FLAGS do not work for OCamlLibrary # Bit dirty workaround OCAMLCFLAGS+=-dllib -l$(LIBRARY_PREFIX)_$(name) -cclib -l$(LIBRARY_PREFIX)_$(name) OCAMLOPTFLAGS+=-cclib -l$(LIBRARY_PREFIX)_$(name) # use mapprefix instead of addprefix, otherwise "-cclib -lgif" # is considered one option. OCAML_LIB_FLAGS=-linkall $(mapprefix -cclib, $(LDFLAGS) $(getvar LDFLAGS_$(name))) OCamlLibrary($(LIBRARY_PREFIX)_$(name), $(getvar FILES_$(name))) LIBRARIES= # CR jfurue: lablgtk2, freetype and graphics may not be buildable foreach(i, core $(FORMATS) all_formats supported $(SUPPORTED_NON_FORMATS)) MakeLibOCaml($(i)) libraries: $(LIBRARIES) clean: rm -f *.sp*t *.cmt* rm -f $(filter-proper-targets $(ls R, .)) LocalOCamlGeneratedFiles(camlimages.ml) ConfReplaceAt(camlimages.ml) ConfReplaceAt(META) all: libraries META INSTALL_TARGETS()= value META \ $(glob i, *.mli) \ $(glob i, *.cmi) \ $(glob i, *.cmt) \ $(glob i, *.cmti) \ $(glob i, *.cma) \ $(glob i, *.cmxa) \ $(glob i, *.a) \ $(glob i, *.so) INSTALL()= value $(OCAMLFIND) install $(LIBRARY_PREFIX) $(INSTALL_TARGETS) UNINSTALL()= value $(OCAMLFIND) remove $(LIBRARY_PREFIX) install: all $(UNINSTALL) # I get bored typing ocamlfind remove camlimages each time before omake install $(INSTALL) .PHONY: uninstall uninstall: $(UNINSTALL) # Author's personal thing if $(defined BIG_ROOT) %.cmx %.cmo %.cmi %.cma %.cmxa %.annot %.spot %.spit: $(INSTALLED)/lablgtk2 $(INSTALLED)/camlimages: $(LIBRARIES) META $(touch_installed_md5 camlimages, $(INSTALL_TARGETS)) $(UNINSTALL) $(INSTALL) camlspotter-camlimages-e471b3c4470d/src/bitmap.ml0000644000000000000000000004533212405272062017776 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: bitmap.ml,v 1.7 2009/07/04 03:39:28 furuse Exp $*) open Util let debug = ref true;; let debugs s = if !debug then prerr_endline s;; let maximum_live = ref 0;; (* around 3M words for example *) let maximum_block_size = ref (!maximum_live / 10);; (* default 300K words *) (* see Temp to set temp file directory *) type block_data = | InMemory of string | Swapped | Destroyed;; type block = { block_width: int; block_height: int; block_size: int; mutable block_data: block_data; mutable last_used: float; swap: string option };; let swappable_blocks = ref [];; (* wrapped Bytes.create *) let string_create s = try Bytes.create s with Invalid_argument _ -> raise Out_of_memory;; module Block = struct type t = { width : int; height : int; x : int; y : int; dump : string; } end module type Bitdepth = sig val bytes_per_pixel : int end;; module Make(B:Bitdepth) = struct open B;; type t = { (* The whole size *) width : int; height : int; (* block partition size *) block_size_width : int; block_size_height : int; (* number of block partitions *) blocks_x : int; blocks_y : int; data : block array array; access : int -> int -> (string * int); };; (****************************************************************************) (* Destruction *) (****************************************************************************) let destroy _t = ();; (* do nothing... *) let destroy_block blk = if blk.block_data = Destroyed then () else begin match blk.swap with | Some fname -> begin match blk.block_data with | Swapped -> Sys.remove fname; blk.block_data <- Destroyed | InMemory _ | Destroyed -> () end | None -> () end; swappable_blocks := List.fold_right (fun blk' st -> if blk == blk' then st else blk' :: st) !swappable_blocks [];; let fill_string buf init = (* fill string with init quickly (hopefully) *) let fulllength = String.length buf in let halflength = fulllength / 2 in let rec sub = function | 0 -> let len = String.length init in String.unsafe_blit init 0 buf 0 len; sub len | x when x <= halflength -> String.unsafe_blit buf 0 buf x x; sub (x * 2) | x (* when x > halflength *) -> String.unsafe_blit buf 0 buf x (fulllength - x) in sub 0;; let check_init init = match init with | Some v -> if String.length v <> bytes_per_pixel then failwith "bitmap fill value is incorrect" | None -> ();; let memory width height init = (* try to have it whole in memory *) check_init init; (* we can have hsize lines at maximum in one string *) let hsize = Sys.max_string_length / (width * bytes_per_pixel) in let hsize = min height hsize in (* how many caml strings required? *) let blocks_y = (height - 1) / hsize + 1 in let buf_size_heights = Array.init blocks_y (fun by -> let height = if by = blocks_y - 1 then let m = height mod hsize in if m = 0 then hsize else m else hsize in (* CR jfuruse: check overflow *) let size = width * height * bytes_per_pixel in string_create size, size, height) in let bufs = Array.map (fun (buf, _, _) -> buf) buf_size_heights in begin match init with | Some v -> Array.iter (fun s -> fill_string s v) bufs; | None -> () end; { width = width; height = height; block_size_width = width; block_size_height = hsize; blocks_x = 1; blocks_y = blocks_y; data = [| Array.init blocks_y (fun h -> let buf, size, height = buf_size_heights.(h) in { block_width = width; block_height = height; block_data = InMemory buf; block_size = size; last_used = 0.0; swap = None; }) |]; access = if blocks_y = 1 then (fun x y -> bufs.(0), (y * width + x) * bytes_per_pixel) else (fun x y -> bufs.(y / hsize), ((y mod hsize) * width + x) * bytes_per_pixel) };; let swap_out = function | {block_data = Destroyed} -> failwith "swap_out: Already destroyed" | {swap = None} -> failwith "No swap file set" | {swap = Some fname; block_data = InMemory s; block_size = size} as blk -> begin try debugs (Printf.sprintf "swap out %s" fname (* blk.block_size*)); let oc = open_out_bin fname in output oc s 0 size; close_out oc; blk.block_data <- Swapped with | e -> prerr_endline "Swap-out failed"; raise e end | _ -> ();; let touch_block blk = blk.last_used <- Sys.time ();; let swap_out_eldest words = let sorted = List.sort (fun b1 b2 -> compare b1.last_used b2.last_used) !swappable_blocks in let rec swapper sorted i = match sorted with | [] -> () | x :: xs -> swap_out x; swapper xs (i - (x.block_size + Camlimages.word_size - 1) / Camlimages.word_size) in swapper sorted words;; let require bytes = let words = (bytes + Camlimages.word_size - 1) / Camlimages.word_size in let stat = Gc.stat () in let over = stat.Gc.live_words + words - !maximum_live in if over > 0 then swap_out_eldest over;; let swap_in = function | {block_data = Destroyed} -> raise (Failure "swap_in: Already destroyed") | {block_data = InMemory s} as blk -> touch_block blk; s | {swap = Some fname; block_data = Swapped; block_size = size} as blk -> begin try debugs ("swap in "^fname); require size; let ic = open_in_bin fname in let s = string_create size in really_input ic s 0 size; close_in ic; blk.block_data <- InMemory s; Sys.remove fname; touch_block blk; s with | e -> prerr_endline (Printf.sprintf "Swap-in failed (%s)" (Printexc.to_string e)); raise e end | _ -> assert false;; let alloc_swappable_block width height init = (* CR jfuruse: check overflow *) let size = bytes_per_pixel * width * height in require size; let s = string_create size in begin match init with | Some v -> fill_string s v | None -> () end; let blk = { block_width = width; block_height = height; block_size = size; block_data = InMemory s; last_used = Sys.time (); swap = Some (Tmpfile.new_tmp_file_name "swap") } in Gc.finalise destroy_block blk; swappable_blocks := blk :: !swappable_blocks; blk;; (****************************************************************************) (* Creation functions *) (****************************************************************************) let create width height init = if !maximum_live <= 0 then memory width height init else begin check_init init; (* determine the block size *) let rec get_block_size p = (* CR jfuruse: check overflow *) let whole_words = (bytes_per_pixel * width * height + Camlimages.word_size - 1) / Camlimages.word_size in let pp = p * p in if whole_words / pp > !maximum_block_size then get_block_size (p + 1) else p in let rec alloc_test_block p = let block_size_width = width / p + (if width mod p <> 0 then 1 else 0) and block_size_height = height / p + (if height mod p <> 0 then 1 else 0) in try (* CR jfuruse: check overflow *) p, string_create (block_size_width * block_size_height * bytes_per_pixel) with | Out_of_memory -> alloc_test_block (p + 1) in let blocks, test_block = alloc_test_block (get_block_size 1) in (* use the block so that it is not GCed too early *) test_block << 0 & '0'; (* Create bitmap *) let blocks_x = blocks and blocks_y = blocks in let block_size_width = width / blocks_x + (if width mod blocks_x <> 0 then 1 else 0) and block_size_height = height / blocks_x + (if height mod blocks_x <> 0 then 1 else 0) in debugs (Printf.sprintf "creating %d x %d blocks (%dx%d)" blocks blocks block_size_width block_size_height); let data = (* CR jfuruse: check overflow *) Array.init blocks_x (fun x -> Array.init blocks_y (fun y -> let w = if x <> blocks_x - 1 then block_size_width else width - block_size_width * (blocks_x - 1) and h = if y <> blocks_y - 1 then block_size_height else height - block_size_height * (blocks_y - 1) in alloc_swappable_block w h init)) in let t = { width = width; height = height; block_size_width = block_size_width; block_size_height = block_size_height; blocks_x = blocks_x; blocks_y = blocks_y; data = data; access = ( if blocks_x = 1 && blocks_y = 1 then begin let the_blk = data.(0).(0) in fun x y -> let str = swap_in the_blk in let pos = (the_blk.block_width * (y mod block_size_height) + (x mod block_size_width)) * bytes_per_pixel in str, pos end else begin fun x y -> let bx = x / block_size_width and by = y / block_size_height in let blk = data.(bx).(by) in let str = swap_in blk in let pos = (blk.block_width * (y mod block_size_height) + (x mod block_size_width)) * bytes_per_pixel in str, pos end); } in t end;; let create_with width height buf = { width = width; height = height; block_size_width = width; block_size_height = height; blocks_x = 1; blocks_y = 1; data = [| [| { block_width = width; block_height = height; block_data = InMemory buf; (* CR jfuruse: check overflow *) block_size = width * height * bytes_per_pixel; last_used = 0.0; swap = None; } |] |]; access = (fun x y -> buf, (y * width + x) * bytes_per_pixel); };; let create_with_scanlines width height scanlines = (* CR jfuruse: check overflow *) let block_size = width * bytes_per_pixel in if Array.length scanlines <> height then begin Format.eprintf "scanline error %d (height=%d) (bpp=%d)@." (Array.length scanlines) height bytes_per_pixel; assert false end; for y = 0 to height - 1 do if String.length scanlines.(y) <> block_size then begin Format.eprintf "scanline error %d = block_size %d = %d * %d (y=%d)@." (String.length scanlines.(y)) block_size width bytes_per_pixel y; assert false end done; { width = width; height = height; block_size_width = width; block_size_height = 1; blocks_x = 1; blocks_y = height; data = [| Array.mapi (fun _y scanline -> { block_width = width; block_height = 1; block_data = InMemory scanline; block_size = block_size; last_used = 0.0; swap = None }) scanlines |]; access = (fun x y -> scanlines.(y), x * bytes_per_pixel); };; (****************************************************************************) (* Tool functions *) (****************************************************************************) let access t = t.access;; (* strip access *) (* Here, "strip" is a rectangle region with height 1 *) let get_strip t x y w = (* No region checks for performance. You should wrap this to make safe in your applications. *) match t.blocks_x, t.blocks_y with | 1, _ -> (* optimized *) let bly = y / t.block_size_height in let y' = y mod t.block_size_height in let blk = t.data.(0).(bly) in let src = swap_in blk in let size = w * bytes_per_pixel in let adrs = (blk.block_width * y' + x) * bytes_per_pixel in let str = string_create size in String.unsafe_blit src adrs str 0 size; str | _, _ -> let bly = y / t.block_size_height in let y' = y mod t.block_size_height in let str = string_create (w * bytes_per_pixel) in let blx_start = x / t.block_size_width in let blx_last = (x + w - 1) / t.block_size_width in for blx = blx_start to blx_last do let blk = t.data.(blx).(bly) in let src = swap_in blk in let x1 = if blx = blx_start then x mod t.block_size_width else 0 in let x2 = if blx = blx_last then (x + w - 1) mod t.block_size_width else (blk.block_width - 1) in let w' = x2 - x1 + 1 in let size = w' * bytes_per_pixel in let adrs = (blk.block_width * y' + x1) * bytes_per_pixel in let offset = if blx = blx_start then 0 else (t.block_size_width * blx - x) * bytes_per_pixel in String.unsafe_blit src adrs str offset size done; str;; let set_strip t x y w str = (* No region checks for performance. You should wrap this to make safe in your applications. *) match t.blocks_x, t.blocks_y with | 1, _ -> (* optimized *) let bly = y / t.block_size_height in let y' = y mod t.block_size_height in let blk = t.data.(0).(bly) in let dst = swap_in blk in let size = w * bytes_per_pixel in let adrs = (blk.block_width * y' + x) * bytes_per_pixel in String.unsafe_blit str 0 dst adrs size | _, _ -> let bly = y / t.block_size_height in let y' = y mod t.block_size_height in let blx_start = x / t.block_size_width in let blx_last = (x + w - 1) / t.block_size_width in for blx = blx_start to blx_last do let blk = t.data.(blx).(bly) in let dst = swap_in blk in let x1 = if blx = blx_start then x mod t.block_size_width else 0 in let x2 = if blx = blx_last then (x + w - 1) mod t.block_size_width else (blk.block_width - 1) in let w' = x2 - x1 + 1 in let size = w' * bytes_per_pixel in let adrs = (blk.block_width * y' + x1) * bytes_per_pixel in let offset = if blx = blx_start then 0 else (t.block_size_width * blx - x) * bytes_per_pixel in String.unsafe_blit str offset dst adrs size done;; (* scanline access (special case of strip access) *) let get_scanline t y = get_strip t 0 y t.width;; (* returns the scan line address and how many lines we can get *) let get_scanline_ptr t = match t.blocks_x, t.blocks_y with | 1, 1 -> (* optimized *) Some (fun y -> let blk = t.data.(0).(0) in let src = swap_in blk in let adrs = (blk.block_width * y) * bytes_per_pixel in (src, adrs), blk.block_height - y) | 1, _ -> (* optimized *) Some (fun y -> let bly = y / t.block_size_height in let y' = y mod t.block_size_height in let blk = Array.unsafe_get (Array.unsafe_get t.data 0) bly in let src = swap_in blk in let adrs = (blk.block_width * y') * bytes_per_pixel in (src, adrs), blk.block_height - y') | _, _ -> None let set_scanline t y str = (* CR jfuruse: check overflow *) if String.length str <> t.width * B.bytes_per_pixel then failwith (Printf.sprintf "scan=%d width=%d bbp=%d" (String.length str) t.width B.bytes_per_pixel); set_strip t 0 y t.width str;; (* dump : of course this does not work for large images *) let dump t = (* CR jfuruse: check overflow *) let size = bytes_per_pixel * t.width * t.height in match t.blocks_x, t.blocks_y with | 1, 1 -> swap_in t.data.(0).(0) | 1, h -> let s = string_create size in let scanline_size = bytes_per_pixel * t.width in for y = 0 to h - 1 do let str = swap_in t.data.(0).(y) in String.unsafe_blit str 0 s (scanline_size * y) scanline_size done; s | w, h -> let s = string_create size in for x = 0 to w - 1 do for y = 0 to h - 1 do let blk = t.data.(x).(y) in let str = swap_in blk in let scanline_size = bytes_per_pixel * blk.block_width in for i = 0 to blk.block_height - 1 do String.unsafe_blit str (scanline_size * i) s (((y * t.block_size_height + i) * t.width + x * t.block_size_width) * bytes_per_pixel) scanline_size done done done; s;; (* sub-bitmap *) let sub t x y w h = Region.check t.width t.height x y; Region.check t.width t.height (x + w - 1) (y + h - 1); let dst = create w h None in try for i = 0 to h - 1 do set_scanline dst i (get_strip t x (y + i) w) done; dst with | e -> destroy dst; raise e;; let copy t = sub t 0 0 t.width t.height;; let blit src sx sy dst dx dy w h = Region.check src.width src.height sx sy; Region.check src.width src.height (sx + w - 1) (sy + h - 1); Region.check dst.width dst.height dx dy; Region.check dst.width dst.height (dx + w - 1) (dy + h - 1); for i = 0 to h - 1 do set_strip dst dx (dy + i) w (get_strip src sx (sy + i) w) done;; let blocks bmp = bmp.blocks_x, bmp.blocks_y let dump_block bmp x y = let blk = bmp.data.(x).(y) in let at_x = x * bmp.block_size_width in let at_y = y * bmp.block_size_height in let w = if x = bmp.blocks_x - 1 then bmp.width - at_x else bmp.block_size_width in let h = if y = bmp.blocks_y - 1 then bmp.height - at_y else bmp.block_size_height in { Block.width = w; height = h; x = at_x; y = at_y; dump = swap_in blk } end;; camlspotter-camlimages-e471b3c4470d/src/bitmap.mli0000644000000000000000000001142312405272062020141 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: bitmap.mli,v 1.5 2009/07/04 03:39:28 furuse Exp $*) (* Bitmaps used in images. Bitmaps are partitioned into blocks. Usually only one block is allocated for one image, but for huge images, they needs more... *) val debug : bool ref;; (* see Swap to set swap file directory *) val maximum_live : int ref;; val maximum_block_size : int ref;; (* Configuration parameters for image swapping. You can specify the maximum size of live data by setting [maximum_live] in words. If the size of live data in heap exceeds [maximum_live], then Camlimages library tries to escape part of image buffer into "swap" files. If swapped data are required, they are read back into memory. This swapping is automatically done by the camlimages library. If [maximum_live] is 0, image swapping is disabled. Swapped images are separated into block shaped "partitions". [maximum_block_size] is a maximum size of each partition, also in words. This parameter may affect the swapping performance. There is no theory (yet) how we should specify it. The author of the library propose to have (!maximum_live / 10). If it is larger, each swapping becomes slower. If smaller, more swappings will occur. Too large and too small maximum_block_size, both may make the program slower. If you use image swapping, you need to explicitly call [destroy] function of each image format (Rgb24.destroy, image#destroy, etc...) to free the memory and swap files of the needless images. The defaults are both 0. (i.e. swapping is disabled ) *) module Block : sig type t = { width : int; height : int; x : int; y : int; dump : bytes; } end module type Bitdepth = sig val bytes_per_pixel : int end;; module Make(B:Bitdepth) : sig type t;; (* Bitmap type *) val create : int -> int -> bytes option -> t (* [create width height initopt] creates a bitmap of size [width] x [height]. You can set [initopt] the value to fill the bitmap *) val create_with : int -> int -> bytes -> t (* [create_with width height initdata] creates a bitmap whose initial data is [initdata]. *) val create_with_scanlines : int -> int -> bytes array -> t val destroy : t -> unit (* Destroy bitmaps *) val access : t -> int -> int -> bytes * int val get_strip : t -> int -> int -> int -> bytes val set_strip : t -> int -> int -> int -> bytes -> unit (* Strip access Here, "strip" means a rectangle region with height 1. [get_strip t x y w] returns the bytes reprensentation of strip of [t] at (x, y) - (x + w - 1, y). [set_strip t x y w str] write [str] to the strip of [t] at (x, y) - (x + w - 1, y). *) val get_scanline : t -> int -> bytes val set_scanline : t -> int -> bytes -> unit (* Scanline access [get_scanline t y] returns the bytes representation of the scanline of [t] at [y]. [set_scanline t y str] writes [str] to the scanline of [t] at [y]. *) (* only for one row *) val get_scanline_ptr : t -> (int -> (bytes * int) * int) option val dump : t -> bytes (* Create a bytes representation of a bitmap. It may easily raise an exception Out_of_memory for large images. *) val copy : t -> t val sub : t -> int -> int -> int -> int -> t (* [sub src x y width height] returns sub-bitmap of [src], at (x, y) - (x + width - 1, y + height - 1). *) val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit (* [blit src sx sy dst dx dy width height] copies the rectangle region of [src] at (sx, sy) - (sx + width - 1, sy + height - 1) to [dst], at (dx, dy) - (dx + width - 1, dy + height - 1) *) val blocks : t -> int * int (* returns number of blocks in row and column *) val dump_block : t -> int -> int -> Block.t end;; camlspotter-camlimages-e471b3c4470d/src/blend.ml0000644000000000000000000000454112405272062017603 0ustar 00000000000000type mode = | Normal | Multiply | Screen | Overlay (* | SoftLight | HardLight *) | ColorDodge | ColorBurn | Darken | Lighten | Difference | Exclusion (* | Luminosity | Color | Saturation | Hue *) ;; (* look at gxblend.c of ghostscript *) let blend = function | Normal -> fun src _dst -> src | Multiply -> fun src dst -> let t = dst * src + 0x80 in let t = t + t lsr 8 in t lsr 8 | Screen -> fun src dst -> let t = (0xff - dst) * (0xff - src) + 0x80 in let t = t + t lsr 8 in 0xff - t lsr 8 | Overlay -> fun src dst -> let t = if dst < 0x80 then 2 * dst * src else 0xf301 - 2 * (0xff - dst) * (0xff - src) in let t = t + 0x80 in let t = t + t lsr 8 in t lsr 8 (* | SoftLight -> if s < 0x80 then begin let t = (0xff - (src lsl 1)) * art_blend_sq_diff_8[dst] in let t = t + 0x8000 in dst - t lsr 16 end else begin let t = ((src lsl 1) - 0xff) * art_blend_soft_light_8[dst] in let t = t + 0x80 in let t = t + t lsr 8 in dst + t lsr 8 end *) | ColorDodge -> fun src dst -> if dst = 0 then 0 else if dst >= src then 0xff else (0x1fe * dst + src) / (src lsl 1) | ColorBurn -> fun src dst -> let dst = 0xff - dst in if dst = 0 then 0xff else if dst >= src then 0 else 0xff - (0x1fe * dst + src) / (src lsl 1) | Darken -> fun src dst -> if dst < src then dst else src | Lighten -> fun src dst -> if dst > src then dst else src | Difference -> fun src dst -> let t = dst - src in if t < 0 then -t else t | Exclusion -> fun src dst -> let t = (0xff - dst) * src + dst * (0xff - src) in let t = t + 0x80 in let t = t + t lsr 8 in t lsr 8;; open Color let f blendmode srcalpha = let blender = blend blendmode in match srcalpha with | 0 -> fun _src dst -> dst | 255 -> fun src dst -> {r = blender src.r dst.r; g = blender src.g dst.g; b = blender src.b dst.b} | _ -> let a' = 255 - srcalpha in fun src dst -> {r = (blender src.r dst.r * srcalpha + dst.r * a') / 255; g = (blender src.g dst.g * srcalpha + dst.g * a') / 255; b = (blender src.b dst.b * srcalpha + dst.b * a') / 255} ;; camlspotter-camlimages-e471b3c4470d/src/blend.mli0000644000000000000000000000066412405272062017756 0ustar 00000000000000type mode = | Normal | Multiply | Screen | Overlay (* | SoftLight | HardLight *) | ColorDodge | ColorBurn | Darken | Lighten | Difference | Exclusion (* | Luminosity | Color | Saturation | Hue *) val blend : mode -> int -> int -> int (* [blend blendmode src dst] *) val f : mode -> int -> Color.rgb -> Color.rgb -> Color.rgb (* [f blendmode srcalpha src dst] 8bit depth *) (* bug: no destination alpha support *) camlspotter-camlimages-e471b3c4470d/src/bmp.ml0000644000000000000000000010407112405272062017274 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: bmp.ml,v 1.3 2009/02/08 14:59:17 weis Exp $ *) (* Loading and saving image in the bmp format. *) open Images;; open Util (* Caml representation of a bmp bit map image. Fields are Caml values, decoded versions of raw data in the file. Structure of bitmaps files on disk : - BITMAPFILEHEADER : bytes 0 to 14 excluded - BITMAPINFOHEADER : bytes 14 to 54 excluded - RGBQUAD [] : color map - BYTES [] : bit map *) type bmp = { bmpFileHeader : bitmapfileheader; (* Bytes <0 14< *) bmpInfoHeader : bitmapinfoheader; (* Bytes <14 54< *) bmpRgbQuad : rgb array; (* Bytes <54 ... *) bmpBytes : string; (* Bytes Monochrome | 4 -> Color16 | 8 -> Color256 | 24 -> ColorRGB | 32 -> ColorRGBA | n -> failwith ("invalid colors number : " ^ string_of_int n) ;; (* #define BI_RGB 0L #define BI_RLE8 1L #define BI_RLE4 2L *) let read_compression ic = match read_dword ic with | 0 -> BI_RGB | 1 -> BI_RLE8 | 2 -> BI_RLE4 | n -> failwith ("invalid compression mode : " ^ string_of_int n) ;; (* Entries of color maps stored on disk have the following format typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; The RGBQUAD structure contains the following fields: Field Description rgbBlue Specifies the intensity of blue in the color. rgbGreen Specifies the intensity of green in the color. rgbRed Specifies the intensity of red in the color. rgbReserved Is not used and must be set to zero. When loading a bmp we simply skip the rgbReserved field. *) let load_rgbquad ic = let b = read_byte ic in let g = read_byte ic in let r = read_byte ic in let _u = read_byte ic in { b = b; g = g; r = r; } ;; let load_bitmapfileheader ic = let bfType = read_word ic in if bfType <> 19778 (* BM *) then failwith "Invalid file tag"; let bfSize = read_dword ic in let bfReserved1 = read_word ic in let bfReserved2 = read_word ic in let bfOffBits = read_dword ic in { bfType; bfSize; bfReserved1; bfReserved2; bfOffBits; } ;; let load_bitmapinfoheader ic = try (* Found a tagBITMAPINFO *) let biSize = read_dword ic in let biWidth = read_dword ic in let biHeight = read_dword ic in let biPlanes = read_word ic in let biBitCount = read_bit_count ic in let biCompression = read_compression ic in let biSizeImage = read_dword ic in let biXPelsPerMeter = read_dword ic in let biYPelsPerMeter = read_dword ic in let biClrUsed = read_dword ic in let biClrImportant = read_dword ic in (* header = tagBITMAPINFOHEADER *) { biSize; biWidth; biHeight; biPlanes; biBitCount; biCompression; biSizeImage; biXPelsPerMeter; biYPelsPerMeter; biClrUsed; biClrImportant; } with | (Failure s as e) -> prerr_endline s; raise e ;; let load_colors bfh _bih ic = (* Reading RGBQUADs *) (* If biClrUsed = 0 then the whole color range is used, else only *) (* the amount given by biClrUsed is effectively used in the bmp. *) (* But in any case, the size of the color map is stored in the file. *) let cmaplength = (* Color map starts from byte number 54, and ends at *) (* beginning of the bitmap (actual image data, i.e. pixels of the bmp).*) (* bfOffBits = offset from bfh to actual image data. *) (* 40 = sizeof (bfh), 14 = sizeof (bih). *) (* Hence color map length is bfOffBits - 54. *) (* Useful to load images with biClrUsed handled incorrectly *) (* In fact, some savers store the whole colormap, instead of *) (* the number of entries given by biClrUsed... *) (bfh.bfOffBits - 54) / 4 in Array.init cmaplength (fun _i -> load_rgbquad ic) ;; (* Loads image data when image has 8 bit depth *) let load_image8data bih ic = let bitmap = Bytes.create (bih.biWidth * bih.biHeight) in match bih.biCompression with | BI_RGB -> (* No compression : lines are stored in reverse order *) (* 'bih.biWidth' is padded to be a multiple of 4 pixels (32 bits) *) let pad = ((bih.biWidth + 3) / 4) * 4 in (* Reading *) for i = bih.biHeight - 1 downto 0 do let bitmapindex = ref (i * bih.biWidth) in for j = 0 to pad - 1 do let c = Char.chr (read_byte ic) in if j < bih.biWidth then bitmap << !bitmapindex & c; incr bitmapindex done done; bitmap | BI_RLE8 -> (* Run-length encoded format for bitmaps with 8 bits per pixel *) (* Coordinates of the current point in the image *) let x = ref 0 in let y = ref 0 in let bitmapindex = ref (!x + (bih.biHeight - !y - 1) * bih.biWidth) in while !y < bih.biHeight do match read_byte ic with (* Absolute mode, if second byte is between 03H and FFH. Encoded mode, with escape code otherwise. *) | 0 -> (* Escape codes mode *) begin match read_byte ic with | 0 -> (* End of line code *) x := 0; incr y; bitmapindex := !x + (bih.biHeight - !y - 1) * bih.biWidth | 1 -> (* End of bitmap : force exit *) y := bih.biHeight | 2 -> (* Delta *) let c1 = read_byte ic in x := !x + c1; let c2 = read_byte ic in y := !y + c2; bitmapindex := !x + (bih.biHeight - !y - 1) * bih.biWidth | c -> (* c should be between 03H and FFH *) (* Absolute mode: c represents the number of bytes which follow, each of which contains the color index of a single pixel. *) for _i = 0 to c - 1 do let c1 = read_byte ic in bitmap << !bitmapindex & Char.chr c1; incr x; incr bitmapindex done; (* Odd length run: read an extra pad byte *) if c land 1 <> 0 then skip_byte ic end | c -> (* Encoded mode *) let c1 = read_byte ic in for _i = 0 to c - 1 do bitmap << !bitmapindex & Char.chr c1; incr x; incr bitmapindex done done; bitmap | BI_RLE4 -> failwith ("Invalid compression mode : BI_RLE4") ;; let load_image1data bih ic = let bitmap = Bytes.create (bih.biWidth * bih.biHeight) in let c = ref 0 in (* each scan line 'w', is padded to be a multiple of 32 *) let pad = ((bih.biWidth + 31) / 32) * 32 in for i = bih.biHeight - 1 downto 0 do let bitmapindex = ref (i * bih.biWidth) in let bnum = ref 0 in for j = 0 to pad - 1 do if !bnum land 7 = 0 then begin c := read_byte ic; bnum := 0; end; if j < bih.biWidth then begin bitmap << !bitmapindex & if !c land 0x80 <> 0 then '\001' else '\000'; incr bitmapindex; c := !c lsl 1; end; incr bnum done done; bitmap ;; let load_image4data bih ic = let bitmap = Bytes.create (bih.biWidth * bih.biHeight) in match bih.biCompression with | BI_RGB -> (* 'w' is padded to be a multiple of 8 pixels (32 bits) *) let pad = ((bih.biWidth + 7) / 8) * 8 in let c = ref 0 in for i = bih.biHeight - 1 downto 0 do let bitmapindex = ref (i * bih.biWidth) in let nyblenum = ref 0 in for j = 0 to pad -1 do if !nyblenum land 1 = 0 then begin (* Read the next byte *) c := read_byte ic; nyblenum := 0 end; if j < bih.biWidth then begin bitmap << !bitmapindex & Char.chr ((!c land 0xf0) lsr 4); incr bitmapindex; c := !c lsl 4 end; incr nyblenum done done; bitmap | BI_RLE4 -> let x = ref 0 in let y = ref 0 in let bitmapindex = ref (!x + (bih.biHeight - !y - 1) * bih.biWidth) in let c1 = ref 0 in while !y < bih.biHeight do match read_byte ic with | 0 -> (* Escape codes *) begin match read_byte ic with | 0 -> (* End of line *) x := 0; incr y; bitmapindex := !x + (bih.biHeight - !y - 1) * bih.biWidth | 1 -> (* End of bitmap : force exit *) y := bih.biHeight | 2 -> (* Delta *) let c' = read_byte ic in x := !x + c'; let c'' = read_byte ic in y := !y + c''; bitmapindex := !x + (bih.biHeight - !y - 1) * bih.biWidth | c -> (* Absolute mode *) for i = 0 to c - 1 do if i land 1 = 0 then c1 := read_byte ic; let c = if i land 1 <> 0 then !c1 else !c1 lsr 4 in bitmap << !bitmapindex & Char.chr (c land 0x0F); incr x; incr bitmapindex done; (* Read pad byte *) if c land 3 = 1 || c land 3 = 2 then skip_byte ic end | c -> (* Encoded mode *) let c1 = read_byte ic in let col1 = c1 land 0x0F and col2 = (c1 lsr 4) land 0x0F in for i = 0 to c - 1 do let c = if i land 1 <> 0 then col1 else col2 in bitmap << !bitmapindex & Char.chr c; incr x; incr bitmapindex done done; bitmap | BI_RLE8 -> failwith ("Invalid compression mode : BI_RLE8") ;; let load_image24data bih ic = (* Bitmap is a string of RGB bytes *) let bitmap = Bytes.create ((bih.biWidth * bih.biHeight) * 3) in let pad = (4 - ((bih.biWidth * 3) mod 4)) land 0x03 in let pp = ref 0 in for i = bih.biHeight - 1 downto 0 do pp := (i * bih.biWidth * 3); for _j = 0 to bih.biWidth - 1 do bitmap << !pp + 2 & Char.chr (read_byte ic); (* Blue *) bitmap << !pp + 1 & Char.chr (read_byte ic); (* Green *) bitmap << !pp & Char.chr (read_byte ic); (* Red *) pp := !pp + 3 done; for _j = 0 to pad - 1 do skip_byte ic done; done; bitmap ;; let load_image32data bih ic = (* Bitmap is a string of RGB bytes *) let bitmap = Bytes.create ((bih.biWidth * bih.biHeight) * 4) in (* let pad = (4 - ((bih.biWidth * 4) mod 4)) land 0x03 in let pad = 1 in *) let pp = ref 0 in for i = bih.biHeight - 1 downto 0 do pp := (i * bih.biWidth * 4); for _j = 0 to bih.biWidth - 1 do bitmap << !pp + 2 & Char.chr (read_byte ic); (* Blue *) bitmap << !pp + 1 & Char.chr (read_byte ic); (* Green *) bitmap << !pp + 0 & Char.chr (read_byte ic); (* Red *) bitmap << !pp + 3 & Char.chr (read_byte ic); (* Alpha *) pp := !pp + 4 done; (* for j = 0 to pad - 1 do skip_byte ic done; *) done; bitmap ;; let load_imagedata bih ic = (* The bits in the array are packed together, but each scan line *) (* must be zero-padded to end on a LONG boundary. *) match bih.biBitCount with | Monochrome -> load_image1data bih ic | Color16 -> load_image4data bih ic | Color256 -> load_image8data bih ic | ColorRGB -> load_image24data bih ic | ColorRGBA -> load_image32data bih ic ;; let skip_to ic n = while !bytes_read <> n do skip_byte ic done ;; let check_header fname = let ic = open_in_bin fname in bytes_read := 0; try let _bfh = load_bitmapfileheader ic in let bih = load_bitmapinfoheader ic in close_in ic; { header_width = bih.biWidth; header_height = bih.biHeight; header_infos = []; } with | _ -> close_in ic; raise Wrong_file_type ;; let read_bmp ic = bytes_read := 0; let bfh = load_bitmapfileheader ic in let bih = load_bitmapinfoheader ic in let colormap = load_colors bfh bih ic in skip_to ic bfh.bfOffBits; let bitmap = load_imagedata bih ic in { bmpFileHeader = bfh; bmpInfoHeader = bih; bmpRgbQuad = colormap; bmpBytes = bitmap; } ;; let read_bmp_file fname = let ic = open_in_bin fname in let bmp = read_bmp ic in close_in ic; bmp ;; let image_of_bmp = function { bmpFileHeader = _bfh; bmpInfoHeader = bih; bmpRgbQuad = colormap; bmpBytes = bitmap; } -> match bih.biBitCount with | ColorRGB -> Rgb24 (Rgb24.create_with bih.biWidth bih.biHeight [] bitmap) | ColorRGBA -> Rgba32 (Rgba32.create_with bih.biWidth bih.biHeight [] bitmap) | Monochrome | Color16 | Color256 -> Index8 (Index8.create_with bih.biWidth bih.biHeight [] { map = colormap; max = 256; } (-1) bitmap) ;; let load fname _opts = image_of_bmp (read_bmp_file fname);; (* =================================================================== *) (* ============= Writting images as bmp files. ======================= *) (* =================================================================== *) let bytes_written = ref 0;; let write_byte oc b = incr bytes_written; output_byte oc b;; let output_word oc w = (* little-endian form *) let b0 = w land 255 in let b1 = (w lsr 8) land 255 in output_byte oc b0; output_byte oc b1 ;; let write_word oc w = output_word oc w; bytes_written := !bytes_written + 2 ;; let output_dword oc dw = (* little-endian form *) let b0 = dw land 255 in let b1 = (dw lsr 8) land 255 in let b2 = (dw lsr 16) land 255 in let b3 = (dw lsr 24) land 255 in output_byte oc b0; output_byte oc b1; output_byte oc b2; output_byte oc b3 ;; let write_dword oc dw = output_dword oc dw; bytes_written := !bytes_written + 4 ;; let write_bit_count oc bc = let byte = match bc with | Monochrome -> 1 | Color16 -> 4 | Color256 -> 8 | ColorRGB -> 24 | ColorRGBA -> 32 in write_word oc byte ;; let write_compression oc c = let dword = match c with | BI_RGB -> 0 | BI_RLE8 -> 1 | BI_RLE4 -> 2 in write_dword oc dword ;; let write_rgbquad oc rgb = let b = rgb.b in let g = rgb.g in let r = rgb.r in let u = 0 in write_byte oc b; write_byte oc g; write_byte oc r; write_byte oc u; ;; let write_bmpFileHeader oc = function { (* WORD *) bfType = bft; (* DWORD *) bfSize = bfs; (* WORD *) bfReserved1 = bfr1; (* WORD *) bfReserved2 = bfr2; (* DWORD *) bfOffBits = bfob } -> let start_index = !bytes_written in write_word oc bft; let bfSize_index = !bytes_written in write_dword oc bfs; write_word oc bfr1; write_word oc bfr2; let bfOffBits_index = !bytes_written in write_dword oc bfob; let end_bmpFileHeader = !bytes_written in start_index, bfSize_index, bfOffBits_index, end_bmpFileHeader ;; let write_bmpInfoHeader oc = function { (* DWORD *) biSize = bis; (* DWORD *) biWidth = biw; (* DWORD *) biHeight = bih; (* WORD *) biPlanes = bip; (* WORD *) biBitCount = bibc; (* DWORD *) biCompression = bic; (* DWORD *) biSizeImage = bisi; (* DWORD *) biXPelsPerMeter = bixpm; (* DWORD *) biYPelsPerMeter = biypm; (* DWORD *) biClrUsed = bicu; (* DWORD *) biClrImportant = bici } -> let biSize_index = !bytes_written in write_dword oc bis; write_dword oc biw; write_dword oc bih; write_word oc bip; write_bit_count oc bibc; write_compression oc bic; let biSizeImage_index = !bytes_written in write_dword oc bisi; write_dword oc bixpm; write_dword oc biypm; write_dword oc bicu; write_dword oc bici; let end_bmpInfoHeader = !bytes_written in biSize_index, biSizeImage_index, end_bmpInfoHeader ;; let write_colors oc color_map = (* If color_map is empty, should output a NULL character *) if Array.length color_map = 0 then write_byte oc 0 (* Otherwise write the rgb colors of the colormap *) else Array.iter (write_rgbquad oc) color_map ;; (* To denote the end of a scan line *) let write_end_of_scan_line oc = write_byte oc 0; write_byte oc 0;; (* To denote the end of the bitmap *) let write_end_of_bitmap oc = write_byte oc 0; write_byte oc 1;; (* Writing padding bytes. *) let write_pad oc n = for _i = 0 to n - 1 do write_byte oc 0 done;; (* Run length encoding: write the number n of pixels encoded *) (* the color number given by color index c *) let rec write_rle_code oc n c = if n <= 255 then begin write_byte oc n; write_byte oc c end else begin write_rle_code oc 255 c; write_rle_code oc (n - 255) c end ;; let write_rle oc n char = write_rle_code oc n (Char.code char);; (* In biRLE4 encoded mode the color byte is interpreted as two 4 bits colors to alternatively write even and odd pixels. Color is a char with 4 significant bytes. We duplicate them to get 2 identical colors, for run-length encoding. *) let write_rle4 oc n char = let code = Char.code char in write_rle_code oc n (code lsl 4 + code) ;; (* (4 - (n mod 4)) mod 4 *) let pad_bytes n = (4 - (n mod 4)) land 0x03;; let write_image1data bmp oc = let bih = bmp.bmpInfoHeader in if bih.biCompression <> BI_RGB then failwith "invalid compression for a monochrome bitmap" else let start_bitmap_index = !bytes_written in let bitmap = bmp.bmpBytes in let width = bih.biWidth in let height = bih.biHeight in let extra_padding_bytes = pad_bytes ((width + 7) / 8) in for i = height - 1 downto 0 do (* For each pixel in the line *) let start = i * width in let lim = (i + 1) * width - 1 in let rec write_line x count accu = if count = 8 then begin write_byte oc accu; if x <= lim then write_line x 0 0 end else let cur = bitmap.[x] in let chunk = Char.code cur lsl (7 - count) in let new_accu = chunk + accu in if x = lim then write_byte oc new_accu else write_line (x + 1) (count + 1) new_accu in write_line start 0 0; (* No end of scan line in bi_RGB mode *) (* Padding *) write_pad oc extra_padding_bytes; done; let end_bitmap_index = !bytes_written in start_bitmap_index, end_bitmap_index ;; let write_image24data bmp oc = let bih = bmp.bmpInfoHeader in if bih.biCompression <> BI_RGB then failwith "invalid compression for a rgb bitmap" else let start_bitmap_index = !bytes_written in let bitmap = bmp.bmpBytes in let width = bih.biWidth in let height = bih.biHeight in let extra_padding_bytes = pad_bytes (width * 3) in for i = height - 1 downto 0 do (* For each pixel in the line *) let start = i * width * 3 in let lim = (i + 1) * width * 3 - 1 in let rec write_line x = write_byte oc (Char.code bitmap.[x + 2]); (* Blue *) write_byte oc (Char.code bitmap.[x + 1]); (* Green *) write_byte oc (Char.code bitmap.[x]); (* Red *) let new_x = x + 3 in if new_x < lim then write_line new_x in write_line start; (* No end of scan line in bi_RGB mode *) (* Padding *) write_pad oc extra_padding_bytes; done; let end_bitmap_index = !bytes_written in start_bitmap_index, end_bitmap_index ;; let write_image32data bmp oc = let bih = bmp.bmpInfoHeader in if bih.biCompression <> BI_RGB then failwith "invalid compression for a rgba bitmap" else let start_bitmap_index = !bytes_written in let bitmap = bmp.bmpBytes in let width = bih.biWidth in let height = bih.biHeight in (* let extra_padding_bytes = pad_bytes (width * 4) in *) for i = height - 1 downto 0 do (* For each pixel in the line *) let start = i * width * 3 in let lim = (i + 1) * width * 4 - 1 in let rec write_line x = write_byte oc (Char.code bitmap.[x + 3]); (* Alpha *) write_byte oc (Char.code bitmap.[x + 2]); (* Blue *) write_byte oc (Char.code bitmap.[x + 1]); (* Green *) write_byte oc (Char.code bitmap.[x]); (* Red *) let new_x = x + 4 in if new_x < lim then write_line new_x in write_line start; (* No end of scan line in bi_RGB mode *) (* (* Padding *) write_pad oc extra_padding_bytes; *) done; let end_bitmap_index = !bytes_written in start_bitmap_index, end_bitmap_index ;; let write_image4data bmp oc = let bih = bmp.bmpInfoHeader in let start_bitmap_index = !bytes_written in let bitmap = bmp.bmpBytes in let width = bih.biWidth in let height = bih.biHeight in match bih.biCompression with | BI_RGB -> (* 'w' is padded to be a multiple of 8 pixels (32 bits) *) let extra_padding_bytes = pad_bytes ((width + 1) / 2) in for i = height - 1 downto 0 do (* For each pixel in the line *) let start = i * width in let lim = (i + 1) * width - 1 in let rec write_line x count accu = if count = 2 then begin write_byte oc accu; if x <= lim then write_line x 0 0 end else let cur = bitmap.[x] in let chunk = Char.code cur lsl (4 - count) in let new_accu = chunk + accu in if x = lim then write_byte oc new_accu else write_line (x + 1) (count + 1) new_accu in write_line start 0 0; (* Padding *) write_pad oc extra_padding_bytes; done; let end_bitmap_index = !bytes_written in start_bitmap_index, end_bitmap_index | BI_RLE4 -> (* We compress in encoded mode, not in absolute mode. *) (* So we do not have to align each run. *) (* However, each scan line is padded to be a multiple of 8 *) (* pixels (32 bits) *) (* For each line *) for i = height - 1 downto 0 do (* For each pixel in the line *) let start = i * width in let lim = (i + 1) * width - 1 in let rec write_line x count pred = let cur = bitmap.[x] in if cur = pred then if x = lim then write_rle4 oc (count + 1) pred else write_line (x + 1) (count + 1) pred else begin write_rle4 oc count pred; if x = lim then write_rle4 oc 1 cur else write_line (x + 1) 1 cur end in write_line start 0 bitmap.[start]; write_end_of_scan_line oc; (* No padding in this mode *) done; write_end_of_bitmap oc; let end_bitmap_index = !bytes_written in start_bitmap_index, end_bitmap_index | BI_RLE8 -> failwith ("Invalid compression mode : BI_RLE8");; let write_image8data bmp oc = let bih = bmp.bmpInfoHeader in let start_bitmap_index = !bytes_written in let bitmap = bmp.bmpBytes in let width = bih.biWidth in let height = bih.biHeight in match bih.biCompression with | BI_RGB -> (* 'w' is padded to be a multiple of 8 pixels (32 bits) *) let extra_padding_bytes = pad_bytes width in for i = height - 1 downto 0 do (* For each pixel in the line *) let start = i * width in let lim = (i + 1) * width - 1 in let rec write_line x = let cur = bitmap.[x] in write_byte oc (Char.code cur); if x < lim then write_line (x + 1) in write_line start; (* Padding *) write_pad oc extra_padding_bytes; done; let end_bitmap_index = !bytes_written in start_bitmap_index, end_bitmap_index | BI_RLE8 -> (* We compress in encoded mode, not in absolute mode. *) (* So we do not have to align each run. *) (* However, each scan line is padded to be a multiple of 8 *) (* pixels (32 bits) *) (* For each line *) for i = height - 1 downto 0 do (* For each pixel in the line *) let start = i * width in let lim = (i + 1) * width - 1 in let rec write_line x count pred = let cur = bitmap.[x] in if cur = pred then if x = lim then write_rle oc (count + 1) pred else write_line (x + 1) (count + 1) pred else begin write_rle oc count pred; if x = lim then write_rle oc 1 cur else write_line (x + 1) 1 cur end in write_line start 0 bitmap.[start]; write_end_of_scan_line oc; (* No padding in this mode *) done; write_end_of_bitmap oc; let end_bitmap_index = !bytes_written in start_bitmap_index, end_bitmap_index | BI_RLE4 -> failwith ("Invalid compression mode : BI_RLE8");; let write_image_data oc bmp = let bih = bmp.bmpInfoHeader in match bih.biBitCount with | Monochrome -> write_image1data bmp oc | Color16 -> write_image4data bmp oc | Color256 -> write_image8data bmp oc | ColorRGB -> write_image24data bmp oc | ColorRGBA -> write_image32data bmp oc ;; let bmp_of_image img = match img with | Rgb24 bitmap -> let biW = bitmap.Rgb24.width and biH = bitmap.Rgb24.height and data = Rgb24.dump bitmap in let bfh = { (* WORD *) bfType = 19778 (* BM *); (* DWORD *) bfSize = -1 (* Unknown to be updated *); (* WORD *) bfReserved1 = 0; (* WORD *) bfReserved2 = 0; (* DWORD *) bfOffBits = -1 (* Unknown to be updated *) } in let bih = { (* The size in bytes of this header. *) biSize = -1; (* Unknown to be updated *) (* Width and height of the image *) biWidth = biW; biHeight = biH; (* According to the format, Must be set to 1. *) biPlanes = 1; (* 24 bits pixels. *) biBitCount = ColorRGB; (* Compression is no compression: we output pixels as rgb rgb ... with padding. *) biCompression = BI_RGB; (* The size of the actual image pixels representation in the file. Due to padding, cannot be computed here. *) biSizeImage = -1 (* Unknown to be updated *); (* This should be OK *) biXPelsPerMeter = 600; biYPelsPerMeter = 600; (* Unknown: the number of colors actually used by the image. Must be computed while writing the image. *) biClrUsed = 0; (* Number of important colors. If 0, all colors are important *) biClrImportant = 0 } in { bmpFileHeader = bfh; bmpInfoHeader = bih; bmpRgbQuad = [||]; bmpBytes = data } | Rgba32 bitmap -> let biW = bitmap.Rgba32.width and biH = bitmap.Rgba32.height and data = Rgba32.dump bitmap in let bfh = { (* WORD *) bfType = 19778 (* BM *); (* DWORD *) bfSize = -1 (* Unknown to be updated *); (* WORD *) bfReserved1 = 0; (* WORD *) bfReserved2 = 0; (* DWORD *) bfOffBits = -1 (* Unknown to be updated *) } in let bih = { (* The size in bytes of this header. *) biSize = -1; (* Unknown to be updated *) (* Width and height of the image *) biWidth = biW; biHeight = biH; (* According to the format, Must be set to 1. *) biPlanes = 1; (* 24 bits pixels. *) biBitCount = ColorRGBA; (* Compression is no compression: we output pixels as rgb rgb ... with padding. *) biCompression = BI_RGB; (* The size of the actual image pixels representation in the file. Due to padding, cannot be computed here. *) biSizeImage = -1 (* Unknown to be updated *); (* This should be OK *) biXPelsPerMeter = 600; biYPelsPerMeter = 600; (* Unknown: the number of colors actually used by the image. Must be computed while writing the image. *) biClrUsed = 0; (* Number of important colors. If 0, all colors are important *) biClrImportant = 0 } in { bmpFileHeader = bfh; bmpInfoHeader = bih; bmpRgbQuad = [||]; bmpBytes = data } | Index8 bitmap -> let colormap = bitmap.Index8.colormap.map and biW = bitmap.Index8.width and biH = bitmap.Index8.height and data = Index8.dump bitmap in let bfh = { (* WORD *) bfType = 19778 (* BM *); (* DWORD *) bfSize = -1 (* Unknown to be updated *); (* WORD *) bfReserved1 = 0; (* WORD *) bfReserved2 = 0; (* DWORD *) bfOffBits = -1 (* Unknown to be updated *) } in let biBitCount,biClrUsed,biCompression,biClrImportant = let col_map_len = Array.length colormap in match col_map_len with | n when n <= 2 -> Monochrome, 2, BI_RGB, 2 | 16 -> Color16, col_map_len, BI_RGB, 0 | n when n <= 16 -> Color16, col_map_len, BI_RLE4, 0 | 256 -> Color256, col_map_len, BI_RGB, 0 | n when n <= 256 -> Color256, col_map_len, BI_RLE8, 0 | _n -> failwith "Too many colors for a bitmap with 8 bits per pixel" in let bih = { biSize = -1; biWidth = biW; biHeight = biH; biPlanes = 1; biBitCount = biBitCount; biCompression = biCompression; biSizeImage = -1; biXPelsPerMeter = 600; biYPelsPerMeter = 600; biClrUsed = biClrUsed; biClrImportant = biClrImportant; } in { bmpFileHeader = bfh; bmpInfoHeader = bih; bmpRgbQuad = colormap; bmpBytes = data; } | _ -> raise Wrong_image_type;; let write_bmp oc = function { bmpFileHeader = bmpFileHeader; bmpInfoHeader = bmpInfoHeader; bmpRgbQuad = colormap; bmpBytes = _bitmap } as bmp -> bytes_written := 0; let start_index, bfSize_index, bfOffBits_index, end_bmpFileHeader = write_bmpFileHeader oc bmpFileHeader in let start_bmpInfoHeader = end_bmpFileHeader in let biSize_index, biSizeImage_index, end_bmpInfoHeader = write_bmpInfoHeader oc bmpInfoHeader in write_colors oc colormap; let start_bitmap_index, end_bitmap_index = write_image_data oc bmp in (* Correcting sizes: bfSize, bfOffBits, biSize, bisizeImage *) let bfSize = (* Given in bytes! not in DWORDs *) !bytes_written - start_index in seek_out oc bfSize_index; output_dword oc bfSize; let bfOffBits = (* Given in bytes *) start_bitmap_index - start_index in seek_out oc bfOffBits_index; output_dword oc bfOffBits; let biSize = (* Given in bytes *) end_bmpInfoHeader - start_bmpInfoHeader in seek_out oc biSize_index; output_dword oc biSize; let biSizeImage = (* Given in bytes *) end_bitmap_index - start_bitmap_index in seek_out oc biSizeImage_index; output_dword oc biSizeImage; ;; let write_bmp_file fname bmp = let oc = open_out_bin fname in write_bmp oc bmp; close_out oc; ;; let save fname _opts img = write_bmp_file fname (bmp_of_image img);; add_methods Bmp { check_header = check_header; load = Some load; save = Some save; load_sequence = None; save_sequence = None; } ;; let save_bmp = write_bmp_file and load_bmp = read_bmp_file ;; camlspotter-camlimages-e471b3c4470d/src/bmp.mli0000644000000000000000000001210512405272062017441 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999, 2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: bmp.mli,v 1.2 2009/02/08 14:27:00 weis Exp $ *) val check_header : bytes -> Images.header;; (** Checks the file header *) val load : bytes -> Images.load_option list -> Images.t;; (** Loads a bmp image. *) val save : bytes -> Images.save_option list -> Images.t -> unit;; (** Save an image in bmp format file. *) (*** Below, they are all lower interfaces *) (** The type of bmp images. *) (** The Caml representation of a bmp bit map image. Fields are Caml values, the decoded versions of raw data in the file. Structure of bitmaps files on disk : - BITMAPFILEHEADER : bytes 0 to 14 excluded - BITMAPINFOHEADER : bytes 14 to 54 excluded - RGBQUAD [] : color map - BYTES [] : bit map *) type bmp = { bmpFileHeader : bitmapfileheader; (** Bytes <0 14< *) bmpInfoHeader : bitmapinfoheader; (** Bytes <14 54< *) bmpRgbQuad : Images.rgb array; (** Bytes <54 ... *) bmpBytes : bytes; (** Bytes bmp;; val save_bmp : bytes -> bmp -> unit;; (** Load and save functions for BMP images. *) camlspotter-camlimages-e471b3c4470d/src/camlimages.ml.in0000644000000000000000000000311712405272062021224 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: camlimages.ml.in,v 1.3.2.1 2010/05/13 13:14:47 furuse Exp $ *) let version = "@VERSION@" (* Supported libraries *) let lib_gif = @SUPPORT_GIF@ let lib_png = @SUPPORT_PNG@ let lib_jpeg = @SUPPORT_JPEG@ let lib_tiff = @SUPPORT_TIFF@ let lib_freetype = @SUPPORT_FREETYPE@ let lib_ps = @SUPPORT_PS@ let lib_xpm = @SUPPORT_XPM@ let lib_exif = @SUPPORT_EXIF@ (* External files *) let path_rgb_txt = "@PATH_RGB_TXT@" let path_gs = "@PATH_GS@" (* They are written in ML, so always supported *) let lib_ppm = true let lib_bmp = true let lib_xvthumb = true (* Word size, used for the bitmap swapping memory management *) let word_size = @WORD_SIZE@ camlspotter-camlimages-e471b3c4470d/src/cmyk32.ml0000644000000000000000000001023612405272062017625 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: cmyk32.ml,v 1.4 2009/07/04 03:39:28 furuse Exp $*) (* CMYK 32 bit depth image format *) open Util module E = struct open Color type t = Color.cmyk let bytes_per_pixel = 4 let get str pos = { c = int_of_char str.[pos ]; m = int_of_char str.[pos + 1]; y = int_of_char str.[pos + 2]; k = int_of_char str.[pos + 3]; } let set str pos t = str << pos & char_of_int t.c; str << pos + 1 & char_of_int t.m; str << pos + 2 & char_of_int t.y; str << pos + 3 & char_of_int t.k let make t = let str = Bytes.create bytes_per_pixel in set str 0 t; str end;; module RI = Genimage.MakeRawImage(E);; type rawimage = RI.t;; type elt = Color.cmyk;; type t = { width : int; height : int; rawimage : RI.t; mutable infos : Info.info list; };; module C = struct type rawimage = RI.t type container = t let rawimage x = x.rawimage let create_default width height rawimage = { width = width; height = height; rawimage = rawimage; infos = []; } let create_duplicate src width height rawimage = { width = width; height = height; rawimage = rawimage; infos = src.infos; } end;; module IMAGE = Genimage.Make(RI)(C);; let create_with width height infos data = { width = width; height = height; rawimage = RI.create_with width height data; infos = infos; };; let create_with_scanlines width height infos data = { width = width; height = height; rawimage = RI.create_with_scanlines width height data; infos = infos; };; let rawimage = C.rawimage;; let create = IMAGE.create;; let make = IMAGE.make;; let dump = IMAGE.dump;; let unsafe_access = IMAGE.unsafe_access;; let get_strip = IMAGE.get_strip;; let set_strip = IMAGE.set_strip;; let get_scanline = IMAGE.get_scanline;; let set_scanline = IMAGE.set_scanline;; let unsafe_get = IMAGE.unsafe_get;; let unsafe_set = IMAGE.unsafe_set;; let get = IMAGE.get;; let set = IMAGE.set;; let destroy = IMAGE.destroy;; let copy = IMAGE.copy;; let sub = IMAGE.sub;; let blit = IMAGE.blit;; let map = IMAGE.map;; let blocks = IMAGE.blocks;; let dump_block = IMAGE.dump_block;; open Color;; (* image resize with smoothing *) let resize prog img nw nh = let newimage = create nw nh in let xscale = float nw /. float img.width in let yscale = float nh /. float img.height in for y = 0 to nh - 1 do for x = 0 to nw - 1 do let start_x = truncate (float x /. xscale) and start_y = truncate (float y /. yscale) in let end_x = truncate ((float x +. 0.99) /. xscale) and end_y = truncate ((float y +. 0.99) /. yscale) in let size = (end_x - start_x + 1) * (end_y - start_y + 1) in let sc = ref 0 and sm = ref 0 and sy = ref 0 and sk = ref 0 in for xx = start_x to end_x do for yy = start_y to end_y do let c = unsafe_get img xx yy in sc := !sc + c.c; sm := !sm + c.m; sy := !sy + c.y; sk := !sk + c.k; done done; unsafe_set newimage x y { c = !sc / size; m = !sm / size; y = !sy / size; k = !sk / size; } done; match prog with | Some p -> p (float (y + 1) /. float nh) | None -> () done; newimage;; camlspotter-camlimages-e471b3c4470d/src/cmyk32.mli0000644000000000000000000000452612405272062020003 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: cmyk32.mli,v 1.4 2009/07/04 03:39:28 furuse Exp $*) (* CMYK 32 bit depth image format *) type elt = Color.cmyk;; type rawimage;; (* The image type *) type t = { width : int; height : int; rawimage : rawimage; mutable infos : Info.info list; };; (* Generic functions *) (* Please read the comments of IMAGE in genimage.mli *) val dump : t -> bytes;; val unsafe_access : t -> int -> int -> bytes * int;; val get_strip : t -> int -> int -> int -> bytes;; val set_strip : t -> int -> int -> int -> bytes -> unit;; val get_scanline : t -> int -> bytes;; val set_scanline : t -> int -> bytes -> unit;; val unsafe_get : t -> int -> int -> elt;; val unsafe_set : t -> int -> int -> elt -> unit;; val get : t -> int -> int -> elt;; val set : t -> int -> int -> elt -> unit;; val destroy : t -> unit;; val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit;; val map : (elt -> elt -> elt) -> t -> int -> int -> t -> int -> int -> int -> int -> unit;; val blocks : t -> int * int val dump_block : t -> int -> int -> Bitmap.Block.t val create_with : int -> int -> Info.info list -> bytes -> t;; val create_with_scanlines : int -> int -> Info.info list -> bytes array -> t;; val create : int -> int -> t;; val make : int -> int -> elt -> t;; val copy : t -> t;; val sub : t -> int -> int -> int -> int -> t;; val resize : (float -> unit) option -> t -> int -> int -> t;; val rawimage : t -> rawimage camlspotter-camlimages-e471b3c4470d/src/color.ml0000644000000000000000000002012412405272062017630 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: color.ml,v 1.1.2.1 2010/05/16 01:45:54 furuse Exp $*) exception Too_many_colors;; module type COLORMODEL = sig type t val square_distance : t -> t -> int end;; (***************************************************************** color map *) type 'a map = { mutable max: int; (* maximum color index allowed in the color map (-1 = unlimited) *) mutable map: 'a array; };; let size cmap = Array.length cmap.map;; let find_exact cmap c = let found = ref 0 in let map = cmap.map in try for i = 0 to Array.length map - 1 do let c' = map.(i) in if c = c' then begin found := i; raise Exit end done; raise Not_found with Exit -> !found;; let add_color cmap c1 = try find_exact cmap c1 with | Not_found -> let len = size cmap in if cmap.max >= 0 && len = cmap.max then raise Too_many_colors; cmap.map <- Array.append cmap.map [|c1|]; len;; let add_colors cmap cs = let ret, not_exist = List.fold_right (fun c (ret, not_exist) -> try let found = find_exact cmap c in (Some found :: ret), not_exist with | Not_found -> (None :: ret), (c :: not_exist)) cs ([],[]) in let len = size cmap in if cmap.max >= 0 && len + List.length not_exist > cmap.max then raise Too_many_colors; cmap.map <- Array.append cmap.map (Array.of_list not_exist); let cntr = ref len in List.map (function | Some x -> x | None -> let x = !cntr in incr cntr; x) ret;; let copy cmap = { max = cmap.max; map = Array.copy cmap.map; };; module MakeMap(CM:COLORMODEL) = struct let size = (size : CM.t map -> int) let find_exact = (find_exact : CM.t map -> CM.t -> int) let add_color = (add_color : CM.t map -> CM.t -> int) let add_colors = (add_colors : CM.t map -> CM.t list -> int list) let find_nearest cmap c = let found = ref (-1) in let diff = ref (-1) in let map = cmap.map in for i = 0 to Array.length map - 1 do let c' = map.(i) in let d = CM.square_distance c c' in if !diff < 0 || d < !diff then begin diff := d; found := i end done; if !found = -1 then raise Not_found else !found end;; module RgbModel = struct type t = { mutable r : int; mutable g : int; mutable b : int; } let square_distance c1 c2 = let dr = c1.r - c2.r and dg = c1.g - c2.g and db = c1.b - c2.b in dr * dr + dg * dg + db * db let plus rgb rgb' = { r = rgb.r + rgb'.r; g = rgb.g + rgb'.g; b = rgb.b + rgb'.b; } let minus rgb rgb' = { r = rgb.r - rgb'.r; g = rgb.g - rgb'.g; b = rgb.b - rgb'.b; } end;; module Rgb = struct include RgbModel include MakeMap(RgbModel) end;; type rgb = Rgb.t = { mutable r : int; mutable g : int; mutable b : int; };; module RgbaModel = struct type t = { color : rgb; mutable alpha : int; } let square_distance c1 c2 = let ds_rgb = Rgb.square_distance c1.color c2.color in let da = c1.alpha - c2.alpha in ds_rgb + da * da let plus c c' = { color = Rgb.plus c.color c'.color; alpha = c.alpha + c'.alpha; } let minus c c' = { color = Rgb.minus c.color c'.color; alpha = c.alpha - c'.alpha; } let merge src dst = (* I am not sure... *) let check v = if v < 0 then 0 else if v > 255 then 255 else v in if src.alpha = 0 then dst else if src.alpha = 255 then src else let alpha' = 255 - src.alpha in let c = { r = check ((alpha' * dst.color.r * dst.alpha / 255 + src.color.r * src.alpha) / 255); g = check ((alpha' * dst.color.g * dst.alpha / 255 + src.color.g * src.alpha) / 255); b = check ((alpha' * dst.color.b * dst.alpha / 255 + src.color.b * src.alpha) / 255); } in { color = c; alpha = check (255 - alpha' * (255 - dst.alpha) / 255); } end;; module Rgba = struct include RgbaModel include MakeMap(RgbaModel) end;; type rgba = Rgba.t = { color : rgb; mutable alpha : int; };; module CmykModel = struct type t = { mutable c : int; mutable m : int; mutable y : int; mutable k : int; } let square_distance c1 c2 = let dc = c1.c - c2.c and dm = c1.m - c2.m and dy = c1.y - c2.y and dk = c1.k - c2.k in dc * dc + dm * dm + dy * dy + dk * dk let plus c c' = { c = c.c + c'.c; m = c.m + c'.m; y = c.y + c'.y; k = c.k + c'.k; } let minus c c' = { c = c.c - c'.c; m = c.m - c'.m; y = c.y - c'.y; k = c.k - c'.k; } end;; module Cmyk = struct include CmykModel include MakeMap(CmykModel) end;; type cmyk = Cmyk.t = { mutable c : int; mutable m : int; mutable y : int; mutable k : int; };; (************************************************* RGB specialized functions *) let rgb_square_distance = Rgb.square_distance;; let plus = Rgb.plus;; let minus = Rgb.minus;; (* let brightness c = (c.r * 88 + c.g * 127 + c.b * 40) / 255 XV setting *) let brightness c = (c.r * 54 + c.g * 182 + c.b * 19) / 255;; (* Y = 0.212671 * R + 0.715160 * G + 0.072169 * B; ITU-R Recommendation BT.709, Basic Parameter Values for the HDTV Standard for the Studio and for International Programme Exchange (1990), [formerly CCIR Rec. 709], ITU, 1211 Geneva 20, Switzerland. *) (********************************************************* Color name parser *) let color_name_table = ref None;; (* CR jfuruse: path_rgb_txt may not exist *) let color_table_load () = let ic = open_in Camlimages.path_rgb_txt in let table = Hashtbl.create 107 in try while true do let s = input_line ic in if s.[0] <> '!' then let tokens = Mstring.split_str (function ' ' | '\t' -> true | _ -> false) s in match tokens with | r :: g :: b :: rest -> Hashtbl.add table (Mstring.catenate_sep " " rest) {r = int_of_string r; g = int_of_string g; b = int_of_string b;} | _ -> assert false done; raise Exit with | End_of_file -> close_in ic; color_name_table := Some table; table;; let color_name_query c = let table = match !color_name_table with | Some t -> t | None -> color_table_load () in Hashtbl.find table c;; let color_parse c = try if c = "none" || c = "None" then {r = -1; g = -1; b = -1} else if c.[0] = '#' then match String.length c with | 7 -> let r = int_of_string ("0x" ^ String.sub c 1 2) and g = int_of_string ("0x" ^ String.sub c 3 2) and b = int_of_string ("0x" ^ String.sub c 5 2) in {r = r; g = g; b = b} | 13 -> let r = int_of_string ("0x" ^ String.sub c 1 4) / 256 and g = int_of_string ("0x" ^ String.sub c 5 4) / 256 and b = int_of_string ("0x" ^ String.sub c 9 4) / 256 in {r = r; g = g; b = b} | _ -> raise Exit else color_name_query c with | _ -> failwith (Printf.sprintf "Color parse %s failed" c);; let colormap_parse cmap = let transparent = ref (-1) in let cmap = Array.map color_parse cmap in for i = 0 to Array.length cmap - 1 do let c = cmap.(i) in if c.r < 0 then begin c.r <- 0; c.g <- 255; c.b <- 0; transparent := i; prerr_endline (Printf.sprintf "transparent= %d" i); end done; cmap, !transparent;; camlspotter-camlimages-e471b3c4470d/src/color.mli0000644000000000000000000001060712405272062020006 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: color.mli,v 1.1 2006/11/28 15:43:28 rousse Exp $ *) (** Definition of colormaps, i.e. mappings from real RGB colors to integers. The integer corresponding to a color [c] is an index [i] into a vector of colors whose [i]th element is [c]. *) exception Too_many_colors;; type 'a map = { mutable max : int; mutable map : 'a array };; (** This is copied in Images also *) (** Colormap manipulation functions *) val size : 'a map -> int;; (** Returns the size of a colormap. *) val find_exact : 'a map -> 'a -> int;; (** Finds a color in the colormap and returns its color index. Raises exception [Not_found] if the color is not in the colormap. *) val add_color : 'a map -> 'a -> int;; (** Add a new color into the given colormap and return its index. If the color is already in the colormap, it is not added again, and the corresponding color index is returned. *) val add_colors : 'a map -> 'a list -> int list;; (** Add the list of new colors into the given colormap and return their indices. If a color is already in the colormap, it is not added again, and the corresponding color index is returned. *) val copy : 'a map -> 'a map;; (** Copy a colormap *) (* val find_nearest : 'a map -> 'a -> int;; (* [find_nearest m c] finds the color [co] that is the nearest to [c] color into the colormap [m]. Returns the color index of [co] and the distance between [c] and [co]. *) (* this is defined inside each color model implementation *) *) module Rgb : sig type t = { mutable r : int; mutable g : int; mutable b : int } val square_distance : t -> t -> int val plus : t -> t -> t val minus : t -> t -> t val size : t map -> int val find_exact : t map -> t -> int val add_color : t map -> t -> int val add_colors : t map -> t list -> int list val find_nearest : t map -> t -> int end;; type rgb = Rgb.t = { mutable r : int; mutable g : int; mutable b : int };; (* This is copied in Images also *) (* R(ed), G(reen), B(lue) representation of colors. *) module Rgba : sig type t = { color : rgb; mutable alpha : int; } val square_distance : t -> t -> int val plus : t -> t -> t val minus : t -> t -> t val merge : t -> t -> t val size : t map -> int val find_exact : t map -> t -> int val add_color : t map -> t -> int val add_colors : t map -> t list -> int list val find_nearest : t map -> t -> int end;; type rgba = Rgba.t = { color: rgb; mutable alpha : int; };; (** RGB with alpha (transparent) information *) module Cmyk : sig type t = {mutable c : int; mutable m : int; mutable y : int; mutable k : int } val square_distance : t -> t -> int val plus : t -> t -> t val minus : t -> t -> t val size : t map -> int val find_exact : t map -> t -> int val add_color : t map -> t -> int val add_colors : t map -> t list -> int list val find_nearest : t map -> t -> int end;; type cmyk = Cmyk.t = { mutable c : int; mutable m : int; mutable y : int; mutable k : int; };; (** Cyan Magenta Yellow blacK color model *) (** Rgb specialized functions (for backward compatibility) *) val rgb_square_distance : rgb -> rgb -> int;; (** Compute the distance between two colours. *) val plus : rgb -> rgb -> rgb;; val minus : rgb -> rgb -> rgb;; val brightness : rgb -> int;; (********************************************************* Color name parser *) val color_parse : string -> rgb;; val colormap_parse : string array -> rgb array * int;; camlspotter-camlimages-e471b3c4470d/src/colorhist.ml0000644000000000000000000000636512405272062020533 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: colorhist.ml,v 1.1 2006/11/28 15:43:28 rousse Exp $ *) open Color;; type t = int array;; let create () = Array.make 256 0;; let total_samples t = Array.fold_left (fun st x -> st + x) 0 t;; let store_sample t rgb = let brightness = Color.brightness rgb in t.(brightness) <- t.(brightness) + 1;; let normalize keep t = let total = total_samples t in if total = 0 then raise (Failure "histgram is empty"); let cut_samples = truncate ((float total) *. (1.0 -. keep) /. 2.0) in let rec find_limit update sum b = let sum = sum + t.(b) in if sum > cut_samples then b else find_limit update sum (update b) in let min = find_limit ((+) 1) 0 0 and max = find_limit ((+) (-1)) 0 255 in if max - min = 0 then fun x -> x else let new_b_array = Array.init 256 (fun b -> if b <= min then 0 else if b >= max then 255 else 255 * (b - min) / (max - min + 1)) in fun rgb -> let b = Color.brightness rgb in if b = 0 then {r=0; g=0; b=0} else begin let new_b = new_b_array.(b) in let color_fix c = if c < 0 then 0 else if c > 255 then 255 else c in { r = color_fix (rgb.r * new_b / b); g = color_fix (rgb.g * new_b / b); b = color_fix (rgb.b * new_b / b) } end;; open OImages;; let gamma log img = let table = Array.init 256 (fun x -> truncate (((float x /. 255.0) ** log) *. 255.0)) in let filter = fun rgb -> { r = table.(rgb.r); g = table.(rgb.g); b = table.(rgb.b) } in let img' = new rgb24 img#width img#height in for x = 0 to img#width - 1 do for y = 0 to img#height - 1 do img'#unsafe_set x y (filter (img#unsafe_get x y)) done done; img';; let filter f keep img = let hist = create () in for x = 0 to img#width - 1 do for y = 0 to img#height - 1 do store_sample hist (img#unsafe_get x y) done done; (* let dx = img#width / 100 in let dy = img#height / 100 in for x = 0 to (img#width - 1) / dx do for y = 0 to (img#height - 1) / dy do store_sample hist (img#unsafe_get (x*dx) (y*dy)) done done; *) let filter = f keep hist in let img' = new rgb24 img#width img#height in for x = 0 to img#width - 1 do for y = 0 to img#height - 1 do img'#unsafe_set x y (filter (img#unsafe_get x y)) done done; img';; camlspotter-camlimages-e471b3c4470d/src/colorhist.mli0000644000000000000000000000073512405272062020677 0ustar 00000000000000type t = int array val create : unit -> int array val total_samples : int array -> int val store_sample : int array -> Color.rgb -> unit val normalize : float -> int array -> Color.rgb -> Color.rgb val gamma : float -> < height : int; unsafe_get : int -> int -> Color.rgb; width : int; .. > -> OImages.rgb24 val filter : ('a -> int array -> Color.rgb -> Color.rgb) -> 'a -> < height : int; unsafe_get : int -> int -> Color.rgb; width : int; .. > -> OImages.rgb24 camlspotter-camlimages-e471b3c4470d/src/exif.ml0000644000000000000000000004070212405272062017451 0ustar 00000000000000open Exifutil module Numbers = struct type rational = int64 * int64 type srational = int32 * int32 let float_of_rational (x,y) = Int64.to_float x /. Int64.to_float y let float_of_srational (x,y) = Int32.to_float x /. Int32.to_float y let string_of_rational i1 i2 = Printf.sprintf "%Ld/%Ld" i1 i2 let string_of_srational i1 i2 = Printf.sprintf "%ld/%ld" i1 i2 end open Numbers module Endian = struct type t = Big (* Motorola *) | Little (* Intel *) let to_string = function | Big -> "Big" | Little -> "Little" let sys = if Sys.big_endian then Big else Little end module IFD = struct type t = | IFD_0 (** Info of the main image *) | IFD_1 (** Info of the thumbnail *) | EXIF (** camera info *) | GPS (** location *) | Interop (** exif format interoperability info *) end module Date = struct (* for GPSDateStamp *) type t = { year : int; month : int; (** 1-12, I guess *) day : int; } let to_string t = Printf.sprintf "%04d:%02d:%02d" t.year t.month t.day let of_string s = try if String.length s <> 10 then raise Exit; let check_colon n = if s.[n] <> ':' then raise Exit in let get_int from len = (* "0x12" is parsable, but who cares? *) int_of_string (String.sub s from len ) in check_colon 4; check_colon 7; let year = get_int 0 4 in let month = get_int 5 2 in let day = get_int 8 2 in `Ok { year; month; day; } with _ -> `Error s end module DateTime = struct type t = { year : int; month : int; (** 1-12, I guess *) day : int; hour : int; min : int; sec : int } let to_string t = Printf.sprintf "%04d:%02d:%02d %02d:%02d:%02d" t.year t.month t.day t.hour t.min t.sec let of_string s = try if String.length s <> 19 then raise Exit; let check_colon n = if s.[n] <> ':' then raise Exit in let get_int from len = (* "0x12" is parsable, but who cares? *) int_of_string (String.sub s from len ) in check_colon 4; check_colon 7; check_colon 13; check_colon 16; let year = get_int 0 4 in let month = get_int 5 2 in let day = get_int 8 2 in let hour = get_int 11 2 in let min = get_int 14 2 in let sec = get_int 17 2 in `Ok { year; month; day; hour; min; sec } with _ -> `Error s (* I had an Android phone which created DateTime tag with a little endian encoded unsigned int32 of unix time! This function tries to fix the issue. *) let of_string_packed_unix_time s = try let float_code c = float (Char.code c) in let converter sec = let open Unix in let tm = Unix.gmtime sec in { year = tm.tm_year; month = tm.tm_mon + 1; day = tm.tm_mday; hour = tm.tm_hour; min = tm.tm_min; sec = tm.tm_sec } in if s.[4] = '\000' then let sec = float_code s.[0] +. float_code s.[1] *. 256.0 +. float_code s.[2] *. 65536.0 +. float_code s.[3] *. 16777216.0 in (* \000\000\000\000\000 is treated as an error rather than 1970-01-01T00:00:00 *) if sec = 0.0 then `Error s else `Ok (converter sec) else `Error s with | _ -> `Error s end module Tag = struct type t = int external to_string : t -> IFD.t -> string = "caml_exif_tag_get_name_in_ifd" end module Entry = struct type t module Pack = struct type format = | ILLEGAL | BYTE (*= 1, *) | ASCII (*= 2, *) | SHORT (*= 3, *) | LONG (*= 4, *) | RATIONAL (*= 5, *) | SBYTE (*= 6, *) | UNDEFINED (*= 7, *) | SSHORT (*= 8, *) | SLONG (*= 9, *) | SRATIONAL (*= 10, *) | FLOAT (*= 11, *) | DOUBLE (*= 12 *) let string_of_format = function | ILLEGAL -> assert false | BYTE -> "BYTE" | ASCII -> "ASCII" | SHORT -> "SHORT" | LONG -> "LONG" | RATIONAL -> "RATIONAL" | SBYTE -> "SBYTE" | UNDEFINED -> "UNDEFINED" | SSHORT -> "SSHORT" | SLONG -> "SLONG" | SRATIONAL -> "SRATIONAL" | FLOAT -> "FLOAT" | DOUBLE -> "DOUBLE" type unpacked = | Bytes of int array | Asciis of string | Shorts of int array | Longs of int64 array | Rationals of (int64 * int64) array | SBytes of int array | Undefined of string | SShorts of int array | SLongs of int32 array | SRationals of (int32 * int32) array | Floats of float array | Doubles of float array external decode_bytes : string -> int -> int array = "Val_ExifBytes" external decode_shorts : string -> int -> int array = "Val_ExifShorts" external decode_longs : string -> int -> int64 array = "Val_ExifLongs" external decode_rationals : string -> int -> rational array = "Val_ExifRationals" external decode_sbytes : string -> int -> int array = "Val_ExifSBytes" external decode_sshorts : string -> int -> int array = "Val_ExifSShorts" external decode_slongs : string -> int -> int32 array = "Val_ExifSLongs" external decode_srationals : string -> int -> srational array = "Val_ExifSRationals" external decode_floats : string -> int -> float array = "Val_ExifFloats" external decode_doubles : string -> int -> float array = "Val_ExifDoubles" let unpack format components content = match format with | ILLEGAL -> assert false | BYTE (*= 1, *) -> Bytes (decode_bytes content components) | ASCII (*= 2, *) -> (* remove the last \000 *) let content = let len = String.length content in if content.[len-1] = '\000' then String.sub content 0 (len-1) else content in Asciis content | SHORT (*= 3, *) -> Shorts (decode_shorts content components) | LONG (*= 4, *) -> Longs (decode_longs content components) | RATIONAL (*= 5, *) -> Rationals (decode_rationals content components) | SBYTE (*= 6, *) -> Bytes (decode_sbytes content components) | UNDEFINED (*= 7, *) -> Undefined content | SSHORT (*= 8, *) -> SShorts (decode_sshorts content components) | SLONG (*= 9, *) -> SLongs (decode_slongs content components) | SRATIONAL (*= 10, *) -> SRationals (decode_srationals content components) | FLOAT (*= 11, *) -> Floats (decode_floats content components) | DOUBLE (*= 12 *) -> Doubles (decode_doubles content components) open Format let format ppf v = begin match v with | Asciis _ -> () | Undefined _ -> fprintf ppf "Undefined " | Bytes _ -> fprintf ppf "Bytes " | SBytes _ -> fprintf ppf "SBytes " | Shorts _ -> fprintf ppf "Shorts " | Longs _ -> fprintf ppf "Longs " | Rationals _ -> fprintf ppf "Rationals " | SShorts _ -> fprintf ppf "SShorts " | SLongs _ -> fprintf ppf "SLongs " | SRationals _ -> fprintf ppf "SRationals " | Floats _ -> fprintf ppf "Floats " | Doubles _ -> () end; match v with | Asciis s | Undefined s -> fprintf ppf "%S" s | Bytes is | SBytes is | Shorts is -> Format.array (fun ppf -> fprintf ppf "%d") ppf is | Longs is -> Format.array (fun ppf -> fprintf ppf "%Ld") ppf is | Rationals rs -> Format.array (fun ppf (i1,i2) -> fprintf ppf "%Ld/%Ld" i1 i2) ppf rs | SShorts is -> Format.array (fun ppf -> fprintf ppf "%d") ppf is | SLongs is -> Format.array (fun ppf -> fprintf ppf "%ld") ppf is | SRationals rs -> Format.array (fun ppf (i1,i2) -> fprintf ppf "%ld/%ld" i1 i2) ppf rs | Floats fs | Doubles fs -> Format.array (fun ppf -> fprintf ppf "%.20g") ppf fs end external unref : t -> unit = "caml_exif_entry_unref" module Decoded = struct type t = { tag : int; format : Pack.format; components : int; (* hope it will not overflow *) data : string; } end external decode : t -> Decoded.t = "caml_exif_decode_entry" type unpacked_entry = Tag.t * Pack.unpacked let unpack : Decoded.t -> unpacked_entry = fun d -> d.Decoded.tag, Pack.unpack d.Decoded.format d.Decoded.components d.Decoded.data let format_unpacked_entry ifd ppf (tag, p) = Format.fprintf ppf "%s(%x): %a" (Tag.to_string tag ifd) tag Pack.format p let format ifd ppf t = format_unpacked_entry ifd ppf (unpack (decode t)) end module Content = struct type t external unref : t -> unit = "caml_exif_content_unref" external entries : t -> Entry.t list = "caml_exif_content_entries" let entries t = let es = entries t in let finalise v = Gc.finalise (fun v -> Entry.unref v) v in List.iter finalise es; es let format ifd ppf t = let ents = entries t in Format.fprintf ppf "@[[ @[%a@] ]@]" (Format.list ";@ " (Entry.format ifd)) ents end module Data = struct type t external from_string : string -> t = "caml_val_exif_data" external unref : t -> unit = "caml_exif_data_unref" external get_byte_order : t -> Endian.t = "caml_exif_get_byte_order" external set_byte_order : t -> Endian.t -> unit = "caml_exif_set_byte_order" external fix : t -> unit = "caml_exif_data_fix" external dump : t -> unit = "caml_exif_data_dump" let from_string data = let t = from_string data in set_byte_order t Endian.sys ; (* Destructively fix the endianess *) Gc.finalise (fun v -> unref v) t; t type contents = { ifd_0 : Content.t option; ifd_1 : Content.t option; exif : Content.t option; gps : Content.t option; interop : Content.t option } external contents : t -> contents = "caml_exif_data_contents" let contents t = let cs = contents t in let finalise = function | None -> () | Some v -> Gc.finalise (fun v -> Content.unref v) v in finalise cs.ifd_0; finalise cs.ifd_1; finalise cs.exif; finalise cs.gps; finalise cs.interop; cs let get_ifd_0 t = (contents t).ifd_0 let get_ifd_1 t = (contents t).ifd_1 let get_exif t = (contents t).exif let get_gps t = (contents t).gps let get_interop t = (contents t).interop let unpack_gen f t = match f t with | None -> None | Some content -> Some (List.map (fun x -> Entry.unpack (Entry.decode x)) (Content.entries content)) let unpack_ifd_0 = unpack_gen get_ifd_0 let unpack_ifd_1 = unpack_gen get_ifd_1 let unpack_exif = unpack_gen get_exif let unpack_gps = unpack_gen get_gps let unpack_interop = unpack_gen get_interop open Format let format ppf t = let conts = contents t in fprintf ppf "{ @[ifd_0=%a;@ ifd_1=%a;@ exif=%a;@ gps=%a;@ inter=%a@] }" (Format.opt (Content.format IFD.IFD_0) ) conts.ifd_0 (Format.opt (Content.format IFD.IFD_1) ) conts.ifd_1 (Format.opt (Content.format IFD.EXIF) ) conts.exif (Format.opt (Content.format IFD.GPS) ) conts.gps (Format.opt (Content.format IFD.Interop)) conts.interop end module Analyze = struct (* Exif data analyzer Due to its updated-on-demand and lots-of-tags nature, This module is implemented in a separate file from exif.ml and its interface file is auto created. *) open Numbers open Entry.Pack type datetime = [ `EncodedInUnixTime of DateTime.t | `Error of string | `Ok of DateTime.t ] (** I have some photos from my old Android with non Ascii datetime. They have encoded 32 bit int in Unix time instead! :-( *) let parse_datetime s = match DateTime.of_string s with | (`Ok _ as r) -> r | `Error s -> match DateTime.of_string_packed_unix_time s with | `Ok v -> `EncodedInUnixTime v | (`Error _ as e) -> e let analyze_ifd (tag, pack) = match tag, pack with | 0x10f, Asciis s -> `Make s | 0x110, Asciis s -> `Model s | 0x112, Shorts [| 1 |] -> `Orientation `TopLeft | 0x112, Shorts [| 2 |] -> `Orientation `TopRight | 0x112, Shorts [| 3 |] -> `Orientation `BottomRight | 0x112, Shorts [| 4 |] -> `Orientation `BottomLeft | 0x112, Shorts [| 5 |] -> `Orientation `LeftTop | 0x112, Shorts [| 6 |] -> `Orientation `RightTop | 0x112, Shorts [| 7 |] -> `Orientation `RightBottom | 0x112, Shorts [| 8 |] -> `Orientation `LeftBottom | 0x11a, Rationals [| r |] -> `XResolution r | 0x11b, Rationals [| r |] -> `YResolution r | 0x128, Shorts [| 2 |] -> `ResolutionUnit `Inches | 0x128, Shorts [| 3 |] -> `ResolutionUnit `Centimeters | 0x131, s -> `Software s | 0x132, Asciis s -> `DateTime (parse_datetime s) | _ -> `Unknown (tag, pack) let analyze_exif (tag, pack) = match tag, pack with | 0x9000, Undefined s -> `ExifVersion s | 0x927c, Undefined s -> `MakerNote s | 0x9286, Undefined s -> `UserComment s (* The first 8 bytes indicate char code: ASCII 41.H, 53.H, 43.H, 49.H, 49.H, 00.H, 00.H, 00.H JIS 4A.H, 49.H, 53.H, 00.H, 00.H, 00.H, 00.H, 00.H JIS X0208-1990 Unicode 55.H, 4E.H, 49.H, 43.H, 4F.H, 44.H, 45.H, 00.H Unicode Standard Undefined 00.H, 00.H, 00.H, 00.H, 00.H, 00.H, 00.H, 00.H *) | 0x9003, Asciis s -> `DateTimeOriginal (parse_datetime s) | 0x9004, Asciis s -> `DateTimeDigitized (parse_datetime s) | 0x9290, Asciis s -> `SubsecTime s | 0x9291, Asciis s -> `SubsecTimeOriginal s | 0x9292, Asciis s -> `SubsecTimeDigitized s | _ -> `Unknown (tag, pack) (* CR jfuruse: unused module GPS = struct type latitude = [ `North | `South ] * rational type longitude = [ `East | `West ] * rational type altitude = [ `AboveSeaLevel | `BelowSeaLevel ] * rational type time_stamp_utc = { hour : rational; min : rational; sec : rational; } type direction = [ `True | `Magnetic ] * rational type map_datum = string type t = { version : (int * int * int * int) option; latitude : latitude option; longitude : longitude option; altitude : altitude option; time_stamp_utc : time_stamp_utc option; direction : direction option; map_datum : map_datum option } end *) let analyze_gps (tag, v) = match tag, v with | 00, Bytes [|x;y;z;w|] -> `GPSVersion (x,y,z,w) | 01, Asciis "N" -> `NorthLatitude | 01, Asciis "S" -> `SouthLatitude | 02, Rationals [|r|] -> `Latitude r | 03, Asciis "E" -> `EastLongitude | 03, Asciis "W" -> `WestLongitude | 04, Rationals [|r|] -> `Longitude r | 05, Bytes [|0|] -> `AboveSeaLevel | 05, Bytes [|1|] -> `BelowSeaLevel | 06, Rationals [|r|] -> `Altitude r | 07, Rationals [|h;m;s|] -> `TimeStampUTC (float_of_rational h, float_of_rational m, float_of_rational s) | 07, SRationals [|h;m;s|] -> (* It is illegal in the spec but I see some photos with SRationals *) `TimeStampUTCinSRationals (float_of_srational h, float_of_srational m, float_of_srational s) | 16, Asciis "T" -> `ImgDirectionTrue | 16, Asciis "M" -> `ImgDirectionMagnetic | 17, Rationals [|r|] -> `ImgDirection r | 18, Asciis s -> `GPSMapDatum s | 29, Asciis s -> `GPSDate (Date.of_string s) | _ -> `Unknown (tag, v) let exif_datetime t = match Data.unpack_exif t with | Some entries -> List.find_map_opt (function | `DateTimeOriginal t -> Some t | _ -> None) (List.map analyze_exif entries) | None -> None let ifd_0_datetime t = match Data.unpack_ifd_0 t with | Some entries -> List.find_map_opt (function | `DateTime t -> Some t | _ -> None) (List.map analyze_ifd entries) | None -> None let datetime t = match exif_datetime t with | (Some _ as res) -> res | None -> ifd_0_datetime t end camlspotter-camlimages-e471b3c4470d/src/exif.mli0000644000000000000000000001502712405272062017624 0ustar 00000000000000module Numbers : sig type rational = int64 * int64 (** unsigned 32bits int rational *) type srational = int32 * int32 (** signed 32bits int rational *) val float_of_rational : int64 * int64 -> float val float_of_srational : int32 * int32 -> float val string_of_rational : int64 -> int64 -> string val string_of_srational : int32 -> int32 -> string end module Endian : sig type t = Big | Little val to_string : t -> string val sys : t end module IFD : sig type t = | IFD_0 (** Info of the main image *) | IFD_1 (** Info of the thumbnail *) | EXIF (** camera info *) | GPS (** location *) | Interop (** exif format interoperability info *) end module Date : sig (** Date for GPSDateStamp *) type t = { year : int; month : int; day : int; } val to_string : t -> string val of_string : string -> [> `Error of string | `Ok of t ] end module DateTime : sig type t = { year : int; month : int; day : int; hour : int; min : int; sec : int; } val to_string : t -> string val of_string : string -> [> `Error of string | `Ok of t ] (** To convert DateTime string to DateTime.t. *) val of_string_packed_unix_time : string -> [> `Error of string | `Ok of t ] (** I had an Android phone which created DateTime tag with a little endian encoded unsigned int32 of unix time! This function tries to fix the issue. *) end module Tag : sig type t = int val to_string : t -> IFD.t -> string (** Tag name requires IFD.t since the same tag number has different meaning in IFD and GPS *) end module Entry : sig type t module Pack : sig type format = | ILLEGAL (** do not used it *) | BYTE | ASCII | SHORT | LONG | RATIONAL | SBYTE | UNDEFINED | SSHORT | SLONG | SRATIONAL | FLOAT | DOUBLE val string_of_format : format -> string type unpacked = | Bytes of int array | Asciis of string | Shorts of int array | Longs of int64 array | Rationals of (int64 * int64) array | SBytes of int array | Undefined of string | SShorts of int array | SLongs of int32 array | SRationals of (int32 * int32) array | Floats of float array | Doubles of float array (** Constructors start with "S" are signed. *) val unpack : format -> int -> string -> unpacked (** [unpack format components packed] [components] are the number of elements in [packed], not the bytes of [packed]. *) val format : Format.formatter -> unpacked -> unit end module Decoded : sig type t = { tag : int; format : Pack.format; components : int; data : string; } end val decode : t -> Decoded.t type unpacked_entry = Tag.t * Pack.unpacked val unpack : Decoded.t -> unpacked_entry val format_unpacked_entry : IFD.t -> Exifutil.Format.formatter -> Tag.t * Pack.unpacked -> unit val format : IFD.t -> Exifutil.Format.formatter -> t -> unit (** [format] does decode + unpack *) end module Content : sig type t val entries : t -> Entry.t list val format : IFD.t -> Exifutil.Format.formatter -> t -> unit end module Data : sig type t val get_byte_order : t -> Endian.t val set_byte_order : t -> Endian.t -> unit val fix : t -> unit val dump : t -> unit val from_string : string -> t val format : Exifutil.Format.formatter -> t -> unit type contents = { ifd_0 : Content.t option; ifd_1 : Content.t option; exif : Content.t option; gps : Content.t option; interop : Content.t option; } val contents : t -> contents val get_ifd_0 : t -> Content.t option val get_ifd_1 : t -> Content.t option val get_exif : t -> Content.t option val get_gps : t -> Content.t option val get_interop : t -> Content.t option val unpack_ifd_0 : t -> Entry.unpacked_entry list option val unpack_ifd_1 : t -> Entry.unpacked_entry list option val unpack_exif : t -> Entry.unpacked_entry list option val unpack_gps : t -> Entry.unpacked_entry list option val unpack_interop : t -> Entry.unpacked_entry list option end module Analyze : sig type datetime = [ `EncodedInUnixTime of DateTime.t | `Error of string | `Ok of DateTime.t ] (** I have some photos from my old Android with non Ascii datetime. They have encoded 32 bit int in Unix time instead! :-( *) val parse_datetime : string -> [> datetime ] val analyze_ifd : int * Entry.Pack.unpacked -> [> `DateTime of [> datetime ] | `Make of string | `Model of string | `Orientation of [> `BottomLeft | `BottomRight | `LeftBottom | `LeftTop | `RightBottom | `RightTop | `TopLeft | `TopRight ] | `ResolutionUnit of [> `Centimeters | `Inches ] | `Software of Entry.Pack.unpacked | `Unknown of int * Entry.Pack.unpacked | `XResolution of int64 * int64 | `YResolution of int64 * int64 ] val analyze_exif : int * Entry.Pack.unpacked -> [> `DateTimeDigitized of [> datetime ] | `DateTimeOriginal of [> datetime ] | `ExifVersion of string | `MakerNote of string | `SubsecTime of string | `SubsecTimeDigitized of string | `SubsecTimeOriginal of string | `Unknown of int * Entry.Pack.unpacked | `UserComment of string ] val analyze_gps : int * Entry.Pack.unpacked -> [> `AboveSeaLevel | `Altitude of int64 * int64 | `BelowSeaLevel | `EastLongitude | `GPSDate of [> `Error of string | `Ok of Date.t ] | `GPSMapDatum of string | `GPSVersion of int * int * int * int | `ImgDirection of int64 * int64 | `ImgDirectionMagnetic | `ImgDirectionTrue | `Latitude of int64 * int64 | `Longitude of int64 * int64 | `NorthLatitude | `SouthLatitude | `TimeStampUTC of float * float * float | `TimeStampUTCinSRationals of float * float * float | `Unknown of int * Entry.Pack.unpacked | `WestLongitude ] val ifd_0_datetime : Data.t -> [> datetime ] option (** Get ifd_0 DateTime *) val exif_datetime : Data.t -> [> datetime ] option (** Get exif DateTimeOriginal *) val datetime : Data.t -> [> datetime ] option (** Get one of the first finding of the followings: * exif DateTimeOriginal * ifd_0 DateTime *) end camlspotter-camlimages-e471b3c4470d/src/exif_c.c0000644000000000000000000001635512405272062017574 0ustar 00000000000000/***********************************************************************/ /* */ /* CamlImages */ /* */ /* Jun Furuse */ /* */ /* Copyright 1999-2013 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include value Val_ExifBytes(unsigned char *p, value vsize) { CAMLparam0(); CAMLlocal1(res); int i; res = alloc(Int_val(vsize),0); for(i=0; iifd[i]; if( p ){ exif_content_ref(p); tmp = alloc_small(1,0); Field(tmp,0) = (value)p; tmp2 = alloc_small(1,0); //fprintf(stderr, "content=%x (count=%d)\n", p, p->count); Field(tmp2,0) = tmp; Store_field(res,i,tmp2); } else { Store_field(res,i,Val_int(0)); } } CAMLreturn(res); } void caml_exif_content_unref(value vdata) { ExifContent *c = (ExifContent*)Field(vdata,0); exif_content_unref(c); } value caml_exif_content_entries(value vdata) { CAMLparam1(vdata); CAMLlocal3(res, tmp, tmp2); int i; ExifContent *c = (ExifContent *)Field(vdata,0); //fprintf(stderr, "content=%x (count=%d)\n", c, c->count); res = Val_int(0); // null for(i=c->count-1; i>=0; i--){ ExifEntry *e = c->entries[i]; if( e ){ exif_entry_ref(e); // boxing tmp = alloc_small(1,0); Field(tmp,0) = (value)e; // cons tmp2 = alloc_small(2,0); Field(tmp2,0) = tmp; Field(tmp2,1) = res; // rewire res = tmp2; } } CAMLreturn(res); } void caml_exif_entry_unref(value vdata) { ExifEntry *c = (ExifEntry*)Field(vdata,0); exif_entry_unref(c); } value caml_exif_decode_entry(value vdata) { CAMLparam1(vdata); CAMLlocal1(tpl); ExifEntry *p = (ExifEntry *)Field(vdata,0); tpl = alloc_tuple(4); Store_field(tpl,0,Val_int(p->tag)); Store_field(tpl,1,Val_int(p->format)); Store_field(tpl,2,Val_int(p->components)); // hope it never overflow... Store_field(tpl,3,alloc_string(p->size)); memcpy(String_val(Field(tpl,3)), p->data, p->size); CAMLreturn(tpl); } camlspotter-camlimages-e471b3c4470d/src/exif_na.c0000644000000000000000000000272312405272062017742 0ustar 00000000000000/***********************************************************************/ /* */ /* CamlImages */ /* */ /* Jun Furuse */ /* */ /* Copyright 1999-2013 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #include #include #include #include #define NA(x) value x(){ failwith("unsupported"); } NA(Val_ExifBytes) NA(Val_ExifSBytes) NA(Val_ExifShorts) NA(Val_ExifSShorts) NA(Val_ExifLongs) NA(Val_ExifSLongs) NA(Val_ExifRationals) NA(Val_ExifSRationals) NA(Val_ExifFloats) NA(Val_ExifDoubles) NA(caml_exif_tag_get_name_in_ifd) NA(caml_val_exif_data) NA(caml_exif_set_byte_order) NA(caml_exif_get_byte_order) NA(caml_exif_data_fix) NA(caml_exif_data_unref) NA(caml_exif_data_dump) NA(caml_exif_data_contents) NA(caml_exif_content_unref) NA(caml_exif_content_entries) NA(caml_exif_entry_unref) NA(caml_exif_decode_entry) camlspotter-camlimages-e471b3c4470d/src/exifanalyze.ml0000644000000000000000000001101512405272062021030 0ustar 00000000000000(* Exif data analyzer Due to its updated-on-demand and lots-of-tags nature, This module is implemented in a separate file from exif.ml and its interface file is auto created. *) open Exifutil open Exif open Exif.Numbers open Exif.Entry.Pack (* I have some photos from my old Android with non Ascii datetime. They have encoded 32 bit int in Unix time instead! :-( *) let analyze_datetime s = match DateTime.of_string s with | (`Ok _ as r) -> r | `Error s -> match DateTime.of_string_packed_unix_time s with | `Ok v -> `EncodedInUnixTime v | (`Error _ as e) -> e let analyze_ifd (tag, pack) = match tag, pack with | 0x10f, Asciis s -> `Make s | 0x110, Asciis s -> `Model s | 0x112, Shorts [| 1 |] -> `Orientation `TopLeft | 0x112, Shorts [| 2 |] -> `Orientation `TopRight | 0x112, Shorts [| 3 |] -> `Orientation `BottomRight | 0x112, Shorts [| 4 |] -> `Orientation `BottomLeft | 0x112, Shorts [| 5 |] -> `Orientation `LeftTop | 0x112, Shorts [| 6 |] -> `Orientation `RightTop | 0x112, Shorts [| 7 |] -> `Orientation `RightBottom | 0x112, Shorts [| 8 |] -> `Orientation `LeftBottom | 0x11a, Rationals [| r |] -> `XResolution r | 0x11b, Rationals [| r |] -> `YResolution r | 0x128, Shorts [| 2 |] -> `ResolutionUnit `Inches | 0x128, Shorts [| 3 |] -> `ResolutionUnit `Centimeters | 0x131, s -> `Software s | 0x132, Asciis s -> `DateTime (analyze_datetime s) | _ -> `Unknown (tag, pack) let analyze_exif (tag, pack) = match tag, pack with | 0x9000, Undefined s -> `ExifVersion s | 0x927c, Undefined s -> `MakerNote s | 0x9286, Undefined s -> `UserComment s (* The first 8 bytes indicate char code: ASCII 41.H, 53.H, 43.H, 49.H, 49.H, 00.H, 00.H, 00.H JIS 4A.H, 49.H, 53.H, 00.H, 00.H, 00.H, 00.H, 00.H JIS X0208-1990 Unicode 55.H, 4E.H, 49.H, 43.H, 4F.H, 44.H, 45.H, 00.H Unicode Standard Undefined 00.H, 00.H, 00.H, 00.H, 00.H, 00.H, 00.H, 00.H *) | 0x9003, Asciis s -> `DateTimeOriginal (analyze_datetime s) | 0x9004, Asciis s -> `DateTimeDigitized (analyze_datetime s) | 0x9290, Asciis s -> `SubsecTime s | 0x9291, Asciis s -> `SubsecTimeOriginal s | 0x9292, Asciis s -> `SubsecTimeDigitized s | _ -> `Unknown (tag, pack) module GPS = struct type latitude = [ `North | `South ] * rational type longitude = [ `East | `West ] * rational type altitude = [ `AboveSeaLevel | `BelowSeaLevel ] * rational type time_stamp_utc = { hour : rational; min : rational; sec : rational; } type direction = [ `True | `Magnetic ] * rational type map_datum = string type t = { version : (int * int * int * int) option; latitude : latitude option; longitude : longitude option; altitude : altitude option; time_stamp_utc : time_stamp_utc option; direction : direction option; map_datum : map_datum option } end let analyze_gps (tag, v) = match tag, v with | 00, Bytes [|x;y;z;w|] -> `GPSVersion (x,y,z,w) | 01, Asciis "N" -> `NorthLatitude | 01, Asciis "S" -> `SouthLatitude | 02, Rationals [|r|] -> `Latitude r | 03, Asciis "E" -> `EastLongitude | 03, Asciis "W" -> `WestLongitude | 04, Rationals [|r|] -> `Longitude r | 05, Bytes [|0|] -> `AboveSeaLevel | 05, Bytes [|1|] -> `BelowSeaLevel | 06, Rationals [|r|] -> `Altitude r | 07, Rationals [|h;m;s|] -> `TimeStampUTC (float_of_rational h, float_of_rational m, float_of_rational s) | 07, SRationals [|h;m;s|] -> (* It is illegal in the spec but I see some photos with SRationals *) `TimeStampUTCinSRationals (float_of_srational h, float_of_srational m, float_of_srational s) | 16, Asciis "T" -> `ImgDirectionTrue | 16, Asciis "M" -> `ImgDirectionMagnetic | 17, Rationals [|r|] -> `ImgDirection r | 18, Asciis s -> `GPSMapDatum s | 29, Asciis s -> `GPSDate (Date.of_string s) | _ -> `Unknown (tag, v) let exif_datetime t = match Data.unpack_exif t with | Some entries -> List.find_map_opt (function | `DateTimeOriginal t -> Some t | _ -> None) (List.map analyze_exif entries) | None -> None let ifd_0_datetime t = match Data.unpack_ifd_0 t with | Some entries -> List.find_map_opt (function | `DateTime t -> Some t | _ -> None) (List.map analyze_ifd entries) | None -> None let datetime t = match exif_datetime t with | (Some _ as res) -> res | None -> ifd_0_datetime t camlspotter-camlimages-e471b3c4470d/src/exifutil.ml0000644000000000000000000000154712405272062020353 0ustar 00000000000000module Format = struct include Format let array f ppf a = let len = Array.length a in fprintf ppf "@[[| @["; Array.iteri (fun i v -> f ppf v; if i < len - 1 then fprintf ppf ";@ ") a; fprintf ppf "@] |]@]" let rec list (sep : (unit, formatter, unit) format) f ppf = function | [] -> () | [x] -> f ppf x | x::xs -> fprintf ppf "@[%a@]%t%a" f x (fun ppf -> fprintf ppf sep) (list sep f) xs let opt f ppf = function | None -> fprintf ppf "None" | Some v -> f ppf v let option f ppf = function | None -> fprintf ppf "None" | Some v -> fprintf ppf "Some (%a)" f v end module List = struct include List let rec find_map_opt f = function | [] -> None | x::xs -> match f x with | Some v -> Some v | None -> find_map_opt f xs end camlspotter-camlimages-e471b3c4470d/src/freetype.ml0000644000000000000000000001422312405272062020340 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: freetype.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $*) type ('a, 'b) refbox = { cont : 'a; ref : 'b ref; };; type t = (Ftlow.library, unit) refbox;; let init () = let t = {cont = Ftlow.init (); ref = ref ()} in Gc.finalise (fun v -> Ftlow.close v.cont) t; t;; type face = (Ftlow.face, t) refbox;; type face_info = Ftlow.face_info = { num_faces : int; num_glyphs : int; family_name : string; style_name : string; has_horizontal : bool; has_vertical : bool; has_kerning : bool; is_scalable : bool; is_sfnt : bool; is_fixed_width : bool; has_fixed_sizes : bool; has_fast_glyphs : bool; has_glyph_names : bool; has_multiple_masters : bool; };; let done_face face = Ftlow.done_face face.cont;; let new_face t font idx = let face = {cont = Ftlow.new_face t.cont font idx; ref = ref t} in let info = Ftlow.face_info face.cont in Gc.finalise done_face face; face, info;; let get_num_glyphs face = Ftlow.get_num_glyphs face.cont;; let float_of_intfrac dotbits i = let d = float (1 lsl dotbits) in float i /. d;; let intfrac_of_float dotbits f = let d = float (1 lsl dotbits) in truncate (f *. d);; let intfrac6_of_float = intfrac_of_float 6;; let float_of_intfrac6 = float_of_intfrac 6;; let intfrac16_of_float = intfrac_of_float 16;; let float_of_intfrac16 = float_of_intfrac 16;; let vector_float_of_intfrac6 (x, y) = float_of_intfrac6 x, float_of_intfrac6 y;; let set_char_size face char_w char_h res_h res_v = Ftlow.set_char_size face.cont (intfrac6_of_float char_w) (intfrac6_of_float char_h) res_h res_v;; let set_pixel_sizes face pixel_w pixel_h = Ftlow.set_pixel_sizes face.cont pixel_w pixel_h;; type charmap = Ftlow.charmap = { platform_id : int; encoding_id : int; };; type char_index = int;; (* abstracted *) let int_of_char_index = fun x -> x;; let char_index_of_int = fun x -> x;; let get_charmaps face = Ftlow.get_charmaps face.cont;; let set_charmap face charmap = Ftlow.set_charmap face.cont charmap;; let get_char_index face code = Ftlow.get_char_index face.cont code;; type render_mode = Ftlow.render_mode = | Render_Normal | Render_Mono;; type load_flag = Ftlow.load_flag = | Load_no_scale | Load_no_hinting;; let load_glyph face index flags = vector_float_of_intfrac6 (Ftlow.load_glyph face.cont index flags);; let load_char face code flags = vector_float_of_intfrac6 (Ftlow.load_char face.cont code flags);; let render_glyph_of_face face render_mode = Ftlow.render_glyph_of_face face.cont render_mode;; let render_glyph face index flags render_mode = vector_float_of_intfrac6 (Ftlow.render_glyph face.cont index flags render_mode);; let render_char face code flags render_mode = vector_float_of_intfrac6 (Ftlow.render_char face.cont code flags render_mode);; type matrix = { ft_xx : float; ft_xy : float; ft_yx : float; ft_yy : float; };; type vector = { ft_x : float; ft_y : float; };; let set_transform face mat vec = Ftlow.set_transform face.cont (intfrac16_of_float mat.ft_xx, intfrac16_of_float mat.ft_xy, intfrac16_of_float mat.ft_yx, intfrac16_of_float mat.ft_yy) (intfrac6_of_float vec.ft_x, intfrac6_of_float vec.ft_y);; let matrix_rotate r = let c = cos r and s = sin r in {ft_xx = c; ft_xy = -.s; ft_yx = s; ft_yy = c};; type bitmap_info = Ftlow.bitmap_info = { bitmap_left : int; bitmap_top : int; bitmap_width : int; bitmap_height : int; };; let get_bitmap_info face = Ftlow.get_bitmap_info face.cont;; let read_bitmap face x y = Ftlow.read_bitmap face.cont x y;; (* glyph metrics *) type bbox = { xmin : float; ymin : float; xmax : float; ymax : float; };; type bearing_advance = { bearingx : float; bearingy : float; advance : float; };; type glyph_metrics = { gm_width : float; gm_height : float; gm_hori : bearing_advance; gm_vert : bearing_advance; };; let get_glyph_metrics face = let bearing_advance_float_of_intfrac6 ba = { bearingx = float_of_intfrac6 ba.Ftlow.bearingx; bearingy = float_of_intfrac6 ba.Ftlow.bearingy; advance = float_of_intfrac6 ba.Ftlow.advance; } in let gm = Ftlow.get_glyph_metrics face.cont in { gm_width = float_of_intfrac6 gm.Ftlow.gm_width; gm_height = float_of_intfrac6 gm.Ftlow.gm_height; gm_hori = bearing_advance_float_of_intfrac6 gm.Ftlow.gm_hori; gm_vert = bearing_advance_float_of_intfrac6 gm.Ftlow.gm_vert; };; (* size metrics *) type size_metrics = { x_ppem : int; y_ppem : int; x_scale : float; y_scale : float; };; let get_size_metrics face = let low = Ftlow.get_size_metrics face.cont in { x_ppem = low.Ftlow.x_ppem; y_ppem = low.Ftlow.y_ppem; x_scale = float_of_intfrac16 low.Ftlow.x_scale; y_scale = float_of_intfrac16 low.Ftlow.y_scale; };; (* outline info *) type outline_tag = Ftlow.outline_tag = | On_point | Off_point_conic | Off_point_cubic;; type outline_contents = { n_contours : int; n_points : int; points : (float * float) array; tags : outline_tag array; contours : int array; };; let get_outline_contents face = let oc = Ftlow.get_outline_contents face.cont in { n_contours = oc.Ftlow.n_contours; n_points = oc.Ftlow.n_points; points = Array.map (fun (x, y) -> float_of_intfrac6 x, float_of_intfrac6 y) oc.Ftlow.points; tags = oc.Ftlow.tags; contours = oc.Ftlow.contours; };; camlspotter-camlimages-e471b3c4470d/src/freetype.mli0000644000000000000000000001067612405272062020521 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: freetype.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) type t;; (** type for Freetype library *) val init : unit -> t;; (** [init ()] initializes the Freetype library. The returned library is required to load fonts. *) type face;; (** Type for face *) type face_info = { num_faces : int; num_glyphs : int; family_name : string; style_name : string; has_horizontal : bool; has_vertical : bool; has_kerning : bool; is_scalable : bool; is_sfnt : bool; is_fixed_width : bool; has_fixed_sizes : bool; has_fast_glyphs : bool; has_glyph_names : bool; has_multiple_masters : bool; };; val new_face : t -> string -> int -> face * face_info;; (** [new_face library fontfile n] loads [n]-th font stored in the font file [fontfile], and returns its face and face information. *) val get_num_glyphs : face -> int;; (** Returns number of glyphs stored in the face. Equivalent to face_info.num_glyphs *) val set_char_size : face -> float -> float -> int -> int -> unit;; (** [set_char_size face charw charh resh resv] sets the character size of [face]. [charw] and [charh] are the points of the characters in width and height. [resh] and [resv] are the horizontal and vertical resolution (in dpi) *) val set_pixel_sizes : face -> int -> int -> unit;; (** [set_pixel_sizes face pixw pixh] also sets the character size of [face]. [pixw] and [pixh] are standard width and height of characters in pixels. *) type charmap = { platform_id: int; encoding_id: int; };; type char_index;; val int_of_char_index : char_index -> int;; val char_index_of_int : int -> char_index;; val get_charmaps : face -> charmap list;; val set_charmap : face -> charmap -> unit;; val get_char_index : face -> int -> char_index;; type render_mode = Render_Normal | Render_Mono;; type load_flag = Load_no_scale | Load_no_hinting;; (** if you give [], freetype loads glyphs with scaling and hinting *) val load_glyph : face -> char_index -> load_flag list -> float * float;; val load_char : face -> int -> load_flag list -> float * float;; val render_glyph_of_face : face -> render_mode -> unit;; val render_glyph : face -> char_index -> load_flag list -> render_mode -> float * float;; val render_char : face -> int -> load_flag list -> render_mode -> float * float;; (** matrix and vector *) type matrix = { ft_xx : float; ft_xy : float; ft_yx : float; ft_yy : float; };; type vector = { ft_x : float; ft_y : float; };; val set_transform : face -> matrix -> vector -> unit;; val matrix_rotate : float -> matrix;; (** bitmap ops *) type bitmap_info = { bitmap_left : int; bitmap_top : int; bitmap_width : int; bitmap_height : int; };; val get_bitmap_info : face -> bitmap_info;; val read_bitmap : face -> int -> int -> int;; (** glyph metrics *) type bbox = { xmin: float; ymin: float; xmax: float; ymax: float; };; type bearing_advance = { bearingx: float; bearingy: float; advance: float; };; type glyph_metrics = { gm_width: float; gm_height: float; gm_hori: bearing_advance; gm_vert: bearing_advance; };; val get_glyph_metrics : face -> glyph_metrics;; (** size metrics *) type size_metrics = { x_ppem: int; y_ppem: int; x_scale: float; y_scale: float; };; val get_size_metrics : face -> size_metrics;; (** outline info *) type outline_tag = On_point | Off_point_conic | Off_point_cubic;; type outline_contents = { n_contours : int; n_points : int; points : (float * float) array; tags : outline_tag array; contours : int array; };; val get_outline_contents : face -> outline_contents;; camlspotter-camlimages-e471b3c4470d/src/ftintf.c0000644000000000000000000003036512405272062017626 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include FT_FREETYPE_H value init_FreeType() { CAMLparam0(); FT_Library *library; if( (library = stat_alloc( sizeof(FT_Library) )) == NULL ){ failwith( "init_FreeType: Memory over" ); } if( FT_Init_FreeType( library ) ){ failwith( "FT_Init_FreeType" ); } CAMLreturn( (value) library ); } value done_FreeType( library ) value library; { CAMLparam1(library); if ( FT_Done_FreeType( *(FT_Library *)library ) ){ failwith( "FT_Done_FreeType" ); } stat_free( (void *) library ); CAMLreturn(Val_unit); } #include value new_Face( library, fontpath, idx ) value library; value fontpath; value idx; { CAMLparam3(library, fontpath, idx ); FT_Face *face; if( (face = stat_alloc( sizeof(FT_Face) )) == NULL ){ failwith( "new_Face: Memory over" ); } if( FT_New_Face( *(FT_Library *)library, String_val( fontpath ), Int_val( idx ), face ) ){ failwith( "new_Face: Could not open face" ); } CAMLreturn( (value) face ); } value face_info( facev ) value facev; { CAMLparam1(facev); CAMLlocal1(res); FT_Face face = *(FT_Face *)facev; res = alloc_tuple(14); Store_field(res, 0, Val_int( face->num_faces )); Store_field(res, 1, Val_int( face->num_glyphs )); Store_field(res, 2, copy_string( face->family_name == NULL ? "" : face->family_name )); Store_field(res, 3, copy_string( face->style_name == NULL ? "" : face->style_name )); Store_field(res, 4, Val_bool( FT_HAS_HORIZONTAL( face ) )); Store_field(res, 5, Val_bool( FT_HAS_VERTICAL( face ) )); Store_field(res, 6, Val_bool( FT_HAS_KERNING( face ) )); Store_field(res, 7, Val_bool( FT_IS_SCALABLE( face ) )); Store_field(res, 8, Val_bool( FT_IS_SFNT( face ) )); Store_field(res, 9, Val_bool( FT_IS_FIXED_WIDTH( face ) )); Store_field(res,10, Val_bool( FT_HAS_FIXED_SIZES( face ) )); Store_field(res,11, Val_bool( FT_HAS_FAST_GLYPHS( face ) )); Store_field(res,12, Val_bool( FT_HAS_GLYPH_NAMES( face ) )); Store_field(res,13, Val_bool( FT_HAS_MULTIPLE_MASTERS( face ) )); CAMLreturn(res); } value done_Face( face ) value face; { CAMLparam1(face); if ( FT_Done_Face( *(FT_Face *) face ) ){ failwith("FT_Done_Face"); } CAMLreturn( Val_unit ); } value get_num_glyphs( face ) value face; { CAMLparam1(face); CAMLreturn( Val_int ((*(FT_Face *) face)->num_glyphs) ); } value set_Char_Size( face, char_w, char_h, res_h, res_v ) value face; value char_w, char_h; /* 26.6 1 = 1/64pt */ value res_h, res_v; /* dpi */ { CAMLparam5( face, char_w, char_h, res_h, res_v ); if ( FT_Set_Char_Size( *(FT_Face *) face, Int_val(char_w), Int_val(char_h), Int_val(res_h), Int_val(res_v) ) ){ failwith("FT_Set_Char_Size"); } CAMLreturn(Val_unit); } /* to be done: query at face->fixed_sizes */ value set_Pixel_Sizes( face, pixel_w, pixel_h ) value face; value pixel_w, pixel_h; /* dot */ { CAMLparam3(face,pixel_w,pixel_h); if ( FT_Set_Pixel_Sizes( *(FT_Face *) face, Int_val(pixel_w), Int_val(pixel_h) ) ){ failwith("FT_Set_Pixel_Sizes"); } CAMLreturn(Val_unit); } value val_CharMap( charmapp ) FT_CharMap *charmapp; { CAMLparam0(); CAMLlocal1(res); res = alloc_tuple(2); Store_field(res,0, Val_int((*charmapp)->platform_id)); Store_field(res,1, Val_int((*charmapp)->encoding_id)); CAMLreturn(res); } value get_CharMaps( facev ) value facev; { CAMLparam1(facev); CAMLlocal3(list,last_cell,new_cell); int i = 0; FT_Face face; face = *(FT_Face *) facev; list = last_cell = Val_unit; while( i < face->num_charmaps ){ new_cell = alloc_tuple(2); Store_field(new_cell,0, val_CharMap( face->charmaps + i )); Store_field(new_cell,1, Val_unit); if( i == 0 ){ list = new_cell; } else { Store_field(last_cell,1, new_cell); } last_cell = new_cell; i++; } CAMLreturn(list); } value set_CharMap( facev, charmapv ) value facev; value charmapv; { CAMLparam2(facev,charmapv); int i = 0; FT_Face face; FT_CharMap charmap; int my_pid, my_eid; face = *(FT_Face *) facev; my_pid = Int_val(Field(charmapv, 0)); my_eid = Int_val(Field(charmapv, 1)); while( i < face->num_charmaps ){ charmap = face->charmaps[i]; if ( charmap->platform_id == my_pid && charmap->encoding_id == my_eid ){ if ( FT_Set_Charmap( face, charmap ) ){ failwith("FT_Set_Charmap"); } CAMLreturn(Val_unit); } else { i++; } } failwith("freetype:set_charmaps: selected pid+eid do not exist"); } value get_Char_Index( face, code ) value face, code; { CAMLparam2(face,code); CAMLreturn(Val_int(FT_Get_Char_Index( *(FT_Face *)face, Int_val(code)))); } value load_Glyph( face, index, flags ) value face, index, flags; { CAMLparam3(face,index,flags); CAMLlocal1(res); if( FT_Load_Glyph( *(FT_Face *) face, Int_val(index), FT_LOAD_DEFAULT | Int_val(flags)) ){ failwith("FT_Load_Glyph"); } res = alloc_tuple(2); Store_field(res,0, Val_int( (*(FT_Face*)face)->glyph->advance.x )); Store_field(res,1, Val_int( (*(FT_Face*)face)->glyph->advance.y )); CAMLreturn(res); } value load_Char( face, code, flags ) value face, code, flags; { CAMLparam3(face,code,flags); CAMLlocal1(res); /* FT_Load_Glyph(face, FT_Get_Char_Index( face, code )) */ if( FT_Load_Char( *(FT_Face *) face, Int_val(code), FT_LOAD_DEFAULT | Int_val(flags)) ){ failwith("FT_Load_Char"); } res = alloc_tuple(2); Store_field(res,0, Val_int( (*(FT_Face*)face)->glyph->advance.x )); Store_field(res,1, Val_int( (*(FT_Face*)face)->glyph->advance.y )); CAMLreturn(res); } value render_Glyph_of_Face( face, mode ) value face; value mode; { CAMLparam2(face,mode); if (FT_Render_Glyph( (*(FT_Face *)face)->glyph , Int_val(mode) )){ failwith("FT_Render_Glyph"); } CAMLreturn(Val_unit); } value render_Char( face, code, flags, mode ) value face, code, flags, mode; { CAMLparam4(face,code,flags,mode); CAMLlocal1(res); /* FT_Load_Glyph(face, FT_Get_Char_Index( face, code ), FT_LOAD_RENDER) */ if( FT_Load_Char( *(FT_Face *) face, Int_val(code), FT_LOAD_RENDER | Int_val(flags) | (Int_val(mode) ? FT_LOAD_MONOCHROME : 0)) ){ failwith("FT_Load_Char"); } res = alloc_tuple(2); Store_field(res,0, Val_int( (*(FT_Face*)face)->glyph->advance.x )); Store_field(res,1, Val_int( (*(FT_Face*)face)->glyph->advance.y )); CAMLreturn(res); } value set_Transform( face, vmatrix, vpen ) value face, vmatrix, vpen; { CAMLparam3(face, vmatrix, vpen); FT_Matrix matrix; FT_Vector pen; matrix.xx = (FT_Fixed)( Int_val(Field(vmatrix,0)) ); matrix.xy = (FT_Fixed)( Int_val(Field(vmatrix,1)) ); matrix.yx = (FT_Fixed)( Int_val(Field(vmatrix,2)) ); matrix.yy = (FT_Fixed)( Int_val(Field(vmatrix,3)) ); pen.x = (FT_Fixed)( Int_val(Field(vpen,0)) ); pen.y = (FT_Fixed)( Int_val(Field(vpen,1)) ); FT_Set_Transform( *(FT_Face *)face, &matrix, &pen ); CAMLreturn(Val_unit); } value get_Bitmap_Info( vface ) value vface; { CAMLparam1(vface); CAMLlocal1(res); FT_GlyphSlot glyph = (*(FT_Face *)vface)->glyph; FT_Bitmap bitmap = glyph->bitmap; switch ( bitmap.pixel_mode ) { case ft_pixel_mode_grays: if ( bitmap.num_grays != 256 ){ failwith("get_Bitmap_Info: unknown num_grays"); } break; case ft_pixel_mode_mono: break; default: failwith("get_Bitmap_Info: unknown pixel mode"); } res = alloc_tuple(5); Store_field(res,0, Val_int(glyph->bitmap_left)); Store_field(res,1, Val_int(glyph->bitmap_top)); Store_field(res,2, Val_int(bitmap.width)); Store_field(res,3, Val_int(bitmap.rows)); CAMLreturn(res); } value read_Bitmap( vface, vx, vy ) /* This "y" is in Y upwards convention */ value vface, vx, vy; { /* no boundary check !!! */ int x, y; CAMLparam3(vface, vx, vy); FT_Bitmap bitmap = (*(FT_Face *)vface)->glyph->bitmap; unsigned char *row; x = Int_val(vx); y = Int_val(vy); switch ( bitmap.pixel_mode ) { case ft_pixel_mode_grays: if (bitmap.pitch > 0){ row = bitmap.buffer + (bitmap.rows - 1 - y) * bitmap.pitch; } else { row = bitmap.buffer - y * bitmap.pitch; } CAMLreturn (Val_int(row[x])); case ft_pixel_mode_mono: if (bitmap.pitch > 0){ row = bitmap.buffer + (bitmap.rows - 1 - y) * bitmap.pitch; } else { row = bitmap.buffer - y * bitmap.pitch; } CAMLreturn (Val_int(row[x >> 3] & (128 >> (x & 7)) ? 255 : 0)); break; default: failwith("read_Bitmap: unknown pixel mode"); } } value get_Glyph_Metrics( face ) value face; { CAMLparam1(face); CAMLlocal3(res1,res2,res); /* no soundness check ! */ FT_Glyph_Metrics *metrics = &((*(FT_Face *)face)->glyph->metrics); res1 = alloc_tuple(3); Store_field(res1,0, Val_int(metrics->horiBearingX)); Store_field(res1,1, Val_int(metrics->horiBearingY)); Store_field(res1,2, Val_int(metrics->horiAdvance)); res2 = alloc_tuple(3); Store_field(res2,0, Val_int(metrics->vertBearingX)); Store_field(res2,1, Val_int(metrics->vertBearingY)); Store_field(res2,2, Val_int(metrics->vertAdvance)); res = alloc_tuple(4); Store_field(res,0, Val_int(metrics->width)); Store_field(res,1, Val_int(metrics->height)); Store_field(res,2, res1); Store_field(res,3, res2); CAMLreturn(res); } value get_Size_Metrics( face ) value face; { CAMLparam1(face); CAMLlocal1(res); FT_Size_Metrics *imetrics = &((*(FT_Face*)face)->size->metrics); res = alloc_tuple(4); Store_field(res,0, Val_int(imetrics->x_ppem)); Store_field(res,1, Val_int(imetrics->y_ppem)); Store_field(res,2, Val_int(imetrics->x_scale)); Store_field(res,3, Val_int(imetrics->y_scale)); CAMLreturn(res); } value get_Outline_Contents(value face) { /* ***************************************************************** Concrete definitions of TT_Outline might vary from version to version. This definition assumes freetype 2.0.1 ( anyway, this function is wrong...) ***************************************************************** */ CAMLparam1(face); CAMLlocal5(points, tags, contours, res, tmp); int i; FT_Outline* outline = &((*(FT_Face *)face)->glyph->outline); int n_contours = outline->n_contours; int n_points = outline->n_points; points = alloc_tuple(n_points); tags = alloc_tuple(n_points); contours = alloc_tuple(n_contours); for( i=0; ipoints; char* raw_flags = outline->tags; tmp = alloc_tuple(2); /* caution: 26.6 fixed into 31 bit */ Store_field(tmp, 0, Val_int(raw_points[i].x)); Store_field(tmp, 1, Val_int(raw_points[i].y)); Store_field(points, i, tmp); if ( raw_flags[i] & FT_Curve_Tag_On ) { Store_field(tags, i, Val_int(0)); /* On point */ } else if ( raw_flags[i] & FT_Curve_Tag_Cubic ) { Store_field(tags, i, Val_int(2)); /* Off point, cubic */ } else { Store_field(tags, i, Val_int(1)); /* Off point, conic */ } } for( i=0; icontours; Store_field(contours, i, Val_int(raw_contours[i])); } res = alloc_tuple(5); Store_field(res, 0, Val_int(n_contours)); Store_field(res, 1, Val_int(n_points)); Store_field(res, 2, points); Store_field(res, 3, tags); Store_field(res, 4, contours); CAMLreturn(res); } camlspotter-camlimages-e471b3c4470d/src/ftintf_na.c0000644000000000000000000000416212405272062020300 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #include #include #include #include value init_FreeType(){ failwith("unsupported"); } value done_FreeType(){ failwith("unsupported"); } value new_Face(){ failwith("unsupported"); } value face_info(){ failwith("unsupported"); } value done_Face(){ failwith("unsupported"); } value get_num_glyphs(){ failwith("unsupported"); } value set_Char_Size(){ failwith("unsupported"); } value set_Pixel_Sizes(){ failwith("unsupported"); } value val_CharMap(){ failwith("unsupported"); } value get_CharMaps(){ failwith("unsupported"); } value set_CharMap(){ failwith("unsupported"); } value get_Char_Index(){ failwith("unsupported"); } value load_Glyph(){ failwith("unsupported"); } value load_Char(){ failwith("unsupported"); } value render_Glyph_of_Face(){ failwith("unsupported"); } value render_Char(){ failwith("unsupported"); } value set_Transform(){ failwith("unsupported"); } value get_Bitmap_Info(){ failwith("unsupported"); } value read_Bitmap(){ failwith("unsupported"); } value get_Glyph_Metrics(){ failwith("unsupported"); } value get_Size_Metrics(){ failwith("unsupported"); } value get_Outline_Contents(){ failwith("unsupported"); } camlspotter-camlimages-e471b3c4470d/src/ftlow.ml0000644000000000000000000001104012405272062017642 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: ftlow.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) (* The lower interface *) type library type face;; type face_info = { num_faces : int; num_glyphs : int; family_name : string; style_name : string; has_horizontal : bool; has_vertical : bool; has_kerning : bool; is_scalable : bool; is_sfnt : bool; is_fixed_width : bool; has_fixed_sizes : bool; has_fast_glyphs : bool; has_glyph_names : bool; has_multiple_masters : bool; };; type charmap = { platform_id : int; encoding_id : int; };; type render_mode = | Render_Normal (* default *) | Render_Mono;; type load_flag = | Load_no_scale | Load_no_hinting;; type flags = int;; type bitmap_info = { bitmap_left : int; bitmap_top : int; bitmap_width : int; bitmap_height : int; };; (* glyph metrics *) type bbox = { xmin : int; (* 26.6 *) ymin : int; (* 26.6 *) xmax : int; (* 26.6 *) ymax : int; (* 26.6 *) };; type bearing_advance = { bearingx : int; (* 26.6 *) bearingy : int; (* 26.6 *) advance : int; (* 26.6 *) };; type glyph_metrics = { gm_width : int (* 26.6 *); gm_height : int (* 26.6 *); gm_hori : bearing_advance; gm_vert : bearing_advance; };; (* size metrics *) type size_metrics = { x_ppem : int; y_ppem : int; x_scale : int; (* 16.16 *) y_scale : int; (* 16.16 *) };; (* outline info *) type outline_tag = On_point | Off_point_conic | Off_point_cubic;; type outline_contents = { n_contours : int; n_points : int; points : (int * int) array; tags : outline_tag array; contours : int array; };; module C = struct external init : unit -> library = "init_FreeType";; external close : library -> unit = "done_FreeType";; external new_face : library -> string -> int -> face = "new_Face";; external face_info : face -> face_info = "face_info";; external done_face : face -> unit = "done_Face";; external get_num_glyphs : face -> int = "get_num_glyphs";; external set_char_size : face -> int -> int -> int -> int -> unit = "set_Char_Size";; external set_pixel_sizes : face -> int -> int -> unit = "set_Pixel_Sizes";; external get_charmaps : face -> charmap list = "get_CharMaps";; external set_charmap : face -> charmap -> unit = "set_CharMap";; external get_char_index : face -> int -> int = "get_Char_Index";; external load_glyph_raw : face -> int -> flags -> int * int = "load_Glyph";; external load_char_raw : face -> int -> flags -> int * int = "load_Char";; external render_glyph_of_face : face -> render_mode -> unit = "render_Glyph_of_Face";; external render_char_raw : face -> int -> flags -> render_mode -> int * int = "render_Char";; external set_transform : face -> (int * int * int * int) -> (int * int) -> unit = "set_Transform";; external get_bitmap_info : face -> bitmap_info = "get_Bitmap_Info";; external read_bitmap : face -> int -> int -> int = "read_Bitmap";; external get_glyph_metrics : face -> glyph_metrics = "get_Glyph_Metrics";; external get_size_metrics : face -> size_metrics = "get_Size_Metrics";; external get_outline_contents : face -> outline_contents = "get_Outline_Contents";; end include C let encode_flags flags = let int_of_flag = function | Load_no_scale -> 1 | Load_no_hinting -> 2 in List.fold_left (fun v f -> v lor int_of_flag f) 0 flags;; let load_glyph face code flags = load_glyph_raw face code (encode_flags flags);; let load_char face code flags = load_char_raw face code (encode_flags flags);; let render_glyph face idx flags render_mode = let adv = load_glyph face idx flags in render_glyph_of_face face render_mode; adv;; let render_char face code flags render_mode = render_char_raw face code (encode_flags flags) render_mode;; camlspotter-camlimages-e471b3c4470d/src/ftlow.mli0000644000000000000000000000706712405272062020031 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: ftlow.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) (** Almost all of the functions are just interpretation of functions of the freetype library. See the documents of the freetype library. *) type library;; val init : unit -> library val close : library -> unit type face type face_info = { num_faces : int; num_glyphs : int; family_name : string; style_name : string; has_horizontal : bool; has_vertical : bool; has_kerning : bool; is_scalable : bool; is_sfnt : bool; is_fixed_width : bool; has_fixed_sizes : bool; has_fast_glyphs : bool; has_glyph_names : bool; has_multiple_masters : bool; } val new_face : library -> string -> int -> face val face_info : face -> face_info val done_face : face -> unit val get_num_glyphs : face -> int val set_char_size : face -> int -> int -> int -> int -> unit val set_pixel_sizes : face -> int -> int -> unit type charmap = { platform_id : int; encoding_id : int; } val get_charmaps : face -> charmap list val set_charmap : face -> charmap -> unit val get_char_index : face -> int -> int type render_mode = | Render_Normal (** default *) | Render_Mono type load_flag = | Load_no_scale | Load_no_hinting val load_glyph : face -> int -> load_flag list -> int * int val load_char : face -> int -> load_flag list -> int * int val render_glyph_of_face : face -> render_mode -> unit val render_glyph : face -> int -> load_flag list -> render_mode -> int * int val render_char : face -> int -> load_flag list -> render_mode -> int * int val set_transform : face -> (int * int * int * int) -> (int * int) -> unit type bitmap_info = { bitmap_left : int; bitmap_top : int; bitmap_width : int; bitmap_height : int; } val get_bitmap_info : face -> bitmap_info val read_bitmap : face -> int -> int -> int (** glyph metrics *) type bbox = { xmin : int; (** 26.6 *) ymin : int; (** 26.6 *) xmax : int; (** 26.6 *) ymax : int; (** 26.6 *) } type bearing_advance = { bearingx : int; (** 26.6 *) bearingy : int; (** 26.6 *) advance : int; (** 26.6 *) } type glyph_metrics = { gm_width : int (** 26.6 *); gm_height : int (** 26.6 *); gm_hori : bearing_advance; gm_vert : bearing_advance; } val get_glyph_metrics : face -> glyph_metrics (** size metrics *) type size_metrics = { x_ppem : int; y_ppem : int; x_scale : int; (** 16.16 *) y_scale : int; (** 16.16 *) } val get_size_metrics : face -> size_metrics (** outline info *) type outline_tag = On_point | Off_point_conic | Off_point_cubic type outline_contents = { n_contours : int; n_points : int; points : (int * int) array; tags : outline_tag array; contours : int array; } val get_outline_contents : face -> outline_contents camlspotter-camlimages-e471b3c4470d/src/fttext.ml0000644000000000000000000001423012405272062020031 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: fttext.ml,v 1.2 2008/06/16 22:35:42 furuse Exp $ *) open Images;; open Freetype;; type 'a drawer = 'a -> int -> 'a;; let func_darken_only org level = let level = 255 - level in { r = if org.r > level then level else org.r; g = if org.g > level then level else org.g; b = if org.b > level then level else org.b };; let func_red_only _org _level = { r = 255; g = 0; b = 0 };; let unicode_of_latin s = Array.init (String.length s) @@ fun i -> Char.code s.[i] let unicode_of_euc_japan s = Jis_unicode.encode s;; let draw_gen render_mode renderf rot func face px py string = let matrix = matrix_rotate rot in let curx = ref (0.0) and cury = ref (0.0) in for i = 0 to Array.length string - 1 do set_transform face matrix {ft_x = !curx; ft_y = !cury}; let advx, advy = renderf face string.(i) [] render_mode in let binfo = get_bitmap_info face in for y = 0 to binfo.bitmap_height - 1 do for x = 0 to binfo.bitmap_width - 1 do let z = read_bitmap face x y in let level = if z < 0 then 0 else if z > 255 then 255 else z in try let px = px + binfo.bitmap_left + x and py = py - (binfo.bitmap_top - binfo.bitmap_height + y) (* in and py = py + (binfo.bitmap_top + binfo.bitmap_height - y) *) in func px py level with Out_of_image -> () done; done; curx := !curx +. advx; cury := !cury +. advy; done;; let draw_rotated_text = draw_gen Render_Normal render_char;; let draw_rotated_glyphs = draw_gen Render_Normal render_glyph;; let draw_text = draw_rotated_text 0.0;; let draw_glyphs = draw_rotated_glyphs 0.0;; let draw_mono_rotated_text = draw_gen Render_Mono render_char;; let draw_mono_rotated_glyphs = draw_gen Render_Mono render_glyph;; let draw_mono_text = draw_mono_rotated_text 0.0;; let draw_mono_glyphs = draw_mono_rotated_glyphs 0.0;; module type T = sig type t type elt val create : int -> int -> t val destroy : t -> unit val get : t -> int -> int -> elt val set : t -> int -> int -> elt -> unit val unsafe_get : t -> int -> int -> elt val unsafe_set : t -> int -> int -> elt -> unit end;; module Make(T : T) = struct let putpixel f bitmap = fun px py level -> try let orgcolor = T.get bitmap px py in T.set bitmap px py (f orgcolor level) with Out_of_image -> () let draw_rotated_text face func bitmap px py rot string = draw_rotated_text rot (putpixel func bitmap) face px py string let draw_rotated_glyphs face func bitmap px py rot string = draw_rotated_glyphs rot (putpixel func bitmap) face px py string let draw_text face func bitmap px py string = draw_text (putpixel func bitmap) face px py string let draw_glyphs face func bitmap px py string = draw_glyphs (putpixel func bitmap) face px py string let draw_mono_rotated_text face func bitmap px py rot string = draw_mono_rotated_text rot (putpixel func bitmap) face px py string let draw_mono_rotated_glyphs face func bitmap px py rot string = draw_mono_rotated_glyphs rot (putpixel func bitmap) face px py string let draw_mono_text face func bitmap px py string = draw_mono_text (putpixel func bitmap) face px py string let draw_mono_glyphs face func bitmap px py string = draw_mono_glyphs (putpixel func bitmap) face px py string end;; let size_gen face loadf string = let curx = ref 0.0 and leftmost = ref None and rightmost = ref None and upmost = ref None and downmost = ref None in for i = 0 to Array.length string - 1 do let _advx, _advy = loadf face string.(i) [] in let metrics = get_glyph_metrics face in let left = metrics.gm_hori.bearingx +. !curx and right = metrics.gm_hori.bearingx +. metrics.gm_width +. !curx and up = metrics.gm_hori.bearingy and down = metrics.gm_hori.bearingy -. metrics.gm_height in begin match !leftmost with | None -> leftmost := Some left | Some x when x > left -> leftmost := Some left | _ -> () end; begin match !rightmost with | None -> rightmost := Some right | Some x when x < right -> rightmost := Some right | _ -> () end; begin match !upmost with | None -> upmost := Some up | Some x when x < up -> upmost := Some up | _ -> () end; begin match !downmost with | None -> downmost := Some down | Some x when x > down -> downmost := Some down | _ -> () end; curx := !curx +. metrics.gm_hori.advance done; match !leftmost, !downmost, !rightmost, !upmost with Some l, Some d, Some r, Some u -> l,d,r,u | _ -> assert false;; let size face string = size_gen face load_char string;; let size_of_glyphs face string = size_gen face load_glyph string;; let vector_gen loadf turn_y rot func face px py string = let matrix = matrix_rotate rot in let matrix = if turn_y then { matrix with ft_xy = -. matrix.ft_xy; ft_yy = -. matrix.ft_yy; } else matrix in let curx = ref px and cury = ref py in for i = 0 to Array.length string - 1 do set_transform face matrix {ft_x = !curx; ft_y = !cury}; let advx, advy = loadf face string.(i) [] in func (get_outline_contents face); curx := !curx +. advx; cury := !cury +. advy done;; let vector_text turn_y func face px py rot string = vector_gen load_char turn_y rot func face px py string;; let vector_glyphs turn_y func face px py rot string = vector_gen load_glyph turn_y rot func face px py string;; camlspotter-camlimages-e471b3c4470d/src/fttext.mli0000644000000000000000000001064512405272062020210 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: fttext.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) open Color;; open Freetype;; (* the type for actual drawing functions and some samples *) type 'a drawer = 'a -> int -> 'a;; val func_darken_only : rgb drawer;; val func_red_only : rgb drawer;; val unicode_of_latin : string -> int array;; val unicode_of_euc_japan : string -> int array;; (* general drawing function *) val draw_rotated_text : float -> (int -> int -> int -> unit) -> face -> int -> int -> int array -> unit;; val draw_rotated_glyphs : float -> (int -> int -> int -> unit) -> face -> int -> int -> char_index array -> unit;; val draw_text : (int -> int -> int -> unit) -> face -> int -> int -> int array -> unit;; val draw_glyphs : (int -> int -> int -> unit) -> face -> int -> int -> char_index array -> unit;; val draw_mono_rotated_text : float -> (int -> int -> int -> unit) -> face -> int -> int -> int array -> unit;; val draw_mono_rotated_glyphs : float -> (int -> int -> int -> unit) -> face -> int -> int -> char_index array -> unit;; val draw_mono_text : (int -> int -> int -> unit) -> face -> int -> int -> int array -> unit;; val draw_mono_glyphs : (int -> int -> int -> unit) -> face -> int -> int -> char_index array -> unit;; module type T = sig type t type elt val create : int -> int -> t val destroy : t -> unit val get : t -> int -> int -> elt val set : t -> int -> int -> elt -> unit val unsafe_get : t -> int -> int -> elt val unsafe_set : t -> int -> int -> elt -> unit end;; module Make(T : T) : sig (* Draw texts *) (* [draw face drawer image x y text] *) (* Draw a text on image at (x,y), using drawer function *) (* text must be encoded by some encoder and translated into int array *) val draw_text : Freetype.face -> T.elt drawer -> T.t -> int -> int -> int array -> unit (* Draw rotated texts *) (* [draw_rotated face drawer image x y r text] *) (* Draw a text on image at (x,y) rotated r *) (* Drawn text is automatically smoothed *) val draw_rotated_text : Freetype.face -> T.elt drawer -> T.t-> int -> int -> float -> int array -> unit val draw_glyphs : Freetype.face -> T.elt drawer -> T.t -> int -> int -> char_index array -> unit val draw_rotated_glyphs : Freetype.face -> T.elt drawer -> T.t-> int -> int -> float -> char_index array -> unit (* Monochrome (black/white) drawing *) val draw_mono_text : Freetype.face -> T.elt drawer -> T.t -> int -> int -> int array -> unit val draw_mono_rotated_text : Freetype.face -> T.elt drawer -> T.t-> int -> int -> float -> int array -> unit val draw_mono_glyphs : Freetype.face -> T.elt drawer -> T.t -> int -> int -> char_index array -> unit val draw_mono_rotated_glyphs : Freetype.face -> T.elt drawer -> T.t-> int -> int -> float -> char_index array -> unit end;; (* Get the size information of text *) val size : Freetype.face -> int array -> float * float * float * float;; val size_of_glyphs : Freetype.face -> char_index array -> float * float * float * float;; (* Vector based *) val vector_gen : (Freetype.face -> 'a -> 'b list -> float * float) -> bool -> float -> (Freetype.outline_contents -> 'c) -> Freetype.face -> float -> float -> 'a array -> unit;; val vector_text : bool -> (Freetype.outline_contents -> 'a) -> Freetype.face -> float -> float -> float -> int array -> unit;; val vector_glyphs : bool -> (Freetype.outline_contents -> 'a) -> Freetype.face -> float -> float -> float -> Freetype.char_index array -> unit;; camlspotter-camlimages-e471b3c4470d/src/genimage.ml0000644000000000000000000001223012405272062020265 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: genimage.ml,v 1.6 2009/07/04 03:39:28 furuse Exp $ *) open Color;; open Image_intf module MakeRawImage(E:ENCODE) = struct module Bitmap= Bitmap.Make(E) module Encode = E type elt = E.t type bitmap = Bitmap.t type t = { width: int; height: int; bitmap: bitmap; } let width t = t.width let height t = t.height let dump t = Bitmap.dump t.bitmap let create_with width height init_buffer = { width= width; height= height; bitmap= Bitmap.create_with width height init_buffer; } ;; let create_with_scanlines width height init_scanlines = { width= width; height= height; bitmap= Bitmap.create_with_scanlines width height init_scanlines; } ;; let create width height = { width= width; height= height; bitmap= Bitmap.create width height None; } ;; let make width height init = { width= width; height= height; bitmap= Bitmap.create width height (Some (E.make init)); } ;; let unsafe_access t x y = Bitmap.access t.bitmap x y;; let get_strip t = Bitmap.get_strip t.bitmap let set_strip t = Bitmap.set_strip t.bitmap let get_scanline t = Bitmap.get_scanline t.bitmap let get_scanline_ptr t = Bitmap.get_scanline_ptr t.bitmap let set_scanline t = Bitmap.set_scanline t.bitmap let unsafe_get t x y = let str, pos = Bitmap.access t.bitmap x y in E.get str pos ;; let unsafe_set t x y c = let str, pos = Bitmap.access t.bitmap x y in E.set str pos c ;; let get t x y = Region.check t.width t.height x y; unsafe_get t x y ;; let set t x y c = Region.check t.width t.height x y; unsafe_set t x y c ;; let destroy t = Bitmap.destroy t.bitmap ;; let copy src = { src with bitmap = Bitmap.copy src.bitmap } let sub src x y w h = { width= w; height= h; bitmap= Bitmap.sub src.bitmap x y w h; } ;; let blit src sx sy dst dx dy w h = Bitmap.blit src.bitmap sx sy dst.bitmap dx dy w h ;; let map f src sx sy dst dx dy w h = for y = 0 to h - 1 do for x = 0 to w - 1 do let s = unsafe_get src (sx + x) (sy + y) in let dx' = dx + x and dy' = dy + y in let d = unsafe_get dst dx' dy' in unsafe_set dst dx' dy' (f s d) done done let blocks img = Bitmap.blocks img.bitmap let dump_block img = Bitmap.dump_block img.bitmap end;; module Make(RI:RAWIMAGE)(CON:CONTAINER with type rawimage = RI.t) = struct type t = CON.container type elt = RI.elt let dump t = RI.dump (CON.rawimage t) let create width height = CON.create_default width height (RI.create width height) let make width height c = CON.create_default width height (RI.make width height c) let unsafe_access t = RI.unsafe_access (CON.rawimage t) let get_strip t = RI.get_strip (CON.rawimage t) let set_strip t = RI.set_strip (CON.rawimage t) let get_scanline t = RI.get_scanline (CON.rawimage t) let get_scanline_ptr t = RI.get_scanline_ptr (CON.rawimage t) let set_scanline t = RI.set_scanline (CON.rawimage t) let unsafe_get t = RI.unsafe_get (CON.rawimage t) let unsafe_set t = RI.unsafe_set (CON.rawimage t) let get t = RI.get (CON.rawimage t) let set t = RI.set (CON.rawimage t) let destroy t = RI.destroy (CON.rawimage t) let copy t = let t' = CON.rawimage t in CON.create_duplicate t (RI.width t') (RI.height t') (RI.copy t') let sub t x y w h = let t' = CON.rawimage t in CON.create_duplicate t w h (RI.sub t' x y w h) let blit src sx sy dst dx dy w h = RI.blit (CON.rawimage src) sx sy (CON.rawimage dst) dx dy w h let map f src sx sy dst dx dy w h = RI.map f (CON.rawimage src) sx sy (CON.rawimage dst) dx dy w h let blocks img = RI.blocks (CON.rawimage img) let dump_block img = RI.dump_block (CON.rawimage img) end;; module MakeIndexed(RI:RAWIMAGE with type elt = int) (CON:CONTAINER_INDEXED with type rawimage = RI.t) = struct include Make(RI)(CON) type mapelt = CON.mapelt let unsafe_get_color t = let colormap = CON.colormap t in fun x y -> colormap.map.(unsafe_get t x y) let get_color t = let colormap = CON.colormap t in fun x y -> let i = get t x y in if i < 0 || i >= Array.length colormap.map then raise Not_found; colormap.map.(i) end;; camlspotter-camlimages-e471b3c4470d/src/genimage.mli0000644000000000000000000000302312405272062020436 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: genimage.mli,v 1.6 2009/03/01 11:24:10 furuse Exp $ *) open Image_intf (** Low level image creator *) module MakeRawImage : functor (E : ENCODE) -> (RAWIMAGE with type elt = E.t);; module Make : functor (RI : RAWIMAGE) -> functor (CON : CONTAINER with type rawimage = RI.t) -> IMAGE with type t = CON.container and type elt = RI.elt;; module MakeIndexed(RI:RAWIMAGE with type elt = int) (CON:CONTAINER_INDEXED with type rawimage = RI.t) : IMAGEINDEXED with type t = CON.container and type elt = int and type mapelt = CON.mapelt;; camlspotter-camlimages-e471b3c4470d/src/geometry.ml0000644000000000000000000000641012405272062020347 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: geometry.ml,v 1.1 2006/11/28 15:43:28 rousse Exp $*) (* geometry setting *) type size = | Scale of float | Pixel of int | Guess;; type aspect_opts = | Keep_at_most | Keep_at_least | Dont_keep;; type resize_switch = | Always | Bigger_only | Smaller_only;; type from = | TopLeft | BottomRight | Center;; type position = | AtPixel of from * int | AtScale of from * float;; type t = { geom_width : int; geom_height : int; geom_x : int; geom_y : int; };; type spec = { spec_width : size; spec_height : size; spec_aspect : aspect_opts; spec_switch : resize_switch; spec_x : int; spec_y : int; };; let compute spec orgw orgh = let w, h = match spec.spec_width, spec.spec_height, spec.spec_aspect with | Scale s, Guess, asp when asp <> Dont_keep -> truncate (float orgw *. s), truncate (float orgh *. s) | Guess, Scale s, asp when asp <> Dont_keep -> truncate (float orgw *. s), truncate (float orgh *. s) | Scale sw, Scale sh, _ (* asp is ignored *) -> truncate (float orgw *. sw), truncate (float orgh *. sh) | Pixel w, Guess, asp when asp <> Dont_keep -> let s = float w /. float orgw in w, truncate (float orgh *. s) | Guess, Pixel h, asp when asp <> Dont_keep -> let s = float h /. float orgh in truncate (float orgw *. s), h | Pixel w, Pixel h, _ (* asp is ignored *) -> w, h | _ -> raise (Invalid_argument "Geometry.compute") in let scalew = float w /. float orgw and scaleh = float h /. float orgh in let scalew', scaleh' = match spec.spec_aspect with | Keep_at_most -> if scalew < scaleh then scalew, scalew else scaleh, scaleh | Keep_at_least -> if scalew < scaleh then scaleh, scaleh else scalew, scalew | Dont_keep -> scalew, scaleh in let scalew'', scaleh'' = match spec.spec_switch with | Always -> scalew', scaleh' | Bigger_only when scalew' >= 1.0 && scaleh' >= 1.0 -> scalew', scaleh' | Smaller_only when scalew' <= 1.0 && scaleh' <= 1.0 -> scalew', scaleh' | _ -> 1.0, 1.0 in let w' = if scalew = scalew'' then w else truncate (float orgw *. scalew'') and h' = if scaleh = scaleh'' then h else truncate (float orgh *. scaleh'') in { geom_width = w'; geom_height = h'; geom_x = spec.spec_x; geom_y = spec.spec_y; };; camlspotter-camlimages-e471b3c4470d/src/geometry.mli0000644000000000000000000000103512405272062020516 0ustar 00000000000000type size = Scale of float | Pixel of int | Guess type aspect_opts = Keep_at_most | Keep_at_least | Dont_keep type resize_switch = Always | Bigger_only | Smaller_only type from = TopLeft | BottomRight | Center type position = AtPixel of from * int | AtScale of from * float type t = { geom_width : int; geom_height : int; geom_x : int; geom_y : int; } type spec = { spec_width : size; spec_height : size; spec_aspect : aspect_opts; spec_switch : resize_switch; spec_x : int; spec_y : int; } val compute : spec -> int -> int -> t camlspotter-camlimages-e471b3c4470d/src/gif.ml0000644000000000000000000003567412405272062017277 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: gif.ml,v 1.2 2008/06/16 22:35:42 furuse Exp $ *) open Images;; open Index8;; open Util let debug = try ignore (Sys.getenv "CAMLIMAGES_DEBUG_GIF"); true with | _ -> false;; let debug_endline = if debug then prerr_endline else (fun _ -> ());; type in_channel;; type out_channel;; type screen_info = { s_width : int; s_height : int; s_color_resolution : int; s_back_ground_color : int; s_colormap : rgb array; };; type record_type = | Undefined | Screen_desc | Image_desc | Extension | Terminate;; type gif_desc = { desc_left : int; desc_top : int; desc_width : int; desc_height : int; desc_interlace : bool; desc_colormap : Color.rgb array; } external dGifOpenFileName : string -> screen_info * in_channel = "dGifOpenFileName";; external dGifCloseFile : in_channel -> unit = "dGifCloseFile";; external dGifGetRecordType : in_channel -> record_type = "dGifGetRecordType";; external dGifGetImageDesc : in_channel -> gif_desc = "dGifGetImageDesc";; external dGifGetLine : in_channel -> string = "dGifGetLine";; external dGifGetExtension : in_channel -> int * string list (* reversed!!! *) = "dGifGetExtension";; external eGifOpenFileName : string -> out_channel = "eGifOpenFileName";; external eGifCloseFile : out_channel -> unit = "eGifCloseFile";; external eGifPutScreenDesc : out_channel -> screen_info -> unit = "eGifPutScreenDesc";; external eGifPutImageDesc : out_channel -> gif_desc -> unit = "eGifPutImageDesc";; external eGifPutLine : out_channel -> string -> unit = "eGifPutLine";; external eGifPutExtension : out_channel -> int * string list -> unit = "eGifPutExtension";; type gif_extension = | GifComment of string list | GifGraphics of string list | GifPlaintext of string list | GifApplication of string list | GifOtherExt of int * string list;; type gif_frame = { frame_left : int; frame_top : int; frame_bitmap : Index8.t; mutable frame_extensions : gif_extension list; frame_delay : int; };; type gif_sequence = { screen_width : int; screen_height : int; screen_colormap : Color.rgb Color.map; frames : gif_frame list; loops : int; };; let gif_parse_extension func exts = let exts = List.rev exts in match func with | 0xfe -> GifComment exts | 0xf9 -> GifGraphics exts | 0x01 -> GifPlaintext exts | 0xff -> GifApplication exts | _ -> GifOtherExt (func, exts);; let gif_make_extension ext = match ext with | GifComment exts -> 0xfe, exts | GifGraphics exts -> 0xf9, exts | GifPlaintext exts -> 0x01, exts | GifApplication exts -> 0xff, exts | GifOtherExt (func, exts) -> func, exts;; open Printf;; let load filename opts = let prog = Images.load_progress opts in let sinfo, ic = dGifOpenFileName filename in debug_endline (sprintf "Screen = %dx%d ColorRes = %d BG = %d Colors = %d" sinfo.s_width sinfo.s_height sinfo.s_color_resolution sinfo.s_back_ground_color (Array.length sinfo.s_colormap)); let frames = ref [] in let current_extensions = ref [] in let transparent = ref (-1) in let loops = ref 0 in let delay = ref 0 in try while true do match dGifGetRecordType ic with | Terminate -> raise Exit | Image_desc -> let desc = dGifGetImageDesc ic in (* reset progress bar *) begin match prog with | Some p -> p 0.0 | None -> () end; if debug then debug_endline (sprintf "Size=%dx%d Colors=%d" desc.desc_width desc.desc_height (Array.length desc.desc_colormap)); let img = Index8.create desc.desc_width desc.desc_height in img.transparent <- !transparent; let cmap = img.colormap in cmap.max <- 256; cmap.map <- (if Array.length desc.desc_colormap = 0 then sinfo.s_colormap else desc.desc_colormap); if debug then for i = 0 to Array.length cmap.map -1 do prerr_string (sprintf " %2d: %02xh %02xh %02xh " i cmap.map.(i).r cmap.map.(i).g cmap.map.(i).b); if i mod 4 = 3 then prerr_endline ""; done; (* Interlaced gif encoding dst src 0 <----------- 0 8 <----------- 1 16 <----------- 2 ... <----------- ... ... <----------- x-1 4 <----------- x 12 <----------- x+1 20 <----------- x+2 ... <----------- ... ... <----------- y-1 2 <----------- y 6 <----------- y+1 10 <----------- y+2 14 <----------- y+3 ... <----------- ... ... <----------- z-1 1 <----------- z 3 <----------- z+1 5 <----------- z+2 7 <----------- z+3 9 <----------- z+4 11 <----------- z+5 ... <----------- ... <----------- image.height - 1 *) let interlace_reader () = let lines = ref 0 in let rec loop src dest dest_step = if dest >= desc.desc_height then src else begin let line = dGifGetLine ic in Index8.set_scanline img dest line; incr lines; begin match prog with | Some p -> p (float !lines /. float desc.desc_height) | None -> () end; loop (src + 1) (dest + dest_step) dest_step end in let src_1 = loop 0 0 8 in let src_2 = loop src_1 4 8 in let src_3 = loop src_2 2 4 in ignore (loop src_3 1 2) in let normal_reader () = for y = 0 to desc.desc_height - 1 do let line = dGifGetLine ic in Index8.set_scanline img y line; begin match prog with | Some p -> p (float (y + 1) /. float desc.desc_height) | None -> () end; done in begin try if desc.desc_interlace then interlace_reader () else normal_reader () with | Failure _e -> prerr_endline "Short file"; end; let frame = { frame_left = desc.desc_left; frame_top = desc.desc_top; frame_bitmap = img; frame_extensions = !current_extensions; frame_delay = !delay; } in current_extensions := []; transparent := (-1); delay := 0; frames := frame :: !frames | Extension -> debug_endline "EXTENSION"; let func, exts = dGifGetExtension ic in let ext = gif_parse_extension func exts in begin match ext with | GifGraphics (str :: _ as exts) -> if debug then begin prerr_string "GRP: "; for i = 0 to String.length str - 1 do prerr_string (Printf.sprintf "%02x " (int_of_char str.[i])) done end; List.iter debug_endline exts; if String.length str < 4 then raise Exit; if int_of_char str.[0] land 0x1 <> 0 then begin debug_endline (Printf.sprintf "TRANSPARENT %d" (int_of_char str.[3])); transparent := int_of_char str.[3] end; delay := int_of_char str.[1] + int_of_char str.[2] * 256; | _ -> () end; current_extensions := ext :: !current_extensions | Undefined | Screen_desc -> raise (Failure "Gif.load") done; raise (Failure "impos") with | Exit -> debug_endline "CLOSING"; dGifCloseFile ic; debug_endline "FINISHED"; { screen_width = sinfo.s_width; screen_height = sinfo.s_height; screen_colormap = {max = 256; map = sinfo.s_colormap; }; frames = (List.rev !frames); loops = !loops; } | Failure e -> prerr_endline ("Gif.load Error " ^ e); debug_endline "CLOSING"; dGifCloseFile ic; debug_endline "FINISHED"; { screen_width = sinfo.s_width; screen_height = sinfo.s_height; screen_colormap = {max = 256; map = sinfo.s_colormap; }; frames = (List.rev !frames); loops = !loops };; let seq_of_gifseq gifseq = { seq_width = gifseq.screen_width; seq_height = gifseq.screen_height; seq_frames = List.map (fun gifframe -> { Images.frame_left = gifframe.frame_left; Images.frame_top = gifframe.frame_top; Images.frame_image = Index8 gifframe.frame_bitmap; Images.frame_delay = gifframe.frame_delay * 10; }) gifseq.frames; seq_loops = gifseq.loops; };; let load_sequence filename opts = seq_of_gifseq (load filename opts);; let load_first filename opts = (* inefficient... *) let sequence = load filename opts in let bitmap = (List.hd sequence.frames).frame_bitmap in Index8 bitmap;; let save filename opts sequence = let interlace = Images.save_interlace opts in let oc = eGifOpenFileName filename in debug_endline "OPENED"; let color_resolution = let max = ref 0 in List.iter (fun frame -> let colors = Color.size frame.frame_bitmap.colormap in if colors > !max then max := colors ) sequence.frames; let colors = !max in let rec sub k k' = if colors < k' then k else sub (k + 1) (k' * 2) in let res = sub 0 1 in if res = 0 then 1 else res in try debug_endline "SDESC"; eGifPutScreenDesc oc { s_width = sequence.screen_width; s_height = sequence.screen_height; s_color_resolution = color_resolution; s_back_ground_color = 0; s_colormap= (List.hd sequence.frames).frame_bitmap.colormap.map }; (* write loops *) let loop_written = ref false in if sequence.loops <> 0 then begin let str = Bytes.create 3 in Bytes.unsafe_set str 0 @@ '\001'; Bytes.unsafe_set str 1 @@ char_of_int (sequence.loops mod 256); Bytes.unsafe_set str 2 @@ char_of_int (sequence.loops / 256); eGifPutExtension oc (gif_make_extension (GifApplication ["NETSCAPE2.0"; str])); loop_written := true end; List.iter (fun frame -> let graphics_ext = ref None in List.iter (fun ext -> debug_endline "SEXT"; try begin match ext with | GifApplication ["NETSCAPE2.0"; _] -> (* Overridden and written already *) if !loop_written then raise Exit | GifGraphics [str] -> (* delayed *) graphics_ext := Some str; raise Exit | _ -> () end; eGifPutExtension oc (gif_make_extension ext) with | Exit -> ()) frame.frame_extensions; (* graphics extension *) (* If frame_delay and transparent information is different from the graphics extension possibly contained in the extensions, we override the graphics extension by them *) if !graphics_ext <> None || frame.frame_delay <> 0 || frame.frame_bitmap.transparent <> -1 then begin let str = match !graphics_ext with | Some str -> str | None -> String.make 4 '\000' in if frame.frame_bitmap.transparent <> -1 then begin str << 0 & char_of_int (int_of_char str.[0] lor 0x01); str << 3 & char_of_int frame.frame_bitmap.transparent end else begin str << 0 & char_of_int (int_of_char str.[0] land 0xfe); str << 3 & '\000' end; str << 1 & char_of_int (frame.frame_delay mod 256); str << 2 & char_of_int (frame.frame_delay / 256); eGifPutExtension oc (gif_make_extension (GifGraphics [str])) end; let bmp = frame.frame_bitmap in debug_endline "IDESC"; eGifPutImageDesc oc { desc_left = frame.frame_left; desc_top = frame.frame_top; desc_width = bmp.width; desc_height = bmp.height; desc_interlace = interlace; desc_colormap = bmp.colormap.map; }; let interlace_writer () = let rec loop src dest dest_step = if dest >= bmp.height then src else begin eGifPutLine oc (Index8.get_scanline bmp dest); loop (src + 1) (dest + dest_step) dest_step end in let src_1 = loop 0 0 8 in let src_2 = loop src_1 4 8 in let src_3 = loop src_2 2 4 in ignore (loop src_3 1 2) in let normal_writer () = for y = 0 to bmp.height - 1 do eGifPutLine oc (Index8.get_scanline bmp y) done in debug_endline "IMAGE"; if interlace then interlace_writer () else normal_writer () ) sequence.frames; eGifCloseFile oc with | Failure s as e -> debug_endline ("ERROR " ^ s); eGifCloseFile oc; raise e;; let save_image name opts image = match image with | Index8 bmp -> save name opts { screen_width = bmp.width; screen_height = bmp.height; screen_colormap = bmp.colormap; frames = [ { frame_left = 0; frame_top = 0; frame_bitmap = bmp; frame_extensions = []; (* not implemented *) frame_delay = 0; }; ]; loops = 0; } | _ -> raise Wrong_image_type;; let check_header filename = let len = 10 in let ic = open_in_bin filename in try let str = Bytes.create len in really_input ic str 0 len; close_in ic; match String.sub str 0 6 with | "GIF87a" | "GIF89a" -> { header_width = int_of_char str.[6] + int_of_char str.[7] * 256; header_height = int_of_char str.[8] + int_of_char str.[9] * 256; header_infos = []; } | _ -> raise Wrong_file_type with | _ -> close_in ic; raise Wrong_file_type;; add_methods Gif { check_header = check_header; load = Some load_first; save = Some save_image; load_sequence = Some load_sequence; save_sequence = None; };; camlspotter-camlimages-e471b3c4470d/src/gif.mli0000644000000000000000000000641312405272062017435 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: gif.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) (** High level interfaces *) type gif_extension = | GifComment of string list | GifGraphics of string list | GifPlaintext of string list | GifApplication of string list | GifOtherExt of int * string list;; type gif_frame = { frame_left : int; frame_top : int; frame_bitmap : Index8.t; mutable frame_extensions : gif_extension list; frame_delay : int; };; type gif_sequence = { screen_width : int; screen_height : int; screen_colormap : Color.rgb Color.map; frames : gif_frame list; loops : int; };; val check_header : string -> Images.header;; (** Checks the file header *) val load : string -> Images.load_option list -> gif_sequence (** Loads a gif image sequence *) val load_sequence : string -> Images.load_option list -> Images.sequence (** Loads a gif image sequence, but to more general type *) val load_first : string -> Images.load_option list -> Images.t (** Loads the first frame of a gif image sequence. *) val save : string -> Images.save_option list -> gif_sequence -> unit (** Saves a gif image sequence *) val save_image : string -> Images.save_option list -> Images.t -> unit (** Saves an image as a gif file with only one frame *) (*** Below they are all low level interfaces *) type in_channel;; type out_channel;; type screen_info = { s_width : int; s_height : int; s_color_resolution : int; s_back_ground_color : int; s_colormap : Color.rgb array; };; type record_type = | Undefined | Screen_desc | Image_desc | Extension | Terminate;; type gif_desc = { desc_left : int; desc_top : int; desc_width : int; desc_height : int; desc_interlace : bool; desc_colormap : Color.rgb array; };; val dGifOpenFileName : string -> screen_info * in_channel;; val dGifCloseFile : in_channel -> unit;; val dGifGetRecordType : in_channel -> record_type;; val dGifGetImageDesc : in_channel -> gif_desc;; val dGifGetLine : in_channel -> string;; val dGifGetExtension : in_channel -> int * string list;; val eGifOpenFileName : string -> out_channel;; val eGifCloseFile : out_channel -> unit;; val eGifPutScreenDesc : out_channel ->screen_info -> unit;; val eGifPutImageDesc : out_channel -> gif_desc -> unit;; val eGifPutLine : out_channel -> string -> unit;; val eGifPutExtension : out_channel -> int * string list -> unit;; camlspotter-camlimages-e471b3c4470d/src/gif_na.c0000644000000000000000000000355212405272062017555 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #include #include #include #include value Val_GifColorType(){ failwith("unsupported"); } value Val_ColorMapObject(){ failwith("unsupported"); } value Val_GifImageDesc(){ failwith("unsupported"); } value Val_ScreenInfo(){ failwith("unsupported"); } value dGifOpenFileName(){ failwith("unsupported"); } value dGifCloseFile(){ failwith("unsupported"); } value dGifGetRecordType(){ failwith("unsupported"); } value dGifGetImageDesc(){ failwith("unsupported"); } value dGifGetLine(){ failwith("unsupported"); } value dGifGetExtension(){ failwith("unsupported"); } value eGifOpenFileName(){ failwith("unsupported"); } value eGifCloseFile(){ failwith("unsupported"); } value eGifPutScreenDesc(){ failwith("unsupported"); } value eGifPutImageDesc(){ failwith("unsupported"); } value eGifPutLine(){ failwith("unsupported"); } value eGifPutExtension(){ failwith("unsupported"); } camlspotter-camlimages-e471b3c4470d/src/gifread.c0000644000000000000000000001373712405272062017741 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Franois Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "oversized.h" #include #include #include // GIFLIB_MAJOR is only defined in libgif >= 4.2.0 #if !defined(GIFLIB_MAJOR) # define GIFLIB_MAJOR 4 #endif value Val_GifColorType( GifColorType *color ) { CAMLparam0(); CAMLlocal1(res); CAMLlocalN(r,3); int i; r[0] = Val_int( color->Red ); r[1] = Val_int( color->Green ); r[2] = Val_int( color->Blue ); res = alloc_small(3,0); for(i=0; i<3; i++) Field(res, i) = r[i]; #ifdef DEBUG_GIF fprintf(stderr, "Color(%d,%d,%d)\n", color->Red, color->Green, color->Blue); fflush(stderr); #endif CAMLreturn(res); } value Val_ColorMapObject( ColorMapObject *colorMap ) { CAMLparam0(); CAMLlocal1(cmap); int i; if ( colorMap != NULL ){ #ifdef DEBUG_GIF fprintf(stderr, "Colormap(%d)...\n", colorMap->ColorCount); fflush(stderr); #endif cmap = alloc_tuple(colorMap->ColorCount); for(i= 0; i< colorMap->ColorCount; i++){ Store_field(cmap,i, Val_GifColorType( &colorMap->Colors[i] )); } } else { #ifdef DEBUG_GIF fprintf(stderr, "Colormap(0)...\n"); fflush(stderr); #endif cmap = Atom(0); /* cmap = alloc_tuple(0); is WRONG!! */ } CAMLreturn(cmap); } value Val_GifImageDesc( GifImageDesc *imageDesc ) { CAMLparam0(); CAMLlocal1(res); CAMLlocalN(r,6); int i; #ifdef DEBUG_GIF fprintf(stderr, "imagedesc...\n"); fflush(stderr); #endif /* { int Len,i,j; Len = 1 << imageDesc->ColorMap->BitsPerPixel; for (i = 0; i < Len; i+=4) { for (j = 0; j < 4 && j < Len; j++) { printf("%3d: %02xh %02xh %02xh ", i + j, imageDesc->ColorMap->Colors[i + j].Red, imageDesc->ColorMap->Colors[i + j].Green, imageDesc->ColorMap->Colors[i + j].Blue); } printf("\n"); } } */ r[0] = Val_int( imageDesc->Left ); r[1] = Val_int( imageDesc->Top ); r[2] = Val_int( imageDesc->Width ); r[3] = Val_int( imageDesc->Height ); r[4] = Val_int( imageDesc->Interlace ); r[5] = Val_ColorMapObject( imageDesc->ColorMap ); res = alloc_small(6,0); for(i=0; i<6; i++) Field(res, i) = r[i]; CAMLreturn(res); } value Val_ScreenInfo( GifFileType *GifFile ) { CAMLparam0(); CAMLlocal1(res); CAMLlocalN(r,5); int i; r[0] = Val_int(GifFile->SWidth); r[1] = Val_int(GifFile->SHeight); r[2] = Val_int(GifFile->SColorResolution); r[3] = Val_int(GifFile->SBackGroundColor); r[4] = Val_ColorMapObject(GifFile->SColorMap); res = alloc_small(5,0); for(i=0; i<5; i++) Field(res, i) = r[i]; CAMLreturn(res); } value dGifOpenFileName( value name ) { CAMLparam1(name); CAMLlocal1(res); CAMLlocalN(r,2); GifFileType *GifFile; int i; #if (GIFLIB_MAJOR <= 4) GifFile = DGifOpenFileName( String_val(name) ); #else GifFile = DGifOpenFileName( String_val(name), NULL); #endif if(GifFile == NULL){ failwith("DGifOpenFileName"); } r[0] = Val_ScreenInfo( GifFile ); r[1] = (value) GifFile; res = alloc_small(2,0); for(i=0; i<2; i++) Field(res, i) = r[i]; CAMLreturn(res); } void dGifCloseFile( value hdl ) { CAMLparam1(hdl); /* For the bug libungif/giflib 4.1.0 */ /* This may add a new memory leak, but it is better than having segmentation faults */ ((GifFileType *)hdl)->Image.ColorMap = NULL; #if (GIFLIB_MAJOR <= 4) DGifCloseFile( (GifFileType *) hdl); #else DGifCloseFile( (GifFileType *) hdl, NULL ); #endif CAMLreturn0; } value dGifGetRecordType( value hdl ) { CAMLparam1(hdl); GifRecordType RecordType; if (DGifGetRecordType((GifFileType*) hdl, &RecordType) == GIF_ERROR) { failwith("DGifGetRecordType"); } CAMLreturn(Val_int(RecordType)); } value dGifGetImageDesc( value hdl ) { CAMLparam1(hdl); if (DGifGetImageDesc( (GifFileType*) hdl ) == GIF_ERROR){ failwith("DGIFGetImageDesc"); } CAMLreturn(Val_GifImageDesc( &((GifFileType*) hdl)-> Image )); } value dGifGetLine( value hdl ) { CAMLparam1(hdl); CAMLlocal1(buf); GifFileType *GifFile = (GifFileType*) hdl; if( oversized( GifFile->Image.Width, sizeof(GifPixelType) ) ){ failwith_oversized("gif"); } buf = alloc_string( GifFile->Image.Width * sizeof(GifPixelType) ); if( DGifGetLine(GifFile, String_val(buf), GifFile->Image.Width ) == GIF_ERROR ){ // PrintGifError (); failwith("DGifGetLine"); } CAMLreturn(buf); } value dGifGetExtension( value hdl ) { CAMLparam1(hdl); CAMLlocal3(ext,exts,res); CAMLlocal1(newres); GifFileType *GifFile = (GifFileType*) hdl; int func; GifByteType *extData; exts = Val_int(0); if (DGifGetExtension(GifFile,&func, &extData) == GIF_ERROR){ failwith("DGifGetExtension"); } while( extData != NULL ){ ext= alloc_string(extData[0]); memcpy(String_val(ext), &extData[1], extData[0]); newres = alloc_small(2,0); Field(newres, 0)= ext; Field(newres, 1)= exts; exts= newres; DGifGetExtensionNext(GifFile, &extData); } res = alloc_small(2,0); Field(res,0) = Val_int(func); Field(res,1) = exts; CAMLreturn(res); } camlspotter-camlimages-e471b3c4470d/src/gifwrite.c0000644000000000000000000001167612405272062020160 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Franois Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include // GIFLIB_MAJOR is only defined in libgif >= 4.2.0 #if !defined(GIFLIB_MAJOR) # define GIFLIB_MAJOR 4 #endif int list_length( value list ) { CAMLparam1(list); CAMLlocal1(l); register int length = 0; for(l = list; l != Val_int(0); l = Field(l,1)){ length ++; } CAMLreturn(length); } ColorMapObject *ColorMapObject_val( value cmap ) { // no caml allocation inside. int len; int i; ColorMapObject *cmapobj; if( cmap == Atom(0) ){ return NULL; } len = Wosize_val(cmap); /* fprintf(stderr, "Creating map with length = %d ...\n", len); fflush(stderr); */ #if (GIFLIB_MAJOR == 4) cmapobj = MakeMapObject( len, NULL ); #else cmapobj = GifMakeMapObject( len, NULL ); #endif for(i=0; i< len; i++){ cmapobj->Colors[i].Red = Int_val(Field(Field(cmap,i),0)); cmapobj->Colors[i].Green = Int_val(Field(Field(cmap,i),1)); cmapobj->Colors[i].Blue = Int_val(Field(Field(cmap,i),2)); } return cmapobj; } value eGifOpenFileName( name ) value name; { CAMLparam1(name); GifFileType *GifFileOut; #if (GIFLIB_MAJOR <= 4) GifFileOut = EGifOpenFileName( String_val( name ), 0 ); #else GifFileOut = EGifOpenFileName( String_val( name ), 0, NULL ); #endif if (GifFileOut == NULL) { failwith("EGifOpenFileName"); } /* gcc -fwritable-strings is required to compile libungif */ #if GIFLIB_BUG_FIXED EGifSetGifVersion("89a"); #endif CAMLreturn((value)GifFileOut); } void eGifCloseFile( value hdl ) { CAMLparam1(hdl); /* For the bug libungif/giflib 4.1.0 */ /* This may add a new memory leak, but it is better than having segmentation faults */ ((GifFileType *)hdl)->Image.ColorMap = NULL; #if (GIFLIB_MAJOR <= 4) EGifCloseFile( (GifFileType *) hdl ); #else EGifCloseFile( (GifFileType *) hdl, NULL ); #endif CAMLreturn0; } void eGifPutScreenDesc( value oc, value sdesc ) { CAMLparam2(oc,sdesc); GifFileType *GifFileOut = (GifFileType*) oc; if ( EGifPutScreenDesc(GifFileOut, Int_val(Field(sdesc, 0)), Int_val(Field(sdesc, 1)), Int_val(Field(sdesc, 2)), Int_val(Field(sdesc, 3)), ColorMapObject_val( Field(sdesc, 4) )) == GIF_ERROR){ failwith("EGifPutScreenDesc"); } CAMLreturn0; } void eGifPutImageDesc( value oc, value idesc ) { CAMLparam2(oc,idesc); GifFileType *GifFileOut = (GifFileType*) oc; if ( EGifPutImageDesc(GifFileOut, Int_val(Field(idesc, 0)), Int_val(Field(idesc, 1)), Int_val(Field(idesc, 2)), Int_val(Field(idesc, 3)), Int_val(Field(idesc, 4)), ColorMapObject_val( Field(idesc, 5) )) == GIF_ERROR){ failwith("EGifPutImageDesc"); } CAMLreturn0; } void eGifPutLine( value oc, value buf ) { CAMLparam2(oc,buf); GifFileType *GifFileOut = (GifFileType*) oc; if ( EGifPutLine(GifFileOut, String_val(buf), GifFileOut->Image.Width) == GIF_ERROR ){ // PrintGifError (); failwith("EGifPutLine"); } CAMLreturn0; } void eGifPutExtension( value oc, value ext ) { CAMLparam2(oc,ext); CAMLlocal1(l); GifFileType *GifFileOut = (GifFileType*) oc; int extCode; int extLen; char **extension; int i; extCode = Int_val(Field(ext,0)); extLen = list_length( Field(ext,1) ); if( (extension = malloc(sizeof(char*) * extLen)) == NULL ){ failwith("EGifPutExtension"); } for( i=0, l= Field(ext,1); i 255 ){ failwith("EGifPutExtension: strlen > 255"); } if( (str = malloc(len + 1)) == NULL ){ failwith("EGifPutExtension"); } str[0] = len; memcpy(str+1, String_val(Field(l,0)), len); extension[i] = str; } if( EGifPutExtension(GifFileOut, extCode, extLen, extension) == GIF_ERROR ){ for(i=0; i let w = bitmap.Index8.width and h = bitmap.Index8.height and colormap = bitmap.Index8.colormap.map in let cmap = Array.map (fun {r = r; g = g; b = b} -> Graphics.rgb r g b) colormap in if bitmap.Index8.transparent <> -1 then cmap.(bitmap.Index8.transparent) <- transp; Array.init h (fun i -> Array.init w (fun j -> cmap.(Index8.unsafe_get bitmap j i))) | Index16 bitmap -> let w = bitmap.Index16.width and h = bitmap.Index16.height and colormap = bitmap.Index16.colormap.map in let cmap = Array.map (fun {r = r; g = g; b = b} -> rgb r g b) colormap in if bitmap.Index16.transparent <> -1 then cmap.(bitmap.Index16.transparent) <- transp; Array.init h (fun i -> Array.init w (fun j -> cmap.(Index16.unsafe_get bitmap j i))) | Rgb24 bitmap -> let w = bitmap.Rgb24.width and h = bitmap.Rgb24.height in Array.init h (fun i -> Array.init w (fun j -> let {r = r; g = g; b = b} = Rgb24.unsafe_get bitmap j i in rgb r g b)) | Rgba32 _ | Cmyk32 _ -> failwith "RGBA and CMYK not supported" ;; let of_image img = Graphics.make_image (array_of_image img);; let draw_image img x y = Graphics.draw_image (of_image img) x y;; let image_of grpimg = let rgb_of_color color = { r = (color lsr 16) land 0xFF; g = (color lsr 8) land 0xFF; b = color land 0xFF; } in let array = Graphics.dump_image grpimg in let height = Array.length array in let width = Array.length array.(0) in let img = Rgb24.create width height in for y = 0 to height - 1 do for x = 0 to width - 1 do Rgb24.unsafe_set img x y (rgb_of_color array.(y).(x)) done done; img ;; let get_image x y w h = image_of (Graphics.get_image x y w h);; camlspotter-camlimages-e471b3c4470d/src/graphic_image.mli0000644000000000000000000000336312405272062021450 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: graphic_image.mli,v 1.2 2009/02/08 15:00:49 weis Exp $ *) (** Interface of images from this library to images of the Caml [Graphics] library. *) val draw_image : Images.t -> int -> int -> unit;; (** Draw an [Images.t] value into the graphic window. *) val get_image : int -> int -> int -> int -> Rgb24.t (** [get_image x y w h] Capture the contents of a rectangle of the graphic window with lower left corner at [x,y], width [w] and height [h] *) (** lower interface *) val array_of_image : Images.t -> Graphics.color array array;; (** Convert an [Images.t] value to an array of colors. *) val of_image : Images.t -> Graphics.image;; (** Convert an [Images.t] value to a graphic image. *) val image_of : Graphics.image -> Rgb24.t;; (** Convert an [Graphics.image] value to *our* image *) camlspotter-camlimages-e471b3c4470d/src/image_intf.mli0000644000000000000000000001371612405272062020776 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franis Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: image_intf.mli,v 1.2 2009/07/04 03:39:28 furuse Exp $ *) (** Color to bytes encoder/decoder module type *) module type ENCODE = sig type t val bytes_per_pixel : int val get : bytes -> int -> t val set : bytes -> int -> t -> unit val make : t -> bytes end;; (** Low level image module type *) module type RAWIMAGE = sig module Encode : ENCODE type elt and bitmap and t = { width : int; height : int; bitmap : bitmap; } val width : t -> int val height : t -> int val dump : t -> bytes val create_with : int -> int -> bytes -> t val create_with_scanlines : int -> int -> bytes array -> t val create : int -> int -> t val make : int -> int -> elt -> t val unsafe_access : t -> int -> int -> bytes * int val get_strip : t -> int -> int -> int -> bytes val set_strip : t -> int -> int -> int -> bytes -> unit val get_scanline : t -> int -> bytes val get_scanline_ptr : t -> (int -> (bytes * int) * int) option val set_scanline : t -> int -> bytes -> unit val unsafe_get : t -> int -> int -> elt val unsafe_set : t -> int -> int -> elt -> unit val get : t -> int -> int -> elt val set : t -> int -> int -> elt -> unit val destroy : t -> unit val copy : t -> t val sub : t -> int -> int -> int -> int -> t val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit val map : (elt -> elt -> elt) -> t -> int -> int -> t -> int -> int -> int -> int -> unit val blocks : t -> int * int val dump_block : t -> int -> int -> Bitmap.Block.t end;; (** low image container module type *) module type CONTAINER = sig type container type rawimage val rawimage : container -> rawimage val create_default : int -> int -> rawimage -> container val create_duplicate : container -> int -> int -> rawimage -> container end;; module type IMAGE = sig type t type elt (** Image creation *) val create : int -> int -> t (** [create w h] creates an image with a size [w]x[h]. The content is the image is not initialized. *) val make : int -> int -> elt -> t (** [make w h c] creates an image with a size [w]x[h]. The content is the image is initialized to the color [c]. *) val destroy : t -> unit (** [destroy t] explicitly frees the image content of [t]. If you do not use bitmap swap files, you do not need to call this function, since GC will free unreachable image data automatically. Read bitmap.mli for more details. *) (** Pixel access *) val get : t -> int -> int -> elt (** [get t x y] gets image pixel of [t] at [x],[y]. If [x],[y] is outside of the image size, Images.Out_of_image exception is raised. *) val set : t -> int -> int -> elt -> unit (** [set t x y c] sets image pixel of [t] at [x],[y] by the color [c]. If [x],[y] is outside of the image size, Images.Out_of_image exception is raised. *) val unsafe_get : t -> int -> int -> elt val unsafe_set : t -> int -> int -> elt -> unit (** Unsafe versions of [get] and [set]. It does not perform any image boundary check. If the coordinates are out of the given image, the result is undefined. Use carefully. *) (** Image copy *) val copy : t -> t (** [copy t] duplicates the image [t]. *) val sub : t -> int -> int -> int -> int -> t (** [sub t x y w h] duplicates a subimage of [t] of size [w]x[h], whose origin (0,0) is at (x,y) of [t]. *) val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit (** [blit src x y dst x' y' w h] copies rectangular area of [src] at [x],[y] with size [w]x[h], to an image [dst]. The origin of the subimage comes at [x'],[y'] of [dst]. *) val map : (elt -> elt -> elt) -> t -> int -> int -> t -> int -> int -> int -> int -> unit (** [map f src x y dst x' y' w h] maps pixels of the rectangular area of [src] at [x],[y] with size [w]x[h], to an image [dst], using color conversion function [f]. The origin of the subimage comes at [x'],[y'] of [dst]. *) (** functions for internal use *) val dump : t -> bytes val unsafe_access : t -> int -> int -> bytes * int val get_strip : t -> int -> int -> int -> bytes val set_strip : t -> int -> int -> int -> bytes -> unit val get_scanline : t -> int -> bytes val get_scanline_ptr : t -> (int -> (bytes * int) * int) option val set_scanline : t -> int -> bytes -> unit val blocks : t -> int * int val dump_block : t -> int -> int -> Bitmap.Block.t end;; module type CONTAINER_INDEXED = sig type container type rawimage type mapelt val rawimage : container -> rawimage val create_default : int -> int -> rawimage -> container val create_duplicate : container -> int -> int -> rawimage -> container val colormap : container -> mapelt Color.map end;; module type IMAGEINDEXED = sig include IMAGE type mapelt (** Pixel access *) val get_color : t -> int -> int -> mapelt (** [get_color x y] returns image pixel color value of [t] at [x],[y]. If [x],[y] is outside of the image size, Images.Out_of_image exception is raised. *) val unsafe_get_color : t -> int -> int -> mapelt end;; camlspotter-camlimages-e471b3c4470d/src/imagegdk.ml0000644000000000000000000000506612405272062020272 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: imagegdk.ml,v 1.2 2009/03/01 09:49:53 furuse Exp $*) let initialized = ref None ;; let try_initialize () = if !initialized = None then begin Gdk.Rgb.init (); initialized := Some (Gdk.Rgb.get_visual (), Gdk.Rgb.get_cmap ()) end ;; open OImages let draw (obj : #GDraw.drawable) ?x ?y ?dither image = try_initialize (); match tag image, image#blocks with | Rgb24 image, (1,1) -> let string = fst (image#unsafe_access 0 0) in let buf = Gpointer.region_of_string string in obj#put_rgb_data ~width: image#width ~height: image#height ?x ?y ?dither ~row_stride:(image#width * 3) buf | _ -> failwith "Gdkrgb.draw" ;; let to_pixbuf image = match tag image, image#blocks with | Rgb24 image, (1,1) -> let string = fst (image#unsafe_access 0 0) in let buf = Gpointer.region_of_string string in (* string may be GC'ed here? *) let pixbuf = GdkPixbuf.from_data ~width: image#width ~height: image#height ~bits: 8 ~rowstride:(image#width * 3) ~has_alpha: false buf in pixbuf | Rgb24 image, (w,h) -> let dest = GdkPixbuf.create ~width:image#width ~height:image#height ~bits: 8 ~has_alpha: false () in for x = 0 to w - 1 do for y = 0 to h - 1 do let blk = image#dump_block x y in let width = blk.Bitmap.Block.width in let height = blk.Bitmap.Block.height in let buf = Gpointer.region_of_string blk.Bitmap.Block.dump in let pixbuf = GdkPixbuf.from_data ~width ~height ~bits: 8 ~rowstride:(width * 3) ~has_alpha: false buf in GdkPixbuf.copy_area ~dest ~dest_x: blk.Bitmap.Block.x ~dest_y: blk.Bitmap.Block.y ~width ~height pixbuf done done; dest | Cmyk32 _, _ -> failwith "Gdkrgb.draw cmyk32" | _ -> failwith "Gdkrgb.draw" ;; camlspotter-camlimages-e471b3c4470d/src/imagegdk.mli0000644000000000000000000000172712405272062020443 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) val draw : #GDraw.drawable -> ?x:int -> ?y:int -> ?dither:Gdk.Tags.rgb_dither -> OImages.oimage -> unit val to_pixbuf : OImages.oimage -> GdkPixbuf.pixbuf camlspotter-camlimages-e471b3c4470d/src/images.ml0000644000000000000000000002642312405272062017767 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: images.ml,v 1.3 2008/06/16 22:35:42 furuse Exp $ *) (* The image data structure definition. *) (**************************************************************** Exceptions *) exception Out_of_image;; (* exception for illegal point access *) exception Wrong_image_type;; (* exception for illegal internal image type *) exception Wrong_file_type;; (* exception for unsupported image FILE format *) (* Update region.error *) Region.error := (fun () -> raise Out_of_image);; (************************************************************* Generic image *) type t = | Index8 of Index8.t | Rgb24 of Rgb24.t | Index16 of Index16.t | Rgba32 of Rgba32.t | Cmyk32 of Cmyk32.t;; (* Generic image type *) type sequence = { seq_width: int; seq_height: int; seq_frames: frame list; seq_loops: int } and frame = { frame_left: int; frame_top: int; frame_image: t; frame_delay: int (* mili secs *) };; (******************************************************************** Colors *) (* Colors: the copies of color.mli *) type rgb = Color.rgb = { mutable r: int; mutable g: int; mutable b: int };; type rgba = Color.rgba = { color: rgb; mutable alpha: int };; type cmyk = Color.cmyk = { mutable c : int; mutable m : int; mutable y : int; mutable k : int };; type 'a map = 'a Color.map = { mutable max: int; (* maximum number allowed in the color map (-1 = unlimited) *) mutable map: 'a array };; (********************************************************* Image file format *) (* Image formats *) type format = | Gif | Bmp | Jpeg | Tiff | Png | Xpm | Ppm | Ps;; (************************************************ Image file name extensions *) let extension = function | Gif -> "gif" | Bmp -> "bmp" | Jpeg -> "jpg" | Tiff -> "tif" | Png -> "png" | Xpm -> "xpm" | Ppm -> "ppm" | Ps -> "eps";; let get_extension s = try let dotpos = String.rindex s '.' in String.sub s 0 dotpos, String.sub s (dotpos + 1) (String.length s - dotpos - 1) with | _ -> s, "";; let guess_extension s = let s = String.lowercase s in match s with | "gif" -> Gif | "bmp" -> Bmp | "jpeg" | "jpg" -> Jpeg | "tiff" | "tif" -> Tiff | "png" -> Png | "xpm" -> Xpm | "ppm" | "pgm" | "pbm" -> Ppm | "eps" | "ps" | "epsf" | "epsi" -> Ps | _ -> raise Not_found;; let guess_format file = guess_extension (snd (get_extension file));; (******************************************** Image file header informations *) type colormodel = Info.colormodel = | Gray | RGB | Index | GrayA | RGBA;; (* Infos attached to bitmaps *) type info = Info.info = | Info_DPI of float (* dot per inch *) | Info_BigEndian | Info_LittleEndian (* endianness of image file *) | Info_ColorModel of colormodel (* color model of image file *) | Info_Depth of int (* Image bit depth *) | Info_Corrupted (* For corrupted PNG files *);; (* Info query *) let rec dpi = function | [] -> None | Info_DPI dpi :: _ -> Some dpi | _ :: xs -> dpi xs;; (* Image file header *) type header = { header_width : int; header_height : int; header_infos : info list };; (**************************************************** Image file I/O options *) (* Load options *) type load_option = | Load_Progress of (float -> unit) (* For progress meters *) | Load_Resolution of float * float (* Pixel/Inch for rasterization of PS *) ;; (* Save options *) type save_option = | Save_Quality of int (* Save quality for Jpeg compression *) | Save_Progress of (float -> unit) (* For progress meters *) | Save_Interlace (* Interlaced Gif *);; (* Option queries *) let rec load_progress = function | [] -> None | Load_Progress p :: _ -> Some p | _ :: xs -> load_progress xs;; let rec load_resolution = function | [] -> None | Load_Resolution (px, py) :: _ -> Some (px, py) | _ :: xs -> load_resolution xs;; let rec save_progress = function | [] -> None | Save_Progress p :: _ -> Some p | _ :: xs -> save_progress xs;; let rec save_interlace = function | [] -> false | Save_Interlace :: _ -> true | _ :: xs -> save_interlace xs;; let rec save_quality = function | [] -> None | Save_Quality q :: _ -> Some q | _ :: xs -> save_quality xs;; (******************************** The type for methods of image file formats *) type format_methods = { check_header: (string -> header); load: (string -> load_option list -> t) option; save: (string -> save_option list -> t -> unit) option; load_sequence: (string -> load_option list -> sequence) option; save_sequence: (string -> save_option list -> sequence -> unit) option; };; let methods_list = ref [];; let file_format filename = let result = ref None in try List.iter (fun (format, methods) -> try result := Some (format, methods.check_header filename); raise Exit with | Wrong_file_type -> ()) !methods_list; raise Wrong_file_type with | Exit -> match !result with | Some r -> r | None -> assert false;; (************************************************ Generic image manupilation *) let add_methods format methods = methods_list := (format, methods) :: !methods_list let load filename load_options = let result = ref None in try List.iter (fun (_format, methods) -> try let _ = methods.check_header filename in match methods.load with Some load -> result := Some (load filename load_options); raise Exit | None -> raise Wrong_file_type with | Wrong_file_type -> ()) !methods_list; raise Wrong_file_type with | Exit -> match !result with | Some r -> r | None -> assert false;; let save filename formatopt save_options t = try let format = match formatopt with | Some format -> format | None -> guess_format filename in let methods = List.assoc format !methods_list in match methods.save with Some save -> save filename save_options t | None -> raise Wrong_file_type with | Not_found -> raise Wrong_file_type;; let size img = match img with | Index8 bmp -> bmp.Index8.width, bmp.Index8.height | Index16 bmp -> bmp.Index16.width, bmp.Index16.height | Rgb24 bmp -> bmp.Rgb24.width, bmp.Rgb24.height | Rgba32 bmp -> bmp.Rgba32.width, bmp.Rgba32.height | Cmyk32 bmp -> bmp.Cmyk32.width, bmp.Cmyk32.height;; let width img = match img with | Index8 bmp -> bmp.Index8.width | Index16 bmp -> bmp.Index16.width | Rgb24 bmp -> bmp.Rgb24.width | Rgba32 bmp -> bmp.Rgba32.width | Cmyk32 bmp -> bmp.Cmyk32.width;; let height img = match img with | Index8 bmp -> bmp.Index8.height | Index16 bmp -> bmp.Index16.height | Rgb24 bmp -> bmp.Rgb24.height | Rgba32 bmp -> bmp.Rgba32.height | Cmyk32 bmp -> bmp.Cmyk32.height;; let destroy img = match img with | Index8 bmp -> Index8.destroy bmp | Rgb24 bmp -> Rgb24.destroy bmp | Index16 bmp -> Index16.destroy bmp | Rgba32 bmp -> Rgba32.destroy bmp | Cmyk32 bmp -> Cmyk32.destroy bmp;; let sub img x y w h = let f = match img with | Index8 img -> (fun x y w h -> Index8 (Index8.sub img x y w h)) | Rgb24 img -> (fun x y w h -> Rgb24 (Rgb24.sub img x y w h)) | Index16 img -> (fun x y w h -> Index16 (Index16.sub img x y w h)) | Rgba32 img -> (fun x y w h -> Rgba32 (Rgba32.sub img x y w h)) | Cmyk32 img -> (fun x y w h -> Cmyk32 (Cmyk32.sub img x y w h)) in f x y w h;; let copy img = sub img 0 0 (width img) (height img);; let blit src sx sy dst dx dy = let f = match src, dst with | Index8 src, Index8 dst -> (fun sx sy -> Index8.blit src sx sy dst) | Rgb24 src, Rgb24 dst -> (fun sx sy -> Rgb24.blit src sx sy dst) | Index16 src, Index16 dst -> (fun sx sy -> Index16.blit src sx sy dst) | Rgba32 src, Rgba32 dst -> (fun sx sy -> Rgba32.blit src sx sy dst) | Cmyk32 src, Cmyk32 dst -> (fun sx sy -> Cmyk32.blit src sx sy dst) | _ -> raise (Invalid_argument "Images.blit") in f sx sy dx dy;; (* image sequences *) let make_sequence t = { seq_width = width t; seq_height = height t; seq_frames = [ { frame_left= 0; frame_top= 0; frame_image= t; frame_delay= 0 } ]; seq_loops = 0 };; let unoptimize_sequence seq = (* sequence must be non-empty *) let coe = function | Index8 t -> Rgba32 (Index8.to_rgba32 t) | Index16 t -> Rgba32 (Index16.to_rgba32 t) | t -> t in { seq with seq_frames = begin let _, result = let head_frame = List.hd seq.seq_frames in List.fold_left (fun (previmage, result) frame -> let newimage = copy previmage in let src = coe frame.frame_image in begin match src, newimage with | Rgb24 _, _ | Cmyk32 _, _ -> (* non transparent *) blit src 0 0 newimage frame.frame_left frame.frame_top (width src) (height src) | Rgba32 src32, Rgba32 dst32 -> (* transparent *) Rgba32.map Color.Rgba.merge src32 0 0 dst32 frame.frame_left frame.frame_top (width src) (height src) | _ -> assert false end; (newimage, { frame_left = 0; frame_top = 0; frame_image = newimage; frame_delay = frame.frame_delay } :: result)) (coe head_frame.frame_image, [head_frame]) (List.tl seq.seq_frames) in List.rev result end };; let load_sequence filename load_options = let result = ref None in try List.iter (fun (_format, methods) -> try let _ = methods.check_header filename in match methods.load_sequence, methods.load with | Some load, _ -> result := Some (load filename load_options); raise Exit | None, Some load -> result := Some (make_sequence (load filename load_options)); | None, None -> raise Wrong_file_type with | Wrong_file_type -> ()) !methods_list; raise Wrong_file_type with | Exit -> match !result with | Some r -> r | None -> assert false;; let save_sequence filename formatopt save_options seq = try let format = match formatopt with | Some format -> format | None -> guess_format filename in let methods = List.assoc format !methods_list in match methods.save_sequence with Some save -> save filename save_options seq | None -> raise Wrong_file_type with | Not_found -> raise Wrong_file_type;; let blocks img = match img with | Index8 img -> Index8.blocks img | Rgb24 img -> Rgb24.blocks img | Index16 img -> Index16.blocks img | Rgba32 img -> Rgba32.blocks img | Cmyk32 img -> Cmyk32.blocks img camlspotter-camlimages-e471b3c4470d/src/images.mli0000644000000000000000000001652412405272062020141 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: images.mli,v 1.3 2009/02/08 15:04:20 weis Exp $ *) (** The image data structure definition. *) (**************************************************************** Exceptions *) exception Out_of_image;; (** Exception for illegal point access *) exception Wrong_image_type;; (** Exception for illegal internal image type *) exception Wrong_file_type;; (** Exception for unsupported image FILE format *) (************************************************************* Generic image *) type t = | Index8 of Index8.t | Rgb24 of Rgb24.t | Index16 of Index16.t | Rgba32 of Rgba32.t | Cmyk32 of Cmyk32.t;; (** Generic image type *) type sequence = { seq_width: int; seq_height: int; seq_frames: frame list; seq_loops: int } and frame = { frame_left: int; frame_top: int; frame_image: t; frame_delay: int (* mili secs *) };; (******************************************************************** Colors *) (** Colors: the copies of color.mli *) type rgb = Color.rgb = { mutable r: int; mutable g: int; mutable b: int };; type rgba = Color.rgba = { color: rgb; mutable alpha: int };; type cmyk = Color.cmyk = { mutable c : int; mutable m : int; mutable y : int; mutable k : int };; type 'a map = 'a Color.map = { mutable max: int; (* maximum number allowed in the color map (-1 = unlimited) *) mutable map: 'a array };; (********************************************************* Image file format *) (** Image formats *) type format = | Gif | Bmp | Jpeg | Tiff | Png | Xpm | Ppm | Ps;; (************************************************ Image file name extensions *) (** Functions for filename extensions *) val extension : format -> string;; (** returns the corresponding extension "gif", "bmp" etc. for given format *) val guess_format : string -> format (** returns the image format guessed from the file extension of a given file name *) (** Lower interface *) val get_extension : string -> string * string;; val guess_extension : string -> format;; (******************************************** Image file header informations *) type colormodel = Info.colormodel = | Gray | RGB | Index | GrayA | RGBA;; (** Infos attached to bitmaps *) type info = Info.info = | Info_DPI of float (** dot per inch *) | Info_BigEndian | Info_LittleEndian (** endianness of image file *) | Info_ColorModel of colormodel (** color model of image file *) | Info_Depth of int (** Image bit depth *) | Info_Corrupted (** For corrupted PNG files *);; (** Info query *) val dpi : info list -> float option;; (** Image file header *) type header = { header_width : int; header_height : int; header_infos : info list };; val file_format : string -> format * header (** [file_format filename] reads the header of image file [filename] and returns its format and some useful information found in the header (ex. width, height). [file_format] does not read image contents, but just quickly returns file header information. [file_format] does not depend on any external libraries *) (**************************************************** Image file I/O options *) (** Load options *) type load_option = | Load_Progress of (float -> unit) (** For progress meters *) | Load_Resolution of float * float (** Pixel/Inch for rasterization of PS *) ;; (** Save options *) type save_option = | Save_Quality of int (** Save quality for Jpeg compression *) | Save_Progress of (float -> unit) (** For progress meters *) | Save_Interlace (** Interlaced Gif *);; (** Option queries *) val load_progress : load_option list -> (float -> unit) option;; val load_resolution : load_option list -> (float * float) option;; val save_progress : save_option list -> (float -> unit) option;; val save_interlace : save_option list -> bool;; val save_quality : save_option list -> int option;; (******************************** The type for methods of image file formats *) type format_methods = { check_header: (string -> header); load: (string -> load_option list -> t) option; save: (string -> save_option list -> t -> unit) option; load_sequence: (string -> load_option list -> sequence) option; save_sequence: (string -> save_option list -> sequence -> unit) option; };; (************************************************ Generic image manupilation *) val add_methods : format -> format_methods -> unit (** If you write new drivers for some image format, use this function to register their loading/saving functions into the libaray *) val load : string -> load_option list -> t;; (** [load filename options] read the header of an image file [filename], loads the image by calling corresponding loading method, and returns it. If the file format is not supported by the library, a Wrong_file_type exception will be raised. You can specify loading options in [options] such as progressive meter function. *) val save : string -> format option -> save_option list -> t -> unit;; (** [save filename formatopt options image] saves [image] into a file [filename]. The image format can be specified by [formatopt]. If [formatopt] is [Some format], then [format] is used. If it is [None], then the image format is guessed from [filename]. You can specify some saving parameters [options]. Some options are specific to some image formats and do not work with the others. *) val load_sequence : string -> load_option list -> sequence;; val save_sequence : string -> format option -> save_option list -> sequence -> unit;; val unoptimize_sequence : sequence -> sequence;; val size : t -> int * int;; (** Returns size (width and height) of image *) val destroy : t -> unit;; (** Free the image. If you turn on image swapping (see bitmap.mli), you can call this function explicitly to tell the library that this image is no longer used. (This is not required, though.) *) val sub : t -> int -> int -> int -> int -> t;; (** [sub dst x y width height] returns sub-bitmap of [dst], at (x, y) - (x + width - 1, y + height - 1). *) val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit;; (** [blit src sx sy dst dx dy width height] copies the rectangle region of [src] at (sx, sy) - (sx + width - 1, sy + height - 1) to [dst], at (dx, dy) - (dx + width - 1, dy + height - 1). *) val blocks : t -> int * int;; camlspotter-camlimages-e471b3c4470d/src/index16.ml0000644000000000000000000001152312405272062017773 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: index16.ml,v 1.4 2009/07/04 03:39:28 furuse Exp $*) open Util module E = struct type t = int let bytes_per_pixel = 2 let get str pos = int_of_char str.[pos ] * 256 + int_of_char str.[pos + 1] let set str pos t = str << pos & char_of_int (t / 256); str << pos + 1 & char_of_int (t mod 256) let make t = let str = Bytes.create bytes_per_pixel in set str 0 t; str end;; module RI = Genimage.MakeRawImage(E);; type rawimage = RI.t;; type elt = int;; type t = { width : int; height : int; rawimage : RI.t; mutable infos : Info.info list; mutable colormap : Color.rgb Color.map; mutable transparent : int };; module C = struct open Color type rawimage = RI.t type container = t type mapelt = Color.rgb let rawimage x = x.rawimage let create_default width height rawimage = { width = width; height = height; rawimage = rawimage; colormap = { map = [||]; max = 65535 }; transparent = (-1); infos = [] } let create_duplicate src width height rawimage = { width = width; height = height; rawimage = rawimage; colormap = src.colormap; transparent = src.transparent; infos = src.infos; } let colormap t = t.colormap end;; module IMAGE = Genimage.MakeIndexed(RI)(C);; let create_with width height infos colormap transparent data = { width = width; height = height; rawimage = RI.create_with width height data; colormap = colormap; transparent = transparent; infos = infos; };; let create_with_scanlines width height infos colormap transparent data = { width = width; height = height; rawimage = RI.create_with_scanlines width height data; colormap = colormap; transparent = transparent; infos = infos; };; let rawimage = C.rawimage;; let create = IMAGE.create;; let make = IMAGE.make;; let dump = IMAGE.dump;; let unsafe_access = IMAGE.unsafe_access;; let get_strip = IMAGE.get_strip;; let set_strip = IMAGE.set_strip;; let get_scanline = IMAGE.get_scanline;; let set_scanline = IMAGE.set_scanline;; let unsafe_get = IMAGE.unsafe_get;; let unsafe_set = IMAGE.unsafe_set;; let get = IMAGE.get;; let set = IMAGE.set;; let unsafe_get_color = IMAGE.unsafe_get_color;; let get_color = IMAGE.get_color;; let destroy = IMAGE.destroy;; let copy = IMAGE.copy;; let sub = IMAGE.sub;; let blit = IMAGE.blit;; let map = IMAGE.map;; let blocks = IMAGE.blocks;; let dump_block = IMAGE.dump_block;; let unsafe_get_rgb = unsafe_get_color;; let get_rgb = get_color;; open Color;; let to_rgb24 ?failsafe t = let rgb24 = Rgb24.create t.width t.height in let cmapsize = Array.length t.colormap.map in begin match failsafe with | Some failsafecolor -> for y = 0 to t.height - 1 do for x = 0 to t.width - 1 do let idx = unsafe_get t x y in let rgb = if idx < 0 || idx >= cmapsize then failsafecolor else t.colormap.map.(idx) in Rgb24.unsafe_set rgb24 x y rgb done done | None -> for y = 0 to t.height - 1 do for x = 0 to t.width - 1 do Rgb24.unsafe_set rgb24 x y (unsafe_get_color t x y) done done end; rgb24;; let to_rgba32 ?failsafe t = let rgba32 = Rgba32.create t.width t.height in let cmapsize = Array.length t.colormap.map in begin match failsafe with | Some failsafecolor -> for y = 0 to t.height - 1 do for x = 0 to t.width - 1 do let rgba = let index = unsafe_get t x y in if index < 0 || index >= cmapsize then failsafecolor else { color = t.colormap.map.(index); alpha = if index = t.transparent then 0 else 255; } in Rgba32.unsafe_set rgba32 x y rgba done done | None -> for y = 0 to t.height - 1 do for x = 0 to t.width - 1 do let index = unsafe_get t x y in Rgba32.unsafe_set rgba32 x y { color = t.colormap.map.(index); alpha = if index = t.transparent then 0 else 255 } done done end; rgba32;; camlspotter-camlimages-e471b3c4470d/src/index16.mli0000644000000000000000000000563012405272062020146 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: index16.mli,v 1.4 2009/07/04 03:39:28 furuse Exp $*) (** Indexed 16 bit depth image format *) type elt = int;; type rawimage;; (* The image type *) type t = { width : int; height : int; rawimage : rawimage; mutable infos : Info.info list; mutable colormap : Color.rgb Color.map; mutable transparent : int; };; val to_rgb24 : ?failsafe: Color.rgb -> t -> Rgb24.t;; val to_rgba32 : ?failsafe: Color.rgba -> t -> Rgba32.t;; (** [to_rgb? ~failsafe t]: Image format conversion functions to Rgb24.t and Rgba32.t images. If the color for some pixel value is not defined, [failsafe] color is used as default. *) (** Generic functions. *) (** Please read the comments of IMAGEINDEXED in genimage.mli *) val dump : t -> bytes;; val unsafe_access : t -> int -> int -> bytes * int;; val get_strip : t -> int -> int -> int -> bytes;; val set_strip : t -> int -> int -> int -> bytes -> unit;; val get_scanline : t -> int -> bytes;; val set_scanline : t -> int -> bytes -> unit;; val unsafe_get : t -> int -> int -> elt;; val unsafe_set : t -> int -> int -> elt -> unit;; val get : t -> int -> int -> elt;; val set : t -> int -> int -> elt -> unit;; val unsafe_get_color : t -> int -> int -> Color.rgb;; val get_color : t -> int -> int -> Color.rgb;; val unsafe_get_rgb : t -> int -> int -> Color.rgb;; val get_rgb : t -> int -> int -> Color.rgb;; val destroy : t -> unit;; val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit;; val map : (elt -> elt -> elt) -> t -> int -> int -> t -> int -> int -> int -> int -> unit;; val blocks : t -> int * int val dump_block : t -> int -> int -> Bitmap.Block.t val create_with : int -> int -> Info.info list -> Color.rgb Color.map -> int -> bytes -> t;; val create_with_scanlines : int -> int -> Info.info list -> Color.rgb Color.map -> int -> bytes array -> t;; val create : int -> int -> t;; val make : int -> int -> elt -> t;; val copy : t -> t;; val sub : t -> int -> int -> int -> int -> t;; val rawimage : t -> rawimage camlspotter-camlimages-e471b3c4470d/src/index8.ml0000644000000000000000000001125012405272062017711 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: index8.ml,v 1.4 2009/07/04 03:39:28 furuse Exp $*) open Util module E = struct type t = int let bytes_per_pixel = 1 let get str pos = int_of_char str.[pos] let set str pos t = str << pos & char_of_int t let make t = let str = Bytes.create bytes_per_pixel in set str 0 t; str end;; module RI = Genimage.MakeRawImage(E);; type rawimage = RI.t;; type elt = int;; type t = { width : int; height : int; rawimage : RI.t; mutable infos : Info.info list; mutable colormap : Color.rgb Color.map; mutable transparent : int; };; module C = struct open Color type rawimage = RI.t type container = t type mapelt = Color.rgb let rawimage x = x.rawimage let create_default width height rawimage = { width= width; height= height; rawimage = rawimage; colormap = { map= [||]; max= 255 }; transparent = (-1); infos= [] } let create_duplicate src width height rawimage = { width= width; height= height; rawimage = rawimage; colormap = src.colormap; transparent = src.transparent; infos= src.infos } let colormap t = t.colormap end;; module IMAGE = Genimage.MakeIndexed(RI)(C);; let create_with width height infos colormap transparent data = { width= width; height= height; rawimage= RI.create_with width height data; colormap = colormap; transparent = transparent; infos= infos; };; let create_with_scanlines width height infos colormap transparent data = { width= width; height= height; rawimage= RI.create_with_scanlines width height data; colormap = colormap; transparent = transparent; infos= infos; };; let rawimage = C.rawimage;; let create = IMAGE.create;; let make = IMAGE.make;; let dump = IMAGE.dump;; let unsafe_access = IMAGE.unsafe_access;; let get_strip = IMAGE.get_strip;; let set_strip = IMAGE.set_strip;; let get_scanline = IMAGE.get_scanline;; let set_scanline = IMAGE.set_scanline;; let unsafe_get = IMAGE.unsafe_get;; let unsafe_set = IMAGE.unsafe_set;; let get = IMAGE.get;; let set = IMAGE.set;; let unsafe_get_color = IMAGE.unsafe_get_color;; let get_color = IMAGE.get_color;; let destroy = IMAGE.destroy;; let copy = IMAGE.copy;; let sub = IMAGE.sub;; let blit = IMAGE.blit;; let map = IMAGE.map;; let blocks = IMAGE.blocks;; let dump_block = IMAGE.dump_block;; let unsafe_get_rgb = unsafe_get_color;; let get_rgb = get_color;; open Color;; let to_rgb24 ?failsafe t = let rgb24 = Rgb24.create t.width t.height in let cmapsize = Array.length t.colormap.map in begin match failsafe with | Some failsafecolor -> for y = 0 to t.height - 1 do for x = 0 to t.width - 1 do let idx = unsafe_get t x y in let rgb = if idx < 0 || idx >= cmapsize then failsafecolor else t.colormap.map.(idx) in Rgb24.unsafe_set rgb24 x y rgb done done | None -> for y = 0 to t.height - 1 do for x = 0 to t.width - 1 do Rgb24.unsafe_set rgb24 x y (unsafe_get_color t x y) done done end; rgb24;; let to_rgba32 ?failsafe t = let rgba32 = Rgba32.create t.width t.height in let cmapsize = Array.length t.colormap.map in begin match failsafe with | Some failsafecolor -> for y = 0 to t.height - 1 do for x = 0 to t.width - 1 do let rgba = let index = unsafe_get t x y in if index < 0 || index >= cmapsize then failsafecolor else { color= t.colormap.map.(index); alpha= if index = t.transparent then 0 else 255 } in Rgba32.unsafe_set rgba32 x y rgba done done | None -> for y = 0 to t.height - 1 do for x = 0 to t.width - 1 do let index = unsafe_get t x y in Rgba32.unsafe_set rgba32 x y { color= t.colormap.map.(index); alpha= if index = t.transparent then 0 else 255 } done done end; rgba32;; camlspotter-camlimages-e471b3c4470d/src/index8.mli0000644000000000000000000000562412405272062020072 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: index8.mli,v 1.4 2009/07/04 03:39:28 furuse Exp $*) (** Indexed 8 bit depth image format *) type elt = int;; type rawimage;; (* The image type *) type t = { width : int; height : int; rawimage : rawimage; mutable infos : Info.info list; mutable colormap : Color.rgb Color.map; mutable transparent : int; };; val to_rgb24 : ?failsafe: Color.rgb -> t -> Rgb24.t;; val to_rgba32 : ?failsafe: Color.rgba -> t -> Rgba32.t;; (* [to_rgb? ~failsafe t]: Image format conversion functions to Rgb24.t and Rgba32.t images. If the color for some pixel value is not defined, [failsafe] color is used as default. *) (** Generic functions *) (** Please read the comments of IMAGEINDEXED in genimage.mli *) val dump : t -> bytes;; val unsafe_access : t -> int -> int -> bytes * int;; val get_strip : t -> int -> int -> int -> bytes;; val set_strip : t -> int -> int -> int -> bytes -> unit;; val get_scanline : t -> int -> bytes;; val set_scanline : t -> int -> bytes -> unit;; val unsafe_get : t -> int -> int -> elt;; val unsafe_set : t -> int -> int -> elt -> unit;; val get : t -> int -> int -> elt;; val set : t -> int -> int -> elt -> unit;; val unsafe_get_color : t -> int -> int -> Color.rgb;; val get_color : t -> int -> int -> Color.rgb;; val unsafe_get_rgb : t -> int -> int -> Color.rgb;; val get_rgb : t -> int -> int -> Color.rgb;; val destroy : t -> unit;; val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit;; val blocks : t -> int * int val dump_block : t -> int -> int -> Bitmap.Block.t val map : (elt -> elt -> elt) -> t -> int -> int -> t -> int -> int -> int -> int -> unit;; val create_with : int -> int -> Info.info list -> Color.rgb Color.map -> int -> bytes -> t;; val create_with_scanlines : int -> int -> Info.info list -> Color.rgb Color.map -> int -> bytes array -> t;; val create : int -> int -> t;; val make : int -> int -> elt -> t;; val copy : t -> t;; val sub : t -> int -> int -> int -> int -> t;; val rawimage : t -> rawimage camlspotter-camlimages-e471b3c4470d/src/info.mli0000644000000000000000000000271512405272062017624 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: info.mli,v 1.1 2006/11/28 15:43:28 rousse Exp $ *) (* Image misc infos (copied to images.ml/mli *) (* File header informations *) type colormodel = | Gray | RGB | Index | GrayA | RGBA;; (* Infos attached to bitmaps *) type info = | Info_DPI of float (* dot per inch *) | Info_BigEndian | Info_LittleEndian (* endianness of image file *) | Info_ColorModel of colormodel (* color model of image file *) | Info_Depth of int (* Image bit depth *) | Info_Corrupted (* For corrupted PNG files *);; camlspotter-camlimages-e471b3c4470d/src/jis_table.ml0000644000000000000000000013566512405272062020467 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: jis_table.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) let table = "0\0000\0010\002\255\012\255\0140\251\255\026\255\027\255\031\255\0010\155\ 0\156\000\180\255@\000\168\255>\255\227\255?0\2530\2540\1570\1580\003N\221\ 0\0050\0060\0070\252\032\021\032\016\255\015\255<\255^\"%\255\\\032&\032%\ \032\024\032\025\032\028\032\029\255\008\255\0090\0200\021\255;\255=\255[\ \255]0\0080\0090\0100\0110\0120\0130\0140\0150\0160\017\255\011\255\013\000\ \177\000\215\000\247\255\029\"`\255\028\255\030\"f\"g\"\030\"4&B&@\000\176\ \0322\0323!\003\255\229\255\004\255\224\255\225\255\005\255\003\255\006\255\ \010\255\032\000\167&\006&\005%\203%\207%\206%\199%\198%\161%\160%\179%\178\ %\189%\188\032;0\018!\146!\144!\145!\1470\0190\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\251\"\008\"\011\"\134\"\135\"\130\"\131\"*\")0\2510\ \2510\2510\2510\2510\2510\2510\251\"'\"(\255\226!\210!\212\"\000\"\0030\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\"\032\"\165#\018\"\002\ \"\007\"a\"R\"j\"k\"\026\"=\"\029\"5\"+\",0\2510\2510\2510\2510\2510\2510\ \251!+\0320&o&m&j\032\032\032!\000\1820\2510\2510\2510\251%\2390\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\255\016\ \255\017\255\018\255\019\255\020\255\021\255\022\255\023\255\024\255\0250\ \2510\2510\2510\2510\2510\2510\251\255!\255\"\255#\255$\255%\255&\255'\255\ (\255)\255*\255+\255,\255-\255.\255/\2550\2551\2552\2553\2554\2555\2556\255\ 7\2558\2559\255:0\2510\2510\2510\2510\2510\251\255A\255B\255C\255D\255E\255\ F\255G\255H\255I\255J\255K\255L\255M\255N\255O\255P\255Q\255R\255S\255T\255\ U\255V\255W\255X\255Y\255Z0\2510\2510\2510\2510A0B0C0D0E0F0G0H0I0J0K0L0M0\ N0O0P0Q0R0S0T0U0V0W0X0Y0Z0[0\\0]0^0_0`0a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0\ r0s0t0u0v0w0x0y0z0{0|0}0~0\1270\1280\1290\1300\1310\1320\1330\1340\1350\136\ 0\1370\1380\1390\1400\1410\1420\1430\1440\1450\1460\1470\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\1610\1620\1630\1640\1650\1660\1670\168\ 0\1690\1700\1710\1720\1730\1740\1750\1760\1770\1780\1790\1800\1810\1820\183\ 0\1840\1850\1860\1870\1880\1890\1900\1910\1920\1930\1940\1950\1960\1970\198\ 0\1990\2000\2010\2020\2030\2040\2050\2060\2070\2080\2090\2100\2110\2120\213\ 0\2140\2150\2160\2170\2180\2190\2200\2210\2220\2230\2240\2250\2260\2270\228\ 0\2290\2300\2310\2320\2330\2340\2350\2360\2370\2380\2390\2400\2410\2420\243\ 0\2440\2450\2460\2510\2510\2510\2510\2510\2510\2510\251\003\145\003\146\003\ \147\003\148\003\149\003\150\003\151\003\152\003\153\003\154\003\155\003\156\ \003\157\003\158\003\159\003\160\003\161\003\163\003\164\003\165\003\166\003\ \167\003\168\003\1690\2510\2510\2510\2510\2510\2510\2510\251\003\177\003\178\ \003\179\003\180\003\181\003\182\003\183\003\184\003\185\003\186\003\187\003\ \188\003\189\003\190\003\191\003\192\003\193\003\195\003\196\003\197\003\198\ \003\199\003\200\003\2010\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\004\016\ \004\017\004\018\004\019\004\020\004\021\004\001\004\022\004\023\004\024\004\ \025\004\026\004\027\004\028\004\029\004\030\004\031\004\032\004!\004\"\004\ #\004$\004%\004&\004'\004(\004)\004*\004+\004,\004-\004.\004/0\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\0040\0041\004\ 2\0043\0044\0045\004Q\0046\0047\0048\0049\004:\004;\004<\004=\004>\004?\004\ @\004A\004B\004C\004D\004E\004F\004G\004H\004I\004J\004K\004L\004M\004N\004\ O0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251%\000%\002\ %\012%\016%\024%\020%\028%,%$%4%<%\001%\003%\015%\019%\027%\023%#%3%+%;%K\ %\032%/%(%7%?%\029%0%%%8%B0\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\251\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s!`!a!b!c!d!e!f!g!h!i0\2513I3\020\ 3\"3M3\0243'3\003363Q3W3\0133&3#3+3J3;3\1563\1573\1583\1423\1433\1963\161\ 0\2510\2510\2510\2510\2510\2510\2510\2513{0\0290\031!\0223\205!!2\1642\165\ 2\1662\1672\1682122293~3}3|\"R\"a\"+\".\"\017\"\026\"\165\"\032\"\031\"\191\ \"5\")\"*0\2510\251\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000N\156U\022Z\003\150?T\192a\027c(Y\246\144\"\132u\131\028zP`\170c\225n\ %e\237\132f\130\166\155\245h\147W'e\161bq[\155Y\208\134{\152\244}b}\190\155\ \142b\022|\159\136\183[\137^\181c\009f\151hH\149\199\151\141gON\229O\010O\ MO\157PIV\242Y7Y\212Z\001\\\009`\223a\015apf\019i\005p\186uOupy\251}\173}\ \239\128\195\132\014\136c\139\002\144U\144zS;N\149N\165W\223\128\178\144\193\ x\239N\000X\241n\162\1448z2\131(\130\139\156/QASpT\189T\225V\224Y\251_\021\ \152\242m\235\128\228\133-\150b\150p\150\160\151\251T\011S\243[\135p\207\127\ \189\143\194\150\232So\157\\z\186N\017x\147\129\252n&V\024U\004k\029\133\026\ \156;Y\229S\169mft\220\149\143VBN\145\144K\150\242\131O\153\012S\225U\182\ [0_qf\032f\243h\004l8l\243m)t[v\200zN\1524\130\241\136[\138`\146\237m\178\ u\171v\202\153\197`\166\139\001\141\138\149\178i\142S\173Q\134W\018X0YD[\180\ ^\246`(c\169c\244l\191o\020p\142q\020qYq\213s?~\001\130v\130\209\133\151\144\ `\146[\157\027Xie\188lZu%Q\249Y.Ye_\128_\220b\188e\250j*k'k\180s\139\127\193\ \137V\157,\157\014\158\196\\\161l\150\131{Q\004\\Ka\182\129\198hvraNYO\250\ Sx`in)zO\151\243N\011S\022N\238OUO=O\161OsR\160S\239V\009Y\015Z\193[\182[\ \225y\209f\135g\156g\182kLl\179pks\194y\141y\190z<{\135\130\177\130\219\131\ \004\131w\131\239\131\211\135f\138\178V)\140\168\143\230\144N\151\030\134\ \138O\196\\\232b\017rYu;\129\229\130\189\134\254\140\192\150\197\153\019\153\ \213N\203O\026\137\227V\222XJX\202^\251_\235`*`\148`ba\208b\018b\208e9\155\ Affh\176mwppuLv\134}u\130\165\135\249\149\139\150\142\140\157Q\241R\190Y\022\ T\179[\179]\022ahi\130m\175x\141\132\203\136W\138r\147\167\154\184ml\153\168\ \134\217W\163g\255\134\206\146\014R\131V\135T\004^\211b\225d\185hkSlWo\"o\151oEt\176u\024v\227w\011z\255{\161|!}\233\1276\127\240\ \128\157\130f\131\158\137\179\138\204\140\171\144\132\148Q\149\147\149\145\ \149\162\150e\151\211\153(\130\024N8T+\\\184]\204s\169vLw<\\\169\127\235\141\ \011\150\193\152\017\152T\152XO\001O\014SqU\156VhW\250YG[\009[\196\\\144^\ \012^~_\204c\238g:e\215e\226g\031h\203h\196j_^0k\197l\023l}u\127yH[cz\000\ }\000_\189\137\143\138\024\140\180\141w\142\204\143\029\152\226\154\014\155\ Z/_\140_\161`\159\ h\167j\142tZx\129\138\158\138\164\139w\145\144N^\155\201N\164O|O\175P\025\ P\022QIQlR\159R\185R\254S\154S\227T\017T\014U\137WQW\162Y}[T[][\143]\229]\ \231]\247^x^\131^\154^\183_\024`RaLb\151b\216c\167e;f\002fCf\244gmh!h\151\ i\203l_m*min/n\157u2v\135xlz?|\224}\005}\024}^}\177\128\021\128\003\128\175\ \128\177\129T\129\143\130*\131R\136L\136a\139\027\140\162\140\252\144\202\ \145u\146qx?\146\252\149\164\150M\152\005\153\153\154\216\157;R[R\171S\247\ T\008X\213b\247o\224\140j\143_\158\185QKR;TJV\253z@\145w\157`\158\210sDo\009\ \129pu\017_\253`\218\154\168r\219\143\188kd\152\003N\202V\240WdX\190ZZ`ha\ \199f\015f\006h9h\177m\247u\213}:\130n\155BN\155OPS\201U\006]o]\230]\238g\ \251l\153tsx\002\138P\147\150\136\223WP^\167c+P\181P\172Q\141g\000T\201X^\ Y\187[\176_ibMc\161h=ksn\008p}\145\199r\128x\021x&yme\142}0\131\220\136\193\ \143\009\150\155RdW(gP\127j\140\161Q\180WB\150*X:i\138\128\180T\178]\014W\ \252x\149\157\250O\\RJT\139d>f(g\020g\245z\132{V}\"\147/h\\\155\173{9S\025\ Q\138R7[\223b\246d\174d\230g-k\186\133\169\150\209v\144\155\214cL\147\006\ \155\171v\191fRN\009P\152S\194\\q`\232d\146ech_q\230s\202u#{\151~\130\134\ \149\139\131\140\219\145x\153\016e\172f\171k\139N\213N\212O:O\127R:S\248S\ \242U\227V\219X\235Y\203Y\201Y\255[P\\M^\002^+_\215`\029c\007e/[\\e\175e\189\ e\232g\157kbk{l\015sEyIy\193|\248}\025}+\128\162\129\002\129\243\137\150\138\ ^\138i\138f\138\140\138\238\140\199\140\220\150\204\152\252koN\139Ot\189u\212x\193y:\128\012\1283\129\234\132\ \148\143\158lP\158\127_\015\139X\157+z\250\142\248[\141\150\235N\003S\241\ W\247Y1Z\201[\164`\137n\127o\006u\190\140\234[\159\133\000{\224Prg\244\130\ \157\\a\133J~\030\130\014Q\153\\\004ch\141fe\156qny>}\023\128\005\139\029\ \142\202\144n\134\199\144\170P\031R\250\\:gSp|r5\145L\145\200\147+\130\229\ [\194_1`\249N;S\214[\136bKg1k\138r\233s\224z.\129k\141\163\145R\153\150Q\018\ S\215Tj[\255c\136j9}\172\151\000V\218S\206Th[\151\\1]\222O\238a\001b\254m\ 2y\192y\203}B~M\127\210\129\237\130\031\132\144\136F\137r\139\144\142t\143\ /\1441\145K\145l\150\198\145\156N\192OOQESA_\147b\014g\212lAn\011sc~&\145\ \205\146\131S\212Y\025[\191m\209y]~.|\155X~q\159Q\250\136S\143\240O\202\\\ \251f%w\172z\227\130\028\153\255Q\198_\170e\236iok\137m\243n\150odv\254}\020\ ]\225\144u\145\135\152\006Q\230R\029b@f\145f\217n\026^\182}\210\127rf\248\ \133\175\133\247\138\248R\169S\217Ys^\143_\144`U\146\228\150dP\183Q\031R\221\ S\032SGS\236T\232UFU1V\023YhY\190Z<[\181\\\006\\\015\\\017\\\026^\132^\138\ ^\224_pb\127b\132b\219c\140cwf\007f\012f-fvg~h\162j\031j5l\188m\136n\009n\ Xq\129\010\140\172\141d\141\225\142_x\169\ R\007b\217c\165dBb\152\138-z\131{\192\138\172\150\234}v\130\012\135IN\217\ QHSCS`[\163\\\002\\\022]\221b&bGd\176h\019h4l\201mEm\023g\211o\\qNq}e\203\ z\127{\173}\218~J\127\168\129z\130\027\1309\133\166\138n\140\206\141\245\144\ x\144w\146\173\146\145\149\131\155\174RMU\132o8q6Qhy\133~U\129\179|\206VL\ XQ\\\168c\170f\254f\253iZr\217u\143u\142y\014yVy\223|\151}\032}D\134\007\138\ 4\150;\144a\159\032P\231RuS\204S\226P\009U\170X\238YOr=[\139\\dS\029`\227\ `\243c\\c\131c?c\187d\205e\233f\249]\227i\205i\253o\021q\229N\137u\233v\248\ z\147|\223}\207}\156\128a\131I\131X\132l\132\188\133\251\136\197\141p\144\ \001\144m\147\151\151\028\154\018P\207X\151a\142\129\211\1335\141\008\144\ \032O\195PtRGSs`ocIg_n,\141\179\144\031O\215\\^\140\202e\207}\154SR\136\150\ Qvc\195[X[k\\\010d\013gQ\144\\N\214Y\026Y*lp\138QU>X\021Y\165`\240bSg\193\ \1305iU\150@\153\196\154(OSX\006[\254\128\016\\\177^/_\133`\032aKb4f\255l\ \240n\222\128\206\129\127\130\212\136\139\140\184\144\000\144.\150\138\158\ \219\155\219N\227S\240Y'{,\145\141\152L\157\249n\221p'SSUD[\133bXb\158b\211\ l\162o\239t\"\138\023\1488o\193\138\254\1318Q\231\134\248S\234S\233OF\144\ T\143\176Yj\1291]\253z\234\143\191h\218\1407r\248\156Hj=\138\176N9SXV\006\ Wfb\197c\162e\230kNm\225n[p\173w\237z\239{\170}\187\128=\128\198\134\203\138\ \149\147[V\227X\199_>e\173f\150j\128k\181u7\138\199P$w\229W0_\027`efzl`u\244\ z\026\127n\129\244\135\024\144E\153\179{\201u\\z\249{Q\132\196\144\016y\233\ z\146\1316Z\225w@N-N\242[\153_\224b\189ft6x4ZF\127u\130\173\ \153\172O\243^\195b\221c\146eWgov\195rL\128\204\128\186\143)\145MP\013W\249\ Z\146h\133isqdr\253\140\183X\242\140\224\150j\144\025\135\127y\228w\231\132\ )O/ReSZb\205g\207l\202v}{\148|\149\1306\133\132\143\235f\221o\032r\006~\027\ \131\171\153\193\158\166Q\253{\177xr{\184\128\135{Hj\232^a\128\140uQu`Qk\146\ bn\140vz\145\151\154\234O\016\127pb\156{O\149\165\156\233VzXY\134\228\150\ \188O4R$SJS\205S\219^\006d,e\145g\127l>lNrHr\175s\237uT~A\130,\133\233\140\ \169{\196\145\198qi\152\018\152\239c=fiujv\228x\208\133C\134\238S*SQT&Y\131\ ^\135_|`\178bIbyb\171e\144k\212l\204u\178v\174x\145y\216}\203\127w\128\165\ \136\171\138\185\140\187\144\127\151^\152\219j\011|8P\153\\>_\174g\135k\216\ t5w\009\127\142\159;g\202z\023S9u\139\154\237_f\129\157\131\241\128\152_<\ _\197ub{F\144e\185g\011\ l\213l\225p\249x2~+\128\222\130\179\132\012\132\236\135\002\137\018\138*\140\ J\144\166\146\210\152\253\156\243\157lNON\161P\141RVWJY\168^=_\216_\217b?\ f\180g\027g\208h\210Q\146}!\128\170\129\168\139\000\140\140\140\191\146~\150\ 2T\032\152,S\023P\213S\\X\168d\178g4rgwfzF\145\230R\195l\161k\134X\000^LY\ Tg,\127\251Q\225v\198dix\232\155T\158\187W\203Y\185f'g\154k\206T\233i\217\ ^U\129\156g\149\155\170g\254\156Rh]N\166O\227S\200b\185g+l\171\143\196O\173\ ~m\158\191N\007abn\128o+\133\019Tsg*\155E]\243{\149\\\172[\198\135\028nJ\132\ \209z\020\129\008Y\153|\141l\017w\032R\217Y\"q!r_w\219\151'\157ai\011Z\127\ Z\024Q\165T\013T}f\014v\223\143\247\146\152\156\244Y\234r]n\197QMh\201}\191\ }\236\151b\158\186dxj!\131\002Y\132[_k\219s\027v\242}\178\128\023\132\153\ Q2g(\158\217v\238gbR\255\153\005\\$b;|~\140\176UO`\182}\011\149\128S\001N\ _Q\182Y\028r:\1286\145\206_%w\226S\132_y}\004\133\172\1383\142\141\151Vg\243\ \133\174\148Sa\009a\008l\185vR\138\237\1438U/OQQ*R\199S\203[\165^}`\160a\130\ c\214g\009g\218ngm\140s6s7u1yP\136\213\138\152\144J\144\145\144\245\150\196\ \135\141Y\021N\136OYN\014\138\137\143?\152\016P\173^|Y\150[\185^\184c\218\ c\250d\193f\220iJi\216m\011n\182q\148u(z\175\127\138\128\000\132I\132\201\ \137\129\139!\142\010\144e\150}\153\010a~b\145k2l\131mt\127\204\127\252m\192\ \127\133\135\186\136\248ge\131\177\152<\150\247m\027}a\132=\145jNqSu]Pk\004\ o\235\133\205\134-\137\167R)T\015\\egNh\168t\006t\131u\226\136\207\136\225\ \145\204\150\226\150x_\139s\135z\203\132Nc\160ueR\137mAn\156t\009uYxk|\146\ \150\134z\220\159\141O\182ane\197\134\\N\134N\174P\218N!Q\204[\238e\153h\129\ m\188s\031vBw\173z\028|\231\130o\138\210\144|\145\207\150u\152\024R\155}\209\ P+S\152g\151m\203q\208t3\129\232\143*\150\163\156W\158\159t`XAm\153}/\152\ ^N\228O6O\139Q\183R\177]\186`\028s\178y<\130\211\1464\150\183\150\246\151\ \010\158\151\159bf\166ktR\023R\163p\200\136\194^\201`Ka\144o#qI|>}\244\128\ o\132\238\144#\147,TB\155oj\211p\137\140\194\141\239\1512R\180ZA^\202_\004\ g\023i|i\148mjo\015rbr\252{\237\128\001\128~\135K\144\206Qm\158\147y\132\128\ \139\1472\138\214P-T\140\138qkj\140\196\129\007`\209g\160\157\242N\153N\152\ \156\016\138k\133\193\133hi\000n~x\151\129U0\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\251_\012N\016N\021N*N1N6Nz\210YUYPYN\ YZYXYbY`YgYlYiYxY\129Y\157O^O\171Y\163Y\178Y\198Y\232Y\220Y\141Y\217Y\218\ Z%Z\031Z\017Z\028Z\009Z\026Z@ZlZIZ5Z6ZbZjZ\154Z\188Z\190Z\203Z\194Z\189Z\227\ Z\215Z\230Z\233Z\214Z\250Z\251[\012[\011[\022[2Z\208[*[6[>[C[E[@[Q[U[Z[[[\ e[i[p[s[u[xe\136[z[\128[\131[\166[\184[\195[\199[\201[\212[\208[\228[\230\ [\226[\222[\229[\235[\240[\246[\243\\\005\\\007\\\008\\\013\\\019\\\032\\\ \"\\(\\8\\9\\A\\F\\N\\S\\P\\O[q\\l\\nNb\\v\\y\\\140\\\145\\\148Y\155\\\171\ \\\187\\\182\\\188\\\183\\\197\\\190\\\199\\\217\\\233\\\253\\\250\\\237]\ \140\\\234]\011]\021]\023]\\]\031]\027]\017]\020]\"]\026]\025]\024]L]R]N]\ K]l]s]v]\135]\132]\130]\162]\157]\172]\174]\189]\144]\183]\188]\201]\205]\ \211]\210]\214]\219]\235]\242]\245^\011^\026^\025^\017^\027^6^7^D^C^@^N^W\ ^T^_^b^d^G^u^v^z\158\188^\127^\160^\193^\194^\200^\208^\207^\214^\227^\221\ ^\218^\219^\226^\225^\232^\233^\236^\241^\243^\240^\244^\248^\254_\003_\009\ _]_\\_\011_\017_\022_)_-_8_A_H_L_N_/_Q_V_W_Y_a_m_s_w_\131_\130_\127_\138_\ \136_\145_\135_\158_\153_\152_\160_\168_\173_\188_\214_\251_\228_\248_\241\ _\221`\179_\255`!```\025`\016`)`\014`1`\027`\021`+`&`\015`:`Z`A`j`w`_`J`F\ `M`c`C`d`B`l`k`Y`\129`\141`\231`\131`\154`\132`\155`\150`\151`\146`\167`\139\ `\225`\184`\224`\211`\180_\240`\189`\198`\181`\216aMa\021a\006`\246`\247a\ \000`\244`\250a\003a!`\251`\241a\013a\014aGa>a(a'aJa?acMd\028cOc\150c\142c\128c\171cvc\163c\143c\137c\ \159c\181ckcic\190c\233c\192c\198c\227c\201c\210c\246c\196d\022d4d\006d\019\ d&d6e\029d\023d(d\015dgdodvdNe*d\149d\147d\165d\169d\136d\188d\218d\210d\197\ d\199d\187d\216d\194d\241d\231\130\009d\224d\225b\172d\227d\239e,d\246d\244\ d\242d\250e\000d\253e\024e\028e\005e$e#e+e4e5e7e6e8uKeHeVeUeMeXe^e]erexe\130\ e\131\139\138e\155e\159e\171e\183e\195e\198e\193e\196e\204e\210e\219e\217\ e\224e\225e\241grf\010f\003e\251gsf5f6f4f\028fOfDfIfAf^f]fdfgfhf_fbfpf\131\ f\136f\142f\137f\132f\152f\157f\193f\185f\201f\190f\188f\196f\184f\214f\218\ f\224f?f\230f\233f\240f\245f\247g\015g\022g\030g&g'\1518g.g?g6gAg8g7gFg^g\ `gYgcgdg\137gpg\169g|gjg\140g\139g\166g\161g\133g\183g\239g\180g\236g\179\ g\233g\184g\228g\222g\221g\226g\238g\185g\206g\198g\231j\156h\030hFh)h@hM\ h2hNh\179h+hYhchwh\127h\159h\143h\173h\148h\157h\155h\131j\174h\185hth\181\ h\160h\186i\015h\141h~i\001h\202i\008h\216i\"i&h\225i\012h\205h\212h\231h\ \213i6i\018i\004h\215h\227i%h\249h\224h\239i(i*i\026i#i!h\198iyiwi\\ixiki\ Ti~ini9iti=iYi0iai^i]i\129iji\178i\174i\208i\191i\193i\211i\190i\206[\232\ i\202i\221i\187i\195i\167j.i\145i\160i\156i\149i\180i\222i\232j\002j\027i\ \255k\010i\249i\242i\231j\005i\177j\030i\237j\020i\235j\010j\018j\193j#j\019\ jDj\012jrj6jxjGjbjYjfjHj8j\"j\144j\141j\160j\132j\162j\163j\151\134\023j\187\ j\195j\194j\184j\179j\172j\222j\209j\223j\170j\218j\234j\251k\005\134\022\ j\250k\018k\022\1551k\031k8k7v\220k9\152\238kGkCkIkPkYkTk[k_kakxkyk\127k\128\ k\132k\131k\141k\152k\149k\158k\164k\170k\171k\175k\178k\177k\179k\183k\188\ k\198k\203k\211k\223k\236k\235k\243k\239\158\190l\008l\019l\020l\027l$l#l\ ^lUlbljl\130l\141l\154l\129l\155l~lhlsl\146l\144l\196l\241l\211l\189l\215\ l\197l\221l\174l\177l\190l\186l\219l\239l\217l\234m\031\136Mm6m+m=m8m\025\ m5m3m\018m\012mcm\147mdmZmymYm\142m\149o\228m\133m\249n\021n\010m\181m\199\ m\230m\184m\198m\236m\222m\204m\232m\210m\197m\250m\217m\228m\213m\234m\238\ n-nnn.n\025nrn_n>n#nkn+nvnMn\031nCn:nNn$n\255n\029n8n\130n\170n\152n\201n\ \183n\211n\189n\175n\196n\178n\212n\213n\143n\165n\194n\159oAo\017pLn\236\ n\248n\254o?n\242o1n\239o2n\204o>o\019n\247o\134ozoxo\129o\128ooo[o\243om\ o\130o|oXo\142o\145o\194ofo\179o\163o\161o\164o\185o\198o\170o\223o\213o\236\ o\212o\216o\241o\238o\219p\009p\011o\250p\017p\001p\015o\254p\027p\026otp\ \029p\024p\031p0p>p2pQpcp\153p\146p\175p\241p\172p\184p\179p\174p\223p\203\ p\221p\217q\009p\253q\028q\025qeqUq\136qfqbqLqVqlq\143q\251q\132q\149q\168\ q\172q\215q\185q\190q\210q\201q\212q\206q\224q\236q\231q\245q\252q\249q\255\ r\013r\016r\027r(r-r,r0r2r;rsNsO\158\216sWsjshspsxsus{szs\200s\179s\206\ s\187s\192s\229s\238s\222t\162t\005tot%s\248t2t:tUt?t_tYtAt\\titptctjtvt~\ t\139t\158t\167t\202t\207t\212s\241t\224t\227t\231t\233t\238t\242t\240t\241\ t\248t\247u\004u\003u\005u\012u\014u\013u\021u\019u\030u&u,uz7zCzWzIzazbzi\159\157zpzyz}z\136z\151z\149z\152z\150z\169z\200\ z\176z\182z\197z\196z\191\144\131z\199z\202z\205z\207z\213z\211z\217z\218\ z\221z\225z\226z\230z\237z\240{\002{\015{\010{\006{3{\024{\025{\030{5{({6\ {P{z{\004{M{\011{L{E{u{e{t{g{p{q{l{n{\157{\152{\159{\141{\156{\154{\139{\146\ {\143{]{\153{\203{\193{\204{\207{\180{\198{\221{\233|\017|\020{\230{\229|\ `|\000|\007|\019{\243{\247|\023|\013{\246|#|'|*|\031|7|+|=|L|C|T|O|@|P|X|\ _|d|V|e|l|u|\131|\144|\164|\173|\162|\171|\161|\168|\179|\178|\177|\174|\185\ |\189|\192|\197|\194|\216|\210|\220|\226\155;|\239|\242|\244|\246|\250}\006\ }\002}\028}\021}\010}E}K}.}2}?}5}F}s}V}N}r}h}n}O}c}\147}\137}[}\143}}}\155\ }\186}\174}\163}\181}\199}\189}\171~=}\162}\175}\220}\184}\159}\176}\216}\ \221}\228}\222}\251}\242}\225~\005~\010~#~!~\018~1~\031~\009~\011~\"~F~f~\ ;~5~9~C~7~2~:~g~]~V~^~Y~Z~y~j~i~|~{~\131}\213~}\143\174~\127~\136~\137~\140\ ~\146~\144~\147~\148~\150~\142~\155~\156\1278\127:\127E\127L\127M\127N\127\ P\127Q\127U\127T\127X\127_\127`\127h\127i\127g\127x\127\130\127\134\127\131\ \127\136\127\135\127\140\127\148\127\158\127\157\127\154\127\163\127\175\127\ \178\127\185\127\174\127\182\127\184\139q\127\197\127\198\127\202\127\213\ \127\212\127\225\127\230\127\233\127\243\127\249\152\220\128\006\128\004\128\ \011\128\018\128\024\128\025\128\028\128!\128(\128?\128;\128J\128F\128R\128\ X\128Z\128_\128b\128h\128s\128r\128p\128v\128y\128}\128\127\128\132\128\134\ \128\133\128\155\128\147\128\154\128\173Q\144\128\172\128\219\128\229\128\ \217\128\221\128\196\128\218\128\214\129\009\128\239\128\241\129\027\129)\ \129#\129/\129K\150\139\129F\129>\129S\129Q\128\252\129q\129n\129e\129f\129\ t\129\131\129\136\129\138\129\128\129\130\129\160\129\149\129\164\129\163\ \129_\129\147\129\169\129\176\129\181\129\190\129\184\129\189\129\192\129\ \194\129\186\129\201\129\205\129\209\129\217\129\216\129\200\129\218\129\223\ \129\224\129\231\129\250\129\251\129\254\130\001\130\002\130\005\130\007\130\ \010\130\013\130\016\130\022\130)\130+\1308\1303\130@\130Y\130X\130]\130Z\ \130_\130d\130b\130h\130j\130k\130.\130q\130w\130x\130~\130\141\130\146\130\ \171\130\159\130\187\130\172\130\225\130\227\130\223\130\210\130\244\130\243\ \130\250\131\147\131\003\130\251\130\249\130\222\131\006\130\220\131\009\130\ \217\1315\1314\131\022\1312\1311\131@\1319\131P\131E\131/\131+\131\023\131\ \024\131\133\131\154\131\170\131\159\131\162\131\150\131#\131\142\131\135\ \131\138\131|\131\181\131s\131u\131\160\131\137\131\168\131\244\132\019\131\ \235\131\206\131\253\132\003\131\216\132\011\131\193\131\247\132\007\131\224\ \131\242\132\013\132\"\132\032\131\189\1328\133\006\131\251\132m\132*\132\ <\133Z\132\132\132w\132k\132\173\132n\132\130\132i\132F\132,\132o\132y\132\ 5\132\202\132b\132\185\132\191\132\159\132\217\132\205\132\187\132\218\132\ \208\132\193\132\198\132\214\132\161\133!\132\255\132\244\133\023\133\024\ \133,\133\031\133\021\133\020\132\252\133@\133c\133X\133H\133A\134\002\133\ K\133U\133\128\133\164\133\136\133\145\133\138\133\168\133m\133\148\133\155\ \133\234\133\135\133\156\133w\133~\133\144\133\201\133\186\133\207\133\185\ \133\208\133\213\133\221\133\229\133\220\133\249\134\010\134\019\134\011\133\ \254\133\250\134\006\134\"\134\026\1340\134?\134MNU\134T\134_\134g\134q\134\ \147\134\163\134\169\134\170\134\139\134\140\134\182\134\175\134\196\134\198\ \134\176\134\201\136#\134\171\134\212\134\222\134\233\134\236\134\223\134\ \219\134\239\135\018\135\006\135\008\135\000\135\003\134\251\135\017\135\009\ \135\013\134\249\135\010\1354\135?\1357\135;\135%\135)\135\026\135`\135_\135\ x\135L\135N\135t\135W\135h\135n\135Y\135S\135c\135j\136\005\135\162\135\159\ \135\130\135\175\135\203\135\189\135\192\135\208\150\214\135\171\135\196\135\ \179\135\199\135\198\135\187\135\239\135\242\135\224\136\015\136\013\135\254\ \135\246\135\247\136\014\135\210\136\017\136\022\136\021\136\"\136!\1361\136\ 6\1369\136'\136;\136D\136B\136R\136Y\136^\136b\136k\136\129\136~\136\158\136\ u\136}\136\181\136r\136\130\136\151\136\146\136\174\136\153\136\162\136\141\ \136\164\136\176\136\191\136\177\136\195\136\196\136\212\136\216\136\217\136\ \221\136\249\137\002\136\252\136\244\136\232\136\242\137\004\137\012\137\010\ \137\019\137C\137\030\137%\137*\137+\137A\137D\137;\1376\1378\137L\137\029\ \137`\137^\137f\137d\137m\137j\137o\137t\137w\137~\137\131\137\136\137\138\ \137\147\137\152\137\161\137\169\137\166\137\172\137\175\137\178\137\186\137\ \189\137\191\137\192\137\218\137\220\137\221\137\231\137\244\137\248\138\003\ \138\022\138\016\138\012\138\027\138\029\138%\1386\138A\138[\138R\138F\138\ H\138|\138m\138l\138b\138\133\138\130\138\132\138\168\138\161\138\145\138\ \165\138\166\138\154\138\163\138\196\138\205\138\194\138\218\138\235\138\243\ \138\231\138\228\138\241\139\020\138\224\138\226\138\247\138\222\138\219\139\ \012\139\007\139\026\138\225\139\022\139\016\139\023\139\032\1393\151\171\ \139&\139+\139>\139(\139A\139L\139O\139N\139I\139V\139[\139Z\139k\139_\139\ l\139o\139t\139}\139\128\139\140\139\142\139\146\139\147\139\150\139\153\139\ \154\140:\140A\140?\140H\140L\140N\140P\140U\140b\140l\140x\140z\140\130\140\ \137\140\133\140\138\140\141\140\142\140\148\140|\140\152b\029\140\173\140\ \170\140\189\140\178\140\179\140\174\140\182\140\200\140\193\140\228\140\227\ \140\218\140\253\140\250\140\251\141\004\141\005\141\010\141\007\141\015\141\ \013\141\016\159N\141\019\140\205\141\020\141\022\141g\141m\141q\141s\141\ \129\141\153\141\194\141\190\141\186\141\207\141\218\141\214\141\204\141\219\ \141\203\141\234\141\235\141\223\141\227\141\252\142\008\142\009\141\255\142\ \029\142\030\142\016\142\031\142B\1425\1420\1424\142J\142G\142I\142L\142P\ \142H\142Y\142d\142`\142*\142c\142U\142v\142r\142|\142\129\142\135\142\133\ \142\132\142\139\142\138\142\147\142\145\142\148\142\153\142\170\142\161\142\ \172\142\176\142\198\142\177\142\190\142\197\142\200\142\203\142\219\142\227\ \142\252\142\251\142\235\142\254\143\010\143\005\143\021\143\018\143\025\143\ \019\143\028\143\031\143\027\143\012\143&\1433\143;\1439\143E\143B\143>\143\ L\143I\143F\143N\143W\143\\\143b\143c\143d\143\156\143\159\143\163\143\173\ \143\175\143\183\143\218\143\229\143\226\143\234\143\239\144\135\143\244\144\ \005\143\249\143\250\144\017\144\021\144!\144\013\144\030\144\022\144\011\ \144'\1446\1445\1449\143\248\144O\144P\144Q\144R\144\014\144I\144>\144V\144\ X\144^\144h\144o\144v\150\168\144r\144\130\144}\144\129\144\128\144\138\144\ \137\144\143\144\168\144\175\144\177\144\181\144\226\144\228bH\144\219\145\ \002\145\018\145\025\1452\1450\145J\145V\145X\145c\145e\145i\145s\145r\145\ \139\145\137\145\130\145\162\145\171\145\175\145\170\145\181\145\180\145\186\ \145\192\145\193\145\201\145\203\145\208\145\214\145\223\145\225\145\219\145\ \252\145\245\145\246\146\030\145\255\146\020\146,\146\021\146\017\146^\146\ W\146E\146I\146d\146H\146\149\146?\146K\146P\146\156\146\150\146\147\146\155\ \146Z\146\207\146\185\146\183\146\233\147\015\146\250\147D\147.\147\025\147\ \"\147\026\147#\147:\1475\147;\147\\\147`\147|\147n\147V\147\176\147\172\147\ \173\147\148\147\185\147\214\147\215\147\232\147\229\147\216\147\195\147\221\ \147\208\147\200\147\228\148\026\148\020\148\019\148\003\148\007\148\016\148\ 6\148+\1485\148!\148:\148A\148R\148D\148[\148`\148b\148^\148j\146)\148p\148\ u\148w\148}\148Z\148|\148~\148\129\148\127\149\130\149\135\149\138\149\148\ \149\150\149\152\149\153\149\160\149\168\149\167\149\173\149\188\149\187\149\ \185\149\190\149\202o\246\149\195\149\205\149\204\149\213\149\212\149\214\ \149\220\149\225\149\229\149\226\150!\150(\150.\150/\150B\150L\150O\150K\150\ w\150\\\150^\150]\150_\150f\150r\150l\150\141\150\152\150\149\150\151\150\ \170\150\167\150\177\150\178\150\176\150\180\150\182\150\184\150\185\150\206\ \150\203\150\201\150\205\137M\150\220\151\013\150\213\150\249\151\004\151\ \006\151\008\151\019\151\014\151\017\151\015\151\022\151\025\151$\151*\151\ 0\1519\151=\151>\151D\151F\151H\151B\151I\151\\\151`\151d\151f\151hR\210\151\ k\151q\151y\151\133\151|\151\129\151z\151\134\151\139\151\143\151\144\151\ \156\151\168\151\166\151\163\151\179\151\180\151\195\151\198\151\200\151\203\ \151\220\151\237\159O\151\242z\223\151\246\151\245\152\015\152\012\1528\152\ $\152!\1527\152=\152F\152O\152K\152k\152o\152p\152q\152t\152s\152\170\152\ \175\152\177\152\182\152\196\152\195\152\198\152\233\152\235\153\003\153\009\ \153\018\153\020\153\024\153!\153\029\153\030\153$\153\032\153,\153.\153=\ \153>\153B\153I\153E\153P\153K\153Q\153R\153L\153U\153\151\153\152\153\165\ \153\173\153\174\153\188\153\223\153\219\153\221\153\216\153\209\153\237\153\ \238\153\241\153\242\153\251\153\248\154\001\154\015\154\005\153\226\154\025\ \154+\1547\154E\154B\154@\154C\154>\154U\154M\154[\154W\154_\154b\154e\154\ d\154i\154k\154j\154\173\154\176\154\188\154\192\154\207\154\209\154\211\154\ \212\154\222\154\223\154\226\154\227\154\230\154\239\154\235\154\238\154\244\ \154\241\154\247\154\251\155\006\155\024\155\026\155\031\155\"\155#\155%\155\ '\155(\155)\155*\155.\155/\1552\155D\155C\155O\155M\155N\155Q\155X\155t\155\ \147\155\131\155\145\155\150\155\151\155\159\155\160\155\168\155\180\155\192\ \155\202\155\185\155\198\155\207\155\209\155\210\155\227\155\226\155\228\155\ \212\155\225\156:\155\242\155\241\155\240\156\021\156\020\156\009\156\019\ \156\012\156\006\156\008\156\018\156\010\156\004\156.\156\027\156%\156$\156\ !\1560\156G\1562\156F\156>\156Z\156`\156g\156v\156x\156\231\156\236\156\240\ \157\009\157\008\156\235\157\003\157\006\157*\157&\157\175\157#\157\031\157\ D\157\021\157\018\157A\157?\157>\157F\157H\157]\157^\157d\157Q\157P\157Y\157\ r\157\137\157\135\157\171\157o\157z\157\154\157\164\157\169\157\178\157\196\ \157\193\157\187\157\184\157\186\157\198\157\207\157\194\157\217\157\211\157\ \248\157\230\157\237\157\239\157\253\158\026\158\027\158\030\158u\158y\158\ }\158\129\158\136\158\139\158\140\158\146\158\149\158\145\158\157\158\165\ \158\169\158\184\158\170\158\173\151a\158\204\158\206\158\207\158\208\158\ \212\158\220\158\222\158\221\158\224\158\229\158\232\158\239\158\244\158\246\ \158\247\158\249\158\251\158\252\158\253\159\007\159\008v\183\159\021\159\ !\159,\159>\159J\159R\159T\159c\159_\159`\159a\159f\159g\159l\159j\159w\159\ r\159v\159\149\159\156\159\160X/i\199\144YtdQ\220q\1530\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\2510\251\ 0\2510\2510\2510\2510\2510\2510\2510\2510\251\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \000\000\000\000~\138\137\028\147H\146\136\132\220O\201p\187f1h\200\146\249\ f\251_EN(N\225N\252O\000O\003O9OVO\146O\138O\154O\148O\205P@P\"O\255P\030\ PFPpPBP\148P\244P\216QJQdQ\157Q\190Q\236R\021R\156R\166R\192R\219S\000S\007\ S$SrS\147S\178S\221\250\014T\156T\138T\169T\255U\134WYWeW\172W\200W\199\250\ \015\250\016X\158X\178Y\011YSY[Y]YcY\164Y\186[V[\192u/[\216[\236\\\030\\\166\ \\\186\\\245]']S\250\017]B]m]\184]\185]\208_!_4_g_\183_\222`]`\133`\138`\222\ `\213a\032`\242a\017a7a0a\152b\019b\166c\245d`d\157d\206eNf\000f\021f;f\009\ f.f\030f$fefWfY\250\018fsf\153f\160f\178f\191f\250g\014\249)gfg\187hRg\192\ h\001hDh\207\250\019ih\250\020i\152i\226j0jkjFjsj~j\226j\228k\214l?l\\l\134\ lol\218m\004m\135mom\150m\172m\207m\248m\242m\252n9n\\n'n let h = (Char.code s.[i * 2] - 0x80) and l = (Char.code s.[i * 2 + 1] - 0x80) in let pos = ((h - 0x21) * 94 + (l - 0x21)) * 2 in int_of_char table.[pos] * 256 + int_of_char table.[pos+1] camlspotter-camlimages-e471b3c4470d/src/jis_unicode.mli0000644000000000000000000000162512405272062021163 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: jis_unicode.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) val encode : string -> int array;; camlspotter-camlimages-e471b3c4470d/src/jpeg.ml0000644000000000000000000002235212405272062017444 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: jpeg.ml,v 1.4 2009/07/04 03:39:28 furuse Exp $ *) open Util open Images;; open Rgb24;; type in_handle;; module Marker = struct type raw = { code : int; data : string } type t = | Comment of string | App of int * string let t_of_raw r = match r.code with | 0xFE -> Comment r.data | n -> App (n - 0xE0, r.data) let raw_of_t = function | Comment s -> { code = 0xFE; data = s } | App (n, s) -> { code = 0xE0 + n; data = s } open Format let format ppf = function | Comment s -> fprintf ppf "Comment: %s" s | App (n, s) -> fprintf ppf "App%d (%d bytes)" n (String.length s) end external open_in_header : string -> int * int * in_handle * Marker.raw list = "open_jpeg_file_for_read";; external set_scale_denom : in_handle -> int -> unit = "jpeg_set_scale_denom";; external open_in_start : in_handle -> int * int * in_handle = "open_jpeg_file_for_read_start";; external read_scanline : in_handle -> string -> int -> unit = "read_jpeg_scanline";; external read_scanlines : in_handle -> string -> int -> int -> unit = "read_jpeg_scanlines";; external close_in : in_handle -> unit = "close_jpeg_file_for_read";; type out_handle;; external open_out : string -> int -> int -> int -> out_handle = "open_jpeg_file_for_write";; external open_out_cmyk : string -> int -> int -> int -> out_handle = "open_jpeg_file_for_write_cmyk";; external write_marker : out_handle -> Marker.raw -> unit = "caml_jpeg_write_marker" external write_scanline : out_handle -> string -> unit = "write_jpeg_scanline";; external close_out : out_handle -> unit = "close_jpeg_file_for_write";; let open_in name = let _, _, ic, rev_markers = open_in_header name in let w, h, ic = open_in_start ic in w, h, ic, List.rev_map Marker.t_of_raw rev_markers let open_in_thumbnail name geom_spec = if geom_spec.Geometry.spec_aspect = Geometry.Dont_keep then raise (Invalid_argument "Jpeg.open_in_thumbnail: illegal geom_spec"); let image_width, image_height, ic, rev_markers = open_in_header name in let scale = try let geom = Geometry.compute geom_spec image_width image_height in (* prerr_endline (Printf.sprintf "Denom %d/%d" image_width geom.Geometry.geom_width); *) image_width / geom.Geometry.geom_width with | _ -> 1 in let denom = if scale < 2 then 1 else if scale < 4 then 2 else if scale < 8 then 4 else 8 in set_scale_denom ic denom; image_width, image_height, open_in_start ic, List.rev_map Marker.t_of_raw rev_markers;; let load_aux prog ic w h = let prog y = match prog with | Some p -> p (float (y + 1) /. float h) | None -> () in let img = Rgb24.create w h in begin match Rgb24.get_scanline_ptr img with | Some f -> let load_once_at = max 1 (h / 10) in let rec load_scanlines y = if y >= h then () else begin let (string, off), at_most = f y in let lines_read = min load_once_at at_most in read_scanlines ic string off lines_read; prog y; load_scanlines (y + lines_read) end in load_scanlines 0 | None -> (* CR jfuruse: check overflow *) let scanline = Bytes.create (w * 3) in for y = 0 to h - 1 do read_scanline ic scanline 0; Rgb24.set_scanline img y scanline; prog y done end; close_in ic; Rgb24 img;; let load name load_opts = let w, h, ic, _markers = open_in name in let prog = Images.load_progress load_opts in load_aux prog ic w h let load_thumbnail name load_opts geom_spec = let prog = Images.load_progress load_opts in let ow, oh, (w, h, ic), _markers = open_in_thumbnail name geom_spec in ow, oh, load_aux prog ic w h let save_with_markers name opts image markers = let quality = match Images.save_quality opts with | Some q -> q | None -> 80 in let prog = Images.save_progress opts in match image with | Rgb24 bmp -> let oc = open_out name bmp.width bmp.height quality in List.iter (fun mrk -> write_marker oc (Marker.raw_of_t mrk)) markers; for y = 0 to bmp.height - 1 do write_scanline oc (Rgb24.get_scanline bmp y); match prog with | Some p -> p (float (y + 1) /. float bmp.height) | None -> () done; close_out oc | _ -> raise Wrong_image_type;; let save name opts image = save_with_markers name opts image [] let save_as_cmyk name opts trans image = let quality = match Images.save_quality opts with | Some q -> q | None -> 80 in let prog = Images.save_progress opts in let get_cmyk_scanline width scanline = let buf = Bytes.create (width * 4) in for x = 0 to width - 1 do let r = int_of_char scanline.[x * 3 + 0] in let g = int_of_char scanline.[x * 3 + 1] in let b = int_of_char scanline.[x * 3 + 2] in let c, m, y, k = trans {r = r; g = g; b = b} in buf << x * 4 + 0 & char_of_int (255 - c); buf << x * 4 + 1 & char_of_int (255 - m); buf << x * 4 + 2 & char_of_int (255 - y); buf << x * 4 + 3 & char_of_int (255 - k) done; buf in match image with | Rgb24 bmp -> let oc = open_out_cmyk name bmp.width bmp.height quality in for y = 0 to bmp.height - 1 do let buf = get_cmyk_scanline bmp.width (Rgb24.get_scanline bmp y) in write_scanline oc buf; match prog with | Some p -> p (float (y + 1) /. float bmp.height) | None -> () done; close_out oc | _ -> raise Wrong_image_type;; let save_cmyk_sample name opts = let quality = match Images.save_quality opts with | Some q -> q | None -> 80 in let _prog = Images.save_progress opts in let sample_point x y = let c = x / 16 * 17 and m = (x mod 16) * 17 and y = y / 16 * 17 and k = (y mod 16) * 17 in c, m, y, k in let sample_scan y = let s = Bytes.create (256 * 4) in for x = 0 to 255 do let c, m, y, k = sample_point x y in s << x * 4 + 0 & char_of_int c; s << x * 4 + 1 & char_of_int m; s << x * 4 + 2 & char_of_int y; s << x * 4 + 3 & char_of_int k; done; s in let oc = open_out_cmyk name 256 256 quality in for y = 0 to 256 - 1 do let buf = sample_scan y in write_scanline oc buf done; close_out oc;; let find_jpeg_size ic = (* jump to the next 0xff *) let rec loop () = let rec jump_to_0xff () = let ch = int_of_char (input_char ic) in if ch <> 0xff then jump_to_0xff () in let rec jump_to_non_0xff () = let ch = int_of_char (input_char ic) in if ch = 0xff then jump_to_non_0xff () else ch in jump_to_0xff (); let ch = jump_to_non_0xff () in let str = Bytes.create 4 in match ch with | 0xda -> raise Not_found | _ when ch >= 0xc0 && ch <= 0xc3 -> really_input ic str 0 3; really_input ic str 0 4; int_of_char str.[2] lsl 8 + int_of_char str.[3], (* width *) int_of_char str.[0] lsl 8 + int_of_char str.[1] (* height *) | _ -> (* skip this block *) let blocklen = really_input ic str 0 2; int_of_char str.[0] lsl 8 + int_of_char str.[1] in let s = Bytes.create (blocklen - 2) in really_input ic s 0 (blocklen - 2); loop () in try loop () with | _ -> raise Not_found (* any error returns Not_found *);; let check_header filename = let len = 2 in let ic = open_in_bin filename in try let str = Bytes.create len in really_input ic str 0 len; if (* I had some jpeg started with 7f58, the 7th bits were missing... *) (* int_of_char str.[0] lor 0x80 = 0xff && int_of_char str.[1] lor 0x80 = 0xd8 *) int_of_char str.[0] = 0xff && int_of_char str.[1] = 0xd8 (* && String.sub str 6 4 = "JFIF" --- JFIF standard *) then begin let w, h = try find_jpeg_size ic with | Not_found -> -1, -1 in Pervasives.close_in ic; { header_width = w; header_height = h; header_infos = []; } end else raise Wrong_file_type with | _ -> Pervasives.close_in ic; raise Wrong_file_type;; let read_markers filename = let _, _, ic, rev_markers = open_in_header filename in close_in ic; List.rev_map Marker.t_of_raw rev_markers let write_marker oh mrk = write_marker oh (Marker.raw_of_t mrk) let () = add_methods Jpeg { check_header = check_header; load = Some load; save = Some save; load_sequence = None; save_sequence = None};; camlspotter-camlimages-e471b3c4470d/src/jpeg.mli0000644000000000000000000000535712405272062017623 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: jpeg.mli,v 1.2 2008/05/17 19:55:50 furuse Exp $ *) module Marker : sig (** Jpeg Marker such as EXIF *) type t = | Comment of string | App of int * string val format : Format.formatter -> t -> unit end val load : string -> Images.load_option list -> Images.t;; (** Loads a jpeg image. *) val load_thumbnail : string -> Images.load_option list -> Geometry.spec -> int * int * Images.t;; val save : string -> Images.save_option list -> Images.t -> unit;; (** Save a full-color image in jpeg format file. Raises [Invalid_argument] if the image is not a full-color image. *) val save_with_markers : string -> Images.save_option list -> Images.t -> Marker.t list -> unit;; (** Same as [save] but it also writes markers *) val save_as_cmyk : string -> Images.save_option list -> (Images.rgb -> int * int * int * int) -> Images.t -> unit;; (** This converts RGB images to CMYK, but the color conversion is not something fancy. *) val save_cmyk_sample : string -> Images.save_option list -> unit;; (** Create CMYK jpeg image sample. Just for developpers. *) (** Scanline based I/O functions *) type in_handle;; val open_in : string -> int * int * in_handle * Marker.t list;; val open_in_thumbnail : string -> Geometry.spec -> int * int * (int * int * in_handle) * Marker.t list;; val read_scanline : in_handle -> bytes -> int -> unit;; val close_in : in_handle -> unit;; type out_handle;; val open_out : string -> int -> int -> int -> out_handle;; val write_marker : out_handle -> Marker.t -> unit;; val write_scanline : out_handle -> bytes -> unit;; val close_out : out_handle -> unit;; val check_header : string -> Images.header;; (** Checks the file header *) val read_markers : string -> Marker.t list (** Open the file, read the markers, then close it immediately. *) camlspotter-camlimages-e471b3c4470d/src/jpeg_na.c0000644000000000000000000000355112405272062017734 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #include #include #include #include value jpeg_set_scale_denom(){ failwith("unsupported"); } value open_jpeg_file_for_read(){ failwith("unsupported"); } value open_jpeg_file_for_read_start(){ failwith("unsupported"); } value read_jpeg_scanline(){ failwith("unsupported"); } value read_jpeg_scanlines(){ failwith("unsupported"); } value close_jpeg_file_for_read(){ failwith("unsupported"); } value open_jpeg_file_for_write_colorspace(){ failwith("unsupported"); } value open_jpeg_file_for_write(){ failwith("unsupported"); } value open_jpeg_file_for_write_cmyk(){ failwith("unsupported"); } value write_jpeg_scanline(){ failwith("unsupported"); } value close_jpeg_file_for_write(){ failwith("unsupported"); } value read_JPEG_file(){ failwith("unsupported"); } value write_JPEG_file(){ failwith("unsupported"); } void caml_jpeg_write_marker(){ failwith("unsupported"); } camlspotter-camlimages-e471b3c4470d/src/jpegread.c0000644000000000000000000002366112405272062020116 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ /* $Id: jpegread.c,v 1.5 2009/10/16 16:08:33 weis Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "oversized.h" #include #include /* * Include file for users of JPEG library. * You will need to have included system headers that define at least * the typedefs FILE and size_t before you can include jpeglib.h. * (stdio.h is sufficient on ANSI-conforming systems.) * You may also wish to include "jerror.h". */ #include "jpeglib.h" /* * is used for the optional error recovery mechanism shown in * the second part of the example. */ #include #ifdef DEBUG_JPEG # define DEBUGF(...) do{fprintf(stderr, __VA_ARGS__); fflush(stderr); }while(0) #else # define DEBUGF(...) do{/*do nothing*/}while(0) #endif char jpg_error_message[JMSG_LENGTH_MAX]; struct my_error_mgr { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* for return to caller */ }; typedef struct my_error_mgr * my_error_ptr; void my_error_exit (j_common_ptr cinfop) { /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ my_error_ptr myerr = (my_error_ptr) cinfop->err; /* Always display the message. */ /* We could postpone this until after returning, if we chose. */ fprintf(stderr,"setting libjpeg error message: \"%s\"\n", jpg_error_message); (*cinfop->err->format_message) (cinfop, jpg_error_message ); /* Return control to the setjmp point */ longjmp(myerr->setjmp_buffer, 1); } value jpeg_set_scale_denom( jpegh, denom ) value jpegh; value denom; { CAMLparam2(jpegh,denom); struct jpeg_decompress_struct *cinfop; cinfop = (struct jpeg_decompress_struct *) Field ( jpegh, 0 ); cinfop->scale_num = 1; cinfop->scale_denom = Int_val( denom ); CAMLreturn(Val_unit); } value caml_val_jpeg_marker( jpeg_saved_marker_ptr p ) { CAMLparam0(); CAMLlocal2(res, tmp); tmp = caml_alloc_string(p->data_length); memcpy( String_val(tmp), p->data, p->data_length); res = alloc_small(2,0); Field(res, 0) = Val_int(p->marker); Field(res, 1) = tmp; // fprintf(stderr, "mark %x %d\n", p->marker, p->data_length); CAMLreturn(res); } value caml_val_jpeg_rev_markers( jpeg_saved_marker_ptr q ) { CAMLparam0(); CAMLlocal3(res, tmp, hd); jpeg_saved_marker_ptr p = q; res = Val_int(0); // null while(p){ hd = caml_val_jpeg_marker(p); // This cannot come before the call of caml_val_jpeg_marker! // New allocation with non-initialized blocks crashes GC! tmp = alloc_small(2,0); Field(tmp, 0) = hd; Field(tmp, 1) = res; res = tmp; p = p->next; } CAMLreturn(res); } value open_jpeg_file_for_read( name ) value name; { CAMLparam1(name); CAMLlocal1(res); CAMLlocalN(r,4); char *filename; /* This struct contains the JPEG decompression parameters and pointers to * working space (which is allocated as needed by the JPEG library). */ struct jpeg_decompress_struct* cinfop; /* We use our private extension JPEG error handler. * Note that this struct must live as long as the main JPEG parameter * struct, to avoid dangling-pointer problems. */ struct my_error_mgr *jerrp; /* More stuff */ FILE * infile; /* source file */ int i; filename= String_val( name ); if ((infile = fopen(filename, "rb")) == NULL) { failwith("failed to open jpeg file"); } cinfop = malloc(sizeof (struct jpeg_decompress_struct)); jerrp = malloc(sizeof (struct my_error_mgr)); /* In this example we want to open the input file before doing anything else, * so that the setjmp() error recovery below can assume the file is open. * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that * requires it in order to read binary files. */ /* Step 1: allocate and initialize JPEG decompression object */ /* We set up the normal JPEG error routines, then override error_exit. */ cinfop->err = jpeg_std_error(&jerrp->pub); jerrp->pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ if (setjmp(jerrp->setjmp_buffer)) { /* If we get here, the JPEG code has signaled an error. * We need to clean up the JPEG object, close the input file, and return. */ jpeg_destroy_decompress(cinfop); free(jerrp); fclose(infile); failwith(jpg_error_message); } /* Now we can initialize the JPEG decompression object. */ jpeg_create_decompress(cinfop); /* Step 2: specify data source (eg, a file) */ jpeg_stdio_src(cinfop, infile); /* EXIF and other markers */ jpeg_save_markers(cinfop, JPEG_COM, 0xFFFF /* all */); for(i=0; i<16; i++) jpeg_save_markers(cinfop, JPEG_APP0+i, 0xFFFF /* all */); /* Step 3: read file parameters with jpeg_read_header() */ (void) jpeg_read_header(cinfop, TRUE); r[0] = Val_int(cinfop->image_width); r[1] = Val_int(cinfop->image_height); r[2] = alloc_small(3,0); Field(r[2], 0) = (value)cinfop; Field(r[2], 1) = (value)infile; Field(r[2], 2) = (value)jerrp; r[3] = caml_val_jpeg_rev_markers( cinfop->marker_list ); res = alloc_small(4,0); for(i=0; i<4; i++) Field(res, i) = r[i]; CAMLreturn(res); } value open_jpeg_file_for_read_start( jpegh ) value jpegh; { CAMLparam1(jpegh); CAMLlocal1(res); CAMLlocalN(r,3); struct jpeg_decompress_struct* cinfop; struct my_error_mgr *jerrp; FILE *infile; int i; cinfop = (struct jpeg_decompress_struct *) Field( jpegh, 0 ); infile = (FILE *) Field( jpegh, 1 ); jerrp = (struct my_error_mgr *) Field( jpegh, 2 ); /* We can ignore the return value from jpeg_read_header since * (a) suspension is not possible with the stdio data source, and * (b) we passed TRUE to reject a tables-only JPEG file as an error. * See libjpeg.doc for more info. */ /* Step 4: set parameters for decompression */ /* In this example, we don't need to change any of the defaults set by * jpeg_read_header(), so we do nothing here. */ cinfop->out_color_space = JCS_RGB; /* Step 5: Start decompressor */ (void) jpeg_start_decompress(cinfop); DEBUGF("jpeg_start_decompress"); /* We can ignore the return value since suspension is not possible * with the stdio data source. */ /* We may need to do some setup of our own at this point before reading * the data. After jpeg_start_decompress() we have the correct scaled * output image dimensions available, as well as the output colormap * if we asked for color quantization. * In this example, we need to make an output work buffer of the right size. */ /* JSAMPLEs per row in output buffer */ /* row_stride = cinfop->output_width * cinfop->output_components; */ // CR jfuruse: integer overflow r[0] = Val_int(cinfop->output_width); r[1] = Val_int(cinfop->output_height); r[2] = alloc_small(3,0); Field(r[2], 0) = (value)cinfop; Field(r[2], 1) = (value)infile; Field(r[2], 2) = (value)jerrp; res = alloc_small(3,0); for(i=0; i<3; i++) Field(res, i) = r[i]; DEBUGF("cinfop= %d infile= %d %d %d \n", (int)cinfop, (int)infile, cinfop->output_scanline, cinfop->output_height); CAMLreturn(res); } value read_jpeg_scanline( jpegh, buf, offset ) value jpegh, offset, buf; { CAMLparam3(jpegh,offset,buf); struct jpeg_decompress_struct *cinfop; JSAMPROW row[1]; cinfop = (struct jpeg_decompress_struct *) Field( jpegh, 0 ); row[0] = String_val( buf ) + Int_val( offset ); jpeg_read_scanlines( cinfop, row, 1 ); CAMLreturn(Val_unit); } /* no boundary checks */ void read_jpeg_scanlines( value jpegh, value buf, value offset, value lines ) { CAMLparam4(jpegh,offset,buf,lines); struct jpeg_decompress_struct *cinfop; JSAMPROW row[1]; int clines = Int_val(lines); int i; row[0] = String_val(buf) + Int_val(offset); cinfop = (struct jpeg_decompress_struct *) Field( jpegh, 0 ); // width is NOT image_width since we may have scale_denom <> 1 int scanline_bytes = cinfop->output_width * 3; // no padding (size 3 is fixed? ) for(i=0; ioutput_scanline, cinfop->output_height); if( cinfop->output_height > 0 ){ // == 0 means jpeg_start_decompress is never called if( cinfop->output_scanline >= cinfop->output_height ){ DEBUGF("finish_decompress\n"); jpeg_finish_decompress( cinfop ); } } DEBUGF("destroy\n"); jpeg_destroy_decompress( cinfop ); free(cinfop); free(jerrp); DEBUGF("file close\n"); fclose(infile); CAMLreturn(Val_unit); } camlspotter-camlimages-e471b3c4470d/src/jpegwrite.c0000644000000000000000000001462112405272062020331 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Franois Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include /* * Include file for users of JPEG library. * You will need to have included system headers that define at least * the typedefs FILE and size_t before you can include jpeglib.h. * (stdio.h is sufficient on ANSI-conforming systems.) * You may also wish to include "jerror.h". */ #include "jpeglib.h" /* * Sample routine for JPEG compression. We assume that the target file name * and a compression quality factor are passed in. */ #ifdef DEBUG_JPEG # define DEBUGF(...) do{fprintf(stderr, __VA_ARGS__); fflush(stderr); }while(0) #else # define DEBUGF(...) do{/*do nothing*/}while(0) #endif extern char jpg_error_message[JMSG_LENGTH_MAX]; struct my_error_mgr { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* for return to caller */ }; typedef struct my_error_mgr * my_error_ptr; extern void my_error_exit (j_common_ptr); value open_jpeg_file_for_write_colorspace( name, width, height, qual, colorspace ) value name; value width; value height; value qual; J_COLOR_SPACE colorspace; { CAMLparam0(); CAMLlocal1(res); char *filename; int image_height; int image_width; int quality; struct jpeg_compress_struct* cinfop; struct my_error_mgr *jerrp; /* More stuff */ FILE * outfile; /* source file */ image_width= Int_val( width ); image_height= Int_val( height ); filename= String_val( name ); quality= Int_val(qual); if ((outfile = fopen(filename, "wb")) == NULL) { failwith("failed to open jpeg file"); } cinfop = malloc(sizeof (struct jpeg_compress_struct)); jerrp = malloc(sizeof (struct my_error_mgr)); cinfop->err = jpeg_std_error(&jerrp->pub); jerrp->pub.error_exit = my_error_exit; if (setjmp(jerrp->setjmp_buffer)) { /* If we get here, the JPEG code has signaled an error. * We need to clean up the JPEG object, close the input file, and return. */ jpeg_destroy_compress(cinfop); free(jerrp); fclose(outfile); failwith(jpg_error_message); } jpeg_create_compress(cinfop); jpeg_stdio_dest(cinfop, outfile); cinfop->image_width= image_width; cinfop->image_height= image_height; cinfop->input_components = (colorspace == JCS_RGB ? 3 : 4); cinfop->in_color_space= colorspace /* JCS_RGB or JCS_CMYK */; jpeg_set_defaults(cinfop); jpeg_set_quality(cinfop, quality, TRUE); jpeg_start_compress(cinfop, TRUE); res = alloc_small(3,0); Field(res, 0) = (value)cinfop; Field(res, 1) = (value)outfile; Field(res, 2) = (value)jerrp; /* fprintf(stderr, "cinfop= %d outfile= %d %d %d \n", cinfop, infile, cinfop->output_scanline, cinfop->output_height); fflush(stderr); */ CAMLreturn(res); } value open_jpeg_file_for_write( name, width, height, qual ) value name; value width; value height; value qual; { return open_jpeg_file_for_write_colorspace( name, width, height, qual, JCS_RGB ); } value open_jpeg_file_for_write_cmyk( name, width, height, qual ) value name; value width; value height; value qual; { return open_jpeg_file_for_write_colorspace( name, width, height, qual, JCS_CMYK ); } void caml_jpeg_write_marker( value jpegh, value raw ) { struct jpeg_compress_struct *cinfop; cinfop = (struct jpeg_compress_struct *) Field( jpegh, 0 ); // EXTERN(void) jpeg_write_marker // JPP((j_compress_ptr cinfo, int marker, // const JOCTET * dataptr, unsigned int datalen)); int code = Int_val(Field(raw,0)); char *data = String_val(Field(raw,1)); unsigned int len = caml_string_length(Field(raw,1)); jpeg_write_marker(cinfop, code, data, len); // This actually writes bytes, so data seems to be ok being GCed. } // You can write special markers immediately following the datastream header by // calling jpeg_write_marker() after jpeg_start_compress() and before the first // call to jpeg_write_scanlines(). When you do this, the markers appear after // the SOI and the JFIF APP0 and Adobe APP14 markers (if written), but before // all else. Specify the marker type parameter as "JPEG_COM" for COM or // "JPEG_APP0 + n" for APPn. (Actually, jpeg_write_marker will let you write // any marker type, but we don't recommend writing any other kinds of marker.) // For example, to write a user comment string pointed to by comment_text: // jpeg_write_marker(cinfo, JPEG_COM, comment_text, strlen(comment_text)); value write_jpeg_scanline( jpegh, buf ) value jpegh, buf; { struct jpeg_compress_struct *cinfop; JSAMPROW row[1]; cinfop = (struct jpeg_compress_struct *) Field( jpegh, 0 ); row[0] = String_val( buf ); jpeg_write_scanlines( cinfop, row, 1 ); return Val_unit; } value close_jpeg_file_for_write( jpegh ) value jpegh; { struct jpeg_compress_struct *cinfop; struct my_error_mgr *jerrp; FILE *outfile; DEBUGF( "closing\n"); cinfop = (struct jpeg_compress_struct *) Field( jpegh, 0 ); outfile = (FILE *) Field( jpegh, 1 ); jerrp = (struct my_error_mgr *) Field( jpegh, 2 ); DEBUGF( "cinfop= %d outfile= %d %d %d \n", cinfop, outfile, cinfop->next_scanline, cinfop->image_height); if( cinfop->next_scanline >= cinfop->image_height ){ DEBUGF( "finish\n"); jpeg_finish_compress( cinfop ); } DEBUGF( "destroy\n"); jpeg_destroy_compress( cinfop ); free(cinfop); free(jerrp); DEBUGF( "file close\n"); fclose(outfile); return Val_unit; } camlspotter-camlimages-e471b3c4470d/src/mstring.ml0000644000000000000000000001207112405272062020177 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: mstring.ml,v 1.1 2006/11/28 15:43:28 rousse Exp $*) (** String utilities *) open Util (** split a string according to char_sep predicate *) let split_str char_sep str = let len = String.length str in if len = 0 then [] else let rec skip_sep cur = if cur >= len then cur else if char_sep str.[cur] then skip_sep (succ cur) else cur in let rec split beg cur = if cur >= len then if beg = cur then [] else [String.sub str beg (len - beg)] else if char_sep str.[cur] then let nextw = skip_sep cur in String.sub str beg (cur - beg) :: split nextw nextw else split beg (succ cur) in let wstart = skip_sep 0 in split wstart wstart;; (* split a string according to char_sep predicate *) let split_str_quoted char_sep str = let len = String.length str in if len = 0 then [] else let cword = ref "" in let rec skip_sep cur = if cur >= len then cur else if char_sep str.[cur] then skip_sep (succ cur) else cur in let rec close_quote cur = if cur >= len then cur else if str.[cur] = '"' then cur else begin cword := !cword ^ String.make 1 str.[cur]; close_quote (succ cur) end in let rec split beg cur = if cur >= len then if beg = cur then [] else [!cword] else if str.[cur] = '"' then let endquote = close_quote (succ cur) in split beg (succ endquote) else if char_sep str.[cur] then let nextw = skip_sep cur in let word = !cword in cword := ""; word :: split nextw nextw else begin cword := !cword ^ String.make 1 str.[cur]; split beg (succ cur) end in let wstart = skip_sep 0 in split wstart wstart;; (* extract the . suffix (dot excluded) of a string *) let get_suffix s = try let dotpos = succ (String.rindex s '.') in String.sub s dotpos (String.length s - dotpos) with | Not_found -> "";; (* HEX/DEC conversions *) let hex_to_dec c = match c with | '0'..'9' -> int_of_char c - 48 | 'a'..'f' -> int_of_char c - 87 (* 87 = int_of_char 'a' - 10 *) | 'A'..'F' -> int_of_char c - 55 (* 55 = int_of_char 'A' - 10 *) | _ -> failwith "hex_to_dec";; let dec_to_hex i = if i < 10 then char_of_int (i + 48) (* 48 = int_of_char '0' *) else char_of_int (i + 55) (* 55 = int_of_char 'A' - 10 *);; (* Converting a hex stored string *) let hex_to_string s = let len = String.length s / 2 in Bytes.init len @@ fun i -> char_of_int ( 16 * (hex_to_dec s.[i + i]) + hex_to_dec s.[i + i + 1]) ;; let gensym = let cnter = ref 0 in (fun n -> incr cnter; n ^ string_of_int !cnter);; let rem_trailing_sp s = let l = String.length s in let pos = ref (l - 1) in while !pos >= 0 && List.mem s.[!pos] [' '; '\t'] do decr pos done; if !pos = l - 1 then s else String.sub s 0 (succ !pos);; let catenate_sep = String.concat;; (** Filters CRLF: - CR -> LF - CRLF -> LF - LF -> LF We do this on successive chunks of a stream, so we need to consider the case when the chunk finishes on CR. Assume len > 0 *) let norm_crlf lastwascr buf offs len = let rpos = ref offs and wpos = ref 0 and dest = Bytes.create (len + 1) (* we need one more char *) and limit = offs + len - 1 and lastiscr = ref false in if lastwascr then if buf.[!rpos] = '\n' then begin dest << !wpos & '\n'; incr rpos; incr wpos end else begin dest << !wpos & '\n'; incr wpos end; while !rpos < limit do match buf.[!rpos] with | '\n' -> dest << !wpos & '\n'; incr rpos; incr wpos | '\r' -> if buf.[!rpos + 1] = '\n' then begin dest << !wpos & '\n'; rpos := !rpos + 2; incr wpos end else begin dest << !wpos & '\n'; incr rpos; incr wpos end | c -> dest << !wpos & c; incr rpos; incr wpos done; begin match buf.[offs+len-1] with | '\n' -> dest << !wpos & '\n'; incr wpos | '\r' -> lastiscr := true | c -> dest << !wpos & c; incr wpos end; String.sub dest 0 !wpos, !lastiscr;; let hexchar c = let i = int_of_char c in String.init 3 @@ function | 0 -> '%' | 1 -> dec_to_hex (i / 16) | 2 -> dec_to_hex (i mod 16) | _ -> assert false camlspotter-camlimages-e471b3c4470d/src/mstring.mli0000644000000000000000000000323412405272062020351 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: mstring.mli,v 1.1 2006/11/28 15:43:28 rousse Exp $*) (** String utilities *) val split_str : (char -> bool) -> string -> string list;; val split_str_quoted : (char -> bool) -> string -> string list;; val get_suffix : string -> string;; val hex_to_dec : char -> int;; val dec_to_hex : int -> char;; val hex_to_string : string -> string;; val gensym : string -> string;; val rem_trailing_sp : string -> string;; val catenate_sep : string -> string list -> string;; val norm_crlf : bool -> string -> int -> int -> string * bool;; (** [norm_crlf last_was_cr buf offs len] returns buf with CRLF/CR/LF converted to LF, and a flag indicating whether last char was CR. *) val hexchar : char -> string;; camlspotter-camlimages-e471b3c4470d/src/oBmp.ml0000644000000000000000000000212012405272062017403 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oBmp.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) open OImages;; let load name opts = OImages.make (Bmp.load name opts);; let save name opts image = match image#image_class with | ClassRgb24 | ClassIndex8 -> Bmp.save name opts image#image | _ -> raise Wrong_image_class;; camlspotter-camlimages-e471b3c4470d/src/oColor.ml0000644000000000000000000000367012405272062017756 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oColor.ml,v 1.1 2006/11/28 15:43:28 rousse Exp $*) (** Class interface for Color *) open Color;; class virtual ['a] map (cmap : 'a Color.map) = object val mapobj = cmap method colormap = mapobj method max = mapobj.max method map = mapobj.map method query_color x = if x < size cmap then cmap.map.(x) else raise Not_found method set_max max = mapobj.max <- max method set_map map = mapobj.map <- map method size = size mapobj method find_exact = find_exact mapobj method add_color = add_color mapobj method add_colors = add_colors mapobj method virtual find_nearest : 'a -> int end;; class rgbmap (cmap : rgb Color.map) = object inherit [rgb] map cmap method find_nearest = Rgb.find_nearest mapobj end;; class rgbamap (cmap : rgba Color.map) = object inherit [rgba] map cmap method find_nearest = Rgba.find_nearest mapobj end;; class cmykmap (cmap : cmyk Color.map) = object inherit [cmyk] map cmap method find_nearest = Cmyk.find_nearest mapobj end;; camlspotter-camlimages-e471b3c4470d/src/oColor.mli0000644000000000000000000000467212405272062020132 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oColor.mli,v 1.1 2006/11/28 15:43:28 rousse Exp $*) (** Class interface for Color *) class rgbmap : Color.rgb Color.map -> object method add_color : Color.rgb -> int method add_colors : Color.rgb list -> int list method colormap : Color.rgb Color.map method find_exact : Color.rgb -> int method find_nearest : Color.rgb -> int method map : Color.rgb array method max : int method query_color : int -> Color.rgb method set_map : Color.rgb array -> unit method set_max : int -> unit method size : int end;; class rgbamap : Color.rgba Color.map -> object method add_color : Color.rgba -> int method add_colors : Color.rgba list -> int list method colormap : Color.rgba Color.map method find_exact : Color.rgba -> int method find_nearest : Color.rgba -> int method map : Color.rgba array method max : int method query_color : int -> Color.rgba method set_map : Color.rgba array -> unit method set_max : int -> unit method size : int end;; class cmykmap : Color.cmyk Color.map -> object method add_color : Color.cmyk -> int method add_colors : Color.cmyk list -> int list method colormap : Color.cmyk Color.map method find_exact : Color.cmyk -> int method find_nearest : Color.cmyk -> int method map : Color.cmyk array method max : int method query_color : int -> Color.cmyk method set_map : Color.cmyk array -> unit method set_max : int -> unit method size : int end;; camlspotter-camlimages-e471b3c4470d/src/oFreetype.ml0000644000000000000000000001214112405272062020454 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oFreetype.ml,v 1.2 2008/06/16 22:35:42 furuse Exp $ *) open Images;; open Freetype;; let library = ref None;; (* We do not want more than 1 engine, don't we ? *) let get_library () = match !library with | None -> let e = init () in library := Some e; e | Some e -> e;; class face file id = let library = get_library () in let face, _info = new_face library file id in object method library = library method face = face method set_char_size = set_char_size face method set_pixel_sizes = set_pixel_sizes face method num_glyphs = get_num_glyphs face method charmaps = get_charmaps face method set_charmap = set_charmap face method char_index = get_char_index face method load_glyph = load_glyph face method load_char = load_char face method render_glyph_of_face = render_glyph_of_face face method render_glyph = render_glyph face method render_char = render_char face method set_transform = set_transform face method glyph_metrics = get_glyph_metrics face method size_metrics = get_size_metrics face method outline_contents = get_outline_contents face method size string = Fttext.size face string method size_of_glyphs string = Fttext.size_of_glyphs face string end;; let draw_gen render_mode renderf rot func face px py string = let face = face#face in let matrix = matrix_rotate rot in let curx = ref (0.0) and cury = ref (0.0) in for i = 0 to Array.length string - 1 do set_transform face matrix {ft_x= !curx; ft_y= !cury}; let advx, advy = renderf face string.(i) [] render_mode in let binfo = get_bitmap_info face in for y = 0 to binfo.bitmap_height - 1 do for x = 0 to binfo.bitmap_width - 1 do let z = read_bitmap face x y in let level = if z < 0 then 0 else if z > 255 then 255 else z in let px = px + binfo.bitmap_left + x and py = py - (binfo.bitmap_top - binfo.bitmap_height + y) in func px py level done; done; curx := !curx +. advx; cury := !cury +. advy done;; let draw_rotated_gen render_mode face (func : 'a -> int -> 'a) (image : 'a OImages.map) px py rot renderf string = (*let putpixel px py level = try let orgcolor = image#get px py in image#set px py (func orgcolor level); with Out_of_image -> () in*) let face = face#face in let matrix = matrix_rotate rot in let curx = ref (0.0) and cury = ref (0.0) in for i = 0 to Array.length string - 1 do set_transform face matrix {ft_x= !curx; ft_y= !cury}; let advx, advy = renderf face string.(i) [] render_mode in let binfo = get_bitmap_info face in for y = 0 to binfo.bitmap_height - 1 do for x = 0 to binfo.bitmap_width - 1 do let z = read_bitmap face x y in let level = if z < 0 then 0 else if z > 255 then 255 else z in try let px = px + binfo.bitmap_left + x and py = py - (binfo.bitmap_top - binfo.bitmap_height + y) in let orgcolor = image#get px py in image#set px py (func orgcolor level); with Out_of_image -> () done; done; curx := !curx +. advx; cury := !cury +. advy done;; let draw_rotated_text face func image x y rot string = draw_rotated_gen Render_Normal face func image x y rot render_char string;; let draw_rotated_glyphs face func image x y rot string = draw_rotated_gen Render_Normal face func image x y rot render_glyph string;; let draw_text face func image x y string = draw_rotated_text face func image x y 0.0 string;; let draw_glyphs face func image x y string = draw_rotated_glyphs face func image x y 0.0 string;; (* mono *) let draw_mono_rotated_text face func image x y rot string = draw_rotated_gen Render_Mono face func image x y rot render_char string;; let draw_mono_rotated_glyphs face func image x y rot string = draw_rotated_gen Render_Mono face func image x y rot render_glyph string;; let draw_mono_text face func image x y string = draw_mono_rotated_text face func image x y 0.0 string;; let draw_mono_glyphs face func image x y string = draw_mono_rotated_glyphs face func image x y 0.0 string;; (* Vector based *) let vector_text turn_y func face px py rot string = Fttext.vector_gen load_char turn_y rot func face#face px py string;; let vector_glyphs turn_y func face px py rot string = Fttext.vector_gen load_glyph turn_y rot func face#face px py string;; camlspotter-camlimages-e471b3c4470d/src/oGif.ml0000644000000000000000000000240112405272062017374 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oGif.ml,v 1.2 2008/06/16 22:35:42 furuse Exp $ *) open OImages;; let load_first name opts = OImages.make (Gif.load_first name opts);; let save_image name opts image = let img = image#image in match img with | Images.Index8 _bmp -> Gif.save_image name opts img | _ -> raise Wrong_image_class;; camlspotter-camlimages-e471b3c4470d/src/oGraphic.ml0000644000000000000000000000234412405272062020252 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oGraphic.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) open Images;; open OImages;; let draw image x y = try Graphic_image.draw_image image#image x y with | Wrong_image_type -> raise Wrong_image_class;; let get x y w h = new rgb24_wrapper (Graphic_image.get_image x y w h);; camlspotter-camlimages-e471b3c4470d/src/oImages.ml0000644000000000000000000003167312405272062020111 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oImages.ml,v 1.5 2009/03/01 09:49:53 furuse Exp $ *) open Images;; exception Non_supported_method;; exception Wrong_image_class;; type image_class = | ClassRgb24 | ClassIndex8 | ClassIndex16 | ClassRgba32 | ClassCmyk32;; class type imgsize = object method width : int method height : int end;; class type ['a] map = object inherit imgsize method unsafe_get : int -> int -> 'a method unsafe_set : int -> int -> 'a -> unit method get : int -> int -> 'a method set : int -> int -> 'a -> unit method unsafe_access : int -> int -> string * int end;; class type oimage = object inherit imgsize method infos : info list method set_infos : info list -> unit method image_class : image_class method image : Images.t method destroy : unit method dump : string method save : string -> format option -> save_option list -> unit method coerce : oimage method blocks : int * int method dump_block : int -> int -> Bitmap.Block.t end;; (* Implementation *) class virtual oimage_impl = object (self) method virtual image_class : image_class method virtual image : Images.t method virtual width : int method virtual height : int method virtual infos : info list method virtual set_infos : info list -> unit method virtual destroy : unit method virtual dump : string method virtual save : string -> format option -> save_option list -> unit method coerce = (self :> < image : _; image_class : _; width : _; height : _; infos : _; set_infos : _; destroy : _; dump : _; save : _; coerce : _; blocks : _; dump_block : _>) method virtual blocks : int * int method virtual dump_block : int -> int -> Bitmap.Block.t end;; open Rgb24;; class type rgba32_class = object inherit oimage inherit [Color.rgba] map method sub : int -> int -> int -> int -> rgba32_class method blit : int -> int -> rgba32_class -> int -> int -> int -> int -> unit method resize : (float -> unit) option -> int -> int -> rgba32_class method to_rgb24 : rgb24_class end and rgb24_class = object inherit oimage inherit [Color.rgb] map method sub : int -> int -> int -> int -> rgb24_class method blit : int -> int -> rgb24_class -> int -> int -> int -> int -> unit method resize : (float -> unit) option -> int -> int -> rgb24_class method to_rgba32 : rgba32_class end;; class rgba32_wrapper img = object inherit oimage_impl method image_class = ClassRgba32 method image = Images.Rgba32 img method width = img.Rgba32.width method height = img.Rgba32.height method infos = img.Rgba32.infos method dump = Rgba32.dump img method set_infos infos = img.Rgba32.infos <- infos method unsafe_access = Rgba32.unsafe_access img method unsafe_get = Rgba32.unsafe_get img method unsafe_set = Rgba32.unsafe_set img method get = Rgba32.get img method set = Rgba32.set img method destroy = Rgba32.destroy img method sub x y w h = new rgba32_wrapper (Rgba32.sub img x y w h) method blit sx sy (dst : rgba32_class) = Images.blit (Rgba32 img) sx sy dst#image method resize prog nw nh = new rgba32_wrapper (Rgba32.resize prog img nw nh) method save name format opts = Images.save name format opts (Rgba32 img) method to_rgb24 = new rgb24_wrapper (Rgb24.of_rgba32 img) method blocks = Rgba32.blocks img method dump_block = Rgba32.dump_block img end and rgb24_wrapper img = object inherit oimage_impl method image_class = ClassRgb24 method image = Images.Rgb24 img method width = img.Rgb24.width method height = img.Rgb24.height method infos = img.Rgb24.infos method dump = dump img method set_infos infos = img.Rgb24.infos <- infos method unsafe_access = unsafe_access img method unsafe_get = unsafe_get img method unsafe_set = unsafe_set img method get = get img method set = set img method destroy = destroy img method sub x y w h = new rgb24_wrapper (sub img x y w h) method blit sx sy (dst : rgb24_class) = Images.blit (Rgb24 img) sx sy dst#image method resize prog nw nh = new rgb24_wrapper (resize prog img nw nh) method save name format opts = Images.save name format opts (Rgb24 img) method to_rgba32 = new rgba32_wrapper (Rgb24.to_rgba32 img) method blocks = Rgb24.blocks img method dump_block = Rgb24.dump_block img end;; class rgba32 width height = object inherit rgba32_wrapper (Rgba32.create width height) end;; class rgba32_filled width height init = object inherit rgba32_wrapper (Rgba32.make width height init) end;; class rgba32_with width height data bitmap = object inherit rgba32_wrapper (Rgba32.create_with width height data bitmap) end;; class rgb24 width height = object inherit rgb24_wrapper (create width height) end;; class rgb24_filled width height init = object inherit rgb24_wrapper (make width height init) end;; class rgb24_with width height data bitmap = object inherit rgb24_wrapper (create_with width height data bitmap) end;; open Index8;; class type index8_class = object inherit oimage inherit [Index8.elt] map inherit OColor.rgbmap method sub : int -> int -> int -> int -> index8_class method blit : int -> int -> index8_class -> int -> int -> int -> int -> unit method get_color : int -> int -> Color.rgb method unsafe_get_color : int -> int -> Color.rgb method transparent : Index8.elt method set_transparent : Index8.elt -> unit method to_rgb24 : rgb24_class method to_rgba32 : rgba32_class end;; class index8_wrapper img = object (self) inherit oimage_impl inherit OColor.rgbmap img.colormap method image_class = ClassIndex8 method image = Index8 img method width = img.width method height = img.height method transparent = img.transparent method infos = img.infos method dump = dump img method set_transparent c = img.transparent <- c method set_infos infos = img.infos <- infos method unsafe_access = unsafe_access img method unsafe_get = unsafe_get img method unsafe_set = unsafe_set img method get = get img method set = set img method get_color x y = self#query_color (self#get x y) method unsafe_get_color x y = self#query_color (self#unsafe_get x y) method destroy = destroy img method sub x y w h = new index8_wrapper (Index8.sub img x y w h) method blit sx sy (dst : index8_class) = Images.blit (Index8 img) sx sy dst#image method save name format opts = Images.save name format opts (Index8 img) method to_rgb24 = new rgb24_wrapper (Index8.to_rgb24 img) method to_rgba32 = new rgba32_wrapper (Index8.to_rgba32 img) method blocks = Index8.blocks img method dump_block = Index8.dump_block img end;; class index8 width height = object inherit index8_wrapper (create width height) end;; class index8_filled width height init = object inherit index8_wrapper (make width height init) end;; class index8_with width height infos cmap trans bitmap = object inherit index8_wrapper (create_with width height infos cmap trans bitmap) end;; open Index16;; class type index16_class = object inherit oimage inherit [Index16.elt] map inherit OColor.rgbmap method sub : int -> int -> int -> int -> index8_class method blit : int -> int -> index8_class -> int -> int -> int -> int -> unit method get_color : int -> int -> Color.rgb method unsafe_get_color : int -> int -> Color.rgb method transparent : Index16.elt method set_transparent : Index16.elt -> unit method to_rgb24 : rgb24_class method to_rgba32 : rgba32_class end;; class index16_wrapper img = object (self) inherit oimage_impl inherit OColor.rgbmap img.colormap method image_class = ClassIndex16 method image = Index16 img method width = img.width method height = img.height method transparent = img.transparent method infos = img.infos method dump = dump img method set_transparent c = img.transparent <- c method set_infos infos = img.infos <- infos method unsafe_access = unsafe_access img method unsafe_get = unsafe_get img method unsafe_set = unsafe_set img method get = get img method set = set img method get_color x y = self#query_color (self#get x y) method unsafe_get_color x y = self#query_color (self#unsafe_get x y) method destroy = destroy img method sub x y w h = new index16_wrapper (Index16.sub img x y w h) method blit sx sy (dst : index16_class) = Images.blit (Index16 img) sx sy dst#image method to_rgb24 = new rgb24_wrapper (Index16.to_rgb24 img) method to_rgba32 = new rgba32_wrapper (Index16.to_rgba32 img) method save name format opts = Images.save name format opts (Index16 img) method blocks = Index16.blocks img method dump_block = Index16.dump_block img end;; class index16 width height = object inherit index16_wrapper (create width height) end;; class index16_filled width height init = object inherit index16_wrapper (make width height init) end;; class index16_with width height infos cmap trans bitmap = object inherit index16_wrapper (create_with width height infos cmap trans bitmap) end;; open Cmyk32;; class type cmyk32_class = object inherit oimage inherit [Color.cmyk] map method sub : int -> int -> int -> int -> cmyk32_class method blit : int -> int -> cmyk32_class -> int -> int -> int -> int -> unit method resize : (float -> unit) option -> int -> int -> cmyk32_class end;; class cmyk32_wrapper img = object inherit oimage_impl method image_class = ClassCmyk32 method image = Images.Cmyk32 img method width = img.width method height = img.height method infos = img.infos method dump = dump img method set_infos infos = img.infos <- infos method unsafe_access = unsafe_access img method unsafe_get = unsafe_get img method unsafe_set = unsafe_set img method get = get img method set = set img method destroy = destroy img method sub x y w h = new cmyk32_wrapper (sub img x y w h) method blit sx sy (dst : cmyk32_class) = Images.blit (Cmyk32 img) sx sy dst#image method resize prog nw nh = new cmyk32_wrapper (resize prog img nw nh) method save name format opts = Images.save name format opts (Cmyk32 img) method blocks = Cmyk32.blocks img method dump_block = Cmyk32.dump_block img end;; class cmyk32 width height = object inherit cmyk32_wrapper (create width height) end;; class cmyk32_filled width height init = object inherit cmyk32_wrapper (make width height init) end;; class cmyk32_with width height data bitmap = object inherit cmyk32_wrapper (create_with width height data bitmap) end;; type tagged = | Rgb24 of rgb24_class | Index8 of index8_class | Index16 of index16_class | Rgba32 of rgba32_class | Cmyk32 of cmyk32_class;; let rgb24 oimage = if oimage#image_class = ClassRgb24 then (Obj.magic oimage : rgb24_class) else raise Wrong_image_class;; let index8 oimage = if oimage#image_class = ClassIndex8 then (Obj.magic oimage : index8_class) else raise Wrong_image_class;; let index16 oimage = if oimage#image_class = ClassIndex16 then (Obj.magic oimage : index16_class) else raise Wrong_image_class;; let rgba32 oimage = if oimage#image_class = ClassRgba32 then (Obj.magic oimage : rgba32_class) else raise Wrong_image_class;; let cmyk32 oimage = if oimage#image_class = ClassCmyk32 then (Obj.magic oimage : cmyk32_class) else raise Wrong_image_class;; let tag img = match img#image_class with | ClassRgb24 -> Rgb24 (Obj.magic img : rgb24_class) | ClassIndex8 -> Index8 (Obj.magic img : index8_class) | ClassIndex16 -> Index16 (Obj.magic img : index16_class) | ClassRgba32 -> Rgba32 (Obj.magic img : rgba32_class) | ClassCmyk32 -> Cmyk32 (Obj.magic img : cmyk32_class);; let make = function | Images.Index8 img -> (new index8_wrapper img)#coerce | Images.Rgb24 img -> (new rgb24_wrapper img)#coerce | Images.Index16 img -> (new index16_wrapper img)#coerce | Images.Rgba32 img -> (new rgba32_wrapper img)#coerce | Images.Cmyk32 img -> (new cmyk32_wrapper img)#coerce;; let sub img x y w h = match tag img with | Rgb24 i -> (i#sub x y w h)#coerce | Index8 i -> (i#sub x y w h)#coerce | Index16 i -> (i#sub x y w h)#coerce | Rgba32 i -> (i#sub x y w h)#coerce | Cmyk32 i -> (i#sub x y w h)#coerce;; let load filename load_options = make (Images.load filename load_options);; camlspotter-camlimages-e471b3c4470d/src/oImages.mli0000644000000000000000000001262412405272062020255 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oImages.mli,v 1.5 2009/03/01 11:24:10 furuse Exp $ *) (** Class interface for Images *) open Images (* open Color *) exception Non_supported_method exception Wrong_image_class type image_class = | ClassRgb24 | ClassIndex8 | ClassIndex16 | ClassRgba32 | ClassCmyk32 class type imgsize = object method width : int method height : int end class type ['a] map = object inherit imgsize method unsafe_get : int -> int -> 'a method unsafe_set : int -> int -> 'a -> unit method get : int -> int -> 'a method set : int -> int -> 'a -> unit method unsafe_access : int -> int -> bytes * int end class type oimage = object inherit imgsize method infos : info list method set_infos : info list -> unit method image_class : image_class method image : Images.t method destroy : unit method dump : bytes method save : string -> format option -> save_option list -> unit method coerce : oimage method blocks : int * int method dump_block : int -> int -> Bitmap.Block.t end class type rgba32_class = object inherit oimage inherit [Color.rgba] map method sub : int -> int -> int -> int -> rgba32_class method blit : int -> int -> rgba32_class -> int -> int -> int -> int -> unit method resize : (float -> unit) option -> int -> int -> rgba32_class method to_rgb24 : rgb24_class end and rgb24_class = object inherit oimage inherit [Color.rgb] map method sub : int -> int -> int -> int -> rgb24_class method blit : int -> int -> rgb24_class -> int -> int -> int -> int -> unit method resize : (float -> unit) option -> int -> int -> rgb24_class method to_rgba32 : rgba32_class end class rgba32_wrapper : Rgba32.t -> rgba32_class class rgba32 : int -> int -> rgba32_class class rgba32_filled : int -> int -> Color.rgba -> rgba32_class class rgba32_with : int -> int -> Info.info list -> bytes -> rgba32_class class rgb24_wrapper : Rgb24.t -> rgb24_class class rgb24 : int -> int -> rgb24_class class rgb24_filled : int -> int -> Color.rgb -> rgb24_class class rgb24_with : int -> int -> Info.info list -> bytes -> rgb24_class class type index8_class = object inherit oimage inherit [Index8.elt] map inherit OColor.rgbmap method sub : int -> int -> int -> int -> index8_class method blit : int -> int -> index8_class -> int -> int -> int -> int -> unit method get_color : int -> int -> Color.rgb method unsafe_get_color : int -> int -> Color.rgb method transparent : Index8.elt method set_transparent : Index8.elt -> unit method to_rgb24 : rgb24_class method to_rgba32 : rgba32_class end class index8_wrapper : Index8.t -> index8_class class index8 : int -> int -> index8_class class index8_filled : int -> int -> int -> index8_class class index8_with : int -> int -> Info.info list -> Color.rgb Color.map -> int -> bytes -> index8_class class type index16_class = object inherit oimage inherit [Index16.elt] map inherit OColor.rgbmap method sub : int -> int -> int -> int -> index16_class method blit : int -> int -> index16_class -> int -> int -> int -> int -> unit method get_color : int -> int -> Color.rgb method unsafe_get_color : int -> int -> Color.rgb method transparent : Index16.elt method set_transparent : Index16.elt -> unit method to_rgb24 : rgb24_class method to_rgba32 : rgba32_class end class index16_wrapper : Index16.t -> index16_class class index16 : int -> int -> index16_class class index16_filled : int -> int -> int -> index16_class class index16_with : int -> int -> Info.info list -> Color.rgb Color.map -> int -> bytes -> index16_class class type cmyk32_class = object inherit oimage inherit [Color.cmyk] map method sub : int -> int -> int -> int -> cmyk32_class method blit : int -> int -> cmyk32_class -> int -> int -> int -> int -> unit method resize : (float -> unit) option -> int -> int -> cmyk32_class end class cmyk32_wrapper : Cmyk32.t -> cmyk32_class class cmyk32 : int -> int -> cmyk32_class class cmyk32_filled : int -> int -> Color.cmyk -> cmyk32_class class cmyk32_with : int -> int -> Info.info list -> bytes -> cmyk32_class val rgb24 : oimage -> rgb24_class val index8 : oimage -> index8_class val index16 : oimage -> index16_class val rgba32 : oimage -> rgba32_class val cmyk32 : oimage -> cmyk32_class type tagged = | Rgb24 of rgb24_class | Index8 of index8_class | Index16 of index16_class | Rgba32 of rgba32_class | Cmyk32 of cmyk32_class val tag : oimage -> tagged val make : Images.t -> oimage val load : string -> Images.load_option list -> oimage val sub : oimage -> int -> int -> int -> int -> oimage camlspotter-camlimages-e471b3c4470d/src/oJpeg.ml0000644000000000000000000000241712405272062017563 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oJpeg.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) let load name opts = OImages.make (Jpeg.load name opts);; let load_thumbnail name opts geom_spec = let w, h, img = Jpeg.load_thumbnail name opts geom_spec in w, h, OImages.make img;; let save name opts image = let rgb24 = OImages.rgb24 image in Jpeg.save name opts rgb24#image;; let save_as_cmyk name opts trans image = let rgb24 = OImages.rgb24 image in Jpeg.save_as_cmyk name opts trans rgb24#image;; camlspotter-camlimages-e471b3c4470d/src/oJpeg.mli0000644000000000000000000000055612405272062017736 0ustar 00000000000000val load : string -> Images.load_option list -> OImages.oimage val load_thumbnail : string -> Images.load_option list -> Geometry.spec -> int * int * OImages.oimage val save : string -> Images.save_option list -> OImages.oimage -> unit val save_as_cmyk : string -> Images.save_option list -> (Images.rgb -> int * int * int * int) -> OImages.oimage -> unit camlspotter-camlimages-e471b3c4470d/src/oPng.ml0000644000000000000000000000205412405272062017417 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oPng.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) let load_as_rgb24 name opts = OImages.make (Png.load_as_rgb24 name opts);; let load name opts = OImages.make (Png.load name opts);; let save name opts image = Png.save name opts image#image;; camlspotter-camlimages-e471b3c4470d/src/oPng.mli0000644000000000000000000000033012405272062017563 0ustar 00000000000000val load_as_rgb24 : string -> Images.load_option list -> OImages.oimage val load : string -> Images.load_option list -> OImages.oimage val save : string -> Images.save_option list -> < image : Images.t; .. > -> unit camlspotter-camlimages-e471b3c4470d/src/oPpm.ml0000644000000000000000000000212012405272062017421 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999, 2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oPpm.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) open OImages;; let load name opts = OImages.make (Ppm.load name opts);; let save name opts image = match image#image_class with | ClassRgb24 | ClassIndex8 -> Ppm.save name opts image#image | _ -> raise Wrong_image_class;; camlspotter-camlimages-e471b3c4470d/src/oPs.ml0000644000000000000000000000155012405272062017255 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oPs.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) camlspotter-camlimages-e471b3c4470d/src/oTiff.ml0000644000000000000000000000201212405272062017555 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oTiff.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) let load name opts = OImages.make (Tiff.load name opts);; let save name opts image = let rgb24 = OImages.rgb24 image in Tiff.save name opts rgb24#image;; camlspotter-camlimages-e471b3c4470d/src/oXimage.ml0000644000000000000000000000611112405272062020103 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oXimage.ml,v 1.1.2.1 2010/05/13 13:14:47 furuse Exp $*) open OImages;; open Ximage;; open Gdk;; class ximage xim = object method width = xim.width method height = xim.height method unsafe_get = Ximage.unsafe_get xim method unsafe_set = Ximage.unsafe_set xim method get = Ximage.get xim method set = Ximage.set xim method data = xim.data method destroy = Ximage.destroy xim end;; let create ~kind ~visual ~width ~height = let xim = Ximage.create ~kind ~visual ~width ~height in new ximage xim;; let get_image drawable ~x ~y ~width ~height = new ximage (Ximage.get_image drawable ~x ~y ~width ~height);; let of_image visual progress img = new ximage (Ximage.of_image visual progress img#image);; let mask_of_image win img = (* It is really inefficient *) let mono_gc = get_mono_gc win in let width, height = img#width, img#height in let draw_mask i = prerr_endline "making mask"; let bmp = Bitmap.create ~window:win ~width ~height () in let ximg = get_image bmp ~x:0 ~y:0 ~width ~height in for x = 0 to width - 1 do for y = 0 to height - 1 do if i#unsafe_get x y = i#transparent then ximg#unsafe_set x y 0 else ximg#unsafe_set x y 1 done; done; Gdk.Draw.image bmp mono_gc ximg#data ~xsrc:0 ~ysrc:0 ~xdest:0 ~ydest:0 ~width ~height; Some bmp in (* BUG ? of gtk or lablgtk? Using None for mask does not work *) begin match OImages.tag img with | Index8 i -> if i#transparent >= 0 then draw_mask i else Some (plain_mask win img#width img#height) | Index16 _i -> let i = OImages.index16 img in if i#transparent >= 0 then draw_mask i else Some (plain_mask win img#width img#height) | _ -> Some (plain_mask win img#width img#height) end;; let pixmap_of win ximage = pixmap_of win { width= ximage#width; height= ximage#height; data= ximage#data; (* finalised= false*) };; let pixmap_of_image win progress img = let visual = Gdk.Window.get_visual win in let ximage = of_image visual progress img in let msk = mask_of_image win img in let pixmap = new GDraw.pixmap ?mask: msk (pixmap_of win ximage) in pixmap;; camlspotter-camlimages-e471b3c4470d/src/oXimage.mli0000644000000000000000000000342712405272062020263 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oXimage.mli,v 1.1.2.1 2010/05/13 13:14:47 furuse Exp $*) class ximage : Ximage.t -> object method width : int method height : int method unsafe_get : int -> int -> Ximage.elt method unsafe_set : int -> int -> Ximage.elt -> unit method get : int -> int -> Ximage.elt method set : int -> int -> Ximage.elt -> unit method data : Gdk.image method destroy : unit end;; val create : kind:Gdk.Image.image_type -> visual:Gdk.visual -> width: int -> height: int -> ximage;; val get_image : [>`drawable] Gobject.obj -> x:int -> y:int -> width:int -> height:int -> ximage;; val of_image : Gdk.visual -> (float -> unit) option -> OImages.oimage -> ximage;; val mask_of_image : Gdk.window -> OImages.oimage -> Gdk.bitmap option;; val pixmap_of_image : Gdk.window -> (float -> unit) option -> OImages.oimage -> GDraw.pixmap;; camlspotter-camlimages-e471b3c4470d/src/oXimage2.ml0000644000000000000000000000210512405272062020164 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oXimage2.ml,v 1.2.2.1 2010/05/13 13:14:47 furuse Exp $*) (* This module is for backward compatibility *) include OXimage camlspotter-camlimages-e471b3c4470d/src/oXpm.ml0000644000000000000000000000164312405272062017442 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oXpm.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) let load name opts = OImages.make (Xpm.load name opts);; camlspotter-camlimages-e471b3c4470d/src/oXvthumb.ml0000644000000000000000000000224012405272062020325 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oXvthumb.ml,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) open OImages;; let load name = let info, img = Xvthumb.load name in info, new index8_wrapper img;; let save name info img = match img#image with | Images.Index8 bmp -> Xvthumb.save name info bmp | _ -> raise Wrong_image_class;; let create img = new index8_wrapper (Xvthumb.create img#image);; camlspotter-camlimages-e471b3c4470d/src/oXvthumb.mli0000644000000000000000000000200012405272062020470 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: oXvthumb.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) val load : string -> string * OImages.index8 val save : string -> string -> OImages.index8 -> unit val create : OImages.oimage -> OImages.index8 camlspotter-camlimages-e471b3c4470d/src/oversized.h0000644000000000000000000000050312405272062020342 0ustar 00000000000000#include /* Test if x or y are negative, or if multiplying x * y would cause an * arithmetic overflow. */ #define oversized(x, y) \ ((x) < 0 || (y) < 0 || ((y) != 0 && (x) > INT_MAX / (y))) #define failwith_oversized(lib) \ failwith("#lib error: image contains oversized or bogus width and height"); camlspotter-camlimages-e471b3c4470d/src/png.ml0000644000000000000000000001142212405272062017277 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: png.ml,v 1.7 2009/07/04 03:39:28 furuse Exp $ *) open Util open Images;; (* do not change the ordering, since the tags are used in png*.c *) type png_read_result = | PNG_RGB24 of string array | PNG_RGBA32 of string array | PNG_INDEX8 of string array * rgb array | PNG_INDEX16 of string array * rgb array | PNG_INDEX4 of string array * rgb array ;; external read_as_rgb24 : string -> int * int * string array = "read_png_file_as_rgb24" ;; external read : string -> int * int * png_read_result = "read_png_file" ;; external write_rgb : string -> string -> int -> int -> bool -> unit = "write_png_file_rgb" ;; external write_index : string -> string -> rgb array -> int -> int -> unit = "write_png_file_index" ;; let load_as_rgb24 name _opts = let w, h, buf = read_as_rgb24 name in Rgb24 (Rgb24.create_with_scanlines w h [] buf) ;; let load name _opts = let w, h, res = read name in match res with | PNG_RGB24 buf -> Rgb24 (Rgb24.create_with_scanlines w h [] buf) | PNG_RGBA32 buf -> Rgba32 (Rgba32.create_with_scanlines w h [] buf) | PNG_INDEX8 (buf,cmap) -> Index8 (Index8.create_with_scanlines w h [] { max = 255; map = cmap; } (-1) buf) | PNG_INDEX16 (buf,cmap) -> Index16 (Index16.create_with_scanlines w h [] { max = 65535; map = cmap } (-1) buf) | PNG_INDEX4 (buf,cmap) -> let buf' = Array.init h (fun _ -> Bytes.create w) in for y = 0 to h - 1 do let b = buf' >@! y in for x = 0 to w - 1 do b << x & char_of_int (let c = int_of_char buf.(y).[x / 2] in if x mod 2 = 0 then c lsr 4 else c mod 16) done done; Index8 (Index8.create_with_scanlines w h [] { max = 16; map = cmap } (-1) buf') ;; let save name _opts image = match image with | Rgb24 bmp -> write_rgb name (Rgb24.dump bmp) bmp.Rgb24.width bmp.Rgb24.height false | Rgba32 bmp -> write_rgb name (Rgba32.dump bmp) bmp.Rgba32.width bmp.Rgba32.height true | Index8 bmp -> write_index name (Index8.dump bmp) bmp.Index8.colormap.map bmp.Index8.width bmp.Index8.height | Index16 bmp -> write_index name (Index16.dump bmp) bmp.Index16.colormap.map bmp.Index16.width bmp.Index16.height | Cmyk32 _ -> failwith "Saving of CMYK not supported yet" ;; let check_header filename = let len = 24 in let ic = open_in_bin filename in try let str = Bytes.create len in really_input ic str 0 len; close_in ic; if String.sub str 1 3 = "PNG" then begin if String.sub str 0 8 <> "\137PNG\013\010\026\010" then begin { header_width= -1; header_height= -1; header_infos= [Info_Corrupted]; } end else begin let belong str = int_of_char str.[0] lsl 24 + int_of_char str.[1] lsl 16 + int_of_char str.[2] lsl 8 + int_of_char str.[3] in let w = belong (String.sub str 16 4) in let h = belong (String.sub str 20 4) in let bdepth = Info_Depth (int_of_char str.[12]) in let infos = try let colormodel = match int_of_char str.[13] with | 0 -> Info_ColorModel Gray | 2 -> Info_ColorModel RGB | 3 -> Info_ColorModel Index | 4 -> Info_ColorModel GrayA | 6 -> Info_ColorModel RGBA | _ -> raise Not_found in [colormodel; bdepth] with | Not_found -> [bdepth] in { header_width = w; header_height = h; header_infos = infos; } end end else raise Wrong_file_type with | _ -> close_in ic; raise Wrong_file_type ;; add_methods Png { check_header = check_header; load = Some load; save = Some save; load_sequence = None; save_sequence = None; } ;; camlspotter-camlimages-e471b3c4470d/src/png.mli0000644000000000000000000000263612405272062017457 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: png.mli,v 1.2 2008/10/31 08:51:46 weis Exp $ *) val check_header : string -> Images.header;; (** Checks the file header of a png image. *) val load : string -> Images.load_option list -> Images.t;; (** Loads a png image. *) val load_as_rgb24 : string -> Images.load_option list -> Images.t;; (** Loads a png image, and coerce it to Rgb24. *) val save : string -> Images.save_option list -> Images.t -> unit;; (** Saves an image into a png file format. *) camlspotter-camlimages-e471b3c4470d/src/png_na.c0000644000000000000000000000255112405272062017572 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #include #include #include #include value read_png_file_as_rgb24(){ failwith("unsupported"); } value Val_PngColor(){ failwith("unsupported"); } value Val_PngPalette(){ failwith("unsupported"); } value read_png_file(){ failwith("unsupported"); } value write_png_file_rgb(){ failwith("unsupported"); } value write_png_file_index(){ failwith("unsupported"); } camlspotter-camlimages-e471b3c4470d/src/pngread.c0000644000000000000000000002705212405272062017753 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Franois Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ /* $Id: pngread.c,v 1.5 2009/07/04 04:02:42 furuse Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "string.h" #include "oversized.h" #include #include #include #include #include #define PNG_TAG_RGB24 0 #define PNG_TAG_RGBA32 1 #define PNG_TAG_INDEX8 2 #define PNG_TAG_INDEX16 3 #define PNG_TAG_INDEX4 4 value read_png_file_as_rgb24( name ) value name; { CAMLparam1 ( name ); CAMLlocal3 ( res,r,tmp ); char *filename; png_structp png_ptr; png_infop info_ptr; png_uint_32 width, height; int bit_depth, color_type, interlace_type; FILE *fp; size_t rowbytes; filename = String_val( name ); if (( fp = fopen(filename, "rb")) == NULL ){ failwith("png file open failed"); } png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); /* (void *)user_error_ptr, user_error_fn, user_warning_fn); */ if( png_ptr == NULL ){ fclose(fp); failwith("it is not a png file."); } info_ptr = png_create_info_struct(png_ptr); if(info_ptr == NULL ){ fclose(fp); png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); failwith("not enough memory"); } /* error handling */ if (setjmp(png_jmpbuf(png_ptr))) { /* Free all of the memory associated with the png_ptr and info_ptr */ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); /* If we get here, we had a problem reading the file */ failwith("png read error"); } /* use standard C stream */ png_init_io(png_ptr, fp); /* png_set_sig_bytes(png_ptr, sig_read (= 0) ); */ png_read_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL); if (oversized(width, height)){ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); failwith_oversized("png"); } if ( color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA ) { png_set_gray_to_rgb(png_ptr); } if ( color_type & PNG_COLOR_TYPE_PALETTE ) png_set_expand(png_ptr); if ( bit_depth == 16 ) png_set_strip_16(png_ptr); if ( color_type & PNG_COLOR_MASK_ALPHA ) png_set_strip_alpha(png_ptr); png_read_update_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL); if ( color_type != PNG_COLOR_TYPE_RGB || bit_depth != 8 ) { png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); failwith("unsupported color type"); } rowbytes = png_get_rowbytes(png_ptr, info_ptr); // rowbytes * height should be the maximum malloc size in this function if (oversized(rowbytes, height) || oversized(sizeof(png_bytep), height)){ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); failwith("png error: image contains oversized or bogus width and height"); } { int i; png_bytep *row_pointers; void * buf; row_pointers = (png_bytep*) stat_alloc(sizeof(png_bytep) * height); buf = stat_alloc( rowbytes * height ); for( i = 0; i < height; i ++ ){ row_pointers[i] = buf + rowbytes * i; } png_set_rows(png_ptr, info_ptr, row_pointers); /* Later, we can return something */ if (setjmp(png_jmpbuf(png_ptr))) { /* Free all of the memory associated with the png_ptr and info_ptr */ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); /* If we get here, we had a problem reading the file */ fprintf(stderr, "png short file\n"); stat_free(row_pointers); stat_free(buf); CAMLreturn(res); } png_read_image(png_ptr, row_pointers); png_read_end(png_ptr, info_ptr); png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); r = alloc_tuple(height); for( i = 0; i < height; i ++ ){ tmp = caml_alloc_string(rowbytes); memcpy(String_val(tmp), buf+rowbytes*i, rowbytes); Store_field( r, i, tmp ); } res = alloc_small(3,0); Field( res, 0 ) = Val_int(width); Field( res, 1 ) = Val_int(height); Field( res, 2 ) = r; /* close the file */ fclose(fp); stat_free((void*)row_pointers); stat_free(buf); CAMLreturn(res); } } value Val_PngColor( png_color *col ) { CAMLparam0(); CAMLlocal1(res); CAMLlocalN(r,3); int i; res = Val_int(0); r[0] = Val_int( col->red ); r[1] = Val_int( col->green ); r[2] = Val_int( col->blue ); res = alloc_small(3,0); for(i=0; i<3; i++) Field(res, i) = r[i]; CAMLreturn(res); } value Val_PngPalette( png_colorp plte, int len ) { CAMLparam0(); CAMLlocal1(cmap); int i; if ( len != 0 ) { cmap = alloc_tuple( len ); for(i= 0; i< len; i++){ Store_field(cmap, i, Val_PngColor( &plte[i] )); } } else { cmap = Atom(0); } CAMLreturn(cmap); } value read_png_file( name ) value name; { CAMLparam1 ( name ); CAMLlocal4 ( res,r1,r2,tmp ); char *filename; png_structp png_ptr; png_infop info_ptr; png_uint_32 width, height; int bit_depth, color_type, interlace_type; FILE *fp; size_t rowbytes; filename = String_val( name ); if (( fp = fopen(filename, "rb")) == NULL ){ failwith("png file open failed"); } png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); /* (void *)user_error_ptr, user_error_fn, user_warning_fn); */ if( png_ptr == NULL ){ fclose(fp); failwith("it is not a png file."); } info_ptr = png_create_info_struct(png_ptr); if(info_ptr == NULL ){ fclose(fp); png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); failwith("not enough memory"); } /* error handling */ if (setjmp(png_jmpbuf(png_ptr))) { /* Free all of the memory associated with the png_ptr and info_ptr */ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); /* If we get here, we had a problem reading the file */ failwith("png read error"); } /* use standard C stream */ png_init_io(png_ptr, fp); /* png_set_sig_bytes(png_ptr, sig_read (= 0) ); */ png_read_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL); if (oversized(width, height)){ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); failwith_oversized("png"); } if ( color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA ) { png_set_gray_to_rgb(png_ptr); } /* We have no support for 48bit depth colors yet */ if ( bit_depth == 16 ) png_set_strip_16(png_ptr); png_read_update_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL); rowbytes = png_get_rowbytes(png_ptr, info_ptr); // rowbytes * height should be the maximum malloc size in this function if (oversized(rowbytes, height) || oversized(sizeof(png_bytep), height)){ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); failwith_oversized("png"); } { int i; png_bytep *row_pointers; void *buf; char mesg[256]; buf = stat_alloc(rowbytes * height); row_pointers = (png_bytep*)stat_alloc(sizeof(png_bytep) * height); for(i=0; i #include #include #include #include value write_png_file_rgb( name, buffer, width, height, with_alpha ) value name; value buffer; value width; value height; value with_alpha; { CAMLparam5 ( name, buffer, width, height, with_alpha ); FILE *fp; png_structp png_ptr; png_infop info_ptr; int w, h; int a; w = Int_val(width); h = Int_val(height); a = Bool_val(with_alpha); if (( fp = fopen(String_val(name), "wb")) == NULL ){ failwith("png file open failed"); } if ((png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL ){ fclose(fp); failwith("png_create_write_struct"); } if( (info_ptr = png_create_info_struct(png_ptr)) == NULL ){ fclose(fp); png_destroy_write_struct(&png_ptr, (png_infopp)NULL); failwith("png_create_info_struct"); } /* error handling */ if (setjmp(png_jmpbuf(png_ptr))) { /* Free all of the memory associated with the png_ptr and info_ptr */ png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); /* If we get here, we had a problem writing the file */ failwith("png write error"); } /* use standard C stream */ png_init_io(png_ptr, fp); /* we use system default compression */ /* png_set_filter( png_ptr, 0, PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_PAETH ); */ /* png_set_compression...() */ png_set_IHDR( png_ptr, info_ptr, w, h, 8 /* fixed */, a ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB, /* fixed */ PNG_INTERLACE_ADAM7, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT ); /* infos... */ png_write_info(png_ptr, info_ptr); { int rowbytes, i; png_bytep *row_pointers; char *buf = String_val(buffer); row_pointers = (png_bytep*)stat_alloc(sizeof(png_bytep) * h); rowbytes= png_get_rowbytes(png_ptr, info_ptr); #if 0 printf("rowbytes= %d width=%d\n", rowbytes, w); #endif for(i=0; i< h; i++){ row_pointers[i] = (png_bytep)(buf + rowbytes * i); } png_write_image(png_ptr, row_pointers); stat_free((void*)row_pointers); } png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); CAMLreturn(Val_unit); } void PngPalette_val( value cmap, png_colorp *pltep, int *lenp ) { int i; if( cmap == Atom(0) ){ *pltep = NULL; *lenp = 0; return; } *lenp = Wosize_val( cmap ); *pltep = malloc( sizeof( png_color ) * *lenp ); for(i=0; i< *lenp; i++){ (*pltep)[i].red = Int_val(Field(Field(cmap,i),0)); (*pltep)[i].green = Int_val(Field(Field(cmap,i),1)); (*pltep)[i].blue = Int_val(Field(Field(cmap,i),2)); } return; } value write_png_file_index( name, buffer, cmap, width, height ) value name; value buffer; value cmap; value width; value height; { CAMLparam5 ( name, buffer, cmap, width, height ); FILE *fp; png_structp png_ptr; png_infop info_ptr; int w, h; w = Int_val(width); h = Int_val(height); if (( fp = fopen(String_val(name), "wb")) == NULL ){ failwith("png file open failed"); } if ((png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL ){ fclose(fp); failwith("png_create_write_struct"); } if( (info_ptr = png_create_info_struct(png_ptr)) == NULL ){ fclose(fp); png_destroy_write_struct(&png_ptr, (png_infopp)NULL); failwith("png_create_info_struct"); } /* error handling */ if (setjmp(png_jmpbuf(png_ptr))) { /* Free all of the memory associated with the png_ptr and info_ptr */ png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); /* If we get here, we had a problem writing the file */ failwith("png write error"); } /* use standard C stream */ png_init_io(png_ptr, fp); /* we use system default compression */ /* png_set_filter( png_ptr, 0, PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_PAETH ); */ /* png_set_compression...() */ png_set_IHDR( png_ptr, info_ptr, w, h, 8 /* fixed */, PNG_COLOR_TYPE_PALETTE, /* fixed */ PNG_INTERLACE_ADAM7, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT ); { png_colorp palette; int num_palette; PngPalette_val( cmap, &palette, &num_palette ); if( num_palette <= 0 ){ png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); /* If we get here, we had a problem writing the file */ failwith("png write error (null colormap)"); } png_set_PLTE( png_ptr, info_ptr, palette, num_palette ); } /* infos... */ png_write_info(png_ptr, info_ptr); { int rowbytes, i; png_bytep *row_pointers; char *buf = String_val(buffer); row_pointers = (png_bytep*)stat_alloc(sizeof(png_bytep) * h); rowbytes= png_get_rowbytes(png_ptr, info_ptr); #if 0 printf("rowbytes= %d width=%d\n", rowbytes, w); #endif if( rowbytes != w && rowbytes != w * 2 ){ png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); /* If we get here, we had a problem writing the file */ failwith("png write error (illegal byte/pixel)"); } for(i=0; i< h; i++){ row_pointers[i] = (png_bytep)(buf + rowbytes * i); } png_write_image(png_ptr, row_pointers); stat_free((void*)row_pointers); } png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); CAMLreturn(Val_unit); } camlspotter-camlimages-e471b3c4470d/src/ppm.ml0000644000000000000000000002117712405272062017317 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999, 2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: ppm.ml,v 1.2 2008/06/16 22:35:42 furuse Exp $ *) (* Manipulating images in portable format: PPM, PGM, and PBM. PPM: portable pixmap (pixels (picture element) map). PGM: portable greymap (grey scale map). PBM: portable bitmap (binary digit map). *) open Images;; (* Reading PPM images. *) type ppm_magic_number = | P1 | P2 | P3 | P4 | P5 | P6;; (* Magic numbers for PPM images. P1 and P4 indicate bitmaps (P1 is ascii encoding, P4 is raw encoding). P2 and P5 indicate greymaps, in raw or ascii encoding. P3 and P6 indicate pixmaps (P3 is ascii encoding, P6 is raw encoding). The library systematically saves images in raw form (which is more compact). *) let magic_number_of_string = function | "P1" (* BITMAP, ASCII form *) -> P1 | "P2" (* BITMAP, ASCII form *) -> P2 | "P3" (* PIXMAP, ASCII form *) -> P3 | "P4" (* BITMAP, RAW form *) -> P4 | "P5" (* BITMAP, ASCII form *) -> P5 | "P6" (* PIXMAP, RAW form *) -> P6 | s -> invalid_arg ("Unknown magic number for PPM image: " ^ s);; let read_ppm_magic_number ic = magic_number_of_string (input_line ic);; let string_of_magic_number = function | P1 -> "P1" | P2 -> "P2" | P3 -> "P3" | P4 -> "P4" | P5 -> "P5" | P6 -> "P6";; (* Auxiliaries: skipping comments and reading numbers into strings. *) let skip_comment ic = let rec r0 () = match input_char ic with | '#' -> r1 () | ' ' -> r0 () | '\n' -> r0 () | c -> c and r1 () = match input_char ic with | '\n' -> r0 () | _ -> r1 () in r0 ();; (* Read a sequence of digits eventually followed by a single space. *) let read_int_accu accu ic = let rec read accu = match input_char ic with | '0' .. '9' as c -> read1 (10 * accu + int_of_char c - 48) | ' ' -> read accu | '\n' -> read accu | _ -> invalid_arg "read_int" and read1 accu = match input_char ic with | '0' .. '9' as c -> read1 (10 * accu + int_of_char c - 48) | _ -> accu in read accu;; let read_int ic = read_int_accu 0 ic;; let read_dims c ic = let cols = read_int_accu (int_of_char c - 48) ic in let lines = read_int ic in cols, lines;; let read_max ic = read_int ic;; let read_ppm_header ic = (* Reads something like P6 # CREATOR: XV Version 3.10 Rev: 12/16/94 256 162 255 *) let mn = read_ppm_magic_number ic in let char = skip_comment ic in let c, l = read_dims char ic in mn, l, c;; let check_header filename = let ic = open_in_bin filename in try let _mn, l, c = read_ppm_header ic in close_in ic; { header_width = c; header_height = l; header_infos = [] } with | _ -> close_in ic; raise Wrong_file_type;; (* Reading pixmaps. *) let read_raw_pixel24 ic = let r = input_byte ic in let g = input_byte ic in let b = input_byte ic in {r = r; g = g; b = b};; let read_ascii_pixel24 ic = let r = read_int ic in let g = read_int ic in let b = read_int ic in {r = r; g = g; b = b};; let read_raw_ppm_ic ic l c _max = let img = Rgb24.create c l in for i = 0 to l - 1 do for j = 0 to c - 1 do Rgb24.set img j i (read_raw_pixel24 ic) done done; img;; let read_ascii_ppm_ic ic l c _max = let img = Rgb24.create c l in for i = 0 to l - 1 do for j = 0 to c - 1 do Rgb24.set img j i (read_ascii_pixel24 ic) done done; img;; (* Reading greymaps. *) let read_raw_grey = input_byte;; let read_ascii_grey = read_int;; let read_raw_gen_ic read_pixel ic l c max = let img = Index8.create c l in let greymap = { Color.max = max; Color.map = let make_grey i = {r = i; g = i; b = i} in Array.init (max + 1) make_grey} in img.Index8.colormap <- greymap; for i = 0 to l - 1 do for j = 0 to c - 1 do Index8.set img j i (read_pixel ic) done done; img;; let read_raw_pgm_ic ic = read_raw_gen_ic read_raw_grey ic;; let read_ascii_pgm_ic ic = read_raw_gen_ic read_ascii_grey ic;; let black = 0 and white = 255;; let max_byte = 255;; (* Reading bitmaps. *) let read_raw_pbm_ic ic l c = let img = Index8.create c l in let greymap = { Color.max = max_byte; Color.map = let make_grey i = {r = i; g = i; b = i} in Array.init (max_byte + 1) make_grey} in img.Index8.colormap <- greymap; for i = 0 to l - 1 do let rec loop j bn byte = if j = c then () else if bn = 8 then loop j 0 (input_byte ic) else let color = match byte land 0x80 with | 0 -> white | _ -> black in Index8.set img j i color; let new_byte = byte lsl 1 in loop (j + 1) (bn + 1) new_byte in loop 0 0 (input_byte ic) done; img;; let rec read_ascii_bit ic = match input_char ic with | '0' -> white | ' ' -> read_ascii_bit ic | '\n' -> read_ascii_bit ic | _ -> black;; let read_ascii_pbm_ic ic l c = read_raw_gen_ic read_ascii_bit ic l c max_byte;; let read_ppm_ic ic = let mn, l, c = read_ppm_header ic in let img = match mn with | P1 -> Index8 (read_ascii_pbm_ic ic l c) | P4 -> Index8 (read_raw_pbm_ic ic l c) | P2 | P3 | P5 | P6 -> let max = read_max ic in match mn with | P2 -> Index8 (read_ascii_pgm_ic ic l c max) | P3 -> Rgb24 (read_ascii_ppm_ic ic l c max) | P5 -> Index8 (read_raw_pgm_ic ic l c max) | _ -> Rgb24 (read_raw_ppm_ic ic l c max) in img;; let read_ppm s = let ic = open_in_bin s in try let img = read_ppm_ic ic in close_in ic; img with End_of_file -> close_in ic; invalid_arg "read_ppm: premature end of file";; let load_ppm s = match read_ppm s with | Rgb24 img -> img | _ -> invalid_arg (s ^ " is not a ppm file.");; (* Saving images. *) let save_ppm_header _img mn oc l c = output_string oc (Printf.sprintf "%s\n" (string_of_magic_number mn)); output_string oc "# CREATOR: CamlImages package\n"; output_string oc (Printf.sprintf "%d %d\n" c l); if mn <> P1 && mn <> P4 then output_string oc (Printf.sprintf "%d\n" 255);; let bit_set = 1 and bit_cleared = 0;; let gen_save_raw_pbm_oc is_white img oc l c = save_ppm_header img P4 oc l c; for i = 0 to l - 1 do let rec loop j bn byte = if j = c then if bn = 0 then () else let byte = byte lsl (8 - bn) in output_byte oc byte else if bn = 8 then (output_byte oc byte; loop j 0 0) else let color = if is_white (Index8.get_rgb img j i) then bit_set else bit_cleared in let new_byte = (byte lsl 1) lor color in loop (j + 1) (bn + 1) new_byte in loop 0 0 0 done;; (* Save a bitmap in raw form. *) let save_raw_pbm_oc = gen_save_raw_pbm_oc (fun c -> c.r = 255 && c.g = 255 && c.b = 255);; (* Save a pixmap in raw form. *) let save_raw_ppm_oc img oc l c = save_ppm_header img P6 oc l c; for i = 0 to l - 1 do for j = 0 to c - 1 do let color = Rgb24.get img j i in output_byte oc color.r; output_byte oc color.g; output_byte oc color.b done done let save_ppm_oc img oc = let l = img.Rgb24.height in if l = 0 then invalid_arg "save_ppm: invalid null line number"; let c = img.Rgb24.width in if c = 0 then invalid_arg "save_ppm: invalid null column number"; save_raw_ppm_oc img oc l c let save_ppm s img = let oc = open_out_bin s in save_ppm_oc img oc; close_out oc;; let save_bitmap_oc img oc = let l = img.Index8.height in if l = 0 then invalid_arg "save_ppm: invalid null line number"; let c = img.Index8.width in if c = 0 then invalid_arg "save_ppm: invalid null column number"; save_raw_pbm_oc img oc l c;; let save_bitmap s img = let oc = open_out_bin s in save_bitmap_oc img oc; close_out oc;; let load s _ = read_ppm s;; let load_bitmap s = match load s [] with | Index8 t -> t | _ -> invalid_arg "Not a pbm file.";; let save s _ = function | Index8 t -> save_bitmap s t | Rgb24 t -> save_ppm s t | _ -> invalid_arg "Ppm.save";; add_methods Ppm { check_header = check_header; load = Some load; save = Some save; load_sequence = None; save_sequence = None};; camlspotter-camlimages-e471b3c4470d/src/ppm.mli0000644000000000000000000000452512405272062017466 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: ppm.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) (** Loading and saving images in portable format: PPM, PGM, and PBM. PPM: portable pixmap (pixels (picture element) map). This is represented as an RGB24.t image. PGM: portable greymap (grey scale map). This is represented as an Index8.t image. PBM: portable bitmap (binary digit map). This is represented as an Index8.t image. *) val load : string -> Images.load_option list -> Images.t;; (** [Ppm.load filename] reads the image contained in the file [filename], and returns an image. Assumes that the image is stored in PPM (Portable Pixmap) or PGM (Portable Greymap), or PBM (Portable Bitmap) formats. PPM format is 24 bits per pixel, and both ASCII and raw encoding are suppoorted. PGM format is 8 bits per pixel, and both ASCII and raw encoding are suppoorted. PBM is 1 bit per pixel, and both ASCII and raw encoding are suppoorted. *) val save : string -> Images.save_option list -> Images.t -> unit;; (** [Ppm.save : filename img] stores image [img], on file [filename]. The image is saved as a portable pixmap, in raw encoding mode. *) val save_bitmap : string -> Index8.t -> unit;; val load_bitmap : string -> Index8.t;; (** Same as above for portable bitmaps. *) val load_ppm : string -> Rgb24.t;; val save_ppm : string -> Rgb24.t -> unit;; (** Specialized version for portable bitmaps. *) camlspotter-camlimages-e471b3c4470d/src/ps.ml0000644000000000000000000002553412405272062017146 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: ps.ml,v 1.2 2008/06/16 22:35:42 furuse Exp $ *) open Images;; open Rgb24;; type bounding_box = (int * int * int * int) option;; let debug = try ignore (Sys.getenv "DEBUG_PS"); true with _ -> false;; let debug_endline = if debug then prerr_endline else fun _ -> ();; let check_header filename = let ic = open_in_bin filename in try let s = input_line ic in if String.sub s 0 4 <> "%!PS" && String.sub s 0 4 <> "%PDF" then raise Exit; close_in ic; { header_width = -1; header_height = -1; header_infos = []; } with | _ -> close_in ic; raise Wrong_file_type;; let get_bounding_box file = let ic = open_in_bin file in let bbox = ref None in let bbox_head = "%%BoundingBox:" in try while true do let line = input_line ic in if String.sub line 0 1 <> "%" then raise Exit; try if String.sub line 0 (String.length bbox_head) = bbox_head then begin let rem = String.sub line (String.length bbox_head) (String.length line - String.length bbox_head) in let x1, y1, x2, y2 = match List.map int_of_string (Mstring.split_str (function ' ' -> true | _ -> false) rem) with | [x1; y1; x2; y2] -> x1, y1, x2, y2 | _ -> assert false in bbox := Some (x1, y1, x2, y2); raise Exit end with | _ -> () done; None with | _ -> close_in ic; !bbox;; let load_ps file bbox_opt options = if not Camlimages.lib_ps then failwith "ps is not supported" else let resx, resy = match load_resolution options with | Some (rx, ry) -> rx, ry | None -> 72.0, 72.0 in let bbox = match bbox_opt with | Some bbox -> Some bbox | None -> get_bounding_box file in let tmpfile = Tmpfile.new_tmp_file_name "temp" in let command = match bbox with | None -> Printf.sprintf "%s -sDEVICE=ppmraw -r%fx%f -q -dSAFER -dNOPAUSE \ -sOutputFile=%s %s -c showpage -c quit" Camlimages.path_gs resx resy tmpfile file | Some (x1, y1, x2, y2) -> let ratiox = resx /. 72.0 in let ratioy = resy /. 72.0 in let width = truncate (float (x2 - x1 + 1) *. ratiox) in let height = truncate (float (y2 - y1 + 1) *. ratioy) in Printf.sprintf "%s -sDEVICE=ppmraw -r%fx%f -g%dx%d -q -dSAFER -dNOPAUSE \ -sOutputFile=%s -c %d %d translate -f %s -c showpage -c quit" Camlimages.path_gs resx resy width height tmpfile (-x1) (-y1) file in debug_endline command; if Sys.command command <> 0 then begin Tmpfile.remove_tmp_file tmpfile; failwith "gs interpretation failed" end else let img = Ppm.load tmpfile [] in Tmpfile.remove_tmp_file tmpfile; img;; let load file options = load_ps file None options;; open Printf;; type rot = Rot0 | Rot90 | Rot180 | Rot270 | RotMax;; type at = | TopLeft of float * float | TopRight of float * float | BottomLeft of float * float | BottomRight of float * float | Center of float * float | A4Center;; type crop = { mutable cx : int; mutable cy : int; mutable cw : int; mutable ch : int; };; type size = | A4MaxSize | DPI of float | MaxBox of float * float | MinBox of float * float;; type conf = { mutable crop : crop option; mutable rot : rot; mutable size : size; mutable pos : at; mutable mirror : bool; mutable mono : bool; };; let super_save file conf comments showpage images = (* paper properties *) let paper_width = 595.0 and paper_height = 842.0 and border = 15.0 in let bbx1 = ref 0.0 and bby1 = ref 0.0 and bbx2 = ref 0.0 and bby2 = ref 0.0 in let first_image = ref true in let set_bbox x1 y1 x2 y2 = if !first_image then begin bbx1 := x1; bby1 := y1; bbx2 := x2; bby2 := y2; first_image := false end else begin if !bbx1 > x1 then bbx1 := x1; if !bby1 > y1 then bby1 := y1; if !bbx2 < x2 then bbx2 := x2; if !bby2 < y2 then bby2 := y2; end in (* printer *) let oc = open_out_bin file in let p s = output_string oc s; output_char oc '\n' in let p_ = output_string oc in let output_image_func image = (* maximum printing area *) let limitw, limith = match conf.size with | MaxBox (w, h) -> w, h | MinBox (w, h) -> w, h | _ -> paper_width -. border *. 2.0, paper_height -. border *. 2.0 in (* open file just for getting image size info. *) let imgw, imgh = image.width, image.height in (* cropping area *) let w, h, x1, y1 = match conf.crop with | Some crop -> (* check cropping area *) if crop.cx + crop.cw > imgw then crop.cw <- imgw - crop.cx; if crop.cy + crop.ch > imgh then crop.ch <- imgh - crop.cy; crop.cw, crop.ch, crop.cx, crop.cy | None -> imgw, imgh, 0, 0 in (* auto rotation *) if conf.rot = RotMax then begin let ratio0 = let rw = limitw /. float w and rh = limith /. float h in match conf.size with | MinBox _ -> if rw < rh then rh else rw | _ -> if rw > rh then rh else rw in let ratio90 = let rw = limith /. float w and rh = limitw /. float h in match conf.size with | MinBox _ -> if rw < rh then rh else rw | _ -> if rw > rh then rh else rw in match conf.size with | MinBox _ -> (* smaller is better *) conf.rot <- if ratio0 < ratio90 then Rot0 else Rot90 | _ -> (* larger is better *) conf.rot <- if ratio0 > ratio90 then Rot0 else Rot90 end; (* from the point of view of the image *) let limitw, limith = match conf.rot with | Rot0 | Rot180 -> limitw, limith | Rot90 | Rot270 -> limith, limitw | _ -> assert false in (* dpi *) let ratio = match conf.size with | DPI dpi -> debug_endline (sprintf "%f dpi" dpi); paper_width /. 8.26 /. dpi | _ -> let ratio = if limitw /. float w *. float h < limith then limitw /. float w else limith /. float h in (* let dpi = paper_width /. 8.26 /. ratio in debug_endline (sprintf "%f dpi" dpi); *) ratio in let rw = float w *. ratio and rh = float h *. ratio in (* now on the paper ... *) let prw, prh = match conf.rot with | Rot0 | Rot180 -> rw, rh | Rot90 | Rot270 -> rh, rw | _ -> assert false in let paper_x1, paper_y1 = let x, y = match conf.pos with | BottomLeft (x, y) -> x, y | TopLeft (x, y) -> x, y -. prh | BottomRight (x, y) -> x +. prw, y | TopRight (x, y) -> x +. prw, y -. prh | Center (x, y) -> x -. prw /. 2.0, y -. prh /. 2.0 | A4Center -> (paper_width -. prw) /. 2.0, (paper_height -. prh) /. 2.0 in match conf.rot with | Rot0 -> x, y | Rot180 -> prw +. x, prh +. y | Rot90 -> x, prh +. y | Rot270 -> prw +. x, y | _ -> assert false in set_bbox paper_x1 paper_y1 (paper_x1 +. prw) (paper_y1 +. prh); (fun () -> if comments then p "% Translate for offset"; p "gsave"; p (sprintf "%f %f translate" paper_x1 paper_y1); p (sprintf "%d rotate" begin match conf.rot with | Rot0 -> 0 | Rot90 -> -90 | Rot180 -> -180 | Rot270 -> -270 | _ -> assert false end); p (sprintf "%f -%f scale" rw rh); if comments then p "% Variable to keep one line of raster data"; p (sprintf "/scanline %d 3 mul string def" w); if comments then p "% Image geometry"; p (sprintf "%d %d 8" w h); if comments then p "% Transformation matrix"; p (sprintf "[ %d 0 0 %d 0 %d ]" w h h); p "{ currentfile scanline readhexstring pop } false 3"; p "colorimage"; let prevperdec = ref (-1) in for y = y1 to y1 + h - 1 do let perdec = (y - y1) * 10 / h in if !prevperdec <> perdec then begin (* debug_endline (sprintf "%d0 %% done" perdec); *) prevperdec := perdec end; let buf = Rgb24.get_scanline image y in begin let print_pixel = if not conf.mono then function x -> let adrs = x * 3 in for i = 0 to 2 do p_ (sprintf "%02x" (Char.code buf.[adrs+i])) done else let mono r g b = (r * 256 / 3 + g * 256 / 2 + b * 256 / 6) / 256 in function x -> let adrs = x * 3 in let m = mono (Char.code buf.[adrs]) (Char.code buf.[adrs + 1]) (Char.code buf.[adrs + 2]) in for _i = 0 to 2 do p_ (sprintf "%02x" m) done in if not conf.mirror then for x = x1 to x1 + w - 1 do print_pixel x done else for x = x1 + w - 1 downto x1 do print_pixel x done end; p "" done; debug_endline "100 % done"; p "grestore") in let funcs = List.map output_image_func images in (* Header *) if comments then begin p "%!PS-Adobe-3.0"; p "%%Creator: Camlimages PS writer by Jun FURUSE"; p ("%%Title: " ^ file); p "%%DocumentData: Clean7Bit"; p "%%Pages: 1"; p (sprintf "%%%%BoundingBox: %f %f %f %f" !bbx1 !bby1 !bbx2 !bby2); p "%%EndComments"; p "%%BeginProlog"; p "% Use own dictionary to avoid conflicts"; p "5 dict begin"; p "%%EndProlog"; if showpage then p "%%Page: 1 1"; end; List.iter (fun f -> f ()) funcs; if showpage then p "showpage"; if comments then p "%%Trailer"; p "end"; if comments then p "%%EOF"; close_out oc;; let default_conf = { crop = None; rot = Rot0; size = A4MaxSize; pos = A4Center; mirror = false; mono = false; };; let save file _options im = match im with | Rgb24 img -> super_save file default_conf true false [img] | _ -> raise Wrong_image_type;; add_methods Ps { check_header = check_header; load = Some load; save = Some save; load_sequence = None; save_sequence = None; };; camlspotter-camlimages-e471b3c4470d/src/ps.mli0000644000000000000000000000302712405272062017310 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: ps.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) type bounding_box = (int * int * int * int) option;; (** The bounding box of a postscript image. *) val load : string -> Images.load_option list -> Images.t;; (** Loads a postscript image. *) val save : string -> Images.save_option list -> Images.t -> unit;; (** Save a full-color image in the Encapuslated PS format file. Raises [Invalid_argument] if the image is not a full-color image. *) val load_ps : string -> bounding_box -> Images.load_option list -> Images.t;; (** Loads a postscript image within a bounding box. *) val get_bounding_box : string -> bounding_box;; (** Return the bounding box option of the postscript image inside the file argument. *) camlspotter-camlimages-e471b3c4470d/src/reduce.ml0000644000000000000000000000601612405272062017765 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: reduce.ml,v 1.1 2006/11/28 15:43:28 rousse Exp $*) open Color;; open Rgb24;; module type REDUCER = sig val find_nearest : Color.rgb Color.map -> Color.rgb -> int end;; (* Error diffusion weight table *) let diffusion_table = let sum = 1.0 +. 1.0 +. 1.0 /. sqrt 2.0 in let base = 1.0 /. sum in [| [| 0.0 ; base |]; [| base; base /. (sqrt 2.0) |] |];; (* Reduce colors to the given colormap (<= 256 colors) using error diffusion *) module ErrorDiffuse( R : REDUCER ) = struct let f src colormap = if colormap.max > 256 then raise (Invalid_argument "Rgb24.to_index8: too large colormap"); let error_table = Array.init 2 (fun _ -> Array.init (src.width + 1) (fun _ -> {r = 0; g = 0; b = 0})) in let get_error x y = let y' = y mod 2 in error_table.(y').(x) in let add_error x y rgb = let y' = y mod 2 in let rgb' = error_table.(y').(x) in error_table.(y').(x) <- Color.plus rgb rgb' in let next_line y = (* reset the error table of the current line *) let y' = y mod 2 in for x = 0 to src.width do error_table.(y').(x) <- {r=0; g=0; b=0} done in let id8 = Index8.create (src.width) (src.height) in id8.Index8.colormap <- colormap; for y = 0 to src.height - 1 do for x = 0 to src.width -1 do let ideal_rgb = Color.plus (unsafe_get src x y) (get_error x y) in let c = R.find_nearest colormap ideal_rgb in Index8.unsafe_set id8 x y c; let new_error = Color.minus ideal_rgb colormap.map.(c) in for ey = 0 to 1 do for ex = 0 to 1 do let diffuse_rgb = { r= truncate (float new_error.r *. diffusion_table.(ex).(ey)); g= truncate (float new_error.g *. diffusion_table.(ex).(ey)); b= truncate (float new_error.b *. diffusion_table.(ex).(ey)); } in add_error (x+ex) (y+ey) diffuse_rgb done done done; next_line y done; id8 end;; module ErrorDiffuseIndex8 = ErrorDiffuse(Color.Rgb);; let error_diffuse = ErrorDiffuseIndex8.f;; camlspotter-camlimages-e471b3c4470d/src/reduce.mli0000644000000000000000000000232312405272062020133 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) module type REDUCER = sig val find_nearest : Color.rgb Color.map -> Color.rgb -> int end;; module ErrorDiffuse : functor(R : REDUCER) -> sig val f : Rgb24.t -> Color.rgb Color.map -> Index8.t end;; val error_diffuse : Rgb24.t -> Color.rgb Color.map -> Index8.t;; camlspotter-camlimages-e471b3c4470d/src/region.ml0000644000000000000000000000236712405272062020006 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: region.ml,v 1.1 2006/11/28 15:43:28 rousse Exp $ *) let error = ref (fun () -> raise (Failure "Region error"));; (* This will be overridden in images.ml, so that it raises Images.Out_of_image *) let check width height x y = if x < 0 || x >= width || y < 0 || y >= height then !error ();; camlspotter-camlimages-e471b3c4470d/src/region.mli0000644000000000000000000000244412405272062020153 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: region.mli,v 1.1 2006/11/28 15:43:28 rousse Exp $ *) val check : int -> int -> int -> int -> unit;; (** [check width height x y] checks whether the point (x,y) is in the region of (0, 0) - ([width] - 1, [height] - 1). If not, it raises [Images.Out_of_image]. *) val error : (unit -> unit) ref;; (* just for system use *) camlspotter-camlimages-e471b3c4470d/src/rgb24.ml0000644000000000000000000002446312405272062017444 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: rgb24.ml,v 1.7 2009/07/04 03:39:28 furuse Exp $ *) open Util module E = struct open Color type t = Color.rgb let bytes_per_pixel = 3 let get str pos = { r = int_of_char str.[pos ]; g = int_of_char str.[pos + 1]; b = int_of_char str.[pos + 2] } let set str pos t = str << pos & char_of_int t.r; str << pos + 1 & char_of_int t.g; str << pos + 2 & char_of_int t.b let make t = let str = Bytes.create bytes_per_pixel in set str 0 t; str end ;; module RI = Genimage.MakeRawImage(E);; type rawimage = RI.t;; type elt = Color.rgb;; type t = { width : int; height : int; rawimage : RI.t; mutable infos : Info.info list } ;; module C = struct type rawimage = RI.t type container = t let rawimage x = x.rawimage let create_default width height rawimage = { width = width; height = height; rawimage = rawimage; infos = [] } let create_duplicate src width height rawimage = { width = width; height = height; rawimage = rawimage; infos = src.infos } end ;; module IMAGE = Genimage.Make(RI)(C);; let create_with width height infos data = { width = width; height = height; rawimage = RI.create_with width height data; infos = infos } ;; let create_with_scanlines width height infos data = { width = width; height = height; rawimage = RI.create_with_scanlines width height data; infos = infos; };; let rawimage = C.rawimage;; let create = IMAGE.create;; let make = IMAGE.make;; let dump = IMAGE.dump;; let unsafe_access = IMAGE.unsafe_access;; let get_strip = IMAGE.get_strip;; let set_strip = IMAGE.set_strip;; let get_scanline = IMAGE.get_scanline;; let get_scanline_ptr = IMAGE.get_scanline_ptr;; let set_scanline = IMAGE.set_scanline;; let unsafe_get = IMAGE.unsafe_get;; let unsafe_set = IMAGE.unsafe_set;; let get = IMAGE.get;; let set = IMAGE.set;; let destroy = IMAGE.destroy;; let copy = IMAGE.copy;; let sub = IMAGE.sub;; let blit = IMAGE.blit;; let map = IMAGE.map;; let blocks = IMAGE.blocks;; let dump_block = IMAGE.dump_block;; open Color;; (* image resize with smoothing *) (* good result for reducing *) let resize_reduce prog img nw nh = let newimage = create nw nh in let xscale = float nw /. float img.width in let yscale = float nh /. float img.height in let xs = Array.init nw (fun x -> let sx = truncate (float x /. xscale) in let ex = truncate ((float x +. 0.99) /. xscale) in let dx = ex - sx + 1 in (sx, ex, dx)) in let ys = Array.init nh (fun y -> let sy = truncate (float y /. yscale) in let ey = truncate ((float y +. 0.99) /. yscale) in let dy = ey - sy + 1 in (sy, ey, dy)) in for x = 0 to nw - 1 do let sx,ex,dx = xs.(x) in for y = 0 to nh - 1 do let sy,ey,dy = ys.(y) in let size = dx * dy in let sr = ref 0 and sg = ref 0 and sb = ref 0 in for xx = sx to ex do for yy = sy to ey do let c = unsafe_get img xx yy in sr := !sr + c.r; sg := !sg + c.g; sb := !sb + c.b done done; unsafe_set newimage x y { r = !sr / size; g = !sg / size; b = !sb / size; } done; match prog with | Some p -> p (float (x + 1) /. float nw) | None -> () done; newimage ;; let resize_enlarge prog img nw nh = let newimage = create nw nh in let xscale = float nw /. float img.width in let yscale = float nh /. float img.height in let ww = truncate (ceil xscale) and wh = truncate (ceil yscale) in let weight = Array.init ww (fun x -> Array.init wh (fun y -> let x0 = x - ww / 2 and y0 = y - wh / 2 in let x1 = x0 + ww - 1 and y1 = y0 + wh - 1 in let a = Array.init 3 (fun xx -> Array.init 3 (fun yy -> let mx0 = (xx - 1) * ww and my0 = (yy - 1) * wh in let mx1 = mx0 + ww - 1 and my1 = my0 + wh - 1 in let cx0 = if x0 < mx0 then mx0 else x0 in let cy0 = if y0 < my0 then my0 else y0 in let cx1 = if x1 > mx1 then mx1 else x1 in let cy1 = if y1 > my1 then my1 else y1 in let dx = cx1 - cx0 + 1 and dy = cy1 - cy0 + 1 in let dx = if dx < 0 then 0 else dx and dy = if dy < 0 then 0 else dy in dx * dy)) in a )) in let wsum = Array.init ww (fun x -> Array.init wh (fun y -> let sum = ref 0 in Array.iter (Array.iter (fun w -> sum := !sum + w)) weight.(x).(y); if !sum = 0 then raise (Failure "resize_enlarge wsum"); !sum)) in let xs = Array.init img.width (fun x -> let sx = truncate (float x *. xscale) in let ex = truncate (float (x + 1) *. xscale) - 1 in let dx = ex - sx + 1 in if dx > ww then raise (Failure "resize_enlarge"); (sx, ex, dx)) in let ys = Array.init img.height (fun y -> let sy = truncate (float y *. yscale) in let ey = truncate ((float (y + 1)) *. yscale) - 1 in let dy = ey - sy + 1 in if dy > wh then raise (Failure "resize_enlarge"); (sy, ey, dy)) in let query c x y = if x < 0 || y < 0 || x >= img.width || y >= img.height then c else unsafe_get img x y in for y = 0 to img.height - 1 do let sy,_ey,dy = ys.(y) in for x = 0 to img.width - 1 do let sx,_ex,dx = xs.(x) in let colors = let c = unsafe_get img x y in Array.init 3 (fun dx -> Array.init 3 (fun dy -> query c (x + dx - 1) (y + dy - 1))) in for xx = 0 to dx - 1 do for yy = 0 to dy - 1 do let sr = ref 0 and sg = ref 0 and sb = ref 0 in let weight = weight.(xx).(yy) in let wsum = wsum.(xx).(yy) in for xxx = 0 to 2 do for yyy = 0 to 2 do let c = colors.(xxx).(yyy) in sr := !sr + c.r * weight.(xxx).(yyy); sg := !sg + c.g * weight.(xxx).(yyy); sb := !sb + c.b * weight.(xxx).(yyy); done done; let r = !sr / wsum and g = !sg / wsum and b = !sb / wsum in unsafe_set newimage (sx + xx) (sy + yy) { r = r; g = g; b = b; } done done done; match prog with | Some p -> p (float (y + 1) /. float img.height) | None -> () done; newimage ;; let resize prog img nw nh = let xscale = float nw /. float img.width in let yscale = float nh /. float img.height in if xscale >= 1.0 && yscale >= 1.0 then resize_enlarge prog img nw nh else if xscale <= 1.0 && yscale <= 1.0 then resize_reduce prog img nw nh else resize_reduce prog img nw nh (* let project prog img fill proj proj' smooth = if smooth < 0 then raise (Invalid_argument "project"); (* calculation of the destination image size *) let w = 0.49 in let w' = 1.0 -. w in let topleft = proj (-. w) (-. w) in let topright = proj (float (img.width - 1) +. w) (-. w) in let bottomleft = proj (-. w) (float (img.height - 1) +. w) in let bottomright = proj (float (img.width - 1) +. w) (float (img.height - 1) +. w) in let minx, miny, maxx, maxy = let minx = ref (fst topleft) and miny = ref (snd topleft) and maxx = ref (fst topleft) and maxy = ref (snd topleft) in let rec calc_bbox = function | [] -> int_of_float (ceil (!minx +. w')), int_of_float (ceil (!miny +. w')), int_of_float (floor (!maxx -. w')), int_of_float (floor (!maxy -. w')) | (x,y)::xs -> if !minx > x then minx := x else if !maxx < x then maxx := x; if !miny > y then miny := y else if !maxy < y then maxy := y; calc_bbox xs in calc_bbox [topright; bottomleft; bottomright] in let nw = maxx - minx + 1 and nh = maxy - miny + 1 in let scale = smooth + 1 in let weight = scale * scale in let dst = create (nw * scale) (nh * scale) in for y = 0 to nh - 1 do for x = 0 to nw - 1 do let sr = ref 0 and sg = ref 0 and sb = ref 0 in for yy = 0 to scale - 1 do for xx = 0 to scale - 1 do let sx = float x -. 0.5 +. (float xx +. 0.5) /. float scale in let sy = float y -. 0.5 +. (float yy +. 0.5) /. float scale in let ox, oy = proj' sx sy in let oxi = int_of_float (ox +. 0.5) and oyi = int_of_float (oy +. 0.5) in let c = try get img oxi oyi with | Image.Out_of_image -> fill in sr := !sr + c.r; sg := !sg + c.g; sb := !sb + c.b; done done; unsafe_set dst x y { r = !sr / weight; g = !sb / weight; b = !sg / weight; } done done; dst ;; *) let to_rgba32 t = let rgba32 = Rgba32.create t.width t.height in for y = 0 to t.height - 1 do for x = 0 to t.width - 1 do Rgba32.unsafe_set rgba32 x y { color = unsafe_get t x y; alpha = 255; } done done; rgba32 ;; let of_rgba32 t = let rgb24 = create t.Rgba32.width t.Rgba32.height in for y = 0 to t.Rgba32.height - 1 do for x = 0 to t.Rgba32.width - 1 do let { color = c } = Rgba32.unsafe_get t x y in unsafe_set rgb24 x y c done done; rgb24 ;; camlspotter-camlimages-e471b3c4470d/src/rgb24.mli0000644000000000000000000000530512405272062017607 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: rgb24.mli,v 1.6 2009/07/04 03:39:28 furuse Exp $ *) (* RGB 24 bit depth image format *) type elt = Color.rgb;; type rawimage;; (** Image type *) type t = { width : int; height : int; rawimage : rawimage; mutable infos : Info.info list; } ;; val resize : (float -> unit) option -> t -> int -> int -> t;; (* [resize progress t w h] creates a resized image of [t] with size [w]x[h]. You can specify a progress meter function [progress], which takes a float from 0 to 1.0. *) val to_rgba32 : t -> Rgba32.t;; val of_rgba32 : Rgba32.t -> t;; (** Image format conversion functions between Rgba32.t images *) (** Generic functions *) (* Please read the comments of IMAGE in genimage.mli *) val create_with : int -> int -> Info.info list -> bytes -> t;; val create_with_scanlines : int -> int -> Info.info list -> bytes array -> t;; val create : int -> int -> t;; val make : int -> int -> elt -> t;; val destroy : t -> unit;; val get : t -> int -> int -> elt;; val set : t -> int -> int -> elt -> unit;; val unsafe_get : t -> int -> int -> elt;; val unsafe_set : t -> int -> int -> elt -> unit;; val get_strip : t -> int -> int -> int -> bytes;; val set_strip : t -> int -> int -> int -> bytes -> unit;; val get_scanline : t -> int -> bytes;; val get_scanline_ptr : t -> (int -> (bytes * int) * int) option;; val set_scanline : t -> int -> bytes -> unit;; val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit;; val map : (elt -> elt -> elt) -> t -> int -> int -> t -> int -> int -> int -> int -> unit ;; val blocks : t -> int * int val dump_block : t -> int -> int -> Bitmap.Block.t val copy : t -> t;; val sub : t -> int -> int -> int -> int -> t;; val dump : t -> bytes;; val unsafe_access : t -> int -> int -> bytes * int;; val rawimage : t -> rawimage camlspotter-camlimages-e471b3c4470d/src/rgba32.ml0000644000000000000000000002212712405272062017577 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: rgba32.ml,v 1.5 2009/07/04 03:39:28 furuse Exp $ *) open Util module E = struct open Color type t = Color.rgba let bytes_per_pixel = 4 let get str pos = { color = { r = int_of_char str.[pos ]; g = int_of_char str.[pos + 1]; b = int_of_char str.[pos + 2] }; alpha = int_of_char str.[pos + 3] } let set str pos t = str << pos & char_of_int t.color.r; str << pos + 1 & char_of_int t.color.g; str << pos + 2 & char_of_int t.color.b; str << pos + 3 & char_of_int t.alpha let make t = let str = Bytes.create bytes_per_pixel in set str 0 t; str end;; module RI = Genimage.MakeRawImage(E);; type rawimage = RI.t;; type elt = Color.rgba;; type t = { width : int; height : int; rawimage : RI.t; mutable infos : Info.info list; };; module C = struct type rawimage = RI.t type container = t let rawimage x = x.rawimage let create_default width height rawimage = { width = width; height = height; rawimage = rawimage; infos = []; } let create_duplicate src width height rawimage = { width = width; height = height; rawimage = rawimage; infos = src.infos; } end;; module IMAGE = Genimage.Make(RI)(C);; let create_with width height infos data = { width = width; height = height; rawimage = RI.create_with width height data; infos = infos; };; let create_with_scanlines width height infos data = { width = width; height = height; rawimage = RI.create_with_scanlines width height data; infos = infos; };; let rawimage = C.rawimage;; let create = IMAGE.create;; let make = IMAGE.make;; let dump = IMAGE.dump;; let unsafe_access = IMAGE.unsafe_access;; let get_strip = IMAGE.get_strip;; let set_strip = IMAGE.set_strip;; let get_scanline = IMAGE.get_scanline;; let set_scanline = IMAGE.set_scanline;; let unsafe_get = IMAGE.unsafe_get;; let unsafe_set = IMAGE.unsafe_set;; let get = IMAGE.get;; let set = IMAGE.set;; let destroy = IMAGE.destroy;; let copy = IMAGE.copy;; let sub = IMAGE.sub;; let blit = IMAGE.blit;; let map = IMAGE.map;; let blocks = IMAGE.blocks;; let dump_block = IMAGE.dump_block;; open Color;; (* image resize with smoothing *) (* good result for reducing *) let resize_reduce prog img nw nh = let newimage = create nw nh in let xscale = float nw /. float img.width in let yscale = float nh /. float img.height in let xs = Array.init nw (fun x -> let sx = truncate (float x /. xscale) in let ex = truncate ((float x +. 0.99) /. xscale) in let dx = ex - sx + 1 in (sx, ex, dx)) in let ys = Array.init nh (fun y -> let sy = truncate (float y /. yscale) in let ey = truncate ((float y +. 0.99) /. yscale) in let dy = ey - sy + 1 in (sy, ey, dy)) in for x = 0 to nw - 1 do let sx, ex, dx = xs.(x) in for y = 0 to nh - 1 do let sy, ey, dy = ys.(y) in let size = dx * dy in let sr = ref 0 and sg = ref 0 and sb = ref 0 and sa = ref 0 in for xx = sx to ex do for yy = sy to ey do let c = unsafe_get img xx yy in sr := !sr + c.color.r; sg := !sg + c.color.g; sb := !sb + c.color.b; sa := !sa + c.alpha done done; unsafe_set newimage x y { color = { r = !sr / size; g = !sg / size; b = !sb / size }; alpha = !sa / size; } done; match prog with | Some p -> p (float (x + 1) /. float nw) | None -> () done; newimage;; let resize_enlarge prog img nw nh = let newimage = create nw nh in let xscale = float nw /. float img.width in let yscale = float nh /. float img.height in let ww = truncate (ceil xscale) and wh = truncate (ceil yscale) in let weight = Array.init ww (fun x -> Array.init wh (fun y -> let x0 = x - ww / 2 and y0 = y - wh / 2 in let x1 = x0 + ww - 1 and y1 = y0 + wh - 1 in Array.init 3 (fun xx -> Array.init 3 (fun yy -> let mx0 = (xx - 1) * ww and my0 = (yy - 1) * wh in let mx1 = mx0 + ww - 1 and my1 = my0 + wh - 1 in let cx0 = if x0 < mx0 then mx0 else x0 in let cy0 = if y0 < my0 then my0 else y0 in let cx1 = if x1 > mx1 then mx1 else x1 in let cy1 = if y1 > my1 then my1 else y1 in let dx = cx1 - cx0 + 1 and dy = cy1 - cy0 + 1 in let dx = if dx < 0 then 0 else dx and dy = if dy < 0 then 0 else dy in dx * dy)))) in let wsum = Array.init ww (fun x -> Array.init wh (fun y -> let sum = ref 0 in Array.iter (Array.iter (fun w -> sum := !sum + w)) weight.(x).(y); if !sum = 0 then failwith "resize_enlarge wsum"; !sum)) in let xs = Array.init img.width (fun x -> let sx = truncate (float x *. xscale) in let ex = truncate (float (x + 1) *. xscale) - 1 in let dx = ex - sx + 1 in if dx > ww then failwith "resize_enlarge"; (sx, ex, dx)) in let ys = Array.init img.height (fun y -> let sy = truncate (float y *. yscale) in let ey = truncate (float (y + 1) *. yscale) - 1 in let dy = ey - sy + 1 in if dy > wh then failwith "resize_enlarge"; (sy, ey, dy)) in let query c x y = if x < 0 || y < 0 || x >= img.width || y >= img.height then c else unsafe_get img x y in for y = 0 to img.height - 1 do let sy, _ey, dy = ys.(y) in for x = 0 to img.width - 1 do let sx, _ex, dx = xs.(x) in let colors = let c = unsafe_get img x y in Array.init 3 (fun dx -> Array.init 3 (fun dy -> query c (x + dx - 1) (y + dy - 1))) in for xx = 0 to dx - 1 do for yy = 0 to dy - 1 do let sr = ref 0 and sg = ref 0 and sb = ref 0 and sa = ref 0 in let weight = weight.(xx).(yy) in let wsum = wsum.(xx).(yy) in for xxx = 0 to 2 do for yyy = 0 to 2 do let c = colors.(xxx).(yyy) in sr := !sr + c.color.r * weight.(xxx).(yyy); sg := !sg + c.color.g * weight.(xxx).(yyy); sb := !sb + c.color.b * weight.(xxx).(yyy); sa := !sa + c.alpha * weight.(xxx).(yyy); done done; unsafe_set newimage (sx + xx) (sy + yy) {color= {r = !sr / wsum; g = !sg / wsum; b = !sb / wsum}; alpha = !sa / wsum} done done done; match prog with | Some p -> p (float (y + 1) /. float img.height) | None -> () done; newimage;; let resize prog img nw nh = let xscale = float nw /. float img.width in let yscale = float nh /. float img.height in if xscale >= 1.0 && yscale >= 1.0 then resize_enlarge prog img nw nh else if xscale <= 1.0 && yscale <= 1.0 then resize_reduce prog img nw nh else resize_reduce prog img nw nh;; (* (* image resize with smoothing *) let resize prog img nw nh = let newimage = create nw nh in let xscale = float nw /. float img.width in let yscale = float nh /. float img.height in for y = 0 to nh - 1 do for x = 0 to nw - 1 do let sx = truncate (float x /. xscale) and sy = truncate (float y /. yscale) in let ex = truncate ((float x +. 0.99) /. xscale) and ey = truncate ((float y +. 0.99) /. yscale) in (* let ex = if ex >= img.width then img.width - 1 else ex and ey = if ey >= img.height then img.height - 1 else ey in *) let size = (ex - sx + 1) * (ey - sy + 1) in let sr = ref 0 and sg = ref 0 and sb = ref 0 and sa = ref 0 in for xx = sx to ex do for yy = sy to ey do let c = unsafe_get img xx yy in sr := !sr + c.color.r; sg := !sg + c.color.g; sb := !sb + c.color.b; sa := !sa + c.alpha done done; unsafe_set newimage x y { color = { r = (!sr/size); g = (!sg/size); b = (!sb/size) }; alpha = (!sa/size) } done; match prog with Some p -> p (float (y + 1) /. float img.height) | None -> () done; newimage ;; *) camlspotter-camlimages-e471b3c4470d/src/rgba32.mli0000644000000000000000000000503212405272062017744 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: rgba32.mli,v 1.5 2009/07/04 03:39:28 furuse Exp $ *) (** RGBA 32 bit depth image format *) type elt = Color.rgba;; type rawimage;; (* The image type *) type t = { width : int; height : int; rawimage : rawimage; mutable infos : Info.info list; };; val resize : (float -> unit) option -> t -> int -> int -> t;; (** [resize progress t w h] creates a resized image of [t] with size [w]x[h]. You can specify a progress meter function [progress], which takes a float from 0 to 1.0. *) (** Generic functions *) (** Please read the comments of module [IMAGE] in file [genimage.mli]. *) val dump : t -> bytes;; val unsafe_access : t -> int -> int -> bytes * int;; val get_strip : t -> int -> int -> int -> bytes;; val set_strip : t -> int -> int -> int -> bytes -> unit;; val get_scanline : t -> int -> bytes;; val set_scanline : t -> int -> bytes -> unit;; val unsafe_get : t -> int -> int -> elt;; val unsafe_set : t -> int -> int -> elt -> unit;; val get : t -> int -> int -> elt;; val set : t -> int -> int -> elt -> unit;; val destroy : t -> unit;; val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit;; val map : (elt -> elt -> elt) -> t -> int -> int -> t -> int -> int -> int -> int -> unit;; val blocks : t -> int * int val dump_block : t -> int -> int -> Bitmap.Block.t val create_with : int -> int -> Info.info list -> bytes -> t;; val create_with_scanlines : int -> int -> Info.info list -> bytes array -> t;; val create : int -> int -> t;; val make : int -> int -> elt -> t;; val copy : t -> t;; val sub : t -> int -> int -> int -> int -> t;; val rawimage : t -> rawimage camlspotter-camlimages-e471b3c4470d/src/tiff.ml0000644000000000000000000001013612405272062017444 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: tiff.ml,v 1.2 2008/06/16 22:35:42 furuse Exp $ *) open Images;; open Rgb24;; type colormodel = RGB | CMYK | WHITEBLACK | BLACKWHITE;; type in_handle;; external open_in : string -> int * int * float * colormodel * in_handle = "open_tiff_file_for_read";; external read_scanline : in_handle -> string -> int -> unit = "read_tiff_scanline";; external close_in : in_handle -> unit = "close_tiff_file";; type out_handle;; external open_out : string -> int -> int -> float -> out_handle = "open_tiff_file_for_write";; external write_scanline : out_handle -> string -> int -> unit = "write_tiff_scanline";; external close_out : out_handle -> unit = "close_tiff_file";; let load name opts = let prog = Images.load_progress opts in let w, h, _dpi, colormodel, tif = open_in name in let img, buf = match colormodel with | RGB -> let img = Rgb24.create w h in Rgb24 img, Bytes.create (w * 3) | CMYK -> let img = Cmyk32.create w h in Cmyk32 img, Bytes.create (w * 4) | WHITEBLACK -> let img = Index8.create w h in img.Index8.colormap.map <- [| {r = 255; g = 255; b = 255}; {r = 0; g = 0; b = 0} |]; Index8 img, Bytes.create ((w + 7) / 8) | BLACKWHITE -> let img = Index8.create w h in img.Index8.colormap.map <- [| {r = 0; g = 0; b = 0}; {r = 255; g = 255; b = 255} |]; Index8 img, Bytes.create ((w + 7) / 8) in let set_scanline = match colormodel, img with | _, Rgb24 img -> fun buf y -> Rgb24.set_scanline img y buf | _, Cmyk32 img -> fun buf y -> Cmyk32.set_scanline img y buf | BLACKWHITE, Index8 img | WHITEBLACK, Index8 img -> let bits = [| 128; 64; 32; 16; 8; 4; 2; 1 |] in fun buf y -> for x = 0 to w - 1 do let c = x lsr 3 in let b = x land 7 in if Char.code buf.[c] land Array.unsafe_get bits b <> 0 then Index8.unsafe_set img x y 1 done | _ -> assert false in for y = 0 to h - 1 do read_scanline tif buf y; set_scanline buf y; match prog with | Some p -> p (float (y + 1) /. float h) | None -> () done; close_in tif; img;; let save name _opts image = match image with | Rgb24 bmp -> let resolution = (* resolution in DPI *) match Images.dpi bmp.infos with | Some r -> r | None -> 200.0 in let oc = open_out name bmp.width bmp.height resolution in for y = 0 to bmp.height - 1 do write_scanline oc (Rgb24.get_scanline bmp y) y done; close_out oc | _ -> raise Wrong_image_type;; let check_header filename = let len = 4 in let ic = open_in_bin filename in try let str = Bytes.create len in really_input ic str 0 len; Pervasives.close_in ic; match str with | "MM\000\042" -> { header_width = -1; header_height = -1; header_infos = [Images.Info_BigEndian]; } | "II\042\000" -> { header_width = -1; header_height = -1; header_infos = [Images.Info_LittleEndian]; } | _ -> raise Wrong_file_type with | _ -> Pervasives.close_in ic; raise Wrong_file_type;; add_methods Tiff { check_header = check_header; load = Some load; save = Some save; load_sequence = None; save_sequence = None; };; camlspotter-camlimages-e471b3c4470d/src/tiff.mli0000644000000000000000000000345312405272062017621 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: tiff.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) val check_header : string -> Images.header;; (** Checks the file header *) val load : string -> Images.load_option list -> Images.t;; (** Loads a tiff image. *) val save : string -> Images.save_option list -> Images.t -> unit;; (** Save a full-color image in tiff format file. Raises [Invalid_argument] if the image is not a full-color image. *) (** Scanline based I/O functions *) type colormodel = RGB | CMYK | WHITEBLACK | BLACKWHITE;; type in_handle;; val open_in : string -> int * int * float * colormodel * in_handle;; val read_scanline : in_handle -> bytes -> int -> unit;; val close_in : in_handle -> unit;; type out_handle;; val open_out : string -> int -> int -> float -> out_handle;; val write_scanline : out_handle -> bytes -> int -> unit;; val close_out : out_handle -> unit;; camlspotter-camlimages-e471b3c4470d/src/tiff_na.c0000644000000000000000000000250412405272062017734 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #include #include #include #include value open_tiff_file_for_read(){ failwith("unsupported"); } value read_tiff_scanline(){ failwith("unsupported"); } value close_tiff_file(){ failwith("unsupported"); } value open_tiff_file_for_write(){ failwith("unsupported"); } value write_tiff_scanline(){ failwith("unsupported"); } camlspotter-camlimages-e471b3c4470d/src/tiffread.c0000644000000000000000000001002712405272062020111 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Franois Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "oversized.h" // This is to resolve the conflict of these int types in caml/config.h and tiff.h // Replace all the occurrences of (u?int[0-9]+) by $1_tiff, tiff.h's int types have // now different names from caml's. #undef int16 #undef uint16 #undef int32 #undef uint32 #undef int64 #undef uint64 #define int16 int16_tiff #define uint16 uint16_tiff #define int32 int32_tiff #define uint32 uint32_tiff #define int64 int64_tiff #define uint64 uint64_tiff #include extern value *imglib_error; value open_tiff_file_for_read( name ) value name; { CAMLparam1(name); CAMLlocal1(res); CAMLlocalN(r,5); char *filename; TIFF* tif; filename = String_val( name ); tif = TIFFOpen(filename, "r"); if (tif) { uint32 imagelength; uint32 imagewidth; uint16 imagesample; uint16 imagebits; tdata_t buf; int i; uint16 runit; float xres, yres; uint16 photometric; TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength); TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &imagewidth); TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &imagebits); TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &imagesample); TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT, &runit); TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres); TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres); TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric); if (oversized (imagewidth, imagelength)) { failwith_oversized("tiff"); } if( imagesample == 3 && photometric == PHOTOMETRIC_RGB ){ if( imagebits != 8 ){ failwith("Sorry, tiff rgb file must be 24bit-color"); } r[3] = Val_int(0); /* RGB */ } else if( imagesample == 4 && photometric == PHOTOMETRIC_SEPARATED ){ if( imagebits != 8 ){ failwith("Sorry, tiff cmyk file must be 32bit-color"); } r[3] = Val_int(1); /* CMYK */ } else if( imagesample == 1 && imagebits == 1 ) { /* BW */ r[3] = Val_int (photometric == PHOTOMETRIC_MINISWHITE ? 2 : 3); } else { fprintf(stderr, "photometric=%d, imagesample=%d, imagebits=%d\n", photometric, imagesample, imagebits); failwith("Sorry, unsupported tiff format"); } buf = _TIFFmalloc(TIFFScanlineSize(tif)); r[0] = Val_int(imagewidth); r[1] = Val_int(imagelength); if ( runit == RESUNIT_INCH && xres == yres ){ r[2] = copy_double( xres ); } else { r[2] = copy_double ( -1.0 ); } /* r[3] is defined above */ r[4] = (value)tif; res = alloc_small(5,0); for(i=0; i<5; i++) Store_field(res, i, r[i]); CAMLreturn(res); } else { failwith("failed to open tiff file"); } } value read_tiff_scanline( tiffh, buf, row ) value tiffh; value buf; value row; { CAMLparam3(tiffh,buf,row); TIFFReadScanline((TIFF*)tiffh, String_val(buf), Int_val(row), 0); CAMLreturn(Val_unit); } value close_tiff_file( tiffh ) value tiffh; { CAMLparam1(tiffh); TIFFClose((TIFF*)tiffh); CAMLreturn(Val_unit); } camlspotter-camlimages-e471b3c4470d/src/tiffwrite.c0000644000000000000000000000613012405272062020330 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Franois Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include // This is to resolve the conflict of these int types in caml/config.h and tiff.h // Replace all the occurrences of (u?int[0-9]+) by $1_tiff, tiff.h's int types have // now different names from caml's. #undef int16 #undef uint16 #undef int32 #undef uint32 #undef int64 #undef uint64 #define int16 int16_tiff #define uint16 uint16_tiff #define int32 int32_tiff #define uint32 uint32_tiff #define int64 int64_tiff #define uint64 uint64_tiff #include extern value *imglib_error; value open_tiff_file_for_write( value file, value width, value height, value resolution ) { CAMLparam4(file,width,height,resolution); int image_width; int image_height; double res; TIFF* tif; image_width = Int_val( width ); image_height = Int_val( height ); res = Double_val( resolution ); tif = TIFFOpen(String_val( file ), "w"); if( tif ){ /* needs */ /* Resolution */ /* FillOrder */ TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, (uint32) image_width); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, (uint32) image_height); TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_LZW); /* LZW */ TIFFSetField(tif, TIFFTAG_PREDICTOR, 2); /* ??? */ TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, image_height); /* ??? */ TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); TIFFSetField(tif, TIFFTAG_XRESOLUTION, res); TIFFSetField(tif, TIFFTAG_YRESOLUTION, res); CAMLreturn( (value) tif); } else { failwith("failed to open tiff file to write"); } } value write_tiff_scanline( tiffh, buf, row ) value tiffh; value buf; value row; { CAMLparam3(tiffh,buf,row); TIFFWriteScanline((TIFF*)tiffh, String_val(buf), Int_val(row), 0); CAMLreturn(Val_unit); } camlspotter-camlimages-e471b3c4470d/src/tmpfile.ml0000644000000000000000000000322412405272062020154 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999 - 2003 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* temporary directory *) let tmp_dir = ref (try Sys.getenv "CAMLIMAGESTMPDIR" with Not_found -> "/tmp");; let cnter = ref 0;; let rec new_tmp_name prefx = incr cnter; let name = Filename.concat !tmp_dir (Printf.sprintf "camlimages-%s-%d" prefx !cnter) in if not (Sys.file_exists name) then name else begin prerr_endline ("Warning: tmp file " ^ name ^ " already exists"); new_tmp_name prefx end;; let remove_tmp_file tmpfile = try Sys.remove tmpfile with _ -> ();; let new_tmp_file_name prefx = if not (Sys.file_exists !tmp_dir) then failwith ("Temporary directory " ^ !tmp_dir ^ " does not exist") else let f = new_tmp_name prefx in at_exit (fun () -> remove_tmp_file f); f;; camlspotter-camlimages-e471b3c4470d/src/tmpfile.mli0000644000000000000000000000257112405272062020331 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999 - 2003 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) val tmp_dir : string ref (* swap file directory: the default is /tmp, but note that it is often the case that /tmp is not large enough for some huge images!! *) val new_tmp_file_name : string -> string (* [new_swap_file_name prefix] returns a new swap file name with prefix [prefix]. *) val remove_tmp_file : string -> unit (* [remove_tmp_file fname] removes [fname] if it can; nothing happens if [fname] cannot be removed. *) camlspotter-camlimages-e471b3c4470d/src/units.ml0000644000000000000000000000306212405272062017656 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: units.ml,v 1.1 2006/11/28 15:43:28 rousse Exp $ *) let inch_cm = 2.54;; let inch_pt = 72.0;; let units = [ "mm", 0.1 /. inch_cm *. inch_pt; "cm", 1.0 /. inch_cm *. inch_pt; "pt", 1.0; "in", inch_pt; ];; let parse_length s = (* return in pt *) let v = let l = String.length s in let digit,unit = if l > 2 then String.sub s 0 2, String.sub s (l-2) 2 else "", "" in try (List.assoc (String.lowercase unit) units) *. float_of_string digit with | Not_found -> (* think it is in "pt" *) float_of_string s in prerr_endline (Printf.sprintf "%s -> %fpt" s v); v;; camlspotter-camlimages-e471b3c4470d/src/unsupported.pl0000755000000000000000000000225612405272062021116 0ustar 00000000000000#!/usr/bin/perl print "/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #include #include #include #include "; while(<>){ if ( /value +([^\(]+)\(/ ) { print "value $1(){ failwith(\"unsupported\"); }\n"; } } camlspotter-camlimages-e471b3c4470d/src/util.ml0000644000000000000000000000234012405272062017467 0ustar 00000000000000(***********************************************************************) (* *) (* CamlImages *) (* *) (* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2014, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) external ( & ) : ('a -> 'b) -> 'a -> 'b = "%apply" let (<<) = Bytes.set let (<@!) = Array.unsafe_get camlspotter-camlimages-e471b3c4470d/src/util.mli0000644000000000000000000000312312405272062017640 0ustar 00000000000000(***********************************************************************) (* *) (* CamlImages *) (* *) (* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2014, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (** Bytes and Strings In 4.02.0, [s.[i] <- c] becomes deprecated and this is very frustrating for CamlImages. We introduce [(<<)] and replace them by [s << i & c]. *) external ( & ) : ('a -> 'b) -> 'a -> 'b = "%apply" val (<<) : bytes -> int -> char -> unit (** equivalent with [Bytes.set] *) val (< int -> char -> unit (** equivalent with [Bytes.unsafe_set] *) val range_check : bytes -> int -> int -> unit (** [range_check bs from to_] raises [Invalid_argument "index out of bounds"] when [from] and [to_] are invalid range for [bs]. *) val (>@!) : 'a array -> int -> 'a (** equivalent with [Array.unsafe.get] *) camlspotter-camlimages-e471b3c4470d/src/ximage.ml0000644000000000000000000001530512405272062017771 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: ximage.ml,v 1.1.2.1 2010/05/13 13:14:47 furuse Exp $*) open Images;; type elt = int;; (* must be int32, but lablgtk uses int *) type t = { width: int; height: int; data : Gdk.image; };; let destroy t = Gdk.Image.destroy t.data;; module Truecolor = struct (* Truecolor quick color query *) open Gdk.Truecolor let color_creator visual = let f = color_creator visual in fun rgb -> f ~red:(rgb.r * 257) ~green:(rgb.g * 257) ~blue:(rgb.b * 257) let color_parser visual = let f = color_parser visual in fun pixel -> let r, g, b = f pixel in { r = r lsr 8; g = g lsr 8; b = b lsr 8 } end;; let capsulate width height data = { width = width; height = height; data = data; };; let create ~kind ~visual ~width ~height = let ximage = Gdk.Image.create ~kind ~visual ~width ~height in capsulate width height ximage;; let unsafe_get t x y = Gdk.Image.get_pixel t.data ~x ~y;; let unsafe_set t x y c = Gdk.Image.put_pixel t.data ~x ~y ~pixel:c;; let get t x y = Region.check t.width t.height x y; unsafe_get t x y;; let set t x y c = Region.check t.width t.height x y; unsafe_set t x y c;; let get_image drawable ~x ~y ~width ~height = let ximage = Gdk.Image.get drawable ~x ~y ~width ~height in capsulate width height ximage;; (* external init_color_conversion : Gdk.visual -> unit = "init_color_conversion" external color_conversion : string -> int -> int = "color_conversion" *) let of_image visual progress img = let quick_color_create = Truecolor.color_creator visual in let prog v (* 0.0 .. 1.0 *) = match progress with | Some f -> f v | None -> () in let put_rgb ximg x y rgb = Gdk.Image.put_pixel ximg.data ~x ~y ~pixel:(quick_color_create rgb) in match img with | Rgb24 t -> let width = t.Rgb24.width in let height = t.Rgb24.height in let ximg = create ~kind: `FASTEST ~visual ~width ~height in let f_height = float height in for y = 0 to height - 1 do for x = 0 to width - 1 do put_rgb ximg x y (Rgb24.unsafe_get t x y) done; prog (float (y + 1) /. f_height) done; ximg | Rgba32 t -> (* ignore alpha *) let width = t.Rgba32.width in let height = t.Rgba32.height in let ximg = create ~kind: `FASTEST ~visual ~width ~height in let f_height = float height in for y = 0 to height - 1 do for x = 0 to width - 1 do put_rgb ximg x y (Rgba32.unsafe_get t x y).color done; prog (float (y + 1) /. f_height) done; ximg | Index8 t -> let width = t.Index8.width in let height = t.Index8.height in let cmap = t.Index8.colormap.map in let ximg = create ~kind: `FASTEST ~visual ~width ~height in let f_height = float height in let xcmap = Array.map quick_color_create cmap in for y = 0 to height - 1 do for x = 0 to width - 1 do Gdk.Image.put_pixel ximg.data ~x ~y ~pixel:xcmap.(Index8.unsafe_get t x y) done; prog (float (y + 1) /. f_height) done; ximg | Index16 t -> let width = t.Index16.width in let height = t.Index16.height in let cmap = t.Index16.colormap.map in let ximg = create ~kind: `FASTEST ~visual ~width ~height in let f_height = float height in let xcmap = Array.map quick_color_create cmap in for y = 0 to height - 1 do for x = 0 to width - 1 do Gdk.Image.put_pixel ximg.data ~x ~y ~pixel:xcmap.(Index16.unsafe_get t x y) done; prog (float (y + 1) /. f_height) done; ximg | _ -> failwith "not supported";; open GDraw;; let get_mono_gc win = let colormap = Gdk.Color.get_system_colormap () in let bmp = Gdk.Bitmap.create ~window:win ~width:1 ~height: 1 () in let gc = Gdk.GC.create bmp in (* GC.set_foreground gc (Color.color_parse "black"); *) Gdk.GC.set_foreground gc (Gdk.Color.alloc ~colormap: colormap `WHITE); gc;; let plain_mask win w h = let colormap = Gdk.Color.get_system_colormap () in let mono_gc = get_mono_gc win in let bmp = Gdk.Bitmap.create ~window:win ~width:w ~height:h () in Gdk.GC.set_foreground mono_gc (Gdk.Color.alloc ~colormap: colormap `WHITE); Gdk.Draw.rectangle bmp mono_gc ~x:0 ~y:0 ~width:w ~height:h ~filled: true (); bmp;; let mask_of_image win img = (* It is really inefficient *) let mono_gc = get_mono_gc win in let width, height = Images.size img in let draw_mask t transp image_get = prerr_endline "making mask"; let bmp = Gdk.Bitmap.create ~window:win ~width ~height () in let ximg = get_image bmp ~x:0 ~y:0 ~width ~height in for x = 0 to width - 1 do for y = 0 to height - 1 do if image_get t x y = transp then Gdk.Image.put_pixel ximg.data ~x ~y ~pixel: 0 else Gdk.Image.put_pixel ximg.data ~x ~y ~pixel: 1 done; done; Gdk.Draw.image bmp mono_gc ximg.data ~xsrc:0 ~ysrc:0 ~xdest:0 ~ydest:0 ~width ~height; Some bmp in (* BUG ? of gtk or lablgtk? Using None for mask does not work *) let width, height = Images.size img in begin match img with | Index8 t -> if t.Index8.transparent >= 0 then draw_mask t t.Index8.transparent Index8.unsafe_get else Some (plain_mask win width height) | Index16 t -> if t.Index16.transparent >= 0 then draw_mask t t.Index16.transparent Index16.unsafe_get else Some (plain_mask win width height) | _ -> Some (plain_mask win width height) end;; let pixmap_of win ximage = let visual = Gdk.Window.get_visual win in let pix = Gdk.Pixmap.create ~window: win ~depth: (Gdk.Visual.depth visual) ~width: ximage.width ~height: ximage.height () in let pixmap = new drawable pix in pixmap#put_image ~x:0 ~y:0 ~width: ximage.width ~height: ximage.height ~xsrc:0 ~ysrc:0 ximage.data; pix;; let pixmap_of_image win progress img = let visual = Gdk.Window.get_visual win in let ximage = of_image visual progress img in let msk = mask_of_image win img in let pixmap = new GDraw.pixmap ?mask: msk (pixmap_of win ximage) in pixmap;; camlspotter-camlimages-e471b3c4470d/src/ximage.mli0000644000000000000000000000402212405272062020134 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: Exp *) type elt = int;; (* must be int32, but lablgtk uses int *) (** ximage data structure with size information *) type t = { width: int; height: int; data : Gdk.image; };; val destroy : t -> unit;; (** You need manual destroy *) val create : kind:Gdk.Image.image_type -> visual:Gdk.visual -> width: int -> height: int -> t;; (** Same as Gdk.Image.create, but with size info *) val unsafe_get : t -> int -> int -> elt;; val unsafe_set : t -> int -> int -> elt -> unit;; val get : t -> int -> int -> elt;; val set : t -> int -> int -> elt -> unit;; val get_image : [>`drawable] Gobject.obj -> x:int -> y:int -> width:int -> height:int -> t (* Same as Gdk.Image.get, but with size info *) val of_image : Gdk.visual -> (float -> unit) option -> Images.t -> t;; val get_mono_gc : Gdk.window -> Gdk.gc;; val plain_mask : Gdk.window -> int -> int -> Gdk.bitmap;; val pixmap_of : Gdk.window -> t -> Gdk.pixmap;; val mask_of_image : Gdk.window -> Images.t -> Gdk.bitmap option;; val pixmap_of_image : Gdk.window -> (float -> unit) option -> Images.t -> GDraw.pixmap;; module Truecolor : sig val color_creator : Gdk.visual -> Images.rgb -> int val color_parser : Gdk.visual -> int -> Images.rgb end;; camlspotter-camlimages-e471b3c4470d/src/ximage2.ml0000644000000000000000000000165712405272062020060 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: ximage2.ml,v 1.5.2.1 2010/05/13 13:14:47 furuse Exp $*) (* This module is for backward compatibility *) include Ximage camlspotter-camlimages-e471b3c4470d/src/xpm.ml0000644000000000000000000000461212405272062017322 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: xpm.ml,v 1.2 2008/06/16 22:35:42 furuse Exp $ *) open Images open Color open Util external read : string -> int * int * string array * int array = "read_xpm_file";; let load file _opts = let w, h, cmap, imap = read file in let cmap, transparent = colormap_parse cmap in (* if the colors <= 256 then we create index8, otherwise create index16 *) if Array.length cmap <= 256 then begin let buf = Bytes.create (w * h) in for i = 0 to w * h - 1 do buf << i & char_of_int imap.(i) done; Index8 (Index8.create_with w h [] { map = cmap; max = 256 - 1; } transparent buf) end else begin let buf = Bytes.create (w * h * 2) in for i = 0 to w * h - 1 do let (&) = (@@) in buf << i * 2 & char_of_int (imap.(i) / 256); buf << i * 2 + 1 & char_of_int (imap.(i) mod 256) done; Index16 (Index16.create_with w h [] { map = cmap; max = 256 * 256 - 1; } transparent buf) end;; let check_header filename = let len = 9 in let ic = open_in_bin filename in try let str = Bytes.create len in really_input ic str 0 len; close_in ic; if str = "/* XPM */" then { header_width = -1; header_height = -1; header_infos = []; } else raise Wrong_file_type with | _ -> raise Wrong_file_type;; add_methods Xpm { check_header = check_header; load = Some load; save = None; load_sequence = None; save_sequence = None; };; camlspotter-camlimages-e471b3c4470d/src/xpm.mli0000644000000000000000000000237112405272062017473 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: xpm.mli,v 1.1 2007/01/18 10:29:57 rousse Exp $ *) val check_header : string -> Images.header;; (** Checks the file header *) val load : string -> Images.load_option list -> Images.t;; (** Loads an xpm image. *) (* NO SAVE val save : string -> Images.save_option list -> Images.t -> unit *) camlspotter-camlimages-e471b3c4470d/src/xpm_na.c0000644000000000000000000000213212405272062017605 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #include #include #include #include value read_xpm_file(){ failwith("unsupported"); } camlspotter-camlimages-e471b3c4470d/src/xpmread.c0000644000000000000000000000542412405272062017772 0ustar 00000000000000/***********************************************************************/ /* */ /* Objective Caml */ /* */ /* Franois Pessaux, projet Cristal, INRIA Rocquencourt */ /* Pierre Weis, projet Cristal, INRIA Rocquencourt */ /* Jun Furuse, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1999,2000 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* Distributed only by permission. */ /* */ /***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include value read_xpm_file( name ) value name; { CAMLparam1(name); CAMLlocal3(cmap,imap,result); char *filename; XpmImage image; int i; filename = String_val( name ); if( !XpmReadFileToXpmImage( filename, &image, NULL ) ){ /* fprintf(stderr, "width = %d\n", image.width); fprintf(stderr, "height = %d\n", image.height); fprintf(stderr, "colors = %d\n", image.ncolors); */ cmap = alloc_tuple( image.ncolors ); for(i=0; istring); fprintf(stderr, " symbolic= %s", color->symbolic); fprintf(stderr, " m_color= %s", color->m_color); fprintf(stderr, " g4_color= %s", color->g4_color); fprintf(stderr, " g_color= %s", color->g_color); */ /* fprintf(stderr, "%d c_color= %s\n", i, color->c_color); */ if( color->c_color == NULL ) { fprintf(stderr, "color id %d has no c_color\n", i); Store_field(cmap, i, copy_string("null")); } else { Store_field(cmap, i, copy_string(color->c_color)); } } { /* image map alloc */ int size = image.width * image.height; imap = alloc_tuple( size ); for(i=0; i prerr_endline "wrong header id"; raise Wrong_image_type;; let read_header ic = read_id ic; let info = ref None in try while true do let str = input_line ic in if str = "#END_OF_COMMENTS" then raise Exit; try let pref = "#IMGINFO:" in let pref_len = String.length pref in if String.sub str 0 pref_len = pref then begin info := Some (String.sub str pref_len (String.length str - pref_len)) end; with | _ -> () done; raise Exit with | Exit -> let info = match !info with Some info -> info | None -> raise Wrong_image_type in try let str = input_line ic in let tokens = List.map int_of_string (Mstring.split_str (function ' ' -> true | _ -> false) str) in match tokens with [w;h;cols] when cols <= 255 -> info, w, h | _ -> prerr_endline ("GEOM get failed: " ^ str); raise Wrong_image_type with | _ -> raise Wrong_image_type;; let cmap_332 () = { max = 256; map = Array.init 256 (fun x -> { r = (255*((x land (7 lsl 5)) lsr 5))/ 7; g = (255*((x land (7 lsl 2)) lsr 2))/ 7; b = (255*((x land (3 lsl 0)) lsr 0))/ 3 }) };; let load_body ic w h = let length = w * h in let str = Bytes.create length in try really_input ic str 0 length; Index8.create_with w h [] (cmap_332 ()) (-1) str with | _ -> prerr_endline "short"; raise Wrong_image_type;; let load name = let ic = open_in_bin name in let info, w, h = read_header ic in let img = load_body ic w h in close_in ic; info, img;; (********************************************************************** save *) open Index8;; let write_id oc = output_string oc "P7 332\n";; let write_header oc info width height = write_id oc; output_string oc "#XVVERSION:Version 3.10a (created the camlimages library)\n"; output_string oc "#IMGINFO:"; output_string oc info; output_char oc '\n'; output_string oc "#END_OF_COMMENTS\n"; output_string oc (string_of_int width); output_char oc ' '; output_string oc (string_of_int height); output_string oc " 255\n";; let convert_332 rgb = (* no dithering !!! *) (rgb.r / 32) lsl 5 + (rgb.g / 32) lsl 2 + rgb.b / 64;; let save_body oc img = for y = 0 to img.height - 1 do for x = 0 to img.width - 1 do output_byte oc (convert_332 (unsafe_get_rgb img x y)) done done;; let save name info img = let oc = open_out name in write_header oc info img.width img.height; save_body oc img; close_out oc;; let create img = let w, h = Images.size img in let nw, nh = let scale_w = 80.0 /. float w and scale_h = 60.0 /. float h in if scale_w > 1.0 && scale_h > 1.0 then w, h else begin if scale_w < scale_h then begin 80, truncate (float h *. scale_w) end else begin truncate (float w *. scale_h), 60 end end in let resized24 = match img with | Rgb24 t -> Rgb24.resize None t nw nh | Index8 t -> let rgb24 = Index8.to_rgb24 t in let resized = Rgb24.resize None rgb24 nw nh in Rgb24.destroy rgb24; resized | Index16 t -> let rgb24 = Index16.to_rgb24 t in let resized = Rgb24.resize None rgb24 nw nh in Rgb24.destroy rgb24; resized | Rgba32 _ | Cmyk32 _ -> failwith "RGBA and CMYK not supported" in let thumb = Index8.create_with nw nh [] (cmap_332 ()) (-1) (Bytes.create (nw * nh)) in for y = 0 to nh - 1 do for x = 0 to nw - 1 do Index8.unsafe_set thumb x y (convert_332 (Rgb24.unsafe_get resized24 x y)) done done; Rgb24.destroy resized24; thumb;; camlspotter-camlimages-e471b3c4470d/src/xvthumb.mli0000644000000000000000000000246112405272062020364 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: xvthumb.mli,v 1.1 2007/01/18 10:29:58 rousse Exp $ *) (** XV thumbnail loader. XV thumbnails are thumbnail files created by an application "xv" and they are stored in .xvpics directory. This module provides loading of these thumbnail files. *) val load : string -> string * Index8.t (** Returns image info and its thumbnail *) val save : string -> string -> Index8.t -> unit (** Save xv thumbnail. The [Index8.t] value must be 80x80 at most. *) val create : Images.t -> Index8.t;; camlspotter-camlimages-e471b3c4470d/test/.cvsignore0000644000000000000000000000006612405272062020353 0ustar 00000000000000test test.byt test.opt out.image Makefile Makefile.in camlspotter-camlimages-e471b3c4470d/test/OMakefile0000644000000000000000000000303012405272062020124 0ustar 00000000000000#*********************************************************************# # # # Caml Images # # # # Fran輟is Pessaux, projet Cristal, INRIA Rocquencourt # # Pierre Weis, projet Cristal, INRIA Rocquencourt # # Jun Furuse, projet Cristal, INRIA Rocquencourt # # # # Copyright 1999-2004, # # Institut National de Recherche en Informatique et en Automatique. # # Distributed only by permission. # # # #*********************************************************************# #(* $Id: OMakefile,v 1.1.2.2 2010/05/13 13:37:15 furuse Exp $ *) OCAMLPACKS[]= graphics SUB_PACKAGES[]= all_formats graphics freetype BuildExample(test, test, $(SUB_PACKAGES)) # BuildExample is badly written, so we need reseting OCAML_LIBS OCAML_LIBS= BuildExample(test2, test2, $(SUB_PACKAGES)) # BuildExample is badly written, so we need reseting OCAML_LIBS OCAML_LIBS= BuildExample(jpgmark, jpgmark, $(SUB_PACKAGES)) # BuildExample is badly written, so we need reseting OCAML_LIBS OCAML_LIBS= BuildExample(jpgexif, jpgexif, $(SUB_PACKAGES)) clean: rm -f $(filter-proper-targets $(ls R, .)) rm -f out.image camlspotter-camlimages-e471b3c4470d/test/images/.cvsignore0000644000000000000000000000001012405272062021605 0ustar 00000000000000.xvpics camlspotter-camlimages-e471b3c4470d/test/images/apbm.pbm0000644000000000000000000027060512405272062021247 0ustar 00000000000000P1 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 266 175 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 camlspotter-camlimages-e471b3c4470d/test/images/apgm.pgm0000644000000000000000000051323212405272062021255 0ustar 00000000000000P2 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 250 167 255 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 224 224 232 224 224 224 224 224 224 232 224 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 232 224 224 224 224 224 224 224 232 232 224 224 224 224 232 224 224 232 224 224 224 232 232 224 224 232 224 224 224 232 224 232 224 232 224 224 224 232 224 224 232 224 224 232 224 224 232 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 232 224 232 224 224 232 224 232 224 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 232 224 224 232 224 224 232 224 224 232 224 232 224 232 232 224 232 224 232 224 224 224 232 224 232 232 232 224 232 232 224 224 224 224 232 232 232 224 232 224 224 232 224 224 232 224 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 232 224 232 224 224 224 224 224 232 224 232 224 224 232 224 232 224 232 224 232 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 232 224 224 224 224 224 224 224 232 224 232 224 224 232 224 224 224 232 224 232 224 232 224 232 232 224 232 224 232 232 224 232 224 224 232 224 232 224 224 224 224 224 224 224 224 232 232 224 224 232 224 224 232 224 224 224 232 224 224 224 232 224 232 224 224 224 224 232 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 232 232 224 224 232 224 224 224 224 224 232 224 232 224 224 224 232 232 224 232 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 224 232 224 232 224 224 232 224 224 232 224 224 232 224 232 224 224 232 224 224 232 224 232 224 224 232 224 232 224 232 224 232 224 232 224 224 224 232 224 232 224 232 224 224 224 232 224 232 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 232 224 224 224 232 224 232 224 224 232 224 224 232 232 224 232 224 224 224 224 232 224 232 232 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 232 224 224 224 224 232 224 224 232 224 224 232 232 232 224 232 224 232 232 224 232 224 232 224 232 232 232 224 232 224 232 224 232 224 232 224 232 224 224 224 224 224 232 224 224 224 224 232 224 232 224 232 224 232 224 232 224 232 224 224 232 224 224 232 224 232 224 232 224 232 224 224 232 224 224 232 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 232 224 232 232 224 232 224 224 232 224 224 232 224 232 224 232 224 232 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 232 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 232 232 224 232 224 224 232 224 224 232 224 224 224 224 232 224 232 224 232 224 232 224 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 232 224 232 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 232 224 224 224 224 224 232 224 224 224 224 232 232 224 232 224 224 232 224 232 224 224 232 224 232 224 232 224 232 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 232 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 232 224 232 232 224 232 224 232 224 232 232 240 232 240 232 240 232 232 232 232 240 232 240 232 232 240 232 232 232 232 232 224 224 224 232 232 232 232 232 240 232 232 240 232 232 240 232 240 232 240 232 232 240 232 232 232 232 232 240 232 240 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 240 232 224 232 232 224 232 232 224 224 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 224 224 224 232 224 224 224 232 224 232 224 232 224 168 98 104 104 104 104 98 104 114 114 114 114 114 112 104 104 98 104 98 98 104 112 104 114 104 114 114 104 114 104 114 104 104 98 104 98 98 98 104 104 104 114 114 112 114 104 114 104 114 104 114 104 104 104 114 104 104 104 104 114 104 104 104 104 104 104 104 98 112 104 104 104 104 104 104 114 114 104 114 114 104 104 114 104 104 104 114 104 104 114 114 114 120 114 120 128 144 144 144 144 152 160 160 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 160 160 168 168 168 168 168 168 168 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 184 168 168 168 168 168 160 168 160 168 168 168 168 168 168 168 184 168 184 184 184 186 192 200 202 208 208 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 232 224 232 224 224 232 224 232 232 224 232 232 232 232 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 232 232 232 224 224 232 224 232 224 232 224 224 224 232 114 144 128 144 128 144 136 136 144 128 144 128 144 144 128 144 128 144 128 144 128 144 136 136 136 136 128 144 128 144 128 136 128 144 128 144 136 144 128 144 128 144 128 136 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 128 128 128 128 144 128 128 144 128 128 144 128 144 128 128 144 128 144 128 144 128 128 128 144 128 144 136 144 128 144 128 144 128 144 128 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 128 128 128 128 144 128 128 128 120 128 128 128 128 128 128 128 128 120 128 128 120 128 120 128 128 120 128 128 120 120 120 120 120 120 128 128 120 128 128 128 120 128 120 120 120 120 120 120 114 114 120 114 114 114 104 112 104 104 104 98 98 98 112 104 104 114 104 104 104 104 104 104 104 104 104 104 104 104 104 104 98 104 96 96 88 88 88 88 88 96 96 98 98 98 96 96 96 96 192 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 208 98 136 144 128 144 128 144 128 136 144 128 144 128 144 144 136 144 144 144 136 136 128 144 144 144 128 144 128 144 128 136 128 144 128 144 128 136 128 144 128 128 144 136 128 144 128 144 144 128 144 128 144 128 144 128 144 128 128 144 128 128 128 144 128 144 128 128 128 144 120 128 144 128 128 128 128 128 136 128 128 136 128 136 144 128 128 128 128 144 128 136 128 144 128 128 128 128 136 128 128 144 128 128 144 120 144 128 128 128 128 128 144 128 128 128 128 128 144 128 128 128 128 128 144 128 128 144 128 128 128 128 144 128 128 128 144 128 128 128 128 144 128 128 128 128 144 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 120 128 128 128 120 128 128 128 128 128 128 128 128 128 128 120 128 120 128 128 128 120 128 128 128 128 128 120 128 128 128 128 128 128 136 128 128 160 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 224 232 224 224 224 224 232 224 224 232 224 224 232 224 232 224 232 128 144 144 144 136 144 144 144 144 136 144 144 128 144 144 144 144 136 144 144 144 144 144 128 144 144 144 128 144 128 144 144 144 144 136 144 144 144 144 128 144 144 144 144 144 128 144 144 128 144 144 128 144 144 128 144 128 144 128 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 144 144 128 144 128 144 128 128 144 128 144 128 144 128 144 128 144 128 144 144 128 144 128 144 128 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 128 144 128 144 128 128 144 128 128 128 144 128 144 128 128 128 128 144 128 128 144 128 144 128 144 128 128 128 144 128 144 128 128 128 128 128 128 128 128 128 144 128 128 128 128 144 128 128 136 128 136 128 128 128 128 128 128 120 128 128 128 128 128 120 128 128 128 128 128 120 128 128 128 128 128 120 128 128 128 128 120 128 120 128 128 128 128 120 120 232 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 232 224 224 232 232 224 224 208 114 144 144 136 144 144 144 144 144 144 144 144 144 128 144 144 136 144 144 144 144 144 144 144 144 144 144 144 144 144 144 128 144 144 136 144 128 144 144 144 144 128 144 144 144 144 144 128 144 144 144 144 144 128 144 144 144 128 144 144 128 144 144 128 144 144 128 144 144 144 128 144 128 144 128 144 128 144 136 144 128 144 128 144 144 128 144 128 144 128 144 136 144 136 144 128 144 136 144 144 128 144 144 128 144 144 128 144 128 144 128 128 144 128 144 128 144 128 144 128 144 144 144 128 144 128 144 128 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 144 128 128 144 128 128 144 128 128 144 128 128 144 128 128 128 144 128 144 128 128 144 128 144 128 128 144 128 144 136 128 128 144 128 128 128 128 128 128 120 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 114 192 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 232 224 114 152 144 144 152 144 144 152 144 144 144 144 144 144 152 144 144 144 144 144 144 144 144 144 144 144 144 152 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 128 152 144 128 144 144 144 144 144 144 144 144 144 128 152 144 144 144 144 144 144 128 144 144 144 136 144 144 144 128 152 128 144 144 128 152 144 144 144 144 144 144 144 144 144 144 144 144 144 144 152 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 128 144 144 144 144 144 144 144 128 144 144 128 144 144 144 144 144 144 144 144 144 144 144 128 144 128 144 128 144 128 144 144 128 144 128 144 128 144 128 144 128 144 144 128 144 144 128 144 128 128 144 128 128 144 128 144 128 128 128 144 128 128 128 128 128 128 128 128 128 144 128 128 128 128 128 144 128 128 128 128 144 128 128 144 128 128 104 240 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 224 224 232 232 232 186 96 152 152 152 152 152 152 152 152 152 152 152 144 152 152 152 144 144 152 144 152 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 152 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 152 144 152 144 144 144 144 144 144 144 144 144 152 144 144 144 144 144 144 152 152 144 144 152 144 144 152 152 152 144 144 144 144 152 144 144 144 144 144 144 144 144 144 144 144 152 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 128 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 152 144 144 144 144 144 144 144 144 144 128 144 128 128 144 128 144 128 144 128 144 128 144 128 128 144 128 144 128 128 144 128 144 128 144 128 128 144 128 144 128 144 128 144 128 152 120 152 232 224 224 232 224 224 224 224 224 224 232 224 224 232 224 232 224 232 224 232 224 232 224 232 224 224 186 144 104 128 160 160 160 152 152 152 152 152 160 152 152 152 160 152 152 152 152 160 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 128 144 152 152 144 160 152 152 152 152 152 104 128 152 144 144 152 152 152 152 144 152 152 152 152 152 152 144 152 152 144 152 152 152 152 152 144 152 152 152 152 152 152 152 152 152 152 144 144 152 144 152 152 144 144 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 144 144 144 144 128 104 98 96 114 80 98 114 152 152 152 152 152 144 152 152 152 152 152 152 152 152 152 152 152 144 152 152 152 152 152 152 152 152 152 144 144 152 152 144 152 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 152 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 128 144 128 144 144 128 144 128 144 128 144 128 144 128 144 144 144 128 144 144 128 144 144 144 144 144 128 144 144 128 144 144 144 114 136 232 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 232 224 232 224 224 224 224 232 128 152 168 168 168 168 168 160 168 160 168 160 160 160 160 160 152 160 160 160 160 160 160 160 160 160 152 152 152 160 152 160 160 160 160 160 160 98 80 96 120 160 152 128 80 98 152 160 152 152 160 66 128 160 152 152 152 152 152 152 152 160 152 160 152 152 152 152 152 152 160 152 152 152 152 152 152 152 144 152 152 152 152 152 152 160 152 152 152 152 152 152 160 152 152 152 160 152 152 160 160 152 152 152 152 144 152 152 160 160 152 152 160 160 168 152 160 144 144 160 152 144 114 120 80 128 160 152 152 152 160 160 160 152 160 160 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 144 152 144 152 144 152 152 152 152 152 152 152 152 152 144 152 144 152 152 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 128 152 120 114 168 224 232 224 224 224 224 224 224 232 224 224 232 224 232 224 232 224 232 232 232 224 232 128 176 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 160 160 168 168 160 168 168 160 152 160 152 160 160 120 88 160 104 98 114 160 160 160 98 104 96 168 160 152 128 104 120 144 160 168 160 160 160 160 160 168 160 160 160 160 168 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 168 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 152 160 160 160 160 160 160 160 160 160 160 160 160 160 160 152 128 128 112 104 104 56 114 160 168 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 152 152 160 152 152 160 152 160 152 160 152 160 160 152 160 152 160 152 152 152 152 152 152 152 152 152 152 152 160 152 152 152 152 152 144 152 144 152 152 144 152 144 152 144 144 152 144 144 152 144 144 152 144 144 144 152 144 144 144 144 144 144 144 144 152 144 144 152 144 152 152 128 104 104 168 232 224 224 224 224 224 224 224 232 224 224 232 224 232 224 232 224 232 224 144 184 184 184 184 184 184 168 168 168 184 168 168 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 128 152 98 152 168 168 168 168 104 96 114 168 168 144 104 80 120 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 160 168 160 168 168 160 160 168 160 160 168 160 168 168 168 160 168 168 168 160 168 168 168 168 168 160 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 160 168 168 168 168 168 168 168 168 168 168 144 144 152 96 144 168 152 152 168 168 168 168 168 168 168 168 168 168 160 168 160 168 168 168 160 168 168 168 160 168 160 168 160 168 160 168 160 168 168 160 168 168 160 168 168 160 168 160 160 168 160 160 160 160 160 160 160 160 160 160 160 152 160 152 152 160 152 152 160 152 152 160 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 160 152 160 98 232 224 224 224 224 224 224 224 232 224 232 224 232 224 232 232 224 224 232 152 186 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 168 184 184 184 184 184 184 168 184 184 184 184 168 184 168 184 114 168 168 152 152 128 168 120 128 160 184 168 184 168 98 104 96 152 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 152 128 144 152 168 184 168 184 168 160 114 98 98 104 152 184 160 128 114 98 144 168 98 168 168 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 160 168 160 168 160 168 160 160 160 160 160 160 160 160 160 160 160 152 160 160 160 152 160 160 152 152 152 152 152 152 160 152 152 152 152 160 152 160 152 160 160 160 160 160 160 120 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 232 232 144 192 192 186 192 186 186 192 186 186 186 186 186 186 186 186 186 186 186 186 186 186 184 186 184 184 186 186 184 168 184 184 184 186 184 120 184 168 184 186 128 184 184 184 184 184 184 184 184 104 96 98 184 168 184 184 184 184 168 184 184 184 184 168 184 184 184 184 168 184 184 184 168 184 168 184 184 168 184 184 168 184 168 184 168 184 184 184 168 184 184 184 184 184 184 184 184 184 184 168 184 184 168 168 168 186 186 168 168 152 144 88 96 96 96 120 128 184 160 160 186 186 152 88 114 168 160 96 128 80 144 144 114 186 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 168 184 184 184 184 168 184 184 184 184 184 184 184 168 184 168 168 184 184 168 184 184 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 160 168 160 168 168 160 168 160 168 168 160 168 160 168 168 160 168 168 168 160 168 168 160 168 160 168 160 152 224 224 224 224 224 224 224 224 224 232 224 224 232 224 232 224 232 224 232 152 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 186 192 192 186 192 186 186 192 186 192 192 186 192 192 192 186 192 192 192 192 186 186 192 186 192 186 192 186 160 152 176 186 114 114 192 186 186 192 186 186 186 192 186 192 186 186 186 192 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 192 186 186 186 192 186 186 186 186 186 186 186 186 184 98 96 88 114 56 96 80 88 98 128 184 168 98 160 120 114 112 144 152 66 152 120 184 186 186 128 96 168 152 104 98 88 80 152 104 192 186 186 192 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 192 186 186 192 186 192 186 186 186 186 186 186 186 184 186 186 184 184 186 184 186 184 184 184 184 168 186 186 184 184 184 184 184 168 184 168 168 184 168 168 168 168 168 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 232 152 202 202 202 202 202 202 202 200 200 192 202 200 202 200 202 202 202 202 202 202 202 202 200 200 208 192 160 144 96 114 202 200 202 202 202 200 202 192 192 200 200 192 192 200 192 192 202 128 168 114 168 192 192 168 200 192 192 192 192 192 192 202 192 192 192 192 192 192 192 192 200 192 192 192 192 192 192 192 192 192 200 192 202 200 192 200 202 192 192 192 192 192 192 192 202 152 64 160 120 152 168 152 152 160 66 96 66 114 152 168 168 114 176 168 168 168 184 120 160 160 192 186 192 114 96 128 104 80 98 96 98 144 184 192 192 192 192 168 168 186 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 186 192 192 192 186 192 186 192 192 186 192 186 186 186 186 186 186 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 168 184 184 184 184 184 184 184 184 168 184 184 184 184 184 184 184 184 186 186 184 184 168 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 152 208 202 202 208 202 208 202 202 208 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 80 120 160 144 144 120 208 202 202 202 202 202 200 202 202 202 202 202 202 202 202 208 202 202 200 120 186 200 202 202 202 202 200 202 200 202 202 200 202 202 202 202 202 202 202 200 202 202 202 202 202 202 202 202 202 202 202 202 202 200 202 202 202 202 202 202 202 202 202 208 160 160 168 168 208 208 98 120 136 128 128 96 120 98 168 114 184 114 160 168 152 160 152 104 104 120 144 136 184 136 98 120 114 114 104 120 104 120 186 202 202 202 192 200 192 160 160 202 200 202 200 192 202 202 200 202 202 202 202 200 202 202 202 202 200 202 202 202 202 192 202 202 192 202 202 200 200 192 200 202 202 200 192 202 200 192 202 200 192 192 192 192 186 192 192 186 186 186 186 192 186 184 186 184 186 186 184 184 184 184 186 184 186 186 186 186 184 186 184 184 184 186 184 184 184 186 186 186 186 186 186 186 186 184 184 176 224 224 224 224 232 224 232 224 224 224 224 224 232 224 224 224 224 224 232 152 216 208 208 208 208 208 216 208 208 208 208 208 208 216 208 208 216 208 208 208 208 208 202 208 128 192 144 160 80 202 208 208 208 208 208 216 104 208 208 208 208 202 208 208 144 208 202 208 208 208 208 202 202 202 202 202 208 202 202 202 208 202 202 202 202 202 202 202 202 202 202 202 202 208 202 208 202 202 208 202 202 202 202 208 202 202 208 202 208 208 208 202 208 152 184 202 208 208 208 192 144 128 98 96 104 114 88 104 96 96 88 98 104 98 88 96 80 168 114 152 66 114 144 104 104 88 80 120 80 104 88 168 208 208 202 208 202 208 202 208 144 152 202 202 202 202 202 202 202 202 208 202 202 208 208 202 208 202 202 202 202 208 202 202 202 202 202 202 202 208 202 202 202 202 202 202 202 202 208 202 202 202 202 202 200 200 200 202 192 202 192 200 200 192 192 192 192 192 200 192 192 192 186 192 186 192 192 192 192 192 192 192 186 186 192 192 186 186 192 192 186 192 192 192 192 192 186 186 184 168 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 152 224 208 216 208 224 224 208 216 208 216 216 208 224 208 216 216 208 224 208 208 224 208 216 216 128 152 152 168 186 208 208 208 216 208 216 208 208 186 208 208 208 152 80 208 88 224 208 202 192 202 160 208 208 216 208 208 216 208 208 208 208 216 208 208 216 208 208 208 216 208 208 208 216 208 216 208 224 208 208 216 208 216 208 208 216 208 208 216 208 208 216 208 160 202 216 192 160 72 96 66 112 114 104 120 120 184 128 144 88 104 128 96 96 66 120 96 144 88 168 114 56 160 56 104 114 88 96 152 80 104 104 80 192 160 202 208 202 192 200 224 192 186 186 208 208 216 208 208 208 208 208 208 208 208 208 208 208 216 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 216 208 208 208 202 202 208 202 202 202 202 202 202 202 202 202 202 202 202 202 200 202 202 200 200 202 200 202 200 202 192 200 192 192 200 192 192 202 200 200 192 202 200 192 202 192 202 192 202 192 186 184 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 152 224 216 208 224 224 208 224 208 224 208 224 216 224 224 208 224 224 208 224 224 208 224 224 224 208 224 208 224 216 224 208 224 208 224 208 202 104 160 224 208 224 200 144 186 120 120 186 224 144 120 120 80 224 208 224 208 224 208 224 208 224 208 216 224 208 208 224 208 216 216 208 224 208 216 224 208 208 224 208 208 216 208 224 208 224 208 224 208 224 208 208 192 184 186 144 66 104 98 88 114 120 114 120 128 96 88 80 144 114 114 88 96 104 114 88 152 104 152 114 66 96 96 114 96 80 104 96 88 144 114 104 114 224 224 128 186 176 192 120 144 192 224 186 216 208 216 208 216 208 216 208 216 208 216 208 224 208 208 208 208 208 216 208 216 208 216 208 224 208 208 216 208 224 208 208 216 216 208 224 208 208 216 208 208 208 208 208 208 202 208 208 202 208 202 208 208 208 208 202 208 202 202 202 202 202 202 202 202 202 202 202 202 202 202 208 202 202 202 202 202 202 202 202 202 200 202 200 200 186 184 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 160 224 224 224 216 224 224 208 224 224 224 224 208 224 224 224 208 224 224 216 224 224 208 224 224 224 224 224 224 208 224 224 224 224 208 224 224 98 208 224 208 184 114 160 136 168 168 184 168 208 192 152 192 160 192 224 216 208 224 208 216 208 224 208 224 224 216 216 224 208 224 224 216 224 224 208 224 216 224 224 216 224 208 224 224 208 224 216 224 208 224 208 192 104 98 114 114 114 80 144 120 96 98 96 114 96 104 104 104 104 144 98 114 128 128 98 66 128 104 96 96 98 120 88 88 88 88 88 88 88 98 98 144 208 152 160 104 186 160 192 224 168 152 120 208 216 208 224 208 216 208 224 208 208 224 208 208 216 208 224 208 216 224 208 208 224 224 216 216 216 224 208 224 208 224 208 208 224 208 208 216 216 224 208 224 208 208 208 216 208 216 208 216 208 208 208 208 208 224 208 208 208 208 208 208 202 208 208 208 208 208 216 208 208 208 208 202 208 202 208 208 208 208 208 202 208 202 208 202 192 186 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 160 224 216 224 224 208 224 224 224 208 224 224 224 224 208 224 224 224 216 224 224 208 192 208 224 208 224 224 224 224 224 208 224 224 224 216 224 186 168 216 224 168 144 160 216 152 128 224 168 160 160 96 120 114 160 224 224 224 216 224 224 224 216 224 208 224 224 216 224 224 224 208 224 224 208 224 224 224 208 224 224 208 224 224 208 224 224 224 208 224 224 224 152 104 168 152 152 120 104 96 120 98 120 120 120 96 104 98 128 114 104 96 96 88 104 104 128 128 120 168 128 56 168 96 88 80 96 88 56 98 104 98 152 184 168 128 160 168 224 192 186 186 136 128 186 224 216 224 224 208 224 224 224 224 208 224 224 224 216 224 224 208 224 224 224 216 224 224 208 224 224 224 208 224 224 224 224 216 224 224 224 216 224 224 208 224 224 216 224 216 224 208 224 208 224 208 224 208 208 208 224 208 224 208 224 208 216 208 216 208 224 208 208 216 208 224 208 208 216 208 208 208 224 208 208 208 216 208 208 192 192 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 168 224 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 216 224 224 208 186 168 168 202 224 186 192 144 224 224 224 216 224 208 224 224 224 224 224 224 224 216 202 224 224 224 224 208 184 128 186 192 152 224 216 224 208 224 224 216 224 224 208 224 224 208 224 224 208 224 224 224 224 224 224 224 208 224 224 208 224 224 224 224 224 208 224 224 224 192 104 168 192 104 168 98 96 98 112 104 114 96 98 98 128 114 98 88 96 96 96 144 120 128 120 88 104 168 120 128 96 104 66 88 98 80 88 88 96 96 120 152 114 120 168 128 104 202 224 192 184 144 184 200 224 216 224 208 224 224 208 224 224 224 216 224 216 224 208 224 224 224 208 224 224 208 224 224 224 208 224 224 224 208 224 224 224 224 208 224 224 208 224 224 224 216 224 224 208 224 224 224 208 208 224 208 224 224 224 208 224 208 224 208 208 224 208 224 208 216 208 224 216 224 208 216 184 202 192 224 202 208 216 224 208 224 208 208 192 192 224 224 224 232 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 184 160 186 168 152 224 144 128 66 216 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 98 168 232 144 224 224 224 224 224 224 224 224 224 224 224 224 208 224 224 224 224 224 224 224 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 216 186 104 192 186 224 168 96 136 104 112 98 128 144 114 128 160 114 104 104 98 112 120 98 88 96 152 96 128 88 104 104 104 96 120 128 98 96 120 88 104 120 88 80 128 160 120 128 152 128 144 208 224 202 104 160 168 224 224 224 224 216 224 224 208 224 216 224 224 224 224 224 224 224 224 224 216 224 224 224 224 208 224 224 208 224 224 224 208 224 224 224 216 224 224 224 208 224 224 208 224 224 224 208 224 224 224 224 224 224 208 224 224 208 224 224 224 208 224 224 208 224 224 224 216 224 224 224 224 104 152 128 144 168 224 224 224 224 208 224 208 192 192 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 184 186 186 168 186 176 120 104 224 216 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 152 202 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 224 224 224 224 224 152 224 216 186 104 98 128 144 96 120 168 128 152 160 98 128 168 114 112 112 104 114 120 88 96 66 96 120 98 104 168 114 152 160 98 104 96 98 114 80 98 98 128 96 104 120 128 144 98 168 168 168 160 98 184 168 184 224 224 224 224 208 224 224 224 224 224 224 208 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 224 224 224 216 224 216 224 224 224 224 224 224 224 224 224 208 224 224 208 224 224 224 224 208 224 224 208 224 224 208 224 224 224 216 224 224 208 224 202 144 114 96 120 224 224 224 208 224 224 224 224 224 186 192 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 160 168 184 168 168 186 184 168 152 224 224 224 224 224 224 224 186 160 184 128 224 224 224 192 152 224 224 224 224 224 168 120 186 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 168 186 184 114 88 184 184 186 96 208 144 56 120 152 98 96 98 168 104 168 128 128 160 88 80 128 112 98 114 120 120 96 120 104 104 152 114 80 144 168 98 104 88 98 104 144 114 114 98 152 114 120 114 168 186 208 192 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 216 224 224 224 224 216 224 216 224 224 224 208 160 152 160 160 160 208 224 224 224 224 224 208 224 186 200 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 184 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 160 160 184 168 160 202 224 224 224 224 224 224 224 224 224 186 202 202 160 96 224 224 224 192 224 224 224 224 192 168 168 88 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 192 144 114 96 184 202 168 128 160 224 88 202 224 224 184 88 168 168 184 152 128 120 128 160 98 152 66 104 66 96 98 120 98 120 160 104 96 98 114 80 98 120 104 80 120 88 168 104 128 112 128 120 160 184 168 184 224 168 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 96 98 128 152 224 224 224 224 224 224 224 224 184 202 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 168 186 192 168 168 232 224 224 224 224 224 224 224 224 224 152 120 208 232 168 224 224 224 192 120 224 224 224 232 98 184 98 152 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 104 160 184 144 224 186 128 208 186 72 208 224 224 186 120 208 186 114 96 112 144 114 114 120 144 104 120 136 120 104 96 96 120 88 114 80 104 96 120 104 88 98 104 120 66 136 96 120 144 96 120 128 208 168 224 168 208 152 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 160 192 120 168 216 224 224 224 224 224 224 224 224 184 202 224 224 224 224 224 232 232 224 224 224 224 224 224 224 232 224 224 224 224 184 224 224 224 224 224 224 232 224 224 224 232 224 224 224 232 224 224 224 224 208 186 208 192 168 224 224 88 192 224 208 224 224 224 208 208 66 240 192 120 208 224 224 224 128 160 224 224 240 104 128 120 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 160 96 152 224 96 192 200 160 224 168 232 152 224 224 224 186 104 120 128 96 120 104 144 128 98 120 152 104 114 160 120 120 80 104 98 144 66 96 80 104 98 120 120 56 104 66 144 128 120 80 104 120 120 176 160 202 168 144 184 184 186 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 232 224 98 224 224 224 224 224 224 224 224 186 202 224 232 224 232 224 232 224 224 224 224 232 224 232 224 224 224 224 224 208 184 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 202 160 202 168 160 224 202 168 168 168 168 224 224 224 152 136 98 232 232 168 224 224 224 224 160 186 232 232 128 128 114 114 104 184 184 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 192 104 224 224 152 232 224 202 232 202 192 224 224 224 232 112 104 152 152 104 120 104 80 104 104 114 98 128 144 128 128 168 80 80 88 88 96 96 88 104 168 120 114 144 96 144 114 152 120 152 128 160 168 168 144 208 192 152 168 192 224 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 160 232 232 224 224 224 224 224 224 224 224 184 202 224 232 224 232 224 232 224 224 232 224 224 232 224 232 224 232 224 224 224 168 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 186 168 192 184 80 128 184 96 168 120 224 224 224 224 168 224 224 224 224 224 224 224 224 224 224 224 224 224 232 232 232 202 160 160 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 184 114 240 186 98 208 224 224 224 202 224 168 224 224 224 224 120 152 186 120 112 160 104 120 98 112 128 98 120 168 152 168 144 72 152 88 88 98 104 144 128 114 114 160 96 114 96 120 104 114 112 152 128 152 168 128 208 186 144 160 224 192 168 202 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 232 186 104 152 144 224 224 224 224 224 232 224 232 176 208 224 232 224 232 224 232 232 224 232 224 232 224 232 224 232 232 224 224 224 184 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 184 184 160 168 168 176 120 152 202 114 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 168 192 224 160 144 224 224 224 224 224 202 200 224 224 152 128 144 216 88 114 96 128 96 152 104 98 88 96 128 120 114 168 120 128 96 114 88 98 104 96 98 104 160 128 114 66 104 104 152 120 128 168 120 144 128 186 192 152 208 224 224 224 186 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 232 224 224 224 224 224 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 232 232 184 168 114 152 104 224 224 224 224 232 224 232 224 232 168 224 224 232 232 224 232 224 232 224 232 224 224 232 224 232 224 232 232 232 224 184 224 224 224 224 224 232 224 224 224 224 224 224 232 232 224 224 224 224 208 168 168 168 168 168 168 120 160 192 72 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 104 160 224 232 114 224 224 224 224 224 224 192 232 224 232 104 104 202 192 136 120 160 152 104 120 152 114 80 104 98 152 114 120 136 120 114 98 104 128 104 88 104 128 88 120 104 98 144 104 98 160 120 160 144 152 152 186 168 184 208 224 224 224 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 224 224 224 224 232 224 224 224 232 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 232 184 128 128 232 224 232 232 224 232 224 232 224 184 208 232 224 232 232 224 232 224 224 232 232 224 232 232 224 232 224 232 224 224 184 224 224 232 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 152 184 184 160 168 184 186 168 192 160 224 224 232 224 224 224 224 224 224 232 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 128 232 224 114 186 224 224 224 224 224 232 184 224 224 208 144 160 224 186 80 160 144 104 128 88 120 104 96 104 114 144 98 120 144 114 96 88 192 152 96 88 152 88 120 144 128 96 114 104 128 98 152 114 128 128 120 184 120 186 160 184 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 232 224 232 232 224 224 224 232 144 80 224 224 232 224 232 224 232 224 232 224 184 224 224 232 224 232 232 224 232 224 224 232 232 224 232 232 224 232 224 232 208 184 224 224 224 232 224 224 224 224 224 232 224 224 224 224 224 232 224 224 224 168 168 168 152 168 176 224 192 208 224 224 224 224 224 232 224 232 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 186 144 224 224 232 184 232 224 224 224 224 224 224 192 224 224 168 186 200 224 184 120 144 152 114 98 120 120 104 128 88 96 114 104 96 104 88 96 112 128 80 98 120 80 80 168 144 144 98 120 144 114 128 128 114 128 128 96 144 144 224 208 160 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 232 224 232 224 224 224 224 232 224 232 224 224 224 232 224 224 224 224 224 224 224 232 224 224 232 224 224 224 168 66 240 224 232 224 232 232 224 232 224 232 184 224 224 232 224 232 224 224 232 224 232 224 232 224 232 224 232 232 232 224 224 184 224 232 232 224 224 224 224 224 224 224 232 224 224 224 224 232 224 224 224 168 168 160 152 144 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 224 224 232 224 232 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 232 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 232 128 232 224 232 184 224 224 224 224 224 224 224 224 224 232 202 216 184 224 208 128 98 224 120 98 128 104 168 120 120 114 104 98 104 114 104 98 104 168 136 96 80 128 144 160 184 88 104 114 128 128 152 98 104 128 120 160 152 128 168 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 232 224 232 232 88 88 98 232 224 224 224 224 224 232 224 224 186 232 224 232 232 224 232 232 224 232 232 224 232 224 232 232 224 232 224 232 208 192 224 232 224 232 224 224 232 224 232 224 232 224 224 224 232 224 224 224 224 224 184 168 168 202 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 232 224 224 224 224 232 224 232 224 224 224 232 224 232 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 224 232 224 232 224 224 224 168 224 224 224 192 224 224 224 224 224 224 224 224 224 224 224 186 224 202 232 168 144 186 152 98 104 98 114 112 120 56 128 96 98 88 104 88 88 136 152 96 98 96 96 98 120 114 120 88 96 98 114 112 160 104 114 112 114 202 168 152 168 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 232 224 232 224 232 224 232 224 232 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 192 224 224 224 224 232 224 232 224 232 224 184 232 224 232 224 232 224 232 224 224 232 232 224 232 224 232 224 232 224 232 224 192 232 224 224 232 232 224 232 224 232 224 224 224 232 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 232 224 224 224 224 192 202 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 192 98 98 216 144 144 160 136 112 186 96 144 128 98 114 80 128 80 144 104 114 104 120 98 88 104 168 80 114 128 128 114 120 128 144 120 136 184 184 224 224 202 168 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 232 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 232 224 168 120 192 224 224 224 224 232 224 232 224 232 184 232 224 232 232 224 232 232 232 224 224 232 232 224 232 224 232 224 232 224 224 186 232 224 232 224 232 224 232 224 224 232 224 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 224 224 224 232 224 224 224 224 232 232 224 224 224 224 232 224 224 224 202 202 202 202 232 224 224 224 224 224 224 232 224 192 104 160 144 184 224 98 114 186 104 144 144 98 136 144 96 144 128 112 160 98 96 104 114 98 98 144 144 120 114 152 104 104 128 128 114 160 208 208 186 202 224 208 184 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 232 224 224 232 224 232 224 224 224 232 232 224 232 224 224 224 224 232 224 224 232 224 232 224 232 224 232 224 224 224 224 168 98 104 232 224 224 232 224 224 232 224 224 184 232 224 232 224 232 224 232 224 232 224 224 224 232 224 232 232 232 224 224 224 186 232 232 224 232 224 232 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 232 232 144 168 224 224 224 224 66 192 224 208 192 186 184 160 120 224 224 224 232 224 224 224 224 232 168 168 224 202 104 208 160 160 160 144 186 98 114 160 120 96 114 192 128 104 114 114 104 96 144 152 98 98 168 88 114 88 144 186 168 224 224 224 184 208 224 232 208 184 160 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 232 224 224 232 232 224 224 224 232 224 224 224 224 232 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 224 232 224 224 232 224 232 224 232 224 192 88 88 128 208 224 224 224 232 224 232 232 224 184 232 224 224 232 224 232 224 232 224 232 224 224 232 224 224 224 224 232 224 224 192 224 232 224 232 232 224 232 224 232 224 224 224 232 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 186 96 160 152 160 80 88 66 114 98 120 114 66 98 200 224 224 208 192 114 168 160 224 224 224 224 202 192 186 224 224 224 186 202 200 152 88 144 184 88 128 114 98 88 136 128 168 104 98 120 96 104 104 104 56 120 184 56 88 96 208 232 224 224 224 224 224 208 224 224 224 208 208 152 224 224 224 224 224 232 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 232 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 232 224 224 232 224 232 224 168 192 128 98 168 168 192 232 224 232 232 224 224 232 186 232 232 224 232 232 224 232 224 224 224 224 224 224 232 224 232 224 232 224 208 192 224 224 224 232 224 224 224 224 232 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 232 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 98 152 160 98 72 168 192 88 208 216 144 144 98 120 144 88 160 224 184 114 114 104 104 114 232 192 224 224 168 160 186 208 224 184 224 160 128 186 104 114 112 104 168 144 168 104 192 152 120 98 114 96 168 98 88 186 128 56 98 160 224 224 224 224 224 224 224 224 208 224 224 224 224 224 186 224 224 224 224 224 224 232 224 224 232 224 224 232 224 224 224 224 224 232 224 224 232 224 224 224 224 224 232 232 224 232 224 232 224 232 224 232 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 224 224 224 224 224 232 224 152 192 186 120 160 104 200 168 208 232 224 224 224 232 224 186 232 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 232 224 224 224 186 232 224 224 232 224 232 232 224 232 224 232 232 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 168 168 224 160 128 186 232 224 232 184 186 224 224 186 152 98 104 98 66 98 96 104 114 184 64 88 160 66 240 232 184 224 192 114 216 224 224 208 184 202 136 114 88 160 208 168 168 120 192 128 96 80 120 98 186 88 152 80 168 202 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 186 232 224 224 224 224 224 232 224 232 224 232 224 232 224 232 224 232 224 232 224 224 224 224 224 224 232 224 232 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 232 224 224 232 202 184 224 184 186 112 128 224 192 184 224 224 232 224 224 232 184 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 208 186 224 224 224 224 232 224 224 232 224 232 224 232 224 232 232 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 232 224 232 224 232 224 224 224 232 224 224 224 224 224 224 232 224 224 232 192 168 224 224 160 202 232 224 224 224 186 216 232 224 152 120 168 114 136 114 96 104 120 120 96 114 112 98 98 98 114 168 186 202 192 160 98 208 232 186 186 200 128 104 152 184 66 96 66 184 168 104 66 96 128 98 114 114 114 176 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 224 224 224 224 224 232 224 224 224 224 232 224 232 224 232 224 224 232 224 232 224 224 224 232 224 232 224 224 232 224 232 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 232 232 232 224 232 224 232 232 224 186 192 224 186 186 184 168 224 186 168 232 224 224 232 232 224 184 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 184 224 224 232 224 224 224 232 224 232 224 224 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 232 168 208 224 224 184 224 224 224 224 224 224 202 168 176 128 160 168 168 128 152 114 128 88 96 120 104 112 120 104 104 98 72 160 184 144 202 224 98 186 186 176 144 192 114 120 202 98 104 80 184 184 176 120 160 144 80 114 80 98 128 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 186 216 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 232 224 224 232 224 232 224 224 232 224 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 232 224 232 224 224 224 224 232 224 224 232 224 224 232 224 232 232 160 192 224 208 186 202 192 224 202 186 224 224 224 224 224 224 184 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 184 224 224 224 224 224 232 224 224 224 224 224 232 224 232 232 232 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 232 224 224 224 224 232 224 224 224 224 224 224 224 184 232 224 224 192 224 224 224 208 224 224 202 200 96 144 128 168 128 104 120 120 152 168 114 96 88 144 88 104 114 104 96 120 120 168 96 152 192 152 128 128 224 184 192 98 202 114 112 80 114 184 184 128 160 128 66 144 98 112 88 186 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 224 224 224 224 224 224 232 224 224 224 232 224 232 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 232 224 232 224 224 232 152 202 232 224 168 184 168 224 208 200 224 224 224 224 224 224 186 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 186 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 202 232 224 232 224 224 232 224 168 168 80 168 128 98 114 80 88 114 98 98 96 104 120 98 104 98 104 104 120 96 104 114 128 98 160 104 104 120 96 152 114 96 152 168 144 168 208 168 202 144 160 144 88 128 98 96 96 96 152 120 152 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 232 232 224 224 224 224 224 232 224 224 232 224 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 232 224 224 224 224 224 232 224 224 168 202 224 184 168 186 168 224 208 192 224 224 224 224 224 224 186 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 192 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 232 224 232 224 224 224 224 224 224 224 224 152 144 168 184 128 186 98 128 96 98 104 114 96 104 104 120 128 96 104 114 104 120 120 104 120 104 120 152 104 114 98 168 114 104 104 120 232 168 224 202 120 186 186 96 98 114 128 88 112 114 98 114 168 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 224 224 224 224 168 202 192 192 186 184 208 224 208 186 224 224 224 224 224 224 184 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 192 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 224 232 224 232 224 232 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 232 224 232 224 224 224 224 184 88 160 192 152 98 98 152 120 120 112 104 98 96 80 80 104 80 96 96 88 98 98 120 144 96 104 88 96 120 104 104 104 104 96 98 88 152 232 98 232 144 168 186 128 66 80 168 114 128 104 128 136 128 144 168 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 224 224 232 224 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 168 208 232 184 184 186 168 224 208 192 224 224 224 224 224 224 184 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 186 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 144 232 224 224 224 224 224 232 224 224 224 224 224 224 192 168 168 192 120 98 120 104 114 104 114 120 88 114 96 98 144 98 88 104 80 144 96 98 96 128 144 104 114 120 98 98 114 96 98 104 80 120 96 224 192 104 224 152 186 192 120 104 96 186 104 98 112 168 168 88 192 202 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 232 224 224 224 224 232 224 232 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 232 224 224 224 224 224 152 192 232 184 208 200 192 224 208 186 224 224 224 224 224 224 186 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 192 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 144 224 224 224 224 224 224 224 232 224 224 224 224 202 160 202 202 96 120 120 104 96 104 96 104 98 98 114 98 104 120 88 104 104 114 88 88 88 114 80 144 120 98 104 98 144 104 98 104 98 98 88 80 224 120 192 192 184 186 192 120 96 208 160 168 128 144 144 184 104 192 184 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 232 224 224 232 232 224 232 232 224 232 224 224 224 224 224 232 224 224 224 224 224 232 224 224 232 224 232 224 232 224 232 224 232 224 224 232 168 186 208 186 184 184 202 224 192 184 232 224 224 224 224 224 184 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 192 144 224 224 224 224 224 232 224 224 224 224 224 208 224 186 144 128 56 104 104 104 114 88 96 120 88 96 96 80 114 96 114 114 98 88 98 104 104 112 104 96 96 120 96 114 104 114 88 128 96 88 96 114 192 152 224 160 184 184 168 104 184 184 186 224 144 160 96 168 56 208 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 224 232 224 224 224 224 232 224 232 224 224 192 186 208 168 184 176 184 232 186 184 224 224 232 224 232 232 168 232 232 224 224 224 224 232 224 224 224 224 232 224 224 224 224 224 224 224 202 202 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 128 224 224 224 224 224 224 224 224 224 224 224 224 160 168 224 224 224 224 224 224 224 224 224 232 184 184 96 160 192 152 128 136 88 98 98 88 144 114 72 96 96 88 98 98 88 96 80 98 80 96 128 104 96 120 96 98 96 120 96 80 104 144 96 104 96 66 186 114 160 184 184 186 98 88 114 224 208 224 96 168 128 144 120 152 202 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 232 224 224 224 224 232 224 232 224 224 224 224 224 160 168 208 168 168 192 186 168 224 224 224 224 232 224 232 168 232 224 224 224 224 224 224 224 224 232 224 224 232 232 224 232 224 224 224 202 202 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 104 186 224 224 224 224 224 224 224 224 224 224 224 120 168 224 224 224 224 224 224 224 224 232 98 98 186 186 88 104 144 104 98 96 120 128 120 114 114 96 96 128 96 168 98 98 72 98 80 160 114 80 104 66 114 98 104 98 104 104 104 98 88 104 98 98 96 168 88 168 168 186 160 96 66 208 224 224 168 114 184 168 202 160 184 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 224 224 232 224 232 224 232 224 232 224 224 224 224 186 160 176 168 168 186 168 186 232 224 232 224 224 224 232 152 232 224 224 224 224 224 224 232 232 224 232 224 232 224 232 224 232 224 232 186 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 104 184 224 224 224 224 224 224 224 224 224 224 224 168 144 224 224 224 224 224 224 224 184 96 152 184 186 144 152 186 104 184 120 88 98 98 128 88 96 120 114 88 114 80 114 120 120 96 88 104 96 96 96 104 104 96 114 128 98 128 144 88 120 104 160 128 160 98 152 152 80 186 96 96 160 224 224 224 144 120 202 192 192 160 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 224 224 224 232 224 232 192 160 160 152 168 200 224 224 224 224 224 224 224 240 152 232 224 232 232 232 232 232 224 224 224 224 232 224 232 224 224 232 232 224 186 202 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 56 192 224 224 224 224 224 224 224 224 224 224 224 168 152 224 224 224 224 224 224 144 160 192 186 152 66 184 168 152 128 160 152 104 152 128 128 88 96 80 98 96 136 128 104 56 80 96 128 88 104 98 96 114 96 114 112 120 66 128 98 104 114 98 120 120 168 152 208 88 88 184 120 66 224 224 224 224 152 152 208 208 104 120 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 232 152 232 224 224 224 232 224 232 224 224 224 232 224 232 224 232 224 232 224 232 192 200 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 208 224 208 224 224 224 224 224 232 96 224 224 224 224 186 144 192 224 224 224 224 224 224 224 224 224 224 208 168 160 224 224 224 224 184 104 186 208 202 184 98 152 152 128 152 184 98 120 160 66 104 104 114 66 88 120 232 160 66 64 144 66 98 120 202 232 224 152 120 80 144 98 98 120 98 136 114 88 104 104 128 128 114 120 96 168 160 114 88 224 224 216 186 114 232 202 208 168 128 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 240 144 232 224 224 232 224 232 224 232 224 232 224 224 232 224 232 232 224 232 224 186 202 224 224 224 224 224 224 208 224 208 224 208 224 208 224 224 224 224 208 224 208 208 224 224 208 224 224 208 224 224 224 224 224 98 232 224 224 224 186 144 202 224 224 224 224 224 224 224 224 224 224 192 186 144 224 224 208 224 152 192 224 202 184 72 168 168 114 152 120 160 66 192 160 168 128 98 88 88 184 224 192 88 66 160 98 80 186 224 224 224 208 224 202 202 104 144 104 128 160 96 66 112 128 200 232 144 192 144 168 192 80 98 80 224 224 160 168 168 224 208 232 104 184 224 224 224 224 224 224 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 240 152 224 232 224 232 224 232 232 224 232 224 232 232 224 232 224 232 224 232 224 186 202 224 208 216 208 208 224 208 208 208 208 224 208 224 208 208 208 208 224 208 224 224 224 208 224 208 208 224 208 208 208 224 184 114 224 224 208 208 208 128 208 224 224 224 224 224 216 224 208 224 224 202 186 152 224 208 208 184 202 208 184 168 128 152 176 104 176 104 186 208 128 114 184 120 144 128 56 202 224 208 152 128 96 104 80 160 208 224 224 224 224 224 224 224 184 144 152 114 88 120 98 104 186 224 192 224 192 144 186 184 160 98 96 184 216 192 168 202 224 224 192 96 184 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 232 224 240 160 224 232 232 224 232 224 232 224 224 232 224 232 232 224 224 232 232 224 232 184 192 208 216 208 224 208 208 224 208 224 208 224 208 208 224 208 224 208 208 224 208 208 208 208 208 224 208 208 208 224 208 224 184 114 224 224 224 176 224 128 208 224 186 168 208 208 224 208 224 208 224 168 192 152 224 208 184 224 208 208 160 144 168 224 120 144 144 208 202 160 144 184 80 120 152 88 168 224 208 202 128 184 192 202 114 160 224 208 208 224 208 224 208 216 224 224 104 160 98 160 80 168 224 208 186 224 224 128 192 184 184 104 88 114 224 216 184 224 208 224 144 80 184 224 224 224 224 224 224 224 208 208 208 224 208 224 208 224 208 224 224 224 224 224 224 208 224 224 224 224 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 232 224 224 224 224 224 232 160 224 224 232 224 232 224 232 232 224 232 224 232 224 232 232 224 232 224 224 184 202 216 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 224 208 208 224 208 208 208 208 208 224 208 208 208 208 208 168 104 224 202 216 184 224 144 208 208 192 168 202 208 216 208 208 208 208 186 186 152 208 192 224 208 202 152 144 202 168 202 152 152 208 224 160 98 202 96 160 66 192 128 224 208 224 168 208 168 224 96 128 208 208 224 208 216 208 208 216 208 224 208 202 136 144 128 88 186 208 184 224 208 224 168 186 184 192 98 88 120 224 184 224 208 224 224 128 104 232 224 208 224 224 224 224 208 224 208 224 208 224 208 208 224 224 208 208 224 208 208 224 208 224 208 224 208 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 168 224 224 224 224 224 224 224 224 224 232 232 224 232 224 232 224 232 232 232 168 192 208 208 208 208 208 208 202 208 208 202 208 208 202 208 208 208 208 208 208 202 208 208 202 208 202 208 208 208 208 208 186 224 104 224 202 192 184 224 128 202 208 152 168 202 208 208 208 208 208 202 202 184 152 208 208 208 208 208 128 200 208 128 136 184 202 216 202 80 224 104 128 168 128 152 208 208 208 186 208 184 192 224 104 192 216 208 208 224 208 224 208 208 216 208 208 224 168 168 98 186 224 192 216 208 216 208 184 184 168 192 96 96 50 202 202 216 224 208 192 184 152 208 208 224 208 208 208 224 208 208 208 208 208 208 224 208 208 208 224 208 208 208 224 208 224 208 224 208 224 224 224 224 208 224 224 224 224 224 224 224 208 224 208 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 168 224 224 224 224 224 224 224 224 232 224 232 232 224 232 232 232 224 232 224 168 202 202 208 202 202 208 202 208 202 208 208 202 202 208 202 202 202 192 208 202 202 202 202 202 202 208 202 202 202 200 208 152 208 96 208 202 192 192 208 128 202 202 152 168 202 202 184 168 202 202 192 192 186 152 208 208 202 208 184 152 208 186 144 144 200 208 202 202 152 104 96 208 98 144 168 208 208 208 208 208 168 224 168 96 202 208 208 202 208 208 216 208 208 208 208 208 208 202 104 98 168 224 208 208 224 216 200 168 168 168 184 152 88 88 208 216 208 224 208 208 160 184 208 208 208 224 208 224 208 224 208 208 224 208 208 208 208 208 224 208 208 224 208 208 224 208 208 224 208 208 208 208 208 208 208 208 224 208 224 208 224 224 208 224 208 224 208 208 208 208 208 224 208 224 208 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 168 224 224 224 224 224 224 224 224 224 232 224 232 232 224 232 224 232 224 232 168 202 202 208 208 202 208 208 202 208 202 202 208 208 202 208 202 202 208 202 202 202 200 202 200 202 192 202 200 192 192 192 144 208 88 208 202 152 208 208 128 192 192 168 160 202 192 184 152 200 202 168 208 184 152 202 202 202 208 152 202 168 184 96 208 202 202 208 176 202 144 88 208 144 128 202 202 202 208 202 208 184 208 168 144 208 208 208 208 208 208 208 208 202 208 202 208 202 208 184 152 88 202 202 208 208 160 114 184 168 168 176 160 128 96 202 208 208 208 224 208 186 186 208 208 208 208 224 208 208 208 208 202 208 208 208 208 208 208 208 208 208 208 224 208 208 208 224 208 208 224 208 208 224 208 224 208 224 208 208 224 208 208 224 208 224 208 224 208 224 208 224 208 224 208 224 208 224 208 224 208 208 224 208 224 224 224 224 224 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 168 168 114 66 144 168 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 168 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 232 224 160 202 208 202 202 202 202 202 200 202 202 202 200 202 202 200 202 202 202 202 202 200 202 202 192 202 200 192 202 192 202 168 186 208 98 208 192 184 192 208 120 192 184 168 160 202 192 144 144 192 202 184 200 168 144 202 186 144 160 184 192 208 184 114 202 192 202 184 168 202 104 114 202 144 168 202 200 202 202 202 192 186 186 192 168 202 202 202 202 202 208 202 202 200 202 202 200 202 202 168 104 104 168 202 152 112 114 186 96 152 168 168 168 98 96 192 208 208 208 202 208 184 208 208 208 208 208 208 224 208 224 202 208 202 208 208 202 208 202 208 208 224 202 208 208 208 224 208 208 208 208 224 208 208 224 208 208 208 224 208 208 208 224 208 208 208 224 208 224 208 208 208 208 208 208 208 208 224 208 208 208 224 208 224 208 208 224 208 208 208 208 208 224 208 224 208 224 208 224 208 224 208 224 208 224 184 128 152 160 168 168 176 168 152 128 128 144 160 224 224 224 224 224 224 224 224 224 224 224 224 168 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 224 232 224 232 152 208 192 202 192 200 200 200 192 202 200 200 192 202 200 192 202 202 192 202 200 202 202 202 200 192 202 202 200 202 202 144 192 208 104 208 184 186 192 208 120 192 168 168 168 192 192 168 160 192 202 176 192 168 152 192 184 152 168 192 192 202 128 208 200 202 192 184 186 144 114 192 202 80 200 192 202 200 200 200 192 202 200 192 168 202 202 202 202 202 202 200 202 192 202 192 202 192 202 208 98 160 152 114 152 114 88 88 96 80 176 168 160 104 114 202 202 208 208 208 208 144 202 208 208 208 208 208 202 208 202 208 202 208 202 202 208 202 208 208 202 208 208 208 208 208 202 208 208 208 224 208 208 224 208 208 224 208 208 224 208 208 208 224 208 224 208 208 208 224 208 224 208 224 208 208 208 208 208 224 208 208 224 208 208 224 208 208 224 208 208 224 208 208 208 224 208 224 208 224 208 224 208 192 152 160 168 168 168 168 168 168 160 168 168 168 168 160 144 224 208 224 208 224 224 224 224 224 224 224 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 152 208 202 192 202 192 192 192 192 202 192 192 192 192 202 192 202 200 192 192 202 192 200 192 202 192 192 192 192 192 192 168 192 208 104 208 168 192 200 202 112 186 184 176 168 192 186 152 152 192 184 168 186 160 160 202 160 160 192 192 192 192 128 202 192 192 202 168 184 128 160 186 128 144 202 192 192 192 192 192 192 192 192 168 168 192 192 200 202 200 192 192 200 192 200 192 200 192 192 202 128 120 104 104 80 104 186 202 72 80 184 168 152 96 88 144 202 202 208 208 186 200 208 202 202 208 202 208 202 208 208 202 202 200 202 202 202 202 202 202 202 202 202 202 202 202 208 200 208 202 208 208 208 202 208 202 202 208 208 202 208 202 208 202 202 202 202 208 208 208 202 208 208 208 208 208 208 208 208 202 208 208 202 208 208 202 216 208 208 224 208 208 208 224 202 208 216 208 224 208 208 224 224 88 168 160 144 152 168 168 168 168 168 160 160 160 152 152 114 168 224 224 224 208 224 208 208 224 208 224 160 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 144 208 192 192 192 192 200 192 192 200 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 168 168 192 192 120 208 160 192 192 208 114 168 186 176 176 192 186 168 152 186 184 184 186 160 144 144 160 186 192 192 192 168 168 192 186 192 186 192 128 104 202 186 152 144 192 192 192 192 192 192 192 192 200 168 192 186 192 192 192 202 200 192 192 192 192 192 192 192 202 192 80 114 96 98 200 192 192 186 96 88 184 168 168 144 96 160 192 202 200 208 160 192 202 192 200 192 202 200 202 192 202 192 192 192 202 200 200 192 200 192 202 200 202 200 202 202 202 202 202 208 202 208 202 208 202 202 208 202 202 208 202 202 202 202 208 208 208 202 208 208 208 208 202 208 202 202 202 202 202 208 202 202 202 208 202 208 208 208 208 208 208 208 208 202 208 208 208 208 224 192 192 184 144 192 192 192 192 168 120 96 98 88 80 152 192 202 192 208 224 224 208 208 224 208 208 224 208 224 208 224 160 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 232 232 144 208 192 192 192 200 192 202 200 192 192 192 192 202 192 200 192 192 192 192 192 192 192 192 186 192 192 192 192 192 168 186 192 202 114 192 184 186 192 202 114 160 186 168 168 186 168 160 144 186 176 184 186 152 120 128 184 186 192 186 202 128 192 186 186 192 192 186 184 104 192 192 112 184 186 186 192 192 192 192 192 186 186 160 186 192 186 192 192 192 202 192 192 192 192 192 192 192 192 192 202 120 144 202 192 192 192 184 104 80 184 168 168 120 88 160 192 202 200 168 186 200 192 192 192 192 192 192 192 200 192 192 192 192 202 192 202 192 202 192 200 202 192 202 200 200 200 202 202 202 202 202 200 202 202 200 202 200 192 202 202 202 202 200 202 200 202 192 202 192 202 200 192 202 192 202 200 200 200 202 208 202 202 202 208 208 202 202 202 208 202 208 208 208 208 208 224 224 160 186 208 208 224 224 208 224 208 224 224 208 184 56 96 202 208 208 216 208 224 208 224 208 208 224 208 208 208 208 224 208 160 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 144 202 200 192 192 192 202 192 192 192 192 186 192 186 192 192 186 192 186 186 192 192 186 192 192 186 192 192 192 192 152 192 192 202 128 168 192 192 186 202 104 168 186 168 160 184 168 160 144 184 160 186 186 168 128 192 186 192 186 192 184 184 186 186 192 186 186 192 168 144 186 186 176 184 186 192 192 192 192 192 186 192 176 184 192 192 186 186 192 192 192 192 192 192 192 192 192 200 200 192 192 192 202 192 186 192 192 184 144 120 186 184 176 144 104 186 202 192 202 168 192 202 192 192 202 192 192 202 192 192 200 192 192 202 192 200 202 192 192 192 192 192 192 192 192 192 192 192 192 202 192 200 192 192 192 202 192 202 192 202 192 202 200 192 192 192 192 192 186 192 200 192 202 202 202 202 202 208 202 208 208 208 208 208 208 208 208 208 208 224 208 202 208 208 224 208 192 168 192 216 224 208 224 208 224 208 224 208 224 208 224 208 152 128 208 202 208 208 208 208 208 208 224 208 208 224 208 208 208 208 168 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 128 208 192 202 192 192 192 192 192 192 192 192 186 192 186 192 186 192 186 192 186 192 186 192 192 186 192 186 186 184 184 184 186 202 104 186 192 192 192 192 98 184 184 160 152 184 160 160 136 192 128 186 184 120 152 186 184 184 184 184 168 184 186 186 184 186 186 192 152 144 186 186 128 192 184 184 186 186 186 184 184 186 168 184 186 184 184 186 186 192 186 186 186 186 186 192 192 186 192 186 186 192 186 186 186 186 192 104 104 168 184 168 186 120 128 192 192 192 168 186 192 192 202 192 192 192 200 192 192 192 192 192 186 192 186 192 192 192 192 192 192 192 192 192 192 192 202 192 192 192 192 202 192 192 200 192 192 192 192 200 192 186 192 192 192 192 192 186 192 192 200 202 202 202 208 202 202 202 202 202 202 202 202 208 208 202 202 208 224 136 168 168 168 144 120 136 168 208 208 208 224 208 208 224 208 224 208 224 208 224 208 208 208 160 208 224 208 208 224 208 224 224 208 224 208 224 208 224 208 224 160 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 128 224 192 192 192 192 186 186 192 192 192 192 192 192 192 186 192 192 192 192 186 192 192 192 186 192 186 186 202 144 186 186 192 192 96 184 186 192 186 192 114 184 186 168 160 168 168 160 152 186 168 168 160 120 144 186 184 184 184 168 184 186 186 186 186 186 186 184 98 186 186 186 168 186 184 184 186 186 186 186 184 186 184 186 186 186 186 192 186 186 186 186 192 186 186 186 186 186 186 192 186 186 184 186 186 192 114 104 120 184 168 184 104 128 168 186 186 192 186 186 192 186 192 200 186 192 186 200 192 192 186 186 192 186 192 186 186 192 186 186 186 186 186 192 192 192 192 186 192 192 192 192 200 192 192 202 192 202 192 192 192 200 200 200 192 192 200 192 192 202 202 200 192 202 202 192 192 192 200 192 202 200 202 192 202 192 208 168 120 144 104 104 186 208 168 202 208 208 208 208 208 224 208 208 208 208 224 208 224 208 208 208 224 144 224 224 224 208 224 224 224 208 224 208 224 224 224 224 224 202 168 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 128 168 160 152 152 152 224 208 224 208 208 208 208 208 208 202 208 202 202 208 208 202 200 202 192 202 192 202 202 160 192 192 186 192 88 202 186 192 186 202 104 184 184 152 144 160 184 128 144 184 144 168 176 120 128 184 184 184 168 168 184 184 184 184 184 184 168 98 144 186 184 168 168 184 186 186 186 184 184 186 184 184 186 186 186 186 184 184 186 186 186 186 184 186 186 186 192 186 192 186 186 192 186 192 192 152 96 104 184 168 168 152 120 120 186 186 186 192 192 192 202 192 192 192 192 192 186 192 192 192 186 186 186 186 186 184 186 186 184 186 192 192 192 192 200 192 202 192 202 200 192 202 200 192 192 200 192 192 192 202 200 192 202 192 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 128 168 192 186 202 208 192 202 208 208 208 208 208 208 224 208 208 208 224 224 208 224 208 224 208 224 224 184 224 224 224 224 224 224 224 224 224 224 208 224 208 224 208 208 168 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 128 184 160 168 160 160 104 202 200 200 202 202 202 208 192 192 184 104 112 120 114 96 160 192 192 192 192 112 128 128 128 120 120 224 96 208 202 200 192 192 152 168 168 152 152 152 168 152 104 152 168 168 184 120 152 168 168 168 184 168 184 168 184 184 184 184 128 136 128 184 184 168 184 184 168 186 184 184 184 184 184 184 184 184 184 184 184 184 186 186 186 184 184 186 186 186 192 186 192 192 192 186 186 192 114 66 88 168 168 168 144 160 160 144 184 186 184 186 192 186 192 186 192 186 192 192 192 186 192 192 186 192 186 192 186 192 186 186 186 192 186 186 186 186 192 192 192 192 192 192 192 192 186 192 192 186 186 192 192 208 208 208 208 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 152 114 144 168 168 184 184 186 192 192 192 202 208 208 208 208 208 202 224 208 208 208 224 208 208 208 208 224 192 224 192 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 168 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 128 184 168 168 160 160 168 114 208 160 144 144 152 160 168 152 114 104 160 160 152 120 114 152 112 128 128 168 168 160 168 128 114 96 98 168 160 152 168 186 144 152 160 152 128 168 168 112 114 160 168 168 168 120 114 184 184 184 176 184 186 186 186 186 186 186 186 160 168 184 168 184 184 186 192 186 192 192 192 202 192 186 184 184 168 176 184 186 186 186 184 184 184 184 184 184 186 186 184 186 192 186 184 120 96 88 160 168 168 104 104 160 144 186 184 184 186 186 192 192 192 200 192 186 192 192 202 192 192 192 192 192 186 192 186 186 184 184 186 184 186 184 186 184 186 186 186 192 186 184 184 186 186 186 186 184 184 186 224 208 216 208 224 208 224 208 224 208 224 208 224 208 208 224 224 224 224 224 224 224 224 224 224 186 120 120 168 160 160 168 168 184 186 192 200 202 208 208 208 208 208 208 208 208 216 202 208 208 208 208 224 186 224 168 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 208 168 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 128 168 168 160 160 160 160 160 114 152 160 168 160 152 144 144 98 104 104 136 120 168 160 128 104 128 160 160 168 160 144 98 114 168 160 144 144 152 114 176 184 186 192 186 144 168 176 114 152 184 202 202 208 152 160 202 200 200 192 192 192 192 192 192 192 192 98 160 186 168 144 176 186 186 186 186 186 184 184 184 184 184 176 184 168 168 192 186 186 184 184 184 184 184 176 184 184 184 184 184 184 184 128 104 120 152 184 128 144 96 104 120 184 186 186 186 192 192 200 192 186 192 186 192 192 186 186 186 192 192 186 186 186 186 186 184 186 184 186 184 184 186 186 186 186 184 168 184 168 168 184 186 184 186 186 184 184 184 184 184 184 186 184 186 186 186 192 186 192 186 186 186 192 186 200 202 202 202 202 192 208 208 208 208 224 184 114 128 128 160 160 168 184 186 186 192 202 208 208 208 208 208 208 216 208 208 208 208 208 224 192 184 160 186 192 202 202 208 208 224 208 224 208 224 224 208 224 224 224 192 184 224 224 232 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 128 184 160 168 168 168 168 144 160 168 168 160 160 160 128 144 152 152 144 128 152 152 144 128 144 168 160 168 168 144 144 120 152 144 160 152 120 114 152 114 104 144 128 114 88 144 144 144 128 160 224 224 208 152 186 224 224 224 224 224 224 224 224 224 224 224 208 184 224 216 186 168 192 224 224 224 224 224 224 224 224 216 224 224 202 168 160 184 224 224 224 208 224 168 224 208 208 208 208 208 224 120 98 104 160 184 120 114 80 120 152 186 224 216 224 224 224 224 224 224 216 224 224 224 224 224 224 216 224 208 224 224 224 224 208 208 192 202 202 202 202 192 202 200 192 202 202 192 192 202 202 192 202 192 200 200 192 192 192 192 192 202 192 192 202 192 192 192 186 200 200 176 186 208 202 192 184 184 192 224 224 224 224 224 208 224 224 208 202 136 144 168 168 168 186 192 192 200 202 208 208 208 208 208 208 208 208 208 186 200 192 208 224 224 224 216 224 224 208 224 208 224 224 224 224 224 224 224 224 202 186 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 128 184 152 168 186 192 128 152 144 120 144 160 160 160 152 152 120 120 152 152 152 144 128 160 168 152 160 152 144 128 114 128 128 144 114 160 120 128 152 152 128 128 152 152 114 152 152 152 152 128 168 202 208 144 184 192 224 224 216 224 216 224 216 208 202 184 202 186 224 224 224 224 168 208 224 216 224 224 202 168 202 224 216 224 186 224 224 192 192 202 184 224 224 208 144 224 224 224 224 232 104 88 128 168 168 128 96 88 120 120 202 192 224 208 202 184 192 224 224 224 202 168 192 224 208 224 224 224 208 186 168 144 168 208 224 224 224 216 224 208 224 208 224 208 224 202 184 224 208 216 202 208 224 208 224 208 208 224 208 208 224 208 224 208 192 208 224 224 208 216 224 224 168 202 224 224 224 224 224 208 202 224 224 224 224 224 224 224 224 224 168 114 152 176 144 184 186 192 192 202 208 208 208 208 208 208 208 216 168 224 184 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 186 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 120 186 168 160 144 104 184 160 160 144 144 114 120 136 160 144 144 120 128 168 160 144 152 160 144 128 152 160 168 144 152 160 128 114 128 112 144 128 160 144 144 152 144 144 144 128 128 128 144 152 144 144 168 168 208 186 184 224 224 208 224 208 224 208 184 128 224 128 202 216 186 202 224 168 224 192 160 192 224 224 160 192 224 202 168 168 192 224 152 216 192 160 184 224 192 192 208 224 184 96 80 104 168 152 160 96 96 96 88 184 192 168 186 208 224 224 192 186 202 168 192 224 186 160 192 168 168 224 224 216 224 208 208 160 160 224 176 224 184 224 224 224 168 224 168 224 202 152 224 216 224 160 224 224 184 208 224 224 224 208 168 224 224 192 224 160 202 208 224 202 168 160 168 168 202 224 216 224 224 208 192 184 160 152 224 224 202 224 224 224 224 224 224 208 160 168 168 192 192 192 202 208 208 208 208 208 208 208 184 192 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 186 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 128 192 186 160 120 160 104 168 152 96 128 160 114 144 120 152 152 120 128 120 128 168 168 144 160 160 128 192 186 160 160 160 152 114 128 120 120 120 104 144 152 152 152 144 144 128 128 128 120 114 144 120 120 144 186 186 152 202 202 192 186 168 208 216 186 202 202 186 168 186 224 200 160 184 168 186 186 184 168 192 168 184 184 192 184 184 184 168 208 168 208 192 160 144 224 152 224 208 98 104 160 168 144 98 104 114 114 80 184 202 186 160 160 160 202 184 224 168 184 186 152 202 184 104 168 208 202 160 224 208 202 202 186 168 128 168 208 160 192 128 208 186 224 168 168 208 168 144 152 224 208 152 168 208 224 152 168 152 168 168 202 160 208 186 208 224 160 208 208 224 184 208 202 168 192 224 208 208 168 224 224 208 224 208 152 202 224 160 224 208 192 186 192 160 184 160 168 128 168 186 192 192 202 202 208 208 208 208 168 168 202 224 224 224 224 192 224 224 224 224 224 202 224 224 202 208 192 224 224 192 192 224 224 224 224 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 120 186 184 120 128 160 160 114 160 160 120 120 144 120 168 128 168 152 104 114 168 128 186 200 168 202 186 186 168 186 186 168 152 120 104 120 120 128 144 160 144 160 168 152 144 144 144 144 144 144 120 144 144 114 128 208 202 160 216 200 176 208 168 202 168 208 184 202 202 128 192 208 168 160 168 192 168 152 208 152 184 104 152 152 192 160 184 184 168 160 208 168 168 192 152 160 160 104 144 186 168 152 104 98 80 144 96 186 160 200 184 168 168 168 152 184 128 200 160 192 186 168 152 200 168 104 186 160 186 216 192 184 152 202 128 160 168 168 168 160 160 184 184 184 114 184 184 186 144 152 186 224 114 114 168 224 160 186 144 192 168 104 202 152 168 202 184 120 208 168 224 184 208 224 168 184 208 202 136 168 224 224 168 202 224 186 202 184 192 186 186 152 202 152 152 192 192 192 120 186 186 192 192 200 202 208 208 186 168 168 168 168 224 224 224 208 168 152 202 224 208 192 186 216 186 168 186 168 224 186 186 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 120 168 168 186 136 128 168 168 128 152 160 98 144 128 88 120 152 160 144 120 120 184 128 186 192 120 184 152 184 184 160 168 152 168 104 160 120 152 152 152 152 144 128 168 98 152 160 128 114 168 168 160 152 168 202 128 168 176 152 160 168 184 202 168 192 202 186 186 208 208 160 184 186 160 128 224 202 120 186 192 168 192 128 168 152 144 144 128 186 128 152 202 144 120 192 88 104 152 168 168 168 128 96 96 152 152 208 186 186 98 224 184 168 144 168 186 184 160 168 176 186 186 202 152 144 168 104 184 114 200 208 208 184 152 192 144 168 224 98 184 160 144 120 208 152 168 186 152 200 168 152 184 128 184 168 152 184 144 192 114 200 208 144 208 120 202 168 144 168 208 128 160 202 208 186 168 202 184 224 168 202 208 186 120 192 216 186 168 168 224 168 168 184 192 184 168 144 168 160 160 168 184 186 192 192 192 202 192 168 192 208 144 168 224 192 208 192 168 114 208 192 168 88 232 184 200 136 186 192 192 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 128 128 136 168 184 144 128 160 114 144 144 98 114 144 160 168 152 168 128 128 168 120 144 152 168 168 168 98 176 112 184 160 184 160 152 168 144 168 144 168 152 114 168 168 184 144 160 144 192 144 186 128 202 186 168 200 120 184 168 168 192 144 192 184 160 176 186 186 168 202 224 104 168 120 152 114 120 120 144 128 114 152 144 128 128 152 152 104 128 144 128 98 208 144 104 144 160 160 168 168 128 144 144 144 128 184 202 202 168 184 144 192 168 160 202 160 192 168 168 168 168 186 184 152 160 144 144 152 184 128 160 144 160 192 160 184 168 168 184 202 96 184 160 168 168 186 96 184 152 144 160 96 184 160 152 144 160 144 168 152 144 192 202 136 152 176 168 168 168 168 168 152 186 184 192 192 168 168 184 168 168 186 202 160 160 168 168 168 184 192 184 168 184 168 168 168 168 128 168 128 168 160 168 184 186 192 202 152 104 186 168 160 152 168 184 208 186 208 168 96 208 168 168 152 202 144 168 192 128 186 186 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 98 184 104 128 152 114 160 168 168 128 152 160 152 120 186 160 184 144 160 160 152 152 168 144 168 184 96 184 128 160 152 160 104 152 160 168 184 114 160 160 144 184 160 176 168 184 160 168 120 192 168 160 160 192 184 160 144 120 128 168 168 202 114 208 186 144 160 160 160 128 152 128 168 168 98 152 144 152 136 144 144 160 152 168 98 114 120 184 144 128 168 168 120 144 152 160 160 168 168 168 120 144 168 104 202 168 184 186 176 192 168 184 160 184 208 184 168 208 168 160 208 152 160 160 168 168 120 168 144 186 136 160 168 152 128 168 144 160 120 192 160 168 128 184 98 184 152 120 224 80 202 128 168 160 184 152 152 186 120 192 98 160 202 168 120 168 192 168 184 192 152 184 184 184 120 186 152 152 168 202 144 216 144 168 184 192 168 160 186 160 160 168 184 144 168 202 176 168 168 168 120 168 152 160 184 186 192 136 168 184 98 168 168 120 152 144 152 128 192 104 202 160 128 202 152 152 144 114 192 186 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 224 224 224 98 144 152 152 168 160 120 152 184 152 152 160 88 152 128 144 160 152 114 160 160 160 168 168 152 152 114 176 168 152 160 168 144 160 128 160 184 128 152 152 120 120 144 136 168 168 168 168 168 160 186 160 168 168 168 168 168 120 168 168 186 120 144 168 186 168 152 144 168 184 160 186 144 88 98 120 152 144 144 128 160 160 168 120 104 114 144 144 114 208 114 152 104 160 168 160 160 168 160 120 120 152 120 184 160 184 168 186 160 168 160 192 160 168 202 168 184 168 208 144 152 104 160 168 168 160 168 168 152 160 120 168 120 128 168 144 152 98 160 104 144 200 120 186 168 168 152 144 202 168 168 168 144 152 160 186 128 168 152 202 120 160 184 160 168 168 168 184 168 192 186 168 184 152 152 160 184 186 128 168 184 168 168 168 202 120 168 200 202 208 168 160 186 192 184 208 192 184 184 128 160 96 144 88 168 184 186 168 120 168 152 114 152 144 208 128 224 120 186 104 160 168 160 144 152 152 160 144 186 192 192 224 224 224 224 224 224 224 224 224 224 208 224 208 224 224 224 224 224 224 128 128 168 168 184 186 104 128 184 168 168 160 128 160 168 168 168 160 104 168 168 160 168 184 128 184 152 120 128 128 160 160 160 160 152 120 186 152 160 152 128 128 186 128 168 168 168 160 168 168 184 168 168 168 184 152 168 128 168 160 160 184 144 168 168 168 144 160 144 152 152 160 114 160 144 160 160 160 160 160 152 152 128 98 96 114 120 128 152 128 168 104 160 152 152 152 160 144 144 128 120 144 168 152 120 168 152 192 202 160 168 184 168 152 168 186 152 184 168 168 128 160 152 120 152 160 114 128 168 168 160 120 120 120 120 152 160 168 184 160 160 98 152 168 184 192 120 186 186 168 184 152 184 168 128 184 160 168 152 184 144 184 184 152 184 160 184 184 184 186 184 168 186 186 160 184 186 192 168 168 192 192 184 192 192 192 192 202 192 192 202 192 192 184 186 186 184 186 192 152 186 98 152 152 128 160 168 168 184 192 144 80 152 152 168 168 186 192 184 168 160 208 168 160 176 186 176 184 152 192 200 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 120 160 160 160 168 184 128 160 168 168 168 168 160 160 160 168 160 168 144 96 168 168 168 160 160 160 160 128 128 120 160 160 152 168 160 168 168 168 160 168 168 160 160 168 168 184 168 168 160 168 168 168 168 144 186 168 152 120 144 152 168 160 168 168 160 120 192 114 152 128 160 128 120 128 120 120 128 128 128 144 152 144 98 128 88 120 128 114 128 120 112 144 152 152 152 152 152 114 168 160 104 168 144 160 152 114 168 168 192 184 168 168 168 144 184 144 144 168 184 128 184 96 160 168 152 152 128 128 160 152 96 152 168 144 144 168 128 176 168 98 186 168 128 168 184 184 184 184 184 176 184 144 168 144 184 168 168 168 160 168 160 168 168 168 168 168 168 168 184 168 168 184 168 184 184 184 152 144 160 186 152 186 192 192 186 168 192 192 186 168 168 186 192 202 186 168 128 98 186 152 144 192 128 168 104 168 144 160 144 168 144 96 104 168 202 202 168 208 184 200 192 208 192 168 208 192 202 184 192 186 200 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 128 168 168 168 168 168 152 168 168 160 160 160 160 160 160 152 160 152 144 114 128 160 160 152 160 152 160 152 128 128 152 152 160 152 152 160 152 168 144 160 160 152 104 160 160 136 168 168 168 168 144 168 160 152 152 168 144 120 160 160 168 144 152 160 128 160 98 128 144 152 120 88 120 120 128 144 144 144 152 152 144 112 144 128 80 120 144 128 104 114 152 152 120 144 144 144 120 120 104 104 160 152 120 128 120 136 128 168 128 168 160 160 160 144 152 128 128 168 160 160 160 120 128 168 168 168 160 168 168 144 152 104 168 152 168 168 160 168 168 168 160 152 152 120 184 168 168 184 168 168 168 168 168 168 168 168 168 168 160 152 144 144 152 152 168 152 114 176 168 168 160 128 168 168 160 168 184 168 168 128 152 128 184 160 160 184 160 186 160 168 160 176 160 104 184 160 114 160 114 168 88 208 96 168 120 152 120 168 152 184 168 192 152 80 168 192 168 202 168 202 192 184 202 186 152 184 202 202 152 184 202 224 224 224 224 224 224 232 224 224 232 224 232 224 224 232 224 224 224 224 128 168 168 168 168 168 152 160 160 160 160 160 152 152 152 152 144 160 152 128 152 144 152 144 144 152 152 128 152 144 128 120 114 128 152 160 144 104 128 152 152 120 128 120 168 144 98 168 152 152 160 144 144 152 98 168 144 120 168 152 168 144 114 114 168 104 128 120 114 152 98 144 120 144 144 144 144 144 144 144 114 98 98 104 80 104 104 144 96 152 152 96 96 128 144 144 98 98 98 152 114 114 152 120 120 144 160 168 152 136 168 98 184 114 120 88 160 144 152 120 152 144 144 160 168 168 168 168 160 160 152 120 152 168 168 168 160 168 168 168 152 168 144 160 168 168 168 152 168 168 160 160 152 160 152 160 160 144 152 152 152 144 120 120 98 120 136 104 128 160 144 160 120 168 152 144 168 168 168 168 168 98 152 152 160 128 96 160 168 168 96 144 152 120 144 168 152 144 104 168 104 186 104 128 168 104 168 192 160 160 168 128 160 98 184 168 168 168 168 184 168 160 186 168 208 168 186 200 152 168 208 224 224 232 224 224 232 224 232 224 232 224 232 224 232 224 224 224 232 224 114 160 168 160 160 152 160 152 152 152 152 152 152 144 128 144 144 144 128 144 136 128 120 128 144 114 120 128 128 128 144 114 120 98 114 128 144 104 104 104 120 104 114 144 128 128 120 98 152 152 128 114 152 144 128 120 160 96 144 152 160 144 114 120 120 152 128 160 128 96 104 144 114 112 114 120 152 144 144 98 144 144 136 152 80 144 136 144 88 144 114 56 88 128 128 120 96 104 120 152 114 152 128 152 160 152 160 160 128 152 152 128 104 160 112 114 128 128 160 104 160 120 160 128 152 152 120 160 152 144 152 152 144 152 152 152 144 152 152 152 152 152 128 152 152 152 152 152 128 152 160 144 144 114 144 120 144 152 120 152 128 128 128 120 144 96 120 120 120 128 128 120 128 98 128 152 104 168 136 144 160 152 120 168 144 144 128 104 152 114 160 96 152 152 120 88 160 104 160 128 104 184 168 186 96 168 184 160 104 152 160 168 144 144 120 98 160 168 152 184 168 152 96 152 168 186 128 186 160 168 224 224 232 224 232 224 232 224 232 232 224 232 224 232 224 224 232 232 224 224 128 160 160 160 160 160 160 152 160 152 160 160 152 152 152 152 144 152 144 152 152 114 128 98 144 144 128 144 120 120 114 120 128 114 120 128 104 152 114 114 104 144 96 104 128 120 96 120 128 120 152 114 114 120 144 120 114 144 104 144 120 152 152 120 104 128 128 128 128 98 98 120 152 144 144 144 104 144 98 96 120 128 144 128 80 128 144 128 98 128 96 80 114 120 104 98 104 104 114 114 114 120 128 144 114 128 152 144 152 120 128 120 128 144 114 128 128 128 128 120 114 144 128 144 144 114 66 136 144 144 144 128 56 128 144 128 144 104 98 144 136 144 128 144 114 120 128 104 128 120 120 114 104 120 98 128 112 120 128 120 114 136 128 128 144 114 114 128 114 144 114 120 120 144 104 128 114 114 128 128 80 120 114 120 144 152 128 152 114 144 128 152 152 104 144 152 98 104 98 104 114 114 224 224 160 160 152 160 128 168 160 128 160 114 128 184 98 96 112 152 160 168 120 186 152 144 168 152 114 128 224 224 232 232 224 232 232 224 232 224 232 224 232 224 232 224 232 224 232 224 168 184 186 192 184 168 192 186 186 168 168 184 168 168 160 160 168 168 168 168 168 152 168 168 120 120 168 144 128 120 184 160 128 186 168 186 184 168 184 120 144 128 168 152 98 186 168 144 184 168 168 192 128 128 128 184 144 144 160 120 160 114 144 136 98 144 128 104 98 96 160 144 114 88 152 168 114 104 98 80 120 114 120 128 88 120 144 96 120 104 88 104 120 120 98 88 114 114 128 98 114 114 128 128 114 114 120 120 120 120 98 128 120 120 128 136 128 120 120 114 114 120 114 128 128 114 66 120 114 128 98 98 72 104 114 98 128 104 56 114 128 120 128 120 114 98 104 98 120 98 120 112 114 96 104 98 80 104 98 98 120 98 128 120 98 128 120 104 104 96 120 114 114 128 114 128 128 120 120 128 144 120 98 104 104 114 128 114 128 128 96 114 128 120 104 120 104 120 104 96 104 144 224 224 144 160 128 144 152 66 136 168 96 120 120 112 160 98 160 104 168 144 152 98 120 184 120 152 144 128 224 224 232 224 232 224 232 232 224 232 224 232 224 232 224 232 232 224 232 224 184 224 232 224 232 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 208 192 184 232 224 224 224 224 224 224 224 224 224 224 192 224 144 232 184 192 232 224 202 208 232 192 232 186 192 186 224 168 184 224 184 192 232 176 232 186 168 98 98 96 144 80 88 104 168 114 128 160 128 152 72 128 114 104 120 88 114 96 104 120 114 114 114 114 104 80 104 96 120 114 114 128 104 128 120 120 98 114 128 114 128 104 104 114 104 114 120 66 114 120 98 114 104 120 104 114 114 72 120 96 88 80 80 66 98 96 66 104 96 66 114 120 120 114 104 112 114 114 88 88 98 104 104 114 96 114 114 96 96 104 98 104 104 114 120 114 104 120 120 104 104 112 114 120 104 104 104 114 98 128 128 120 120 128 104 114 120 128 114 112 144 120 104 104 120 128 114 152 104 98 144 120 128 232 184 152 152 144 120 128 168 120 114 104 128 98 120 128 96 114 152 98 136 120 144 88 160 128 128 104 104 232 224 232 232 224 232 224 232 224 224 232 224 232 224 232 224 232 232 224 224 184 224 232 232 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 186 224 208 224 224 224 224 192 224 224 224 224 224 192 202 202 224 224 202 224 224 224 224 168 114 96 104 120 136 96 98 88 88 144 104 168 104 136 66 136 144 128 144 80 144 88 114 114 114 112 114 112 98 88 104 168 186 186 184 184 168 168 168 160 114 152 160 144 144 120 120 128 114 120 114 64 104 120 114 112 114 120 120 98 96 56 114 96 88 80 64 56 88 88 66 88 66 66 128 128 120 128 120 114 98 98 120 96 98 104 112 98 96 104 120 104 114 98 98 120 96 114 112 80 120 114 114 128 104 114 120 98 114 128 120 104 120 104 144 120 128 104 120 120 128 114 120 120 144 104 104 120 128 114 114 120 120 128 120 120 114 240 128 202 104 120 96 152 144 98 152 72 144 120 98 152 128 128 80 104 114 114 114 120 104 128 120 168 66 232 224 224 232 232 224 232 232 232 232 224 232 224 232 232 232 224 232 224 208 186 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 216 168 168 168 98 80 104 144 114 114 104 112 96 98 96 114 96 104 120 104 114 128 120 128 96 120 104 114 98 96 104 104 98 96 96 66 192 202 202 202 192 202 202 200 202 202 202 216 128 168 176 168 152 128 120 98 66 98 114 114 120 104 114 136 98 96 144 144 104 144 144 160 168 168 128 152 120 144 128 114 128 128 114 104 104 104 104 120 64 98 98 114 98 98 98 114 96 98 104 98 104 98 88 114 80 114 98 114 128 128 114 98 104 104 104 114 104 120 112 120 104 120 120 114 128 98 96 120 120 128 98 104 144 98 128 96 98 104 120 104 104 104 208 120 208 128 136 128 96 104 96 128 98 120 104 114 112 120 120 56 114 98 104 104 114 104 104 120 144 80 232 224 232 224 232 232 224 232 224 224 232 224 232 224 232 224 232 224 232 202 186 232 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 128 160 160 160 96 80 88 88 114 128 104 104 98 152 128 80 98 88 160 144 114 96 104 120 104 96 104 104 104 96 80 98 96 96 98 56 202 192 202 200 192 192 184 168 168 144 136 114 80 56 96 104 114 120 114 80 80 104 112 112 104 152 168 176 186 184 176 186 184 186 184 186 186 186 186 186 184 144 120 120 120 128 144 144 128 144 104 114 66 112 128 128 144 120 120 120 128 114 144 128 128 120 136 128 128 136 120 128 128 120 136 128 128 120 128 120 120 136 128 114 120 128 120 114 114 114 120 114 120 114 120 120 120 128 128 128 120 128 120 114 144 104 168 98 144 114 96 88 104 128 128 144 144 144 120 128 120 120 128 128 144 136 128 144 144 152 144 152 144 114 224 224 224 232 224 232 224 232 224 224 232 224 232 224 232 224 232 224 232 202 192 232 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 160 160 152 114 80 104 88 88 120 114 104 152 80 144 152 128 104 128 96 98 98 96 96 114 80 96 80 96 96 120 120 98 98 96 96 186 192 192 184 168 152 168 88 144 128 114 80 160 96 88 152 144 144 128 152 80 56 98 152 168 184 168 186 186 184 186 184 184 184 186 186 186 192 184 184 186 186 192 192 186 186 192 192 192 192 184 80 98 96 104 80 168 152 160 160 152 160 168 160 168 160 160 160 152 152 152 160 152 152 152 152 144 144 128 152 152 144 144 128 128 144 144 152 152 160 152 152 152 152 152 144 128 144 128 144 168 128 120 104 120 120 98 136 104 96 98 120 128 136 120 114 114 114 114 120 114 114 96 88 104 120 128 128 136 128 152 144 160 120 104 224 224 224 232 224 224 232 224 232 224 224 232 224 232 224 232 224 224 232 200 202 232 224 232 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 184 202 202 208 232 224 224 224 224 224 224 224 224 152 160 160 160 114 66 144 120 96 120 120 88 98 96 152 160 128 98 160 114 144 104 104 96 88 88 104 104 96 80 120 114 98 96 96 88 176 184 168 184 184 168 168 56 160 184 114 72 192 88 80 168 168 168 168 128 120 168 184 184 184 184 184 184 186 184 186 184 186 192 192 186 192 186 186 186 192 186 186 186 184 184 186 186 184 184 168 96 88 80 96 50 160 160 144 144 144 144 144 128 144 144 144 128 144 128 144 152 152 152 144 144 152 114 96 160 144 128 144 144 128 128 152 144 128 152 160 144 152 144 120 144 136 144 152 144 120 128 120 88 98 128 104 120 104 114 120 120 114 120 114 128 120 120 128 128 120 120 128 128 128 144 136 144 144 152 152 152 168 80 56 232 224 224 224 224 232 224 224 224 224 224 232 224 232 224 232 232 224 224 186 202 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 192 152 224 224 202 224 224 224 224 168 104 144 144 128 120 160 144 152 120 120 104 128 98 152 152 144 98 120 114 114 120 88 88 152 80 98 96 98 98 88 98 128 98 96 98 136 184 168 168 168 184 168 168 56 160 184 98 64 160 66 56 128 160 144 168 184 184 186 186 192 186 186 186 184 184 186 186 186 192 186 186 186 192 192 192 192 184 136 186 184 186 186 192 152 152 186 152 88 80 96 88 72 128 104 114 104 98 104 98 104 98 104 96 98 98 98 96 98 98 98 98 104 104 104 80 104 104 114 104 114 114 114 112 114 120 128 120 120 114 114 120 120 128 120 114 120 120 120 114 72 96 120 114 120 114 120 120 104 114 104 114 114 114 112 104 114 114 114 112 114 104 114 120 152 152 144 152 152 152 88 66 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 200 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 208 208 186 168 224 224 152 98 128 128 152 160 160 152 144 168 98 144 120 144 152 114 144 120 128 98 144 114 96 104 114 88 114 80 96 96 96 88 98 104 88 104 168 184 168 184 168 160 168 152 50 152 120 104 66 56 66 64 114 160 176 186 184 184 186 184 186 184 186 186 186 192 186 192 186 192 192 192 192 192 186 186 192 80 80 168 152 128 186 186 98 128 200 114 88 88 66 96 80 98 88 88 88 96 98 80 96 88 88 96 88 80 80 66 88 96 64 80 80 80 66 72 96 80 96 88 98 96 80 98 96 98 104 80 88 88 88 80 66 66 88 66 66 66 56 66 72 66 88 66 80 66 80 80 80 66 80 88 66 80 80 88 88 88 80 96 66 66 66 88 88 66 56 56 66 96 64 64 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 184 224 224 200 186 224 88 98 114 98 114 144 160 128 152 224 128 114 56 64 80 88 80 88 104 104 98 56 120 98 104 104 98 96 98 96 98 98 88 88 88 96 98 114 168 160 120 160 56 144 50 120 56 56 56 56 96 168 186 184 184 184 184 168 184 184 184 184 186 186 192 192 192 192 192 192 192 192 192 192 192 186 186 120 80 184 98 98 192 186 96 152 98 88 96 88 96 80 88 114 104 98 96 98 98 96 96 96 88 96 96 66 80 72 96 98 66 80 96 80 80 66 80 96 96 96 88 88 96 88 98 96 88 98 98 96 96 88 72 66 96 88 80 80 88 66 66 66 66 80 88 80 88 80 80 80 66 96 88 80 98 88 98 80 88 96 80 80 66 98 96 56 88 96 88 88 56 66 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 208 208 224 208 208 192 184 168 192 216 144 152 66 80 112 114 104 128 128 114 98 56 56 96 56 88 88 88 88 80 98 88 104 98 168 104 114 104 114 88 96 88 98 98 96 72 96 80 88 64 160 128 34 88 56 80 56 114 56 56 120 168 186 184 168 184 184 176 184 184 184 184 184 184 186 186 186 192 186 186 192 192 192 192 192 186 186 192 192 120 80 192 112 88 208 184 96 104 96 88 98 80 96 88 98 112 168 224 224 224 208 208 192 192 184 152 144 72 96 88 88 96 72 88 96 88 66 88 66 98 104 98 98 104 98 96 96 98 88 98 88 80 80 80 66 80 80 80 66 80 96 72 66 88 88 88 96 80 98 80 96 88 88 88 80 80 80 80 88 80 96 88 72 88 56 98 88 64 80 96 88 66 80 80 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 208 208 224 224 224 208 224 208 208 224 208 224 208 208 192 202 208 208 144 192 160 186 34 152 152 96 114 128 120 114 120 56 66 66 56 66 56 88 96 96 80 72 98 104 104 114 114 104 128 88 80 104 88 98 88 80 88 80 96 88 88 104 120 56 96 56 56 66 98 152 184 184 184 176 184 176 184 176 184 184 184 184 184 184 184 186 186 186 184 186 186 192 168 192 186 186 184 186 128 152 114 88 184 98 96 128 186 88 98 96 98 104 88 96 104 96 104 88 224 224 224 224 224 224 224 224 224 224 104 186 160 128 224 96 120 176 66 96 72 88 96 98 98 104 104 98 98 98 98 96 98 96 88 96 88 88 88 80 88 80 72 96 66 72 80 80 98 88 80 98 88 64 80 66 96 80 88 88 80 66 88 80 80 66 88 66 96 96 64 80 88 98 66 88 66 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 202 216 224 208 224 202 184 202 208 208 208 208 208 208 202 186 168 168 184 168 184 184 168 202 128 144 152 168 88 120 114 128 104 128 66 88 80 88 88 56 88 96 80 88 66 98 96 114 104 98 104 98 112 96 96 96 96 80 66 96 80 96 80 88 80 66 56 88 56 128 186 184 184 168 184 168 184 168 184 184 184 184 184 168 186 184 186 186 186 186 186 186 184 186 144 56 144 186 186 184 192 114 114 112 98 152 80 88 98 184 80 104 96 104 96 88 98 80 128 88 160 224 224 224 186 216 224 224 224 224 224 104 184 202 98 224 104 184 160 104 224 66 192 184 168 152 128 104 104 96 96 96 96 96 98 98 98 80 80 96 66 98 66 88 88 80 80 66 88 80 88 96 80 80 88 88 64 98 96 96 80 96 80 72 66 88 66 88 80 88 96 66 64 96 88 80 104 80 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 192 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 208 224 186 168 216 208 208 202 184 168 208 202 202 202 202 192 192 192 202 192 192 186 168 160 192 144 160 168 80 66 56 120 114 114 120 80 88 80 88 88 80 80 80 88 66 72 80 98 120 104 96 88 112 104 104 98 96 96 80 72 72 56 80 66 88 66 64 128 176 184 184 168 184 184 184 184 184 184 176 184 176 184 168 184 184 184 184 168 186 186 192 184 186 184 184 144 88 98 192 184 160 96 120 120 104 96 152 88 98 88 168 66 98 56 104 96 80 104 96 160 224 202 202 224 224 224 168 224 224 224 224 224 98 186 232 98 184 114 152 96 168 224 98 184 224 224 224 224 224 224 224 202 200 186 168 152 144 98 80 80 96 66 96 80 88 80 66 88 66 88 96 88 80 80 88 88 88 88 80 80 80 80 80 80 66 96 96 72 88 88 66 88 66 80 96 88 88 96 72 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 192 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 224 224 208 208 224 208 208 208 224 208 208 208 208 208 144 208 202 202 208 202 168 202 192 192 200 192 192 202 192 192 186 168 184 184 128 160 160 144 168 176 160 104 112 104 96 88 88 88 80 66 96 96 96 96 152 104 96 104 66 80 88 96 96 114 114 98 96 98 88 56 88 56 66 96 96 152 184 168 184 168 184 184 184 168 184 184 184 168 184 184 168 184 184 184 168 184 176 184 184 160 80 184 184 168 88 114 88 114 202 184 96 66 112 152 98 96 144 56 144 80 168 80 104 80 98 98 96 104 66 186 144 208 224 192 224 224 208 186 224 224 224 208 88 184 224 160 120 128 112 96 224 224 98 160 224 224 224 224 224 224 168 152 144 144 144 144 152 114 72 80 98 80 80 72 88 80 80 88 66 96 98 96 88 88 96 66 96 88 96 88 66 96 66 96 66 88 88 56 88 80 56 96 80 66 96 66 96 80 80 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 184 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 192 224 224 208 208 208 208 202 202 208 202 184 168 160 80 176 202 144 160 184 152 192 186 184 184 186 184 186 168 104 104 120 152 152 144 152 128 168 160 168 98 128 160 80 128 56 98 120 96 128 104 120 98 96 98 112 96 96 88 80 80 96 88 98 80 96 96 66 56 80 160 184 184 184 184 184 184 184 184 184 168 184 184 184 184 184 186 184 168 184 168 168 186 176 168 184 168 184 88 80 168 184 120 88 96 66 128 98 144 98 80 114 104 96 88 128 80 168 96 88 88 114 104 104 104 104 144 98 112 80 120 128 144 80 184 224 192 224 224 224 208 66 208 224 192 96 88 114 128 224 232 98 144 224 224 224 224 224 224 232 202 184 160 128 104 96 96 80 80 98 88 80 72 88 66 96 88 66 96 98 98 96 98 96 96 96 96 88 98 80 80 80 88 96 66 96 66 80 88 66 88 72 80 88 80 98 98 88 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 224 224 224 224 224 224 208 224 224 224 224 224 224 208 224 208 224 208 224 208 208 224 192 152 208 208 208 202 208 208 186 184 202 192 192 208 208 128 152 186 192 186 120 186 184 184 144 160 168 144 96 96 114 136 144 152 152 168 152 160 160 136 168 112 128 66 128 144 88 96 104 104 98 96 88 98 96 72 96 72 88 66 96 98 98 96 98 112 88 144 160 192 184 186 184 186 184 186 184 184 184 184 184 186 184 184 184 184 184 184 168 184 184 184 176 168 184 184 168 186 88 66 160 98 104 88 96 56 104 104 160 114 80 112 144 80 80 160 56 160 120 114 96 114 114 96 168 152 152 114 114 128 120 128 114 136 168 186 152 232 224 224 208 80 224 224 232 104 98 88 208 224 232 104 104 232 224 224 232 224 224 224 224 224 224 224 232 224 202 96 114 112 96 66 66 80 66 98 96 72 96 98 98 98 98 98 96 98 98 98 98 88 96 96 96 98 96 96 66 88 88 80 80 80 66 66 96 104 114 88 224 224 224 224 224 224 224 224 224 224 224 224 192 128 128 168 152 224 224 168 224 208 208 208 208 208 224 208 208 208 208 208 208 224 208 224 208 208 208 224 202 202 186 202 144 186 168 186 202 168 168 114 186 184 160 160 168 128 184 160 186 184 192 96 168 168 168 128 168 168 144 152 98 144 114 152 120 168 128 120 104 120 120 104 168 80 112 152 88 98 96 98 96 104 88 88 88 80 80 96 80 66 98 98 104 104 144 168 184 168 184 184 168 184 184 184 184 184 184 184 184 184 186 186 184 184 186 186 184 168 184 168 184 168 184 168 128 96 168 184 66 66 128 96 96 64 98 88 144 98 160 96 88 114 128 88 98 120 96 168 88 120 98 114 120 120 168 160 114 114 112 114 128 114 98 128 208 186 160 224 224 224 202 88 224 224 232 152 98 114 240 224 232 144 98 224 224 224 224 224 224 224 224 224 224 224 224 224 224 88 208 232 232 96 88 80 98 104 88 66 88 96 98 98 96 98 98 96 98 98 96 96 96 96 88 96 96 88 66 88 80 88 66 80 66 66 88 98 98 80 232 224 224 224 224 224 224 224 224 224 224 208 128 120 144 128 144 184 224 128 224 208 224 208 224 208 208 208 224 208 224 208 208 208 208 208 208 202 184 186 192 202 202 184 128 184 184 168 152 184 144 152 120 176 186 168 168 152 114 168 168 168 168 152 128 160 160 128 96 168 160 152 152 120 160 104 114 144 144 120 128 144 104 120 98 56 88 128 88 88 98 80 104 120 104 104 96 66 88 88 80 56 104 144 168 186 184 184 168 184 184 168 184 168 184 184 184 176 168 184 168 184 184 186 184 184 184 184 184 186 184 184 184 168 184 168 98 88 168 184 96 66 120 96 66 80 98 66 168 98 168 114 88 104 120 112 112 120 104 168 160 128 98 96 128 144 128 114 104 120 152 120 168 232 186 232 224 184 186 176 208 224 200 80 224 224 224 168 80 192 224 224 224 144 88 224 224 224 224 224 224 224 224 224 224 224 224 224 224 66 186 224 232 144 88 96 224 232 224 88 152 184 168 168 152 128 120 104 88 96 96 96 98 98 96 96 98 96 56 88 88 96 66 66 56 88 96 114 96 80 232 224 224 224 224 224 224 224 224 224 208 186 192 104 168 144 168 168 232 120 232 208 208 208 208 208 208 224 202 216 208 208 208 202 202 202 202 192 192 184 176 168 168 202 184 176 160 186 184 128 128 136 160 144 176 168 112 160 98 136 152 160 168 128 120 120 120 152 168 88 104 152 114 152 120 104 120 98 144 120 114 144 98 98 96 72 104 128 98 120 88 80 98 114 120 128 98 88 80 96 144 152 184 184 184 186 184 168 186 186 184 184 184 184 184 184 184 184 184 168 184 168 168 176 168 168 184 186 184 184 184 168 168 80 128 184 104 88 168 184 88 80 104 96 112 96 98 88 168 98 168 120 88 120 160 114 128 144 120 160 152 120 144 104 120 114 104 114 88 144 168 168 152 202 144 224 224 232 144 192 168 224 192 104 192 224 224 104 96 202 224 224 224 160 56 224 224 224 224 224 224 224 224 224 224 224 224 224 224 88 208 224 224 186 96 120 232 224 208 98 114 224 224 224 224 224 224 232 208 186 186 160 96 104 88 88 96 96 66 88 98 98 80 66 80 104 104 120 120 96 232 224 224 224 224 224 224 224 224 224 224 186 184 160 152 144 152 160 240 104 224 208 208 202 208 202 202 202 202 202 202 202 192 202 192 202 200 200 192 200 202 200 186 168 186 168 184 168 184 186 168 168 120 184 104 152 152 114 152 120 114 114 152 160 144 144 104 96 160 144 88 160 98 114 120 112 98 120 98 114 96 144 88 114 98 56 104 98 96 80 80 80 96 98 96 104 104 114 144 186 184 184 184 186 186 184 186 186 184 184 184 184 184 168 184 184 168 184 168 184 168 184 184 168 184 168 184 176 168 114 112 168 168 66 96 186 104 80 114 114 88 88 104 98 112 96 112 96 152 96 160 98 104 144 144 120 128 152 120 88 98 114 112 98 104 104 104 120 120 128 144 128 104 96 192 192 192 224 202 120 160 224 192 98 192 202 168 96 114 128 202 224 208 168 96 184 224 224 224 224 224 224 224 224 224 224 224 224 224 98 224 224 224 186 96 184 224 224 224 98 128 224 224 224 224 202 208 186 224 192 224 224 224 168 192 96 168 104 66 88 96 96 96 56 80 104 114 114 128 98 232 224 224 224 232 224 232 224 232 224 224 224 168 184 186 184 144 152 232 98 224 200 200 200 192 202 192 200 200 192 202 200 192 192 192 192 192 192 192 186 186 186 186 184 168 184 184 168 184 184 168 160 144 152 144 144 144 120 144 120 120 104 112 128 152 120 128 128 120 114 98 112 96 96 88 104 66 98 104 104 98 66 96 88 98 56 104 120 98 112 88 80 104 96 98 112 112 98 202 186 186 184 186 186 186 184 184 184 184 184 186 184 184 168 184 184 184 184 184 168 184 168 184 184 168 184 168 168 184 80 66 160 168 80 88 98 112 80 88 112 88 88 114 96 104 96 104 88 160 88 152 120 114 168 144 114 98 96 98 96 98 120 98 160 160 144 160 128 160 96 128 114 144 168 202 184 186 184 224 152 160 224 186 104 186 192 120 104 98 128 224 208 208 184 80 168 224 224 224 224 224 224 224 224 224 224 224 224 224 80 224 224 224 144 112 120 232 224 224 120 98 224 224 224 224 224 224 224 202 168 184 224 224 224 152 184 232 152 66 202 184 152 98 80 88 144 160 192 224 114 232 224 224 232 224 232 224 232 224 224 224 224 224 168 160 168 184 224 240 96 224 192 200 192 202 192 192 192 192 192 192 192 192 192 186 192 184 186 184 184 184 184 176 184 168 176 168 168 168 168 168 160 144 128 160 144 128 152 104 120 128 114 136 104 120 128 144 114 120 120 104 88 96 98 96 120 96 80 104 88 96 88 56 80 104 56 98 120 104 104 104 128 120 184 176 104 98 96 152 186 184 186 184 184 186 186 184 186 184 186 184 184 184 184 184 168 184 168 184 184 184 184 184 168 184 168 184 168 168 80 66 168 168 66 98 96 96 66 96 114 88 98 114 96 104 96 114 88 120 80 168 114 160 160 120 160 152 144 98 104 96 120 104 152 104 98 120 98 160 144 98 128 128 160 168 160 160 144 186 168 186 224 168 98 232 144 80 192 96 104 202 192 208 192 88 160 224 224 224 224 224 224 224 224 224 224 224 224 202 80 224 224 224 128 104 104 224 224 224 160 88 224 224 224 224 224 224 224 224 224 98 208 224 224 202 152 232 114 66 224 224 224 80 98 114 232 224 224 232 128 232 224 232 224 232 224 232 224 232 224 232 224 224 232 232 224 232 224 232 104 208 186 186 192 186 186 186 192 192 186 184 184 184 184 184 184 168 184 184 168 168 168 168 168 168 168 168 168 168 160 160 152 152 104 128 128 120 144 114 128 128 98 120 128 98 66 120 114 98 114 104 104 96 104 96 80 98 88 98 50 98 66 88 88 104 34 66 96 144 184 192 192 186 120 80 120 114 104 96 202 184 168 186 186 186 184 184 184 168 186 184 184 184 184 184 184 168 184 168 168 186 184 168 168 184 168 168 168 186 88 98 168 176 64 104 88 96 96 98 98 88 98 96 80 104 114 104 104 152 128 184 152 152 120 120 104 96 114 112 98 114 186 112 128 98 144 128 98 114 120 160 144 104 128 184 208 160 168 120 144 168 240 168 96 232 114 120 208 80 80 168 186 184 208 88 128 224 224 224 224 208 224 224 224 224 224 224 224 202 98 224 224 224 88 98 80 208 224 224 168 80 208 224 224 224 224 224 224 224 224 184 192 184 224 224 168 232 128 88 224 224 144 96 128 104 224 186 224 224 152 232 224 224 224 224 224 224 232 224 224 232 232 224 232 232 232 224 232 232 114 192 186 186 186 186 184 184 184 184 184 168 184 168 184 168 168 168 176 168 168 168 168 168 160 168 160 152 144 152 152 144 128 104 168 152 128 114 144 128 88 120 114 80 104 114 96 88 104 98 98 80 98 88 80 98 88 88 96 80 80 72 98 88 50 98 120 168 186 184 186 184 184 184 160 120 114 152 104 128 168 184 184 184 168 184 184 184 184 184 186 184 184 184 168 184 168 168 184 168 184 88 114 184 128 56 184 184 168 186 80 114 34 160 56 128 96 98 104 104 98 98 104 96 98 112 128 160 160 144 120 88 80 98 96 98 98 104 120 120 186 144 114 120 160 152 128 104 144 120 88 114 120 104 114 202 128 160 168 160 128 168 208 168 128 186 66 184 202 88 168 114 186 192 224 96 144 224 224 224 208 224 186 186 208 224 224 224 224 192 98 224 224 184 128 128 96 144 224 224 186 66 186 202 208 208 224 224 224 224 224 208 186 168 128 186 152 208 96 96 224 224 88 184 120 56 186 160 186 184 144 224 224 224 224 224 224 224 232 224 224 232 224 232 224 232 224 232 224 232 98 186 184 184 184 184 176 168 168 168 168 168 168 168 168 168 160 168 160 168 160 160 160 152 152 144 152 144 128 144 128 152 168 160 128 160 168 144 104 128 104 104 104 114 104 96 96 96 80 80 80 88 80 88 72 88 96 56 96 56 66 50 112 128 168 192 186 186 184 186 186 186 186 184 186 168 160 160 184 176 184 184 184 184 186 184 168 184 184 184 184 168 184 168 168 168 184 168 184 168 168 88 66 176 120 56 168 160 50 98 104 114 66 152 56 114 80 96 104 104 98 114 120 128 144 120 152 152 120 144 128 114 96 80 96 96 88 144 160 144 96 114 104 120 128 96 112 120 98 114 114 104 114 88 98 160 152 120 160 98 160 160 192 160 144 120 136 192 192 80 192 56 192 202 224 98 120 224 224 224 224 224 224 224 216 168 232 208 224 184 98 224 232 128 152 120 144 98 224 224 202 98 152 224 202 184 216 202 208 224 186 208 184 176 152 186 144 184 98 120 186 192 80 232 144 98 152 232 160 192 160 232 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 232 120 184 168 176 168 168 168 168 168 168 168 168 160 168 152 160 152 160 152 152 152 152 144 144 144 152 120 128 128 120 152 202 152 168 160 160 128 144 98 98 98 112 104 98 96 96 96 88 80 96 56 80 66 88 88 88 66 80 88 72 144 184 176 192 186 192 192 186 186 186 186 186 184 186 186 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 176 184 168 184 168 152 184 168 186 80 88 168 144 88 184 120 66 96 96 120 66 160 56 120 98 96 104 96 98 120 152 144 152 160 152 152 152 144 114 88 80 96 120 136 120 152 104 120 104 128 128 114 120 72 120 114 96 120 112 152 144 120 128 128 144 128 160 144 152 128 168 114 120 66 184 128 152 88 202 120 120 224 216 98 128 224 224 224 224 224 224 224 208 152 202 160 224 160 104 232 224 98 224 114 114 88 192 224 208 96 128 208 128 192 168 192 224 168 168 186 144 168 160 192 152 168 80 128 232 80 152 186 144 88 66 186 136 152 160 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 114 168 168 168 168 168 168 168 160 160 152 152 160 160 152 152 128 152 144 152 128 144 128 128 128 128 128 120 128 114 208 168 160 160 168 152 152 114 80 96 66 96 96 96 88 96 88 66 88 80 80 96 80 88 72 80 80 96 168 186 186 176 186 192 192 186 186 184 184 184 184 186 186 186 192 184 184 184 184 184 184 186 186 186 184 184 176 176 184 168 152 66 160 168 184 168 184 56 168 168 184 88 80 184 144 80 168 120 96 114 104 144 80 128 66 120 96 88 104 104 120 152 152 152 160 120 128 120 98 96 112 96 88 96 88 114 104 120 120 128 104 104 98 114 114 114 120 114 98 152 104 120 152 128 96 144 144 128 152 202 104 120 128 114 114 160 128 128 152 88 192 168 114 202 192 104 104 232 224 224 224 224 200 152 152 208 144 202 128 160 104 224 192 96 240 128 120 114 144 224 224 98 88 232 224 168 168 152 186 202 160 202 186 168 224 66 192 184 56 152 186 88 186 202 66 96 80 144 152 120 128 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 114 168 160 160 160 160 152 152 152 144 152 144 128 144 144 120 128 128 128 128 128 128 128 128 114 120 120 114 114 160 224 114 152 120 120 152 144 160 88 104 80 72 88 80 88 88 66 80 80 80 80 66 66 80 98 128 168 192 186 186 184 184 184 186 184 186 184 184 184 184 184 186 184 184 184 184 184 186 186 186 186 168 160 160 168 184 186 184 184 184 160 80 152 184 184 144 160 66 160 168 184 114 88 184 144 96 88 88 80 128 96 152 80 152 56 128 66 120 160 128 144 168 120 120 120 114 114 120 120 128 128 114 144 152 120 98 98 120 120 114 112 96 88 104 128 104 128 114 128 128 152 114 120 114 120 114 120 114 168 104 80 98 112 96 88 168 128 88 152 56 202 144 88 202 184 128 120 224 224 224 224 224 202 202 168 168 208 186 168 120 114 232 152 144 232 120 114 160 104 232 202 88 56 168 168 224 120 160 144 152 168 168 186 176 208 168 168 152 66 160 104 144 168 160 114 144 128 144 152 186 104 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 104 152 152 144 152 144 152 144 144 144 128 144 144 120 128 128 128 128 128 144 128 128 128 104 114 112 104 114 98 224 192 152 128 128 136 152 152 152 88 88 80 56 80 80 80 66 66 80 66 56 80 128 176 186 192 186 186 186 186 192 186 186 186 186 184 184 184 184 184 186 184 184 168 184 184 184 168 184 184 184 184 168 168 160 144 144 152 160 168 184 144 88 152 186 128 80 114 96 160 184 168 128 88 152 114 88 98 80 88 104 80 144 88 120 66 160 98 168 160 120 120 144 128 128 128 120 80 88 88 66 96 96 120 120 98 96 112 104 114 112 104 66 80 98 114 114 104 120 128 114 144 104 144 128 114 114 128 104 176 80 120 114 104 152 104 114 144 128 208 56 152 104 128 144 168 120 104 224 224 224 224 224 224 224 224 224 192 224 208 144 114 224 98 192 224 120 98 202 72 186 224 104 80 202 184 128 184 144 168 152 168 202 184 186 224 128 168 152 98 168 80 160 168 144 114 120 192 80 160 168 160 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 114 144 128 144 128 128 144 144 120 128 128 120 128 128 128 128 128 128 120 114 114 104 114 112 104 104 114 112 114 232 160 128 184 128 104 152 160 120 96 66 80 80 50 50 50 56 56 96 128 184 186 192 184 186 186 184 184 186 186 184 186 186 186 192 184 186 184 184 184 184 184 184 184 168 168 184 184 184 184 168 184 184 184 184 184 184 186 168 128 152 160 88 168 184 128 96 144 96 152 104 144 120 66 56 96 88 88 98 96 104 104 160 104 114 120 160 152 128 114 128 114 120 114 104 104 120 114 160 144 152 144 144 128 88 88 114 104 120 120 120 120 136 98 98 104 98 128 96 128 136 104 128 104 128 144 98 104 112 128 98 192 160 88 192 98 98 128 128 168 56 120 152 168 66 168 144 88 224 208 224 224 208 216 224 208 224 216 224 224 104 152 184 104 224 224 120 88 224 104 144 232 114 66 186 128 224 168 184 160 144 200 224 160 160 208 208 152 160 96 120 120 192 202 186 96 128 186 96 168 186 144 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 96 128 128 128 128 128 128 128 120 120 120 120 114 112 104 114 114 112 104 114 112 98 104 104 96 96 96 98 168 224 144 168 168 128 114 152 144 104 88 80 80 50 50 66 112 168 186 186 192 186 186 186 184 186 186 184 184 186 186 186 186 186 184 176 184 184 168 168 168 184 184 184 168 186 184 184 184 184 176 184 168 184 184 184 184 184 184 184 168 98 104 88 168 184 114 80 144 98 152 98 104 128 104 98 88 96 98 104 80 112 98 120 128 160 168 152 120 128 128 144 152 104 88 98 120 152 128 88 152 128 96 114 104 120 96 96 120 128 114 120 144 114 136 144 128 96 114 114 120 114 96 88 114 112 98 128 96 104 120 104 144 114 96 98 88 66 88 128 128 56 120 120 186 88 176 128 80 208 208 208 208 224 208 208 224 208 224 224 216 120 168 128 144 224 208 152 88 224 144 96 224 128 104 208 114 224 186 200 152 168 184 224 184 208 224 208 224 128 80 98 184 208 208 224 80 160 208 114 152 184 152 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 96 120 128 128 128 120 128 114 114 112 104 114 112 104 114 112 98 104 98 98 104 98 96 96 96 96 96 88 186 202 144 168 120 144 128 152 168 152 56 56 104 152 176 192 186 186 184 184 184 186 186 186 186 186 192 186 184 186 186 186 184 184 184 186 186 186 186 184 184 184 168 168 168 184 184 184 184 184 184 184 184 184 168 186 168 184 184 184 186 186 98 144 128 120 120 98 120 104 168 98 114 120 144 104 98 96 120 114 80 104 152 160 152 98 120 88 98 120 120 80 66 104 128 128 120 168 152 98 144 98 104 104 104 120 96 114 114 104 144 120 128 128 120 144 128 114 114 120 128 114 98 98 88 104 98 112 114 96 144 96 72 104 120 98 104 96 96 120 114 98 114 120 152 144 104 160 66 200 208 208 208 208 208 208 208 224 208 208 208 114 168 104 202 202 208 120 88 208 184 80 184 160 104 184 202 208 202 200 120 208 168 208 186 208 208 202 208 120 66 128 208 208 208 224 88 152 224 176 66 216 128 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 96 120 114 114 104 114 104 114 104 112 104 114 104 112 98 104 96 96 96 96 96 96 88 88 88 80 66 80 192 208 144 128 144 128 128 128 128 128 98 186 184 184 184 186 184 184 184 186 186 186 186 184 184 176 184 184 184 184 168 184 184 168 184 184 186 184 184 184 168 168 168 168 160 144 152 186 176 184 168 168 184 184 186 96 192 184 184 184 98 184 186 152 144 104 128 96 114 136 186 112 128 98 136 114 112 96 104 152 80 144 168 144 98 144 98 98 128 112 104 80 128 120 144 152 120 104 152 88 128 96 104 104 98 120 96 114 120 104 128 128 114 144 104 104 128 114 128 104 128 96 80 98 98 104 72 104 120 88 144 168 66 120 144 152 114 88 104 144 152 128 168 152 160 144 88 168 104 168 202 200 202 202 200 202 192 200 192 202 202 114 128 160 192 192 202 144 50 192 192 98 128 168 80 152 200 202 202 202 208 202 192 202 202 202 208 208 208 112 96 224 208 208 202 208 56 160 202 208 96 168 152 232 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 88 104 104 114 112 104 98 96 96 98 98 96 98 98 96 96 96 96 96 96 80 80 80 80 80 80 80 66 184 192 120 152 128 144 168 104 144 128 168 168 184 184 186 186 186 186 184 186 186 186 186 184 184 184 184 184 184 184 184 184 184 184 184 168 184 176 184 168 184 168 184 184 168 168 144 88 144 186 184 184 184 186 160 80 168 184 160 186 96 120 152 152 56 104 152 98 168 136 96 114 120 104 144 114 114 104 88 128 104 160 128 104 152 152 144 184 114 152 88 88 120 160 96 144 114 98 136 96 120 98 80 104 104 120 120 114 114 144 128 144 120 80 104 96 114 104 114 96 120 104 96 96 88 104 96 128 114 98 160 168 128 144 96 120 144 98 128 144 176 168 114 224 152 202 88 168 104 152 186 186 186 192 192 192 192 192 202 200 192 128 144 186 192 186 192 114 80 208 192 160 80 184 66 152 186 192 192 192 192 200 192 192 200 192 192 192 202 152 144 208 202 208 202 202 66 184 208 224 114 128 160 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 80 98 96 104 98 112 96 96 96 96 96 96 96 88 96 96 96 66 80 80 80 80 80 80 66 80 80 66 168 186 168 160 160 152 160 160 120 114 144 186 184 184 186 186 186 184 184 184 184 184 184 184 184 184 184 184 184 184 184 168 186 184 184 184 184 168 184 168 176 176 168 152 160 168 168 168 168 144 160 168 184 168 168 88 168 168 66 168 152 144 128 120 144 104 152 104 168 120 114 72 120 114 168 104 120 114 136 144 104 168 160 168 144 114 96 88 88 104 128 128 104 128 96 144 104 104 128 104 144 98 120 114 120 128 144 112 120 96 128 104 112 120 114 114 112 114 96 98 80 104 80 96 96 98 104 88 152 128 152 186 144 186 80 168 120 192 160 192 192 186 192 184 186 192 128 114 112 136 186 184 168 186 186 186 186 186 186 184 184 184 168 184 168 184 184 120 96 168 168 160 50 152 96 144 168 184 176 184 186 184 184 184 176 184 184 186 186 192 168 192 192 192 192 184 98 168 192 192 152 98 152 224 224 202 192 202 224 224 224 224 224 224 224 232 224 224 224 224 224 232 88 98 98 98 96 98 88 96 88 88 96 88 96 88 88 80 80 80 80 80 66 80 66 72 66 88 104 152 160 192 160 152 168 152 144 144 128 192 184 184 168 186 184 184 184 176 184 184 186 184 168 186 176 168 184 168 168 184 168 184 184 168 184 168 184 184 168 184 184 168 168 184 168 168 168 168 168 160 98 176 184 88 120 80 114 184 104 168 98 136 128 98 120 114 160 66 184 114 120 128 120 112 144 114 144 136 104 120 114 128 144 144 160 120 114 112 152 152 114 144 104 104 96 128 96 98 114 104 114 88 120 114 114 128 120 120 120 96 120 120 104 114 104 104 98 114 98 104 104 104 96 80 96 98 104 144 168 120 184 186 168 192 208 192 192 186 192 186 184 184 184 184 184 184 186 114 104 120 184 184 168 128 168 184 184 184 168 176 168 168 168 168 168 168 168 128 96 176 168 168 96 104 96 120 168 184 168 168 168 168 168 168 168 168 184 184 184 168 186 176 184 184 184 168 104 168 186 184 184 98 152 232 224 208 192 202 232 224 224 224 224 224 224 224 232 224 232 224 224 232 72 98 104 96 96 88 96 88 88 80 80 80 80 80 80 66 80 80 66 80 80 66 64 96 144 186 192 186 136 208 160 160 152 160 160 120 160 184 184 186 184 184 184 184 184 184 184 184 168 184 168 184 168 184 184 168 184 168 168 184 168 184 168 184 168 184 184 168 168 168 184 168 168 168 160 168 168 184 152 152 128 98 120 88 152 114 80 192 96 96 152 104 104 144 144 96 152 128 128 152 120 128 152 128 152 144 98 112 120 144 80 96 120 114 120 128 144 144 144 114 114 112 96 120 80 98 114 104 114 98 120 128 114 128 120 114 114 112 104 104 104 120 114 98 96 112 88 104 104 80 96 88 96 104 192 202 202 224 176 208 202 202 192 192 192 186 186 184 184 168 184 168 168 168 176 144 114 128 168 168 168 168 144 168 168 168 168 168 160 160 160 152 160 152 160 120 114 160 152 152 120 88 88 80 160 144 152 144 152 144 152 152 152 152 160 160 168 168 168 168 168 160 168 152 120 168 184 168 176 104 120 224 224 224 200 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 66 96 88 80 88 88 80 80 80 72 80 80 80 80 80 66 80 72 56 80 96 128 192 192 192 186 184 186 168 192 128 168 144 152 160 152 184 184 184 184 184 184 186 186 184 184 184 184 184 184 184 184 176 168 184 184 168 184 168 184 168 184 168 184 168 168 144 128 186 160 168 168 160 168 66 168 160 168 128 96 168 120 114 88 120 104 88 152 96 160 152 128 160 104 104 128 128 128 128 160 120 160 160 128 160 128 120 114 144 98 104 104 98 144 128 112 114 112 144 112 104 128 104 120 104 98 128 98 104 98 120 114 112 104 114 120 104 120 120 104 98 98 114 96 104 80 88 66 120 104 152 168 144 192 202 202 200 186 160 184 192 186 192 186 184 168 168 168 168 168 160 168 160 168 160 144 98 114 144 160 152 160 144 144 160 152 144 136 144 144 144 128 144 152 128 144 136 136 144 128 128 88 56 80 128 128 128 128 128 128 128 128 144 144 144 152 152 152 152 152 160 152 160 128 144 160 168 160 168 152 120 232 224 224 186 208 232 224 224 224 224 224 224 224 224 224 224 224 224 224 80 80 80 80 80 80 80 72 80 66 64 80 80 80 80 64 66 96 168 186 186 186 186 192 186 186 186 186 184 152 160 144 168 120 144 160 184 168 184 168 184 184 168 184 184 168 184 184 184 184 184 168 184 184 168 184 168 186 168 168 184 184 184 168 168 160 160 152 120 186 152 184 98 160 88 184 104 120 160 98 160 160 112 120 120 120 184 152 114 144 120 144 152 144 88 144 168 144 114 168 144 128 152 128 114 160 160 144 136 112 114 104 98 120 104 104 104 104 98 114 96 120 128 114 144 104 104 98 104 120 120 120 120 114 104 104 98 96 120 114 114 104 114 104 88 98 96 104 120 128 192 186 144 184 186 168 168 168 128 160 168 168 168 152 160 168 160 152 160 152 152 144 152 128 128 152 144 128 104 120 120 128 144 120 114 120 120 120 114 96 144 114 96 114 120 104 104 120 114 120 120 96 56 66 120 128 128 128 128 128 120 128 128 120 128 128 144 152 144 144 152 144 152 144 152 152 152 160 168 168 152 224 232 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 208 66 80 66 80 72 72 80 80 66 72 80 80 66 56 96 168 184 186 186 186 192 186 186 186 184 186 186 186 184 186 104 120 168 160 120 184 168 184 168 186 176 184 184 184 184 168 184 168 184 168 168 184 168 168 168 168 184 184 184 168 168 168 168 168 168 168 168 168 144 144 128 160 104 160 168 128 98 152 168 120 152 120 168 160 152 96 114 168 104 128 96 104 114 144 144 152 128 128 144 144 120 104 114 144 128 104 128 144 144 120 152 104 120 114 80 114 114 98 98 112 114 114 104 128 112 120 98 98 80 120 112 98 104 114 104 114 112 104 96 114 104 88 96 98 104 96 128 104 160 152 114 168 176 128 186 168 104 98 168 112 120 168 144 128 128 144 128 144 128 144 128 128 128 128 128 128 114 128 120 104 98 114 120 104 120 88 104 98 98 152 144 192 104 104 104 98 96 98 104 104 104 104 88 80 98 112 104 114 104 114 104 114 104 128 128 128 128 144 120 144 152 144 128 128 144 128 152 152 120 152 152 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 208 56 66 72 66 66 66 80 80 66 66 56 96 160 192 192 186 186 186 186 184 186 192 186 192 186 186 186 192 186 184 186 128 128 168 184 168 184 168 186 184 168 184 168 184 184 168 184 168 184 184 168 184 168 184 168 168 168 168 168 168 168 168 168 128 114 176 168 168 160 168 114 168 120 160 66 128 168 144 114 80 120 104 128 144 120 80 104 144 168 144 120 144 104 104 144 152 128 144 128 160 120 128 120 144 128 114 144 114 104 114 114 98 104 96 96 128 98 104 104 104 98 112 104 104 96 114 104 98 120 98 112 98 80 114 96 104 104 98 104 80 104 80 88 96 96 66 128 114 98 152 114 152 120 104 128 120 144 96 104 104 96 98 114 104 114 152 120 144 120 128 114 120 104 120 114 104 104 104 104 98 104 64 96 56 114 88 168 144 152 96 152 128 80 96 96 96 96 88 96 96 96 96 80 80 96 104 104 98 104 98 104 104 114 114 104 114 120 104 120 114 114 128 114 104 114 104 120 104 104 144 144 224 224 224 224 224 224 232 224 224 224 224 232 224 224 224 224 224 224 186 66 80 66 80 66 80 66 72 104 184 200 192 186 186 186 192 186 186 186 186 186 192 192 186 192 192 192 186 186 184 184 184 184 184 184 184 168 186 184 184 184 184 168 184 168 184 168 184 168 168 184 168 184 184 168 184 168 168 168 168 168 168 168 160 160 120 152 80 160 152 168 128 120 114 128 144 104 128 104 114 120 96 104 120 144 104 144 160 152 128 104 120 144 128 120 128 152 104 120 152 128 144 128 120 120 104 114 120 112 96 96 96 96 96 96 114 96 96 114 104 98 96 98 96 104 96 98 96 104 96 112 104 104 80 112 98 98 104 98 88 104 80 112 88 88 98 88 88 144 80 114 128 114 96 96 88 88 88 96 98 104 88 120 80 88 114 96 98 114 104 114 104 104 96 96 96 98 104 128 128 144 168 104 144 160 80 168 168 168 168 144 66 80 88 96 80 80 80 88 96 96 96 96 88 88 96 96 96 98 96 96 96 96 96 98 98 104 104 104 104 98 104 96 96 98 104 98 98 104 120 152 224 224 208 184 208 232 224 232 232 224 224 224 232 224 224 232 224 224 186 64 80 80 66 72 114 168 202 192 192 192 186 192 186 186 186 186 186 192 186 186 192 192 192 186 186 186 186 186 184 186 184 176 168 168 168 184 168 186 168 184 168 184 176 184 168 184 168 186 184 168 168 144 120 128 160 152 144 114 120 160 168 168 168 168 168 144 80 144 168 128 160 120 144 152 152 96 120 120 66 120 120 120 152 128 128 160 152 152 144 104 114 136 128 152 98 160 104 104 144 114 120 104 128 114 120 120 104 104 96 96 114 96 104 104 114 96 104 114 104 104 96 88 96 96 104 96 88 104 96 98 114 104 80 80 88 96 96 96 88 96 66 80 80 88 72 96 104 88 66 88 98 88 96 80 80 98 80 66 56 88 80 96 80 80 104 96 104 96 96 104 128 114 128 152 160 168 176 160 168 160 160 128 114 168 168 186 186 144 168 66 88 80 80 72 88 66 80 80 88 88 80 96 96 80 88 88 96 96 96 96 96 88 96 96 96 96 96 96 96 96 96 96 88 96 96 96 96 104 104 128 224 224 208 202 224 224 224 232 224 224 224 224 224 232 232 224 224 224 186 56 80 104 168 208 202 192 200 192 192 192 192 192 186 186 186 192 186 186 192 186 186 186 186 192 192 186 184 184 184 184 184 184 168 184 168 184 168 184 168 184 176 168 168 168 168 168 184 168 184 168 168 168 184 168 168 168 144 128 152 160 128 120 184 168 152 168 56 152 160 120 104 144 152 152 128 160 168 144 114 160 120 144 144 168 114 152 120 128 128 128 128 98 152 98 112 152 120 98 120 114 104 96 114 96 96 114 98 104 96 66 104 72 98 104 114 98 96 98 98 114 80 104 88 98 80 96 88 98 96 80 96 96 66 96 80 88 66 96 66 56 72 56 72 66 80 66 88 80 66 72 80 80 66 66 66 96 80 66 72 66 88 64 66 88 96 114 144 144 152 186 184 168 186 168 128 144 152 128 168 184 184 202 144 168 184 184 144 168 56 66 80 80 80 66 80 64 88 88 88 88 80 88 88 96 88 96 96 88 88 96 88 96 96 96 96 96 96 96 96 88 88 96 96 80 88 88 88 96 96 128 224 224 208 192 224 224 224 224 232 224 232 224 232 224 232 224 232 224 168 128 192 208 192 186 200 202 192 202 192 192 186 192 186 192 192 192 186 192 186 186 192 186 192 186 186 186 184 184 184 184 168 168 184 168 168 168 184 184 168 176 168 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 160 168 168 168 160 128 96 114 98 176 120 152 104 168 144 152 160 168 168 128 128 152 114 128 144 144 136 160 160 96 144 144 152 144 128 98 114 112 104 104 152 98 120 128 114 88 120 88 88 104 96 104 104 80 120 104 104 96 104 98 104 96 88 96 104 104 80 88 96 80 96 88 98 96 88 96 66 80 96 88 66 80 56 80 80 66 66 66 80 66 80 80 80 80 64 96 56 56 80 50 96 72 96 114 144 104 128 168 114 168 168 184 168 168 160 152 104 128 168 168 186 192 186 184 184 186 120 152 184 160 186 34 80 56 66 72 72 56 56 66 80 66 88 80 66 80 88 88 96 88 80 88 88 88 96 88 96 88 88 72 80 96 88 88 96 80 88 80 80 80 80 66 80 120 224 224 208 208 208 224 224 224 224 224 224 224 224 224 224 232 224 224 168 184 192 202 192 192 192 192 202 192 192 192 186 192 186 192 192 186 192 186 186 186 186 184 184 184 186 184 186 184 184 186 184 184 168 168 184 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 184 168 168 168 168 168 168 168 152 120 152 160 168 152 98 168 160 152 104 168 168 128 160 152 144 144 152 128 152 144 104 144 120 144 152 104 152 114 128 128 128 136 114 114 128 120 114 104 120 104 104 114 88 98 88 88 80 98 96 104 98 96 114 96 96 96 88 80 98 80 96 96 88 96 98 80 96 96 66 88 88 66 80 56 64 66 72 80 56 66 66 80 64 64 56 56 80 56 72 56 56 88 98 56 128 128 144 160 168 168 168 160 114 168 144 144 152 152 144 144 128 184 186 114 192 168 192 184 184 184 168 202 128 168 144 168 56 64 66 56 56 56 56 66 56 66 66 64 66 56 66 80 72 80 80 66 80 80 80 88 88 80 80 80 66 66 80 80 80 66 80 72 66 80 72 80 66 80 66 128 224 224 224 208 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 184 202 192 192 192 192 192 192 192 192 192 186 192 186 192 186 186 192 186 184 184 186 184 186 186 186 186 184 186 186 184 184 184 168 184 168 168 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 168 184 168 160 160 152 88 160 168 160 168 160 152 114 128 168 152 120 104 128 128 144 128 144 144 128 144 144 152 98 128 120 104 144 114 128 144 114 114 144 120 120 104 120 104 120 96 114 104 104 114 104 104 88 96 98 88 96 98 88 96 96 88 98 88 96 66 96 96 88 88 96 96 80 96 88 98 80 80 88 80 88 80 56 56 56 66 56 56 64 66 66 66 66 66 96 66 96 120 144 160 168 152 152 168 168 168 186 184 160 152 144 114 128 144 144 152 168 168 152 160 186 114 186 160 168 192 160 168 128 114 104 114 144 50 64 56 56 56 56 56 56 56 56 80 56 56 66 56 56 56 80 66 64 72 80 80 80 80 80 80 66 80 56 66 56 66 56 64 64 66 80 66 66 66 66 72 66 128 224 224 208 208 208 224 224 224 224 224 224 232 224 224 224 224 224 224 160 184 192 202 200 192 192 192 192 192 186 184 186 186 186 186 186 184 186 186 192 186 186 186 192 186 186 186 186 184 184 184 184 168 184 168 184 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 184 152 104 128 152 114 128 120 80 114 128 114 128 114 120 128 128 152 152 152 120 120 128 128 120 120 128 144 144 152 144 128 144 120 104 144 128 104 120 114 104 114 114 114 114 120 104 96 104 120 88 120 96 96 88 104 96 114 96 96 80 88 98 80 96 80 98 80 88 72 80 88 88 88 80 80 88 96 88 80 80 66 72 80 66 50 72 66 56 56 50 64 66 56 120 152 168 168 168 168 168 168 168 184 152 152 168 152 114 136 128 168 144 144 168 152 160 168 184 144 168 152 168 168 152 168 152 160 120 152 168 120 202 104 34 56 56 56 50 56 50 50 56 56 64 56 50 56 80 34 66 66 64 66 80 66 64 56 80 66 64 66 64 66 66 64 66 56 72 66 66 64 66 80 66 56 56 56 56 120 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 160 186 202 192 192 192 192 192 192 202 186 186 192 186 192 186 192 192 186 184 186 186 186 186 186 184 184 184 168 184 184 184 184 184 184 168 184 168 184 168 168 168 168 168 168 168 168 168 168 168 168 168 114 152 168 168 168 120 168 160 168 168 120 152 128 136 152 120 128 114 144 144 152 104 104 152 128 114 128 104 120 128 120 96 144 128 114 114 96 120 114 104 114 80 104 112 96 98 104 104 104 104 96 96 104 88 96 98 88 80 98 104 96 98 80 98 98 96 98 96 96 96 88 56 80 80 88 96 88 96 56 88 56 56 80 56 80 56 66 80 80 128 168 144 168 144 186 184 168 168 176 168 168 120 160 114 98 136 160 152 168 128 168 160 152 152 160 152 160 168 160 152 168 184 104 152 144 120 168 152 144 152 152 168 88 50 56 56 66 56 50 50 34 34 34 50 56 66 34 56 56 56 56 66 66 66 66 56 66 66 66 66 66 64 56 56 66 56 64 66 56 66 56 56 80 66 66 64 56 72 66 120 224 224 224 208 224 224 224 224 224 224 232 232 224 224 224 224 224 224 168 120 186 208 202 192 192 186 192 192 192 192 186 192 186 192 186 184 184 184 184 186 186 184 184 168 184 168 184 176 184 168 184 168 184 184 168 168 176 168 168 152 152 160 160 184 168 168 168 168 168 168 168 160 168 168 128 168 160 168 152 152 144 96 160 144 120 144 120 128 104 120 160 144 98 144 144 136 120 98 128 120 144 112 114 98 98 114 114 104 114 80 104 98 96 104 88 98 96 96 88 98 96 88 96 96 88 104 104 96 104 98 88 80 98 80 88 80 96 88 66 80 96 80 66 80 80 80 80 88 66 66 66 96 104 152 120 160 88 120 168 176 168 184 168 120 152 184 168 168 144 128 160 128 98 168 98 168 168 176 184 128 152 120 152 160 152 152 152 168 114 128 98 152 168 114 152 152 186 152 144 202 152 34 56 34 50 34 56 50 56 34 56 34 56 64 66 56 24 64 56 56 56 66 64 66 64 66 64 64 64 56 66 66 64 56 56 56 56 56 66 56 56 56 64 64 56 66 56 64 56 120 224 224 224 202 208 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 202 184 160 186 192 192 192 186 192 186 186 192 186 186 186 186 186 184 184 184 184 168 184 184 184 184 168 184 168 184 184 168 184 168 184 184 184 168 168 152 152 160 152 104 114 152 152 168 168 168 168 160 160 152 152 160 160 144 144 128 128 128 88 114 104 114 104 88 104 96 96 120 98 114 120 104 104 114 114 128 98 120 120 98 104 88 98 112 88 88 88 80 88 98 80 104 80 80 98 88 88 88 98 96 96 80 98 98 96 96 96 98 88 104 88 66 98 96 88 80 88 88 98 80 88 96 96 120 152 168 186 192 168 184 186 186 144 128 168 152 184 184 144 88 120 152 104 128 128 168 168 186 168 160 168 168 184 168 184 168 144 160 88 160 114 104 104 96 104 152 120 168 120 144 144 160 144 144 104 96 34 56 56 34 50 50 56 56 56 50 34 50 56 56 56 50 56 56 56 56 56 66 66 56 56 56 56 56 66 56 56 64 56 64 56 64 56 56 56 56 56 66 66 56 56 56 56 56 64 120 224 224 224 202 224 224 224 224 224 224 224 232 224 224 232 224 224 232 224 224 232 224 232 168 168 192 192 186 186 186 184 184 186 192 186 186 184 184 184 184 184 184 184 184 184 184 186 186 186 184 168 184 184 168 168 184 168 168 168 168 168 168 144 152 144 136 88 114 128 152 128 144 152 120 120 144 128 120 128 120 120 128 152 114 98 96 128 114 104 96 120 120 80 104 104 120 96 114 96 114 112 88 114 112 98 114 104 98 96 80 98 98 96 88 98 96 88 80 104 80 88 80 98 88 98 96 88 96 66 88 104 96 104 88 98 88 88 80 88 88 96 120 120 152 160 168 168 168 184 186 176 184 128 186 176 186 168 120 152 120 114 152 128 128 192 168 168 168 184 184 184 186 184 136 152 168 184 168 168 114 96 114 128 114 144 114 128 168 120 160 114 120 120 128 128 184 152 88 50 56 50 56 56 56 50 56 56 56 56 56 50 50 56 56 56 56 56 56 56 64 66 56 56 56 66 56 56 66 56 64 56 64 56 56 56 66 66 66 56 56 66 66 56 64 56 56 80 114 144 202 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 232 168 184 192 186 186 186 184 186 184 184 186 184 184 184 168 184 184 184 184 184 184 184 184 128 160 168 184 184 168 184 160 144 184 184 168 152 144 168 160 168 152 152 144 88 144 152 160 120 114 144 128 80 144 152 144 144 120 104 120 120 114 114 96 104 128 114 104 104 104 114 112 98 104 98 80 104 112 88 88 104 98 80 96 98 88 96 88 98 88 98 96 88 80 96 98 96 88 96 88 96 88 80 96 96 80 96 96 88 104 80 98 88 104 88 144 168 96 192 168 160 168 184 160 160 168 184 168 184 98 176 152 128 114 168 168 128 192 152 152 144 186 160 128 152 184 186 160 186 168 144 120 160 114 104 114 168 152 168 168 98 160 114 120 120 152 144 128 120 114 98 104 80 34 50 50 24 56 56 50 64 56 56 56 56 56 56 56 56 64 56 56 66 66 56 56 56 56 66 56 56 56 56 56 56 56 56 56 56 56 56 66 66 64 66 56 66 66 56 56 56 56 168 240 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 128 192 184 186 186 186 186 186 184 184 186 184 184 184 168 184 184 186 184 184 144 144 160 120 112 120 128 160 160 168 160 98 160 168 160 114 56 160 152 152 144 160 168 144 80 96 104 120 120 152 128 114 128 128 144 120 120 120 104 104 96 114 104 104 114 96 88 98 112 120 114 88 104 98 104 96 88 98 80 88 96 88 88 88 80 80 80 88 96 96 98 80 88 56 88 88 88 96 96 98 80 98 96 66 96 98 120 152 168 152 192 192 144 144 192 114 152 168 160 168 184 152 160 144 168 168 168 104 144 168 176 120 186 168 98 184 128 128 128 168 152 104 144 184 184 128 152 104 114 120 144 168 136 160 184 98 184 128 144 120 120 114 128 168 128 114 114 80 34 24 34 34 64 34 56 66 56 66 56 56 56 66 56 56 56 66 66 64 64 64 56 56 56 56 56 56 56 56 66 56 66 56 56 56 56 56 56 56 56 56 56 56 56 56 56 66 64 56 88 240 224 224 224 224 224 224 232 224 232 232 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 224 224 208 168 186 192 186 186 186 184 186 186 184 184 184 184 186 184 184 176 176 168 184 168 160 186 168 160 168 128 168 104 128 186 104 128 96 128 160 144 120 168 152 128 152 120 98 88 168 120 160 98 104 112 104 114 144 98 114 120 128 104 104 98 96 104 96 96 96 96 98 98 96 104 98 96 96 104 88 96 80 80 96 96 88 88 80 80 96 88 98 88 104 96 98 96 104 80 88 96 96 98 104 96 128 160 80 144 144 160 168 186 152 168 168 152 114 136 168 152 98 160 152 114 144 160 128 144 152 114 104 168 168 98 96 168 114 114 152 152 120 128 160 160 144 176 184 184 114 144 128 120 128 160 114 168 160 98 168 88 168 96 144 114 114 72 56 56 34 24 34 34 34 56 56 64 56 66 66 66 56 66 66 66 56 66 56 56 56 56 56 56 66 66 64 66 64 56 56 56 56 56 56 56 56 56 56 56 56 66 56 64 56 56 64 56 64 56 64 66 240 224 224 224 224 232 224 224 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 104 202 186 184 186 192 186 184 184 176 184 184 184 176 184 168 184 184 184 184 184 168 160 168 168 168 186 152 186 168 168 152 160 184 120 120 152 144 128 168 144 104 128 160 96 96 144 120 114 96 120 80 104 98 128 120 114 112 96 98 72 98 96 96 88 96 88 96 98 96 80 88 96 88 98 88 66 98 88 88 88 96 80 88 88 96 88 98 88 96 96 66 88 104 144 114 114 136 160 152 144 120 184 120 152 144 120 168 98 152 168 120 144 114 114 168 152 184 120 160 128 88 184 160 144 152 152 160 120 184 128 168 98 160 136 128 168 120 128 104 120 120 168 168 144 114 144 98 128 120 144 96 186 80 120 184 98 104 80 56 50 34 34 34 50 50 50 24 50 34 64 56 56 64 66 66 56 66 66 66 64 66 66 66 56 56 66 66 66 66 64 56 64 56 66 66 56 66 64 64 66 66 64 66 56 66 56 64 66 56 56 56 66 56 56 50 168 224 224 232 224 224 232 224 224 224 224 224 232 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 152 192 186 184 184 184 168 184 184 168 184 184 184 168 184 184 168 184 144 144 152 152 152 160 184 184 160 168 160 168 184 168 152 160 144 120 120 144 104 98 128 128 96 98 96 114 88 128 104 104 104 98 114 88 96 114 114 96 80 98 98 88 98 96 96 98 104 96 88 96 88 88 88 88 88 88 80 88 80 80 80 80 98 80 98 104 104 88 98 144 114 176 128 96 202 152 168 104 144 144 128 104 168 128 152 152 128 184 152 128 152 160 128 128 120 144 168 120 144 152 144 120 114 144 160 120 168 168 120 98 152 168 112 144 128 152 120 152 128 88 168 160 104 104 128 144 104 114 128 96 128 144 144 104 80 50 24 34 34 50 34 34 50 56 56 56 34 50 50 50 56 56 56 66 56 56 66 66 72 66 66 56 66 66 66 66 66 56 66 66 66 64 66 66 66 66 66 66 66 56 56 56 56 66 56 56 56 56 56 56 56 56 56 56 56 56 232 224 224 224 232 232 224 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 168 168 168 176 168 168 168 168 184 168 160 168 168 184 168 168 184 168 184 184 168 184 184 168 120 168 184 186 168 160 104 168 98 184 184 128 184 96 114 160 114 114 168 152 114 120 104 98 120 112 96 96 96 96 104 104 88 88 80 88 104 96 96 88 88 96 96 96 88 96 80 80 66 96 96 96 96 66 80 66 80 88 98 128 98 160 152 184 98 144 152 120 152 144 144 152 192 104 184 98 168 114 144 104 152 128 128 144 160 144 144 120 120 152 98 128 160 120 152 160 98 114 200 88 152 144 128 160 160 88 96 152 104 160 120 160 128 160 128 98 120 152 104 104 98 144 114 152 104 152 88 80 24 34 56 24 34 64 34 56 50 34 56 56 56 56 50 56 56 64 56 56 66 56 66 66 56 66 66 56 66 66 66 64 66 66 56 56 66 66 56 64 56 66 66 66 64 64 66 66 64 66 64 66 66 56 66 56 66 66 56 64 56 56 66 114 232 224 224 232 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 208 208 208 192 186 184 168 168 176 184 184 184 184 168 184 168 168 160 168 168 168 168 168 176 152 184 184 160 168 152 168 152 152 144 184 120 168 160 160 128 168 128 144 120 144 144 144 120 144 128 104 144 144 120 114 120 120 128 114 128 120 114 128 144 88 104 104 104 114 104 120 160 96 128 114 120 120 152 120 80 152 128 120 114 98 114 120 96 128 152 114 114 120 80 128 104 120 96 120 120 152 80 144 120 128 152 120 128 128 152 120 144 114 152 144 120 144 168 128 152 104 152 104 168 96 186 98 104 144 96 144 168 152 120 152 144 120 128 80 34 34 8 56 24 34 34 8 50 56 50 34 50 50 34 50 34 50 50 34 50 50 50 56 56 56 50 56 56 50 56 56 56 56 56 50 50 50 56 56 50 56 56 56 56 50 56 56 56 50 56 50 56 50 56 50 56 56 50 56 50 50 50 50 56 50 34 184 224 224 232 224 232 232 224 232 224 232 224 224 224 224 224 224 224 224 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 232 224 224 224 232 224 224 232 232 232 224 232 232 224 240 232 232 232 232 232 232 232 232 232 232 232 232 232 224 232 224 232 224 232 224 232 224 232 232 224 232 232 224 232 224 224 224 224 224 224 224 208 208 208 192 202 192 168 176 160 168 160 144 160 160 152 168 184 168 168 168 184 168 184 168 186 168 184 184 184 168 184 184 168 168 168 160 144 168 168 168 184 184 186 192 186 192 186 192 186 192 184 186 200 192 192 192 192 192 200 186 186 186 186 186 186 184 192 186 192 192 202 192 202 202 202 208 208 202 202 202 192 192 192 192 186 192 186 192 192 192 192 186 192 186 192 192 192 186 192 192 192 186 192 176 168 224 224 224 232 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 232 224 232 224 232 224 224 232 224 232 224 232 224 232 224 224 224 224 224 232 224 232 224 232 224 224 232 224 232 232 224 232 232 224 232 224 232 232 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 224 232 224 224 224 232 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 232 224 224 232 224 224 224 224 224 224 232 232 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 232 224 232 224 232 232 224 232 224 224 224 232 224 232 224 232 224 232 224 232 224 232 232 232 224 232 224 232 224 232 224 232 224 224 232 232 224 232 224 232 224 232 232 224 232 224 232 224 232 224 232 224 232 224 224 232 224 232 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 232 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 232 224 224 224 224 232 224 224 224 224 224 224 224 232 224 232 224 232 224 224 224 224 224 232 224 224 224 224 232 224 232 224 232 224 224 224 224 224 224 224 224 232 224 224 232 224 232 232 224 232 224 232 224 232 224 232 224 224 232 224 232 224 224 232 232 224 224 232 224 224 232 224 232 224 232 224 224 224 232 224 224 224 232 224 232 224 232 224 232 224 224 232 224 224 232 232 232 224 232 224 232 232 224 232 224 232 232 224 232 232 224 232 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 232 224 224 224 224 224 224 224 232 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 232 232 224 224 224 224 232 224 232 224 232 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 232 232 224 232 232 224 224 224 232 224 224 232 224 232 224 232 224 224 232 224 232 232 224 232 224 232 232 224 232 224 232 232 232 224 232 232 224 232 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 232 232 224 224 224 232 224 224 224 232 224 232 224 232 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 232 224 224 224 224 224 232 224 232 224 232 224 224 224 232 224 232 224 232 224 224 232 232 224 232 224 232 224 232 224 232 232 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 232 224 224 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 232 224 232 232 224 232 232 224 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 232 224 224 224 224 232 232 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 232 224 224 232 224 232 224 232 224 224 224 224 232 224 232 224 224 224 232 224 232 224 232 232 224 232 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 232 232 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 224 224 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 224 224 232 224 224 224 224 232 224 232 224 232 224 232 224 232 224 232 224 224 224 224 224 224 224 232 224 232 224 232 232 232 232 224 224 224 224 224 224 232 224 232 232 224 224 232 224 232 224 232 224 224 224 224 224 232 224 224 224 224 232 224 232 224 224 232 232 224 232 224 232 224 232 232 224 232 224 232 224 232 224 232 232 224 232 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 232 224 232 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 camlspotter-camlimages-e471b3c4470d/test/images/appm.ppm0000644000000000000000000214215312405272062021301 0ustar 00000000000000P3 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 266 177 255 228 202 164 228 202 164 236 204 164 228 202 164 232 203 164 235 204 168 236 204 164 232 203 164 232 203 164 236 204 164 235 204 168 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 232 203 164 236 204 164 231 203 168 235 204 168 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 172 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 168 235 204 172 235 204 168 232 203 164 236 204 164 228 202 164 236 204 164 236 204 164 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 228 202 164 235 204 168 236 204 164 232 203 164 236 204 164 236 204 164 236 204 164 232 203 164 236 204 164 235 204 168 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 236 204 164 232 203 164 232 203 164 236 204 164 232 203 164 232 203 164 236 204 164 236 204 164 232 203 164 232 203 164 228 202 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 232 203 164 233 202 160 228 202 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 233 202 160 236 204 164 232 203 164 228 202 164 236 204 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 168 232 203 164 235 204 168 232 203 164 236 204 164 236 204 164 232 203 164 232 203 164 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 232 203 164 229 201 160 236 204 164 236 204 164 236 204 164 232 203 164 236 204 164 232 203 164 231 203 168 232 203 164 229 201 160 233 202 160 232 203 164 232 203 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 235 204 168 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 236 204 164 233 202 160 236 204 164 232 203 164 232 203 164 235 204 168 236 204 164 236 204 164 233 202 160 233 202 160 236 204 164 233 202 160 236 204 164 236 204 164 236 204 164 235 204 168 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 228 202 164 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 235 204 168 235 204 168 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 236 204 164 232 203 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 235 204 168 236 204 164 232 203 164 236 204 164 236 204 164 228 202 164 228 202 164 232 203 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 168 232 203 164 235 204 168 235 204 168 235 204 168 236 204 164 236 204 164 235 204 168 235 204 168 236 204 164 235 204 168 235 204 168 235 204 168 236 204 164 236 204 164 232 202 164 236 204 164 236 204 164 236 204 164 235 204 168 235 204 168 235 204 168 235 204 168 235 208 166 236 204 164 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 236 204 164 229 201 160 232 202 162 232 203 164 234 203 164 234 203 164 232 203 164 231 203 166 234 203 164 235 204 168 235 204 168 235 206 165 236 204 164 235 204 166 235 204 166 236 204 164 236 204 164 232 203 164 235 204 166 235 204 168 235 204 168 236 204 164 236 204 164 234 203 164 235 204 168 236 203 167 233 203 166 234 203 164 235 204 166 235 204 168 232 202 164 235 204 168 235 204 166 235 204 168 235 204 168 235 204 166 235 204 166 235 204 166 233 203 168 230 202 164 233 203 168 235 204 170 232 202 162 234 203 164 235 204 166 234 203 164 232 203 164 231 203 166 229 202 166 234 203 164 233 203 166 232 203 164 234 203 164 235 204 166 232 203 164 235 204 166 233 203 166 233 203 168 236 204 164 236 204 164 236 204 164 233 198 166 234 203 164 236 204 164 236 204 164 234 200 164 234 203 164 232 203 164 230 202 164 235 204 168 235 204 166 233 203 166 233 203 166 236 204 164 236 204 164 234 203 164 234 203 164 232 203 164 232 202 162 236 204 164 235 204 168 234 203 164 231 203 166 234 203 164 235 204 168 235 204 168 236 204 164 231 203 166 230 200 165 230 202 162 230 202 162 236 204 164 234 203 164 235 204 166 236 204 164 234 203 162 233 202 160 234 203 162 234 203 162 234 203 164 230 202 164 232 203 164 232 203 164 235 204 166 235 204 166 233 203 168 234 203 164 235 204 166 234 203 164 232 203 164 234 203 164 233 203 166 233 203 166 235 204 168 235 204 166 233 203 166 234 203 164 234 203 164 234 203 164 236 204 164 236 201 168 235 204 166 234 203 164 233 203 166 230 202 162 234 203 164 232 203 164 235 204 168 232 202 164 232 202 162 230 202 162 235 204 168 230 202 162 230 202 162 230 202 162 230 202 164 230 202 164 234 203 164 232 203 164 236 204 164 235 204 166 235 204 166 233 203 166 234 203 164 236 204 164 235 204 166 236 204 164 232 203 164 234 203 164 236 204 164 230 202 162 236 204 164 235 204 166 235 204 166 235 204 166 235 204 168 235 204 166 235 204 168 235 204 168 235 204 166 236 204 164 234 203 164 232 203 164 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 236 204 164 234 202 165 235 204 166 235 206 165 234 203 164 230 202 162 234 203 164 236 204 164 234 203 162 234 203 164 236 204 164 235 204 166 235 204 168 235 204 166 234 203 164 236 204 164 236 204 164 234 203 164 236 204 164 232 203 164 236 204 164 232 202 162 236 204 164 236 204 164 236 204 164 231 203 166 235 204 166 235 204 166 236 204 164 234 203 164 233 203 168 236 204 164 235 204 168 236 204 164 234 203 164 236 204 164 232 202 162 234 203 164 235 204 168 236 204 164 235 204 166 235 204 166 236 204 164 235 204 168 236 204 164 235 204 168 235 204 166 236 204 164 236 204 164 234 203 164 234 203 162 230 202 162 230 202 162 232 203 164 232 203 164 236 204 164 234 203 164 233 203 166 234 203 162 234 203 164 234 203 164 234 203 164 232 202 162 236 204 164 234 203 164 235 204 166 236 204 164 235 204 166 235 204 166 235 204 166 235 204 168 235 204 166 234 203 164 235 204 166 235 204 166 235 204 168 235 204 166 235 204 166 236 204 164 234 203 164 238 205 166 235 204 166 235 204 166 238 205 166 235 204 166 236 203 165 234 203 164 230 202 164 232 203 164 235 204 166 236 204 164 234 203 164 236 204 164 235 204 166 235 204 166 234 203 164 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 235 204 166 235 204 166 235 204 168 235 204 166 236 204 164 235 204 166 235 204 166 236 204 164 236 204 164 236 204 164 235 204 166 235 204 166 235 204 168 235 204 166 236 204 164 236 204 164 235 204 166 235 204 166 234 203 164 235 206 169 236 204 164 235 204 166 236 204 164 236 204 164 235 204 168 235 204 166 235 204 166 235 204 166 235 204 166 235 204 166 235 204 166 234 203 164 233 203 166 236 204 164 236 204 164 232 202 166 231 203 168 233 203 166 234 203 164 232 203 164 235 204 166 236 204 164 235 204 166 234 203 164 236 204 164 234 203 164 236 204 164 231 203 166 230 202 162 231 203 166 234 203 164 234 203 164 236 204 164 236 204 164 235 204 166 236 204 164 235 204 166 234 203 164 234 203 164 236 204 164 232 203 164 232 203 164 235 204 166 234 203 164 236 204 164 235 206 165 236 204 164 236 204 164 234 203 164 235 204 166 230 202 164 233 203 166 236 204 164 235 204 166 236 204 164 236 204 164 234 203 164 234 203 164 233 203 166 232 203 164 232 202 162 234 203 164 228 199 163 231 201 160 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 232 202 162 230 202 162 232 202 162 234 203 164 234 203 164 234 203 164 236 204 164 232 203 164 234 203 164 234 203 164 236 204 164 236 204 164 234 203 164 234 203 164 234 203 162 236 204 164 235 204 166 235 204 166 236 204 164 235 204 166 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 233 203 166 233 203 166 232 203 164 230 202 162 232 203 164 234 203 164 232 203 164 234 203 164 234 203 164 230 202 164 229 201 160 232 203 164 230 202 162 234 203 164 230 202 164 234 203 164 235 204 166 233 203 168 235 204 166 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 235 204 166 236 204 164 235 204 166 235 204 168 233 203 166 235 208 166 235 204 166 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 230 202 162 236 204 164 234 203 164 236 204 164 236 204 164 235 206 167 234 203 164 236 204 164 236 204 164 234 203 162 234 203 164 234 203 164 234 203 164 236 204 164 235 204 166 236 204 164 235 204 168 231 201 160 234 203 164 236 204 164 236 204 164 235 204 166 235 204 166 236 204 164 233 203 168 236 204 164 236 204 164 233 203 166 235 204 168 235 204 166 235 204 166 235 204 166 235 204 166 235 204 166 235 204 166 234 203 164 235 204 168 236 204 164 235 204 166 235 204 166 236 204 164 235 204 170 236 204 164 234 203 164 235 204 166 235 204 166 235 204 166 235 204 166 236 204 164 234 203 164 236 204 164 235 204 168 234 203 164 236 204 164 234 203 164 234 203 164 232 203 164 234 203 162 234 203 164 230 202 162 234 203 164 236 204 164 236 204 164 232 203 164 232 203 164 231 203 166 236 204 164 236 204 164 233 203 166 236 204 164 233 203 162 236 204 164 235 204 166 235 204 166 236 204 164 234 203 164 235 206 167 235 204 166 236 204 164 235 204 166 230 201 162 232 203 164 235 204 166 235 204 166 236 204 164 234 203 164 236 204 164 230 202 162 232 203 164 234 203 162 234 203 162 234 203 164 235 204 166 234 203 164 233 203 166 234 203 164 235 204 166 236 204 164 234 203 164 235 204 166 236 204 164 235 204 166 235 204 168 236 204 164 235 204 166 232 203 164 236 204 164 235 204 170 236 204 164 236 204 164 235 204 170 235 204 168 234 203 164 236 204 164 235 206 167 235 204 166 235 204 168 235 204 166 235 204 166 234 203 164 236 204 164 236 204 164 235 204 170 235 204 168 235 204 168 235 204 166 235 204 166 235 204 166 236 204 164 236 204 164 235 204 166 234 203 164 232 202 162 236 204 164 233 203 166 232 203 164 230 202 164 233 203 166 236 204 164 235 204 166 236 204 164 236 204 164 232 203 164 234 203 164 232 203 164 232 203 164 236 204 164 235 204 166 236 204 164 234 203 164 236 204 164 236 204 164 230 202 164 235 204 166 235 204 166 236 204 164 235 204 166 235 204 168 235 204 166 235 204 166 236 204 164 236 204 164 235 204 166 233 202 160 236 204 164 236 204 164 234 203 164 232 203 164 236 204 164 234 203 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 164 233 203 166 230 202 164 230 202 164 230 202 164 234 203 164 236 204 164 236 204 164 236 204 164 230 202 164 236 204 164 234 203 164 235 204 166 236 204 164 232 203 164 228 202 164 236 204 164 228 202 164 234 203 164 232 203 164 234 203 164 236 204 164 230 202 164 228 202 164 234 203 164 234 203 164 234 203 164 236 204 164 235 204 166 232 203 164 236 204 164 235 204 166 236 204 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 232 203 164 236 204 164 236 204 164 236 204 164 234 203 164 234 203 164 236 204 164 234 203 164 235 204 166 234 203 164 236 204 164 233 203 166 232 203 164 232 203 164 229 201 160 230 202 162 232 203 164 234 203 164 230 202 164 228 201 162 231 201 160 232 202 162 228 201 162 230 202 164 232 203 164 230 202 162 232 203 164 234 203 164 236 204 164 235 204 166 235 204 166 236 204 164 234 203 164 236 204 164 236 204 164 234 203 164 236 204 164 235 204 168 236 204 164 235 204 166 235 204 166 235 204 166 236 204 164 234 203 164 235 204 166 236 204 164 236 204 164 236 204 164 235 204 166 233 203 166 236 204 164 234 203 164 234 203 162 234 203 164 236 204 164 235 204 166 236 203 167 235 204 166 236 204 164 235 204 166 236 204 164 232 202 162 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 234 203 164 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 234 203 164 234 203 164 235 204 166 235 204 166 234 203 164 236 204 164 235 204 166 235 204 166 235 204 168 236 204 164 236 204 164 235 204 166 235 204 166 236 204 164 236 204 164 236 204 164 234 203 164 233 203 166 236 204 164 234 203 164 234 203 162 234 203 164 236 204 164 236 204 164 236 204 164 235 204 166 235 204 166 235 204 166 236 204 164 236 204 164 232 203 164 234 203 164 234 203 164 236 204 164 234 203 164 230 202 162 234 203 164 236 204 164 235 204 168 234 203 164 234 203 164 234 203 162 235 204 166 232 203 164 234 203 164 235 204 166 236 204 164 235 204 166 234 203 166 235 204 170 236 204 164 234 205 165 235 204 168 236 204 164 236 204 164 235 204 168 234 203 166 236 204 164 235 204 168 235 204 166 234 203 164 236 204 164 233 203 166 235 204 168 235 204 166 236 204 164 234 203 164 232 203 164 235 204 166 235 204 168 236 204 164 233 203 166 235 204 170 236 204 164 236 204 164 235 204 168 235 206 167 235 204 166 236 204 164 232 203 164 230 202 164 235 204 166 236 204 164 235 204 168 237 203 169 235 204 166 233 205 165 235 204 166 236 204 164 235 204 166 233 203 166 235 204 166 235 204 168 235 204 170 235 204 166 235 204 166 235 204 168 236 204 164 235 204 166 235 204 168 235 204 168 236 204 164 235 204 166 231 203 166 235 206 165 234 203 164 236 204 164 233 205 167 234 203 164 235 204 166 235 204 168 233 203 168 233 203 168 235 204 166 234 203 162 235 204 166 234 203 164 235 204 166 234 203 164 233 203 166 233 203 166 229 202 166 235 204 168 235 204 168 232 203 164 236 204 164 234 203 164 233 203 166 233 205 165 233 203 166 236 204 164 232 202 164 233 203 166 235 204 168 234 203 164 235 204 166 233 203 166 236 204 164 235 204 168 232 202 164 232 202 162 236 204 164 234 203 164 230 202 162 234 203 164 236 204 164 236 204 164 235 204 166 232 202 164 236 204 164 233 203 166 234 203 164 232 202 162 232 203 164 236 204 164 232 203 164 236 204 164 236 204 164 236 204 164 234 203 164 232 203 164 236 204 164 236 204 164 235 204 168 236 204 164 232 202 162 232 202 162 233 203 166 234 203 164 234 203 164 232 203 164 234 203 164 230 202 164 232 203 164 230 202 164 233 205 165 236 204 164 236 204 164 233 203 166 234 203 162 234 203 164 236 204 164 236 204 164 235 204 166 236 204 164 235 204 166 236 204 164 234 203 164 236 204 164 232 203 164 235 204 168 234 205 163 236 204 164 234 203 164 234 203 164 234 200 164 232 202 162 233 202 160 232 202 164 234 203 164 232 203 164 233 203 166 233 203 166 230 202 164 231 203 168 230 202 162 232 200 164 234 203 164 234 203 164 234 203 164 229 201 160 230 200 156 229 200 158 230 202 162 230 202 164 234 203 164 228 202 164 228 202 164 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 234 203 164 236 204 164 236 204 164 234 203 164 235 204 166 235 204 166 236 204 164 235 204 166 235 204 166 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 164 234 203 164 236 204 164 234 203 164 234 203 164 236 204 164 235 204 166 235 204 166 236 204 164 234 203 164 236 204 164 234 203 164 231 201 160 234 203 164 236 204 164 234 203 162 232 202 162 234 203 162 236 204 164 234 203 164 234 203 164 236 204 164 236 204 164 234 203 164 235 204 166 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 234 203 164 232 203 164 232 202 162 236 204 164 235 204 168 235 204 166 235 204 166 233 203 166 236 204 164 230 202 164 234 203 164 234 203 164 234 203 164 236 204 164 234 203 162 233 202 160 234 203 164 236 204 164 235 204 166 235 204 166 232 203 164 236 204 164 236 204 164 232 203 164 236 204 164 232 202 162 233 203 166 236 204 164 232 203 164 236 204 164 231 203 166 232 202 162 229 201 160 232 202 162 232 203 164 230 202 164 229 202 166 234 201 166 232 202 164 235 204 166 236 204 164 236 204 164 235 204 168 236 204 164 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 235 204 166 234 203 164 233 203 166 234 203 164 233 203 166 234 203 164 234 203 164 231 203 166 228 202 164 236 204 164 232 203 164 235 206 169 234 203 164 235 204 166 235 204 168 236 204 164 233 203 166 235 204 166 235 204 168 235 204 168 235 204 170 235 204 170 235 204 168 232 202 164 235 204 166 235 204 166 235 204 166 235 206 167 234 203 164 235 204 168 236 204 164 235 204 166 233 203 168 234 203 164 231 203 166 235 206 167 233 203 166 236 204 164 235 204 166 235 204 166 235 204 166 235 204 168 235 204 168 235 204 166 235 204 168 235 204 166 234 203 166 235 204 168 236 204 164 235 206 165 236 204 164 235 204 166 235 204 166 234 203 162 233 203 166 233 203 168 235 204 168 234 203 164 233 203 166 236 204 164 235 206 167 234 203 164 235 204 168 235 204 166 236 204 164 236 204 164 233 203 166 234 203 164 235 204 168 231 203 166 235 204 166 231 203 166 234 203 164 236 204 164 235 204 168 235 206 167 235 204 166 236 204 164 235 204 168 235 204 166 234 203 164 235 204 166 235 204 166 233 202 160 234 203 164 234 203 164 234 201 166 234 203 164 236 204 164 233 203 168 234 203 164 234 203 166 235 204 166 234 203 164 236 204 164 236 204 164 234 203 164 234 203 164 235 204 166 236 204 164 236 204 164 235 204 166 234 203 164 236 204 164 234 203 164 235 204 168 235 204 166 235 204 166 234 203 164 234 203 162 233 203 166 234 203 164 234 203 164 235 204 166 234 203 164 233 203 166 233 203 166 228 202 164 232 203 164 235 204 166 234 203 164 232 203 164 234 203 164 235 204 166 236 204 164 235 204 166 235 204 166 236 201 166 236 204 164 235 204 168 233 203 166 232 202 164 234 203 162 235 204 166 236 203 167 234 203 164 235 204 168 234 201 168 231 201 160 234 203 164 230 202 162 230 202 162 232 203 164 236 204 164 234 203 164 231 203 166 233 203 166 234 203 164 234 203 164 236 204 164 234 203 164 230 202 162 233 202 160 232 200 164 229 201 160 228 202 164 230 202 162 234 203 164 232 203 164 233 203 166 230 202 162 233 203 166 233 203 166 235 204 166 236 204 164 231 201 160 235 204 168 233 203 166 232 202 162 234 203 162 235 204 166 233 203 166 234 203 164 234 203 164 235 204 168 235 204 168 236 204 164 235 204 168 233 203 166 234 203 164 232 203 164 232 203 164 232 202 162 235 204 166 235 204 168 236 204 164 235 204 166 236 204 164 236 204 164 236 204 164 235 204 166 232 202 162 229 201 160 229 201 160 232 202 162 234 203 164 232 203 164 236 204 164 232 203 164 232 202 162 236 204 164 236 204 164 234 203 162 234 203 164 235 204 166 234 203 164 234 203 164 234 203 164 236 204 164 234 203 162 234 203 164 232 203 164 234 203 164 234 203 164 235 204 166 234 201 166 233 203 166 234 203 162 234 203 162 235 204 168 235 204 166 235 204 166 235 204 166 236 204 164 236 204 164 235 204 166 236 204 164 235 204 166 234 203 162 235 204 166 233 202 160 234 203 164 234 203 164 234 203 164 234 203 164 234 203 164 236 204 164 234 203 164 235 204 166 234 203 164 230 202 162 232 203 164 232 202 162 232 203 164 232 203 164 234 203 164 232 203 164 232 203 164 232 202 162 234 203 164 234 203 164 234 203 164 234 203 164 232 203 164 235 204 168 236 204 164 235 204 168 233 203 168 235 204 166 234 203 164 235 204 168 235 204 166 236 204 164 235 204 168 234 203 164 235 204 166 236 204 164 236 204 164 230 202 164 232 203 164 233 203 166 232 202 162 230 202 162 231 203 166 228 201 162 230 202 164 229 201 160 234 203 164 232 203 164 234 203 164 233 203 168 234 203 164 233 203 166 233 203 166 230 202 164 235 204 168 236 204 164 235 206 169 236 204 164 233 203 166 236 204 164 236 204 164 232 203 164 233 203 166 235 204 166 235 204 170 235 204 168 235 204 166 232 203 164 233 203 166 235 204 166 234 203 164 235 204 166 236 204 164 236 204 164 233 203 166 233 203 166 235 204 166 235 204 168 235 204 168 235 204 166 235 204 166 236 204 164 235 204 166 236 204 164 235 204 166 236 204 164 232 203 164 234 203 164 236 204 164 235 204 166 235 204 166 234 203 164 236 204 164 235 204 168 234 203 164 235 204 166 230 202 164 234 203 164 233 203 166 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 235 204 166 236 204 164 236 204 164 234 203 164 234 203 164 234 203 164 235 204 168 236 204 164 232 203 164 233 203 166 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 234 203 164 234 203 164 233 203 166 235 204 168 233 203 166 235 204 166 233 203 166 236 204 164 234 203 164 236 204 164 234 203 164 234 203 164 236 204 164 236 204 164 235 204 166 236 204 164 234 203 164 236 204 164 234 203 164 235 204 166 236 204 164 235 204 168 235 204 166 235 204 166 233 203 168 232 203 164 234 203 164 231 203 166 230 202 162 232 203 164 230 202 162 234 203 164 236 204 164 228 202 164 234 203 164 236 204 164 232 203 164 235 204 166 235 204 166 235 204 166 235 204 166 236 204 164 236 204 164 235 204 168 233 203 166 232 203 164 228 202 164 235 204 168 235 204 168 235 204 168 229 202 166 230 202 164 232 203 164 234 203 164 234 203 164 232 203 164 232 203 164 234 203 164 231 203 166 230 202 164 236 204 164 235 204 168 234 203 164 236 204 164 235 204 166 232 202 164 229 201 160 228 202 164 232 203 164 232 203 164 232 203 164 231 203 166 234 203 164 235 204 166 234 203 164 234 203 162 235 204 166 235 204 166 231 203 166 236 204 164 236 204 164 234 203 164 234 203 164 235 204 166 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 235 204 166 234 203 164 232 202 162 234 203 162 233 203 166 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 233 203 166 235 204 166 235 204 166 236 204 164 234 203 164 233 203 166 234 203 164 234 200 164 234 203 164 232 202 162 234 203 164 232 202 162 235 204 166 236 204 164 232 203 164 236 204 164 234 203 164 236 204 164 235 204 168 232 203 164 230 202 162 234 203 164 231 201 160 230 202 162 234 203 164 235 204 166 234 203 164 235 204 168 236 204 164 236 204 164 232 203 164 231 203 166 234 203 164 235 204 168 235 204 166 236 204 164 234 203 162 236 204 164 236 204 164 234 203 164 236 204 164 234 203 162 232 203 164 232 202 162 233 203 166 236 204 164 235 204 168 235 204 166 232 202 162 234 203 164 234 203 164 232 202 162 231 203 166 234 203 164 231 201 160 236 204 164 233 203 166 235 204 166 234 203 164 235 204 168 235 204 166 230 202 162 234 203 162 232 203 164 233 203 166 235 204 168 236 204 164 235 204 168 234 203 164 235 204 166 234 203 164 235 204 166 236 204 164 236 204 164 235 204 168 235 204 168 236 204 164 236 204 164 236 204 164 236 204 164 230 202 164 234 203 164 232 202 162 234 203 164 236 204 164 231 201 160 234 203 164 231 203 166 235 206 171 235 204 168 235 204 166 235 204 166 235 206 167 235 204 166 233 205 165 235 204 168 236 204 164 236 204 164 236 204 164 236 204 164 230 202 164 234 203 164 236 204 164 236 204 164 232 203 164 232 203 164 235 204 166 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 233 203 166 236 204 164 235 204 166 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 235 204 168 232 203 164 235 204 168 235 204 168 233 203 166 236 204 164 228 202 164 235 204 168 234 203 164 232 203 164 235 204 168 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 235 204 170 233 203 166 234 203 164 234 203 164 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 234 203 164 236 204 164 232 203 164 236 204 164 235 204 166 234 203 164 232 203 164 232 203 164 236 204 164 232 203 164 231 203 166 232 202 162 233 203 166 236 204 164 234 203 164 232 203 164 236 204 164 234 203 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 234 203 164 236 204 164 232 203 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 232 203 164 234 203 164 234 203 164 233 205 165 232 203 164 232 203 164 230 202 164 234 203 164 234 203 164 234 203 164 235 204 168 234 203 164 236 204 164 236 204 164 235 204 166 234 203 164 236 204 164 236 204 164 235 204 168 235 204 168 233 203 166 236 204 164 234 203 164 231 203 166 234 203 164 234 203 164 235 204 170 235 204 168 228 202 164 232 202 162 232 203 164 236 204 164 234 203 164 234 203 164 234 203 164 228 202 164 228 202 164 232 203 164 234 203 164 233 203 166 232 203 164 232 203 164 232 203 164 228 201 162 232 203 164 230 202 164 230 202 164 232 203 164 234 203 164 232 203 164 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 235 204 166 235 204 166 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 235 204 168 236 204 164 234 203 162 233 202 160 234 203 162 230 202 162 234 203 164 236 204 164 234 203 164 234 203 164 236 204 164 236 204 164 234 203 164 235 204 168 235 204 168 236 204 164 235 204 166 234 203 164 232 203 164 236 204 164 234 203 162 234 203 164 236 204 164 230 202 164 235 204 166 232 203 164 234 203 162 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 234 203 166 231 201 158 232 203 164 236 204 164 232 203 164 236 204 164 234 203 164 229 201 160 235 204 166 231 203 166 232 203 164 234 203 164 236 204 164 236 204 164 235 204 166 234 203 164 234 203 164 234 203 162 236 204 164 236 204 164 236 204 164 234 203 162 233 202 160 236 204 164 235 204 166 236 204 164 236 204 164 234 203 166 232 203 164 230 202 164 230 202 164 232 203 164 234 203 162 232 202 162 232 203 164 232 203 164 234 203 162 236 204 164 230 202 164 232 203 164 230 202 164 228 202 164 232 203 164 236 204 164 235 204 168 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 235 204 166 230 202 164 232 203 164 236 204 164 236 204 164 232 203 164 234 203 164 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 233 205 165 236 204 164 235 204 166 232 202 162 228 201 162 235 206 167 236 204 164 235 204 166 235 204 170 235 204 166 235 206 165 235 204 166 235 204 168 235 204 166 236 204 164 236 204 164 235 204 168 233 203 168 235 204 168 236 204 164 234 203 164 232 203 164 232 203 164 234 203 164 234 203 164 232 203 164 232 203 164 234 203 164 236 204 164 236 204 164 234 203 164 236 204 164 232 203 164 231 203 166 232 203 164 236 204 164 233 203 168 236 204 164 235 204 168 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 235 204 168 235 204 168 236 204 164 235 204 166 233 203 166 235 204 168 234 203 164 234 203 164 234 203 166 236 204 164 233 203 166 232 203 164 236 204 164 234 203 164 235 204 166 236 204 164 232 203 164 230 202 162 232 202 162 228 202 164 234 203 164 236 204 164 234 203 164 232 203 164 234 203 164 235 204 166 236 204 164 235 204 166 232 202 162 230 202 164 230 202 164 232 203 164 234 203 164 230 202 164 232 203 164 234 203 164 232 203 164 233 203 166 234 203 164 233 203 166 235 204 170 230 202 164 230 202 162 232 203 164 234 203 164 232 203 164 232 203 164 231 201 160 232 202 162 232 203 164 236 204 164 232 203 164 234 203 164 234 203 164 234 203 164 233 203 166 233 203 166 232 203 164 232 203 164 234 203 164 234 203 164 232 203 164 230 202 164 235 204 166 231 203 168 232 200 166 234 203 164 232 200 166 233 203 166 232 203 164 232 203 164 234 203 164 235 204 168 234 203 164 236 204 164 233 203 166 234 203 164 235 204 168 234 203 164 234 203 164 235 204 166 232 203 164 233 203 166 233 203 166 230 202 164 233 203 166 235 204 168 233 203 168 233 203 166 232 203 164 230 202 164 228 201 162 235 204 166 232 203 164 232 203 164 230 202 164 232 203 164 228 202 164 232 202 162 230 202 164 230 202 162 232 202 162 228 202 164 232 202 162 229 201 160 228 202 164 232 203 164 232 203 164 230 202 164 235 204 166 228 202 164 235 204 166 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 234 203 164 234 203 164 236 204 164 236 204 164 234 203 164 236 204 164 230 202 164 234 203 162 236 204 164 233 203 166 230 202 164 236 204 164 232 202 162 234 203 164 236 204 164 234 203 164 232 203 164 234 203 164 236 204 164 235 204 166 236 204 164 235 204 166 234 203 164 235 204 166 236 204 164 231 201 160 234 203 162 236 204 164 235 204 166 236 204 164 236 204 164 234 203 164 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 162 234 203 164 232 203 164 232 203 164 236 204 164 236 204 164 230 202 164 234 203 164 232 203 164 234 203 164 232 203 164 234 203 164 236 204 164 236 204 164 234 203 162 234 203 164 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 234 203 164 234 203 164 229 201 160 228 201 162 230 202 162 230 202 162 232 203 164 232 203 164 232 203 164 234 203 164 232 203 164 233 203 166 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 234 203 164 236 204 164 235 204 166 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 235 204 166 234 203 164 233 203 166 232 203 164 236 204 164 232 203 164 234 203 164 232 203 164 236 205 166 236 204 164 235 204 166 236 204 164 236 204 164 236 204 164 232 203 164 235 204 166 235 204 166 235 204 168 234 203 164 233 203 166 235 204 166 236 204 164 236 204 164 236 204 164 235 204 172 235 204 170 235 204 170 235 204 168 233 203 166 235 204 166 232 203 164 232 203 164 234 203 164 233 203 166 232 203 164 234 203 164 236 204 164 234 203 164 234 203 162 235 204 166 235 204 166 232 203 164 232 203 164 236 204 164 234 203 164 235 204 168 236 204 164 235 204 166 233 203 166 234 203 164 235 204 168 235 204 168 233 203 166 235 204 166 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 233 203 166 233 203 166 233 203 166 233 203 166 235 204 166 235 204 166 236 204 164 234 203 164 236 204 164 230 202 164 228 201 162 230 202 164 230 201 162 230 202 162 232 203 164 228 202 164 230 202 164 230 202 164 232 203 164 234 203 164 230 202 164 230 202 162 230 202 164 228 202 164 232 203 164 228 201 162 230 202 164 230 202 164 231 203 166 228 202 164 230 202 164 230 202 164 229 202 166 232 203 164 233 203 166 230 202 164 228 202 164 230 202 164 230 202 164 230 202 164 232 203 164 229 201 160 232 202 162 234 203 164 230 202 162 228 202 164 228 202 164 230 202 162 233 203 166 233 203 166 235 204 168 230 202 164 230 202 162 228 202 164 228 202 164 230 202 164 230 202 164 228 202 164 228 202 164 228 202 164 228 202 164 229 202 166 232 203 164 230 202 164 231 203 168 231 203 168 235 204 168 231 203 166 231 203 166 233 203 168 235 204 170 233 203 166 233 203 168 235 204 170 228 202 164 228 202 164 229 202 166 231 203 166 233 203 168 231 203 166 233 203 168 229 202 166 229 202 166 231 203 166 232 203 164 229 202 166 230 200 166 228 202 164 231 203 168 228 202 164 228 202 164 228 201 162 228 202 164 228 202 164 228 202 164 228 199 163 230 199 163 228 199 163 230 202 164 226 200 162 228 201 162 228 202 164 229 202 166 231 203 166 230 202 162 234 203 164 235 204 166 232 203 164 232 203 164 232 203 164 232 203 164 232 203 164 234 203 164 229 202 166 235 204 166 232 203 164 230 202 162 230 202 162 230 202 162 232 203 164 230 202 162 232 203 164 230 202 162 231 201 160 233 202 160 230 202 162 228 201 162 230 202 164 229 202 166 231 203 166 228 202 164 228 201 162 228 201 162 231 203 166 230 202 164 233 203 166 231 203 166 235 204 168 231 203 166 230 202 164 230 202 164 228 202 164 228 202 164 233 203 166 232 203 164 233 203 166 230 202 164 232 203 164 230 202 162 232 203 164 230 202 164 233 203 166 232 203 164 232 203 164 228 202 164 234 203 164 228 202 164 234 203 164 228 202 164 230 202 162 230 202 164 229 202 166 230 202 164 228 202 164 231 203 166 231 203 166 229 201 160 233 202 160 228 201 162 230 202 164 232 202 162 232 203 164 230 202 162 230 202 164 230 202 164 230 202 164 233 203 166 233 203 166 230 202 164 233 203 166 232 202 164 234 203 164 232 203 164 230 202 164 231 203 166 228 202 164 231 203 168 228 201 162 229 200 158 230 202 164 230 202 164 232 203 164 232 203 164 229 202 166 232 203 164 234 203 164 231 203 166 233 203 166 235 204 166 233 203 166 232 203 164 234 203 164 235 204 170 235 204 170 235 204 166 235 204 168 235 204 166 233 203 166 235 204 168 235 204 168 235 204 170 233 203 166 232 203 164 230 202 164 233 203 168 234 203 164 235 204 168 235 204 168 235 204 166 232 203 164 232 203 164 235 204 166 233 203 166 235 204 168 235 204 170 234 203 164 236 204 164 233 203 166 235 204 166 235 204 166 236 204 164 232 203 164 235 204 168 231 203 168 235 204 166 233 203 168 230 202 162 230 202 164 228 202 164 230 202 164 230 202 162 233 203 166 230 202 162 232 203 164 234 203 164 236 204 164 235 204 166 235 204 166 234 203 164 231 203 166 232 203 164 234 203 164 235 204 168 236 204 164 231 203 166 232 203 164 232 203 164 235 204 168 235 204 168 232 202 162 232 203 164 232 203 164 234 203 164 232 203 164 232 203 164 231 203 166 234 203 164 232 200 164 229 201 160 230 202 162 232 203 164 232 203 164 230 202 164 228 202 164 230 202 164 230 202 162 230 202 162 230 202 164 229 201 160 230 202 164 228 202 164 228 202 164 230 202 164 230 202 162 228 201 162 231 203 166 234 203 164 228 201 162 228 201 162 230 202 162 230 202 164 230 202 162 230 202 162 232 203 164 228 202 164 231 203 166 230 202 162 229 202 166 228 202 164 229 201 160 230 202 164 230 202 164 230 202 164 228 202 164 231 203 166 228 201 162 230 202 164 229 201 160 230 202 162 228 201 162 232 200 164 230 202 162 229 201 160 229 201 160 230 202 164 228 201 162 228 201 162 230 202 162 228 201 162 229 200 158 228 201 162 230 202 164 228 202 164 229 202 166 228 202 164 230 202 164 229 202 166 230 200 166 231 203 166 230 202 164 230 202 164 230 202 164 228 202 164 228 202 164 230 199 164 230 199 164 228 202 164 230 202 164 230 202 164 229 202 166 228 202 164 228 202 164 228 202 164 230 202 164 228 202 164 230 202 164 228 202 164 228 201 162 228 201 162 230 202 164 228 202 164 231 203 166 232 198 168 229 202 166 228 202 164 228 202 164 228 202 164 230 202 164 230 200 166 228 201 162 228 202 164 228 201 162 228 202 164 228 201 162 228 199 163 228 201 162 230 202 164 229 202 166 230 202 164 229 202 166 235 204 170 233 203 166 233 203 168 233 203 168 233 202 160 232 202 162 232 202 162 231 203 166 236 201 168 228 201 162 233 203 168 230 202 164 233 203 166 230 202 162 230 202 162 233 203 166 228 202 164 230 202 164 230 202 164 228 202 164 229 202 166 233 203 166 233 203 168 233 203 166 232 202 166 232 202 166 228 202 164 231 203 166 230 202 164 229 202 166 228 202 164 229 202 166 232 203 164 231 203 168 228 202 164 232 203 164 228 202 164 228 201 162 233 203 166 229 202 166 232 203 164 228 202 164 232 203 164 228 202 164 228 201 162 230 202 164 230 202 162 228 201 162 228 201 162 230 202 162 230 202 162 230 202 162 230 202 162 228 201 162 228 201 162 229 201 160 228 202 164 228 202 164 230 202 164 229 202 166 231 203 168 229 202 166 229 201 160 229 202 166 232 202 162 230 202 162 228 201 162 230 202 164 230 202 162 228 202 164 228 202 164 233 202 160 234 203 164 234 200 166 230 202 164 230 202 164 232 202 162 230 202 162 230 202 164 230 202 164 230 200 166 230 202 164 228 202 164 228 201 162 230 202 164 230 199 164 232 202 162 229 202 166 230 199 164 230 202 164 229 202 166 231 203 168 232 202 164 230 202 164 232 202 161 233 203 168 234 203 164 230 202 164 232 203 164 230 202 162 235 204 168 230 202 162 235 204 166 230 202 164 233 203 166 235 204 170 235 204 168 235 204 166 235 204 166 231 203 166 230 200 166 231 203 166 230 201 162 232 203 164 233 203 166 235 204 166 232 202 162 233 203 166 235 204 170 235 204 166 235 204 166 236 204 164 236 204 164 235 204 166 234 203 164 235 204 168 235 206 167 228 202 164 235 206 167 233 203 168 236 204 164 230 202 164 233 203 166 228 202 164 228 202 164 228 202 164 228 201 162 228 201 162 232 203 164 235 204 166 233 203 166 234 203 164 235 204 168 235 204 168 233 203 166 231 203 166 229 202 166 233 203 166 235 204 166 235 204 168 229 202 166 233 205 167 233 203 166 234 203 164 233 205 165 237 205 168 233 207 166 231 207 166 235 208 166 239 208 167 241 209 167 231 207 166 234 207 167 232 204 165 237 205 166 231 207 166 238 208 167 231 205 167 231 203 166 231 203 168 231 207 166 231 207 166 236 208 167 237 208 167 234 207 167 240 209 170 238 210 173 239 213 173 239 213 173 239 216 177 239 216 177 241 216 177 241 216 181 241 216 177 236 206 167 235 212 174 239 213 173 235 209 173 239 213 173 235 209 173 233 209 174 236 209 170 242 211 173 237 213 177 239 213 173 236 210 175 239 212 171 241 213 177 241 213 173 239 216 181 235 212 177 228 203 169 225 200 165 216 193 160 227 198 162 221 196 163 224 195 160 222 195 161 221 193 160 218 191 157 218 191 157 218 189 154 215 186 157 217 191 155 219 191 161 221 196 161 221 196 163 218 194 160 224 198 164 220 193 159 217 193 160 216 191 156 223 193 161 223 195 164 213 191 162 217 185 156 207 181 148 213 184 153 213 184 153 211 184 152 202 181 151 205 182 151 205 179 147 205 183 148 208 181 150 207 180 150 215 187 157 213 189 151 213 189 153 208 185 154 209 186 152 206 185 156 212 188 158 206 184 155 210 185 156 211 187 155 211 188 156 209 187 154 216 190 160 213 191 156 213 191 154 218 194 159 216 189 158 219 195 158 215 187 157 217 187 157 211 185 156 211 189 154 208 183 152 204 179 145 211 184 147 206 182 146 205 184 147 203 180 149 203 177 148 206 180 146 211 184 152 212 186 151 219 189 152 224 194 158 222 190 155 216 192 154 226 193 159 229 199 163 226 196 161 229 197 167 223 196 161 224 194 160 226 188 153 221 190 155 226 198 160 224 194 158 221 188 157 226 196 161 230 201 162 226 196 163 223 193 158 232 199 162 229 199 163 230 199 159 223 193 158 227 196 160 232 202 162 226 196 163 229 199 165 230 202 164 241 209 169 242 211 173 241 210 172 241 209 169 242 211 175 240 213 175 243 214 173 238 208 168 240 213 175 241 213 173 241 216 179 239 216 177 239 216 174 239 216 174 240 215 172 240 215 170 239 216 174 240 215 170 240 215 172 241 216 174 243 217 177 239 213 173 241 213 173 239 212 171 240 209 168 237 208 167 242 210 170 238 209 170 238 210 173 238 210 173 239 216 174 239 213 177 240 213 179 239 216 177 240 212 169 239 213 173 238 210 173 239 216 174 240 212 169 239 208 166 239 216 174 239 216 174 240 215 172 241 213 171 239 212 171 238 208 168 238 208 168 238 207 165 239 209 171 239 209 171 238 209 170 238 209 170 239 209 171 238 210 173 237 208 167 238 209 170 238 210 173 241 213 173 238 209 170 239 209 171 237 208 167 237 208 167 240 209 170 237 204 164 238 208 167 236 208 167 236 205 166 234 202 165 238 205 166 240 203 168 234 202 165 232 203 164 232 204 163 234 202 165 234 203 164 236 203 165 237 204 164 231 203 166 234 202 165 234 205 165 232 203 164 232 202 164 231 203 166 234 203 164 228 202 164 228 202 164 233 203 168 236 204 164 235 204 166 235 204 168 234 203 164 236 204 164 235 204 166 236 204 164 235 204 166 236 204 164 236 204 164 228 202 164 231 203 166 235 204 172 236 204 164 232 203 164 232 203 164 230 199 164 232 202 164 230 199 164 230 202 164 228 201 162 234 203 164 236 204 164 235 204 166 235 204 168 235 204 170 235 204 170 231 203 166 223 199 164 217 190 156 216 194 161 214 191 159 196 179 146 203 180 152 166 147 123 146 131 105 142 124 105 141 122 102 143 125 106 131 117 104 130 125 104 129 119 103 129 119 103 126 113 96 123 109 92 123 109 92 126 111 96 132 117 100 131 115 98 132 115 98 132 118 104 135 114 98 133 118 98 136 122 102 132 115 99 130 113 96 132 115 101 130 115 98 121 103 92 114 101 90 104 99 89 112 103 93 106 96 86 102 92 83 101 87 82 100 90 82 97 86 78 90 82 73 84 82 75 89 80 72 87 80 72 84 77 70 85 78 69 81 70 66 81 77 68 83 75 69 69 59 55 69 60 55 72 65 61 68 62 58 70 62 58 72 67 61 72 68 64 63 61 52 113 102 92 131 121 100 137 125 111 134 124 108 133 116 102 129 119 105 140 121 106 142 129 107 149 130 108 153 135 112 149 133 110 149 131 106 81 72 68 54 47 38 57 48 42 54 46 41 52 47 44 52 49 46 54 47 44 53 47 46 56 48 44 59 47 46 59 47 46 82 68 58 157 141 121 153 140 116 155 142 116 155 142 116 159 138 116 153 136 117 147 131 117 152 136 115 148 134 112 146 131 113 162 148 125 63 59 52 53 44 40 51 44 40 52 47 44 51 45 41 47 40 37 49 43 36 50 43 43 49 45 42 49 46 40 50 43 43 54 49 43 50 41 38 50 45 37 51 44 40 51 47 38 47 45 41 49 44 40 50 42 36 52 47 40 54 46 41 50 43 38 45 47 42 46 49 44 47 47 43 46 45 46 48 42 39 50 44 44 47 47 41 44 47 44 47 47 43 48 42 44 51 49 45 51 48 42 46 49 44 50 47 44 47 45 42 51 49 45 48 41 38 48 41 43 48 48 46 47 45 42 47 45 42 47 47 43 50 46 46 49 44 40 46 43 40 46 43 40 49 46 40 47 45 42 45 44 38 48 41 43 48 41 43 46 44 43 50 47 44 50 47 44 50 45 43 43 43 41 46 44 43 53 47 49 53 52 49 56 56 53 58 58 57 54 51 50 64 62 57 65 64 59 68 68 61 64 62 57 71 68 59 76 77 71 73 76 66 77 75 65 73 71 67 81 80 74 84 77 75 85 80 72 87 81 74 85 80 75 84 78 72 80 73 68 78 79 68 70 77 65 76 72 65 76 75 68 72 72 61 71 64 59 71 65 60 73 67 62 74 71 64 71 67 58 82 76 72 73 74 68 82 79 71 77 75 71 77 76 71 81 83 72 73 75 62 80 76 68 77 75 71 83 79 70 89 82 78 93 86 76 87 85 75 88 84 75 89 87 77 92 87 77 94 91 78 102 98 86 101 96 80 102 94 83 104 97 83 100 93 79 99 92 76 98 96 82 98 93 86 100 94 82 100 91 79 96 89 77 103 94 78 105 96 84 112 103 89 113 106 93 110 103 87 110 102 92 115 104 92 124 113 99 123 115 101 133 120 103 123 115 103 123 111 98 121 110 95 126 116 99 126 113 99 123 111 95 117 109 93 122 112 95 119 110 92 125 112 93 123 112 98 152 134 110 235 209 172 230 202 162 236 204 164 235 204 166 232 203 164 235 204 166 234 203 164 230 202 164 236 204 164 234 203 164 235 204 166 234 203 164 235 204 166 233 203 170 235 204 166 236 204 164 234 203 164 232 203 164 232 203 164 235 204 168 234 203 164 230 202 164 234 203 164 235 204 166 231 203 166 233 203 166 236 204 164 233 203 166 229 202 166 233 203 166 236 204 164 235 204 168 235 204 170 233 203 168 231 203 166 181 163 139 51 49 46 61 55 52 67 63 60 73 69 68 73 69 66 83 75 74 83 76 72 83 76 72 85 78 75 83 79 76 85 74 74 86 79 77 91 83 77 87 80 75 92 86 80 91 84 79 89 83 79 90 85 80 89 86 76 90 88 78 89 86 76 89 84 78 85 82 75 86 80 74 89 84 78 89 84 78 88 82 74 88 82 74 84 80 74 86 78 72 84 80 74 82 80 76 87 80 73 82 80 72 86 80 73 86 80 71 87 80 73 83 78 67 85 76 71 78 76 68 85 76 71 78 76 68 86 78 72 85 76 71 85 76 71 85 76 74 82 76 70 77 70 66 62 54 53 62 54 52 59 52 49 60 54 53 64 56 53 63 58 51 88 84 71 167 158 139 164 148 130 164 148 130 162 147 128 164 148 127 162 149 129 162 148 126 162 148 126 162 147 128 168 155 132 168 151 129 172 150 126 61 57 51 64 60 53 65 60 54 62 58 52 61 58 53 63 58 54 63 58 54 64 60 55 64 60 55 58 51 45 98 87 71 187 169 149 178 162 137 172 154 132 168 153 130 168 153 130 170 154 132 168 155 132 162 148 125 164 148 127 166 156 133 172 157 137 86 66 59 61 55 54 64 58 53 65 60 54 64 58 53 66 60 53 65 60 54 65 60 54 64 58 53 61 56 54 61 54 51 64 56 53 62 54 52 60 52 52 64 58 53 62 56 53 61 52 49 62 55 49 64 58 53 66 60 53 65 60 54 69 62 57 67 60 55 63 58 54 64 60 55 63 58 54 63 58 54 64 60 55 66 64 56 64 58 53 65 60 54 67 64 55 63 58 54 65 60 54 63 60 57 64 62 55 63 60 57 61 56 54 59 54 51 58 58 54 62 56 52 63 60 57 63 60 57 63 58 54 62 58 55 65 60 54 63 58 54 62 56 53 65 60 54 61 56 54 60 58 53 61 58 55 63 60 57 66 62 57 64 60 55 64 60 55 65 60 54 64 62 55 63 58 55 64 60 55 63 60 54 61 56 54 60 52 52 57 53 45 64 54 54 61 53 49 60 54 53 63 58 54 64 60 55 65 58 56 64 60 55 63 56 54 65 58 57 64 56 52 61 56 54 63 58 54 63 58 54 63 58 54 65 60 54 66 62 56 65 60 54 65 60 54 68 56 56 64 58 53 64 56 53 66 62 56 68 60 52 62 60 53 66 60 53 65 60 54 66 60 55 65 55 53 63 60 57 65 62 54 63 58 54 64 62 57 65 64 54 69 60 58 65 62 54 70 60 56 64 58 53 66 59 52 64 58 53 63 58 54 62 56 53 60 54 53 62 55 48 62 53 49 63 55 51 62 54 52 62 56 53 60 54 53 64 58 53 65 58 54 67 62 55 62 58 55 59 57 50 63 58 54 64 60 55 61 56 54 60 54 53 59 54 51 63 57 50 64 58 53 67 62 55 65 60 53 62 62 54 63 62 56 59 62 56 66 60 53 64 62 54 64 60 55 64 58 53 65 58 49 63 58 54 64 60 55 61 56 54 59 54 51 60 57 48 58 54 53 48 41 35 237 210 176 232 203 164 232 202 162 232 203 164 235 206 165 228 201 162 233 203 168 234 203 164 234 203 164 238 203 167 233 203 168 235 204 170 235 204 168 233 205 167 235 208 166 235 208 166 235 206 169 228 202 164 233 203 168 233 203 168 235 204 168 235 204 168 234 203 164 233 203 166 234 203 164 232 203 164 235 204 168 233 203 166 234 203 164 233 205 165 235 204 166 233 203 166 234 203 164 228 201 162 237 212 172 128 111 93 86 82 78 90 86 78 92 84 78 92 85 78 89 86 76 89 84 78 89 84 78 89 84 78 90 85 80 89 84 76 89 84 76 90 85 80 92 85 78 89 84 76 89 84 76 89 84 76 89 84 76 88 84 74 89 84 76 92 84 75 88 84 74 88 84 74 84 80 70 75 70 66 83 78 71 86 78 72 85 76 74 85 76 71 85 76 71 84 80 74 83 78 73 86 78 72 87 80 73 83 78 71 83 78 71 86 78 72 86 78 72 86 78 72 86 78 72 85 76 71 78 76 68 86 78 72 85 76 71 82 76 70 87 80 73 87 82 72 82 76 70 88 82 74 72 66 63 61 54 49 60 54 53 60 54 53 62 56 53 69 61 52 176 163 144 164 150 130 164 149 129 164 151 131 164 152 129 164 154 130 166 151 129 164 151 128 166 149 128 166 153 130 164 150 128 178 162 141 98 88 77 61 56 54 60 54 53 64 56 53 63 60 57 64 56 53 62 56 53 64 60 55 62 58 55 62 53 49 96 85 69 195 177 151 180 160 138 178 164 139 176 159 134 172 155 134 172 154 134 172 155 138 170 155 134 171 156 138 174 159 140 143 136 131 64 55 54 64 58 53 63 60 57 62 58 55 63 60 57 63 55 51 62 54 52 66 60 53 66 60 53 65 60 54 65 60 54 64 60 55 63 58 54 64 60 55 65 60 55 66 60 53 61 56 51 65 60 54 64 60 55 64 60 55 63 58 54 63 58 54 65 60 54 65 60 54 66 60 53 62 58 55 64 62 57 66 62 56 63 60 57 62 58 55 63 58 54 61 54 49 62 56 53 64 58 55 58 56 53 66 58 52 61 60 55 62 58 55 63 60 57 62 56 53 61 54 49 64 58 53 64 60 55 63 60 57 62 56 53 63 60 57 65 60 54 64 60 55 64 60 55 65 60 54 64 60 55 63 60 57 63 60 57 64 60 55 64 60 55 60 54 53 64 60 55 65 60 54 67 64 59 66 62 56 63 60 54 63 58 54 59 52 49 60 52 52 60 52 52 59 54 51 59 54 51 62 58 55 64 60 55 63 56 54 62 58 55 64 60 55 64 60 55 60 60 56 63 58 54 63 60 57 65 60 54 64 60 55 66 60 53 63 58 54 64 60 55 66 60 53 65 60 54 65 60 54 65 60 54 66 60 53 66 60 53 66 60 53 65 60 54 65 60 54 65 60 54 63 58 54 66 58 56 63 58 54 65 60 54 64 60 55 63 60 57 65 62 54 65 62 54 67 66 55 66 62 56 64 60 53 65 60 54 62 56 53 64 56 52 61 56 54 60 54 53 60 54 53 61 53 47 64 58 53 62 56 53 60 54 53 60 54 53 62 56 53 62 54 52 68 64 54 65 60 54 64 58 53 63 60 57 62 58 55 60 58 53 62 58 55 63 58 54 66 62 57 60 60 56 67 64 55 66 62 57 69 64 57 70 66 62 66 64 58 64 62 57 67 60 56 65 60 54 65 57 51 62 56 53 64 56 53 64 60 56 64 60 55 64 60 55 62 58 53 61 56 51 39 38 36 193 176 151 228 201 162 228 201 162 230 202 164 233 205 165 233 203 166 231 203 166 232 203 164 231 203 166 235 204 168 235 204 166 235 204 168 233 203 168 235 204 168 235 204 166 234 203 164 235 204 166 228 202 164 229 202 166 233 203 168 235 204 170 233 203 168 235 204 170 231 203 166 233 203 166 236 204 164 236 204 164 228 202 164 232 203 164 236 204 164 230 202 164 230 202 164 230 202 164 228 201 162 239 213 177 98 90 82 89 84 76 92 84 75 92 85 78 89 84 76 87 80 73 89 84 76 86 80 71 89 84 76 89 84 76 89 84 76 89 84 76 89 84 76 89 84 78 88 82 74 89 84 76 89 84 76 91 87 85 92 85 78 89 84 76 89 84 76 89 84 78 89 84 76 89 84 76 84 80 72 77 70 66 85 76 71 85 76 71 87 80 73 84 80 74 86 78 72 89 84 76 88 82 74 88 82 74 89 84 76 88 82 74 86 78 72 87 80 73 82 76 70 85 76 71 82 76 70 82 76 70 85 76 71 85 76 71 87 80 73 88 82 74 88 82 74 88 82 74 89 84 78 87 80 75 71 64 58 65 60 54 66 60 53 57 48 40 158 144 133 162 151 134 164 154 130 164 150 128 164 156 132 166 151 129 166 155 132 168 153 130 166 153 130 164 156 132 168 155 134 172 161 137 137 122 105 62 51 46 63 58 54 64 54 52 61 56 54 63 58 54 65 60 54 67 62 55 67 64 57 61 58 50 100 91 78 199 179 157 185 168 140 185 167 144 180 164 140 180 161 140 176 160 135 176 160 140 170 155 134 178 161 140 187 172 152 116 102 92 60 51 49 64 58 53 64 60 55 60 54 53 60 54 53 61 56 54 62 56 53 64 58 53 65 60 54 64 60 55 65 60 54 66 60 53 64 58 53 66 60 53 67 62 55 68 60 52 63 60 57 62 56 53 64 58 53 60 52 52 62 54 52 67 62 55 66 56 52 64 62 57 66 60 53 63 58 54 66 62 56 64 60 55 63 58 54 62 56 53 60 52 52 58 52 52 59 52 49 62 58 55 66 62 56 63 58 51 57 53 45 62 52 52 61 56 54 61 56 54 62 58 55 65 60 54 65 60 54 64 60 55 63 60 57 66 58 52 62 58 55 63 58 54 60 54 53 63 60 57 62 58 55 62 58 55 62 58 55 64 60 55 64 60 55 66 60 53 61 56 54 64 60 55 61 56 54 63 58 54 62 58 55 63 58 54 62 58 55 61 56 54 60 54 53 62 56 53 65 60 54 63 58 54 64 60 55 62 58 55 63 60 57 64 60 55 62 58 55 63 58 54 63 58 54 63 58 54 64 60 55 63 60 57 61 56 54 63 60 57 63 60 57 63 60 57 62 58 55 63 60 57 62 56 53 62 58 55 64 60 55 63 60 57 63 60 57 63 60 57 66 62 56 64 60 55 64 60 55 66 64 57 65 62 55 62 58 55 60 54 53 64 60 55 63 60 57 63 60 57 63 60 57 63 60 57 66 64 56 64 60 55 64 60 55 62 58 55 63 60 57 61 56 54 63 60 57 63 60 57 63 60 57 63 58 54 62 56 53 65 60 54 63 60 57 60 52 52 63 60 57 62 56 53 61 56 54 61 56 54 61 56 54 60 54 53 62 58 55 60 54 53 58 54 52 60 52 52 64 60 55 63 60 57 63 60 57 63 60 57 63 60 57 64 60 55 62 58 55 64 62 55 60 54 53 61 56 54 63 60 57 63 58 54 68 66 59 64 58 54 63 60 57 64 60 55 60 58 55 114 99 82 235 206 168 228 202 164 228 202 164 228 202 164 228 202 164 235 204 166 235 204 166 232 203 164 234 203 164 234 203 164 235 204 168 235 204 168 235 204 168 235 204 166 236 204 164 235 204 166 232 203 164 231 203 168 233 203 170 233 203 168 235 204 168 235 204 170 232 202 164 233 203 166 233 203 166 230 202 164 230 202 164 233 203 166 232 203 164 230 202 162 231 203 166 230 202 162 229 201 160 223 208 169 76 66 63 89 84 78 93 86 80 89 84 78 93 87 82 91 83 76 89 84 76 89 84 76 89 84 78 89 84 76 89 84 76 88 84 74 90 85 80 89 84 78 89 84 76 87 80 73 89 84 76 89 84 76 89 84 78 89 84 76 89 84 78 89 84 76 89 84 76 88 82 74 87 82 72 84 80 72 75 71 68 84 80 72 89 84 76 89 84 76 89 84 76 86 80 69 85 78 70 85 76 71 85 76 71 82 76 70 85 76 71 87 80 73 81 73 71 85 76 71 85 76 71 86 78 72 86 78 72 82 76 70 85 76 71 86 78 72 83 78 69 83 78 71 87 80 75 80 74 69 77 70 66 60 54 53 57 52 43 146 136 122 170 155 137 164 152 129 168 153 136 170 155 134 168 155 132 170 154 132 166 155 132 172 155 136 168 155 132 166 155 132 174 157 138 140 125 112 59 55 46 65 60 54 66 60 53 68 60 55 70 60 56 65 62 54 70 62 57 71 64 60 64 62 55 101 90 76 202 181 154 190 170 146 187 167 142 184 168 140 180 164 140 180 164 140 182 164 140 176 158 138 180 164 140 179 166 150 81 74 61 64 59 54 65 60 54 65 58 54 65 60 54 63 58 54 63 58 54 62 56 53 62 58 55 60 54 53 64 58 53 66 60 53 64 58 55 62 56 53 65 60 54 63 58 54 67 64 55 65 60 55 65 60 54 65 60 54 62 56 53 62 56 53 61 52 49 62 54 53 62 54 52 64 58 53 64 56 52 65 64 58 63 58 54 65 60 54 65 64 60 65 53 50 43 43 39 48 48 44 60 54 53 63 60 57 64 60 55 63 55 50 51 49 46 66 59 56 62 60 51 62 58 55 66 62 56 65 60 54 64 62 59 68 64 58 61 56 51 66 62 53 63 60 57 63 60 57 67 64 57 63 60 57 63 60 57 64 60 55 62 58 55 62 56 53 63 58 54 63 60 57 65 60 54 62 58 52 65 58 54 63 58 54 60 52 52 60 54 53 63 60 57 63 60 57 64 60 55 64 62 57 65 60 54 67 62 55 64 60 55 62 56 53 63 60 57 64 60 55 63 60 57 66 62 56 65 58 54 58 58 52 63 60 57 62 58 55 65 60 54 63 60 57 60 56 52 63 60 57 63 60 57 60 54 53 66 60 53 62 56 53 63 60 57 63 60 57 63 60 57 64 60 55 66 62 56 66 62 56 67 62 55 65 60 54 64 58 53 63 60 57 61 56 54 64 58 53 65 60 54 63 60 57 64 62 57 63 60 57 64 60 55 63 58 54 63 60 57 63 60 57 64 58 57 64 60 55 63 60 57 63 60 57 63 60 57 62 58 55 62 58 52 65 60 54 62 58 55 60 54 53 58 52 52 58 56 53 62 56 53 62 54 52 62 58 55 65 60 54 63 60 57 62 58 55 62 58 55 62 60 53 63 60 57 63 60 57 63 60 57 64 60 55 63 60 57 63 58 54 64 60 55 63 60 57 63 60 57 63 60 57 63 60 57 64 60 55 64 62 57 65 60 54 63 60 57 63 60 57 66 62 53 50 44 35 224 202 176 230 202 164 228 202 164 229 202 166 231 203 166 233 203 166 234 203 164 236 204 164 233 203 168 233 203 166 236 204 164 236 204 164 235 204 168 235 204 168 236 204 164 235 204 168 232 203 164 233 203 168 235 204 170 236 204 164 235 204 166 231 203 166 230 202 164 234 203 164 232 203 164 228 201 162 232 203 164 230 202 164 230 202 164 230 202 164 230 202 162 230 202 162 240 214 175 115 108 95 85 78 72 89 84 76 89 84 76 92 84 75 89 86 76 89 84 76 89 84 76 89 84 78 89 84 76 89 84 78 86 78 72 89 84 76 87 80 73 88 82 74 88 82 74 83 80 72 87 82 72 89 84 76 84 82 74 88 82 74 88 82 74 89 84 76 89 84 76 88 84 74 89 84 78 88 82 74 83 78 70 82 76 69 87 80 73 85 76 71 87 80 75 88 82 74 89 84 76 87 82 73 87 80 73 92 86 80 89 84 78 92 85 78 87 80 73 83 80 72 87 80 73 86 80 71 89 84 76 87 80 73 85 76 71 87 80 73 78 74 67 76 70 68 76 72 68 80 76 69 80 74 69 71 67 56 146 138 123 170 154 134 170 151 128 168 153 128 172 155 132 170 155 134 176 156 137 174 157 138 176 155 133 174 154 132 172 155 138 176 158 138 135 125 115 55 50 43 62 56 53 64 58 53 62 58 55 64 58 53 65 60 54 67 60 56 71 62 59 65 55 48 110 89 77 199 182 155 190 171 142 191 170 149 189 167 142 187 167 142 188 164 140 184 164 140 179 162 140 191 172 149 154 142 128 63 57 55 67 64 57 66 58 52 65 60 54 66 58 55 66 62 53 66 64 58 66 60 53 64 60 55 66 59 52 64 60 55 66 60 53 64 58 55 63 58 54 66 58 53 66 60 53 62 56 53 65 60 55 67 62 55 64 60 55 64 60 55 68 60 56 66 58 52 65 60 54 66 58 52 68 60 55 64 60 53 67 60 57 70 60 56 67 64 58 65 62 54 70 66 57 74 70 62 190 177 151 163 157 140 57 49 47 65 60 54 69 62 57 95 86 72 158 145 121 162 151 134 71 57 53 62 58 55 67 62 55 65 60 54 57 53 49 119 113 99 94 87 74 65 60 54 66 64 58 68 64 60 66 62 56 67 66 57 61 60 55 67 62 55 66 64 58 69 64 57 66 62 56 65 60 54 64 60 55 64 60 55 64 60 55 65 60 54 64 60 55 61 60 55 66 60 53 64 62 55 65 60 54 70 66 61 67 66 57 64 62 55 69 66 56 66 64 58 64 60 55 65 60 54 64 62 57 66 64 58 63 60 57 67 60 57 63 58 54 62 58 55 65 60 55 63 60 57 64 62 57 63 58 54 66 62 56 65 60 54 65 60 54 64 60 55 67 62 55 62 58 55 64 60 55 64 58 55 63 60 57 63 58 54 60 56 52 63 56 51 62 58 55 63 60 57 62 58 55 63 60 57 65 60 54 65 60 54 63 60 57 63 60 57 63 60 57 64 60 55 65 60 54 64 62 57 64 62 55 64 62 57 64 60 55 66 62 56 64 60 55 65 60 55 61 56 54 63 58 54 63 58 54 60 54 53 61 54 49 64 59 53 63 58 54 58 53 55 60 56 52 63 56 54 63 58 54 62 58 55 62 58 55 62 58 55 63 60 57 63 60 57 61 56 54 63 58 54 66 62 56 63 60 57 64 60 55 63 58 54 63 60 57 62 58 55 66 64 58 63 60 57 70 68 60 66 62 56 66 62 56 69 68 56 68 66 59 67 66 60 120 107 94 236 209 170 228 202 164 231 203 168 230 202 164 230 202 164 234 203 164 235 204 168 235 204 166 235 204 166 235 204 166 235 204 166 235 204 170 235 204 166 236 204 164 235 204 166 231 203 168 231 203 166 233 203 166 233 203 168 232 203 164 230 202 162 230 202 164 231 203 166 234 203 164 233 203 166 228 201 162 228 202 164 230 202 164 231 203 166 229 201 160 244 218 177 117 107 99 80 74 68 86 78 72 87 80 73 89 84 76 92 84 75 88 82 77 92 85 78 89 84 76 89 86 76 89 84 76 90 85 80 87 82 70 90 88 76 89 84 78 89 84 76 88 84 74 89 86 76 88 82 74 88 84 74 87 80 73 88 82 74 88 82 74 95 87 80 89 84 76 90 86 82 90 85 80 88 82 74 89 84 78 79 72 67 80 76 68 80 74 69 82 76 73 78 74 68 87 80 73 85 80 75 82 78 72 88 82 74 84 76 71 84 80 74 84 80 74 83 74 70 80 74 69 83 78 71 84 76 71 83 78 71 83 74 70 81 76 70 82 76 70 86 78 72 83 74 70 76 74 68 73 66 62 163 148 130 172 155 138 172 157 134 178 157 135 176 157 136 178 159 136 182 164 140 178 160 138 180 160 137 178 161 138 178 164 139 181 166 140 157 145 131 57 43 41 63 60 57 64 58 53 64 58 53 68 60 52 64 60 55 69 60 58 71 66 60 66 54 50 111 100 86 201 187 156 190 170 146 192 172 149 193 175 150 191 173 147 190 168 146 186 164 140 190 171 144 196 177 151 94 88 79 67 55 50 70 62 56 71 64 58 64 62 57 68 60 55 67 64 57 68 60 55 62 58 55 62 58 55 66 60 53 68 58 58 64 58 53 63 58 54 64 62 57 68 60 52 64 62 57 65 60 54 67 64 57 64 60 55 68 60 52 65 62 54 65 60 54 64 60 55 66 62 56 68 62 52 66 62 56 68 66 59 66 60 53 70 60 54 66 62 56 67 64 57 69 64 57 69 66 58 62 60 54 49 38 36 133 116 97 87 75 64 64 60 55 69 64 57 106 97 84 127 114 100 154 141 122 87 79 78 67 66 59 69 66 60 68 63 49 140 134 112 167 149 129 108 96 81 67 57 53 72 68 58 71 66 60 75 70 64 70 66 61 72 66 58 71 62 59 71 64 58 73 64 60 68 66 59 69 66 58 69 66 58 69 62 55 67 62 55 71 66 56 63 60 57 66 60 58 69 66 60 69 66 58 69 64 56 69 64 56 70 66 58 68 64 54 70 68 60 70 68 60 73 70 64 73 72 64 71 70 62 67 62 55 70 68 60 68 66 59 68 66 59 68 66 59 68 66 59 68 66 59 70 70 64 69 68 62 70 68 60 69 66 58 69 66 56 67 64 57 68 66 59 71 66 60 69 64 57 66 62 56 63 60 57 65 60 54 70 64 54 71 66 58 70 68 58 69 68 62 72 70 62 70 66 60 69 66 60 67 64 57 66 62 56 64 62 55 67 64 57 66 64 58 64 62 57 68 66 59 66 64 58 70 68 60 68 66 59 70 68 60 67 64 59 66 62 56 65 60 54 65 60 54 63 60 57 63 60 57 63 60 57 64 60 55 65 60 56 70 64 56 66 62 56 66 62 56 66 64 58 63 60 57 65 60 54 65 62 54 66 62 56 65 61 56 66 62 56 67 64 59 70 68 60 67 66 57 70 66 58 64 58 53 64 62 57 68 66 59 66 64 58 65 64 57 69 64 56 65 62 54 67 64 55 69 66 56 75 70 60 71 68 62 54 52 45 193 172 140 235 209 169 228 202 164 231 203 166 233 203 166 235 204 168 235 204 168 233 203 166 235 204 168 235 206 169 235 206 169 235 206 167 235 204 168 235 204 168 235 206 169 231 203 168 235 204 172 229 202 166 234 203 164 233 203 166 229 202 166 236 204 164 236 204 164 230 202 164 233 203 166 228 202 164 228 202 164 228 202 164 235 206 166 216 198 171 76 68 62 80 77 69 87 80 73 87 80 73 86 78 72 89 84 76 89 86 76 92 86 80 89 84 76 89 84 76 89 84 76 90 87 80 89 86 76 89 84 78 89 86 76 88 84 74 89 84 78 87 80 73 89 84 76 89 84 76 89 86 74 89 84 76 89 84 76 89 84 76 89 84 76 89 84 76 89 84 78 89 84 76 88 82 74 89 84 78 88 82 74 77 70 66 77 72 66 76 72 68 76 76 66 78 74 66 81 74 68 80 74 69 76 72 60 78 74 68 83 78 71 74 68 64 75 70 66 75 70 66 76 72 68 75 70 66 73 68 64 77 70 66 77 72 65 71 70 62 77 72 66 73 68 64 76 76 66 85 83 79 185 169 142 180 162 138 180 164 140 180 164 140 180 164 138 182 166 140 182 166 140 182 164 140 184 164 140 180 164 140 180 164 140 173 157 136 53 49 45 64 60 55 65 60 54 65 60 54 66 62 56 66 62 56 65 60 54 67 64 57 60 53 46 127 114 98 197 180 155 190 171 144 190 171 144 190 171 144 190 170 146 191 174 143 190 170 146 201 180 155 149 133 120 74 64 58 68 68 60 69 68 62 70 68 60 73 68 64 73 68 64 70 66 61 71 68 62 71 68 62 67 64 57 66 64 58 67 64 57 67 64 59 67 64 57 71 66 64 73 68 64 69 68 61 70 68 60 71 68 62 71 66 60 70 66 61 69 66 58 69 66 58 66 64 58 66 64 58 67 62 55 70 68 60 73 68 64 68 66 59 68 66 59 67 64 57 73 68 62 71 70 62 73 72 62 99 94 82 153 141 120 181 164 139 187 173 145 104 95 82 67 64 57 67 64 59 91 85 75 167 156 134 54 47 41 109 97 85 75 74 64 77 68 68 73 66 62 52 52 46 134 122 98 136 117 103 105 94 83 71 68 62 71 68 62 70 68 60 70 72 60 75 70 64 73 68 64 71 68 62 75 66 64 73 70 62 73 68 64 71 70 62 73 68 64 71 68 62 71 70 60 69 68 61 73 72 64 73 72 64 72 72 64 73 72 64 73 72 62 76 72 68 75 70 66 75 70 66 78 76 68 74 72 66 76 74 66 73 72 64 72 72 66 73 72 64 75 68 66 73 68 64 71 68 62 70 68 60 70 68 60 73 68 64 68 66 59 73 72 64 71 70 58 73 72 60 73 70 62 69 68 58 69 66 56 71 66 61 67 66 57 72 68 66 69 68 61 72 72 58 71 70 62 75 70 66 71 68 62 71 68 62 72 70 66 70 70 64 71 70 62 71 68 62 66 62 56 70 68 60 71 68 62 70 68 60 70 68 60 73 70 64 73 70 64 71 68 62 69 68 58 70 68 60 69 68 62 69 68 59 67 62 55 66 64 58 66 64 58 68 66 59 66 64 58 71 68 62 70 68 60 70 68 60 70 68 60 69 68 58 70 68 60 68 66 59 67 64 57 68 66 59 67 65 59 68 66 59 66 64 58 70 68 60 70 68 60 66 64 58 68 66 59 66 64 58 68 66 59 68 66 59 71 68 60 73 70 64 71 66 60 71 70 62 78 72 66 76 74 66 78 75 60 80 74 67 64 58 52 157 145 125 243 220 182 231 203 166 232 203 164 231 203 168 232 203 164 235 204 166 235 204 166 236 204 164 235 208 166 235 204 168 235 204 168 236 204 164 235 204 168 235 204 172 233 203 168 233 203 168 234 203 164 233 203 166 235 204 168 228 202 164 231 203 166 229 202 166 229 202 166 228 201 162 241 213 177 210 189 162 138 125 114 73 66 58 98 89 82 92 84 75 89 84 76 87 80 73 89 84 78 89 84 76 89 84 78 89 84 78 89 84 76 89 84 78 89 84 76 88 82 74 89 84 76 89 84 76 89 84 76 89 84 78 89 84 78 90 86 78 89 84 76 89 84 78 90 85 80 90 86 82 89 84 76 89 86 76 89 84 78 89 84 78 92 85 78 91 83 77 89 84 76 88 82 74 90 85 80 87 80 73 79 74 70 89 84 78 88 82 75 87 80 75 96 88 82 91 85 77 87 80 73 88 82 74 89 84 76 88 82 74 86 78 72 82 76 70 86 78 72 88 82 74 89 84 76 86 78 72 87 80 73 88 82 74 86 78 72 81 78 72 86 77 69 155 144 117 186 165 142 184 164 140 184 166 140 186 166 140 189 167 142 188 166 140 189 168 140 186 164 140 184 164 140 186 164 140 183 167 140 64 62 55 69 64 56 69 66 58 69 64 56 69 64 56 71 68 62 71 62 60 72 64 60 61 58 50 134 119 102 193 173 148 190 169 144 193 175 150 194 177 151 195 180 152 191 173 147 192 176 142 200 184 156 116 106 94 69 63 59 75 70 64 73 68 64 76 72 66 75 70 64 75 70 64 75 70 66 76 72 68 76 70 68 77 71 64 73 72 64 69 66 58 68 66 59 71 70 62 76 72 68 75 70 66 73 70 64 75 68 66 75 68 66 75 70 64 72 68 60 73 66 62 74 70 64 74 72 64 79 70 68 82 70 64 79 72 67 78 72 66 78 76 62 80 74 67 78 72 66 79 70 64 77 71 62 76 72 68 78 76 68 70 66 55 87 84 72 89 83 71 118 111 102 86 80 71 101 95 84 77 72 62 153 139 113 179 164 136 146 132 115 156 147 132 86 80 72 80 74 69 72 66 57 174 165 145 146 128 110 144 130 113 76 67 56 79 74 67 80 74 69 78 74 68 77 72 64 76 72 64 78 76 66 81 72 69 78 74 68 83 78 68 85 78 70 80 76 67 86 78 72 82 76 70 84 80 72 85 76 71 82 76 70 85 76 71 84 80 70 82 76 68 86 78 72 82 76 70 83 78 69 79 72 67 80 74 69 76 76 66 80 76 71 80 76 69 80 76 69 76 72 66 76 74 64 78 72 68 75 70 64 74 74 66 79 70 68 76 76 66 79 76 68 80 76 67 80 76 69 80 76 69 83 74 70 81 73 64 86 78 72 73 72 62 70 66 61 74 72 66 73 70 62 78 76 66 76 76 66 74 72 64 76 74 68 79 73 64 74 74 62 78 74 68 73 70 64 73 68 64 71 68 64 73 70 64 73 68 64 73 72 64 76 70 68 76 76 64 80 76 69 78 74 68 76 74 66 74 68 60 73 68 64 73 70 64 74 72 66 73 72 64 74 72 66 77 72 66 76 74 66 76 74 68 73 72 62 73 72 62 71 68 62 72 68 66 73 68 64 73 70 64 71 68 62 73 70 62 72 69 62 71 68 62 75 70 64 73 72 62 76 74 68 78 76 68 75 70 66 76 74 66 76 76 68 76 74 68 78 74 67 78 74 66 74 72 64 76 70 66 77 71 64 78 74 68 83 78 69 78 73 68 86 77 67 69 67 61 86 81 70 179 162 135 226 201 166 242 214 179 243 217 179 232 202 164 235 204 170 236 204 164 236 204 164 235 206 169 235 204 168 235 204 168 235 204 168 228 202 164 232 203 164 233 203 170 230 202 164 233 203 168 234 203 166 229 202 166 229 202 166 228 201 162 233 205 166 160 143 121 101 91 80 66 59 50 87 80 75 90 85 80 92 86 80 93 86 80 92 86 80 89 84 78 89 84 78 89 84 76 89 84 76 89 84 78 89 84 76 90 86 82 93 87 82 95 87 80 89 86 76 89 84 76 90 86 78 90 86 82 89 84 78 89 84 76 90 87 80 92 84 78 89 84 78 92 82 78 90 86 78 89 84 78 90 86 82 89 84 78 93 89 78 91 92 76 90 85 80 90 85 80 89 84 76 89 84 76 83 78 71 84 78 71 89 84 76 89 84 76 81 78 70 80 76 67 87 80 73 89 84 76 89 84 76 89 84 78 87 80 73 78 74 68 88 82 74 89 84 78 84 80 74 89 84 76 88 82 77 90 85 80 80 74 69 85 81 79 108 98 86 194 175 150 190 171 144 190 169 144 190 168 146 191 173 147 190 171 144 190 171 142 189 169 142 188 166 140 189 168 140 189 167 146 82 73 63 73 68 64 71 68 62 75 70 64 75 66 64 77 72 64 76 68 66 78 74 64 70 58 49 150 132 113 203 185 151 192 175 147 193 176 149 198 179 151 193 175 150 193 178 149 199 181 153 162 143 126 85 71 66 77 72 65 81 75 64 81 74 68 83 78 71 82 76 68 80 76 69 80 76 69 78 74 64 81 75 66 78 74 68 78 74 68 76 76 68 74 72 66 74 72 64 76 74 64 78 74 68 78 74 66 83 76 69 82 76 70 80 76 65 80 74 67 84 76 71 82 76 70 81 72 69 80 76 67 80 76 67 86 78 72 79 74 67 84 80 70 86 78 72 86 80 71 86 78 72 80 76 69 84 80 70 82 76 70 85 78 70 83 78 69 79 71 63 159 144 126 105 93 88 121 116 100 97 90 78 83 75 67 68 65 57 71 66 62 84 76 71 87 79 70 87 82 72 89 86 72 84 80 72 124 115 95 194 173 148 81 69 62 83 78 69 83 78 71 88 84 74 87 82 71 87 82 72 88 84 75 87 80 73 88 84 74 89 84 76 89 86 76 88 82 77 92 85 78 86 80 71 88 84 74 87 82 72 83 78 71 88 82 74 85 78 70 89 84 76 88 82 74 87 82 72 88 84 74 87 82 73 91 82 72 88 82 74 87 80 73 90 80 73 87 80 73 90 86 78 88 82 77 88 82 74 89 84 76 84 80 72 80 74 69 84 80 72 85 78 70 86 80 69 87 82 72 86 80 71 88 84 74 84 80 72 85 78 70 87 80 73 82 76 68 82 78 68 80 74 69 86 80 71 81 76 70 86 80 71 83 78 69 80 76 67 83 78 67 83 78 69 80 76 65 80 76 69 78 74 68 78 74 68 75 71 62 78 74 68 80 76 69 82 76 70 87 79 73 86 80 71 82 76 70 85 76 71 80 76 67 76 74 64 78 74 68 78 74 68 80 76 69 82 76 70 78 76 68 82 76 70 81 73 64 76 76 64 80 76 69 78 76 68 78 76 68 83 78 69 80 74 69 85 76 71 84 80 68 84 78 72 82 76 68 82 76 70 86 78 72 86 78 72 81 76 70 80 76 69 76 76 62 81 78 66 83 78 69 85 82 72 85 82 72 82 76 67 86 80 71 88 84 72 88 84 72 86 80 71 88 84 72 87 82 72 87 80 73 88 82 74 85 78 69 76 75 61 86 79 70 97 82 69 242 214 175 230 202 162 232 203 164 236 204 164 235 204 166 235 204 168 235 204 168 235 204 168 235 204 172 233 203 170 233 203 166 232 203 164 234 203 164 230 202 164 228 202 164 228 202 164 228 202 164 236 209 174 95 86 78 96 87 80 95 86 78 96 89 80 93 86 80 89 86 76 92 86 80 89 84 78 92 86 80 96 88 82 89 84 76 90 85 80 90 85 80 93 88 85 90 85 80 91 87 85 91 87 85 89 84 76 89 84 76 89 84 76 89 84 76 89 84 78 89 84 76 90 86 82 90 86 78 90 88 78 89 84 78 90 86 82 89 86 76 89 84 78 93 89 82 90 87 80 93 88 85 93 88 85 91 87 85 90 86 82 89 84 78 81 76 70 76 68 64 86 83 76 92 86 80 86 77 74 80 74 69 88 84 72 89 84 76 89 84 76 89 84 78 85 80 75 78 72 68 87 80 73 88 82 74 89 84 76 89 84 76 90 85 80 89 84 78 80 74 69 82 76 69 168 150 132 190 168 146 193 175 150 193 178 149 193 175 150 190 170 146 192 172 149 190 171 144 190 170 146 190 170 146 198 179 157 113 102 89 82 76 69 85 75 68 83 74 70 84 76 71 82 76 70 86 78 72 85 76 71 78 70 60 176 159 137 200 181 154 197 180 148 195 180 152 195 180 152 193 176 149 195 173 145 198 176 155 108 95 84 79 72 68 88 84 72 86 80 69 91 84 71 89 84 76 89 84 76 90 87 80 85 80 75 88 82 74 87 80 73 89 84 76 84 80 72 87 80 73 84 80 72 84 80 70 83 78 71 87 80 73 89 84 76 88 82 74 88 82 77 92 86 80 89 86 74 88 82 77 88 84 74 89 84 76 89 86 76 87 80 73 88 82 75 93 86 80 102 91 85 98 88 80 96 89 80 102 90 82 91 84 79 90 86 78 99 88 80 93 89 78 88 84 74 88 84 74 86 78 72 82 76 66 88 84 74 89 84 76 90 86 78 87 80 73 92 87 78 91 84 79 89 82 71 90 88 78 97 90 80 97 94 81 95 84 71 158 141 126 157 140 122 128 116 103 133 116 110 74 67 58 96 87 75 99 89 82 99 91 82 99 90 80 102 91 85 98 89 82 99 91 82 102 90 82 99 90 80 102 90 82 98 88 80 102 91 85 104 95 84 103 93 86 103 93 86 103 92 83 99 90 85 99 91 82 102 91 85 99 90 85 101 95 90 99 91 82 103 92 83 96 89 80 93 90 80 102 90 82 96 90 78 100 93 83 96 91 80 96 89 80 89 84 76 89 84 80 90 87 80 96 89 80 98 88 80 92 85 78 102 90 82 99 89 77 96 87 80 96 88 82 95 87 80 92 86 80 92 86 78 94 91 83 92 86 78 96 88 82 96 88 82 93 90 80 89 86 76 88 84 74 96 87 80 88 84 74 88 84 74 89 84 76 88 84 74 89 84 76 89 86 76 92 85 78 88 84 74 89 84 76 89 86 74 88 84 74 89 84 76 88 82 74 87 80 73 86 78 72 87 80 73 85 76 71 85 78 70 87 80 73 88 84 74 90 88 76 81 78 68 84 80 72 83 77 72 81 78 68 81 72 69 86 82 74 90 83 75 88 84 74 89 84 76 88 84 72 88 84 74 87 80 73 89 84 81 89 84 78 90 86 78 92 87 77 88 84 74 88 84 74 88 84 74 93 83 78 89 86 76 90 88 76 90 88 78 95 87 80 96 90 82 95 87 80 96 88 77 96 89 80 95 87 80 99 90 80 107 95 81 123 109 96 95 83 67 243 217 181 233 203 166 235 204 168 234 203 166 235 204 168 235 204 168 234 203 164 235 206 167 235 204 172 235 204 168 233 203 168 236 204 164 235 204 166 231 203 166 236 204 164 228 202 164 228 202 164 239 213 173 99 89 77 99 91 82 96 88 82 102 90 82 96 88 78 91 87 85 96 90 82 90 87 80 95 87 80 90 85 80 93 86 80 96 89 85 100 92 86 93 87 82 99 89 82 91 88 82 93 88 85 93 87 82 96 90 82 93 88 80 93 87 82 91 88 82 90 85 80 92 85 78 93 87 82 102 91 85 96 89 85 102 88 77 99 89 82 96 89 80 91 90 78 102 91 85 102 91 85 93 88 85 96 89 85 87 80 73 85 80 75 81 76 70 79 74 67 71 68 62 80 74 67 82 74 70 84 74 67 87 79 70 85 82 72 84 80 72 84 80 72 85 77 70 83 76 74 84 80 72 82 78 72 85 78 75 82 80 72 85 80 77 94 82 69 79 78 74 130 115 98 200 184 155 204 179 150 207 179 150 204 179 150 207 179 150 207 179 150 204 179 150 193 175 150 191 173 144 200 184 155 120 110 97 87 80 71 99 89 77 96 88 82 95 85 73 91 83 77 98 87 77 91 80 74 110 94 85 194 174 147 200 177 150 207 179 150 207 179 150 207 179 150 200 177 150 201 186 159 167 151 129 96 85 76 99 90 85 102 90 82 102 90 82 96 90 82 102 90 82 99 90 80 102 90 82 103 92 83 92 87 78 99 89 77 98 86 75 98 88 80 103 92 83 102 90 82 102 90 82 103 92 83 102 91 85 103 92 83 107 97 87 106 93 84 105 98 88 103 92 83 103 93 86 103 92 83 103 93 86 103 93 86 102 89 80 102 91 85 98 88 80 103 92 83 103 92 83 99 89 83 103 92 83 103 93 82 106 101 89 104 94 82 107 97 87 107 97 87 111 100 88 110 97 86 100 92 79 133 126 108 92 87 69 84 80 70 104 96 87 96 85 74 132 119 107 87 84 67 160 147 125 97 88 80 104 95 83 104 96 87 128 117 102 109 96 86 167 155 136 104 95 81 129 113 94 180 164 144 113 102 88 104 95 85 111 99 87 101 96 84 107 96 84 104 96 87 111 101 91 112 103 92 108 99 88 105 98 88 104 96 87 108 99 88 112 103 90 111 101 91 111 99 87 107 95 85 111 101 91 104 96 87 105 98 88 104 96 87 107 96 84 111 100 89 104 96 87 104 96 87 110 96 86 107 97 87 104 96 87 112 103 90 108 99 88 108 99 88 104 96 87 101 96 84 107 97 87 103 93 86 104 97 85 102 91 85 105 98 88 104 95 80 104 96 87 106 93 84 108 98 86 102 89 80 104 96 87 104 96 87 103 93 86 103 93 86 101 96 84 104 96 87 100 94 84 104 96 87 100 92 82 101 94 83 104 96 87 102 91 85 97 92 83 101 94 84 104 96 87 99 91 83 95 87 80 96 90 82 96 91 80 95 87 80 95 87 80 96 89 80 96 89 85 95 87 80 95 86 78 91 85 77 95 85 75 95 87 80 96 89 80 102 90 82 103 93 86 100 92 86 96 90 82 98 93 84 97 90 83 101 94 83 100 92 82 102 88 77 100 92 81 104 96 87 102 91 85 99 91 82 103 93 86 107 93 86 106 91 85 104 96 87 104 96 87 100 92 86 100 93 83 103 93 86 103 93 86 104 96 87 104 92 86 105 98 88 111 100 89 110 98 90 112 103 90 108 99 88 109 102 89 110 98 88 115 104 91 120 110 94 92 85 73 239 213 177 230 202 164 235 204 166 235 204 168 235 204 166 235 204 168 235 204 168 235 204 170 235 204 168 235 206 167 233 203 168 235 204 170 233 203 166 234 203 164 234 203 164 231 201 160 228 201 162 239 216 181 88 81 72 98 89 82 105 98 88 104 96 87 103 93 86 100 92 86 105 98 88 93 89 82 93 89 82 93 88 85 99 90 85 99 90 85 102 91 85 99 90 85 96 92 85 96 92 85 96 90 82 96 90 82 93 89 82 96 89 80 91 87 85 96 89 85 99 90 85 93 89 82 99 90 85 99 90 85 102 91 85 99 91 82 96 89 85 101 96 85 96 91 80 102 91 85 102 91 85 93 88 85 86 80 74 84 80 72 76 70 68 80 74 71 75 70 62 76 70 65 72 70 62 96 88 78 96 87 80 98 88 80 93 88 80 96 88 82 96 86 77 89 86 76 88 82 77 92 85 78 96 86 77 93 86 80 90 87 80 96 88 78 92 86 73 91 86 81 212 186 157 201 179 151 206 183 156 207 179 150 206 181 153 207 179 150 207 179 150 207 179 150 207 179 150 207 188 161 129 112 96 95 84 78 103 92 83 107 97 89 112 102 87 110 96 86 95 86 78 136 126 107 199 180 149 216 190 159 207 179 150 212 186 155 206 185 159 209 181 151 209 181 151 212 188 158 144 128 113 104 94 82 112 103 90 109 102 91 111 100 89 109 102 89 109 102 89 109 101 86 108 99 88 109 102 89 109 102 89 115 102 92 111 101 91 111 101 91 120 108 96 112 103 90 112 103 90 112 103 92 115 104 91 119 105 92 122 106 96 119 105 94 117 108 98 119 105 92 116 104 93 116 105 95 120 108 94 121 110 94 120 108 96 117 107 96 119 105 92 119 105 88 112 102 90 97 91 82 204 183 154 95 78 68 134 120 104 125 109 96 119 104 94 119 106 88 112 103 90 119 106 96 113 105 89 117 106 96 152 135 118 181 166 136 178 162 138 112 103 89 135 124 112 178 162 135 100 88 78 170 154 130 158 140 124 139 126 108 111 101 87 119 103 90 116 104 93 150 143 127 116 107 93 115 104 91 115 102 92 119 105 95 119 107 92 121 113 94 122 116 100 120 111 94 120 109 98 123 109 96 126 117 102 121 111 97 120 110 94 121 112 101 120 109 98 124 113 98 124 111 96 127 113 102 122 106 96 121 111 99 121 112 101 121 113 97 120 108 94 123 111 98 120 109 98 119 106 96 123 110 98 120 109 98 120 109 98 121 111 97 119 106 98 121 111 97 119 106 98 106 94 87 93 88 79 90 86 77 115 102 92 117 111 94 112 107 91 120 110 94 123 108 100 119 105 94 120 108 96 119 107 92 113 105 90 120 109 98 117 110 96 120 108 96 120 108 94 112 103 90 115 104 91 116 104 93 119 106 96 119 105 92 119 105 94 119 105 94 112 103 90 112 103 90 112 103 90 112 103 90 120 108 94 112 103 92 111 101 91 112 103 92 116 104 93 112 103 93 108 99 88 112 103 92 106 101 89 104 95 83 105 98 88 105 99 91 105 98 88 107 97 87 108 99 88 112 103 92 111 100 89 111 100 89 112 101 88 109 102 89 119 105 94 119 105 94 111 101 91 112 102 92 112 103 92 116 104 93 115 101 91 116 105 95 120 108 94 116 103 93 113 106 95 113 106 95 112 103 92 116 104 93 121 111 97 116 108 96 120 108 96 121 111 97 117 108 98 120 109 98 130 113 102 126 111 102 128 115 100 126 111 100 126 117 102 134 118 106 140 128 112 104 93 81 243 217 179 232 203 164 229 202 166 235 204 168 235 204 166 235 206 165 235 208 168 235 206 165 235 204 168 233 203 170 233 203 168 236 204 164 230 202 162 228 202 164 230 202 164 228 202 164 230 202 164 239 213 173 97 86 79 102 91 85 106 101 89 106 101 89 98 94 87 102 90 82 96 89 85 102 91 85 91 87 85 100 92 86 102 91 85 102 91 85 102 91 85 96 89 85 102 90 82 96 90 82 93 89 82 93 88 85 99 90 85 93 92 83 99 90 85 99 91 82 96 90 82 103 93 86 96 89 85 102 91 85 96 89 85 102 91 85 102 90 82 102 91 85 102 91 85 93 90 80 92 87 78 89 83 76 85 82 74 84 76 73 80 74 69 87 80 73 90 85 80 90 86 78 91 84 79 83 77 71 95 87 80 92 85 76 95 87 80 98 88 80 98 87 77 96 87 80 96 88 77 92 85 78 89 84 78 99 90 80 90 85 80 102 89 80 83 82 72 188 171 147 207 179 150 206 181 153 206 181 153 207 179 150 207 179 150 207 179 150 206 181 153 207 179 150 206 181 153 132 114 102 114 100 87 111 100 89 112 103 92 115 104 91 116 103 91 106 93 84 186 167 143 214 189 158 215 186 153 212 184 152 209 181 151 206 185 159 212 186 155 206 181 153 205 184 156 130 108 89 120 107 96 124 112 100 122 114 102 121 112 101 124 111 98 121 111 98 122 114 102 121 112 101 121 111 96 120 109 100 120 108 94 120 109 92 121 113 94 125 114 99 122 116 97 128 115 100 128 116 104 121 111 96 124 112 98 126 113 100 128 116 100 122 114 99 129 120 105 128 115 101 125 114 101 127 114 100 131 117 102 130 113 104 123 110 98 127 112 100 128 115 104 127 119 101 123 110 97 152 135 122 172 157 132 150 134 114 196 175 147 191 178 153 117 107 96 121 111 96 121 112 101 124 114 99 124 111 98 159 148 130 122 112 89 168 155 135 184 163 137 130 113 102 111 105 89 162 147 124 139 127 110 167 147 128 142 124 106 149 136 114 172 161 147 116 101 90 127 114 100 122 114 102 123 110 101 116 107 93 125 116 104 122 114 99 122 116 100 125 114 101 136 124 108 136 122 108 136 124 108 136 124 108 137 124 107 136 124 110 135 119 102 135 122 108 135 122 108 135 122 110 135 119 102 135 122 106 135 120 106 135 122 108 134 118 106 128 118 105 127 114 100 128 116 105 128 116 105 125 116 101 125 116 104 125 116 103 129 118 106 121 110 98 104 99 89 96 92 83 84 76 62 78 74 69 69 66 62 69 68 61 75 70 64 94 92 82 120 110 99 125 116 104 131 118 106 126 118 106 128 116 105 125 114 98 125 117 99 128 114 103 130 116 106 125 117 99 129 120 100 127 115 102 128 116 105 124 114 103 122 114 100 123 111 100 121 111 96 121 111 97 123 111 100 117 110 96 117 110 96 121 111 96 121 112 101 124 113 98 124 111 98 120 109 98 123 109 98 121 111 96 122 116 100 121 111 98 121 110 94 121 111 99 122 114 99 121 111 99 117 107 96 120 110 92 117 107 96 121 112 101 121 111 99 121 111 96 121 111 97 121 113 97 128 117 103 125 117 99 125 116 100 128 117 101 129 119 103 129 117 101 129 117 101 134 117 104 129 117 101 132 120 102 125 116 104 128 116 105 131 118 106 128 118 105 128 116 102 129 117 101 128 117 103 122 116 100 132 120 106 135 120 106 137 126 109 135 121 104 138 130 109 135 122 106 135 120 106 137 124 107 142 132 116 102 91 83 240 212 174 232 203 164 233 203 168 235 204 166 235 204 166 233 205 165 235 208 168 235 210 167 235 204 168 229 202 166 233 203 168 236 204 164 228 202 164 228 201 162 229 201 160 228 202 164 229 202 166 240 213 179 82 73 66 105 98 88 104 96 87 102 91 85 102 91 85 99 90 85 99 90 85 99 90 85 102 91 85 102 91 85 102 91 85 102 91 85 102 91 85 103 93 86 102 91 85 104 96 87 99 90 85 103 93 86 91 87 85 96 89 85 93 88 85 93 88 85 99 90 85 99 90 85 103 93 86 96 89 85 99 91 82 91 88 82 92 86 80 96 89 85 88 82 74 96 89 85 79 74 67 88 82 77 78 74 68 88 82 77 84 76 73 75 70 64 87 80 75 89 84 76 92 86 80 84 80 72 84 78 70 86 76 74 88 79 74 91 84 79 95 87 76 94 85 79 94 85 79 93 83 78 94 84 76 93 82 75 90 83 75 90 78 67 162 142 122 215 187 154 215 186 153 215 186 153 218 189 155 218 189 155 209 181 151 207 179 150 207 179 150 209 186 157 151 134 116 115 104 90 131 116 100 120 108 94 119 107 92 127 114 98 118 102 87 189 174 149 209 183 154 218 189 155 218 189 155 218 189 155 215 186 153 207 179 150 206 181 153 207 187 159 138 124 108 134 119 104 135 118 100 136 123 103 132 120 104 132 120 104 136 122 108 135 121 104 132 120 104 133 121 104 132 120 104 135 121 104 135 119 102 135 121 104 135 121 104 135 122 108 137 128 109 136 124 105 140 130 109 136 124 105 139 128 109 137 126 110 135 122 106 135 122 106 135 121 104 135 122 106 136 126 107 136 124 108 136 124 110 136 124 108 136 121 106 140 128 112 140 128 112 164 147 124 184 165 144 154 137 114 146 130 112 158 141 127 142 128 107 128 117 101 136 123 106 135 122 106 136 124 108 136 126 107 135 119 102 176 161 137 151 136 115 133 121 107 159 142 119 140 128 108 168 154 130 156 139 120 129 118 103 168 150 128 194 178 148 152 137 117 131 117 106 124 112 97 149 132 115 155 137 122 151 135 122 190 174 148 132 120 103 139 126 112 132 119 102 137 126 109 143 132 111 143 132 111 143 128 114 146 130 114 146 132 116 150 136 116 150 134 116 145 132 109 145 128 109 144 127 106 138 130 107 137 128 107 137 128 109 136 124 108 137 128 107 139 128 109 137 128 107 132 122 106 136 124 108 136 124 110 136 126 107 108 93 92 90 86 78 87 83 72 73 70 62 67 64 57 67 64 57 63 60 57 63 60 57 63 60 57 64 62 57 68 66 60 77 73 67 98 89 81 109 99 96 125 118 109 133 122 108 133 122 108 135 122 106 136 122 112 135 122 106 136 124 108 136 124 108 135 120 106 132 120 104 136 124 112 136 124 110 142 126 112 137 126 110 135 122 106 136 126 107 136 124 110 135 122 106 137 126 105 136 124 108 139 128 109 136 124 108 132 120 104 132 120 104 137 126 109 134 119 104 135 121 104 135 122 106 135 120 106 135 120 106 132 120 108 136 124 110 134 117 104 128 117 98 132 120 102 134 120 108 131 118 104 134 120 108 135 119 102 135 122 106 132 120 104 136 126 107 137 125 109 137 126 109 136 126 107 137 124 107 135 120 106 136 122 108 136 124 110 136 124 107 135 122 108 134 119 104 137 128 107 139 126 110 137 128 107 142 128 112 139 132 109 141 128 110 142 128 112 140 128 112 146 132 111 145 132 111 143 130 109 149 134 113 152 136 118 160 142 120 106 95 80 239 213 177 232 203 164 230 202 164 234 203 164 235 204 168 233 203 166 235 204 168 235 204 166 231 203 168 233 203 168 235 204 172 228 202 164 232 203 164 230 202 164 228 202 164 228 202 164 230 202 162 235 212 177 90 81 72 103 93 86 104 95 84 95 87 80 102 91 85 99 90 85 101 95 87 103 93 86 103 93 86 103 93 86 104 95 91 103 93 86 103 93 86 98 89 82 93 87 82 100 92 86 96 89 80 91 84 79 96 88 82 95 88 80 89 82 78 88 82 74 89 81 76 92 86 80 95 87 80 98 89 82 87 85 78 82 80 74 90 81 73 91 83 77 88 82 74 91 83 77 93 89 81 88 79 75 88 82 74 86 78 72 87 80 73 80 76 71 87 79 73 82 76 70 88 82 77 85 78 72 92 80 76 156 142 122 146 136 116 80 70 66 99 90 80 98 86 75 90 86 82 96 87 80 92 84 75 95 87 80 98 88 80 136 126 108 216 190 159 215 186 153 218 189 155 218 189 155 218 189 155 218 189 155 215 186 153 215 186 153 212 186 155 149 135 116 132 120 104 135 122 106 128 116 100 131 118 104 135 118 100 136 124 110 162 147 125 206 184 155 218 189 155 218 189 155 218 189 155 212 184 152 209 181 151 215 193 163 199 179 153 140 124 108 137 128 107 136 126 107 136 124 108 143 134 113 143 132 114 141 130 113 138 130 111 140 132 116 138 130 111 139 130 114 140 132 116 138 130 109 136 126 107 137 128 109 137 126 110 137 126 110 142 130 111 140 128 112 143 132 113 142 130 111 138 128 112 143 132 113 150 136 118 142 130 112 142 128 109 146 132 116 147 136 116 150 136 116 152 138 118 150 134 118 138 130 109 141 130 114 145 130 116 173 153 130 139 129 114 191 176 157 146 131 120 174 157 137 138 122 108 143 132 111 143 132 113 143 132 113 136 124 108 135 118 104 162 147 130 179 159 136 142 122 106 142 128 112 160 140 123 149 134 116 143 128 109 164 148 127 145 132 109 182 167 142 174 160 132 139 126 110 141 130 111 133 119 104 142 129 109 166 149 124 157 139 124 156 144 119 143 130 112 150 136 116 139 124 105 137 128 109 146 130 114 142 128 112 137 128 107 148 136 116 146 132 111 152 138 118 150 136 116 148 134 113 152 134 115 152 136 116 144 132 111 145 132 113 139 132 109 142 128 113 145 132 113 138 128 111 136 124 108 139 124 110 136 126 107 142 128 112 142 132 113 90 84 74 90 87 80 81 78 66 77 72 68 66 64 58 68 66 59 63 60 57 64 62 57 64 62 57 63 60 57 63 60 57 63 60 57 64 60 55 71 68 62 71 68 62 100 93 82 111 101 93 125 114 102 143 132 113 144 132 118 147 139 122 145 132 116 146 134 115 143 134 113 145 132 114 143 134 113 147 134 116 148 132 116 148 134 116 148 132 116 145 132 113 147 132 120 142 132 111 145 132 113 145 132 113 143 132 113 140 128 114 141 132 111 143 128 114 140 130 109 140 128 112 140 126 110 140 130 111 144 130 114 142 130 112 143 130 118 145 130 111 141 128 116 138 130 111 148 132 116 143 130 114 141 130 116 139 132 107 145 136 113 146 134 116 141 132 111 147 134 113 142 130 112 143 132 113 150 136 118 148 134 111 149 136 120 143 134 113 146 134 116 142 130 111 145 130 114 146 132 113 148 132 116 148 132 116 145 136 113 158 140 121 154 138 120 150 138 116 156 140 120 154 140 116 152 136 113 152 136 116 150 136 113 152 140 116 160 142 120 110 98 87 234 207 167 234 203 164 233 203 166 233 203 168 234 203 164 234 203 166 232 203 164 233 203 168 231 203 168 233 203 166 233 203 170 234 203 164 230 202 162 228 201 162 228 201 162 229 201 160 230 202 162 236 212 178 87 81 74 97 90 83 96 86 79 85 82 72 94 85 79 90 81 75 88 82 74 86 80 74 91 83 77 97 90 83 96 88 82 92 85 78 97 86 79 87 80 73 87 82 72 86 78 72 92 85 78 84 78 73 87 80 75 88 82 77 86 79 73 87 80 75 78 72 68 93 83 78 78 76 68 87 80 75 91 85 79 82 76 68 85 84 75 93 87 82 92 87 78 90 81 75 94 91 81 91 84 79 87 80 75 87 80 73 79 76 70 84 79 72 93 87 82 83 78 71 87 80 73 94 82 78 97 84 70 171 156 132 179 162 140 81 60 56 106 89 80 97 86 79 94 86 79 91 80 74 94 81 72 98 85 77 104 90 83 224 192 158 209 183 154 218 189 155 218 189 155 218 189 155 215 188 157 218 189 155 218 189 155 211 184 156 147 134 116 136 124 105 137 126 110 142 128 109 135 122 108 137 126 110 137 128 109 129 118 106 209 187 157 218 191 158 218 189 155 215 186 153 212 184 152 212 181 149 204 182 155 177 153 128 153 127 107 154 138 122 144 130 111 142 132 111 145 130 114 149 138 118 148 132 116 147 136 118 146 134 116 143 132 113 146 132 116 146 132 116 143 134 115 144 132 116 143 130 114 148 136 118 148 136 118 146 134 116 152 136 120 151 138 113 152 136 116 150 136 118 152 140 120 151 138 122 152 138 118 150 138 116 150 138 116 148 134 116 150 134 116 148 136 118 154 140 117 152 138 118 150 134 116 150 134 118 146 132 116 137 126 112 136 124 108 215 185 156 183 167 145 160 143 126 142 124 107 140 130 109 148 132 116 146 134 116 145 134 118 142 132 111 146 136 116 174 158 133 146 132 111 150 134 116 201 182 155 147 136 113 149 134 111 148 132 115 146 132 113 142 125 106 147 136 120 150 134 113 153 136 118 181 166 145 105 96 84 171 152 129 196 180 154 194 173 146 164 148 122 144 132 114 150 134 116 144 130 114 148 136 116 150 136 118 150 134 118 156 142 122 149 140 118 156 140 120 154 140 118 158 140 117 158 140 121 156 140 118 152 140 120 156 138 118 154 142 120 154 138 121 150 136 118 148 134 116 144 132 116 143 132 113 146 136 116 148 138 116 148 138 116 140 129 114 87 79 73 74 70 65 85 80 73 92 86 80 80 76 68 75 72 68 69 66 63 70 68 60 68 66 59 66 64 58 65 64 60 63 60 57 66 64 58 68 66 59 66 60 57 70 64 62 74 69 64 89 82 74 89 83 74 97 90 82 119 114 99 127 118 104 123 110 95 132 119 102 136 126 109 150 134 115 152 138 118 154 138 116 154 138 122 150 136 116 152 138 120 152 142 119 154 140 120 150 138 118 154 138 122 148 134 118 150 136 118 148 134 116 143 132 113 148 132 116 150 134 118 148 134 116 152 138 120 150 138 117 152 138 116 153 140 120 152 136 118 152 138 116 150 136 116 152 138 118 154 138 120 156 140 116 158 142 123 158 140 119 158 142 119 158 142 122 156 144 121 156 140 118 156 140 116 160 142 120 158 140 119 150 140 116 154 140 122 148 132 116 148 134 116 149 136 117 150 136 118 150 138 116 150 140 118 154 140 119 158 142 120 156 142 121 154 142 121 156 140 122 162 142 123 160 142 124 160 146 124 160 144 124 168 151 129 117 107 93 238 210 173 235 204 166 235 204 166 235 204 166 236 204 164 233 203 168 236 204 164 235 204 166 228 202 164 230 202 162 230 202 162 234 203 164 230 202 164 232 203 164 228 201 162 230 202 162 228 201 162 239 212 171 85 76 69 101 97 88 97 93 82 100 94 84 95 87 80 104 96 90 91 84 79 91 85 77 82 83 75 90 85 80 95 87 79 95 87 78 96 88 82 96 87 80 92 85 78 90 77 72 94 86 79 86 78 72 91 83 77 90 82 78 91 81 77 88 79 75 87 80 75 92 86 78 95 86 78 97 85 76 102 88 80 93 87 82 94 85 79 94 86 79 99 90 81 109 102 89 105 98 88 104 95 87 99 92 83 95 88 80 96 88 82 103 93 86 102 91 85 103 93 86 102 90 82 107 92 80 136 118 104 181 165 144 198 178 149 87 71 63 114 95 86 112 96 87 108 96 87 106 91 85 110 92 80 101 86 77 209 179 147 218 189 155 215 188 157 218 189 155 218 189 155 218 189 155 218 189 155 218 189 155 211 184 151 152 137 120 140 128 111 144 132 113 147 134 114 154 138 122 148 132 113 141 126 112 146 132 113 207 184 155 215 188 157 212 186 155 212 186 155 212 193 165 193 171 143 168 145 120 149 136 115 153 136 115 154 136 117 156 142 119 160 140 121 156 142 121 151 140 118 152 136 120 152 138 115 158 140 117 156 142 119 154 140 116 158 144 121 160 144 122 160 144 121 160 144 122 156 140 119 160 142 122 158 142 120 164 142 123 156 140 118 156 140 120 156 140 116 156 140 118 156 140 120 158 142 119 158 144 122 153 140 120 156 140 122 154 140 118 158 138 121 156 140 118 160 144 126 156 138 120 156 140 120 156 136 119 152 136 118 134 126 103 140 132 116 156 142 119 176 156 130 176 158 135 194 166 138 192 176 153 150 132 113 156 138 120 160 142 122 153 142 118 154 138 120 150 136 113 154 138 115 151 140 120 147 134 118 147 136 116 146 136 116 161 144 115 187 167 144 161 146 127 147 134 116 152 140 117 150 136 118 168 147 127 137 128 114 189 170 143 187 167 140 198 173 151 172 151 134 137 125 107 154 138 119 150 136 116 151 134 111 154 140 116 156 138 116 162 142 123 158 144 124 162 142 122 158 140 121 158 142 119 158 140 123 164 142 120 158 140 119 160 142 122 154 140 117 152 138 118 156 142 121 154 138 118 150 138 116 150 138 116 148 136 116 154 138 118 152 136 115 152 140 118 132 117 103 76 68 65 64 62 57 77 70 64 78 78 68 93 92 81 84 78 70 76 78 69 68 66 59 71 62 58 64 66 60 68 62 59 71 62 57 62 62 57 69 62 57 66 62 56 64 62 57 66 64 58 62 62 57 64 62 57 66 64 57 70 70 63 79 76 69 85 80 78 89 83 78 86 78 73 91 86 77 98 95 86 108 97 86 116 110 100 116 108 100 112 103 92 120 108 93 112 110 99 112 104 94 107 102 94 112 102 90 113 102 90 118 110 94 120 111 96 129 115 102 142 121 111 138 129 110 146 133 115 139 126 108 139 126 109 137 119 109 141 123 109 134 121 104 138 124 111 141 129 113 142 131 117 146 132 117 148 136 118 149 136 118 147 133 115 155 140 120 162 148 128 160 145 126 153 140 120 154 140 119 158 140 123 150 138 120 150 135 120 151 140 120 156 140 122 158 143 127 157 146 122 164 146 129 164 148 126 161 145 126 168 150 129 167 153 133 158 148 126 168 146 127 164 147 124 164 154 130 164 144 123 165 153 132 112 102 91 239 212 175 228 202 164 230 202 164 233 203 166 234 203 164 229 202 166 230 202 164 235 204 166 228 202 164 228 202 164 228 202 164 228 202 164 228 201 162 229 201 160 228 202 164 228 202 164 228 202 164 239 216 181 75 64 59 90 81 75 87 82 72 80 76 67 87 80 75 82 74 73 90 84 77 86 77 74 89 82 76 87 82 72 89 84 74 83 78 69 91 84 79 96 90 81 88 79 75 92 87 80 90 86 77 83 78 71 88 79 75 97 90 83 86 78 72 92 85 78 93 87 82 92 86 80 102 90 82 105 98 88 99 90 81 104 95 85 98 94 87 98 87 77 94 85 77 109 102 92 106 102 95 106 102 95 106 101 92 101 96 85 96 88 82 104 96 87 103 93 86 107 97 87 103 93 86 111 94 86 121 105 91 192 176 148 173 154 128 92 76 70 111 96 85 114 91 85 114 91 85 114 91 85 97 79 69 195 167 140 209 181 151 218 189 155 218 189 155 218 189 155 218 189 155 218 189 155 218 191 158 213 190 158 155 139 122 152 136 116 148 132 116 158 144 120 162 144 125 160 146 125 156 140 121 159 141 118 219 190 158 218 193 161 215 188 156 215 188 156 191 170 141 160 141 123 156 136 119 158 140 119 162 144 123 162 142 121 162 142 121 166 147 127 156 140 118 158 144 122 160 148 126 158 144 124 164 146 125 166 149 128 162 146 124 158 142 120 158 142 121 160 144 125 162 146 124 158 140 121 160 142 120 162 142 123 164 146 125 162 146 126 162 148 126 160 142 124 162 144 123 158 140 119 158 144 122 164 146 125 162 146 124 168 151 129 164 146 125 164 148 127 164 148 127 164 148 127 160 142 124 160 144 122 160 140 121 160 142 124 158 142 122 197 175 148 185 163 138 175 158 134 165 141 121 175 151 128 197 178 151 184 164 142 160 140 122 156 141 124 162 146 126 162 146 124 160 144 123 156 140 116 158 144 122 156 142 121 156 140 120 152 140 120 149 136 117 153 138 119 184 163 140 152 140 116 155 136 115 158 140 119 138 125 112 217 189 160 116 110 95 172 156 133 184 166 143 175 159 136 152 138 117 158 138 119 160 142 120 160 146 123 160 144 122 160 142 120 160 144 123 164 146 125 158 138 121 158 142 122 162 146 126 162 144 123 164 144 121 164 146 123 158 144 124 164 149 127 154 138 116 158 142 119 162 146 124 156 138 116 158 140 119 160 142 120 158 140 119 152 136 115 154 136 116 154 140 116 150 142 117 114 107 93 66 62 56 69 64 56 64 60 56 66 62 57 71 68 63 84 77 72 98 96 87 87 88 76 83 79 71 71 68 60 66 62 56 66 66 57 64 62 55 69 62 57 66 62 56 65 64 60 67 66 59 63 60 57 63 60 57 66 61 61 63 60 57 66 64 58 64 62 57 69 66 58 66 62 56 65 60 54 63 60 57 66 66 57 67 62 57 66 64 58 68 66 59 72 65 60 71 68 61 75 72 65 73 68 62 74 68 64 73 66 62 74 68 64 69 68 60 69 68 62 69 66 62 73 66 62 75 72 62 77 74 72 75 72 64 76 72 61 76 72 67 75 70 64 68 66 60 68 66 59 70 66 61 73 68 60 74 70 63 78 76 68 82 79 70 84 78 70 81 74 68 89 85 77 91 82 78 86 80 78 80 78 68 84 80 70 86 82 76 88 83 75 89 79 76 87 80 72 85 79 72 88 84 71 87 82 75 88 81 75 87 82 74 94 86 77 76 74 68 80 76 69 81 73 63 75 75 65 88 80 69 89 79 72 239 216 174 229 201 160 234 203 164 232 202 162 233 203 166 229 202 166 236 204 164 236 204 164 228 202 164 230 202 162 228 202 164 228 201 162 229 201 160 228 201 162 228 201 162 228 201 162 229 200 158 235 209 173 100 83 72 106 93 84 107 93 86 90 77 72 100 92 86 93 83 78 101 96 84 92 84 72 94 86 79 98 88 80 101 94 85 93 83 78 102 90 82 104 96 87 98 87 77 99 90 81 98 89 80 88 82 74 93 83 78 101 94 85 93 83 78 95 87 78 102 89 80 95 87 80 102 89 80 104 96 87 97 92 80 110 98 88 103 91 81 102 88 77 97 92 80 105 99 91 119 106 96 109 102 89 109 102 91 102 95 89 95 88 80 97 92 77 99 90 81 110 91 79 110 92 81 111 100 89 124 109 94 194 176 150 152 134 107 87 75 70 110 93 84 115 100 89 112 100 86 108 85 75 187 161 136 222 192 157 225 201 164 218 193 161 218 191 158 218 189 155 218 189 155 218 189 155 219 192 161 108 97 83 135 124 107 158 140 117 152 140 116 158 144 117 160 144 125 156 138 119 144 130 107 213 191 157 218 189 155 218 189 155 218 191 158 183 162 139 161 138 123 164 144 124 164 144 121 162 142 123 164 150 123 166 150 124 168 151 127 168 151 129 164 148 127 166 148 126 164 150 128 160 144 125 160 146 122 164 148 127 164 148 124 164 144 121 158 142 124 164 144 124 160 146 122 164 146 125 160 142 120 164 146 125 166 149 128 168 151 129 164 146 125 158 146 124 164 146 125 164 144 124 166 149 128 164 148 127 162 148 126 166 149 128 166 149 128 162 144 123 162 146 124 162 146 122 162 146 122 156 140 119 156 140 120 160 140 123 160 142 124 171 158 131 190 137 116 148 101 85 162 97 76 209 136 112 178 102 85 155 135 112 160 144 123 166 148 126 156 140 116 164 148 127 164 144 124 156 140 116 160 142 122 160 146 125 158 144 124 154 140 120 147 136 117 164 150 129 183 163 137 191 176 146 164 148 122 164 148 127 160 148 126 158 144 122 143 132 114 122 109 100 146 131 118 156 138 121 160 142 120 164 149 127 162 148 126 160 146 125 164 148 127 164 148 127 164 148 127 166 149 128 166 149 128 166 149 128 162 150 127 164 144 124 162 146 122 166 149 128 162 146 126 166 147 127 162 146 124 166 149 128 164 148 127 162 148 126 162 142 123 160 142 122 162 148 126 160 146 125 160 144 123 160 142 122 158 142 119 154 138 117 83 75 71 62 58 55 62 58 55 66 64 58 63 60 57 63 60 57 64 62 57 78 75 71 84 77 72 92 86 80 85 80 75 91 83 75 79 76 68 69 70 62 64 60 55 63 60 57 65 64 60 67 66 62 64 62 59 64 62 55 63 60 57 63 60 57 63 60 57 62 58 55 63 60 57 61 56 54 62 58 55 63 60 57 62 62 57 63 64 58 66 64 58 67 66 57 69 68 58 66 64 56 64 60 55 63 60 57 63 60 57 63 60 57 63 60 57 61 60 55 62 58 55 63 60 57 64 62 57 67 64 59 66 66 63 65 64 60 69 68 62 66 64 58 64 62 57 66 64 58 64 62 57 65 64 60 63 60 57 63 61 56 68 66 59 67 64 59 64 62 57 66 62 56 64 62 57 64 62 57 63 60 57 64 62 57 63 60 57 68 64 60 68 66 59 66 62 56 64 62 55 64 60 55 68 66 59 68 66 59 66 64 56 66 64 58 64 62 57 62 56 53 70 66 61 64 62 57 66 60 53 76 69 65 239 216 177 230 202 162 228 202 164 235 206 165 235 204 166 234 203 164 236 204 164 236 204 164 228 202 164 229 201 160 228 202 164 232 203 164 229 201 160 229 201 160 229 201 160 229 200 158 229 200 158 233 208 175 100 85 74 103 93 86 104 97 85 91 83 75 103 92 83 96 87 77 111 100 89 94 81 72 102 88 78 103 92 83 110 96 85 98 85 80 100 92 86 105 98 88 103 91 81 104 96 87 100 92 84 88 84 74 95 88 80 107 95 85 98 87 77 96 87 80 106 93 84 103 92 83 107 97 87 112 103 90 107 94 83 107 97 87 107 96 85 102 89 80 99 91 85 116 104 89 115 104 91 112 104 96 109 103 95 107 95 85 99 91 83 105 98 88 107 92 83 110 89 80 107 95 82 110 94 85 122 103 90 174 161 134 175 152 128 92 76 74 115 99 87 118 101 90 112 95 82 186 160 130 230 199 163 226 197 157 224 194 155 217 189 160 215 186 153 218 191 158 212 184 152 212 186 155 178 159 130 98 85 79 141 125 110 166 147 127 168 147 125 166 148 124 164 150 128 156 138 117 184 158 130 221 194 158 215 186 153 218 191 158 194 176 148 162 146 124 164 148 127 164 146 125 168 151 127 168 148 125 168 151 129 164 148 127 166 147 124 170 151 128 164 152 127 168 148 125 162 146 124 166 149 128 166 148 125 164 148 123 168 149 131 168 149 127 166 148 126 164 148 124 164 148 127 166 148 126 164 146 125 168 148 125 168 149 127 168 151 129 166 151 129 164 148 127 164 148 127 164 148 127 162 146 126 162 145 127 162 144 125 164 148 127 164 146 128 160 142 117 168 147 125 160 142 122 164 144 124 160 140 121 156 140 118 156 140 124 158 142 124 158 125 103 201 116 96 213 145 120 195 99 84 208 137 112 195 123 102 155 101 83 160 142 120 158 140 119 160 146 122 162 146 124 166 149 128 164 146 123 164 146 125 160 148 125 162 148 126 162 148 126 158 142 123 186 163 136 142 133 120 160 140 120 158 141 121 162 145 121 164 146 122 166 150 127 185 165 141 168 147 122 189 172 145 161 142 113 166 148 123 170 149 126 170 151 130 172 152 130 164 148 124 160 146 120 164 148 127 166 151 127 172 151 129 170 152 130 170 147 125 170 152 130 172 154 130 174 157 132 172 152 130 166 150 123 166 146 121 168 148 125 170 151 128 168 151 129 164 148 124 166 147 124 164 142 123 162 146 124 164 148 127 164 148 127 164 144 124 162 148 123 151 139 114 75 68 58 68 66 59 66 64 58 65 62 57 66 66 63 64 62 57 63 64 58 59 58 55 63 60 57 73 68 64 76 80 72 88 81 74 94 88 79 100 96 86 88 83 74 92 83 76 83 80 75 80 75 70 72 64 60 69 68 62 66 64 58 66 62 56 61 56 54 62 58 55 62 58 55 58 56 53 60 56 52 61 56 51 60 56 52 63 60 57 63 62 56 69 66 58 66 64 58 64 60 55 63 60 57 63 58 54 65 62 57 62 56 53 63 60 55 62 58 55 61 56 54 66 64 58 61 56 54 64 62 57 70 68 60 70 66 62 69 64 62 64 62 57 67 66 61 67 66 57 64 62 57 62 58 55 64 61 57 64 62 57 64 62 59 66 66 63 68 66 62 66 62 56 62 58 55 63 60 57 70 68 60 64 62 57 69 62 55 71 64 61 73 66 63 75 70 66 73 68 64 83 78 71 78 75 66 79 74 66 73 66 62 71 66 60 79 74 70 81 76 70 85 80 75 73 68 64 129 112 92 239 208 167 230 202 164 232 203 164 230 202 164 232 203 164 232 203 164 234 203 164 235 204 166 228 202 164 228 202 164 228 201 162 230 200 156 229 201 160 228 201 162 228 201 162 229 201 160 228 201 162 229 207 171 92 78 67 112 103 90 102 91 85 99 91 83 104 96 87 115 101 89 112 103 90 104 92 83 115 104 91 108 96 87 110 97 88 105 99 91 105 98 88 106 101 89 115 104 91 115 104 91 114 101 90 104 96 87 111 100 89 105 99 91 101 96 85 110 98 88 108 99 88 108 99 88 112 103 90 112 103 92 116 103 93 116 105 97 120 108 96 113 104 94 116 105 95 121 111 99 120 107 100 113 105 100 113 104 97 108 99 90 93 83 78 107 93 87 105 91 77 107 91 82 110 96 83 111 98 81 127 111 96 183 164 142 185 172 150 92 75 68 118 98 88 111 95 83 195 162 134 222 198 165 220 192 161 224 194 155 215 186 153 215 186 153 215 186 153 209 181 151 212 190 161 180 161 133 178 156 130 87 80 73 141 127 110 172 154 132 166 149 128 168 151 130 164 144 122 151 136 114 217 192 159 218 191 158 218 191 158 201 174 145 162 142 121 164 148 121 164 148 124 166 148 126 166 148 126 164 148 124 172 154 132 168 149 127 170 151 126 178 155 133 174 154 132 176 155 133 168 151 129 172 153 131 172 151 129 168 150 125 172 153 132 176 157 136 170 151 128 172 151 129 172 155 132 170 152 130 172 154 132 170 151 130 168 149 127 168 151 129 168 151 129 166 150 127 162 148 126 164 146 125 164 148 127 164 148 127 166 148 126 164 150 128 170 153 128 168 147 128 170 153 128 168 151 127 166 147 127 160 144 123 160 142 124 156 140 124 164 148 127 174 140 118 198 105 88 203 138 116 202 103 86 210 128 107 206 134 109 185 108 91 168 144 121 166 148 126 162 147 126 160 144 124 158 142 120 164 147 126 162 148 123 162 148 126 160 148 125 158 146 122 153 142 122 160 142 119 175 154 128 157 144 122 190 174 140 165 152 131 157 137 116 139 126 111 158 139 118 174 149 125 187 169 141 192 171 145 162 144 120 170 153 128 168 151 126 172 155 128 168 153 126 166 150 128 158 146 122 164 150 123 168 151 124 170 151 126 180 160 137 170 153 130 170 154 128 172 153 130 172 154 130 168 150 125 168 149 127 168 148 125 172 153 131 170 151 126 170 153 128 170 151 131 164 150 126 166 150 129 166 151 127 168 153 128 170 152 130 168 151 125 170 153 131 122 113 98 74 69 64 68 66 62 71 68 64 62 58 55 62 58 57 64 60 57 63 60 57 63 60 57 63 60 57 61 56 54 60 58 51 60 58 53 64 60 56 70 68 62 82 75 70 80 76 73 90 85 80 90 87 80 87 80 73 84 80 74 90 85 80 93 89 82 93 90 80 105 99 91 113 104 97 113 110 97 109 101 87 102 99 88 97 94 86 96 91 81 96 90 81 91 89 79 91 88 80 93 88 79 89 85 79 87 80 74 83 80 71 78 76 69 80 74 69 76 72 68 79 74 71 76 71 69 76 72 67 86 82 73 84 80 73 81 77 71 86 80 76 79 75 68 82 78 68 82 78 72 83 77 69 78 71 66 79 76 66 76 75 71 76 76 69 76 72 64 70 64 61 78 70 64 74 68 64 66 64 58 73 70 62 81 73 68 75 74 66 70 68 63 71 68 58 72 68 59 79 69 58 83 81 72 89 88 77 84 78 68 78 74 66 80 76 67 71 70 60 70 62 57 69 64 56 114 101 85 238 210 173 232 203 164 230 202 164 232 203 164 235 204 166 234 203 164 232 203 164 234 203 164 228 202 164 228 201 162 228 202 164 229 200 158 229 200 158 229 200 158 228 201 162 228 201 162 228 202 164 233 208 172 95 83 70 110 98 90 112 102 90 108 100 91 105 99 91 111 100 89 110 98 88 110 97 86 101 94 85 104 94 84 107 95 85 104 97 85 110 98 90 108 99 88 119 105 94 116 105 98 100 94 84 112 103 92 116 105 95 109 102 87 105 98 88 104 95 87 109 102 89 105 98 88 106 101 89 103 93 86 104 95 84 104 96 87 104 94 85 100 93 82 96 90 79 101 92 84 104 94 82 104 95 86 103 91 82 103 92 82 100 89 84 94 86 79 99 90 81 103 91 81 110 91 85 108 97 84 115 101 87 123 109 100 152 141 125 102 83 74 118 94 84 191 150 129 225 195 159 221 191 155 226 197 157 223 192 159 226 198 159 220 199 166 233 204 163 182 163 135 154 138 120 172 154 132 172 155 128 85 83 72 149 133 113 170 154 130 166 148 121 168 151 127 168 149 122 188 166 140 212 186 155 209 183 154 207 180 153 168 145 121 172 151 128 166 154 126 164 148 127 172 151 128 168 152 126 168 149 127 164 148 127 164 148 127 168 153 126 166 149 128 168 149 127 170 151 130 168 148 127 172 153 131 174 156 134 168 151 127 170 153 128 168 153 130 170 152 130 166 148 127 170 151 128 164 144 124 166 148 126 168 153 130 170 151 126 168 149 127 168 151 129 168 147 126 162 144 125 164 148 127 168 149 127 170 151 128 168 153 130 170 154 132 172 155 130 172 154 132 172 154 134 170 152 130 170 154 132 172 152 130 166 151 129 168 151 129 168 151 129 175 146 121 207 104 87 203 110 92 211 132 110 209 129 107 203 118 98 192 113 94 174 152 128 164 148 124 164 146 128 162 150 127 164 146 125 170 154 132 166 149 128 160 144 125 154 144 119 147 140 115 201 179 148 130 119 103 159 144 125 191 171 143 156 141 120 158 137 120 179 164 139 163 150 125 165 147 126 170 154 124 202 181 154 166 145 123 166 148 126 170 151 128 172 154 132 170 153 128 170 152 124 166 149 126 166 149 128 164 151 128 172 152 130 170 151 128 172 152 130 178 155 133 176 155 131 170 153 128 168 151 124 174 154 132 172 154 132 168 148 125 170 151 128 166 146 125 166 147 124 169 151 124 164 144 124 164 146 123 168 151 127 166 151 129 164 148 127 168 153 128 166 149 128 162 149 127 99 90 80 70 68 66 69 66 64 69 68 65 63 64 58 65 58 56 66 62 56 63 60 57 64 62 57 63 60 57 63 60 57 63 60 57 63 60 57 62 57 58 63 60 57 61 58 53 57 54 51 59 56 50 62 56 53 63 58 54 64 60 56 66 64 58 69 68 62 69 66 62 75 68 66 70 69 65 77 78 70 80 74 67 81 78 71 79 78 71 83 80 75 83 78 77 84 76 72 82 77 68 82 81 70 85 79 70 88 80 73 85 79 72 89 83 74 87 85 75 89 81 76 88 81 78 91 83 77 97 92 80 97 94 81 98 93 84 98 96 90 102 97 88 105 98 88 105 100 94 106 100 85 110 102 91 101 95 90 105 98 88 108 100 90 112 103 90 113 106 93 117 110 96 112 101 93 109 102 91 103 93 86 99 91 82 96 91 80 90 86 78 103 94 89 101 98 87 106 102 95 97 91 86 104 96 87 105 98 88 101 96 84 105 99 91 99 91 83 93 89 82 92 86 80 120 106 89 238 210 173 230 202 162 230 202 164 232 203 164 235 204 166 235 204 166 236 204 164 233 203 166 229 201 160 228 201 162 228 201 162 230 202 164 226 197 157 226 197 157 228 202 164 228 202 164 228 199 163 229 205 171 99 90 78 116 105 95 113 104 94 116 105 95 109 102 92 112 103 92 116 105 95 108 100 91 112 103 92 113 104 94 113 106 95 119 106 98 119 106 96 113 104 97 113 104 94 116 106 100 117 107 96 121 112 101 119 106 96 120 109 98 116 105 95 114 109 96 120 109 100 120 108 96 119 106 96 119 106 98 120 107 100 121 112 101 120 109 100 123 117 103 122 114 102 121 111 99 124 111 102 120 108 96 124 111 102 117 108 98 117 108 98 116 105 95 99 91 82 106 89 80 119 104 94 119 106 96 119 105 92 99 89 82 106 90 82 111 100 89 181 139 120 222 192 159 220 192 157 221 194 158 221 194 158 223 195 157 229 198 161 226 196 168 151 130 113 102 88 78 144 132 110 164 148 127 170 157 132 86 80 74 157 140 118 168 155 130 172 152 130 176 159 133 172 153 128 215 187 157 215 188 156 208 186 158 164 145 124 166 148 126 164 150 128 166 148 126 164 144 121 180 157 134 170 149 128 164 150 128 164 148 127 166 149 128 164 148 127 168 149 128 170 152 130 168 149 127 168 148 125 170 151 128 174 153 131 170 153 130 174 154 132 174 154 132 166 149 128 166 149 128 170 149 126 168 151 129 172 154 132 172 154 132 172 154 132 172 152 130 170 152 130 168 151 129 168 151 129 172 154 132 172 154 132 172 151 129 170 152 130 172 154 132 172 154 132 176 155 133 172 154 134 174 154 132 174 155 134 174 155 134 164 148 127 162 144 123 164 148 127 181 140 117 202 103 86 209 137 115 205 131 108 211 136 115 208 128 108 185 103 88 170 149 126 162 148 123 164 146 125 164 144 124 160 144 122 164 146 125 172 154 132 170 153 131 168 151 129 164 145 124 176 157 134 184 167 139 147 136 111 199 178 152 160 145 124 170 147 122 175 153 124 201 181 151 190 170 145 188 167 139 199 177 148 170 151 126 174 154 132 174 155 134 174 157 136 174 154 132 172 152 130 170 152 130 168 149 127 170 152 130 172 153 128 172 151 128 170 151 128 168 149 127 164 147 125 166 148 126 164 144 124 170 152 130 172 151 128 174 154 132 168 147 126 164 148 127 164 148 124 166 148 123 164 148 127 162 144 123 162 148 126 164 148 127 164 146 125 166 149 128 164 148 127 168 151 129 145 129 105 85 80 71 67 64 57 66 64 58 67 66 61 67 66 61 64 62 57 65 66 60 63 60 57 63 60 57 62 58 55 63 60 57 60 58 55 63 60 57 63 58 54 60 60 56 62 58 55 58 52 52 61 60 55 63 60 57 63 60 57 63 60 57 62 58 55 61 56 54 59 58 55 63 60 57 59 54 51 61 56 54 63 60 57 62 58 55 61 56 54 61 56 54 63 60 57 63 60 57 64 62 57 63 60 57 63 60 57 58 56 53 63 60 57 61 56 54 64 62 57 64 62 57 65 64 60 68 66 59 64 62 59 67 63 60 66 66 63 62 58 55 66 64 58 65 64 60 62 62 57 60 60 57 63 60 57 62 58 55 64 62 57 63 60 57 62 62 57 64 62 57 71 70 61 68 66 60 73 70 64 74 68 64 74 68 64 76 72 66 76 70 64 75 68 66 77 72 65 78 74 66 78 73 69 78 80 70 79 75 68 82 77 68 86 80 76 80 76 70 80 76 68 113 102 84 238 210 173 233 203 166 236 204 164 235 204 168 236 204 164 235 204 166 235 204 170 236 204 164 228 202 164 228 201 162 228 201 162 230 202 162 229 201 160 228 201 162 228 202 164 228 202 164 228 202 164 235 209 173 110 99 88 120 109 98 117 108 98 116 105 97 121 111 99 103 91 80 112 103 92 116 105 96 112 102 90 119 106 98 116 106 100 116 104 92 116 105 98 120 107 100 113 108 99 116 105 97 122 114 102 121 111 99 111 101 91 124 113 100 120 109 98 97 93 85 117 108 98 116 105 97 100 92 79 113 108 101 122 114 102 113 104 94 115 101 91 120 107 100 121 112 101 108 98 85 120 109 97 121 112 100 101 93 82 123 110 101 107 95 84 115 102 94 120 107 100 115 99 87 99 90 76 111 94 82 115 99 92 90 82 70 94 84 76 149 122 100 230 200 166 224 194 155 227 197 155 226 197 157 224 194 155 223 195 162 224 187 160 135 112 98 103 87 78 97 86 79 147 138 118 170 149 130 170 157 133 92 83 71 154 140 118 170 153 130 168 151 127 170 151 126 161 140 115 223 192 159 212 186 155 164 144 126 166 147 127 162 150 125 160 146 125 172 152 131 135 125 110 66 68 71 127 115 103 160 146 125 164 148 127 162 146 126 168 151 124 170 151 128 168 149 124 170 152 132 166 148 126 172 155 130 172 153 128 170 151 128 170 151 126 168 148 125 162 148 126 162 142 123 164 146 124 168 148 125 170 152 130 170 151 128 172 155 128 170 152 130 172 154 132 170 152 130 172 152 130 166 149 128 168 151 129 170 151 128 172 155 132 166 149 125 172 154 132 168 151 129 174 153 130 176 155 133 172 154 132 172 152 130 162 146 124 166 148 130 164 148 127 187 145 119 207 106 89 210 126 105 215 148 121 218 145 118 207 126 105 193 113 95 168 149 127 166 153 130 168 149 127 162 148 126 162 148 123 166 149 126 168 149 127 170 151 128 170 151 128 168 151 129 183 163 137 174 156 128 196 177 152 178 157 132 203 182 152 170 152 121 188 169 140 185 163 140 193 173 147 184 162 131 206 181 153 172 150 125 168 151 128 170 152 130 172 154 132 176 155 133 174 155 130 170 151 128 168 149 127 168 151 126 166 151 128 170 151 128 168 151 129 168 149 127 166 146 125 168 148 125 164 148 127 168 148 125 170 152 130 166 148 126 168 151 129 168 151 127 164 148 127 166 148 126 164 148 124 166 148 126 168 151 128 166 148 126 162 146 124 164 148 124 164 148 127 164 144 124 168 150 128 115 105 96 75 69 63 63 58 54 64 62 57 66 62 59 59 58 55 60 58 55 62 58 55 60 60 56 63 60 57 61 56 54 62 58 55 65 60 54 63 62 56 58 56 53 58 56 53 57 60 55 61 58 53 62 58 55 63 60 57 63 60 57 63 60 57 63 60 57 63 60 57 63 56 54 58 56 53 60 54 53 58 56 53 59 58 55 60 54 53 60 60 56 60 60 56 64 60 55 62 62 57 65 64 62 66 66 63 63 58 54 63 60 57 64 62 59 64 62 57 63 64 56 67 66 61 64 62 57 65 64 62 66 64 56 64 62 57 64 62 57 63 60 57 63 60 57 64 60 55 63 60 57 64 62 57 68 66 59 64 62 57 63 60 57 63 60 57 63 60 58 64 62 57 66 64 58 65 60 54 62 62 57 63 62 56 61 60 55 65 60 54 66 60 55 69 66 58 69 68 58 73 70 64 73 70 62 69 68 61 71 70 62 74 68 62 73 70 62 70 64 58 108 92 83 243 217 176 233 203 166 235 204 166 235 204 168 235 204 168 236 204 164 235 204 168 235 204 170 231 203 168 230 202 164 228 202 164 228 202 164 228 202 164 228 202 164 230 202 164 228 202 164 228 201 162 234 201 170 110 99 89 111 99 89 115 102 94 104 95 85 103 94 77 120 109 98 103 86 82 109 98 88 116 105 98 107 96 87 110 105 95 112 102 96 99 91 80 113 106 95 120 107 100 116 105 95 106 100 89 122 114 102 113 106 95 103 91 81 121 112 101 120 109 100 103 93 86 112 103 92 114 108 95 97 87 74 117 110 98 122 114 102 112 103 92 107 97 86 124 114 103 124 114 100 106 100 89 119 106 96 121 112 101 103 92 82 121 112 101 101 96 86 117 108 98 122 114 102 120 109 100 114 94 84 114 100 92 96 90 77 135 117 100 221 192 154 221 191 155 227 199 158 226 193 162 221 194 158 227 204 169 184 162 135 119 97 88 119 106 96 123 106 98 96 90 78 143 129 114 170 153 130 176 158 134 90 80 73 160 140 122 170 154 132 168 150 124 166 147 127 176 155 130 214 187 159 191 162 138 162 144 123 166 151 127 168 149 124 164 146 120 138 125 110 77 76 76 96 90 91 64 61 64 169 157 136 166 149 128 164 148 127 166 146 125 152 130 106 178 150 127 174 143 118 176 150 122 175 149 119 161 141 117 168 146 124 166 148 126 166 151 127 166 148 126 166 148 126 164 148 127 164 144 124 164 148 127 170 152 130 170 151 128 172 154 132 172 154 132 172 153 132 172 154 132 172 151 129 170 148 124 170 149 126 170 151 128 172 152 130 172 152 130 170 152 130 172 154 132 172 152 130 172 154 132 170 152 130 164 148 124 164 146 125 164 146 125 178 137 114 202 105 87 205 136 112 225 159 131 223 163 134 210 139 115 189 121 104 170 154 132 170 153 128 168 153 128 170 155 130 170 151 128 162 146 124 166 149 128 170 151 130 170 153 130 168 153 128 166 150 123 160 142 122 172 153 130 170 150 124 192 167 142 167 150 129 170 152 124 166 148 126 170 150 119 194 172 140 206 183 150 196 172 149 150 136 111 166 149 126 172 153 128 170 155 128 170 150 128 170 151 126 168 151 129 164 150 126 172 152 130 170 154 132 170 151 128 174 155 133 176 157 134 174 156 134 172 151 128 172 154 132 170 152 130 168 151 129 170 152 130 170 154 132 168 155 128 168 148 125 164 152 131 168 151 128 168 151 127 166 153 128 166 149 128 160 146 123 162 142 121 162 145 127 166 149 128 152 139 122 89 82 70 77 72 67 62 62 60 62 64 56 62 56 54 65 62 62 57 60 55 64 58 58 63 60 57 63 64 58 64 60 56 59 58 55 60 60 56 62 54 53 56 56 53 62 58 57 59 58 57 63 58 54 61 58 53 63 60 57 62 55 55 59 58 55 62 58 55 60 60 56 59 58 55 60 56 52 59 57 50 59 56 54 62 58 55 58 56 53 61 56 54 60 60 56 63 60 57 62 58 55 62 58 55 61 56 54 60 56 52 64 60 55 66 64 58 64 62 57 65 66 56 64 66 62 63 60 57 64 60 55 64 62 57 65 64 60 64 62 57 63 60 57 64 62 55 63 60 56 64 62 57 62 62 57 63 60 57 62 58 55 60 58 53 66 64 58 62 58 55 68 66 59 64 62 57 67 62 55 68 62 58 64 60 55 64 60 55 66 66 57 69 68 62 67 64 57 70 70 64 73 72 62 71 70 62 71 68 62 73 70 62 76 70 64 69 66 58 111 98 83 241 216 176 235 204 170 233 203 166 236 204 164 235 204 170 235 204 168 235 204 168 235 206 167 228 202 164 229 202 166 228 202 164 228 202 164 232 203 164 234 203 164 230 202 164 228 202 164 228 202 164 232 208 172 107 95 82 120 109 98 96 87 77 116 107 95 109 101 88 102 88 77 120 109 98 89 81 74 115 103 93 119 106 98 93 88 80 112 100 92 113 106 95 96 89 75 110 103 94 114 109 99 104 95 85 109 102 91 112 104 94 104 98 86 104 94 84 113 105 92 120 109 94 107 97 87 114 109 96 109 101 89 96 90 80 108 99 90 108 99 88 102 96 86 100 94 84 106 101 89 106 101 89 104 95 84 105 98 88 98 89 80 99 91 83 99 92 83 112 103 92 117 108 94 103 94 82 97 81 74 107 97 90 128 111 92 224 195 162 221 191 155 221 191 155 228 197 165 223 195 157 225 197 158 185 158 129 115 94 79 102 88 77 110 89 80 111 100 89 98 88 78 146 135 117 168 151 129 176 158 132 87 82 72 154 142 118 164 152 126 170 151 128 172 153 132 194 174 145 207 176 146 204 170 142 159 140 119 172 153 131 172 154 132 172 153 128 161 144 126 148 124 104 160 126 108 81 71 67 179 154 130 153 136 115 162 144 125 160 148 126 148 131 109 165 143 121 176 144 121 169 137 116 134 127 107 156 139 120 168 151 127 170 151 128 172 153 128 170 151 128 168 151 129 174 153 130 166 149 128 166 149 128 170 152 130 172 154 132 170 151 128 174 155 134 170 153 128 172 154 134 172 154 132 172 151 128 170 151 128 172 154 132 168 149 127 166 149 128 164 148 127 172 154 132 170 152 130 172 154 132 172 154 134 172 154 132 170 153 128 168 148 125 190 140 116 200 90 77 211 134 112 204 119 99 216 147 123 199 93 77 187 123 101 172 152 130 172 154 132 176 155 133 172 152 130 170 152 130 172 151 128 174 155 134 178 156 135 176 155 131 172 154 130 172 152 130 166 148 126 168 149 127 168 151 129 172 151 128 166 149 128 166 149 125 164 148 127 164 148 127 168 150 126 166 148 126 162 144 123 172 152 130 170 151 130 170 151 128 174 154 132 170 151 128 172 154 132 170 152 130 170 151 128 166 149 128 170 151 128 166 151 127 166 148 121 170 151 126 170 155 128 168 148 125 170 153 130 170 153 126 170 152 130 166 151 127 166 149 128 170 151 128 168 148 125 166 148 126 166 154 128 166 150 127 166 150 127 164 148 127 166 148 126 166 148 126 168 149 127 168 149 127 164 148 127 166 148 125 159 140 113 129 119 109 109 102 91 84 74 65 67 60 57 63 60 55 59 58 55 60 58 53 60 58 55 63 60 57 61 56 54 60 54 53 58 56 53 59 58 55 58 52 52 59 58 55 63 60 57 63 60 57 63 60 57 59 58 55 63 60 57 58 56 53 59 58 55 62 58 55 63 60 57 63 60 57 63 60 57 63 60 57 58 54 52 59 58 55 58 54 53 61 56 54 62 58 55 63 60 57 64 62 57 66 62 56 63 60 57 65 64 62 63 60 57 63 64 58 60 60 56 59 58 55 64 62 57 66 64 58 64 62 57 63 60 57 63 60 57 58 56 53 64 61 57 63 60 57 60 60 56 63 60 57 63 60 57 67 60 60 60 56 52 63 60 57 61 56 54 59 58 55 64 60 55 63 60 57 60 60 56 64 60 55 63 60 58 66 64 58 69 66 56 69 68 62 75 70 66 75 70 66 77 72 66 70 68 60 71 70 62 73 70 64 125 110 94 243 214 173 235 204 168 235 204 168 235 204 168 235 204 170 235 204 172 235 204 172 235 204 170 232 203 164 231 203 166 231 203 166 236 204 164 230 202 164 233 203 166 234 203 164 228 202 164 230 202 164 239 213 177 100 87 80 112 104 94 119 106 94 107 96 87 108 100 90 112 100 88 131 124 111 104 95 87 112 101 93 115 103 96 107 97 87 104 96 87 109 103 94 107 97 90 111 101 93 110 98 90 111 98 90 111 100 90 111 99 92 117 107 96 95 87 78 108 98 86 112 104 94 112 104 94 117 107 96 116 103 93 111 99 92 114 109 96 113 106 95 111 99 92 107 97 89 112 99 88 102 91 85 112 99 88 110 94 86 102 87 75 107 97 90 102 94 86 122 114 102 123 117 103 117 103 96 104 95 86 127 109 98 217 189 156 221 191 155 221 191 155 218 189 155 215 186 153 225 199 161 177 156 126 110 86 76 110 96 83 111 97 87 119 104 95 122 103 94 98 88 80 149 135 119 172 154 132 174 159 135 94 83 74 160 144 120 166 151 129 166 149 125 166 148 122 204 180 150 227 197 155 224 193 163 176 155 131 170 151 128 170 152 130 166 148 126 177 153 129 70 70 74 50 47 56 44 46 52 142 118 97 158 145 118 156 138 119 164 148 127 166 148 126 170 147 128 160 126 109 164 119 103 128 107 92 155 129 103 158 135 104 155 136 116 170 152 130 168 149 127 166 147 127 172 152 130 172 152 130 172 155 132 170 152 130 174 154 132 170 152 130 172 154 132 172 154 132 180 158 135 178 157 135 180 156 134 172 154 132 174 154 132 174 154 132 172 154 132 170 152 130 170 152 130 174 154 132 172 154 132 172 154 130 172 153 131 172 154 132 172 153 131 193 141 116 211 116 98 228 194 167 215 132 108 228 177 150 220 180 146 187 117 98 168 149 127 174 154 132 172 153 131 170 152 130 164 147 125 166 149 128 170 152 128 170 151 128 172 154 132 172 152 130 168 151 129 168 151 126 172 151 128 166 149 128 170 152 130 170 151 128 166 149 128 168 148 125 166 149 128 172 152 130 170 151 128 170 151 128 172 154 132 170 152 130 172 154 132 172 154 130 172 152 130 170 152 130 170 152 130 168 149 128 164 147 122 164 148 127 164 146 125 172 153 128 172 154 130 172 154 132 172 151 128 170 149 126 168 154 128 170 152 130 168 151 129 166 149 128 168 149 127 172 155 132 170 152 130 170 154 132 170 153 130 174 154 132 172 152 130 170 152 130 172 152 130 174 155 130 176 157 134 174 154 132 178 157 133 172 155 132 178 155 133 174 153 130 172 153 128 146 134 112 114 104 95 63 55 45 79 68 57 73 66 60 65 58 57 64 60 55 62 56 53 61 56 54 60 52 52 62 58 55 62 58 55 60 54 53 63 60 57 63 60 57 63 60 57 63 60 57 63 60 57 61 56 54 63 60 57 64 62 57 62 58 55 59 56 54 59 58 55 63 60 57 66 64 58 63 60 57 63 60 57 63 60 57 63 60 57 63 60 57 61 56 54 61 56 54 63 60 57 62 58 55 66 64 58 63 60 57 66 64 58 64 62 57 63 60 57 61 56 54 62 58 55 62 58 55 63 64 58 63 60 56 60 60 56 62 58 55 62 58 55 63 60 57 63 64 58 63 60 57 61 56 54 63 60 57 63 60 57 64 62 59 63 60 57 64 62 59 66 64 58 65 64 60 68 66 59 64 62 57 65 64 60 69 68 61 71 68 63 70 66 61 68 66 59 68 66 59 71 68 63 101 91 78 242 214 179 235 204 170 235 204 166 235 204 170 235 204 168 235 204 168 235 204 172 235 208 170 235 204 168 233 203 166 235 204 170 235 204 166 234 203 164 233 203 166 230 202 164 236 204 164 228 202 164 235 208 171 110 88 78 106 91 79 114 96 84 114 93 84 114 98 90 128 111 97 148 136 113 137 126 111 114 109 96 113 106 95 99 90 78 118 106 97 113 106 95 103 93 86 107 93 80 115 101 90 121 99 92 110 98 90 115 101 87 123 106 95 100 93 82 121 102 91 123 106 95 126 107 98 119 105 92 126 107 100 129 107 100 130 107 97 123 107 100 133 110 102 127 110 96 130 110 98 122 105 94 126 106 96 130 106 95 110 90 82 108 98 86 119 107 99 124 109 100 127 114 102 124 111 96 97 81 72 213 190 158 223 195 157 230 200 156 229 201 160 226 198 159 226 197 157 199 179 154 115 101 89 119 104 93 122 102 93 114 97 87 112 102 88 123 102 89 112 96 87 155 140 120 168 152 126 174 154 133 90 85 80 166 150 126 172 155 128 170 151 124 172 152 124 208 172 144 223 192 159 218 189 155 164 148 117 153 138 114 176 143 114 202 157 123 175 144 117 50 61 72 62 61 64 56 60 68 79 75 79 200 144 118 112 98 91 170 154 129 166 148 126 128 109 96 67 74 75 126 116 95 89 76 72 110 103 91 229 181 133 145 127 110 168 151 127 170 153 132 172 154 132 172 153 129 170 151 128 178 157 135 180 156 134 180 158 135 176 155 133 174 155 130 170 151 132 172 154 130 176 155 133 178 157 135 174 154 132 174 155 134 176 157 136 176 155 133 176 155 133 172 152 130 172 153 131 168 153 130 170 152 130 166 146 125 166 149 132 170 152 130 188 137 112 208 133 109 218 161 134 218 151 126 233 180 148 214 148 123 181 114 97 176 155 131 172 154 130 174 154 132 174 154 132 174 155 131 172 152 130 170 151 128 172 153 129 170 152 130 172 152 130 172 153 128 168 151 127 170 151 128 166 148 126 170 152 130 168 147 126 168 149 127 164 150 122 164 146 125 166 146 122 168 151 129 164 148 127 164 148 127 172 154 134 172 154 132 168 153 126 172 152 130 172 154 132 174 154 132 170 155 128 170 153 128 170 152 130 168 151 129 174 151 128 180 157 137 172 154 132 168 149 127 168 150 124 170 150 124 168 151 127 170 153 132 170 148 124 166 150 127 170 154 128 168 149 127 162 144 125 168 151 129 166 148 126 166 149 128 164 148 127 166 147 126 168 151 129 172 154 134 172 151 126 172 154 134 172 152 130 174 154 132 174 155 128 178 155 133 168 151 129 164 146 123 174 154 136 144 112 93 115 97 82 99 86 75 101 85 76 103 90 80 97 89 77 83 75 67 79 71 65 76 67 63 69 68 59 68 64 60 59 62 56 64 60 55 59 58 55 62 58 55 58 56 53 57 58 55 62 58 55 63 60 57 61 60 56 65 60 54 64 60 55 64 62 57 63 60 57 66 60 57 63 60 57 62 56 53 63 58 54 63 60 57 59 56 54 63 60 57 62 58 55 63 62 56 63 60 57 66 64 58 64 60 55 63 60 57 64 60 55 63 58 54 63 60 57 63 60 57 60 58 55 62 58 55 62 62 57 63 60 57 63 60 57 63 58 55 64 62 59 63 60 57 64 62 57 62 58 55 64 62 55 64 62 57 63 60 57 63 60 58 64 66 60 63 60 57 66 64 58 65 64 56 72 68 62 68 66 59 66 64 58 70 66 61 72 66 64 68 66 59 103 91 79 243 217 178 233 205 169 235 204 168 235 204 168 235 204 172 235 204 168 235 204 172 235 204 172 231 207 166 235 206 169 235 204 168 235 206 169 235 204 166 234 203 164 234 203 164 232 203 164 232 203 164 235 209 173 117 96 81 110 97 88 116 104 93 119 104 92 118 99 86 141 121 106 151 130 108 147 136 119 130 116 106 123 111 100 109 98 88 127 112 102 123 117 103 110 98 88 116 101 87 119 106 94 123 106 98 119 103 90 119 105 92 120 109 98 110 93 84 129 107 98 119 105 94 126 107 98 127 103 88 123 108 94 115 99 87 111 97 87 127 106 97 109 93 85 107 96 85 107 94 85 114 100 87 122 105 94 123 103 89 111 93 82 103 93 86 126 109 102 123 109 96 120 108 94 122 107 94 208 179 146 226 197 157 229 198 159 229 198 159 229 200 158 226 197 157 207 177 149 116 92 77 112 92 77 110 96 83 110 94 81 110 91 80 114 96 85 125 103 94 111 93 82 153 137 118 168 151 129 174 157 130 103 94 84 174 153 130 172 153 122 185 162 134 193 171 142 215 186 153 215 186 153 206 179 149 166 146 126 147 118 96 182 155 124 98 86 84 60 53 60 54 47 54 71 70 72 209 166 129 210 162 126 216 149 126 158 122 103 158 140 122 178 157 134 139 127 111 48 59 72 58 55 66 71 78 83 57 71 82 140 112 96 133 122 108 172 151 127 172 154 130 172 153 128 172 153 132 172 154 132 178 155 133 176 155 131 176 157 132 178 154 131 174 153 130 168 149 125 170 153 128 170 150 129 172 154 132 170 151 128 174 154 132 170 149 126 170 151 128 170 152 130 172 152 130 172 151 129 166 149 128 170 153 130 166 151 127 166 151 128 170 155 134 188 128 106 205 100 84 207 131 105 206 119 100 205 136 113 198 92 77 183 121 102 174 157 131 174 155 130 172 152 130 174 155 130 168 149 129 164 148 127 166 150 127 168 148 125 172 151 129 172 152 130 170 151 128 172 152 130 170 152 130 172 152 130 174 153 130 174 153 130 172 153 129 170 150 127 168 149 124 164 148 127 164 148 127 166 149 128 168 149 127 170 149 126 172 154 130 172 153 130 172 154 130 172 151 128 170 153 128 170 155 128 170 154 130 164 152 127 166 149 128 172 151 129 172 155 130 172 152 130 168 149 127 170 151 128 168 153 130 164 148 127 172 152 130 172 152 130 168 151 126 166 151 127 168 149 127 162 147 128 164 146 125 160 144 120 166 149 128 165 148 128 168 151 128 170 154 132 170 154 132 172 154 132 172 154 132 174 155 134 176 157 134 174 154 128 178 157 135 172 154 132 170 149 126 162 146 124 157 132 111 153 120 98 139 112 95 130 104 90 135 114 95 134 105 91 123 98 82 135 104 92 126 97 84 127 101 87 127 100 81 128 106 89 108 90 78 98 85 74 95 86 74 99 87 77 99 87 70 103 83 75 101 90 77 105 90 81 107 90 81 102 92 79 97 85 74 93 82 71 104 89 79 95 84 76 95 86 73 89 80 65 91 86 75 97 82 75 99 91 77 97 90 78 94 88 75 92 80 71 94 83 72 90 82 70 90 83 71 89 84 74 84 76 69 82 77 70 89 75 71 90 81 72 85 80 72 86 78 71 87 79 69 82 76 67 74 69 63 84 80 74 83 82 75 83 81 72 77 79 71 83 82 72 83 79 72 77 73 67 75 73 65 75 72 64 73 70 64 75 72 62 78 76 68 78 76 70 75 70 62 74 68 62 77 74 68 77 74 65 81 74 66 111 99 81 243 217 179 233 203 166 235 204 172 235 204 172 235 206 169 235 206 171 235 206 171 235 206 167 235 204 172 235 204 170 235 204 172 235 204 168 236 204 164 236 204 164 232 203 164 230 202 164 232 203 164 238 209 170 123 103 85 122 99 92 111 101 91 119 106 96 119 102 88 141 119 105 203 184 155 148 137 124 133 118 108 129 120 105 109 102 89 125 116 104 122 114 102 111 101 91 117 101 94 123 106 98 119 105 94 122 105 94 119 106 96 120 109 98 110 93 84 126 106 96 123 106 98 126 107 98 129 106 96 98 83 71 154 134 109 107 91 79 129 111 98 148 136 118 93 84 78 86 77 69 118 102 93 129 107 98 126 107 100 115 96 85 103 93 86 127 112 102 130 110 100 121 107 94 218 192 157 230 200 156 230 200 156 230 200 156 230 200 156 226 197 157 232 198 162 128 106 92 125 100 92 125 100 92 126 104 92 126 106 96 118 98 88 122 105 94 126 107 94 110 92 82 153 134 118 172 155 131 172 153 131 113 106 92 177 155 128 203 178 149 218 189 155 210 183 149 208 179 146 190 162 138 172 153 128 172 154 130 164 142 119 147 131 115 66 80 91 51 58 67 42 50 63 195 160 122 230 175 126 157 140 116 184 131 114 135 99 84 152 142 128 100 80 65 98 88 77 50 47 58 56 63 73 60 69 81 56 72 86 107 99 96 178 157 135 170 151 130 170 155 128 170 151 128 170 153 126 170 152 130 172 154 132 170 151 128 172 155 128 172 151 128 172 154 132 170 153 132 172 153 131 168 151 129 176 155 133 172 153 131 172 154 132 174 153 128 172 154 134 172 154 132 172 154 132 170 152 130 170 152 130 166 149 128 166 149 128 164 148 127 164 150 128 181 121 103 201 100 84 203 118 100 227 193 155 203 115 96 198 94 80 182 113 94 168 155 132 172 154 130 170 155 128 170 152 126 170 153 128 164 149 129 164 147 127 166 151 129 172 152 130 172 153 133 172 152 130 172 154 132 172 154 132 170 151 128 170 153 128 168 153 130 172 151 128 170 152 130 168 153 128 168 151 129 164 148 127 164 148 124 166 148 126 166 147 127 170 151 126 168 153 130 172 154 132 170 151 126 172 155 128 170 150 124 170 150 132 166 151 127 166 151 127 168 149 127 166 150 125 170 151 128 168 149 127 174 151 130 172 151 128 168 153 128 172 151 128 170 154 130 170 152 130 172 155 133 170 153 128 164 148 130 164 148 127 158 142 120 164 146 128 162 148 126 166 151 127 166 151 129 168 151 126 168 151 129 172 155 130 170 151 130 174 154 132 174 155 130 174 156 131 174 157 133 174 154 132 168 153 128 144 131 108 162 125 105 152 122 101 135 108 91 135 105 89 134 106 94 139 105 88 144 106 91 144 106 94 145 107 93 144 106 90 153 110 97 132 99 87 120 99 84 142 109 89 148 113 95 148 106 91 161 111 94 152 113 92 160 111 91 140 102 86 143 114 93 156 114 95 147 104 87 152 113 95 136 103 87 141 109 95 153 110 97 139 104 85 160 113 92 156 115 94 147 108 89 144 109 87 143 108 89 148 106 91 144 107 92 144 106 91 152 106 91 152 108 88 148 107 90 152 106 91 148 107 89 141 102 86 143 105 87 145 106 87 153 107 88 149 103 92 164 119 97 159 111 89 165 117 96 172 122 100 175 124 98 163 115 93 164 118 95 159 106 90 151 103 84 152 104 82 151 101 81 150 97 79 143 102 83 146 102 79 144 96 79 139 97 82 141 97 79 146 97 82 129 95 73 243 218 181 235 204 168 235 204 172 235 204 172 235 206 171 235 204 170 237 203 171 235 206 169 236 204 164 235 204 168 235 204 170 235 204 166 236 204 164 236 204 164 235 204 166 236 204 164 233 203 166 238 209 170 113 96 82 121 98 90 118 101 90 119 102 88 118 100 88 150 128 110 154 138 117 148 137 118 131 118 106 121 112 101 118 100 88 128 116 105 123 117 103 111 97 87 121 99 92 122 105 94 122 106 96 129 107 98 122 106 96 120 107 94 112 103 90 133 108 100 134 109 97 123 108 90 123 107 91 88 83 76 162 142 125 122 105 95 95 84 76 212 188 158 134 119 104 111 96 85 126 109 96 126 107 100 126 109 96 115 99 87 103 93 86 115 101 87 114 97 85 223 191 153 226 196 161 224 194 155 229 198 159 230 200 156 229 200 158 224 193 161 137 116 96 122 102 92 117 94 86 117 94 86 118 100 87 117 97 87 118 100 87 122 103 89 126 107 96 110 93 79 152 142 121 166 149 128 168 152 122 173 144 121 212 181 149 217 184 154 198 176 148 186 167 140 174 153 130 176 152 129 174 155 130 172 153 128 168 151 129 144 128 110 63 64 65 45 43 53 85 73 71 229 181 136 185 156 128 64 83 96 58 72 81 125 93 87 69 65 61 151 138 120 112 104 96 50 62 72 54 60 71 50 53 65 56 72 86 106 95 89 178 157 135 172 154 132 176 157 134 176 155 135 178 155 133 178 155 133 178 159 136 176 155 133 174 156 134 176 155 133 176 155 133 174 154 132 174 154 132 174 156 134 172 151 128 172 153 131 172 153 128 176 155 133 172 154 132 172 152 130 170 151 128 168 151 129 164 148 127 170 155 134 166 151 129 168 151 129 168 151 131 189 121 104 202 103 86 207 123 102 215 174 143 208 131 111 194 95 79 182 118 97 180 155 135 178 157 133 172 153 131 174 155 130 170 151 126 168 151 129 168 149 127 168 151 129 170 152 130 172 154 132 172 154 132 172 154 132 172 154 132 172 153 131 172 154 130 172 152 130 170 151 128 170 155 126 168 149 127 170 151 126 168 151 129 166 148 126 168 147 126 166 147 127 172 149 126 168 148 125 170 153 128 172 154 130 170 152 130 168 149 127 172 154 132 170 151 128 166 149 128 172 149 126 170 153 130 172 154 132 168 151 129 170 151 128 170 152 130 170 153 128 170 151 128 168 153 128 166 151 127 168 151 127 166 149 128 168 151 129 168 151 129 168 151 129 164 148 127 166 148 126 166 151 127 170 152 130 172 154 132 168 149 127 174 154 132 172 154 132 180 158 133 176 155 133 178 160 134 176 155 133 176 157 134 172 154 132 180 157 129 144 122 102 158 126 112 135 108 91 148 116 99 144 111 99 136 103 90 136 100 87 148 109 91 143 105 88 150 110 92 152 111 89 144 106 90 148 104 89 143 104 85 148 104 84 152 109 91 152 106 88 167 110 89 172 117 99 159 116 94 152 111 89 158 118 96 160 108 88 172 117 96 160 111 91 140 101 82 147 105 88 160 113 92 169 116 95 175 118 95 168 112 91 167 108 88 167 108 88 167 110 89 163 112 90 159 107 88 159 109 88 159 112 89 160 111 90 171 113 93 182 124 102 175 118 95 185 129 108 181 123 101 175 119 98 178 120 94 183 123 100 181 121 98 179 118 95 168 114 90 171 114 89 167 108 87 175 116 94 179 116 92 178 115 93 181 111 90 183 117 92 182 112 89 183 117 92 186 118 93 190 120 95 183 117 92 190 120 95 198 123 98 159 105 85 243 217 177 233 203 168 235 204 168 235 204 168 235 204 172 235 206 169 235 204 170 235 208 170 235 204 172 235 201 170 233 203 170 235 206 169 233 203 166 234 203 164 236 204 164 235 204 166 235 204 168 238 209 170 114 98 83 125 100 92 122 102 93 122 105 94 118 100 88 138 124 108 142 129 106 156 144 126 128 114 103 129 118 106 108 99 88 127 112 102 125 114 102 110 98 90 120 106 90 127 105 90 119 105 94 119 105 94 122 106 96 120 108 96 115 102 89 127 109 98 126 107 94 132 115 104 100 96 97 151 149 131 227 204 169 164 152 142 76 69 65 192 174 152 103 92 78 131 113 101 133 110 102 133 110 100 130 107 97 116 105 85 106 92 81 122 98 87 184 160 135 212 184 152 215 186 153 227 197 155 223 195 157 226 196 161 209 180 150 137 109 91 114 93 81 111 95 88 110 96 86 114 98 90 119 99 85 114 96 87 118 102 87 124 102 88 130 108 94 114 97 86 151 135 118 172 153 128 177 153 129 207 170 140 205 177 148 182 161 134 180 159 130 182 160 137 174 155 128 174 159 132 170 153 132 168 151 129 166 149 128 166 152 130 174 156 129 104 98 94 95 84 79 246 205 159 80 85 84 85 92 99 77 77 80 78 74 70 45 42 47 152 138 120 122 112 104 55 63 75 64 75 86 56 61 73 58 69 83 99 95 88 176 158 140 172 154 134 174 153 130 172 152 130 172 154 132 172 155 134 176 153 131 172 154 132 172 154 130 172 152 130 172 154 130 172 154 132 170 154 130 170 154 130 174 157 132 174 157 133 170 155 132 174 155 134 172 154 130 172 154 130 172 157 135 170 153 132 166 150 127 168 152 132 168 151 126 164 148 127 166 147 127 184 122 103 202 108 92 216 147 123 225 175 146 233 181 151 216 141 119 173 121 100 178 154 131 170 155 130 172 155 132 174 157 133 170 151 126 168 151 126 166 151 126 166 149 128 162 148 126 166 149 128 168 151 128 170 153 130 172 154 132 174 154 132 174 153 130 172 153 128 172 154 130 170 155 130 172 154 130 172 154 130 172 154 132 172 153 128 168 151 126 168 148 125 168 149 127 168 150 124 170 155 130 170 152 130 172 153 131 172 154 132 168 148 125 168 151 127 164 148 127 164 144 124 168 151 126 168 149 127 164 146 125 168 151 127 168 148 125 166 150 123 168 148 125 168 151 127 166 148 126 168 151 127 170 152 130 170 149 126 168 148 125 170 152 128 168 151 127 168 151 129 172 151 128 170 153 128 172 155 132 174 154 132 178 157 133 174 153 130 178 158 131 174 154 132 172 154 130 174 153 128 174 157 135 176 155 133 176 155 133 178 161 136 142 114 97 141 114 98 143 118 98 131 110 91 136 103 90 131 105 85 148 110 95 148 110 95 143 101 82 150 107 89 132 99 82 135 101 86 152 106 88 152 106 88 151 115 93 159 106 86 167 116 92 167 118 94 163 109 89 164 114 92 159 107 88 167 115 94 168 114 93 156 107 86 148 107 90 159 112 93 164 114 92 172 117 96 160 113 92 159 107 88 167 110 89 167 110 89 167 110 89 163 107 88 163 109 89 160 109 89 163 109 89 167 108 88 178 119 97 175 118 96 182 125 102 182 120 96 185 125 101 182 118 94 181 121 98 182 120 96 182 118 94 175 116 90 182 118 94 174 110 88 162 102 82 175 110 88 179 114 91 175 114 91 182 109 88 182 112 89 182 109 88 183 117 92 190 120 95 186 116 92 190 117 93 186 118 93 194 121 96 168 123 101 242 213 172 236 204 164 235 204 166 233 203 168 236 204 164 235 204 168 235 206 167 235 206 167 235 204 172 233 203 170 235 204 172 235 204 166 235 204 166 235 204 166 235 204 168 236 204 164 233 203 166 239 213 173 130 106 95 126 106 92 117 98 90 126 106 96 122 102 88 141 127 108 179 163 139 161 147 130 131 118 106 127 114 104 108 99 88 122 114 100 123 117 103 111 99 92 119 102 93 122 106 96 126 107 98 119 105 92 129 107 100 124 112 101 115 104 91 126 106 96 126 106 91 87 91 88 58 77 89 167 155 134 195 181 155 71 75 82 83 78 85 128 122 110 54 48 45 127 112 98 135 117 97 133 110 102 133 110 100 123 110 98 110 91 80 157 131 109 208 179 152 215 183 150 218 189 154 215 186 153 224 194 155 211 186 153 112 95 81 104 94 83 98 88 80 95 82 71 110 96 86 102 90 77 103 90 75 102 87 75 106 90 77 102 81 72 107 94 81 119 103 90 152 136 114 172 150 124 205 177 148 167 145 117 172 158 127 180 156 128 180 160 135 182 158 135 178 157 135 176 157 132 174 155 130 170 152 130 174 154 132 172 154 132 172 155 132 119 107 91 51 52 56 139 130 110 64 73 85 70 85 96 70 69 77 77 83 87 76 71 68 119 105 91 149 131 114 59 72 84 55 75 89 58 73 83 62 73 84 113 106 100 147 135 114 168 153 130 170 151 128 166 149 128 170 152 130 170 149 126 170 152 130 172 154 132 172 154 132 172 154 132 172 154 132 172 154 132 168 151 129 172 152 130 172 154 132 172 154 132 174 154 132 172 154 134 172 154 132 170 152 130 168 149 127 166 148 126 164 148 127 168 151 128 168 151 129 162 146 126 162 148 126 186 134 114 199 102 85 222 152 127 219 163 136 205 118 97 194 87 75 166 125 104 172 154 132 172 154 130 172 153 128 172 154 132 172 154 130 172 154 132 170 152 130 170 151 128 168 151 129 168 151 129 170 151 128 170 152 130 172 154 132 172 154 132 178 155 133 176 155 133 172 154 132 172 154 132 172 154 132 174 155 130 172 154 132 172 154 132 168 149 131 172 152 130 170 151 128 170 151 128 172 154 132 172 152 130 172 151 128 168 149 127 172 153 131 168 149 127 164 148 127 172 153 128 172 154 132 172 152 130 170 151 128 172 154 132 172 154 130 172 154 132 174 155 130 172 154 132 172 154 132 172 154 132 172 154 132 172 154 134 172 152 130 174 153 130 170 152 130 172 153 131 172 154 134 172 154 134 176 155 135 174 153 128 172 153 128 172 154 132 172 154 132 172 154 130 172 152 130 170 153 128 172 154 132 172 154 130 172 154 130 176 157 132 165 147 124 147 114 97 156 122 105 139 115 98 135 108 89 135 104 90 143 108 89 144 111 89 131 101 85 131 103 87 143 107 85 147 105 88 152 108 88 148 113 87 143 101 82 170 119 97 163 116 95 169 116 95 160 108 88 164 111 91 175 119 98 175 119 98 169 116 95 164 116 94 151 106 85 160 111 90 171 115 94 168 116 92 164 111 91 164 111 91 155 106 88 163 109 89 169 116 95 168 114 90 167 108 88 168 112 91 164 111 91 167 110 89 171 115 94 168 114 93 182 118 94 179 114 91 178 119 97 183 117 92 182 120 96 182 120 96 181 123 101 183 117 92 171 109 88 166 106 85 167 110 89 167 107 85 174 108 86 174 114 92 179 111 90 182 112 89 183 117 92 183 117 92 183 117 92 182 114 90 183 117 92 194 121 96 194 121 96 162 118 90 239 213 173 232 202 162 235 204 168 235 204 168 235 204 166 233 203 166 234 203 164 236 204 164 235 204 172 233 203 168 236 204 164 236 204 164 235 204 166 235 204 166 235 204 170 235 204 172 235 204 168 240 213 175 126 103 89 125 100 92 120 104 93 119 102 88 110 98 90 146 131 114 165 143 121 161 147 132 125 116 104 128 116 104 108 96 87 130 120 109 125 116 104 111 100 90 122 102 92 122 105 94 119 105 92 129 107 98 122 106 96 120 108 96 112 103 92 127 105 90 123 106 98 78 91 95 58 72 80 145 133 116 73 77 80 59 60 67 83 85 90 70 67 77 97 86 80 133 112 104 126 107 100 130 109 98 126 105 93 119 101 88 102 81 76 214 186 155 215 186 152 218 189 155 221 191 155 215 186 153 219 190 156 115 98 85 119 101 90 118 100 88 126 110 96 116 96 83 133 108 100 127 108 94 126 109 96 133 110 100 130 107 93 135 105 93 135 107 93 119 102 88 158 140 123 176 151 126 194 166 141 107 95 82 174 156 132 178 155 133 178 155 133 180 160 135 180 158 133 180 157 133 178 155 133 180 158 133 180 158 135 174 154 132 172 154 132 154 136 117 58 53 58 50 57 67 64 77 84 90 84 91 73 68 77 84 82 85 85 85 87 124 104 92 189 167 140 72 67 66 56 65 77 60 69 81 46 65 78 158 142 120 150 134 116 161 145 128 168 151 129 170 154 132 168 151 129 170 151 128 172 152 130 170 151 128 172 155 130 174 154 132 172 152 130 170 152 130 166 151 129 172 154 132 172 154 132 172 154 132 172 154 132 172 152 130 172 154 132 170 151 128 164 148 127 164 148 127 166 149 128 164 148 127 164 148 127 164 148 127 164 148 127 170 151 125 174 147 127 170 132 109 176 137 115 178 135 112 172 127 108 164 148 127 174 154 132 176 153 132 172 152 130 174 153 126 174 154 132 172 154 130 172 154 130 166 149 128 166 153 128 164 148 127 170 151 128 172 152 130 172 154 132 176 155 133 172 152 130 174 155 130 176 155 133 172 154 130 172 155 132 174 155 130 178 155 133 174 154 132 174 154 132 176 155 133 172 154 132 176 155 133 174 155 132 178 160 136 172 154 132 170 152 130 178 156 135 174 157 134 170 153 128 172 152 130 172 154 132 166 148 126 170 152 130 168 151 127 168 151 129 170 151 126 172 154 132 172 152 130 172 154 130 170 149 126 172 154 132 170 152 130 172 154 132 170 151 128 170 151 128 172 154 132 172 154 132 172 152 130 170 152 130 170 151 128 172 151 128 172 152 130 172 154 132 176 155 133 174 154 132 178 157 133 178 159 136 176 155 131 172 152 130 178 156 131 180 155 131 149 136 114 159 125 107 140 112 95 147 120 97 139 108 89 155 119 102 154 111 97 135 97 78 129 94 83 139 101 85 157 114 97 157 114 94 151 109 86 152 108 88 168 115 97 160 111 91 152 112 92 156 113 97 160 111 91 169 116 95 168 112 91 168 114 93 167 116 93 163 107 88 168 112 91 167 115 94 167 110 89 164 111 91 164 109 88 167 116 95 168 112 91 163 109 89 167 112 88 163 107 88 167 108 88 167 110 89 171 112 90 172 116 94 177 116 93 179 116 92 185 125 101 181 121 98 181 121 98 185 125 101 187 125 101 182 114 90 183 117 92 178 112 89 171 111 91 170 106 84 170 112 87 178 120 94 175 112 90 170 104 84 182 114 90 182 114 90 194 121 96 186 118 93 190 120 95 194 121 96 194 121 96 197 124 99 151 111 88 243 217 181 235 204 166 235 204 166 233 203 168 234 203 164 235 204 166 235 206 169 235 204 168 235 204 168 235 204 170 231 203 168 236 204 164 233 203 166 232 202 164 235 204 170 235 204 172 229 202 166 241 216 179 123 96 83 122 102 92 110 97 88 118 97 86 123 107 97 115 99 85 161 145 126 131 116 101 124 114 103 128 115 106 112 98 86 128 118 104 128 116 105 103 95 82 113 95 88 115 101 89 64 53 49 107 91 84 122 103 90 123 109 98 119 106 98 131 112 95 126 109 98 65 78 86 116 115 107 183 161 137 108 104 100 60 53 56 71 61 70 78 74 75 80 76 68 130 106 95 119 106 98 116 104 93 123 106 98 115 101 91 122 104 88 227 194 166 209 178 148 205 179 148 207 170 140 212 185 156 129 107 98 107 95 84 118 96 84 119 104 92 127 106 97 122 103 94 130 106 95 130 112 98 133 108 100 129 107 98 126 104 91 134 105 91 134 112 97 112 103 90 158 138 117 187 159 137 160 143 119 108 98 87 180 158 135 180 160 137 178 158 131 179 160 131 180 156 134 178 157 135 178 155 133 176 159 132 180 158 135 178 157 133 172 155 130 169 154 134 69 61 67 61 64 77 74 85 95 59 57 68 65 55 64 63 62 69 75 76 72 130 118 101 172 155 132 153 139 122 51 52 58 70 67 68 153 145 129 166 151 129 168 150 128 168 151 129 172 154 132 168 151 128 166 149 128 168 151 129 170 152 130 174 155 130 174 155 130 174 154 132 172 154 132 172 154 132 168 153 130 174 154 132 172 152 130 170 154 132 172 154 132 172 154 132 172 154 132 170 151 128 168 148 125 168 151 129 166 149 128 172 155 132 164 148 127 168 151 129 166 151 129 174 149 128 170 152 130 164 150 128 160 146 125 164 144 127 160 146 123 164 148 121 170 152 130 172 155 132 174 154 132 176 155 131 172 154 132 178 155 133 170 149 126 164 148 127 164 148 127 164 148 127 170 152 130 168 151 129 174 154 132 172 153 128 172 153 126 172 149 126 172 152 130 172 154 130 176 155 133 172 154 130 178 155 133 174 154 132 172 154 132 174 154 132 172 154 132 172 154 132 176 155 131 176 155 133 172 154 132 178 155 133 176 155 133 172 155 130 170 151 127 170 152 130 176 155 133 170 152 130 168 151 129 168 151 129 166 149 128 170 152 130 170 149 126 168 151 129 170 152 130 172 154 132 172 154 132 170 151 128 172 154 132 172 152 130 170 152 130 170 151 128 170 151 128 172 154 132 172 152 130 172 154 134 172 154 132 172 154 132 176 155 133 178 155 133 176 155 133 176 155 133 180 162 134 180 162 136 176 155 133 180 158 135 180 156 134 172 154 130 144 122 103 165 128 105 143 111 92 139 114 95 150 118 99 143 115 93 139 104 86 145 107 93 144 106 90 158 112 99 151 113 92 156 111 90 167 123 103 161 114 95 151 112 89 154 117 98 164 116 98 164 114 92 168 114 93 164 111 91 163 109 89 166 111 91 160 111 91 164 111 91 172 117 96 169 116 95 164 111 90 151 103 82 147 105 88 148 109 92 156 108 89 163 107 88 163 107 88 169 116 95 167 110 89 172 116 91 179 114 91 182 119 95 179 117 90 181 121 98 181 121 98 178 116 93 182 118 94 174 110 87 174 117 96 174 115 94 151 98 76 182 113 91 170 107 87 179 114 91 182 118 94 178 116 91 182 114 90 182 112 89 186 116 92 182 114 90 186 118 93 186 118 93 194 121 96 194 121 96 190 120 95 148 114 91 240 210 173 231 203 166 234 203 164 236 204 164 234 203 164 231 203 166 236 204 164 235 204 168 228 202 164 228 201 162 235 204 168 230 202 164 230 202 162 230 202 164 228 202 164 232 203 164 231 203 168 239 216 177 132 108 94 125 100 92 117 100 92 122 100 87 116 103 93 118 99 90 115 103 87 128 118 105 131 118 106 126 112 100 118 94 84 125 116 104 121 112 101 101 94 85 109 96 83 87 79 67 164 148 127 88 72 62 126 107 98 123 111 100 119 105 95 119 106 96 119 106 96 111 100 93 111 94 86 97 90 79 108 97 86 112 104 95 112 101 88 117 109 95 115 103 95 120 110 93 120 108 96 117 108 94 123 108 95 102 98 85 177 151 123 217 187 157 218 189 155 205 179 148 222 191 161 125 106 85 110 98 88 103 91 76 129 113 102 130 111 98 129 114 100 139 120 104 138 123 103 141 123 108 143 128 109 141 121 106 147 132 113 145 123 106 155 136 119 112 104 92 174 152 129 182 157 133 160 139 122 118 107 90 180 162 136 182 164 140 180 159 132 182 158 135 182 160 137 182 164 138 180 158 133 178 157 135 180 160 133 180 160 133 178 162 132 117 109 99 54 49 54 75 83 88 79 88 98 56 61 73 75 70 79 76 76 81 72 72 72 138 124 105 172 155 132 161 146 122 61 60 59 86 81 83 179 157 132 168 151 132 168 152 130 168 151 129 166 149 128 174 155 134 172 153 131 176 159 136 174 155 134 174 154 132 174 155 134 178 155 133 172 154 132 172 154 134 176 152 130 172 152 130 172 153 132 174 153 134 174 153 134 176 155 135 174 154 132 178 157 135 170 150 126 170 152 130 164 148 127 172 153 132 168 148 125 164 148 127 166 149 128 166 148 129 166 152 126 166 151 129 164 146 125 160 148 125 164 144 121 164 148 127 166 149 125 168 150 124 176 155 133 176 155 133 176 157 134 178 160 132 174 155 132 172 154 132 170 155 128 168 153 128 172 155 132 172 155 130 168 155 128 172 154 132 170 153 126 172 151 128 176 154 128 174 159 133 176 155 131 172 151 126 174 151 128 174 155 130 172 154 132 174 154 132 170 153 128 172 151 129 168 153 126 168 150 125 166 149 128 170 151 128 168 152 125 170 149 126 168 148 125 168 151 129 168 150 124 166 146 123 168 151 129 170 155 132 166 149 125 172 152 130 164 148 125 170 152 128 170 152 130 170 151 128 168 149 127 170 151 126 170 151 128 172 154 132 174 153 130 172 154 132 172 154 134 172 154 130 172 153 131 170 153 130 172 153 128 172 154 132 174 154 132 176 155 133 172 156 133 172 154 132 174 156 134 176 155 133 174 154 128 176 156 130 176 155 134 172 154 130 172 152 127 140 117 97 146 121 104 139 111 94 138 109 95 131 105 87 122 99 85 131 103 87 144 109 91 136 103 87 159 116 94 155 114 95 158 116 99 158 118 96 153 109 94 161 111 94 160 124 103 156 111 90 162 111 90 167 118 95 170 120 98 168 112 91 160 109 89 163 112 90 168 114 93 175 114 91 163 113 90 159 114 90 152 108 90 160 114 91 164 111 91 156 109 92 164 114 92 167 110 89 171 112 90 178 120 94 175 112 85 178 116 91 179 114 91 178 116 93 178 116 93 182 118 94 179 111 90 175 114 89 174 110 88 174 110 88 175 116 92 175 115 94 174 107 87 178 114 91 170 107 87 167 107 85 178 105 85 170 103 83 182 109 88 182 107 87 178 110 87 182 111 89 190 120 95 190 120 95 198 123 98 147 116 93 239 213 173 235 204 166 230 202 164 235 204 168 233 203 166 233 203 166 234 203 164 232 203 164 231 203 168 230 202 164 228 202 164 230 202 164 230 202 162 232 203 164 229 201 160 228 201 162 228 201 162 240 215 175 137 105 91 126 104 92 118 100 87 125 102 92 116 104 91 119 104 94 118 96 84 115 100 90 115 100 89 106 90 77 118 95 86 122 104 92 115 99 87 87 80 73 102 87 80 110 101 92 233 205 170 149 131 113 131 108 93 121 111 97 126 106 96 122 106 96 123 107 93 126 108 98 126 106 94 127 114 102 133 116 106 131 116 104 134 117 104 135 122 108 131 117 102 134 118 106 128 116 105 134 120 108 136 124 110 125 113 102 218 189 154 224 194 155 225 196 163 201 175 146 169 148 126 107 87 72 151 139 116 158 140 118 158 140 118 153 140 116 164 146 122 164 148 121 167 152 131 175 155 134 169 153 128 172 150 127 180 161 138 173 152 130 176 154 132 155 137 113 170 148 124 166 139 120 170 148 124 170 145 123 178 160 132 178 160 136 176 157 130 178 155 133 176 155 133 178 155 133 180 156 134 178 159 132 180 160 133 172 153 126 129 118 99 168 156 133 75 57 57 88 90 88 80 91 101 55 61 72 81 74 78 83 82 87 65 64 62 145 127 109 170 152 130 149 140 118 75 71 73 97 91 85 176 159 132 170 152 130 170 151 130 170 151 128 170 152 130 168 151 129 170 153 129 172 152 130 170 151 130 168 151 129 172 155 131 172 152 130 168 149 127 172 154 132 168 150 126 166 148 126 172 152 130 170 153 126 168 152 128 172 154 132 176 155 133 174 155 130 174 153 130 178 155 133 172 154 130 172 154 132 172 153 131 174 155 134 172 154 132 172 152 130 172 155 132 172 154 134 166 149 128 172 154 132 164 148 127 168 151 131 166 149 131 170 153 128 172 154 130 174 155 130 170 152 130 174 154 132 174 155 134 176 155 133 172 154 132 172 154 132 172 154 130 172 156 133 176 155 133 172 154 130 176 154 128 176 153 131 172 154 132 172 152 130 170 151 128 172 154 132 174 153 128 170 152 130 170 148 124 174 153 130 168 151 129 172 152 130 170 152 130 170 152 130 174 152 128 174 155 130 172 152 130 174 153 130 174 154 132 172 154 132 172 154 134 172 154 132 168 153 130 168 153 130 166 148 126 172 153 132 172 154 132 172 154 134 170 154 132 164 148 127 170 153 128 166 150 126 166 148 126 162 148 124 168 149 127 172 154 132 170 149 126 172 154 130 172 154 132 170 154 132 170 152 130 168 151 127 170 154 132 172 154 134 174 154 132 172 152 130 176 155 133 180 158 135 174 155 131 172 153 128 174 153 130 176 155 133 176 155 131 163 149 130 160 125 104 169 133 112 154 120 100 158 123 108 131 104 88 143 110 86 152 115 96 155 119 101 163 118 96 156 111 93 152 112 92 163 115 93 158 109 96 143 103 82 143 106 80 152 112 92 165 114 96 156 107 91 167 118 94 173 120 98 148 109 90 152 106 88 155 114 90 158 118 96 152 110 87 165 115 98 170 117 99 164 111 91 162 118 99 151 105 86 181 121 98 181 121 98 168 112 91 167 110 87 168 112 91 176 116 93 174 110 88 171 112 90 167 110 89 172 116 88 174 114 92 180 121 98 171 109 89 170 108 86 174 117 96 166 104 83 174 107 87 182 109 88 166 104 83 162 99 79 178 110 87 163 94 75 182 112 89 182 114 90 183 117 92 183 117 92 183 117 92 183 117 92 199 119 95 141 111 94 243 211 177 230 202 164 233 203 168 232 203 164 232 203 164 235 204 166 236 204 164 232 203 164 228 202 164 228 202 164 228 202 164 230 202 164 228 202 164 228 201 162 228 202 164 229 200 158 228 202 164 240 215 173 135 105 86 126 106 96 117 97 87 122 103 89 115 101 91 126 104 92 118 100 88 115 103 91 122 99 90 102 86 78 118 92 85 118 100 88 120 108 96 90 80 73 80 69 63 140 129 114 121 106 98 73 66 67 102 84 82 119 104 92 122 103 92 120 108 98 111 101 93 120 104 94 115 101 93 123 108 95 123 107 94 126 108 96 118 105 96 126 105 94 133 110 100 133 112 102 130 112 102 134 117 102 129 119 103 147 133 117 212 181 149 208 175 144 206 182 148 185 162 134 161 144 122 100 83 72 174 159 134 187 167 142 178 162 130 182 162 138 182 162 138 188 166 140 182 161 139 187 165 143 182 161 136 176 159 134 178 159 136 180 156 134 174 153 130 164 144 122 168 149 128 158 136 119 176 154 130 178 158 133 178 157 135 178 156 131 178 155 133 178 162 138 178 159 136 180 158 135 180 160 133 182 158 135 180 158 135 180 160 133 178 158 135 146 125 101 164 139 109 144 131 119 83 84 73 78 78 83 79 80 90 67 65 68 161 149 130 148 134 114 160 146 125 150 135 117 114 102 89 134 118 102 170 152 130 170 151 128 168 151 129 168 151 129 168 151 129 172 151 129 170 151 128 168 151 129 168 151 129 172 151 128 168 151 129 172 154 132 172 154 132 172 153 130 168 148 125 176 155 131 170 152 130 172 154 130 174 154 132 174 155 134 174 154 132 174 154 132 170 152 130 170 152 130 172 154 132 172 154 132 174 154 132 170 152 130 172 154 132 172 154 132 170 152 130 172 152 130 170 152 130 164 148 127 164 148 127 166 149 128 164 148 127 164 148 127 168 147 126 170 151 130 172 154 132 172 154 132 168 151 129 172 154 132 172 153 128 172 152 130 172 154 132 172 154 132 172 154 132 178 155 133 172 155 128 176 155 131 174 155 130 172 153 128 174 153 130 172 152 130 174 154 132 174 154 132 176 155 131 176 155 133 180 156 134 174 154 132 174 154 132 174 154 132 172 154 132 176 155 133 174 154 132 174 153 130 172 154 134 172 154 134 172 155 128 168 151 129 168 151 129 164 146 125 166 151 129 164 148 127 166 149 128 168 151 129 168 155 132 170 154 132 174 154 132 166 151 127 168 151 129 170 152 130 166 151 129 164 150 128 166 149 128 170 152 130 170 152 130 170 152 130 170 153 128 168 153 128 172 152 130 174 152 130 172 155 134 174 155 130 176 155 131 176 155 133 178 153 133 174 154 132 176 155 133 180 160 135 182 164 140 182 159 134 157 138 116 159 139 115 172 147 125 186 149 125 175 136 110 188 130 107 195 137 114 193 136 114 185 132 112 181 135 114 185 128 106 178 128 107 168 122 99 172 120 98 174 129 100 175 119 98 176 121 99 175 124 101 167 113 96 171 123 102 172 117 96 178 120 95 172 121 98 179 121 99 178 117 95 170 115 94 172 120 94 164 113 96 175 124 101 152 104 87 154 109 96 152 104 83 168 114 93 169 119 96 171 115 94 173 115 92 178 116 93 181 117 95 171 113 90 182 118 94 190 120 95 189 125 101 182 114 90 170 105 85 167 108 88 162 101 80 170 107 87 182 118 94 183 117 92 182 112 89 182 114 90 183 117 92 182 114 90 194 121 96 183 117 92 183 117 92 186 118 93 186 118 93 194 121 96 136 110 89 243 217 181 229 202 166 228 202 164 234 203 164 232 203 164 230 202 162 235 204 166 232 203 164 229 201 160 228 202 164 228 202 164 229 201 160 229 201 160 228 201 162 229 200 158 229 200 158 229 201 160 239 216 181 128 100 81 122 101 90 121 103 93 125 102 94 116 104 94 126 106 96 118 99 90 126 109 100 122 106 96 117 99 89 118 96 84 126 105 96 119 106 96 111 100 86 123 114 105 85 72 70 67 61 65 75 70 73 101 88 80 120 109 98 118 104 94 122 103 96 107 95 86 111 96 87 107 95 84 114 96 80 114 96 85 111 99 86 114 99 85 114 96 85 130 111 100 134 118 106 127 109 98 133 114 104 125 116 101 177 154 132 195 166 137 198 164 137 185 156 129 182 162 134 160 142 121 99 79 70 181 162 142 184 164 140 182 160 135 189 168 140 188 166 137 189 167 144 186 164 138 188 164 140 182 161 138 180 160 137 180 158 135 174 155 136 168 149 128 152 132 115 158 138 117 153 134 113 182 161 140 182 162 136 182 164 138 180 162 138 180 164 136 180 158 130 184 162 136 180 162 136 180 156 134 182 162 138 180 162 136 180 160 135 180 159 134 174 156 132 168 150 128 178 157 135 166 150 124 74 73 80 88 82 86 122 113 108 172 154 135 168 151 129 166 148 124 166 149 128 163 144 123 172 154 132 170 152 130 172 153 132 172 154 130 176 157 132 178 161 138 172 154 130 176 155 135 174 153 130 172 154 132 170 152 130 170 151 128 172 154 132 172 154 132 172 152 130 174 154 132 172 154 132 170 152 130 168 149 127 168 148 128 168 151 129 170 153 132 174 156 134 168 149 128 174 154 132 170 153 128 166 151 127 170 153 130 168 151 129 172 154 132 168 153 130 172 154 132 170 151 128 172 154 132 168 151 129 166 149 128 168 151 129 168 151 129 166 147 127 162 142 122 168 149 127 168 151 129 172 152 130 168 151 129 172 154 132 172 151 128 168 151 129 172 153 131 172 154 130 172 154 132 174 154 132 176 155 133 176 155 131 172 154 132 174 154 132 176 155 133 174 154 132 172 154 132 174 155 132 178 155 133 176 155 131 172 154 132 172 155 132 172 154 132 172 154 132 172 154 132 176 155 133 172 152 130 172 154 132 168 149 127 170 152 130 168 151 126 168 149 127 166 149 128 162 148 126 162 142 123 162 148 126 164 148 127 166 149 128 164 149 127 164 148 127 166 148 126 166 150 130 170 154 130 168 149 127 166 151 127 172 154 132 170 152 130 170 152 130 168 151 129 168 151 129 168 153 130 172 151 129 170 151 128 172 152 130 176 157 134 182 162 136 180 156 134 180 158 135 180 158 133 180 156 134 180 158 135 182 160 137 178 158 134 180 156 134 174 156 132 180 159 129 180 160 133 172 149 124 163 144 118 161 146 118 162 145 121 164 146 123 172 148 123 169 145 120 166 139 114 166 138 115 171 138 119 170 130 110 161 119 94 171 123 99 175 127 103 170 127 106 162 120 99 186 141 114 180 135 114 170 119 96 173 122 102 172 119 99 169 116 96 173 122 99 171 124 99 165 122 101 168 117 97 162 109 87 162 112 87 145 103 84 159 112 96 163 115 93 167 111 90 173 116 94 170 117 96 171 115 94 171 115 94 167 111 90 171 112 90 175 114 91 175 115 91 167 110 87 166 106 82 178 112 89 182 114 90 186 118 93 190 120 95 204 128 103 193 123 98 194 121 96 197 118 95 193 112 90 194 121 96 198 123 98 198 123 98 201 125 100 218 136 112 132 105 87 240 213 175 232 203 164 228 202 164 228 202 164 228 202 164 230 202 162 228 202 164 228 202 164 229 201 160 229 201 160 228 202 164 230 202 162 229 200 158 229 201 160 229 201 160 229 201 160 229 200 158 238 210 173 138 114 97 126 105 92 122 104 96 118 106 97 112 102 89 122 98 87 115 102 89 113 106 95 112 104 94 105 98 88 111 94 86 119 104 92 115 102 89 98 89 80 156 141 129 59 60 60 69 64 69 86 81 82 100 92 83 129 111 104 120 109 98 119 104 93 117 99 92 118 102 93 120 106 91 119 106 92 118 101 90 118 100 87 126 102 92 131 115 100 128 112 101 124 113 101 130 112 102 129 117 101 150 130 116 191 160 135 194 163 137 180 156 130 182 163 134 187 167 142 153 140 120 99 76 70 181 163 138 186 164 137 182 164 140 184 162 138 186 164 140 189 168 140 186 164 138 190 171 142 189 168 140 188 166 140 184 162 136 176 157 129 175 149 123 167 140 122 164 143 125 155 134 113 182 159 136 178 162 134 178 157 135 180 160 135 184 164 136 178 161 136 176 156 128 178 155 133 178 155 133 180 159 136 178 157 135 180 158 135 176 157 132 178 155 133 178 155 133 176 155 133 167 153 131 66 57 68 77 73 81 153 142 122 170 151 126 172 154 132 172 154 134 172 152 130 172 154 132 170 149 126 172 152 130 172 152 130 172 154 132 172 152 130 170 151 130 166 148 126 168 151 129 166 147 127 170 149 126 168 151 129 168 150 126 168 149 127 164 146 125 166 145 123 166 146 122 164 146 125 162 144 125 164 148 127 164 146 125 164 148 127 166 149 128 170 151 126 168 152 126 168 151 129 164 148 127 166 148 126 164 148 127 164 149 127 166 149 128 170 152 130 168 149 124 170 153 128 168 151 129 172 154 130 168 151 129 170 152 130 172 154 132 170 152 130 164 148 127 164 148 127 164 146 125 172 154 132 164 148 127 166 147 127 164 148 127 164 148 127 164 146 125 166 151 127 166 148 126 172 154 132 170 151 126 172 151 129 172 154 132 172 152 130 174 154 132 172 152 130 170 152 130 168 147 126 170 152 130 172 152 130 172 153 128 170 152 130 168 151 129 168 149 128 168 147 126 172 151 129 168 151 128 166 147 127 166 146 125 168 149 127 170 151 132 172 154 130 168 151 129 166 149 128 162 142 121 166 146 125 168 151 129 168 149 127 170 152 130 170 153 128 174 154 132 172 154 132 172 152 130 174 154 132 174 154 132 172 155 132 174 154 132 174 154 132 176 155 133 176 157 134 174 155 134 172 154 130 164 148 127 170 151 130 136 112 96 154 126 103 174 153 130 174 155 130 176 157 136 176 159 135 171 152 128 127 102 82 168 142 117 163 146 125 172 157 131 172 152 128 180 160 135 174 155 135 170 151 128 174 156 134 172 154 134 178 155 133 180 158 133 180 160 133 178 157 135 174 154 132 176 157 132 176 157 134 177 159 134 170 157 133 174 156 133 167 147 124 126 102 83 174 132 110 216 191 156 142 132 116 168 149 127 158 139 118 176 161 137 161 147 126 166 150 134 174 155 134 169 156 135 130 118 104 117 109 91 126 111 96 112 87 72 166 114 94 159 104 83 162 104 83 166 108 85 166 110 89 172 115 92 170 107 84 163 105 84 163 105 84 158 101 83 154 99 81 124 86 69 182 135 117 191 128 106 169 117 98 82 72 69 81 80 81 122 109 104 121 109 106 81 70 63 102 79 72 124 98 89 187 149 122 174 140 112 158 134 108 169 137 115 115 100 79 240 215 175 230 201 162 232 203 164 229 202 166 233 203 166 230 202 164 228 202 164 230 202 164 228 202 164 228 202 164 228 201 162 231 201 160 229 201 160 230 200 156 229 198 159 229 200 158 229 201 160 239 208 176 127 101 87 126 102 92 123 102 93 122 106 95 118 103 91 125 100 92 115 97 86 127 113 104 133 112 104 115 102 91 110 92 81 123 109 98 122 114 102 100 93 89 70 70 69 70 72 61 84 76 74 80 76 83 78 72 69 114 99 88 126 109 102 107 96 85 107 88 79 114 95 84 112 101 81 118 96 84 114 99 86 122 103 90 126 106 96 134 113 100 133 112 102 133 114 104 130 116 106 130 112 98 182 157 135 187 157 134 178 153 129 170 150 123 189 168 140 184 164 137 155 141 123 102 83 71 176 159 132 184 164 138 178 159 136 182 164 138 188 166 140 188 166 137 186 164 138 187 168 138 186 166 140 180 158 133 182 157 132 183 159 138 144 121 102 159 135 116 166 143 127 149 134 110 178 158 133 176 157 132 176 155 131 178 157 133 178 156 131 178 157 136 178 155 133 176 159 135 180 163 138 180 158 135 178 155 133 178 155 133 182 163 138 174 155 128 174 154 132 180 156 134 172 154 136 58 57 64 81 76 80 126 114 98 166 148 126 168 149 127 170 151 128 172 154 130 172 154 132 168 150 125 172 153 129 170 153 128 170 149 126 168 151 129 170 152 130 166 149 125 166 147 124 170 151 128 170 151 128 172 154 132 168 151 132 172 152 130 168 151 129 166 148 123 170 151 128 164 150 128 168 151 129 168 149 128 166 151 128 166 151 127 172 152 134 170 151 128 170 151 126 170 151 128 170 154 130 172 153 132 168 151 131 168 153 130 172 154 134 172 152 130 172 152 130 172 154 132 172 152 130 172 154 130 174 154 132 174 155 136 172 154 134 170 152 130 164 150 128 170 154 132 164 148 127 170 151 128 172 154 132 166 148 123 166 149 128 164 146 123 162 148 126 164 150 126 170 149 130 170 153 128 172 157 135 161 147 125 142 123 101 170 150 127 174 154 132 170 152 130 172 153 131 172 152 130 166 149 128 166 148 124 170 153 126 170 151 128 170 151 128 164 148 127 164 148 127 172 152 130 170 151 126 168 149 127 166 148 126 166 148 123 172 153 130 172 154 132 168 149 127 164 146 124 155 135 117 168 151 129 176 155 133 174 154 132 172 155 132 170 151 128 172 154 130 174 153 130 172 153 131 166 148 126 166 149 125 176 155 133 174 152 132 172 154 132 174 154 132 176 156 137 178 159 134 170 153 130 172 152 133 176 159 136 158 137 112 156 123 106 180 137 115 187 140 121 115 100 93 84 89 89 117 95 86 227 162 137 162 114 91 184 157 135 88 88 87 108 107 103 143 126 116 158 140 122 170 149 126 172 154 130 174 154 132 178 159 136 182 162 136 182 161 136 182 160 135 174 155 130 180 159 136 178 163 138 182 165 140 176 157 132 180 157 134 151 131 108 186 134 118 183 128 107 151 122 102 147 108 89 111 109 106 62 74 84 77 71 70 126 104 94 121 112 98 124 114 97 94 75 63 154 142 118 174 161 134 169 160 138 126 96 86 163 114 93 168 112 91 166 114 92 167 110 89 171 111 91 178 119 97 163 109 89 174 107 87 182 112 89 176 116 93 155 104 84 143 94 76 200 145 123 224 153 129 223 155 127 131 99 87 72 76 81 70 79 87 81 90 92 91 101 106 66 61 61 147 132 117 186 164 136 190 172 140 198 172 144 202 179 145 135 120 103 239 211 170 229 201 160 235 204 166 234 201 166 230 202 164 232 200 166 230 202 164 230 202 164 229 201 160 228 201 162 229 202 166 230 200 156 229 200 158 229 200 158 228 201 162 226 197 157 230 200 156 236 206 169 124 101 85 123 104 93 123 107 94 121 99 92 112 99 87 122 102 92 110 96 85 111 99 89 99 88 80 80 76 68 110 95 84 116 107 94 113 106 95 109 103 92 86 81 82 66 68 70 69 65 69 76 76 83 88 86 86 95 86 76 126 106 96 125 103 94 125 100 92 126 105 94 126 107 94 126 107 94 133 108 100 134 115 102 133 114 104 135 118 100 132 119 102 133 118 108 133 116 108 149 128 113 191 160 130 191 162 136 158 138 111 178 158 131 182 158 135 178 158 135 151 135 117 98 82 75 172 152 127 177 159 130 178 157 133 182 164 136 182 162 134 184 164 136 188 164 140 188 165 142 188 166 137 182 160 137 185 167 144 103 91 82 72 59 54 90 84 78 115 103 91 127 111 93 136 121 107 186 165 139 178 157 135 178 155 133 174 155 130 174 154 126 172 154 130 174 154 132 174 154 132 178 157 135 178 155 133 178 155 133 174 157 133 178 155 133 172 152 130 168 150 125 146 136 118 102 89 81 91 82 83 145 128 110 168 153 128 172 154 132 172 154 132 172 154 132 174 154 132 174 154 132 172 154 132 174 154 132 172 154 134 174 154 132 168 149 128 168 149 127 170 153 128 166 149 128 168 151 129 168 153 126 172 157 131 174 154 132 172 152 130 170 151 128 166 148 126 172 154 132 168 151 129 168 151 129 170 152 130 170 152 130 166 147 127 168 148 125 172 154 130 168 151 127 172 154 130 174 154 132 170 152 130 172 154 132 168 151 129 172 154 132 172 154 132 172 154 132 174 154 132 174 155 134 174 154 132 174 155 134 178 159 136 170 155 134 170 152 130 172 154 132 172 154 132 172 152 130 166 148 126 166 148 126 166 150 127 164 148 127 168 152 130 174 155 131 159 144 120 143 128 107 135 122 106 148 137 113 168 151 129 170 154 132 172 153 131 172 152 130 170 152 130 170 152 130 168 151 129 172 152 130 172 154 134 172 154 132 174 154 132 174 154 132 174 154 132 170 154 132 170 152 130 170 153 128 172 154 132 168 149 127 172 154 130 174 154 132 168 151 129 134 119 97 129 116 93 153 134 111 174 155 136 174 154 132 172 154 132 174 155 128 174 154 132 172 154 132 170 152 130 135 120 100 122 110 85 176 157 134 174 157 133 174 154 132 176 157 134 176 155 133 172 154 132 174 153 130 176 157 130 174 155 130 182 158 135 172 150 129 172 151 128 159 138 117 89 89 89 65 77 84 123 97 93 200 144 123 171 140 120 187 166 143 83 83 82 90 97 103 54 66 71 98 85 76 151 131 110 176 155 133 172 154 132 172 154 132 174 153 130 176 159 132 178 159 136 176 158 133 180 160 137 180 160 137 180 156 134 178 160 132 180 157 137 132 114 97 174 125 101 193 140 119 211 144 121 224 158 134 51 52 65 65 83 95 98 97 93 148 128 104 164 132 116 145 114 97 130 109 88 163 143 126 166 149 131 154 144 128 136 109 90 156 102 82 159 107 88 165 110 89 175 114 91 179 116 92 186 129 105 185 121 98 171 106 86 167 108 88 164 111 91 168 112 91 129 89 71 94 82 71 181 140 105 184 139 101 217 171 125 149 117 100 82 75 79 53 59 67 127 121 115 172 150 135 154 122 106 163 131 109 189 168 137 188 164 135 197 173 148 145 128 115 237 206 169 229 201 160 230 202 164 230 202 164 230 202 164 230 202 164 228 201 162 228 202 164 228 202 164 228 202 164 228 201 162 230 200 156 229 200 158 229 200 158 229 201 160 228 201 162 228 201 162 233 208 169 123 100 84 126 107 96 120 107 95 115 101 93 112 97 87 123 108 94 119 100 86 121 103 94 115 100 89 106 93 84 108 96 88 117 108 94 107 96 89 79 78 83 65 73 85 68 78 86 68 67 73 84 81 92 83 81 82 112 104 94 119 104 94 127 111 100 127 112 98 131 111 100 129 111 104 126 109 102 134 112 99 134 115 102 134 115 102 133 110 100 130 116 106 134 118 106 125 117 99 178 149 130 185 155 129 191 163 134 166 147 125 178 159 136 182 157 134 178 162 137 152 139 120 96 82 73 174 158 130 184 162 136 178 160 132 184 164 138 182 160 134 182 160 135 182 160 137 186 165 140 180 162 137 184 163 138 105 88 71 87 80 75 91 85 74 77 68 64 84 76 71 93 83 74 85 76 62 100 85 68 178 157 135 174 153 131 174 155 130 172 153 128 168 150 126 172 154 130 172 153 128 174 155 130 172 153 128 180 156 134 174 154 128 172 154 132 172 154 130 174 159 133 168 152 131 146 126 104 162 147 128 162 147 122 166 149 131 170 153 128 168 149 127 168 149 127 170 152 130 170 149 126 170 154 132 170 153 128 172 154 132 172 152 130 168 151 129 166 147 129 168 151 126 166 148 126 166 149 128 172 152 127 170 153 132 168 151 129 172 152 127 170 155 128 168 149 127 170 151 128 168 150 126 172 152 130 168 150 125 168 151 129 166 149 128 168 151 131 168 151 129 168 153 128 168 151 129 170 152 130 172 152 134 170 153 128 168 151 129 170 153 129 172 153 131 172 152 130 172 154 132 170 151 130 172 154 132 162 146 124 176 159 136 172 154 130 180 156 134 174 154 132 170 152 130 174 151 128 170 151 128 168 153 128 176 154 130 163 149 126 140 115 97 99 86 72 152 142 117 162 143 126 170 155 131 170 157 135 174 153 130 174 151 128 174 157 133 178 154 131 174 154 132 174 155 130 172 155 136 172 154 132 174 155 128 178 155 133 174 155 130 172 153 126 172 154 132 172 154 132 176 155 133 170 152 130 172 154 132 164 148 127 164 152 129 168 150 125 170 153 132 139 119 107 215 146 125 139 121 101 162 144 128 165 153 133 165 146 128 174 159 136 164 144 123 157 133 115 142 115 96 154 119 96 176 122 106 166 133 117 163 143 123 170 149 127 170 152 130 172 154 130 174 155 130 172 154 132 178 155 133 174 157 130 178 158 131 178 155 133 178 155 133 174 155 136 168 156 132 74 67 68 115 100 97 214 153 128 127 106 89 143 122 101 150 116 97 86 89 86 57 66 78 163 133 114 161 117 98 166 151 129 160 148 125 168 149 127 168 153 130 168 153 130 172 154 132 172 153 136 166 148 128 176 153 131 182 158 135 170 145 123 133 115 99 87 94 99 110 106 98 193 140 115 205 142 119 224 151 127 73 65 65 64 75 86 51 59 72 46 57 68 157 149 128 153 140 116 166 149 130 168 153 130 164 148 127 146 133 117 135 101 85 155 104 84 171 118 93 175 112 90 183 117 92 186 120 95 187 125 101 179 114 91 167 110 86 175 119 98 164 113 93 163 109 89 134 90 73 225 155 133 134 103 84 215 168 126 142 121 103 148 125 110 236 172 138 136 97 81 167 142 115 165 127 105 150 126 109 137 108 87 184 163 140 189 167 142 195 177 151 168 145 117 231 208 170 229 201 160 228 202 164 230 202 164 228 201 162 229 201 160 230 202 164 230 200 156 228 202 164 228 201 162 229 201 160 229 200 158 230 200 156 229 201 160 228 201 162 229 201 160 229 200 158 240 212 169 127 101 87 126 111 98 120 109 98 117 106 95 108 95 82 127 109 95 111 100 88 133 110 100 122 106 96 117 94 86 115 100 88 117 106 93 69 70 66 66 80 91 67 78 88 60 62 66 113 106 93 88 82 76 120 110 98 103 93 86 119 108 98 124 102 91 114 97 85 110 97 84 113 96 85 110 96 83 110 96 81 112 103 89 114 96 85 115 101 88 119 104 93 130 112 100 127 115 102 206 174 142 179 150 126 169 147 122 166 148 125 178 157 133 178 158 134 174 156 134 146 130 113 97 82 71 174 157 132 182 162 136 180 162 134 180 159 134 176 156 129 178 157 133 182 160 137 182 162 136 180 164 138 178 157 133 115 99 84 151 140 121 135 125 115 81 73 69 106 96 87 105 91 82 171 158 139 121 109 92 172 154 134 174 153 130 172 154 130 170 153 128 172 155 128 172 154 132 174 155 130 176 155 133 178 155 133 176 155 133 180 158 135 178 157 133 176 155 133 178 156 131 174 156 134 176 155 131 172 155 128 172 155 128 170 153 132 172 154 132 170 151 128 172 152 130 168 153 130 168 151 129 172 154 132 172 155 131 174 154 132 176 157 134 172 154 131 168 151 129 172 156 133 176 155 133 172 154 132 170 151 128 168 150 126 170 152 130 170 153 128 168 152 124 168 149 127 172 151 129 168 150 126 168 147 126 172 155 132 172 154 132 168 151 129 170 151 128 170 151 128 174 154 132 168 151 129 172 152 130 172 150 131 172 152 130 170 152 130 170 153 130 172 154 132 174 155 134 172 153 131 172 152 130 178 155 133 174 154 132 176 157 134 174 157 133 178 157 135 180 158 133 178 160 136 176 158 136 174 153 132 172 157 133 152 131 107 133 115 96 177 132 111 161 138 115 164 154 126 166 149 128 168 153 130 174 155 134 172 154 130 170 151 126 170 151 128 172 155 128 176 155 133 172 152 130 170 153 128 172 154 134 176 156 133 176 155 133 176 157 130 176 155 133 174 153 130 174 154 132 172 156 133 172 153 131 172 154 132 158 146 123 168 155 132 168 153 126 180 159 134 168 154 130 156 135 117 154 128 112 169 129 111 121 97 86 55 71 81 76 79 86 135 104 97 193 136 118 207 146 125 39 41 45 51 57 64 119 95 92 210 158 131 193 143 120 159 134 115 174 157 132 180 160 133 178 157 135 180 156 134 180 160 135 180 164 136 182 160 137 182 164 136 178 157 133 176 158 131 184 164 137 181 163 138 142 129 100 157 118 100 188 134 114 217 157 134 108 96 93 101 100 103 62 67 73 89 67 52 131 119 102 168 152 130 179 166 141 176 161 138 166 153 132 160 148 126 158 144 124 154 120 101 166 123 111 167 131 112 171 142 119 145 123 109 49 57 66 44 60 74 69 66 66 219 152 129 208 144 121 193 139 109 72 88 97 78 79 84 49 57 70 48 42 50 170 151 129 170 154 132 170 152 130 164 148 127 144 131 112 145 104 84 163 115 94 179 118 95 182 118 93 179 114 91 182 116 93 174 113 90 159 107 88 163 107 86 171 107 85 170 106 84 171 114 89 128 87 70 176 136 117 140 125 110 141 130 112 165 150 131 156 140 122 161 129 111 185 135 112 182 133 116 158 129 112 172 154 132 138 130 107 180 161 133 184 160 134 190 169 144 154 133 109 235 208 168 229 201 160 228 202 164 232 202 162 230 202 162 229 201 160 229 201 160 231 201 160 228 202 164 228 201 162 229 201 160 229 201 160 229 201 160 228 201 162 228 201 162 228 201 162 228 201 162 233 203 169 127 109 90 126 112 100 125 116 104 116 107 94 107 100 84 123 106 98 111 101 91 127 109 98 122 105 94 115 102 88 117 98 90 120 109 98 79 76 76 66 82 92 60 69 81 81 72 74 130 114 100 119 107 94 122 102 93 104 92 85 110 98 90 118 99 86 116 102 87 112 101 88 117 108 93 96 87 80 101 86 79 122 99 90 110 90 82 119 103 90 112 98 83 118 99 86 148 123 106 194 158 132 179 152 125 139 117 102 142 125 111 180 158 135 178 157 133 180 158 136 143 129 117 103 91 80 174 159 134 180 161 134 178 162 132 178 158 131 182 160 137 182 160 135 180 160 132 182 162 136 183 164 131 180 160 135 165 148 125 183 168 136 180 160 138 149 135 110 169 146 126 180 159 139 176 155 135 180 164 134 180 160 135 174 156 132 172 155 128 170 151 126 174 154 132 172 154 132 172 154 132 178 157 135 178 157 135 178 159 136 180 162 138 176 156 130 176 157 132 180 156 134 180 162 134 172 154 130 170 153 126 174 153 130 172 153 129 172 152 130 174 153 130 172 154 132 174 157 133 170 151 128 176 155 133 178 154 131 176 155 133 172 152 130 172 154 132 176 158 133 174 155 130 174 154 132 172 151 128 172 153 131 172 153 130 172 152 130 174 154 132 172 154 132 170 152 130 168 151 129 172 152 130 170 153 132 170 152 130 172 154 132 172 154 132 172 154 132 172 154 132 174 155 134 176 157 134 176 155 133 178 155 133 176 157 136 176 155 135 178 155 133 174 155 134 172 154 132 172 154 132 178 157 135 174 155 134 180 162 137 176 159 135 176 155 132 174 154 132 178 159 136 178 156 131 170 153 128 172 156 132 170 155 130 144 131 112 170 135 114 162 143 124 162 147 126 162 144 130 172 156 133 168 151 129 168 153 130 172 154 132 170 154 130 172 151 126 172 155 128 178 156 131 176 155 135 176 155 133 172 155 132 176 157 134 178 155 133 180 156 134 176 156 137 174 155 134 174 154 132 178 157 135 174 157 133 160 145 119 89 78 70 129 113 97 131 120 101 91 86 82 91 88 79 69 73 81 153 129 112 155 137 111 156 119 103 65 81 82 66 79 83 158 116 101 167 127 106 206 148 126 193 140 119 127 107 100 85 93 96 75 82 78 165 135 124 157 137 117 180 160 135 180 160 135 176 155 133 180 160 137 180 162 136 180 164 136 182 164 138 184 166 138 177 157 131 172 154 130 178 154 131 178 159 131 162 143 123 160 142 120 208 144 119 220 153 131 169 123 106 84 92 93 58 63 69 220 155 131 168 124 106 98 79 72 67 71 72 83 92 90 126 116 104 157 142 120 161 143 124 138 121 103 159 144 118 176 157 130 172 152 130 173 155 129 156 137 118 56 63 67 54 55 59 85 75 67 215 154 124 220 149 126 98 87 83 77 80 85 79 91 94 119 115 108 176 159 134 168 153 130 168 149 127 166 149 128 138 129 113 151 119 97 159 113 92 187 128 105 182 122 99 183 117 92 182 114 90 175 116 94 175 114 92 185 121 98 167 104 84 163 107 86 190 120 95 147 98 79 149 123 108 174 153 128 166 151 126 170 155 130 170 154 132 154 140 122 194 151 126 157 126 108 182 162 137 180 156 134 178 160 136 180 156 134 182 164 134 189 164 138 152 134 111 237 206 169 230 202 162 228 201 162 228 202 164 232 203 164 231 201 160 229 201 160 228 201 162 229 201 160 228 201 162 228 201 162 228 202 164 228 202 164 228 201 162 228 201 162 229 201 160 229 201 160 233 203 169 128 116 98 128 117 104 127 114 104 112 103 92 115 103 89 127 110 100 114 96 86 123 107 97 119 106 98 115 101 91 117 101 94 124 111 102 75 76 78 62 80 95 63 77 88 93 83 78 133 114 104 127 114 104 133 114 104 107 95 85 118 102 92 123 106 89 119 105 90 102 97 84 127 109 96 145 111 96 109 95 82 134 117 102 108 91 80 133 112 102 107 92 82 127 106 89 183 153 124 187 157 133 162 137 117 123 104 90 152 136 115 184 162 136 180 164 136 182 160 137 148 135 118 102 85 74 174 155 131 189 168 140 186 164 138 189 170 140 188 164 140 184 164 138 182 164 136 182 164 136 187 167 144 182 162 136 182 160 135 182 162 134 184 166 138 184 162 138 182 164 140 178 157 135 180 160 135 178 159 132 182 160 135 178 159 132 176 157 134 178 158 135 172 153 131 176 155 135 178 157 135 180 164 138 178 161 138 180 164 138 180 158 135 182 162 136 174 156 134 178 157 133 176 153 132 178 159 136 178 159 136 180 157 135 178 155 133 170 153 126 174 154 132 176 155 132 176 154 130 174 157 133 176 157 134 174 156 134 178 157 135 178 155 133 178 155 133 174 154 132 178 158 131 178 157 133 178 155 133 176 155 133 174 154 132 174 154 132 174 155 134 170 153 128 170 153 128 170 152 130 168 151 129 170 152 130 172 152 130 170 151 128 168 149 127 170 152 130 176 155 133 172 154 132 176 155 135 176 157 136 178 155 133 178 159 136 180 162 138 174 157 134 176 155 133 172 155 128 174 154 132 180 156 134 174 154 132 180 158 135 176 155 133 178 159 136 176 155 133 176 155 133 178 158 133 180 158 135 176 157 130 168 152 124 176 129 108 185 136 118 152 120 100 186 136 117 180 131 109 74 89 85 147 137 119 124 114 100 172 155 133 170 152 130 170 155 132 174 154 132 172 154 132 176 154 129 172 154 132 172 156 133 180 160 136 176 157 132 178 159 134 180 164 138 174 153 131 180 164 136 178 158 138 172 154 132 151 138 113 158 119 102 197 139 120 125 96 80 99 86 82 85 97 106 96 105 111 49 62 74 85 85 84 176 161 139 79 82 81 83 87 90 110 99 97 225 164 134 212 148 126 213 150 128 219 157 134 105 95 89 87 95 97 107 101 105 67 77 88 115 106 98 173 155 133 164 141 121 182 157 132 180 158 133 174 157 131 176 157 134 176 162 139 180 156 134 178 155 133 178 157 135 176 157 134 168 151 129 155 139 126 109 92 78 154 111 96 160 117 100 68 52 54 117 96 89 172 121 101 207 144 123 131 91 74 129 123 115 120 122 118 86 93 97 82 80 80 187 167 142 185 168 143 180 160 135 182 164 135 178 157 135 178 159 134 182 164 136 188 167 138 185 161 138 91 92 90 167 126 109 216 149 126 223 153 129 98 88 81 66 74 83 47 58 67 172 157 137 164 150 128 170 150 128 149 131 116 134 113 97 156 114 91 160 111 91 174 115 94 175 115 92 178 109 88 182 114 90 186 118 93 183 117 92 183 117 92 178 111 90 163 107 82 179 118 95 151 101 81 177 142 122 176 157 132 170 152 130 170 152 130 172 155 136 176 157 134 155 138 116 164 143 121 174 154 132 176 155 133 178 155 133 178 157 133 180 157 135 184 167 141 161 140 117 238 209 170 228 202 164 230 202 164 228 202 164 228 201 162 231 201 160 236 204 164 231 201 160 229 201 160 228 201 162 228 201 162 229 201 160 229 201 160 228 202 164 229 201 160 228 201 162 226 197 157 235 204 163 134 122 101 130 120 108 135 122 108 126 110 100 115 103 90 124 112 101 119 110 100 124 111 102 115 101 91 100 92 81 117 102 94 116 105 97 79 78 78 69 85 99 60 75 86 107 93 89 133 112 102 129 109 102 130 112 102 110 97 88 110 98 90 128 112 97 121 111 92 121 114 99 157 116 103 214 153 131 135 102 91 132 116 102 113 95 85 133 112 102 115 101 87 131 109 95 179 150 126 170 142 114 148 128 109 120 111 96 159 142 124 184 164 140 184 164 138 184 164 140 141 127 115 102 84 72 174 158 130 182 158 133 186 166 138 186 164 138 180 158 135 182 162 134 182 164 135 180 162 134 180 162 136 182 162 136 180 158 135 180 159 134 182 162 136 182 164 136 180 156 134 176 155 133 180 160 135 180 158 133 180 162 136 176 155 131 180 158 137 182 160 135 172 154 132 172 156 134 174 157 134 176 157 134 176 155 133 176 154 130 176 155 131 172 155 128 176 155 131 178 155 133 184 160 137 180 162 136 180 158 135 178 157 135 180 160 135 180 156 134 176 155 133 176 155 133 176 155 133 180 156 134 180 160 137 178 155 133 178 157 135 172 154 132 172 154 130 172 154 130 174 155 128 174 154 132 176 155 133 178 158 131 176 156 133 176 155 133 176 159 136 172 154 132 172 153 132 170 152 130 164 148 127 166 149 128 172 154 132 174 154 132 172 154 132 172 154 132 174 154 132 176 157 134 172 154 132 172 154 132 172 153 128 174 154 132 174 155 130 176 157 134 172 154 134 174 154 132 174 154 132 176 157 134 174 154 132 180 160 137 176 157 134 174 154 132 178 155 133 178 155 133 176 157 132 180 164 136 172 155 128 165 147 119 183 137 112 180 132 112 187 140 124 200 137 114 133 100 81 60 64 67 83 87 95 83 94 98 129 121 109 166 153 130 166 149 128 166 149 128 162 147 118 166 146 122 169 134 114 181 160 134 176 161 136 170 155 129 174 156 132 172 154 134 176 155 133 176 160 135 178 155 133 163 145 126 73 73 76 161 116 102 198 140 117 214 153 131 211 149 128 138 114 107 101 108 106 124 103 98 181 126 111 159 130 119 161 145 123 67 80 83 61 72 82 65 76 81 158 125 111 220 150 127 206 145 122 171 132 116 101 102 92 77 85 88 149 134 116 138 129 114 147 123 107 186 138 122 149 122 93 155 141 125 99 98 92 144 132 117 157 144 119 160 140 119 159 141 118 160 143 120 148 134 113 158 146 124 108 93 67 145 111 97 201 138 116 135 103 85 123 96 82 105 86 81 199 151 126 169 123 105 131 105 92 115 104 91 116 117 114 97 80 69 106 85 84 133 121 109 180 158 135 180 158 135 176 157 131 178 159 136 184 162 136 189 169 142 180 160 133 170 155 128 179 154 129 83 83 78 143 120 108 122 111 105 59 59 63 54 58 71 47 57 65 162 146 119 157 143 125 140 122 103 195 138 116 168 130 109 160 112 90 151 115 93 171 111 91 168 114 93 175 114 89 181 117 95 183 117 92 183 117 92 186 120 95 178 112 88 167 107 85 179 114 91 154 106 85 173 136 119 174 154 132 166 147 125 168 151 129 170 152 130 174 154 132 174 154 132 176 155 133 178 155 133 178 155 133 180 160 135 182 164 136 189 167 140 187 169 140 173 151 130 237 208 167 230 201 162 232 203 164 230 202 164 230 202 164 234 203 164 232 202 162 228 202 164 228 202 164 226 200 160 231 201 160 229 201 160 228 202 164 229 201 160 229 200 158 230 200 156 223 195 157 233 204 165 138 122 101 136 124 112 134 118 106 135 122 110 121 110 101 130 114 104 120 108 97 132 121 110 135 122 108 118 105 96 118 103 92 111 104 100 73 70 71 71 83 92 63 78 93 69 73 80 131 113 101 138 119 106 131 116 104 112 96 83 115 102 85 141 118 99 125 115 101 86 80 74 166 122 102 207 150 127 119 102 97 119 108 93 125 104 94 118 105 92 112 93 82 136 111 96 173 144 124 179 152 123 138 122 110 130 116 102 168 150 131 178 158 134 178 159 136 180 159 136 152 137 127 97 83 68 174 155 134 179 164 136 180 158 135 180 164 136 184 162 136 182 164 138 184 164 140 180 157 134 182 164 133 180 157 136 180 162 134 176 159 133 180 155 135 172 155 128 174 154 132 178 154 126 174 154 132 176 157 132 178 159 136 178 157 135 176 154 133 176 157 132 174 159 133 176 156 133 182 161 138 177 160 130 182 158 137 182 158 135 182 160 137 178 157 133 180 160 135 178 161 138 184 164 136 182 162 138 180 156 134 178 155 133 176 162 136 176 159 138 182 160 137 174 157 136 178 158 134 176 156 131 176 159 135 178 157 135 178 158 134 180 160 137 180 162 138 178 156 131 178 155 133 176 157 136 174 154 132 176 155 133 174 155 130 172 154 130 172 152 130 172 153 134 172 153 132 170 151 128 168 149 124 168 151 129 170 151 128 170 149 126 164 150 128 168 153 128 170 154 130 170 155 134 172 154 132 168 153 130 164 150 123 168 152 130 170 153 132 170 152 130 170 153 132 172 154 130 176 154 132 178 156 131 174 157 135 174 156 134 178 155 133 174 154 132 174 154 132 176 157 134 178 157 133 180 164 136 174 154 129 176 151 126 172 150 129 142 120 98 169 126 98 180 131 111 223 156 131 113 99 89 85 92 97 70 79 90 93 94 96 166 151 130 170 152 130 158 138 118 174 133 115 209 146 123 208 148 125 106 93 88 131 122 100 155 145 123 158 143 123 172 153 130 172 155 132 176 157 134 176 155 133 140 128 105 50 67 78 120 92 82 206 144 123 208 143 120 216 151 128 218 153 131 106 102 94 91 87 91 136 106 95 152 116 102 135 130 108 175 157 136 170 154 132 140 129 109 92 95 99 192 141 121 213 149 126 225 159 130 66 67 71 83 88 91 109 103 102 109 87 87 177 128 113 158 124 107 107 86 75 50 47 41 94 101 106 94 90 78 179 143 118 177 137 119 171 136 120 162 139 117 143 111 91 126 108 95 140 123 102 174 130 112 120 95 81 98 83 69 104 93 86 119 102 93 174 152 121 163 151 123 82 73 65 133 114 109 89 105 103 141 105 93 144 110 98 118 114 105 182 162 136 174 156 134 176 158 132 178 159 136 172 152 130 180 162 134 180 158 133 172 154 132 170 152 133 156 133 113 86 74 71 55 56 67 63 61 64 131 113 103 98 89 89 116 95 87 38 60 72 128 102 87 180 130 116 158 117 97 148 112 86 163 117 94 168 112 91 170 115 94 179 114 91 183 117 92 182 118 94 182 114 90 190 121 97 167 106 83 175 118 95 182 116 92 166 113 92 176 139 117 170 151 128 146 122 105 131 118 97 154 140 120 170 147 125 178 157 133 168 153 130 174 154 132 174 154 132 178 155 133 179 160 131 181 164 134 191 171 145 178 160 130 233 205 169 235 204 166 234 203 164 234 203 164 233 203 166 235 204 166 233 203 166 234 203 164 228 202 164 229 201 160 228 202 164 229 201 160 229 201 160 228 201 162 229 200 158 229 201 160 229 200 158 232 204 171 135 118 100 144 130 109 140 128 114 136 123 103 124 112 97 124 112 95 127 111 96 129 115 102 124 111 100 109 95 85 116 105 94 131 117 108 102 95 84 93 84 75 74 72 65 107 99 90 107 95 82 104 97 84 113 106 89 118 105 94 118 107 87 115 105 92 72 82 84 77 69 68 159 114 93 158 127 102 89 86 84 124 111 102 125 116 104 128 118 105 139 122 110 163 141 117 177 146 124 166 137 115 129 118 107 119 107 93 164 149 127 178 154 131 176 155 133 174 153 128 142 127 108 103 88 76 174 157 134 184 164 137 180 162 134 180 159 136 176 159 132 178 156 131 178 157 135 174 152 126 176 155 135 176 154 129 174 153 128 172 154 132 174 155 128 176 155 133 172 154 132 178 159 134 182 162 136 182 160 137 180 156 134 176 157 134 180 158 136 180 160 133 182 162 136 180 164 136 180 162 136 178 157 133 180 158 133 182 158 135 180 159 134 174 153 130 176 157 134 180 158 135 174 154 132 174 154 132 180 158 133 174 155 130 172 154 132 176 157 136 172 155 131 174 155 131 174 157 131 174 157 131 174 155 128 170 152 128 170 152 130 174 153 130 174 155 130 178 156 130 174 154 132 170 152 130 172 154 132 172 152 130 172 153 132 172 152 130 170 152 130 172 152 130 176 155 135 170 152 130 172 154 132 172 154 130 170 151 132 172 154 132 172 152 130 168 155 132 168 153 128 168 151 129 168 153 130 166 149 127 172 155 134 168 149 130 166 149 128 168 151 131 170 151 130 170 152 130 170 152 130 170 153 134 172 154 134 170 152 130 174 154 132 170 151 126 174 156 134 174 155 133 178 157 135 180 160 137 180 160 135 178 158 134 180 160 135 180 160 132 165 130 109 189 137 114 183 131 109 90 89 87 63 72 79 94 93 98 106 111 115 87 90 91 173 156 127 164 133 116 192 133 111 177 125 104 186 128 109 56 47 48 65 72 74 105 107 104 143 142 133 160 144 119 170 153 130 174 154 132 172 155 128 176 155 132 79 77 73 84 85 85 152 123 105 151 117 105 220 153 131 202 134 111 191 132 108 92 91 94 60 73 86 183 132 108 95 94 91 183 161 136 172 154 132 172 154 134 166 152 127 183 135 114 214 141 118 212 150 121 128 108 98 66 70 77 113 89 79 98 78 71 130 96 82 216 149 126 118 91 80 184 138 113 63 62 64 77 76 86 205 167 138 205 162 138 181 146 126 185 146 124 162 129 110 161 142 120 164 121 101 212 146 123 152 113 96 114 111 100 116 120 117 72 79 84 69 72 76 91 81 76 163 134 116 175 119 102 106 83 79 176 143 130 87 91 92 64 65 66 189 173 152 186 166 140 176 161 139 145 117 98 170 134 114 185 162 138 176 157 134 178 159 132 132 107 96 146 109 89 181 141 121 57 52 44 119 114 112 137 130 111 189 155 126 181 131 113 40 53 65 163 131 111 220 151 128 178 133 109 160 115 89 156 111 94 156 109 86 172 116 93 175 114 89 175 117 88 171 118 91 179 111 90 186 120 95 170 109 87 184 120 95 182 120 96 156 112 92 179 144 126 132 107 92 189 133 112 195 128 106 66 57 52 153 123 107 174 153 134 168 153 130 168 151 125 174 155 130 178 157 135 182 164 138 194 172 147 195 175 147 180 159 135 237 203 171 233 203 168 235 204 166 231 203 166 233 203 166 232 203 164 235 206 165 235 204 166 228 202 164 229 202 166 228 202 164 228 202 164 229 201 160 228 201 162 229 201 160 228 202 164 230 200 156 230 202 162 168 152 130 172 155 132 168 151 129 162 145 126 159 142 120 158 139 120 161 144 122 157 142 115 150 135 118 124 109 98 115 100 89 179 165 144 150 136 114 157 142 122 156 137 121 153 140 121 148 134 111 149 140 115 142 126 109 150 131 112 146 125 98 149 132 107 135 121 99 104 98 83 165 133 106 138 118 99 158 143 123 156 140 120 150 142 119 145 136 117 145 125 109 184 150 127 178 146 123 166 139 115 153 136 126 110 96 83 153 140 116 178 155 133 172 154 132 172 152 127 143 127 111 100 84 74 176 157 132 186 164 140 186 166 140 184 164 138 186 166 140 182 164 140 180 162 138 180 156 134 180 159 134 176 157 132 180 156 134 176 155 133 182 164 138 180 158 133 178 155 133 178 157 135 178 158 137 180 160 137 178 157 135 180 160 137 180 158 133 180 158 135 180 162 138 180 158 135 180 156 134 178 155 133 180 158 135 180 158 133 178 157 133 178 157 135 180 158 135 174 153 130 178 157 135 180 160 135 172 154 132 174 156 132 170 151 128 176 155 133 172 156 133 172 151 128 172 154 132 170 153 129 174 153 128 174 153 130 170 151 126 174 154 129 176 157 132 180 159 136 174 154 132 176 155 133 172 154 132 170 152 130 172 155 128 172 154 132 170 152 130 168 151 126 174 157 133 170 152 130 174 154 132 172 154 132 172 153 130 172 154 134 174 155 130 174 154 132 166 154 130 162 146 124 160 145 122 156 140 119 137 129 113 147 129 113 155 144 122 150 135 120 137 121 103 165 143 126 160 142 123 146 133 117 158 140 121 174 156 132 172 154 132 168 151 129 172 154 134 174 154 132 172 152 130 176 155 133 176 157 134 180 160 133 178 157 133 180 158 133 174 156 131 114 106 97 69 53 52 58 62 65 96 93 93 82 84 89 110 114 117 97 106 111 153 139 116 158 135 114 191 136 115 171 126 107 209 151 123 93 79 75 114 123 125 131 129 124 146 144 134 188 171 149 154 141 119 174 162 138 172 157 131 180 156 134 176 159 134 136 121 108 87 89 90 186 138 117 156 113 93 210 150 129 210 153 124 168 116 105 121 120 121 138 116 102 99 87 79 146 133 114 156 140 122 137 122 106 133 124 103 123 101 81 161 113 95 181 127 107 179 129 109 208 152 133 175 140 120 98 84 84 200 145 121 167 122 103 212 154 129 217 148 123 131 101 95 92 100 108 61 69 78 191 174 150 134 128 109 155 141 119 168 150 125 142 126 105 161 113 91 179 149 124 196 180 155 124 124 121 123 129 125 115 118 114 65 70 81 42 54 69 169 157 131 99 77 66 114 102 91 146 144 134 122 126 113 137 129 115 187 158 134 178 155 133 170 152 129 158 140 116 152 106 91 166 121 103 166 130 112 163 135 116 152 106 91 174 118 97 69 60 53 90 79 70 75 82 87 61 72 77 105 97 93 158 129 112 61 69 73 77 79 83 150 112 94 148 110 92 167 113 93 156 116 93 164 111 91 170 114 93 179 117 90 179 116 92 184 120 95 182 114 90 187 117 95 175 114 93 175 112 90 183 117 92 143 97 78 155 146 123 157 122 105 196 139 118 212 148 126 131 104 87 95 84 74 105 105 100 130 122 106 177 159 131 172 155 128 180 160 135 182 162 136 188 164 140 191 174 143 187 169 141 238 205 173 235 206 169 235 204 170 235 204 168 235 204 168 235 206 169 235 212 169 235 206 167 231 203 168 231 203 166 230 202 164 233 203 168 231 203 166 228 202 164 228 202 164 228 202 164 228 201 162 230 201 162 177 155 133 176 159 134 173 156 130 176 155 133 176 155 133 174 154 132 176 153 131 178 157 135 178 162 135 147 128 112 120 100 88 180 160 138 176 155 133 176 155 133 174 154 132 172 154 130 164 148 127 166 149 128 153 133 108 117 110 90 57 70 67 111 101 91 113 102 89 103 93 80 153 117 101 140 114 100 172 152 132 168 155 130 172 155 128 170 146 123 177 147 125 181 140 114 165 137 111 174 153 130 168 149 123 124 106 89 173 155 130 180 164 134 180 162 136 178 162 137 154 133 116 109 90 74 170 152 132 180 164 140 182 165 140 176 155 133 180 159 136 176 157 134 172 154 132 172 155 128 174 154 132 172 153 128 172 154 132 176 157 132 178 158 134 180 156 134 176 157 134 176 155 133 176 157 130 176 157 134 174 155 130 178 157 135 176 155 133 178 158 131 178 156 131 176 155 131 180 158 133 174 157 130 180 158 133 174 159 135 174 154 132 172 152 130 176 155 133 172 151 128 178 157 135 174 154 132 178 155 133 176 153 131 172 153 128 178 159 134 176 159 134 178 156 135 172 153 128 176 156 133 176 157 134 180 158 135 178 159 136 176 155 133 178 157 134 180 157 136 178 155 133 176 158 130 176 155 133 172 154 130 176 159 134 176 155 133 178 155 133 174 155 134 172 156 136 174 154 132 176 160 132 176 157 134 172 154 133 160 146 123 159 141 118 91 83 68 148 113 98 135 105 88 153 122 101 169 135 114 95 99 96 108 112 112 122 126 124 104 95 91 162 134 113 158 116 97 76 72 73 128 127 116 80 83 83 113 104 94 128 115 100 170 154 133 170 154 132 170 153 128 170 149 126 178 161 134 180 164 136 180 158 135 180 162 132 180 160 135 179 163 137 175 159 132 137 125 114 94 86 82 89 77 70 88 81 75 97 94 91 62 74 84 70 82 87 155 119 102 144 106 95 149 110 90 86 75 75 111 96 87 95 101 100 104 116 115 117 122 116 112 109 105 72 80 82 163 150 130 170 157 133 174 159 133 180 158 135 176 157 136 182 165 139 163 138 120 159 128 104 172 133 112 170 128 110 170 119 99 59 50 54 71 84 95 115 99 91 81 85 89 118 109 99 155 136 119 150 140 118 164 123 102 168 117 92 209 154 119 129 117 104 67 70 79 50 60 71 32 34 42 69 76 64 151 129 108 208 145 124 202 140 116 216 146 123 47 47 54 46 62 73 61 66 64 189 147 124 148 121 107 180 141 121 178 133 115 193 134 114 139 117 101 142 135 126 117 121 116 127 126 119 104 109 106 69 76 82 44 63 76 99 97 89 90 81 73 71 70 63 95 92 86 152 147 125 98 107 107 76 84 87 99 100 95 157 135 115 178 153 132 174 154 127 184 162 134 174 137 119 171 129 108 198 141 118 217 158 133 215 154 127 84 82 81 76 86 93 58 67 79 64 78 89 46 52 58 118 103 91 65 66 70 104 98 94 134 103 85 174 123 100 172 114 92 172 117 96 175 115 92 175 114 92 179 117 90 183 117 92 182 118 94 183 117 92 175 117 96 175 116 90 171 111 91 147 109 90 172 159 132 108 94 77 133 106 97 197 137 117 184 131 112 122 98 87 81 95 105 79 87 94 128 120 105 172 153 129 178 156 135 180 158 135 184 161 139 182 162 136 173 153 128 237 205 170 235 206 171 235 204 170 235 204 166 235 206 167 235 208 168 235 208 168 235 204 168 235 204 168 234 203 166 233 203 168 236 204 164 231 203 168 230 202 164 232 203 164 230 202 162 228 201 162 228 201 162 178 160 132 178 159 134 176 159 134 180 158 133 176 155 133 178 155 133 180 158 135 176 154 132 174 155 136 139 122 105 132 109 95 178 161 138 174 155 134 178 160 136 174 155 133 172 152 130 168 151 129 168 153 130 135 122 101 113 103 91 71 78 81 86 86 82 64 68 70 113 100 90 114 96 82 147 116 100 140 118 109 172 154 130 172 154 130 164 138 116 180 147 122 191 149 129 168 130 112 174 154 132 174 155 132 176 157 134 180 158 135 178 161 136 174 160 133 172 154 132 151 134 119 105 89 71 162 149 127 178 157 133 176 155 131 174 154 132 172 153 128 176 155 131 180 158 135 176 157 134 176 157 134 180 162 136 178 157 133 180 158 135 174 154 128 174 153 128 174 153 130 176 153 131 174 154 132 172 154 130 168 151 126 174 155 130 172 155 132 176 157 134 172 154 132 176 155 131 174 153 130 174 154 132 178 160 134 170 155 128 174 154 128 178 161 138 176 155 133 174 154 128 182 161 136 176 157 134 176 157 132 178 159 135 180 156 134 178 158 137 174 155 130 170 153 128 170 153 130 174 155 132 176 157 130 178 157 135 176 157 134 174 153 130 180 158 133 180 160 133 178 159 134 178 161 136 178 159 134 174 155 130 177 157 131 174 157 130 176 155 135 166 146 126 157 138 117 140 122 103 146 126 112 160 142 121 164 150 123 166 147 125 176 155 134 146 130 114 160 141 119 162 143 123 160 145 122 160 142 117 150 134 121 89 94 94 77 84 86 228 149 126 221 148 125 121 91 82 135 104 89 83 69 71 142 112 97 184 133 115 66 67 71 124 116 96 161 147 124 174 154 132 174 155 134 178 159 136 176 154 129 172 154 130 172 155 128 160 144 118 160 118 101 152 131 110 83 74 65 86 75 66 76 66 56 83 76 71 77 74 65 70 66 61 61 61 64 169 130 108 160 130 117 97 92 83 97 85 82 225 156 132 135 102 93 79 90 92 60 66 77 47 55 69 68 78 86 59 68 80 118 107 92 164 152 125 156 143 119 160 143 122 166 148 124 162 142 121 149 134 114 167 140 120 157 125 100 183 143 103 183 143 109 95 98 100 107 105 100 125 118 109 135 122 109 150 138 119 157 130 110 200 143 120 179 122 101 190 152 117 191 153 119 108 90 76 137 102 92 147 117 105 137 121 112 180 160 137 198 140 124 205 141 117 199 136 112 140 106 96 93 91 90 63 74 79 136 111 101 155 136 110 161 125 113 151 127 110 164 136 114 173 125 107 78 74 68 135 136 132 134 136 132 86 87 92 119 115 113 69 85 99 55 66 80 131 119 105 150 134 116 112 104 89 72 67 67 126 117 110 112 104 93 112 106 91 156 117 101 161 132 112 180 162 134 178 155 133 174 155 136 165 143 120 156 116 97 131 90 72 210 144 121 91 90 88 82 84 88 102 109 112 56 72 86 62 72 78 58 67 74 190 174 153 95 74 75 175 143 125 176 125 106 168 114 90 176 121 99 175 117 95 182 118 94 186 120 95 193 124 100 186 118 93 181 117 95 168 116 96 179 114 91 171 112 88 131 97 79 133 112 98 168 139 121 186 163 134 158 108 89 164 116 97 221 164 139 103 84 72 115 95 89 86 88 81 141 126 109 146 134 114 166 149 127 172 154 132 174 155 133 169 153 132 233 205 167 235 206 171 235 204 170 235 204 166 235 204 170 236 204 164 235 210 167 235 204 168 232 203 164 231 203 166 231 203 166 235 204 172 233 203 168 230 202 164 234 203 164 228 202 164 228 201 162 228 201 162 184 166 135 180 162 137 180 160 135 178 159 134 178 162 137 180 160 137 180 158 133 180 162 138 180 160 135 166 148 130 159 136 118 176 162 135 180 164 140 178 162 140 178 162 135 172 154 134 172 154 132 170 152 130 157 137 120 140 122 101 109 103 92 117 109 89 73 71 67 96 95 88 105 103 91 120 106 94 144 128 111 164 148 127 171 143 118 166 138 118 162 131 111 185 146 120 173 146 121 174 154 132 172 154 130 174 154 132 180 156 134 176 157 134 174 154 132 178 157 133 156 140 122 147 123 110 170 152 130 178 156 131 180 158 135 178 155 133 176 155 133 176 155 133 180 158 135 176 155 133 180 158 135 178 156 131 178 155 133 178 155 133 174 153 130 172 151 128 172 151 126 174 155 132 174 156 134 172 152 130 176 155 133 178 159 134 178 156 131 176 157 132 174 154 132 172 155 129 178 157 133 174 157 130 174 154 132 174 155 130 176 155 133 180 158 135 178 159 134 178 156 131 178 155 133 180 156 134 184 162 138 180 162 138 180 160 137 180 160 137 176 157 134 178 157 135 176 155 133 174 156 134 180 162 134 178 155 133 176 155 133 178 155 133 174 154 132 174 151 130 176 157 134 174 155 130 176 153 131 178 158 131 174 155 130 172 154 132 174 155 134 167 150 124 168 151 130 182 162 136 174 157 130 172 154 132 174 157 131 168 150 128 172 152 130 170 155 130 172 153 133 180 154 133 174 157 131 172 155 132 186 163 139 109 94 89 85 88 84 111 89 78 176 125 99 214 143 119 182 128 110 162 128 110 97 88 75 118 93 80 164 119 101 34 35 41 147 136 122 172 155 132 174 155 134 178 156 131 174 155 130 172 155 128 172 155 128 167 146 120 165 133 108 142 115 100 114 97 88 102 87 69 108 88 78 90 75 65 106 91 76 91 72 67 98 80 73 104 82 71 127 104 94 148 117 98 187 122 100 159 119 102 124 113 98 144 104 92 83 71 76 57 59 66 61 64 77 52 61 73 62 74 79 95 95 95 143 132 114 176 157 132 174 155 134 172 155 132 166 148 126 159 146 119 160 129 109 183 132 106 175 130 105 200 129 107 185 136 112 162 143 128 164 140 118 137 115 93 208 134 114 161 115 94 170 139 120 166 148 124 161 143 118 142 135 117 221 152 129 130 106 82 176 137 116 171 130 111 139 105 90 209 146 123 215 147 123 219 145 121 113 99 90 87 98 99 69 78 86 141 130 112 191 163 138 180 155 134 176 158 134 146 107 86 156 136 121 124 118 110 103 109 109 114 110 105 120 119 121 89 98 101 46 57 70 48 55 63 141 121 104 103 91 81 159 115 98 134 101 89 143 109 92 145 115 95 143 109 91 145 122 105 167 147 121 164 147 121 159 140 121 136 102 88 148 111 91 133 109 87 129 104 92 106 93 88 197 149 119 88 89 95 73 83 93 56 66 77 53 71 86 141 120 106 169 135 116 134 115 100 160 114 98 173 117 96 172 117 96 180 118 95 175 114 91 182 118 94 197 124 99 179 114 91 171 110 88 166 113 90 179 114 91 171 112 90 148 110 88 194 140 119 103 96 89 181 162 143 185 148 119 217 151 129 196 135 115 215 153 125 128 94 83 152 131 113 115 104 96 172 155 137 172 157 133 178 159 136 178 161 138 187 166 142 235 206 167 235 204 170 236 204 164 235 206 165 235 208 168 235 208 168 235 208 168 235 206 169 231 203 168 235 204 172 233 203 166 235 204 172 235 204 168 235 204 170 235 204 168 230 202 164 233 203 166 228 202 164 185 166 140 180 164 140 182 164 136 180 162 134 180 162 138 180 160 137 178 157 133 180 158 135 180 160 137 178 155 133 174 159 134 180 158 135 178 164 139 180 162 138 178 161 138 178 155 133 172 152 130 172 154 132 176 158 136 134 119 99 145 130 103 129 111 96 92 92 81 132 120 101 103 102 96 166 154 133 138 124 101 161 138 120 158 132 116 146 125 108 127 110 94 111 98 85 140 126 108 172 154 132 172 154 130 172 154 132 176 155 133 174 154 132 174 155 134 176 160 135 178 155 133 174 162 138 176 155 133 174 155 130 174 156 132 176 155 133 172 154 132 178 155 133 176 160 128 178 155 133 174 155 130 176 157 130 178 161 134 182 160 137 174 153 130 172 152 130 172 152 130 174 153 128 172 154 130 172 154 130 174 154 132 172 153 128 172 151 128 172 154 134 180 158 135 178 157 135 172 152 130 178 157 133 180 158 133 180 160 133 172 153 131 172 154 130 174 154 132 176 153 131 180 161 138 180 164 136 182 162 138 180 160 137 178 159 132 184 164 138 180 160 135 178 159 134 178 162 135 174 154 132 180 164 136 178 157 133 174 155 130 174 156 129 180 158 133 182 159 133 184 164 136 180 162 138 182 160 137 182 165 138 178 158 131 176 155 133 180 160 137 182 160 137 178 159 136 174 154 132 174 153 130 172 152 130 178 160 136 172 154 132 170 152 130 172 154 132 174 154 132 170 153 128 180 158 133 180 156 134 174 157 130 174 155 134 178 157 132 163 139 119 140 110 94 171 118 100 202 134 111 206 142 115 102 82 71 159 117 100 129 93 87 52 50 51 92 84 88 182 162 136 172 155 128 163 143 120 177 147 114 166 137 109 137 120 103 161 142 119 168 154 127 170 151 134 136 110 94 130 102 89 122 96 82 222 194 162 235 213 182 151 115 95 108 87 74 115 94 78 118 95 79 110 88 73 87 77 68 145 113 100 160 138 120 149 121 104 182 141 115 139 107 93 92 103 99 130 128 123 117 113 104 126 122 111 159 145 122 176 155 133 170 153 130 174 157 133 166 152 126 157 142 117 176 128 107 226 161 129 194 140 121 129 109 94 153 120 100 178 133 113 205 146 124 205 145 123 147 121 104 207 151 126 170 150 125 176 157 130 176 157 130 160 141 115 191 136 112 189 138 119 175 138 113 164 146 122 171 125 103 155 107 92 204 136 112 196 133 105 168 124 95 96 93 96 68 80 88 41 54 65 116 116 98 150 135 113 114 96 81 160 122 106 167 146 128 191 165 135 139 127 110 92 96 95 106 109 110 116 112 107 132 132 122 60 69 70 40 61 73 120 103 96 191 137 114 155 112 94 157 113 95 183 146 122 129 101 85 155 141 123 176 154 128 174 153 131 170 151 130 150 130 112 143 102 89 191 147 125 195 148 125 176 128 108 191 132 108 80 81 76 64 72 81 66 75 87 69 75 85 45 59 68 49 59 55 105 83 75 178 121 99 171 113 93 176 116 93 177 115 92 175 114 91 181 121 98 183 117 92 175 114 89 163 109 87 156 110 89 174 116 91 186 120 95 128 97 82 58 74 85 86 79 80 140 130 114 133 124 112 168 126 109 151 116 98 168 117 95 184 130 111 92 87 86 50 55 66 148 135 120 168 155 132 172 153 131 172 155 134 180 162 138 233 205 167 235 204 170 236 204 164 235 206 165 235 204 168 235 204 168 235 206 165 235 206 171 231 203 168 233 203 168 233 203 168 235 204 170 233 203 168 233 203 168 230 202 164 232 203 164 228 202 164 228 202 164 183 166 140 180 159 136 178 157 135 180 162 136 178 155 133 180 158 135 178 157 135 178 160 136 182 156 135 180 160 135 172 156 133 174 154 132 178 155 133 176 159 136 176 157 134 176 156 133 172 154 132 170 152 130 170 153 128 156 144 121 136 121 101 159 141 115 96 94 83 136 123 108 143 134 111 162 146 126 155 135 118 152 129 108 157 136 108 155 130 113 133 110 100 68 63 56 170 152 134 172 153 131 168 155 130 172 156 133 174 156 132 176 159 134 178 159 136 174 158 135 176 159 135 174 158 134 178 156 135 176 155 131 180 160 137 172 154 130 174 155 128 182 162 136 180 160 133 178 159 132 182 164 134 182 162 134 182 162 136 180 160 137 182 160 137 176 157 134 176 155 133 178 157 133 180 159 134 178 155 133 174 155 130 176 155 133 174 153 130 184 157 136 178 155 133 174 155 135 178 155 133 178 155 133 184 164 138 180 158 133 180 162 138 180 164 140 174 157 136 180 160 137 180 160 133 182 162 136 176 159 134 178 156 133 178 158 134 184 164 138 180 160 133 176 157 134 178 160 136 176 155 135 176 155 133 174 155 131 176 158 132 178 159 134 182 164 134 182 164 139 184 161 140 186 162 138 180 162 136 178 158 137 176 154 130 172 153 128 178 157 134 176 157 134 176 159 134 174 153 130 174 154 132 170 151 126 170 153 130 168 147 126 172 152 130 172 154 132 172 154 132 168 147 123 174 155 130 178 156 131 178 158 137 170 152 130 170 151 128 172 150 127 164 148 121 142 127 108 188 157 134 162 127 104 136 100 91 127 101 89 130 105 91 126 95 81 81 82 76 112 104 101 152 133 104 213 164 121 224 171 124 224 171 124 199 154 115 140 105 93 152 117 101 158 115 101 131 100 81 112 91 78 130 107 89 194 153 127 175 127 104 158 117 97 143 105 89 190 133 109 168 124 105 187 128 106 130 118 104 137 114 95 151 133 118 156 131 107 180 141 115 163 123 94 154 116 102 128 101 84 158 119 106 172 157 135 164 148 127 168 149 127 168 152 122 170 151 132 152 136 117 176 127 107 206 145 125 133 100 80 202 138 117 195 137 115 182 136 116 158 144 117 168 150 121 129 102 80 186 140 117 181 127 107 150 123 108 178 160 136 174 155 133 172 155 130 151 124 107 150 131 110 170 158 131 155 132 110 118 86 74 175 122 104 206 163 125 211 163 122 240 186 135 153 119 95 118 95 85 173 159 136 142 121 98 174 128 107 174 146 120 164 122 105 185 168 142 182 162 137 197 170 144 128 96 88 163 157 144 126 131 116 160 148 128 137 133 123 111 101 94 164 143 122 139 106 90 174 124 109 180 141 119 177 125 104 104 96 87 102 104 97 170 153 130 176 161 135 159 141 119 153 118 101 166 135 116 180 160 141 176 157 136 172 149 126 149 132 114 72 66 67 90 95 94 65 79 87 55 75 89 52 62 72 181 167 146 169 146 126 174 115 94 181 123 101 186 120 95 181 121 98 182 118 94 183 122 98 182 118 94 180 117 95 166 115 98 152 106 88 182 113 91 186 118 93 118 88 77 133 127 123 85 82 75 176 158 132 164 150 129 138 116 103 189 136 116 184 132 114 212 146 123 83 91 93 71 76 78 57 67 73 172 156 132 172 155 136 174 157 136 182 163 136 233 203 166 235 204 170 234 203 164 235 204 168 236 204 164 235 204 166 235 206 165 235 206 169 236 204 164 233 203 166 235 204 170 235 204 168 235 204 168 231 203 166 232 203 164 228 202 164 228 202 164 228 201 162 186 166 138 182 162 138 180 164 138 178 159 134 178 155 133 178 155 133 178 155 133 178 155 133 176 155 133 174 155 130 174 152 132 174 154 132 174 154 132 174 155 134 172 155 132 172 154 134 170 152 130 172 154 132 172 154 132 164 146 128 170 153 134 164 149 126 169 154 130 174 156 136 162 149 129 170 153 132 134 117 100 106 90 73 130 109 95 105 90 82 113 97 88 120 103 89 161 146 122 170 158 137 174 154 132 172 154 132 172 154 134 174 154 132 176 157 134 176 158 132 172 156 133 182 158 135 178 162 137 176 158 133 182 162 136 176 158 134 178 155 133 178 158 133 180 160 135 178 157 133 180 158 135 180 162 134 178 159 132 180 156 134 176 156 132 174 154 132 172 154 132 174 154 132 174 157 132 170 151 128 170 152 130 174 153 130 174 152 129 174 155 130 176 155 133 172 152 130 176 160 134 176 157 132 176 157 134 174 152 126 172 154 130 174 154 132 176 155 133 172 152 130 176 158 130 176 157 130 178 155 132 176 155 133 180 157 135 182 162 134 180 162 134 180 156 134 178 159 134 180 160 133 178 159 136 174 156 129 172 154 130 180 160 135 178 159 134 186 161 137 180 159 136 174 155 131 176 155 131 176 155 130 174 155 132 172 154 132 172 151 128 180 156 134 174 156 132 170 152 124 170 155 128 170 148 124 170 151 128 172 151 129 174 159 136 170 153 130 174 159 135 172 152 130 174 155 132 180 160 137 178 158 133 180 158 135 168 151 126 170 154 132 172 153 128 173 147 123 112 105 90 99 82 71 122 95 86 146 110 95 150 113 99 106 89 79 78 83 84 86 93 93 142 118 96 194 154 114 219 169 124 219 169 124 224 171 124 135 104 88 153 121 103 157 114 100 144 118 105 160 141 126 185 133 109 170 119 100 167 138 120 180 157 136 155 135 113 179 139 119 172 127 109 165 145 122 172 150 130 155 131 114 145 132 114 166 128 105 191 131 111 186 126 107 147 107 91 181 125 105 197 134 115 165 118 102 152 138 119 170 153 126 133 116 96 180 163 137 162 150 124 172 130 113 160 120 100 143 124 104 222 146 123 149 121 102 164 148 124 170 153 130 163 148 115 190 137 111 177 126 107 163 124 104 131 99 91 117 109 100 156 146 121 177 154 127 168 149 127 164 147 123 162 142 123 140 123 107 208 140 120 223 148 124 145 103 82 215 166 121 126 101 85 218 151 127 178 134 111 158 138 115 176 125 104 189 127 103 180 126 105 183 138 115 96 86 70 116 112 106 87 89 89 187 129 109 98 76 69 161 145 129 167 132 113 145 125 105 156 140 118 149 122 104 139 99 81 181 126 103 146 120 101 167 121 99 52 51 46 130 134 133 65 64 65 173 133 112 143 116 100 172 148 128 170 145 124 188 165 142 182 158 137 179 164 134 174 154 131 105 89 77 98 95 90 90 96 104 52 63 74 66 73 86 53 56 62 106 76 68 183 123 100 178 116 93 182 120 96 178 116 93 182 118 94 183 117 92 182 118 94 174 114 92 159 106 86 135 89 71 194 121 96 190 120 95 162 123 103 137 109 90 112 99 90 168 155 131 162 145 129 134 117 96 146 101 81 183 123 97 218 136 112 119 106 93 90 96 98 65 78 87 44 49 58 146 128 110 172 153 134 181 164 141 231 203 166 230 202 162 231 203 166 233 203 166 236 204 164 232 203 164 234 203 164 234 203 164 231 203 168 233 203 168 231 203 166 235 204 172 233 203 170 230 202 164 235 204 168 231 203 166 233 203 166 229 202 166 183 163 138 182 162 137 184 162 136 180 156 134 178 155 133 180 160 137 180 164 136 180 164 140 178 159 134 178 157 135 172 153 131 174 153 130 172 154 134 174 154 132 174 157 133 170 152 130 174 154 132 172 152 130 172 152 130 172 154 130 172 154 132 174 153 134 170 151 130 165 147 121 128 112 99 80 68 57 81 71 57 96 81 69 110 97 86 136 116 107 85 67 66 103 88 80 157 133 111 174 154 132 178 157 135 176 159 136 176 159 136 174 156 134 182 164 140 189 168 140 182 164 140 180 162 138 180 162 138 178 155 133 178 157 135 174 157 136 176 153 131 174 155 132 176 155 133 174 154 132 176 157 132 176 155 133 170 152 130 176 159 136 166 147 124 166 147 124 170 153 128 174 155 130 176 155 133 170 155 128 172 152 130 172 154 132 172 155 132 170 153 132 172 154 132 174 156 133 174 156 134 176 155 133 176 153 131 178 157 133 176 155 133 172 152 130 172 154 132 174 154 132 174 153 130 178 157 135 178 157 135 174 153 130 168 148 125 174 156 134 176 155 131 172 154 130 176 162 136 176 159 135 176 155 133 176 155 131 172 154 132 172 154 130 174 154 132 174 155 134 172 154 132 172 154 130 170 152 130 176 158 138 170 154 134 174 155 130 176 153 131 180 157 135 176 155 133 172 154 132 172 152 130 172 154 130 148 130 110 168 145 125 148 130 114 132 114 102 176 159 138 172 154 130 170 155 136 176 159 134 182 162 134 180 162 134 176 155 131 176 157 134 178 154 128 174 155 136 118 102 91 104 83 73 130 101 88 152 114 100 164 121 103 83 74 69 110 95 82 196 160 119 206 164 125 155 124 97 227 174 126 219 169 124 221 170 124 192 153 114 139 108 86 163 129 111 133 104 93 168 149 126 184 134 116 193 136 112 162 140 115 180 156 134 176 155 135 164 143 124 174 155 132 174 152 132 174 151 124 162 145 125 182 135 113 178 131 108 132 113 92 114 100 88 86 80 71 206 141 118 188 130 109 200 137 118 58 46 40 93 98 95 57 65 74 96 102 99 133 116 102 119 115 103 184 129 109 154 137 119 165 140 118 170 153 132 172 153 128 170 154 129 132 116 101 211 143 121 190 129 110 78 69 61 115 97 88 79 85 91 71 82 89 64 70 81 156 145 123 170 153 128 143 111 96 232 156 132 183 122 102 127 98 85 141 126 110 160 135 111 147 123 102 160 117 101 105 95 86 106 103 95 208 141 119 215 145 121 214 144 120 144 104 86 131 107 93 155 154 140 81 90 91 133 110 98 148 108 92 128 93 77 217 145 122 149 132 109 71 82 91 91 95 90 189 134 114 191 140 120 157 118 102 96 85 77 118 101 90 104 91 85 109 92 82 173 133 113 159 126 106 154 135 115 157 140 116 160 142 122 157 140 120 116 96 86 154 121 100 189 164 136 87 84 77 50 59 68 75 84 89 63 74 82 53 60 65 131 93 77 170 114 90 159 112 89 163 110 86 177 116 91 183 117 92 182 118 94 182 118 94 164 112 89 147 101 83 135 92 74 193 123 98 187 123 99 184 131 110 141 124 103 170 152 128 155 138 115 155 117 95 196 142 124 159 112 90 166 116 95 170 127 103 173 125 106 122 101 95 106 90 79 167 154 128 172 153 132 170 155 129 172 155 129 232 202 166 230 202 164 228 202 164 231 201 160 228 201 162 228 201 162 232 203 164 229 202 166 235 204 172 234 203 166 233 203 168 235 204 170 233 203 166 233 203 170 233 203 170 232 203 164 228 202 164 228 202 164 185 162 138 178 157 135 176 155 131 180 160 135 178 155 133 180 156 134 174 154 128 178 157 135 176 159 132 172 154 132 170 152 130 174 154 132 172 154 132 178 159 136 176 155 133 172 154 132 174 154 132 172 154 132 170 153 132 172 155 128 174 154 132 172 155 132 143 127 111 114 99 84 127 110 91 102 88 79 97 87 81 101 87 80 115 105 93 117 105 94 110 97 88 103 87 81 102 90 81 178 154 131 180 158 135 172 154 132 178 157 135 172 154 132 180 157 135 180 162 136 180 156 134 180 156 134 180 162 138 180 162 138 180 160 137 176 157 134 176 157 134 170 151 130 174 153 130 172 154 132 178 155 133 176 155 133 170 150 124 172 155 136 162 143 123 166 144 123 172 152 130 176 153 131 178 159 136 180 160 137 174 155 130 172 154 130 172 154 132 172 152 130 174 154 132 174 157 133 172 154 132 176 155 133 170 151 126 172 152 130 168 151 129 168 149 127 176 157 134 172 154 130 172 155 128 176 155 133 174 155 130 176 155 133 172 153 128 172 152 130 166 149 128 170 153 128 174 154 132 174 154 132 174 153 131 178 156 135 176 155 133 172 154 130 174 153 131 170 153 131 172 156 133 174 157 136 173 159 139 142 123 106 138 125 107 178 155 134 180 156 134 180 160 135 178 159 136 180 164 136 180 156 134 174 155 132 165 147 126 208 181 155 165 123 103 194 131 109 146 121 102 159 139 118 178 158 135 180 164 138 180 159 136 176 157 134 180 162 134 176 159 136 174 154 133 125 111 90 134 103 96 120 93 78 155 117 103 155 116 98 174 127 108 111 93 92 136 107 90 226 171 133 188 147 109 211 161 117 197 155 119 224 171 124 227 174 126 213 165 120 145 119 95 168 126 107 149 115 96 170 155 132 153 137 111 207 138 116 139 124 105 168 150 132 172 150 126 170 154 130 168 151 129 155 139 115 148 119 105 161 146 126 153 118 101 169 125 103 188 123 105 99 85 85 123 113 110 185 133 113 179 124 97 202 142 121 166 118 100 74 81 88 93 103 105 88 99 99 110 90 83 103 88 78 181 122 103 158 142 120 170 153 128 170 153 128 166 144 124 159 130 110 152 107 86 218 146 123 216 149 126 225 152 128 122 101 94 89 97 100 71 70 78 63 75 88 58 69 81 151 136 118 144 130 114 177 132 111 127 105 93 153 111 91 159 111 93 165 120 107 176 131 112 209 148 126 196 131 109 115 124 119 163 121 99 185 133 113 208 143 120 211 144 121 209 144 124 91 92 92 100 97 91 190 140 118 172 124 102 129 108 96 207 137 115 122 96 82 134 126 113 75 88 93 118 108 97 99 80 71 119 98 82 117 94 77 118 93 82 131 103 87 131 97 82 127 99 87 139 105 91 139 102 85 148 106 87 147 112 94 159 121 100 158 116 93 141 104 88 150 117 97 174 124 101 167 118 95 153 120 99 149 124 102 142 124 101 147 100 81 147 99 82 163 105 84 163 109 82 172 117 95 183 117 92 179 117 90 183 117 92 153 109 92 167 112 89 129 80 64 151 101 80 163 103 82 148 107 89 138 107 89 161 126 112 144 119 103 158 133 114 157 130 113 146 120 97 136 104 82 169 127 109 149 120 107 178 156 133 167 134 113 166 143 121 158 136 117 161 128 110 178 155 129 231 202 166 232 203 164 228 202 164 228 202 164 229 201 160 229 201 160 229 201 160 228 201 162 232 203 164 233 203 166 233 203 170 235 204 166 233 203 166 231 203 166 232 203 164 230 202 164 232 203 164 228 202 164 185 166 139 180 160 137 176 157 132 180 162 134 180 158 135 180 158 135 176 155 132 180 160 135 176 155 133 174 157 133 174 156 134 180 162 136 178 156 131 180 158 135 174 157 133 172 154 132 176 157 132 176 157 136 174 156 134 174 157 131 172 154 130 172 154 134 170 153 131 176 157 134 168 151 133 125 111 98 149 131 114 162 142 128 168 146 124 159 142 121 170 157 132 107 91 80 172 142 124 172 153 131 172 152 130 174 154 132 174 154 132 172 154 132 172 154 134 180 160 137 180 160 135 180 158 133 178 157 133 176 157 134 176 155 135 178 158 137 176 157 134 178 158 137 176 155 133 174 154 132 172 153 131 174 154 132 172 154 132 172 154 132 172 155 130 180 158 135 172 151 128 172 152 130 170 154 130 172 154 132 172 153 129 170 149 126 170 151 126 168 151 126 172 152 130 172 151 128 172 155 132 176 155 133 172 154 130 172 154 130 170 151 128 174 154 132 180 162 138 176 155 133 178 157 135 176 155 133 176 155 133 178 157 134 178 160 136 170 151 124 170 151 128 170 151 127 176 155 133 178 162 135 176 157 135 178 155 133 163 144 124 174 156 131 176 156 134 168 152 126 115 104 91 126 109 100 70 59 50 62 57 47 187 129 110 92 86 73 176 154 127 186 166 139 176 155 133 168 153 130 170 152 130 168 151 126 86 79 70 230 208 173 160 98 80 179 121 99 84 71 68 76 90 96 122 112 102 178 155 131 174 155 134 178 157 135 180 156 134 178 162 136 135 99 79 215 145 122 153 114 97 132 98 86 178 129 109 126 100 86 148 113 97 124 94 81 154 117 97 170 132 104 219 168 124 190 148 109 169 134 100 192 148 108 187 147 107 175 133 96 146 116 92 144 108 91 131 102 81 150 127 105 145 131 113 149 118 100 153 120 102 161 150 125 172 152 129 166 152 127 166 147 124 148 127 109 174 121 98 143 109 93 164 122 102 175 121 99 144 109 94 133 113 99 98 84 84 217 154 123 191 132 107 209 146 123 215 147 123 183 136 120 119 114 111 53 70 83 202 147 125 162 116 103 79 75 74 70 75 83 74 76 76 169 129 110 161 123 105 159 126 109 147 127 107 140 122 102 146 131 113 217 182 154 92 87 80 123 117 112 130 135 129 78 93 100 63 77 88 109 105 97 180 165 139 150 125 108 192 141 120 147 132 111 169 138 114 174 145 120 185 155 128 139 122 100 195 130 107 75 74 73 50 59 72 96 92 87 223 155 128 215 145 121 219 147 123 151 112 103 79 84 90 120 112 100 172 112 97 112 95 90 228 148 124 186 144 126 139 126 110 117 117 112 60 60 60 114 95 84 132 99 90 131 94 79 141 101 87 159 106 86 140 100 86 140 100 86 137 97 84 143 101 82 152 105 89 156 110 94 155 114 95 130 94 81 123 91 75 132 91 77 136 93 78 125 89 72 119 80 67 120 85 70 106 72 63 146 97 80 159 110 86 184 123 100 186 115 91 182 118 95 183 123 100 182 120 96 175 109 86 129 85 69 143 95 77 155 101 81 155 101 82 175 114 91 160 112 87 155 102 83 159 100 80 157 103 84 159 108 88 150 101 82 155 104 81 141 100 81 155 99 84 157 105 85 162 110 89 174 112 89 179 113 90 178 115 93 191 125 102 181 151 133 230 202 164 228 202 164 228 202 164 228 201 162 228 201 162 228 202 164 229 201 160 229 201 160 231 203 168 231 203 166 231 203 166 235 204 168 235 204 168 231 203 166 230 202 164 228 202 164 230 202 164 230 202 164 186 166 140 174 157 131 175 158 129 182 162 134 178 158 131 182 162 138 182 162 136 178 155 133 174 155 134 174 155 136 176 159 132 172 157 132 170 153 128 170 152 130 172 155 134 176 158 136 172 154 132 176 155 133 174 154 132 172 154 134 172 154 132 170 154 132 168 149 127 168 151 129 170 154 132 172 151 128 170 153 130 172 154 132 176 155 133 178 158 137 172 154 134 176 157 132 172 154 130 176 155 133 172 154 132 170 154 130 172 154 134 176 157 134 174 154 132 174 155 130 172 155 132 172 155 132 172 154 132 172 153 131 174 155 131 172 155 132 174 155 133 172 154 130 174 154 132 174 154 132 174 157 134 174 154 132 172 152 130 174 154 132 170 153 132 174 154 132 172 153 128 172 152 130 170 153 128 172 155 128 172 154 130 174 157 133 174 153 130 172 153 128 176 157 134 170 152 130 170 151 128 172 155 130 178 155 133 174 157 131 178 157 133 176 155 133 176 155 133 178 157 133 180 159 139 178 160 132 178 156 131 180 161 136 178 157 135 178 157 135 180 160 135 178 156 130 182 162 137 180 160 135 182 161 138 182 166 140 128 110 89 161 129 108 162 131 111 145 112 97 101 80 76 76 80 81 61 58 51 150 112 90 190 130 110 130 107 97 86 93 97 91 80 77 162 147 130 170 150 131 174 159 133 90 95 94 120 129 143 81 82 80 164 141 122 196 131 109 91 74 70 74 85 95 73 87 94 80 78 78 176 155 130 172 155 132 174 155 134 170 151 130 142 126 106 215 139 116 160 117 98 137 108 92 159 119 103 149 111 95 136 104 84 112 93 79 161 123 100 131 106 82 223 173 130 180 140 103 194 150 116 162 128 100 134 109 85 161 121 106 147 119 97 132 101 91 162 115 95 174 139 114 160 123 103 142 105 85 142 109 101 159 144 123 172 155 134 168 153 126 172 153 131 172 155 134 168 151 128 176 162 136 171 146 122 167 123 106 176 153 130 192 166 140 138 120 106 82 72 73 50 62 72 209 154 127 209 146 124 199 144 120 146 119 103 108 104 107 66 63 67 114 92 88 182 136 114 85 74 74 138 98 93 128 111 91 164 148 124 162 142 121 164 146 126 161 140 118 156 135 115 134 124 105 157 119 100 136 106 96 74 82 87 98 106 107 94 101 105 64 80 88 150 136 120 150 134 114 182 125 103 174 156 133 186 163 142 182 164 136 184 164 138 175 152 131 161 132 112 171 152 131 144 133 114 123 112 102 85 85 92 195 139 111 196 140 119 200 136 113 73 77 83 43 54 68 205 143 118 54 72 80 119 106 100 181 165 143 185 166 141 130 116 102 85 74 66 104 83 71 114 89 79 127 96 81 136 94 77 151 107 85 155 104 84 136 96 83 140 97 82 156 105 89 172 114 92 168 114 93 167 113 93 160 109 92 151 103 82 167 113 93 175 116 90 164 112 89 151 103 84 159 109 87 148 103 83 152 97 79 171 110 88 179 114 91 178 114 91 195 122 97 183 117 92 179 121 99 150 94 75 163 104 82 171 112 90 172 113 93 167 107 85 182 114 90 171 111 88 167 107 86 167 112 86 171 112 88 151 99 78 163 107 84 177 103 83 153 99 81 166 107 87 162 107 86 179 101 85 170 110 86 170 110 86 174 109 86 177 112 89 184 144 118 232 204 163 228 202 164 229 201 160 229 200 158 230 202 162 229 201 160 229 201 160 229 201 160 235 204 168 233 203 166 229 202 166 235 204 168 235 204 168 233 203 168 232 203 164 228 202 164 230 202 164 231 203 166 184 163 138 172 153 128 174 155 130 180 160 135 178 155 133 176 155 133 174 154 132 178 160 136 174 155 134 172 152 130 172 155 128 176 159 134 176 155 133 178 155 133 174 155 134 172 154 132 178 155 133 172 154 132 176 155 133 172 154 134 172 154 132 172 154 132 172 154 132 170 154 132 172 154 132 174 155 130 176 157 132 172 154 134 178 160 136 176 155 133 172 155 136 168 151 131 172 154 132 172 154 132 170 153 128 170 152 130 172 152 130 174 154 132 172 154 132 172 154 132 172 154 132 172 154 132 178 160 136 172 155 132 170 154 130 170 152 130 172 154 134 172 155 130 172 154 132 172 152 130 168 151 129 172 154 130 172 154 132 172 152 130 174 155 130 166 150 129 172 154 132 172 154 132 172 152 130 170 154 132 172 153 131 176 157 132 172 155 128 170 152 128 172 152 130 172 154 132 168 149 127 170 153 128 172 151 128 172 155 132 174 155 130 174 154 132 174 153 130 176 155 130 178 157 134 176 155 133 178 155 133 178 155 133 180 162 138 180 164 136 180 162 136 182 164 136 182 162 136 184 164 135 180 164 136 186 166 140 180 157 134 166 143 119 174 157 134 172 146 122 122 110 97 75 85 95 67 80 82 187 146 124 180 136 119 143 108 92 109 118 115 116 120 118 114 103 95 176 156 128 168 154 133 44 51 67 107 114 117 75 87 95 55 69 80 135 103 93 200 139 117 76 78 80 155 119 102 181 134 118 154 133 110 168 153 130 170 151 130 168 151 127 167 151 131 148 117 99 144 106 91 121 94 79 149 114 97 164 127 108 164 123 107 148 120 100 148 113 95 140 102 87 187 137 106 175 133 96 153 120 96 161 121 106 135 112 96 126 107 93 82 81 83 127 97 87 212 144 120 152 121 101 125 98 83 64 61 67 59 75 89 139 134 124 118 116 106 154 135 116 170 153 130 172 155 128 174 155 130 174 154 128 162 135 112 180 131 112 170 152 127 180 160 135 180 160 135 184 163 139 105 108 102 67 75 74 160 119 94 200 138 115 205 139 116 79 83 91 65 76 90 60 65 77 56 60 59 144 120 100 153 113 98 151 130 111 176 155 131 178 157 133 176 157 132 180 160 137 174 155 130 147 131 112 206 139 116 108 87 77 123 124 118 155 146 134 84 90 94 70 81 94 66 75 84 127 113 101 168 111 99 128 112 91 148 132 111 158 136 117 166 149 128 170 151 128 168 151 128 156 140 121 152 140 119 159 144 117 36 49 61 89 79 76 188 133 114 190 131 108 200 136 113 73 59 54 178 122 104 40 52 66 47 61 71 95 88 87 160 141 120 159 144 123 75 74 62 114 94 80 118 94 76 124 93 78 135 91 75 143 95 79 140 100 81 139 94 76 151 103 84 147 99 82 159 106 86 163 109 89 160 107 91 155 106 88 164 109 88 175 114 91 172 117 96 175 118 95 155 104 84 160 107 91 147 96 78 163 105 84 176 119 97 174 114 92 178 113 92 186 120 95 166 104 82 170 112 91 150 96 77 170 108 86 162 103 82 167 108 88 174 108 86 182 112 89 171 112 90 167 110 89 183 117 92 167 110 86 179 114 91 178 112 89 182 112 89 186 116 92 190 121 97 182 111 89 193 123 98 198 123 98 194 121 96 190 120 95 194 121 96 193 151 126 232 203 164 228 201 162 228 201 162 230 202 164 230 202 162 231 201 160 229 200 158 229 200 158 231 203 168 233 203 168 231 203 166 233 203 168 235 204 172 235 204 168 235 204 168 233 203 166 232 203 164 228 202 164 185 167 141 174 155 134 178 157 135 178 157 135 180 156 134 176 155 133 178 155 133 178 156 135 178 155 133 176 157 134 178 162 137 178 159 136 178 157 133 172 154 132 174 154 132 174 154 132 172 154 130 172 154 132 172 154 130 170 153 128 170 154 130 170 154 132 170 152 130 172 154 132 170 152 130 174 154 132 174 154 132 176 155 133 174 156 134 174 154 132 172 154 134 172 152 130 172 154 132 170 152 130 170 153 130 172 153 131 170 152 130 168 151 129 172 154 134 172 154 132 170 151 128 168 151 129 172 154 132 168 151 129 168 153 128 174 154 132 174 156 134 174 155 134 172 154 132 172 152 130 178 157 132 174 156 134 176 157 134 172 154 132 172 153 132 172 152 130 172 154 132 174 154 132 172 155 132 170 152 130 170 152 128 172 153 132 172 155 128 170 153 126 174 154 132 176 155 133 170 151 126 170 151 130 178 155 133 174 157 132 172 153 128 176 155 133 174 154 132 178 155 133 178 155 133 174 154 132 174 154 132 176 155 133 176 153 131 180 156 134 180 160 133 180 158 133 180 164 136 182 164 138 180 162 138 182 159 135 184 164 140 184 162 138 184 162 138 187 165 140 155 142 121 118 109 102 89 86 79 97 87 77 189 160 138 99 88 75 99 102 106 99 108 113 80 92 97 92 88 87 169 158 132 146 131 111 79 82 86 91 98 102 70 75 87 49 52 60 181 133 110 167 120 103 59 59 61 114 101 95 164 119 103 133 109 91 151 119 99 164 147 127 150 129 112 148 131 113 116 84 71 143 114 92 168 121 106 164 126 104 166 126 105 166 126 105 163 124 102 134 102 86 126 100 82 161 128 103 148 106 89 144 104 93 145 112 98 207 148 123 91 82 86 185 128 107 207 138 114 194 133 111 158 110 93 154 116 103 74 90 100 77 90 96 102 93 88 161 126 102 162 145 125 174 154 132 176 155 131 153 133 108 147 129 106 158 127 103 182 162 137 180 156 134 170 154 132 170 152 130 188 158 129 52 67 80 121 105 98 214 141 118 216 149 126 171 118 100 58 73 86 87 98 103 67 67 78 177 159 137 164 148 130 172 156 133 180 158 135 178 155 133 180 160 137 176 158 132 172 157 130 180 131 111 152 126 110 147 134 116 130 128 113 98 94 95 147 144 129 84 95 101 63 75 88 69 78 90 128 96 85 149 131 114 178 161 138 182 164 140 186 165 142 190 169 144 190 171 144 193 175 150 187 170 146 195 170 144 184 165 140 72 76 78 180 127 110 202 135 111 202 139 116 203 137 115 67 70 74 55 75 89 50 71 80 143 128 106 194 172 147 202 184 158 108 91 78 112 90 75 126 100 86 136 95 82 139 97 78 152 105 90 139 97 75 147 96 79 139 95 78 144 100 86 155 105 87 151 108 85 167 108 88 160 109 89 155 106 88 168 114 87 163 105 84 171 112 90 159 104 84 151 98 78 144 98 78 167 108 87 182 112 89 178 110 87 171 115 94 182 116 92 175 112 90 164 116 91 147 94 76 167 108 87 159 102 81 167 108 87 174 110 88 182 114 90 167 108 88 174 110 88 179 114 91 182 109 88 174 103 83 186 118 93 186 118 93 182 111 89 190 120 95 170 107 87 191 123 98 198 123 98 198 123 98 194 121 96 198 123 98 201 160 128 232 202 164 231 201 160 228 202 164 228 201 162 230 200 156 229 200 158 228 202 164 229 200 158 235 204 172 233 203 168 233 203 166 235 204 170 233 203 168 235 204 168 235 204 168 235 204 170 232 203 164 228 202 164 184 163 140 174 155 134 176 155 135 172 154 132 176 155 133 178 155 133 176 155 133 178 155 133 178 155 133 176 155 133 176 155 131 176 157 134 172 154 132 172 154 132 172 155 132 172 154 132 170 152 130 172 154 134 174 155 134 170 154 130 172 154 130 168 151 130 168 153 128 170 152 130 166 151 132 172 155 132 172 155 132 172 153 132 170 154 132 176 155 133 168 155 132 168 153 134 172 154 132 166 151 129 164 150 126 168 151 129 166 151 129 172 154 132 170 152 130 170 153 130 168 151 129 168 153 128 166 151 132 170 154 132 172 155 132 174 156 134 176 157 134 174 155 134 170 154 130 170 152 130 172 151 130 172 152 130 166 146 125 172 154 132 166 149 125 172 154 130 172 154 132 172 154 132 172 156 133 172 154 132 172 154 132 172 153 128 172 154 130 174 155 130 172 154 130 176 157 132 174 156 132 176 153 131 172 154 132 178 154 131 172 154 132 172 154 130 178 155 133 176 155 133 178 157 135 176 155 133 176 155 133 176 159 135 180 161 136 180 160 135 178 157 133 178 162 134 179 160 133 180 160 135 174 157 131 180 160 137 172 154 130 180 156 134 172 153 128 178 156 131 176 153 126 168 150 127 170 152 132 174 155 131 150 137 118 136 107 88 156 120 111 99 102 100 109 115 116 61 79 89 50 55 60 127 118 99 173 157 132 59 62 59 75 80 85 203 187 161 174 140 116 176 120 102 168 112 96 102 86 84 167 111 92 111 90 80 141 116 100 146 110 89 198 131 110 146 139 125 147 123 100 124 97 83 137 102 93 160 119 104 164 121 103 159 121 104 151 111 100 152 118 101 84 71 53 135 112 98 130 96 87 145 109 95 168 137 122 160 136 116 112 102 95 103 96 91 182 126 110 203 138 114 207 141 118 216 141 117 69 67 67 138 140 135 117 100 90 192 129 109 179 123 101 146 140 118 147 129 109 172 148 128 180 158 133 176 157 134 180 164 138 180 156 134 178 155 133 174 154 126 170 149 128 148 127 113 59 65 67 202 140 114 213 142 118 223 154 124 103 95 94 81 90 102 94 95 101 76 82 88 165 147 129 174 155 134 180 158 135 178 155 133 173 147 122 183 137 120 166 129 109 168 133 112 168 151 131 168 148 124 114 104 91 55 75 85 108 111 107 133 115 109 103 87 79 120 105 98 156 138 116 182 163 140 180 156 132 167 145 119 180 159 136 185 168 136 184 162 138 186 164 138 184 162 134 180 164 137 182 161 138 165 130 110 131 95 80 176 143 110 185 143 111 182 134 103 160 119 94 211 136 111 168 122 100 200 176 149 189 168 137 190 174 146 97 85 65 106 91 78 110 86 73 129 95 79 155 106 88 164 116 98 152 106 88 155 106 88 155 102 82 163 108 91 166 106 85 162 103 82 181 121 98 181 117 95 183 117 92 183 117 92 184 118 94 182 114 90 179 114 91 166 106 85 135 90 68 175 114 91 171 110 88 179 116 92 175 112 90 180 113 90 182 112 89 163 109 89 151 100 80 166 106 85 175 112 90 166 106 85 178 109 88 182 114 90 179 117 90 186 116 92 182 112 89 174 103 83 178 112 89 186 116 92 182 112 89 179 114 88 194 121 96 182 107 87 190 120 95 190 120 95 198 123 98 198 123 98 198 123 98 201 159 133 233 203 168 231 203 166 231 203 166 230 202 164 232 200 168 228 201 162 230 202 164 228 201 162 228 202 164 232 203 164 235 204 172 233 203 168 233 203 170 233 203 170 235 204 168 233 203 166 235 204 168 228 202 164 180 159 134 168 151 129 172 152 130 174 154 132 172 154 130 178 155 133 176 155 133 180 156 134 178 155 133 176 155 133 178 157 135 174 153 130 172 152 130 174 154 132 170 154 132 170 152 130 172 154 132 172 154 130 172 155 132 170 151 128 168 151 129 168 151 126 168 151 129 170 153 136 172 154 134 170 154 132 172 154 132 174 154 132 178 158 137 174 157 138 172 154 134 172 154 132 172 154 132 168 153 130 170 153 134 172 154 134 172 154 132 172 155 136 174 155 136 172 155 138 168 151 131 168 151 131 172 154 132 172 154 132 166 149 128 170 154 130 168 153 130 166 150 125 170 152 130 170 152 130 170 151 132 166 149 128 170 151 128 172 154 132 172 154 134 176 155 133 170 152 130 170 153 130 174 153 130 172 154 132 172 151 128 172 154 130 172 154 130 172 153 130 174 155 130 176 157 134 172 154 132 176 155 133 176 155 133 176 155 133 172 153 128 170 155 128 180 156 134 178 156 131 174 155 130 176 155 133 178 157 135 180 155 135 178 158 133 178 155 133 180 158 135 180 160 135 180 162 134 180 160 133 178 158 133 176 154 130 174 154 132 170 152 127 174 151 128 174 153 130 174 154 129 174 151 128 170 153 130 113 97 84 145 113 96 155 104 84 211 182 154 176 160 137 68 79 89 65 72 85 122 116 104 153 130 112 180 126 105 149 105 86 150 133 111 188 167 140 226 195 160 239 208 167 199 181 150 62 65 67 120 87 81 172 139 117 158 136 119 172 123 106 91 78 69 63 60 49 126 98 81 168 124 110 157 119 96 155 119 101 150 114 100 151 116 101 159 124 102 170 126 109 145 111 97 168 125 107 129 117 102 134 121 100 178 161 136 170 151 128 167 142 121 81 83 83 38 56 64 163 111 97 191 131 110 195 132 108 189 125 110 53 62 74 96 103 102 109 114 106 166 130 110 160 114 96 186 129 108 146 123 104 178 161 139 178 159 134 178 159 136 176 160 131 174 154 132 176 155 133 166 149 128 174 154 134 127 112 100 159 131 102 198 147 113 211 148 113 173 136 118 148 118 105 147 110 98 133 123 117 157 138 120 176 154 130 178 160 138 178 161 140 164 143 119 179 135 110 163 124 103 180 159 137 180 158 135 169 149 131 173 128 106 216 146 123 222 147 123 186 131 108 181 131 110 160 144 119 165 143 119 174 134 113 183 131 111 173 128 109 178 157 132 184 164 136 188 164 140 184 162 137 184 164 135 155 124 102 182 126 105 218 144 120 210 140 119 150 111 92 171 140 107 229 179 133 146 117 89 221 151 126 179 127 107 184 164 139 179 159 136 179 155 132 100 77 66 134 106 94 135 108 89 132 99 87 144 103 86 152 106 88 140 100 81 136 98 80 155 106 85 159 108 85 167 108 88 172 114 92 175 114 91 172 116 90 179 114 91 183 117 92 182 118 94 182 118 94 179 114 91 171 110 89 139 89 71 183 117 92 175 112 90 182 112 89 178 111 90 182 113 90 182 116 93 164 113 90 147 99 78 186 116 92 182 116 93 182 107 87 174 107 87 174 107 87 178 107 86 183 117 92 183 117 92 178 112 88 182 114 90 186 113 91 183 117 92 182 114 90 198 123 98 182 114 90 186 118 93 198 123 98 198 123 98 198 123 98 201 125 100 201 163 131 232 202 166 230 202 164 235 204 170 234 201 168 230 202 164 232 202 164 230 202 162 235 204 166 235 204 168 233 203 168 235 204 170 235 204 172 235 204 170 235 204 170 235 204 170 235 204 170 231 203 168 231 203 168 169 152 134 170 152 132 164 148 127 172 154 132 174 154 132 176 155 133 172 154 130 178 155 133 176 155 133 174 154 132 170 152 130 170 152 130 174 151 128 172 154 132 174 154 132 174 155 134 172 154 132 172 154 132 172 154 130 170 154 132 168 151 131 172 154 130 168 153 134 170 152 130 172 154 130 172 154 134 174 155 136 172 154 130 172 154 134 172 154 130 170 153 132 170 155 134 170 153 132 172 154 132 172 152 134 172 154 132 170 152 130 170 151 128 170 154 132 172 157 135 168 153 130 170 153 132 170 152 130 172 157 135 174 155 136 170 153 131 168 153 130 170 151 128 168 151 129 168 151 127 168 153 128 168 151 129 174 153 130 172 154 132 170 151 128 170 151 128 168 149 127 168 151 129 170 152 132 172 154 132 172 154 132 172 154 130 172 154 130 174 154 132 170 153 128 170 151 130 172 155 128 170 152 130 174 152 128 176 157 132 174 153 130 172 154 130 176 155 133 176 155 133 178 157 133 178 157 135 182 164 138 180 158 135 178 162 134 180 160 137 178 159 136 180 162 136 180 162 136 180 160 137 182 162 138 180 158 133 176 157 132 180 160 137 180 156 134 180 158 135 180 164 140 182 160 137 178 157 137 149 134 112 136 105 93 195 132 108 152 132 110 227 174 140 97 88 78 184 138 122 137 104 91 191 137 116 131 115 97 148 106 89 174 160 133 139 113 94 167 125 95 198 157 124 179 145 119 50 60 67 170 121 102 161 106 90 181 118 99 173 139 115 88 68 63 147 122 101 122 98 80 149 113 99 161 121 106 159 122 105 164 127 108 162 123 105 170 126 109 164 123 107 154 110 94 132 110 97 148 134 116 133 112 94 178 160 137 172 154 134 174 154 132 186 163 139 175 151 132 62 73 80 215 146 122 201 140 117 198 135 113 178 121 106 59 72 79 109 117 119 90 102 109 94 96 99 94 82 82 123 117 100 168 149 130 176 155 133 182 159 134 180 158 135 176 159 136 176 155 133 176 153 132 172 151 130 121 115 99 204 139 117 153 119 96 213 166 124 230 177 129 185 127 105 193 135 114 160 148 127 164 148 122 166 137 116 161 137 115 149 122 98 153 133 110 174 154 130 182 157 132 178 158 134 178 156 134 163 136 113 220 149 126 188 132 109 142 125 111 184 131 111 187 131 111 174 121 101 201 141 119 173 136 118 150 126 104 187 133 114 178 158 135 184 164 133 182 157 132 186 162 138 172 156 131 151 112 93 219 145 121 179 125 107 163 136 115 167 141 121 186 166 135 172 151 128 136 120 102 181 133 113 218 142 118 146 115 94 179 130 108 193 135 114 108 81 68 130 107 93 131 103 87 140 102 86 147 108 89 148 104 89 144 103 81 152 108 88 156 104 85 159 107 88 168 114 93 166 106 85 182 118 94 151 105 78 175 118 95 190 120 95 183 119 96 182 118 94 175 114 91 175 112 90 131 82 66 186 118 93 182 112 89 178 112 89 186 120 95 182 116 92 183 117 92 168 114 90 148 101 86 178 107 86 182 114 90 182 109 88 178 107 87 182 112 89 171 110 86 182 112 89 186 118 93 190 120 95 182 109 88 190 117 93 182 112 89 179 117 90 186 118 93 186 118 93 194 121 96 198 123 98 198 123 98 195 125 100 204 128 103 196 156 126 233 203 168 233 203 166 233 203 168 233 203 168 235 204 168 235 204 166 235 204 166 234 203 164 235 204 172 235 206 169 235 204 172 235 204 168 235 204 168 235 204 170 235 204 170 235 204 172 232 203 164 229 202 166 170 156 135 166 147 130 172 152 130 168 153 130 174 154 132 172 154 132 174 154 132 172 152 130 172 154 132 172 154 132 172 152 130 174 154 132 174 154 132 178 155 133 174 155 130 174 155 130 172 154 132 174 154 132 172 154 132 170 153 128 166 149 128 166 151 129 168 155 132 170 154 132 170 153 132 172 154 132 172 155 136 172 154 134 178 157 133 174 154 132 172 155 136 172 154 132 172 154 132 172 154 132 174 157 133 174 154 132 172 155 136 168 151 129 168 151 131 172 154 132 172 154 132 172 154 132 170 153 132 168 155 132 168 153 130 172 154 134 170 155 132 168 151 129 166 149 128 170 152 130 172 149 131 168 151 129 166 149 128 172 151 129 166 144 123 170 152 130 172 154 132 168 153 130 170 152 130 166 151 127 164 148 127 170 153 128 172 152 130 174 154 132 170 152 130 164 148 124 170 152 130 168 151 129 176 155 133 172 154 134 178 155 133 180 155 131 174 153 130 178 155 133 180 160 135 180 160 137 184 164 140 180 158 135 180 160 135 180 159 136 182 162 138 180 162 138 180 158 135 182 164 140 178 164 139 180 160 137 176 152 129 178 155 133 174 154 132 180 160 135 180 160 135 176 155 133 178 155 133 162 141 116 213 150 128 142 114 102 163 146 121 141 120 95 180 161 139 154 128 108 223 151 127 149 121 105 172 156 132 164 146 125 155 121 101 216 146 123 199 134 111 167 127 101 207 170 132 40 38 42 163 115 97 214 141 118 206 139 116 160 141 120 111 91 80 183 164 140 188 167 143 141 120 95 162 120 106 166 124 108 170 126 109 161 121 103 158 123 104 158 117 99 141 115 96 144 127 112 182 161 139 150 138 114 170 155 136 178 157 135 176 159 134 176 155 131 174 155 130 177 159 136 145 113 99 206 136 113 209 140 117 206 136 113 176 125 102 92 96 91 88 82 90 128 118 103 155 139 122 148 132 114 170 153 130 180 159 136 180 162 136 180 158 135 176 155 133 176 155 133 168 145 125 157 119 107 213 147 124 147 119 101 161 147 126 159 136 115 123 114 93 183 129 107 214 148 126 139 109 92 174 128 108 173 130 113 161 130 109 189 130 108 174 154 129 178 159 136 180 156 134 182 160 135 148 116 98 224 153 129 182 134 115 172 154 131 176 157 134 155 127 109 218 144 120 180 134 116 152 131 110 182 160 137 163 141 122 156 128 110 188 164 140 188 165 142 186 166 140 190 169 144 184 162 136 180 156 136 148 123 104 220 151 128 156 139 114 182 162 138 186 164 140 188 164 140 184 164 140 172 150 128 190 137 120 201 136 110 179 138 114 156 138 121 105 87 73 132 107 86 135 105 89 136 114 90 152 114 93 135 104 85 137 101 87 153 110 97 153 107 97 148 104 89 156 114 91 168 114 93 164 111 91 164 113 93 160 108 88 182 120 96 183 118 94 167 108 88 163 105 84 175 112 90 139 92 73 178 112 87 179 116 92 174 105 85 186 113 91 179 110 88 182 114 90 178 112 89 144 103 81 186 113 91 178 112 89 178 107 87 182 114 90 182 114 90 182 112 89 170 105 85 186 116 92 167 108 87 171 112 90 179 118 95 182 114 90 178 115 93 198 123 98 182 114 90 194 121 96 198 123 98 198 123 98 198 123 98 198 123 98 193 156 129 238 203 167 234 203 164 228 202 164 229 202 166 234 203 164 235 204 166 235 204 168 235 204 166 235 204 172 235 206 169 235 206 171 235 204 172 233 203 170 235 204 170 235 204 172 235 204 170 233 203 168 230 202 164 152 138 121 164 148 128 170 149 126 166 148 126 168 151 129 170 152 130 168 149 127 172 154 132 172 154 134 170 153 132 170 152 130 170 151 128 170 152 130 168 151 129 172 154 132 170 154 130 172 154 132 172 154 132 172 154 132 174 157 133 172 156 133 170 154 132 170 155 134 174 155 134 172 154 134 172 155 136 172 155 138 174 159 135 176 159 135 176 157 134 174 156 138 170 155 134 172 154 134 174 154 132 174 160 135 172 156 133 170 152 130 170 152 130 170 155 130 168 151 128 168 151 129 166 145 125 170 152 130 172 154 132 170 155 134 172 153 136 168 151 127 172 153 132 172 154 134 172 154 134 170 153 132 168 149 127 168 151 129 172 152 130 170 153 130 170 152 130 172 154 132 166 149 128 166 151 127 164 148 127 164 146 125 168 153 126 168 151 129 166 148 123 168 148 125 170 153 128 168 151 129 170 151 126 170 152 130 172 154 130 172 155 132 174 154 128 176 155 133 174 157 134 177 157 131 182 162 136 184 162 136 181 160 132 184 162 136 180 162 138 180 158 135 180 160 135 174 154 132 180 162 138 178 155 133 180 162 134 174 153 130 174 154 132 174 154 132 178 154 131 180 154 133 176 156 129 182 162 134 172 152 130 146 124 98 166 126 110 182 161 134 182 162 135 184 159 135 172 155 134 155 131 111 172 149 127 178 161 136 147 95 79 232 153 128 161 112 92 169 141 122 180 159 133 170 150 123 119 101 94 160 146 121 186 130 109 167 124 106 130 113 97 117 105 90 182 158 135 182 158 136 178 163 139 174 153 128 158 131 114 139 109 97 109 88 71 147 113 96 166 149 122 182 161 136 158 145 124 152 133 109 144 123 108 176 157 136 172 154 134 172 155 132 172 154 132 172 154 130 166 151 127 154 143 120 163 117 93 159 116 95 203 154 117 217 168 125 184 139 111 214 142 119 161 131 112 168 156 126 166 153 128 170 152 130 171 155 126 176 155 133 176 157 134 176 154 130 172 152 124 149 133 118 194 131 106 170 122 100 165 158 135 176 153 132 178 158 134 180 159 136 137 126 107 199 136 114 199 140 118 156 134 112 174 156 130 159 135 114 170 131 113 176 158 136 178 157 135 180 160 135 176 158 135 170 149 127 174 128 105 172 134 113 168 147 121 172 154 132 167 147 125 147 125 106 170 151 127 180 156 134 174 154 132 180 154 132 174 159 133 182 158 135 182 159 134 176 157 132 180 159 136 180 158 129 174 158 129 173 155 133 151 115 97 162 123 101 177 163 140 178 164 139 182 160 138 184 164 140 186 169 143 159 135 117 157 134 116 176 154 132 180 165 141 108 87 69 139 118 99 135 105 89 126 103 89 131 108 90 119 100 84 135 101 87 148 107 90 148 104 84 144 100 86 153 109 91 164 111 91 156 106 86 172 117 96 171 115 94 171 115 94 167 110 89 163 107 87 174 107 87 170 107 87 154 97 80 179 111 90 183 117 92 182 118 94 183 117 92 182 113 90 182 112 89 190 120 95 139 99 75 178 110 87 178 109 88 178 109 89 174 107 87 178 110 87 190 120 95 179 114 88 182 112 89 182 121 96 183 117 94 194 121 96 190 120 95 194 121 96 198 123 98 184 120 95 194 121 96 190 120 95 191 123 98 199 119 95 198 123 98 189 152 127 236 203 167 235 204 166 234 203 164 233 203 166 234 203 164 235 204 168 235 204 168 235 204 168 235 204 172 235 204 172 235 204 172 235 204 170 235 204 170 235 206 169 235 204 172 231 203 166 232 203 164 230 202 164 171 152 131 160 144 122 170 152 130 174 157 133 172 154 134 172 154 134 172 156 133 176 157 134 176 155 135 170 153 128 174 154 132 170 151 128 172 154 132 172 154 130 170 153 130 172 154 132 172 154 132 172 154 132 174 154 132 176 156 137 174 153 130 168 149 131 172 154 132 172 154 132 170 152 130 172 156 133 172 155 136 172 154 134 172 154 134 172 154 134 172 156 133 170 155 136 166 151 129 172 154 132 170 153 130 172 154 132 170 154 132 172 154 134 164 148 127 164 148 127 166 151 129 166 149 128 166 149 128 170 151 128 168 149 127 164 148 127 164 146 125 166 149 128 164 148 127 162 148 126 164 150 126 164 148 127 166 148 126 168 149 127 168 153 128 170 152 130 170 152 130 172 154 132 170 154 130 172 152 130 170 151 128 170 152 130 172 154 132 172 154 132 172 154 130 172 157 129 170 152 130 170 155 131 170 151 128 174 155 132 174 157 133 178 155 133 176 155 133 176 157 134 178 155 133 176 161 133 176 157 134 176 155 133 176 155 133 178 155 133 172 154 132 176 155 133 172 155 132 174 155 134 172 154 130 170 152 130 166 151 127 170 152 130 174 154 132 172 151 130 170 154 130 174 154 132 178 162 135 176 158 136 166 154 137 158 110 91 164 143 123 180 160 138 176 157 132 178 157 135 176 157 134 174 154 132 178 156 132 165 142 123 173 130 107 202 130 107 150 132 109 174 153 130 174 155 135 153 134 111 172 157 135 152 137 116 157 135 113 97 86 74 117 93 78 176 157 134 178 159 136 178 157 135 178 164 139 178 162 137 132 116 104 117 97 79 165 145 120 180 157 138 172 152 130 172 153 131 176 163 138 174 157 136 146 132 112 172 155 132 170 150 124 170 153 128 172 152 130 170 149 127 183 130 108 212 139 115 184 125 104 123 110 95 170 140 118 174 127 107 216 147 123 139 121 105 173 159 130 176 159 137 139 123 102 145 124 103 178 158 134 180 160 135 178 159 136 180 158 135 176 156 131 144 125 102 195 134 111 153 126 110 178 155 129 174 156 135 172 155 136 174 156 136 160 145 122 163 138 118 178 156 129 175 159 130 174 154 132 168 153 132 180 162 136 176 155 132 178 159 134 174 155 134 176 157 134 157 138 114 215 143 120 162 143 126 172 155 136 178 158 137 176 158 134 176 155 133 172 159 132 176 153 130 178 155 134 180 156 134 178 155 133 178 160 134 176 159 130 178 154 128 172 155 134 180 154 129 176 157 130 155 136 116 166 122 100 178 159 138 182 160 135 180 160 137 176 155 131 178 157 133 178 159 134 178 159 134 178 155 133 187 163 137 96 79 67 166 129 112 151 119 95 167 130 107 196 139 114 182 133 109 184 130 107 171 126 101 182 133 115 176 121 99 197 130 106 201 125 100 196 125 101 204 128 103 202 133 108 191 124 100 182 119 96 186 120 95 178 119 97 178 117 95 151 101 82 182 112 89 182 118 94 182 114 90 183 117 92 185 116 92 182 114 90 190 121 97 139 94 76 174 110 87 179 114 91 182 114 90 182 112 89 190 120 95 191 123 98 194 121 96 198 123 98 201 125 100 201 125 100 201 125 100 201 125 100 201 125 100 194 121 96 194 121 96 198 123 98 198 123 98 195 125 100 193 123 98 204 128 103 185 150 127 235 206 167 235 204 166 235 204 168 235 204 168 235 204 168 235 206 167 235 204 170 235 204 170 235 204 172 235 204 172 235 204 172 235 204 170 235 204 168 235 204 172 235 204 172 231 203 168 234 203 164 231 203 168 185 166 136 154 139 122 174 155 130 178 157 135 174 155 134 178 155 133 172 155 132 172 154 132 172 154 130 176 155 133 174 154 132 172 155 132 174 154 132 172 154 132 174 155 130 172 154 132 168 151 129 172 154 132 172 154 132 172 155 128 172 154 132 172 155 128 170 151 128 170 155 134 164 152 129 166 149 128 168 154 134 172 154 132 170 152 130 172 154 134 170 152 134 170 154 132 172 154 132 168 151 129 166 151 129 166 149 128 170 152 130 170 151 128 164 148 127 164 150 128 164 154 130 164 148 127 168 151 129 164 148 127 164 150 128 166 149 128 166 149 128 164 148 127 164 148 127 164 149 127 166 148 126 166 151 129 168 151 129 170 152 130 172 154 130 174 155 134 174 154 132 174 154 132 172 155 136 172 154 132 172 154 132 168 151 129 170 151 130 174 154 132 172 154 134 165 145 124 151 137 120 147 128 109 164 147 128 148 133 110 148 129 113 140 120 104 112 100 86 153 127 113 161 137 119 178 154 133 182 156 135 174 154 132 170 154 132 172 154 132 176 155 133 176 155 135 172 154 132 172 154 132 172 154 132 168 155 132 170 152 130 170 152 130 172 155 132 174 155 134 172 154 134 174 154 132 178 157 135 178 155 133 193 164 141 139 115 96 152 130 105 178 157 130 178 158 137 176 155 133 180 158 133 180 160 135 178 155 133 174 154 132 162 146 126 170 128 107 170 121 103 175 156 130 172 155 130 170 154 126 174 155 134 174 155 134 174 156 138 160 132 116 118 107 85 166 153 128 170 151 128 170 152 130 176 155 133 178 161 136 81 63 54 86 78 66 178 163 139 172 157 131 172 157 133 172 155 132 168 155 130 170 153 128 166 150 127 146 130 110 166 149 126 166 149 128 160 144 122 180 135 110 223 147 123 170 127 105 159 140 122 164 150 128 168 152 128 161 129 109 208 144 121 164 118 101 105 94 83 75 67 53 112 95 86 165 123 103 180 164 138 180 158 135 176 157 134 176 155 133 174 154 128 172 157 134 155 122 104 169 128 107 175 158 140 174 154 130 172 154 132 170 151 128 172 154 132 172 154 132 174 154 132 170 154 132 174 155 130 172 155 132 176 155 133 176 157 134 176 157 134 172 154 130 170 155 130 170 149 128 170 132 113 152 129 105 176 155 135 176 155 133 176 155 135 174 155 136 178 155 133 180 156 134 180 160 135 180 158 133 178 159 136 184 161 139 180 159 136 180 160 138 182 162 138 178 158 131 173 152 127 121 98 76 165 128 108 153 131 116 187 167 144 180 160 137 186 165 142 184 162 138 180 158 135 178 158 131 180 164 140 182 163 139 162 145 119 159 136 111 150 128 103 139 119 94 149 106 87 137 124 100 158 136 113 164 135 108 158 131 106 164 135 113 147 120 100 154 123 102 158 129 111 143 113 90 146 117 96 155 114 96 161 115 98 159 117 100 151 107 86 146 109 92 150 103 85 183 117 92 183 117 92 178 109 89 184 120 95 188 122 98 190 120 95 188 114 91 135 86 68 159 98 78 160 92 75 163 100 79 163 100 79 182 120 94 183 128 103 174 122 100 170 121 99 191 134 110 187 131 111 173 125 102 183 128 105 176 119 98 174 115 92 176 119 98 182 120 100 181 125 100 189 124 102 178 117 95 182 121 98 164 139 117 235 210 169 235 204 170 235 206 165 235 204 166 234 203 164 233 205 169 235 204 166 235 204 168 232 203 164 231 203 166 233 203 168 233 203 166 233 203 166 235 204 168 233 203 166 230 202 164 230 202 164 230 202 164 182 166 137 150 133 115 176 155 133 174 154 132 174 154 132 174 154 132 170 154 132 172 152 130 172 154 132 176 155 133 172 154 132 172 154 132 170 151 128 172 152 130 170 152 130 172 154 132 174 154 132 172 154 132 174 154 132 172 154 134 172 154 134 172 154 132 168 151 129 166 149 128 166 149 128 168 151 129 164 150 128 172 154 132 172 154 134 170 152 130 172 154 132 170 154 132 172 154 132 172 154 132 172 154 132 172 154 134 168 151 129 170 154 132 170 154 132 166 153 130 164 152 129 166 149 128 166 149 128 164 148 127 166 151 129 168 151 129 166 149 128 164 150 128 168 151 129 168 153 130 168 155 132 168 151 129 172 154 132 172 152 130 172 154 132 170 152 130 172 154 132 172 154 132 174 154 132 176 155 133 174 154 132 172 154 132 172 152 130 178 159 134 162 140 119 98 82 68 98 80 70 110 87 78 79 65 57 89 75 67 107 89 82 83 72 61 106 90 80 98 82 69 110 91 79 123 102 88 141 121 104 162 143 124 157 137 119 182 161 137 172 152 130 174 153 131 170 155 132 172 154 134 172 155 136 172 155 138 166 149 128 172 154 132 170 152 130 174 153 131 172 152 130 172 154 132 172 154 132 170 151 128 147 131 113 151 126 104 151 131 111 178 157 138 180 156 134 176 157 134 178 155 133 180 156 134 180 158 133 178 155 133 170 148 124 162 152 129 177 129 109 167 144 125 174 154 132 166 148 126 170 151 128 170 152 130 172 154 132 165 149 128 125 111 94 172 155 136 172 154 132 172 154 132 176 157 134 174 155 136 184 160 137 80 65 60 141 130 114 170 155 131 168 153 130 172 154 132 170 153 128 166 149 128 170 152 130 166 149 127 154 139 115 144 130 108 153 136 114 126 94 79 111 94 84 156 143 124 170 155 134 170 149 130 164 150 126 154 142 120 179 133 111 175 123 104 90 77 66 150 135 120 162 148 125 126 95 82 178 160 136 178 157 135 176 155 133 174 153 130 172 151 129 174 159 132 129 122 100 162 128 110 174 153 131 168 153 128 174 155 134 172 154 132 172 154 132 172 154 132 172 154 134 172 154 132 172 154 132 172 154 132 180 158 135 174 154 132 178 155 133 178 159 136 176 157 134 161 144 119 154 128 107 167 120 99 176 157 134 174 155 136 178 157 135 180 160 137 180 160 137 180 162 136 180 162 136 180 162 138 180 160 137 180 162 138 184 164 140 182 164 140 180 160 137 180 158 133 176 158 132 169 148 125 165 144 118 178 158 132 184 160 137 180 158 135 180 160 137 182 162 136 182 164 138 186 164 138 184 164 138 182 164 134 190 169 144 190 171 144 153 130 110 160 126 103 187 141 120 188 170 137 189 168 137 189 168 137 189 168 137 186 166 135 187 168 135 189 166 137 186 166 137 189 168 140 193 169 142 184 164 137 184 159 136 182 160 135 178 159 134 167 155 133 146 95 81 183 117 92 183 117 92 182 112 89 186 118 93 182 115 91 183 117 92 183 117 92 179 116 92 178 109 88 166 100 80 174 108 85 171 112 90 150 123 100 166 150 127 160 144 123 162 145 124 170 149 128 168 149 127 161 143 119 163 142 120 161 144 121 165 143 119 165 145 122 165 144 120 163 145 121 168 148 119 169 147 120 171 145 120 158 142 115 235 204 170 235 204 168 236 204 164 236 204 164 235 204 166 233 203 168 235 204 168 235 204 168 231 203 168 229 202 166 232 202 164 228 201 162 231 200 167 229 202 166 230 202 164 231 203 168 231 203 166 229 200 167 192 171 144 146 130 113 168 155 128 168 153 130 170 151 128 172 154 132 170 152 130 172 154 132 172 154 132 174 154 132 172 154 132 170 149 130 170 154 130 172 154 134 172 154 134 172 154 132 176 155 133 172 154 132 172 154 132 172 154 132 172 154 132 168 153 134 168 153 130 166 152 126 166 150 127 164 148 127 166 153 130 168 153 132 168 153 130 166 151 132 164 150 128 166 149 128 168 151 129 166 151 129 170 152 130 168 153 130 166 153 134 164 150 131 164 148 127 164 154 130 166 153 130 166 150 131 168 149 127 168 153 128 164 152 129 168 151 129 166 149 128 164 148 127 164 148 127 168 151 129 164 152 127 166 152 128 170 155 132 172 152 130 174 155 132 168 151 129 172 154 132 168 149 124 170 152 130 172 154 132 172 154 132 176 155 133 171 152 128 90 76 72 103 86 76 88 79 72 87 76 71 86 75 68 89 77 68 97 84 76 63 62 56 91 77 77 81 76 70 97 86 79 98 84 76 106 90 82 114 94 84 96 76 69 105 89 80 103 86 78 146 134 112 164 150 126 162 146 124 168 149 127 166 149 128 166 149 128 168 153 130 166 152 125 170 153 130 170 154 130 170 151 126 172 154 134 170 152 130 172 152 130 170 153 130 172 154 132 172 154 132 172 154 132 176 157 132 172 154 134 172 154 132 172 154 132 176 154 130 176 154 130 172 154 132 150 136 115 169 134 119 153 132 111 170 154 132 172 154 132 170 152 130 174 152 132 170 153 130 172 154 134 174 154 132 174 155 130 172 154 132 172 151 128 172 156 133 172 153 131 174 156 134 177 160 143 90 74 67 139 129 108 164 147 127 174 154 132 166 151 127 166 149 128 172 154 132 170 154 132 166 150 127 164 144 122 166 149 126 122 112 100 89 78 68 150 133 111 166 151 129 164 152 125 166 149 128 164 148 125 158 138 118 144 123 103 167 154 133 166 150 126 164 148 130 152 138 117 176 155 133 176 155 133 174 154 132 172 154 132 166 151 127 133 105 94 176 126 110 158 119 103 164 147 125 170 153 129 174 154 132 172 154 132 174 154 132 172 155 132 172 152 130 172 153 128 174 154 132 176 157 134 174 154 132 176 157 136 174 157 133 176 157 132 176 157 136 151 129 109 170 131 108 163 128 109 174 159 136 178 155 133 180 162 138 178 159 136 180 162 134 180 164 138 180 162 138 180 160 135 180 156 134 180 158 135 180 158 133 180 162 138 182 162 136 180 164 138 180 162 136 182 166 136 188 166 140 182 164 134 180 162 138 180 156 134 180 158 135 189 168 140 186 166 138 184 162 138 184 162 136 184 164 133 186 166 140 182 162 134 198 173 147 180 159 137 184 164 139 185 168 136 184 161 135 184 164 140 189 167 140 184 166 135 182 164 136 186 164 133 188 165 142 188 164 140 189 168 140 182 162 134 180 162 136 178 159 136 178 159 136 156 140 118 146 101 83 182 119 96 183 117 92 183 117 92 183 117 92 183 117 92 183 117 92 183 117 92 183 117 92 175 114 92 159 96 77 182 113 91 179 111 90 152 131 108 172 154 132 166 149 128 170 154 132 168 153 130 174 155 130 170 153 128 176 155 133 178 155 133 172 153 126 174 154 132 174 154 132 180 162 138 176 155 133 176 157 134 168 152 129 158 140 120 235 208 168 233 203 166 230 202 164 234 203 164 234 203 164 233 203 166 235 204 166 235 204 172 229 201 160 230 197 165 228 201 162 228 201 162 228 201 162 229 201 160 228 202 164 228 202 164 228 202 164 232 200 165 186 170 140 146 131 112 168 151 126 164 150 128 172 154 130 172 154 134 172 155 132 172 152 130 172 155 130 174 154 132 168 153 126 166 150 125 172 154 132 172 154 132 170 153 128 172 151 126 172 154 132 172 154 132 172 154 130 170 151 128 172 152 130 168 155 132 170 151 128 164 146 128 164 148 127 164 148 127 158 148 124 164 148 127 164 148 127 164 154 134 166 148 126 166 149 128 168 153 130 164 150 128 168 149 127 166 151 129 166 150 127 164 148 130 164 152 129 164 153 129 164 150 128 166 151 132 168 153 130 166 151 127 166 148 126 166 148 126 166 149 128 170 152 130 168 153 130 168 151 128 164 152 125 165 148 128 170 154 130 172 152 130 172 155 132 170 150 128 168 151 129 166 151 127 170 155 128 172 153 128 170 152 130 172 152 132 108 87 74 94 77 72 102 85 77 88 77 70 92 81 71 82 72 62 86 78 74 74 69 62 71 64 58 70 64 58 69 62 61 73 64 60 79 70 63 75 68 62 84 76 67 92 79 72 89 77 68 94 74 67 148 133 119 162 146 126 164 148 127 162 148 126 164 146 125 164 146 128 166 148 126 166 154 126 172 154 134 168 151 129 172 154 130 172 154 132 172 154 134 172 156 133 174 154 132 170 153 132 174 159 133 178 160 136 177 157 131 174 157 133 176 153 136 174 155 130 178 154 131 174 153 130 172 155 132 178 157 133 174 159 134 174 155 134 172 153 130 166 149 128 170 153 130 172 151 129 168 153 130 168 155 130 174 152 132 172 152 130 172 152 130 166 149 128 170 152 130 174 157 133 174 154 132 170 152 128 126 115 97 65 55 49 153 137 122 170 154 131 168 151 130 170 154 132 168 151 129 168 151 129 172 154 132 172 154 130 172 154 132 178 160 136 88 80 70 138 130 115 168 153 130 170 155 132 170 154 132 170 151 128 170 151 128 168 151 129 168 153 130 170 154 130 172 155 128 172 154 132 172 156 133 178 158 137 174 155 134 174 154 132 176 157 134 168 154 129 168 150 128 161 147 123 174 155 134 178 155 133 172 153 133 172 151 129 174 155 130 174 154 132 172 154 134 172 153 128 172 152 130 176 155 133 174 154 132 172 154 134 172 154 132 174 157 136 174 156 134 174 155 136 178 161 138 174 159 135 174 156 134 182 162 138 180 160 135 180 156 134 180 160 135 180 160 135 180 162 136 180 164 134 180 164 134 180 158 133 176 154 130 180 160 135 178 157 135 178 157 135 182 162 136 184 163 138 178 157 133 180 162 134 180 162 136 180 162 134 182 164 140 180 164 136 180 162 132 180 162 134 180 158 133 176 155 133 180 160 133 182 164 136 184 164 138 188 164 140 184 164 140 182 162 136 182 164 136 182 164 136 184 164 138 178 157 133 178 157 135 180 162 134 188 166 137 188 164 140 186 164 133 180 160 137 180 162 136 180 156 134 176 155 131 147 129 110 140 95 76 179 114 91 179 118 95 179 117 90 182 114 90 182 115 91 182 112 89 183 117 92 182 112 89 182 112 89 166 101 81 182 112 89 182 112 89 161 139 113 170 151 128 168 150 124 168 151 129 172 154 130 172 155 128 172 154 130 176 156 133 182 160 137 180 161 136 178 155 133 178 156 131 180 160 137 180 162 138 172 155 136 166 149 126 161 143 123 231 205 167 231 203 166 234 203 164 234 203 164 235 204 166 235 204 168 236 204 164 235 204 166 231 203 168 228 201 162 228 201 162 228 201 162 229 201 160 228 202 164 228 202 164 228 201 162 228 202 164 230 202 164 188 167 141 147 132 109 168 151 129 168 151 129 168 151 129 172 154 132 172 152 130 168 151 129 170 149 126 170 152 130 172 152 130 170 152 130 172 154 132 172 154 132 172 154 132 172 154 132 172 154 132 170 153 128 172 155 132 170 152 130 168 151 129 172 154 132 164 150 128 170 152 130 166 149 128 164 150 128 162 148 126 164 148 127 164 148 127 164 148 127 166 151 129 166 148 126 166 149 128 162 146 124 164 148 127 164 148 127 164 152 129 162 146 126 160 144 123 158 144 124 164 148 127 164 148 127 166 148 126 162 148 126 164 148 127 164 148 127 166 149 128 164 148 127 166 149 128 164 146 125 164 148 127 164 150 126 166 149 128 170 151 128 170 149 126 166 148 126 168 151 129 164 148 127 168 149 127 172 152 130 170 152 130 148 123 105 84 73 63 87 79 66 72 62 58 70 64 52 83 76 68 77 71 64 89 81 72 93 81 71 91 75 74 70 66 61 63 58 55 62 58 55 66 60 53 66 62 56 70 62 56 74 64 62 74 62 56 93 77 71 98 85 76 154 140 123 164 148 127 170 154 132 168 151 129 164 148 127 164 148 127 164 147 127 168 151 127 164 148 127 172 154 132 172 152 130 170 152 130 178 157 135 172 154 134 176 155 133 180 156 134 180 158 135 176 155 133 176 157 134 172 154 132 174 154 132 174 153 130 174 154 132 174 154 132 172 154 132 174 154 132 172 152 130 172 154 132 170 152 130 166 149 128 170 152 130 172 154 132 174 154 132 174 154 132 172 152 130 178 162 137 174 154 132 176 155 133 176 157 134 174 154 132 170 155 128 179 161 136 153 133 116 81 64 50 141 125 109 166 151 129 170 153 132 166 151 127 164 148 130 166 149 128 168 148 125 172 151 126 168 153 130 128 116 101 104 95 78 166 151 127 170 151 132 168 153 128 166 149 128 162 144 125 155 139 118 170 153 132 170 155 130 174 155 130 174 155 130 174 154 132 174 155 132 174 154 132 172 154 134 172 154 134 176 155 133 176 155 133 172 154 134 172 152 128 170 154 132 176 155 133 176 157 136 174 155 130 172 154 132 172 154 134 174 153 130 170 153 132 172 155 134 174 154 132 176 155 133 174 154 132 172 155 134 174 154 132 174 155 132 176 155 133 174 157 132 178 157 133 178 154 131 176 155 135 176 155 133 180 158 135 182 160 137 180 158 135 180 160 133 180 160 133 179 160 133 176 156 133 178 158 135 180 162 136 187 163 138 182 160 138 180 162 136 182 160 135 186 166 140 184 166 140 184 163 142 184 162 136 184 164 135 182 165 140 184 162 136 180 162 134 184 162 136 182 162 134 182 160 137 182 160 135 184 163 138 180 161 137 184 165 138 182 164 138 180 162 134 184 165 140 184 162 136 180 162 134 177 160 130 182 160 132 186 164 131 184 164 133 178 160 138 178 156 135 178 158 134 174 154 132 145 119 102 154 109 92 182 120 96 182 112 89 175 114 86 183 117 92 185 118 93 186 118 93 182 114 90 182 114 90 182 120 96 166 101 81 182 113 91 182 114 90 163 142 120 170 151 128 170 151 130 174 155 133 178 158 132 174 157 134 174 154 132 176 155 131 176 154 130 178 155 133 178 155 129 180 158 135 176 155 131 172 153 129 172 155 132 160 145 119 168 145 123 233 205 169 235 204 166 230 202 164 233 205 165 235 204 166 235 204 166 235 204 166 236 204 164 228 202 164 228 201 162 228 202 164 228 202 164 228 202 164 228 202 164 228 201 162 228 202 164 229 201 160 228 202 164 188 168 137 145 128 112 170 152 130 172 154 130 172 154 132 172 154 132 172 154 132 168 151 128 166 149 128 172 154 132 170 152 130 170 154 132 170 152 130 168 151 129 168 149 127 168 151 129 164 150 128 168 153 130 170 152 130 168 153 130 170 152 130 168 153 130 164 148 127 172 154 132 164 150 128 164 152 129 166 153 134 166 151 129 168 155 132 166 149 128 162 151 131 164 149 127 164 148 127 164 154 130 168 151 129 168 153 130 172 154 132 164 147 125 162 144 125 162 146 124 162 148 126 166 148 126 164 152 127 166 153 132 166 148 126 164 147 127 162 148 126 166 149 128 164 148 127 166 149 128 165 151 125 164 146 128 166 149 128 170 152 130 172 154 132 172 154 134 168 153 130 164 148 127 164 150 131 166 151 129 176 162 137 73 67 60 74 66 60 73 66 62 87 73 63 106 91 77 129 107 98 130 106 95 126 106 96 127 103 88 126 107 98 123 104 91 126 102 91 110 96 85 98 80 70 84 72 60 78 63 60 67 60 55 64 62 59 80 71 64 114 99 89 156 136 124 168 155 132 168 153 130 170 152 130 166 149 128 164 148 127 162 146 124 164 144 124 166 149 128 174 154 132 172 154 132 172 154 132 176 155 133 176 155 133 180 160 137 174 153 130 183 154 128 172 154 130 174 154 132 174 154 132 170 152 130 174 154 132 170 152 130 176 155 133 172 152 130 180 156 128 174 155 134 176 155 133 174 155 134 174 153 130 172 154 132 176 157 134 172 154 134 174 154 132 174 154 132 178 155 133 172 152 130 172 152 130 176 155 133 170 152 130 168 155 132 170 153 128 176 155 133 158 141 125 152 141 122 160 149 130 164 143 124 166 140 121 158 142 118 172 155 132 168 149 127 160 145 122 148 135 119 180 164 142 146 136 112 151 138 121 123 107 92 140 126 106 135 120 103 156 140 124 150 137 118 123 105 85 174 155 134 174 155 134 176 155 133 174 154 132 176 155 133 172 154 132 172 154 132 174 155 134 174 154 132 178 157 135 174 155 134 172 154 132 172 154 132 174 154 132 174 154 132 176 156 133 174 154 132 178 155 133 174 154 132 170 153 128 172 155 132 172 154 132 172 154 132 174 154 132 172 153 131 172 154 132 174 154 132 174 156 134 174 154 132 174 154 132 178 157 135 178 159 134 180 158 135 180 156 134 180 158 135 180 160 137 180 164 134 180 164 134 180 160 133 180 158 135 180 160 137 180 160 135 180 158 133 180 164 138 182 164 138 186 164 140 182 164 138 182 162 136 182 160 137 184 164 138 180 162 132 178 159 132 180 162 138 182 162 134 187 168 140 180 164 132 184 162 136 180 158 133 184 164 136 179 160 131 178 155 133 178 159 132 180 162 134 182 164 138 180 160 137 180 158 133 178 161 133 180 160 133 184 164 138 186 164 135 180 159 132 180 162 138 176 155 133 172 154 130 150 129 107 171 117 99 175 118 95 181 121 98 183 117 92 182 116 93 183 117 92 183 117 92 183 117 92 182 118 94 182 118 94 166 101 81 186 120 95 188 122 97 163 140 119 166 150 127 170 151 128 174 156 134 176 159 132 172 152 127 172 152 130 174 154 132 180 158 135 178 155 129 174 156 134 174 154 132 178 155 133 176 155 133 176 153 131 164 145 125 171 147 122 233 205 167 232 203 164 230 202 164 234 203 164 235 206 167 235 204 166 234 203 164 234 203 164 228 202 164 226 200 160 228 201 162 229 198 161 228 201 162 226 200 162 229 201 160 229 201 160 225 201 164 229 201 160 187 163 138 143 129 110 170 151 128 170 149 126 168 151 129 168 149 127 166 148 126 166 150 125 164 152 125 166 151 127 170 149 126 170 153 128 166 151 129 170 152 130 168 155 130 168 153 128 168 151 129 170 152 130 168 155 132 164 150 126 170 152 130 170 152 130 170 152 130 170 154 132 168 151 132 164 154 128 166 149 128 164 152 129 164 148 127 164 148 127 166 150 127 164 146 128 160 149 128 168 149 127 166 150 131 168 155 132 172 154 132 168 149 131 168 148 125 162 146 126 166 150 130 168 154 131 148 118 104 167 144 121 170 153 134 176 161 138 168 151 132 170 151 130 166 149 128 164 150 128 169 153 138 168 153 128 168 153 130 170 151 130 168 152 128 168 151 128 168 149 127 162 147 124 143 132 111 107 98 85 111 94 84 107 93 88 104 97 85 112 94 84 103 90 79 103 90 78 102 84 74 111 95 80 123 96 81 120 104 88 126 106 95 119 103 90 122 105 94 126 106 96 122 106 96 119 102 88 95 87 78 76 62 56 70 58 57 67 60 56 79 68 61 126 107 92 162 148 129 168 153 130 168 151 132 168 151 129 172 153 132 166 151 127 170 152 130 168 149 127 172 154 132 170 151 128 172 151 128 174 155 132 176 154 133 172 152 130 172 155 132 170 155 132 170 151 130 174 157 133 172 154 132 172 154 134 172 157 133 172 154 130 176 155 135 178 155 133 176 158 134 178 156 132 172 157 134 172 154 132 178 158 137 176 155 135 176 155 129 176 157 132 174 154 132 170 151 128 178 158 137 174 155 132 174 155 132 176 157 134 174 153 130 172 155 134 172 152 128 147 129 114 131 117 107 134 124 105 153 130 113 180 146 124 182 137 115 147 112 96 149 134 111 140 130 109 143 125 106 132 120 101 131 118 101 131 115 99 143 134 114 147 138 117 150 136 119 152 136 116 148 131 110 146 128 109 172 159 135 170 153 128 170 155 130 170 154 132 174 154 132 174 154 132 170 154 132 174 154 132 176 155 133 172 154 132 174 154 132 176 155 135 176 156 133 178 157 135 180 158 133 180 160 135 178 156 135 178 157 135 180 160 135 178 159 134 178 155 133 172 154 132 172 154 132 174 157 133 178 157 135 174 157 131 172 154 130 174 157 131 180 158 135 180 156 134 178 157 133 178 158 134 182 160 137 180 164 138 180 164 140 178 159 138 180 158 133 182 164 136 180 164 134 182 164 136 182 160 136 182 164 140 182 161 135 178 159 136 178 160 134 182 162 137 180 164 134 183 164 136 182 162 136 179 164 134 186 164 138 188 164 140 182 162 134 180 158 135 180 160 133 182 162 134 184 164 136 178 159 132 184 162 136 184 164 138 180 160 134 180 162 134 180 162 134 182 164 135 182 162 136 180 160 135 180 162 134 176 157 130 180 158 133 186 162 138 184 162 136 182 158 135 180 160 137 176 155 133 172 155 132 147 121 100 172 114 92 178 112 89 182 118 94 182 114 90 183 117 92 183 117 92 182 114 90 182 114 90 174 110 87 182 118 94 154 100 76 182 118 94 180 119 97 156 138 115 170 153 130 170 153 128 168 150 126 174 155 132 172 154 132 178 158 134 178 159 134 180 160 136 180 156 134 176 157 132 176 157 134 176 157 134 170 155 130 174 154 128 166 149 128 187 161 137 229 202 166 230 202 164 231 203 166 234 203 164 232 203 164 234 203 164 230 202 164 230 202 162 228 202 164 228 201 162 228 201 162 228 202 164 229 201 160 228 201 162 229 201 160 228 201 162 228 202 164 226 200 162 191 166 141 145 127 107 164 148 127 172 154 132 172 154 132 170 153 130 168 151 129 166 153 128 168 149 127 168 151 129 168 153 128 170 154 132 170 151 128 164 150 128 168 149 127 166 150 126 170 154 132 166 149 128 168 151 129 166 149 128 168 151 129 170 152 130 168 153 130 168 151 129 168 151 129 164 148 127 164 148 130 164 148 127 162 148 126 164 150 131 162 146 126 164 150 126 156 142 123 168 153 130 166 152 128 172 154 134 172 159 134 166 148 125 161 137 122 150 112 98 139 101 83 127 88 73 171 99 82 151 74 59 104 88 76 124 89 72 127 116 105 168 153 132 164 150 128 164 146 125 166 151 127 166 148 130 168 151 132 168 151 128 168 155 132 166 150 127 166 149 128 170 154 132 172 153 136 156 142 130 72 66 63 108 99 85 108 99 89 86 73 63 79 66 60 83 70 67 95 86 78 102 84 71 102 84 71 129 109 94 118 100 90 131 105 89 134 106 94 133 107 97 123 106 98 130 106 95 119 106 96 115 101 89 90 83 74 63 57 56 77 70 66 76 70 58 99 81 70 160 141 121 164 149 133 168 153 128 174 155 134 170 152 130 170 150 132 172 155 136 176 161 141 180 157 135 174 154 132 174 157 135 182 163 140 170 151 128 184 156 121 181 150 119 171 148 121 156 139 118 176 157 136 172 154 132 174 157 133 176 155 133 178 157 135 180 160 137 178 159 135 176 157 134 172 153 130 174 157 133 174 156 134 178 158 135 176 159 133 174 157 134 174 154 132 172 152 130 174 156 134 178 158 137 170 153 132 174 155 134 170 155 128 172 155 130 170 151 128 131 120 99 145 120 101 197 139 115 155 118 101 171 125 108 189 134 113 160 132 113 164 147 124 162 147 124 166 153 130 174 159 135 172 157 135 170 155 134 172 154 132 172 154 132 172 154 132 174 158 133 176 155 133 170 155 130 174 156 132 170 154 132 170 155 130 172 156 133 174 154 132 174 154 132 172 155 132 170 152 130 172 154 132 172 154 134 172 154 132 174 154 132 174 157 135 178 156 135 180 158 135 180 160 135 176 158 136 180 160 137 180 160 135 176 157 134 180 162 136 178 157 135 176 162 136 174 154 132 178 155 133 180 160 137 182 164 134 178 164 137 182 162 138 180 159 136 182 162 138 180 162 136 182 161 133 180 160 137 180 164 138 182 162 138 184 164 140 184 164 138 180 164 136 184 164 138 182 164 138 184 162 136 184 165 142 186 168 140 186 166 140 186 166 140 186 166 140 184 165 140 186 164 138 189 168 140 184 164 140 186 164 140 184 164 140 186 165 142 180 164 136 186 164 140 184 165 140 190 171 144 184 164 138 184 164 140 184 164 135 184 164 135 187 167 142 190 169 144 189 167 142 186 164 140 180 162 134 186 164 137 186 164 138 184 160 137 182 164 136 180 160 135 180 158 135 178 155 133 179 166 136 146 121 101 168 114 93 181 121 98 183 117 92 182 113 91 182 114 90 177 108 86 182 112 89 186 116 92 166 100 79 186 118 93 154 97 76 183 117 92 171 113 89 153 136 116 172 154 134 172 154 132 174 157 132 178 159 138 176 157 130 178 162 135 182 164 138 180 162 136 176 155 134 178 160 134 174 154 132 176 155 133 168 151 128 174 154 128 168 149 126 184 160 133 233 203 166 232 203 164 228 201 162 228 201 162 230 202 164 232 203 164 228 202 164 228 202 164 229 201 160 228 201 162 228 201 162 228 202 164 228 202 164 228 202 164 228 201 162 228 201 162 228 201 162 228 202 164 184 163 134 146 129 109 168 151 129 174 154 132 168 151 129 166 149 128 168 151 129 166 149 128 168 151 127 164 148 127 166 151 129 166 151 129 170 153 132 172 154 132 172 154 130 168 153 130 172 154 132 168 151 129 170 152 130 168 151 129 166 149 128 166 149 128 168 151 129 170 152 130 164 150 128 162 148 126 160 144 124 160 146 125 158 144 124 158 148 124 154 142 121 155 141 122 92 68 62 134 104 90 153 130 113 122 97 81 155 111 90 162 90 75 195 130 102 153 84 68 131 108 93 161 102 80 131 94 74 146 88 72 184 150 110 144 112 89 152 119 95 117 100 89 143 123 103 156 140 122 168 153 132 168 151 129 168 151 129 170 152 130 168 151 129 164 149 127 164 146 125 166 151 130 124 109 92 86 75 69 74 62 60 75 64 62 68 62 54 68 60 52 73 64 60 70 60 55 72 64 58 86 72 70 114 100 87 131 109 90 136 115 92 122 97 85 123 105 89 129 107 98 126 106 95 130 106 95 126 106 96 119 105 92 126 104 92 101 83 74 68 64 52 67 62 55 89 78 68 113 90 82 132 113 100 178 155 133 178 155 133 172 154 132 178 154 131 178 157 133 180 160 135 182 158 137 154 132 112 143 124 105 170 140 109 195 153 115 227 172 124 204 161 119 161 132 105 110 94 81 159 142 126 176 159 142 172 155 134 174 155 134 174 153 131 176 155 133 180 160 137 180 158 135 172 151 128 176 155 133 172 154 132 172 154 132 176 159 136 178 155 133 172 154 130 166 149 128 172 154 134 168 151 128 168 151 128 172 152 130 170 151 124 168 150 130 166 152 127 167 132 109 201 134 112 185 133 114 148 129 109 158 134 116 156 134 112 165 149 126 168 155 129 170 155 137 174 153 130 172 153 132 168 155 130 172 154 132 170 152 130 168 151 129 172 154 134 174 153 130 172 154 132 174 153 128 172 153 128 172 154 132 174 154 132 174 155 130 174 154 132 174 157 134 176 155 133 174 156 132 172 154 130 172 154 134 172 154 132 174 154 132 174 154 132 172 154 134 176 155 133 176 157 134 178 159 134 178 157 135 178 157 135 178 161 138 174 154 132 178 157 135 178 155 133 178 157 135 178 162 137 180 162 136 180 162 136 182 164 136 182 162 134 180 164 140 182 160 137 180 161 136 180 160 135 180 160 137 180 160 135 182 164 138 180 160 135 178 159 134 184 160 137 180 160 133 180 160 135 180 158 135 180 160 137 182 160 137 186 164 140 184 164 140 184 166 138 187 167 142 186 164 138 184 164 140 184 163 140 180 162 134 180 162 138 182 162 138 184 164 140 187 165 140 182 162 136 186 164 140 180 164 140 182 162 138 180 162 136 180 162 138 180 160 137 180 160 137 180 160 137 180 158 135 180 162 136 182 162 134 182 160 134 178 157 133 180 158 133 176 157 132 176 159 134 174 154 132 182 163 136 127 103 87 172 117 96 172 116 91 169 116 95 167 109 86 174 109 86 172 108 86 178 105 85 190 117 93 154 98 79 190 117 93 143 94 76 155 103 81 160 113 91 162 143 122 170 154 132 172 154 130 174 156 134 178 159 136 174 156 134 180 156 134 178 160 136 178 157 133 178 162 137 176 157 136 172 155 132 168 152 129 166 147 127 164 152 129 160 145 121 168 148 125 231 203 166 233 203 166 228 202 164 228 202 164 232 203 164 228 202 164 228 202 164 228 201 162 228 202 164 228 201 162 228 202 164 228 202 164 228 201 162 228 202 164 228 201 162 228 202 164 229 201 160 229 201 160 185 167 137 142 126 107 170 152 130 166 151 127 164 148 127 166 148 126 168 153 130 170 155 130 168 151 129 168 151 129 168 151 129 164 154 126 170 152 130 166 149 128 166 151 132 168 151 129 168 151 129 164 148 127 170 152 130 164 148 127 168 153 130 164 148 127 166 149 128 170 154 132 166 149 128 164 148 127 162 146 124 158 146 124 160 146 125 162 148 126 160 148 126 146 118 99 193 109 90 151 88 72 140 81 65 203 116 96 225 145 116 168 126 106 162 122 100 139 116 92 177 140 111 121 92 75 135 83 69 185 106 87 162 119 96 216 149 126 216 151 121 223 151 127 202 139 120 145 127 116 166 149 131 162 147 127 164 146 123 170 151 132 172 154 132 164 148 127 170 152 130 162 148 126 150 138 115 112 98 88 91 70 65 85 72 66 70 64 58 69 64 56 76 66 62 81 74 66 94 74 67 111 91 84 133 107 97 130 106 94 124 100 86 114 97 86 130 112 98 122 105 94 134 106 94 129 107 98 119 105 92 119 103 90 127 105 90 119 106 94 111 99 88 70 60 54 73 60 62 97 84 74 114 96 81 166 151 126 176 155 133 168 150 128 153 138 118 145 124 100 175 155 132 132 123 106 179 137 108 127 90 69 235 189 147 227 172 124 227 172 124 193 154 118 150 114 88 129 104 96 126 105 91 136 119 102 158 140 123 176 159 136 174 157 133 182 162 134 180 158 135 180 158 135 176 157 134 177 157 131 176 155 133 170 152 134 178 159 138 174 156 139 176 161 137 166 154 128 172 154 130 176 155 138 176 157 134 176 154 129 172 148 130 151 133 115 178 129 106 215 147 123 215 142 118 143 128 103 156 140 123 144 95 80 148 110 95 139 99 85 156 95 84 146 105 89 152 115 97 155 122 105 160 139 119 164 152 129 166 149 128 166 150 127 166 149 128 170 152 130 172 152 130 172 154 132 172 152 130 172 154 132 172 154 132 174 154 132 174 157 133 174 156 132 176 155 130 174 154 132 172 150 133 172 154 132 172 154 132 172 152 130 172 154 132 176 155 133 174 153 130 174 154 132 176 155 135 172 154 132 178 157 135 174 154 132 174 156 134 176 157 134 174 154 132 176 159 135 176 157 134 182 162 136 184 164 140 179 162 132 182 162 138 182 160 137 178 159 134 180 162 136 180 158 135 178 157 135 180 158 135 180 162 138 180 162 138 180 156 134 180 158 135 180 160 137 180 162 134 178 159 136 180 162 138 184 166 140 180 162 138 180 164 136 180 158 133 184 164 136 186 164 140 180 160 137 182 160 137 182 162 138 182 164 136 182 158 135 180 160 137 180 160 137 178 159 136 178 159 134 180 157 133 178 155 133 178 158 134 178 155 133 180 158 135 178 157 135 182 158 135 180 158 135 180 158 133 180 158 135 178 155 133 178 160 132 180 158 133 176 155 133 172 154 132 178 155 133 184 166 135 119 93 79 164 111 91 171 113 93 168 112 91 159 106 86 171 110 86 177 107 87 182 107 87 190 120 95 151 94 76 192 116 92 144 95 76 135 91 72 157 110 91 166 145 125 172 155 128 174 157 134 176 155 133 176 157 132 172 154 132 180 158 135 178 158 134 178 157 133 176 153 132 170 154 132 172 154 132 166 149 128 162 148 126 168 149 127 158 143 124 180 157 134 229 202 166 230 202 164 232 203 164 232 203 164 230 202 164 228 202 164 228 202 164 228 201 162 228 202 164 229 201 160 228 201 162 230 202 162 228 201 162 228 202 164 228 201 162 228 201 162 228 199 163 228 202 164 188 169 141 147 131 110 166 149 128 168 153 128 168 151 128 168 153 128 168 155 130 172 153 130 168 151 126 166 149 128 168 153 130 166 153 128 166 149 128 168 151 129 164 150 126 166 149 128 164 148 127 168 153 126 166 151 129 164 148 127 164 148 127 160 146 126 166 148 126 166 148 126 168 149 127 164 152 127 164 148 127 168 151 131 153 134 116 163 148 126 196 169 139 192 156 130 200 109 95 165 107 90 122 65 58 159 122 101 53 61 69 51 63 77 53 73 86 120 102 88 164 126 94 152 113 93 168 131 101 159 79 64 187 130 110 217 150 126 209 146 124 215 147 123 227 149 124 132 106 85 170 153 128 168 151 126 162 144 124 164 146 125 168 151 129 164 148 127 166 151 129 166 150 127 170 153 132 166 147 128 106 89 77 99 90 77 85 76 66 72 59 53 70 60 58 87 74 66 98 88 76 135 108 92 129 100 83 129 109 102 120 102 85 128 106 89 127 109 91 126 106 96 112 93 81 129 107 98 127 105 90 126 105 93 123 105 91 119 105 94 122 105 95 87 74 66 69 64 59 68 64 59 136 116 99 172 153 129 170 154 128 143 118 91 172 140 109 165 135 106 184 144 111 195 154 117 182 153 123 186 145 108 227 172 124 224 171 124 208 156 116 140 110 89 135 102 85 133 110 100 129 107 98 126 105 93 130 102 90 134 115 99 163 145 126 174 157 130 178 159 134 180 160 135 180 162 136 182 160 134 154 138 120 143 120 103 108 89 73 93 81 66 90 73 66 111 96 87 168 150 127 172 153 129 176 155 133 172 155 138 140 125 105 223 145 121 208 144 121 214 141 118 160 117 100 141 123 107 160 107 90 142 113 101 110 86 82 133 97 93 185 99 86 208 97 82 204 97 82 194 87 75 175 91 75 147 88 74 154 137 117 168 150 129 166 148 126 168 151 129 170 152 130 172 152 130 170 151 128 172 154 132 172 154 132 172 155 128 176 155 133 172 155 128 174 155 130 176 155 133 176 155 135 176 158 136 172 154 132 174 154 132 172 155 130 176 157 134 178 156 135 178 160 138 178 162 137 178 157 135 176 159 136 178 156 135 174 154 132 174 155 134 176 155 133 176 157 132 172 155 130 178 155 133 178 155 133 176 155 133 180 156 134 180 156 134 178 157 135 180 156 134 178 155 133 180 160 135 178 157 135 182 160 137 180 156 134 178 159 134 180 160 137 182 160 137 180 164 140 184 164 138 180 162 136 182 162 138 180 162 138 182 164 138 180 164 138 184 164 138 180 162 138 184 164 140 180 164 138 180 158 135 178 162 137 178 155 133 180 162 136 180 164 136 180 160 135 180 158 133 178 155 133 176 157 134 176 155 133 180 156 134 178 162 137 180 158 135 180 158 135 178 157 135 174 154 132 178 160 136 184 164 136 180 162 132 180 160 133 178 155 133 176 157 132 180 156 134 182 164 133 120 92 85 155 109 88 167 108 88 159 112 89 163 109 87 179 114 91 179 110 88 182 112 89 190 120 95 156 98 79 198 123 98 143 96 77 143 93 76 158 103 83 170 151 130 176 156 137 178 157 135 170 154 130 172 152 130 172 154 132 176 155 133 172 156 133 172 154 130 168 148 122 168 151 128 164 149 127 162 144 125 162 148 126 164 148 127 158 147 124 176 152 128 235 204 168 230 202 164 233 203 166 235 204 166 235 204 166 235 204 168 234 203 164 232 203 164 228 202 164 232 202 164 228 201 162 229 201 160 231 203 166 233 203 166 228 202 164 228 202 164 228 202 164 230 202 164 188 168 139 139 127 108 164 148 127 168 153 130 168 153 126 166 151 124 168 154 128 168 149 127 170 152 130 170 152 130 168 153 128 170 153 128 168 155 128 166 153 128 170 154 130 168 153 130 164 148 127 164 148 124 164 148 127 164 150 130 164 149 129 160 146 126 166 149 128 168 151 128 170 153 130 166 149 126 166 148 126 168 154 136 106 94 79 156 120 106 167 135 112 232 201 163 231 200 165 194 111 91 216 159 128 61 68 69 64 74 82 67 76 79 126 102 89 170 130 103 215 146 123 213 139 116 162 122 93 198 116 95 153 79 60 166 113 88 199 142 113 176 124 106 219 148 125 184 133 112 160 143 122 166 151 130 148 136 118 164 149 127 168 151 129 166 151 129 170 153 134 168 154 132 176 153 136 174 154 132 170 147 126 118 92 75 119 100 85 131 111 102 114 97 88 114 93 86 114 96 84 129 107 98 130 105 93 120 96 82 104 84 73 127 98 84 134 110 97 122 106 92 103 88 74 126 104 91 129 107 98 130 106 95 123 105 91 127 105 90 126 104 91 133 110 100 120 104 94 113 90 78 166 132 105 210 163 121 214 159 125 147 109 79 217 165 120 227 172 124 230 173 124 189 151 112 157 124 99 206 157 117 230 173 124 230 173 124 224 171 124 184 133 101 131 105 91 126 106 96 129 107 98 126 106 96 123 105 91 130 106 95 126 105 94 138 122 102 153 138 118 158 142 124 158 139 125 124 108 91 118 98 88 126 107 98 125 103 94 111 100 89 94 83 74 85 66 62 86 73 71 174 159 140 168 151 129 161 149 125 184 131 107 215 147 123 205 143 121 180 122 100 140 114 94 197 157 126 224 173 134 150 126 104 57 71 80 66 80 95 66 76 83 110 71 69 124 65 56 187 88 73 198 90 75 202 88 72 179 97 80 138 104 87 169 156 128 164 148 123 166 146 125 166 149 131 172 152 130 170 153 130 172 154 130 176 157 134 176 155 131 176 157 134 174 154 132 174 155 136 172 155 129 176 158 136 180 156 134 174 154 132 178 157 132 176 161 135 180 160 135 176 157 134 176 157 132 182 162 136 178 157 133 176 159 135 180 158 133 176 155 135 174 154 132 178 156 135 176 155 133 178 159 131 182 156 135 176 155 133 180 160 137 180 160 136 178 157 135 180 162 136 180 164 136 180 164 132 180 162 136 182 160 136 180 160 137 182 162 134 180 162 134 182 159 136 180 164 136 180 160 133 180 158 133 180 160 135 182 164 138 182 164 138 184 162 136 180 164 136 184 165 140 182 162 134 180 164 132 182 162 138 184 162 136 180 162 132 184 164 140 184 164 133 180 162 136 178 155 133 180 158 135 178 157 133 176 158 129 176 157 132 182 157 132 182 162 136 182 161 135 182 160 137 182 160 135 180 162 134 186 164 140 188 164 140 182 162 136 180 160 135 182 159 134 178 160 134 176 159 131 119 86 74 157 109 95 156 108 89 165 112 95 166 106 85 179 114 91 177 109 88 174 110 88 179 114 91 159 98 78 192 116 92 141 90 72 147 98 79 148 100 79 178 158 136 172 153 128 170 153 128 170 149 126 172 154 132 174 154 132 174 154 132 172 154 132 172 154 132 164 146 122 166 150 125 164 148 127 164 146 123 164 148 124 164 149 127 160 145 119 188 165 142 233 203 168 235 204 166 231 203 166 233 203 168 234 203 164 235 204 168 234 203 164 235 206 165 235 204 172 232 203 164 230 202 164 228 202 164 228 201 162 229 201 160 231 203 168 228 202 164 228 202 164 228 202 164 189 171 143 139 127 108 170 152 130 172 154 132 166 149 128 164 148 127 166 150 125 168 151 129 172 152 130 172 152 130 170 152 130 170 154 132 168 153 130 170 152 130 172 154 132 172 154 132 166 149 128 164 146 125 164 150 129 115 99 88 162 148 130 101 89 71 166 149 131 166 151 129 168 151 129 168 149 127 152 140 120 145 122 103 153 117 97 207 146 124 208 142 119 203 174 138 210 124 102 212 122 102 152 122 95 61 53 45 70 67 56 136 108 88 161 117 93 200 139 117 216 151 128 190 131 110 149 116 92 206 121 99 201 109 89 199 147 109 211 175 138 206 169 134 203 135 113 206 144 121 121 97 73 112 100 85 99 87 74 170 151 128 168 151 129 168 151 129 175 161 139 134 126 108 162 145 127 178 155 133 172 154 132 170 153 130 172 148 130 160 141 122 110 91 80 115 98 88 121 102 91 129 107 100 135 105 89 110 89 77 115 96 79 116 91 77 118 96 86 118 101 90 121 100 89 112 93 81 129 107 98 133 107 97 133 107 97 133 108 100 126 105 93 129 107 98 114 94 83 183 142 110 233 176 126 226 171 128 210 163 121 179 137 102 236 179 129 227 172 124 230 173 124 187 145 107 133 109 81 207 160 118 227 172 124 227 172 124 230 175 126 176 125 96 126 104 91 133 108 100 133 108 100 129 107 100 127 105 90 126 106 96 122 105 94 122 104 92 119 105 94 119 103 90 126 106 96 126 106 96 129 107 100 115 95 86 86 74 70 92 82 76 94 83 74 97 84 74 87 73 64 146 132 110 164 150 128 151 133 113 211 144 121 215 145 121 215 147 123 186 126 104 162 137 114 176 123 105 200 138 115 180 124 103 209 148 114 112 102 93 56 64 74 91 65 58 142 78 64 194 88 73 198 90 75 191 98 81 194 90 75 196 95 80 153 104 84 163 150 124 170 148 124 168 150 124 170 150 125 166 149 126 168 151 129 172 156 133 178 158 134 170 153 128 176 155 133 178 155 133 172 149 132 172 154 132 174 156 132 174 154 132 180 161 136 178 159 136 176 157 136 174 155 128 172 155 128 172 154 130 174 155 132 178 157 135 178 155 133 178 155 133 180 156 134 180 159 132 180 157 137 178 157 135 178 157 135 178 159 136 178 160 136 178 156 131 180 160 135 180 164 138 182 162 136 180 162 134 180 160 137 180 160 135 180 164 138 180 164 138 180 160 135 182 162 136 180 160 137 182 162 138 180 158 133 182 162 134 184 162 136 184 164 136 182 162 136 182 165 138 189 167 142 188 165 142 182 164 138 182 164 138 186 164 140 184 164 138 187 169 142 180 162 136 182 160 136 180 162 134 180 164 136 182 162 138 182 162 134 185 168 140 190 168 144 187 167 142 182 161 135 186 166 138 186 164 138 184 164 140 184 164 138 184 164 138 184 164 136 182 159 134 176 153 131 176 155 133 180 161 137 123 92 70 156 109 93 156 106 86 164 111 91 164 110 92 171 109 88 164 105 85 174 108 85 178 110 87 163 102 81 182 107 87 147 99 79 148 103 83 145 94 75 180 161 137 172 155 128 174 152 132 174 154 132 172 154 132 172 154 134 172 154 130 172 154 132 174 153 130 172 153 128 168 151 127 166 153 124 168 153 132 168 151 127 166 150 123 166 149 125 192 170 140 233 203 168 235 204 168 234 203 164 234 203 164 234 203 164 235 204 168 234 203 164 233 203 168 232 203 164 233 203 168 229 202 166 229 201 160 232 203 164 233 203 166 229 202 166 228 202 164 228 202 164 229 202 166 199 178 147 145 125 107 168 155 132 170 153 128 164 152 129 164 148 127 166 148 126 166 148 126 166 149 128 172 152 130 170 154 130 170 153 128 168 151 129 170 154 132 172 154 132 168 155 132 170 154 132 168 151 129 172 152 128 133 116 101 143 128 112 136 110 95 160 145 124 170 151 128 170 158 132 130 125 105 170 122 104 223 151 127 224 152 128 194 135 110 193 136 116 163 138 116 213 148 124 157 131 105 131 108 89 175 137 107 160 114 94 199 136 112 211 144 121 202 140 116 198 139 116 192 129 106 154 109 90 227 170 126 214 143 118 211 136 112 197 129 105 241 216 179 100 91 89 60 66 69 157 119 100 125 102 84 102 86 72 144 115 96 165 148 125 166 146 126 116 109 89 100 95 88 177 160 132 180 159 134 180 161 136 170 152 130 170 155 128 172 155 134 178 159 138 152 138 123 114 100 83 129 108 96 134 109 95 114 90 83 143 120 93 99 87 77 119 106 96 103 89 74 134 110 97 110 89 78 133 110 100 130 106 95 133 107 97 134 106 94 126 105 93 125 103 94 129 105 86 224 171 123 224 171 124 224 171 124 211 161 117 186 144 105 230 175 126 227 172 124 233 176 126 185 147 108 134 112 86 213 163 118 227 172 124 227 172 124 209 157 113 179 130 102 115 94 78 129 107 98 133 108 100 130 106 95 126 107 98 122 105 94 125 100 92 110 94 81 115 101 87 119 105 94 119 103 90 119 106 98 122 99 90 92 79 68 74 63 56 77 72 66 91 79 70 93 81 73 98 88 78 125 108 95 168 153 130 162 147 124 168 134 112 181 140 114 193 135 114 187 155 135 146 117 98 175 121 100 212 146 123 180 127 109 212 144 119 176 135 99 91 79 68 100 71 59 175 89 73 194 92 78 199 95 79 200 110 90 209 127 105 199 97 82 198 94 80 153 100 85 160 150 126 164 148 127 166 148 126 166 148 126 172 152 130 174 153 128 172 155 131 166 148 125 166 149 126 174 155 134 176 157 134 180 160 137 180 160 137 180 160 133 178 164 139 180 160 137 182 164 140 180 160 137 176 155 135 172 154 132 172 154 132 180 160 137 180 164 140 180 162 136 180 162 138 180 162 134 180 162 136 180 158 135 180 164 140 180 159 136 178 157 134 180 158 135 180 162 136 180 160 133 182 160 135 180 164 136 180 160 137 180 158 135 180 156 134 180 162 138 182 164 140 178 162 135 180 158 135 180 160 137 178 161 134 180 160 135 180 162 134 182 164 138 182 162 138 188 165 142 189 170 140 184 166 138 184 162 136 182 162 138 182 162 136 182 160 137 184 166 136 184 163 138 182 164 134 180 160 135 180 160 137 180 162 138 180 164 134 180 164 132 182 162 138 182 160 135 184 160 137 186 162 138 178 159 134 180 162 136 180 164 132 180 162 134 182 164 136 180 162 136 182 160 137 176 155 133 178 161 137 118 85 74 159 107 88 151 100 82 159 104 84 168 112 91 163 105 84 164 104 84 171 110 89 174 110 87 167 106 83 174 103 83 156 103 88 151 103 83 142 93 74 185 163 141 176 157 134 178 158 134 174 157 133 174 154 132 172 154 132 172 154 132 172 154 132 174 154 132 172 154 132 172 154 132 172 156 133 172 154 134 172 155 132 168 151 127 162 145 124 184 161 133 233 203 168 232 203 164 236 204 164 236 204 164 235 204 170 235 204 166 235 204 170 235 204 168 235 204 168 233 203 166 235 204 166 234 203 164 231 203 166 232 203 164 228 202 164 233 203 170 233 203 170 230 202 164 194 179 145 143 127 110 168 152 128 168 148 125 168 151 129 166 148 126 166 150 127 164 148 127 166 149 128 172 154 134 172 155 132 172 153 128 172 154 132 170 152 130 168 153 130 168 155 132 170 155 128 166 149 130 94 76 67 125 108 93 156 112 96 141 112 97 136 119 106 171 151 129 132 112 94 216 145 121 218 146 124 199 137 113 139 112 95 158 143 123 170 150 128 158 139 117 232 202 166 172 136 109 109 87 74 148 113 98 104 89 72 200 144 124 215 147 123 216 151 128 184 125 103 172 119 97 188 130 107 226 185 152 223 149 118 232 202 162 227 182 143 132 129 119 56 76 90 64 80 88 57 61 73 65 75 83 88 80 72 184 129 108 98 85 72 129 116 102 100 92 87 138 126 109 136 114 98 148 108 90 119 83 66 153 127 107 155 137 117 176 157 136 172 154 134 174 155 134 178 161 140 132 112 97 120 99 88 169 131 102 132 110 97 118 104 96 110 104 87 118 98 85 123 103 89 126 99 89 129 106 96 133 107 97 134 106 94 131 105 89 135 105 89 122 100 87 132 109 89 193 153 113 230 173 124 230 173 124 193 152 110 161 130 92 210 162 118 210 162 118 178 136 104 154 123 90 103 85 61 199 153 118 230 173 124 216 166 121 149 116 85 200 151 113 118 93 79 133 108 100 130 106 95 133 107 97 134 109 97 126 104 91 126 106 95 106 89 80 106 82 75 114 97 86 115 100 90 99 84 72 114 94 86 89 77 69 76 68 60 68 62 54 89 80 72 79 68 66 86 77 69 126 109 96 178 161 136 174 153 130 178 158 137 168 153 130 157 143 122 199 175 151 172 126 108 179 127 106 209 146 123 215 145 121 215 147 123 147 102 85 114 87 76 159 122 101 157 98 80 197 121 97 199 116 91 197 86 72 214 139 110 203 124 101 198 97 79 228 194 156 152 134 114 162 145 127 158 142 126 161 147 126 162 147 128 164 147 128 111 103 96 71 65 59 154 135 116 176 153 128 176 156 129 176 155 133 176 155 133 174 154 131 176 156 133 176 160 135 176 155 133 180 160 137 176 155 131 174 154 132 180 158 135 180 160 135 180 160 137 180 158 135 176 155 133 180 161 136 180 160 135 180 159 134 180 156 134 178 159 134 180 159 130 180 160 135 180 158 135 178 160 138 179 162 134 182 162 134 180 164 135 180 162 138 178 161 141 178 163 139 182 162 136 180 160 135 180 166 138 178 160 136 178 160 134 180 157 134 180 156 134 182 160 140 182 164 136 180 162 138 184 162 136 184 164 138 184 164 140 184 164 136 182 162 136 178 160 130 184 164 140 180 160 135 182 162 136 184 165 140 184 165 140 184 166 138 186 162 138 184 162 136 182 160 135 184 166 138 182 164 134 182 162 134 180 160 134 178 158 133 184 162 136 180 160 135 180 160 133 178 159 134 176 155 133 174 153 130 176 158 136 124 92 76 157 109 95 144 98 79 156 108 89 163 107 87 167 108 88 157 104 84 183 119 96 171 110 87 166 108 85 170 107 84 156 109 88 154 106 88 143 106 83 176 159 134 176 157 134 176 155 131 178 158 134 178 159 136 182 160 136 184 162 138 180 164 136 176 155 131 172 153 128 174 153 127 176 154 128 176 154 130 174 155 130 176 154 130 168 152 126 192 167 139 235 204 168 234 203 164 236 204 164 236 204 164 236 204 164 235 204 168 235 204 168 235 204 170 231 203 168 232 203 164 235 204 170 234 203 164 234 203 164 233 203 166 235 204 172 231 203 168 229 202 166 230 202 164 193 175 147 146 127 107 170 155 130 170 152 130 170 153 130 170 152 130 172 154 132 168 151 129 164 148 127 172 154 132 170 151 125 168 152 126 168 152 126 168 151 129 166 150 130 168 153 131 164 149 127 164 146 125 155 143 121 114 89 76 148 109 96 135 101 82 176 127 107 129 108 92 144 114 96 181 129 110 153 124 104 149 136 118 168 152 130 168 151 132 170 153 132 168 149 124 236 211 171 191 111 92 139 104 93 101 91 77 184 133 112 220 151 128 212 146 123 215 147 123 208 142 119 215 147 123 211 142 118 138 129 116 222 162 130 233 190 153 234 200 162 51 64 69 66 82 89 66 80 91 61 75 85 62 80 95 94 90 78 127 100 84 192 137 118 110 98 90 106 84 78 198 110 91 225 156 119 230 160 130 226 137 115 193 89 74 139 95 79 136 117 100 162 146 123 177 160 134 180 160 137 184 163 139 145 122 105 148 119 96 127 105 88 125 115 100 112 103 89 110 98 85 129 104 96 130 106 95 130 106 95 111 86 73 130 108 93 134 106 94 134 109 97 105 81 74 150 122 96 214 162 117 205 157 114 200 151 114 181 143 104 136 109 83 189 143 107 205 155 116 203 152 113 207 159 117 154 126 96 146 112 84 234 180 130 210 162 118 182 142 105 221 170 124 154 105 84 126 105 94 133 110 100 133 107 97 130 106 95 130 106 95 126 107 98 122 105 95 106 89 80 97 85 76 90 80 73 99 87 77 98 78 72 98 81 72 98 89 82 70 62 56 76 70 64 75 68 66 94 77 69 115 104 89 176 157 134 170 152 130 166 148 126 166 148 126 166 144 122 187 169 140 132 87 66 169 120 97 171 113 91 219 145 121 213 142 118 224 149 126 188 153 124 218 167 135 221 156 122 207 130 104 229 178 141 210 131 103 199 93 77 222 162 120 193 110 86 188 138 119 177 160 135 135 125 111 140 132 120 91 86 86 107 95 98 94 86 82 96 87 81 170 155 134 174 157 130 178 155 133 180 158 135 182 162 138 180 158 135 185 159 131 187 163 137 169 156 134 179 163 134 176 154 131 176 152 128 174 154 132 180 158 135 180 158 135 182 160 137 180 162 136 180 164 137 178 157 133 187 159 138 182 160 134 182 166 138 185 168 140 184 164 136 186 162 134 184 164 136 182 157 132 174 155 127 125 110 95 129 111 96 156 135 112 135 120 106 177 151 131 159 138 113 168 131 113 166 133 107 175 148 125 172 152 127 173 154 126 178 156 131 180 158 135 180 164 138 182 162 138 182 162 138 189 165 140 186 164 137 180 164 138 184 166 138 184 162 138 182 164 138 187 165 138 182 162 136 184 166 140 182 164 134 182 164 134 189 167 140 182 160 134 182 158 135 182 160 135 184 159 134 184 161 137 180 164 136 177 159 130 182 164 138 182 164 135 182 164 136 180 160 136 180 158 135 176 155 133 163 151 132 118 92 78 148 108 88 148 103 83 152 105 87 159 107 88 163 108 85 162 110 90 178 115 93 173 111 90 164 111 90 163 106 84 160 111 91 158 110 92 156 114 95 174 159 135 176 157 134 180 157 133 176 154 128 172 154 132 174 154 132 178 154 131 178 159 133 182 161 134 174 155 128 182 162 135 180 161 134 182 162 137 182 162 136 180 162 136 177 157 132 189 170 140 235 206 169 235 206 165 235 204 166 235 204 168 235 204 168 235 204 168 235 204 168 235 204 166 228 202 164 235 204 170 235 204 166 235 204 170 236 204 164 235 204 166 235 204 168 235 204 168 231 203 166 230 202 164 193 175 147 146 126 108 172 153 132 172 155 132 170 152 130 168 153 130 168 153 130 164 148 127 168 151 129 166 149 128 166 150 127 168 153 130 166 148 126 166 149 128 164 150 126 164 148 127 164 148 127 158 140 123 135 117 101 128 99 86 200 146 127 185 132 115 210 158 134 136 108 90 153 127 110 158 141 122 170 152 129 164 154 130 166 149 128 168 151 128 168 155 132 140 128 106 227 204 171 221 149 125 171 149 125 108 97 80 68 59 52 223 165 142 219 149 126 215 145 121 215 145 121 215 145 121 223 148 124 57 53 46 203 174 145 228 193 152 234 203 169 49 60 75 66 80 91 63 75 88 64 71 78 67 81 96 88 92 90 149 115 91 208 143 120 131 101 94 139 97 80 193 96 81 194 89 77 201 118 98 147 70 54 170 81 65 160 91 73 168 145 115 181 166 137 178 157 133 178 158 135 180 160 137 180 158 135 169 152 126 139 123 106 104 87 72 179 162 136 145 118 98 119 96 83 130 109 95 125 103 94 126 102 91 126 104 91 122 100 87 141 118 99 133 112 93 171 136 108 177 135 98 191 142 107 205 157 114 189 142 108 171 127 96 230 175 126 227 172 124 230 173 124 230 173 124 233 178 129 167 131 99 175 138 104 221 170 123 175 134 102 229 172 128 192 136 108 122 97 84 133 108 100 131 112 95 126 107 98 130 106 95 129 107 98 122 106 96 119 102 92 118 102 92 110 96 86 106 88 77 110 98 90 106 90 82 86 77 67 81 74 64 72 62 56 85 76 71 95 82 71 160 141 122 182 161 138 160 146 125 146 131 109 158 142 120 162 145 122 176 152 126 160 137 114 175 124 98 175 130 109 215 145 121 211 144 121 135 94 79 186 170 142 201 174 144 233 186 147 203 126 103 232 177 133 232 189 147 209 125 101 213 152 123 225 183 146 211 153 124 143 112 100 102 99 93 91 88 86 101 95 93 95 90 97 80 73 71 182 163 140 176 157 134 180 158 135 180 160 135 182 160 135 180 162 136 164 140 118 145 115 91 130 104 83 169 101 84 140 124 98 187 171 141 149 133 107 176 157 132 178 157 135 180 156 134 182 161 138 178 159 136 167 146 122 178 145 128 130 106 82 172 160 131 180 160 135 182 164 138 184 160 138 186 164 138 188 164 140 189 170 146 138 118 104 196 156 119 138 115 90 144 121 96 43 53 65 55 65 74 179 88 74 195 89 74 187 84 71 168 83 68 123 74 66 152 130 106 153 137 115 180 162 138 176 158 134 174 155 130 180 160 135 184 164 133 182 164 138 182 164 138 182 162 136 184 164 140 186 166 138 182 166 138 180 164 138 186 164 140 182 164 138 184 164 140 188 166 137 182 158 135 182 160 135 186 165 139 186 160 138 183 165 141 183 164 136 180 160 135 180 162 136 180 160 133 184 164 136 180 160 137 180 162 136 178 155 133 166 145 124 109 87 69 143 104 85 143 101 82 160 111 90 160 109 91 159 105 88 157 104 84 175 114 91 167 113 92 167 107 87 167 110 89 167 110 89 155 110 86 143 109 88 176 159 136 172 154 132 174 154 130 170 149 126 172 154 132 178 154 131 174 154 132 176 155 129 182 162 134 178 158 131 182 160 135 180 159 134 180 162 134 174 153 128 170 153 128 161 143 119 192 167 139 235 206 169 235 208 166 235 204 166 235 206 167 235 204 168 235 206 169 235 206 169 235 210 167 235 204 172 235 204 168 235 204 170 235 204 166 235 206 169 235 204 168 235 206 165 233 203 166 235 204 166 230 202 164 193 175 147 139 127 106 174 155 134 172 154 132 172 154 132 170 152 130 168 155 132 166 151 129 172 154 132 164 150 128 168 151 128 168 153 130 164 150 128 166 149 128 166 149 128 164 148 127 164 148 127 162 150 127 166 149 128 166 147 123 140 113 99 140 113 95 154 127 108 156 140 120 166 151 129 168 151 129 164 152 129 164 148 127 166 151 129 170 152 130 168 153 134 159 140 122 196 176 144 201 171 140 202 179 151 184 159 139 89 79 71 75 63 56 138 102 89 167 116 97 202 141 121 199 134 112 102 85 73 75 72 64 95 92 75 220 200 166 236 211 175 98 105 98 58 77 92 56 68 76 55 59 62 52 69 83 132 105 80 104 92 73 200 139 117 164 95 76 161 99 80 164 93 74 200 112 92 220 152 121 201 107 86 213 121 100 166 90 73 170 135 108 175 131 111 147 128 109 176 155 130 174 154 132 180 156 134 178 155 133 180 166 140 124 106 86 179 161 140 145 121 99 139 115 93 154 126 98 156 126 107 166 137 117 162 137 113 146 115 91 144 121 98 123 100 77 168 135 104 218 167 121 221 168 121 230 173 124 198 155 114 165 128 92 224 171 124 230 173 124 230 173 124 230 173 124 173 137 97 154 119 91 147 111 86 189 149 113 184 138 99 172 136 100 194 144 107 158 113 94 134 109 97 129 107 98 130 105 92 133 107 97 126 107 98 130 110 98 118 98 84 126 106 96 126 107 98 118 99 94 108 94 79 98 84 76 102 88 77 91 75 64 77 70 64 88 84 72 94 81 72 180 161 138 180 164 135 139 110 91 150 118 100 154 142 119 151 136 114 180 158 135 162 135 111 187 131 111 163 115 98 211 144 121 193 132 111 163 112 92 206 144 122 169 110 90 223 199 163 229 201 160 230 200 156 226 183 144 232 202 165 170 118 93 235 201 163 214 179 150 113 110 101 96 85 87 117 111 101 97 87 93 92 86 84 126 120 103 158 142 124 157 141 117 184 158 129 162 145 126 115 116 105 161 142 123 172 85 69 200 109 89 140 95 73 219 185 143 138 103 81 196 145 122 192 138 118 160 122 105 152 118 101 150 124 105 159 137 118 158 141 114 167 120 97 217 149 126 166 119 104 132 89 70 182 163 140 176 155 130 180 161 142 190 170 140 162 127 104 162 88 73 87 66 58 133 100 80 129 107 80 141 115 92 120 109 91 59 77 85 70 68 63 84 61 53 198 100 83 198 84 72 201 146 118 158 120 94 132 114 92 117 100 78 176 151 128 172 154 132 178 161 138 180 162 138 180 158 135 184 164 136 186 166 138 189 168 140 188 164 140 180 164 134 182 164 136 182 160 135 182 164 136 184 162 138 188 164 140 167 148 125 165 142 123 164 136 110 201 158 117 175 139 102 128 109 93 160 140 117 182 160 135 182 158 137 180 164 140 178 162 140 174 155 134 178 155 133 155 138 119 120 92 78 143 107 85 143 101 82 156 111 90 152 108 88 158 100 79 172 112 90 166 106 85 166 114 94 167 112 88 160 109 89 156 107 86 155 107 87 139 120 100 176 155 133 176 155 133 172 154 134 172 154 132 172 155 128 172 154 132 176 155 133 180 163 136 185 167 140 182 163 136 178 157 133 174 154 132 174 155 128 172 154 132 172 149 126 164 147 123 189 168 139 235 204 170 232 203 164 236 204 164 235 206 171 235 208 168 235 210 169 235 210 169 235 210 169 235 204 168 235 206 169 235 204 170 235 206 169 235 204 166 235 204 168 234 203 164 233 203 166 233 203 168 233 203 166 196 179 155 140 130 109 172 156 133 174 154 132 172 154 132 172 154 134 170 154 132 166 149 128 170 154 132 168 151 129 166 148 126 166 148 127 166 149 128 164 148 127 166 152 128 168 151 129 166 149 128 164 148 127 166 148 129 166 146 127 168 151 128 168 150 128 162 147 128 164 148 127 168 151 131 166 152 128 166 152 127 168 153 130 164 148 127 170 152 130 166 149 125 170 154 131 146 125 110 142 130 109 169 147 123 170 152 124 104 98 95 81 72 76 76 76 68 75 76 67 70 73 67 83 79 70 108 100 90 90 86 77 72 72 67 92 82 71 211 194 166 163 141 120 64 78 89 68 72 84 57 69 81 74 76 78 178 140 108 89 73 66 138 89 72 136 79 62 172 86 72 204 115 96 204 121 95 213 116 95 207 115 90 215 153 115 209 121 95 179 95 78 207 143 120 195 137 116 153 133 111 178 157 135 182 161 138 169 148 126 126 103 87 147 132 112 180 164 136 162 139 120 130 107 94 114 98 83 141 109 100 139 109 99 126 101 88 127 105 90 127 105 90 110 89 81 116 96 78 230 177 128 205 159 118 227 172 124 202 164 120 176 137 102 227 172 124 227 172 124 221 168 121 176 131 98 166 126 92 178 148 118 173 130 96 129 105 77 216 163 117 196 151 113 232 172 128 174 123 99 115 98 85 134 111 97 133 107 97 129 107 98 122 106 92 129 107 98 107 88 76 130 110 98 122 103 94 92 75 64 98 83 71 98 78 74 94 84 74 87 76 71 83 76 68 86 77 67 101 88 71 180 153 127 184 168 139 144 104 92 162 115 101 140 114 96 159 136 116 152 136 113 182 165 142 160 128 109 194 130 107 176 127 106 200 139 117 223 147 123 216 146 123 185 132 114 157 140 116 233 212 177 232 202 164 231 187 146 236 209 172 176 166 136 189 155 132 166 148 127 217 194 162 196 173 149 85 75 75 173 164 142 85 78 72 68 63 55 57 48 45 54 63 71 64 67 74 63 51 50 92 88 80 158 125 104 206 103 87 198 94 80 204 97 82 115 62 54 228 153 129 216 147 123 222 154 129 231 154 129 228 152 128 224 147 123 214 141 118 173 126 106 224 153 129 202 138 115 134 122 107 165 140 121 182 160 137 185 165 140 156 137 111 142 86 70 161 83 69 101 61 51 65 66 54 188 130 108 197 135 112 220 153 129 179 130 108 139 109 90 80 68 64 60 62 55 167 82 66 199 90 76 130 88 73 239 157 131 220 147 123 227 149 124 197 136 115 177 131 112 161 132 112 180 164 138 182 164 140 186 164 138 186 166 138 188 165 142 186 164 140 182 164 138 184 162 136 186 164 138 184 160 137 182 162 136 183 161 134 133 115 96 156 118 98 168 122 103 202 159 125 232 175 131 239 187 141 196 165 133 141 124 105 176 155 133 178 155 133 172 154 132 172 154 134 174 154 132 136 123 105 127 98 84 143 103 82 136 100 87 140 101 82 167 110 89 159 107 88 167 109 87 166 106 85 160 110 87 167 110 87 159 107 88 147 99 81 162 113 91 152 126 106 172 152 130 172 151 128 172 152 130 174 155 130 168 149 127 174 155 130 178 157 136 178 160 134 179 160 131 178 160 128 176 157 130 176 155 131 174 155 130 170 153 128 166 148 124 161 143 119 185 167 134 231 203 166 230 202 164 228 202 164 231 205 165 233 207 166 235 208 168 233 205 169 235 212 169 235 204 172 235 204 172 235 204 170 235 208 170 235 206 167 235 204 168 235 204 168 235 204 166 233 203 166 231 203 166 203 185 155 146 130 117 168 151 129 168 153 130 172 152 130 172 154 132 172 154 132 168 151 129 166 151 127 168 151 129 164 150 128 164 148 125 166 148 126 168 151 129 164 150 126 164 150 126 164 148 127 166 151 129 164 148 127 166 149 128 164 148 127 166 151 129 170 154 132 168 155 130 166 153 130 168 151 129 166 149 128 166 149 128 162 148 126 164 148 127 166 149 128 164 148 127 166 151 129 170 154 130 168 151 129 162 148 125 154 142 122 78 74 72 80 80 81 90 84 79 75 70 65 73 66 62 71 66 60 71 68 62 70 64 58 76 70 64 84 78 75 125 106 91 142 115 90 81 78 76 118 92 77 192 151 111 80 68 63 142 100 80 192 101 84 211 128 97 205 119 96 202 112 91 201 96 79 207 133 105 188 86 70 204 121 95 218 144 115 198 99 83 166 86 74 208 141 119 134 124 110 152 132 113 127 109 87 121 102 81 128 113 89 168 148 126 172 156 134 130 111 99 127 105 92 118 103 89 118 101 89 126 105 93 133 108 100 126 106 96 130 106 95 122 99 85 111 98 79 153 123 96 194 153 116 226 171 128 204 152 110 171 125 95 227 174 126 226 171 128 216 163 117 167 122 88 239 182 131 189 145 108 191 152 116 175 137 99 107 89 77 159 129 105 132 117 97 100 90 77 92 85 71 129 106 94 130 110 98 133 107 97 129 107 98 133 110 100 95 83 75 133 109 99 109 92 84 98 83 71 102 89 80 98 82 75 91 75 67 87 76 66 94 79 68 94 77 68 121 106 90 132 112 97 143 121 97 157 122 100 166 120 93 170 118 97 135 104 87 158 142 122 165 129 108 180 130 108 201 140 117 219 149 126 215 147 123 217 147 124 148 121 103 175 156 126 186 157 129 165 143 114 235 208 168 236 202 163 172 147 126 225 200 165 230 201 164 230 200 165 223 197 164 119 110 104 183 164 146 183 171 148 89 80 76 149 112 100 218 159 138 179 133 115 99 83 81 71 64 61 77 68 56 93 83 73 173 90 73 204 97 82 207 94 80 196 90 76 152 86 73 137 89 72 155 86 73 119 88 72 148 129 111 157 137 114 168 141 120 172 144 124 165 134 112 182 128 106 136 110 87 171 155 132 183 168 139 115 104 90 165 134 101 152 111 96 175 97 82 146 112 86 67 57 49 205 145 118 211 144 121 220 147 123 219 145 121 210 142 119 137 111 97 61 55 51 204 128 102 199 88 73 132 83 68 183 123 100 200 134 112 203 137 115 215 147 123 223 145 121 143 122 106 184 164 140 180 160 137 187 159 135 186 165 142 188 164 140 184 164 136 188 166 140 189 167 144 189 169 142 184 166 140 187 168 141 172 150 127 179 136 117 223 151 127 224 160 136 164 121 99 243 204 156 236 186 139 236 192 144 140 111 95 161 134 114 180 160 137 172 154 132 170 151 128 170 152 130 129 113 96 131 100 84 144 104 89 139 104 85 152 106 88 172 114 92 162 103 82 173 114 93 171 112 90 162 109 85 179 114 91 168 114 90 151 105 85 162 112 92 158 131 109 172 153 131 174 155 130 174 155 134 166 151 127 168 149 127 174 157 132 178 159 136 178 160 134 188 164 140 178 157 128 176 157 134 174 156 126 172 151 129 168 151 127 164 149 127 167 145 122 195 170 140 233 203 170 230 202 164 228 202 164 228 202 164 228 201 162 229 201 160 232 203 164 235 204 166 235 204 172 235 204 172 235 204 172 236 204 164 235 206 167 235 204 166 235 206 169 236 204 164 235 204 170 231 203 168 211 190 161 143 128 110 170 153 130 166 151 129 172 154 132 172 154 132 170 151 128 164 149 127 168 151 129 162 147 126 162 146 124 166 150 127 164 148 127 160 144 121 164 144 127 166 149 128 170 152 130 164 148 127 164 148 124 166 149 131 162 144 125 162 146 124 162 146 123 164 150 128 164 149 128 166 149 128 164 149 127 164 150 128 164 149 127 164 148 127 166 150 125 166 151 129 164 148 127 166 151 129 168 151 129 166 149 128 164 149 127 143 134 119 91 82 76 84 76 78 73 70 66 63 58 54 67 62 55 74 68 60 70 68 60 73 66 65 76 72 68 73 70 67 81 82 69 175 135 102 99 82 72 212 190 160 204 154 127 214 140 116 188 90 73 215 136 109 212 126 104 218 139 106 224 139 118 221 139 114 214 147 114 204 107 89 212 112 95 235 201 162 234 200 160 125 104 88 147 134 112 154 132 109 155 134 112 139 116 94 163 145 128 111 96 75 127 113 94 110 88 78 125 104 94 122 103 96 126 105 93 130 106 95 133 108 100 126 106 96 134 106 94 127 107 91 111 96 81 120 104 88 184 142 104 214 162 117 231 181 140 132 114 91 178 133 101 162 125 95 156 126 102 154 120 98 147 118 105 123 108 100 103 87 74 130 109 98 138 116 100 120 106 85 131 118 99 118 100 88 130 108 96 130 105 93 126 106 96 130 106 95 129 107 98 129 107 100 110 92 82 109 93 83 97 81 72 106 91 79 114 97 86 91 81 69 89 77 69 98 88 80 98 86 75 114 90 82 149 131 115 141 109 99 141 104 93 174 127 109 184 133 110 164 117 99 128 101 83 150 110 88 192 137 116 204 140 118 196 138 115 190 135 116 178 135 114 157 134 110 172 148 126 146 132 111 171 141 117 182 132 109 155 119 97 187 164 147 172 118 98 170 122 105 219 201 174 232 205 165 139 124 113 198 181 157 106 95 92 60 58 50 112 98 85 201 139 121 208 143 121 212 148 126 158 112 88 72 65 60 83 74 65 110 91 78 140 87 68 190 99 82 198 94 80 198 90 75 211 125 104 213 163 130 200 159 124 156 115 94 142 127 115 146 131 114 146 128 107 176 155 133 178 155 133 180 158 133 180 160 135 180 158 133 183 165 143 118 105 88 167 117 102 188 132 111 181 106 82 174 127 107 115 88 78 173 119 102 176 126 106 164 115 95 163 120 103 208 143 120 224 149 126 147 106 90 168 121 101 217 142 113 201 113 93 151 107 88 184 107 84 141 75 61 220 146 123 226 155 130 135 119 105 180 160 137 184 160 138 176 152 128 182 164 137 182 164 138 182 164 136 184 166 140 186 164 140 174 157 134 180 158 137 157 114 89 128 112 98 208 148 126 220 151 128 216 149 126 217 155 126 159 124 96 242 185 134 236 196 156 111 66 47 175 83 69 142 104 88 150 131 109 174 153 132 168 151 128 134 112 96 127 99 83 145 108 93 156 111 90 152 106 88 167 108 88 162 103 82 170 113 92 176 116 93 159 104 84 175 112 87 172 114 92 152 103 85 170 121 97 153 133 109 170 153 126 172 152 130 174 154 132 170 151 128 172 154 130 178 157 135 180 160 135 180 156 134 182 166 136 178 158 133 180 160 135 178 155 133 180 160 135 172 155 130 170 153 128 168 150 128 192 167 139 233 203 168 228 201 162 229 202 166 230 202 164 228 202 164 228 202 164 229 201 160 228 201 162 235 204 172 235 204 172 235 204 170 235 204 168 235 204 168 235 204 168 235 204 168 231 203 166 231 203 166 233 203 168 209 186 154 143 127 112 164 150 128 168 155 132 170 152 130 172 154 132 170 151 128 166 149 128 164 150 128 164 148 127 164 148 127 166 151 129 164 148 127 166 151 129 164 148 127 164 148 127 166 149 128 160 146 123 162 146 124 164 144 121 164 140 122 160 148 125 160 146 123 162 146 124 160 148 125 162 144 125 164 148 127 160 146 125 164 146 125 162 150 127 166 150 125 168 155 130 168 151 129 168 153 130 168 151 131 166 148 126 164 148 127 162 148 126 166 151 127 115 108 98 76 70 67 76 70 64 70 66 61 71 66 58 72 68 66 73 70 62 74 72 66 73 68 64 79 74 69 63 65 61 98 83 61 147 132 111 232 207 166 217 155 127 217 125 104 232 179 149 201 102 86 219 165 129 227 172 135 197 88 75 193 85 69 235 188 152 205 119 96 216 143 114 233 206 169 220 203 169 143 126 105 149 128 105 141 119 98 158 136 117 147 131 116 122 101 90 133 110 100 106 87 76 118 96 84 122 101 90 122 104 92 134 109 97 130 107 97 133 107 97 134 106 94 127 105 90 107 89 79 119 101 90 144 117 91 154 124 99 135 107 89 149 118 91 118 100 85 127 107 92 126 107 98 133 108 100 134 112 99 135 115 95 127 110 91 122 102 88 133 108 100 126 105 94 84 76 63 115 96 86 119 104 89 126 109 96 126 104 91 133 107 97 133 107 97 114 98 89 114 90 82 98 86 73 102 89 80 110 97 88 98 81 75 92 82 76 90 79 70 94 80 70 102 90 77 113 93 83 117 104 88 146 127 115 144 122 104 128 102 78 216 144 121 143 105 88 168 123 101 156 119 104 139 122 103 128 112 89 137 116 95 151 131 111 168 145 124 172 153 128 176 155 133 172 153 128 116 104 93 195 160 133 194 137 112 193 133 116 227 151 127 223 151 127 180 124 104 199 175 144 225 203 169 180 164 140 61 63 67 111 80 71 124 109 97 136 105 90 197 136 112 166 113 92 210 149 121 167 116 96 175 128 110 157 114 100 119 98 84 176 87 72 206 117 93 196 95 80 190 83 70 231 163 127 236 195 148 235 205 163 228 200 160 150 139 123 123 110 94 180 159 135 180 156 134 180 162 136 178 160 132 183 164 140 157 131 106 189 134 114 219 149 126 222 144 120 178 138 116 173 95 76 131 96 80 188 135 114 168 121 102 160 126 105 143 101 88 190 139 115 204 139 117 201 141 119 200 135 113 216 160 133 207 114 95 206 112 94 183 120 96 184 139 115 199 140 117 228 151 127 128 117 106 168 153 126 157 124 105 134 111 93 159 146 124 170 154 133 179 163 137 178 160 136 178 160 138 158 144 121 109 72 57 210 125 101 108 93 83 204 144 122 184 133 111 204 141 119 204 141 118 209 171 138 239 182 131 190 152 122 116 62 52 204 108 90 201 93 79 179 87 75 139 117 101 170 149 126 127 110 93 127 103 88 140 102 90 152 108 88 152 108 88 155 106 88 168 112 91 168 114 93 178 113 92 151 98 80 186 121 98 176 116 93 155 99 81 171 125 103 155 135 112 172 151 128 174 153 130 174 153 130 174 154 132 176 153 131 174 154 126 180 158 135 186 163 140 184 164 138 186 164 138 180 160 135 184 164 140 182 162 134 180 162 136 172 153 128 160 146 117 188 163 132 228 199 165 230 202 164 232 203 164 228 202 164 230 202 164 229 201 160 228 201 162 228 202 164 232 203 164 235 204 168 235 204 170 236 204 164 235 204 166 235 206 169 233 203 166 233 203 166 235 204 166 232 202 164 197 179 149 145 127 107 168 151 129 170 151 128 170 152 130 166 148 126 168 151 129 166 148 126 164 148 127 162 146 124 164 148 121 162 142 124 160 146 125 160 144 125 160 142 122 160 146 122 162 140 122 160 144 122 158 140 121 158 140 121 156 140 118 154 138 118 156 140 120 158 140 121 156 140 120 156 140 120 156 142 120 160 148 122 160 146 125 162 146 126 162 144 120 162 146 124 166 149 128 162 147 126 164 148 127 162 148 126 164 148 127 162 148 126 160 144 122 162 148 124 174 153 131 118 108 88 79 77 71 80 74 70 81 78 70 90 82 77 89 83 79 80 76 70 84 80 72 78 74 68 74 64 57 207 187 159 210 192 161 198 110 90 227 149 120 229 194 159 207 128 107 224 165 136 227 203 164 207 130 107 219 133 108 231 194 150 233 193 165 200 105 87 230 196 162 234 202 167 175 158 127 145 134 118 174 151 128 172 153 123 174 158 134 132 105 91 133 112 102 113 93 83 111 96 84 134 106 94 102 81 73 134 109 97 133 107 97 123 105 91 130 106 95 133 108 100 111 97 82 111 97 84 113 104 87 120 98 88 123 103 91 161 127 101 139 112 99 130 112 102 134 109 97 134 110 97 139 118 100 135 115 95 122 103 89 102 88 78 116 95 85 112 85 70 199 140 117 220 149 126 191 132 110 155 109 93 116 96 87 130 106 95 119 103 85 98 74 67 114 95 83 103 93 86 107 96 84 103 88 78 95 82 75 85 72 66 93 78 71 92 75 64 126 104 90 119 106 92 123 105 91 104 86 77 163 141 123 172 157 133 161 141 120 174 156 132 168 149 127 174 152 128 172 155 128 172 155 130 164 147 122 154 134 115 144 118 98 144 119 97 162 144 119 170 150 125 180 159 137 160 143 124 62 67 72 75 74 78 117 100 91 140 105 98 95 85 80 65 74 85 78 86 98 75 78 69 162 110 97 161 124 106 182 138 110 205 144 123 188 131 109 201 138 114 215 145 121 215 147 123 210 141 118 205 138 115 65 64 63 142 124 95 167 109 88 219 168 123 225 168 139 195 133 103 185 160 131 200 175 148 129 115 98 155 139 121 178 155 133 178 155 133 176 155 133 178 154 131 174 157 132 147 113 94 211 144 122 215 145 121 190 132 110 121 109 88 159 125 105 223 144 120 167 95 81 196 131 109 195 132 110 209 144 122 152 107 91 226 147 123 166 119 99 219 147 123 219 145 121 185 135 110 239 200 152 226 168 125 220 117 95 180 94 77 154 97 79 230 158 132 125 67 53 190 106 86 206 103 87 187 88 74 175 93 75 209 168 129 107 86 69 169 141 121 174 156 133 125 109 97 159 110 91 184 122 101 200 142 118 137 105 90 201 144 122 228 155 132 190 142 113 223 177 133 197 154 121 163 89 73 187 94 76 183 84 68 194 110 91 206 119 99 197 113 92 154 135 114 128 111 95 127 103 85 132 93 81 153 109 94 151 104 81 159 105 85 176 116 93 178 117 94 175 112 90 143 97 78 190 120 95 169 116 95 155 105 84 187 125 101 149 130 108 174 151 128 176 155 133 170 154 132 166 149 128 168 151 129 176 155 131 180 162 136 182 162 136 182 162 134 178 159 132 176 156 129 178 156 131 174 154 132 172 151 128 165 148 119 157 140 117 185 159 129 228 202 164 228 201 162 229 202 166 228 202 164 232 203 164 232 203 164 228 202 164 230 202 164 235 204 172 232 203 164 233 203 170 233 203 168 235 204 168 234 203 164 236 204 164 228 202 164 230 202 164 228 201 162 196 176 149 143 128 108 172 153 128 166 148 126 164 146 125 162 146 124 162 146 124 160 146 123 160 146 125 160 144 124 162 140 120 160 144 124 158 142 120 160 140 121 160 143 124 160 146 123 160 144 123 160 146 123 162 142 123 164 144 124 160 142 122 160 146 125 158 144 124 158 142 123 162 140 122 164 150 126 160 144 122 164 144 124 162 146 126 166 146 125 164 146 125 166 149 128 166 149 128 162 148 126 164 149 127 164 146 125 162 148 126 162 148 126 162 148 126 164 147 127 174 153 131 133 119 102 90 83 73 81 74 66 80 76 67 78 74 66 82 78 70 88 81 78 79 74 69 71 66 65 98 71 68 214 193 165 167 136 114 230 149 125 241 213 173 214 191 157 189 122 95 220 173 140 234 203 166 237 195 163 178 92 77 233 179 146 179 160 129 227 173 144 208 123 103 237 202 160 220 194 163 150 138 119 168 150 128 168 153 126 176 155 133 180 163 146 121 100 92 115 101 89 107 92 77 106 84 74 117 94 86 126 104 91 133 108 100 133 107 97 133 108 100 130 106 95 130 107 97 110 93 79 111 88 74 132 103 90 139 104 89 136 104 79 153 126 101 123 100 84 127 108 94 140 116 102 145 114 98 140 120 99 156 132 111 170 137 102 193 158 124 145 122 101 199 134 112 212 144 121 169 122 102 124 97 80 115 97 85 123 103 89 119 103 90 94 78 71 106 86 78 114 96 84 102 90 77 103 90 78 84 78 68 84 76 71 82 72 62 121 102 92 127 111 96 119 103 87 129 106 96 119 101 89 143 125 109 170 151 130 178 155 133 174 155 134 176 157 134 172 152 130 178 159 136 178 155 133 172 154 132 178 156 131 176 157 132 170 152 128 157 137 114 149 123 99 146 124 102 87 83 75 86 76 75 134 107 92 110 91 92 60 78 88 57 77 92 78 77 88 123 100 93 184 128 104 214 144 120 216 151 127 148 97 82 222 149 125 138 104 80 165 120 100 216 151 128 215 147 123 215 145 121 166 122 102 84 77 69 73 70 66 132 112 97 122 108 87 220 191 149 147 133 122 204 187 154 229 202 166 88 83 80 171 162 134 148 132 112 174 153 131 174 153 132 169 156 133 152 122 102 211 144 122 223 149 124 185 125 105 153 133 115 185 158 135 151 131 111 135 92 79 156 91 77 154 116 96 138 98 78 143 99 75 160 110 94 187 125 99 216 149 126 213 149 126 215 145 121 213 150 128 190 145 122 233 182 145 221 165 132 211 132 110 195 147 121 220 153 124 140 80 63 208 119 99 209 98 82 210 117 92 189 129 113 156 141 118 171 149 128 138 126 102 172 132 113 224 152 128 224 153 129 171 136 105 190 136 116 201 139 118 160 115 96 204 147 127 148 128 103 198 137 112 212 139 117 204 124 98 202 105 87 205 108 89 198 110 91 223 158 129 210 132 106 203 161 135 109 87 74 117 89 73 122 95 77 162 112 98 155 106 88 155 106 88 159 108 85 168 112 91 175 112 90 147 94 75 185 121 98 170 120 98 151 105 86 178 121 99 145 127 106 174 155 134 180 154 133 172 154 132 172 154 132 170 153 128 170 153 128 176 156 133 176 160 133 182 160 137 176 157 132 176 156 129 180 160 135 180 159 136 170 153 126 170 155 126 164 144 120 192 168 140 233 203 168 232 203 164 230 202 164 233 203 166 233 203 166 230 202 164 230 202 162 230 202 162 228 202 164 228 202 164 228 202 164 230 202 162 228 202 164 235 204 166 232 203 164 228 202 164 228 202 164 228 202 164 193 174 149 141 127 108 172 154 132 164 148 127 162 148 126 164 146 125 164 148 127 162 146 124 164 146 125 162 148 126 162 142 122 160 142 120 162 142 121 164 145 124 158 142 124 160 142 122 160 146 125 164 146 125 164 146 125 160 142 122 164 144 124 162 146 126 160 148 125 156 142 123 160 148 125 164 148 127 162 144 123 164 148 127 166 148 126 166 151 129 164 148 127 164 148 127 164 148 127 166 147 127 162 148 126 164 148 127 162 146 126 164 148 127 160 144 122 166 150 127 144 133 116 172 131 112 197 141 116 74 70 66 83 78 71 85 82 72 85 80 75 83 80 74 79 74 67 71 68 65 113 93 79 163 122 103 150 111 93 190 157 122 98 94 84 182 161 130 232 180 146 228 193 156 234 203 164 242 201 166 131 58 49 216 136 115 205 178 146 236 204 164 223 175 141 225 194 161 212 184 152 239 212 175 146 133 116 168 153 130 168 148 124 128 109 93 118 98 88 117 97 87 126 106 95 122 105 94 129 107 98 110 94 81 134 106 94 130 106 95 126 106 96 133 110 100 133 108 100 126 106 96 125 99 93 141 115 92 159 124 95 175 134 96 151 120 88 179 136 109 155 127 103 172 150 126 163 142 120 170 148 127 166 149 124 170 152 130 162 147 128 154 134 118 114 96 82 144 116 101 176 126 108 165 122 103 115 96 92 133 110 100 129 106 96 110 93 84 111 93 84 110 83 77 110 93 84 91 84 71 84 75 66 72 62 58 133 124 110 145 129 112 147 133 116 154 129 120 129 115 101 124 99 85 122 101 89 172 153 126 174 153 128 166 147 124 172 153 130 170 152 130 170 153 128 172 154 132 172 153 128 172 149 126 168 148 125 174 152 128 172 151 128 169 154 129 131 110 93 167 123 106 108 82 74 97 81 67 138 105 90 137 108 99 184 139 116 216 149 126 219 149 126 200 137 114 197 136 114 194 132 109 187 127 108 216 147 123 179 120 95 199 136 112 217 148 126 200 139 118 186 137 111 137 111 97 79 73 71 77 74 67 75 72 66 72 74 65 80 69 60 153 136 107 128 121 110 240 212 174 108 102 96 227 200 168 193 178 151 150 133 112 156 133 115 145 125 109 212 140 117 194 132 108 156 122 101 166 148 124 172 154 130 174 152 132 176 155 133 160 143 113 111 88 76 162 135 111 185 151 126 179 145 123 167 114 94 209 142 121 175 126 106 196 140 118 192 130 109 209 145 122 214 151 126 185 157 120 236 192 151 221 158 134 205 178 145 204 135 115 156 94 75 228 170 129 183 120 97 152 114 96 160 144 118 167 141 113 166 127 107 208 142 119 220 149 126 198 138 118 176 132 112 106 96 78 190 136 115 155 112 92 173 123 107 130 102 81 156 113 94 197 145 121 159 120 98 233 166 131 218 138 112 212 113 96 210 132 101 204 106 87 215 143 117 235 191 157 136 114 100 124 98 80 127 91 82 160 113 92 152 106 88 151 107 85 163 110 86 169 111 91 175 114 91 139 94 76 175 116 94 169 116 95 151 105 86 176 120 99 145 124 105 170 149 126 172 152 130 168 151 129 172 154 132 174 154 132 178 160 132 172 153 130 178 155 133 176 159 134 179 159 132 176 157 130 180 162 134 174 155 130 176 154 132 170 153 128 170 152 128 202 175 143 236 203 167 232 203 164 235 204 166 236 204 164 234 203 164 232 203 164 233 203 166 234 203 164 228 202 164 228 202 164 228 202 164 228 202 164 228 202 164 228 202 164 228 202 164 230 202 164 228 201 162 229 201 160 193 175 148 140 128 107 172 154 130 177 157 131 168 151 129 170 151 128 168 149 127 166 149 128 166 148 126 164 148 127 158 142 122 160 144 124 158 142 123 156 148 123 166 152 129 156 143 125 156 141 124 158 146 122 162 146 126 162 144 125 160 144 125 162 146 124 164 148 127 158 142 122 162 148 126 162 146 126 160 146 126 164 148 127 164 148 127 162 148 126 164 146 123 168 148 125 164 148 127 164 148 127 164 150 126 164 149 127 160 146 122 168 148 125 168 151 129 161 143 117 188 130 108 218 142 118 219 147 123 131 102 91 48 54 54 69 60 59 76 66 66 74 72 66 67 60 59 91 77 73 174 128 106 141 111 92 233 191 164 175 164 143 174 132 107 204 142 121 178 132 114 188 169 141 187 169 142 214 189 155 198 155 129 178 92 77 164 155 136 232 202 164 231 199 164 194 174 145 233 205 165 194 171 147 183 162 140 149 130 112 149 129 112 122 102 92 133 110 102 129 107 98 134 105 91 126 108 94 127 103 88 130 105 92 126 104 91 133 107 97 133 108 100 134 109 97 126 109 96 126 106 96 125 97 79 165 140 110 126 103 85 107 85 72 137 119 99 139 114 99 168 147 127 182 158 135 176 153 131 172 152 130 172 152 130 170 153 132 170 152 130 176 157 132 152 129 110 119 100 85 112 102 89 202 147 125 184 130 112 119 104 93 130 105 93 118 100 88 118 95 86 106 91 85 102 88 77 93 78 71 105 88 72 165 147 121 174 153 131 172 153 131 172 155 132 170 152 130 173 157 134 121 97 88 121 103 94 103 89 82 106 97 86 147 134 115 160 146 125 172 154 132 176 154 134 182 160 137 174 156 132 174 154 128 170 151 128 170 154 132 162 141 120 153 120 104 211 144 121 214 141 118 199 136 114 135 98 78 145 109 86 95 86 78 116 108 97 140 108 94 168 131 104 172 123 99 186 133 112 183 134 109 191 134 112 187 131 110 192 135 112 184 126 105 159 111 89 95 76 66 68 65 61 50 49 57 73 72 67 67 65 63 83 77 73 99 91 83 88 84 74 73 69 60 104 94 84 165 150 124 133 122 107 183 173 148 178 136 113 216 149 126 214 147 124 213 147 124 139 105 90 126 118 101 160 144 124 157 136 114 153 137 118 154 139 117 158 144 120 137 121 106 131 112 101 220 190 151 152 127 105 221 195 162 169 137 117 172 120 99 175 123 103 198 134 111 187 133 106 180 124 103 202 137 114 186 132 109 138 119 99 196 166 140 209 164 134 184 120 99 167 135 109 156 129 106 197 139 118 182 126 102 133 100 76 154 120 101 193 143 122 161 107 88 166 116 96 150 123 106 147 118 98 171 126 105 185 132 112 199 137 117 217 147 124 226 166 130 221 157 129 231 157 132 188 130 108 229 198 159 229 192 152 208 126 104 239 182 131 198 90 77 225 169 139 242 199 167 123 95 80 127 97 79 131 99 83 160 111 91 152 106 88 163 112 90 167 110 87 170 110 89 175 116 94 147 102 81 175 119 98 164 116 94 157 109 93 175 119 98 144 130 108 170 149 126 168 147 130 170 151 128 170 152 130 172 153 131 164 148 127 172 151 128 174 157 130 176 155 133 176 157 132 172 155 128 172 155 128 174 153 130 172 151 126 170 150 127 164 150 126 209 181 147 235 206 169 235 204 166 235 204 168 235 206 171 235 206 167 233 205 167 235 204 168 233 203 166 228 202 164 228 201 162 228 202 164 228 201 162 228 199 163 228 201 162 229 201 160 229 201 160 226 197 162 226 193 162 184 164 137 135 124 102 168 151 124 170 150 124 164 146 120 164 146 120 164 144 121 166 146 125 160 144 121 162 146 124 158 140 121 160 144 122 153 142 118 117 107 97 101 92 84 77 66 62 140 125 111 155 140 121 158 143 124 162 142 123 158 142 118 158 144 124 162 142 121 160 144 123 162 144 123 162 144 123 160 144 124 164 150 123 164 148 124 168 151 124 170 153 130 170 151 130 170 151 126 166 151 127 166 149 128 166 151 127 166 146 122 166 148 126 151 138 113 190 134 115 215 145 121 215 145 121 211 144 121 228 155 125 162 122 106 60 58 57 55 49 57 58 56 56 47 40 43 129 122 104 178 136 113 134 100 82 190 136 112 131 102 86 155 117 100 223 147 123 212 139 117 139 116 97 180 167 146 132 120 108 235 202 169 104 83 65 155 145 122 224 199 168 142 135 123 239 213 173 211 190 157 180 164 143 226 203 167 223 204 173 102 81 75 135 108 89 118 98 88 102 92 77 100 80 71 110 92 81 106 88 78 110 86 81 95 83 72 116 103 89 126 105 96 133 114 104 130 109 95 129 107 98 119 103 91 114 97 84 126 100 86 165 145 120 174 155 132 178 159 133 176 154 129 178 162 134 182 164 138 172 154 132 170 153 130 170 152 130 172 153 132 168 151 126 166 152 126 162 145 124 115 95 82 125 98 84 218 151 126 215 146 120 114 95 81 119 101 86 115 97 87 110 89 77 107 94 81 148 129 114 170 151 130 172 153 131 172 152 130 170 153 129 170 149 126 166 148 126 166 149 128 170 152 130 116 103 87 122 103 90 95 86 74 86 76 76 103 92 83 151 138 121 110 106 103 96 94 91 154 140 118 166 149 126 164 144 124 170 153 134 170 126 107 212 146 123 208 144 121 215 145 121 209 141 117 173 127 104 146 127 105 169 153 131 64 77 90 90 91 89 60 57 62 153 142 117 156 115 96 200 142 112 178 119 96 119 96 83 121 106 94 189 134 113 169 140 113 160 134 107 156 138 107 157 140 111 147 124 99 144 117 91 140 116 91 136 108 83 137 114 89 139 107 85 133 108 84 152 121 94 128 113 83 140 116 89 153 113 91 170 119 97 170 121 99 162 117 98 143 120 101 147 121 98 152 129 108 146 128 105 150 132 104 159 140 113 158 140 115 169 145 119 176 148 122 170 140 119 171 144 121 166 141 119 180 156 125 152 123 92 171 136 110 186 134 109 194 143 115 184 142 115 190 143 118 184 146 121 177 142 122 156 110 88 219 147 123 231 151 127 153 118 100 122 98 84 209 141 118 174 132 110 148 119 99 216 145 122 215 145 121 198 129 106 218 146 123 231 154 129 240 158 133 232 157 133 224 149 126 220 149 126 220 151 128 196 139 118 190 144 120 173 144 118 213 184 152 187 162 128 241 195 160 212 140 110 227 173 131 211 131 104 196 141 110 236 212 172 123 90 79 119 93 77 139 110 93 152 111 89 164 111 91 156 108 89 167 110 89 167 110 90 185 128 106 151 99 82 182 125 102 169 116 95 152 106 91 171 118 94 141 122 102 164 146 125 162 150 122 166 148 123 164 148 125 172 153 128 174 153 130 178 155 133 178 156 135 180 160 137 180 158 133 178 155 133 176 156 129 172 152 128 166 148 126 168 149 127 164 144 119 204 178 145 235 204 168 235 206 169 235 208 168 235 206 169 235 206 169 235 204 170 235 204 172 235 206 171 229 201 160 229 201 160 228 202 164 229 201 160 229 201 160 228 201 162 226 197 157 226 200 160 226 200 160 223 192 159 179 152 131 135 122 102 164 146 120 164 146 120 164 142 120 162 142 121 160 144 118 160 144 122 164 142 121 158 144 120 158 142 120 156 142 118 160 144 123 114 108 95 134 123 110 78 67 62 124 113 100 151 137 122 156 138 120 156 140 119 156 140 120 162 144 123 162 146 124 164 148 127 164 146 125 164 148 127 162 146 123 164 148 124 162 146 126 164 149 124 168 149 127 168 149 127 168 149 124 164 148 127 164 149 127 162 150 127 162 150 127 149 123 95 198 146 123 215 145 121 215 145 121 223 149 124 203 137 116 132 120 104 142 131 113 168 151 130 130 121 101 110 99 90 83 82 79 153 136 120 173 130 114 154 118 93 188 132 111 180 134 113 151 127 107 224 149 126 226 148 124 90 74 68 219 195 166 138 130 118 188 172 143 90 91 85 158 153 134 155 142 125 159 151 125 219 194 160 207 185 155 228 198 159 235 206 168 236 206 167 194 178 153 110 96 90 125 109 91 191 170 145 124 100 88 122 104 92 111 98 90 62 56 55 70 70 66 90 77 67 159 139 123 147 129 112 151 135 114 145 128 110 160 139 123 169 154 126 115 92 77 174 155 132 174 153 128 174 154 132 174 151 128 162 143 119 176 153 131 172 153 129 172 151 128 172 155 132 176 157 134 180 158 135 176 159 136 184 167 145 168 148 120 147 123 106 170 126 103 179 114 94 209 152 128 134 105 92 127 109 98 115 94 84 125 104 91 138 117 103 170 153 132 172 153 131 172 154 132 170 151 128 170 154 132 168 149 127 164 148 127 162 148 126 169 152 128 101 84 78 133 108 100 122 105 94 114 97 86 59 60 51 58 62 65 62 67 79 74 74 72 162 146 123 162 146 124 147 136 113 167 121 101 216 146 123 214 144 120 179 131 111 140 122 105 166 147 124 168 150 125 164 150 125 144 132 110 170 152 123 164 150 125 158 146 122 121 98 79 214 144 120 220 149 126 109 92 91 80 83 93 110 92 81 142 131 115 140 122 98 219 174 130 201 173 141 153 138 117 51 55 55 55 54 55 53 54 55 57 60 59 53 53 57 50 55 52 56 47 43 167 154 135 141 135 121 219 192 163 103 91 92 124 118 98 102 100 90 166 149 126 170 155 133 170 153 131 170 154 132 174 155 130 170 151 128 172 156 133 172 153 126 172 153 128 174 153 130 176 154 130 162 146 120 196 175 144 190 158 137 228 151 127 215 147 123 216 149 126 216 149 126 215 145 121 216 149 126 223 151 127 181 127 107 169 118 102 62 69 75 196 134 112 203 140 120 143 107 91 160 138 118 150 131 119 188 137 111 197 144 120 146 117 100 160 121 94 131 109 93 138 122 101 144 132 110 143 125 103 177 153 128 198 170 140 217 192 158 179 158 130 220 188 155 238 206 167 234 203 167 190 158 125 223 170 138 233 171 133 230 184 142 42 23 22 202 187 161 122 83 67 122 90 79 147 114 103 156 111 90 167 113 93 167 110 89 168 114 93 167 111 91 180 126 105 155 106 84 181 123 101 172 117 96 152 108 88 170 115 94 143 127 105 164 148 124 164 148 124 170 151 126 170 151 128 174 154 132 178 157 135 176 157 134 176 155 133 174 154 132 174 149 128 174 154 132 172 155 128 176 155 131 172 154 132 170 153 128 172 154 134 199 178 144 235 206 171 235 204 166 235 206 171 235 208 170 235 210 169 235 210 169 238 210 170 238 210 170 229 201 160 228 202 164 228 201 162 229 200 158 229 201 160 229 200 158 229 200 158 229 200 158 221 191 155 218 189 155 179 157 132 134 121 100 158 140 123 158 142 120 160 144 121 162 144 123 166 146 125 164 146 125 164 146 125 164 146 125 160 148 125 162 145 124 114 102 89 70 64 55 94 84 79 73 65 55 170 154 129 158 146 124 156 146 123 156 142 123 156 140 124 156 140 124 156 146 123 158 144 124 162 146 124 164 148 127 162 148 126 158 146 124 162 144 125 158 144 120 162 146 124 164 146 125 162 148 126 162 148 126 162 144 125 162 146 124 158 140 122 187 132 109 214 144 120 201 138 114 215 145 121 180 119 101 119 110 94 164 145 127 158 144 123 156 140 124 158 144 122 128 113 95 210 142 120 158 122 104 131 107 89 178 118 97 124 95 78 195 131 105 224 149 126 215 145 121 219 149 126 189 155 131 187 171 139 142 127 111 73 71 69 99 95 95 53 50 49 88 86 84 168 156 141 168 147 129 214 191 157 184 161 141 175 156 133 141 132 126 201 180 153 101 87 73 142 127 112 174 154 132 156 129 108 131 99 85 168 115 95 132 95 80 65 64 60 62 65 66 150 134 117 178 154 131 172 154 132 170 148 124 172 153 128 150 135 114 144 128 103 172 153 128 174 157 134 165 144 115 187 135 115 208 142 119 211 144 121 180 131 108 165 136 118 172 155 128 174 154 132 174 153 130 152 128 104 104 72 61 177 101 82 189 116 93 215 118 99 209 150 119 204 171 139 157 126 110 132 103 88 130 105 93 130 106 95 110 95 82 166 150 130 168 151 129 166 149 128 166 149 128 166 149 128 170 152 130 170 152 130 172 155 132 174 154 132 137 120 106 122 101 89 127 108 93 127 105 89 100 89 76 161 130 99 165 131 106 159 129 108 104 91 83 148 133 115 164 149 127 96 98 94 87 81 78 142 106 94 105 109 104 162 146 124 170 149 125 172 152 130 172 153 131 174 155 130 168 151 129 166 149 128 164 152 127 124 114 99 220 144 121 224 151 127 84 67 53 84 88 91 102 96 88 170 151 131 170 153 130 156 138 118 161 141 115 225 202 171 57 49 43 66 62 56 68 60 55 66 60 53 67 62 55 68 64 58 55 59 55 154 144 125 132 125 112 192 178 154 79 76 77 166 154 137 123 105 91 166 152 128 170 151 130 172 154 132 174 153 128 174 152 128 172 151 126 162 144 123 151 126 102 161 141 117 174 153 124 172 154 132 170 151 128 162 144 123 152 143 122 157 123 104 222 148 124 215 147 123 215 147 123 216 149 126 219 145 121 215 147 123 224 151 129 74 71 75 49 66 81 227 151 127 216 149 126 183 129 109 168 152 121 176 157 134 172 154 129 170 156 126 178 159 131 167 147 124 146 124 97 152 132 104 147 130 109 170 153 129 155 138 116 147 137 117 144 126 105 174 161 136 180 161 137 182 162 132 196 168 144 244 209 171 204 183 147 208 177 142 230 186 142 173 152 130 79 82 71 131 100 81 118 90 80 165 127 107 139 100 82 155 108 90 155 104 84 168 114 93 175 118 96 179 123 101 155 102 83 172 117 96 175 119 98 143 101 82 172 117 96 145 125 107 160 146 125 160 146 122 162 146 123 164 148 127 166 148 126 170 153 132 172 154 130 174 153 130 174 157 132 174 155 131 178 155 133 180 160 137 174 153 130 172 154 132 170 151 126 168 151 129 201 180 146 238 203 172 235 208 168 235 206 171 235 210 169 235 210 169 235 208 170 235 210 169 238 210 170 228 202 164 228 201 162 228 202 164 229 200 158 229 201 160 228 201 162 228 201 162 228 202 164 226 198 159 221 196 161 172 150 127 135 124 106 162 146 124 162 144 123 160 144 123 162 142 121 168 148 122 166 148 126 172 154 132 164 148 127 160 146 123 127 107 93 114 102 92 120 111 102 79 71 60 115 106 92 101 88 73 160 144 124 158 144 122 158 144 124 149 138 120 154 140 120 156 142 119 158 142 121 162 144 127 162 144 123 158 140 119 156 144 121 158 142 123 158 146 122 160 142 120 160 148 125 162 150 127 162 148 126 164 148 127 162 146 124 156 141 125 175 123 102 207 139 116 202 141 118 211 144 121 219 145 121 199 138 114 136 122 104 155 140 123 160 146 125 164 148 129 140 111 91 224 148 124 219 145 121 149 114 94 184 124 102 228 153 129 219 149 126 198 140 119 156 114 96 146 116 93 227 200 165 230 207 170 202 178 149 133 122 104 101 94 81 90 93 93 91 91 95 96 89 86 113 99 95 87 78 81 151 139 123 228 203 166 238 206 170 193 173 145 100 81 67 151 134 117 175 144 120 196 139 118 222 142 118 170 124 100 150 112 93 108 99 88 63 63 57 151 130 113 180 161 134 174 155 130 178 157 135 178 155 133 166 144 122 141 121 98 170 151 124 166 147 123 183 131 108 219 147 123 215 145 121 215 145 121 215 147 123 213 142 118 161 142 119 174 152 126 153 112 94 188 106 88 204 99 84 201 111 91 205 116 97 202 123 96 207 125 100 205 116 96 230 196 160 137 118 101 141 110 91 123 101 88 111 91 78 162 146 122 164 146 125 162 146 126 162 145 126 164 148 127 162 144 125 164 148 127 170 152 130 166 151 129 174 149 129 126 107 93 122 106 89 119 103 87 145 108 93 191 148 114 219 169 124 224 170 128 233 178 129 188 150 115 146 126 105 151 136 114 93 98 91 92 95 95 95 87 80 166 152 128 162 148 126 170 151 128 168 145 125 168 151 129 164 148 127 164 146 125 164 148 127 126 118 102 215 153 129 209 146 124 75 65 54 95 86 84 170 155 132 164 148 127 166 149 128 168 149 127 154 136 115 168 153 128 99 96 91 73 68 63 79 73 64 70 66 61 72 66 63 77 69 63 91 82 72 144 131 122 92 85 85 69 66 68 109 104 101 130 126 118 109 104 89 166 150 125 170 153 130 172 152 130 176 159 133 168 151 127 162 135 115 188 133 113 227 156 131 157 131 111 174 154 132 178 159 136 174 154 132 174 153 130 174 156 132 156 133 107 159 109 95 185 128 112 222 157 132 223 150 126 223 154 124 176 134 113 78 80 85 65 83 95 73 71 79 230 168 137 216 151 128 199 140 115 160 138 120 176 153 132 180 160 135 180 158 133 180 160 135 176 159 133 180 160 137 165 143 121 154 133 112 142 119 102 131 113 94 156 140 113 157 135 114 147 132 107 156 135 115 181 164 139 174 130 113 191 136 116 176 136 113 179 153 125 215 179 149 194 164 130 75 74 79 123 101 79 122 97 84 158 119 100 144 106 82 165 116 97 148 107 85 164 111 91 170 114 93 160 111 94 147 98 80 172 116 94 176 121 99 147 99 82 173 121 98 149 130 113 160 144 123 160 146 123 162 146 126 160 144 123 164 148 124 164 146 123 170 152 130 174 153 131 174 155 133 170 153 130 170 147 125 172 152 130 174 155 130 174 155 134 170 153 130 174 155 132 202 178 145 235 207 173 235 208 168 235 206 165 235 208 168 235 208 168 235 208 170 235 212 169 235 212 169 228 202 164 230 201 162 228 202 164 229 201 160 228 201 162 231 201 160 229 201 160 228 202 164 228 201 162 226 196 161 171 151 126 143 128 111 164 149 127 162 148 123 164 148 124 164 144 121 164 147 126 168 153 130 170 150 122 170 153 128 164 144 124 160 149 128 131 120 105 87 79 69 96 88 78 87 76 71 122 109 95 158 142 124 158 142 121 156 142 123 153 142 124 158 140 121 153 142 124 156 142 122 156 142 121 156 140 120 158 140 119 160 142 122 151 140 120 158 144 123 160 142 124 164 148 127 164 146 125 162 148 129 164 148 124 164 146 125 162 146 122 145 127 109 140 115 97 138 104 86 216 144 121 210 141 118 209 146 124 208 144 119 142 128 111 158 140 121 158 146 123 145 127 105 209 142 119 216 146 123 165 121 100 170 123 108 164 116 99 153 111 92 147 113 94 140 128 111 112 98 84 120 109 98 126 115 101 148 135 116 107 102 100 96 97 101 85 79 80 80 74 75 87 77 80 113 108 102 228 209 171 245 222 184 225 198 159 235 206 170 151 134 111 163 123 104 216 139 115 227 145 121 178 131 108 167 125 104 210 140 116 126 100 85 171 148 123 176 157 134 174 157 132 168 153 132 172 153 128 176 157 132 174 154 128 167 146 121 153 131 109 164 147 126 189 137 115 215 145 121 213 142 118 215 145 121 213 142 118 215 145 121 212 139 115 188 132 108 137 116 98 181 126 103 193 114 93 204 97 82 194 100 84 199 102 84 213 147 115 229 194 158 238 215 180 165 143 122 144 128 110 136 118 99 136 110 88 116 96 84 164 151 128 160 142 122 162 142 121 164 144 121 164 148 127 166 149 128 164 144 121 164 146 118 166 149 128 164 147 126 168 151 130 104 82 73 210 144 120 213 142 118 177 126 98 205 155 119 221 170 124 224 171 124 221 170 124 233 178 129 138 124 100 117 106 108 90 89 94 112 108 102 160 146 123 158 144 118 164 148 125 164 142 123 162 147 123 162 146 122 160 144 118 162 146 124 128 120 103 179 126 104 227 150 126 135 112 98 164 148 133 164 148 127 166 146 125 162 147 123 158 142 124 158 144 122 151 136 116 110 101 91 54 68 75 69 78 84 73 81 87 74 77 80 83 75 71 181 159 147 91 87 83 91 83 82 129 108 92 161 125 110 170 129 115 138 127 112 162 149 128 168 150 128 160 143 118 158 132 109 185 136 115 220 149 126 218 142 118 224 149 126 153 133 111 172 154 132 168 149 122 166 148 126 168 152 128 158 140 122 194 136 116 189 139 119 50 66 80 78 82 90 99 92 96 80 75 82 62 79 89 69 85 98 62 74 87 115 99 96 220 151 128 216 151 128 183 130 109 160 138 115 178 156 131 174 154 132 178 154 131 178 157 131 176 158 131 172 154 134 166 144 121 160 143 125 168 149 125 152 134 112 153 130 113 159 138 115 136 121 100 149 126 103 155 135 112 160 125 106 221 154 131 218 153 131 197 150 127 171 147 123 146 129 106 92 86 86 135 100 82 112 92 77 167 123 103 147 108 89 159 111 94 144 98 79 159 105 85 167 112 89 151 100 81 152 102 82 172 117 96 172 117 96 147 102 85 168 119 96 147 138 117 156 141 122 158 142 120 160 144 122 162 142 123 160 140 120 160 146 123 162 148 126 170 154 132 172 151 128 170 153 126 178 155 133 178 159 134 178 155 133 168 153 130 172 153 131 166 146 125 188 166 137 234 206 169 233 203 168 235 204 168 235 206 167 235 206 169 235 208 170 235 208 170 235 204 168 231 203 168 229 202 166 235 204 168 229 201 160 234 203 164 230 202 162 228 201 162 228 201 162 229 201 160 228 201 162 169 151 129 148 131 116 166 146 125 166 149 128 162 144 125 164 148 127 164 150 128 166 149 125 164 148 124 164 146 125 162 146 126 162 146 124 136 126 104 152 134 121 135 117 105 125 111 98 105 90 76 158 144 126 153 140 122 158 140 121 156 140 122 156 140 121 160 142 126 156 140 124 154 140 120 156 140 124 160 144 122 154 140 118 156 140 124 156 140 124 158 148 124 162 146 124 158 144 121 164 147 127 160 144 125 164 148 127 162 146 124 158 140 121 158 144 121 153 134 117 132 109 92 193 135 115 219 147 123 219 147 123 135 110 90 151 139 122 154 138 120 145 134 117 106 90 78 110 99 83 130 124 106 164 150 128 155 130 114 141 124 104 139 118 90 136 120 103 125 104 88 162 148 123 162 148 126 161 146 126 79 67 63 78 81 80 70 65 69 83 89 86 76 76 77 68 59 64 133 128 109 106 93 86 155 143 123 207 189 161 148 95 80 218 144 120 196 134 112 120 106 91 154 140 121 126 116 99 174 120 98 179 122 99 152 136 112 164 148 127 170 151 126 170 154 127 170 149 126 164 147 124 168 150 125 138 119 96 135 116 95 150 136 112 205 141 117 213 142 118 215 145 121 215 145 121 215 145 121 215 147 123 210 141 118 160 111 91 114 94 68 217 170 124 216 166 120 127 88 67 167 82 67 172 100 78 178 84 68 195 92 77 190 97 79 240 189 148 206 183 149 108 89 75 127 104 89 135 111 95 136 117 99 156 140 120 160 142 124 162 146 124 164 144 121 160 146 123 170 151 128 164 146 125 166 148 126 164 142 123 160 143 119 120 97 77 204 139 116 209 138 115 153 110 95 109 91 77 230 175 126 221 170 124 221 170 124 232 179 130 146 100 80 100 97 89 96 95 94 112 112 102 160 146 122 158 144 121 164 142 123 162 146 126 162 146 124 164 148 127 162 144 125 160 146 123 162 146 127 156 139 119 140 124 103 155 142 116 162 150 125 162 148 126 162 146 124 160 144 124 160 144 124 160 142 122 162 144 125 130 98 89 150 106 98 52 61 74 55 75 89 56 72 86 50 71 85 57 65 77 84 84 87 70 75 78 201 146 116 215 145 121 216 144 120 127 116 98 154 137 119 146 115 97 198 135 110 219 145 121 205 137 118 143 117 106 154 118 102 222 142 118 154 124 107 164 146 125 164 146 125 160 144 120 153 134 111 198 132 108 212 146 123 223 149 124 188 124 107 185 131 115 72 73 76 58 77 92 58 77 89 54 72 80 172 125 108 188 130 111 216 149 126 220 149 126 171 127 108 164 151 128 166 153 127 172 151 129 172 152 127 158 138 116 167 139 111 174 128 106 130 107 93 137 104 77 152 135 119 168 151 129 170 154 132 170 151 128 166 149 131 162 147 124 158 142 121 149 134 116 154 129 110 221 150 126 192 130 108 229 206 173 110 102 99 89 89 91 135 101 86 112 87 71 154 122 100 143 104 86 152 111 89 152 104 87 168 114 93 172 115 94 147 105 85 145 103 86 168 116 92 168 114 93 170 112 91 175 115 93 147 130 108 155 140 116 158 140 115 160 147 127 162 146 128 166 151 129 166 149 128 166 150 125 170 154 132 170 152 130 170 153 128 168 149 127 172 151 128 168 149 127 170 151 126 170 152 124 170 152 130 184 163 136 235 207 171 235 204 166 235 204 166 235 204 166 235 206 169 235 206 169 235 208 168 235 204 168 228 202 164 231 203 166 233 203 168 232 203 164 234 203 164 233 203 166 232 203 164 232 202 162 228 201 162 228 199 165 167 147 127 146 130 112 164 146 123 164 144 124 162 146 126 164 146 125 162 144 122 162 142 123 156 142 121 158 142 122 162 144 123 158 144 124 152 138 120 151 138 122 142 126 110 160 145 128 132 120 101 137 128 104 151 140 122 158 140 123 154 140 118 154 140 122 156 140 124 150 138 118 152 140 116 154 140 120 153 140 122 154 140 120 154 138 118 152 140 120 160 142 124 160 140 121 158 144 124 160 140 121 158 142 120 162 144 125 164 146 125 162 142 122 156 140 118 160 142 117 156 140 122 141 128 109 148 114 96 220 148 124 202 145 122 134 120 104 160 140 123 156 138 117 136 123 103 149 140 117 132 108 90 134 110 95 154 142 119 148 138 116 151 133 114 127 99 78 134 117 95 160 144 122 156 140 120 163 122 101 197 134 111 170 124 107 112 85 82 78 86 95 82 75 76 182 168 146 152 135 123 183 162 132 218 191 156 180 157 134 207 141 118 189 130 111 90 84 75 158 145 130 158 140 121 131 107 90 187 128 113 149 108 86 143 132 107 170 152 130 168 149 124 170 153 128 168 147 126 164 146 122 173 158 138 116 94 74 159 137 117 159 134 114 189 131 108 215 145 121 212 139 115 213 142 118 215 145 121 213 142 118 196 130 107 149 112 98 156 128 100 116 101 88 227 172 124 234 189 144 168 76 61 197 99 82 186 94 80 173 122 99 238 210 175 137 125 105 169 144 123 177 159 136 100 80 69 118 101 90 140 124 103 142 116 96 156 142 123 164 145 128 160 139 119 160 144 122 172 151 128 170 151 128 168 151 129 149 133 110 174 134 120 171 122 105 207 138 113 212 146 123 133 98 83 205 161 121 203 161 122 224 173 126 206 160 116 177 108 84 196 99 82 200 111 91 136 91 77 121 110 95 158 140 120 156 140 118 158 140 121 156 140 118 160 142 124 160 142 122 158 144 122 160 144 123 160 144 123 158 142 123 164 144 124 160 146 125 162 146 126 162 146 124 162 144 125 162 146 124 154 140 121 154 133 114 186 128 107 213 138 115 216 141 117 194 137 116 71 75 81 55 75 89 55 75 89 55 75 89 70 80 91 106 99 99 227 149 124 219 147 123 227 151 127 121 111 93 159 130 107 222 144 120 215 145 121 192 139 116 146 126 106 158 147 128 135 122 102 197 140 117 129 115 100 158 142 120 160 146 124 142 130 106 187 134 113 211 144 121 215 147 123 215 147 123 219 147 123 194 137 113 133 107 97 65 69 78 66 80 95 98 99 93 177 136 116 211 144 121 223 145 121 215 147 123 179 134 113 166 149 126 155 140 114 148 126 104 179 132 112 207 142 119 216 149 126 218 158 132 137 103 85 131 104 89 168 151 127 166 149 128 170 152 130 166 151 129 162 144 125 162 148 126 160 144 123 156 138 119 160 142 120 95 88 89 188 134 113 179 152 132 113 104 95 86 79 82 130 105 93 110 88 75 147 108 89 143 105 89 145 102 90 152 106 88 168 114 93 167 112 91 147 106 85 151 106 85 174 117 96 176 121 99 176 121 99 170 121 98 125 109 86 140 118 94 158 128 101 159 134 103 159 140 107 155 131 108 146 128 103 153 134 114 162 145 121 162 147 124 158 142 119 157 140 117 160 144 122 170 151 128 168 149 127 168 148 124 164 143 123 176 156 132 235 208 166 236 204 164 235 204 168 235 204 168 235 204 168 235 204 166 235 204 172 236 204 164 232 203 164 233 203 168 235 204 170 236 204 164 235 204 168 236 204 164 235 204 166 235 204 166 232 203 164 228 202 164 165 145 126 154 139 122 166 148 127 164 148 124 160 148 125 162 144 123 160 142 121 160 140 123 156 140 122 156 140 124 156 140 122 156 144 123 156 140 122 151 138 121 127 115 97 149 138 122 145 136 120 145 136 118 150 138 116 154 140 120 148 136 118 152 138 120 150 138 118 152 140 120 152 138 120 156 140 124 153 140 120 156 140 122 154 140 118 152 140 116 152 140 116 156 138 120 158 140 119 162 144 123 160 142 120 156 140 117 158 142 121 156 140 122 156 140 120 153 142 122 156 140 122 152 138 118 155 132 111 140 115 97 217 151 128 153 119 102 150 138 118 149 134 116 138 116 100 158 142 123 152 140 118 139 119 103 124 112 89 130 113 96 102 83 67 144 123 105 139 121 101 115 101 83 143 118 98 211 143 120 212 139 115 215 145 121 211 139 115 185 129 106 90 71 66 97 96 91 114 94 87 91 88 83 111 104 94 188 140 114 211 143 120 63 62 61 83 77 70 175 156 135 166 146 128 134 123 104 145 114 93 157 133 114 162 145 120 168 148 124 175 146 124 172 151 125 157 139 118 168 147 126 174 153 134 125 106 85 170 155 130 157 134 112 115 90 76 186 123 104 219 147 123 215 145 121 153 105 82 199 132 108 197 139 118 102 80 68 146 112 85 227 174 126 230 175 126 174 120 90 192 88 74 205 113 94 205 113 94 198 100 81 184 106 86 211 190 156 129 114 102 134 126 104 117 97 87 114 97 88 158 140 122 140 122 106 139 113 90 165 126 106 193 135 114 134 118 105 164 148 124 168 149 124 164 148 124 156 141 122 149 108 94 174 124 99 212 139 115 203 135 112 185 138 102 193 149 113 106 98 79 72 59 52 117 71 60 198 114 95 205 102 85 201 112 92 201 98 83 203 105 88 163 120 101 154 134 117 160 142 122 158 142 123 160 144 122 164 148 127 160 144 124 164 148 127 164 148 127 164 148 127 164 148 127 160 146 125 160 146 123 158 142 123 162 140 120 150 136 116 168 122 102 215 145 121 223 149 124 187 126 105 202 140 112 198 145 118 195 140 116 89 83 80 50 66 77 63 77 88 104 104 96 159 143 123 172 127 106 219 147 123 219 147 123 161 116 95 218 142 118 218 142 118 193 129 109 143 132 109 162 147 124 160 144 124 141 122 105 112 93 75 146 125 108 150 134 118 145 122 102 227 152 128 215 145 121 215 145 121 223 145 121 191 132 108 155 129 105 156 144 121 170 155 128 168 151 129 125 117 98 162 149 128 143 128 110 224 152 128 215 145 121 215 147 123 180 137 117 153 124 104 196 142 119 215 145 121 219 149 126 183 134 112 147 126 104 113 90 73 145 105 91 149 126 107 172 154 134 166 150 130 164 148 127 166 149 128 162 144 125 156 140 118 158 140 121 156 138 120 153 142 122 96 81 75 62 79 92 99 96 93 94 89 90 74 73 75 135 105 89 115 88 72 151 118 94 152 114 90 147 105 88 152 106 91 163 107 88 169 111 90 147 99 81 163 116 95 174 117 96 181 123 101 181 123 101 173 126 102 158 145 125 154 138 120 152 136 113 157 136 114 164 145 124 148 132 108 143 124 102 134 120 97 134 116 97 146 130 105 145 123 104 144 119 97 128 108 88 128 109 87 140 114 90 144 119 97 147 122 101 171 154 121 235 206 167 236 204 164 236 204 164 235 204 168 235 204 168 232 203 164 235 204 166 236 204 164 231 203 168 235 206 171 235 204 172 235 204 168 235 204 166 233 203 166 235 204 172 236 204 164 234 203 164 231 203 168 160 145 123 156 139 122 166 148 126 164 148 127 164 148 121 160 144 123 162 140 122 158 140 123 158 140 121 156 140 124 156 140 120 152 136 120 156 142 121 132 118 106 107 98 86 115 104 92 135 122 106 156 140 122 150 136 120 153 140 122 152 138 118 154 138 122 150 136 120 156 140 122 154 138 122 150 138 120 148 136 118 152 140 118 154 140 120 154 140 120 156 140 122 156 140 118 156 140 118 158 142 122 154 140 120 156 140 124 154 140 120 156 142 122 154 140 116 152 138 120 152 138 120 148 136 118 154 136 117 113 98 85 145 107 93 193 132 110 124 116 104 150 134 115 114 102 79 153 138 121 156 140 118 158 140 119 158 142 118 149 136 115 160 146 121 154 138 119 156 138 121 139 119 99 208 139 117 215 145 121 200 133 110 223 149 124 178 128 108 138 116 98 164 146 125 144 124 103 216 141 117 223 147 123 222 147 123 216 146 123 91 75 68 94 74 71 56 52 64 55 52 58 159 140 120 170 149 127 164 144 124 166 148 123 162 126 107 195 139 116 204 139 112 230 155 130 87 75 66 149 131 112 179 159 143 150 121 96 145 122 105 170 153 127 109 87 72 92 78 69 207 148 121 197 137 115 133 101 84 219 147 123 195 139 119 107 83 65 227 174 126 211 156 119 178 101 82 195 100 84 203 103 86 191 91 75 201 96 82 196 93 78 190 85 73 162 110 92 143 135 118 152 137 120 114 93 81 118 98 90 146 128 114 154 139 122 139 114 97 220 151 128 218 142 118 190 127 108 162 143 121 156 142 118 158 144 121 156 120 99 106 82 66 217 146 123 197 134 110 199 136 112 190 140 109 177 124 100 213 191 162 208 162 126 217 178 146 215 160 132 194 88 73 204 121 102 192 92 76 201 109 89 196 99 82 179 131 104 151 139 123 160 148 125 164 148 127 162 146 124 164 144 124 162 146 124 164 146 125 162 148 123 164 146 123 162 148 126 164 146 125 160 144 123 154 138 120 144 128 106 192 130 107 213 142 118 167 116 95 173 132 97 224 171 124 224 171 124 227 172 124 232 172 128 201 153 115 119 101 95 149 135 119 149 136 120 141 127 112 189 136 115 215 147 123 219 145 121 219 147 123 173 131 114 141 136 115 158 142 121 158 140 117 156 140 122 117 102 85 162 144 123 160 142 124 148 131 115 148 111 97 223 149 124 208 141 117 181 129 112 141 128 108 164 142 122 166 149 128 168 145 125 168 149 130 160 146 125 168 151 129 166 148 126 152 140 118 179 139 117 215 147 123 215 147 123 194 131 106 210 139 116 220 149 126 220 151 128 152 126 105 162 147 127 160 143 120 113 92 76 178 129 109 139 122 99 174 155 130 174 151 128 170 151 128 168 149 127 160 143 126 154 140 122 160 140 121 132 126 107 166 124 107 235 160 135 65 53 54 60 64 68 141 131 125 64 70 73 147 112 92 110 88 78 144 107 97 152 111 89 147 108 89 152 106 91 159 113 93 167 113 94 151 102 85 169 116 95 173 117 96 172 117 96 179 123 101 176 120 105 132 115 99 158 142 116 156 140 118 158 142 123 166 148 126 168 150 125 172 150 124 172 153 126 168 151 126 168 151 129 166 146 122 164 148 127 168 148 123 158 144 122 152 140 119 150 132 112 149 130 112 172 151 125 233 203 168 236 204 164 236 204 164 235 204 166 229 202 166 230 202 164 232 203 164 229 202 166 235 204 172 235 204 170 235 204 170 235 204 166 233 203 166 235 206 169 235 204 168 236 204 164 232 203 164 231 203 168 160 139 121 156 140 120 166 148 126 164 148 127 162 142 123 160 142 122 158 144 117 156 140 124 158 140 123 156 140 122 156 140 124 154 139 124 137 122 103 120 108 96 141 127 116 106 94 86 144 128 111 148 134 116 146 132 116 148 134 116 148 134 118 150 136 120 156 140 124 156 140 124 150 138 118 152 136 118 152 138 120 152 140 118 150 138 118 154 140 118 150 138 116 148 136 116 156 142 122 154 140 119 158 142 119 158 142 121 156 140 124 152 138 120 152 136 118 147 136 118 152 140 120 142 127 115 105 93 81 202 146 127 139 101 85 160 112 95 103 78 72 161 148 132 116 104 87 140 123 111 154 138 118 158 140 119 158 142 121 154 140 120 150 134 116 152 136 118 134 124 101 200 138 116 212 139 115 204 139 116 195 135 110 147 113 97 151 133 113 162 146 124 158 140 121 152 136 117 192 134 114 211 136 112 226 144 120 148 121 98 152 140 120 61 55 50 52 52 60 54 59 71 132 117 98 168 145 125 160 146 125 155 137 116 205 142 119 205 145 123 224 147 123 111 87 75 48 40 44 62 57 49 107 98 83 184 143 113 156 107 89 146 116 100 154 139 118 112 92 78 135 104 85 192 130 111 147 109 92 176 124 106 123 93 80 217 161 120 183 122 94 193 114 94 207 117 93 198 88 72 202 103 86 206 99 82 210 124 105 201 109 89 182 79 65 205 99 83 141 110 91 140 132 113 111 95 83 129 107 100 114 96 85 144 129 116 156 138 117 158 126 108 184 134 113 196 137 112 209 146 123 203 142 121 208 142 119 198 132 108 198 132 110 200 136 112 184 115 93 201 137 115 201 138 114 196 131 109 176 121 101 212 181 149 231 201 158 216 144 121 206 138 113 203 117 97 204 110 91 191 98 81 197 100 83 202 112 91 169 131 107 148 134 114 156 140 117 156 138 119 156 140 118 154 140 118 158 140 122 158 140 121 156 140 120 154 140 118 158 140 119 158 142 121 158 140 121 156 140 124 128 106 92 222 143 121 192 134 113 184 147 109 219 169 124 219 169 124 224 173 126 230 177 129 198 163 119 167 141 108 129 122 106 152 138 120 156 138 119 128 110 86 211 143 120 219 147 123 150 119 99 143 137 121 164 147 126 158 140 118 160 142 122 158 140 123 158 142 122 158 142 122 154 138 117 130 118 95 153 124 100 172 123 103 219 147 123 142 111 96 159 143 126 165 144 129 164 144 124 162 142 119 162 144 123 162 146 124 156 142 119 158 138 119 156 142 121 118 104 91 224 149 126 215 147 123 215 147 123 216 149 126 219 149 126 150 129 105 166 148 126 166 148 123 168 150 126 153 118 102 122 103 87 165 149 126 174 155 128 172 150 124 170 151 128 164 145 126 158 140 119 139 128 111 159 125 107 198 135 115 216 144 121 215 147 123 217 161 138 63 67 76 79 74 79 171 155 135 135 104 87 121 97 80 144 110 100 147 111 89 147 105 88 147 105 88 156 111 90 165 110 90 155 105 83 156 108 89 175 119 98 173 120 95 188 127 103 175 126 105 147 116 99 162 148 126 156 140 117 158 144 121 168 153 128 168 148 125 172 152 127 174 155 132 170 153 126 172 153 132 172 153 132 168 150 125 172 153 131 170 152 132 168 155 128 162 146 127 159 144 118 176 158 129 235 208 166 234 203 164 236 204 164 233 203 168 230 202 162 228 201 162 230 202 164 230 202 164 235 204 172 235 206 169 235 204 172 235 206 167 233 203 166 236 204 164 235 206 167 234 203 164 235 204 168 230 202 164 159 140 124 155 141 123 164 146 125 164 148 127 164 146 125 160 140 121 156 140 120 156 140 122 156 140 122 154 140 120 152 138 120 129 114 99 135 119 102 107 97 87 84 73 65 95 86 74 146 134 116 148 132 116 146 134 116 148 134 116 146 134 116 145 130 116 148 132 116 148 134 116 146 136 116 148 132 116 148 134 116 145 132 113 148 132 116 148 136 116 148 138 116 150 138 118 148 138 116 152 140 118 156 140 119 152 140 118 150 140 118 154 138 120 150 134 118 147 136 115 148 132 116 117 109 94 83 72 62 149 107 93 164 120 104 118 96 82 127 97 81 117 101 90 131 116 99 119 106 93 156 142 122 156 142 119 158 144 122 156 140 118 156 138 122 156 142 117 132 120 97 186 134 114 216 144 121 168 111 90 166 118 98 145 128 108 160 140 125 164 145 126 162 146 124 160 146 125 157 125 106 175 135 111 149 124 105 158 138 118 166 148 123 124 108 96 58 67 80 62 66 71 125 106 95 166 149 128 168 151 129 157 130 107 216 146 123 215 145 121 232 153 129 98 83 77 71 65 75 47 51 58 157 132 115 151 91 72 213 120 95 178 92 81 153 93 76 161 134 118 154 133 112 146 124 104 127 110 91 188 144 105 169 109 87 208 144 109 219 150 124 198 124 101 175 99 77 186 94 76 204 107 89 199 93 77 198 88 72 212 127 101 224 136 104 227 152 117 241 193 162 118 106 89 109 94 84 133 107 97 114 90 82 126 116 101 158 140 121 158 140 121 154 138 120 139 119 103 162 124 97 152 115 95 200 142 122 203 139 118 223 147 123 220 151 128 215 147 123 215 147 123 215 145 121 215 145 121 220 147 123 176 137 115 235 185 151 196 94 79 223 175 141 202 103 86 199 115 90 198 99 82 194 92 78 195 92 80 194 99 85 152 130 112 148 136 113 152 136 113 158 140 119 160 144 122 160 142 120 162 144 123 162 144 125 160 142 122 156 140 118 158 140 121 160 142 122 156 138 120 162 140 121 122 109 93 140 104 86 207 158 114 224 171 124 208 156 116 124 112 96 71 85 95 56 53 65 58 71 83 129 115 100 153 141 126 153 142 122 160 144 120 143 118 104 148 117 102 148 134 110 156 142 119 166 146 125 156 142 119 156 140 119 158 144 120 162 142 121 120 107 87 151 127 108 133 109 86 99 95 85 65 83 98 58 72 84 106 84 82 146 120 101 162 146 124 164 146 123 164 140 122 160 142 120 158 140 121 160 142 120 158 140 121 158 144 122 153 140 121 190 136 114 216 149 126 212 148 126 190 135 113 151 128 103 164 149 124 170 149 126 168 146 126 161 147 124 151 129 109 166 147 123 170 151 130 172 154 132 174 153 130 168 149 127 164 146 125 154 138 118 180 135 112 212 146 123 203 137 115 215 147 123 215 145 121 204 139 117 153 121 107 96 94 90 82 82 75 135 98 83 120 96 81 146 116 99 152 117 91 152 106 88 152 110 94 160 113 92 173 117 95 160 113 92 155 103 83 168 112 91 175 119 98 185 125 101 177 125 100 143 122 103 140 111 94 154 138 121 158 144 117 164 148 127 164 146 125 166 148 126 168 151 127 170 151 128 168 149 127 168 149 128 166 148 126 166 148 126 170 151 128 166 149 128 160 148 125 160 143 122 184 163 134 230 202 164 232 203 164 228 202 164 234 203 164 234 203 164 230 202 164 228 202 164 230 202 164 235 204 172 237 203 169 233 203 168 236 204 164 232 203 164 234 203 164 234 203 164 234 203 164 232 203 164 232 202 166 152 137 117 157 142 124 160 142 122 164 148 127 164 149 127 160 146 125 162 146 123 158 140 124 158 140 121 156 140 120 148 136 116 148 134 116 152 138 120 95 83 75 74 68 62 151 140 126 146 134 116 146 134 116 146 134 116 144 132 114 148 136 113 147 138 118 150 138 120 154 140 122 156 140 120 150 138 116 152 138 120 148 134 118 145 134 113 148 136 118 150 136 118 154 138 118 156 142 121 158 140 123 156 142 121 152 140 120 156 142 120 156 140 122 150 138 118 156 140 120 156 140 119 149 133 113 100 85 69 124 93 80 138 104 86 113 96 77 131 103 85 136 119 105 152 138 120 109 97 79 160 144 123 160 146 125 160 148 125 162 144 126 160 143 124 158 142 122 162 148 125 126 106 88 212 149 122 216 149 126 223 150 126 125 113 97 166 145 128 162 144 125 164 144 121 164 146 128 162 144 125 162 144 122 166 145 125 164 146 125 164 144 122 170 152 135 81 80 80 56 55 61 130 118 102 164 148 127 164 146 128 135 120 99 227 151 127 216 149 126 208 142 119 100 76 64 59 60 61 88 70 68 147 76 61 219 136 109 203 120 97 190 83 70 195 91 76 129 85 66 174 149 130 138 115 95 205 159 121 185 144 107 236 195 154 226 198 159 208 141 115 225 164 123 227 132 111 202 141 109 192 122 101 195 88 75 207 106 89 211 127 105 233 176 126 210 135 108 217 171 142 95 87 84 111 96 84 122 105 94 102 83 72 137 129 111 127 116 104 157 145 126 156 141 124 160 142 122 153 129 112 152 128 108 151 127 105 146 128 109 148 125 105 153 117 102 164 115 98 188 128 110 188 126 107 183 128 110 202 136 113 162 139 113 226 156 129 213 153 126 228 170 137 192 89 75 215 166 137 207 86 75 209 129 100 194 99 82 214 146 117 208 118 100 131 122 109 148 136 116 154 140 118 156 140 120 156 140 118 156 138 122 156 142 122 156 140 118 160 144 122 154 138 116 156 140 118 154 140 116 156 140 116 150 113 96 161 125 102 210 159 115 170 134 110 194 133 106 108 85 81 71 76 76 58 60 58 117 91 77 141 122 110 150 138 115 154 142 117 156 140 122 158 140 123 160 141 125 154 138 118 152 140 116 156 140 118 158 140 117 158 142 121 156 140 116 154 140 118 143 132 109 134 118 93 163 110 86 193 141 102 61 73 80 52 69 83 63 78 93 82 91 92 100 94 83 145 133 117 156 146 121 160 146 122 151 138 118 149 135 118 158 147 129 160 142 122 162 148 126 154 124 103 219 155 131 224 159 135 141 122 100 168 151 129 166 148 126 168 146 124 164 146 125 164 148 127 166 149 126 168 151 129 164 148 127 170 151 128 164 148 127 164 148 127 162 144 125 157 142 120 156 119 99 212 148 126 208 141 117 164 122 105 148 125 109 115 106 94 121 111 98 152 140 116 127 116 102 123 96 80 115 93 81 150 116 101 152 114 90 152 106 88 156 108 89 166 121 99 164 115 93 167 113 93 159 110 86 178 119 97 164 111 91 181 128 101 175 127 109 224 149 126 164 124 106 158 146 124 158 142 124 164 148 127 164 148 127 168 151 129 172 152 130 170 151 128 168 151 129 168 151 129 166 149 128 172 152 130 176 159 136 168 151 131 162 142 123 156 140 120 184 159 133 232 204 163 229 200 158 232 203 164 228 202 164 230 202 164 228 202 164 228 202 164 228 202 164 235 204 168 233 203 170 235 204 168 234 203 164 234 203 164 232 203 164 234 203 164 234 203 164 232 203 164 233 203 166 150 137 126 164 152 129 160 146 123 164 148 127 162 148 126 164 150 126 164 148 124 160 147 127 156 143 126 156 142 123 156 140 124 152 138 120 152 138 120 135 123 114 71 68 60 146 132 122 147 136 118 148 140 116 148 136 116 148 132 116 148 134 116 146 134 116 154 138 120 154 140 122 150 134 118 148 134 116 146 132 116 148 136 116 150 134 118 148 134 116 152 136 120 150 140 118 152 140 118 154 140 121 154 140 120 158 142 122 156 140 122 154 140 120 156 142 121 152 140 120 158 144 124 160 142 124 164 146 125 152 130 114 156 139 121 168 150 132 160 138 120 154 138 120 154 140 120 140 126 109 127 114 95 168 151 131 162 148 126 164 148 127 164 148 125 164 146 125 160 144 121 158 144 119 137 109 93 223 149 124 215 147 123 180 126 105 145 134 111 158 144 121 160 144 122 156 142 123 158 144 124 162 147 126 162 146 124 164 146 125 162 146 124 155 144 124 135 123 110 84 79 73 171 162 142 164 148 127 168 149 127 164 146 118 148 118 100 172 131 109 192 130 108 65 58 54 132 74 63 207 117 96 202 121 98 199 97 82 200 108 90 216 146 115 168 126 103 123 94 78 168 148 125 148 122 100 159 126 95 190 163 134 229 199 161 215 143 112 227 180 134 222 161 133 206 110 89 233 189 153 206 134 109 181 119 97 213 140 118 201 109 89 237 186 143 227 194 159 215 140 115 103 98 92 94 83 81 110 94 85 122 103 90 92 76 74 63 73 75 103 100 97 158 143 122 151 138 120 156 140 117 154 142 115 151 134 113 161 131 100 144 119 97 165 123 103 162 124 105 144 128 112 126 116 102 192 172 150 229 198 161 220 191 154 215 185 151 230 185 150 228 186 151 203 127 106 234 202 163 207 128 102 217 162 128 184 82 66 214 169 142 192 104 84 168 104 87 143 132 112 152 140 113 155 136 117 154 140 120 150 134 116 158 144 122 164 148 127 168 152 130 164 147 127 164 148 127 162 144 125 163 140 127 140 117 103 170 126 93 150 109 86 167 114 96 76 64 59 112 86 81 69 64 54 62 62 55 107 93 76 142 102 87 143 72 64 151 91 76 141 121 98 145 130 107 156 140 123 154 138 119 158 140 117 156 140 120 160 144 123 158 142 121 158 140 119 154 140 120 156 143 122 177 118 103 220 155 131 165 127 100 234 184 143 109 88 71 54 47 45 60 58 63 108 90 78 154 118 98 158 114 93 150 93 78 155 105 86 170 95 85 154 104 86 158 146 122 164 144 122 160 144 123 160 133 114 145 119 98 163 147 123 170 151 128 168 151 129 168 149 128 168 149 123 168 151 126 162 144 123 164 148 125 172 151 128 170 152 130 166 148 126 166 148 126 162 146 124 160 140 121 142 132 109 197 141 118 219 149 126 177 121 100 132 112 95 129 113 90 160 129 99 122 108 91 117 101 87 131 104 85 114 88 73 129 101 89 167 118 97 152 108 88 156 111 93 160 109 92 163 111 88 164 114 92 172 117 96 172 116 94 151 109 92 193 128 104 182 135 115 217 146 123 150 122 101 158 142 124 156 140 119 159 146 122 164 144 124 168 149 124 174 154 132 172 159 134 180 160 137 169 155 126 166 148 126 164 148 125 160 142 120 164 144 124 156 140 120 152 138 116 184 161 135 232 202 164 229 200 158 230 202 164 228 202 164 228 202 164 228 202 164 228 201 162 228 201 162 228 202 164 228 202 164 236 204 164 228 202 164 232 203 164 232 203 164 232 203 164 232 203 164 228 201 162 228 202 164 156 138 124 158 143 125 162 146 124 164 147 126 160 144 123 160 144 121 162 142 121 156 140 118 156 140 120 156 140 118 152 140 118 150 138 116 150 136 118 137 130 111 70 64 57 102 90 78 148 132 116 148 134 116 145 134 113 147 134 118 147 136 118 148 134 116 148 134 118 150 134 118 148 136 116 146 134 116 143 134 113 148 132 116 146 132 116 148 132 116 147 136 120 145 134 118 150 138 118 156 140 124 154 138 122 156 144 122 154 140 120 158 144 124 156 140 118 152 140 120 153 144 123 158 142 124 156 142 123 158 142 122 160 142 122 162 142 123 162 142 123 158 142 123 156 140 124 162 142 123 110 99 77 140 128 108 156 140 124 162 144 123 160 144 121 158 142 121 156 144 123 153 142 122 139 128 107 184 133 112 212 139 115 219 140 115 137 126 102 160 143 127 156 140 124 156 144 122 160 146 125 160 140 123 164 144 124 164 148 127 162 144 125 162 144 123 122 112 92 154 118 102 130 101 85 170 153 127 168 148 125 166 149 128 168 152 125 164 149 130 109 94 86 162 116 96 167 99 79 150 69 55 185 96 79 196 91 75 204 108 91 193 84 71 226 164 127 147 103 89 151 137 125 138 119 93 224 192 152 104 95 80 245 203 159 197 173 141 238 206 173 216 145 122 176 136 110 188 157 128 213 158 132 219 172 139 188 152 124 214 126 106 227 193 155 228 184 155 233 203 170 185 170 147 102 93 90 142 127 114 110 97 87 89 79 81 67 83 92 65 66 67 163 152 133 150 134 118 152 140 116 156 136 120 154 138 118 135 119 99 159 125 102 153 108 89 192 136 110 196 134 112 145 127 106 137 119 101 234 217 182 229 205 169 195 170 137 211 170 134 231 204 166 215 162 134 229 204 166 194 107 86 225 166 139 164 112 90 189 117 97 217 182 150 200 90 77 141 104 88 145 131 118 149 132 111 138 122 105 147 129 108 137 122 102 156 140 115 160 146 123 158 142 122 156 140 118 158 140 119 154 138 115 135 115 93 170 128 100 171 121 99 150 109 89 56 47 42 91 81 71 99 83 73 152 81 68 167 89 70 174 92 76 198 148 116 215 143 112 212 122 101 176 124 104 132 122 104 154 136 118 158 142 120 158 140 121 160 142 122 158 144 122 156 142 121 158 140 121 139 127 115 170 124 103 208 142 119 227 147 123 83 62 54 79 68 57 220 181 131 129 97 74 149 91 77 177 83 67 206 101 84 208 112 93 210 120 100 209 123 102 224 145 120 159 100 81 156 135 122 160 144 121 164 146 125 162 148 123 166 151 126 168 149 127 172 152 131 172 153 131 172 153 131 170 153 128 166 148 123 170 155 130 174 153 130 170 152 130 170 152 130 166 151 129 168 151 129 164 148 127 162 145 127 156 127 106 158 114 91 150 124 90 171 124 99 178 130 109 184 141 106 101 91 88 84 78 76 127 99 80 107 88 73 135 103 86 160 113 92 151 109 88 156 114 94 151 102 79 168 112 91 163 112 90 175 118 95 174 117 96 174 122 102 191 130 107 180 139 119 190 134 111 134 128 111 154 138 119 156 142 119 158 144 117 160 144 124 166 147 124 172 152 130 168 151 129 176 153 131 170 154 130 170 151 128 168 149 127 164 148 127 162 146 124 156 140 115 152 136 120 184 163 137 232 202 166 230 202 162 234 203 164 228 202 164 230 202 164 228 202 164 230 202 162 231 203 166 228 202 164 228 202 164 231 203 166 230 202 164 228 202 164 230 202 164 228 201 162 228 202 164 229 201 160 228 202 164 161 144 126 160 144 125 160 144 124 160 144 124 164 146 125 160 142 122 162 144 125 158 144 124 160 142 120 162 146 124 156 140 122 156 142 121 156 140 124 144 130 111 112 104 83 126 113 100 158 143 127 152 138 120 150 138 118 148 134 116 148 138 116 148 134 116 148 134 116 154 140 120 148 136 116 148 134 116 148 138 116 145 136 118 148 132 116 148 132 116 145 130 114 144 134 116 146 136 118 150 134 116 151 140 120 150 136 116 152 140 116 152 140 116 154 140 118 154 140 120 150 140 116 152 136 120 152 140 118 156 140 120 156 140 120 156 140 120 158 140 123 156 140 124 160 144 125 158 142 119 141 128 110 109 93 75 152 136 122 160 144 125 158 142 124 158 142 124 156 140 122 156 140 122 155 142 125 123 105 87 214 141 118 212 139 115 148 112 93 162 144 125 158 142 124 160 144 123 156 142 123 164 148 127 164 144 122 168 147 126 162 146 124 164 146 125 161 137 117 184 133 110 184 137 117 141 120 101 164 148 127 168 151 129 170 151 128 135 120 98 139 115 90 195 146 122 208 158 130 206 126 105 187 106 86 195 107 84 201 99 83 195 101 84 199 111 91 186 105 90 130 88 77 151 130 113 124 112 93 130 115 103 172 152 130 195 167 137 207 184 153 203 136 113 208 151 126 214 144 120 192 160 132 208 184 147 145 132 111 198 168 139 237 197 167 136 124 101 178 159 138 185 165 142 102 99 94 89 80 79 151 138 118 83 82 78 79 87 92 64 66 76 92 86 79 158 140 120 160 140 124 158 144 124 156 138 120 151 136 118 152 117 98 171 125 107 193 136 114 199 139 115 161 120 92 143 102 83 148 121 102 207 183 149 225 195 159 193 164 130 199 177 144 218 186 150 224 198 166 163 102 84 227 165 137 124 104 97 200 108 92 230 199 165 224 184 149 158 98 79 132 113 89 161 135 109 172 126 103 217 147 124 213 144 122 137 117 102 166 132 110 157 129 105 163 130 106 151 125 102 163 138 117 145 129 110 89 88 75 185 160 132 196 175 141 201 139 114 156 79 65 167 108 86 142 83 68 181 97 79 187 87 72 190 107 88 217 143 114 200 104 86 206 117 96 152 113 93 146 136 111 146 134 116 156 140 120 156 140 124 160 140 123 160 140 123 154 138 113 133 102 89 213 145 122 215 145 121 215 145 121 143 103 86 173 124 104 108 83 73 77 74 59 102 83 68 196 90 76 201 100 84 194 97 80 209 109 91 188 77 64 191 91 75 198 92 77 178 128 101 150 136 115 168 148 122 166 148 123 164 148 127 166 149 128 168 151 129 166 149 128 164 148 124 166 149 128 168 151 129 166 149 128 166 149 128 170 151 128 164 150 126 162 146 126 160 146 123 156 142 119 156 143 126 148 136 121 119 106 87 186 131 106 223 154 129 219 149 126 190 133 109 144 116 97 65 68 71 130 101 90 96 83 69 165 121 103 156 116 92 152 108 88 168 112 91 160 109 89 162 108 88 167 108 88 169 116 95 168 112 91 167 118 97 188 131 107 169 134 115 137 126 109 160 146 124 154 138 122 152 136 120 150 136 118 162 142 121 162 146 122 166 149 128 170 153 132 174 155 134 172 152 130 162 146 124 162 145 122 156 140 120 148 134 118 150 136 120 146 132 116 183 159 131 232 203 164 232 203 164 232 203 164 228 202 164 230 202 164 228 202 164 228 202 164 233 203 166 228 202 164 230 202 164 228 202 164 228 201 162 228 202 164 230 202 162 232 203 164 229 201 160 228 201 162 231 203 168 164 148 130 158 140 121 164 146 125 166 149 128 164 148 127 162 144 123 164 142 123 162 144 123 156 140 120 160 142 120 156 140 120 154 140 120 156 140 120 143 130 116 100 94 83 128 114 101 149 138 118 150 136 116 148 134 116 150 136 118 148 134 116 148 132 116 148 132 116 152 136 118 146 134 116 148 132 118 147 136 118 148 132 116 147 136 118 148 132 116 144 134 116 146 134 116 146 132 116 150 138 118 150 138 118 148 134 120 152 140 118 152 140 120 154 140 118 154 138 120 151 140 118 148 136 116 152 140 120 157 142 122 156 140 120 156 140 122 160 142 122 156 140 120 160 144 123 156 140 119 151 142 122 122 114 96 105 100 79 155 138 120 151 134 116 156 140 120 154 138 120 152 136 118 154 141 120 149 134 115 147 117 98 219 145 121 154 111 94 158 140 115 148 134 116 156 144 123 153 140 120 158 144 120 158 140 117 166 146 119 164 146 125 162 146 124 144 124 103 200 142 120 176 125 107 177 140 119 181 143 119 180 142 123 167 129 109 159 118 96 217 142 119 226 146 121 149 136 113 230 172 129 226 157 122 217 140 118 218 154 127 225 177 141 170 104 87 138 130 124 221 179 145 129 117 98 158 140 121 156 140 122 142 130 109 120 103 90 189 166 133 208 162 136 211 154 131 216 149 126 196 136 115 208 182 156 213 187 149 222 192 158 189 166 136 236 202 161 177 158 136 99 94 90 116 113 106 79 74 73 130 120 105 145 135 122 65 65 67 65 66 68 130 122 105 154 138 120 152 136 118 154 136 120 150 136 116 156 140 121 152 135 114 144 124 99 152 127 109 149 130 109 151 131 112 152 136 115 147 132 104 154 131 103 134 111 87 176 159 135 224 200 167 203 182 145 195 162 134 165 146 126 184 168 141 63 58 61 219 173 145 235 209 175 154 137 117 85 75 71 164 128 106 118 107 90 172 123 104 204 138 114 198 131 106 178 129 105 202 143 125 219 145 121 215 147 123 211 144 121 215 145 121 203 138 114 198 133 109 195 132 109 164 116 100 235 196 159 223 186 151 229 174 136 221 139 112 191 83 69 218 139 106 204 111 92 193 85 69 199 93 77 208 117 97 202 116 96 132 119 101 152 136 118 156 140 124 158 140 121 162 144 123 158 140 117 154 136 117 146 134 114 159 124 106 203 141 118 219 147 123 196 142 117 160 120 99 217 146 123 215 145 120 123 73 60 204 113 94 204 110 91 203 116 96 194 90 75 220 164 130 217 142 114 173 112 90 148 108 88 170 141 124 153 132 109 154 140 116 158 144 120 162 144 120 164 146 125 164 148 127 166 147 124 164 148 127 164 144 121 164 146 125 164 148 124 164 146 125 162 144 123 162 148 126 162 147 126 158 142 120 154 140 118 155 144 124 103 86 72 184 130 107 216 149 126 204 143 121 217 153 131 191 125 104 132 111 90 134 109 97 92 75 64 168 126 107 160 116 93 152 112 92 168 114 93 168 112 91 168 114 93 170 111 91 175 118 95 169 116 95 173 121 98 181 123 101 165 126 104 152 142 117 152 140 120 154 142 119 154 140 118 154 140 120 160 142 121 158 140 119 160 144 122 164 148 121 164 142 123 156 136 116 158 142 119 152 138 116 154 140 116 151 132 113 146 132 118 142 128 109 172 151 127 232 202 166 230 202 164 228 202 164 232 203 164 228 202 164 230 202 164 233 203 166 235 204 168 228 202 164 228 201 162 228 202 164 232 203 164 230 202 164 228 201 162 228 201 162 229 201 160 230 202 162 231 203 166 165 146 124 153 140 123 156 140 122 154 140 122 158 144 124 156 142 123 153 142 122 154 140 120 151 140 122 152 138 118 150 138 118 145 134 118 146 134 116 141 128 114 104 100 91 130 121 114 146 132 120 146 132 116 143 132 113 145 134 113 144 132 116 144 132 118 142 132 116 142 132 116 141 130 116 146 132 116 141 130 116 144 132 116 144 132 116 144 132 116 141 130 116 143 132 113 143 130 116 146 132 116 148 132 118 150 134 122 148 134 116 148 134 116 146 134 120 148 134 116 148 132 116 145 134 113 148 136 116 149 128 116 148 132 116 143 132 113 148 134 116 148 134 118 150 134 118 150 136 117 152 136 120 158 140 121 120 105 87 115 104 83 152 137 124 150 140 118 152 138 120 148 134 116 148 136 118 152 136 120 132 118 105 198 136 114 175 125 106 143 134 111 150 136 116 154 140 120 156 140 121 154 138 118 154 140 117 156 140 117 156 140 122 156 138 115 156 140 120 145 128 108 135 111 91 143 116 96 172 133 113 179 128 111 218 144 120 188 128 106 157 120 104 126 100 79 211 187 155 201 164 139 234 205 164 224 171 138 200 152 125 229 202 162 224 183 142 90 87 87 146 136 123 213 193 157 119 109 97 148 134 116 145 136 116 135 121 103 116 96 82 154 138 115 165 127 104 219 145 121 219 145 121 172 120 96 241 214 179 234 203 164 221 202 168 201 175 144 233 204 161 227 204 166 158 141 130 91 85 78 112 105 96 131 120 109 151 141 119 107 102 89 150 134 120 148 132 120 150 136 116 152 138 120 150 136 116 150 136 116 154 138 118 150 140 118 148 140 116 154 140 116 153 136 115 154 138 115 148 132 107 148 136 116 141 132 113 131 104 93 183 126 103 189 130 110 198 139 117 161 146 127 198 176 153 63 67 75 240 213 179 221 200 168 107 105 94 195 175 146 230 206 169 106 98 92 125 114 100 126 121 101 128 118 103 146 114 96 130 114 89 138 115 98 166 126 105 192 135 113 223 147 123 215 147 123 193 133 110 187 131 110 200 136 112 235 206 167 228 198 157 215 157 124 206 117 100 226 159 122 216 142 114 201 103 87 206 115 95 207 104 86 202 112 91 204 110 91 135 96 81 149 136 120 150 134 116 154 138 120 156 140 120 152 136 118 152 140 116 158 138 117 147 132 111 119 108 95 166 120 102 215 147 123 215 147 123 215 145 121 168 117 94 188 119 93 153 95 80 196 99 84 170 113 89 226 137 115 172 92 74 184 140 106 213 155 130 226 150 126 175 135 113 137 118 98 158 142 120 154 140 116 156 140 118 156 142 116 154 138 116 154 138 116 158 142 120 156 142 121 156 138 116 158 140 117 160 140 121 162 144 123 158 142 120 156 140 118 154 138 116 147 134 113 140 120 108 161 129 108 211 150 126 202 140 116 201 135 114 212 148 126 137 103 92 72 64 53 115 97 81 100 77 66 163 124 102 152 106 88 152 106 91 163 109 89 160 109 89 182 120 98 176 119 97 175 118 95 182 120 96 172 117 96 185 123 100 161 118 102 148 136 118 145 132 113 145 134 113 152 137 120 150 138 116 154 138 118 154 140 118 156 140 117 160 142 124 162 146 121 162 144 123 160 146 123 162 142 123 152 138 116 156 140 120 150 136 115 140 126 108 171 149 123 234 203 164 229 201 160 232 203 164 232 203 164 232 202 162 233 203 166 235 204 168 235 204 168 228 202 164 228 201 162 230 202 164 231 203 168 228 202 164 230 202 164 228 201 162 230 200 156 228 201 162 229 201 160 164 144 123 150 136 116 152 140 120 156 140 120 152 138 120 154 140 116 153 142 120 151 140 120 152 136 118 148 134 116 143 136 120 148 134 118 144 132 116 138 125 112 99 92 82 100 89 78 146 132 116 146 132 116 148 134 118 139 130 113 141 130 113 141 130 116 140 132 116 140 132 116 141 130 116 139 132 113 138 128 114 144 132 116 139 130 113 138 130 111 139 132 113 142 132 116 142 132 116 143 132 113 144 132 116 145 132 114 143 130 118 141 130 118 143 132 113 150 136 118 144 132 118 152 134 120 150 136 116 152 140 120 149 138 118 151 140 122 151 140 122 145 132 113 145 136 120 150 134 118 152 138 116 154 140 122 158 140 120 109 97 81 89 80 63 154 138 122 152 140 120 150 136 118 150 134 118 135 122 108 97 88 77 131 89 78 188 135 112 136 128 109 154 140 120 156 140 119 154 140 120 154 140 122 148 140 116 152 140 116 152 134 111 150 136 116 156 140 118 158 140 119 160 140 123 158 144 122 156 140 116 157 132 113 134 116 104 147 124 109 162 143 119 135 123 108 138 126 110 167 148 123 164 145 121 211 179 151 178 112 94 102 102 92 208 180 152 90 89 87 126 114 106 168 152 131 109 102 90 156 140 118 156 140 120 154 138 120 151 142 117 147 135 118 127 106 84 176 124 98 223 149 124 203 137 115 170 145 121 208 178 147 167 148 123 170 149 118 241 219 179 234 205 167 232 204 167 235 208 168 166 153 134 154 142 135 98 92 88 93 79 71 138 125 112 148 138 116 150 134 118 148 136 118 150 136 118 150 136 116 154 138 116 151 132 115 152 134 118 151 132 114 146 132 111 143 132 113 148 134 116 148 132 116 150 136 120 134 122 105 174 131 108 211 144 121 216 146 123 149 130 115 102 94 88 87 83 87 200 183 161 79 73 71 98 86 84 240 206 167 231 205 174 146 134 123 125 115 98 137 124 108 141 128 113 140 124 110 132 117 98 145 125 99 138 121 100 138 124 110 125 113 93 148 114 99 148 114 102 193 143 121 163 108 89 199 178 145 234 203 164 228 163 131 228 201 162 224 187 147 211 124 103 221 149 123 216 154 124 198 92 77 216 139 116 208 108 90 181 109 89 135 118 102 146 134 118 152 136 120 152 136 118 147 136 115 150 136 118 146 134 116 113 105 91 159 125 111 207 135 112 216 144 121 206 138 116 203 145 123 224 149 126 173 121 99 176 136 110 201 143 116 162 83 72 208 171 136 201 106 89 157 111 93 227 162 132 220 151 128 226 156 131 140 103 83 123 111 96 154 142 117 152 140 119 154 140 118 152 136 118 154 140 120 156 142 123 158 140 121 160 142 120 156 140 119 158 144 122 162 144 125 154 138 118 148 136 116 148 134 115 148 136 118 121 102 83 115 100 94 61 65 64 54 49 53 221 152 129 223 158 134 179 126 107 85 78 65 127 104 83 91 76 65 171 123 102 151 118 94 160 113 92 160 113 92 172 114 92 179 119 97 174 119 95 172 116 91 181 121 98 181 123 101 183 123 100 155 113 97 152 138 122 142 134 111 144 130 112 148 134 118 150 134 116 151 140 118 154 140 118 162 147 129 162 150 125 162 146 127 158 144 121 160 142 121 160 144 126 156 138 119 145 132 116 142 130 114 131 124 109 175 151 126 235 204 168 234 203 164 232 202 162 234 202 165 233 203 166 234 203 166 235 204 166 235 204 166 228 202 164 228 202 164 228 202 164 228 201 162 228 202 164 228 202 164 229 201 160 230 200 156 229 200 158 229 201 160 173 155 132 148 134 116 148 136 116 143 136 113 150 138 116 150 138 118 150 138 115 148 136 116 147 134 118 150 136 118 148 134 118 142 132 116 142 132 116 114 104 90 69 66 58 110 102 92 139 130 114 140 132 116 139 132 113 141 128 112 137 128 109 137 128 109 138 128 114 139 130 116 139 130 116 136 124 108 143 130 114 139 130 114 138 128 112 141 130 113 138 128 112 146 132 116 143 130 116 142 132 116 145 134 118 147 136 118 145 134 118 144 132 116 143 132 113 142 130 111 146 132 116 142 132 116 146 132 116 147 134 115 150 136 118 146 134 116 152 138 120 150 138 118 150 136 118 152 136 118 150 136 118 152 136 118 149 136 113 149 140 122 124 110 96 152 138 120 148 134 116 147 132 116 142 128 112 118 88 73 120 89 79 201 138 119 216 141 117 106 106 91 146 134 116 150 136 117 148 136 113 150 136 118 150 138 116 154 140 118 152 138 120 156 138 124 158 142 122 156 140 116 154 140 120 156 140 118 160 146 118 158 142 120 160 143 124 160 144 121 158 140 119 152 136 118 115 104 89 148 134 116 141 126 109 133 118 102 197 177 145 166 149 126 229 200 166 153 134 122 71 68 73 121 110 104 89 85 82 152 140 120 156 140 122 154 140 122 154 138 116 156 136 122 125 119 107 195 165 137 207 135 112 213 142 118 186 143 120 178 154 128 224 203 164 144 135 121 93 92 90 139 126 116 54 51 53 128 122 113 81 81 82 112 100 100 81 77 74 124 113 105 147 134 120 150 134 118 158 142 124 151 137 122 134 120 105 137 124 106 152 136 120 152 140 116 152 138 118 150 134 116 160 144 125 160 146 125 156 140 118 152 140 120 152 138 120 150 138 118 127 118 100 170 127 108 219 149 126 171 129 111 102 99 93 75 71 77 75 79 82 79 79 86 166 154 134 139 127 113 86 82 80 131 120 108 158 140 113 156 144 124 131 113 103 137 126 112 145 136 113 140 125 108 141 119 97 149 125 103 139 119 109 138 125 114 129 117 97 246 223 187 240 206 172 197 172 146 230 202 162 230 202 164 231 201 158 233 193 154 211 132 102 216 188 151 223 167 139 202 121 98 222 163 134 220 162 132 209 105 87 126 105 90 148 134 118 145 128 116 146 130 114 143 132 111 148 132 116 143 132 113 135 122 107 155 111 97 173 123 103 164 116 100 139 107 84 170 105 84 184 117 96 200 134 111 209 142 119 180 147 122 152 110 85 151 113 97 231 188 156 164 96 78 146 116 95 185 127 106 216 151 128 212 144 121 100 76 66 145 132 116 149 138 118 148 136 116 147 138 115 156 140 120 152 138 118 152 138 119 156 140 118 154 138 117 158 144 120 158 142 119 154 140 118 154 138 122 152 136 118 154 140 120 136 119 106 148 110 100 156 114 95 96 83 69 152 106 91 182 104 86 183 105 84 97 87 72 125 102 84 91 75 64 173 123 104 160 114 91 164 113 93 172 117 96 172 117 96 170 116 93 172 117 96 174 119 95 181 123 101 184 127 104 186 129 105 158 125 100 143 134 113 144 134 116 144 134 116 150 134 116 152 138 120 148 134 116 148 134 116 148 136 116 150 136 118 154 140 116 154 138 118 142 132 116 143 132 116 139 126 110 137 126 112 137 126 110 131 117 106 176 158 129 235 204 168 234 203 164 236 204 164 236 204 164 234 203 164 235 204 166 236 204 164 235 204 166 228 202 164 228 202 164 228 202 164 228 202 164 228 202 164 229 200 158 229 201 160 228 201 162 229 200 158 226 197 157 167 146 127 143 132 113 141 132 109 146 132 116 146 132 116 141 132 111 137 128 107 141 132 113 141 130 116 142 128 112 143 132 111 142 132 116 141 130 114 123 96 83 83 73 64 99 90 81 138 130 111 142 132 109 141 130 116 137 126 111 139 130 113 138 128 114 137 126 110 139 130 116 140 132 116 139 128 116 137 126 111 137 124 114 137 126 109 139 130 114 137 124 112 136 124 112 136 124 108 140 132 116 139 130 114 139 130 114 139 130 116 139 132 113 139 130 114 138 128 112 141 130 114 146 134 116 144 132 116 144 132 116 146 132 116 146 132 116 146 132 116 145 130 116 146 134 116 146 134 116 152 136 117 146 134 116 145 132 113 145 130 116 141 130 113 137 128 107 141 130 116 138 128 114 118 104 93 132 97 86 118 98 84 145 110 94 231 154 129 112 89 82 151 134 117 143 134 118 148 136 116 150 138 119 148 134 116 156 140 122 156 140 122 154 140 120 156 140 118 156 140 122 156 140 120 154 138 118 156 142 119 154 142 119 150 138 116 150 134 116 152 138 118 152 136 118 151 142 118 150 136 116 151 134 115 162 153 133 230 202 164 220 192 160 72 73 70 210 195 174 88 89 91 87 84 80 110 93 90 152 134 118 152 138 118 147 136 114 132 108 93 150 132 116 148 132 120 168 147 123 180 129 108 219 147 123 207 139 116 164 139 117 223 197 163 230 202 164 215 190 159 233 203 168 192 173 149 198 172 146 92 88 86 132 124 114 112 101 94 150 138 120 146 136 116 154 138 115 114 102 96 137 103 91 179 126 110 125 93 75 140 123 108 145 132 114 147 134 113 143 134 111 150 136 116 149 138 122 141 130 113 138 130 109 140 128 109 139 130 109 145 134 113 143 132 112 115 96 85 165 115 106 119 106 98 77 74 79 66 61 65 137 125 114 100 93 90 76 70 74 213 191 163 235 209 169 226 200 162 228 201 167 229 200 170 147 132 110 126 118 97 141 130 111 147 134 117 116 110 94 149 131 103 153 125 101 132 115 95 117 104 88 179 159 130 174 153 125 223 195 157 158 146 123 238 207 172 220 163 132 230 179 149 189 170 143 233 202 160 211 136 112 220 174 135 221 182 151 194 117 96 159 93 78 136 124 110 144 132 116 146 132 118 145 130 116 148 132 116 144 132 111 143 123 111 137 128 110 121 98 78 167 119 95 172 120 103 129 101 75 173 99 80 192 94 78 173 78 66 134 86 67 161 128 102 153 104 82 167 149 122 176 164 136 169 125 106 221 147 124 215 159 131 190 132 110 231 160 133 105 101 82 143 136 113 143 128 114 145 134 113 145 134 113 143 132 113 151 132 115 152 138 115 151 134 113 152 140 117 150 136 113 146 134 116 150 136 120 148 132 116 150 132 118 131 116 103 142 113 94 185 132 109 177 125 101 201 118 97 204 117 96 216 119 99 103 85 75 127 96 80 98 77 66 173 123 104 164 116 94 168 114 93 165 114 96 168 114 93 168 112 91 169 116 95 176 121 99 182 125 102 178 121 99 184 127 104 161 118 99 143 136 116 138 128 112 144 132 116 144 132 116 145 132 113 148 136 116 148 136 116 152 138 118 150 136 116 146 132 116 142 132 111 143 130 114 141 128 116 138 128 114 138 128 111 139 130 114 129 116 104 173 154 126 233 205 165 233 203 166 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 235 206 165 228 202 164 228 201 162 229 201 160 229 201 160 229 201 160 228 201 162 229 201 160 229 201 160 229 201 160 224 199 161 165 143 125 142 128 114 144 132 113 148 132 113 146 132 111 144 132 116 142 132 111 143 132 113 138 130 111 140 128 112 148 130 116 166 143 122 184 127 107 177 82 70 111 62 55 87 67 61 135 123 108 137 126 112 133 128 112 137 126 111 138 128 114 138 128 111 136 124 110 137 124 112 137 124 112 136 124 110 141 130 115 137 126 109 137 124 112 137 124 112 137 126 109 137 127 114 137 124 112 137 126 112 136 122 112 137 124 112 136 124 110 138 124 116 135 122 108 135 120 106 135 122 106 138 128 112 137 128 109 137 126 111 137 124 110 141 132 113 144 130 116 142 130 111 139 130 114 139 130 114 145 134 118 145 132 118 148 136 116 146 132 116 146 132 113 143 130 114 143 132 113 141 132 113 146 130 116 122 100 89 96 75 68 126 97 81 136 101 81 104 84 74 134 124 105 141 130 116 142 132 116 143 130 113 145 130 116 146 132 113 150 136 118 152 138 120 149 136 115 148 134 113 150 136 116 150 136 115 151 130 116 148 134 116 145 134 113 142 130 111 144 130 113 141 126 110 154 137 120 150 137 120 129 120 102 114 106 91 189 167 141 221 195 166 101 93 88 62 57 64 77 78 83 74 70 72 137 126 110 138 124 108 134 122 104 166 120 101 176 123 108 145 134 113 147 136 120 139 126 107 104 89 79 194 129 107 219 151 130 162 118 101 199 146 118 209 175 152 239 208 167 145 127 111 146 118 100 208 186 155 145 136 121 86 77 74 143 126 111 128 113 99 92 84 82 76 70 71 101 95 90 133 104 99 149 108 92 130 97 84 136 124 108 138 128 113 137 128 109 138 130 111 137 124 112 137 128 109 137 126 109 143 132 111 139 128 109 141 132 113 141 130 114 146 130 111 58 63 59 65 83 98 56 69 78 83 79 86 80 78 86 180 163 138 54 61 69 135 122 110 162 152 138 185 169 142 230 202 164 235 205 163 227 194 163 192 176 145 94 84 74 128 117 104 139 128 116 137 126 112 141 128 107 132 120 99 157 129 104 165 136 111 111 93 81 211 195 167 186 170 143 178 165 144 163 142 115 232 186 146 237 207 168 105 96 88 238 208 171 211 149 124 215 179 149 137 122 107 213 151 128 199 102 88 130 112 93 139 126 112 139 130 111 143 130 116 144 132 116 143 134 113 139 128 116 144 132 116 146 130 114 136 118 96 121 101 82 156 90 73 147 105 85 175 87 70 202 110 86 173 139 103 148 120 95 153 128 106 147 124 95 158 123 97 167 128 97 179 145 117 180 139 103 157 126 96 156 129 106 135 118 99 136 123 103 139 126 107 138 128 110 135 124 106 139 128 109 138 125 109 126 110 87 123 108 94 139 127 105 145 132 114 136 126 108 131 119 102 141 114 98 145 112 92 152 117 100 199 146 122 207 143 115 171 123 95 181 129 109 206 133 111 208 117 97 106 86 71 109 87 72 107 86 67 163 118 96 152 117 91 155 109 88 164 110 92 172 117 96 168 114 92 168 112 91 175 119 98 175 119 98 177 124 98 180 121 98 141 107 87 145 136 120 136 124 110 136 124 105 139 124 110 139 132 113 143 130 114 137 128 109 140 130 111 142 134 116 143 132 111 138 130 107 146 132 116 137 128 109 138 128 112 139 128 116 140 130 113 126 116 101 177 161 133 233 203 166 235 204 168 235 204 166 233 205 167 233 203 166 235 204 168 235 204 166 234 203 164 229 201 160 229 201 160 224 194 155 228 201 162 228 202 164 228 202 164 228 202 164 229 201 160 229 201 160 223 197 160 164 149 131 138 130 107 146 132 116 148 134 116 148 132 116 146 132 116 141 132 113 143 132 113 137 126 112 137 126 109 154 135 115 215 125 105 205 113 94 207 123 102 182 133 110 185 125 101 189 119 99 124 113 98 135 122 110 137 124 107 136 124 108 137 126 110 137 124 112 136 124 110 135 122 108 136 124 108 135 120 106 134 120 108 132 120 106 132 120 108 134 120 108 136 126 107 135 122 108 136 124 108 137 124 112 138 126 114 137 124 112 136 124 108 136 124 108 136 124 108 135 122 106 133 122 108 136 124 108 137 126 112 136 124 110 137 128 109 141 130 114 138 128 112 140 126 114 138 130 111 140 126 111 145 132 113 148 132 116 141 132 111 146 132 116 143 130 114 141 132 113 139 130 113 139 130 116 145 128 114 108 94 83 92 84 70 107 89 76 97 78 64 120 110 100 141 130 114 142 132 116 136 124 110 142 130 111 143 134 113 143 132 111 148 132 116 148 136 116 141 132 111 145 132 113 141 132 111 139 132 111 141 130 113 142 128 114 138 130 111 140 130 111 148 132 116 148 134 116 121 106 94 107 95 84 117 101 92 115 90 80 114 105 107 146 137 119 88 81 78 71 66 69 51 53 55 178 139 115 205 140 118 179 128 107 133 108 92 195 132 110 134 126 108 138 128 111 131 118 104 203 141 119 187 127 105 213 141 117 203 134 112 209 144 122 200 137 114 179 146 123 145 126 101 176 127 107 155 142 125 120 110 99 115 106 94 88 84 78 70 69 75 90 85 86 74 72 74 87 83 85 159 115 99 115 91 80 104 83 69 137 126 110 136 124 110 137 126 110 136 126 107 132 122 106 137 126 107 136 124 110 137 126 109 140 128 112 136 126 107 137 126 112 148 134 114 54 53 56 94 92 91 176 134 121 120 92 85 75 82 87 143 133 120 78 76 84 106 95 89 113 101 91 140 137 121 154 140 126 147 132 114 117 108 92 125 116 101 136 124 108 135 122 106 135 122 106 135 122 106 135 122 110 137 128 109 137 124 107 128 116 99 137 115 90 173 139 111 123 106 89 210 196 167 81 81 77 153 143 124 207 192 160 90 81 86 203 179 145 202 147 119 142 118 108 187 171 143 227 174 141 216 139 116 197 174 149 112 106 92 136 124 110 138 126 114 137 124 112 140 132 116 141 134 116 138 130 111 145 132 118 136 117 106 148 118 98 204 140 116 215 152 128 189 101 83 202 166 132 191 128 106 228 151 127 192 135 113 196 140 119 228 151 127 198 135 115 186 154 127 186 122 103 196 166 141 195 169 145 203 180 143 144 126 107 133 121 102 127 108 83 120 106 85 131 113 93 145 124 101 187 137 113 219 147 123 200 136 116 183 128 110 211 144 121 219 149 126 228 155 132 219 149 126 215 147 123 216 149 126 212 146 123 228 153 129 173 130 111 197 114 94 210 110 91 104 91 75 106 88 72 107 86 71 167 118 97 156 111 90 163 116 95 160 111 91 169 116 95 168 114 92 169 116 95 169 116 95 172 117 96 181 123 101 184 127 104 144 113 94 142 132 113 139 130 114 138 128 109 137 122 107 138 130 111 138 130 111 137 128 109 144 132 116 141 132 113 145 136 116 145 132 113 145 134 115 141 132 113 140 130 111 141 128 116 137 124 112 117 108 93 182 162 132 235 206 167 233 203 166 235 204 168 235 204 166 235 204 168 235 204 166 235 204 166 235 206 169 224 194 155 226 197 157 229 201 160 228 201 162 229 201 160 228 202 164 228 202 164 228 202 164 228 202 164 229 201 160 168 152 130 139 130 114 138 128 114 141 130 114 139 130 114 139 130 116 137 124 112 137 126 112 137 124 114 136 124 110 184 129 106 213 122 102 212 140 116 211 131 110 215 139 115 209 119 100 222 155 131 150 98 80 135 122 106 128 116 105 137 124 112 135 122 108 133 118 108 134 118 110 134 120 108 129 120 105 136 122 112 137 126 110 135 120 110 135 122 108 134 120 108 137 124 112 134 120 108 133 122 110 134 120 108 135 122 110 138 126 114 136 124 110 137 124 112 138 126 114 136 124 108 137 126 110 137 124 112 138 128 114 137 126 112 138 126 114 138 128 112 139 128 116 136 124 108 136 124 112 135 122 110 137 126 110 139 130 114 136 124 108 137 126 112 136 124 110 138 126 114 137 126 112 138 126 114 139 130 113 136 124 108 127 110 96 111 99 84 113 104 87 133 124 108 137 126 110 137 126 110 137 126 110 139 130 114 140 130 113 137 126 110 138 128 112 139 130 114 138 128 114 139 127 114 137 126 110 140 130 114 138 128 114 137 126 112 139 130 114 139 128 116 137 128 109 143 128 118 140 128 114 136 120 104 177 125 107 199 128 106 141 115 101 71 54 56 75 70 71 78 74 69 174 123 104 222 151 126 153 118 100 120 112 101 126 117 103 135 100 88 121 114 100 131 117 106 176 127 110 215 145 121 215 145 121 177 127 101 195 136 113 205 146 123 183 131 112 159 112 96 198 125 103 215 136 112 189 117 99 88 87 84 66 64 67 85 81 85 91 87 85 88 81 84 116 105 94 130 121 103 111 92 80 146 100 87 131 106 91 125 119 107 132 120 106 131 118 104 131 118 104 134 119 104 132 120 104 131 120 104 132 122 106 135 121 104 135 120 106 135 121 104 124 113 100 166 119 103 222 142 118 210 133 109 213 138 115 137 109 98 116 113 107 121 119 107 121 105 92 199 183 151 200 187 163 121 109 96 129 119 105 128 118 105 133 116 108 134 120 108 134 118 106 132 119 102 127 113 104 116 108 96 131 118 106 135 122 105 132 122 106 136 123 103 120 111 96 106 91 79 144 109 91 139 104 93 75 70 63 106 98 95 73 68 72 217 193 162 118 77 73 160 150 136 235 209 174 226 203 167 128 84 74 209 184 151 160 143 120 128 118 103 128 117 104 134 115 100 124 114 98 136 124 108 120 114 100 124 101 87 189 130 109 219 147 123 219 147 123 224 153 131 105 87 79 178 135 107 176 120 102 213 149 126 211 141 118 179 123 102 157 121 99 180 158 135 237 208 167 225 192 155 181 134 113 157 149 128 234 206 171 115 104 91 137 123 107 142 132 114 141 130 113 140 128 114 99 88 73 186 135 115 213 151 130 192 139 119 150 116 100 149 113 95 176 128 107 192 144 119 178 127 111 185 126 109 187 133 112 180 133 114 188 143 114 162 121 99 208 138 114 213 122 95 112 94 82 110 87 71 115 90 74 162 122 101 156 114 91 163 112 90 179 124 103 167 118 95 171 117 96 168 114 93 168 114 93 169 116 95 184 127 104 186 129 105 128 99 81 138 128 112 136 124 110 138 128 112 136 124 108 142 132 116 144 132 115 146 132 118 143 132 113 142 128 112 150 136 118 144 132 116 139 128 109 137 126 112 130 120 106 132 113 99 146 123 104 122 101 87 185 167 135 235 204 170 233 203 168 236 204 164 235 204 166 235 204 170 235 204 166 235 204 170 235 206 167 223 195 159 229 201 160 228 202 164 230 202 164 228 199 163 230 202 162 228 202 164 228 202 164 228 202 164 226 200 160 173 154 132 135 122 105 132 120 106 136 122 108 137 126 112 133 124 108 137 126 112 136 122 110 136 124 107 138 128 112 179 108 94 207 102 87 208 150 123 202 114 94 220 155 129 216 153 129 210 133 109 172 101 83 128 118 103 132 121 110 135 122 108 128 119 109 131 118 106 128 118 105 134 120 108 131 118 106 133 122 110 136 122 108 128 118 105 128 116 105 130 120 107 126 118 104 131 118 108 133 116 108 131 118 108 134 120 108 137 126 112 136 122 112 134 120 108 136 122 112 135 122 108 133 122 108 136 124 108 136 124 107 135 122 108 136 124 108 136 124 110 135 122 107 137 126 110 135 120 106 136 124 110 137 124 112 136 124 108 136 124 108 135 120 108 134 118 106 134 120 108 136 124 108 136 124 108 136 122 108 135 122 106 137 124 112 135 120 108 130 116 106 134 118 106 133 122 108 135 122 108 136 124 105 128 116 100 133 122 106 135 120 106 136 124 110 135 122 108 132 120 108 135 122 108 135 122 108 132 120 106 132 120 108 132 122 106 136 124 110 136 124 108 135 120 106 137 124 107 136 123 107 128 104 91 208 139 116 216 139 115 171 124 108 115 103 92 109 104 92 213 140 121 216 149 126 156 114 96 122 108 102 131 117 102 128 119 106 113 93 79 117 108 96 153 121 104 216 139 115 209 138 115 223 145 121 162 112 96 219 149 126 131 104 95 112 108 93 182 124 106 208 144 121 212 139 115 213 146 123 57 57 63 80 78 86 86 76 85 82 77 78 116 106 95 131 120 104 128 116 105 96 87 76 154 111 95 157 119 104 132 117 100 137 124 112 136 124 110 132 120 108 137 126 110 133 124 106 132 120 104 136 124 110 138 128 112 126 118 104 127 112 94 149 122 105 214 141 118 212 139 115 212 139 115 210 141 118 210 141 118 203 126 104 108 79 63 188 136 117 209 141 117 121 100 78 128 117 103 130 115 106 134 118 106 129 120 105 129 118 109 132 117 104 175 133 115 121 93 78 121 100 82 111 101 81 129 119 105 130 122 107 132 120 106 132 120 106 113 98 81 185 128 110 213 141 117 168 120 97 74 74 73 140 128 122 151 140 124 167 158 132 233 204 169 196 172 150 168 152 133 173 156 138 235 209 174 233 210 171 134 127 111 172 122 102 224 149 126 159 114 97 168 131 115 171 123 105 231 151 127 223 147 123 203 145 118 158 119 98 121 109 96 125 106 96 178 143 112 138 106 85 167 119 99 159 113 97 222 148 124 192 142 119 154 135 119 205 183 154 229 201 160 239 203 167 172 160 142 212 187 153 171 158 141 123 110 95 133 122 106 138 128 111 136 122 105 128 115 104 117 108 93 119 107 95 122 108 98 132 122 106 127 113 98 123 106 95 107 100 84 165 121 108 133 99 85 155 140 117 230 206 166 235 204 165 236 199 161 179 134 105 245 205 164 111 84 75 111 91 77 115 90 74 155 119 94 164 116 94 164 113 93 176 119 97 164 116 94 169 116 95 168 114 93 175 118 95 175 119 98 184 127 104 194 127 103 127 101 79 138 124 108 127 116 102 129 120 105 135 120 106 129 123 108 128 117 103 135 122 104 138 123 106 139 123 103 131 110 97 136 120 103 139 121 100 141 124 103 120 103 83 126 108 95 136 116 102 110 101 83 183 161 127 233 203 168 232 203 164 235 204 168 235 204 170 235 206 167 235 204 168 235 206 169 235 206 169 228 202 164 228 202 164 231 203 166 230 202 164 232 203 164 231 203 166 230 202 164 228 202 164 232 202 166 228 202 164 168 151 129 127 116 102 131 117 102 134 118 106 136 122 112 135 122 108 135 122 108 132 122 106 135 120 106 136 124 108 170 110 94 207 104 87 209 149 125 202 116 97 207 125 100 205 116 97 222 162 137 160 77 64 123 106 95 123 117 103 124 114 100 125 116 104 125 116 104 125 116 104 125 116 104 128 116 105 128 116 105 128 116 105 125 116 104 123 117 103 123 117 103 126 117 102 125 116 104 130 116 106 131 118 106 133 116 108 134 124 110 128 118 105 128 116 105 135 122 108 132 120 106 133 118 108 134 118 106 133 122 108 136 122 110 132 122 106 132 120 104 132 120 106 131 118 106 133 122 108 133 122 110 130 120 107 133 118 108 132 120 106 128 116 102 132 120 106 131 118 106 128 116 105 128 117 103 129 119 103 130 114 102 129 118 104 132 122 106 132 119 108 125 116 104 132 120 106 140 128 112 131 118 104 128 116 105 129 118 106 135 120 106 136 122 108 132 122 106 121 112 101 128 117 103 130 116 106 132 120 104 125 116 104 133 118 108 132 120 104 134 117 104 129 119 103 135 122 108 124 113 100 172 124 104 193 129 108 141 111 90 128 118 103 133 116 108 124 114 103 127 107 92 144 118 96 139 122 105 131 118 108 134 117 104 129 117 101 124 113 100 133 112 98 223 147 123 212 139 115 215 145 121 206 134 111 191 128 106 215 145 121 176 130 112 120 110 99 110 98 86 213 142 121 211 144 121 223 145 121 105 99 92 83 78 82 76 76 71 116 106 91 127 114 104 124 111 102 121 112 101 97 86 74 95 79 65 111 100 90 128 116 100 121 111 96 120 108 96 129 119 103 128 116 100 122 116 100 125 114 96 128 116 98 125 116 104 129 119 103 125 109 93 218 144 120 213 142 118 209 138 115 211 136 112 227 149 124 183 127 106 186 122 101 216 141 117 210 141 118 227 151 127 104 85 76 120 112 99 124 111 95 149 121 104 144 114 98 199 137 115 212 139 115 187 126 105 171 115 96 151 112 90 123 109 96 129 120 102 129 120 104 136 122 112 132 118 106 133 122 108 130 113 102 148 117 98 134 108 91 123 109 103 118 120 118 105 103 101 121 119 113 90 85 85 112 98 91 234 202 165 234 203 166 229 202 166 231 203 166 236 213 176 174 139 111 181 125 108 165 119 95 157 118 91 155 115 85 151 119 94 154 121 94 120 101 77 136 110 85 128 111 81 128 110 85 144 109 86 152 124 95 234 204 168 210 186 149 174 130 107 192 128 105 178 158 133 129 129 118 236 207 174 224 196 161 131 118 105 77 72 67 203 187 157 159 142 125 155 142 114 136 122 108 137 128 107 136 126 107 145 132 109 142 132 111 136 124 108 136 124 108 134 127 111 137 124 112 134 120 108 125 107 96 184 134 110 153 118 98 144 132 112 236 208 170 233 203 166 219 181 143 188 169 144 129 99 79 114 93 81 125 100 84 162 121 98 161 114 95 168 112 91 175 119 98 168 112 91 168 114 93 175 119 98 169 116 95 172 117 96 182 125 102 186 129 105 128 100 81 133 119 103 139 122 99 137 118 91 131 110 89 132 111 88 143 126 103 146 132 111 134 120 102 127 112 95 134 116 101 127 113 102 131 117 108 129 120 105 125 116 104 131 118 104 136 124 112 110 100 84 189 169 140 235 204 170 233 207 166 235 204 168 233 203 166 232 202 164 235 204 168 235 208 170 235 206 169 228 202 164 231 203 168 228 202 164 228 202 164 230 202 164 230 202 164 231 203 166 228 202 164 228 202 164 228 202 164 162 144 126 128 118 105 123 117 103 125 116 104 125 116 104 132 120 106 133 118 108 125 116 104 130 116 106 122 114 102 140 118 108 201 104 86 202 103 86 209 129 107 207 129 106 209 135 112 219 133 111 149 93 76 121 112 101 122 118 106 128 116 104 123 117 103 123 117 103 121 112 101 128 116 105 126 118 104 125 116 104 125 116 104 122 114 102 121 112 101 121 112 101 121 112 101 121 112 101 121 112 101 120 109 100 120 107 100 119 106 98 122 114 102 120 109 100 113 106 95 121 111 99 119 106 98 120 109 100 121 112 101 120 107 100 120 109 100 121 112 101 120 107 100 120 109 100 122 114 102 123 117 103 123 117 103 125 116 104 121 112 101 124 114 103 124 111 102 123 117 103 120 107 100 121 111 98 121 112 101 119 106 98 121 112 101 120 109 98 123 117 103 121 112 101 124 111 102 121 111 99 122 114 102 121 112 101 121 111 99 123 111 100 128 116 105 124 111 102 121 111 99 123 117 103 120 109 100 125 116 104 124 113 101 129 120 105 120 109 100 122 114 102 128 116 105 131 117 102 123 108 99 188 133 108 215 145 121 91 94 84 124 114 103 120 109 98 131 116 104 121 112 101 122 114 100 128 118 105 122 114 102 121 112 101 126 118 104 110 97 81 227 151 127 205 141 117 190 130 106 202 131 109 115 93 79 123 97 84 149 116 103 118 98 84 120 109 98 130 116 106 131 104 90 209 138 115 192 126 104 76 62 60 94 85 79 119 107 98 122 114 102 120 109 100 120 109 98 119 105 92 116 104 93 115 103 90 124 111 102 121 111 99 121 111 98 123 110 98 122 114 99 121 111 97 124 112 100 124 113 100 131 115 108 137 111 100 96 92 77 202 134 112 212 139 115 208 135 112 226 146 121 188 129 110 113 97 83 101 102 89 190 129 108 209 138 115 213 142 118 191 128 106 125 94 74 207 137 115 223 145 121 219 145 121 216 147 123 187 129 108 131 107 91 182 123 101 155 111 92 101 90 73 116 105 97 119 106 96 120 109 98 125 116 104 130 116 106 125 116 104 127 112 102 126 109 102 121 112 101 113 104 94 93 94 87 113 109 100 116 116 113 114 113 104 120 111 103 236 212 174 218 193 158 217 193 157 229 201 163 228 199 165 233 209 169 186 162 131 98 86 75 126 111 98 122 109 99 124 113 96 127 114 98 127 115 102 117 108 97 123 111 99 123 110 97 118 101 88 193 183 155 147 133 115 132 117 105 100 88 84 218 152 127 178 154 131 105 102 95 140 130 115 234 213 176 198 174 147 129 129 111 198 182 155 122 116 104 221 201 169 117 107 96 123 111 102 125 114 101 122 114 102 123 117 103 128 117 103 128 116 105 126 117 102 128 117 103 123 117 103 125 116 103 113 106 93 118 113 99 100 94 89 154 144 127 218 190 157 236 209 167 220 198 163 123 97 81 118 93 80 125 97 84 163 119 99 152 114 90 163 114 93 175 119 98 168 114 93 175 119 98 171 115 94 174 122 97 172 117 96 184 127 104 200 135 111 110 88 76 117 108 90 117 110 96 117 110 96 123 111 100 123 117 103 128 117 103 133 118 108 136 124 108 136 124 110 128 116 105 135 120 108 133 120 106 131 118 106 128 116 105 122 114 99 132 120 108 111 102 88 190 173 141 235 204 168 233 203 166 234 203 164 235 204 166 235 206 167 235 204 166 235 204 166 235 206 165 228 202 164 228 202 164 229 202 166 228 202 164 230 202 164 230 202 164 233 203 168 228 202 164 230 202 164 228 202 164 161 145 125 125 116 104 123 117 103 121 111 99 127 113 102 122 114 102 122 114 102 124 112 101 123 117 103 121 112 101 124 111 102 180 101 85 226 165 135 220 137 115 208 133 109 213 141 117 201 130 106 116 100 85 120 107 100 121 112 101 121 112 101 119 106 98 121 111 99 117 108 98 119 106 96 119 106 96 119 106 98 120 109 100 119 106 98 119 106 98 119 106 96 112 104 95 119 106 96 120 109 100 120 109 98 120 107 100 119 106 96 119 106 96 124 113 102 119 106 98 120 107 100 123 117 103 121 112 101 120 109 100 118 111 101 122 114 102 128 116 105 123 109 102 120 109 100 123 117 103 124 114 103 121 112 101 121 112 101 123 117 103 123 109 98 121 112 101 122 114 100 122 114 102 121 112 101 120 109 100 121 111 97 120 109 100 120 109 100 119 106 98 120 109 98 119 108 100 120 109 98 122 114 102 121 111 99 119 106 96 121 112 101 121 111 99 124 113 101 120 109 100 123 108 100 122 114 102 121 111 99 120 108 96 119 105 94 120 108 96 120 108 96 121 112 101 127 114 104 107 97 84 221 151 127 182 125 103 103 98 89 122 114 102 123 111 100 127 112 96 121 112 101 121 111 98 119 106 98 119 106 96 120 108 96 120 109 98 105 104 92 200 142 120 230 158 132 163 115 97 173 123 101 91 86 77 120 109 98 119 106 96 120 108 96 120 109 98 121 111 96 107 93 81 202 143 121 227 157 132 94 83 78 120 109 98 119 106 96 119 106 98 119 105 92 119 106 96 116 104 93 120 109 100 120 108 96 121 112 101 119 105 94 124 111 98 124 112 98 116 104 93 119 106 96 119 105 94 119 105 94 116 104 93 98 88 80 227 150 125 200 138 116 204 140 117 194 127 105 102 93 86 104 95 82 122 114 99 126 118 104 127 102 91 216 139 115 215 145 121 215 145 121 215 145 121 213 142 118 215 145 121 213 144 122 132 104 90 106 102 91 105 98 83 156 113 99 181 123 102 76 67 55 120 108 96 120 107 100 121 111 99 122 114 102 111 109 95 172 129 105 190 129 107 175 132 110 165 130 109 175 135 116 83 83 76 108 104 105 94 94 90 96 97 97 96 89 93 108 98 97 129 121 116 166 149 127 198 177 152 206 181 156 232 202 166 235 209 174 188 169 138 107 95 85 125 116 104 123 117 103 125 116 103 122 116 100 124 111 102 125 116 104 123 117 103 121 111 98 95 85 79 113 106 95 125 116 104 100 96 83 57 68 75 85 78 74 183 169 148 66 65 69 196 175 149 197 183 157 98 94 94 140 132 121 93 88 88 91 85 85 131 121 111 137 124 108 103 92 82 120 109 100 131 118 104 128 116 105 124 111 102 123 117 103 125 116 104 121 111 99 122 114 102 122 114 102 121 111 98 124 114 100 117 110 92 105 97 92 92 87 80 173 159 135 139 100 85 139 105 88 134 105 89 161 121 103 159 119 95 168 112 91 171 124 100 181 125 102 178 120 98 175 118 95 168 114 93 167 110 89 179 123 101 199 132 108 115 94 78 129 119 109 123 117 103 122 114 102 125 116 104 122 114 102 131 118 106 131 118 106 136 122 108 128 118 105 131 116 104 133 122 108 135 120 106 131 118 106 131 118 106 127 114 102 122 114 100 105 98 89 194 174 143 231 203 168 233 203 168 234 203 164 234 203 164 233 203 166 235 204 168 236 204 164 234 203 164 228 202 164 228 202 164 228 202 164 230 202 164 239 216 174 235 206 168 233 205 166 229 202 166 229 202 166 228 201 162 160 144 124 121 112 101 128 116 105 122 114 102 119 106 98 123 117 103 121 111 98 122 114 102 122 114 102 120 109 100 146 120 107 206 110 91 219 136 115 219 141 118 209 138 114 221 165 137 177 100 83 101 99 90 119 106 98 116 107 97 116 105 98 119 106 98 120 107 100 119 106 98 116 104 93 120 107 100 120 107 100 116 109 97 116 105 97 112 103 93 109 103 95 113 104 97 115 104 91 117 108 101 117 108 101 119 106 96 116 105 98 120 109 98 119 106 98 120 107 100 119 106 96 120 109 100 121 112 101 120 107 100 119 106 98 116 105 97 116 105 95 120 109 100 120 109 100 124 111 102 120 109 100 120 109 98 119 106 98 116 105 95 113 110 94 117 107 96 120 109 100 120 109 100 120 110 94 120 107 100 116 105 97 116 105 97 117 110 96 114 109 96 113 106 95 120 108 94 112 103 92 116 104 93 115 104 91 109 102 92 119 105 94 120 108 94 116 104 93 120 108 94 116 107 94 123 117 103 122 116 97 127 112 98 119 106 96 119 106 96 119 106 98 119 106 96 124 114 100 126 107 95 223 147 123 128 99 83 121 111 98 123 108 100 121 112 101 127 113 102 120 109 98 119 105 94 119 106 98 119 105 94 116 105 95 112 103 90 112 103 93 85 83 74 121 95 80 102 84 80 97 91 90 77 76 78 96 87 82 119 106 96 112 103 93 115 104 91 113 104 91 119 105 94 103 90 76 116 100 86 105 99 86 112 103 92 116 104 93 120 108 94 119 106 98 119 105 94 124 114 103 119 105 94 122 114 102 116 104 93 119 103 90 119 105 92 121 112 101 120 108 95 115 104 91 115 104 91 112 103 90 112 103 90 92 78 67 213 149 126 185 129 105 181 127 106 89 78 65 106 102 95 115 104 94 116 104 93 113 104 94 112 99 85 216 139 115 209 138 115 211 144 121 212 139 115 214 141 118 166 116 100 104 95 84 113 104 94 119 105 94 112 101 93 102 88 76 218 144 120 103 85 70 108 100 90 120 109 100 116 105 95 119 106 96 95 90 82 227 156 131 208 144 121 212 139 115 215 145 121 227 151 127 78 71 68 92 94 96 89 93 91 99 93 99 92 97 93 146 133 122 117 112 103 134 117 107 161 146 128 209 182 148 238 208 171 235 209 172 207 186 154 164 154 135 93 89 80 119 106 96 119 106 96 113 106 96 116 105 95 120 107 100 117 110 96 120 108 96 121 112 101 120 109 98 120 109 100 81 77 72 87 84 85 57 77 92 113 112 107 78 87 86 183 172 152 114 104 101 78 74 76 94 97 95 92 84 84 104 93 86 121 113 97 117 107 96 101 96 84 122 114 102 122 114 102 120 109 100 128 116 105 125 116 104 128 116 105 122 114 99 129 120 105 125 116 104 125 116 101 123 117 103 125 116 104 122 114 99 117 108 99 104 94 81 128 100 85 138 109 95 135 108 93 161 121 103 154 117 96 164 116 98 172 117 96 178 121 99 184 126 102 172 116 94 172 117 96 172 117 96 176 121 99 199 132 108 112 92 78 123 117 103 128 118 105 123 117 103 124 114 103 128 116 105 130 116 106 133 118 108 128 116 105 131 116 104 128 118 105 131 118 106 133 122 108 132 122 106 124 113 101 122 114 100 121 116 103 95 90 82 206 183 149 233 203 168 231 203 166 232 203 164 232 203 164 233 203 166 228 201 162 230 202 164 233 203 166 228 202 164 230 202 164 235 206 168 169 153 127 106 94 73 139 125 105 172 155 129 220 195 162 229 200 167 228 202 164 162 145 126 124 114 103 123 117 103 120 107 100 121 112 101 120 109 98 121 111 98 122 114 99 122 116 97 118 111 101 203 126 106 201 120 101 205 128 105 204 104 89 199 120 101 212 119 100 216 141 117 148 108 94 109 110 90 113 104 94 118 106 100 109 102 92 109 102 91 116 105 95 112 104 95 116 104 93 109 103 94 112 104 96 112 105 98 119 106 98 113 104 97 115 104 94 112 104 95 109 102 91 112 107 97 112 104 95 116 106 100 116 105 95 112 105 98 116 105 96 120 107 100 116 105 97 119 106 98 119 106 98 113 106 96 117 108 99 109 103 94 109 102 92 116 105 97 119 106 96 109 107 96 112 103 92 112 104 95 115 104 91 109 102 89 115 104 91 112 103 92 112 103 92 109 102 92 106 101 89 112 103 92 119 105 92 112 103 92 120 112 103 109 102 89 116 106 96 116 105 98 119 106 96 116 107 94 119 105 94 112 107 97 112 105 98 116 105 98 120 107 100 112 104 95 116 107 94 121 111 99 119 105 94 117 107 96 115 104 91 116 104 93 119 106 96 109 102 89 157 116 100 182 128 114 100 95 84 116 106 94 119 106 92 112 103 92 109 107 95 106 101 92 116 104 93 105 98 88 116 104 93 109 102 91 112 103 92 112 103 90 109 102 89 97 92 80 93 87 86 83 78 85 83 78 85 79 77 83 102 99 88 105 98 88 106 101 92 106 101 92 120 108 94 119 106 98 113 104 94 112 103 92 109 102 89 111 101 91 106 101 89 116 104 94 112 103 92 113 106 95 113 107 93 109 102 91 119 105 94 113 106 95 109 102 92 115 104 94 116 107 93 109 102 89 115 104 91 109 102 91 114 100 88 87 77 68 217 143 120 209 138 115 180 117 97 94 90 80 116 104 93 106 102 95 105 99 91 105 98 88 93 94 80 219 149 126 210 141 118 211 144 121 187 126 107 123 97 84 95 92 82 108 98 86 101 98 87 109 102 89 107 93 86 85 67 65 223 156 131 95 91 79 109 102 89 112 103 90 109 102 92 109 103 95 111 89 80 227 151 127 223 149 124 178 123 102 215 145 121 219 145 121 139 108 98 58 77 89 65 72 78 64 77 83 149 114 100 208 145 124 192 137 113 199 163 134 201 164 136 192 146 124 135 99 88 108 99 87 104 93 90 102 100 91 112 104 95 119 106 96 119 106 98 120 108 96 119 106 98 115 104 91 112 103 90 116 105 98 112 103 92 112 103 92 116 105 95 121 104 89 170 121 105 58 74 88 70 80 87 134 127 115 95 98 98 101 95 90 142 134 121 67 73 82 83 78 76 111 100 89 119 105 94 119 106 98 119 105 94 120 109 98 119 106 98 120 110 94 121 113 97 116 105 95 120 109 98 120 109 98 116 105 95 116 105 97 114 109 96 120 108 96 120 107 100 120 109 98 115 104 94 102 98 85 123 95 81 134 111 97 138 104 87 158 118 96 167 118 97 167 116 95 168 112 91 172 117 96 182 123 100 178 121 99 175 119 98 179 118 95 179 123 101 197 134 111 108 95 84 121 111 99 121 112 101 124 113 100 123 117 103 126 117 102 129 119 103 135 122 108 134 118 110 133 120 106 135 120 108 131 116 104 130 116 106 125 116 104 124 114 103 120 109 98 120 109 98 94 91 82 214 183 147 233 205 169 235 204 168 233 203 168 234 203 164 235 204 166 232 203 164 228 202 164 228 201 162 228 197 167 231 208 173 171 150 125 100 98 85 99 88 73 123 107 95 135 124 108 75 71 65 233 206 172 229 202 166 152 139 118 121 111 99 119 106 96 119 105 92 119 106 96 116 104 93 120 107 100 119 106 98 119 106 96 104 103 92 195 100 84 198 94 80 207 122 101 203 101 86 206 118 97 199 128 105 190 87 76 160 96 81 101 99 86 109 102 89 109 103 94 109 102 89 109 102 91 109 103 94 105 100 94 112 104 95 104 96 90 105 99 91 109 102 89 108 99 88 105 98 88 105 98 88 106 101 89 106 101 92 105 98 88 106 101 89 109 102 89 109 102 91 109 102 92 109 103 94 113 104 97 106 101 92 106 101 89 109 102 89 105 98 88 106 101 92 106 101 89 106 101 89 112 103 90 109 102 89 108 99 88 109 102 89 106 101 89 115 104 91 115 104 91 116 104 93 116 104 93 109 102 89 109 102 89 115 102 89 116 104 93 109 102 89 109 102 89 105 98 88 112 103 90 119 106 96 106 101 89 112 103 90 106 101 89 112 103 90 105 98 88 106 101 89 108 99 88 109 102 89 109 102 89 104 96 87 112 103 90 108 99 88 105 98 88 104 96 87 103 93 86 94 92 81 103 88 76 205 144 123 98 80 71 104 96 87 108 99 88 105 98 88 107 97 87 105 98 88 104 96 87 106 101 89 109 102 89 109 100 87 108 96 87 106 101 89 104 96 87 105 98 88 112 103 90 85 82 73 88 81 85 88 81 85 76 76 75 93 86 79 105 98 84 112 103 90 104 95 91 106 101 89 106 101 89 106 101 89 104 96 87 103 93 86 104 96 87 106 101 89 109 102 89 106 101 89 104 96 87 102 91 85 104 96 87 104 95 84 104 96 87 106 101 89 106 101 89 104 96 87 105 98 88 104 96 87 103 93 86 102 91 85 121 99 86 216 139 115 208 135 112 157 109 97 95 85 74 99 91 82 96 89 80 98 89 82 102 91 85 95 87 80 162 119 101 221 148 123 126 100 86 88 85 76 104 96 83 105 98 88 106 101 89 107 95 85 103 93 86 105 98 88 95 80 68 116 86 71 111 99 87 108 99 88 106 101 89 112 101 88 105 97 85 153 121 105 215 145 121 216 144 121 123 97 83 150 112 97 162 120 102 170 118 103 132 98 91 64 77 89 80 87 89 219 155 131 215 145 121 213 142 118 211 144 121 208 141 117 228 151 127 108 99 81 106 103 98 116 104 93 112 104 95 119 106 96 119 105 94 112 103 90 116 103 91 112 101 88 115 104 94 106 101 89 112 103 90 115 104 91 119 105 94 96 94 89 187 124 102 221 150 126 54 64 77 58 75 81 179 131 113 157 138 121 80 80 84 87 87 86 86 90 82 77 80 73 112 103 92 113 103 91 118 110 98 120 109 100 123 111 100 120 108 96 127 112 102 116 105 91 98 86 80 110 94 85 109 102 89 108 99 88 105 98 88 108 99 88 112 103 90 112 103 90 112 103 90 106 101 92 96 90 83 137 107 95 133 104 86 140 104 85 159 122 102 164 116 91 170 120 98 169 116 95 175 118 95 181 122 99 178 119 97 181 123 101 181 121 98 181 123 101 199 132 108 104 99 86 122 114 102 120 109 100 119 106 96 127 112 98 120 108 94 120 108 96 128 117 103 136 124 110 129 120 105 128 116 105 123 111 100 126 118 104 124 114 103 123 110 98 120 109 98 119 106 96 93 92 83 215 185 153 235 208 170 234 203 164 231 203 166 235 204 170 235 204 166 233 203 166 231 203 166 232 203 164 231 203 168 228 201 165 159 143 117 125 110 97 157 142 125 115 99 84 151 138 116 127 117 96 197 174 152 232 202 166 148 131 111 113 104 94 106 101 89 105 98 88 112 103 90 112 104 95 116 102 96 116 105 98 119 106 96 101 102 89 198 97 82 203 103 90 216 154 130 224 159 133 216 159 133 218 153 129 213 150 125 183 131 110 99 87 80 106 101 89 104 96 87 103 93 86 104 96 87 105 98 88 99 90 85 105 98 88 106 101 89 104 96 90 108 100 90 104 96 87 103 93 86 101 95 90 97 90 83 105 98 88 106 101 92 101 96 84 102 91 85 104 96 87 102 101 88 106 101 92 106 102 95 106 101 89 106 101 92 106 101 92 105 99 91 104 96 87 105 98 88 105 98 88 105 98 88 109 102 92 105 99 87 109 102 89 106 101 92 105 99 91 111 100 93 105 98 88 109 102 89 106 101 89 104 96 87 105 99 91 109 102 89 104 96 87 108 99 88 104 96 87 108 99 88 105 98 88 104 96 87 104 96 87 104 96 87 104 96 87 101 96 84 104 95 84 103 93 86 104 96 87 104 96 87 103 93 86 104 96 87 102 91 85 99 93 85 94 89 82 94 78 69 190 151 137 228 153 129 159 113 97 87 81 74 103 93 86 104 96 87 99 90 85 102 91 85 103 93 90 102 91 85 103 93 86 102 91 85 104 96 87 105 98 88 104 96 87 103 93 86 108 96 87 103 93 86 104 96 90 90 90 82 93 87 86 90 86 82 89 83 81 105 99 91 103 93 86 104 96 87 102 91 85 103 93 86 103 93 86 102 91 85 102 91 85 103 93 86 99 91 82 99 91 82 99 90 85 104 96 87 102 91 85 102 91 85 96 90 81 99 89 82 93 87 82 96 90 78 96 90 82 102 89 80 102 90 82 107 97 87 83 85 77 161 116 97 212 139 115 216 141 117 105 86 71 100 92 86 99 91 83 103 93 86 104 96 87 99 91 82 97 90 83 87 86 76 99 89 77 94 90 81 100 92 86 101 95 87 102 91 85 96 91 80 97 91 86 104 96 87 102 90 82 101 94 84 96 87 80 104 96 87 104 96 87 105 98 88 100 93 83 85 82 75 190 130 108 215 145 121 226 155 130 86 72 62 104 96 87 104 96 90 103 93 86 102 90 82 99 90 79 86 81 75 208 150 129 215 145 121 215 147 123 215 145 121 223 145 121 181 126 107 91 88 79 105 98 88 105 98 88 105 98 88 106 101 89 106 101 89 112 103 90 109 102 89 108 99 88 115 104 91 109 100 87 112 103 92 120 108 94 115 102 94 132 100 82 220 148 124 219 147 123 120 89 81 186 134 115 217 157 134 147 109 95 127 107 96 83 92 95 91 87 85 84 78 80 112 103 92 112 103 92 109 102 89 120 108 96 111 100 89 115 104 91 107 98 86 122 99 91 101 83 67 89 81 70 112 103 90 109 102 89 112 103 92 106 101 89 115 104 91 112 103 90 109 102 89 112 103 90 99 90 82 131 103 91 131 102 87 143 113 93 162 119 106 172 117 96 175 119 98 175 119 98 179 118 95 173 115 92 188 130 107 181 123 101 178 121 99 175 118 95 190 127 104 104 94 83 116 104 93 119 104 92 116 105 96 119 105 94 119 105 94 120 107 100 121 114 96 120 109 98 121 114 96 120 108 96 119 105 92 116 103 91 113 106 93 106 101 89 112 103 92 117 107 96 86 79 76 215 185 149 233 203 168 230 202 164 234 203 164 236 204 164 235 204 168 235 204 170 235 204 166 235 204 168 228 202 164 222 189 158 118 102 91 169 153 132 162 151 131 128 106 90 155 142 120 128 112 99 177 159 133 232 200 168 150 135 117 104 96 87 106 101 89 108 100 91 106 101 92 106 101 89 106 101 89 104 96 87 106 101 89 107 97 87 134 88 76 210 115 97 206 111 94 214 150 126 203 135 112 214 169 141 195 92 80 155 95 79 100 89 80 106 101 89 102 91 85 103 93 86 102 97 88 101 96 84 104 96 87 103 93 86 106 101 92 104 96 87 104 96 87 99 90 85 102 91 85 99 90 85 103 93 86 104 96 87 104 96 87 102 91 85 95 87 80 99 90 85 99 90 85 100 93 83 105 99 91 106 101 89 106 101 92 106 101 89 105 98 88 104 96 87 104 96 87 103 93 86 103 93 86 104 96 87 106 101 89 105 98 88 105 98 88 106 101 89 106 101 92 104 96 87 104 96 87 105 98 88 104 96 87 104 96 87 104 96 87 102 91 85 104 96 87 102 91 85 103 93 86 103 93 86 104 96 87 105 98 88 104 96 87 104 95 83 103 93 86 104 96 87 103 93 86 103 94 89 103 94 89 105 98 88 100 92 86 103 94 89 103 93 90 102 91 85 99 90 85 85 81 73 124 101 87 107 93 81 93 87 82 96 88 82 102 91 85 93 86 80 98 89 82 93 87 82 96 89 80 95 87 80 103 93 86 99 89 82 103 93 86 100 92 86 99 90 85 102 90 82 99 90 85 90 85 80 96 88 82 83 80 76 85 81 85 70 63 68 100 92 86 96 90 82 100 92 86 103 93 86 96 87 80 93 89 82 93 89 82 93 89 82 96 88 82 98 89 82 98 88 80 96 90 82 100 92 86 96 90 82 99 89 82 96 89 85 96 90 82 96 89 85 102 91 85 93 87 82 90 86 78 92 86 80 95 87 80 79 75 67 215 150 125 209 146 123 151 115 101 85 82 79 96 90 82 93 89 78 93 88 80 90 87 80 90 85 80 89 84 76 89 84 76 90 86 78 90 86 82 93 87 82 89 84 78 89 84 78 90 86 82 93 89 82 93 89 82 92 86 80 93 88 85 96 89 85 96 90 82 103 93 86 99 90 85 103 93 86 91 82 74 223 150 126 215 145 121 174 118 100 94 90 81 99 90 85 96 89 85 105 98 88 102 91 85 103 93 86 84 86 79 206 148 126 215 147 123 215 145 121 208 144 121 135 106 88 93 90 86 100 94 84 107 98 92 103 93 86 104 96 87 105 98 88 102 91 85 104 96 87 105 98 88 105 98 88 106 101 89 104 95 84 106 101 89 109 102 89 97 85 73 223 147 123 215 147 123 215 147 123 219 147 123 217 145 122 132 103 95 223 157 126 228 153 129 230 152 127 105 88 76 101 95 90 100 94 84 97 91 83 102 97 88 100 93 89 89 84 80 85 79 78 136 105 94 207 145 122 123 101 90 99 87 77 109 102 91 106 101 89 105 99 91 106 101 92 105 98 88 104 96 87 108 100 91 106 101 89 90 86 75 148 109 92 131 102 86 147 112 94 168 126 107 176 121 99 175 119 98 178 119 97 175 116 90 182 119 95 178 120 94 185 123 100 179 116 92 175 119 98 187 131 110 100 94 84 108 99 88 106 101 89 112 103 92 106 101 89 119 105 92 112 103 90 119 105 94 117 107 96 114 110 95 113 106 95 119 106 98 113 107 99 112 103 92 104 96 87 103 93 86 108 99 88 73 75 75 216 185 152 233 203 166 235 204 166 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 164 228 202 164 240 216 180 111 92 76 193 172 145 149 139 119 180 166 145 147 130 111 116 104 90 199 180 144 229 202 166 150 139 119 103 93 86 103 93 86 108 99 88 105 98 88 104 96 87 103 93 86 102 90 82 103 92 83 99 89 82 97 86 79 163 92 78 211 122 102 215 145 120 226 180 155 216 158 132 200 111 92 107 86 77 101 96 84 96 87 80 104 96 87 98 89 82 99 90 85 99 90 85 100 92 86 103 93 86 96 90 86 103 93 86 102 91 85 99 89 82 93 88 85 96 89 85 99 90 85 93 88 85 102 91 85 99 90 85 96 89 85 93 92 82 99 89 82 99 91 82 96 88 82 97 91 86 102 91 85 103 93 86 98 89 82 95 87 80 92 87 78 95 87 80 90 85 80 90 87 80 95 87 80 96 88 82 99 90 85 98 89 82 96 88 82 96 88 82 103 93 86 96 89 85 93 88 85 99 90 85 99 90 85 99 90 85 99 90 85 99 90 85 99 90 85 93 87 82 92 86 80 93 87 78 95 86 78 93 88 80 95 87 80 93 88 75 99 91 82 96 89 85 93 89 82 93 88 85 95 86 78 92 85 78 96 90 82 99 90 85 93 88 85 90 85 80 95 86 78 92 84 73 90 88 76 89 84 76 88 82 77 88 84 74 92 86 80 88 82 76 89 83 79 89 86 76 101 95 87 93 87 82 96 87 80 90 88 78 95 85 75 90 86 78 100 91 83 96 90 81 99 90 85 91 83 77 80 76 78 75 66 72 91 87 80 96 88 82 96 90 81 96 88 82 100 92 86 91 84 79 92 86 80 92 86 75 87 80 73 92 86 80 93 89 78 96 89 80 89 84 76 89 84 76 86 78 72 90 85 80 88 82 77 92 86 80 91 83 77 89 84 76 87 80 73 88 84 74 88 82 76 83 72 58 219 146 123 195 140 115 78 71 59 87 80 75 84 80 72 88 84 74 84 82 75 87 82 72 86 78 72 87 80 73 86 78 72 89 84 76 88 82 74 89 84 78 88 82 74 90 85 80 92 84 75 88 84 74 96 88 82 90 85 80 90 88 76 90 86 78 93 88 80 96 88 82 102 91 85 100 93 83 95 79 67 231 153 128 224 151 127 95 83 73 90 87 78 99 90 85 90 86 82 102 91 85 99 90 85 96 89 85 85 83 78 202 137 119 211 144 121 215 147 123 219 147 123 125 100 88 97 92 81 100 92 86 102 91 85 93 88 85 96 89 85 99 90 85 98 89 82 102 90 82 93 91 85 105 98 88 98 89 82 99 91 82 104 97 85 94 86 77 211 143 120 215 145 121 212 147 124 224 153 129 200 149 124 82 75 70 103 91 78 229 164 132 215 147 123 232 155 130 108 90 76 84 83 80 88 82 86 89 84 85 91 82 85 82 78 80 86 81 82 70 67 67 160 126 113 166 122 103 115 91 75 111 96 85 104 96 87 103 93 86 105 98 88 100 92 82 103 93 86 102 91 85 102 91 85 102 91 85 87 83 74 155 118 98 129 100 86 148 112 96 163 118 96 182 125 102 172 117 96 178 121 99 180 121 98 182 123 100 184 127 104 185 133 107 178 119 97 175 119 98 197 130 106 94 92 81 105 98 88 108 99 88 103 93 86 106 100 85 109 106 92 112 103 92 112 103 92 115 97 87 109 98 88 114 101 90 112 103 92 109 100 87 105 98 88 96 90 81 105 98 88 106 101 92 86 85 78 213 185 150 233 203 168 235 204 166 235 204 166 235 204 168 235 204 166 235 204 166 235 204 166 234 203 162 235 208 170 231 203 168 225 205 173 152 138 119 152 136 117 122 105 86 171 153 127 171 156 130 231 208 173 229 202 166 150 131 115 104 96 87 97 92 83 103 94 84 99 90 85 99 88 80 96 89 85 102 91 85 96 89 85 102 91 85 96 89 85 90 87 78 117 91 79 151 107 96 147 104 97 131 103 86 86 79 71 93 89 81 91 83 75 87 80 75 92 85 78 90 86 82 90 86 82 90 85 80 90 86 82 95 87 80 89 84 78 90 87 80 89 84 78 93 86 80 90 86 82 93 86 80 88 81 78 94 85 79 89 83 79 89 83 79 89 84 76 88 82 77 88 82 74 89 84 78 88 82 74 89 83 79 89 84 76 95 87 80 90 85 80 91 84 79 89 84 76 96 87 80 99 90 85 90 86 82 90 86 78 93 89 82 91 88 82 92 86 80 92 85 78 92 86 80 95 87 80 96 89 80 90 86 82 96 88 82 96 90 82 93 89 82 102 91 85 93 89 82 91 87 85 92 86 80 91 84 79 92 86 80 93 87 82 92 85 76 93 88 80 90 88 78 94 84 76 92 86 80 90 86 82 98 89 82 93 88 85 91 87 85 93 89 78 93 87 82 90 86 82 90 85 80 89 84 76 92 85 76 89 84 78 88 82 80 89 83 79 95 86 78 90 85 80 90 86 78 93 88 80 93 88 80 92 86 78 92 89 78 93 86 80 90 87 80 96 88 82 93 89 82 96 90 81 96 89 85 90 86 82 92 86 80 85 81 76 76 70 72 65 61 59 87 82 72 89 84 78 89 84 76 89 86 76 88 83 77 88 82 74 89 84 76 89 84 76 86 86 74 89 86 76 85 80 75 85 76 71 87 80 75 87 82 73 82 78 72 78 74 68 86 78 72 80 76 69 87 82 72 86 80 71 88 84 78 79 77 74 163 108 92 221 151 126 92 74 60 87 80 73 78 74 70 78 76 70 80 74 69 81 76 70 82 76 70 84 80 72 80 74 69 82 76 70 88 82 74 84 80 72 83 78 71 82 76 68 83 78 71 87 80 73 84 80 74 86 82 76 87 82 72 89 86 76 82 76 70 81 76 70 88 84 74 88 82 77 82 80 72 117 92 84 215 145 121 158 111 93 89 86 76 89 84 78 92 85 78 92 86 80 97 87 81 92 86 80 99 90 85 92 85 76 176 115 95 215 147 123 215 145 121 222 154 129 93 80 72 93 87 82 92 84 75 89 84 76 84 80 72 93 88 85 92 85 81 92 85 78 93 87 82 96 88 78 99 91 82 103 92 83 99 91 82 99 87 80 216 157 132 211 144 121 212 147 124 223 147 123 154 117 105 82 71 65 92 82 76 84 81 74 199 134 112 215 145 121 219 149 126 141 108 95 83 90 95 87 93 98 81 78 83 79 76 86 80 74 72 91 84 79 95 87 78 68 69 60 181 139 115 160 114 97 97 84 74 99 91 82 104 96 87 102 91 85 103 93 86 104 96 87 104 96 87 100 92 86 100 92 86 85 81 72 146 106 94 130 95 81 154 118 101 154 120 97 181 123 101 175 119 98 178 119 97 184 127 104 183 125 103 182 125 102 182 125 102 181 121 98 175 119 98 185 129 108 87 76 68 103 92 83 108 99 88 105 97 85 99 90 85 96 88 82 109 96 83 136 114 103 78 73 63 102 101 88 106 101 89 107 97 87 100 92 86 104 95 87 104 96 87 100 92 86 105 98 88 78 74 72 222 193 155 233 203 166 236 204 164 236 204 164 235 204 168 235 204 166 236 204 164 236 204 164 235 204 166 228 202 164 230 202 164 231 203 166 241 212 173 227 201 165 229 196 160 235 206 170 232 205 169 228 202 164 228 201 162 152 133 116 92 86 80 90 86 82 89 86 76 90 85 80 92 85 78 90 86 82 89 84 76 87 80 75 89 84 76 89 84 76 88 82 77 86 83 76 89 84 76 85 76 71 85 76 71 85 78 72 85 78 72 83 78 73 87 80 73 87 80 73 89 84 76 88 82 74 89 84 78 85 84 75 89 84 78 86 85 77 89 84 78 89 84 76 89 84 78 89 84 76 87 80 73 85 76 71 85 76 71 85 82 76 87 80 73 88 82 74 88 82 74 88 82 77 89 84 78 86 82 76 87 80 75 89 84 76 85 80 75 88 82 77 92 85 81 86 78 72 85 80 75 89 83 79 86 85 77 89 84 78 90 85 80 90 86 82 88 82 74 84 82 74 88 82 74 90 85 80 91 82 74 89 83 79 88 82 74 92 86 80 89 83 79 84 80 70 88 82 75 89 84 81 84 80 74 87 82 72 82 76 70 88 82 74 88 84 74 87 80 73 87 80 73 85 76 71 87 80 73 89 84 78 87 80 73 90 85 80 88 82 77 84 80 72 82 78 74 87 80 73 87 80 73 83 78 71 85 80 73 85 82 76 85 76 71 85 76 71 83 78 71 88 82 74 88 84 74 88 82 77 88 82 75 87 82 72 85 76 71 87 82 72 86 78 72 88 82 74 88 82 74 88 82 77 85 79 75 81 78 72 101 90 77 127 98 87 165 120 107 104 79 72 81 78 69 84 78 68 86 78 72 87 80 73 86 78 72 88 82 74 87 80 73 86 78 72 87 80 77 87 82 72 84 80 70 85 76 71 86 78 72 82 76 70 82 74 70 78 76 66 75 72 66 75 70 66 81 80 72 80 76 69 85 76 71 61 65 60 207 138 115 152 103 88 68 66 63 78 76 68 82 76 70 73 72 64 78 74 66 76 74 68 71 68 62 76 74 68 76 72 68 76 76 68 76 74 66 81 78 70 78 76 68 80 74 69 78 74 68 76 76 68 76 76 66 80 76 69 76 76 68 80 74 69 96 81 74 95 78 68 60 63 59 80 78 70 84 80 72 158 120 104 227 156 125 85 76 69 87 80 73 90 77 72 88 82 74 89 84 76 87 80 73 91 83 75 87 80 73 89 84 76 140 109 95 215 145 121 215 145 121 197 135 115 71 69 65 89 84 76 89 84 76 87 80 73 89 84 78 88 82 74 89 84 76 87 80 73 89 84 76 88 84 74 85 76 71 87 80 73 87 80 73 100 86 70 223 150 126 215 147 123 220 150 127 94 75 64 81 80 71 89 84 78 95 87 80 92 85 78 138 107 96 219 149 126 215 147 123 205 144 124 82 81 82 89 84 85 75 76 78 89 86 76 90 88 76 90 88 76 92 84 75 94 84 76 102 77 67 152 113 96 96 88 82 95 87 80 95 87 80 92 86 80 90 85 80 92 87 78 91 84 79 89 84 78 89 84 76 84 80 68 159 120 98 122 88 73 170 123 106 165 118 100 182 125 102 182 125 102 181 123 101 184 127 104 183 118 95 181 121 98 188 127 103 182 125 102 172 124 102 178 123 101 86 85 71 103 93 86 98 94 86 100 94 83 150 112 97 198 135 116 223 150 126 163 125 105 85 76 61 105 98 88 96 91 80 105 98 88 101 95 87 99 91 82 93 91 78 91 89 80 103 93 86 73 71 64 226 196 162 233 203 166 231 203 168 235 204 172 235 204 170 235 204 170 236 204 164 236 204 164 235 204 166 235 204 168 231 203 166 233 203 168 230 202 162 230 201 162 232 202 162 232 202 166 230 202 164 228 199 165 230 200 166 146 134 113 89 86 76 88 82 74 89 84 76 86 78 72 89 84 76 89 84 76 89 86 74 88 82 74 88 82 74 89 84 76 84 80 72 87 80 73 88 82 74 88 82 74 88 82 77 90 85 80 87 80 73 87 80 73 89 84 78 87 80 75 88 82 77 89 84 76 82 78 71 84 82 74 87 80 73 83 78 71 88 82 74 86 78 72 89 84 76 86 78 72 83 78 71 87 80 73 85 78 72 82 80 76 87 80 73 86 78 72 87 80 73 83 78 73 78 74 70 79 76 70 84 76 71 81 72 69 83 78 71 78 74 68 80 76 69 82 76 70 83 78 71 86 78 72 89 84 76 83 78 71 87 80 73 87 80 73 83 78 71 89 84 76 84 80 74 86 78 72 85 84 75 89 84 76 88 82 74 83 78 73 87 80 73 85 76 71 83 78 69 81 78 70 83 78 71 86 78 72 83 78 71 87 80 73 84 82 74 80 76 71 85 76 71 87 80 73 87 80 73 80 74 69 82 76 68 88 82 77 88 82 74 86 78 72 83 74 70 81 72 69 86 78 72 87 82 72 85 79 70 83 78 71 87 80 73 87 82 73 83 78 69 86 80 71 87 82 72 87 82 72 87 80 73 83 78 71 83 78 71 83 78 69 86 80 69 81 78 70 85 76 71 82 76 70 98 84 72 157 122 105 197 136 116 165 117 102 207 138 114 212 152 132 73 74 65 82 76 70 82 76 70 82 76 70 82 76 70 82 76 70 80 76 69 85 76 71 82 76 70 80 76 67 80 74 67 80 74 69 78 76 66 76 74 68 78 72 68 72 68 60 77 74 64 134 105 90 96 87 76 126 99 86 92 85 78 155 107 93 194 132 110 68 67 60 78 74 66 81 75 66 76 72 68 73 72 64 71 70 62 73 70 64 73 70 64 73 72 64 76 76 68 74 72 66 83 78 74 79 74 67 76 74 68 75 70 66 76 74 70 78 76 68 76 76 70 81 78 70 81 78 70 89 78 72 61 66 58 192 135 116 192 139 118 141 104 90 75 67 57 189 130 108 166 121 99 72 66 64 80 74 67 80 74 71 82 76 70 87 80 73 85 80 72 83 78 73 81 78 70 80 78 68 127 99 80 212 139 115 211 144 121 167 115 98 79 76 70 78 74 68 83 78 69 76 76 68 85 76 71 87 80 73 87 80 73 88 82 74 89 84 76 89 84 76 86 78 72 87 80 73 83 78 71 74 65 60 127 107 94 109 94 89 94 80 80 76 72 70 84 80 74 87 80 73 89 84 76 84 80 72 86 75 70 227 157 132 215 147 123 188 137 117 75 79 74 82 78 75 88 82 77 89 84 78 88 84 72 89 84 78 87 82 70 80 71 63 131 100 89 88 80 72 90 85 80 92 84 73 89 86 76 89 84 76 90 86 78 88 82 74 87 80 73 90 85 80 89 84 77 92 80 72 166 126 105 116 90 76 180 134 115 171 123 102 184 127 104 182 125 102 184 127 104 182 120 96 177 121 100 186 120 95 186 129 105 182 125 102 181 121 98 173 117 97 78 77 67 124 100 87 176 125 102 224 153 129 224 151 128 218 151 123 219 165 138 137 103 92 108 86 77 99 91 83 100 93 83 95 86 76 95 87 80 90 85 80 92 87 78 92 84 75 96 87 80 68 66 59 236 207 172 234 203 166 197 172 139 225 196 159 231 203 166 235 206 167 236 201 168 235 206 165 235 204 168 231 203 168 231 203 166 229 202 166 236 204 164 232 202 162 232 203 164 232 203 164 228 201 162 228 202 164 232 200 168 143 124 106 88 82 77 81 78 68 89 84 76 86 78 72 86 78 72 83 78 71 86 78 72 87 82 72 81 78 70 88 82 74 87 80 73 86 78 72 83 78 71 83 78 73 86 78 72 86 78 72 83 78 71 84 80 72 80 76 69 76 74 68 80 74 69 81 78 70 86 80 71 82 76 70 86 78 72 83 78 71 84 78 73 82 78 72 81 78 70 78 76 70 86 78 72 76 76 68 78 74 68 82 76 70 78 76 68 85 76 71 82 76 70 83 78 71 78 74 68 80 74 69 83 78 71 86 78 72 81 78 70 87 80 73 86 78 72 85 76 71 86 78 72 86 78 72 80 76 69 85 82 72 82 76 70 85 76 71 87 80 73 87 80 75 86 78 72 81 78 70 84 76 71 86 78 72 85 76 71 87 80 73 85 76 71 84 80 72 82 74 70 80 74 69 82 76 70 85 76 71 83 74 70 83 74 70 80 74 69 85 76 71 80 76 69 78 74 68 78 72 68 76 72 68 86 78 72 76 76 68 80 76 69 76 70 68 76 70 68 73 68 64 76 74 68 74 72 66 76 74 68 77 70 66 82 76 70 78 74 68 74 74 66 76 70 68 77 72 66 78 74 68 77 68 68 76 74 68 74 72 68 76 70 70 80 76 69 82 78 72 83 78 71 86 78 72 81 70 61 109 89 80 100 91 82 128 98 85 127 97 88 133 99 85 88 76 68 85 79 72 80 74 69 79 74 70 72 66 60 77 68 68 79 70 68 82 76 70 78 74 68 76 74 68 71 68 62 77 70 66 73 70 64 75 70 66 80 74 69 85 76 71 71 57 56 110 89 78 139 106 94 123 86 71 165 113 96 120 83 72 125 103 88 64 64 60 72 70 66 71 68 64 70 68 63 77 68 68 74 72 66 71 70 62 71 68 62 71 68 62 67 66 62 71 68 62 71 68 62 73 68 64 75 70 64 76 74 66 73 76 68 75 70 66 73 70 64 76 74 68 76 70 68 79 76 60 69 68 57 96 79 69 179 130 110 144 108 88 137 107 95 198 132 116 102 88 77 75 70 66 81 78 68 76 72 70 73 72 62 82 76 70 74 72 66 78 74 66 78 75 66 59 62 55 196 147 128 216 151 121 214 144 120 148 106 89 69 65 58 78 74 66 78 74 68 78 74 68 78 74 66 76 74 66 82 76 68 80 76 69 82 76 70 80 74 69 80 76 69 80 76 67 86 77 67 86 78 72 69 68 68 88 91 94 86 90 98 82 81 85 78 74 67 76 74 68 81 80 72 80 78 72 68 67 65 160 119 100 225 158 132 108 84 71 81 78 70 80 76 69 87 79 68 84 80 71 83 78 69 89 84 77 87 82 70 85 80 71 78 76 68 90 78 75 87 82 73 90 80 71 89 84 78 89 84 76 84 80 74 89 84 78 88 84 72 93 86 80 89 86 77 100 87 77 159 122 102 110 86 73 174 128 110 175 122 102 182 125 102 182 125 102 184 127 104 181 121 98 175 121 96 181 121 98 187 125 101 182 120 96 178 119 97 168 113 94 201 143 124 228 155 132 212 148 126 217 151 129 137 104 94 73 72 64 130 94 80 148 110 94 141 106 93 92 87 76 96 88 82 91 89 80 87 82 70 88 82 74 92 85 78 89 84 76 93 86 80 73 68 65 238 209 170 229 200 167 206 177 146 226 197 157 232 203 164 237 203 169 235 204 166 234 203 164 238 203 167 236 204 164 229 202 166 228 202 164 236 204 164 232 202 162 228 201 162 232 202 162 228 202 164 229 201 160 230 202 164 158 137 117 79 74 70 80 76 69 76 74 68 78 76 68 80 76 69 82 76 70 78 74 68 82 76 70 78 74 68 83 78 71 80 74 69 82 76 70 75 68 66 78 74 66 78 76 66 78 76 70 76 76 72 78 72 66 76 74 68 78 76 68 74 74 66 84 76 71 86 78 72 82 74 70 82 76 70 80 76 69 78 72 68 76 76 68 82 76 70 83 78 71 76 74 68 79 72 67 78 76 68 78 76 66 78 74 68 75 70 66 75 78 69 78 74 68 76 72 68 80 76 69 78 76 68 78 74 68 76 76 68 76 76 68 80 74 69 78 72 68 81 78 70 79 72 67 80 74 69 75 70 66 81 72 69 78 74 64 79 72 67 78 76 72 76 74 68 84 76 71 83 74 70 80 76 69 85 76 71 85 76 71 78 76 68 84 76 71 76 72 68 82 76 70 82 76 70 80 74 69 85 76 71 76 72 68 82 76 70 79 70 68 81 72 69 77 72 66 75 70 66 76 70 68 80 76 69 79 70 68 75 70 64 76 74 68 72 68 66 75 68 66 73 72 64 74 74 66 76 74 68 75 68 66 75 70 66 79 72 67 77 70 66 71 66 63 75 68 66 74 68 64 76 70 68 77 72 66 81 72 69 72 66 62 72 72 66 79 70 68 74 72 66 75 68 66 78 72 62 79 67 64 72 64 56 79 71 62 84 74 62 111 88 78 77 70 58 75 70 68 77 68 68 75 70 64 71 68 62 73 68 64 68 66 59 75 68 66 75 70 64 73 70 64 73 68 64 73 70 64 75 70 64 71 68 61 69 68 61 74 68 68 77 71 62 75 68 58 95 81 68 100 83 72 121 92 78 173 130 113 62 59 56 67 64 62 65 64 60 66 66 63 75 70 66 73 70 64 71 68 64 70 68 60 68 66 59 68 66 59 69 66 64 69 68 62 71 68 62 70 68 60 71 68 60 70 68 60 72 70 64 72 68 66 68 68 64 72 68 68 76 74 68 76 74 70 76 72 68 73 72 64 58 63 57 77 68 64 141 105 90 192 134 112 58 58 50 71 68 62 76 76 68 73 72 64 78 74 68 73 70 64 78 76 70 78 76 68 76 74 68 76 74 66 92 79 69 130 103 89 192 129 106 217 148 125 186 129 108 66 62 58 78 74 68 83 74 70 76 72 68 75 70 66 73 70 62 74 72 66 76 74 68 74 72 66 80 76 71 76 72 68 76 74 66 74 72 64 66 62 61 81 74 78 89 84 85 92 89 93 70 68 63 78 74 68 74 74 66 78 74 68 74 74 66 65 66 65 74 73 73 77 71 70 79 71 66 76 72 68 78 76 68 76 72 68 78 76 68 82 76 70 78 72 68 82 76 70 76 72 68 76 74 68 82 76 70 84 78 75 76 76 70 83 78 73 84 78 73 87 80 77 83 78 71 88 82 74 88 82 74 97 80 72 150 118 99 98 83 72 187 127 105 178 121 99 184 127 104 186 129 105 190 129 104 181 121 98 167 116 94 181 121 98 182 125 102 182 120 96 171 123 102 167 109 91 205 149 125 228 160 136 167 124 106 79 75 68 89 84 76 79 74 67 121 99 81 182 127 106 194 142 117 82 78 72 93 88 85 87 80 75 89 84 76 85 78 70 86 78 72 83 78 71 93 88 85 70 68 64 237 208 167 232 203 164 220 189 153 223 193 155 232 202 164 233 203 166 232 202 164 235 204 168 236 204 164 228 202 164 228 202 164 228 202 164 230 202 162 232 202 162 228 201 162 228 201 162 228 201 162 228 202 164 228 199 165 159 143 127 78 74 68 78 74 66 75 70 68 80 76 69 82 76 70 80 76 69 84 76 71 82 76 70 78 72 68 76 72 68 76 72 68 75 68 66 76 72 68 78 76 66 76 74 66 76 74 68 73 68 64 74 72 66 74 74 66 73 68 64 73 68 64 73 70 62 75 68 66 75 70 64 75 70 66 75 68 66 78 74 68 77 72 66 73 70 64 73 70 64 76 74 66 70 68 60 75 70 66 74 72 66 73 70 64 73 72 64 71 68 62 72 70 66 70 68 60 76 72 68 75 70 66 71 70 62 73 70 65 75 68 66 68 66 59 71 68 62 75 68 66 77 68 68 75 68 66 79 69 66 76 70 68 76 70 66 75 70 64 76 70 66 75 70 66 76 70 68 76 74 68 74 72 66 77 68 68 76 70 68 76 72 68 78 72 68 80 76 69 76 72 68 76 70 68 78 74 68 82 76 70 80 74 69 77 72 66 78 72 68 71 70 62 79 70 68 75 70 66 75 68 66 78 74 68 78 74 68 71 70 63 73 70 62 76 70 68 73 68 64 75 70 66 71 68 62 70 66 61 71 68 62 71 64 61 71 68 62 78 70 66 75 68 66 71 68 62 71 64 58 70 68 60 73 66 62 71 66 63 71 70 62 71 68 62 71 70 62 73 68 64 73 68 64 70 68 60 76 70 68 75 68 66 72 70 66 69 64 56 66 64 58 72 66 62 72 70 66 74 66 60 67 64 57 71 66 60 71 64 61 70 64 58 69 64 56 71 68 62 70 64 62 69 64 56 68 66 59 73 66 62 68 66 59 69 66 58 71 68 62 71 68 60 69 68 59 68 66 59 68 62 54 76 65 57 68 57 54 61 58 54 65 62 59 64 62 57 66 64 58 63 60 57 64 62 57 70 68 60 66 68 59 66 64 58 71 68 62 68 66 59 64 60 56 65 62 58 66 64 58 71 66 63 66 64 58 70 68 60 68 66 59 71 70 66 70 70 62 75 70 66 73 72 64 70 68 60 71 68 62 67 66 61 67 66 61 107 84 71 77 71 62 76 68 64 68 66 59 74 74 66 74 72 66 74 74 66 69 68 61 73 68 64 75 70 66 76 72 68 76 72 70 80 76 69 66 63 56 192 137 112 215 147 123 216 146 123 208 153 130 70 66 59 74 74 64 78 76 68 73 68 60 74 72 64 73 72 64 71 68 62 73 70 64 76 72 68 71 70 62 71 66 60 68 68 64 72 66 64 76 70 71 76 76 83 82 83 85 61 57 53 70 68 60 73 70 64 73 72 64 75 68 66 73 72 64 70 70 64 76 71 68 75 68 66 77 72 66 74 72 66 75 70 66 75 72 64 76 74 68 76 72 64 76 72 70 79 70 68 77 72 66 76 74 70 78 74 68 82 76 70 80 76 71 84 78 73 84 80 72 83 78 69 86 78 75 87 80 75 94 80 67 144 108 92 102 85 73 186 130 107 177 119 97 176 121 99 184 127 104 186 129 105 182 120 96 173 118 97 182 120 96 186 129 105 178 121 99 176 125 106 163 108 88 212 150 127 108 87 72 81 76 68 82 80 70 86 78 72 83 78 71 77 76 68 143 113 97 135 101 88 86 78 72 87 82 70 86 80 69 84 80 72 83 74 70 81 72 69 86 78 72 87 80 73 84 79 75 241 216 177 233 203 166 218 189 155 212 181 149 229 199 163 232 202 162 235 204 166 236 204 164 236 204 164 228 202 164 230 202 162 228 201 162 229 201 160 229 201 160 230 202 162 228 201 162 228 201 162 229 201 160 228 201 162 161 147 122 76 70 66 74 72 64 76 70 66 75 68 66 73 68 60 76 70 66 82 78 72 78 72 68 71 68 62 72 66 64 71 68 62 75 68 66 72 70 66 71 68 62 74 68 68 76 72 68 73 72 64 74 72 66 70 68 65 68 68 64 70 68 60 75 70 66 71 68 62 70 68 60 71 68 62 69 68 62 73 70 64 74 68 68 68 66 62 68 68 64 70 66 62 70 68 60 69 68 61 68 66 59 68 66 59 70 68 60 71 68 64 70 70 66 71 68 64 71 68 62 66 66 63 68 66 59 67 66 61 73 68 64 71 68 64 69 68 62 74 72 64 71 68 64 72 68 66 74 70 66 73 70 64 75 68 66 73 68 64 76 72 70 71 68 62 75 68 66 76 72 68 75 70 66 71 70 62 77 72 66 76 74 68 78 76 68 75 68 66 74 70 68 73 66 62 76 70 68 72 70 66 73 68 64 76 72 68 77 68 68 74 72 68 73 70 64 75 68 66 77 72 66 79 72 67 71 70 66 72 68 66 74 70 66 69 68 63 70 68 60 66 64 58 71 68 62 70 68 60 70 68 60 71 68 62 70 66 60 70 66 61 67 66 57 67 64 57 69 68 62 71 68 62 64 62 57 65 64 60 72 68 64 66 64 58 70 68 60 68 66 59 68 66 59 72 68 66 69 66 58 70 66 62 70 68 66 68 66 59 69 68 62 69 68 62 70 66 62 66 64 58 66 60 58 70 66 61 67 66 57 71 68 62 67 66 61 65 64 60 72 62 58 66 64 58 71 66 64 68 68 63 68 64 60 69 64 56 67 66 57 71 66 64 63 60 57 65 66 56 66 64 61 66 64 56 63 58 54 63 60 57 63 60 57 63 60 57 64 62 55 64 60 60 64 60 60 64 62 57 65 64 58 66 64 58 70 68 60 66 64 58 70 72 65 67 62 58 66 64 58 64 62 57 64 62 57 68 64 61 66 64 58 68 64 60 70 66 61 68 66 59 71 70 62 66 64 59 71 66 66 64 62 57 66 64 58 63 58 54 66 60 57 67 66 56 68 66 59 73 68 64 73 72 64 71 68 62 71 68 62 70 68 60 71 68 62 71 68 62 74 72 68 77 72 66 76 70 64 67 66 59 189 130 111 219 147 123 212 146 123 149 111 95 68 66 59 71 68 62 70 66 62 73 70 64 70 68 60 71 68 62 71 68 64 71 68 62 66 64 58 69 68 62 71 68 64 72 70 66 65 64 62 82 76 85 83 81 80 63 60 56 68 66 59 69 68 62 64 62 57 70 66 61 71 68 62 70 70 64 71 70 62 76 70 68 73 68 64 75 70 66 73 72 64 76 72 68 77 72 66 71 68 62 76 74 66 73 68 64 76 70 66 76 72 68 74 70 66 76 76 68 80 76 69 74 72 68 76 74 70 76 70 68 78 76 68 82 76 70 92 77 69 143 108 89 120 97 82 176 121 99 176 121 99 173 119 97 190 121 97 186 129 105 182 118 94 170 116 92 181 121 98 184 127 104 184 127 104 181 123 101 151 103 87 86 78 65 78 76 68 80 74 69 86 78 72 86 78 72 83 78 71 86 78 72 89 79 71 87 83 71 75 78 69 83 78 71 82 80 70 80 74 68 78 76 68 76 74 70 82 76 70 84 80 70 81 76 70 241 216 179 235 204 170 233 203 168 227 199 163 233 205 165 235 204 166 235 204 166 235 204 166 236 204 164 229 201 160 228 201 162 231 201 160 230 202 164 228 202 164 228 202 164 228 202 164 230 202 164 229 201 160 228 201 162 161 146 123 71 68 63 71 66 64 71 66 63 73 66 62 71 66 60 68 62 59 68 66 59 69 64 56 70 66 61 71 68 64 71 62 59 71 66 60 69 68 62 69 68 68 70 70 66 70 68 60 70 68 60 71 68 62 70 68 66 68 68 64 69 68 62 71 68 64 69 66 64 71 66 66 69 68 62 70 68 62 66 66 63 68 68 64 71 68 64 66 60 53 69 66 64 67 68 68 70 68 60 70 68 60 70 68 60 66 64 58 69 68 62 67 66 57 69 66 60 71 68 62 69 68 62 68 66 59 69 68 61 69 66 58 67 66 61 71 68 62 68 66 62 73 68 62 68 64 61 71 64 58 66 62 56 70 68 66 73 68 64 70 70 64 72 68 66 73 68 64 70 68 60 71 68 62 75 70 66 73 70 64 73 70 64 71 68 62 69 66 58 68 66 60 69 68 62 73 70 64 75 70 66 73 68 64 75 66 64 70 70 66 70 68 60 68 66 59 68 66 59 73 68 64 74 72 64 68 68 64 70 66 64 70 68 60 71 68 64 69 68 62 67 66 61 70 70 66 68 64 61 67 66 60 67 68 59 73 68 62 71 66 60 68 64 61 69 68 62 67 64 57 68 66 59 64 62 57 71 66 64 63 62 60 66 62 59 68 66 59 70 66 61 68 66 59 69 66 63 63 60 57 66 62 56 66 62 56 64 62 57 64 60 56 65 58 56 65 66 58 68 64 60 70 68 60 66 64 58 67 66 57 68 66 59 68 66 59 68 58 55 63 58 54 64 58 55 64 60 55 63 60 57 61 56 54 61 56 54 67 62 59 68 64 58 66 64 58 66 64 58 62 62 57 62 62 57 64 60 57 64 60 56 63 60 58 63 60 57 63 60 57 64 62 57 63 60 57 63 60 57 64 62 57 63 60 57 63 60 57 64 62 57 66 64 58 61 64 57 66 64 58 67 66 62 63 60 57 66 64 56 64 62 57 65 62 58 66 68 61 64 62 57 71 66 63 67 64 57 68 66 59 63 60 57 64 60 55 64 62 57 66 62 60 67 62 59 68 66 59 68 66 59 66 64 58 70 68 60 68 66 59 66 64 58 71 68 62 70 68 60 70 68 60 68 68 58 63 64 58 68 66 60 63 64 55 165 116 100 215 151 126 216 147 123 68 70 61 70 66 61 71 66 60 68 66 59 64 62 57 64 62 57 66 62 56 68 66 59 65 62 54 64 60 55 70 68 60 64 62 57 66 64 58 72 74 79 80 76 78 60 60 53 64 62 57 66 66 63 67 66 61 71 68 62 64 62 57 66 64 58 69 68 61 68 64 60 70 68 60 71 70 62 71 68 62 68 66 59 70 68 60 70 66 61 69 68 62 71 66 60 75 72 64 75 70 64 77 72 66 75 70 66 77 72 64 74 71 66 76 74 68 74 72 66 76 74 68 82 76 70 100 80 71 131 107 86 127 94 80 173 122 100 181 123 101 172 115 92 194 127 103 187 123 99 182 120 96 170 113 91 182 118 94 184 127 104 182 125 102 182 125 102 150 105 87 74 74 66 76 76 68 78 76 69 80 76 67 81 72 69 78 74 68 81 78 68 80 76 67 78 76 68 78 74 68 79 74 65 81 73 62 71 68 64 76 74 68 78 74 68 80 74 69 76 74 64 82 78 70 243 217 179 231 203 166 235 206 171 235 204 166 235 204 166 235 204 168 235 204 166 236 204 164 235 204 166 229 201 160 230 200 156 228 202 164 232 203 164 232 203 164 228 202 164 228 202 164 229 201 160 228 201 162 229 198 161 158 145 119 69 68 62 73 68 64 73 68 64 71 66 60 70 68 60 71 66 60 69 66 56 70 68 60 75 70 66 71 64 58 70 68 60 73 66 62 71 68 64 67 68 66 75 66 64 70 68 60 70 68 60 71 68 62 67 66 61 70 68 60 71 68 64 69 66 63 69 68 58 71 68 62 70 68 60 66 62 56 66 64 58 69 64 56 70 68 60 64 62 57 64 62 57 67 64 57 68 66 59 70 68 60 73 68 64 70 68 60 70 68 60 66 66 63 64 60 55 65 62 62 66 64 58 64 62 57 66 64 58 66 66 63 69 66 58 67 64 57 67 68 66 66 64 58 68 68 64 67 68 59 69 64 61 70 68 60 70 68 60 70 68 60 73 68 64 71 68 62 71 68 62 76 70 68 71 70 62 73 70 64 66 64 58 70 68 60 70 68 60 75 70 66 72 68 68 68 68 64 71 68 62 75 66 64 70 68 60 70 68 60 70 68 60 70 68 60 71 68 62 68 66 59 71 66 60 75 68 66 65 66 58 69 68 62 68 64 60 67 64 57 72 68 66 68 66 60 64 62 57 71 62 59 68 66 60 66 64 56 69 68 58 64 58 58 68 62 58 69 66 58 64 62 57 66 64 58 64 62 57 64 62 57 62 58 55 63 60 57 66 64 58 66 64 58 67 64 57 64 62 57 64 62 57 62 58 55 61 56 54 61 56 54 62 58 55 63 60 57 63 60 57 64 62 57 68 66 59 66 64 58 68 66 60 70 68 60 67 62 55 67 62 56 68 58 55 69 68 62 62 58 55 60 54 53 63 60 57 64 60 55 65 66 56 68 64 60 66 62 58 61 60 55 62 60 59 64 62 59 60 58 53 64 60 56 64 62 59 68 64 60 65 66 58 62 62 57 63 60 57 66 64 58 63 60 57 62 58 55 58 54 53 63 58 54 61 58 57 61 56 54 58 56 53 62 58 55 63 60 54 63 60 57 63 60 57 63 60 58 63 60 57 63 58 54 62 58 55 66 64 58 64 62 57 64 60 55 62 58 55 66 64 58 64 58 55 65 60 55 64 62 57 67 62 55 64 62 57 66 64 58 66 62 56 63 60 57 66 64 58 67 62 55 67 62 59 68 66 59 66 64 61 65 66 58 58 55 52 133 104 90 227 158 134 117 88 75 65 64 59 68 66 59 67 64 59 64 62 57 63 64 57 66 62 56 68 66 59 67 66 57 68 66 59 64 60 55 68 66 59 62 62 57 63 62 62 76 74 76 59 57 50 68 66 59 68 66 61 71 68 62 68 66 59 64 62 57 68 66 60 66 62 56 66 64 58 62 62 57 69 64 59 70 66 62 64 62 57 70 68 60 70 66 61 65 62 58 71 66 60 68 68 60 68 68 60 66 64 58 64 62 57 70 66 61 71 70 62 71 68 62 70 68 60 71 68 64 79 69 66 94 79 70 131 103 82 139 106 88 173 120 98 181 123 101 172 117 96 184 123 100 186 120 95 182 120 96 180 117 94 187 125 101 188 131 107 182 125 102 186 129 105 146 102 87 73 70 64 74 72 66 76 70 66 78 74 66 73 68 64 77 69 68 72 70 64 73 70 62 76 73 66 73 68 64 71 68 62 79 75 66 74 72 66 76 74 66 76 74 66 77 70 66 75 71 66 75 70 60 243 217 183 230 202 164 235 204 170 235 206 167 236 204 164 235 204 166 235 204 166 235 204 168 235 204 168 228 202 164 228 202 164 228 202 164 228 202 164 228 202 164 228 201 162 228 202 164 230 202 162 228 202 164 220 192 157 157 140 121 67 64 57 66 64 58 75 70 66 68 64 58 70 68 60 70 66 57 70 68 60 71 66 60 75 70 64 68 66 59 64 60 55 66 64 58 66 64 58 67 64 57 64 62 57 66 64 58 66 64 58 71 68 62 68 66 60 64 62 57 63 60 57 68 66 59 71 68 62 73 68 64 73 68 64 73 70 64 68 66 59 70 68 60 71 70 60 73 68 65 71 66 64 68 66 59 64 62 57 68 66 59 66 64 58 68 66 59 66 64 58 64 62 57 71 70 62 66 64 58 71 68 62 71 68 62 69 66 63 68 66 59 66 64 58 64 62 59 64 62 57 66 64 58 64 62 57 70 66 61 64 60 56 65 60 56 66 64 58 66 66 61 66 64 58 63 60 57 63 60 57 66 62 56 67 66 61 68 66 59 68 66 59 68 66 59 71 68 62 73 68 64 69 66 58 68 66 59 71 68 62 68 66 59 68 66 59 68 66 59 66 64 58 64 62 57 66 64 58 68 66 59 68 66 59 68 66 59 69 64 59 69 66 63 71 68 62 69 68 62 63 60 57 67 66 57 71 68 64 71 68 64 71 66 65 65 62 58 66 64 58 65 62 57 65 62 58 64 60 56 66 64 58 70 66 61 67 66 61 64 62 57 63 60 57 65 64 60 67 62 60 66 60 57 64 62 57 64 62 57 62 58 55 63 60 57 64 62 57 63 60 57 63 60 57 63 60 57 62 58 55 62 58 55 64 60 56 62 58 55 64 60 56 62 58 55 62 58 55 63 60 57 64 62 57 63 60 57 63 60 57 64 60 56 62 58 55 66 64 58 64 62 59 63 60 57 64 62 55 62 58 55 62 62 57 60 58 53 62 58 55 61 56 54 62 58 55 61 58 53 62 60 59 62 58 55 60 56 52 63 60 57 61 56 54 58 54 53 60 54 53 58 52 52 62 58 55 61 56 54 54 52 52 61 56 54 61 56 54 63 60 57 58 54 52 58 56 53 63 60 57 66 64 58 63 60 57 63 60 57 65 62 57 62 58 55 62 58 55 65 60 58 66 64 58 63 60 57 63 60 57 64 60 55 62 58 55 63 60 57 63 60 57 63 60 57 65 62 58 64 62 57 63 64 58 63 60 57 66 60 53 64 60 56 64 60 56 49 45 47 169 116 98 212 149 127 57 55 53 65 62 57 61 56 54 63 60 57 64 62 57 63 60 57 66 64 58 64 62 57 63 60 57 60 58 55 67 60 57 61 57 55 87 75 68 77 66 63 54 49 46 62 58 55 68 64 60 66 62 56 63 60 57 64 62 57 62 58 55 64 60 55 64 62 57 64 62 57 63 60 57 67 66 61 66 64 58 70 68 60 66 64 56 70 68 60 66 64 58 67 64 59 64 62 57 66 64 58 63 60 57 63 60 57 69 64 57 70 68 60 70 68 60 71 68 62 69 68 62 100 80 73 146 113 93 143 108 89 167 116 93 181 123 101 170 115 94 190 129 104 182 120 96 181 121 98 183 125 103 188 131 107 186 129 105 181 123 101 186 130 107 139 98 82 72 68 58 76 72 68 75 70 66 76 74 66 73 72 64 75 68 66 73 68 64 74 72 66 75 70 64 71 70 60 73 70 64 74 74 66 76 76 68 73 70 64 68 66 59 74 72 62 75 70 64 96 92 84 241 216 181 229 202 166 229 202 166 218 189 155 235 204 168 235 204 166 235 204 166 235 206 169 235 204 170 228 202 164 228 202 164 228 202 164 228 202 164 228 201 162 228 202 164 228 201 162 229 201 160 228 201 162 229 201 160 155 137 118 75 70 64 69 66 58 67 64 55 66 62 56 66 64 56 67 64 57 64 60 55 64 60 55 65 60 54 66 62 56 65 58 56 70 64 58 64 60 56 68 68 63 68 64 61 64 62 57 64 62 57 67 66 57 67 62 59 64 60 60 69 64 59 66 64 58 72 66 64 68 62 58 64 62 57 66 62 60 71 66 58 68 66 59 69 68 58 70 64 63 64 66 60 66 64 58 64 60 56 63 60 57 63 60 57 64 60 56 63 60 57 63 60 57 64 62 57 63 60 57 64 62 57 67 64 57 66 60 58 66 62 56 62 58 55 63 60 57 63 60 57 62 58 55 63 60 57 60 60 56 63 60 57 65 60 55 66 62 56 66 60 58 66 62 56 68 64 60 64 62 55 63 64 58 65 62 58 66 62 56 70 66 62 64 62 57 65 62 58 66 64 58 68 64 61 67 66 61 64 62 57 63 60 57 71 66 62 68 66 62 69 68 62 69 68 62 70 68 60 66 64 58 66 64 58 69 62 62 67 66 61 65 66 58 69 68 62 68 68 64 69 68 62 67 66 61 64 62 57 69 66 59 71 68 60 69 64 61 66 62 60 66 64 58 65 64 58 64 60 60 64 58 53 65 60 55 71 68 64 66 64 59 65 64 60 64 60 55 64 62 54 64 62 57 68 66 59 66 62 56 64 62 57 63 60 57 61 56 54 60 60 56 61 56 54 64 58 55 62 58 55 66 62 56 63 58 54 62 56 53 62 58 55 61 55 56 63 60 57 64 60 55 63 60 57 64 62 57 65 60 54 63 60 57 60 52 52 59 54 51 61 56 54 60 58 53 57 54 51 60 58 55 58 56 53 60 60 56 57 54 51 58 54 52 62 58 55 57 54 50 59 52 49 61 56 54 57 54 51 61 58 53 58 54 53 58 54 53 60 52 52 58 56 53 60 56 52 62 54 52 56 56 53 64 60 55 63 60 57 59 58 57 58 58 52 59 56 53 63 60 57 64 60 55 64 60 55 59 56 54 62 58 57 61 58 53 60 58 53 61 58 55 63 60 57 59 58 55 62 58 55 68 64 61 65 60 54 62 56 53 60 60 56 63 56 54 61 58 57 62 58 52 64 60 56 63 64 58 65 58 54 63 62 56 61 58 51 73 71 54 87 74 68 162 122 102 84 71 60 64 62 54 62 62 57 66 64 58 67 58 59 64 62 57 62 58 55 62 58 55 84 75 67 101 83 70 131 109 96 161 130 111 159 116 100 228 171 146 56 46 46 60 56 52 60 58 54 67 64 57 63 60 57 61 56 54 60 53 55 61 58 53 63 57 57 60 54 53 65 64 60 65 64 62 61 56 54 64 60 55 61 56 51 63 62 56 59 54 51 61 56 54 64 60 55 64 60 55 64 60 55 68 66 59 68 66 59 70 68 60 73 68 64 71 68 62 58 55 48 154 116 95 146 114 98 143 105 86 175 124 101 182 125 102 162 113 91 188 131 107 183 123 100 183 117 92 182 124 102 184 127 104 182 125 102 181 123 101 186 129 105 136 99 87 76 69 62 76 72 68 74 74 66 73 70 62 73 67 62 70 66 61 65 66 56 67 66 57 74 70 64 73 70 62 67 68 59 70 72 63 67 62 56 69 68 61 66 64 56 72 68 58 71 66 60 85 80 74 241 216 177 233 203 168 229 201 160 223 193 161 235 204 170 234 203 164 234 203 164 235 206 165 235 206 169 232 203 164 228 201 162 228 202 164 228 202 164 228 202 164 228 201 162 228 201 162 228 202 164 228 202 164 228 202 164 153 132 114 71 66 60 66 62 56 63 58 54 61 56 54 63 58 54 67 62 55 67 62 55 61 56 54 66 62 56 65 60 54 66 62 56 64 62 57 64 62 57 62 58 55 64 60 56 62 58 55 63 60 57 62 58 55 60 56 52 60 60 56 63 60 57 61 56 54 62 58 55 63 60 57 64 62 57 64 60 55 63 60 57 66 64 58 66 64 58 64 62 57 63 60 57 64 62 57 63 60 57 63 60 57 62 58 55 62 56 53 62 58 55 63 60 57 63 60 57 63 60 57 64 62 57 66 60 58 64 62 57 64 62 57 67 64 57 64 62 57 62 58 55 62 58 55 64 62 57 64 60 55 63 60 57 63 60 57 68 66 59 67 62 59 64 60 55 63 60 57 61 60 56 66 60 57 64 62 57 67 64 57 67 64 62 63 60 57 63 60 57 64 62 57 65 64 60 68 64 61 66 64 58 64 62 57 68 66 60 64 62 57 66 64 58 66 64 58 70 68 60 68 66 59 68 66 59 68 64 61 66 60 57 66 60 58 65 64 60 70 68 60 69 68 58 64 62 57 63 60 57 64 62 57 70 68 60 67 66 61 68 66 59 68 66 59 65 62 58 64 62 57 65 64 60 68 66 59 60 60 56 64 62 57 66 64 58 63 60 57 66 60 58 64 58 58 64 62 57 61 56 54 62 58 55 64 60 55 64 60 56 68 62 58 63 60 57 63 60 57 61 56 54 64 60 55 64 62 57 61 56 54 63 60 57 62 58 55 63 60 57 62 58 55 62 58 55 61 56 54 66 62 56 62 58 55 60 54 53 59 56 54 58 54 52 61 58 53 58 58 54 63 60 57 58 52 52 56 56 53 59 58 55 58 54 52 61 56 54 61 56 54 63 60 54 63 60 57 59 58 55 57 52 52 57 54 50 58 52 52 57 54 50 58 54 52 57 54 50 54 53 47 54 53 47 58 53 47 60 54 53 60 56 52 57 56 51 56 58 54 60 52 52 59 52 49 61 56 54 64 60 55 64 60 55 62 58 55 64 58 55 62 58 54 64 62 59 62 58 55 64 60 55 63 58 54 65 60 54 64 60 55 62 58 55 63 58 54 65 60 54 61 60 55 56 58 54 62 58 55 61 56 54 85 71 62 144 112 98 137 103 91 208 146 124 119 94 84 146 116 100 54 56 51 62 66 58 68 64 60 63 60 57 64 62 57 63 60 57 66 64 58 59 57 53 119 91 77 178 128 110 215 144 121 111 94 82 118 87 75 93 77 70 62 58 55 59 58 57 62 58 55 63 60 57 61 56 54 63 60 57 64 55 54 60 56 52 64 62 57 63 60 57 63 58 54 63 60 57 61 56 54 62 56 53 60 54 53 64 55 49 58 56 53 60 56 52 61 56 54 64 62 57 68 66 59 66 62 56 66 64 58 69 66 58 64 64 61 133 104 84 154 110 93 141 108 91 145 105 88 166 114 94 178 121 99 163 112 93 184 127 104 182 120 96 182 120 96 181 122 99 181 123 101 182 125 102 184 127 104 185 125 101 133 96 82 78 74 66 73 70 64 76 74 68 73 70 64 69 68 62 66 62 56 70 68 60 70 68 60 67 64 57 70 66 61 71 70 62 72 68 58 67 66 57 66 62 57 70 68 60 73 69 62 73 70 60 97 92 82 241 216 177 235 204 168 223 195 157 225 196 163 233 203 168 235 204 166 235 204 166 235 204 170 235 206 171 229 201 160 230 202 164 230 202 164 230 202 164 228 201 162 228 202 164 230 202 164 232 203 164 229 201 160 228 202 164 151 129 109 63 60 57 64 60 55 63 58 54 61 56 54 60 54 53 61 56 54 63 60 57 64 60 56 64 62 57 63 60 57 63 58 55 64 62 57 63 60 57 61 56 54 65 62 57 65 60 56 61 56 54 61 56 54 60 54 53 62 58 55 63 60 57 64 62 57 63 60 57 63 60 57 63 60 57 66 62 56 63 60 57 63 60 57 63 60 57 67 64 57 62 58 55 66 64 58 66 62 56 66 60 58 60 56 52 61 56 54 60 52 52 60 54 53 61 56 54 60 52 52 61 56 54 63 60 57 62 58 55 64 60 56 63 60 57 63 58 54 63 60 57 62 58 55 64 62 57 64 60 55 62 58 55 61 56 54 64 60 56 64 62 57 66 64 58 68 66 59 66 64 58 65 64 60 66 64 58 64 62 57 64 62 57 64 62 57 67 66 61 68 64 60 68 66 59 64 62 57 66 64 58 68 66 59 66 64 58 65 64 60 64 62 57 67 66 61 68 66 59 66 62 56 68 66 59 63 60 57 64 62 57 66 64 58 66 64 58 66 64 58 63 60 57 63 60 57 63 60 57 64 62 57 63 60 57 68 66 59 66 64 58 64 62 59 69 68 62 68 66 59 63 60 57 63 60 57 66 64 58 63 60 57 70 66 61 62 58 55 62 58 55 63 60 57 63 60 57 66 64 58 63 60 57 66 64 58 70 66 61 68 66 59 62 58 55 61 56 54 65 62 57 66 64 58 60 54 53 61 56 54 62 58 55 63 60 57 62 58 55 62 56 53 62 58 55 61 56 54 58 52 52 61 56 54 57 53 45 57 50 47 58 54 53 56 56 53 57 60 55 58 56 53 59 56 54 59 58 55 57 52 49 58 54 53 58 56 53 60 51 54 55 57 50 59 52 49 64 62 59 59 58 55 60 58 55 55 52 49 53 52 49 55 52 49 59 58 55 62 58 55 56 53 47 59 54 51 59 54 51 59 52 49 59 58 55 58 54 52 62 58 55 62 58 55 62 58 55 63 58 54 60 60 56 64 60 56 63 60 57 63 60 57 60 54 53 63 60 57 63 60 57 63 58 54 65 62 57 64 62 57 61 56 54 63 60 57 61 56 54 60 54 53 58 56 53 63 60 57 59 62 56 72 64 59 110 92 86 143 107 90 115 93 83 117 93 85 104 90 75 69 60 58 59 58 55 62 58 55 62 58 55 60 60 56 61 56 54 63 60 57 63 60 57 65 64 59 100 78 73 136 97 84 111 89 75 163 131 117 115 90 80 60 54 53 60 54 53 60 54 53 58 52 52 62 58 55 64 58 53 64 57 55 63 60 57 62 58 55 64 58 58 60 54 53 62 58 55 58 55 48 59 54 51 60 52 52 62 58 55 62 58 55 60 58 53 66 64 58 68 66 59 71 68 62 71 68 62 76 66 66 71 68 64 72 62 54 197 148 125 164 118 100 143 105 86 148 107 89 167 115 94 180 121 98 167 113 93 182 125 102 182 118 94 182 120 96 182 122 99 184 127 104 181 123 101 181 123 101 184 127 104 130 92 79 71 70 62 71 68 62 70 68 60 71 68 62 69 68 62 71 70 60 73 70 64 66 62 56 66 64 58 73 70 64 71 68 62 71 68 62 71 70 62 70 68 60 74 72 64 75 70 64 69 64 58 95 87 81 241 216 183 235 206 171 226 198 159 217 189 156 235 206 169 235 206 171 235 204 166 235 204 168 237 207 167 228 202 164 228 201 162 228 201 162 231 203 166 228 202 164 228 202 164 228 202 164 228 202 164 228 202 164 230 202 164 146 130 111 66 60 57 71 62 59 64 58 55 63 58 54 60 54 53 63 60 57 61 55 56 63 58 55 62 58 55 61 56 54 64 60 53 60 52 52 62 54 52 60 58 53 61 56 54 61 56 54 62 58 55 61 56 54 61 56 54 56 52 52 61 56 54 60 54 53 64 60 55 64 60 55 63 58 55 64 60 55 61 56 54 64 62 57 61 56 54 63 58 54 62 58 55 61 56 54 64 62 59 65 57 55 69 64 60 63 60 58 64 60 55 62 58 55 63 60 57 63 60 57 63 60 57 66 64 58 65 62 58 64 60 55 64 60 55 64 60 55 64 60 55 62 58 55 66 60 57 61 55 56 63 60 57 63 60 57 61 56 54 62 58 55 63 60 57 63 58 54 65 62 58 62 62 57 65 60 54 64 60 55 63 60 57 63 60 56 66 60 57 64 62 57 66 62 56 63 60 57 63 60 57 64 62 57 63 60 57 68 62 62 71 66 60 70 68 60 70 66 61 68 68 64 64 62 57 64 62 57 64 62 57 63 60 57 66 64 58 64 60 56 63 60 57 67 66 61 66 64 58 70 66 61 66 64 58 70 66 61 62 58 55 66 62 56 65 62 54 68 64 61 68 66 59 64 62 57 66 60 57 66 58 61 64 62 57 64 62 57 63 60 57 63 60 57 64 62 57 63 60 57 64 62 57 63 60 57 63 60 57 63 60 57 59 58 55 64 58 58 60 54 53 61 56 54 61 56 54 61 56 54 56 56 53 61 56 54 62 56 53 63 58 54 60 54 53 62 58 55 61 56 54 61 56 54 61 56 54 60 54 53 60 56 52 61 58 55 58 54 53 61 56 54 59 58 55 62 58 55 56 54 53 60 54 53 62 58 55 56 56 53 60 54 53 64 62 57 62 58 53 62 58 55 57 54 50 56 52 52 56 52 52 58 52 52 61 56 54 58 54 53 56 52 52 55 52 49 60 54 53 58 52 52 58 56 53 58 52 52 57 58 55 63 60 57 64 62 55 63 60 57 62 58 55 60 54 53 62 58 55 65 64 60 62 58 55 64 62 59 62 58 55 58 54 52 64 60 55 62 58 55 63 58 54 63 60 57 59 54 51 59 56 54 59 54 51 63 60 57 63 60 57 62 58 55 61 56 51 63 58 54 70 56 50 107 82 73 81 75 66 65 60 58 60 52 52 62 58 55 61 56 54 61 56 54 63 60 57 57 56 54 61 56 54 60 60 56 59 57 50 54 54 53 58 53 47 63 54 51 54 54 50 58 52 52 58 54 53 59 56 54 60 52 52 56 54 53 58 52 49 62 58 55 61 56 54 62 58 55 61 56 54 61 56 54 61 56 54 63 60 57 62 58 55 62 58 55 63 60 57 63 60 57 64 60 55 67 64 57 69 66 58 67 64 57 71 68 62 71 68 64 60 59 54 178 126 108 181 132 117 166 121 100 156 108 86 160 112 92 175 119 98 178 121 99 174 117 96 182 125 102 183 123 100 182 120 96 182 119 95 178 119 97 178 121 99 181 123 101 184 127 104 119 90 76 69 68 62 70 66 61 70 68 60 70 66 61 67 64 57 66 64 58 71 68 62 66 64 58 64 62 57 71 70 63 71 70 62 68 66 59 65 60 54 66 60 54 66 64 58 66 64 58 73 64 60 97 92 81 243 217 183 235 204 170 229 202 166 229 202 166 233 205 169 235 204 172 236 204 164 236 204 164 236 204 164 228 202 164 228 202 164 231 203 166 232 203 164 233 203 166 232 202 162 230 202 164 232 203 164 232 202 162 232 202 164 149 132 115 70 60 56 64 60 55 61 56 54 63 56 54 62 58 55 60 56 54 61 56 54 60 54 53 60 52 52 63 60 57 64 60 55 62 58 55 64 60 55 62 58 52 61 55 56 62 58 55 65 62 57 66 62 60 58 56 56 62 58 55 67 60 56 63 60 57 63 60 57 63 58 54 60 60 56 62 60 53 63 60 57 64 60 56 63 60 57 63 60 57 64 62 57 67 62 55 65 60 59 64 58 52 66 62 60 63 58 54 60 60 56 61 56 54 63 56 56 61 56 54 61 56 54 63 60 57 64 62 57 61 56 54 60 56 52 63 58 54 63 60 57 63 60 57 63 60 57 60 60 56 64 60 56 62 58 55 60 60 56 63 56 56 64 62 55 67 66 61 64 62 59 69 64 57 66 62 58 64 62 55 64 62 57 64 60 60 64 58 58 63 60 57 64 60 60 63 60 57 67 60 56 62 62 57 66 64 58 71 62 59 66 68 61 70 68 60 70 66 61 68 68 64 66 64 58 70 70 64 66 64 58 66 62 57 67 62 59 64 62 59 66 62 56 66 64 58 63 64 58 66 62 56 64 62 57 68 62 58 63 60 57 63 60 57 64 60 60 67 64 59 64 60 55 63 57 56 67 64 57 68 66 59 63 60 57 64 62 57 67 60 57 62 58 55 63 60 57 62 58 55 63 58 54 63 60 54 64 60 56 65 62 58 68 62 58 63 60 57 63 58 54 63 58 54 64 60 55 60 56 53 61 60 55 61 56 54 59 57 50 64 58 58 61 56 54 62 58 55 63 58 51 58 53 55 60 54 53 56 54 52 60 56 53 58 56 52 56 52 52 56 54 54 56 54 52 60 54 53 57 52 49 63 60 57 58 56 53 63 58 54 57 56 53 63 60 58 58 56 53 58 53 47 58 52 52 60 52 52 61 56 54 58 54 53 58 55 48 59 54 51 58 53 55 58 54 53 61 58 54 58 54 53 58 54 53 58 56 53 59 54 51 58 54 53 61 58 53 61 58 55 60 58 53 62 58 55 62 58 55 57 56 51 57 56 51 63 60 57 62 58 55 62 58 55 63 58 54 63 60 54 59 56 54 58 58 52 57 54 50 61 56 54 59 56 53 60 54 53 59 54 51 61 56 51 54 55 48 61 57 51 55 54 50 52 52 47 56 53 47 58 57 50 63 58 54 60 54 53 60 52 52 61 56 54 62 58 55 57 54 51 60 54 53 58 56 53 57 52 49 56 53 47 56 52 52 58 56 53 56 55 48 59 52 49 56 53 47 61 56 54 59 56 54 60 54 53 56 53 47 58 52 52 57 54 51 55 52 49 56 54 52 56 56 53 60 54 53 59 54 51 60 56 52 62 58 55 63 60 57 64 60 55 65 60 55 66 64 58 65 64 60 69 66 62 58 58 60 67 67 61 88 70 56 220 153 129 178 131 112 174 122 102 158 114 93 159 119 95 181 123 101 178 121 99 175 119 98 182 125 102 185 125 101 182 118 94 183 117 92 175 118 95 178 119 97 181 123 101 188 130 107 94 70 61 68 66 59 74 72 66 71 68 62 70 68 60 66 64 58 66 64 58 67 64 57 66 64 56 66 64 58 65 64 54 72 70 64 70 68 60 68 66 58 64 60 55 63 58 54 63 62 60 67 60 57 94 87 77 241 216 183 235 204 170 223 195 159 224 194 155 232 202 166 235 206 169 236 204 164 235 204 166 235 204 168 228 202 164 229 202 166 233 203 166 232 203 164 232 203 164 230 202 164 230 202 162 228 202 164 229 201 160 229 202 166 144 128 108 63 56 56 63 60 57 60 54 53 60 54 52 63 58 54 63 60 57 65 58 56 62 56 53 62 56 53 64 60 55 63 58 54 63 60 57 62 58 55 58 56 53 58 52 52 59 54 51 60 52 52 63 60 57 62 58 55 60 52 52 63 60 57 61 56 54 61 56 54 63 60 57 63 60 57 62 58 55 62 58 55 62 54 53 59 54 51 62 58 55 62 58 55 62 54 52 62 58 55 62 58 55 61 56 54 64 62 57 61 54 55 66 62 56 62 58 55 63 60 57 64 60 55 63 60 57 65 62 58 65 60 54 62 58 55 65 60 54 63 60 57 63 60 57 64 58 58 69 64 61 64 60 55 63 60 57 64 62 57 64 62 59 63 60 57 63 60 57 62 58 55 64 62 57 63 58 54 61 56 54 63 60 57 63 60 57 63 60 57 63 60 57 64 62 59 64 60 55 64 60 55 64 60 55 65 60 54 68 66 59 68 64 60 68 66 59 64 62 57 68 66 59 66 64 58 65 64 60 62 58 55 62 58 55 63 58 54 63 60 57 67 66 61 66 64 58 64 62 57 70 66 62 66 64 57 67 62 59 64 62 57 64 60 60 66 64 58 66 64 58 68 66 59 64 62 57 63 60 57 68 66 59 71 68 62 66 64 58 68 66 59 64 62 57 66 64 58 66 62 56 61 60 55 63 60 57 64 60 55 63 60 57 68 66 59 62 55 55 64 60 55 63 60 57 64 60 55 63 60 57 63 60 58 63 60 57 63 60 57 62 58 55 63 60 57 64 60 56 65 62 58 60 52 52 60 52 52 63 60 57 63 58 54 61 55 56 62 62 57 56 56 53 63 60 57 60 54 53 58 58 52 63 60 57 63 60 57 58 54 53 58 56 53 59 52 49 54 52 52 58 56 53 58 52 52 60 52 52 58 56 53 61 56 54 60 60 56 61 56 54 61 56 54 60 54 52 61 59 58 56 58 54 59 58 55 58 58 54 57 52 49 60 52 52 59 58 55 59 58 55 62 58 55 62 58 55 57 52 49 57 52 49 60 56 52 59 58 55 59 56 53 60 58 56 63 60 57 62 58 55 63 60 57 60 60 56 61 56 54 58 54 53 58 58 52 59 58 55 60 55 53 60 56 52 61 56 54 58 52 49 60 54 53 56 54 53 59 52 49 57 52 49 58 52 52 60 56 52 57 52 49 58 54 52 61 56 54 56 56 53 58 55 48 58 58 52 57 54 51 56 53 47 56 54 53 56 56 53 56 54 52 58 54 53 57 56 51 58 52 52 58 53 47 60 54 53 57 52 49 59 54 49 61 56 54 59 52 49 60 58 59 56 58 54 59 58 55 61 56 54 60 54 52 63 56 54 63 60 57 64 60 55 66 64 59 66 64 58 94 84 73 121 93 80 200 154 134 146 107 89 184 146 121 222 163 131 133 100 87 183 130 103 168 119 96 172 117 96 178 119 97 181 123 101 181 121 98 181 123 101 185 125 101 181 121 98 176 116 93 178 121 99 181 123 101 181 121 98 192 125 102 74 68 61 70 70 66 71 68 62 73 72 60 71 66 60 67 64 57 63 60 57 66 60 53 64 60 55 66 64 58 69 66 58 64 62 57 68 66 59 67 64 59 70 66 61 67 64 57 65 60 54 67 62 55 95 87 81 243 217 176 232 203 164 225 198 161 224 196 161 232 203 164 235 204 166 233 203 166 236 204 164 235 210 167 228 202 164 230 202 164 230 202 164 236 204 164 230 202 164 230 202 164 228 202 164 230 202 162 228 202 164 230 201 162 147 128 105 62 58 55 62 58 55 60 54 53 58 55 48 61 56 54 62 58 55 64 60 55 62 52 52 60 52 52 59 52 49 62 58 55 61 56 54 62 58 55 61 56 54 60 54 53 60 54 53 63 60 57 61 56 54 58 54 52 63 60 57 64 60 56 60 52 52 60 54 53 61 56 54 63 60 57 58 53 47 60 54 53 60 54 53 61 56 54 63 60 57 64 60 56 64 62 57 64 60 55 64 60 55 63 60 57 63 60 57 64 62 57 63 60 57 66 64 58 63 60 57 62 58 55 66 64 58 64 60 55 62 58 55 63 58 55 66 62 56 62 58 55 63 60 57 62 58 55 64 60 55 61 56 54 61 56 54 63 58 55 64 62 57 66 64 58 64 62 57 63 60 57 62 58 55 63 60 57 63 60 57 63 60 57 63 60 57 66 64 58 64 62 57 64 62 57 63 60 57 64 62 57 68 66 59 64 62 57 64 62 57 63 60 57 62 58 55 64 62 57 63 60 57 64 62 57 63 60 57 64 62 57 63 60 57 65 64 60 63 60 57 66 62 56 63 60 57 64 62 57 66 64 58 64 60 55 64 62 57 63 60 57 63 60 57 63 60 57 64 60 56 62 58 55 62 58 55 63 60 57 64 62 57 63 60 57 64 62 57 66 60 57 64 62 57 66 64 58 63 60 57 60 60 56 63 60 57 62 58 55 64 62 57 64 62 57 64 60 55 64 60 56 64 60 56 63 60 57 66 64 58 62 58 55 63 60 57 64 62 57 68 66 59 64 62 57 61 58 53 61 56 54 62 58 55 60 52 52 60 52 52 59 58 55 63 60 57 63 60 57 63 60 57 60 60 56 58 56 53 62 58 55 63 60 57 63 60 57 61 56 54 59 52 49 58 52 52 58 52 52 58 56 53 56 52 52 59 58 55 61 56 54 59 58 55 58 56 53 63 60 57 56 54 52 56 56 53 65 62 54 60 56 52 58 56 53 59 58 55 59 58 55 62 58 55 56 56 53 61 56 54 62 58 55 63 60 57 54 52 52 58 55 48 61 56 54 63 60 57 60 60 56 63 58 54 63 60 57 63 60 57 64 60 56 59 56 54 62 58 52 58 54 52 57 54 50 58 56 55 61 56 54 63 60 57 59 54 51 55 54 50 59 54 51 63 58 54 59 58 55 58 54 53 60 54 53 58 52 52 59 52 49 57 54 50 58 54 53 56 52 52 58 54 54 58 55 48 58 53 47 59 52 49 60 58 54 57 51 50 55 52 49 55 52 49 57 52 49 58 56 53 56 56 53 59 52 49 57 52 49 54 52 52 58 52 52 56 52 52 54 55 48 60 56 52 56 56 53 58 56 53 58 56 56 60 52 52 60 56 52 63 60 57 62 58 55 63 58 55 81 66 57 110 89 77 118 99 85 144 106 96 133 105 93 177 124 104 98 74 62 195 136 115 172 116 94 182 120 96 182 125 102 187 125 101 179 119 97 181 123 101 189 123 99 182 118 94 177 119 97 181 123 101 178 119 97 181 123 101 197 130 106 74 72 63 70 68 60 68 66 59 70 68 66 67 64 55 65 60 54 66 62 56 64 62 57 69 68 62 69 64 59 69 66 59 67 64 58 64 62 57 67 64 55 67 66 61 69 66 58 68 66 59 69 66 56 91 91 80 241 216 174 232 203 164 230 202 162 224 196 161 235 204 172 235 204 166 233 203 166 235 210 169 235 208 168 228 202 164 231 203 166 231 203 166 234 203 164 234 203 164 234 203 164 230 202 162 228 201 162 229 201 160 232 202 166 142 128 110 65 60 54 63 60 57 60 54 53 60 54 53 58 52 52 61 56 54 60 54 53 60 58 55 62 58 55 61 56 54 62 58 55 62 58 55 61 56 54 61 56 54 60 52 52 61 56 54 65 62 57 62 58 55 63 60 57 62 57 58 63 60 57 62 58 55 66 64 58 68 64 60 64 62 57 63 60 57 61 56 54 62 58 55 61 56 54 61 56 54 63 60 57 63 60 57 62 58 55 62 58 55 64 62 57 63 60 57 63 56 56 61 58 53 62 58 55 61 56 54 64 60 55 64 60 55 61 56 54 61 56 54 62 56 53 63 58 54 62 58 55 62 58 55 64 58 58 60 58 55 64 60 55 62 58 55 63 60 57 63 60 57 64 62 57 63 60 57 66 64 58 63 60 57 64 62 57 64 62 57 63 60 57 66 64 58 64 62 57 65 64 60 65 62 57 66 62 56 66 64 58 64 60 55 62 58 55 63 58 54 63 60 57 64 62 57 62 58 55 61 56 54 66 64 58 64 62 57 63 60 57 64 62 57 64 62 57 64 62 57 63 60 57 63 60 57 64 60 56 64 62 57 63 60 57 62 58 55 63 60 57 64 62 57 64 62 57 62 58 55 63 60 57 63 60 57 63 60 57 64 62 57 64 62 57 68 66 59 63 60 57 63 60 57 68 66 59 63 60 57 61 60 55 64 60 55 64 60 55 63 60 57 64 60 56 64 62 57 63 60 57 63 60 57 60 54 53 62 58 55 63 60 57 63 60 57 64 62 57 66 64 58 64 62 57 64 60 55 62 57 58 61 58 53 62 58 55 62 58 55 64 60 55 62 58 55 62 58 55 61 56 54 63 60 57 60 54 53 62 58 55 60 54 53 61 56 54 61 60 58 61 56 54 58 54 53 56 54 53 58 52 52 61 56 54 57 54 50 58 52 52 53 52 49 58 56 53 58 54 53 60 52 52 56 53 47 60 60 56 62 58 55 62 58 55 61 56 54 61 56 54 61 56 54 59 56 54 58 56 53 61 56 54 62 58 55 58 54 53 60 54 53 58 54 53 62 58 55 63 60 57 61 55 56 62 58 55 60 54 53 61 56 54 59 54 51 61 56 54 63 60 57 61 55 56 62 58 55 62 58 55 61 56 54 60 56 52 57 56 51 59 58 55 61 56 54 60 54 53 58 52 52 59 54 51 52 52 52 60 52 52 56 54 53 55 52 49 58 54 53 59 52 49 60 52 52 63 60 57 61 56 54 58 52 52 52 52 52 53 52 49 59 52 49 56 55 48 58 52 52 60 52 52 55 52 49 53 50 47 59 54 51 57 54 51 62 58 55 59 58 55 63 60 58 62 58 55 60 60 56 62 58 57 62 62 57 61 56 54 63 60 57 64 60 56 63 58 54 66 62 56 68 66 59 90 78 72 96 80 71 76 72 63 127 102 86 86 71 57 188 130 107 168 114 93 182 120 96 181 123 101 182 120 96 181 121 98 181 121 98 181 121 98 181 123 101 177 120 99 181 123 101 175 118 95 182 120 96 190 126 102 67 64 59 71 68 64 66 64 58 69 66 58 64 60 55 66 64 58 67 64 57 64 60 55 68 62 58 64 62 57 64 60 56 63 60 57 61 56 54 64 60 56 64 62 57 64 62 57 67 64 57 67 64 57 86 80 74 239 216 174 230 202 164 225 195 159 219 190 158 233 203 170 235 204 168 235 204 168 235 208 170 235 210 167 231 203 168 228 202 164 228 202 164 235 204 168 233 203 166 235 204 166 234 203 164 233 202 160 234 203 164 239 205 164 122 110 90 59 54 51 62 58 53 60 54 53 61 56 54 60 52 52 61 56 54 59 52 49 60 56 52 61 56 54 61 56 54 58 49 52 59 54 51 60 52 52 58 55 48 57 54 51 61 56 54 62 58 55 62 58 55 64 58 58 63 58 54 63 60 57 64 60 55 63 58 54 61 56 54 62 58 55 61 56 54 64 60 55 67 64 59 63 58 54 63 60 57 62 58 55 63 60 57 60 52 52 60 52 52 60 54 53 62 58 55 64 62 57 64 60 60 67 60 57 66 62 56 64 60 56 64 60 55 64 62 57 60 54 53 59 52 52 60 56 52 64 60 55 62 58 55 62 58 55 63 60 57 64 60 55 63 58 54 64 62 57 64 60 55 62 58 55 62 58 55 63 60 57 61 56 54 61 58 53 62 58 55 64 60 55 63 60 57 64 60 60 64 60 55 64 60 55 64 60 55 66 64 58 63 60 57 68 66 59 64 62 57 62 58 55 63 58 54 62 58 55 62 58 55 62 58 55 63 60 57 59 54 51 64 60 55 63 60 57 64 62 55 61 56 54 67 60 57 63 60 57 62 58 55 61 58 55 61 56 54 64 58 55 64 62 57 64 60 55 64 62 57 63 60 57 64 62 59 64 60 55 64 60 60 65 62 58 64 62 57 64 60 55 64 60 55 63 60 57 64 62 59 59 54 51 62 57 58 63 60 57 63 60 57 63 60 57 64 62 59 62 58 55 62 58 55 60 54 53 61 54 56 59 54 51 62 58 55 64 58 58 64 62 57 63 60 57 61 56 54 61 56 54 62 58 55 64 60 56 61 58 57 64 62 57 62 58 55 64 62 57 61 56 54 63 60 57 63 60 57 62 58 55 63 60 57 62 58 55 60 58 55 57 56 51 60 56 52 58 54 53 60 54 53 60 54 53 61 56 54 61 56 54 62 58 55 61 56 54 58 56 53 58 52 52 56 52 52 63 60 57 62 58 55 60 60 56 59 58 55 62 58 55 58 52 52 55 52 49 56 56 53 59 54 51 56 56 53 59 54 51 62 57 58 60 56 52 61 60 55 61 56 54 63 60 57 62 58 55 64 62 57 61 58 53 63 60 57 61 58 53 62 58 55 63 60 57 60 60 56 61 56 54 63 60 57 56 58 54 55 52 49 60 54 53 63 60 57 62 58 55 63 60 57 59 56 54 61 56 54 56 54 53 55 52 49 54 52 52 59 54 51 60 54 53 60 60 56 60 56 52 58 56 53 57 52 49 59 54 51 60 54 53 57 54 51 55 52 49 57 54 51 55 52 49 61 56 54 58 54 53 59 54 51 58 56 53 60 54 53 62 58 55 59 56 54 60 54 53 60 54 53 61 56 54 62 58 55 61 56 54 60 52 52 61 56 54 63 60 57 63 60 58 66 62 56 70 68 60 66 64 58 68 68 60 71 68 62 87 67 57 178 124 103 152 106 88 181 121 98 183 117 92 181 121 98 181 121 98 185 121 98 183 122 98 178 119 97 181 121 98 181 123 101 181 123 101 178 121 99 182 125 102 59 55 51 67 66 61 70 66 61 68 66 59 67 66 57 69 66 58 70 66 61 66 64 58 63 60 57 62 58 55 68 64 60 66 64 58 67 62 55 63 60 57 67 64 57 69 64 56 63 60 57 69 68 58 82 77 74 243 217 181 235 204 168 215 186 153 209 178 148 233 205 169 235 208 168 235 208 168 235 210 169 235 206 171 236 204 164 232 202 164 236 204 164 234 203 164 235 204 168 230 202 164 230 202 162 236 204 164 230 202 162 238 207 165 118 104 87 57 54 51 59 54 51 59 54 51 58 56 53 61 56 54 62 58 53 62 58 55 62 58 55 65 62 57 64 60 55 66 60 58 64 60 55 62 58 55 67 60 57 61 56 54 63 60 57 63 58 56 61 56 54 60 54 53 62 54 52 60 54 53 62 60 54 62 58 55 63 56 54 63 60 57 63 60 57 64 60 55 62 58 55 65 60 54 64 62 59 66 62 56 64 60 55 63 60 57 62 58 55 61 56 54 62 58 55 60 56 52 62 57 58 64 60 55 64 58 55 63 58 54 60 54 53 62 56 53 63 56 54 61 54 52 61 58 57 61 56 54 61 56 54 59 56 54 63 57 56 67 62 59 63 58 54 64 62 57 66 60 58 64 60 55 64 62 57 63 60 57 63 56 56 64 60 55 63 60 57 65 61 56 67 62 59 66 64 57 65 60 55 65 62 58 64 62 57 66 62 56 63 60 57 63 60 57 64 58 58 66 64 56 64 62 57 63 60 57 64 62 57 64 62 57 63 60 57 63 60 57 63 60 57 64 60 55 64 60 60 64 60 55 61 54 53 64 62 59 59 58 55 61 56 54 64 58 55 64 60 55 63 58 54 63 58 54 63 60 57 63 60 57 62 58 55 65 60 55 65 58 57 63 58 54 63 60 57 63 60 57 64 62 57 65 62 58 62 58 55 63 58 54 61 55 56 63 60 57 66 64 58 62 58 55 64 60 55 61 56 54 64 60 55 62 58 55 61 55 59 64 60 55 59 54 51 62 54 55 63 60 57 63 60 57 62 58 55 64 60 55 60 56 53 59 58 55 65 56 59 62 62 57 61 58 53 64 60 55 64 62 57 62 58 55 61 56 54 64 60 55 64 62 59 64 62 57 62 58 52 64 60 55 63 60 57 60 56 53 63 58 54 62 58 55 61 56 54 61 56 54 63 60 57 59 56 54 60 56 52 64 60 56 64 60 56 57 60 55 63 60 57 59 58 55 63 60 57 60 60 56 58 56 53 61 56 51 60 56 56 61 60 55 63 60 57 64 58 55 59 58 55 62 58 55 58 60 54 61 56 54 61 60 55 63 60 57 64 60 56 63 60 57 64 60 55 62 58 55 63 60 58 64 62 57 60 60 56 63 60 57 61 56 54 56 56 53 57 56 51 63 60 57 63 60 57 64 62 57 63 60 57 60 54 53 60 60 56 60 58 53 58 51 54 55 54 50 57 52 49 58 54 53 57 56 51 58 54 54 57 54 51 54 53 47 57 54 50 58 52 52 59 54 51 57 52 49 56 54 52 58 55 48 58 54 53 63 60 57 62 62 57 60 54 53 58 56 52 61 55 56 62 58 55 63 60 54 60 54 53 64 60 55 60 60 57 62 58 52 58 52 52 57 52 52 61 58 53 64 62 57 66 60 57 63 60 57 68 66 59 67 66 59 67 64 57 95 78 64 173 122 100 164 113 93 182 120 96 182 120 96 183 117 92 182 125 102 181 123 101 185 121 98 181 121 98 174 118 96 181 121 98 178 119 97 181 123 101 181 123 100 60 60 55 72 70 66 70 66 61 70 68 60 67 64 59 70 68 60 63 60 54 64 60 55 64 62 55 61 58 53 67 62 59 66 64 58 62 54 52 63 62 56 70 62 56 66 64 56 63 60 57 73 68 62 79 70 62 243 217 183 233 205 167 223 195 158 202 172 142 231 207 166 235 206 169 235 204 168 235 204 172 235 204 168 235 204 168 230 202 164 233 203 166 235 204 166 232 202 164 230 202 162 232 203 164 234 203 164 229 201 160 235 207 165 128 108 92 68 59 54 51 49 46 48 42 41 63 58 55 64 60 56 67 66 60 64 62 57 63 60 57 63 60 57 63 60 57 64 62 57 60 52 52 62 58 55 62 56 53 60 54 53 59 52 49 59 52 49 61 56 54 60 54 53 63 58 55 62 58 55 62 58 55 63 58 54 61 56 54 61 56 54 59 54 51 58 56 53 60 52 52 60 54 53 63 60 57 64 60 55 63 60 57 64 62 57 63 60 57 63 60 57 63 60 57 60 52 52 60 52 52 63 58 54 61 56 54 61 55 56 61 56 54 64 60 55 59 52 49 60 54 53 60 54 53 61 56 54 61 56 54 67 62 59 65 62 58 60 54 53 60 52 52 60 52 52 64 60 55 63 60 57 62 58 55 62 58 55 62 54 52 62 58 55 64 62 57 63 60 57 66 62 56 64 60 55 62 58 55 64 58 58 63 60 57 64 62 57 63 60 57 61 58 53 62 58 55 61 56 54 63 60 57 64 60 55 63 60 57 63 60 57 63 60 57 62 58 55 63 60 57 63 60 57 65 64 60 62 58 55 64 62 57 63 60 57 63 60 57 63 58 54 63 60 57 62 58 55 66 64 58 66 64 56 63 60 57 62 58 55 64 62 57 66 64 58 67 64 57 62 58 55 64 62 57 63 60 57 63 60 57 63 60 57 61 56 54 64 60 60 64 60 55 63 60 57 63 60 57 63 60 57 63 60 57 61 56 54 62 58 55 63 58 54 63 60 57 63 60 57 62 58 55 64 60 56 62 58 55 63 60 57 63 60 57 62 56 53 60 54 53 61 56 54 63 60 57 62 62 57 63 60 57 62 58 55 62 58 55 64 62 59 60 54 53 63 60 57 64 62 57 63 60 57 59 58 55 64 60 56 63 60 57 61 56 54 62 58 55 58 54 53 61 56 54 63 60 57 58 54 53 60 54 53 61 56 54 57 58 55 58 56 53 63 60 57 63 60 57 62 62 57 59 58 55 64 62 57 63 60 57 63 60 57 59 58 55 56 56 53 62 58 55 63 60 57 62 58 55 62 58 55 63 60 57 64 60 55 63 60 57 64 60 55 63 60 57 63 60 57 63 60 57 63 60 57 63 60 57 66 64 58 63 60 57 62 58 55 63 60 57 60 60 56 62 58 55 62 58 55 59 52 49 64 60 56 62 58 55 60 54 53 62 58 55 66 64 61 64 60 56 64 62 57 59 58 55 58 52 52 56 53 47 57 54 50 60 52 52 56 54 52 56 54 52 59 52 49 56 52 52 52 52 52 55 50 47 56 52 52 58 49 49 61 56 54 63 60 57 61 56 54 62 58 55 61 58 53 62 58 55 61 56 54 60 54 53 60 52 52 63 58 54 62 58 55 62 58 55 60 56 52 60 54 53 63 60 57 63 60 57 66 64 58 67 66 61 68 66 59 65 64 60 96 87 76 175 119 98 181 123 101 181 121 98 182 120 96 182 120 96 181 121 98 182 120 96 179 118 95 172 117 96 168 113 92 181 121 98 182 120 96 181 121 98 177 119 97 61 60 56 69 68 62 71 68 62 66 64 58 68 66 59 65 62 55 61 56 54 64 60 56 66 62 60 64 62 57 66 62 56 68 66 59 67 66 57 67 62 55 70 68 60 52 48 49 94 85 78 127 116 103 160 145 124 239 210 171 233 203 168 231 203 166 229 202 166 235 204 172 235 208 168 235 204 168 235 204 168 235 204 168 235 204 172 233 203 166 229 202 166 236 204 164 233 203 166 233 203 166 236 204 164 232 203 164 229 198 161 230 202 162 238 209 172 243 211 181 230 203 176 182 166 143 82 77 70 57 53 46 66 62 53 65 58 56 64 58 53 60 52 52 62 58 55 65 58 54 60 56 52 61 56 54 61 56 54 63 58 54 60 60 56 60 54 53 61 56 54 65 60 58 58 56 53 58 56 53 58 54 52 62 54 53 59 54 51 60 58 55 62 56 53 60 54 53 61 56 54 59 54 51 60 56 52 60 52 52 61 56 54 62 58 55 62 58 55 61 56 54 63 60 57 54 53 47 57 52 49 58 52 49 61 55 56 59 54 51 58 49 49 58 54 53 60 56 52 60 54 53 62 56 53 61 56 54 58 56 53 60 54 52 60 58 54 62 58 55 63 60 57 61 56 54 64 60 55 62 58 55 64 62 57 62 58 55 61 60 55 64 60 55 62 62 57 67 64 57 64 62 57 64 60 55 65 60 54 60 60 56 66 64 58 64 60 60 63 58 54 66 60 57 66 62 60 67 68 61 61 58 53 63 60 57 63 60 57 63 60 57 64 60 55 66 60 56 60 60 56 63 60 57 64 62 57 64 62 57 66 62 60 66 64 58 66 64 58 66 62 56 64 62 57 63 60 57 62 58 55 69 65 61 68 64 60 63 64 58 66 64 58 66 60 57 67 66 61 66 62 56 64 62 59 66 62 56 63 64 58 63 60 57 64 58 58 63 64 58 62 58 55 63 60 57 65 60 55 63 60 57 62 58 55 65 60 54 64 60 55 61 58 58 64 60 55 67 60 56 63 64 60 62 60 54 65 60 54 62 58 55 61 56 54 61 56 54 64 60 55 65 60 55 65 62 54 67 64 63 66 64 58 65 60 54 67 66 57 64 60 56 63 60 57 66 62 56 63 60 57 64 60 55 61 56 54 64 60 56 62 58 55 64 58 53 62 62 57 62 54 52 60 56 52 62 58 55 66 62 56 66 62 56 64 60 56 62 60 53 63 60 57 66 60 57 64 60 55 63 60 57 60 54 53 62 58 55 62 58 55 63 60 57 64 62 57 63 60 57 63 60 57 65 64 60 65 60 54 63 60 57 63 60 57 68 66 59 64 62 57 66 64 57 65 60 54 63 60 57 66 62 56 63 60 57 64 62 57 70 68 60 66 66 63 64 62 57 64 60 56 64 62 57 63 60 57 61 56 54 60 54 53 61 56 54 65 60 54 62 58 55 63 60 57 62 58 55 61 56 54 58 54 52 58 54 53 60 54 53 58 56 53 62 58 55 56 58 54 64 60 55 60 54 53 52 52 52 57 52 49 55 54 50 55 54 50 60 54 53 58 56 53 57 56 51 60 56 52 61 56 54 59 58 55 61 55 56 63 60 57 62 58 55 63 60 57 63 58 54 63 60 57 63 60 57 59 56 54 60 54 53 64 58 58 64 62 57 64 62 57 64 62 57 68 66 59 64 62 57 63 60 57 120 90 74 175 119 98 178 121 99 181 123 101 181 121 98 175 118 95 178 123 101 189 123 99 172 117 96 176 116 93 170 113 92 182 120 96 179 118 95 175 118 95 165 121 98 59 60 62 69 68 62 66 64 58 64 62 57 69 68 61 65 60 54 65 60 54 63 60 57 67 64 57 66 64 56 70 66 61 73 66 62 67 64 57 54 49 43 107 90 76 220 195 158 243 217 177 238 208 167 237 203 169 236 204 164 235 204 168 235 204 168 235 206 169 235 204 168 235 204 168 235 204 168 235 206 171 235 208 168 231 203 168 231 203 166 231 203 166 235 204 166 233 203 166 233 203 166 236 204 164 236 204 164 234 203 164 229 201 160 231 201 160 232 202 164 232 202 162 229 201 160 240 212 170 183 161 135 63 54 48 64 60 55 67 60 57 64 60 56 58 54 52 61 54 51 61 56 54 62 58 55 63 60 57 62 58 55 63 60 57 58 54 53 58 52 52 60 54 53 59 58 55 56 54 53 57 52 49 60 54 53 57 54 50 60 54 53 60 56 52 59 52 49 60 54 53 60 52 52 59 52 49 59 54 51 58 52 52 62 58 55 62 58 55 61 56 54 60 54 53 60 52 52 60 54 53 60 52 52 60 54 53 60 54 53 62 58 55 63 58 54 61 56 54 63 60 57 61 56 54 62 58 55 62 58 55 58 52 52 62 58 55 63 60 57 63 60 57 63 60 57 66 62 56 66 64 58 63 60 57 63 60 57 65 62 59 65 60 54 67 64 59 64 60 55 63 60 57 66 64 58 66 64 61 67 62 61 67 64 58 68 66 59 66 62 56 66 66 57 64 60 60 63 60 57 63 60 57 64 62 57 68 64 63 68 66 59 63 60 57 64 62 57 63 60 57 62 58 55 68 66 59 66 64 58 63 60 57 66 64 58 70 68 60 66 64 58 66 64 58 68 64 61 63 60 57 70 64 64 68 66 59 66 64 58 68 66 59 70 68 60 66 64 58 71 68 62 67 66 61 67 66 61 64 62 57 64 62 57 68 66 59 64 62 57 68 66 59 64 62 57 63 60 57 63 60 57 63 60 57 64 60 55 63 58 54 66 64 58 65 62 58 66 64 58 63 60 57 64 60 55 63 58 54 63 60 57 66 64 58 63 60 57 63 58 54 66 62 56 65 60 54 65 62 54 66 62 56 66 64 56 67 64 57 66 62 56 64 60 55 63 60 57 64 60 55 65 60 54 67 64 55 61 58 53 61 56 54 59 54 51 66 62 56 67 64 58 63 60 57 63 60 57 65 60 54 66 64 58 64 62 57 66 62 56 63 60 57 64 58 55 64 60 55 63 62 56 64 60 55 64 60 56 63 60 57 67 64 59 64 62 57 66 62 56 63 60 57 64 62 59 63 62 56 64 60 55 64 60 55 67 62 55 62 62 57 67 64 57 65 64 60 62 56 53 64 60 55 63 60 57 66 64 58 64 62 57 67 66 61 66 62 56 65 64 60 69 66 64 65 62 58 63 60 57 62 58 55 62 58 55 64 60 55 60 60 56 62 58 55 61 56 51 61 56 54 58 54 53 59 52 49 58 54 53 58 54 52 56 52 52 56 52 52 56 54 52 58 54 52 58 52 52 60 56 52 58 54 53 61 58 53 59 57 50 62 58 55 61 55 56 61 58 53 63 60 57 62 58 55 61 58 57 62 62 57 63 60 57 63 60 57 62 58 55 65 64 60 63 60 57 62 62 57 59 58 55 63 56 56 63 60 57 64 60 53 64 60 55 63 60 57 66 64 58 63 58 55 118 88 79 171 116 92 178 121 99 181 123 101 181 123 101 181 121 98 185 125 101 185 124 99 182 120 96 175 118 95 171 116 94 181 121 98 168 114 90 169 116 95 158 113 90 63 62 63 68 68 64 71 70 62 70 68 60 70 68 60 68 64 61 69 68 62 67 64 57 63 60 57 71 68 62 70 68 60 71 66 60 66 59 52 196 178 149 235 215 178 234 205 163 238 203 167 237 205 168 235 206 167 235 208 168 235 206 167 235 206 169 236 204 164 235 204 170 235 208 166 235 208 170 235 206 167 235 208 168 228 202 164 230 202 164 234 203 164 235 204 168 233 203 166 235 204 168 235 204 170 236 204 164 232 202 162 232 202 162 233 203 166 234 203 164 232 202 164 229 201 160 229 201 160 230 202 164 214 197 167 66 57 51 59 56 54 64 58 58 62 54 52 60 54 53 61 56 54 60 54 53 60 52 52 60 52 52 58 53 47 62 58 55 62 58 55 60 54 53 62 58 55 60 54 53 61 56 54 63 60 57 62 58 55 62 58 55 63 58 54 62 58 55 60 52 52 62 58 55 63 60 57 62 58 55 62 58 55 64 62 57 63 60 57 64 60 56 60 52 52 61 56 54 60 56 53 60 54 53 61 56 54 61 56 54 60 54 53 61 56 54 60 54 53 61 56 54 64 58 55 62 58 55 60 52 52 61 56 54 63 60 57 61 56 54 62 58 55 62 58 55 62 56 53 63 60 57 63 60 57 62 58 55 67 58 58 63 60 57 62 58 55 62 58 55 63 60 57 64 62 57 63 60 57 66 58 55 68 64 61 64 62 57 66 64 58 70 66 61 68 66 59 71 66 60 66 62 56 63 60 57 63 60 57 65 60 54 66 64 58 62 62 57 66 62 56 64 62 57 68 66 59 66 64 58 63 60 57 63 60 57 62 58 55 64 62 57 64 60 55 69 66 58 66 64 58 67 64 59 66 64 58 64 62 57 66 64 58 69 66 58 71 68 62 71 68 62 68 66 59 67 66 61 64 62 57 66 64 58 68 66 59 67 62 59 66 64 58 66 64 58 66 64 58 66 64 58 68 66 59 70 66 61 67 64 57 62 58 52 68 60 60 62 58 55 64 60 55 64 62 57 63 60 57 66 64 58 71 66 60 67 64 57 70 68 60 68 62 54 68 62 54 69 66 59 63 60 57 64 60 60 64 62 55 64 62 55 66 62 56 64 62 57 66 60 53 64 60 55 63 58 54 65 64 60 67 66 62 66 64 58 69 64 60 70 68 60 64 62 57 67 64 57 65 62 58 66 64 58 67 64 55 65 60 54 61 56 54 61 60 56 64 60 55 65 60 54 65 60 54 63 60 57 64 62 59 65 62 58 65 62 55 69 66 58 64 62 57 64 60 55 64 62 57 64 60 55 63 60 57 67 62 55 64 62 55 67 62 55 64 62 57 65 60 54 64 60 55 64 60 55 64 60 55 66 62 56 64 60 55 63 60 57 63 60 57 65 62 57 64 62 57 62 58 55 60 54 53 59 56 54 58 60 54 63 60 57 62 58 55 65 62 57 63 58 54 60 60 56 61 56 54 62 56 53 62 58 55 59 58 55 58 52 52 56 52 52 58 52 52 61 56 54 62 58 55 59 58 55 60 58 53 59 58 55 61 56 54 61 56 54 60 60 56 62 58 55 62 58 55 57 60 53 64 60 60 62 58 55 63 60 57 62 58 55 66 64 58 64 60 55 64 58 53 63 58 54 61 60 55 66 64 58 69 68 62 63 60 57 66 64 58 64 62 57 59 58 55 128 96 81 169 116 95 175 118 95 181 123 101 181 123 101 182 125 102 182 123 100 181 121 98 181 121 98 176 119 97 177 116 93 172 117 96 169 116 95 169 116 95 155 109 89 62 62 57 69 68 62 70 68 60 68 66 59 71 66 60 67 66 59 68 64 60 68 66 60 69 68 62 70 66 62 71 68 62 64 51 45 227 213 185 235 206 169 235 204 172 235 208 168 235 206 165 235 208 166 235 204 168 235 208 170 235 206 167 237 203 169 235 204 168 235 206 167 235 204 170 235 206 165 235 204 168 235 206 169 228 202 164 232 203 164 232 203 164 236 204 164 236 204 164 233 203 168 236 204 164 232 203 164 231 203 166 236 204 164 232 202 162 234 203 164 230 202 162 228 202 164 228 202 164 232 203 164 228 202 164 200 184 151 48 46 42 63 58 54 61 56 54 62 58 55 60 54 53 64 60 55 62 56 53 62 54 53 62 58 55 61 56 54 62 56 53 62 58 55 63 60 57 63 58 55 63 60 57 66 62 56 63 58 54 60 54 53 61 58 53 61 56 54 63 60 57 63 60 57 63 60 57 62 58 55 63 60 57 61 56 54 62 58 55 63 60 57 62 58 55 60 54 53 59 52 49 58 56 53 60 54 53 60 54 53 60 52 52 61 56 54 61 56 54 60 52 52 60 54 53 60 54 53 60 54 53 62 58 55 63 60 57 64 60 56 63 60 57 63 58 54 62 56 53 62 56 53 65 62 57 63 60 57 61 58 53 64 62 57 68 66 59 64 60 56 64 58 58 68 62 62 63 60 57 63 60 57 68 66 59 70 68 60 68 66 59 69 68 61 69 66 58 70 66 61 66 64 58 66 62 56 66 62 56 64 62 57 70 68 60 66 64 58 68 66 59 73 68 64 70 66 61 66 64 58 65 62 59 64 62 57 64 62 57 65 62 55 66 62 60 71 66 63 68 66 59 68 66 59 69 68 62 70 68 60 67 64 62 69 68 62 71 70 60 70 66 61 70 68 60 67 66 61 67 66 61 66 64 58 66 64 58 68 66 59 68 66 59 68 66 59 66 64 58 68 66 59 64 62 57 64 62 57 66 64 58 65 60 54 63 60 57 60 60 56 63 60 57 68 62 58 63 60 57 64 62 57 69 66 58 69 66 58 67 64 57 63 60 57 64 62 57 71 64 58 68 66 59 67 68 59 70 68 60 68 66 59 69 66 57 66 64 58 66 62 56 66 62 56 68 66 59 70 68 60 70 68 60 67 66 57 69 66 60 70 68 60 66 64 58 69 68 61 66 64 58 66 64 58 68 66 59 62 58 55 65 62 54 64 60 55 63 60 57 65 60 54 65 60 54 66 64 58 66 64 58 69 64 56 66 62 56 69 64 59 68 66 59 63 58 54 63 64 58 68 62 58 70 68 60 67 64 57 68 66 59 67 62 55 67 64 57 66 64 58 67 64 57 62 58 52 63 58 54 65 60 54 67 64 57 66 62 56 63 60 57 65 62 54 67 64 57 66 64 58 66 64 58 66 64 58 67 62 55 67 66 57 65 62 54 69 68 58 66 64 56 64 62 57 64 60 56 62 58 55 63 60 57 62 58 55 61 56 54 59 56 54 63 60 57 62 58 55 63 60 57 64 58 58 62 58 55 63 60 57 64 62 57 61 56 54 57 54 50 56 54 53 63 60 57 59 58 55 58 54 53 62 58 55 62 58 55 63 60 57 66 62 56 64 60 55 63 58 54 67 64 57 66 64 58 67 66 57 69 68 58 68 66 59 67 64 57 70 68 60 58 60 53 153 111 93 159 119 95 167 118 97 181 123 101 178 121 99 179 123 101 178 121 99 189 134 113 181 123 101 168 116 92 176 117 95 174 117 96 168 114 93 171 112 90 147 105 87 70 66 62 71 70 60 73 70 64 71 68 62 67 66 61 73 68 64 68 66 59 68 66 59 67 66 57 69 66 56 50 45 41 208 196 163 235 206 167 231 203 166 233 203 166 235 206 165 235 210 169 235 204 168 235 204 166 235 208 168 235 204 168 235 206 167 235 204 166 235 206 167 235 206 169 235 208 168 235 206 169 235 204 170 236 204 164 232 203 164 230 202 164 230 202 164 233 203 166 232 203 164 235 204 168 232 203 164 233 203 166 234 203 164 232 203 164 234 203 164 235 204 168 228 202 164 230 202 162 228 202 164 228 201 162 235 209 174 119 100 90 62 58 53 63 60 57 64 60 55 64 60 55 66 62 56 68 62 58 67 62 55 67 60 56 64 60 55 64 60 55 64 60 55 63 60 57 62 58 55 61 56 54 61 56 54 64 60 55 62 58 55 59 54 53 61 56 54 62 58 55 62 58 55 63 60 57 63 60 57 63 60 57 63 60 57 62 58 55 66 62 56 63 60 57 62 58 53 58 56 52 59 56 54 62 58 55 63 58 54 65 62 57 63 58 54 63 60 57 62 58 55 60 56 53 64 62 57 63 60 57 65 62 58 64 62 57 66 62 56 64 62 57 65 64 60 67 62 57 67 62 57 66 64 58 65 64 60 66 62 58 66 64 57 67 66 59 66 64 58 71 64 62 70 66 62 66 64 58 64 62 57 64 62 57 70 68 60 68 66 59 67 64 57 65 60 54 67 62 55 70 68 60 64 62 57 68 66 59 68 66 59 70 68 60 68 66 59 66 64 58 69 64 56 66 64 58 70 68 60 68 66 59 71 68 64 73 68 64 69 68 62 70 68 60 70 68 60 70 68 60 69 66 60 68 66 62 69 68 62 68 66 59 73 68 64 71 68 62 70 68 60 70 68 60 71 68 62 70 68 60 70 68 60 68 66 59 70 68 60 70 68 60 69 64 59 66 64 58 70 68 60 68 66 59 70 68 60 67 60 56 67 60 56 69 66 60 63 60 57 65 64 58 68 62 58 65 62 58 65 64 60 67 62 55 64 60 55 65 60 54 64 60 55 66 58 53 67 64 57 71 68 62 71 70 62 70 68 60 67 66 55 68 68 60 70 68 60 71 68 62 64 62 57 73 70 64 70 68 60 73 70 64 71 68 62 67 66 57 69 68 56 66 64 58 70 68 60 68 66 59 71 66 60 70 68 60 70 66 61 66 64 58 73 66 62 68 66 59 70 70 62 67 64 55 66 64 58 70 68 60 71 66 60 66 62 56 70 68 60 64 62 57 64 60 55 63 62 55 68 66 59 68 62 54 70 68 60 66 66 63 67 64 57 70 68 60 67 66 57 67 66 57 67 62 59 66 64 56 67 64 57 67 66 57 66 64 58 68 66 59 68 66 59 68 66 59 70 68 60 68 66 59 70 68 60 67 60 56 68 66 59 65 60 54 69 66 58 65 64 60 63 60 57 63 60 57 62 62 57 64 62 57 63 58 54 63 60 57 63 60 57 64 62 57 63 60 57 64 62 57 63 64 58 64 62 59 64 62 57 66 64 58 63 60 57 63 60 57 59 58 55 63 60 57 63 60 57 63 60 57 70 68 60 66 64 58 66 64 58 63 60 57 70 68 60 68 66 59 70 66 61 70 68 60 68 66 59 69 68 58 69 66 58 68 66 59 68 66 59 58 60 57 151 113 94 169 116 95 168 126 107 178 121 99 175 119 98 181 123 101 178 121 99 185 124 99 175 119 98 168 116 92 177 119 97 168 114 93 172 116 94 168 114 93 150 102 89 71 68 62 71 70 60 66 64 58 70 68 60 69 66 59 67 62 59 69 68 62 69 66 58 73 72 60 68 64 58 126 116 101 237 210 176 235 208 168 235 204 170 236 204 164 235 204 166 235 206 169 233 203 166 236 204 164 235 204 168 235 204 168 235 204 166 235 206 171 235 204 172 235 204 168 235 206 167 235 206 169 235 206 171 230 200 156 229 198 161 228 201 162 229 201 160 231 203 166 234 200 164 232 203 164 234 203 164 230 202 164 232 202 162 232 202 164 234 203 162 234 203 164 232 202 164 234 203 164 232 203 164 229 201 160 230 202 164 217 192 159 50 47 40 64 60 55 66 58 53 63 60 57 64 58 53 63 56 54 64 60 55 66 62 56 63 58 54 67 62 55 64 58 58 63 60 57 64 60 55 66 58 53 65 60 54 62 58 55 62 56 53 62 56 52 60 52 52 65 60 54 66 62 56 66 62 56 65 60 51 64 62 57 63 60 57 69 64 59 66 58 53 64 62 55 63 60 57 66 60 53 66 62 56 63 58 54 63 58 54 62 58 55 64 60 56 64 58 53 67 60 55 62 56 53 60 56 52 64 54 52 66 58 53 65 60 54 64 60 55 63 60 57 67 62 55 68 62 59 66 62 53 66 64 58 66 64 58 67 64 57 68 64 61 67 66 61 73 66 62 70 64 64 73 68 64 70 66 62 68 66 59 66 64 58 70 66 61 69 68 58 71 66 58 73 66 62 73 66 62 71 68 62 70 66 61 71 64 58 71 68 62 69 66 58 71 68 62 70 68 60 70 68 60 67 62 55 69 64 59 68 64 61 73 66 62 70 68 60 69 64 58 70 68 60 71 66 60 70 68 60 70 68 60 75 70 64 71 68 62 73 68 64 69 64 57 74 68 60 71 68 62 70 68 60 71 64 57 72 70 60 71 68 62 70 68 60 70 68 60 65 60 54 66 62 56 69 64 58 69 64 59 71 64 58 70 64 56 65 60 54 63 58 54 71 68 62 71 66 60 69 68 62 69 62 57 69 62 57 63 60 57 66 60 53 67 62 55 66 64 58 69 64 56 70 66 56 70 62 56 70 68 60 66 64 58 67 66 57 69 68 62 72 70 64 68 66 59 71 68 62 69 68 62 75 68 66 71 68 63 71 68 62 71 68 62 71 68 60 68 66 59 71 68 62 71 68 62 70 68 60 75 70 66 71 68 62 76 72 66 71 68 62 70 70 64 73 70 64 71 68 64 71 68 62 72 72 64 76 70 68 73 68 62 69 68 62 69 66 58 68 66 59 69 68 62 67 68 59 69 68 62 69 68 62 68 66 60 73 70 62 69 68 62 70 68 60 71 66 60 70 68 60 67 68 59 73 70 64 71 70 60 69 66 58 68 66 59 68 66 59 69 68 62 70 68 60 70 68 60 70 68 60 71 68 62 72 70 64 71 66 60 68 66 59 66 62 56 70 68 60 68 66 59 64 60 55 64 60 55 63 60 57 64 62 59 64 60 55 65 64 56 64 62 57 68 66 59 64 62 57 64 60 60 64 62 55 63 60 57 62 58 55 61 60 56 62 62 57 63 58 55 63 60 57 60 60 56 63 60 57 63 60 57 66 62 60 64 62 57 70 68 60 69 68 62 69 64 56 69 64 57 68 66 59 64 62 55 66 64 58 69 66 58 69 66 56 68 66 59 51 54 52 160 119 100 169 116 95 156 109 92 172 117 96 178 121 99 184 127 104 175 118 95 179 118 95 172 116 94 172 116 94 179 120 98 168 114 90 168 114 87 172 117 96 124 93 76 69 66 64 69 68 62 70 68 60 69 68 56 68 64 61 67 64 57 69 68 62 71 70 60 70 68 62 56 50 43 223 215 185 235 204 166 235 204 168 235 204 168 235 204 168 236 204 164 235 204 166 235 204 168 235 204 170 235 204 166 235 206 167 235 204 168 235 206 167 235 206 167 235 204 168 235 208 170 235 208 168 235 206 167 228 202 164 229 200 158 228 201 162 236 201 168 233 202 160 233 202 160 232 203 164 232 203 164 232 203 164 234 203 164 236 204 164 232 203 164 233 203 166 231 201 160 236 204 164 232 203 164 230 202 162 231 201 160 235 211 170 63 49 46 69 64 57 64 60 55 65 60 55 67 64 57 69 62 55 69 64 59 64 60 56 69 64 56 68 66 59 68 66 59 66 60 53 67 62 55 64 58 53 63 58 55 68 60 52 68 60 52 63 60 57 69 64 56 66 64 58 67 62 55 64 60 55 68 58 55 69 64 56 66 58 53 64 62 57 71 66 60 69 66 58 67 64 56 64 62 57 69 62 57 66 64 58 66 60 54 65 60 54 66 62 53 64 60 55 64 60 55 65 60 54 64 62 57 67 62 55 65 60 54 64 55 55 67 59 51 68 60 52 67 64 57 72 64 58 71 66 60 68 66 59 68 66 59 69 66 58 66 62 56 70 68 60 70 68 60 72 66 64 70 66 62 71 66 60 70 68 60 73 68 64 73 70 62 71 68 62 72 66 60 78 72 66 76 70 68 77 68 68 73 70 62 71 70 62 73 70 62 73 72 62 76 72 68 75 68 66 73 68 64 70 68 60 73 70 62 71 68 64 71 68 64 71 66 60 68 66 59 70 68 60 71 68 62 70 68 60 70 68 60 73 68 64 75 68 66 73 68 64 73 66 66 71 68 64 71 66 58 73 68 60 73 68 62 71 66 60 70 68 60 69 66 58 69 66 58 67 60 61 68 66 59 71 66 60 71 68 60 67 64 57 71 64 61 69 62 57 69 62 60 70 68 60 73 68 64 71 68 62 71 66 64 72 62 58 69 66 58 68 66 59 70 62 56 70 68 60 67 60 57 69 64 57 68 68 59 68 68 60 71 68 60 65 66 58 69 68 62 69 66 58 70 68 60 71 70 60 70 68 60 70 68 60 74 72 62 75 70 64 75 70 62 74 73 62 75 68 66 74 68 62 80 72 62 77 69 64 73 70 62 73 70 64 73 72 64 78 70 60 71 68 58 71 68 62 76 74 62 76 72 64 75 70 60 76 72 64 71 66 58 69 68 58 71 70 58 70 68 58 71 68 60 76 74 66 72 72 60 71 70 62 72 70 64 76 74 64 76 76 64 80 76 67 74 74 62 69 68 58 75 70 64 76 70 62 76 72 64 73 72 64 74 72 64 71 68 64 72 72 62 73 70 62 73 68 64 75 68 66 73 68 60 73 70 64 71 66 60 68 62 58 68 68 60 67 66 59 69 68 58 69 68 58 71 66 58 68 66 59 66 64 56 67 64 55 67 66 57 71 68 59 64 64 54 67 66 57 69 66 56 67 64 57 70 64 58 64 58 54 69 64 56 65 62 54 66 60 53 64 60 56 66 62 56 71 66 60 66 64 58 69 68 62 68 66 59 71 66 60 67 64 57 67 62 55 68 66 59 71 68 61 68 60 52 66 64 58 69 64 57 71 66 60 76 69 62 58 55 50 169 131 109 163 119 99 152 114 90 172 120 97 178 124 103 182 125 102 178 124 103 171 115 94 164 114 92 178 119 97 173 116 94 169 116 95 168 114 87 174 119 95 118 90 77 72 66 62 73 66 62 69 68 58 74 74 62 71 68 62 76 74 64 74 70 66 77 71 62 79 69 62 75 67 60 243 225 191 235 204 168 233 203 168 235 206 169 235 204 166 238 205 166 235 204 168 235 204 168 235 204 170 235 204 166 237 203 169 237 203 169 235 206 167 235 212 169 235 210 169 235 208 170 235 206 169 235 208 170 229 201 160 229 201 160 228 202 164 234 203 164 236 204 164 236 204 164 228 202 164 230 202 164 234 203 164 234 203 164 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 234 203 164 233 202 160 239 217 181 106 93 79 48 48 47 53 50 50 51 52 47 53 50 45 54 54 51 55 50 52 56 53 52 57 54 52 57 54 52 58 55 50 55 54 50 58 55 50 58 54 50 57 54 52 53 52 49 55 54 50 55 54 50 51 49 45 55 54 50 53 49 47 53 51 46 55 54 50 55 54 50 58 55 50 55 54 50 56 53 52 59 58 55 58 60 53 61 57 56 55 52 48 55 57 50 55 55 54 58 55 50 55 54 50 59 55 52 58 57 53 55 54 50 58 55 53 55 57 50 55 54 50 56 52 49 54 50 46 55 52 48 56 55 52 58 55 50 55 54 50 63 57 58 63 57 55 65 57 57 60 58 52 63 60 56 61 57 53 58 55 50 59 58 50 60 55 52 58 61 54 62 55 57 59 54 54 63 59 57 58 56 54 58 56 52 65 57 52 65 55 54 57 57 52 60 55 52 62 60 58 58 58 50 59 54 54 63 55 52 64 60 60 61 57 57 62 55 57 64 62 60 59 57 54 57 57 52 61 57 57 61 60 56 61 57 57 65 57 57 60 58 56 58 55 58 61 57 57 66 63 62 65 57 57 57 59 59 64 57 60 59 59 54 62 60 55 57 54 52 57 54 52 59 54 54 61 55 61 64 60 59 58 60 58 62 55 57 59 54 54 58 58 54 60 59 58 63 57 58 62 55 57 61 57 57 62 55 57 61 57 61 62 55 57 62 55 57 62 55 54 62 55 57 62 58 54 58 55 53 55 54 50 60 60 55 63 60 56 66 62 54 63 58 51 59 58 51 61 53 46 59 57 50 64 53 46 57 51 43 64 59 51 59 52 47 59 55 53 65 55 53 64 59 55 60 57 50 65 60 53 68 64 51 65 57 48 65 55 53 64 60 60 66 58 55 55 54 50 62 55 56 63 57 55 59 59 53 59 57 54 62 62 56 64 62 60 60 57 55 55 55 48 54 55 46 62 56 49 60 57 50 63 58 53 63 57 53 66 62 54 60 55 52 63 57 55 61 57 48 62 57 52 58 57 53 61 57 53 62 60 53 65 62 53 67 64 53 62 60 53 66 60 60 65 58 55 64 58 53 64 57 53 68 59 53 58 51 45 65 53 46 58 54 47 62 55 50 63 51 48 58 55 48 56 51 45 54 51 45 63 57 53 64 56 51 64 56 51 61 59 50 58 55 50 64 59 54 59 51 47 59 49 45 61 56 51 72 64 55 64 59 53 67 63 53 70 66 58 68 59 52 66 60 51 69 63 52 70 63 56 59 50 43 64 62 52 71 69 58 70 62 54 75 69 60 75 66 58 70 65 55 71 62 56 72 63 55 74 64 57 76 68 59 75 70 56 73 65 55 81 71 64 78 70 61 76 70 59 76 67 63 127 98 84 119 91 74 127 96 81 152 106 83 156 112 89 147 107 85 148 107 85 151 108 85 151 112 92 153 112 92 151 105 86 156 107 85 143 95 78 147 99 78 93 75 61 86 75 64 75 68 58 76 72 61 83 73 64 82 71 60 84 74 62 78 70 60 83 73 57 84 74 57 109 101 87 242 214 181 235 206 167 235 206 169 235 204 166 235 206 167 236 204 164 235 210 169 235 208 170 235 206 169 236 204 164 235 204 166 235 204 166 235 204 170 235 210 167 235 208 170 235 206 169 235 212 169 235 208 170 230 200 156 229 200 158 228 201 162 230 200 156 232 202 164 231 203 166 232 203 164 233 202 160 232 203 164 232 203 164 234 203 164 232 202 162 236 204 164 232 202 164 234 203 164 232 203 164 236 204 164 230 202 164 234 203 164 239 205 166 218 192 157 219 195 155 218 191 153 218 189 151 222 194 158 222 189 154 222 192 154 218 192 157 219 189 154 220 193 159 218 187 156 218 191 155 215 188 153 219 190 157 212 183 150 215 189 155 214 186 152 215 187 151 216 184 149 216 186 151 217 189 153 215 189 151 217 186 152 222 194 158 222 192 154 217 187 156 218 192 157 216 183 154 212 185 147 217 186 154 213 182 151 216 184 151 213 186 151 213 187 152 218 186 152 217 184 152 214 186 153 216 186 149 218 186 153 215 187 151 215 187 156 217 187 155 213 187 152 216 184 151 215 184 152 215 186 152 211 181 146 215 184 151 215 186 152 215 188 153 220 191 155 221 193 160 224 194 158 221 191 157 221 191 157 221 191 157 220 197 158 217 192 152 218 193 155 220 197 158 224 193 156 220 191 155 227 196 159 222 188 158 217 192 158 220 194 160 222 191 159 215 190 155 218 192 157 215 188 153 216 187 152 211 185 149 213 185 149 212 184 153 213 186 150 215 189 153 213 179 148 218 185 153 215 187 153 212 184 152 209 182 149 209 182 149 211 181 151 204 181 154 197 176 144 193 175 147 192 170 144 204 180 147 200 179 150 201 183 152 194 179 149 190 173 146 188 170 141 193 177 146 194 179 145 207 184 154 203 177 151 205 183 149 214 185 153 216 188 157 203 180 148 201 179 145 205 179 149 204 183 153 201 177 148 206 183 156 204 181 150 202 178 153 206 183 155 195 181 149 199 179 151 214 186 155 225 200 168 229 205 172 229 205 172 228 203 169 220 195 163 223 198 163 229 200 167 223 195 164 219 194 164 216 193 162 210 188 156 210 189 161 213 192 159 213 193 160 220 194 160 213 191 156 214 192 156 211 190 163 204 183 154 202 181 153 199 180 149 199 185 150 205 187 153 199 185 152 195 176 148 186 170 140 193 175 148 199 183 154 207 190 155 207 188 156 202 183 153 203 189 153 207 190 156 209 188 158 206 185 156 205 188 157 207 188 159 206 184 153 205 188 155 205 188 155 204 187 150 205 186 154 206 182 152 199 183 150 211 188 156 213 193 157 220 194 160 216 193 162 220 194 160 226 198 167 226 201 167 226 198 166 220 198 164 223 195 164 228 203 169 228 203 169 226 196 162 227 201 165 227 201 165 228 203 169 231 205 173 228 198 166 235 207 171 230 202 169 232 207 175 231 209 174 237 213 177 235 210 176 235 209 171 235 209 171 243 214 177 239 213 177 239 215 177 243 217 181 235 210 174 242 216 178 243 214 173 243 217 183 243 214 177 242 214 179 242 214 179 241 216 181 241 213 177 242 213 174 240 210 173 238 210 173 239 216 174 240 215 175 241 216 177 243 217 177 243 214 177 242 214 177 243 214 177 242 211 173 238 210 175 238 209 170 238 210 175 241 212 171 233 209 176 242 210 170 238 209 170 237 210 175 237 203 169 234 203 167 231 204 164 242 214 179 243 217 177 243 217 181 243 214 173 243 217 181 243 217 183 243 217 183 243 217 181 243 219 184 243 217 179 239 212 170 235 208 166 235 206 169 236 201 168 235 206 167 235 206 165 235 206 167 235 208 170 237 205 168 235 204 168 235 208 168 237 207 169 235 208 166 235 208 170 235 208 170 235 206 169 235 204 168 235 204 166 235 206 169 228 202 164 229 201 160 229 200 158 230 202 164 229 201 160 232 202 162 232 202 162 232 203 164 236 204 164 234 203 164 232 203 164 234 203 164 234 203 164 230 202 162 231 203 166 232 202 162 234 203 164 234 203 164 236 204 164 236 204 164 236 204 164 232 203 164 230 202 164 232 203 164 228 202 164 228 202 164 232 203 164 234 203 164 230 202 164 231 203 168 228 202 164 229 202 166 231 203 166 230 202 164 229 202 166 228 201 162 230 202 164 228 201 162 228 201 162 229 201 160 230 202 164 230 202 164 228 202 164 231 203 166 230 200 166 230 199 165 228 201 162 229 202 166 230 202 164 229 201 160 229 201 160 229 198 161 231 203 166 230 202 164 230 202 164 233 203 168 232 202 164 229 202 166 230 202 164 228 201 162 228 201 162 228 201 162 228 202 164 228 202 164 229 201 160 228 201 162 228 202 164 230 202 164 229 201 160 229 201 160 228 202 164 230 202 164 228 201 162 230 202 162 231 203 166 229 200 167 228 202 164 230 202 164 228 202 164 233 203 166 230 202 164 230 202 164 233 203 166 232 203 164 231 203 166 230 202 164 231 203 168 231 203 166 230 202 164 233 203 168 229 202 166 230 202 162 230 202 164 232 200 168 228 202 164 228 201 162 228 201 162 228 202 164 229 202 166 233 203 168 233 203 166 230 202 162 229 201 160 232 203 164 230 202 162 231 203 168 235 204 168 235 204 168 235 204 166 231 203 166 235 204 170 233 203 168 233 203 166 235 204 170 235 204 168 233 203 166 235 204 168 232 203 164 233 203 166 230 202 164 233 203 168 233 203 166 235 204 168 235 204 168 233 203 166 231 201 160 233 203 168 232 202 166 235 204 168 233 203 168 235 204 168 231 203 166 228 202 164 228 202 164 228 202 164 228 201 162 230 202 164 228 202 164 232 203 164 234 203 164 232 203 164 230 202 164 233 203 168 230 202 164 231 203 166 233 203 166 234 203 164 232 203 164 232 203 164 230 202 162 230 202 162 232 203 164 230 202 164 230 202 164 236 204 164 232 203 164 234 203 164 232 203 164 232 203 164 232 203 164 231 203 166 228 202 164 228 202 164 228 202 164 232 202 164 233 203 168 228 201 162 230 202 164 231 203 166 230 202 164 230 202 164 230 202 164 230 202 164 230 202 162 230 202 164 232 202 162 228 201 162 231 203 166 232 203 164 232 203 164 228 202 164 230 202 164 230 202 164 230 202 164 230 202 164 230 202 164 228 202 164 228 201 162 230 202 164 228 202 164 228 202 164 228 201 162 229 202 166 230 199 164 228 201 162 228 202 164 230 202 164 228 201 162 228 201 162 232 203 164 233 203 166 230 202 162 232 203 164 232 203 164 232 203 164 232 203 164 235 204 166 233 203 166 232 202 164 235 204 166 236 204 164 230 202 164 233 203 166 230 202 162 230 202 162 231 203 166 232 204 163 230 202 164 228 201 162 229 200 158 228 202 164 229 201 160 230 202 162 235 204 168 235 204 166 235 204 166 235 204 166 235 208 170 235 208 170 236 204 164 235 204 166 236 204 164 233 203 166 235 205 166 236 204 164 236 204 164 235 204 168 235 204 166 238 203 167 234 203 164 236 204 164 235 204 168 233 203 166 230 202 164 235 204 166 235 204 168 234 203 166 235 204 166 235 204 168 232 203 164 230 202 162 236 204 164 236 204 164 235 204 166 237 209 168 237 207 169 235 208 170 235 206 169 235 209 172 235 208 168 235 210 167 235 212 169 235 206 169 237 207 167 236 204 164 235 204 168 228 202 164 230 202 164 228 202 164 230 200 156 229 201 160 228 202 164 231 201 160 228 202 164 230 202 162 234 203 164 230 202 164 232 203 164 232 202 162 236 204 164 232 203 164 236 204 164 234 203 164 236 204 164 235 204 166 236 204 164 234 203 164 230 202 164 230 202 164 228 201 162 229 201 160 229 201 160 230 202 162 228 202 164 232 202 162 234 203 164 230 202 164 228 202 164 232 203 164 232 203 164 230 202 164 228 202 164 232 202 162 234 203 164 234 203 162 229 200 158 228 202 164 228 202 164 230 202 164 230 202 164 232 202 162 228 202 164 228 202 164 232 202 162 235 204 168 230 202 162 228 202 164 235 204 166 232 203 164 234 203 164 232 203 164 230 202 162 230 202 162 228 202 164 228 201 162 228 201 162 229 201 160 228 201 162 228 202 164 228 201 162 228 201 162 228 202 164 228 201 162 228 201 162 228 202 164 229 201 160 228 201 162 228 201 162 228 201 162 230 202 162 228 202 164 229 202 166 229 202 166 228 201 162 233 203 168 235 204 168 233 203 166 230 202 162 230 202 164 230 202 164 234 203 164 232 203 164 234 203 164 232 203 164 234 203 164 233 203 168 234 203 164 228 202 164 230 202 164 230 202 164 232 202 162 228 201 162 230 202 164 228 201 162 228 202 164 229 202 166 230 202 164 229 202 166 231 203 168 229 202 166 231 203 168 229 202 166 235 204 170 233 203 166 235 204 170 235 204 166 236 204 164 229 202 166 231 203 166 234 203 164 235 204 168 231 203 168 235 204 170 235 204 168 233 203 166 232 203 164 232 203 164 233 203 168 235 204 170 235 204 170 235 204 170 233 203 170 235 204 168 235 204 166 235 204 170 235 204 172 233 203 166 233 203 168 231 203 168 228 201 162 230 202 164 234 203 164 230 202 162 232 203 164 232 203 164 232 203 164 235 204 170 235 204 170 233 203 170 235 204 166 235 204 168 236 204 164 236 204 164 234 203 164 234 203 164 236 204 164 235 204 168 233 203 166 232 203 164 231 203 166 235 204 166 236 204 164 236 204 164 233 203 166 230 202 164 234 203 164 231 203 166 230 202 164 228 202 164 230 202 164 232 203 164 231 203 166 232 203 164 234 203 164 233 203 166 234 203 164 228 202 164 230 202 164 228 202 164 232 202 164 233 203 166 235 204 166 235 204 166 235 204 168 234 203 164 234 203 164 234 203 166 232 203 164 228 202 164 232 203 164 232 203 164 234 203 164 234 203 164 233 203 168 230 202 164 229 202 166 228 201 162 228 201 162 235 204 168 234 203 164 235 204 168 228 202 164 230 202 162 232 203 164 233 203 166 235 206 165 234 203 164 235 204 166 235 204 166 232 203 164 235 206 167 235 208 166 235 204 166 235 206 165 233 203 168 235 204 168 235 204 166 235 204 168 232 203 164 234 203 164 236 204 164 236 204 164 230 202 164 232 203 164 230 202 162 229 201 160 234 203 164 233 203 168 236 204 164 234 203 164 235 204 168 235 204 168 235 204 168 235 204 168 235 204 166 235 204 166 235 204 168 231 203 166 236 204 164 234 203 166 235 204 168 235 206 167 235 204 168 235 204 166 235 204 168 235 204 166 236 204 164 235 204 166 235 204 166 232 203 164 231 203 166 235 204 166 233 203 168 235 204 166 234 203 164 234 203 164 232 202 164 236 204 164 235 204 166 236 204 164 235 206 167 235 210 169 235 208 170 235 208 168 237 208 173 235 210 169 235 210 169 237 205 168 235 204 170 235 204 170 236 204 164 235 204 166 232 203 164 228 202 164 232 203 164 234 203 164 230 202 164 228 201 162 228 202 164 232 203 164 232 202 162 236 204 164 236 204 164 234 203 162 232 202 162 233 202 160 230 200 156 231 201 160 229 201 160 232 203 164 232 202 162 236 204 164 236 204 164 234 203 164 236 204 164 234 203 164 231 201 160 234 203 164 235 204 166 236 204 164 236 204 164 232 202 164 234 203 164 236 204 164 236 204 164 234 203 164 234 203 164 235 204 166 230 202 164 234 203 162 228 202 164 233 202 160 234 203 164 230 200 156 230 202 164 228 202 164 235 204 166 234 203 164 228 202 164 230 202 164 230 202 164 232 203 164 232 203 164 234 203 164 234 203 164 232 202 162 233 203 166 230 202 164 234 203 164 229 201 160 228 202 164 232 203 164 228 201 162 230 200 156 228 201 162 230 200 156 229 200 158 233 202 160 229 201 160 230 202 162 232 203 164 232 203 164 228 202 164 232 202 162 234 203 164 233 203 166 231 201 158 230 202 162 234 203 164 236 204 164 232 203 164 235 204 166 232 202 162 228 202 164 236 204 164 234 203 164 235 204 168 235 204 166 234 203 164 234 203 164 234 203 164 236 204 164 235 204 166 236 204 164 234 203 164 232 203 164 230 202 164 236 204 164 230 202 164 230 202 164 230 202 164 234 203 164 232 203 164 228 202 164 228 201 162 236 204 164 234 203 164 235 204 166 236 204 164 235 204 166 232 203 164 234 203 162 232 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 234 203 164 233 203 166 236 204 164 235 204 168 235 204 166 232 203 164 236 204 164 236 204 164 234 203 164 236 204 164 232 203 164 235 204 168 235 204 166 232 203 164 230 202 164 230 202 164 229 202 166 232 203 164 230 202 162 230 202 164 230 202 162 231 203 166 235 204 172 235 204 166 236 204 164 235 206 165 235 204 166 236 204 164 236 204 164 232 203 164 236 204 164 233 203 166 236 204 164 235 204 168 236 204 164 234 203 164 234 203 164 236 204 164 236 204 164 230 202 162 228 201 162 231 201 160 233 203 166 236 204 164 230 202 164 233 203 166 234 203 164 234 203 164 235 204 168 235 204 168 234 203 164 234 203 164 236 204 164 233 203 166 233 203 166 234 203 164 234 203 164 233 203 166 230 202 164 235 204 166 235 204 168 235 206 165 236 204 164 233 203 166 232 203 164 232 203 164 234 203 164 230 202 164 234 203 164 231 203 168 234 203 164 232 203 164 232 203 164 234 203 164 232 203 164 231 201 160 233 203 166 232 202 162 233 203 166 234 203 164 236 204 164 233 203 166 235 206 167 235 204 170 234 203 164 233 203 166 238 203 167 235 208 166 235 204 168 233 203 166 235 204 166 235 208 166 233 203 170 235 204 166 235 204 166 235 204 166 235 204 170 235 204 168 233 203 166 230 202 162 229 202 166 230 202 164 232 203 164 234 203 164 234 203 164 235 204 166 235 204 170 235 204 166 235 206 165 235 204 170 235 204 166 233 203 166 235 204 166 235 204 166 235 204 166 236 204 164 235 204 166 235 204 166 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 236 204 164 235 204 168 235 206 167 235 204 166 233 203 166 235 204 168 235 204 168 236 204 164 235 204 166 240 205 167 236 204 164 235 204 166 235 204 166 235 206 167 235 206 167 236 204 164 235 206 171 235 204 168 235 204 168 235 208 170 235 206 169 235 208 170 235 204 168 235 208 168 235 206 169 228 202 164 228 202 164 234 203 164 234 203 164 232 202 162 233 203 166 232 202 162 234 203 164 233 203 166 233 203 166 234 203 164 234 203 164 231 201 160 232 203 164 232 202 162 233 202 160 232 202 162 236 204 164 234 203 164 236 204 164 232 203 164 234 203 164 236 204 164 235 204 166 234 203 164 235 204 166 234 203 164 236 204 164 236 204 164 235 204 168 233 203 166 234 203 164 234 203 164 234 203 164 236 204 164 235 204 166 231 203 166 232 202 162 232 202 162 231 201 160 234 203 162 234 203 164 232 202 162 234 203 164 232 202 162 232 202 162 232 203 164 233 203 166 230 202 164 234 203 164 230 202 164 232 203 164 234 203 162 234 203 164 232 202 162 228 201 162 234 203 164 234 203 164 232 203 164 228 201 162 233 203 166 232 202 162 230 202 164 231 201 158 229 200 158 229 200 158 230 202 162 229 201 160 229 201 160 230 202 162 234 203 164 230 202 162 233 203 166 229 198 161 232 202 162 233 203 166 234 203 164 231 203 166 234 203 164 235 204 166 232 202 164 228 201 162 236 204 164 235 204 166 235 204 170 234 203 164 234 203 162 235 204 166 235 204 170 234 203 164 234 203 164 236 204 164 234 203 164 234 203 164 236 204 164 232 203 164 234 203 164 232 203 164 230 202 164 232 203 164 235 204 168 234 203 164 235 204 166 233 203 166 236 203 167 236 204 164 235 204 168 232 202 164 234 203 164 234 203 164 236 204 164 234 203 164 235 204 168 235 204 166 235 204 166 235 204 168 235 204 168 236 204 164 235 204 166 235 204 168 236 204 164 235 204 166 235 204 166 233 203 166 235 204 166 235 204 166 236 204 164 234 203 164 233 203 166 235 204 166 235 204 166 231 203 166 230 202 164 228 201 162 232 203 164 231 203 166 233 203 166 236 204 164 232 203 164 232 203 164 234 203 164 236 204 164 228 202 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 233 203 166 230 202 164 233 203 166 235 204 168 236 204 164 235 204 168 236 204 164 236 204 164 233 202 160 232 202 162 236 204 164 233 202 160 232 202 162 232 203 164 234 203 164 234 203 162 232 202 162 236 204 164 236 204 164 236 204 164 233 203 166 235 204 166 236 204 164 236 204 164 235 204 166 234 203 164 235 204 166 235 204 166 234 203 164 233 203 166 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 232 202 162 234 203 164 232 203 164 231 203 166 233 203 166 232 203 164 232 203 164 232 203 164 232 203 164 230 202 162 236 204 164 228 201 162 234 203 164 235 204 166 235 204 166 233 203 166 235 204 168 235 204 166 235 204 168 235 204 166 235 204 166 235 204 166 235 204 170 235 204 166 235 204 168 235 204 168 235 204 166 236 204 164 234 203 164 235 206 165 233 203 166 236 204 164 235 204 168 231 203 166 232 203 164 233 203 166 228 202 164 228 202 164 235 204 166 236 204 164 235 206 167 235 204 166 235 204 168 235 206 169 235 206 169 235 204 168 235 204 166 233 203 166 235 204 166 236 204 164 236 204 164 235 204 168 235 204 166 236 204 164 233 203 166 235 204 166 234 203 164 236 204 164 236 204 164 235 204 168 235 204 168 235 204 166 235 204 168 235 204 166 233 203 166 235 204 166 233 205 165 235 208 168 235 204 166 235 204 166 234 203 164 235 204 166 232 203 164 235 204 170 236 204 164 235 204 168 235 206 167 235 204 166 235 210 167 235 206 167 235 208 170 235 206 167 235 208 166 228 202 164 231 203 166 235 204 166 235 204 168 236 204 164 235 204 166 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 234 203 164 234 203 162 234 203 164 234 203 164 236 204 164 234 203 164 234 203 164 235 204 166 236 204 164 232 203 164 234 203 162 232 202 162 236 204 164 233 203 166 234 203 164 236 204 164 236 204 164 233 203 166 234 203 164 236 204 164 236 204 164 235 204 166 234 203 164 233 203 166 234 203 164 234 203 164 235 204 166 234 203 162 232 202 162 236 204 164 230 202 164 230 202 164 234 203 164 230 202 162 235 204 166 232 203 164 230 202 164 235 204 166 235 204 168 232 203 164 235 204 166 236 204 164 232 203 164 231 201 160 231 203 166 232 203 164 232 203 164 233 203 166 235 204 168 232 203 164 233 203 166 232 203 164 231 201 160 231 201 160 229 200 158 228 201 162 229 201 160 231 201 160 232 203 164 232 203 164 235 204 166 234 203 164 230 202 162 230 202 164 232 202 162 229 201 160 232 202 164 236 204 164 232 203 164 232 203 164 234 203 166 235 204 166 235 204 166 235 204 166 236 204 164 228 202 164 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 234 203 164 234 203 164 234 203 164 234 203 164 233 203 166 233 203 166 236 204 164 235 204 168 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 235 204 166 235 204 166 236 204 164 236 204 164 235 204 170 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 235 204 166 235 204 166 235 204 168 235 204 170 235 204 168 235 204 166 236 204 164 233 203 166 236 204 164 235 204 166 233 203 166 235 204 166 233 203 166 233 203 166 232 203 164 228 202 164 230 202 164 230 202 164 230 202 164 229 201 160 230 202 164 228 202 164 228 202 164 234 203 162 235 204 168 235 206 167 234 203 162 232 203 164 236 204 164 236 204 164 235 204 168 235 204 166 232 202 162 233 203 166 237 205 168 235 204 168 235 204 168 236 204 164 232 203 164 234 203 162 234 203 162 234 203 162 236 204 164 235 204 166 235 204 166 232 203 164 233 202 160 231 201 160 236 204 164 235 204 166 234 203 166 235 204 168 235 204 168 235 204 166 235 204 166 235 204 166 234 203 164 235 204 168 234 203 164 235 204 166 234 203 164 232 203 164 233 205 165 232 203 164 234 203 164 232 203 164 232 203 164 229 202 166 232 203 164 230 200 166 234 203 164 230 199 164 235 204 166 231 203 166 235 204 168 232 202 162 234 203 164 235 204 166 235 204 166 234 203 166 234 203 164 232 203 164 235 204 168 235 204 168 235 204 168 235 204 168 235 204 168 237 205 170 235 208 166 235 204 168 235 206 169 235 204 168 233 203 166 234 203 164 231 203 166 230 202 162 235 204 166 235 204 168 235 204 168 232 203 164 232 203 164 233 203 166 231 203 166 234 203 164 236 204 164 235 204 166 235 204 166 235 204 168 235 204 166 235 204 168 234 203 164 230 202 164 233 203 166 234 203 164 232 203 164 233 203 166 236 204 164 235 204 168 235 204 166 235 206 169 235 204 168 235 204 168 235 204 168 236 204 164 235 208 166 235 204 166 235 204 168 235 204 168 235 204 168 235 204 166 235 206 169 235 206 167 236 204 164 235 206 169 237 203 169 235 204 168 233 203 166 233 205 167 235 208 166 235 206 167 235 204 168 235 206 169 235 208 170 235 210 167 235 208 168 237 207 169 235 206 167 237 209 168 235 208 168 235 204 168 233 203 168 231 203 168 236 204 164 236 204 164 235 204 166 235 204 166 235 204 166 234 203 164 235 204 168 235 204 168 234 203 162 234 203 162 234 203 164 232 203 164 236 204 164 235 204 166 234 203 164 236 204 164 234 203 164 233 202 160 231 201 158 231 201 158 234 203 164 232 202 162 234 203 164 229 200 158 230 202 162 232 202 162 234 203 164 232 203 164 234 203 164 236 204 164 232 203 164 234 203 164 234 203 164 231 203 168 234 203 164 236 204 164 236 204 164 232 202 162 232 203 164 232 203 164 230 200 156 232 202 162 231 201 158 234 203 164 233 203 166 233 203 166 233 203 166 230 202 164 233 203 166 235 204 168 235 204 168 232 203 164 228 202 164 228 202 164 228 202 164 228 202 164 228 201 162 230 202 162 230 202 164 228 202 164 234 203 164 229 201 160 232 202 162 229 201 160 232 203 164 230 202 164 229 201 160 228 201 162 230 202 164 230 202 164 230 202 164 228 201 162 228 201 162 230 202 164 232 203 164 230 202 162 236 204 164 234 203 164 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 234 203 164 234 203 164 234 203 164 235 204 168 234 203 164 234 203 164 234 203 164 233 203 166 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 162 236 204 164 236 204 164 235 204 166 235 204 166 235 204 166 235 204 168 236 204 164 235 204 166 235 204 166 235 204 166 235 204 166 235 204 166 236 204 164 235 204 166 236 204 164 236 204 164 236 201 166 236 204 164 236 204 164 235 204 166 231 203 166 230 199 164 228 201 162 229 201 160 230 202 162 230 202 162 230 202 164 230 202 164 232 202 162 231 203 166 234 203 164 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 234 203 162 235 204 166 235 204 168 235 204 166 236 204 164 235 204 166 236 204 164 234 203 164 234 203 164 229 201 160 232 202 162 236 204 164 233 202 160 235 204 166 233 203 166 236 204 164 232 202 162 233 203 166 235 204 166 236 204 164 235 204 166 234 203 164 233 203 166 235 204 168 235 206 165 235 204 166 232 203 164 234 203 164 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 235 204 166 236 204 164 232 203 164 236 204 164 236 204 164 232 203 164 234 203 164 232 202 162 236 204 164 233 203 166 235 204 166 235 204 166 235 204 166 235 204 166 235 204 166 234 203 164 233 203 166 235 204 168 235 204 166 235 204 168 235 204 166 235 204 168 235 206 169 235 204 168 236 204 164 234 203 164 232 203 164 236 204 164 235 204 168 234 203 164 231 203 166 235 204 166 233 203 168 233 203 166 235 204 166 234 203 164 232 203 164 235 204 166 235 204 166 235 204 168 233 203 166 235 204 166 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 235 204 168 235 204 166 232 202 162 236 204 164 234 203 164 235 204 168 235 204 166 233 203 166 235 204 168 235 204 166 235 204 168 235 204 166 238 203 167 235 204 168 235 210 169 235 204 166 235 204 166 235 204 166 235 204 168 235 204 166 235 204 166 235 204 166 235 204 168 235 204 168 235 206 165 237 205 168 235 204 166 235 204 170 235 204 166 235 204 168 235 204 166 235 204 166 235 206 167 235 210 169 235 210 169 235 208 168 229 201 160 223 195 157 217 189 156 233 202 160 232 203 164 233 203 166 234 203 162 233 203 166 234 203 162 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 235 204 168 235 204 166 236 204 164 235 204 166 232 203 164 234 203 162 231 201 158 232 203 164 230 202 162 230 202 162 232 202 162 234 203 164 232 202 162 232 203 164 234 203 164 229 202 166 232 203 164 236 204 164 234 203 164 232 203 164 233 203 166 230 202 162 230 202 164 232 203 164 232 202 164 231 201 160 234 203 162 230 202 162 232 202 162 232 203 164 232 202 162 236 204 164 233 203 166 235 204 166 232 203 164 234 203 164 235 204 166 234 203 164 232 203 164 228 202 164 234 203 164 232 203 164 232 203 164 228 201 162 233 203 166 228 202 164 230 202 164 234 203 164 230 201 162 232 202 164 229 201 160 229 201 160 229 201 160 228 202 164 234 203 164 232 203 164 234 203 164 232 203 164 230 202 164 234 203 164 234 203 164 232 202 162 232 203 164 232 202 164 233 203 166 234 203 164 234 203 164 235 204 166 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 236 204 164 232 203 164 232 203 164 232 203 164 232 203 164 236 204 164 234 203 164 235 204 168 236 204 164 230 202 162 234 203 164 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 166 236 204 164 236 204 164 236 204 164 236 204 164 234 203 164 235 204 166 236 204 164 235 204 166 235 204 166 236 204 164 235 204 166 235 204 168 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 236 204 164 234 202 167 235 206 165 232 203 164 234 203 164 233 202 160 229 201 160 233 197 164 229 201 160 229 201 160 231 201 160 232 203 164 232 202 162 233 203 166 234 203 164 232 203 164 234 203 164 236 204 164 236 204 164 234 203 164 236 204 164 235 204 166 235 204 166 232 203 164 236 204 164 236 204 164 235 204 166 235 204 166 236 204 164 232 202 162 236 204 164 236 204 164 232 202 162 233 202 160 232 203 164 236 204 164 232 203 164 232 203 164 236 204 164 234 203 164 236 204 164 236 204 164 236 204 164 236 204 164 236 204 164 235 204 168 236 204 164 236 204 164 234 203 164 235 204 168 235 204 168 235 204 166 236 204 164 230 202 162 232 202 162 236 204 164 236 204 164 232 203 164 234 203 164 232 203 164 236 204 164 236 204 164 232 203 164 234 203 164 234 203 164 236 204 164 234 203 166 235 204 166 235 204 166 232 203 164 234 203 164 236 204 164 234 203 164 235 204 168 235 204 166 236 204 164 235 204 168 235 206 167 235 204 166 235 204 166 234 203 164 234 203 164 230 202 164 236 204 164 236 204 164 233 203 166 236 204 164 234 203 164 234 203 164 232 203 164 233 203 166 232 203 164 231 203 166 235 204 166 231 203 168 236 204 164 235 204 166 235 204 168 235 204 166 235 204 166 236 204 164 235 206 165 232 203 164 235 204 166 236 204 164 235 204 166 233 202 160 236 204 164 235 204 166 236 204 164 236 204 164 235 204 166 236 204 164 235 204 166 235 204 166 235 204 166 235 204 166 235 204 168 235 204 166 235 204 166 237 203 169 235 204 166 235 204 166 235 204 166 235 204 168 235 204 166 235 204 166 235 204 168 235 204 168 238 203 167 235 204 172 235 204 166 235 204 168 236 204 164 235 204 168 235 204 166 235 206 169 235 210 169 235 204 170 235 206 167 camlspotter-camlimages-e471b3c4470d/test/images/bmp.bmp0000644000000000000000000012324212405272062021100 0ustar 00000000000000BM6(lm m (,P04@@DPHLXPT`hhx 0H@Xphx0(0@8@H@H``` 8( XLH@$(P0 H(@ 0 X8 `@ pL(xp``0hXHt@PPH0`84(xpPX@@D0hlP̰HT8PXHİ$hth(4(XdX@L@x8TH@\P0L@8dXxXtp8D@0D@@TPH\X@\X8LHHTP ((x0LPHdhh(DH8TX(48088hXtp@TXhtxpxx((hXdh0DHxhXhXxHdxxxPpx8HPHX`hxx@LPHTX@HH@`x(8@hXhp8L`,@h8@HP\`PXX`hh0Hp0@`XtHXphx x0<@`hp@LX`lpx(4P8xhxP`(,0 (XxXd@Hp@L`px(0h8@XPXp8Dht (@08P08p8DHP`h08HL8@X`HLHLP{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{]]a]]{{{{{{{{{{{{{{{{{{{{{{{{{]]{{{{{{{{{{{{{{{{{{{{{{{{{{{{s{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{]{{{{{{{{{{{{{{{{{s{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{]{{{{{{{{{{{{{{{{{{{{{{]{]{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{]]{{{{{{{{{{s{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{a]{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{s{a]]aa]a{{{{{{s{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{s{{{{{{{{{{{{{{{{{]a]]{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{]{{s{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{{{{{{{{{{{{{{{{asss{s{s{{ss{ss{s{{szzzzzz{{{{{{{{{{{aaППqVVŠᄣqqqqqООqЌОqqqq쟟qПОͣڣqqЈ숟lqЈӦ́Ō񟈌qqqqО~κqΞΞОξ{{{{aa~ ɻڤڤ~pɺ~{{{{{{{{{{{{{]⦦~~ VY⣣⤾⤤ڤ⤦⦦⦤⦦ʻ{{{{{{{{{{{{]Њ⦦~~ɻ~ͦ⤤ڤ⦾⦦⦦ڦ⦾ʺ ղ⟾{{{{{{{{{{O⣣~ ⤤⦦⤦⦦rm⦤ھڤڤwVi{{{{{{{{{{Τ⦦⦣peɸK⦦⾦⤤⦦⦦ξ⤾ژ⤦~삡{{{{{{{pڦ⾦ڤ͌~ ⦤⤤⤾ccU⾣ڤھھھ⦢~~z{{{{{{{{{{sppңͮi ھ⤣ڣڤҤr⦦⦾⊦Ҿ⤤ڤژھڤ ~໛Ź{{{{{{{{lw⦦pͼ K~ΌھҤ⤤⦾⾾pmξ0诶Ҧڤڤ⾾ڦژھ⾦Kʊͣ{{s{_~Kⅾͣ͠ጟʺCe殏ҤҤ⤤⦤⦦rpڣҾ⤤⤤ژځڤھ⾾ʊڣΰ{{{{{{{l⦦Ō͌i îڣ⦤ڤھ⦾؏ڤ⾦Έwھڣڤڤڄڄڤھ⦷~~ΊΆ{{{⸛Φp͠ ҸiiΌᣣڣڤ⤤⤦ڤ⾦ڣڣጣڤڣڤڶڣڤځڣڣڤ⦾⾦~wΆ{{{{{{{aq⦣͌͠ ~ɸ K ̤̣⤣p̣pڣ⤤Ҥو⦾ңpʮΤͮîڤھڤڤڣڤژژھڙ⾾ڣڤ⤤~~q͞ʰ{{{{{ Kqqrڣ͟񟣌쌠~ eKpڣ̣pڤ⤣pڤpΛɦھΔwwvqqأ˜⣤ڤڣڣڤڤڤژژژڤ⤾ښ~Ί͌ʰ{{{{{{{ξqҟpp⣣͌񮻺 qpڄ͟РpppLڤ̤ڤҤھ )3- C-e i i'ҟΔڣ⤤ڤڤڣڣڣځژڤڅڙڤ⾾ڤ~wη񞙞{{{{aqK⟠ңr͌͟qw~" pmlkՓLLp⤤⤣⤾pɸ) 3Ci3) 3)i i؟ПҶߌڤڣpڣᣣᄣڣځھھڤڤڣڣڣ~wʦwţͮw{{{{{rpq͟qq kÎPҦΞ) VʧE5"5C-) wڣڤڣڣڄڣځڤھڤ⾦ڤڣڣښ~ ~ھ⾶ڷηşΤι{{{{{{{Ң⌟ͣ⌌Оw⸸e ~kݏңң~mΨݖVʛC) 3ii/KŤڣڤځڣڣځځځڤ⤦ڤڣᣣ~~ھ⾤綷wΦw{{{{{{{{q⟌⟟wР i δՔVʨ©p""ppڣڌK𖏐¯𢐏Κާ -K/ i)5ُͣڤᤣڣڣھځڄڤڅ⤾⤣ڣڣᣣڣpᣣp~ئ澷͌qι{{{{{{ҢФp⟟Ό~qw iKʈԈӪ) "wwwpp͠ʞˆVtK~iKC諚 K~~pᣣځژژڣھڙ⤾⣣ڣͣͣKʤ涷ضܾcpι{{{{{Q즻͌pڟw~Пp e yחVVy٪/4'))Ci2mm´qˆqRltC"L53 iڣڤڤژڄځڤڤڣڤڣͣpŠp~ڌͮ⾠Οw{{{{{{ЌͮͣУППʧ ~ٔӓ- 'i )4"C/* /wΚLe鈨"LV¬c;廾VκewͶڣڤژڤڄځځژڤڤڤᣣڣڣţŌ ~ڌأПήͮ{{{{{{V̞̞ʟwq qyˆ¬k45-C C5C-*/ '4w~؟ΐ)䎴?> /DCTDecode filter def 20 20 translate 150.00 96.60 scale /DeviceRGB setcolorspace { << /ImageType 1 /Width 250 /Height 161 /ImageMatrix [ 250 0 0 -161 0 161 ] /DataSource Data /BitsPerComponent 8 /Decode [0 1 0 1 0 1] >> image Data closefile RawData flushfile showpage restore } exec s4IA0!"_al8O`[\!;#6tJ?#m^kH'FbHY$Odmc'+Yc t)BU"@)B9_>,VCGe+tOrY*%3`p/2/e81c-:%3B]>W4>&EH1B6)/6NIK"#n.1M(_$ ok1*IV\1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1, :U?1,AmF!"fJ:T`Fok!>,;5&HMtG!WU(<)uos>"T\W)zz!!!-%!":"o,!*=94Rg+pN5I:."]7/YY^Fh9.5?V"`Zf'6rJUO00rS.#bo%t_U/Pj*Kn?dM8p O="RDqk(0o&Cr2rA@1=V16AnQg08'cf2\+q[N@FOoGEoWr:JPErAhH^PhuumJMe6 mj#9e<.DM<%UZ4Gn)F?6qgTerggk&=4[AQpYP;MeqN%k#?ZuC'r3aV&rr?5iHIGI \@;'0;**:M1#Al4;4t]XejSU]F@dG(9d)Q!ma9LKR:Yk+00_@,-"2qD8@ijG!IfB E6O8H;VbD48jegJ<($iM12C?:kk(3*$sd)omY>bNG]ChsQ^5Wm%5;/tl03(ah42, #h88L)si&FU?5ZOd*Q-NH<=3NUgq2:N.4QR&5![PPMZZB;k``oM2![OHSVcMSXqE _e4?pGm/[j;%`33Eq4bc_=ZL6ulup_WM)`[D[!O,jBou[R?5!+/TD^Cl'm/2V&,l K$!DYR)n&(#6g=G:^kjJ$MCA[cB&$(<&g>G9&BfZYa+)6EY3BVij'8"Bo&0c._" oX)D_.-X+0:HE6<8b"D^tJ)I9hn,Tj18r=-F\==qFX6^?au,CFN%EuRH4=A_afMt Ghkrk5)@)dA;9UDT2##V!Q:IL`BtX-l70b(g3U)m:R'/H2/e9=l4k sj&Cg%krbHf6*?C%q=dNo)'q"^p!4#aJ.638c1N!hb%&=B1gCK;61#Xo]_M7im]M =WI8fZ!2.`s2MSsiMuQ8F&7_O2/8]B5TG!!HBmN,) J**Q@Ip&?QhX+_@Rn\)N?hd`#<"pf8C,g'FN;Xfh@;;#$m=]R?4&c5*t/1qOWOT? *@lV5"`r``J;9SSL)>!nk!\=9I`TAJBU>+#D2Qom#J1CmU-jmJ&3boc0$tlU^7AZ Wl[k#s:C$n"e@TI()(=V7Ua7:R^U(03oA_eUAX#NVJGBE0PIPY ]`%)B<0#BR6W01P$/3t<_*ij(^3E-(nJ^6+28d+LNg)Wf9MQZlQ)PLr:C"asrK`e3a$`._#$c`qaVfCr 7;oV&i8brM_// 9Tk!#;(]g#ZV9c>7PC&Zh0ik'LDu;ZN\j'0EU%>JfC$N\AjNtk(;k77MJ3a/PKZm 6l;n3m4PN%]T+s.^50f^88GRPC=;!4'?aqX:k`)8Z264qfQ0mG.rC.8_93='&?.V D=CBJqe4A+6Tk88DU?.cp%o\1TV*!m])>A"\/DH.+fP_Hk]>TVnA8_U`3E]j'6i*21 5ru.u_Nd[2QOO'WupT8$rcJh#IZophBLZ3;oh2[u4UdNdFC-ZkXW`:d9sMbs*pI[ 4j4qI_`?OoBIM*&Q[XCL?I0*Z#S`cq3fQmm7.*Uj,W!05pX`+,`"oq<1YYA@R`1V @%Eh:j0QlhDSL4L>0=ud.Aj/EVsahV1!%P:F>c4>B]BoZ*1Gs$6&8pgr)hhS:S&D UZE2ot,d$T>F]=Us>0L'#%ZCn9HK&KAa]+ANCNOlO8+N?L/8H;M)Oa-2/C>d(\+I 4l?,rg%no0l,%3q:UR@WCRn]qim%*L2>0!:u]7o2Z8>Ue,Z=UW2DegChs9-H#dD7 TNu3XX$bcH7RJRrlM9b !uo+9$*1D=G"Bi7E7K"f#Y"1nt>5G0qtcF_Km-2@&[l)A0a^/RgZ?eqf!pEl%rH) ?>".LEDNSmZL#k?LQs3D8;cn.*3n^D8/l#[R,ud2RV%)M[b%qs#!BhYnM_DqpbW2 ^5CNjg3&HAc5DW1Rf>47?Tm3e+b6KRYK6WJ:hYqaV#-kgCk?ouW%U^&^g0-VGBpG ,YGcXKWhp>ePcAXaGQZ^[8o=iZ'B*]Yl&Q8d\ktUglV";K#UX[,;3;;^^B9a_?A; [8>%j-NT7E_DaSp4c@h%9D!&\a*Xj0F0+/!2'K]^Xg>kQ=hV\q:t6R+q>1i]RJu4 ?EKBAn.%l2^MSVHC4+HOI7)PIET)UNg-L5go]>r'*U*fXbX90o"[Yii*'UM[I@T5=h? 5-J2kVr5^sDW-ki;L.1M>9+JJg5>=D5qO?C*hGjPR`3KEG`XSlqKqau>[$kY`@,K 3oF6_e23Ci`k;8>k:%UupWU_Qu*[g#p/mL2lChq/`V\2mmO"W9=&[;j[rD2#=ICL (%gYCi1iuaQ=:/1;G78jghRpM7q%4We]+2"f3l[jLII&:)8fM^k=eW>W%C1M*\GlQdQ3-]@'8@Z4C%eZU>>>1H(DB46LC7K,mOgMdZk16%)u)Kr?P#:fq#Q>DD/K;@ksT+k,(T?&?'30NcdT9WWpuD-,^m4;s;?ATH jCgK;$.G3=RY%8!;HEc2H+Tl!IS:&'a92'?pUp!8gM%6nK?;"LburrCuEo/P?I(Z 9K+h]^\5N9D-j)OG>O!8M`[Q0/k?dRR7C,`D%/E-B:6+-eY#aIAYi!c79M5G:Q6O /u*Ar(k3@;D('oT3ZuDcDsMfM,$)6ID,Ble8*a4k#?\1'QMiO$H`SW@:SiH,!+ojn(/JE'2_FO.`t[o(_*[u$V)l^;37)0CY IO6JOgsY0W,!9;;(P\sU,nbfBFPs#J/0KIFW<=fLJ1lp[O&eB.6Jm(Pt-oj.MTt" CUi*:NU\c@%7$-PIdpH*l?F%*>Ki+srrCp\VCl"G>mt0HRUB*nZNP,UYT&/$c^i* _)r7Lh&!gh)AP"mcGHh=-]SiS"4HDdH]5rn-[jOcKc(^4Y48>SKF=K-W?IE2@i:> b?(O\eC9JanG_QFS3Z'$k[: ^2ql&Nqs`>"D`gdl4TlmPAZ2.$"5OD[<*sG-!Tlr1dfXK=@m((%ND@#HrZ4?LGaA &fggub\di?BW=,'l;RC*JkkP9[hSjipi<=Pj8Fg8@"f_(paTj ."GWS=.%AO4m:W31^a)[1?aaN@'s>Rh_a_[Y\t74Zg:2ql o*a`kL7TlXHT!n;o]aJ.&O06rA8??FKredUpkV1';/]LgP,@*!oA1"*07/Q8l/eS KJ%[p8ea>C])pW>:sgVs^%)BRgli-a0EVB^g8 /cWpt_m8Z*#Ih>LeO[(jmD8,/JIDY^4N\boeJUH?12;Oq%KVkc'',T(2D?B@=:jC `1K5LSjEPEYhB`^r]iAF!!1lrn8/Zts;Wh9g'@Dq]F"++M.)I&'Z\$8>(`cWL"FK ieKMDaDq9a9/ol.?s0Nt8]%=P$VAXGpC>o.9IHVKll$ArZbfjc&UA?dAB(ChXl/9 $rm!hSg13V.Co%Pjuc`%qbP3-MjmCq"ui-'`*YXUOK,Jo^qbWRk@4!aLQ#[e"i2K ID#B$it[E[E]&+Tn8AkJqsl-m]s&#ogM]SaNr2$N?M3(-V$o^J#,jm>0*esSG`s4$t[OQ1BePj EYd:e\%!P_1&khJq&DLM9HB;\`J2f8(0CRP$Ih+qR3%=Nc"h m];dh[s!#Z@HhCg+`MqlqY&BQE(oV+YisEqYYQ@YI:gi"O.HF?$C9Na/1*6nH\KW b\RYE_WaTi[tJN%b'\R*7oaeXisH=]\64HJqXV!j8eAR3)p>-N1N_&30l6*cK0i/ fVoj:HMt>m5dAYWN@M.?Xcsdh$G5^*!(.2P98pGZ"Nstfh8g5:JOD$mmQe7Lhj+q E>t<&(uK2gscNAUUa9ej8&I`o!X2STtL3k=Uc3:jYpq$ll-Nk\AOa "833qEPm,Zfc5Ye\&Snc"UJEE4)tO/q&Wk?jBErm9u'kT:s@c]`V)($AMKVk0RHEcgP5ZEDa\T]*=,R1uV=Xq)c QM]N/SdT*'CSb-)tRUodFliG%Dj+O<-=qnJL/s1)DYL!lVYE_[57^=B@!([WN^Qp a&+CuT-2/J1!l"d2sM@!LuNL1@<4_I@MX1?%taXrA9PIm!QVYlLLWK4be`c/C5,H -5ij,Mt0cd.r?WkfG0!B4R>*i-VCd"Gu[AhKd$oA#i3@\]5HEakPLhO$_W< rJ,Y5qF3W,`4GbO\(\U$g]DLWUn$jY-]V9=&NPIOQLh9:YiD-XDU;lZuEb1^U7qR Di&O5lE&]!n],1oAl@\),+Q#iV/^8S;F_cr@nq'Xd1:q'4%V=u;:\[3;ZeW$*D*L P(C&\I\FMSrGp5T6ZG"\okZ74RVs,(O$esp(Nh[%Y04@Y3aT\Z4<-]O#4YpbB(rr GVP$K>b!*LU8Y+Bi;YrDB"^>%ZqOidOEoJ B\"(=@W2"!2BJ`@3XsFZN=p3@VTr`Y=DbE4VVD)rc@f#.JK_Ct&>9nO]V[Z:MEu:8mE4#,N9g'+S67 f$(?c=!`)qA sj"AdrRqT4I_)b;Ac]Mg'.HPPGo'.Nn:gg3(TP_`9Q7Z[-FP%WKh5S"FWSid"?:q eG&#AMndn#I8Z\*>.$\APqpr2p%D9SMKW@BQum,U70OqsdKJ+:\$([\X\m:5O`>FIP_JA1In2c!;-/Q Mi"mE!a4odTDMNA$*!cHFuI_q8n(-P:hb?W=Mr2*UCY<`<.ECqCTMJ;noM40K-?g nI=j"@\K(L[7PG*9-I-SF,`-?tHM[+/pJ8W8VLnV#$[+(VR(+E&2aflI"C1E]G89OX1 c_.)*KF7-FXG%!1Kp[7BMjd593r]hhdOsu(6eLjNc;R^a6?,aAC IJt:4Wf'j:e6a6QVmkZ-)3/R&<76#p'g`L0T0_nWe`s.=kO?MK0]@qiJ#bN":*H[ O^B6)^cT75^daLo?a)N4lR4L<:Sm6PjShs(IneXc<5@PM i1ES_XR>AaI*@ugOcbL4d^X__E;=Z&I-.&uEp'R-j,`9F_Gm;;2aYE"G'>I9aTF% R(3_OH%96Ult]Y)FpG/&A[S9Tclsrr@_(%no[g61!-^*'Qp][PXDOCP>/ZMCbq<` /q:[3aHXA)g/V%^SW_`EH_M!A(7Mlg;tV^WLsi&;o9M*M4/VhbDZ7%Mt#HP!o17E cRbtAG#g^T4&M]>^.D)OD`Fc6ZUF]#Sr(bq?Pgi3(o9tKuKi!M)KS][k5U>+KO#uL`.-Z1(&SZh@9N155-/ekG?-<6;ZB6A>`B1:"l7hDIkXX$q/Z +gEMl8QI%EI?GKkUa7&Otfj6c1jIuo$icq'm2.EK(40sETRKWB.br;>GPmQ)+!X: )jp=,/'M"1"OuiFp>N5$F2jj(ad'lO6&HN=esUDtq+a9]9h*Wp90BGBHVVB1r'eC?GoUndb482(7bI 707nRqG-n*;sjqtLW@,1-b>LLODcVlH_O^qG<7#;g=.#7k'!nqM.gL+m3`RDU4Vm AOXXdmmA;UJ,dgJNoJldm%F5$4hC16smkgOVCLb%)2D-E<)tSf([JW]df_]tV]>B ?;GtFst3]G8S`(#$XY5@OTntC+QBN!CrG3Ec(5N[[,"I;+*USrr@ra`QVf\;1^@i % t4lr@hV_=438e[?N>-b>mg=IF5?s@D f#6*so@aI#FWK)0WXAVV7$V%'`an,[aHOOW"-DCBJW@nV"Z'("'2/d>Z6La$s`s1 Il5HM-T9M8;Xg7dslM.:!rFkGJRW:sb8]uj(j$]S.c*Zh]#-rSmNdO!D4Ddl.q(5 2Z"ou1i\+\aabNZB"=A-HgcmQEPsL@'Y>CS>!A@tF>?ZO:Pji!8V4_"qGU\+g)9' l?..ERj9@jtr;3WC#i_7YS<*"fu\^G,%i;,k[I+8;865)_sK-M[ulUIJ:RR*o847 B&[(+WOsu8OtQ+B[1e^H[E=gcI4]7])Knc2CT,eZ]kqjA"ELn4D&7Bc$(aS*_f4] -gMAjg7G'RY[?]1k7o,iC;He.trf@?qW^&_5Yo=3*c3^UW4iNFBG#=)l&'AD%:a7S8,"q4N7mdsV_9l)!AL$Z1+?\5CBB$;n)oWbj&:D2;5 _@7\#\#e[l$eEZ'?Jk8V:E2n#!^>T(4E=-1`Z4lg`\m % R&5+;.+t`4TR-b>TW7@`]VGjk@aPqFW?L! :f0b*`tm0Y6-=j>#qEF%qp"kC+>[_ZO1t#MtLu[N<*YT<3\O?>/P`,Bhp!_)",YU `]2c8i,[#2kV_g^g8D4$DSuQ">uUXdRm3g::a WVE(r`faTdObbZ`kb,o&rUDo+&DesI,1m>>XWg%l>]^rUJ6tq#OO\>O]'aml4dBG sr8-%Ag\SLUk`gHOL>=^*pNhj*hG<0!<3hssbC7rcA$>Pp(,J;JC[>tA"!]D7_Ch #S*Jket;Q:Np]*31rd0[;J#2NF9J`^o=']uPH:2+s-AbEDjXY5L+"l[.I4:N>0!rtm`iJEe( >qf/m0Hpu6UYUbIZ3X)gJAbdOf>^-k/ M.iP;O!&]AD&W4,S"e+jZ+"QEiu;ZtR_HG_jJGdX>Q"tp;tH%m]j0uAB8VUt9F?6 qH88GI2h2,oF?]+j`k]F)0W+J` 7>deqTg3g&,52mShfD8^k>TZ3:o$rJk^89k=_-ROJd_k[8:K*[oYHO5kTBjuT-hH67aVE-&O%@:V),W/PA;p,o!?VOBt.OD^7@< i$P1JU#4WJ_mUBQ!M*7B`%n0?\(L.p0nZBR21o[Kp>L+_tuQI]& 8` Xn<3/[-1??Q!h9V)^D4MTZ/;SXCAWCc*(n-"^7o,d!@)AeU&7&K)"7nUT[#FKc*7 L,Hu>P>^Z(rrAidm:akkq`1$<2eO@OU-,GB"Y]^`6BO@3gm8DcpO?"VLk\Hs/aOC aM>"tCY,&%\19Jd+pRa0sTU8V##p$AcD0qb+htj)U"JXJ3T&+&(/T/F^Me^IOC,4*PUKLZ9ISL]3TS4g7;?=)[l!+!icij`"=kCs$A9[si: 7aVSaH7YM2D6)KKKP2c % ZLfrNA!tk0EDr+'T!HEZD#gEVFrU^jIE*%fS_m$KEdKI\/ukH(1-n&,1=B+NbdAF$gt/*Z]3[[4?3@s8HK8.f&M.m8PZbW<[\`Up[JAbEkd? thD%o,:>\uX'k)@d7.H]25p`"2hh[oc5:NK$`.fL!Fc:)>[PrYBE/UN_e;SE)RB8)\e6Y6!]-Akl%Q, E;L^^q@SjqKG>N_=E?W*R78o8;:4)&bpcR>X[[1>cpd0C$/'GWmek/->+)!5"5[8 EhLHAcM6YOCh#rLU--_LbA5$A]PEb%%AU/h@]S54:%CB1YZl:pkI^gW\[j^s,P-e 0GQ%&=Mp_1;FRPCcsP#QK8ee8QQ1NZF/FkT4AR`RrlZ5Mm?h=<+0Cca]I4ZQS:a" =aJ:K^^0ijBuE;I!_#7aii_'s2SOk`OkPuk$.k=D1A*H%d\(HP1Brr@3X 3:/$U<2IunG*l'nekjgHOY&Ao9e*V[a(!nUH/c)V.DHL92^XY*r0enSC*oOd\uDE TMJAU-Jd$jmD20"@Uo71OgT[cfLFn-'=%p=A08Hl-a9c@PmrRZKPEV>2USUJS%aW `Y-Xl%]Qt7s@Nil5P'6YUNotceMP@0'D)jGM\P;Etl,sFat>UP?%9O2.]Td6*^4+ ^6IElDU0\oONRBlpUj*LP&T[$?_99g'3dC;N6"oYCVY$3oMO=)4>'l'm0+OUr9)R&,72ZihIncotj\`8"E-@ZH4-(Mu%'iC8^#0WG>n-;.D'CfjmI! ?07Fo:2iSu[eb4Nph1GSB_$DI-t:E"ZO#jQR]-M'cJMX [mUFYfatua$ddFG;:EhIrl^QICTBdtFN=a[39"q+:#W]lMI$?' fkk6dQ+opQHRH*pTu6q^k0EnYC(H/]d#A(CrbQH^Ldo";Q2<^#H.mpS[nKo*#r5A -9225.B/s.NT6Abqg@_oruFjS@'r'jHr\.:CSsiiLm2MWHcgcH )#qP&4te^"0a\uQ7!ko0>b>P/f\#) /CH,W[TMjUO9q'hF'fD^?2'J\b"GMX_b/LglQK2u5cO37YQ`+ZUbR("(QYRr:C8M @YAk7V3#g=bhZ2utnkC5U/[YD`0Cn>.%d(n.0/7q@/OX#++B.UZH#pbFJjb4RDg) ZiXdNgPX1\WWE*f4C4UgXJPIBCQhpmcQ/Eh&C5q25Qb]$4+sM'6k^E"lSP[lai8` 'mXf:3MXf-*!Z-Om025KRlr\/69A!FUDA%k+Gh%P&[kYPIQ_j\e(U7WN48)2-G%o Obm+1KILs0'1fVq'Tu[MiJ,cRB0`;3ETnnC:Wc,oi)b5_tXpDEgaA'(H@m^DN[IjFceC7 2D?HoZ66nZ'\SL2Pc<]HPu7Zb_?I'/?iOpNG.Lt&FBWFM)XaF/mPOqa%_eYd3UkC l]TNT7sj[4CqUm^5M4L)lDI-2dL Rl]lqS!2Fpld@M*kCGfa)++]uT5#,1C4WnBnX@<2)a2e!tA=T8 @k1WO"9%!VSfg]:r[.l]8h]gU)(`HBg]S8e+H$_#4l719tn+]Eh.5pZ;H3&Ikjfc aNuP>)j8a,:e":T1i'(g70g-7c,)!n%]5c>.iZ5E6O3%:q#\VP7Z&aXWs!RkXp?f T3WR5mK*Be3aMn/BFW6>#I_iO7fV`K1PZ+(G? G*VY]Z<@B];ahj8:9UXa"+,,0Yu-3:.3M++.XROk'b_=9'baf72AR6N_pF8dRA!h FQ%K*QMgcL"JTQ17[gZni'\io#]m*r5.k79s-TeK0ecB08FrN+Wp;1h'K#7*dM5t -CA"FN08gMs!>`KnD&rd'LePsuK6ep22Z6L=PB%l8O7BV2QH%fNE7U%]),!&43A6 /Oc;=*4$&!QW1%lU!7+X[%6':!B1!_Q 3S@d6$-:n^Z@]8@#Q UB97Y=9t;\mYb]h%CKEf-S]L_(;BBYkGg^B/ON&'['T`>BpY5/Tc0s#*l-YLKA8] cF:q]N@'FQAY)!htQi1@\b%[NTZUU9-pe21.]0kgurIH9qE,_l9TEm]KX>5nTMhj ,G*Y*mZY/O,gkU$CM^li-sKi?MWsBcIpn&e0XToJkdg=3!Sf)+h?M7pVnA*:t"8A @o#"`Xts-*Z$GH+K26!kLlG(DsatsP8l1_n2rgkj'^3&#:,W1j&I!AR3^%-(;C?& _Jfi!k;W7XhCrV/9QnZJ-+h_LCP+lN.f%(GHVDcN`s.(LONh3lEM5&3@=q0<9o/M '"WPT$rr>OO'%BP8bK-DQeIn]fM:eB.CKoc3-.d]@'Cf[VfoBQBqa`aj\(Z''E+s bjM*`?0:K6@Q`m*earr=#W=^'fDL8cEj9lDck%4lnJq2Qk9,BFe"^)i"]Ce*u9.B nssEZpGP$otRD8gQ\oU>Ch-G^Qf'?U8p);s[KNl2Goa#;a`83dAHPeN*2*)?fUq, $j"bfZc)kU\Ng3(GY_$.ak$*IjkKD$lT\IjlAnBBVqR[;s`Rq9/5DO$,ai'P>9b! *G%Ac4D7VK,,boOE)%=&1:G;&f>gHFo0UYHW,'*$pi=3E$/8$*Odn.C>.4- fJ?qA_B<.`1*mB1l-Kg3b!'Eo7k)ctd)jodr5$_/+e4ZJ;RGS+#+s=TFb@i\_#$4 S<\7CFoa/BcibHXWd9N`uZi$]?I?!2e7\Db!4'?=UP\QUecX^&b(RWO9e+`GpUOG /p'@SZtrO$#mk[PpsV\?f*\@@P9R)!TbJ89H]D>Q?Apgb(M>Q3@K$"Z<+LNl&n#h 43p`$mo#SQMnlJ!!E9%4KJP'PJsQD7qW>"(3J3l2C_H\o=c?X*`q&[P,b;:X0ShB e4S$WpfV)6>3)pq^tS\P#iDdJ>X)mRUGQsdL[*:K?0mHe0OV]KKhp:>7_N%8'#t068K)<=%-0,Gou+nO*0R)0m!iI/qbU3HW2_\= 0XE5aTP'P")[!;HY?e\KPD\@c-V7N!`J7?7HM1!r6]pKR6Vf8=+Ei0RgJKM>GQ9J ZA]jR:;`eCk"\@%Gl\s";dQtg:A@Z([kBYt,2(ig;f&e^LZ;V[@9Vs+d0N*/e*)4 bo*eljA_C@-C*:gn7]/*7(WcHGCpHe`Pe%EH]mS@Hf&G['"Sb)Tbr1O%**Td;$?Z >AgU]+h6\,1VYrrC1Pk/#nMl1Y\4l:^_!#<`!(h,jEVGE_lO_mB3!q3?a75:sY3( \t:ZPPT^FZhfj_b0o&C]2O4TA[gQNhD4ptg"2VWnh3N+Zauq1h*2l"j"I2i3qFme ,5H3[g!+"+!;;N5GDuNc%u4Hn&!:\CSp+E=!4%tR`a;=JcAA0UN3>s1DdBEIG+Wp fnXn6^Z_G4Y[13-9gN@t""T34_KYERlFll?g0:.s.c>(2]h'_66IA8HkI@V2RB6# e;/+Wek>rVB6M=1kE88j9>n+&K$Q1f"b"?5@`5Bt$$)*F"(G`X!l3B#L61DAk`rr %%EOF camlspotter-camlimages-e471b3c4470d/test/images/gif.gif0000644000000000000000000007145212405272062021063 0ustar 00000000000000GIF87axPPXHHpd`H88hLPP<@8$(@,0( 0$(8,0   (00 <`$8 4P,@ {>^;:6ؠ믣;+`T0S= =Pā4o{>:*/ C,|c` @ +J@ҍxwT$`WAD0p +G 'N8P h?@#amx0 (}9j:N\bX zRL@#"qbD$0h#=aȏ}A!?x(^a&0R EFt"&q(>Rъ3!GEK>qS(Gcl*_ E1`$.oCLz"%H^+=L9&0~c22<ӛ1+A/)KQ4ЩӕԢ(C->z'7?EuR.Ur%'l<@?Phfc6RZG0 @Nx=j34# HE4}vl: `h;qgs\g:QTH԰6zmi"v.5|yCܪ.ǽy<.7΁g[랇\~zuwc{0g<&B0D#N=U!m;ܟwkphgؗ_|=^#v<7GB=Opȿá7vG' q  `57ɰɀ }wuv^|_|U}w H{g{ ~ 23i $u'ww @{02 :5R(7 2@[QP[adf[p [jp Px#7 t|}ȇxh{H|?phِxpVX6pX 0J484( H h{ (hQA8 0-󷇿 zpK 8e[ܸdbxXcx x t( 9zhh{z؎ x ~@p i a p Fp i Hx؊" &@ Ѐ d) Ƒ 8X( z 87`{S 㸍cH䈆Q0ȍXٍex PP OQ bhM А&mٖ%)>y>;yzy$7pmp Xb  nP7?Ɏ)Xw)mI sɒ*390'cQAԥ Pz9+i+9&9i T`h 26=@ ] 0 P r3Er +7 6i 4*ZLC;F+,C; m`0 B@Bp*[BPQ`Q p @ >srhQA1}.rB;w f  )PyP #T`qaqw{ż׃҃ha~7_! ڸvX]|h m'ୌP3<`5Gp|\PLUg?pπc]<,\A03* !qmw(w#IP pn`h i fXW ٕ]Rf ga2MjLKͯk!,Qܡ '|wwP || %U |pp < }B'c4,Eۢ $ Lh 0;bx'9 pҔ]b4!MɄ1#D{*\ŗ Ǥ6Bйљ68b:  <Ȝ+ډPF -7,/92kI-0q=xK ݃i `9o HLp@ xX//Q,4A'j3b]ww457P5pB@&``9Ъw /~2uAA *+L{7 /{ L` p qpg`˒Wj i1zH*4]Z 0}pcy݉Q lS&@  <50B` <J; F(NiSSz2BNUѺID*877 s׭ جC X ^i v ] }p ]113D~0 Da m(NED4 ,.3`l&0)9J>9 .ܖB@~ Iݹ+Uj.&:i`N  p }PXPhPH DC84m8.=ҍ 23~@L:6GԨ⛎ -^.IM:d"P;p4`3/JLP;`'n▞!n랮T*~#NNm%rЙ ` l <h  ް oJPFl]4SQk Ȑy.,r| ~ ԫ  B-/^$l8d bCL+0 F?nܜ+f=쨝[\pA5a6L㐜aV׎Gv((aS\lJs]:u"&y)?sUc )|&-l l0m^e8n9G2ă Uk=MBYZƊ1md!ksj`pY$ ww\95|~ѩRYQpK)>i=/[}s8MX"`$``- щ;ܡ xC*Pq GF|< &@ &DkMs`5tf{+qBzq`1`>!b D`5 >y3UGm#zWQM KൡB$qT0?ChWP#0G(rP# 6F60NLA/1%D#`0Di& {%i^q-bPHyJHо6ѣ 4 /dh62d(Mt|Ro>JIf:t` qdOf;d# P@ -`cF[! uDn8̃{[j`AUB[WJp9\7;N8a*Q%Sx$MT2h`y0lcP1\`d #\ W!~"A;mÛG)txP:Ր&\4X*GA$&xXCe68@a/2 `J*cd0ˊ,/ڌ3IO&8jL"5M00MrM"Q7@%/>#f !=L@fS-`Bqd,:ϩS݈G `xԈ+NȈ%4`dZ"0*zK:`@064GG!<d#Ȁ"BJC"P։~LҜH֤(K9wI[Y( u L&49lds=#o<> Rf-P97M/% f̈ N  XȷVo}y'&xh"Z?("-6K$>X" HzJuD({ [|:a( ].1,r 2$,Dcrp.©+a!*8MjMճ)a_/6m9;_xk\!=(G9Q0[vq].^JQe oV -n[=Wh[(C=9@k!pQv!ih-Od3ޔ ˈ8A ~wqWj?ou-LNfz*B1.^H?1( xkj0W# uSD(! q-of!\6(1 @6>ASG2 V\To(ӁP=Fы> >H&e͏9 vPm'%:O;+51>sxY0UX=r 5SSK8MʇlLT0|(7X(| lӲr(lAp1T0TдӾQSÄB Mػo0vc1[iZAԹ49Ijӭ8ghk;Q{:99 ː T5Y q1=(T Æx$,p)mr0W0I17q‹Tc A_`Sn8+e+ڼX@2Cʳ =;@XC0=:(Fnv#oLLIQ[0[PGʇ(:@0X4JO څ]npJ,@X4@^C;5c-U1:N@<Zo9p,|>8(@UE gPQpIF%{IEmzC›5*=nqBM `lW8SpT PW,GȆ"b@+:UK_XșEz`d|“E/<{: nsIݢ X;A d@0FcL 5@j0vv7Wx 3o{H |Љ{J8W0># ]!Y\;y\M(+Iq,qÛ4FuKŒ% ŚI*֌L,̄bO̗FxS5FbOԋBT5s N,SHTGJWJp=q^ȇ lj{0[N ;+@:5IOo9#aam Йɿ UP|nPlM=@О0Lɻ(K\HO֌̙L=vTǎ*KBͦ|s@G>^41X{TlXWĆWRNbNV̈́Džl҄Ouӄj(cKi]Txx KCH2WXC7<T t}}Jqv>ma+6L|HUͨVV gV%5B@Y8 ~] a @aXYZ`=]hY i`]c acU_b>ܝu\ge;qRuΩD*xTHD}eQ|o0>oYpYqm `a^^@S㾸]=VŽ_a.`nطtVc0lX` G6>^|^ڕ aɓ~cE B .s`^c dMegVDʆu ҆fiuc``8,OB0ly?heoNPB+j*C`JWh]~7vk <ɍ>Bօja+&jnl`chDimh>-8pH,0,8hOVyCxYLPaj0RH^Qgtyַdhh^m```Q`k bd,^Y fdVHl,p@ȆepD jJm>ZN洇4`0Ȇx[PHH8 o,hD7hn \vh~^~HqoF]rr.rgh,f3Zlpck1Pq"kFg\`Obsl)n.tO$q0T8|k@e0W$nx5qvhm(_uT%@𭋫о h~U)A݅gpHfsygw3v]kv]PavjjWeOvlw'fULs>`"/`eBx%mOs1ya{@ /18p !髠A0q0%r Џ >#!pHfs>fg@]UvO fog/gjWhe@jvjk1n@pp8~K^Lvs5'VDk@p/a20Tu{psxmȁ,N e3jԥQ4El0bu uE]T7}#c-J!-B\C xHR .HmCC*=W=%(>ԓ{j_5T|JVSؠ>d 5#t}4L/(Mr>ɸF&鄝+ih*29MNܨSbCM6 gSq쒍٘ =S#u *,. !fBvN4 tfxd)HRTG| JJz) F SUeq}{KALB N&SQ?$G8DOa 6Fɤ8#NXDc@:?:b466i7Q'ӵ6`A CF/L1§e7mXÎ,e)!SDg.1P'0WhG>&43 ,VR ,Œ:VT|X%ڊ>=zme8 . By=,P[Uv q WDR*P2q Mv8a&!} ,AD0(PS08#K}PG98CTPM4zMe`5e]52Ijܢa0#7"X@^4X" H9oռh p@*08d +$kscx,ǀo2`F6a#< jސKvt䠣| %Xsp&-XG\x.\PdB~,!X32!G vP!K[H-|NDSjݐWmt#\eV C|zfcztkZ}! ݮ?hPYy4?cW1pZP+s E7T D*[u nXDL0,4g`D0$b^w%`~p؆U`R`@]N ?0EyzJB%m bҐVDEݗ"*Փ]mx=|lV[yR/{T`gF! q@?;*dŊ HpWXKPh<#l [\(4%/C\hD#XN Jdc.L0a<J5,a ?C6j-}ye@?C6(SP a8э9Ϡ(@g"@MVFqBht>@Xohi1NHT{Z".DFz#*|6%pTA. vn \H.v#q )4LhE Q`$(q1"d7] |5Kl'\q|UGxl7%-xg(f!}HC.20% HBmyjӡ>c͒0$p`q`ppsBP?_A9@Z} @F[_+A&VDfM;KTB@CrKDd|CGh43<3 %(Br3.< J@$47'+(@ѴYZ@S4,W[ dACZ}V}m+T Y_x\*Q)>a8e?؃؃=--<A%ЛY%-,\[$*AHlb%/ Ȁ%XI`&d/ C+PJ |u2A}ҧ^ @ @\guu@"V|@^ 8(z@ \gDм8QbE_D脝ͰR5ĕZ0c4X< B(z2uu>*>j^^g}n~**@W¥g7¥W΀ zƪz TA:0C>CPS!䭴9O* Lja9C8C>38#-&%m- :=+N2ЅIyzI"#X^*@*l+<d @A`9T%'1N>(zAԩ>vҀA@jz͂ |( @ +,(_bѤ7CI&C4؃;A(9HfQ79d;p;4pB0 *)XGö=HX~aB-DNHmAj/PJ, zƃ12 ˂l&hu 4&,(j*\b7by2B<ZE[5@j @ 0<\ DTH2#,Mb =Q5=9|CCd3P3=(L`A;|6DBHDBD2z갖j.?#Ʋ,uR) ˲+- tu,DH Am 01܀1. O *rr 42-$s :ioFËA4HA,x7*|7'-;;(@ -C6DA+$ d3)pDBF(R#${B@m')gʮj*Ct@о+#-Ir]Kn2221Ǫ,R?z-Tq (&d`xBC$!|7xB3ds>d=C: b C%.' m☰ХR2 jIҺ, g)Dj,p?0J'膪$ E*{(1"8?mG@A>pPHLdE+Ɓ'#I0pCg@=؅^:%=-D8 ), 1DD$Bħ/q_i,{]^ dЀuvp$ @wgPFA0Am,Ǵ²OvIC(pW@ 2+h5H8TZ$df)5H$8X[M Q;7: yB}4(}r6ȹr$/lzBo( \X(],R®': Wl.@(z>ŏ :4R,|'A8i ?b2$B<.7bS98+ƴ2x7! F JJybq}cK26$, : uNdC㬂pز9nvl2v{jFt'_gWPCF(>S8 )?!<(66D90$8@ə+D 8`7\0'$@ԫe{x%DDDBCνg@],*= \rN֬c2$477h6`^*z:@!D`7P&3j(DC!^ N>^%ωF\haܜgo!YԠ27>WL- U>6,8g.l գe_QA-M2]B(Mo5%r!. .AwaB!<;#^PÄP2._3zxyaDEǏ3Y-9VCal~ؖ]/ĊwKQEJcFfh1d]#,mQv-8meTp=bv`?),\-@iuy<&rAM~[2[GЂ+KZ8a$YR- 5ANZ ;("!'|panIW%>yh!w0ˆT5=$b8R/}3}E--M%a )製}}NqG6'($j& H$mp8  "zIa$Pa PClNi ԺB2|@_}5R_ĆShCuL"(0z3)Qb}iPB 2\D\q T\ЁU{P*'_VmB&csaq3 lP R"yf} 8) p9)ā#sdY9Yj1yFjf Chz&D{Ie`[yY!D5ŭVl`æ$ xPPmh;8~<7Ɛa+xP&hquE.s a֥QN0M jȤU;p  ` l 9ɝ1W$nPJ4<D>!J'&Ц-;@<BEԧ*i8&F1+z˅V൱OR1C \`9WFZ-( nD;=b:`q~5ðM3R S+^zDB(!? H i`A d8$ pBP(IDfhAaB6aY}C;A l#X8 l<"s*7 |'敥1E njH$[ di Z5{I2 +;JA\%L BUj6Qѐ r(]̥!c`&G9`6Pe %0ͼ[~Gnun,bۉG4|ġ<( V6d!2,  Pq @`pЎ>XRU!4(J$L۬iL[\.7(HMmAlRF&68%e#ہ\0 c`[" yЬfۺ{I.^[o*4DZh` 8@FObP8+"dx@̉k$ :\o c,B0 -l"0\Te-r lVk\,t eK fT[xjjuK`=`MRA Vdʔls _TWL*M@`je L dTLŧK b^G<}:[1,GhD#Iz7{G< e+@[xD;Ȕqi @"|Zi[,=A ڽxYaw(H-``aq8o* .PB4\PS2N\z PKIp^H[΀ vB <-yH6P 880;S$㟏؂}wmnO+Ko#d-FB+@p k 4N/^( `f!Av!`"Zbj 2>`JNN> ,aX Nax+#^F!l%#zgֲ!=AǶ "aHmOf@J }$$-~4>`A"q@m&p A`\a!#8!bހmOO)Pޖn:`+ ! J`āJ ȉ.pXb v>@aA<# (@!#!Rmx6FC!P!p^Pa!^aU@4 ,dj,B1=O /q$p? ?`RPcPNF(7(r(* &`̈dC N% )y<^Q$A da^R XlH`'1*& - !QNeUUfSg'B.&8a@ 333$#Q39S33#=C@!V*!P@vh auz'KRs7 /s>'18ٍxNuhO 0 \"^!4%<̒(P a à%v- ^%o v`F!>"r-(2V035@331`D7D;314`x ZL!RA9 4'373I7ICrIE3W3=SIAX`ƉuIuASR hNPSS !30 0^BzG+ȱM!N|*!@aȎlok"#"5Aނ 24QTD5EQ4ETT3O@ ! u&d5Ϩ @SJSDUXID`>@`:&jY( R^`5IJA,ܣQ%(O^Ax` RP!A aٞ UځURK (?-T"#d[!d>JdMdA@D7dWvDK4q>^@]8ơAb'JD3STAdCDT5jGeAHWeI$,UuihnB} z aj A>%D;s$^n!\@!^hN u ,)i *,-#:C]8t9tQtO6kGwt_fs\F-ʡawHWu_DKdOeKycyYWuGt>[1&ٺ+ 2U @$Hh>P@a $`֬c$ A]P0,w`5& PA<!ȱ V uS#,@ +AM+xp-8vVjU2t{)  )G/5y^{wA|U[ekWU:kя_!!!%b2±pN ,=^ȇoM"g P2A\׮|*ף;4-"-! u%`u{K^cwuҀA^ZQGYuU|wo ?M59T>S* !"+XAaшc@܂E4"j@f@LH4JYXF*"fEqIjhI+'q7ԄU4-FNسE0s9~ MbeiYihhq`n9lXf%#A)dA9g:AN?PcySEDNhF@&L=pyA MSp\.[@Z#b F24!$I̪V!N@%ޚW4XPs 5- b6Gh/R="Y%bYR22 ~K>Y 4x彪6/鶁q@@$U@ T 4 쳏ЌQ7$r l i<[n:<QW0L2O#! GV%ά!4#?i0Aȓ<ѤbXU[xCW06G8*) @`%-5nW&p/us]rvA@$&d8ɘ di9<88L,P8 !!ޢEz j  XmA0& EbXE0`0*}.Qh75\!JCBfP%-( B 중,J,Ps }  d!X``xذy9TQ%ar~-).yRw8090 KBn3 ;-gF  C_څ&!QLǔ.)] )е\3\2])@M:Ps?4nam4M` 0 @7 F? V &0,T@u @l  dpZ occ(! .qn0nXynWLy!3eBymE\Q<;Е+ z*Tp|:/LDLh{z:Te4\3@rB cyjH1E p0 ӗOէj 2 #d7kQ0{2 0 Sl Z 2o; FBmoP.,58)9`S KQB@0'93P(x(- 2e'zm~fpf!%%fSRڵr9`U0ʕT2/vJGrh٠ }5} ` dW ;``Q }  ~("n5m   4Z:-.dE85/ Qw&4 o<xW4P3עB &G7x2'OPP G`x::ppf\g\Gz!zBʥ2*|;Y_0b!t o I @ 6}XA e`H {0 ` l>#`  @0 I J$G҈p$N2w.nS%cw2@5EТ385pBp*GpPPGpD=z::&@Z-`I ]L"a:IT /`WjǗKÝHKU `B`qP}~Wd 3 YXip # 0 $IjZ{D%F7:$[vJ%X0/`Sp3<9 +-:W4;Pq&8p2Ċ{6)FTdB2SJIXu|iTs-f6ZCHZ'"G &pcq kCt `wzqް `0zbq4m`7U %bQ2T%K]12o2`-50<^`-fy.#qJWVgvL*p&WgXp}R9`="?s+Y;E_ ֎& XJpOu:C7G4pِjԠ  Z$ JG"cIBJcJmAFK8 0j2P<; EPK. 8e)i`uƥJp6i:U++0ƹX\RG\:Jt2EJ^oW@ cJ ؐ m+ S}0 0 ڐ   ̘7F"(Jy!*8R "+Q+˺[B`8ˢ6+7pv<-: 4&40p<:%9e;`{>#" x pH 0k,=V`b8_(> PD}t |@ܠ Q]#8.fRqI ːmm%x[8B2˚%l$¸Zw˸:=z .:nѫt.-e_xC2F5\+[@ 0q.q`Y c@   I[.1Yr$ .`w&&d~ *貦 %&3 8-.<9PaľB=[-<iG + U8Sn YV??*`*ƣpiˠU k4} }i@ }`00p؋,$;ƘF|ћ!Vu f % Ȁ0 :`.M9>ªk-*x6;lB˕9PE2'LP!e%0p""?W-|8@  HR.poK@}50 @`p 3ƈ@T- [.w,mX` $9d8᪑xp +]šҦK3 e!F*6:' .wyzgye:`6 UjCzRKs""RQ2^Ippַi-[`0 ol  09B`W-Z7:̱R"[xՑታ%_š +Кڞ2'^)\LNRE'BO6?{MZJ 'Ɖi` oF z5kƮtUa*YZSQ^_!L^mD@4 R`@ ĖDNv66mϐZ~c Z$!T8^Bn^` %}%+Ң}0J>o3G3 ׻060\+{}8ep n4߫5G+L! zAt.ypdO{ { PhG41׎ 4ɐ!A{7k8t/ B_29![Aґ??, 3f01`Aȑ-jL!"+Z0CGhB,E S`fTpLXbl`Æ խ[˖9s1TV%[[ٰ!,(B}PZ5Y6o&'@ ȯ_W{m`#Ȩ-U Qx4ҔiTKQgʤԤe& 2dB  *XD<|0"aN("o~T;%0W\ /3E sL1T j*Fr4Lm.N ŏJ:tJs " h(!Nh54 ֜AIO*^1j&/Qrj/{ɬ+1Gl`ӮOE-5j@H(dA>) j&Tg`,AlJ*YưG +f)v Mq ќ9[MT!kM4HcCer+)]&(h]1`"1PBwlv%`%xje`We1C[Ly0K`ʩP٥XTeOZ&TA9גA$DNdM`F4i;Z1L0V09đ1!iIaRH_ 뭭k6Vl愓gDRٕDDJ{m$4qM#M@s͖!G RuMpTae 7$ąpPr͈;ήK yHN.RtLنLYHG.pqa@.t(8-mO"`$?h@ (lP r4DF-ͅB+Ι8޽]\@5zCN$mk^*HRNHlhW'*E\ %-rt;camlspotter-camlimages-e471b3c4470d/test/images/jpg.jpg0000644000000000000000000002501312405272062021101 0ustar 00000000000000JFIFm CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 Quality = 75, Smoothing = 0 C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?22h)i3_>{Bs֗ nmh║ex 66q_мº>W)= //x_GjS{F;漇?.4 (4}V`>箐q֔:׏/c X(^}_}h"|vM#m?8ZU>Odc{גg^}\'㵮>]b}@iSn>*0+h@zO EX(o)=|ғ𽭿7&&.GG+(Od{;WN4^z\(oiw=wW}M?]g/RoSz(k]?t?!a:̣QZHs^I Wۏӱ΋tu_{)=`R+٧]iS“H2dvRFk9ҝ? KϽ E1pzjvrXĶ 圩\&@i+ԒoӏQG+ݍ\M:hrTfxpzwlzRkƜ\4>A  (v:o{PPzGW=W4X_WUNr%H״-6KUE,p9FCY|0Twn ez+`Gk^ yGqnf/d$ {՝&{q5Ǜ8H$OBVK.e&x_"6GE E 2L>TQ8}EzN;'Q!Y_ O8A I]6FA8--s){`2]O<V0"̀~x5>[Um>OyOLG*JxOC>i[I OW^P~T1јgyI ?t}1N_q^,3RdGy;xF? c|>Uf I銯 Tn|HJ?&/3_A'q^Ry2Z;.GuRG ff3亟>~k Ŏ,;\w8#޶W,aֿ/Y|CfP FXBȇx#97ou{9eQ1^X c}!N{ <+p `?j:FuugF{EQ aL^Nk5sJ1dg) 6Oy6ܫ7 I?ckzGخ 3 ʠFs~S핥T'^h0FTTqb@?!WZbֿ:Oq֜PmR@ +“h9ԔR8mAOe,_r)ƳDѶv 1fVז gECrH 9'6VvsZDd+s햍)%g*W#hcowDJnߔHqqu)ēR%PU3Ӟo|۾m'XYgsڷn.Sec;8'UˡχYt9l>Գ„>V$x<~&h֖ǨjM"E t^_i,ېIsĜ`V¤3I^k\TA%6 ^aHߊ~i58 K#rFq7EF&toJٰ,Җ8iRk5UұyPn/>fo}>cJN#}j7A5ԌpqE'BVH2l d9 cWZ2ݝ.o-e{y"-~Jt=V_[$ q\~/?bmb[T8*~w)_KČ3s~Zғn[Z Sע.^+qrpPpr8z/o]B͓+2@[9rj,F_e)v'w'L}sϩyS~;La!'>?uFVݧ9D!G5{jܤjn\Hgt)bTe#O #ew̮T?SH=:i8j5u#zPŽj-h NPW] g&?1&&x o$mھpӰk#Bc:ǧA09>YP܅Ӛ 0+n\iE6j3qj4dcBU!"vqJSp9ֳQh|=2YInrȶ\,qf5Z̲s.FxE:޺(QU%sb+{5n&x,P{DUu_+sƦѾ ̀* ߟ+]8SSg5R;Z-_NSO hi~,^[VʂןK]nkUnne 01ֹTIԨ6ƞ:Lچ:$ж ߮y^֮m1 pˉ'Sبyn!I`w8ç5ц39qUM%^c!D* rkn8cbM9 C0sWYsrI y#~4̾#jx̌.wu;Kt%e޾OӚw 9HTdt aAV(B^w8}S֯mRI%ԣDG?B9>خVծXM]7tg+՞MKbF|9Zkw#ں`5Rrgb }(6;zUdd4QFr#|tWmMB}@\ip#}jNj%п-Jš[M l2Nk94o4m3 'ۧYXf˫ +{S]nt3ݨHᄫ,q`8<:z59m!!Xtq235k[կ-L۵`$@l6sD^Դg˘!"ad's۶+;O<6*i->mԌ1'kfnc3?8YY 61G$GV'9֗"J9z%َIcM5VV2C =ԑ9%Wh5Una"2)S⋻h =78(l,.mClً?75`Ƨ5+<}EWis6qsX>rc=’Y!O)UU\篷TDٶ8¹/!K䒿\IB1*1'ºEw/;\A;6" cZa&G6@ uPiCCEʣm26957ٔǠYkL5+VGܬ^O$)jhCfƱ8mav$2 g7?4-.+-R nc(|N?j7uv# !דQADdUNFH_57TI?7Ord 08GO~a J*?CQj] *MNRls='$n8V)e{nJSQ{ #/.gTMU[aNKzjH{cV HFn<j#)- :2[f#9^58%|rݳe9Koy w=Z0^秄v"nbź&l\-,!Pc~$n[X[4J˘q#߮8n5yѧ  N֨IV1})HfXwA060GsvI4`9..|Ă7;prTq^!HEjqzs09XHEa88tWK; ky "lq=;wq қMyps 2GNz`^Vi#̸$1 ~DⱼK<ԶUrye'~Kcx+#;ַ%4[Iޥpdq9Lg*FMyE%!Vm cc--H0bhQ4dXtupF?Ʋ[,ұg*y;Vr(tbFX;Sc{W{6D@qlnoiA#98!n0 Sս2d8BSZz>t H}?=K5? :m4W(-TZ$n /p~Fk;Ktr $Xn's]T]8N-nv~!=qtgӭ,^I8Tt1k2T8r \rǥDkf*v>qu DI0>5M9dbOҽTjQH愦Gsl,H]@>E!$2rwAǽt7\  p#MQFXq(>lu s sJڴѦ zt8i鷒Sd|)<뫿cnn'{l.ȷH)\c'c=*9.7ZFә-du0$}YRcyъ|Hл1sRt@#qȚ_w,SH#8zucVE;[ۯ)l$ǿ\T:RV;w4mgi6 x䜆Sߕkê4Jy{:}1]VwJ¾yMN@nMNygWeRB<Lrq>'\*L7F~l;zQmWbխ$wK-e#&.6C\l`OMmZ5,:g=5i?m|h\C. p?9F a'8i[J)4.Wڢ*i6bȍU3Q>F[t~Eu&=f/ v"#d=\O%Vo1PVF$K)#4J?/ѬovyHf.[##<~]5 [a ɖN"}׎*։au_oh#a.Q=8XiVV`ܤ̋>S8Vb=վ7pB@ ßF&~ʛizre֓{jj77fO$T1!RDYe@뵈r+ֵŮ.|W} K s3&ˑ>85Dž:V5;}FN{4rN[kQ^j:!;ޝqs9: edWf!~~^21u/8=޽=>Aꉟ*'{IcWLuzs@֪zTAGxj(SKxVW=k&o͒UA`dk>Zd0r[ AgR?FwBneK@YxI&1M" Һ{H$9Q>,A 8]H iG9lȃrWK\gxNUV*V6D}a]&z¤س}Om DqErZ[h$u*ÀW]'>*6\31WmVӮF:h GI#rI# ܞO:F䗡:z_Bhnt+BoP4H4lӽU[d~{._ 7q^-&g#^Hذ Fy5glnIj3F /Z$q2oID{3O AEaxWT@+Z8X0 5ۮ{96$Ur7pXQB?x!hb~Vt U~ŬL k1wh+kbqx8N2s5TNM3ٳgղAR$Vwd,!*?~5On<$r?LT,-pZǸ|7ʯO>yA7U2)I䯭B;S|cXZ[ki]dwC.q\t(fѫU<@.<=ܚ_QwVT˒Wsj!95ZmspKsǡU2} vM& ީ$uZr:V l }6{ (;r&D/+ lӍ/Pޛ;PDr@BrԚ%qA=j#dP03:~ՋDA؂GN YP:n\UZJ8SITr>bf=½&6GQ0O*zmduT6>71`VOʪuR.Q'+N־#1 fILq#?Za`k'9\A  aD]g3|ǁPʄ7Zz%m<+a$N2@HG"|3gAv0p:d2`zU7?-ѥj X\l?e@4jѵǔӆbl4P(#*~1!Q}oUcIdڶyǰR T63?Ƌ'=j]2p:{mT| U/B`g1'>ܻʱHp?!'=oUѓiWDOæVO*0- ],>}(,0` s \ A.}?*v{gM^:9TCձ͌_Q ՙ =)) <)E@(Bqۚ(9S)J(4ESNZ(A(b(a3EPhy)sEHGcamlspotter-camlimages-e471b3c4470d/test/images/mmm.anim.gif0000644000000000000000000006274212405272062022031 0ustar 00000000000000GIF89a@@000pZ'q_8ufNNNNwmwyy?pNwi~4ˍTro{KǔfŞsţŮȻƻ! NETSCAPE2.0! ,@@000pZ'q_8ufNNNNwmwyy?pNwi~4ˍTro{KǔfŞsţŮȻƻ dih,P/\̇:c|XpHl"`):-Y/Ud`xb1EK0LI&Vc,uSY0&^Mhlv-ikm r o ]D  , 5#  g&yDIf$Lk0$UWqVkDiz =X dr D{RLPG( LՓ(kć¦3  `@D ,(0 R&h0!%408sɳp6}qF0"29TZ (y:AyUf>N0lhPV/ Fܚ,|v 5-'g?P-6ptJB0`$ r@ǀ1ۡWє~ѻT hD-41v,p.P[8SU@DŽ:DAg(ٽyC$}4=F($WVpb0%Q> ݨX@){ׄᢜ++$F裐\Z$QAdç:$A`8LÆhwJDAF /|↮؊wA%O,PHٸrpQC,|@ *l&gl93\;{B1@&L7 `! ,@@111pZ'q_8ufNNNMyn{||Z{g|4ˍVQopyRɘ`Ɯn̥͵˼ǻ dih,$FQE0moFC,7MYOhab[-B5YFҠO <"'e!.  t}P {uve@K < S.Ky"@Bp$KWpx$@`HiH{YjEHvdpk ot>KMp KKE˸-! ]L:@$ƫ ȱǏ Q3L!4`*HrID`SJǗp+5N&vMt6aS5FQ#0tio )UFJH,1rT *d Lhv 1"%.r l@'4/ ]XhFƙxZyaЅ XLjI$0@BGr`hlKˌq Y)@z!kνË ߾m8ӫ(O޽ tI˱ŕb/QyC1#YIF4SwLiƄ|ܕrx8S ƈ)UWHcMsL11F5QUTu"4 CEh 5 A6pHNGaA,a|&\BAg.%4!&Y9HH 0QTLz=WBhI#' Z[v&lQ{ ̂Ba;%PLI>Z Z221zP\ryp@ I0/^Ȼ N86(IΤ4$ܚgڲJ21벲ޟ`elՌXPH9?HLLv5q{&>Y}>=V4ԟ| ))EE4)EaXm߁I-2RJF4a, ZC\pxljZ] >U0YJ@l@c<څj_*0iˑwKILe_Oe4v $PgDb@G`CuT[BEaXC `:TY`y;'@KJɓ,AAB + X`h H MJl > &;BK3%TXT 4&4,q g覫.q!! ,@@333pZ'q_5vfTTTMxm{{{Lvb~4ˍ]JwnUÖʺĺ dihlYMS| db)-PV9m(`9i)V 5JN#]KEy :Ur BQol0nav:7 5/7 RBobxAz`wTEIgiFb$fLNIG4oHCNkl\a7cNiيmȢ u 3"1[F: 9; (P*X(헰ᜡ%.գ| .ha'kж:lfr=)䃂SÍ]]K*yV/ \ZsP!HT-\ZPC_q)!` `yo-4PEOAE( VD1trxȑَay#``)H [" X3LC% &%vCYل"Ȑ)f Y"#.X&a ,@4!Ia%e&袌6 @! ,@@333pZ'q_9xhUUUOxn}}}Vy`|3̍VpqQÔɹú dih,$GxqLId{P_7yFJy$۟'tV&lk#R8z W~ ~qB{L/d:Mn@@dn$0BqdH/?vo~f64/l0gWm`$@M/>xGoݔQfB^, a*!: aײg0 8BGh-k1qrmt,wUNAdQ *;?O>'^UA1=6#;yy 5wudM3&mo=UV_d]^O1"H8͒+) s?H5 <N["hKwpg@ӄ`YѣH*]ʔR}MG|ydyTk=ҰMƒ"huHZ!x!'y =\~&/-z"i(ж*3Pe8R`rwߎQژ0 bƅ2UHB$B#a10oK*=˵p9rGη1~$T=vz #ZςQ'{0tX  g0@~DaUSQeR! ,@@...2scLLLWyq|||Rum:ƍuǺ÷ dihl M,7k&Q 1 +;^p( 4Hb?` Wpu< ObC~ W?]~7HV=B 6dWLNY,cW h[ D)U3Lh*p ; F0= h_T@B#=Z"3O?Ԫfi ʨJ :2Z]ܞigHi94 fZĺ@-]E.Ǐ C٧#meb((q d&X}u47ZFz }8 88oڈ#IP>5&T1Q䯅/13 .M58rL@iZc 2AgؑVRQCHgAz`kXvP' .<! ,@@...SSS}}}0Ik&bw }CiiLk8D k(Ȥ2a*J{i?\# z ْސbuW}^} 7 ;]OYR"EBCfrwxyǶ{ˍΑ,ɒԭ5tѴȗ"Dl ! ,@@222pZ'q_:tfQQQXa_Wxp|~}Rxb~3̍[Qslٶ dihl{HxW>ĄFW! q9ZKat"0J6⌀}S l A t0~S6.JZ>Nq-INA2D)gB)xo1'ZAzA>΍24s& q#xZK qٜ|8"ȸ[X ݔLTBI%k6,I& Xbo9c|svk'|KE2gɳϟ@W@ :bDž "@59OM4p_Vd@aR?䡅:qc L" ?"C[4{'=J!T'/r(ʸӧ]A&Ӹpb$dB. Q;P"0V}t{ П#;c#3s)xbgqi!E%eg>'n A2^rKꘀtiV:w`<Q,(h(! ,@@)))pZ'q_9teLLLUxp|}}Z}6ɌPkvлλ³ dihl]eAn9($!BktPQ  CU # eҤ=9*U@ ZA#l$2vn[mU3B 4Jve}+XqBuwB'  EHz*oBUv z'[#pǶl˺ ^zXUXk^ ]E1YUEBhР[(+S! ?q A&KKz)kɷk#]Em'b~xqa? UN0] @s7#D $TdkUAd2e<g*(p 7N)zq@ٝP [)#ot7 )d'.7v$BX"ag7 y)ו:&LRqG\e!e"T@ ;u NX8RvŅP3fۛ K4Jʒ&&*d)f&A*@Y=FZXX׭; TJ< %NGhxe yqbWu`z r1\W{ٳ!93ZX&Ҹ|HaG@P/'\Q^-rF49+KS㍒UR`wn`dvNGI6a9c}PЅ#]Qȗ(&C"O}Ӑ:VCU +JLj9`<#|a&($K܊Ʋ˗0c:*6,%\P6 zb }%DA$FkIyOMB' 3EE HF˥n F$(dr.3j]khc Vx kLa;HYV?#;]t\e%$ 4h#!I$8.$$DdNӫ_> }EJYca˓.6=MQ02@p@@"PKeVHc-W U ^r@*C-x-uݒ)Uٺ$$ rQ@ yJ{q ]! ,@@333pZ'r_9wgSSSP{px{zWym}4ˍ]PshxJœȺź dihlp\E|D0 BBL"dB(KbRn@Dr "z SVؑ%ߤ`NPSGLX] xxHxAD,; {KODqTSL4;LSULZx|d;x`MOmTQՑ_a P]ilϝpq\]|~h 74jՈI Y'r( `Ue$b 0`Ai"V+ɜI͛8MhPςHh)V (7䘔N0e*؅ULఝǸV>i%O@KVS>QKDsN&2x"[H>c'EXqzA"D.+Y1}@#!>TRc.6ʍ6^ZQq$jwJq.\Sr ^A%94fr0K9(h& 4췟2i1MCT4!Qnq(<kVmfS LD#UK23H!Xi8H% `w͹oa3#3DQюdg0QiQ2sw<O$#'F UBFig.4&wz^*&~"g.PNO%uƞ dJFAhY%0~vG7H<|\F8>w_\4IyZ]L4 1P<@)v*Bgb^P? 0p*;il)<ۈ+ЖGLav ׭)D/]~#SB 3hu;PaQ~0 =XˮPag셄geKD2̐1 1DJ|i@B0d.L7"! ,@@333pZ0veXXXG|oz{{Wxh}4ˍPsnKœǸź dihlϰDn8@DBaxP(r|@ G|D6S!z)X|ς%Rlvu ЂEjOBRnp-t^{Qwxge hkR)\^ D[x_RB1Y10T3NTVrgaAC|hlqy =裙Qmo6[iJ_a] JF9DI!)T` ;PUS``-g}ρ(#@(9)YɜI͛8]x Z bE=[j)Q*IjF!_ \%Ā<ZT&#"`E SZâM U Rr[V ڼ`=0 ćư;{^*Db O94׊%ڜٳfg(:fV`HzzLr<*Ζ@]AoW5=-},%HT R-eMӸMO 9Ͽ(5LwQ R^'SuKS^P$2lMQIh<բRŬ!ci$1AVbcevئ\/H0q U: x(eTar$jdX\‰eXNy8NdUVq.7mɤbnrXW hco2e,@D,zPD&w]Hn6jqBu8J@JmT¦`(RtI<NpQH oQ8ڤj', H*gyg|W H4wy)aL^? +Ѧh4&*R/ uNsbկ@ fRg 8W2# |$ &L7.!! ,@@,,,pZ1weNNNE|ouuuSv`|4ˍRrpN’˼ƺ dihlAa8L$ Bn.K8"D $" v-0HXl>)j@p`d`%D-\8 zc wc~D8)qZ76"X{Ab_ V,1ÝEOUOb ?AzfhRTՐe? k.8nr[z1`E-z\&JBɤI&(0+Y|`^FY\Zɲ˗0c050FDUKjM6< iz5٘u0? ybNG#&%N XS*/~8& Xx^2)I *AҒb$8eG7.OJEa!!\ LEDxCJRdj/-di4r/% |~5sy!,Eڕ)s*˟O}ԅpٚQcAtTKHӉcCPG K)eJ'_a܀x$%ոMbIrzt4Č(r5[g4!#I$ pr`cÉvdaQ5 QRh cDaㄙ" d!I@Ѱ5]5 kH\8;<ֈ: &(>JD8D5'IU`% l(7Q-D$X7gh=xwڅw8@1qqA ąYsl?@ ;<Op gACWdfi/m pnXr waђ,X(0*JjRpxĴ_&YSFǏ CUǮ]R:DD%ȴdk2kkM-Ap0/h;eZ'f]iK?u(ek92[U[j)j^BPbAdK -C1;"rP6u_<^g耸L;Ql #@iYK,VnQ._*n)b&/}سkν#p1TD0#gp` ki{$$.$9 f`9ࠕ@VKÏ@e* ޫ7p4ɀ"L+FfgaE½saOҧȁBi Xz;,zFb5@hw!! ,@@222pZ'q_1xgKKKC{muuu?pOya}4ˍ]PpkJʕbȞrƣƮƻƺ dihl뾰T[a8,Ϧi0X2H 2ة`alblX*Mv|\vfD"'qv`!+;?/EXpvv  p~d ?B*EYm"W#v n?NPC;>q OW\hu❄1pdd̼OXb î+"(a HERRY'!JɜI͛0fpB&l!CQ(?eR1id~ִBInn`&ҔA! vHA(r݃Xέ 8!ma2.Ħ 6HdBc_}qEi xqVY fXXaR6m v%"}03IE*~fgFdGCͫ }'i&]4Yf p+p*Iv]~Wb"`l:L֭Ӥi,`E8HuѼX̹џkA%%-6Q)iXk -@zF]v "* |pEB aDlYhX 4!k_p4b"A 1FL w>gmv`v! ,@@111pZ'q_5xgNNNJ|p{||Iwg|4ˍXRpvM͘xΫ϶Ƚƺ dih,p })P]ͦ+9TC`JJv!zI$i)*:*a'bJͤ}luUu I>0gS#} 7#4 de%B6%bCH>u  ?CW [y2U6~aL16Z[uZ0HZ1ʀ l Q@ aiȱǏ,U >J8d0/@{0ajõRmm>=P Ä~nb4P_gU[PY9ID: XJTÅO~Qj[ղ- 7T1s0C;+e&Byx  WRBaʛ;eF` '$WYpi)LfH9gHr^SFmhƐJמ^9ӫ_Ͼ[́##O[rw#L_\PA&Z /0P1! ٷa L`H;>SSVSqT R1S a0 ›\do"DhW%*q1kD` /mIlҵ NHXN6T)M6Tq2-yx^ËOx$}dn4eQ|Yd$Q@z<A@ 5MD\\'-0 nJten8(Q58EAP oTLA8}tY])@#^",-&cPDRdowH>dL6d!CTC a7pj^p2L.H%ٙ8dypy#VhAvQ%%~DUIhHsG6(ͱA4b#^5Dé'Ũ,.jmC5P,J@%O7@=ϹdQ]5d@DfaCpWMS^4 QpQxa $LSN6SX G‹ M."Lxǐ#KL6 'a 1 Ȉ f Q0GLx%͈wo ; k0W U%X !vGh=v\4f@OY}֑&uFłTG;6r&A[?WK0SHr Tu`YπӋy8WT JqJD+BI/ DVXٗI74HXyTCO0Zu@VIN! J\CV#KiZIx 8D"XIL-&yjXhNڙ 1DSb1%C 18٦v!! ,@@000pZ'q_4wfQQQKzo{||Qwf}4ˍQsmR”ͽ dih,Aok]hDf$) >htACA,4yp! RP&+N;Qzo:bX;RN?>[,^NrUp{% FA ǜBJyuA)3F%3UZSb fN"; $̑2(3ĴfP+A (@#[B)cmϛXt;jM1L({̣S;fVºg1 ]#·pʝKݹhzCm p>  c {q2Kշ=9`4oĖzF@G-#rdZб&<'h:]GCoECFTu=K* Di~ZV2WtFʑ>y7֘L[>${| Q $RNNj{qQԿ`M*vH:ަ0ŤLӞtjqJHG%ʠ863]@ك1`hӧPJJFn@ :* [CRk@.&5= BӀ4; MVp2.%8%u2r\bx\RnKFfb;r>x)S%ka䚒 /k@H'kwYn)%Fتd\82Xdԑ}%>O&seQH-gWͦĄUe! ,@@000pZ/vdSSSDzm|||Qvk~Oqxɻ dih0ammۆŃq~mc? ^STc j6 VJdO,obc Yik*a tYf,se ;-c>)p @ 'GH4"2LԥKuyMsXZ[oJ~Dqt ty#>L==lFu GC?qZL@\ dVpArvxb(`7(tA 9Hŋ)cР'jMh@D81v2V;lU\GWv E-PJ = x gbHz8"ds(y>9/b)s앁 Y =Py׬%O ZƢFT Q! 9Lyq]M۸sm;C@혴dzwjX%;fVlDHDz"\"m`;'84ҕ; zV4nqHQdV=YTу:ùP| `Ղ$Z_ESVT$sXuREbE(\܂]_hIF}o7aL,E9P4+7j_z[,"O1N|ܵH2(̇dŐ$pHB$WNr`BaؕuaRd+Tg&5@᠃ q_Kl~XI'Dv@^{:Q10$AXbIa VBGg i2Myk9 V%8Z f$!! ,@@...pZ'q_:tfOOOSxo}}}Mwb~5ʍSpl[bȞλ dihl+p!tnPp!%D E2Pv}dba0C2 x_Ƚ(1j8n"VFr DZqCa>h MP$ BB r}Bgej9j_PQ4t55m%tt?dJjRx?E=s`J ~e|_ AZI J ƈH c,Dh ș8Q 5QdBɓ(S\@F) YBO1s$ʠt@C Yt)ǩ龉/+RN'B Z< E[ Ro,X&#=4Rs̈R"! +2ݨ3eObxW#-e̩TMNSȐ"'Hxp.XسkνfHSèb5 yRX\q6וZq$^]qS"\.%uPB("T2x2mUImh& A^uiL':y[`R,! (Rn6PJDYiIYxB=jQ%ag(̥[o rKPpbmqɠcg)*Q= Z,ΰ:lrl4Qm Z]:p  pU Riht1@rD&xoG,1&!! ,@@111pZ'q_8ufPPPNyoz|{Mwi}4ˍ]OqkLÒʸĺ dihl;pPE@V8@xd2a,%IdCA*IKoQ< Kfutd 8bK씢T8;Yv FX`P K>K}ik ^pBp} RkI0yJLGG&WswHi}q\IG={R}kJB -C BG|@rz&@B h0#l 5ed(S\ɲ`$PЋ~ԄMB:Lk 7S Ĝ`*u0ens3녮6,a@)d>\ҐNI29[ Nl;}4R@)S(MbyBe#)@%{^ 4$߁& 6`^ItAoJԟkEQ CMC*>et]N\LrD@LB:K'UrsDF<$/5nHacZ]ˉhYP0QbE~aĔe-qBM񃈘pagN^Jp.d(Ɠ*S"R%jVѤb!$ą+hYNmIY@3Pd&RdS1Zi*2-%)gRRNxWB]xʠbwڡsJœռ#pkQ@ݦB-ꎿ†iN :EL H)dӞO Z#z$r+G8]<} ^T yt o=u8uES{QSl$vJR7.JVBDL>LNLSl?]y?L j9Xq`Xi@ ^ ,YJF BS' BI`SPlu$,2ā5Qɳϟ@ #֐G˨M%=/,+@Wn0zSR1K4I%E&VA]FUrI }`@t =%8`!/*g蚈 'a\ cwD ,"T6:iQՁvw"W2$Hft3`U@.J3-?qC6F9< EH1iI' em(nj 6F(c yfYgY\T#Z$ɀ5tiKF^"Hf=Ba1 00 rSPXh P&\<"giKnp$VI, }F'cZ7Wt#b&:vQ^t9ԡ-P$ 0''TQbf'A&3hAU@E Xe+XZ.jzʵc-ʙj"_# I1f %% -G 8B5M @G~i*h Gć_A 2 6Gn^G< Þ5LNP1pr4K,^<{Bya$GU_* _  8FLl5/֠5FP]u^42 alMa;!whirlgif 1.00 (C) kadokev@msg.net. 31 imagescamlspotter-camlimages-e471b3c4470d/test/images/pbm.pbm0000644000000000000000000001310712405272062021076 0ustar 00000000000000P4 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 250 173  ݪ_m) )]jUZjRRI-UVVUj*jѭmZ%$A`IYUVUU]\UVUU[UZ@ JZmUWVjUUE` ,mnU-rҪUUZVU0UUU]mֺUmUmZjUUU]s-vUUjiUޥeVVUT Uc K;nWڵUUR0 zum櫣&v^իmmZ@@ MlյU+jk[UQ[UkUWZ@VZmuVmmZUȹkUT@@RV֪մժڶWUVnꪵU@@Z]WZVMZjխ:j@YV͵kUkKUU׾ֵ[ mJUZ@JZիUuժVۯU[jUU@BiҫeWkYma~m*jUZu5VVm*^ZZu@B[kV]]Z[UumZ*@Iժkj]5W[k{+E@@LTZYWcUmf}mUU[+}@"vuWtݯR[Uޭ7jJ VڛsrkXeVֶ@Nq [:Բmկr~]lmknA7j]V5NZњ[]Z6YAw{vҷZ۶]i}߭j׻@ejjֵ\꾻wJxʫ}@D;ìjkm]ۻ[mv[@@hV6Z]uU]vgOBuuڷg[mvu߻V׀@_jktޭWWTR߻yHiݫW׻{}Һuvۯ@ _m?o@@~uG;kjݽm}S~}k_ګw~A>}m߽{~@Bׯw~߾LwwIn݀@<$GH }Rx |@=CP@a?%D@@(/#ڵP? @@lunV @6АB  @OuhF5~@D1G0@@@?cSY _ !D?1,4@Ѯ` Q ,m"@@ πHN#H DT}#>#=A|GHk$p+@~@ P ?CD?Pc}C>)^nR` Qذ@T'^5@[A@h0@;@ o$> (xtJ@|-PKUJDr^@@=%+ĤI2짪 ~-BI6%t#&7Un}(۟~ڪ@tm@gmR0>~ e B {u z JZ?!ހk$}FĈ܇6j@dSǐ@2!|_c*A)? ҀDQ(RBU?'7xB(?n Q~PP2`~GvH h?LQ<"FE"T@UjJPΡQJ'f)/@l"@,? pD@ XRDQ(EVF1M@ dQB ! ?6PJS U) !*?F %a@vV4ĀPH0@T (`$%%P`.PBU k4D@RH?A8w`淋@)%0 u%@*H]` Pjmk_sBR@ !} *HC/TCR`BR?*"Cҟ#z@)X  ,/}T)VbR FJ EJR( T$ݪTX@YDbVZ5 " _U/ڮv~8GTȌ뿳UegDAOµ`<@"J!WAD )SVW6`6HUK-ڵۘ?@H-RoB?mԽ @%JӿmokRN@(RI('FL*O\PW Q8TTVp[@ERlP*K ˣ!_@EА @T[]W#VI^rlk?￀ "V/ $ jDJAUZۂ {X@*3TWB@V UWk̥:G_ !;@ !*WFIrIK_!@ H j"RU%V׷ !$5WQL*R@"/@dH Ew訐0R_@AP"2D%"UZ!n@*T *֋S (UJ?}D@$.AU L UU(UE&JT$JUC*+Vp A"1LTHHVI"UA %)2$$H*j$OH$" I%$-jڒRJ`OFQHPRJeT1$,(DRQ-E%)"5uRE@ ?$RHRBRU$Y+^UQ4)(@$YbS)UJR)J+ʪH"J$ T*U)T+/V PAR!IpUUUJR))T $%RDUUUUUUUURa!P$HUUUUUUUQU*ֻIU"XM?π ڪjU*U*HB@E#JUUUT**E>I%5*T"ڪ]j*UX(@$%۠UF**JDUZRkjU]UU*P B.ֶEUU5UUTT XZU%oRuZVUU *UK)H"5"T^s.[jҵUU=UUTB ;R7ڭUU\ZDZTmmUVZ"~ R&jU UUjH@C!@[f*UUU* $@-uj*H@1e֪ժU-U*-T_iUU[5UVUUU^*UURcamlspotter-camlimages-e471b3c4470d/test/images/pgm.pgm0000644000000000000000000012170112405272062021110 0ustar 00000000000000P5 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 250 167 255 ȸȸиииȸȸȸzzzxphhhXhXhXXXhhppzzȸȸȸиȸpphXXXXHPXXPPHPPPPPHPPHPPH:HH@H8:::8888::@:HPHPPHPPHPPPPHPHPPPHHHHPHPPPPPPPPPPPPPPPPHHPPPHHHPPHHHHPPPHPPPPHPHPHPHHHHHPHHHPHHHHHHHHHHHHH:HHH:H:H:H:H:HHHHH:H:H:@:P:HHHPHPPPPHPHHHHPHPHPHHH:H:H:hHXXHPPHHHHHHHHHPPPHHHPHPPXXPXPPXXXXXXXPXPP:::PXPPPXXXXXPPPPPPPPPPPPPPXPXPXXXPXPPPPPXPXPXPPXPXPPPPPPPPPPXXPPPPXXPPXPPPPPPPPPPPPPPXXXPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhX8XXXPXPPPPXPPXXXXXXXPPPPXPXPPHPXPXPXXXXXXXXPXXXXPXPPXPPXPPHPHHPPPXXPPPPPXPPXPPPPPPPXXXXPXXPPPXPXPPXXXXXXXPXXXXXXXPXXXXXXXXXXXXXXXXXXXXXXXXhhhXXXhXXXXXXhXhXhXXXhXhhXXXXXXXXXXXXXXXXXXXXXXXhXhXXXXhXXXXXXXXXXXXXXXXXXXXXXPиPPPPXXPXPXXXPXXXXXXPXPPXPXXPXXXXXXXXXXXXXXXXXPPXPPPPXXXXPPPHXPXPXPPPPPPPHPXPXPXPXXPPHPPXPPXXPXXPPPPXPPPPPXXXXXXhXXXXXhXXXhXhXhhXhhXhhhXhhhhhhhhhhhhhhhhXhXhhhhhhXhhhhhhXhhXXXXhXXhXhhhhXhhhhhhhhXXhXhXhXXhXXhXXhhXXhXXhXPhXXPXPXXPXXXXXXPXXXXXPXXXXXXXXXXhXXXXPXXXXXXXXXXHPPXXPXXPHPHPXXXPPPXPHPPPXHHHPXXPXPPPPXPXXXPPXXPXPXXXPPXPPXXXXXXXXXXhhXhhXhhhhhhhhhhhhhhhhhphhphhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhpXPXXXXPXXXXhhhhhhhhXhXXXhXXXXhhhhXhhXhXXXXXhXXXXPPHPPXXXPPPPPPPPPXXXXXXXXPPXPPPPPPXPPPXPXPXhXXXXXPXXXXhXhXXXhXhhhhhhpphhhhhhhhhhhphphpzpzpzzzzzzzzhhhhzppzppzppppzpppppphpphpphphhpppppphpphhhphzphpphhppzpphppzhppzhzPhXhXhXXXhhXhhXhhXhhhhX`hhXhhhhhhhhhhhXhhhhhhhhXhXXhXhhXhhhhXhhXhXXhhhhhhXhXhhXhhhhhhhhhhhhhhhXhXhXhXhhphhhhhhhphhppzpzppphzxzzzzzzzzzzzzzzzzzzzzzzzzzzzzpzzzzzzzzzzpzPXhhhXhXXhXXhhhhphpppppzphpphpphhpzpzxzpzzhzzpzxpzpzpzzpxpzzzzzpzzzxzzzzzzzzzzzzzpzpppzzzzzzzzzzzzzzzXШhXphhhhhhpppzzpzzzzzzzzxhи:hzzzzphphȸȸȸȸȸȸȂȸpXȸzȸȸȸȸȸȸȸȸȸȸȸȂиzȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȠȰ(hȨ(ȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸЂȊȸиpЀȊHЊИȸȸȸȸЊz:Xzx(؊ШȸШИzЂШؘPh؊иШиpzh؊аhpЊzhИؘиhИHzИhhzX؂иXhXȂ`zȸ؂иؘ8Xؘ8hШ:ШИаPЊp؊ииpИȂXhЊPz:hببȸਰXXиИhȘHhzhhP8аبhzhИpиИhXиhxpؘؘИzXhȘphȂ:pبpzШzȰhаpШhؐxИ иPؘH؊zpذXzиpXиبH؊zzЂph:zHИpzؘШzhШXؘzpЀ h`а(HzȘzXؘhИzxhpp ppzXXȸzzhXؘЊШzzȰppȨp zРhЂ@Pذиpؠ8؊ИРxhШШpPииȨذ8ؘИШzzظиXиИаhzzииؘШиxppаШиHؘШhhШИШ:8؊ȰииȸȸȨШ pЊааа8:؊Ȩبаа(PЊШШИzиH؊ШШаШаؘȘиȊИИȸzИȊиЊȘаXЊȨЊHhXXP(ȸȸИШа:HhhhPh:8иȸȸИШȸȸhXX:hXXXzhP8h ::@XȸȸȸȸȸȸȸȸȸȸИаȸȘXXPXX:Xhh(zhXhhhhXXXh@XXXhP:ȸȸȸȸȸȸȸиȸȸȸȸȸȸȸȸȸИаȸȸȸȸиh:PhhX:8XpXhHphhPXXXX88XXXXXXX8ȸȸȸȸȸȸиȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸИаȸȸȸȸȸȸȊXPPXPPXphXPhXXXPXHXXPP:XHH:HXȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȨаȸȸȸȸȸȸȸȸX:XhPzphhXPPhXhhppX:XXhPXHXHX:ȨȸȸиȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸШаȸȸȨȨpX8XhXh@z`X`hhhhhhzPH(@XXppzpzpHP:XHH8PPPPH(88(ȸаh8PȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸиȘаȸȸȸȸ:PPHHXhP8:XhphPXXXhzhpXXhh`hXH8XHPPphXpzppXHH:phXHPhPXHPX8PȘ8:XXX8ȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȸȨиȸȸȸȂHhhhXhXXhXXhXHXP:PXphzxXpzpXXXXX:XXzppppzpXP@hhzhHXhhhXH88:HpX:hzȸȸpzȸȸȸȸȸȸȸȸȸȸȸȨȘPXphhhXXXXXpH:hzhXPhXpzxzzphhH8XpzpppxppphXXPXhXXXXhzXXPPXhhzzXzXhzȸpX8hHXhȸȸȸȸȸȸȸȸȸȘȸpHhhhXhXhHXXXXhxppzzHhxhhXp`XhhhzhzPpzpxpphPHhPPXPXpzhPH:Xzph`XXXXPXXhX`hXhXXppȸȸȸȘȐȊXXhhXz`HXPPPhhXPXphpXPP@XXhhhXhPPzhXhXpzppzpzhX:zphPP8hHPHXhXXhhhhXhXXXhXhzzhPhX:ȰXXȊXhhphPhXPhhhXXhHphHX:PXXhhhhXXXXXX: 8PPXxpzpxppphphXppzPH88HH:HHPHPP:H:PXhh8X8pHHzhhȸȸЂXXhphhhpp:XHPPHXXPHh08:PXhhhhXhXHX:hXXPHXXh8Xhzzzzpzp`XpzpPHpzXHHPH:PPHPXXXPPXXXx::(XPHXh8h:XhhhhpzzЀphphpphhh:@ 8hXXhXphhhhppphhXhHPX88(0H (:8(PHXPHPP8`hphXX`P8HzzXXXXXPhzpXHPXXPXPhhP PHXhHhhXPhPXP8hH8HXhhphpXpxphhhPh( HhhhhpphhhhhhhhhhhXPH((P(:X 8PXzX:PHXhhX:HPHH 8XXXXhh:XzhXhPhzzpXXPXXXXHh@h:PXPP8XHhhhXXXXXXX:H@PXhXhXPhhpzzXpzpzhhX(HXzpphhhhhphhhhhh`XXXXh:88 XzXH@hhhXXX:H@( (0`8(8H :88HXxzppXHXXXXXPP8HhhpXXXXXXXXXhXXXXXPHH8HPPPhhXhPHPhhhhXXXhhh:pHXXXxphzpzXpp0H:hhzphphphhhhhhhhhhhXXXXX:XhhhhXXXXXX`zhhXH XH8:`XH8H(:PXXp(H( ((HHXHXHPHXhXXhXXhXXhXhXXXX`X`XXhXhXPPXXPX8P:PHP@HhhXXP 8XPhhXPhhhhzhzzhh8PXXzhИzzphphhHPhpzppphphhhhhXXXXhhhX:PXzhhzpXhXXPXHPX(PH PXP:P PP:::( H8H:((H::88(X 8:hPXPPHH:888XPPPPPHPHHHPPHXXPHPPPXXP(::8:XPXXPP P:(HXHȸH8HPXXPHph@PX 8HXXXhXhhhhXXpPȸzXXhhhhphhphpXhppzzzxhXhhhhhhhhXhhhhhXhXhphppphhhphhXXhHPXXXXXPXxxz`hhhXXhhXXXP8 8Xzhhpph 0( XhXPX:P:HX8HPhhXXhXXXhXH :hzШȘz؂zXhzhȰЊzhzzzzXphppphpphphhXhhXhhhhhhhXh`PHP`hXhXXXHHXX8:HH(:XphhXhpPXXhXP:(((  (8(0PPzhppXhXhhhP:8088hpz`ȸhȘxzаzpИЂzzpxzzzzXphpphphphhhhhhhhhXXhhXXhhp8hhHhX8XXHhXXPPHXHHP`hhhXи8P:@:8( (P :8(8:P:8 X 88 8 ( ((((:(8hhzhxppЈzЂȰhxhppphhhhpphhhhhhXPhP:hXPXH8PH(8X(X:XXXXhhXH::HH8HHи :PXXhphXphXhXHpȸzzаȈИиИȊиаxzxzzzzzzиhPhXXhhhHXhhXhXphhXXhXX`PXXHPPXH :XXXHXXXhhpp`pzиhШȸȘиȸpzxxppxppzzxzzpzxpppppzpzhȸȸȸXPX88P8 H((HX8(XPH:XXzШzиȸhИиȸzpzzzzzzzpzzxzzzzxzzzzzzzzzzzhXpphhhhhphhpHhPHH :H:XXpzzhPXPXPzhpzzhȸȸȸЊȸȸȸȸzzzzzxzzzzzxzzzzzzzzxzpXhhhhhhhhhhhhhzphhpX`XhXPhXhhXhpphhhpzzzzȸȨhȸИиȸȸȸxxzpxpxzzzxzxzzzzzzzxpzxpXphhhhhhhhhXX8( XX`hhhhhhphhhhhhhppppzzpxzzzzxzzzzzzzzzzzzxpzzzzȰxpxppzzzzzzzzPhhXXXXXXXXPXXX:H:088888HX`hppphpzzzzzphzzxzzzhzhP8Xx`0Hhp`HXhhphppzpppzxzzzzzzpаxzPhhHh8hhPz8XhXpzxzzzzx((XXPHXX:X( hhhpzzzzzxzиXxX `Xz(h:(8 hXp:8:XXHzh(:`(( hzzzz (:HH(8pzzzzиzzhаhppH:zP:`p X88P: XH:( 8X(: 0 XphX8zzzzzиаXP HhPH:0 (hHX(XX  88XHhh`XXXXhphhpzzHhxp` :P:PHp XhphЈиhpHhаp HXXPPp:0P08 PX(PHzh 8(8(hXzphzPXzh8XXXpи((pzШH: 088H P 8z0zz8(ppp(PH8XH@HHXpЂzzhzpXи88И(H(  :((P:  hH( :((HX (PP؂zzzXhzPpXPX`( H(:аЂ(:P: (   (8 ((8(h 8H :XPhPppXpzh((:8 (а Њ8:(P8(8 :8(: (zH8ppppppXpzzzzpX(8( 8:PPH(P:8((:pPhH HXhP`X`:HHP@p(X8X(P(8HPP8(  :P (( (8(  (( X: (:XX hhpppppppXhzzzzzzzXH8HXXX`hX``hhXhhhXXhXhhhhhhhhhhhzhhhXXа:h`hXXhXHH:zpPИzXhXhhhHhhHPHPPP(((:`hX  X8H:XPPX(::XhX :hphhhh8:8 hhhpzhppXhzzzzzиhhhpXppXииXHHP:XPPPPPPH:8HHX:PPH8 PXXXXPXXXhP XHhhhppphpP:0(hpHhpP8(8 :((:Xhh8PXhXX:((:XhhzppppXȸhzzzzzzzxظHz:hzpииpzzzxppphppphhhhhhhhhhhhhhhhhhhhhhhhXXXPHP8:PPPXXPHXPHXXXhXPhP:hxpppppphhPXhp`hhzX8`hhphpphhphXȸhzzzzzzzz zzX(hhhh`hpииhzzzzzzphhXX`XhPHHPPXhXhhpphphpzzzzphhpphpphphPhzzzzzzpX(8hhzp(`zhzpааpzzzzzzzHzzzzxhhhXXhXXhphhhhhppphhpXhzzzzzzzzz8p:zpphzz8xhphШИpzzzzzzzzzz xzzpXHPXXXhphpXhppzzzzzzzzzzzzzzzzzzzz:p(:h(PhXаИzzHzzzzzzzxxpzxzzzzz(X:PPPH8X8HzhhhXXXPHXzxzzzzzzzzzzzzzz:xHpzzh8z pzXX8аȰИHzzxzzzzxzzzzzzzz(pXxp8H XPHHX :(Phzpzzzzzzzzzzxzzzzzzz:zzzzzzHxzpHhp8ph8`pXXPиXzxHzzzzzzzzxzxzzzxzxpxxpzzzzx hPzp :((0 :H:hzxxzxzzpzzzzzzzzzzzzzzzzzzzxPzz:pzzzxzxz`@zzzzzzpHph0ppXhzp(иhhz`zzzzhhHzzzzzzzzzpzzzzzXzzzzzzzzz8P`  (Ph8Phzpzzzpzzzxxzzzzzzzzzzzzzzzzzppzzzzzh@x@zpzzzzh0xzzzz:h0zpzzpxpXИPh(XPXzzzzzzzzzzhpz@zzzzzzzpPzzz8zzzz:@h( 8  8H:H88PPhzpzzzzzxzzxzzzzzzzzzxxzxzzzhHhpzPhzzzpp8ph@h8zzhzzzzxhШzphh8Pzzzzzzzzxzzzzzhpz:zzzzzzzzpPz(hpH:ppphhhXhHPXHPh p PhphhzppzpzzzxzzzzxzzzxxzzzzzzzzzzzzzzzppPhhzz@zzpzzzzhz(zzp8zpz xppzzzzzXИhhhhpzzzpxxpzxzzzxzzzzxzzzzzXhzX:pzzzzzpzp:pz p(@0h8 pXH(zzpXhXXhhhh8:::HPpphhXzzzzzzpzzzzzzzxzzzzzzzzzxpzzzxzzXpPhpzzpPzhzzxp`z(zhpp8zx(zxhzXhxpphzzzzzzxpzzzzzzzzzzzzzxpxzz:hH pzzzzhPh H80(:H:X8hXX:pHXX(H(phhphXxpzxxph0xzzzzzzxxzzzzzxxxxppzzxzzzzzzzzzzzzzzXpPphzpphpzzHzpphhxpphhpz(pzpz0pzh(xphzpPzpzXhzzzxzpzzppzxzxzzzzxzzzxzpzXXHPpHHHH::h::XX:H@8(hXXX :PX0X:X8P(h@ pXH(X8hh@H PH8 H:X:XhphpzzxpzpxphpzzxppxpzppzpzpppzpzzzzzxzzpzzzzzzzzzhppHphpphzHzzxzhzzpXpxz zhXz0zzzzhpphXHzhPzxzpzpzzzzzzzzzzzzzzzxzzp:XHHp8Pzzphhh8:hP0HPPXXP Hh`XXh`hh8pph:X hhhhhXXh8:HhhHhhPP P@P:8(X:Ph(hX XXPhhhhXpzppppppzhpzxpzppzpzxpzzpxzzzzzzzzzzzzxxpxxpxXxhPppXzxXppz@zppphzxzXppppphzz(h0zppxh:8PPHphzzzzxpzzzxzzzzzzzzzxzxzpzx8h8z@p:PzzzxhXxhXhzp(XhphXXXXHXXX0XXXXXX(PhhhpxzzzxhpzpHzzPXhhh8xhhXpXhzppphpXhpzpxpppXXpppppxppzppxzpzpxpzzzxzzzxzzzzzzzxpzppzpxzxzxhppPpppphhzpzHxpxpzhpphppzzXhzz(zx8hzzzhpphphhXHPHXPzzzxpxppzppzpzzzzxzxxzzzzxzz:X pPp@HxzzppXHphXhzzzx(zpzzzxzz`8z:`pzppzH:pXphH@XHPXXXXhhpxzzppppphppphphphphhhpphpphhX(:ppppppxppxpppppppppppzzxxpzpppppphpxppzzzzxzzxzXpphHppppXpxzx(zpzpxhzhpppzxppXzzzHzz8XzzzhzpxphhhhXhhpppxpppppxzzpxzzxzzzxzzzzzpxpz(zXXpHh:XzxzzxppXPhhXhzzxzppzzzzh zz(hhzH8zzpphXX:8:PPXh`hhhpzxhphhXXhhhhphhXH(phhhphhphpppppppppppxpxpxzpzpppxzzzppzzzxpppppzXpppHppzhhpppz0pppppx`hppzxpppXpzxXzz:hzzphzzzppppphpppzpzhppppppppzppzxpzpxzpzpzxz(zXXpHhHXzpzxpzhXPXXXXppppphxpzpzzp:z8HXzzzXzzzzzzzzxphhXhP88:HPXXXhhhhhhXh:PXhhhhhhhphppppphpppphppppzpzpppppzxpxpzxpppppphphzpHhpphhpppp(hhhpppXhpppppphphppXp:hpzxzhzpxzzppzppphXphpppppzpX:hPHzPPhxppxppxphxXXpHp:Xpppppph`P:XXXpppxpXzxxpxph:zzz0Hhzzzxh8xzzzxzzzzzzxzzppXhhXhXh:hHXXhhhhhhhhhphhhhhhhhhpphpphpphhpppzzxpzphpphppzPzpphHhhphXhppp pppppphhpppppzXzhphHpxz@hXzpXpppzpzxphhhpX(XhhXXH(XPHXXPH:H8`ppphpppXpXHXHh8XppphppXXPhXXphhphh zXzxpzppX:zzx:P(hpxppXPpzzzzzzzzzzzzzȸHXXXXXXX`HPHhXhhhhhhhhhhphhhhhhhhhhhpphphhpppphpphpphhhhhhhphh:hhhXphhhx(hphhpxXhpzhz(hphhhhXXhhz@XhpX:hhhp8::((hXHhhH:XXHH::hphhhphhhhhhphphpPPX::h8XhhphhhhXP:hXhppphz hppzppxXHhphHP8hppzhXXhzxzzzzxzxzzpzzxpzzzzzzzȸ:PXXXXXXXHHXPXXhX`hXhhhhhhhhhhhhhhhhhhhhhhhhphhhhhhhhhhhXhhhhh:XXhhhhhp:pXpzphhhhhh:8hXXhh 8XhXX PphXH08:Pph((8 :XhhhhhhhhhhhphhphphphphhhhhX:X8Hh(XhhhhhhhXPHPPhppph z`hppppphHhphPX8XhppXXXhpppzpzxpxpxzzzxxppzpppzzzxxzzzzzиȸȸ:XXXXX8XX8HXHXXXXXXXXXXhXXXhXXhhXhXhhXhXhhXhXhhhhh8hhhhhHhhhhh8PXH:XXXH8 (H:XXXHXPX8hhhpP8X (hPHPXPHPPX8 ((XhXhhhhhhhhhpphphhhhhhhhhhhHP(Xx8HXhXhhhhPHPPHhXppXz phhpppphh:pphH:(HhhhhX:`pppppzpppppppzppxppppxzpxpzxppzxpzzPXXXXXPXX:HXHXXXXXXXXXXXXXXXXXXhXXXXXhXXXXhXhXX`XX:hXXXXXhhhh:( Xphxhpzhp`X:hXhP:Phhzzzzh@XXzzXh`hXXXPXhXhXhh`hhhhhhhhhhhhhhhhhhhhX:X@Xh(8PXhhhXhP:XH(zXhpXz hhXpphpph:hhh::(@hhhXXHXphpzphpphphphpxhhhpppphppppppxpzzpzиHPHPX:PPP:HXPPXXXXXXXXXXXXXXXXXXXXXXXXXXP:XXXXXXhh@h(XhHhXXhXX XPXXXhhzxphXhXhhhXH:88XXXppzpP hhXXhXHh`hXhXhXXhXXXhXhhXhhhhhhhhXhXhXXhXXXPPH8P0X(:HhXhhXhHHX88hhhhhhhhhhhpphh8Xhh@H(XhhhXX:XhpphhhhhhhhpphpphhhhphpphphppphhhpzpXhXX8H8HH8PHP:@PPHPPXPPXXPXXXXXPXXXXPPXHXPHHPXPXXXXXHh88(HXXPPH8((HXPPXXHHHXHHPPX8P8((XhXxpzPppzXXXXXXXXXXXXXXXXXXhXXXhhhhhhhXhXhXXXXXXXHXHP(HPXHPPXXXhPX::XH hXhhhX XhXhhhhhh8hhXHX(XhhpHX(PXX hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhpиhXhpz:P:H:PXPH8:XX8PPPPHPPPPPXPPP:8H:8 (:HHP:PHPXXXXXX8P(HXHXppx8 H(XHP:8(8HHXXH:HXHXhzXX8HXhhpXXpphXPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHPPH(HHX:HPXXXPXXH8XHXXXXhh(XXPXhhhPh(hhP8X8XXXhPH(::HHXXhhhXhhhhhhhhhhhhhhhhhhhhhhhhpИHzhh:H:H:HH::88:H8:HHHHHP:HHHPH:HH@8::H:H:HHPHPPP(HHP:8 PXhzhpHXzz:XHHP8HX::8:xXppzh0XP::(pHHPHXPXPXXPPPPPXXXXXPXXXXXPXXXXXXXXXXPPPPXPXP:PHH8HHH:8PXXXXXX8(X:XXPPXX XXPXXXXPh(XH8pP8PXXXXH8PHPhXhXhXXhXXXhXXhXhhhXhXXhhhXXhXhhhиhXzhh0((((8888:(@8:8:::HH8:::::::H:8::H:@:@:::H@HH(HH@:(8XpXpXXXPXX:`PXX`phhh :PhhȸXzpphXP8zHPPPPPPPPPPHPPPHPPPPPPPPPHPPXPXPXXXPXPHPPPXPPP:PP:8:(H@:HHPXHPX(8XHXXPPXX PXXXhXhPh hpX pXXPHH:HP::@:P: XXXXXXXXXhXXXXXXXXXXXXhhhxh8hHppP`XP8(@(((8(:88(88888:88:::@::@::@8:888(:8(8(88 8:8:888(: (0 :h(`hhPP8(PXX:HPhXX:hpXHHPPHHPPPHHPP:HHPHHHHHHHHHHHPHHHHPPHHHHHHHH:HH:HP8:(:::HH8PPHPP((P@ PXHHPP8:PP8XPXHX(phXXH:hh::HHXP8P:888( 0(XXXXXXXXXXXPPXXXXXXXXXhXzذPhhXhhhhX:XXP:8 0(((0(8((88 88(88:88 ((8 8( 8888888:::H(H888PXzp(PhXXh888PhzpppphXXHH:@::H:@:H@:H8H:@HHHHH:H@HHPPHHH:H:@HH:H:H:H@::88::@ :80:@:::@:H(8P:(HH::HPH8HPHPPP8( 8X:XH:pXP p8:HPPXPXPPPXPXXXPXXPXPPXXXXXPXXXXhzHpXhhhhhX8XhhhXXhXXX:8( 08 (((( (: ( (8(:(:((0(8 (88 phH8 (PzxhXH8(HXP (88888888:8:888::8:8:88:8:8::::H@H8::::::::H:::@8:H::8(:888H@(8: :88(( 8:((:P0 (P0(:PHP ( :XX(8PH888Xh (:HHHHPHHHPHPPPPPPPPPHHPHPPPPPXPX:`XhhhhX8 XhhhhHXhh88P:@8 ( 8H8 8hh8888(p`XXXHPXP((XpzpphhhhhhPzzhzhzpX ((088888(8(:888((0(:8888888(888:888(888888808888888::88:8:(h::8(08 (8:(8XP(PP`P:pX(P((H88(P:8X(P:8(H8PPX088:H:::H:HHH:::HP:HHP:HPPHPPPPXhиHPhhhX8XX HPhH(H P PXXXXzPhXXpXppPXXXP ((8 (8 ( ((( ((((((((((((8( ((((8(((8((((8((8((8(((888(8((0((((0((80888((P(h80(8  (8XXX88XXXhXX PX(PX0XzXhPh XhXhHPXXh88:888:@:@:8:::@:H::H:::@HHPHPXXظȸ:hphhh: 8PphH P:0 H XhhhXX8PXPX:XHhXX:XphhhhXXXXXXhhPpXhhXXX H::@888888:8(8( (((((( ( ( (( (( ((((0(8((((8( (((((8((8((P8HX:HH8 X 8Ph`Xhh XPHXXXHhppXHH8 XzzhXXXxhPP8((88888888:88(8:88888:::::::HHHXظи8XhXhhhh hhXXX@( X:hhhhhhhhhhphhhhH:hhhhhhHPXhhhhppphhPXXhhhhhhhXHXpphpphhhhhhhhXhXXP88((( ( ( ((( ( ( ( ( (( (((( :`8PPXhzP:@PXhp::hXPXppHXhXp (h8(Hh8:PX8ppX( ( ((((((((8(8((888((:888:888:::H:HȸШȘHh: H8ȸ:hhhhhXhX`hXXhhhhhPpzhX:PPHhhhPHPPP`H:HHXXhpXpXhHpXPh:PHPhhhXhppphhXhh(hhP:(      (   ((  (8(HH8 HXPpXH8XhphhhhPX(H 8:pXhXh(PPXX ( ( ( (((((0(8((((((8(0(888888(8888:8ȸШz ȸ( 8Xhhhh`hXXhhXhXhhhXXhhhphpppPPXhhphhhXXhhHXXXXXppXhXhhXhh:  0XHP:(HhzHhhHPH:XH:HPXXhX:h: ( :XppXPXXPH:::(  ( (( (((((((( ((((((88(:8@(Шȸh(ȸȸȸX hhhX::XhhhhhhXhXXPPXXhXXPXHXXX:0 8H:PX8PXXHXhhXpXX8: :XXhhpp8hhpPhpH  ( ( ( ( ((((8 ((8 ((8((ШHȸȸpH(8Xh (XPhhX(:hh8H (HhX:PhXhphXXH (XXX(pXX88PxH(Pzhhhpzzp   (( ( ((( ( 8 аpȸȸȸȸȘhh( XhHHhXXX XhhPzhhXXP::H:(hHXXxP:PXXPHh hHHhzhX (  ( ( ( (( ииPȸȸȸȸȸ(H :p`HPhPPhhhhhXXhphPH 8:XXpXXhzh8 PhH:8P8P8h:   8ииzȸȸȸȸȰ`pȸhp(PP ( ȸhX:p :HP X8XhX(8zPXH((P:XhPph:    ииȸȸȘȸȸȸȘȸhxȸXh8:ȸP(`XHhȸhHXH 8hhp8hhXXXhhzX (ииȸȸȘphpX: zPXȸp( ph08(:PX@H8:88:@H88((8:PP::HHH( ȸиhȘXzpȸhz:XP(pzzp:(::H:(hzpph:@0:@Phhh   ииzHhpzXhXXXhXȸȸ 8X ((88  HXhXXPP(8((:: hhpzzph`XXXXXPzXhpzzzphpXh hXhXX: HXXzhX8P8 pzzhhpzphXh( иhxpȸpzhИHXXX(8(p8:XX8XPPH8HXhhXXXXhph8H8( ȸ`hxp XhXh:p8( hHHhXhHhhhhhhpphpz 8hXP8 X ( (:Xzhp:XHXhp8zXP(Xh`XzPXXhXXhhhhhX(:pphhXPXhhhphXhX::HP:((:8(( HH PИhXzH:P@ppz(Xxz:8pz 8zhHXphHH:hhhȸXhpXHhhX`X`XH`ȸȸиȈ8:8X888PذHz:PhXhzzz`pXzzpphPHz`hXPhh(HhpX(:((HHX`XPPXȸHphhXH8((8:P(P H: PPzzzzzzphhhXphzzЂH8((PXzpHpzȸȸȸȸPPXPXH:@8 88HHH8( PzzzxzzzzhhXzpXzpX 8Xhȸȸȸh:ȸȸȸxHh88:PP8:H@H8Xpxzzzzzzxzzphzpxhhzpzzzxpzzzzpppxppppzpzzxzzzzhzpxzhhh(Xh(Xȸȸxȸȸȸ:XPhPXPXXXPpHXXH: иPpppxppxzppzpphphhhhphpxphxpxpxppxpphpphxppppppzppzxppzpzzzxzzxpzzzpиȊȸȸȸȸXXhhhhhhhXhhXhhpphphhXH:8 (HzzzzzzhppppphphhpzpppzpzzpphphppphhphhhhhhhhhppphhpphhhhhhhhhhhhhhhXX`XhhXhhhhhhhhhhppphhhppxzzzxzppzzzzxpphzzpPPHXPPXPHPPPXHXHXXXXXXhXPPP X:@:@H:H:H@HHPHHPPPXPXhhhXhhhzzzzȸȸиȸȸȸȸȸȸȸȸȸȸȸȸcamlspotter-camlimages-e471b3c4470d/test/images/png-alpha.png0000644000000000000000000001462512405272062022203 0ustar 00000000000000PNG  IHDRPPsRGBbKGD pHYsaa?itIME #!IDATxw`S?'J't ]AR@ R(+"PFAyYXEQe^'"`e-eL4IGHHڤȺsNsr>;~6A|':((/rXe>Mb "b;1gxsj Ie$AdŢ/"gF6.F͏.:]57DCm47Wb͢ ?JasP.]*啡\ұae8wU<F ? kgW^%D/;[0D Mrcp?m ޲/Ð%;(a<\غ:?;^Ni]]ӥ q<<^Ď-j*L,4a34p[^.]܌rRȹcttT.S*x5:c Œσ,&: - ȥj֬h͓3&.S,"$Μ,e@7_ D&NXk_ <* '{;ׇ#qxI5\%_ҥ =_9SŢyM0X&s~yh/um(),K'zLtY6?0YV̚l˅è 2ر;8Qt/lA0-[yoh Jf!g^f@yzxzI+3ʪ`fDּ_6K'HI%4a0Ss[L_=ټՕ&fټ:;skzyՋh΍8~მ~Vϩ'={qEjFzZ3,-][;5,3* i¢ϚY U2߆BFձߴ!!r2?^bբ<ޞѩHP1x A-2ŸuӜUv \%ׇu& wywp [yHXdlܯj6#ǝ#w'Nin˃S8dF,h՛n2zdpo-`߁l'ڔg;7hOA,Y=w<)6mbHLB`3ټPOYOwuSm Jp#}:W&̩-{+"d/#SY'xRKVVk硘ȫ}-CU覃y-OWf5Z'=ض) mS9}Fɖ ΝEjq̓= 5Fl_B?֤ѥu:WGf㗃%4o.TbVd0iVX"k'Z`fn ~3#Gټ:g?1o4knϫCILQ1~dcƆ4مNHjf9pq6&Lb0kĉ:$ۺԛCJ%U0dTjօѺg1Мy}ϏOfZx[k$[l"Ƚra ڄ;b`9ZQ.8HX(9|" T0z4:: +Iul eU64uYV8ѹ{WGdK#),SшfGd3"\R=%Ogg|!yQѷj 46|?wM#>Rd2K*I胇!hNM/%zl*UU Zd^l^'{'z8[gA3*$Lߤðk7T!8Hv&#E\-u\&4u+ݺlIɎkɿG`/V|BxBH )k1q՝m\&X:yyZ.y}E%, Z}zFdއ?ŋfr,=7=0t% ˑϿ \ ޑfu;?g WN۳w(\ndGrFu^S.Xt5ʏ%:f>Y~)zyVW;!8H j=mlOrr_$WOvo>l~Uji-aKçdkY,Nc|}>l@4&tQWBpq[M vKgzzNypK1ؓ[b-=!|KmjsCX"+/&‘=["ά`shE;;;/376r">Qg2$|mNvu:(ޑ>}h*YF-Rުin϶ -H/g4nT6(Inn}9_?z6ib} *~=PD֎mToh!T<Wflla9~eYgwO<["arvmnK9%OLuM2s?_p>l[H0Tۮ3jɓ׷@"r^NrkA˜Ƕnn&ɨ/̪yݩ32 ٳ%rFO:իձU5'7|)o bBD%E>Y٥tj bM#@M[bb9/N,r'jMMiмpGxH5uvu)E~:ZΟ h)}{7A6_.'ff^f&ج78kjϧ/35_{}qI~x{VQ\*ɬ: >u1^dD8cSkRS~3bm<0wX#YGϼ/I5.fyk$'(y;Ɵ1W boxir8[c\N25R8f=lOw$ff6KV]m+gohIRqSSXi|q&)"c BbVȫ} Ss:AyWaMJeu:S' hL>"oOx4Φxų\S#w㱖N,`̡#E<#62>s0ru(3Ts*"^h/6&u,R1S cm\ع)$oNkyq[SY-0vZk7_lXα&NMݾћ  } ~;WOwSc++^yiž--9zSrVnp4i8H%EwZVJ ۑG˶ ŌJF5j]{o"[)z#wvfhYϲ:ɼ }3{'vfGK**"g#HD_V<>.-;n1 ENyy}{}ãq*m"&HĞ&LVYŌmmB9x19>0;QWZJ{ӛ@B䆳cEeL`L6oFvr&ܕIeJU9Ă~)ǽ%/w62q 6mˣSWܒqq_w42\TLB"|_~-4iN/ft6mˣ&{}B}Ӽ @#ULC"&Mlw?ee nxw?AME^W//J}W$HkXaf2H""@fd>8eT\ŸQlԚq/7k9'#A;DIhnm'GoA9''#IS[Ls$ NKXzxf:|k=9 Kf>'_nk+V 6$3Gw |]c%HFR]4 .[B"2}6;SȾt0[(;%~9Us\me*NZV˅ -[\LH[I99# #@1} C-C}y0yy5>W=;#_y+_a5N`k9 ?$LNéұyR} Cat*؃-OV2;* VmBy1%f:T>@/Kr3@- >C2mv.H4{5udܔF$&rM"9c"Sޕx3{jf)(#(}챃=/M[=rlda>l ,t!v!zClhMtm‡7F(iܿ]nS[LJЙ ieZj̇^rSX)x>cPbP>FPGcxDfl[{\m<ʃٍ߷PK܀`Y ռyc%V*%Y=Eo)c2h PC]~.\N??q5_'Ϯ: W??OHK;T?8Mˑ'Ve4PqZ&2Hd1#p3p8gGxBhc&+'W[}xY?SO=i ~8ޜMb %U]RkF7*ҁg -P5] =ſOQ0>5)WЛbYslwfO ('[v+jY*]72|@)!6 L+Lfy`IwNP|wT/2ן|k~㫰_ѿځzl׿_fb[=F[_2VK$BuީT0pmRYx5u3RIy>:䟫Y_@"=M[|a.,_$2?-[If6|߷)-?;X `qf|]{ZPQ\Llqto -Fa:t@,#(Ht$|YO>Yzi6YLPp `<x-vunyF3&yf7A|9RP“|ԑ"nj9c[6p]y gz~TIEQHOudG+ }{.[%' torCh^.V)Y d#Mlx88?Iw޺' ~-8C Mu3laTwQdA"O*ߤΠ:%ÏJdEWqz^%)MzL/:&E,+sg\,Rq;ˆM}F&U) O ^Kq'Bn!^ٽzt-Ofk}9VnFZǵ2HP8b{FRTFHTlG$}4uc@nfwb1ٔTIeEfGY& yp2g 0|\JbӴ{H7= qcH9qnV-{68c Mg#D,wohQb/6gz6E "C6 BIa'ኜڌ6燞|茏@qj[K±%gvZr$npO +Nr[bUV{t@&B^ cgp"Fؘy1-X;-`Jj>;495jkLQg 6>.bhTǺa6ݮ.f^4lgeI)nDPӾK '{[R>pSM)[#lec#o^,2-@߿[jZ*Ƌa\ЭM:Û)llyl,dT.YzrcHəj,1AgSl'Z\/r)>*p99GZ*ݬSW"dH*WQ_Dk| x>5sg?ҟT*dTf !X!a'ꣵxVAy2MB%d=K#96;K2sº9 W>ZI;%Vvlv&AJoM* 2FG]lg#14U9Do 7;.0-jrRF#nGRwg8f] ƪwhvʺ﫤[<((s2 V[( ko !"eR!q 0l3rG뜎Yʆ$A:7L`gǶ` pm |g)5Dd%g&)TSr rQ&R)d{]-ִ]|뮚Tw8eDMVv"CF}Cfu3K-v3(K1:%:D‘,y'} ىC2(pK^Fj逜0.EOu58Ă%1pn7-7ͫDŋ׌}g", .qSaЄ-wϗR|1DqE$59ya 2&FC[Av_66}σ3Rxwoz4/X3z@:Z809~8Ȣas۾>$gއ aL7Wy踡L6TJNsHDJw={MeTF֑jB_ҹYjm'Ѩ5:qJ|92נgY)ƴ&I1QA\1.ʤffO ՘-:81c ZI̧հǼA#=pXG_!86vd%Ү|8&`M$&L7g8aJ}C9]\; \.#7N";D+*FKiC D8@. /TqNE9uD<lvP!_=(pBF]ALoe[B(+CKܼ~a}"%xjk;^A:uBW1`32RH{vM)pyax*ݽW^pt~2S啕N./-=%zg#^2t ƬZ3+Fg;qg-x ^iKQMtp{)HlXHOB!):IҙT:R6AE,BJ{TWќbp8YSp'dyV$YB\e]兞d=ψ]^螴[dc F$K#0ᠫu|ylԶŇv NT;X`Fcw⮄9cٳn=`(g{9ZJqHMPNfvAKn?X:8 ujYȠgZ@&%s|vҒLƕqLu/\2B%< sW{V'賕t3uE4j"{Eœ$FS:Z&ʪZ/af4vSjB[%G`֋Q*yI"Wȫ# ,)˲/7U2vgli+ռC2qȋ3Ϫ݌ೲ7nhQ<c1mkeZSkpԳuw$q1.=I"@Xu`#u84ZRȆقv]#sFffY rBjLg0p壼̡Q5$`q,GX4%7Irū;4kMDL鐛^TCR[OH!K%/trfU޹JMLuiSDmɚmi̠1ڥ|ntñ+^otzҢTdk g&i͠363MJ @s&ck꘧E-|6Egf s_lezsO:Eiq4w;CAjuQwچK`083NiN="f9^q|iGJKP#9%Brd>x3¼I!qM:T>:n<:Q_ɢU B~~$uMHrlcl=@nL&m8ikRظKMM˥45ѤdEa)dQ،3sr[Fngˆp]a&6x #ՁM`fNpWUT NR'ܔz4[v :Dan r9zԳ{Gh@ jm͒ ð˳b* ʶ$M>0%H&BY 7K!q8 |r)Dh>ՕpvQQWLbݸ\Vz;3ɢ|w۳"9Sϒ=-<.=Eg ={FU $Z|wrpԮqİxH}ڌ7VP /Rt2չRS%ۧs #($"v݅kyƑEkn٨AtʗT3 3vtC# AЪ;i츺Y-cR:sL2TmA}xq{3=KLr0ۙi} L6j\NVbiJn OLw}(6,Z f}W:"Պ@PĵJru/Փ$p#Z d9JDB0A",dZr)Rm͜&sydMNrǒL/fۤ@,# CriM5K>w:HGT˽M=Ilc@4c il+ӺN M)_Lrԧɟ,-yEs֓} 'Y(;&N\9 $TH,k٥eZ\Sa-vqkOGiŹ&ƚM^3g-d6р"y;+38OǤt~,X&@> ` 9 DJ_+ 9ֱ4-C>1Y3@w%U!Tbgyf4^%jQ=bTLJ"/H?\+t9AMx'\ZX-Dc9Rhd#oE-bSBtxYZ`O3GHM"FCl,ǤrlTĥcx[8KJTX=[\geD("8't=džJJrǔi>?"R'ಝpbDzvp8MW+un 3j>^˝• 3M+j]7 F2KUFZ)z>%R/GyJ%5 ̧{pE+$;'9͒+[8:Y+ە" (U˫ك`P>6>8&7˲\*fZ1upa"U B3rBq4Nn/1ưo>(|̤5[h*vV(m6JdTR‘]od21Xo;@/X[ BTe09E;LkZ 8j'>p9=*J-IMR-8~>%t<ơAAi!aSSqg'x-g^b=sKŕvS|=dFuhTV; ((Q 5KB|֛]3q@=@ʟ,*էKyG >Ospvf4 s< f^8'g%-Uox6rRdbgI!*otI|i\oX#<^-՞3::*3p9O6ljϾC\m](rz\b<^=ŘYvBl\az 6X_% މZ)S-:J%6+j._y kM.ݬތ%_*@Dt&;5N8ֽ}+XLpf09و[ksj\pv)w K ´8(.~0p=({kVq7VҽlC~ioU6^L;0x^۞3G?Ѓ5գGgH:["# 4%;Y DEuFre۔LEO]o.\ظp̡f#`/t~5LH=q:k ٚ*O9is f|uVz,d|fLӽ^nԚ%9`xoqKKQ8.QGX \t!|=tA:u7; [Aq$材C1 wV_WNvB IJ_i:~bOibwoy)ݐR8"=61AT2nz(l_\x%: pRlMpav!Ȼu@n]xFS}E}il;; ྲྀF(. >u&ßo' c|ؐe~'%x"ٌ MaYb SEQ[Ey=@ǜ4C(#BѢKlMi2/;2/4pF$݉*coG,ʚ\mZ%3@dđo7~O_z=IJe',E.4%Hl!FSǀe`_(߇ Ҿ =P1 G#Y':nLZ~D{}3R&cu NTO늼_|o/na%Ye礻mUCx$3ij@觐9.Ό(^~K;_wWjP+2ir(h{[y4\vQSBuMbZz"iP )?k71vїsIqscAtXnYkiG5^@J {7Wfbݿޅk4Ldqq+v*ݟUT:2ґa`W+-ī'0ȠKXKmr|5ZR~4ۛ^Njy|T Uieh[s?uoR 3h{^лB7_IBvǻWna'}_gDׯhp).Wek7`}r'uG䢿06ӎ`ܴtTxKAFIKgL|؝Xq)O_|8.WctlHa&q6 qL>1[.~^8S*^KA{m|7X _R ϻ!gtiI~7N,vZ}fjh%gާhǤkIVdW-iX_w^Y99o2r"/sm6|xSO?Cdscn(2o+nPNoߦ^Mu$^ֳ5iO-hiYE'ι[FI&7H٩iTpfPV[(X'UuJ6RT8X_ڛ \u%D "9ћTg|lR B+3ܮܦݾqF0$zEoWnu.~k>$cG/ۑKqj6SZtGBbKgG,UAW“=Wӽ{"j!|^;Uܰs8|ѭ-6 VVJ F##]T~ݽ`u5тL+ N1;0~|4e6K@M4 FHFo@So 9 J0F#iDW5{0\$2?8ѐ,M8a4\E%Whn^wcCS!jNe`{Xm4-ۃ\Ƨi!Ad &3jKy*EFR]n\-Ͱؼ=M@׮$~}u͋i_$I88,zbVf0H.t(Ag(Æ&Q+2)CiQ2R1p4G \Z5V \_Too@r6|s c[$y'p-CEC,^q6|S,uOu*ꭲM*#vdh6uS vN  E"56MXA@ Q]+ı1}i`|F{M+:vp󅟹-m޹q3k<,X-ZxA -|\Լ(4-j,1n771uA6QՔ\.)Kd)Ddݙ&{ N &ENqO=}z*c})N&sM6etX^\ܐMR0D2X_d~wZ92InK8$6+ ,FmrdJAdkG{"*޺Nث8vQ[FyyiY|ݧR>05Z Tw\x )/ /}2^;ir}IeꉭtX[mȰtR1}`@k1(R9׼fD޹2#, ~}7o}tuyXF~VB^e/YEeeV(&646G3Us~4bI t"If$.(GVŪe'ثDfdqӤC3pM>>Mo"׼id;9C3y6Gwܸv-P\vzy ,O1A1+ydf_ء*[T)]-ݜpOzd:%yabE40nZ^\\OH!@4ɤLGگa+.bD(X*u@;;ε/_sЉ#DE\6bا)1/P0Q'fcbM@V @;{o&~C.7&BrCttލ84674`yO6.Zc9^l+m/[@g}_/w]apyT 'ܕq7UgFӧu!X 晞3Q4"M `(Pd\C<{SI2?7ѲtLF(zphZ ١vƖ8=fҚ̅l jGlǼduϒ߷(oQj$XF1|>״F@ ;0fN A6#*ަc{V7GÜmܫd1^9ȣ$&&y_U>u"U{эZf~+,cu3;p:ӫ!1<-@c~Q$>h\5w, }"5O:(`4QGb=XoSB軤E@t-^])P򜺥J?3AZ꫔ *m6&~ |!7tSMC:40hepC@7(wb3tQ}ڭFslPf+w7mjrEQ~)r4/@I(&QF )eCS6n bvP%!o :+v^YFNg2\T̷'Nȏ?!^mP@TCy q6sԀqpMziՙq [.5{MǦ9$JvF9S@|km;V^8ֆ6MS5Ea}Rѫ`,Kݖ-۪TT|N}v,ew`H6$ {و*W>En{m;TΩM4@bۏ0_פWDn er^3^d_^4T_ȇQRBt"3\rP64Jq [s45޴npa]ܬq?ЃZ&nwSrPdZ׼Ԥ ïP[_o/C@ZT!Eq;tmBY^ZNYwzڇi9 h6$hXMC7g;ZR%ءKmn: E3M'dI'v*cLmɈSN]S+D 8]&pۜ6N'.w 7He{ _4h],UHU⺴{@덺&jq:.Ů!D}qm2swNti'ޔAlJD;d=A^I#xq;uި:(})oxeCH{ߣ,P!f5x.r80dYLq A}p+ Z$wUq1tI\?T˩dž!ǩ4YB xQsT]pp@_F2Lcf_+i٨Oi-mG͹? oT7ѦծҾ&J'Eu8'ڰAiM^scSp3 79!44PHەfPHqQ1QURTTAdUY;ڪa*esmghYf7~`Ư vLM~?"IDATJ<{c}rP+Mfքy#(NZ*w1iZW_$VNes)6VcQXq.bmOZ,gX5+]+6UP0 vTV̺}68pbˌbxKn+m&\R%&Y^_{r;mJt:9X?~vo}Mz(ɰI\Zs9@Sm⁁2=rykwK`-8&d@'; G`f$M>#._Pݸ~׆(UMɉ|+󡮰<o,I}rۛw>~Β`Pǽvz}?zYRP&WNZSE{uDHLK/]ETD\_ LюS;&|Z~Mŧln31`(iE|/clG6:<^m86t ':q۵Ĩ\]G=k+CsJ=Plїu_z>S.\:@t^jK caokm7jBE3YsZUnP{H4 םm@>`Wz6gu*,Jڮ, (B+#w!}g>״E]CK^CT@C11XxpJ3 n#7\elZF]{X"'%s Zwd.lfG>q!q=so!<$A.ևEEit RF'|ó],)l pS^Ǐ>{hLݕzRIf m-^ uѷ4'\=CR-VvY$͵RcĚq-?ݝ1.KG&5Ԓ4UWa"_:^Nn݌͓lΙq=`n6`ߦ3Fl}oymmlԗL9H}NtaeU.+i/RtT*U ^{Q:\X.ұpy5?žLbH,N@NkfU%(p]-wH. MYIPMa,$: Qg@[Y PQF'{B!{mcɲusu=ekSMSqӘo/ܔF ?+RӶim&Qu"{"Р_/<f+orLρ/P0R'橉 7j/wPvgy-@}PsQcv[`֔!L㡛HKG@Ek" m x&mMirV+{Ӓi6zИJ\/[N{e5NWBnbt9L6 gZLWH.-pTluA1K(mVC\y>{]k;~{&d>TLO%\*E7nsN[a@C рy]s1IKʝҙ|P_hz}A8r÷8M TWm^SH(c`w0<c5h*?p#oG2&HsxMnxyOU"7Myf!sME-lnz)oP]ݪC܅@={XlI9R7 Fj$<$$8!$@`)B|X {ܿ-}}Ѥ)2!Ty8C,r$bxň](tj*Mա⫛P?@nzC<6qh`_|8^jp u篱)&wOWe禝\wGQz NɞMc kHG܂r_, | 19xsPj莽ˑGŲPgC/-=L(Va\L'KhS⫒hlU^ZCgϋsWdžHqz5\vay uv 8~7 wo:8pzIF \g[vr!ڬHL+xe'h=0/ߌRu_0!D56qu ݫ7-l'7?Vp N QAtfQ(sd+$5u!qZx-)T|+K,e:rdbyK!Z ?]OiX" v:y; ;Zi37æ{p: ݧT&p*n;+82Ҿ-A[B_$spds <*KK%ZBQ.OT̒زD!3 7; nwD!tp#ދ`'VR"6UԠʳbAx?j?5qC#ȑƂ%洿QjBo_ x"S|"6RQ 2*n44-Ԉuzmzѻ%t=PA paoH&7ai'b Id.y##}f=Р;@jXδ\Ga᪉dP$|+)洂D!U0HQeյNlKݪؘ&Pcbtx,2n΢? ?LGMh7ރXJqqNR69F6: WڤRr۹iE٨Xh-h~%q$jx?*pcȩpOBg^ nY~9^JDZz>H0g}\+ VݳÂbhۛU_},rut3Q-B@VIvnN^AH TJ<+؎]+3S~d̳ F&̣QɗdKk:6n7u$Q[gɌd4? L`*9Yt}ZWK͇&uS"Q(#pӖrRoH݇n&j5ժmݭb@ZRwvDvu8v\Ǻ(ݽDwFWQb s )͟W0 @lXy~>ku%#ZIс 97nџ¥7a}W%] lqm2Y^Э9*{8*}옛e_tFs L>nŦZ ~qbO:[(f5k)l¡` gZ~^be>vbUٯc| %_7@ =ɋfSI~Xw]5ލ:b^DﶗpN*7 [qY>q|du7{@e7׳a~4:y!7^ ҟjn2bhx\g$,I2n']ѢeB*_' j(Waa!7f܈L';jURV6%Չwq3ʸEuD 4{I@UOd̘V8jv%U-Dy=|9x{[χ3}?.^w,3G?O#ҪӟV)Ya7iß~]j3hxWBSNrHhRs;@?ojK9R`cT؁3W$0s?;yANaLndmJߩrNB#)nq.h/py1i~֑WQ"D>P! uwLT(Q وVo+yxO[<3y|gGt=iLo[g6LP Q܁GHS{{Ic a&8wp\acKxL$G:Z3ψٌZ'^v]ŏc sFE 'C8ΪhߒZ*[50?K4ŷVdGz$vSGe\hRcD&ƜrN/Ś~3Cq`W 7dŨK/FϸhwzQ$3ߢxѪ7H|7hkj<575;i͐zH\$ʴEtIME0YlCIENDB`camlspotter-camlimages-e471b3c4470d/test/images/ppm.ppm0000644000000000000000000036475512405272062021154 0ustar 00000000000000P6 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 # CREATOR: XV Version 3.10a+FLmask+jp5.3.3+PNG patch 1.2d+misc Rev: 12/29/94 250 167 255 ۵ߧ߫ݣڨڨߧڨߧڨڤ߫ڬ߫ߧߧߧ߫ߧڨߧߧ߫߫߫߫߫ڨߧߧڤڨڤ۰ߧ۵߫߫߫߫ߧڨߧڨڨ۬߫ߧڤ߫ߧߧڨڤڤߧ߫ڨ߫߫ߧڤڤڤ߫߫ڤߧڤڨߧڤڤڤڤߧߧڤڤߧߧߧڤڨڤߧڤߧߧߧߧڤߧڤڨڨߧߧڤڨߧ۬߫ڨ߫ڤߧ۬ڤڨ߫ڤߧڨڨڨߧڤڤ۬߫߫ڨ߫߫ߧݩڪڤߧߧߧߩ߫߫߫ߩߧܥݩܥܥݩۣݮ٣ܧߩܧ߫ߧܧߩ߫ߧڤܧڦܥܧڤݫڤܥ߫ܧܥܥڤ߫ڤߧڦߧߧڤڦߧ߫ڤڦܥܥߧܥ֛םڤܥܥߧڦߩܥܧڤڤߧڤڤܥߧܥڤܥߧߧڨڤߩߧڤݩߧڤܧڤܧܥݩڤڪܥڤߩݫ߫ݩ߫ߩݫߧߧߧߩݩݩ߫ߧݫߩܧߩۣܥߧ߫ݩߩ߫ߩߧܥܥڦߧߧߧڤߧݩ١ڤܥߧܥڤڤڤڤߩܧ߫ܥڦܧܥڦߧܥߧڤڪߩܧܥڪ߫ߩ߫ݩݩߩڤߩߩ߫ߩڪ߫߫ߧߩߧܧߩܧߩ߫ߩڤߧߩߧڤܥߧڤߧߩߧߧߧߧߧݩܧݩܧߧߩߧߩߧߩߩߧߩ߫ߧܧڤڤܥܥܥڤߧڤ߫ݫ٥ܧߩܧߩ߫ߩߩ߫ߩߩݩڦڦܥߧܥߧߧߧܥߧ߫ڤ٨ݩݨߪݢާߧޥߩާߧߩߩ߫߫ߧߧݮާߩާߧ߭ڨߩߧߧܥߧܧߩߧܥߧߩۥߩ߫ܪ߭ߩ߫߫ߩ߰߫ާݬ߫ߩߩݬݩ߫ڪ߫ߩݫ߫ܧܥߧڦߧڤߧڨߧݩڤݨڪݩ߫߭ݩߧߩ߫ߩߩ߫ߩ߫ݩߩ߫ݩܧߩߧ߫ݪߧ߫ݩ߰߫߫ߩߩ߫۬ܧݫߩڨ߫߫ߩܧߩڦڦڤܥܧߧߧߩݩߧ۬ݩߩ߫ܥܧ߫ݫ߫ߩߧߧ߫ߧߧڤڤߧߩߩܥܧߩڦ߫귾mٴɝyˏoΞxΟ}̕w̕wnq]{e͕rf`PfT~ZFzb}YCfUxZE~ZFmYGt^iYurpppʧvʧɧsʧèuphzgwb~jkzzvϩ}ʵʴʴƸ·z~z~yvz{vpʧq|fʧszÛys~|ɢɢ~Ġzv{Ϩ{Ϩٴԭ{Ԯ̣ȖrŖtŖtʗvȖrg]_͙u͜wwkȡ|yçu~yy{||wpzzDzɽ˹ννɽøûǛǝɿŽÔǛ̜̜ҢСݫ߬ߨިިݧݪߩݫڪܧڤܥݩߩܥܧ߫۬ߧߧߩmXEQ+>+>-E2@.B0@.@.B0B0B0@.E2B0K8B0C0C0I5D0F3J5D0D0A.>+@.@.>+>+@.C/E3@.@.D0F3A.A.H5A.D0E3A.C0B0D0G3J6J6J6J6G3G3M8M8J6J6J6J6J6D0>+J6L8>+@-G2G2J6C.E1C.C.C.C.C.C.C.C.C.C.@-C.C.C.C.C.@-@-C.@-9(C.C.9(9(9(C.>+>+9(9(G39(9(@-@-9(9(G2A.G3M8M8M8M8M8S=M8A.A.A.M8G3A.M8M8G3M8M8S=M8J8P9P9O8S=P9J8G4J8C1G4P:XCRiJ\Bܥڤݫߩߧ߫߫ߩ߫ϞaF[BWAQ:SSU?SX@WAS<[BWAU?SU?Q:S/D=*JE1z^{cyשĖȘƖȘȘ̜ȘŒŒŔŔŐĔŒŒŔŔȘ̜̜ʚƖĘʚ̜ʚʚ̜ƖŔĖŔ”Ξ}_؟٣١١ڤڤܧڨ⭋nެ”Ė’ĖÖƘÔǓĔȘØŐ’ƘƖȜȚƒƒʚۭ{nr[D--&زĔȖƔҭBB?٩ƔР沇ƞvmQw]FpmXí˗ǜȖĒƖĔƔƖΛƘȘȘȚȔʜƖƖĚƖαƔʗϜ՘w_ĘĔ”ǕuȬ{ĘÖĖ”–’ѵ~ѯn`EnQsrfrØĖĘѴ䯈mݶqΤ~b–ݯv’’ŔŒƖŒŽŔŔƖ”ŒŔȘŔƖŔŔŔĔĖՔՒŌŔ̸̛laF0.PN?*+" #BB6`ZFc_HJG2HJ8ocOgbJf`IgbJb\GCB*B?2b[E:9'=<,TT=-[P>}\ƘŔƖĖƘȘȘŔŔƖȘŔŔŔ”ŔĖƖŔȘʚƖŒŔʚ͜f߫۬߫߫벘hѥʖƖŔȘȘƖĖȜƘĖŔƖƖĔĔÔȘʚƔȻf͙é}jTtjUaԥ’Șƚ–Ŕ˗qͷĔ”’ȘȘƔƔƒƔȘƖʚȚƖŔʘŔȘƖĘĔpcUРm’–֜rə꿑`թ͛mcK٥’Ėޱע|_ܭØĔƘ绍֦٥yrbwfدqft͢mVѬva߻Ǟ̢AJ<қƑ岈뽑住Τ{’”ŔŔŐŔŔŔĖŔŔŔŔŔ”ƖƘ٩jybxaowxv}}]woUvsV{u]|^hfeigggegg}bx^{w\zt[}s\y`{w\{w\tkWqlQgbJidIf`I]U@VQ<<=.D@.ؾ”ĖĖŔƖŔŎŔŔŔŔŔŔȘƖŔƖƖȚ”ŒƖȘzݩڨ嫱tʚĖ’ȚĔƖĘĔƖƘȘŔĘȚƗ“ȖդSJ;ީĒϜԟ՟ƖȖȚŖ’Ɩ̰•幑߯ײgG2˫ʖĔȗĔĔƖƔŔǘʗƘƙŔƘȚʚƚƔŔƖƖĔĒ’~ޫä~ƕƒƖɜ֨pT˚~nĒ۴’ƔȜc{jѿh̞ƔƔͼJH;췍ͻlwd뻋wѪ縌xӨs٫ĒȘe~Z]Ңu’’””ŔŔŔ”Ŕ”ŔՒ’–ȟ~|nT ~dhh72!w_pzxuh{_kwwqmqqoojkjmjkj{`{`~u]x^vq[tkWtnTmhMmiPf`Ie]I('wע’ŒŐŽŔŔƖŔʚŔʚƘĖȚĘĖ̜ʚƖȘ̜ʚϞp߫߫ݩ߫寱t͙”ŔƘĔÔĖƖŔʒʜĔ˜”ԤƖƚȖĖ’ƖƘ̱z\eeKlʔԪPC3{ehfɚĔԔĒƔŽƒƔĖ–ƖĖŐ˞ƔĔĖۮ~kSȘĔ–ƚѝmîÖϤvٮvbk꾚ƔȚ”ŔȚ›ѩɞmŚ̢jhWɚxֻΟ}ƣv^Ŧw̫Țqi’Ė”””ŔŔŔŔŔ’ŒŔ”Œ”ŔĖգeX?  q}q><2yZkpDZ©}zt{zyvvvvtslsrmij}az_w_vpXvpXojMfcIb]JXT.s]ۦĖƘʚ̜̜̜̜Ŕ̜˞ʜȘƖȘƘȘq؟٣ܧڨڨݩާڤ婿ĔĘĖƚ’Ɩ”ƖƖƘĔƖĖĖƖ￐߯tJ{ƖĖƚƕƚܸɚȖƔɓȚ˜ȜЛ̚˞˚ĖŔ’Ĕ””ƒƒƔĖƘʚȚȘĘԢp`Mʙ̛خtYk϶ҼצƖĘȚÔءRD;aM;ĕΛ߭ΤiVا˗æݿbPÐoేđžíbe쫈oץʤװ’ŒĖu  >:'xbKÝ̬ŐĒȖ|RM:ŚtZ7:.`VD˝jdK7-'FB4͟ėukU'!}pXtԷzؽVO>zyDZîêêDZDZDZ|yytqmlg}e~u]umWumWqiTjdMgbJgbJf`I`\Af`Ih_KFA2;5(໔ТƖȘƖƖʚ̜ʜ̜̜̜ȘȘʚҝaڦڨ߫ڨڪڨڨݩڨڦߧ஬rөƒŒƚĔĔĘƖƖƔŔ’ǔgGEAʣǕĘŔʜ”ƕ~͗ĒŒēƖĔ””ȔŔŒĖŔĖ’ŔŔĐ”ƖĔʘȖʚȘЙ}ǡȖ٫mFŢeϼ䥿اtO<ȩđȘ’ŐÔiSǠ͞ËơmٰIJĠi֠Ԟ㸉y`s{[h٪uΡ{jQ7nĔĖĒĖƖƚПΚϜ HC984%-,$5-#ܬ֛ҟա֢Țm~ᱞ|znfJQN@ytZϻC?5̞ŜӺ̥ʜ©ҹպ{Ժ̵̵Ū|^riDZɳDZDZDZ|zwyqomlg{`}s\soUtkWnhPleKkgPe[Ge]H^YFfXCVP=:7+vXެʚȚ̜̜ʚʚ̜ĘƖ̜̜ƘϞ`ߧߧڤڨߩܥܧڨݩݩ㬐j٪Œ”ƖĖŒȚƒ’ĖƖŔȚƖĖÖ峮wrgď”ǘҝY?)dzƖĖƖȖȘ’ɕĖȖ”ĔĖ”ĖՔĔÔĔƘ”ƖȖƖȔŒɗțǜqTԤĖz٨ilxܸŏlܯɜƖȘĒȜ{lTзŔ”’ɛoēϸɪhJϡndD}ƙu~Ӥ{n⹌j{eѡŔȖĖƘĔĖƘƘ””ɜrTQE8OG9YK;m_J\Q=l?7,95'PF3_XBZN7ZK7UL7A8(ZR@F@.QK>SL>'k֦Ț̜̜̜Ӡћ̜ƖĘ̛zڤڨ٥؟؟؟٣ڪrv`ا֒ȘƖĔƖƖĔƖƘĔƚȘƘĒȘӠzřsœĔĒĖȚȚȖseK֤ԝ˗ʚŔŒʚĖŔɑĔ’ƔʜȖȖƖĖƔĖƔʚĘÖ˜Ș͜ƖʚƘȚƘџZXPòƚڱmudƔ‘ܥiaN֡g]QrǘݵŖĖОnȳzby`p`Yofk鶐?*no}ٵ{ѰÚŔ’’ĖŔ”ŔĖ–Ön[D           -) 44)77,47(11#') +0 76'<<214$%((()-"  -)צØɛԴxݽܿݽzȥؾڼҸ~ԺҹϷëhsxwythee}vZ{w\uqUrlPpjPqiTjgJjhMe`Ee[G`[CFH7[O:Ϥ͠ƜȘ̜̜ʚƚŔʙrڤ١١ڤ٣١ڨڤur[ܪ’–ĖŒ’ĘƖʘȖʘƖ’ĔȘTTMӯΝȘĒʚȚ̛ˠŚƼΞʚȚȘȘ–ĖƔ’ÓĔ̚ʚŒƖŒƔŔȚʚʚΛȘʚŖȘ̛ƖƘʜʚȚȘŖڿĘϤhѺzȱŒ}̛yંveПƔרqiUƚoǨ{{]ެz{a˜rӪ~hcҫçurö}g̐Ŕ’ŒŔŔŒŔƖƚƘŔŔŔĚ˞RM;         !!+-;B0KK;KKAKSBHK= #     rܯtX˝ǚּƙӸƙØݾ}ɮҷڻҹŬɳîǭîz{zwrkhge{w\vpXliJleKjgJheKf`Ie]H_Z@^XC43%ӤƚȘȘƘȜƖ̙w؟ڦڨڤڤڦڦܧu{fڬ”’Ĕ–””Ø–“ĔƘȚȚƔƖŔϢԜĞŖښȘʗΛƘƚٮh]H@rȘĒĖŐƖȘƚƘŔƖŔĖƘŒÖƖĘŔŐĔƖ”ȘĔƔƘȚǜʚƖʚ˞޷aTE١ў|b޵̳ӟ^wѱ|nץʛyߺǽweQ֛⻝p|u޸ۭkʵcɰ}bQݲcvusS͖ʔ”ŒŐƖ’Ɩʚ̜ŔŔ’ĖĖʠcR>                   i̞ƜҡƯyaʞƙƙƙƙƙƙ߿߿׻ҹϷ̵DZϷϷ̵DZî|~|wqe}dxbzqYqiRpfQjdMf`Ic_H^XCVU=ZWC8:(}c̠ĘƘ̜ʚʚӠrߧڨ٣ڤ٣ڦڦڪڪt|bݮ’”Ő’ƔĘŜŐƚƘʜȚʚϜd3'H8"đӠĖȘڦsOWRCͯƠȚɑ̜ԝ̜̜̜˜Ė”Ėː˖Ș”ÔĖƘŐĖ’ȘȘĔĘŐƖĘƔ—oβ֞ک^\Oⲅа^幐fJ~kƓ›w஄⽋۞|cǙmҨhN콖g̠|q_ЦЫ szaLǜʒ”ŒŔŔŔ”˜ͣp                          q;;.ӥǚˣƜǖƙƜƙƙØØØ߿ݽݼ׻Ժ׻ҹϷɳDZê|yyvofedu\xpXumWkfNgbJe[GZWCWWCZWCSS?I=3ؾʘĖƖȘўjݫݫڤڤڦأڨڦݨڪܧu{fƖ”’ĔĒƖʘĔȖĖȘȚɓȘƖɕ/"뻍\@XFI6u`٤̘̘صwpYmbIРȘ̙Ő̚ƘƚŒƔ–”ƔƘŔĖÖƔƚɕĒĔɞ͜ȖȘȘđִ{npXɤʚ௓sR丐|isu绌wb|ްǖɜƧzƖНӺԲԷơUIBȺݶSTOV`UwaMͳ{`ƹwթĖŒŔŔŔŔŔŔĖŔŒѧp                              snXu\uݿj?7%phTץӢܿƖƙØØØš߿ݼ׻ҹ̵DZDZ|~{zyvrjfg}bsoUmhMe[Ge[GheK^YFaZFYS=`[CGC1t֧Ɩ̜Ϟs۬ݫڪڤڦڦڤڨڪڦڨwyeܪŐː˒ŽŔĖƔȚŔƚɞʚʚҤ@-eLwI5x[=+ǜƥ|~g̥A/աƖǘŖ͞ƖĖȚ֔’Ɣ–””ȚȚΛƘȜ”ŒȚƖ”–ά|{gŕ{ћТuɞڸalSģšfvЛⷊxӥ˭ͤϟbK:ۻѴȯnԯȠdm_ŵF?4^[L彈’ĖÖĖ’–ͥyc                                  QO<رҟէdj:0#ѧXM=ʹϞӨԡǗƙƙƙØƙØ׺ҸDZDZî{ytmljey`tnSpfQkfNheKheKecFc[CZV@d^DJ@0wtVۭ̜ћyܧ߫߫أأܧܪݪ߫߫ߩe‘”’’Ɣ”ȘŔƘĖƔƖȚȘƘĖܧ@/O;pZ@-=+ԡĒԦhfYPSBC;.ϡĖ’ŒŐƘ’˜ƘĖƚƘŔ–Ĕ˘ʚȘȚĖĖƚ”ÖĒƘĒƖ”˚z竳vӛ뼏qĝըstН~{pfѾoX|Yz”ɞػ:5)ƚЭÜŧØ亓knxo`qgZฤpɜ–”ĔȘÖv                                  (( ЮpdLɚ֦תoTΡ˜Λɖƙƙƙƙྒ߿߿ڼϷ̵DZDZîêǭ{tqiiecvpWmiPmhMheKjgJgbJ[XFb\G_\JQO;b\Bۦ͞wڤߩڨݩݬ߫ߩ}b’ĔƖĔĔƗƖȘȘȖĔȜ˗Œة4&>)݋jt8(פĔʜʘȘ̩ϥЛȘȚʚÖƘƖĔŖ’ÔƘ’ē”’ŔƔŒ’ɘ̖ȘȖv}עg벇޳êϙl{e{g՜͠{Y̵֪̱d{dyv͡ůuȖ|ط.(!:5-ԭmP٦–ȚƖ”šr                                        ֩ԡəԢաۭJ>(КʘΛ̛˙ƜƙØØݽ׻ڻԺҹҹDZ|ywtmfez`~u]wt\rmWf`IhfMf`I^XC]ZCXXFTS>gYC֧yߧ۬ܧ۬ڨ۬ڬݬ߫߫^Ɣ””͜Ĕ”Ė’ƔÔĒĘȘƖƖĘĒŘĔÔު0"څfbHeaJ=,ΙĔ˜ƖƯ̏Ț’ȘȚƒǘŒĖŔĒƘ–ƘƖÚĒƔėĒ”’ĔÖĖĒȘȘȘƔÖʖܮtĒŖxfjW<岺eǞkWƘпʜkțpƙ~jeOںv]ԲuXnN֯zƖŐĔȖŒǜt                                             eXBt֞עѡӢԡԡԡԡԡ͠˙ɖƙƕڼչҶ̵̵î~yyqqc}de{cvpXnhQkfNkgPhgPe]HaZF^XCd^DUQf`Irܧ߫ݫݫڤܧܥ߫ஜq߫ĔŔ”Œ’ĔȘĔĖĖƖǘŔƖȚ”ȘƖȚݪC0=,{~WB:)ÒĔĖŒĖƔŔƒ͜Ė̛ŒŔΛ’Ɩ’’Ɩ”ĖŒ”ĖŔŒÖȘƘƖƖƔНɓgխҨ}dHխzŤynج«ƞ}bاĕܹа  ̣Ӹnɚsⷭx×sZq䴨ɘĖƖƚƖ̜–Ŕɛq                                           :=,ܱա֛ڦ١ޥԡҜסҝКɔҝɘØØØƙØݺںԺ̵DZDZ}zwsskj{`|qZskSmhMe[Gb\G^ZBaZFt߫ڨڨܪܥߩ߫ݩ寪sإŒŔŐƘĘĐĖƖĖƘՒʙƖƘƘĔȘƘĖݪ<+뭉D7XDdK=+”ȖÔƔȘȘ̜ʚȚĔƚŒƔĔ’”’’’ŔƔƖŔĔŒŒƘŒĔȘĘŐפbբ⸉nɛXʟvX͞ԡ}_ėƕۣzʙlѸVQ@}xb}v_w`rn٨wx\JΗܿ͜’–Ƙ˜’”–”Ϟ~                              &#ԯסڤ١՜סעԡКККɖ˙ɛƙØØØØƙݽݽ׻ҹɳɳDZ~{vqllc{bxvZpjPkfIkgPe]Hf`Itݫ߫ݫ߫ڨߩڦߩڦݫܥߩషyșĔŔƖƔƔŔƖʘƔ”ĔĔŒ””’ŖŔĔݮQ16(r<,=+Ə–șƕʚ̙ĖƖŒĒĔ’ƒĒĔȘĖ–’”Ė””ŔŔƖĔƚȘːƖĜОcכuubHu|ĪǘhKػwTmϒϪ~ͩڦztש~[ɣ%ׯdҤA:0⼖F;.ft˥ȕӛƘ–ȚĔ˜Ȝ–”–”ț                            ƹڤڤ֠؟֠ԡԡաأҟԡΖƙƙƙƙʞ߿ҹҹҸɳ{yrofcy`unZskSkhSkgPf`Ioߧ߫ܥ߫ܧڨ٣٥أݩڪݩڨ߫|Ɩ”ĒЖʚȖƖĖ”ĔĔȘ’’ĔۥV9lQufNM=7&Ė˜ȘȚƚĔƔȖȘƖĖĖ”Ĕ’–Ĕ’ŒƘƖ”’ƚƖƘÑƘĖÖȘƖϟM:$ͲϨͥϙݼ|Ô^l鵌‘߹t͚㰀ݯ--&ɢrpU<1ȹĒo}͠v^JⱅƖĖŔ–ĖŔƘ                       ݦءס؟أ֞ס١إӠԡКԡŗƙƙØƙƙØƙ߿ݽڼҹ̵ɳ|}rqmcy`}tZvpXojMlfLvݩ؟ڤ٥ݩڨڨڤڨߩŷ㿌ʚƖƖɓƔĔƖƔȖȘÖĔ’’–ȗߏhdIkfQ{])’ʚȚȚƖȘĔĒđʘĒ””’Ĕ”ĔƘ’ƘȚĖ–ƘƔ’”ƖƘĖƘ̙ÖĖĖƘƖĖʚ~fЮJC,n[迕Ĺnge\߹rZ~UѢəʗqVőΛlSzaǨkbUmv#&!ǭ~ỐϜcңŔƔ–ŔĔ$# !             }ڦ؟סڤעڤ֠Ҟԡԡҝ͝͝ԡȚƙƙØØØ߿ݿ׻϶ɳî|zysm}dx^vpXwsYrlTm֛٣٣٣ڦݬݩڨ̚ŒʚʚƔƖʚƚƔĖ’ŔƔȖ”’”ѤgI=.--}٩ȘĘŖ’’ʚ̜˜ʚȘʘƔĖƘ’ƖØȖŒȘȖʜĖĘÖƘȘ–Ė֔ĒƚĖĒĖȚƘĖƘƖĖʜʖvWmvaܫx\ֹƙ{vݦloŚaڱrU֣uЛŕ-#ذ:0!q̾"9ճyrafraʧ}ĘĖƚƖ #%   !#     ]]I߭ڦڦܥܧڦڦأأաԡԡҝ͘˜ŗǗƙƙƙƙØݽҸ׻̵®zxqmg{a~u]xrWx؟١؟٦ڪۥݪߩݩĘּʚŒŐĖ’Ĕ–ŒŔ’Ž’Řׯ˟”ƖĖĔ’ŔȖƖǘ̜’’Ē’Ė’Ė”ƔƘĖ””ĖƖĖĖŖ”””ĔĖĖƖ˚ɴyvpٴǘınPȠhUBѷĖə{Øͥ}դɻޣȝΤǥ͵! fZDrѯƢڿs“ĖĘÕ­! $"'%))""!#! # &"$"$"!   ""$#$#$"$"#"   # &#$#=8-ڦݫڪܥ՟ОԡԡԡԡϞԡϞɔɛƙƙƙƙݽڼݽ׻ɳDZ}{wqmg{b~u]wћם٣ڨڨڨڦܧ’عĔĔ’”ȘŒƘŜĘƖ’ŔƖ’’–ŔŒƘē˜Ŕ’ƔʚȘĖȚʚʚȘȘ’’ʜĔĘ–ȘĖƘŔȘ”ĖĔƘƖ̜ƖƚƔȘƖƖդ?4yОƥ}_Ẏy|ϣ֤꿑Önצگ˜᫊qUTO>RP<{ޱkpbO{qRs켓ﶉ¦ª}ȚĖ”͖è &#$&#%(')))* ,*!)),*))))))'%'%%&('$"))('&#'%!('%$&"&#  '%(')))0")*"))('..&'%('&#$## ('$#$#$&$#('))$#""%%! #!94*ڦݫڦڤڤڤߩޣܥդҢООբբբТɝƙݾԺɳɳwxtlhjx֛߫١ڪڤڤڦڨڨߧ¹Ҿ”ŐŐƖĚȘ”Ɩ”ĔƖĒǐŔŎ–ĖĖƖĖĖŔʚ”ƘȘĘĔƖƖƔȘƔ”Ė”ŎĔĔƔȚʚƖȘƘƘ’Œ”Ē”Ɩ’ĘŒŔƘĒ’ȘȘݦXE7ʪ|}届ɖskTpÛqtŘբuYǗk|t mêԶʓj89+ukWᮇƒtՠĖ–ȘŔÕt '%'%,)++,*!/*)),+/*,+63"))&#(''%))%(('(''%,,))(''%'%$#'%$#(' &('('%&/*('('+',))))))))))))),)))'%$#))))'%)))) #!))))'%,)'%('('%% " ! !(),?:-ܲަڤ۬ڦݪfJJ854&URHUSAWPA[T?ebKtjTpfPYS@f^M_ZEojRtpUkfOݾڼ̵DZDZ~yyqnizأڨܥڪڨܥۥڨ᩺’Ö”˜Ô””Ɣ’Ĕ”’Ĕ֒ƔĔĔƘ”ȗƘƖŒȚƕĘǚŞĖȘƚĖ’Ȗ֔ÔȚȘĖʚƖƘȚĒ’’Ĕ’ƘĘĖƘŒ”ĒƚƖΙsschGŸ~^kﷅ뽎lʸ͗Ʈok̶ȚͦyV:˯ҰE=3ټⶇﻉ׵98.u]Iv÷ֻ”ƘĖƘ̰,*,*)*",),*00!-3$3.!0/,,,)/*,)('0- ))('/+))--",*00!),('$#))))('('('(')))))-"))00!30",,35#0- ),,*!0/0-!))))0-#,*,*,))))),)()%% 0- 36#,- 40")-"))(',,)*")* ,,)*",+,,)/ %%,.(+*'ϥڦڤJC9(% 12#98)?>0JGOM5?I5,+"ʞڼԺɳDZî~ytnoڨݬݩܥ߫Ŭ齐ƘĘŐ’ÏÖĖØ’Ěȑ–ŚĒƘĔĖƚ”ŽƖĔ˜ĐĖĔɐƚƖƘĒؔÔʚȘƖƕ˜ȘȘŘƓʜƖĖ’ŔĖƒ˜ĒĘÔĖ’ƖĔƚƖۭؔƖȘtwa֜ɞlҼ—6- ƒʢhTֲПڨlқ˛y˜qݲ ̝ϭ46*4(ͩz̮鴌ĔĔÖƔỌ̈23$3.!00!-0!,/02!33"74$63"63"87'3-!33"3+ 0-#0/0- ))0- 33#71#3-!87'30"--"00"))+(0+",*/*00 ,*,+)* -.$58*87'63"74$27(98)02!87'74$/-33#57'27(40"44%54(6- 0/33#87' 43#98)98)68*98,10#30"22(52'74$57'22(98)16%:=174&87':9,33#%"أVN;43+68,10(83(52)76*64';;,88)FF6ZSCVR@RR=SO=_\GPI3ŜݽԺϷDZî}zyt߫ڤ٣ߩ⭼|ǐ”’ĔȖƖȘŐŔ’Ô’ŖŖƖ”Ƙ”ĖĔĒĖĒĖȘƖȖƚ˗̚ĖƘĔŚŔĘĘ̗ĔʙؖƘȚʚŔŒƒĒƘĖȘƔʚƘȚʚÖĖƖʘȘȘ٬7,ӥĔƘĖŜ_^U~b̙Ƙ׷ӰP\Qɛ~ݫݳְ~hMѯͷL4#˽ѳb^I⼓pŗƞŝvߴƒ̜ĔРuo\*)68,76%74$74$%$00!44%3.!98)98)87'98)76%76#76#3-:6&84&40"74$54&6+63"60!0+"/*0-!),3+ 30"3-60!6- 71#3-!30 63":9,:9,54(84&?<+98)98)57'76%:9,98)87'87'98)87'D@->;)98)<:+>=-,.:9.98)98):9.<;.?=-?=-;:)?8+;9'<:+;9'><+;:+?>2<:+57'98):9,98) ⯃j770CC6HG8JI:FE6EG8KK>JI:LL9LLb[Eb]JIE5ȵڼԺϷDZDZǩ{z¬ߩŭȗŔƖŒʚ”ĖƖŔĔƖŔĖƖƘŔŒȘʔ”ŔƖȕĔŖȘȘϞ̚˗’ȘʘĔÖĔŔȖƔŔʜʚƖĔƖƖĔȘƔ””ȘƘƖƖȘȚפlrcRɚŔƖƖʜ٨gּǥMJ>ŜʫvիݴdX?ഓzi[>۵͚{jP仒Է޸MI2њ‹|nլȒƔƖϤngN&'&(79'87';:+?=-;:+:9,54%<>/<:+DB1<:+;9'?<+?=-A?-?>0A?-FD1AC1>;)87':9,63"98);:)87'76%76#87'98)87'98)98)?=-A@2<;.?>0>;)A>+?>0<:+DC4A?/DB1HG8<;.CB176*DB1A@2FC/A?-A@2HG5DC4FE6JG:JG:87(?A/CB1CB4DC4FD3FE6FE6HG8JG7OOD1EE8JI:HG8JG:LIXUCUUC]^J_\GhfMgdO670ÜØݽԺԺԺɳ}۬䭾{ʝŔȘĖȖƒĔ’Ē”Œ’ƖŒ’”ŔƘĖȖ”ĖƖƚƖʘƖ˜Ŕ”ȔɜʙƖ̛ĖƘȘȘƔ’”ĖȘȘŒƖƔŘƘȚȘŒĘĔƖ–ĔŔĖƘȘĖȚΛȖĖܮB6#ŔȘݮE;+ŕsUƙӸ{x[mkݼСGKDűթz\ԩ㬆CE6QMC voZў{봋uѠѦҾqdN+.%d`L2/!VR:A>+FH3JG7HE8D@-AB.CB1=:+@<.=;'==-?>+LG6FE3HE8FC3JG7JI7HE3FB1CB/A>+A?-?<+?=-?=-?=0AB.D@-FC3FB1A?-A?-AC3HE5FB1HE3JI5FC3FD1JG7HG8JI7OO>NN;LK9LI7:8'EA/NN;QP9LK7MI7JG:NN9NL;QQ>QP;OM?72'LIUUCVQE[XFWWCWWC`^HaZFYX@\XGWV@[XFTQCQN@SXJ-2&8;+GJ9JG;GJ8CE4FE6EG8NRAPM=TQCUUCZWCXXF[YDYXDUUCXXF_]J_\GQQ>21(ÛØ߿Ժ׻̵̵î˱߫yϠȘƘŔȘŔŔŒĖŒŒĖŐƖŔƚʚƖȘƖĖŒƘƖƘŔĒȘȖƖ”ʚƖʚƖȖȘƘȘƔːʜƖƔȘŒƘȖȘȚŽĖŔŔƖȚʚ˗ȜqnɚĘĔĔĖҢ`M:Ř֬r\K巾aTHv굌èwPZQA뾐ԲFE4ĔŚݵ#"kg\|m`گ}Ѿwa1/"NF5wo\fbN8+!UPBWV@C@+LK9JI:LI7JI:HF1JG5QI6JI7JH5OL6OK7SP:JG:JI7LK9QQLLUUCNN9QQQN8NK;WWCUUCVU=UQ=WTE92+Ҿ˜ڼ׻Ժɳ̵ǭ͵ߩ߫ߩ߫yȘʘƖŔĔ”ŔŔŔĖŔŒŽĔŐƖƖƖ”ŔȘȘŒĖŔŖƘȘȘʚȘȘɜƘȘȘ”̜ȘŖƖ’ƖŽʘʔ’’ĔʚƔĖƔĖ>9(ݳšȚȘƘȜȔ^eۮ ݵiڻΤɦTK?yOL@ӟѸ&(ȡ–ΞscOeWG_PAiI?,TE1DG8dX:a^Gb_G/, b\I=;)WWCOO>SR=]WAY[ITT@HC5UUCKE6JH3SR;ON:RPAWV@FD2JJ;TS>TS>WWCUUCQP;NN9QP;QP;VU=SR;QP;VR@VR@VU=WWCSR;TT@VT;TT@^XCWWC^XCWV@TT@VU=WV@XXFWWC]^JHD3\[I\XGCB2HE8\YJaZF[XF[XF\[IXXFWWC[ZDb\GgbJUP:gdO_^H_\Jc`Kf`IkiVkhSkhSniSqjVqjVqjVhiVnjVc`NNJ8]V>olWhgPjeOfaKjfRgeRTVD21!EE6IILLTQ=[ZDWV@TT@XXFWWCTT@WTEZWCGF3ݾ׺ݽɳʯеߩ⯱vȗȚʜƒɜȘƖȘƘ”ŔƘȘĘĖĘŒƖƘ’”ĘĒĖƘŔ̜ɚȚƓ”ǚĘƘǜĒƘƘÔŐƚÔƔȘŜƚŒ–Œ’Ŗ’ƘƖȘȚɓ̞љ~fǓȘĖƚŒŔĔ{QK8ɶ gџ䲆ŕԸv ֣㯀sطȲøÜvիua?ѼgdTrr`+%zpVBD&ZZCroRnfQH@)hdIf`IiaKe]Hb[ESO8f`I_WBgbJaZFRM=ZWBJE2jdOON:SQ?ddQLK:_\GVU=JF2gbJ`_K_Z@XXF^XCWV@]WA^XC[XFXXFWWCWV@[XF^XC[XFZWC^XC^YFf`Ie[Ge]HjdOb]Je]HhfMf`IkgPNN;c_HieL/.!WS@lfLidIkfNhgPhgPhfMgbJSP;njVhiV]ZDa[FniSniSkhSnjVqjVtkWniStkWvpXwt\xvZsoUxw\HM>GD5cfPtkWvq[xw\wt\vpXrmWqjVmiS;;.VXGJI7GE:HF5DC4KN;RRALLXXFXXFXXF``NnjU˛ɛƙڼҹ׻̶߫ݫڪڤ٣ܥߧݩݫ߫ƲŚȖȘŘȘƘƖʙƖƖĖ’ŘÖĔĔȚƘƘƔȚÔÖƖ˜ĘŔȘƕĖƚĘœƖ––ȜƔȘĖĔ’ĔĔǔǜ̞̞Ŗ̛˞Ƙ˜ϠƖȖƘΘ͚Иʚ#ΩŖĒƘĔƘƘ–BB?ͼ͞}sbK䷒ΟƬʞդ{\ŞxgRƚy`dzes2=1sdW&)mfLrfUIC/f`U;5-_VCt`HE;~w__[FrlTFB0ijSjdMg_JspXrmWniS^[FjlTmgSQQ>miPgeR\ZHjeOabNYUCdbLedMgcLgdOedSb^FheKf`Id_Lc_HgcLgbRNJ:ON<_]EfbNkiVhhShfMkgPhgPhfMgbJniSpgTkfNniSjiPtoW''cZGojQYWE1)qpYrmWqmTtnTskSqnWZXJgbNrpUqjVc`Jg`GvpXvq[zt[umWspXumWzr`~zay`zcx^}z^|yab`JOP=khR}dzby`}c|e~{cxybwsY|fHF4NN;OO@=/QUCKN;LL9TT@XXFQS>PM?VS=b\GlkTZO<үɱ›ݽڼ˰ߩ߫۬ߩݩߩڪߧ֛٣ܧߩߩڦ紮tɜĘʚ˞ŒƖƔĔƖƖƖȖɚĖƖȘɞʜŘȚ”–Ɩ’ƘȘƘĖ˗Ĕ’Ɩ’ŒĘĔ”ǘɕǞƖʘƔʙƖĖŖŘĘʜɚНƘȖǚƘΛȗʙѢvgoԝƘȘĔƖȘȚ̜ج7:8̣ԛkzwdueѣů߳ƓǔŸ|ݼcVHgB}Ҿxo^͞nj[zxdOO4?C4)ba\D<-HG8JJ@?-?<,GJ8NK;PM=QP9WTEQS>UUC\[Ib\GiaM_\GFH8߿ݽڽȱ߫ܧڪݩݩ߫ї٣ڦܥڦݫܧܧ᪟v߭ȘȘŖĖĖŔĔȘ–ʚ̜ȚƖʚȚƘĔȘ”ĖÖĒƔːƖȘ–Ž””ĔƔ’ȖƒĒɕƘĒƘƖŔŔ’ĔƔ”ȘĒ”ĖȖȗȖʚȘˠ%)(ƘΛȘʖȖȘʚȔڲXXCf{tJ8孋عϣ̖ӭ˗_XI{{n[adLG>:$$dYI^\HOI7DG8BB?wmXmcMt\_[KiaFvu^G=-~kxs[~}fe|by>=/jslXjfMqnTzb~fxybwt\xvZvpXxybwt\rnZvpXxw\wt\wsYxw\{x^unZvpXxvZ{zaxx_mfRxybumWunZ_]Eyt`y`xvZxvZ{za}s\~u]{cxx_}by`y`gy`|ewp]a`MjybPM;li{bii\YKGE1jYVE[Q>zaxbnlljlpjgjnkSfdKllldOdaR~crpplrqlmmjrVUBML:XXFGD8JI7HG898,ED4OL>QO@JH5b]JWWCXXFXXF\[GddQ_^HWT@RPURAON:LK9KJ:Z\K_XCΟé߫՝ڨڨڨћםܧڨߧߧߩ버}\ȘʚƘʚȘʚƒ”ȘŒĔʚĖŒĘ’’ȘƘĒƘ”ĔŒĒƖĖƘƘȚƖĖŒ”̘ƖȚȚ̜ȚĘƘĔĔƘ–ĘȘȕŔƘŔ”ĖĘ̙ʜʘȘƚ$֧ÖĖĔƖĖȔƖŒĘÕzLH=s ҬΥlmɓѹǨqVAbV7~y`#JH7RI3C@(:@2_SHUM6[bQ g_HMH4kmgU_R,xoyrrtsyopxtmkUnfR}|eB<.^XEneQxruxvqsppwyxmcQ33&?;*LI>A>1HG8EE8LJ<20!87(PRCRRAWWCSR;MN===-=;+?>-[XFBE4cZGҧƮڦݩڨڨ֛ܧݩڪڦߧܧڨyb̜ƖȚŔƖʚƖƖʚƔƖĖŒĖŔĔÚƖŔ”Ș”ĖƔŔƖ””ĔƖĔ–ȘՔ’ƖŖƔȘŖĖƖƖĘŔƘƔƔȚȚȚʜʚȚƒʜƖȚĔbbWȖ”ƜĘĔĘگ*&" ͤiCɱu[L?[VBecXh^Gj<9*#BD;A;3Ũ#!IC1pZSCo.&y^rpeTkcIr}eq~k}e}lYN1u|u`ZEuoml|eoojRh{donUljniSoolp|fhpv|s]oyerottzrruwqwulvxwtwkx;7(}|\[A]YJqlUgqRQ>njUoyw]GE4zlVQ;s|wmrrZND3nurON;vYw{cRQEur`{uutuzsqvw{agnuxc,)KJ8CB154%CC6ED6HE8HG8JI:WWCSR;LK9UUCB>.CB4NM=OOAQP;B:*kĮݩ۬ڪܧߧۣݩߩۣܧ߫|^ȘŒĔȖȘŒƖ’˕̙”ȚՔ”–ĘƖ’Ɣ˔ŽǘƖ̙ȘȘƘƘƖƖʚŐĖƔƘ’ĖĔĖŽĖ”ĔƔŔ”$أ–’’ƒ۵УرȬúwdwn]-'|n^xoV:5#{WQA[ZCs# 87,heJw[,-! ZTCriTmb]G}sa^\FWUAc[EqpgRmpmmgQpkQi|xdjeOkppnm~{cmt{xclgjmoktpprrqWw}itr]vytbkun\vnnntoqptpqrnyb`Pzg_^HXXJ~uaRN:dbJnhRwkfOqnQskVswHH8d|ldR|az`yySQ?{ugmuxNP=~fxvq\7;0VSAwwXR>zu_vzq{vZvoZ{D?+wq[xt`r|jOP@JI:@?/QUCGG:II888'NKB?<-ML:QN;RRAMN=>;-A?/JG:JI7XUCOL8zߧڪڨڪڪڪ۬ڨߩlʜ̜̚̚Ș̛ĔĘ̞ƘʘʖĘȘƖ–ĘȚŔĖŒĔƖƖƖĔƖĖĔŽĖĘʚƚƘƔȜÖƖƖĖŐȘƚĔƖԠȘ”’Ôʘ׭qphP˙”ҫ˫\OA87,UPDŬ͢Ӣפ̨73)roY^T-}y]rmeMru_jihi}d}eo}y]oljipnvplnnislsoWkpieIenxfdQrpniqgeR~hhyu_|wclllrnnlijprk|i\YFxub41$46%my|ybxv_qmQnjNZUAu^xq{[\F}zf_\ILJ5nx`ZG@C6ifQjoURB=<)96)^\GptjhQrkRzrS|cwtahdPUQ?~u_H@,xvuxvuh<<1,- HG8DG8EE7EE88;+1/CB6BB4LL<=<+54(=<0HE:98)TOCXUAuߩڤܧܧܥݩݩߩڨڦأݫ߫粗mƘĒĖ̚ʚƖÖʗʙȘĔʒĒĔ–Ŕđ’Ĕ’”ȘÑ“ē˞–ĘƘĚȘǚĖĖŒƚʚʚޭ٭^H6ެǘǜ+۱Ôɗ޻óf`M=>0VWCYWC\YE?>/xoXo|bKG5wiPynT qiOolSYU>NL7g\B:7'xrYh^JZTQecWMK=SN> KK:FK@lfRq~}dh_E~eqn{e{pxlXoox{enne^Jtb}holWk{derljkijtqvkv\sulaIwjpsss}e~xdprqsnllpr~~jCC-tpZrmV;8.D?/"$xydCB2sm]}f|BA4|fypY|oXikkV|v]je~akkkVt|eprYwkU_cR\[IstrZ`aKKN7edQk{hTTDqiXh_R3/$b[EwoZYQ.<<.,//.!GG:?>/BD4GG;9,zߩܧڨڪۥݦ߫ܥڨܧ߫ߩߧ嫣rݧȖĖƖΛʘĖēȚƘȖĖȖĔĔʜ‘Ė”ŒŒƖސ’ÖƖŖĖʚƘƔØĔ”ŒƘȚʜ˞߰ݱsi^**$JE5\WE7A0/0$~fĖԣӢ֦^("hB:89=3a[ETZDOH8AB4YS@WO0xg??,yd`PitTWCKM0CC6PNE:7(@?/SQ?vڦڤڤ۬߫ߩߩߩ߫鱣wڭƚŐʚŔƘÖȚȘĒ”˜ƘƚŔƖƚʐǓɓŽŔ”Ē’ŔĖȘƖƖĘƘĖŔĒĔ٫ݧ{-,$FG9OF:XUDII=-77.<;.:9.,+ -.&87';:+>=066'RRA_\Jvߩߩߩܥڨߩڨߩݫ⮒fΛƔĔʚĘȚȘƖƘĒƔĔĘĖÖȗ߰ʣuhPx_ϝ߫ԠաўŔĖƖȘƘʚƚТݮĺYK?*+67'LI9HD1LI;-LIML:KJ8LG6JG9ND8JI;wbO& NL=[YD74$GD3kiUebPxq[xu`qnQxu]MF0nWh~\ifxoa()$sϾ-+!pD=/~dzMF4KL=vukPtokOtsp[rwjz]ttjhbJzdvnW}e~hlnyw`qlyqhpttzbkpruoYvt_mjUcu{cqdynpmisrpux\lnroWkeMpkxxr}eIG1b_KXZInhUb`Qy87(B@/GF3=9,}i{b{awv`spX~hfeRa`K<9*|ydTU?vpUoNM>ZUDE=*RL;`[FSP=tq\erKI8toZneHcbKqjSvunryxxiuxv`n{wup}{_zp]rf>:/;;.00!NM=@?/BD199)::.76)22(10#63$SNBUQ<߫ڨ歅fh^ɽ̘ݨؔ”ǜ̙ݩőSJ;92$##==2@@2//'(( #/+96,9:*+"&3,"kWIմܨΙաӣѠߨ̩vYHD4&%/6+MPBJI:MK@KI;EE3?B3MG7CB6A@2LK9LI7PP?DD4oaC۶~ÐauhzfJ9:+;5'A@4LE0EF5f\GZO;qqUybybkkmrgU>ry[WA |[R9hdQZXPŷzczzdoxiXVE}egozfIK<}n~sy{rj|wu^wgzrytlptrm}dlrpsrpt}hn|v_{bnmkpjus}yapuurreppj[U>WO0zx`*0[YGWVFnp]e`NfdMjwxcc`KD@,21$sp_^XCTR>~eVVI~xguoYuleQlkT{wa~|d41$PP>g\Hi##skWokToqyy`mcJqqlyuY|c~|iiieQrlX|rpxqorKK563";:+;:.55'@>4>>465%MM=87*GF7NN;KJ:{؟ڨݩ߫ߩߩߧܥߩmzthlpa|nS|mSvҠ޵޷ЧwzcOH9 /.&690HM8JI7JG:NI>JG:ED8C@1GE8A>4BA/EE8<:+@=-?>0<<4$$/-wjSx]xwXp{lW2-!,+EC:RRAPPGJH7HG8PI@LK9MJ:II>HH4PH8-<6eaL50!FE;ROA=?2ܭ}Ωjάq|`QgXN=oua}w_x\n}^]U?~tYwiTj}b~eq~l{_vkSrȼmXUGfv~d}d`NKK?DJ:Ƽ}`zx^zdx~twxxsmJK9tlwu`}zatieO{yoXljQlxfzw^nopom]~yb}f|jp{elosmtk{{waspjtxz_p|cn{v`jyVPAh{ritpw~ya@C1?>0UVB%$!v.-pTQ@^ZG``LgfSOG8tp[tr]e_HPO?AA2yw`VT@{xcDE6OS@lkW{|g><)KI6miVo1/!jfTwslU~euqurWkyu]m}crv}zb{qc`K~cfxrY~a}zc~u_vr^zwdEC4==2:9.1/$87'AB.HG8@?/<:+;;.UMAOOAu՞ڨߧܧߩݩݪߧ஑i{qp{xq{efNYXIRM;5E5EG6HQ>NL>HD3GH:A>0EF4HE8EE6FE6NTBIG9IH9EE8GH:FE6DC4E?1EB6CD4JK:E=3AC3>=-=<0@C7;:+OG9TQ>RP?PO@LOFB3HE8GH;FG;IL9NJ;&+㬈g}SF<.0&OP>fD{фG83xak^M:rikktyvxxttgJF8Ǣ`me[Mhv|41"~a`VEy}x{aign|waysYyqYxbipiwf`I~jslV|g}rmybrqWwx`t`]Fxu^yfpkU|s]tmRtoXecP|fvrtvtp~u\vsroS]ZA~zaLG2}zaovrVpkWzfeyze}y^j{ekeOhcMewymroW86*X\HBC/LI;aeR{ybKF9VO;fcLcdP[YHKJ8gcLUTA]XD{yd<<.cbNus\OM9hfRhhPb^DqMG5UR]ZD^[Lha^Lxu`XT@LD4xkojTmdRov_zu^eaKf`KnjUllWZTByt_xgw`^FyjzwaqkZheW('.-":9.$ LP?;=+=9*JI:96%QN>;;,rћڨܧߩߥܪ৉f}kspuulu|vifjW)#,-%@>65B5DF4FD5@C4NH>QSCHE8NM>HM>IIIC9EE6DC3IG>NK;CF8JG:BF8JM=0IJ=ILC@6TT@IG9LIB=+(,!:8+zgшdzqVy]]?tA1*~V|_nYkQcMJ-}bi]E³e~u pd=8-zc~_fbUϷ}eX_N[SHuhxvd}lzyuixvrYpxis}|d^VprkqsoWumr}h|s{ytullvry|is|dyu~gxpdppxrZ{ewoW}z`nh}zfyw]ZVDGD2\YEKE4tur^:9*IH5TQBvq\vtcnkX'"YZEURBIH:JM9F@/g97%niSpiSOM:PO>]XClm^daLvo]ktq\nd]Jrya^_RXZEYXF<70kiR|ucgdUEG/|TP=c`O77&65%(+88,A>/DH6MRC55%E@3EF554%JK<|؟ޥܧߩ߫ߩߩڨ஋j~smmyumsryuryxs]GJ=42%IC7JH8GH:GG:LIRQ>KJ1"reUIXR6MU8>="#"oV>{^tV~jnnfL|peJ}}pUeo|]^urZ~f~|ҽ(+! 94*ȨJQFȭ^\Qgz]?<2ָ~qVdxp[PG3}rW~dzuZf|hyr[rtZDF>}usYxo\~{dzedl|y_qkvq[okTf~uaozw^{d}w`j`[Gxt\wt\hcMWQ;xt]vnY~z_~ewV}xag|_igP`Z/,/ [[IkjU\YGLJ5JH6olTtw]00 xb`Lsr_XVB87,}kzr^QP2A<,65%/)C=,MJ<89'00%?>/CC456'?>-<:,@=246'=?042&??4//$<;.99.JM<~֛םڤڪݩڦڦڤஅhuustuwo|vqursrss]XJ?>+B?4EE8FC6ED6EC6EC8JI:LLCE1MOCF5kkqt~vakQpQ 0 8BA6Zc=4 :CB08,$*0n\Dr_uUtW}{|İdzwî˳˻98/A<-Ź|ʷfQK;ƥyufu_`Pj}ixv_ozfn}ejk}bpyvcyclu{xb~gpnWho}hlo}ezu]upj|a{{ah~ciybil~yb|\~y_i|f~ay`jgfrtyl{{dlh}zfvrZhigjSJ5VUDpr]\WE{zg}kII=DC2AC3ejZ79(MJA@2VUBomWLL62&LO=HF5egO}eocSxo}eqwq[y~h{d{foo[YR?>=0:=/;;.88,87)--!68,44(>@087)==.vћ١ڤڤߩݩڦڦଈezuwxoqxw}sxq{tqttznpW46'70)ED6II;IJ9FDFNU798(;6J;01D9:83n^CmTlRs¬tɺƬɳîϷɲĚ>>-ffWxcsc|! wwal~hzmeQb]Lyt_d_Jqsazt`OP>d`JY]EbZJGA;|lddQicSwtbVVGkhUMO<{dzytZkhgRvs\{y_~{gldO\ZIrlTWWCkq_^`Oxuawt[pmWa^K{v_pmj~}frmW}Ywu^LL:tlXts[vt_umVkgOzbx_}i}fspXvqZrmT~ycgkiVhaPFE4@?/?C4@A-]cNON:b`RPO?GEGC3@<,EB1gcQ;9*]_MhhURP>KJ8|?>.TUCVX@QJ8EG5ML@4yk~vuvyx~|zxtneih$07K3,CUYO-/HJC<-SF=?>;xWgMtccUlv_kʽyϺ~ͷǣѺϳ̠FC7><3crĻvtb{}`ɻ̵}|u\*'$CC3@=(E@1GA5:<+76'FE6;:)1.';7(A;+HB0G?4JH5EE4SN;[SA\ZEED1CB2CB2>=295(;:)<:'<>+?>/44(DB1A?-CB4FC6FA1CB2m]EتԫΣxYIE7CB4HF3QM>JL7GE5HE5@=/MK5DD3ON=+DB1JH8>9*FC1GD4DB1CB48:+63$56)IH5?<,JM9ML7JG:CE5OO?|{g?>+CB/HE8@@4POڨܧ߭ߧܧڦڦܧڪݫڨ᫅zc{{rvopqsvwsqvwtssx|qqwzykjUQ[H]hSsrpiz^~HSE{k:E:jmZbeJ{pr|wzyyumq+89_g+/-%=E=?5D=:LJH55$htbOԼʴx˜nǭ`wtwZ|bGK= ŝpfҮd`NNH-θǻ|xe}caPKG-/+44 A510,(8-"+$#>=1++%KD:AG<99.-0!36$D=/!'";8.@>5#(#(#(#.'79'76'7>,11&+/'߫řo_Y?>=0>:,880;:.EB6?@279,;>/CB4HH:8;0<<-7:,;=*DF5BB1EG3C@1?>2;:+88,00!66%/+ BA/ED3?>032!>2KH@/A@6;8*58*-,OL<74(ON@;:+71#JF7DC1<;.<<-@?/DB3HE6_\M^_La`LPOIK<:<-12%/*0.43(00&55*$#??3LJ7igO{dqlXusZ_^L~xcfrqy{wiiheR FA.@;,X[G--"47+#"0/!CC6AA1?=-?>2xߧߩݩڤڦܧڨܧܧߩܧڦݩڤާt^}orougispppputmsyrm}pqnwptszu~k}{hllm[YjUwsxrxtm}rv^|rz`RY=s|blt^xEE;mi_kmWjV@iXGEG6EE7($7T]+GJTE@/6:rƇڋSS?Ƿ}ʴDZưӼȴͶijͶʴкӪVQDED2vѲªŧ$ m_ZKncNklw}u\wq¥~elɣ[NA`JN3nmiU[ZHzwpPŦqU\T1^ha_WaFA&CC6{jFqMiվvn\ɝ`/#uvpusf^HygeI}eicqkVc<*JK9JG0?@/DB1EG756'@>2CB6@C4AC4;:+57'HG8A=/JD5FE696+;:+;;.87)55')- ><,rr^sn[|gx`xw_|`{r[k}w_zkq}wwqX32#:=-A?-+(?D/14%,/!-.$HJ:,,EB3>C0BC6}ߧڨڨߩܧڦڦܧ٣ݫڪڨ߫n|uwxtotlpstjopmni~ertxormpmrxoqupwppxzzcimVjwbdt\o}ay|x}~w{mvfhQzyo`S1<.EC:>A/HL:+;B3QPM=2@;4dbLԔŀgitxMM<ƼwvcƼŹѩ TRFŝȴܺkqgU|;4*PL=~`cWӨŲ|`ạ̇̄˸ tx\?+B.{/rFvNkbKĔqVI;&tsuvroecDz`~PXfXV7miSFC5NK;HG8HE879&>=0CB4FD3BE6==0CE1HE:RPA>@/GG8CC6DH8$%21#0-<<0?>298,:9.A@4;:+EF:RN>C@3MN>?>0BA/JC4)/::0?>-DC4<9*VJ7HF38:-/+/-@>+60%_^JwqZd\Ixyf`_MJG6w~hfcOujmVvw^RN=xq98)FE6+(CB1><-:9,A>4#"10#'&HH8,+BA4>=-76'{ڤݩܧݫڨڦڤڤ١஦|uxrsutrtqoourpsizrwv|ppprqrrpsxnrpsxqr{tsbHT?PdQIXD]cPZdWkz_zs~rv|uzuyymUO@DD6FC8BB8\XG#);GH=C;399)GF4>:+03&87,=;+HD3DD1H@-E;,51#44'JI7JI7pjUyGD3UVIXUBWQ@kVSAvt][YCmyJM<_ZCxnlT;:+HE8FD3FE6CB146%<;.%((-?>-@?475'EA3AA1A@2uڨݩݩڨڤڦڤڤڤڨܥڦݩଥzqvsutytrsysv}mpnv]HF4K>+vg^Jnttupstsswswuxoruoorqyb\gR\o\LVCZlUY[SU^IUbK;E4zt`nWhvYukvuJG<||FJ;LH;DD:IL>+.0PSFE6DDDiuhfWySmĴ &$riVڤdl[lmZɡ|qo\r\caPվhZNҿѤvq\bYH—u ϠoEgZHĦr۵ztpDlYsfDhnczqOUbTO<l@.JI3;8*ED6AA/88,:9.9<052'11&22(84&>3&40">A1@:,85(A?1+%:=.65*76'16%0-43&98)%$1.%88,?;(QQ=FC4:=-?6)CA/CB1FH7LL9cZDLF1>@0:7(EE6FE3ZWEmqZ.3"b]J>=+op[;6'skgPONN]I?T>et]LTF{VT?mst20$JKB6<8\g0IPB?8\6*VX@rjbryd.-&ݺGD3ʯþTQ@}v\E>4\YKxzh{dʚ浀sǺwƾ~vpYxЖ~kF۟r\;ϭqwT$f`xVjÜi_zTRc[UD,-lB٩ѯөo~fAKOA((vtxrws\orXuqUeqG`^kMoqSmkJ0 QS;:/!mOzZ_b_kkgasP5z^sgbVd`EXE4UO<6<*<>/<9+/+99.;;.8:,3.!@<.KJ:ZH2MD2PM=14%CD/IG6A@18<1nWEZM6+*.-ED4TXID>/99'QN>LN?>=-58*@E/v{iYYG]]KUQDhgR_[Hup\GF4EE6FE6JI:@>-LI:33%^P>39(BB1C@4RJ8FA14/":7'JI5E?0}ڨߩܥݩஙjtxvqurkvpjjlms|rnZ!d^QA8(z|uwzvyr|oqup{vqvrtqlt|rquOYBR]Ihjdwbqh|cn^m~fqkKRAhvj`lYqi{ +,+0OW&;C1]i:fsUb[jt]MMEBI9r{g|xش ßML9RU<+\]MNPBNK9;8-;9'>:,GG8>=-II8HD3RQ:(gfSHI8VQ><;.=?0JI:CB4,,@?-44%B>,43#1.F<-ZRA74$65'HB3CA/?>-rڨڪݩݬ䭤qrqqvrmwvrsvroofyZU@mr\** ppqvmp{wnxruyssv|xwspv|t}FS>NeN/7+5G?UeRPRBomomvpponk}tWaTAB2:2$mC!'*W`Kytah[bl[SV@goX?G:;E4igYafU~pt~w|{l 50"_dMRW>޷_YBkkTmjWyilfN}sc|lܯx¸47/WQEkwŜfhGq~mcdaz_ЬpͣxNc\xOhbN,,F>.zolWЧSuDD5rwvtkgR\]IvoWs`LwrMǠnQ^FoMr}`O:WVCI>&岬~بckץ뭗mf[F1(50 D2(/+85(54%76*-/"KF902!=9)bM:.."32#MM=DD2[R=cZF88,84&::+11%?>0SS?AA1<:+FE6:7,?>043%B?0FD4hf[30'@@0DC3@?/76'=<-02#13#SN?<;+DH8^VCSE2YK-DH8<:+x߫᩾nxom{ttwxutrqotlvavUWKrknoosisxwqrtyyyopy~pspoimt{|{d[cSf{`nwcFUA^kX00"c{bow`Ysb??2ieKܫdX>79-mjsqxw|wUdQvvneo_ogGUE9@4|nrnrVuoȬb[Ma[K\YHzxc|yri}fvp\"&ľѳ}ztĜehOʴҢqapLyzdenagdˤjƦvmCZjJ>:%32(0/!teKƔjv>>.oqvtoVG1wuYTWDvKepoRlIdpYqE6IL9F8$VM:zrWҾrɓݪƕcQCE?,D<-:9,@=/@<+EA354%33(?>0NI:((((51$QG9MC0??0#%II<87''%@087'ydLyiQ]SBNA/CB4>:,?D220:9,@>203&uƘox}totuxsvthsllt~QPDwA?5xprjqpk|uptsrout|wyuw}uiqlplqEUBaxdjsfmwwT]FGX@_dNsrxdQ>G?t\J[UA44+fmjnnlsxpjjiporqlistwvxu}x~x}zugn^zd||hnwpvo`vzmiOekZӧϫԛrgSqi{|~a{_]LŴmD促kcV@]}oJРf[*$͞gǥilͪqwS67)>B4fWCveaR# ʿ?>/umR~Òix52!~xdrwwqsjSxwbIS:[|R`qRc{eql[PK?E5"ߩ߫ɿwPB3ϲm䭿w{`IE?,HG5B<,:3%B<,LL<.,87);:+11&JC574&GD2N@/xgK=@/55'21!98,JPAQQ@AA2?>/A@2?:/96+43%/.>400#@?/67,;;0ED4<>,87*LJ>IB2')dYDE=133%8:(77)?>-FE6EC8A@/|aӮp|wtsnsmsipnvlpstww|tmsqugvsrntwowqlqvtypospqsuqturhQE6K6%߫Ӥܫװ{ɿfܡߧ}]~^FJI7CC4?>0LG9OL9OC,oUBH?.EA/<=4>6(+*97'dP;<;)UUC3/ TSFSQCDI6,,::+00 G@1J@0,+:4'GE/C@182%'#8:,*-"EC/ED1GI7OL>FE6OM>A>+OF67<(A?/hXD8;-UO>>=-CD/URIA=-LL9<:+oߧخj{nvrtmnuuovrrnqrhbVd`K}ybwstwupryolprpsxopqnulprlvqztsusrpmUsp[=@0AOJ{㣇:*/4/:=,LZF{xmoe}ghi\nYK]M-:,EV?xrOcOc}b\mUZpZ3@,O]H6D3UfRc}em|`~sdz[voR[Lwlyj{}q_Hxu~c|ͺ{pshmXqj!'AFBȗZѪpqݯnfufğd22*26'_^Knvsuuusc`PYYFڦ͙epy~KE3ljXxxvseZEuu]IyUx`7|UhYtce{hBF4;6&ءshaMͼ|^ӿw֡eOGG:FE3JI5JG7?B5MG7v_CZG3*@<+@?/41$42%;6(]J8:9,HG5AA1FB0C?/HD340"74)EF4OI9]Q@87)LL.@?/C=,%+:8'JL:KG8DB1LI7JJ7=;)IH8PK66<,98%n[N88'JM;GI5OL>CB4EE6LLH4puliljikmocyghjljhi`w`xrPbLw{[oXro}t}q~{oiupl~dl}bnz\mvn~ybÛwϪàz{|q^eP]dT "oeQSαyYɯveqQzPYi>?1fururouwzsn\i٪Ö˺gvvKH5leUtuvvL<-_P@1FE6A@4@?/JD5JM:LA-V?.]F3/*9;+NQ@IH8A@-^I7:9)FC/EE6>9*>:+DD2BA176')(M>.hU@FI7A;,CB4;:078%B>043#47*>=-B@-IA6?>+=9*A?/?=-aWDA>/PH5PG4==,EE6JH3EB3FD3DC1QP9YRE~ڤڦߩݮrzvs\qx^xgxy^w|^tz_hpWbjUdlWglWkt^goZdnQ19.[`J86/ fbUcdOcjSku^hiUagPbaKdbOdgSmv]]gTlvXuo~izrqyqzrowlqmoysrrprsrnpjp׃fv[Dˇg^cQEH; [u_K_L5E7LYDRgRGSIhxdFVHhjejbhoqfjimbz`XfSXdNObO`mWjxgojSfx`ytf~bp}j}yzw^shm^>ѱ_mQ\m[UdV'0/'\R@练|Qn|YĠmѦpm͝gÛm<<0zy_rvwppvuxicQƦԧpɩyz[bfcNrnVMM@d^KqsvuveO|L@$rf\UpZy~NN>?+洨q˹ۥə}_~aytY?>2?=0>=-?>0FE6EE6fO,+C>.20A;)OC114'>=-ED3LK9IH9@?/;7(JH5OK0lYEYL9KJ6HB0kYCaK94"WF:LG4JJ:AA1=<+HG8<9+\\JB@-DB1;9)?>0$"F@,WV@A9-D<,:4'ZH67=.DD3HH8KJ:A;+LI7QO==9(WM:JF5OJ9lWKP9JI7DA/?>0HG8A?/A@-EG3BA/rY߫߫߫߫ݪߩܧ٣ܥ֪p}qxvwoxomimnprj};60XWHjigtrorlptwwurvrnpptswmrulr|utnuqnrsrpqnvgzu[ʌg}pujq~ixu_v|gZmZ_gU()E\H=K:P`Ptyj{fYn],3"/>0Ys^b|govJ[Huw[YK293awdUiZVnYBJ5zekjV|QeTMTB]g[]fUXbSq}h.)NO;ڱumAvg`P_XDZdשm֨uD?7^_Fc͆f}]ctuknwޱccGģoKdI=$ƽdJNA~cevUzdP9irnTu[FwZrcS_p^jzfS[J6+亯}ƕ{\ﻴƘ{ʥqV?=-=<+87'>=-HE5FD1`K8^T?LP:JH7BD/]SBkSxZGD<.>;-?:,DA/;8*?;(94&G?0BD1@B.EG6CD1CE1SSBPO<--$KD2^R?LI9GF1CB2DC296+ML:44#_^KjYHC@/<7&r\@69(>@0:+oVeO?@2MH8ROAED2DD3*&B<,>>/EB3OO>A@/FE6EB6NM==@/=<+ID0nT@)%PQ>DA266%GH1OL9m^HmWpUXL<:9+EB1@?/ML<;:.54(2+45,44%44%pfPܧݩߩءڦءݩڤڨڦڤx{rzwqzvsskuspnlvOI<zdbZDxvzptpnnskoqnrqrrtptilpnogovtrvlvpqpjx}crv^z[_@}txwquszropphksvxw}|e{fW[Iu{jXaObv`Xp[[mVRdQJR@zML>E<5DQ@zy9H2yGD3xb\JJG:QfTavj4<035,62+h\Aui?ຊjϒl݅i؃giQWp_vLB2pӀaӀawZ<`Q_t_tvr`sVޭjlSkg~]{]~adj^K%3DRDR3Q[p^Lbi`fggJ`VIjS@QO@) ׫hƶЯÓrSҺ믍nV;:);:+?>0CB/CA1NK9dP=bN;ZT@TQ=TT@OM7JM9jP# JL@WRCHG:<:)73$@?/;;0>=-;:)@<.TQC31!43#A>200!:5(gR@N;*;5*C?/HB26,0$w^fYBB>,96'DE6><+A;.AA241$40",-12(::0*, ][Aߩڪ۬ݩڨߧ֛٣ם՗ѝݪڦ֢nspvsuypsqmnonipm|c>7-x}hx|ckx}ef}fs~e{gt|epu^qybqzatt^noZfpZ]nU`pWXfMWbIZaG\aI|e}h~~hjtu`vw]iz{erqt[izfwxvstonyhYK;z`OpmnQwctzlsywulvtusxptopts}muqt`nRTiOIZDut`sp\QWLfkwlUYLmyWVCMK==F2Xpc`pXQbU!=9-XSEX}`gVem_mJ:䨇dJcK9kfSmy{gԂb݅ix[qTdmiuvlڳj̣ڣ\~}hx_`dg݊k8;;U]Xa\DR'IP?XZvV֋ilrMh/ ^=-kS>EH7F'ԧj_A{sVÓjJvvmdJ>C/98,;:)HF3MI5OK7dR<]J:WR?\[GWWC^YIQM;WN9eO;*'@<-NM@@?/:7(@>+,,EF697+?<+??0GF1?>+GJ9KH<.-"GD886'jPeMTG6e_CsXI?0CF7:9'65%=9*>=-CB1C@4>A1;:+DB151"21#76',, [RA߫ڦݫܥڪڨڦڦڤڪzT{YRBѰ٣՝rvmo{jssuootqkvput`xkUYcMXcLjqVhiVeiUrvbip\klYhoVfkVpr]w|cry`tv}etw}h||ml}~g~zev}ep}ee|epl}h|wbilysrpjtvxuo_Ft`LpdTvurvwpsv}xvpptpkvysyptvpyqltv{dpo\hQU8\cDQB"#wU5~eP~jbPrVoWhM~u`tt|qmdLѻkvklu[xtY]lZL#PLD/zoyL@`oP?@/A?/=;)?@-QK:RK4lQ;\H5SUBTQ>OM9XZF[XFTL2r^J60)<7)93#GC2?<,<8&),;<,>=-5:)88'DC6A@2?<+?<-=<.83&47*D:)iQx[UK=4,65#>=0;<+>=-@=-;=*MI7JJ::=-65#43#64#42%A>2-0$VT<ݫݫڪڪڤڪڪߩߧ歔lqsQov˱ТqwovtuoswppyrowrnFH220#edSuwnromvrspujsrtsrju~okqrvyzuvrvrrpvptqksf~pq|ryg{upnrsv~wttstrq~unpqmrrwz{mzdbjVMF:MK9IF6^XJVSFlPS@vust-0$72$AF>@\\-?F}.NVvq]TuYpVlTjWBjQlQj{}}N_KtXС}raȥugcçrpzy195@=-gD2A?1M=$t[Aw`DtRlPiOlQwXbcFdQ?yhK|gJjPlR~hLkO`IfQ|YB9;+@@.G:+z\GhNiPcHYJ6QP;LL9HG8WQ=UWBWO;TO4fMA7'E;*;7'79'63"41$11%?=-IH9>;-98)=9(54%;:)?<,,)<8*yhTrZC?/:6(:9,,,>=-<>/A?/JF7AF2DA/<:+>>243#?=-TTCCE5:6&)0"^YCݩܧڦڦڨ߫ݩڦڨƾmbU¹r˔Сowrvunsspvnuxlkq;=1?6,ompmuprsqvtsritmqilonmpsvpt{|svotnvrtswru|rwotuv{qsquvoolkomguyojkwgmv}kkltakiUkgYUXDBD4jfK#/!JcS`q]#&?D4GXU`rt(=B(BIctj2SWIXV~q^ozeteIP@]G}wcbly|x}r߫ۮsפnsQŁUTװn˂f1?&CN]tkCL9VZGYY>LDVW~cCjU>u\DmI6[F3v^?gK2CA1*-$:;5<=4?A3?D2EE8BF9?A2EH7NK>FE6CC6@B1A@4A@2@?/;=.?=-?>287'3/ HK5KJ863"63"qgVڨ߫ߩڨ߫ݩ؟㨧w{ɴé^ިԡispstslsxrmpoptqsp`36+ssavsupssuqnvqrstyslwptuxrtptnovursupmpppqlwtwu|ttuswspyomz^~ckm~i{^UB[U@q~bmxza{{duqYov`t`rpTlkRvsZ~v^{_}wacmuqZuo[XSA85(jmY}^zcpgQZVA<5)GM@Ld_!:G9VZ7Y^t~qBcgv|jzjrLQ?CC3/8'5-!friur|֤߫yܫxOL6bDdHbMLÀxhgOg<)mub;=.*-$==-76'41$31#42#BG78=+>=-=:/A>1A?/?A1@<.::+?>-;:+11&CB4=9*63$;8(;8)76%AA/;7(dU?RD2HE3LL7WV@[ZGWUBRL8ZUEi[Ky^GuW@E8*0,"++FE6BB1?>2;:.A>.98),*!;:+54%H=,_I7ZF57&;>.54%::054%=;+FF4<<-FD1HG8<<-ZZF22(TQCCB4@>/MO;WWC85(STBH@.߫ݫݫћס~r]ż×}צlvowtmovsvnjxnsxsiUC?;,qqvslrlko|oqsssmxovjlutsppvunrmlqzoomtxqotsyx|lxu|}VM;so[v~dypqVzw|v]gwvqk|emur]ccK]Q6mxs_cgsxwt_w]\G=:)fswqmR|3(VVB;E)JV-EDJXPbY?Gk{~wbМ|bwM]NeO`ziUjQY{ə欘mЮxRrL]~ZzY2JSKc_)JV'KURkjcpnAP9QPH_\jjVzr}jSm_]}kt?.?,<)?A-98)98,=<+<<000!31!IL>QRDDC4ED6UTDGG;DC4?>0PO+A@2JK5GI7MJ:EB/eS@\P;SV>WQ@[XF\[IVUDXSA_\GiXF\C1kSdO;P9'@<+FE699)43%.,35#,+IH9=<0(*_R?cNC@4DC144%76%;>/>?+03"LL<<:*MO>QQ>76)llV25&NN;JL:NM=HG6HG844%WUFOK<ߩݩՓԝ١ڿtvڤ١}iwolv{mu{ulsuvw`pVw`scaIr^hRxmnrprrnpllrtpslkmntprsmkolpjnlqskixutoypfgnV|ewx`ry]dlq\wwalmYwt^uv^p}ixxejrYgkQMN;)i~}f~hyrnF$DL<,5%BH(P\?GWhb{hPybx\nzovyfh~eoV\raű֢dkY:t\@lX>r[AgZ9?:5<[a)JV)JV@QT5Y`0FKxSDz6+:'p+t4 jC-xSAm>,o?-Q:BDB2nZE^I7UQ-_[G32"JJ878*NPBNN;51!uxf54'NM>LO<\XEQO;KP70/??.ZYDߩ֛ם١ڦ؟ܥڨؤr|uwusmuslilwB/]Hnmrt^xv@1xnvlrpnsnqtqrtwsltrnqsngomtmpnqstrwpwrozt~y|}{zvx}gnn{~h{{dvt`px^krYxeqq]svZjkWjzv^}}drinrrgkz{_ww_yhhs\foXSXEbhUbjS`gS8@.ugQ{v]utYztєWUHxp,Ta8=9-S^:\\-0{zzjdvgqU\nU{ameoem}f|֮zq^ęlfOdLpS=fR6{RةpaR`_]`VJc^W) J7<'9&B.lE4a9*]9*T;*R?*SB-tS54(,-BF9<<0?>098);;.HG6NNFD3;:.kgPJH5ON7OQ?c`LHE8?<*43#HF3FC/IH9;9'hT?\H3QP;LL_nd>US#GT4BTcQju\xdJ}]oyg}lcwrUL;{vVЙrT7RB2?5"\ˢjǪmԬpԱs۫qЩ|qt_bP9VMVVHc[Dh]ȝnnbFwKmK25*(+CB1?>2>>240"77*JM=LL>?>0FD1jlWSUBHD3CB1LK7JH1JI7MK:cbLLL9A@2=9(;>0FD3BA179'eS@WH4NN9HG8LG9GJ\]P`]H߫߫߫؟ڦݩߧ߫٣ڡءաݬryit{pkoxop~eY>hRvD/g~ex`pYgQZGdF0 knuprzvsjtnojjp}cmsigmhh|}dtwbvepw^rv[y{e}dd{|aijqumv}ft{dmrZfkVflWko\emVitasu\yzfu|d}{d|yc}~j}~h~hzw`uuZuzaps]v{ayydsv[bsw]c~iwx]~h}}cwjroqsswWS6lnRf]HIA5x_qxk{LyN' KOAA:%ni_06}t#&%*/,<-1!>7ZM8lr]vtc}mհuqWŢ٫ҰmP^EbEt\BrWBwY@wY@wY@s]IHMFtZvid|jTj_6NMYM=t_Gp[DhS=uZCp\DoV>hN>?/('BC6<>/EG531#02"HI9RP.@A/=?087'dV@\I8LJ7HD3OK4~rN[T9QP7IM5]T@C?+:<-[K9zP=yc;-+."-3$66)\SA{a{gSG?/<9)44%EG7NN=88)HE5JN;=<.BF/%(CC2@?/KK8NWD98(X[F46'HF3NM=yuZieRiiO[\GgfTvqZ߫ڤߧڦڤ٣ڨڦ؟؟ڧhiXulos|\lnknhStpZ~^Et\eiqUvZ{V|mRyaMp~gkhggk~bjghpjhonokkmolhcs}~h~|donlhinrmrtnrvonhwsqulqu{~ovqsn~e|iw{d}iikfxufw~gut_ewv\z~ajx\prtZXDJB8kloscz\o}ܓυ؍ޖ^kd"@?;#BN8BHz]vZq[EA0ntXDw_m}۪jÕwOvZEz[Cv[@|eOmL9u\GlR>s_JqS>xttd~k:NJ)GIu]>qZElW?lW;eP8jQ8[N3aH:<.-/#;>->=-RRA'$88)LM=-76#CB1A@4DG498)iWAeR=NK9EE3ehsLVT=EJ2]O:C?+CD4SM:v[inY1.'-4&&#ibMsXaK48:)03$$'+-98(,* 8;)KJ80CB4LL9|x^a^JnehOnlYtp]؟ڤڦ١ݬܥڤڦۣաxmrnprswmghi{^rJ6dKcK|M;up}}bku~f~sE2zqokjkkj{{d}jgictyw^oiyxalomhnj~~if|e~~iijulmqngotoplg|pnwlzlbnVScRdrYmu`kqZwlpwehpXhx]yw_svavt`zdswdls\lx]dqZct`goZZoUR`N\qU^gTSgP8K:8O>LeQGZDEG7AE6~frqUĀ{rtwфyq(--6(9@hZxUӀa|^c؃gbWI2Ĵѿ㬖sDt[JgN{bBlTwY@dKiJ5lTumTtr|Ywgm3LIXE=qYEeKy]AkTnVCkSmS9hN11#,+CC4>D3]^M--$?>+PR?^_IOO:ON<]XIHG8HG5ML:OOHF3|hE콃ÂFH6TV@ZR@A<,A@2@=-UG.icM@- EA3w]dWC! /,@D2((86%RUD<;+HG6SRDFD3][KCB1KO><>/DE7YaN17'os\DO5U\K\bLw{dho~~ileڤߩ߫ڨڦۣ١ء֞`iTcjnmfozion~}]iOnVXCM8jqfsioxhN:e}}deihgl}~ell|f~kkfjkq~}fo~~iljqqtqljkjlfmlilo}h~kh}k{{dvz^y{bmxbugwyazv`||iszc|~asy_{xdryby}i~mliskmqouvwaos[ow\ps\ljQouZgjRakW[aMhnY\fT\jS_iWBG8:=0`φ|zՑщeSH?(();ڦץϺ@>(jI}cLuYrWBdKwY@dKxWFdKnW?eH4:),+BD3A@4_eT00!AE3\bLZZI[[GTS;YTEQQ>QP;XUAYV@RR>NQ>SN?b`KLK7@?-A>+HF3CB1NL8<;._Q=YO6LH7IL7/EJ8MA(ioxmS{{dymVgQ52',);:)LP@#11$QRB65%65(Y^J:<+__KLO8#9A'KN#IF"DF(?ArYd1yiOkojO:URFYClnQmCNIׯ},6"m[BqYEnW?u\DoW@vZCdQ<~cItt[x}}$*ED1DB1ED3;:+eZEMC2HE5NL=FE6JJ3_g|qVaS=DG2?A3AC3@9(QK8llmyiNK=,,,/.A@4KO@>B6IM>54%<>+fiU;=-\`IemXW]HVYHX_LipZW^Eow`uxcqyaoybiuYov^rv^mssܧɕЛ٣ߧߩؤViX}k|flgsjfi~iz{cuvcy^zeM|/ p\CzcrvZkbJzpTWCJ6_@4qxfnrdzk{j~l}joj{kxi}mxixhx|fxfziyzer|akx^s~fx|f}gqos}c{~h~kxh}npxgyzi{~hzkx{ctxbr|azi{~hxh~~i}kzizizizk{jx|fn{j~lxh~mjjnnlpn{kzflq}~f{yeow`ps\v~dlo[w|ecjXkv]tv^EJ9GJ9G:$<5"~gJrThbgqSWȷuP\dT6ZWE6IN:5/lvfy|esYwwc_eU֞Ϡƛ௝uG ZV@^VA\S?]S@YQ=dYBnVChU@noXttt}9UGgW;_R=dQ@-17&KJ:UWFijSIF4FE6dbL``Na`ONO@STDTV@TV@`aQNP;HG6ON,HK7>=-;;)TI8EB1HG8JI:CB/KG2o[BfbthRKL7JI77<,:5$88*mhyvdxdQ77(03"2:)AK7HP@*0"9B/>H5:?-RXF\hS[gOhw[u}deuYk{_x|fsgxhs~fq|cyzerb|kvjom|ntuZܧͺգڪڤڦ߫ݩڤڡݨޥݩӟMcPu}dtbu|axhm}`~hlimunnVDpfTzkT|;*ytYk\HsmUrcPnmVx\BWDz{ejcOlv_ly_s{dm}`o`r{^vgt`uex|f{g}k{jwgq{fly`lx]rzcu{_s}ev|hr|axfqy`vy_ufly`p|bx{cp|bm~bv}czgqxhu|axfzlu~cqzbufu|au~crbs}eq{_jxdsgq~hm{^{grbzixh{jv}fjv}fxh|nu{cufzi{|gy|il{|dz~cjyzemin}gmjpt_JM:CG5iQY`O]_@pva]bJ`aP(/+99,fjXT[EGL?NJ=imYxh(JRDRIYD{|g}hxht΢ջɝȻƝV%%wll{fr}ls{es{exiuf{{dwlttt}*?B5L@v~dlzaq|blx^vy_|gjy8>-23%EM;cfPchSZZHGNZ\HikYXXFON<`aQSO;__KkgPPR=HG6KJ8OP;KN;EH7[T?UF4QXBOO>JMD1KA3*'ns?D2fU<)/:?.;E4KU?MYENV@[eR`kXZhThubcu_cs[]pWasZfubjxa^nW]oUhwbjvclw_jx_nz`nzlugwiwi}`ڪЛƙڣ߫ߩڪڪ̗֣߫٦ݩܧܥܧڦڦا=UBp|bqfqz^lu\shp|crtaufbqSiqp^kTk`Ho_@rt]uz`v{fsK8m`Iv_HvN:kP;k{g{~fjw_p|cow`s}ev|gs~fpcjxdo}eryfmv`fv_gy`hu]fr\jt]gw\|hkt^kwbx{co`oydhwas{eeu]fwapz`xilzdhu`gy`kyhk}co}eozclyal|`n{flt`jybmv_ozcq~ht|ffy\shmwahwanzbq~gt}jm{^o{ds}csgmxdt~]v}exkt}jv~es{exgu{cv{ezf{{duet}dv|dxht|ft~g{~htJK7@LL-DFpxft}jsh{|duy`mP嶨qzΟßlXZA0,'x}bo{dq{fr|hv|htlxixhnzbgyeqn}3LK*@HS=CD0]]H`kVKR>BG3[_NEM6T\H`_KJL:@@.BD4HL:GJ::<-XPkPRaMs}cv|gu|hy2@->D1T\F]mU>F1HL7V^J@L3EN8PWCFH6?A2AH5LM;@I5EQ-CE28;(}twtØg]PK7=D5ug58)#[aFXeRQWDBJ8.0EP>[aSS^HRZGfv_fr\YhOtll{fpzhs~fo{dpdlzbpdm{em{hn|`gxdfwao`q~im{hgx]}fܧӢ͜ߩ߫Ӡם؟םםܧ؟١١ء8NU>Q[DLO18:,4:&FRB[bLCE5CH5IW@C3MWCMR>:E0;D0ESJJ3wǡlc~OsRKiMNdPbt[at[^qXewb`nYgrbhxdcp^4Q=|gZsY`u^Y\HVdL`qXcu_gy`au[ooSY_Naw`^nW\oVt[K_G-3&;B6cu]\oXar[fv_eu]cu]cu]`rY]jT{Y^X[FiO3dJrZiz^n}fDM737%OXEsٱxѡqywwwwzwŤitRRF/13#A>-MQ>XbLXcLDO6XbLTXF>G4IW@CQ>6?,9B-GX>WePZjQUfOWYDEH5AD53>+K@.YFqmVar[\qY^s^au`_r[bt[cvbcvbznNNkR^pWfv_NgQ|PUp[15%>F3fvb\oX\rZZqXZpUSkSSjORbMVmSGaJC_FfbKeI\By^HZoYd4B0NcILW@LZA~UƢinẁ}ǢcRYL;14'AD3?I8@I5JF0OTG4Q[GDM8?J86>,TcLaqYbrYUeRds]XkU[[ERE3|UCu]y[qM;;TA0@I5as^ZoXXmVSlVOdLLaLJ_HC_FF]GI\GJbIFZEklKp\7Tp}aSUY\zծtk=`\=CF3AL:ESAAI9HF/GN@YiOUeQN_HZkVN`KM[DXkX^mZHP=IR?,AN5DS9NbJLaGHV?OYHIS>Q^JIT?OG7GK5]lUYjR^nUMZD^oYbo\Q\FchVS^HGR>P[GGUAV`LXiQUjTXkSNeJX_C,7&2>-BL7APN;EVBH\FM`ILYFVdLXjQLdO?T@FT?J]GIXG->*1=-;K6DWC;I5FVBK]Ffv_`s]SfNM`KXgQ".KYAJZGRdOSfOUhRYiVQbLQdLfwa\rZfwaplev\^sY^s^\r\ZpZ\r\^r[Zr\^r[ZpZat]`s[at]^qY]s`^t^^s^[p\\pZ^s^XoX\r\UjQQfTvoUϢظޥ߫ܧߧ߫ܥݧ'7-UnX]oW[qZZoUXlS[nUSjQ[mUZpWXlSWoXZmUSlS\qWSkSUkU[kTThSVmV\pWXmV\oXWoZYkUWqWXoX]u`XoV\nZ^pW]q[\r\ZoY\rZZmXUmXZmVXmXXlT_s^ZmUZpZ]oZXoXRgMVoXVlXUkXQjXOhQQjVTlTQhSSjXPgQSlXOfQOhSMgQYq\Zt^OfQWoZWl\WlZVjQZoVYp\Wq\ZpZ`r`^q\WkTZnSZmYXmU\pZUmXZpZZmWTjQ]t^\oWZpZZoW^q\_qZ\qX\nU\pZ\qY\oW\mXYmX^pW_oU_qY^r^\oV\r^cv]WnXeyb^nUes`ZpZ`tWawa\nZ_r\`s[_v^\qYiyd[r\ZoXZpZ\pZTlTZpZUjQukNUoU\qX`s[NhPnmLUkSXpVZqXZpZ^tZ\pU\r\^s^\sXQfN\r^?WCXoXSiTUlUWnWRZHNK>J[HM\J<&UQ:RT@NN6PJ8FD)MI1WUA`YG@3#F:a]Me\H]]E=?(JD,D?(PT;JG0YUBcaO`YGTZGHP;LR=HK:LG/?+B:#8)?0,)&#/+*+%,2!01 41 /-57"7:&>B-6?/'2$.;+1C3+80-80)5**;3/@33@43C52>19I?8D:0<2->2/<./@34@09>2FI8?D92C:0A20A267'=?.;?*AJ-GC(7@*37)*91FM9IR;KS=LP7UXHQ=IR=PYCGR;GR;OV>ISQ=8J8@N@@Q@EWBK\F>UCAT@DXC@W??P Format.eprintf " %a@." Jpeg.Marker.format mrk; match mrk with | Jpeg.Marker.App (1, cont) when (try String.sub cont 0 6 = "Exif\000\000" with _ -> false) -> let exif = Exif.Data.from_string cont in Exif.Data.dump exif; Format.eprintf "%a@." Exif.Data.format exif; Exif.Data.dump exif; | _ -> () ) (Jpeg.read_markers path) let images = let images = ref [] in Arg.parse [] (fun x -> images := x :: !images) "test images"; List.rev !images let main () = try List.iter dump images with | Exit -> exit 0 | End_of_file -> exit 0 | Sys.Break -> exit 2;; main ();; camlspotter-camlimages-e471b3c4470d/test/jpgmark.ml0000644000000000000000000000233312405272062020337 0ustar 00000000000000(***********************************************************************) (* *) (* CamlImages *) (* *) (* Jun Furuse *) (* *) (* Copyright 1999-2013, *) (* *) (***********************************************************************) (* $Id: test.ml,v 1.32.2.1 2010/05/13 13:14:47 furuse Exp $ *) let dump path = Format.eprintf "File: %s@." path; let markers = Jpeg.read_markers path in prerr_endline "markers loaded"; List.iter (fun t -> Format.eprintf " %a@." Jpeg.Marker.format t) markers let images = let images = ref [] in Arg.parse [] (fun x -> images := x :: !images) "test images"; List.rev !images let main () = try for _i = 0 to 10000 do List.iter dump images done with | Exit -> exit 0 | End_of_file -> exit 0 | Sys.Break -> exit 2;; main ();; camlspotter-camlimages-e471b3c4470d/test/micap.ttf0000644000000000000000000025366412405272062020201 0ustar 000000000000000OS/2Y@kVNcmapzbWe,@Hcvt 156fpgm3Oglyfkhdmx&^F headSW86hheaWp$hmtx- %(kernU0locayr!,maxpDW namepost}::*:prep4iC XVpH1i;S+b$  y i C  X V p H1 Version2.3-Font Designed by (c)1996-1997.SmileStudio/Tohru Fukushima. Original font name "Micahels'type".Version2.3 Fon Designed by (c)1996 1997.SmileSudio/tohru Fukushima. Original fon name "Micahels'ype".MicahelsMicahelsPlainPlainMicahels PlainMicahels PlainMacromedia Fontographer 4.1J Micahels PlainMacromedia Fonographer 4.1J Micahels PlainMacromedia Fontographer 4.1J 97.7.28Macromedia Fonographer 4.1J 97.7.28MicahelsPlainMicahelsPlain@,vE %E#ah#h`D-8AE7"/^^fn[7=^R6޳?}JB6 o<$Hl*1ܺb)yW²~>Ο7ήZ}qOfwy`OQƘlDᣃ$=Ϧ/DV:X;~A-.l}9Lٯ/*l~H摨Y^GBJ9MY{mzwtJ!={%c=-U̺+\|nPY-'i4 m\էz2C @ʨ3z.\fD)РIm6rb$5%5z&([2|Vv.{9%TL둒?Л/'j_#Ede _pˮ#!LYj D|qF?|p$d~^/0 ^F'[Z2ȡB]nl$Yt!7O,Fuh74>WWmlK$h\臙7 & 5QZk@ EhDEhDEhDEhDF+F+EhDEhD? V@ @ Fv/7? !  \=' #$  Z:YZ$B  s(   Ib R&@W>+"  83 .   Q'(3*B/ G# N(dI[;J3/^q|w@0@%zvgK?1xrcYPB% lE<_4+7654'&#"327654'&#"& $$)    #")h     #k!    S %+*P  *  *,t  $ X ! "+"   $[ M)_< 7 %.b2 . 9G 0<>#F 48  # P?C) IQ  @2)DR    K[n_@%oo@p!\P:# gXkT`LL:XFv/7?/////.........10IhXoIha@RX87o8Y2#"'&54764'&#"3276267676767676767676%2#"'&54764'&#"3276]4,-4b^6018'IR%FO(    &P&D   !0@ J  ^5--4b_6008 'J; &IJ( NDbhFRLCcfISO7C?M;IN>g  " J3k' ?5 %5L ;p#{=('OEchDPKCbfITO9E>wO8EN>#ETlf@(mm@n%h[J_X?9'% FBOR06*9Fv/7?#P :L&&&9 N/ .!+=:fz-K-#2/ $6 .&'&\6eE-&+  #(*>>,:!" h$,%  fP4=$)`F+('%,&87G2EY+#  :@@ Fv/7///..10IhIha@RX878Y2#"54654'.546D+  0)(!.+  5  3(!>@""@# Fv/7///....10Ih"Iha@RX87"8Y2#&'&5476 4 !> KIZ( +)d75&542632327&'&5476! 9c " &  %  ) P2 Q811 " 0$1 4/   5* )Oe@'PP@QC?=8IA3 "L05F,*(&AFv/7/#  & (# S{?@K9 $KX('f$- i.o@,@76AtFNZ1-  ?&5)*#%:  &)?30**GA   ;6SCDX+;D<\j:"    ^.7=p^:0+') $   $    A05" *   $ %"TIB##0JY/*=$  '!qeW[@"XX@YQP>=5,TF@. 1(8M$(Fv/7?/^LM]A6$B-WF (S`9 /  2),( "!4DF"+7`.#***D*"[:f # K<"" 4]P=3D]P@^^@_7ZJVE=;97+ Fv/7?/...............10Ih^Iha@RX87^8Y%"#"/67654'&#"#"'&'4767676767632'4'.#"3276 1&'&<(G&.BxNN{, (( 7/1 _")   B<  ' mn 2kk  @C..!A   "J[b@&\\@]PB53-+ T=-+:1F J#1Fv/7?////..............10Ih1\Iha@RX87\8Y2&'&#"3267632#"'&'&'&'2&5&543233327654'&#"#"7&54767676)%a. $O"x &OHRKIY?   GVmKPFCae\$ P  Gw- vW8B$!5 H 15?Dj_=:K 5(+ft[&:FN@GG@H>81)A;/DFv/7?//.........10IhGIha@RX87G8Y#"'&'&'&'&'&547632#"7&'&54'&'&#"327>76324&#"326[mV%2;-K,   MZGHW  +$G  - FesDbc|z_dY 0  \F=x")?7# :/xazsb`}E]e@'^^@_[MCTQOKJG6*$  <W(TFv/7??///...................10IhT^Iha@RX87^8Y232654&547457'632&54767676'67654&'&#"'&/&#""&'654&5467326.3))/$*  :/SP ZG H)+$%"3   :!! " T9.!3 El  / *,=V[- I9(  3(: 1  m E "c');MX@!NN@O6F<2$ *J@. Fv/7?///.........10Ih NIha@RX87N8Y%#"'&54767654'&5&547632327654'&#"4'&#"3276c?;P/3tZg" 3"$XNXZHT%2,?7BE1783F,*-FA`# 1oKF^]?COEB ;DnC.+(*S:3,4T-  8=?(#!%BC*&,-P\836g[=837 R(>Mc@'NN@O30*?.,'HO@??@@5-=8)$1 :1Fv/7?///.......10Ih1?Iha@RX87?8Y2#"&5476767654'.#"#"'&54762#"&54nMY)CL&A@N WPL>H0-]P>74767654'&#"#3276763236#"&'&'&544#"327676։_g1 $ S55#R.E  .!  FIs&.)-   ;s'"/kN  X\Xl-MM84[62.NTYT # 0,7-6>n*: !?72uNP   %N%:N\ +%'la20POGPc]UXOe^@#ff@gb[`P.$ N>,)&.Fv/7?<76767>767676324'&'&'&'.'3276XU  ?!0 2*; 6W_ (  1_  E  Ek2%2  /'=C . D $(L=>9:+*3 '@76{'(/ -= ##/  J;S^@$TT@UF<61)(" L@+-Fv/7?)(6&"|%:M@;;@<+'+ 700 7Fv/7??//.......10Ih7;Iha@RX87;8Y2326323&#&5&'&#"3276767675#"'.'&5476X;' %   8NEDN:7=vK'4>-YP#)X`% Q/Zrdiy)3?0K IXfjr} %>Q@??@@9 5&0  Fv/7??5'.'#.'2327676324'&'&'&'&#"327676&-21- 8l50'RMT/LAF&!RB:&#I2\5,m^rP B@% "54&54654&'56N%$/  >L#   (:  .T( $L=   /!/K) F4/-, c')9  .)%   #r +837654&54654&'56D( < ( ,T * 4F0 H#$ ,#p*+GH=  DQ@EE@F4*' C9" 0<6Fv/7??/7>32"#"&#"324&54654'&'&/6s$1 'h8L% L$O% H>O    XB4xy?N#) !D7*$K-(.!!>9# 0}@3@L~|`USJH.-&$|tpmg^]XQL:8-," onONpFv/7?7&'563232#"#''023+&547232654'.'5&#"!'6764&'&'0/2332726 .   /+=&% + #*  A 1)%  [`! d  M^ 438 N876  %  "    FHF7*  j#)+< 4%H Be@(CC@D@/.,+! $5<. @Fv/7???/764'&'#"'&'&5&'&'&'#"'67326764'&'&'&/6C /0  I?4{0  +T 1 !;  !   &.  \]  ,  0%&N98C,-!)   (")2M56[@* (,Wjj{P /" !Yw Z! ma@%nn@o geYWS= j`UQIFC$ '+UFv/7?765'.'#"/076(# ',%/  ] !*`O3& 0Z  *@XX? * )Z66%&/OX$GGV$1 !10e.l :+b,("J%&f'  +B'  (%J@&&@'   Fv/7?/<//.10Ih &Iha@RX87&8Y2#"'&54764'&#"326;67676UYPR][PT^?L}B5?K)%5({ottr~bi}fj~3-a0F[@"GG@HE(&$"?) 19-/)Fv/7??//...............10Ih)GIha@RX87G8Y#"&#""'67326765'.'#"'"#'676763 4'&'&'&#"32C?jL( RR **:ns5 D D8++$+  \>h;8 ;*1S&*-!'  ,(/ #C12G -0c[@"dd@e\1/XT8-+#B'O<Fv/7////...........10IhdIha@RX87d8Y#"'&'&'&#"'&54763232767&5432'>767654'&#"3267654'&'676'85@ GqNQDQUK-(/ +%  0>|"'  D '4. U5 -F8 bffyoz`!'/(1/%- J T>9^x L4#  %"?% -)fe@(gg@h75e^ZWM:87( "1R@??@@;%(4 ,=,;Fv/7??///.......10Ih;?Iha@RX87?8Y327654'&'&'526320#"'&'&'&54'&'&1'632/$  %  .#"<( +9WAR2[  "Ŭ&8,   $sIa5&c # VP@WW@X3 T53/* CFF1 TFv/7???76?67654'&/6320#"'&'&'&'4'&'&'>& "[!  \ # O  "$$iT1 $ ,(N )M ^  &!6#  3.9/   zi,,6 /%<22fM0#  `@&@$GECAqlhg$VghVRQ4j"gFv/7??54'&/2723232!'67654'&'&'&'&'5&#"2#"#"'&5475676767654'&'&'&'&'&'>60i  t #EE"<- I T6/%* 1"$&   **" +   ,^K' $  H)cA7  "  )*1"'  # 6h   ,Ob@&PP@QN83 @/344NFv/7??/................10IhNPIha@RX87P8Y230;327654'5!&#"'676767654'&'&'&'&'&'&54 $1 c/" L><* X"=) ".&&2'G  ' +    odR9%K^%  &]@*",> DCV$ Xt@/@G}SO?=;9,nlDA9752vG*WI WFv/7?76767676'676'676505676'67654'.'&#"#"&&54654&5476R %[VXZ@ C..#*55 : Y,: 97<4["#F  & & Sh$Y   $G//  '   $E < 8%# -  <<6 !)T" "  *08+*  :<R)J@**@+"!$ (  Fv/7///<<........10Ih *Iha@RX87*8Y2651#"'&'7654'&54K / 0&+ Rl#$x6"#"gSdR)?@**@+)(Fv/7/<=x, %FE=2#]8A@99@: +*) )+Fv/7/320&#"&54T"!5/J; xO9%  "9@@Fv/7//<...10IhIha@RX878Y2727&'&'&'"5 !    )1      $  fODZ\@$[[@\Q=AE)2O I%5%)Fv/7???/)[g#IZ3'(   NAz0+8B*J 768 O3+Oy- (3 %* &*I D "D2F;,8&?6"73%K 757O^@$PP@Q1043,&8)#HDL 3Fv/7?////<...........10Ih3PIha@RX87P8Y232632#"'&'&#"#"'5&'&54654&54654'&'#"=276327654'&#"8+]$q@9=E)" (   'I +(Y6,.7ab4*'?:) 'XOuVa   "6"!cS1% S>   _OagIU]KN1P@22@3 " .((.Fv/7??/.......10Ih.2Iha@RX8728Y2#"54654'&#"327>7#"'&'&5476 S7>C!0)(`92.6_?#6.+4'KN+&EJN).PF%4#SJdeO]a 2/+  RH[V]81AU@BB@C >6:0.* 2"%%Fv/7??//...........10IhBIha@RX87B8Y2#"&#"#"'&'&547632327>54'&'056327654'&#", 6H 'F- g7@mm 56,A85FwN27U   )#-8(/ )("#QHK{W\>(1#pIR@JJ@K<6/& /++I0"5&  - //  T1m#UBM! 1 +N &!m6U1-L1I8Y]:2"(BD$%E^ Sd@'TT@U$KG<75  /D@C9N9K dc@'ee@f.ca[URMKH85.$X @O1RFv/7????//................10IhReIha@RX87e8Y23276767654&1432#"'&54654'&'&'&#"51#"/>54&54654&'.5416G9  &=:^ #90!#J7&5:) %+ 2?0E+ 0  ; Nh '4 + ) $1]"%''+ 3*+U  '5;Y((oK  +H@,,@- % ('Fv/7??</<......10Ih,Iha@RX87,8Y#"/67654&=4654'.'.76;2H4>2+ %  1# A--$$*8"0 3 S3 0 Gkf@'ll@mifD( dbUP@941"L\S7 UFv/7?54'&#"#"'6767>54'&'&541632326=&k&3?O5   5"1B- 6\E4 ",!-B- #q0  3"1B- *8]E4 1?"<_L -% #zzFd#2l40   H6c.$8j%& J'  *^7NZ@!OO@PLI#G972(' .@57Fv/7??</................10Ih7OIha@RX87O8Y2&3#"'6767654'.#"#"'0546767654'.'4'632326FB1:  &A. Z.!"% 7!-B- !#!?Z7;,JHv  &a7(/   ;7zW.'  -n#  (F%D@&&@'" Fv/7??//.10Ih&Iha@RX87&8Y2#"'&'&'&5476327654'&#"n;5BGt;5@1AGJ/7ag:2/7ce:2F-2VewU]%'Y^RYgLYZMnhHSWK7BM5E`@&FF@G3>.+$!6': B0 Fv/7????/<...........10IhFIha@RX87F8Y2#"&#"#"'&'67654&54654&54'&'541632326327654'&#"Nu@: q@OEHJ'4 2,ET'1\g;219ea1'MNIz)r#5:DF20 4Es$#0  +eGY[MmiHQ]J8;NEYg@)ZZ@[!J64.,%#! FBN R<(BFv/7???/    L < d91:A;+4eb2*,5a GN  !!&&E  +L `Tm~NWlK[VFjhK[%=0=@R@AA@B=<?81/)$ -/Fv/7??/.............10Ih/AIha@RX87A8Y2#"&54654'&'&'67626#"'0546767654'&'#0'6A7]* #2&.  2&6-9  ",=U7@ /   !'Bt'$ -!m, LMW@!NN@O8+ @3H<%/%3Fv/7???/.........10Ih3NIha@RX87N8Y2.'.#"#"'&'&#"&'&547>7327654'&'&'&547676mD P#6)- QGHO G99 %  / .Q<.7aQQR50@L"4( #54 A> ' )2P& 8A!c>.*CR@DD@E&76":1.& ** :Fv/7?767#"'&54654'.'#.'676767672h ,   [*!+5  &]U# + !F  67I)$&PP/84'Z7#60*X5E\@#FF@G*1('D>;*'&! 77.DFv/7?Z$RV = $46Zt   @/pJ&G6AL@BB@C?/. 11?Fv/7?767673567654'&'563232654&54 \;,  E ,5-/D+S)  !">F/A K8;6/ '/$D 3 8,'  3 R - *a ' % G )-S=. #  =H$ # 8MOLR@MM@N#9KA7#>337Fv/7?I3=> r<>ZII56?&1;DX@ EE@F"A@<(C8" -+$-Fv/7? G+C{LR  L* ; (M4>")6WG@ 1%L (>K8:6I@77@830+%" +Fv/7//............10Ih+7Iha@RX8778Y&'&54654'&'&5467654&5476i. #':YL'E ,NZ G/ = +WZ F@!!@"  Fv/7??</<<....10Ih!Iha@RX87!8Y""#"=454654&546    1E+,V%B!!'& , B/B@00@1 /& Fv/7///......10Ih0Iha@RX8708Y&320'&767654/&'&76'1      A=d. 1Ub  *ue:&"-:gt-5=U@>>@?";0"& &Fv/7//.............10Ih>Iha@RX87>8Y6&67632327670'276327#"'&'&'&'&#"#"&")-E.>B!3='+# 6 2F-.K6 6 (  a A! .E$/  8G#L_@$MM@N. DB@<9,6" 1((,Fv/7?//...............10Ih,MIha@RX87M8Y2#"&#"#"'&54323267654&54654.5476'>7676&.(5(:$ " 0+73)9'2; L/(#%-KD)   '&)1+(H1,m&%@-,, f7ou@-pp@qmbNJHF><:5* TQPJH<:8XFv/7//..................................10IhpIha@RX87p8Y6&6323270#276327#"'&'&'&'&#"#"&6&6323270#27633#"'&'&'"'&#"#"&)LO G'!+."  "  )LO G'!+."  "  O 3 +   P 3 *  al S@@    Fv/7/o`P.$ Nf,)&.Fv/7?<76767>767676324'&'&'&'.'32762"'.#*#'476767676XU  ?!0 2*; 6W_ (  1_  E  Ek2%2x  6  E       /'=C . D $(L=>9:+*3 '@76{'(/ .<##.  J[H U   XOe{f@'||@}rb[>ti`P.$ Nz,)&.Fv/7?<76767>767676324'&'&'&'.'3276'&'676763XU  ?!0 2*; 6W_ (  1_  E  Ek2%2#/7 )$  /'=C . D $(L=>9:+*3 '@76{'(/ .<##.  Ju %!r{@4@F'vkcZVRD3%"/p\^XN7mX? ZFv/7?????//7654&54654&'56/7 )$( < ( ,T * 4F0  %! H#$ ,#p*+GH= /-Pb@%QQ@RGE@=:7G7,+(%".Fv/7??7654&54654&'5672"'.#*#'&76767676D( < ( ,T * 4F0e  7 F       H#$ ,#p*+GH= H U   /-CX@ DD@E:<1,+(%"BFv/7??7654&54654&'567767&'&'&#D( < ( ,T * 4F0 /7 )$ H#$ ,#p*+GH=  %!/-5=`@$>>@?:2<840,+(%"6.Fv/7??Iha@RX87>8Y2#"'6732723>7654&54654&'5672#"54#2#"54D( < ( ,T * 4F0&$&&$& H#$ ,#p*+GH= *%)&*%)&%;P@<<@=24)  : Fv/7?//<//....10Ih ad@'bb@cXVQNKH=XH;%(4 ,?,;Fv/7??///................10Ih;bIha@RX87b8Y327654'&'&'526320#"'&'&'&54'&'&1'63272"'.#*#'&76767676/$  %  .#"<( +9WAR2[m  7 F        "ū'8,   $sIa5&c # H U   >TZ@"UU@VK=MB;%(4 ,S,;Fv/7??///...........10Ih;UIha@RX87U8Y327654'&'&'526320#"'&'&'&54'&'&1'6327'&'676763/$  %  .#"<( +9WAR2[ /8 ($   "ū'8,   $sIa5&c #  %!>TZ@"UU@VK=MB;%(4 ,S,;Fv/7??///...........10Ih;UIha@RX87U8Y327654'&'&'526320#"'&'&'&54'&'&1'6327767&'&'&#/$  %  .#"<( +9WAR2[  07 ($   "ū'8,   $sIa5&c #  %! ="?@##@$    Fv/7/@@Fv/7/(4(*>[@!??@@7- <92+*("0 4 2Fv/7?//<.................10Ih2?Iha@RX87?8Y032632#"&#"&54767654'5&#"#"54323254&546: 0 & ' 0 9  - 6418>   777[ru     *":7 'GL@HH@IBFD,!B3/" &;Fv/7/7632&#"7- " "(F *+5  e [  )Ib-^  #+1F\A5=+*3#53    /  "/0!}@4@Km]\S@~|zxpKB8)#! _G;g5NVN_Fv/7?32#"'.#"#"'&'&'#&543676763232654'&'&'&'6545&5>476327654'&#"Q:C6 ' <-1 ,>G )*. E;37A0)$ DH/2gNOZ&>$%+   *G" "+<PD?"!#%$S!'-M6 ,  "%91 / 3()96*:  ""(+FOl* H     )9 62b! !d&l\@#mm@n,'b[VNKA"9 /DRVFv/7??732654'&'&'&'&5476767254&#"#"'&547>54'.'&'>767676769H=D)7D2jW3 ,   23W&;>  B!9+,7!& 2  ?&*0E&/  &0 9EWg 2$#1 ]H11*(*  %2 13 >,+;' +{"     ,4<g@(==@>/91 ;73/($  5-;Fv/7?/7632632?6?326360;32767654'&#"%$H B   + :!  '    *  -; &  L@L!    ! #CDJ.     N! vHJ<:(N   ,    +T   q    GNR9   2*  1@X2_hc@&ii@j #SMF=5/-+' FBaedBSFv/7???2+   U $$$    !#Z   $5)Z ' # A--$$*8"0 3 S3 ![1 '   %!   "L@>@bF@2*" |rjge^XNJ>. tzwVT:|Fv/7???76767>76767632654'&'0'05&'6323262#"'676767654&54o *0um(!$[  (   7$ $+5 t: % "T7  i ' \jS (Z $|V %$4  bo/!#9<'00@4 5TL*  O n ,8 -q    / 9 D $(L=>::0*8 #\% '  E<'  ; / ,Z)\ @WĽ|{gfVTB<;75.-ƶvsqi^]OMK@>;:87+)'"GKFv/7??/................................................ ................................... .....10IhKIha@RX@878Y20716434##"'0#"'64#"#"'&547&5767673267676#3003327>3236?3275267654'&'&'4'4654&'.'#5&'&'&'5&#"&'0#"&'&#"23#"'&'&'&'&'&'&/&547675676>32&'4&'#5&/326367`"      $Ngvs 7s: ! 0 (   >^%%D+.      ,.@;(   !( %    8 1 / _ *  4)<   7A]   *)   '{#B6!E Iq  " g]&  .   3NRQ+      :!2>+.   38)4<  $(   2 " %GV@ HH@I?=852/?/"& Fv/7??///.........10IhHIha@RX87H8Y2#"'&'&'&5476327654'&#"2&#.#"''4767>76n;5BGt;5@1AGJ/7ag:2/7ce:2  6  E      &F-2VewU]%'Y^RYgLYZMnhHSWKI V   3 o3@~}=<0%$ }mjigfdc`TRKH<:8632)&% $?=vXfd[PN^Fvi/7?<.A.G.L.M.N.O.P.Q.R.X.Y.\.].`.i.k.l......................................... ........$.'.,.-./.<.@.A.C.E.L.M.P.Q.T.W.X.[.10qmIhipIha@RXp@8p7p8Y21#4323233275>7547053054676767654&5473254'6763232632"7#"'7&#"1#'#"#"4#""4#"32676326323#2'"'73#"&+#'#0&#""#"'&5#""#"'6'#&7>767654&'&1"&#"#"/#"#"'73#677&'632326323273"254/&'&'054#24'233254&54717'533767375>54&'&'&'&545676D  "      "  L 7 C,  # )   8    C I *!  4$## . ! C       "6    )  "   0  ! *    +      %    @) !    )#$   / $    M   S+0@Lڲ|zL ⦥pob_ON2/(%f JEEfFv/7?////&/)>D0L>   *  !%FN  +" 46 !+    +2KGD$$ 5   *    5qNB      '! .      H  ;[X    2 Uz C'3   !I &%J| \H! 3 ,2?T 2 Q\A@@Fv/7/3UM37Fv/7?I3=> r<>ZII56?&1)&)&)&)&d0Ncv@.dd@e[ZVSROFC?=85,*(&bXLIA30" _bFv/7?<S8(c /JTR% .  +5M@66@7'32%$!1'+1Fv/7?//...........10Ih16Iha@RX8768Y5467654'&'"54326;#"'&'&'7>{ 6"'*" /& O(+O<Gd QGE+>D Tp^b   &  |9@@  Fv/7//....10IhIha@RX878Y2032#"&5476.4  ;|[[~u7|  =S\[|=D1 g@+@     Fv/7?7&562"'5"54!263&546#"5476 B 2"O. H   !(    6    | !G 7   6|U%U9   C 2--)  3   =00 4 (% ,.  z+    YQ %)   '   v#" 0UV@ @  Fv/7/76'33253X 1>@?04- <70)$9Fv/7??/...........10Ih>Iha@RX87>8Y"'&54767676767632327654'.547632"&5432nMY)CL&A@N WPL>H0-2]P>74:8530-,&#" Fv/7//...................................10IhIIha@RX87I8Y"57&5436545&5&'&'&56547632'0##05&#"0#"7G)-      ,  *)#0&$ fkDZlyl@,zz@{wqdQ=umjaAE)2O I%5[%)Fv/7???//)[g#IZ3'(   NAz0+8B*J 768 & 0'3/!$D#&O3+Oy- (3 %* &*I D "D2F;,8&?6"73%K 7  0 #.QA(X0E[d@'\\@]*R1('TID>;*'&! 7Z7.DFv/7?Z$RV = $46Zt   @/pJ& &!^ Ntr@-uu@vrld\ZXVLI#`ZXOG972(' .@Q57Fv/7??%     0%;L@<<@=24)": Fv/7??///....10Ih,A85Fw &$&&$%N27U   )#-8(/ )("#QHK{W\>(1#p^)%(&)%(& ,B_@$CC@D09 ;0($  A Fv/7?///...............10Ih CIha@RX87C8Y2#"542'#2/67654'&'7676#&'676763M < 6 "4 2 07 ($ 'C!;: 4  #'%0w %"^QB@@    Fv/7/ ,k Q8@@@Fv/7/;*'&! 7NF7.DFv/7?Z$RV = $46Zt   @/pJ&)%(&)%(&7 @K@GözxqbXU>:)&$" Ž}|kh_JGCB*) uMon0[_Fv/7?//<<54&54767621326;327654'5&'.#'""&'&#"G-+ ) C      0.- "H2:' 'bJ\((   .*(-$ ( /:   #-*; *@G#  "%   M *!     .  (64p]-f '0Z)6 ) (   'I  #*#,  J16 K=  4& 4fDZq@/@~xpbQ=lfd[AE)2O I%5]h%)Fv/7????//)[g#IZ3'(   NAz0+8B*J 768 B: "4 -#O3+Oy- (3 %* &*I D "D2F;,8&?6"73%K 79=%     %JY@"KK@LHB;-71/&"(3 Fv/7???///.........10IhKIha@RX87K8Y2#"'&'&'&5476327654'&#"632327056327#"&'&#"7"&n;5BGt;5@1AGJ/7ag:2/7ce:2#B; #4 -.$F-2VewU]%'Y^RYgLYZMnhHSWKX=%     f;DZpd@(qq@rgQ=i^AE)2O I%5o%)Fv/7???//)[g#IZ3'(   NAz0+8B*J 768 /7 )$O3+Oy- (3 %* &*I D "D2F;,8&?6"73%K 7 %!M; 6@ @   Fv/7///10Ih Iha@RX87 8Y2#"&546&%%&;%%%$'|%c`@$dd@e^ZJB9^@?  N/R3 </Fv/7?////.................10Ih/dIha@RX87d8Y#"'&54654&54323276'&'&'&'&'.'&547632326323&#&5&'&#"3276767675v l+5 50( (!YP#)X`;' %   8NEDN:7==9L  *#(  B (  JWfjr} Q/Zrdiy)3?0KA?my@1@ {ywugeYWS= ywnj`UQIFC$ 'p+UFv/7?765'.'#"/0767632327016327#"&'&#"7"&(# ',%/  ] !*`O3& 0Z  *@XX? * )Z6AB: #5 ,.$6%&/OX$GGV$1 !10e.l :+b,("J%&f'  +B'  k>%     fDZ}n@-~~@trmjgdQ=tdAE)2O I%5[%)Fv/7???//)[g#IZ3'(   NAz0+8B*J 768  6 F    O3+Oy- (3 %* &*I D "D2F;,8&?6"73%K 7{H U   &L@''@(% "%Fv/7//<<.......10Ih%'Iha@RX87'8Y2;276324'&546'&'&#"&54H /  O0(J>" 8F E:3 &UBx + +K@,,@-(%" Fv/7??............10Ih,Iha@RX87,8Y"&5432&'&54654&5476767N":"1    (<'=q 2E+,P/ 0!!&' ,  XOe{f@'||@}rb[>ti`P.$ Nz,)&.Fv/7?<76767>767676324'&'&'&'.'3276767&'&'&#XU  ?!0 2*; 6W_ (  1_  E  Ek2%2 /8 ($   /'=C . D $(L=>9:+*3 '@76{'(/ .<##.  Ju %!al S@@    Fv/7/%     (o@:@xpZUSE?1)! ~xurZQMI=-`\dd|m\O9`Fv/7??????/</..........................10Ih`Iha@RX878Y4'&#"326;676762'&'.'&#"3276765432#"'&'&#"#"'67326767#"'&547632323262#"'676767654&54v'/SN)!'/W  !' %Y  (   7# $/9& 8|`824:f )%TkR (Y %i}fj~3-a#9<'00@4 5UL*  O n ,8 -q  0?tr~  E<'  ; / ,.NQca@&dd@eaUTN8*)&]R-"D HH>2DFv/7????/...............10IhDdIha@RX87d8Y327654'&#"%232673#"'&'&#"#"'&'&5476323276;276767654'&#"#6;!89!2(, 4'>-,1&: $S" %(E>" -%&#% (CgLYZMnhHSWK27U   )#e`0 )("" *#!<!H'Y^RY-2>(1#pXOev@/@{sqomb[>wqof`P.$ Nh,)&.Fv/7?<76767>767676324'&'&'&'.'3276632327"16327#"'&'&#"7"&XU  ?!0 2*; 6W_ (  1_  E  Ek2%2B: "4 -#  /'=C . D $(L=>9:+*3 '@76{'(/ .<##.  J>%     +b@@cc@d `\VU<:8&$a`_^XIHD@=<987631/.*(  SMP,MFv/7/<7354&5465'3063023365'654'6326]'7-     !/))#/(#  @G@AA@B85#/& /Fv/7??<.........10Ih/AIha@RX87A8Y27#"&#"#"&#&'&'&54767632326767676.4,* > %'S^%+ @( 1JD!O  b37)**A r}[B!*  $+d@Iee@fObXW<:9865&$cba`ZKJFDBA@=<9876531/.*(  UOR^, Fv/7?<7&#4#"&5476725&'6317'#2'2#"&54'#&54767256[  /(3%9   ' /"9 '   !3H&&.('&  !"-*&2F !7@""@#Fv/7??..10Ih"Iha@RX87"8Y1.5476767676767676  ?3" *5 /%& ͣ  vb" c['a@%((@) "% Fv/7/8-:77:-8>Y]960833IjjIGjj,OW_r@.``@a\T^ZVRN83 @/34XP4NFv/7??/</......................10IhN`Iha@RX87`8Y230;327654'5!&#"'676767654'&'&'&'&'&'&54%2#"54#2#"54 $1 c/" L><* X"=) ".&&2'G&$%&$%  ' +    odR9%K^%  &]@*",> DCV$ *%)&*%)&f;DZpd@(qq@rgQ=i^AE)2O I%5o%)Fv/7???//)[g#IZ3'(   NAz0+8B*J 768 ` /8 )$O3+Oy- (3 %* &*I D "D2F;,8&?6"73%K 7 %!0%;L@<<@=24)": Fv/7??///....10Ih(4(*fDZbjl@,kk@lg_Q=iea]AE)2O I%5c[%)Fv/7???/</)[g#IZ3'(   NAz0+8B*J 768 1&$&&$%O3+Oy- (3 %* &*I D "D2F;,8&?6"73%K 7|)&)&)&)&%-5T@66@72*40,(".& Fv/7??/<//.......10Ih6Iha@RX8768Y2#"'&'&'&5476327654'&#"2#"54#2#"54n;5BGt;5@1AGJ/7ag:2/7ce:27&$%&$%F-2VewU]%'Y^RYgLYZMnhHSWK)&)&)&)&S T@ @   Fv/7/ %'S^%+ @( 1JD!O  b37)**A r}[B!*  $Xl@@@Fv/7///<<.10IhIha@RX878Y757'5XiilXQQX{\7(@@@  Fv/7/<C<(8(4($!/!4'2'Gu@.HH@I'@>:9521*) F71'#! # D%Fv/7?1FM9%* )<Oj@+PP@Q0HF42J@:0&  =*JFv/7??*9 $3 b@'@     Fv/7?1FM9%*E&q@0''@(    ##Fv/7?///<<</////<<...10Ih'Iha@RX87'8Y33254'&+53254#"#47632#"'&DQ`%-RPL=&RAL;L',T,(=RG/ 3C8P8$.>1FM9%*CU@@ Fv/7/@@Fv/7/tplh`P.$ Nnf,)&.Fv/7?<76767>767676324'&'&'&'.'32762#"54#2#"54XU  ?!0 2*; 6W_ (  1_  E  Ek2%2&$%&$%  /'=C . D $(L=>9:+*3 '@76{'(/ .<##.  JC*%)&*%)&XOewn@+@|ob[>xul`P.$ Nf,)&.Fv/7?<76767>767676324'&'&'&'.'32762#"'&'&546327654#"XU  ?!0 2*; 6W_ (  1_  E  Ek2%2& 0'3/!$D#&  /'=C . D $(L=>9:+*3 '@76{'(/ .<##.  J   0 #.QB(NQ_@$RR@SJF0LJ52. =&9*A*&Fv/7?///...............10Ih&RIha@RX87R8Y#"'&54654&54323274'&'&'&'&547632#"54654'&#"327>7 '" & #&* 5N+&EJ~S7>C!0)(`92.6_?#6.+3   0 RH[V]).PF%4#SJdeO]a 2/+ ;1CYW@ ZZ@[PA54RG="2.(X(.Fv/7??//............10Ih.ZIha@RX87Z8Y232767673#"'&'&5476;276767654'&#"#&'676763YFN .\'(4$`5:" )#-)Cg19"IMNB .B!>,A85Fw /7 )$N27U   )#-8(/ )("#QHK{W\>(1#pt %!;1CYW@ ZZ@[PA54RG="2.(X(.Fv/7??//............10Ih.ZIha@RX87Z8Y232767673#"'&'&5476;276767654'&#"367&'&'&#YFN .\'(4$`5:" )#-)Cg19"IMNB .B!>,A85Fw\ /8 )$N27U   )#-8(/ )("#QHK{W\>(1#pt %!1Cfa@%gg@h^\USPMA54^M="2.(D(.Fv/7??//.................10Ih.gIha@RX87g8Y232767673#"'&'&5476;276767654'&#"2&#.#"##'4767>76YFN .\'(4$`5:" )#-)Cg19"IMNB .B!>,A85Fw  6  E     &N27U   )#-8(/ )("#QHK{W\>(1#pZI V   2X0E[d@'\\@]*R1('TID>;*'&! 7Z7.DFv/7?Z$RV = $46Zt   @/pJ& &!XEhn@,ii@j*_]XURO1('_OD>;*'&! 7F7.DFv/7?Z$RV = $46Zt   @/pJ&H V   ||||H ( d  v <\8Jd JxL !#|%&T'N(^*+V,.2/ 0 234467D8p9;t<=?(AC.DzFGNHHIJ@JL6MtNTOfP~QS>TUlVHWXZ[R\]0^_`acd eg hNifjLjklnop<pq\r8rrst6uv,x&y{}~HjxBFH t <>>hX~~~~~~&V"~(V@Ȗ˖˖NN&...:ֲښXX$~߼<>$&b>pbhjl~^ RdPP4  >  z 0 z4^$?q<Um '}3LgX~ ?S"QL u=]vH.U1a8 *LPe>r2T@qo~[n],a| MXM,+quup]]] _MyM MKM-9!bku2 v9gn9H_,D99999>m9c[2q999+,+Q*qr2M9Mq9%299M9u,a2u?,82'M-2MXqMI2M+B++B-,#,V,:cB+BIM+B-MM^H'H'uuqq9{   !"#$%&'()*+,-./012345689:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~7DEL$$  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`åĪڽ׋۾܅؂ƭabcdeЮfgihjlkmnpoqrtsuvwyxz|{~}$L@ ~Sax     " & 0 : D!"!&"""""""+"H"`"e"% R`x     & 0 9 D!"!&"""""""+"H"`"d"%L  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgihjlkmnpoqrtsuvwyxz|{~}6 N4:7#$-dCuEcFWG_IDOPQYSyTUZz$M 1 < N  ;  $ - E F G I Q U x y w i ; *     " #m & * - 2 4 F W Xq Yy [w _    $_ % 3 7 8l 9 :n ;r  41"#&24789;XY  { s {}02r9y#b$&s*s-32s4s8:;\%D'K(J)J+J,J.J/K0J1K3J5K7J859?:.;)D$789":; " w"%"""Z""j"$/"-V"8o"9":Q";^# z###i###$?#8#9#:w#;$$J$ $ g$R$\$5${$$$v$K$$$w$}$"`$#[$&e$*{$-|$2f$4m$7)$8$9$;"$F$G$S$V$W$X;$YV$[A$$$$$b% %%$%8w%9%;&&1&$' h'''''$^'%'''('.'3'5'7'8V'9y':s';_''(\(9))))P);)R)$$)-Q)C)G)Q**4+++?+_+#+-+F,,,?,`,,#,-,F,X-- p--$}-'e-(b-)_-+d-,d-.c-/c-0d-1b-3c-5`-7a-Dm-Ji-Mg-Nf-r-]-x.b. ..u.@...c.z."j.#e.&.*.-.2.F.Q.W.X>.Y[.[;// //,/W/"j/7/8/9E/;/X/Y/[/////\000:0^00"0#0-0F0X0Y0[1w1 a11D_1J^1c1i2 i22222$`2%232728~292:t2;223 333U33`3$)3-%383:3C3G3Q303.4 j444$n4%41434748l494:r4;x4[`5 5^5#5;55758F59d5;R5556)6$77 q7777$7%]7'h7(c7)`7+e7,e7.d7/d70e71c73d75a77c7?^7Dp7Jk7Mi7Nh7r7]7z8}8,88#8 88B8&888#8$8-88C|8E8F}8G8I\8Q8S8T8U8W8Z~8[8\9f9 9F99>99w9=9$999"9#{9$9&9*9->929Cn9E{9Fr9Gz9H9IR9O9P9Q|9R9S9T9U~9W9X9Y9Zi9[9\:m: :::C::s::"s:#:&:2:XK:Yi:[D;7; ;H;D;C;*;u;<;;;;;"|;#E;$9;&;*;-;2;C$;E!;F";G;H;I8;K;O`;P];Q";Rd;S-;Th;UF;Wk;X^;Yj;Z7;[h;\O<F<5<X<Y<[?<CBC LC3CYCwC"CXyCYC[hCrCICmCODD D DDDEEEEFVG GG%GGH3HAH "HsHGHkHGHH/HHoHH#~HCUHEMHFPHGJHHHIRHOHPHQLHRHS[HTHUgHWHXHY}HZXH[pH\xH#H%I.IkIXIYI'I$JFJ cJ@JJ[JJcJJgKaL4MM_MaMAMMNhOOuOOPUP P`P[PPQQQQ3QQR RRSS9S[mT nT>TiT9TTTLTE TF%TGTQ!TS&U V VYVVVWZWWX mX]XTXMXXXdY tYYzYVYYYlYZnZO[ w[F[K[I[[]\8\T\VssX/`$,&,*)-M2-4063FH'IO3P9R=I9UV >#$-4FIVVt,0$,&,*,-2-4263FGH*IO3P;R>J65S?$-EFGIwQU|)xc;U$r-CGQU                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       2Alts@ w_<JJ>o  p@ 3camlspotter-camlimages-e471b3c4470d/test/test.ml0000644000000000000000000001426512405272062017672 0ustar 00000000000000(***********************************************************************) (* *) (* CamlImages *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: test.ml,v 1.32.2.1 2010/05/13 13:14:47 furuse Exp $ *) open Images;; open Format;; let capabilities () = let supported b = if b then "supported" else "not supported" in printf "*******************************************************@."; printf "Camlimages library capabilities currently available@."; printf "bmp\t: %s@." (supported Camlimages.lib_bmp); printf "ppm\t: %s@." (supported Camlimages.lib_ppm); printf "gif\t: %s@." (supported Camlimages.lib_gif); printf "jpeg\t: %s@." (supported Camlimages.lib_jpeg); printf "tiff\t: %s@." (supported Camlimages.lib_tiff); printf "png\t: %s@." (supported Camlimages.lib_png); printf "xpm\t: %s@." (supported Camlimages.lib_xpm); printf "xv thumbnails\t: %s@." (supported Camlimages.lib_xvthumb); printf "postscript\t: %s@." (supported Camlimages.lib_ps); printf "freetype\t: %s@." (supported Camlimages.lib_freetype); printf "*******************************************************@.";; let show_image img x y = let img = match img with | Rgba32 img -> Rgb24 (Rgb24.of_rgba32 img) | _ -> img in let gr_img = Graphics.make_image (Graphic_image.array_of_image img) in Graphics.draw_image gr_img x y;; module FtDraw = Fttext.Make(Rgb24);; let draw_string = if Camlimages.lib_freetype then begin (* Freetype library initialization *) let library = Freetype.init () in let src_dir = (try Sys.getenv "srcdir" with Not_found -> ".") in let src_file = Filename.concat src_dir "micap.ttf" in let face, _face_info = Freetype.new_face library src_file 0 in Freetype.set_char_size face 18.0 18.0 72 72; fun str x y -> let str = Fttext.unicode_of_latin str in let x1,y1,x2,y2 = Fttext.size face str in let w = truncate (x2 -. x1) + 2 and h = truncate (y2 -. y1) + 2 in let tmpbitmap = Rgb24.create w h in for x = 0 to w - 1 do for y = 0 to h - 1 do Rgb24.unsafe_set tmpbitmap x y { r = 255; g = 255; b = 255 } done done; FtDraw.draw_text face Fttext.func_darken_only tmpbitmap (- (truncate x1)) (truncate y2) str; show_image (Rgb24 tmpbitmap) x (y - h) end else fun _ _ _ -> ();; let go_on () = prerr_endline "Press return to proceed, s: save a screenshot, q: quit"; let s = input_char stdin in (* save screen shot *) if s = 's' then begin prerr_endline "Saving screenshot"; let gr_img = Graphic_image.get_image 0 0 (Graphics.size_x ()) (Graphics.size_y ()) in Images.save "screen.bmp" (Some Bmp) [] (Rgb24 gr_img); prerr_endline "done" end; s <> 'q';; let images_default = [ "apbm.pbm"; "apgm.pgm"; "appm.ppm"; "pbm.pbm"; "pgm.pgm"; "ppm.ppm"; "jpg.jpg"; "png.png"; "png-alpha.png"; "bmp.bmp"; "tif.tif"; "xpm.xpm"; "eps.eps"; "gif.gif"; "mmm.anim.gif"; ];; let images = let images = ref [] in Arg.parse [] (fun x -> images := x :: !images) "test images"; if !images <> [] then List.rev !images else let src_dir = (try Sys.getenv "srcdir" with Not_found -> ".") in let images_src_dir = Filename.concat src_dir "images" in List.map (fun x -> Filename.concat images_src_dir x) images_default;; open Gif;; let treat_image name = prerr_endline name; try prerr_endline "Analysing header..."; let format, header = Images.file_format name in prerr_endline (Printf.sprintf "%s: %s format, %dx%d" name (extension format) header.header_width header.header_height); match format with | Gif -> prerr_endline ("Loading " ^ name ^ "..."); let sequence = Gif.load name [] in prerr_endline "Loaded"; let w = sequence.screen_width and h = sequence.screen_height in let w' = Graphics.size_x () - w and h' = Graphics.size_y () - h in let x = if w' > 0 then Random.int w' else 0 and y = if h' > 0 then Random.int h' else 0 in draw_string name x y; List.iter (fun frame -> let put_x = x + frame.frame_left and put_y = y + frame.frame_top in show_image (Index8 frame.frame_bitmap) put_x put_y; (* if not (go_on ()) then raise Exit *) ) sequence.frames; begin try Gif.save "out.image" [] sequence; prerr_endline "Saved"; with | _ -> prerr_endline "Save failed" end; if not (go_on ()) then raise Exit | _ -> prerr_endline ("Loading " ^ name ^ "..."); let img = Images.load name [] in prerr_endline "Loaded"; let w, h = Images.size img in let w' = Graphics.size_x () - w and h' = Graphics.size_y () - h in let x = if w' > 0 then Random.int w' else 0 and y = if h' > 0 then Random.int h' else 0 in show_image img x y; draw_string name x y; begin try Images.save "out.image" (Some format) [] img; prerr_endline "Saved"; with | _ -> prerr_endline "Save failed" end; if not (go_on ()) then raise Exit with | Wrong_file_type -> prerr_endline "file format detection failed" | Failure s -> prerr_endline s;; let main () = capabilities (); Graphics.open_graph ""; try List.iter treat_image images with | Exit -> exit 0 | End_of_file -> exit 0 | Sys.Break -> exit 2;; main ();; camlspotter-camlimages-e471b3c4470d/test/test2.ml0000644000000000000000000000620512405272062017747 0ustar 00000000000000(***********************************************************************) (* *) (* CamlImages *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999-2004, *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) (* $Id: test.ml,v 1.32.2.1 2010/05/13 13:14:47 furuse Exp $ *) open Images;; open Format;; let capabilities () = let supported b = if b then "supported" else "not supported" in printf "*******************************************************@."; printf "Camlimages library capabilities currently available@."; printf "bmp\t: %s@." (supported Camlimages.lib_bmp); printf "ppm\t: %s@." (supported Camlimages.lib_ppm); printf "gif\t: %s@." (supported Camlimages.lib_gif); printf "jpeg\t: %s@." (supported Camlimages.lib_jpeg); printf "tiff\t: %s@." (supported Camlimages.lib_tiff); printf "png\t: %s@." (supported Camlimages.lib_png); printf "xpm\t: %s@." (supported Camlimages.lib_xpm); printf "xv thumbnails\t: %s@." (supported Camlimages.lib_xvthumb); printf "postscript\t: %s@." (supported Camlimages.lib_ps); printf "freetype\t: %s@." (supported Camlimages.lib_freetype); printf "*******************************************************@.";; let show_image img x y = let img = match img with | Rgba32 img -> Rgb24 (Rgb24.of_rgba32 img) | _ -> img in let gr_img = Graphics.make_image (Graphic_image.array_of_image img) in Graphics.draw_image gr_img x y;; module FtDraw = Fttext.Make(Rgb24);; let images = [ "apbm.pbm"; "apgm.pgm"; "appm.ppm"; "pbm.pbm"; "pgm.pgm"; "ppm.ppm"; "jpg.jpg"; "png.png"; "png-alpha.png"; "bmp.bmp"; "tif.tif"; "xpm.xpm"; "eps.eps"; "gif.gif"; "mmm.anim.gif"; ];; let treat_image name0 = let name = "images/" ^ name0 in prerr_endline (name ^ "..."); try let format, header = Images.file_format name in prerr_endline (Printf.sprintf "%s: %s format, %dx%d" name (extension format) header.header_width header.header_height); match format with | Gif -> let sequence = Gif.load name [] in Gif.save ("out-" ^ name0) [] sequence | _ -> let img = Images.load name [] in Images.save ("out-" ^ name0) (Some format) [] img; with | Wrong_file_type -> prerr_endline "file format detection failed" | Failure s -> prerr_endline s;; let main () = capabilities (); try List.iter treat_image images with | Exit -> exit 0 | End_of_file -> exit 0 | Sys.Break -> exit 2;; main ();; camlspotter-camlimages-e471b3c4470d/tools/COPY0000644000000000000000000000170212405272062017227 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Franois Pessaux, projet Cristal, INRIA Rocquencourt *) (* Pierre Weis, projet Cristal, INRIA Rocquencourt *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999,2000 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) camlspotter-camlimages-e471b3c4470d/tools/COPY-JPF0000644000000000000000000000145612405272062017652 0ustar 00000000000000(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Jun Furuse, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1999,2000 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* Distributed only by permission. *) (* *) (***********************************************************************) camlspotter-camlimages-e471b3c4470d/tools/putcopy0000644000000000000000000000277712405272062020175 0ustar 00000000000000#!/usr/local/bin/perl # exec in camlimages directory open(IN, "find . -name '*.ml' -o -name '*.mli' -o -name '*.ml.in' -o -name '*.mli.in' -o -name '*.c' | grep -v xvpics | grep -v CVS |"); while(){ chop; $file= $_; open(IN2, "$file"); $_ = ; if ( /\(\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*[\*]+\)/ || /\/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*[\*]+\// ){ # long comment, should be copyright notice print STDERR "Find a copyright in $file"; open(OUT, "> $file.out"); if( $file =~ /freetype|examples|xvthumb|ps|bitmap\.ml|\/o[A-Z]/ ){ print STDERR " (JPF only)\n"; open(COPY, "tools/COPY-JPF"); } else { print STDERR "\n"; open(COPY, "tools/COPY"); } if( $file =~ /\.c$/ ){ while(){ s/[\(\)]/\//g; print OUT $_; } } else { while(){ print OUT $_; } } close COPY; while(){ if ( /\(\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*[\*]+\)/ || /\/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*[\*]+\// ){ last; } } while(){ print OUT $_; } close IN2; close OUT; `mv $file $file.bak`; `mv $file.out $file`; } else { # we have no copyright notice $org = $_; print STDERR "Newly put a copyright in $file\n"; open(OUT, "> $file.out"); open(COPY, "tools/COPY"); if( $file =~ /\.c$/ ){ while(){ s/[\(\)]/\//g; print OUT $_; } } else { while(){ print OUT $_; } } close COPY; print OUT $org; while(){ print OUT $_; } close IN2; close OUT; `mv $file $file.bak`; `mv $file.out $file`; } } camlspotter-camlimages-e471b3c4470d/tools/recopy0000755000000000000000000000036012405272062017760 0ustar 00000000000000for i in `find . -type f -name '*.ml*' | grep -v bak | grep -v CVS` do echo $i sed -e 's/.*Copyright 1999.*/(* Copyright 1999,2000,2001,2002,2001,2002 *)/' < $i > tmp.tmp mv $i $i.bak mv tmp.tmp $i done